System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact c63334e1a91c5d0646b71e90f318e444bcf1bbc3:


0000: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0010: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0020: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0030: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0040: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d  ###############.
0050: 0a 23 0d 0a 23 20 63 6f 6d 6d 6f 6e 2e 65 61 67  .#..# common.eag
0060: 6c 65 20 2d 2d 0d 0a 23 0d 0a 23 20 57 72 69 74  le --..#..# Writ
0070: 74 65 6e 20 62 79 20 4a 6f 65 20 4d 69 73 74 61  ten by Joe Mista
0080: 63 68 6b 69 6e 2e 0d 0a 23 20 52 65 6c 65 61 73  chkin...# Releas
0090: 65 64 20 74 6f 20 74 68 65 20 70 75 62 6c 69 63  ed to the public
00a0: 20 64 6f 6d 61 69 6e 2c 20 75 73 65 20 61 74 20   domain, use at 
00b0: 79 6f 75 72 20 6f 77 6e 20 72 69 73 6b 21 0d 0a  your own risk!..
00c0: 23 0d 0a 23 23 23 23 23 23 23 23 23 23 23 23 23  #..#############
00d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
00e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
00f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0100: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0110: 23 23 0d 0a 0d 0a 23 0d 0a 23 20 4e 4f 54 45 3a  ##....#..# NOTE:
0120: 20 55 73 65 20 6f 75 72 20 6f 77 6e 20 6e 61 6d   Use our own nam
0130: 65 73 70 61 63 65 20 68 65 72 65 20 62 65 63 61  espace here beca
0140: 75 73 65 20 65 76 65 6e 20 74 68 6f 75 67 68 20  use even though 
0150: 77 65 20 64 6f 20 6e 6f 74 20 64 69 72 65 63 74  we do not direct
0160: 6c 79 0d 0a 23 20 20 20 20 20 20 20 73 75 70 70  ly..#       supp
0170: 6f 72 74 20 6e 61 6d 65 73 70 61 63 65 73 20 6f  ort namespaces o
0180: 75 72 73 65 6c 76 65 73 2c 20 77 65 20 64 6f 20  urselves, we do 
0190: 6e 6f 74 20 77 61 6e 74 20 74 6f 20 70 6f 6c 6c  not want to poll
01a0: 75 74 65 20 74 68 65 20 67 6c 6f 62 61 6c 0d 0a  ute the global..
01b0: 23 20 20 20 20 20 20 20 6e 61 6d 65 73 70 61 63  #       namespac
01c0: 65 20 69 66 20 74 68 69 73 20 73 63 72 69 70 74  e if this script
01d0: 20 61 63 74 75 61 6c 6c 79 20 65 6e 64 73 20 75   actually ends u
01e0: 70 20 62 65 69 6e 67 20 65 76 61 6c 75 61 74 65  p being evaluate
01f0: 64 20 69 6e 20 54 63 6c 2e 0d 0a 23 0d 0a 6e 61  d in Tcl...#..na
0200: 6d 65 73 70 61 63 65 20 65 76 61 6c 20 3a 3a 45  mespace eval ::E
0210: 61 67 6c 65 20 7b 0d 0a 20 20 69 66 20 7b 5b 69  agle {..  if {[i
0220: 73 45 61 67 6c 65 5d 7d 20 74 68 65 6e 20 7b 0d  sEagle]} then {.
0230: 0a 20 20 20 20 23 23 23 23 23 23 23 23 23 23 23  .    ###########
0240: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0250: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0260: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0270: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0280: 0d 0a 20 20 20 20 23 23 23 23 23 23 23 23 23 23  ..    ##########
0290: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
02a0: 23 23 20 42 45 47 49 4e 20 45 61 67 6c 65 20 4f  ## BEGIN Eagle O
02b0: 4e 4c 59 20 23 23 23 23 23 23 23 23 23 23 23 23  NLY ############
02c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
02d0: 23 0d 0a 20 20 20 20 23 23 23 23 23 23 23 23 23  #..    #########
02e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
02f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0300: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0310: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0320: 23 23 0d 0a 0d 0a 20 20 20 20 70 72 6f 63 20 67  ##....    proc g
0330: 65 74 53 51 4c 69 74 65 44 65 66 69 6e 65 43 6f  etSQLiteDefineCo
0340: 6e 73 74 61 6e 74 50 72 65 66 69 78 20 7b 7d 20  nstantPrefix {} 
0350: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
0360: 20 20 23 20 4e 4f 54 45 3a 20 53 65 65 20 69 66    # NOTE: See if
0370: 20 74 68 65 20 64 65 66 69 6e 65 20 63 6f 6e 73   the define cons
0380: 74 61 6e 74 20 70 72 65 66 69 78 20 73 65 74 74  tant prefix sett
0390: 69 6e 67 20 68 61 73 20 62 65 65 6e 20 6f 76 65  ing has been ove
03a0: 72 72 69 64 64 65 6e 0d 0a 20 20 20 20 20 20 23  rridden..      #
03b0: 20 20 20 20 20 20 20 62 79 20 74 68 65 20 75 73         by the us
03c0: 65 72 20 28 65 2e 67 2e 20 6f 6e 20 74 68 65 20  er (e.g. on the 
03d0: 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 29 2e 0d 0a  command line)...
03e0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
03f0: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
0400: 3a 3a 64 65 66 69 6e 65 5f 63 6f 6e 73 74 61 6e  ::define_constan
0410: 74 5f 70 72 65 66 69 78 5d 20 26 26 20 5c 0d 0a  t_prefix] && \..
0420: 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e            [strin
0430: 67 20 6c 65 6e 67 74 68 20 24 3a 3a 64 65 66 69  g length $::defi
0440: 6e 65 5f 63 6f 6e 73 74 61 6e 74 5f 70 72 65 66  ne_constant_pref
0450: 69 78 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  ix] > 0} then {.
0460: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
0470: 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20      # NOTE: Use 
0480: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 64 65  the specified de
0490: 66 69 6e 65 20 63 6f 6e 73 74 61 6e 74 20 70 72  fine constant pr
04a0: 65 66 69 78 2e 0d 0a 20 20 20 20 20 20 20 20 23  efix...        #
04b0: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
04c0: 20 24 3a 3a 64 65 66 69 6e 65 5f 63 6f 6e 73 74   $::define_const
04d0: 61 6e 74 5f 70 72 65 66 69 78 0d 0a 20 20 20 20  ant_prefix..    
04e0: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
04f0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
0500: 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20 64   NOTE: Use the d
0510: 65 66 61 75 6c 74 20 64 65 66 69 6e 65 20 63 6f  efault define co
0520: 6e 73 74 61 6e 74 20 70 72 65 66 69 78 2e 0d 0a  nstant prefix...
0530: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
0540: 20 20 20 72 65 74 75 72 6e 20 64 65 66 69 6e 65     return define
0550: 43 6f 6e 73 74 61 6e 74 2e 53 79 73 74 65 6d 2e  Constant.System.
0560: 44 61 74 61 2e 53 51 4c 69 74 65 2e 0d 0a 20 20  Data.SQLite...  
0570: 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
0580: 0a 20 20 20 20 70 72 6f 63 20 67 65 74 53 51 4c  .    proc getSQL
0590: 69 74 65 43 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e  iteCompileOption
05a0: 50 72 65 66 69 78 20 7b 7d 20 7b 0d 0a 20 20 20  Prefix {} {..   
05b0: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
05c0: 54 45 3a 20 53 65 65 20 69 66 20 74 68 65 20 63  TE: See if the c
05d0: 6f 6d 70 69 6c 65 20 6f 70 74 69 6f 6e 20 70 72  ompile option pr
05e0: 65 66 69 78 20 73 65 74 74 69 6e 67 20 68 61 73  efix setting has
05f0: 20 62 65 65 6e 20 6f 76 65 72 72 69 64 64 65 6e   been overridden
0600: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
0610: 62 79 20 74 68 65 20 75 73 65 72 20 28 65 2e 67  by the user (e.g
0620: 2e 20 6f 6e 20 74 68 65 20 63 6f 6d 6d 61 6e 64  . on the command
0630: 20 6c 69 6e 65 29 2e 0d 0a 20 20 20 20 20 20 23   line)...      #
0640: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66  ..      if {[inf
0650: 6f 20 65 78 69 73 74 73 20 3a 3a 63 6f 6d 70 69  o exists ::compi
0660: 6c 65 5f 6f 70 74 69 6f 6e 5f 70 72 65 66 69 78  le_option_prefix
0670: 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
0680: 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
0690: 20 24 3a 3a 63 6f 6d 70 69 6c 65 5f 6f 70 74 69   $::compile_opti
06a0: 6f 6e 5f 70 72 65 66 69 78 5d 20 3e 20 30 7d 20  on_prefix] > 0} 
06b0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
06c0: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
06d0: 45 3a 20 55 73 65 20 74 68 65 20 73 70 65 63 69  E: Use the speci
06e0: 66 69 65 64 20 63 6f 6d 70 69 6c 65 20 6f 70 74  fied compile opt
06f0: 69 6f 6e 20 70 72 65 66 69 78 2e 0d 0a 20 20 20  ion prefix...   
0700: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
0710: 72 65 74 75 72 6e 20 24 3a 3a 63 6f 6d 70 69 6c  return $::compil
0720: 65 5f 6f 70 74 69 6f 6e 5f 70 72 65 66 69 78 0d  e_option_prefix.
0730: 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
0740: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
0750: 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20      # NOTE: Use 
0760: 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6d 70  the default comp
0770: 69 6c 65 20 6f 70 74 69 6f 6e 20 70 72 65 66 69  ile option prefi
0780: 78 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  x...        #.. 
0790: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 63 6f         return co
07a0: 6d 70 69 6c 65 4f 70 74 69 6f 6e 2e 53 51 4c 69  mpileOption.SQLi
07b0: 74 65 2e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  te...      }..  
07c0: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
07d0: 20 68 61 76 65 53 51 4c 69 74 65 44 65 66 69 6e   haveSQLiteDefin
07e0: 65 43 6f 6e 73 74 61 6e 74 20 7b 20 6e 61 6d 65  eConstant { name
07f0: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 72 65 74 75   } {..      retu
0800: 72 6e 20 5b 68 61 76 65 43 6f 6e 73 74 72 61 69  rn [haveConstrai
0810: 6e 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  nt \..          
0820: 5b 61 70 70 65 6e 64 41 72 67 73 20 5b 67 65 74  [appendArgs [get
0830: 53 51 4c 69 74 65 44 65 66 69 6e 65 43 6f 6e 73  SQLiteDefineCons
0840: 74 61 6e 74 50 72 65 66 69 78 5d 20 24 6e 61 6d  tantPrefix] $nam
0850: 65 5d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20  e]]..    }..... 
0860: 20 20 20 70 72 6f 63 20 68 61 76 65 53 51 4c 69     proc haveSQLi
0870: 74 65 43 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 20  teCompileOption 
0880: 7b 20 6e 61 6d 65 20 7d 20 7b 0d 0a 20 20 20 20  { name } {..    
0890: 20 20 72 65 74 75 72 6e 20 5b 68 61 76 65 43 6f    return [haveCo
08a0: 6e 73 74 72 61 69 6e 74 20 5c 0d 0a 20 20 20 20  nstraint \..    
08b0: 20 20 20 20 20 20 5b 61 70 70 65 6e 64 41 72 67        [appendArg
08c0: 73 20 5b 67 65 74 53 51 4c 69 74 65 43 6f 6d 70  s [getSQLiteComp
08d0: 69 6c 65 4f 70 74 69 6f 6e 50 72 65 66 69 78 5d  ileOptionPrefix]
08e0: 20 24 6e 61 6d 65 5d 5d 0d 0a 20 20 20 20 7d 0d   $name]]..    }.
08f0: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74  ....    proc get
0900: 42 75 69 6c 64 59 65 61 72 20 7b 7d 20 7b 0d 0a  BuildYear {} {..
0910: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
0920: 20 4e 4f 54 45 3a 20 53 65 65 20 69 66 20 74 68   NOTE: See if th
0930: 65 20 22 79 65 61 72 22 20 73 65 74 74 69 6e 67  e "year" setting
0940: 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72 69   has been overri
0950: 64 64 65 6e 20 62 79 20 74 68 65 20 75 73 65 72  dden by the user
0960: 20 28 65 2e 67 2e 0d 0a 20 20 20 20 20 20 23 20   (e.g...      # 
0970: 20 20 20 20 20 20 6f 6e 20 74 68 65 20 63 6f 6d        on the com
0980: 6d 61 6e 64 20 6c 69 6e 65 29 2e 20 20 54 68 69  mand line).  Thi
0990: 73 20 68 65 6c 70 73 20 63 6f 6e 74 72 6f 6c 20  s helps control 
09a0: 65 78 61 63 74 6c 79 20 77 68 69 63 68 20 73 65  exactly which se
09b0: 74 20 6f 66 0d 0a 20 20 20 20 20 20 23 20 20 20  t of..      #   
09c0: 20 20 20 20 62 69 6e 61 72 69 65 73 20 77 65 20      binaries we 
09d0: 61 72 65 20 74 65 73 74 69 6e 67 2c 20 74 68 6f  are testing, tho
09e0: 73 65 20 70 72 6f 64 75 63 65 64 20 75 73 69 6e  se produced usin
09f0: 67 20 74 68 65 20 56 69 73 75 61 6c 20 53 74 75  g the Visual Stu
0a00: 64 69 6f 0d 0a 20 20 20 20 20 20 23 20 20 20 20  dio..      #    
0a10: 20 20 20 32 30 30 35 2c 20 32 30 30 38 2c 20 32     2005, 2008, 2
0a20: 30 31 30 2c 20 32 30 31 32 2c 20 32 30 31 33 2c  010, 2012, 2013,
0a30: 20 32 30 31 35 2c 20 6f 72 20 32 30 31 37 20 62   2015, or 2017 b
0a40: 75 69 6c 64 20 73 79 73 74 65 6d 73 2e 20 20 54  uild systems.  T
0a50: 6f 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  o..      #      
0a60: 20 6f 76 65 72 72 69 64 65 20 74 68 69 73 20 76   override this v
0a70: 61 6c 75 65 20 76 69 61 20 74 68 65 20 63 6f 6d  alue via the com
0a80: 6d 61 6e 64 20 6c 69 6e 65 2c 20 65 6e 74 65 72  mand line, enter
0a90: 20 61 20 63 6f 6d 6d 61 6e 64 20 73 69 6d 69 6c   a command simil
0aa0: 61 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ar..      #     
0ab0: 20 20 74 6f 20 6f 6e 65 20 6f 66 20 74 68 65 20    to one of the 
0ac0: 66 6f 6c 6c 6f 77 69 6e 67 20 28 61 6c 6c 20 6f  following (all o
0ad0: 6e 20 6f 6e 65 20 6c 69 6e 65 29 3a 0d 0a 20 20  n one line):..  
0ae0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 20      #..      #  
0af0: 20 20 20 20 20 45 61 67 6c 65 53 68 65 6c 6c 2e       EagleShell.
0b00: 65 78 65 20 2d 61 6e 79 49 6e 69 74 69 61 6c 69  exe -anyInitiali
0b10: 7a 65 20 22 73 65 74 20 74 65 73 74 5f 79 65 61  ze "set test_yea
0b20: 72 20 32 30 30 35 22 0d 0a 20 20 20 20 20 20 23  r 2005"..      #
0b30: 20 20 20 20 20 20 20 20 20 2d 66 69 6c 65 20 2e           -file .
0b40: 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67  \path\to\all.eag
0b50: 6c 65 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  le..      #..   
0b60: 20 20 20 23 20 20 20 20 20 20 20 45 61 67 6c 65     #       Eagle
0b70: 53 68 65 6c 6c 2e 65 78 65 20 2d 61 6e 79 49 6e  Shell.exe -anyIn
0b80: 69 74 69 61 6c 69 7a 65 20 22 73 65 74 20 74 65  itialize "set te
0b90: 73 74 5f 79 65 61 72 20 32 30 30 38 22 0d 0a 20  st_year 2008".. 
0ba0: 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20 2d       #         -
0bb0: 66 69 6c 65 20 2e 5c 70 61 74 68 5c 74 6f 5c 61  file .\path\to\a
0bc0: 6c 6c 2e 65 61 67 6c 65 0d 0a 20 20 20 20 20 20  ll.eagle..      
0bd0: 23 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  #..      #      
0be0: 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65 20   EagleShell.exe 
0bf0: 2d 61 6e 79 49 6e 69 74 69 61 6c 69 7a 65 20 22  -anyInitialize "
0c00: 73 65 74 20 74 65 73 74 5f 79 65 61 72 20 32 30  set test_year 20
0c10: 31 30 22 0d 0a 20 20 20 20 20 20 23 20 20 20 20  10"..      #    
0c20: 20 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70 61 74       -file .\pat
0c30: 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a  h\to\all.eagle..
0c40: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
0c50: 20 20 20 20 20 20 20 45 61 67 6c 65 53 68 65 6c         EagleShel
0c60: 6c 2e 65 78 65 20 2d 61 6e 79 49 6e 69 74 69 61  l.exe -anyInitia
0c70: 6c 69 7a 65 20 22 73 65 74 20 74 65 73 74 5f 79  lize "set test_y
0c80: 65 61 72 20 32 30 31 32 22 0d 0a 20 20 20 20 20  ear 2012"..     
0c90: 20 23 20 20 20 20 20 20 20 20 20 2d 66 69 6c 65   #         -file
0ca0: 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65   .\path\to\all.e
0cb0: 61 67 6c 65 0d 0a 20 20 20 20 20 20 23 0d 0a 20  agle..      #.. 
0cc0: 20 20 20 20 20 23 20 20 20 20 20 20 20 45 61 67       #       Eag
0cd0: 6c 65 53 68 65 6c 6c 2e 65 78 65 20 2d 61 6e 79  leShell.exe -any
0ce0: 49 6e 69 74 69 61 6c 69 7a 65 20 22 73 65 74 20  Initialize "set 
0cf0: 74 65 73 74 5f 79 65 61 72 20 32 30 31 33 22 0d  test_year 2013".
0d00: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20  .      #        
0d10: 20 2d 66 69 6c 65 20 2e 5c 70 61 74 68 5c 74 6f   -file .\path\to
0d20: 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a 20 20 20 20  \all.eagle..    
0d30: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 20 20 20    #..      #    
0d40: 20 20 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78     EagleShell.ex
0d50: 65 20 2d 61 6e 79 49 6e 69 74 69 61 6c 69 7a 65  e -anyInitialize
0d60: 20 22 73 65 74 20 74 65 73 74 5f 79 65 61 72 20   "set test_year 
0d70: 32 30 31 35 22 0d 0a 20 20 20 20 20 20 23 20 20  2015"..      #  
0d80: 20 20 20 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70         -file .\p
0d90: 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65  ath\to\all.eagle
0da0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
0db0: 20 23 20 20 20 20 20 20 20 45 61 67 6c 65 53 68   #       EagleSh
0dc0: 65 6c 6c 2e 65 78 65 20 2d 61 6e 79 49 6e 69 74  ell.exe -anyInit
0dd0: 69 61 6c 69 7a 65 20 22 73 65 74 20 74 65 73 74  ialize "set test
0de0: 5f 79 65 61 72 20 32 30 31 37 22 0d 0a 20 20 20  _year 2017"..   
0df0: 20 20 20 23 20 20 20 20 20 20 20 20 20 2d 66 69     #         -fi
0e00: 6c 65 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c  le .\path\to\all
0e10: 2e 65 61 67 6c 65 0d 0a 20 20 20 20 20 20 23 0d  .eagle..      #.
0e20: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 45  .      #       E
0e30: 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65 20 2d 61  agleShell.exe -a
0e40: 6e 79 49 6e 69 74 69 61 6c 69 7a 65 20 22 75 6e  nyInitialize "un
0e50: 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20  set -nocomplain 
0e60: 74 65 73 74 5f 79 65 61 72 22 0d 0a 20 20 20 20  test_year"..    
0e70: 20 20 23 20 20 20 20 20 20 20 20 20 2d 66 69 6c    #         -fil
0e80: 65 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e  e .\path\to\all.
0e90: 65 61 67 6c 65 0d 0a 20 20 20 20 20 20 23 0d 0a  eagle..      #..
0ea0: 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20        if {[info 
0eb0: 65 78 69 73 74 73 20 3a 3a 74 65 73 74 5f 79 65  exists ::test_ye
0ec0: 61 72 5d 20 26 26 20 5b 73 74 72 69 6e 67 20 6c  ar] && [string l
0ed0: 65 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f 79 65  ength $::test_ye
0ee0: 61 72 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  ar] > 0} then {.
0ef0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
0f00: 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20      # NOTE: Use 
0f10: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 74 65  the specified te
0f20: 73 74 20 79 65 61 72 2e 20 20 49 66 20 74 68 69  st year.  If thi
0f30: 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 6e 6f  s variable is no
0f40: 74 20 73 65 74 2c 20 74 68 65 0d 0a 20 20 20 20  t set, the..    
0f50: 20 20 20 20 23 20 20 20 20 20 20 20 64 65 66 61      #       defa
0f60: 75 6c 74 20 76 61 6c 75 65 20 77 69 6c 6c 20 62  ult value will b
0f70: 65 20 62 61 73 65 64 20 6f 6e 20 77 68 65 74 68  e based on wheth
0f80: 65 72 20 6f 72 20 6e 6f 74 20 45 61 67 6c 65 20  er or not Eagle 
0f90: 68 61 73 20 62 65 65 6e 0d 0a 20 20 20 20 20 20  has been..      
0fa0: 20 20 23 20 20 20 20 20 20 20 63 6f 6d 70 69 6c    #       compil
0fb0: 65 64 20 61 67 61 69 6e 73 74 20 74 68 65 20 43  ed against the C
0fc0: 4c 52 20 76 32 2e 30 20 6f 72 20 43 4c 52 20 76  LR v2.0 or CLR v
0fd0: 34 2e 30 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  4.0...        #.
0fe0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
0ff0: 24 3a 3a 74 65 73 74 5f 79 65 61 72 0d 0a 20 20  $::test_year..  
1000: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
1010: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1020: 20 23 20 4e 4f 54 45 3a 20 49 66 20 45 61 67 6c   # NOTE: If Eagl
1030: 65 20 68 61 73 20 62 65 65 6e 20 63 6f 6d 70 69  e has been compi
1040: 6c 65 64 20 61 67 61 69 6e 73 74 20 74 68 65 20  led against the 
1050: 43 4c 52 20 76 34 2e 30 2c 20 75 73 65 20 22 32  CLR v4.0, use "2
1060: 30 31 30 22 20 62 79 0d 0a 20 20 20 20 20 20 20  010" by..       
1070: 20 23 20 20 20 20 20 20 20 64 65 66 61 75 6c 74   #       default
1080: 20 28 77 65 20 63 6f 75 6c 64 20 75 73 65 20 22   (we could use "
1090: 32 30 31 32 22 2c 20 22 32 30 31 33 22 2c 20 22  2012", "2013", "
10a0: 32 30 31 35 22 2c 20 6f 72 20 22 32 30 31 37 22  2015", or "2017"
10b0: 20 69 6e 20 74 68 61 74 0d 0a 20 20 20 20 20 20   in that..      
10c0: 20 20 23 20 20 20 20 20 20 20 63 61 73 65 20 61    #       case a
10d0: 73 20 77 65 6c 6c 29 20 61 73 20 74 68 65 20 74  s well) as the t
10e0: 65 73 74 20 79 65 61 72 3b 20 6f 74 68 65 72 77  est year; otherw
10f0: 69 73 65 2c 20 75 73 65 20 22 32 30 30 38 22 20  ise, use "2008" 
1100: 62 79 20 64 65 66 61 75 6c 74 0d 0a 20 20 20 20  by default..    
1110: 20 20 20 20 23 20 20 20 20 20 20 20 28 77 65 20      #       (we 
1120: 63 6f 75 6c 64 20 75 73 65 20 22 32 30 30 35 22  could use "2005"
1130: 20 69 6e 20 74 68 61 74 20 63 61 73 65 20 61 73   in that case as
1140: 20 77 65 6c 6c 29 2e 20 20 49 66 20 61 6e 6f 74   well).  If anot
1150: 68 65 72 20 6d 61 6a 6f 72 0d 0a 20 20 20 20 20  her major..     
1160: 20 20 20 23 20 20 20 20 20 20 20 5b 69 6e 63 6f     #       [inco
1170: 6d 70 61 74 69 62 6c 65 5d 20 76 65 72 73 69 6f  mpatible] versio
1180: 6e 20 6f 66 20 74 68 65 20 43 4c 52 20 69 73 20  n of the CLR is 
1190: 72 65 6c 65 61 73 65 64 2c 20 74 68 69 73 20 63  released, this c
11a0: 68 65 63 6b 20 77 69 6c 6c 0d 0a 20 20 20 20 20  heck will..     
11b0: 20 20 20 23 20 20 20 20 20 20 20 68 61 76 65 20     #       have 
11c0: 74 6f 20 62 65 20 63 68 61 6e 67 65 64 2e 20 20  to be changed.  
11d0: 54 68 65 20 64 65 66 61 75 6c 74 20 74 65 73 74  The default test
11e0: 20 79 65 61 72 20 74 6f 20 75 73 65 20 66 6f 72   year to use for
11f0: 20 61 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20   a..        #   
1200: 20 20 20 20 70 61 72 74 69 63 75 6c 61 72 20 43      particular C
1210: 4c 52 20 76 65 72 73 69 6f 6e 20 6d 61 79 20 62  LR version may b
1220: 65 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20  e overridden by 
1230: 73 65 74 74 69 6e 67 20 74 68 65 20 67 6c 6f 62  setting the glob
1240: 61 6c 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  al..        #   
1250: 20 20 20 20 76 61 72 69 61 62 6c 65 20 22 74 65      variable "te
1260: 73 74 5f 79 65 61 72 5f 63 6c 72 5f 76 24 58 22  st_year_clr_v$X"
1270: 2c 20 77 68 65 72 65 20 22 24 58 22 20 6d 61 79  , where "$X" may
1280: 20 5b 63 75 72 72 65 6e 74 6c 79 5d 20 62 65 0d   [currently] be.
1290: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
12a0: 20 65 69 74 68 65 72 20 22 32 22 20 6f 72 20 22   either "2" or "
12b0: 34 22 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  4"...        #..
12c0: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76          if {[hav
12d0: 65 43 6f 6e 73 74 72 61 69 6e 74 20 69 6d 61 67  eConstraint imag
12e0: 65 52 75 6e 74 69 6d 65 34 30 5d 7d 20 74 68 65  eRuntime40]} the
12f0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69  n {..          i
1300: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
1310: 3a 3a 74 65 73 74 5f 79 65 61 72 5f 63 6c 72 5f  ::test_year_clr_
1320: 76 34 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  v4] && \..      
1330: 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20          [string 
1340: 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f 79  length $::test_y
1350: 65 61 72 5f 63 6c 72 5f 76 34 5d 20 3e 20 30 7d  ear_clr_v4] > 0}
1360: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1370: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1380: 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20      # NOTE: Use 
1390: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 74 65  the specified te
13a0: 73 74 20 79 65 61 72 20 66 6f 72 20 74 68 65 20  st year for the 
13b0: 43 4c 52 20 76 34 2e 30 2e 0d 0a 20 20 20 20 20  CLR v4.0...     
13c0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
13d0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a        return $::
13e0: 74 65 73 74 5f 79 65 61 72 5f 63 6c 72 5f 76 34  test_year_clr_v4
13f0: 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c  ..          } el
1400: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
1410: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
1420: 20 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65   # NOTE: Use the
1430: 20 64 65 66 61 75 6c 74 20 74 65 73 74 20 79 65   default test ye
1440: 61 72 20 66 6f 72 20 74 68 65 20 43 4c 52 20 76  ar for the CLR v
1450: 34 2e 30 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  4.0...          
1460: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
1470: 20 72 65 74 75 72 6e 20 32 30 31 30 3b 20 23 20   return 2010; # 
1480: 54 4f 44 4f 3a 20 47 6f 6f 64 20 22 66 61 6c 6c  TODO: Good "fall
1490: 62 61 63 6b 22 20 64 65 66 61 75 6c 74 3f 0d 0a  back" default?..
14a0: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
14b0: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
14c0: 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69 6e           if {[in
14d0: 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 73 74  fo exists ::test
14e0: 5f 79 65 61 72 5f 63 6c 72 5f 76 32 5d 20 26 26  _year_clr_v2] &&
14f0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1500: 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
1510: 20 24 3a 3a 74 65 73 74 5f 79 65 61 72 5f 63 6c   $::test_year_cl
1520: 72 5f 76 32 5d 20 3e 20 30 7d 20 74 68 65 6e 20  r_v2] > 0} then 
1530: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  {..            #
1540: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20  ..            # 
1550: 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20 73 70  NOTE: Use the sp
1560: 65 63 69 66 69 65 64 20 74 65 73 74 20 79 65 61  ecified test yea
1570: 72 20 66 6f 72 20 74 68 65 20 43 4c 52 20 76 32  r for the CLR v2
1580: 2e 30 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  .0...           
1590: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
15a0: 72 65 74 75 72 6e 20 24 3a 3a 74 65 73 74 5f 79  return $::test_y
15b0: 65 61 72 5f 63 6c 72 5f 76 32 0d 0a 20 20 20 20  ear_clr_v2..    
15c0: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
15d0: 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
15e0: 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
15f0: 45 3a 20 55 73 65 20 74 68 65 20 64 65 66 61 75  E: Use the defau
1600: 6c 74 20 74 65 73 74 20 79 65 61 72 20 66 6f 72  lt test year for
1610: 20 74 68 65 20 43 4c 52 20 76 32 2e 30 2e 0d 0a   the CLR v2.0...
1620: 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
1630: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
1640: 6e 20 32 30 30 38 3b 20 23 20 54 4f 44 4f 3a 20  n 2008; # TODO: 
1650: 47 6f 6f 64 20 22 66 61 6c 6c 62 61 63 6b 22 20  Good "fallback" 
1660: 64 65 66 61 75 6c 74 3f 0d 0a 20 20 20 20 20 20  default?..      
1670: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
1680: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
1690: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65  .....    proc ge
16a0: 74 42 75 69 6c 64 4e 61 74 69 76 65 59 65 61 72  tBuildNativeYear
16b0: 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66 20   {} {..      if 
16c0: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
16d0: 74 65 73 74 5f 6e 61 74 69 76 65 5f 79 65 61 72  test_native_year
16e0: 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
16f0: 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
1700: 20 24 3a 3a 74 65 73 74 5f 6e 61 74 69 76 65 5f   $::test_native_
1710: 79 65 61 72 5d 20 3e 20 30 7d 20 74 68 65 6e 20  year] > 0} then 
1720: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
1730: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73        # NOTE: Us
1740: 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  e the specified 
1750: 74 65 73 74 20 79 65 61 72 20 66 6f 72 20 6e 61  test year for na
1760: 74 69 76 65 20 62 69 6e 61 72 69 65 73 2e 20 20  tive binaries.  
1770: 49 66 20 74 68 69 73 0d 0a 20 20 20 20 20 20 20  If this..       
1780: 20 23 20 20 20 20 20 20 20 76 61 72 69 61 62 6c   #       variabl
1790: 65 20 69 73 20 6e 6f 74 20 73 65 74 2c 20 74 68  e is not set, th
17a0: 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
17b0: 20 62 79 20 5b 67 65 74 42 75 69 6c 64 59 65 61   by [getBuildYea
17c0: 72 5d 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  r]..        #   
17d0: 20 20 20 20 77 69 6c 6c 20 62 65 20 75 73 65 64      will be used
17e0: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
17f0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a        return $::
1800: 74 65 73 74 5f 6e 61 74 69 76 65 5f 79 65 61 72  test_native_year
1810: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
1820: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1830: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 61 6c       # NOTE: Fal
1840: 6c 62 61 63 6b 20 6f 6e 20 74 68 65 20 28 6e 6f  lback on the (no
1850: 72 6d 61 6c 29 20 62 75 69 6c 64 20 79 65 61 72  rmal) build year
1860: 20 66 6f 72 20 6d 61 6e 61 67 65 64 20 62 69 6e   for managed bin
1870: 61 72 69 65 73 2e 0d 0a 20 20 20 20 20 20 20 20  aries...        
1880: 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  #..        retur
1890: 6e 20 5b 67 65 74 42 75 69 6c 64 59 65 61 72 5d  n [getBuildYear]
18a0: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
18b0: 0d 0a 0c 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20  .....    #..    
18c0: 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 70 72 6f  # NOTE: This pro
18d0: 63 65 64 75 72 65 20 69 73 20 6f 6e 6c 79 20 75  cedure is only u
18e0: 73 65 64 20 77 68 65 6e 20 61 64 64 69 6e 67 20  sed when adding 
18f0: 73 68 69 6d 6d 65 64 20 74 65 73 74 20 63 6f 6e  shimmed test con
1900: 73 74 72 61 69 6e 74 73 2e 0d 0a 20 20 20 20 23  straints...    #
1910: 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 42 75  ..    proc getBu
1920: 69 6c 64 43 6c 72 56 65 72 73 69 6f 6e 20 7b 7d  ildClrVersion {}
1930: 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69   {..      if {[i
1940: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 73  nfo exists ::tes
1950: 74 5f 63 6c 72 5d 20 26 26 20 5b 73 74 72 69 6e  t_clr] && [strin
1960: 67 20 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73 74  g length $::test
1970: 5f 63 6c 72 5d 20 3e 20 30 7d 20 74 68 65 6e 20  _clr] > 0} then 
1980: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
1990: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73        # NOTE: Us
19a0: 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  e the specified 
19b0: 74 65 73 74 20 76 65 72 73 69 6f 6e 20 66 6f 72  test version for
19c0: 20 74 68 65 20 43 4c 52 2e 20 20 49 66 20 74 68   the CLR.  If th
19d0: 69 73 20 76 61 72 69 61 62 6c 65 0d 0a 20 20 20  is variable..   
19e0: 20 20 20 20 20 23 20 20 20 20 20 20 20 69 73 20       #       is 
19f0: 6e 6f 74 20 73 65 74 2c 20 74 68 65 20 64 65 66  not set, the def
1a00: 61 75 6c 74 20 76 61 6c 75 65 20 77 69 6c 6c 20  ault value will 
1a10: 62 65 20 62 61 73 65 64 20 6f 6e 20 77 68 65 74  be based on whet
1a20: 68 65 72 20 6f 72 20 6e 6f 74 0d 0a 20 20 20 20  her or not..    
1a30: 20 20 20 20 23 20 20 20 20 20 20 20 45 61 67 6c      #       Eagl
1a40: 65 20 68 61 73 20 62 65 65 6e 20 63 6f 6d 70 69  e has been compi
1a50: 6c 65 64 20 61 67 61 69 6e 73 74 20 74 68 65 20  led against the 
1a60: 43 4c 52 20 76 32 2e 30 20 6f 72 20 43 4c 52 20  CLR v2.0 or CLR 
1a70: 76 34 2e 30 2e 0d 0a 20 20 20 20 20 20 20 20 23  v4.0...        #
1a80: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
1a90: 20 24 3a 3a 74 65 73 74 5f 63 6c 72 0d 0a 20 20   $::test_clr..  
1aa0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
1ab0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1ac0: 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69   # NOTE: Check i
1ad0: 66 20 45 61 67 6c 65 20 68 61 73 20 62 65 65 6e  f Eagle has been
1ae0: 20 63 6f 6d 70 69 6c 65 64 20 61 67 61 69 6e 73   compiled agains
1af0: 74 20 74 68 65 20 43 4c 52 20 76 34 2e 30 2e 20  t the CLR v4.0. 
1b00: 20 49 66 20 73 6f 2c 0d 0a 20 20 20 20 20 20 20   If so,..       
1b10: 20 23 20 20 20 20 20 20 20 6a 75 73 74 20 75 73   #       just us
1b20: 65 20 74 68 61 74 20 43 4c 52 20 76 65 72 73 69  e that CLR versi
1b30: 6f 6e 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20  on.  Otherwise, 
1b40: 75 73 65 20 74 68 65 20 76 65 72 73 69 6f 6e 20  use the version 
1b50: 66 6f 72 20 74 68 65 0d 0a 20 20 20 20 20 20 20  for the..       
1b60: 20 23 20 20 20 20 20 20 20 43 4c 52 20 76 32 2e   #       CLR v2.
1b70: 30 2e 20 20 49 66 20 61 6e 6f 74 68 65 72 20 6d  0.  If another m
1b80: 61 6a 6f 72 20 5b 69 6e 63 6f 6d 70 61 74 69 62  ajor [incompatib
1b90: 6c 65 5d 20 76 65 72 73 69 6f 6e 20 6f 66 20 74  le] version of t
1ba0: 68 65 20 43 4c 52 0d 0a 20 20 20 20 20 20 20 20  he CLR..        
1bb0: 23 20 20 20 20 20 20 20 69 73 20 72 65 6c 65 61  #       is relea
1bc0: 73 65 64 2c 20 74 68 69 73 20 63 68 65 63 6b 20  sed, this check 
1bd0: 77 69 6c 6c 20 68 61 76 65 20 74 6f 20 62 65 20  will have to be 
1be0: 63 68 61 6e 67 65 64 2e 20 20 54 68 65 20 64 65  changed.  The de
1bf0: 66 61 75 6c 74 0d 0a 20 20 20 20 20 20 20 20 23  fault..        #
1c00: 20 20 20 20 20 20 20 76 65 72 73 69 6f 6e 20 76         version v
1c10: 61 6c 75 65 20 66 6f 72 20 61 20 70 61 72 74 69  alue for a parti
1c20: 63 75 6c 61 72 20 43 4c 52 20 76 65 72 73 69 6f  cular CLR versio
1c30: 6e 20 6d 61 79 20 62 65 20 6f 76 65 72 72 69 64  n may be overrid
1c40: 64 65 6e 0d 0a 20 20 20 20 20 20 20 20 23 20 20  den..        #  
1c50: 20 20 20 20 20 62 79 20 73 65 74 74 69 6e 67 20       by setting 
1c60: 74 68 65 20 67 6c 6f 62 61 6c 20 76 61 72 69 61  the global varia
1c70: 62 6c 65 20 22 74 65 73 74 5f 63 6c 72 5f 76 24  ble "test_clr_v$
1c80: 58 22 2c 20 77 68 65 72 65 20 22 24 58 22 20 6d  X", where "$X" m
1c90: 61 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ay..        #   
1ca0: 20 20 20 20 5b 63 75 72 72 65 6e 74 6c 79 5d 20      [currently] 
1cb0: 62 65 20 65 69 74 68 65 72 20 22 32 22 20 6f 72  be either "2" or
1cc0: 20 22 34 22 2e 0d 0a 20 20 20 20 20 20 20 20 23   "4"...        #
1cd0: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 68  ..        if {[h
1ce0: 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 69 6d  aveConstraint im
1cf0: 61 67 65 52 75 6e 74 69 6d 65 34 30 5d 7d 20 74  ageRuntime40]} t
1d00: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1d10: 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
1d20: 73 20 3a 3a 74 65 73 74 5f 63 6c 72 5f 76 34 5d  s ::test_clr_v4]
1d30: 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
1d40: 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
1d50: 67 74 68 20 24 3a 3a 74 65 73 74 5f 63 6c 72 5f  gth $::test_clr_
1d60: 76 34 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  v4] > 0} then {.
1d70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a  .            #..
1d80: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f              # NO
1d90: 54 45 3a 20 55 73 65 20 74 68 65 20 73 70 65 63  TE: Use the spec
1da0: 69 66 69 65 64 20 74 65 73 74 20 76 65 72 73 69  ified test versi
1db0: 6f 6e 20 66 6f 72 20 74 68 65 20 43 4c 52 20 76  on for the CLR v
1dc0: 34 2e 30 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  4.0...          
1dd0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
1de0: 20 72 65 74 75 72 6e 20 24 3a 3a 74 65 73 74 5f   return $::test_
1df0: 63 6c 72 5f 76 34 0d 0a 20 20 20 20 20 20 20 20  clr_v4..        
1e00: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
1e10: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1e20: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55         # NOTE: U
1e30: 73 65 20 74 68 65 20 64 65 66 61 75 6c 74 20 74  se the default t
1e40: 65 73 74 20 76 65 72 73 69 6f 6e 20 66 6f 72 20  est version for 
1e50: 74 68 65 20 43 4c 52 20 76 34 2e 30 2e 0d 0a 20  the CLR v4.0... 
1e60: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
1e70: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1e80: 20 34 2e 30 2e 33 30 33 31 39 3b 20 23 20 54 4f   4.0.30319; # TO
1e90: 44 4f 3a 20 47 6f 6f 64 20 22 66 61 6c 6c 62 61  DO: Good "fallba
1ea0: 63 6b 22 20 64 65 66 61 75 6c 74 3f 0d 0a 20 20  ck" default?..  
1eb0: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
1ec0: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
1ed0: 20 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f         if {[info
1ee0: 20 65 78 69 73 74 73 20 3a 3a 74 65 73 74 5f 63   exists ::test_c
1ef0: 6c 72 5f 76 32 5d 20 26 26 20 5c 0d 0a 20 20 20  lr_v2] && \..   
1f00: 20 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69             [stri
1f10: 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73  ng length $::tes
1f20: 74 5f 63 6c 72 5f 76 32 5d 20 3e 20 30 7d 20 74  t_clr_v2] > 0} t
1f30: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1f40: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
1f50: 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68    # NOTE: Use th
1f60: 65 20 73 70 65 63 69 66 69 65 64 20 74 65 73 74  e specified test
1f70: 20 76 65 72 73 69 6f 6e 20 66 6f 72 20 74 68 65   version for the
1f80: 20 43 4c 52 20 76 32 2e 30 2e 0d 0a 20 20 20 20   CLR v2.0...    
1f90: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1fa0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a         return $:
1fb0: 3a 74 65 73 74 5f 63 6c 72 5f 76 32 0d 0a 20 20  :test_clr_v2..  
1fc0: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
1fd0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d  ..            #.
1fe0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e  .            # N
1ff0: 4f 54 45 3a 20 55 73 65 20 74 68 65 20 64 65 66  OTE: Use the def
2000: 61 75 6c 74 20 74 65 73 74 20 76 65 72 73 69 6f  ault test versio
2010: 6e 20 66 6f 72 20 74 68 65 20 43 4c 52 20 76 32  n for the CLR v2
2020: 2e 30 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  .0...           
2030: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
2040: 72 65 74 75 72 6e 20 32 2e 30 2e 35 30 37 32 37  return 2.0.50727
2050: 3b 20 23 20 54 4f 44 4f 3a 20 47 6f 6f 64 20 22  ; # TODO: Good "
2060: 66 61 6c 6c 62 61 63 6b 22 20 64 65 66 61 75 6c  fallback" defaul
2070: 74 3f 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  t?..          }.
2080: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
2090: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
20a0: 20 20 20 70 72 6f 63 20 67 65 74 42 75 69 6c 64     proc getBuild
20b0: 59 65 61 72 73 20 7b 7d 20 7b 0d 0a 20 20 20 20  Years {} {..    
20c0: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
20d0: 45 3a 20 53 65 65 20 69 66 20 74 68 65 20 6c 69  E: See if the li
20e0: 73 74 20 6f 66 20 74 65 73 74 20 79 65 61 72 73  st of test years
20f0: 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72 69   has been overri
2100: 64 64 65 6e 20 62 79 20 74 68 65 20 75 73 65 72  dden by the user
2110: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
2120: 28 65 2e 67 2e 20 6f 6e 20 74 68 65 20 63 6f 6d  (e.g. on the com
2130: 6d 61 6e 64 20 6c 69 6e 65 29 2e 0d 0a 20 20 20  mand line)...   
2140: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
2150: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74  [info exists ::t
2160: 65 73 74 5f 79 65 61 72 73 5d 20 26 26 20 5b 6c  est_years] && [l
2170: 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f 79  length $::test_y
2180: 65 61 72 73 5d 20 3e 20 30 7d 20 74 68 65 6e 20  ears] > 0} then 
2190: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
21a0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73        # NOTE: Us
21b0: 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  e the specified 
21c0: 6c 69 73 74 20 6f 66 20 74 65 73 74 20 79 65 61  list of test yea
21d0: 72 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  rs...        #..
21e0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24          return $
21f0: 3a 3a 74 65 73 74 5f 79 65 61 72 73 0d 0a 20 20  ::test_years..  
2200: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
2210: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
2220: 20 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65   # NOTE: Use the
2230: 20 64 65 66 61 75 6c 74 20 6c 69 73 74 20 6f 66   default list of
2240: 20 74 65 73 74 20 79 65 61 72 73 20 28 69 2e 65   test years (i.e
2250: 2e 20 61 6c 6c 29 2e 0d 0a 20 20 20 20 20 20 20  . all)...       
2260: 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   #..        retu
2270: 72 6e 20 5b 6c 69 73 74 20 32 30 30 35 20 32 30  rn [list 2005 20
2280: 30 38 20 32 30 31 30 20 32 30 31 32 20 32 30 31  08 2010 2012 201
2290: 33 20 32 30 31 35 20 32 30 31 37 20 4e 65 74 53  3 2015 2017 NetS
22a0: 74 61 6e 64 61 72 64 32 30 5d 0d 0a 20 20 20 20  tandard20]..    
22b0: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
22c0: 20 20 20 70 72 6f 63 20 67 65 74 42 75 69 6c 64     proc getBuild
22d0: 4e 65 74 46 78 20 7b 7d 20 7b 0d 0a 20 20 20 20  NetFx {} {..    
22e0: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
22f0: 45 3a 20 53 65 65 20 69 66 20 74 68 65 20 74 65  E: See if the te
2300: 73 74 20 2e 4e 45 54 20 46 72 61 6d 65 77 6f 72  st .NET Framewor
2310: 6b 20 73 65 74 74 69 6e 67 20 68 61 73 20 62 65  k setting has be
2320: 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79  en overridden by
2330: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
2340: 74 68 65 20 75 73 65 72 20 28 65 2e 67 2e 20 6f  the user (e.g. o
2350: 6e 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69  n the command li
2360: 6e 65 29 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ne)...      #.. 
2370: 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65       if {[info e
2380: 78 69 73 74 73 20 3a 3a 74 65 73 74 5f 6e 65 74  xists ::test_net
2390: 5f 66 78 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  _fx] && \..     
23a0: 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
23b0: 67 74 68 20 24 3a 3a 74 65 73 74 5f 6e 65 74 5f  gth $::test_net_
23c0: 66 78 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  fx] > 0} then {.
23d0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
23e0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20      # NOTE: Use 
23f0: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 74 65  the specified te
2400: 73 74 20 2e 4e 45 54 20 46 72 61 6d 65 77 6f 72  st .NET Framewor
2410: 6b 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  k...        #.. 
2420: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a         return $:
2430: 3a 74 65 73 74 5f 6e 65 74 5f 66 78 0d 0a 20 20  :test_net_fx..  
2440: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
2450: 20 20 20 20 20 20 73 65 74 20 79 65 61 72 20 5b        set year [
2460: 67 65 74 42 75 69 6c 64 59 65 61 72 5d 0d 0a 20  getBuildYear].. 
2470: 20 20 20 20 20 20 20 73 65 74 20 79 65 61 72 56         set yearV
2480: 61 72 4e 61 6d 65 20 5b 61 70 70 65 6e 64 41 72  arName [appendAr
2490: 67 73 20 3a 3a 74 65 73 74 5f 6e 65 74 5f 66 78  gs ::test_net_fx
24a0: 5f 20 24 79 65 61 72 5d 0d 0a 0d 0a 20 20 20 20  _ $year]....    
24b0: 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
24c0: 69 73 74 73 20 24 79 65 61 72 56 61 72 4e 61 6d  ists $yearVarNam
24d0: 65 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  e] && \..       
24e0: 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
24f0: 67 74 68 20 5b 73 65 74 20 24 79 65 61 72 56 61  gth [set $yearVa
2500: 72 4e 61 6d 65 5d 5d 20 3e 20 30 7d 20 74 68 65  rName]] > 0} the
2510: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23  n {..          #
2520: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
2530: 54 45 3a 20 55 73 65 20 74 68 65 20 73 70 65 63  TE: Use the spec
2540: 69 66 69 65 64 20 74 65 73 74 20 2e 4e 45 54 20  ified test .NET 
2550: 46 72 61 6d 65 77 6f 72 6b 2c 20 62 61 73 65 64  Framework, based
2560: 20 6f 6e 20 74 68 65 20 62 75 69 6c 64 0d 0a 20   on the build.. 
2570: 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
2580: 20 79 65 61 72 2e 0d 0a 20 20 20 20 20 20 20 20   year...        
2590: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 72    #..          r
25a0: 65 74 75 72 6e 20 5b 73 65 74 20 24 79 65 61 72  eturn [set $year
25b0: 56 61 72 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20  VarName]..      
25c0: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
25d0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
25e0: 20 20 20 23 20 4e 4f 54 45 3a 20 46 61 6c 6c 62     # NOTE: Fallb
25f0: 61 63 6b 20 74 6f 20 74 68 65 20 22 77 65 6c 6c  ack to the "well
2600: 20 6b 6e 6f 77 6e 22 20 2e 4e 45 54 20 46 72 61   known" .NET Fra
2610: 6d 65 77 6f 72 6b 20 76 65 72 73 69 6f 6e 20 74  mework version t
2620: 68 61 74 0d 0a 20 20 20 20 20 20 20 20 20 20 23  hat..          #
2630: 20 20 20 20 20 20 20 69 73 20 6d 6f 73 74 20 63         is most c
2640: 6c 6f 73 65 6c 79 20 61 73 73 6f 63 69 61 74 65  losely associate
2650: 64 20 77 69 74 68 20 61 20 70 61 72 74 69 63 75  d with a particu
2660: 6c 61 72 20 76 65 72 73 69 6f 6e 20 6f 66 0d 0a  lar version of..
2670: 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
2680: 20 20 56 69 73 75 61 6c 20 53 74 75 64 69 6f 2e    Visual Studio.
2690: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
26a0: 20 20 20 20 20 20 20 20 20 73 77 69 74 63 68 20           switch 
26b0: 2d 65 78 61 63 74 20 2d 2d 20 24 79 65 61 72 20  -exact -- $year 
26c0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 32  {..            2
26d0: 30 30 35 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  005 {..         
26e0: 20 20 20 20 20 72 65 74 75 72 6e 20 6e 65 74 46       return netF
26f0: 78 32 30 0d 0a 20 20 20 20 20 20 20 20 20 20 20  x20..           
2700: 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
2710: 32 30 30 38 20 7b 0d 0a 20 20 20 20 20 20 20 20  2008 {..        
2720: 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e 65 74        return net
2730: 46 78 33 35 0d 0a 20 20 20 20 20 20 20 20 20 20  Fx35..          
2740: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
2750: 20 32 30 31 30 20 7b 0d 0a 20 20 20 20 20 20 20   2010 {..       
2760: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e 65         return ne
2770: 74 46 78 34 30 0d 0a 20 20 20 20 20 20 20 20 20  tFx40..         
2780: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
2790: 20 20 32 30 31 32 20 7b 0d 0a 20 20 20 20 20 20    2012 {..      
27a0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e          return n
27b0: 65 74 46 78 34 35 0d 0a 20 20 20 20 20 20 20 20  etFx45..        
27c0: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
27d0: 20 20 20 32 30 31 33 20 7b 0d 0a 20 20 20 20 20     2013 {..     
27e0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
27f0: 6e 65 74 46 78 34 35 31 3b 20 23 20 54 4f 44 4f  netFx451; # TODO
2800: 3a 20 4f 72 20 22 6e 65 74 46 78 34 35 32 22 3f  : Or "netFx452"?
2810: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
2820: 0a 20 20 20 20 20 20 20 20 20 20 20 20 32 30 31  .            201
2830: 35 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  5 {..           
2840: 20 20 20 72 65 74 75 72 6e 20 6e 65 74 46 78 34     return netFx4
2850: 36 3b 20 23 20 54 4f 44 4f 3a 20 4f 72 20 22 6e  6; # TODO: Or "n
2860: 65 74 46 78 34 36 31 22 20 2f 20 22 6e 65 74 46  etFx461" / "netF
2870: 78 34 36 32 22 3f 0d 0a 20 20 20 20 20 20 20 20  x462"?..        
2880: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
2890: 20 20 20 32 30 31 37 20 7b 0d 0a 20 20 20 20 20     2017 {..     
28a0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
28b0: 6e 65 74 46 78 34 37 3b 20 23 20 54 4f 44 4f 3a  netFx47; # TODO:
28c0: 20 4f 72 20 22 6e 65 74 46 78 34 37 31 22 20 2f   Or "netFx471" /
28d0: 20 22 6e 65 74 46 78 34 37 32 22 3f 0d 0a 20 20   "netFx472"?..  
28e0: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
28f0: 20 20 20 20 20 20 20 20 20 4e 65 74 53 74 61 6e           NetStan
2900: 64 61 72 64 32 30 20 7b 0d 0a 20 20 20 20 20 20  dard20 {..      
2910: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e          return n
2920: 65 74 53 74 61 6e 64 61 72 64 32 30 0d 0a 20 20  etStandard20..  
2930: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
2940: 20 20 20 20 20 20 20 20 20 64 65 66 61 75 6c 74           default
2950: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
2960: 20 20 72 65 74 75 72 6e 20 6e 65 74 46 78 33 35    return netFx35
2970: 3b 20 23 20 54 4f 44 4f 3a 20 47 6f 6f 64 20 22  ; # TODO: Good "
2980: 66 61 6c 6c 62 61 63 6b 22 20 64 65 66 61 75 6c  fallback" defaul
2990: 74 3f 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  t?..            
29a0: 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  }..          }..
29b0: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
29c0: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
29d0: 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a    #..    # NOTE:
29e0: 20 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20   This procedure 
29f0: 73 68 6f 75 6c 64 20 72 65 74 75 72 6e 20 6e 6f  should return no
2a00: 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 63 6f  n-zero if the co
2a10: 6e 66 69 67 75 72 65 64 20 74 65 73 74 0d 0a 20  nfigured test.. 
2a20: 20 20 20 23 20 20 20 20 20 20 20 70 6c 61 74 66     #       platf
2a30: 6f 72 6d 20 69 73 20 6d 6f 73 74 20 6c 69 6b 65  orm is most like
2a40: 6c 79 20 74 68 65 20 64 65 66 61 75 6c 74 20 66  ly the default f
2a50: 6f 72 20 74 68 69 73 20 6d 61 63 68 69 6e 65 2e  or this machine.
2a60: 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 70 72 6f  ..    #..    pro
2a70: 63 20 69 73 44 65 66 61 75 6c 74 42 75 69 6c 64  c isDefaultBuild
2a80: 50 6c 61 74 66 6f 72 6d 20 7b 20 7b 76 65 72 62  Platform { {verb
2a90: 6f 73 65 20 74 72 75 65 7d 20 7d 20 7b 0d 0a 20  ose true} } {.. 
2aa0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
2ab0: 4e 4f 54 45 3a 20 52 75 6e 6e 69 6e 67 20 6f 6e  NOTE: Running on
2ac0: 20 57 6f 57 36 34 20 69 73 20 6e 65 76 65 72 20   WoW64 is never 
2ad0: 74 68 65 20 64 65 66 61 75 6c 74 20 70 6c 61 74  the default plat
2ae0: 66 6f 72 6d 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  form...      #..
2af0: 20 20 20 20 20 20 69 66 20 7b 5b 69 73 52 75 6e        if {[isRun
2b00: 6e 69 6e 67 57 6f 57 36 34 5d 7d 20 74 68 65 6e  ningWoW64]} then
2b10: 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   {..        if {
2b20: 24 76 65 72 62 6f 73 65 7d 20 74 68 65 6e 20 7b  $verbose} then {
2b30: 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74  ..          tput
2b40: 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
2b50: 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  l \..           
2b60: 20 20 20 22 2d 2d 2d 2d 20 64 65 74 65 63 74 65     "---- detecte
2b70: 64 20 6e 6f 6e 2d 64 65 66 61 75 6c 74 20 70 6c  d non-default pl
2b80: 61 74 66 6f 72 6d 20 28 57 6f 57 36 34 29 5c 6e  atform (WoW64)\n
2b90: 22 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  "..        }....
2ba0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 66          return f
2bb0: 61 6c 73 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  alse..      }...
2bc0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
2bd0: 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 68 61 73  # NOTE: This has
2be0: 20 61 20 67 6f 6f 64 20 63 68 61 6e 63 65 20 6f   a good chance o
2bf0: 66 20 62 65 69 6e 67 20 74 68 65 20 64 65 66 61  f being the defa
2c00: 75 6c 74 20 70 6c 61 74 66 6f 72 6d 2e 0d 0a 20  ult platform... 
2c10: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
2c20: 20 7b 24 76 65 72 62 6f 73 65 7d 20 74 68 65 6e   {$verbose} then
2c30: 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   {..        tput
2c40: 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
2c50: 6c 20 22 2d 2d 2d 2d 20 64 65 74 65 63 74 65 64  l "---- detected
2c60: 20 64 65 66 61 75 6c 74 20 70 6c 61 74 66 6f 72   default platfor
2c70: 6d 5c 6e 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  m\n"..      }...
2c80: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72  .      return tr
2c90: 75 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  ue..    }.....  
2ca0: 20 20 70 72 6f 63 20 67 65 74 42 75 69 6c 64 50    proc getBuildP
2cb0: 6c 61 74 66 6f 72 6d 20 7b 20 6e 61 74 69 76 65  latform { native
2cc0: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b   } {..      if {
2cd0: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74  [info exists ::t
2ce0: 65 73 74 5f 70 6c 61 74 66 6f 72 6d 5d 20 26 26  est_platform] &&
2cf0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73   \..          [s
2d00: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a  tring length $::
2d10: 74 65 73 74 5f 70 6c 61 74 66 6f 72 6d 5d 20 3e  test_platform] >
2d20: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
2d30: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
2d40: 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20 73   NOTE: Use the s
2d50: 70 65 63 69 66 69 65 64 20 74 65 73 74 20 70 6c  pecified test pl
2d60: 61 74 66 6f 72 6d 2e 20 20 49 66 20 74 68 69 73  atform.  If this
2d70: 20 76 61 72 69 61 62 6c 65 20 69 73 20 6e 6f 74   variable is not
2d80: 20 73 65 74 2c 0d 0a 20 20 20 20 20 20 20 20 23   set,..        #
2d90: 20 20 20 20 20 20 20 74 68 65 20 64 65 66 61 75         the defau
2da0: 6c 74 20 76 61 6c 75 65 20 77 69 6c 6c 20 62 65  lt value will be
2db0: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 6d 61   based on the ma
2dc0: 63 68 69 6e 65 20 61 72 63 68 69 74 65 63 74 75  chine architectu
2dd0: 72 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  re...        #..
2de0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b          return [
2df0: 65 78 70 72 20 7b 24 6e 61 74 69 76 65 20 3f 20  expr {$native ? 
2e00: 24 3a 3a 74 65 73 74 5f 70 6c 61 74 66 6f 72 6d  $::test_platform
2e10: 20 3a 20 22 22 7d 5d 0d 0a 20 20 20 20 20 20 7d   : ""}]..      }
2e20: 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20 65   elseif {[info e
2e30: 78 69 73 74 73 20 3a 3a 74 65 73 74 5f 6d 61 63  xists ::test_mac
2e40: 68 69 6e 65 5d 20 26 26 20 5c 0d 0a 20 20 20 20  hine] && \..    
2e50: 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65        [string le
2e60: 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f 6d 61 63  ngth $::test_mac
2e70: 68 69 6e 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20  hine] > 0} then 
2e80: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
2e90: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 6f        # NOTE: Fo
2ea0: 72 20 6e 61 74 69 76 65 20 62 75 69 6c 64 73 2c  r native builds,
2eb0: 20 72 65 74 75 72 6e 20 74 68 65 20 70 6c 61 74   return the plat
2ec0: 66 6f 72 6d 20 6e 61 6d 65 20 63 6f 72 72 65 73  form name corres
2ed0: 70 6f 6e 64 69 6e 67 20 74 6f 0d 0a 20 20 20 20  ponding to..    
2ee0: 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20      #       the 
2ef0: 74 65 73 74 20 6d 61 63 68 69 6e 65 20 61 72 63  test machine arc
2f00: 68 69 74 65 63 74 75 72 65 3b 20 6f 74 68 65 72  hitecture; other
2f10: 77 69 73 65 2c 20 72 65 74 75 72 6e 20 61 6e 20  wise, return an 
2f20: 65 6d 70 74 79 0d 0a 20 20 20 20 20 20 20 20 23  empty..        #
2f30: 20 20 20 20 20 20 20 73 74 72 69 6e 67 2e 0d 0a         string...
2f40: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
2f50: 20 20 20 72 65 74 75 72 6e 20 5b 65 78 70 72 20     return [expr 
2f60: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 24 6e 61  {..          $na
2f70: 74 69 76 65 20 3f 20 5b 6d 61 63 68 69 6e 65 54  tive ? [machineT
2f80: 6f 50 6c 61 74 66 6f 72 6d 20 24 3a 3a 74 65 73  oPlatform $::tes
2f90: 74 5f 6d 61 63 68 69 6e 65 5d 20 3a 20 22 22 0d  t_machine] : "".
2fa0: 0a 20 20 20 20 20 20 20 20 7d 5d 0d 0a 20 20 20  .        }]..   
2fb0: 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e     } elseif {[in
2fc0: 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 63 6c 5f  fo exists ::tcl_
2fd0: 70 6c 61 74 66 6f 72 6d 28 6d 61 63 68 69 6e 65  platform(machine
2fe0: 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
2ff0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
3000: 20 4e 4f 54 45 3a 20 46 6f 72 20 6e 61 74 69 76   NOTE: For nativ
3010: 65 20 62 75 69 6c 64 73 2c 20 72 65 74 75 72 6e  e builds, return
3020: 20 74 68 65 20 70 6c 61 74 66 6f 72 6d 20 6e 61   the platform na
3030: 6d 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  me corresponding
3040: 20 74 6f 0d 0a 20 20 20 20 20 20 20 20 23 20 20   to..        #  
3050: 20 20 20 20 20 74 68 65 20 6d 61 63 68 69 6e 65       the machine
3060: 20 61 72 63 68 69 74 65 63 74 75 72 65 3b 20 6f   architecture; o
3070: 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e  therwise, return
3080: 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67   an empty string
3090: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
30a0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 65 78        return [ex
30b0: 70 72 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  pr {..          
30c0: 24 6e 61 74 69 76 65 20 3f 20 5b 6d 61 63 68 69  $native ? [machi
30d0: 6e 65 54 6f 50 6c 61 74 66 6f 72 6d 20 24 3a 3a  neToPlatform $::
30e0: 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 6d 61 63  tcl_platform(mac
30f0: 68 69 6e 65 29 5d 20 3a 20 22 22 0d 0a 20 20 20  hine)] : ""..   
3100: 20 20 20 20 20 7d 5d 0d 0a 20 20 20 20 20 20 7d       }]..      }
3110: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
3120: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
3130: 54 45 3a 20 4e 6f 20 6d 61 63 68 69 6e 65 20 61  TE: No machine a
3140: 72 63 68 69 74 65 63 74 75 72 65 20 69 73 20 61  rchitecture is a
3150: 76 61 69 6c 61 62 6c 65 2c 20 72 65 74 75 72 6e  vailable, return
3160: 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67   an empty string
3170: 2e 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  ...        #    
3180: 20 20 20 49 74 20 69 73 20 69 6d 70 6f 72 74 61     It is importa
3190: 6e 74 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20  nt to return an 
31a0: 65 6d 70 74 79 20 73 74 72 69 6e 67 20 68 65 72  empty string her
31b0: 65 20 62 65 63 61 75 73 65 20 74 68 65 0d 0a 20  e because the.. 
31c0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 72         #       r
31d0: 65 73 75 6c 74 20 6f 66 20 74 68 69 73 20 70 72  esult of this pr
31e0: 6f 63 65 64 75 72 65 20 6d 61 79 20 62 65 20 75  ocedure may be u
31f0: 73 65 64 20 77 69 74 68 20 5b 66 69 6c 65 20 6a  sed with [file j
3200: 6f 69 6e 5d 2e 0d 0a 20 20 20 20 20 20 20 20 23  oin]...        #
3210: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
3220: 20 22 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20   ""..      }..  
3230: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
3240: 20 67 65 74 42 75 69 6c 64 43 6f 6e 66 69 67 75   getBuildConfigu
3250: 72 61 74 69 6f 6e 20 7b 7d 20 7b 0d 0a 20 20 20  ration {} {..   
3260: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
3270: 54 45 3a 20 53 65 65 20 69 66 20 74 68 65 20 22  TE: See if the "
3280: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 22 20 73  configuration" s
3290: 65 74 74 69 6e 67 20 68 61 73 20 62 65 65 6e 20  etting has been 
32a0: 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20 74 68  overridden by th
32b0: 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
32c0: 20 75 73 65 72 20 28 65 2e 67 2e 20 6f 6e 20 74   user (e.g. on t
32d0: 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 29  he command line)
32e0: 2e 20 20 54 68 69 73 20 68 65 6c 70 73 20 63 6f  .  This helps co
32f0: 6e 74 72 6f 6c 20 65 78 61 63 74 6c 79 0d 0a 20  ntrol exactly.. 
3300: 20 20 20 20 20 23 20 20 20 20 20 20 20 77 68 69       #       whi
3310: 63 68 20 73 65 74 20 6f 66 20 62 69 6e 61 72 69  ch set of binari
3320: 65 73 20 77 65 20 61 72 65 20 74 65 73 74 69 6e  es we are testin
3330: 67 20 28 69 2e 65 2e 20 74 68 6f 73 65 20 62 75  g (i.e. those bu
3340: 69 6c 74 20 69 6e 20 74 68 65 0d 0a 20 20 20 20  ilt in the..    
3350: 20 20 23 20 20 20 20 20 20 20 22 44 65 62 75 67    #       "Debug
3360: 22 20 6f 72 20 22 52 65 6c 65 61 73 65 22 20 62  " or "Release" b
3370: 75 69 6c 64 20 63 6f 6e 66 69 67 75 72 61 74 69  uild configurati
3380: 6f 6e 73 29 2e 20 20 54 6f 20 6f 76 65 72 72 69  ons).  To overri
3390: 64 65 20 74 68 69 73 0d 0a 20 20 20 20 20 20 23  de this..      #
33a0: 20 20 20 20 20 20 20 76 61 6c 75 65 20 76 69 61         value via
33b0: 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e   the command lin
33c0: 65 2c 20 65 6e 74 65 72 20 61 20 63 6f 6d 6d 61  e, enter a comma
33d0: 6e 64 20 73 69 6d 69 6c 61 72 20 74 6f 20 6f 6e  nd similar to on
33e0: 65 20 6f 66 0d 0a 20 20 20 20 20 20 23 20 20 20  e of..      #   
33f0: 20 20 20 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e      the followin
3400: 67 20 28 61 6c 6c 20 6f 6e 20 6f 6e 65 20 6c 69  g (all on one li
3410: 6e 65 29 3a 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ne):..      #.. 
3420: 20 20 20 20 20 23 20 20 20 20 20 20 20 45 61 67       #       Eag
3430: 6c 65 53 68 65 6c 6c 2e 65 78 65 20 2d 61 6e 79  leShell.exe -any
3440: 49 6e 69 74 69 61 6c 69 7a 65 20 22 73 65 74 20  Initialize "set 
3450: 74 65 73 74 5f 63 6f 6e 66 69 67 75 72 61 74 69  test_configurati
3460: 6f 6e 20 44 65 62 75 67 22 0d 0a 20 20 20 20 20  on Debug"..     
3470: 20 23 20 20 20 20 20 20 20 20 20 2d 66 69 6c 65   #         -file
3480: 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65   .\path\to\all.e
3490: 61 67 6c 65 0d 0a 20 20 20 20 20 20 23 0d 0a 20  agle..      #.. 
34a0: 20 20 20 20 20 23 20 20 20 20 20 20 20 45 61 67       #       Eag
34b0: 6c 65 53 68 65 6c 6c 2e 65 78 65 20 2d 61 6e 79  leShell.exe -any
34c0: 49 6e 69 74 69 61 6c 69 7a 65 20 22 73 65 74 20  Initialize "set 
34d0: 74 65 73 74 5f 63 6f 6e 66 69 67 75 72 61 74 69  test_configurati
34e0: 6f 6e 20 52 65 6c 65 61 73 65 22 0d 0a 20 20 20  on Release"..   
34f0: 20 20 20 23 20 20 20 20 20 20 20 20 20 2d 66 69     #         -fi
3500: 6c 65 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c  le .\path\to\all
3510: 2e 65 61 67 6c 65 0d 0a 20 20 20 20 20 20 23 0d  .eagle..      #.
3520: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 45  .      #       E
3530: 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65 20 2d 66  agleShell.exe -f
3540: 69 6c 65 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c  ile .\path\to\al
3550: 6c 2e 65 61 67 6c 65 20 2d 70 72 65 54 65 73 74  l.eagle -preTest
3560: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
3570: 20 20 22 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70    "unset -nocomp
3580: 6c 61 69 6e 20 74 65 73 74 5f 63 6f 6e 66 69 67  lain test_config
3590: 75 72 61 74 69 6f 6e 22 0d 0a 20 20 20 20 20 20  uration"..      
35a0: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e  #..      if {[in
35b0: 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 73 74  fo exists ::test
35c0: 5f 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 5d 20  _configuration] 
35d0: 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
35e0: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
35f0: 3a 3a 74 65 73 74 5f 63 6f 6e 66 69 67 75 72 61  ::test_configura
3600: 74 69 6f 6e 5d 20 3e 20 30 7d 20 74 68 65 6e 20  tion] > 0} then 
3610: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
3620: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73        # NOTE: Us
3630: 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  e the specified 
3640: 74 65 73 74 20 63 6f 6e 66 69 67 75 72 61 74 69  test configurati
3650: 6f 6e 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74  on.  The default
3660: 20 76 61 6c 75 65 20 75 73 65 64 0d 0a 20 20 20   value used..   
3670: 20 20 20 20 20 23 20 20 20 20 20 20 20 66 6f 72       #       for
3680: 20 74 68 69 73 20 76 61 72 69 61 62 6c 65 20 69   this variable i
3690: 73 20 74 79 70 69 63 61 6c 6c 79 20 22 52 65 6c  s typically "Rel
36a0: 65 61 73 65 22 2c 20 61 73 20 73 65 74 20 62 79  ease", as set by
36b0: 20 74 68 65 20 74 65 73 74 0d 0a 20 20 20 20 20   the test..     
36c0: 20 20 20 23 20 20 20 20 20 20 20 73 75 69 74 65     #       suite
36d0: 20 69 74 73 65 6c 66 2e 0d 0a 20 20 20 20 20 20   itself...      
36e0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
36f0: 75 72 6e 20 24 3a 3a 74 65 73 74 5f 63 6f 6e 66  urn $::test_conf
3700: 69 67 75 72 61 74 69 6f 6e 0d 0a 20 20 20 20 20  iguration..     
3710: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
3720: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
3730: 4e 4f 54 45 3a 20 4e 6f 72 6d 61 6c 6c 79 2c 20  NOTE: Normally, 
3740: 77 65 20 77 69 6c 6c 20 6e 65 76 65 72 20 68 69  we will never hi
3750: 74 20 74 68 69 73 20 63 61 73 65 20 62 65 63 61  t this case beca
3760: 75 73 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  use the value of
3770: 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20   the..        # 
3780: 20 20 20 20 20 20 74 65 73 74 20 63 6f 6e 66 69        test confi
3790: 67 75 72 61 74 69 6f 6e 20 76 61 72 69 61 62 6c  guration variabl
37a0: 65 20 69 73 20 61 6c 77 61 79 73 20 73 65 74 20  e is always set 
37b0: 62 79 20 74 68 65 20 74 65 73 74 20 73 75 69 74  by the test suit
37c0: 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
37d0: 20 20 20 69 74 73 65 6c 66 3b 20 68 6f 77 65 76     itself; howev
37e0: 65 72 2c 20 69 74 20 63 61 6e 20 62 65 20 6f 76  er, it can be ov
37f0: 65 72 72 69 64 64 65 6e 20 75 73 69 6e 67 20 74  erridden using t
3800: 68 65 20 75 6e 73 65 74 20 63 6f 6d 6d 61 6e 64  he unset command
3810: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
3820: 20 20 66 72 6f 6d 20 74 68 65 20 2d 70 72 65 54    from the -preT
3830: 65 73 74 20 6f 70 74 69 6f 6e 20 74 6f 20 74 68  est option to th
3840: 65 20 74 65 73 74 20 73 75 69 74 65 2e 0d 0a 20  e test suite... 
3850: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
3860: 20 20 72 65 74 75 72 6e 20 24 3a 3a 65 61 67 6c    return $::eagl
3870: 65 5f 70 6c 61 74 66 6f 72 6d 28 63 6f 6e 66 69  e_platform(confi
3880: 67 75 72 61 74 69 6f 6e 29 0d 0a 20 20 20 20 20  guration)..     
3890: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
38a0: 20 20 70 72 6f 63 20 67 65 74 42 75 69 6c 64 43    proc getBuildC
38b0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 53 75 66 66  onfigurationSuff
38c0: 69 78 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23  ix {} {..      #
38d0: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
38e0: 53 65 65 20 69 66 20 74 68 65 20 74 65 73 74 20  See if the test 
38f0: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 73 75  configuration su
3900: 66 66 69 78 20 68 61 73 20 62 65 65 6e 20 6f 76  ffix has been ov
3910: 65 72 72 69 64 64 65 6e 20 62 79 0d 0a 20 20 20  erridden by..   
3920: 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20 75     #       the u
3930: 73 65 72 20 28 65 2e 67 2e 20 6f 6e 20 74 68 65  ser (e.g. on the
3940: 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 29 2e 0d   command line)..
3950: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
3960: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
3970: 20 3a 3a 74 65 73 74 5f 63 6f 6e 66 69 67 75 72   ::test_configur
3980: 61 74 69 6f 6e 5f 73 75 66 66 69 78 5d 20 26 26  ation_suffix] &&
3990: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73   \..          [s
39a0: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a  tring length $::
39b0: 74 65 73 74 5f 63 6f 6e 66 69 67 75 72 61 74 69  test_configurati
39c0: 6f 6e 5f 73 75 66 66 69 78 5d 20 3e 20 30 7d 20  on_suffix] > 0} 
39d0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
39e0: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
39f0: 45 3a 20 55 73 65 20 74 68 65 20 73 70 65 63 69  E: Use the speci
3a00: 66 69 65 64 20 74 65 73 74 20 63 6f 6e 66 69 67  fied test config
3a10: 75 72 61 74 69 6f 6e 20 73 75 66 66 69 78 2e 0d  uration suffix..
3a20: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
3a30: 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 74 65      return $::te
3a40: 73 74 5f 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  st_configuration
3a50: 5f 73 75 66 66 69 78 0d 0a 20 20 20 20 20 20 7d  _suffix..      }
3a60: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
3a70: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
3a80: 54 45 3a 20 55 73 65 20 74 68 65 20 64 65 66 61  TE: Use the defa
3a90: 75 6c 74 20 74 65 73 74 20 63 6f 6e 66 69 67 75  ult test configu
3aa0: 72 61 74 69 6f 6e 20 73 75 66 66 69 78 2c 20 77  ration suffix, w
3ab0: 68 69 63 68 20 73 68 6f 75 6c 64 20 62 65 0d 0a  hich should be..
3ac0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
3ad0: 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e  an empty string.
3ae0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
3af0: 20 20 20 20 20 72 65 74 75 72 6e 20 22 22 0d 0a       return ""..
3b00: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
3b10: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 42  ...    proc getB
3b20: 75 69 6c 64 43 6f 6e 66 69 67 75 72 61 74 69 6f  uildConfiguratio
3b30: 6e 73 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23  ns {} {..      #
3b40: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
3b50: 53 65 65 20 69 66 20 74 68 65 20 6c 69 73 74 20  See if the list 
3b60: 6f 66 20 74 65 73 74 20 63 6f 6e 66 69 67 75 72  of test configur
3b70: 61 74 69 6f 6e 73 20 68 61 73 20 62 65 65 6e 20  ations has been 
3b80: 6f 76 65 72 72 69 64 64 65 6e 20 62 79 0d 0a 20  overridden by.. 
3b90: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
3ba0: 20 75 73 65 72 20 28 65 2e 67 2e 20 6f 6e 20 74   user (e.g. on t
3bb0: 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 29  he command line)
3bc0: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
3bd0: 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73    if {[info exis
3be0: 74 73 20 3a 3a 74 65 73 74 5f 63 6f 6e 66 69 67  ts ::test_config
3bf0: 75 72 61 74 69 6f 6e 73 5d 20 26 26 20 5c 0d 0a  urations] && \..
3c00: 20 20 20 20 20 20 20 20 20 20 5b 6c 6c 65 6e 67            [lleng
3c10: 74 68 20 24 3a 3a 74 65 73 74 5f 63 6f 6e 66 69  th $::test_confi
3c20: 67 75 72 61 74 69 6f 6e 73 5d 20 3e 20 30 7d 20  gurations] > 0} 
3c30: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
3c40: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
3c50: 45 3a 20 55 73 65 20 74 68 65 20 73 70 65 63 69  E: Use the speci
3c60: 66 69 65 64 20 6c 69 73 74 20 6f 66 20 74 65 73  fied list of tes
3c70: 74 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73  t configurations
3c80: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
3c90: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a        return $::
3ca0: 74 65 73 74 5f 63 6f 6e 66 69 67 75 72 61 74 69  test_configurati
3cb0: 6f 6e 73 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  ons..      } els
3cc0: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  e {..        #..
3cd0: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
3ce0: 55 73 65 20 74 68 65 20 64 65 66 61 75 6c 74 20  Use the default 
3cf0: 6c 69 73 74 20 6f 66 20 74 65 73 74 20 63 6f 6e  list of test con
3d00: 66 69 67 75 72 61 74 69 6f 6e 73 2e 0d 0a 20 20  figurations...  
3d10: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
3d20: 20 72 65 74 75 72 6e 20 5b 6c 69 73 74 20 44 65   return [list De
3d30: 62 75 67 20 52 65 6c 65 61 73 65 5d 0d 0a 20 20  bug Release]..  
3d40: 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
3d50: 0a 20 20 20 20 70 72 6f 63 20 67 65 74 42 75 69  .    proc getBui
3d60: 6c 64 45 78 74 72 61 20 7b 7d 20 7b 0d 0a 20 20  ldExtra {} {..  
3d70: 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
3d80: 69 73 74 73 20 3a 3a 74 65 73 74 5f 65 78 74 72  ists ::test_extr
3d90: 61 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  a] && \..       
3da0: 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74     [string lengt
3db0: 68 20 24 3a 3a 74 65 73 74 5f 65 78 74 72 61 5d  h $::test_extra]
3dc0: 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
3dd0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
3de0: 20 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65   # NOTE: Use the
3df0: 20 73 70 65 63 69 66 69 65 64 20 65 78 74 72 61   specified extra
3e00: 20 6f 75 74 70 75 74 20 64 69 72 65 63 74 6f 72   output director
3e10: 79 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  y...        #.. 
3e20: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a         return $:
3e30: 3a 74 65 73 74 5f 65 78 74 72 61 0d 0a 20 20 20  :test_extra..   
3e40: 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69 73     } elseif {[is
3e50: 44 6f 74 4e 65 74 43 6f 72 65 5d 7d 20 74 68 65  DotNetCore]} the
3e60: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
3e70: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
3e80: 52 75 6e 6e 69 6e 67 20 6f 6e 20 2e 4e 45 54 20  Running on .NET 
3e90: 43 6f 72 65 2c 20 75 73 65 20 74 68 65 20 65 78  Core, use the ex
3ea0: 74 72 61 20 6f 75 74 70 75 74 20 64 69 72 65 63  tra output direc
3eb0: 74 6f 72 79 20 66 6f 72 0d 0a 20 20 20 20 20 20  tory for..      
3ec0: 20 20 23 20 20 20 20 20 20 20 6c 69 62 72 61 72    #       librar
3ed0: 79 20 66 69 6c 65 73 2e 0d 0a 20 20 20 20 20 20  y files...      
3ee0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
3ef0: 75 72 6e 20 6e 65 74 73 74 61 6e 64 61 72 64 32  urn netstandard2
3f00: 2e 30 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  .0..      } else
3f10: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
3f20: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e         # NOTE: N
3f30: 6f 20 65 78 74 72 61 20 6f 75 74 70 75 74 20 64  o extra output d
3f40: 69 72 65 63 74 6f 72 79 20 69 73 20 72 65 71 75  irectory is requ
3f50: 69 72 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 23  ired...        #
3f60: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
3f70: 20 22 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20   ""..      }..  
3f80: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
3f90: 20 67 65 74 42 75 69 6c 64 45 78 74 72 61 73 20   getBuildExtras 
3fa0: 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20  {} {..      #.. 
3fb0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 65 65       # NOTE: See
3fc0: 20 69 66 20 74 68 65 20 6c 69 73 74 20 6f 66 20   if the list of 
3fd0: 65 78 74 72 61 20 6f 75 74 70 75 74 20 64 69 72  extra output dir
3fe0: 65 63 74 6f 72 69 65 73 20 68 61 73 20 62 65 65  ectories has bee
3ff0: 6e 20 6f 76 65 72 72 69 64 64 65 6e 0d 0a 20 20  n overridden..  
4000: 20 20 20 20 23 20 20 20 20 20 20 20 62 79 20 74      #       by t
4010: 68 65 20 75 73 65 72 20 28 65 2e 67 2e 20 6f 6e  he user (e.g. on
4020: 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e   the command lin
4030: 65 29 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  e)...      #..  
4040: 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
4050: 69 73 74 73 20 3a 3a 74 65 73 74 5f 65 78 74 72  ists ::test_extr
4060: 61 73 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  as] && \..      
4070: 20 20 20 20 5b 6c 6c 65 6e 67 74 68 20 24 3a 3a      [llength $::
4080: 74 65 73 74 5f 65 78 74 72 61 73 5d 20 3e 20 30  test_extras] > 0
4090: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
40a0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
40b0: 4f 54 45 3a 20 55 73 65 20 74 68 65 20 73 70 65  OTE: Use the spe
40c0: 63 69 66 69 65 64 20 6c 69 73 74 20 6f 66 20 65  cified list of e
40d0: 78 74 72 61 20 6f 75 74 70 75 74 20 64 69 72 65  xtra output dire
40e0: 63 74 6f 72 69 65 73 2e 0d 0a 20 20 20 20 20 20  ctories...      
40f0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
4100: 75 72 6e 20 24 3a 3a 74 65 73 74 5f 65 78 74 72  urn $::test_extr
4110: 61 73 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  as..      } else
4120: 69 66 20 7b 5b 69 73 44 6f 74 4e 65 74 43 6f 72  if {[isDotNetCor
4130: 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  e]} then {..    
4140: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
4150: 20 4e 4f 54 45 3a 20 52 75 6e 6e 69 6e 67 20 6f   NOTE: Running o
4160: 6e 20 2e 4e 45 54 20 43 6f 72 65 2c 20 70 72 69  n .NET Core, pri
4170: 6f 72 69 74 69 7a 65 20 69 74 73 20 65 78 74 72  oritize its extr
4180: 61 20 6f 75 74 70 75 74 20 64 69 72 65 63 74 6f  a output directo
4190: 72 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ry..        #   
41a0: 20 20 20 20 66 6f 72 20 6c 69 62 72 61 72 79 20      for library 
41b0: 66 69 6c 65 73 2e 0d 0a 20 20 20 20 20 20 20 20  files...        
41c0: 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  #..        retur
41d0: 6e 20 5b 6c 69 73 74 20 6e 65 74 73 74 61 6e 64  n [list netstand
41e0: 61 72 64 32 2e 30 20 22 22 5d 0d 0a 20 20 20 20  ard2.0 ""]..    
41f0: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
4200: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
4210: 20 4e 4f 54 45 3a 20 55 73 65 20 64 65 66 61 75   NOTE: Use defau
4220: 6c 74 20 6c 69 73 74 20 6f 66 20 65 78 74 72 61  lt list of extra
4230: 20 6f 75 74 70 75 74 20 64 69 72 65 63 74 6f 72   output director
4240: 69 65 73 2c 20 77 68 69 63 68 20 69 73 20 6f 6e  ies, which is on
4250: 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
4260: 20 20 20 65 6d 70 74 79 20 73 74 72 69 6e 67 20     empty string 
4270: 28 6e 6f 2d 6f 70 29 2e 0d 0a 20 20 20 20 20 20  (no-op)...      
4280: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
4290: 75 72 6e 20 5b 6c 69 73 74 20 22 22 5d 0d 0a 20  urn [list ""].. 
42a0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
42b0: 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 42 75  ..    proc getBu
42c0: 69 6c 64 42 61 73 65 44 69 72 65 63 74 6f 72 79  ildBaseDirectory
42d0: 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a   {} {..      #..
42e0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69        # NOTE: Fi
42f0: 67 75 72 65 20 6f 75 74 20 74 68 65 20 62 61 73  gure out the bas
4300: 65 20 64 69 72 65 63 74 6f 72 79 20 77 68 65 72  e directory wher
4310: 65 20 61 6c 6c 20 74 68 65 20 62 75 69 6c 64 73  e all the builds
4320: 20 73 68 6f 75 6c 64 20 62 65 0d 0a 20 20 20 20   should be..    
4330: 20 20 23 20 20 20 20 20 20 20 6c 6f 63 61 74 65    #       locate
4340: 64 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 62 65  d.  This will be
4350: 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 74   the directory t
4360: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
4370: 20 61 63 74 75 61 6c 0d 0a 20 20 20 20 20 20 23   actual..      #
4380: 20 20 20 20 20 20 20 62 75 69 6c 64 20 6f 75 74         build out
4390: 70 75 74 20 64 69 72 65 63 74 6f 72 79 20 28 65  put directory (e
43a0: 2e 67 2e 20 70 61 72 65 6e 74 20 6f 66 20 22 62  .g. parent of "b
43b0: 69 6e 22 29 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  in")...      #..
43c0: 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20        if {[info 
43d0: 65 78 69 73 74 73 20 3a 3a 62 75 69 6c 64 5f 62  exists ::build_b
43e0: 61 73 65 5f 64 69 72 65 63 74 6f 72 79 5d 20 26  ase_directory] &
43f0: 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b  & \..          [
4400: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a  string length $:
4410: 3a 62 75 69 6c 64 5f 62 61 73 65 5f 64 69 72 65  :build_base_dire
4420: 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e  ctory] > 0} then
4430: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
4440: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54         # NOTE: T
4450: 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74  he location of t
4460: 68 65 20 62 75 69 6c 64 20 62 61 73 65 20 64 69  he build base di
4470: 72 65 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e  rectory has been
4480: 20 6f 76 65 72 72 69 64 64 65 6e 3b 0d 0a 20 20   overridden;..  
4490: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68        #       th
44a0: 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74 20  erefore, use it 
44b0: 76 65 72 62 61 74 69 6d 2e 0d 0a 20 20 20 20 20  verbatim...     
44c0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65     #..        re
44d0: 74 75 72 6e 20 24 3a 3a 62 75 69 6c 64 5f 62 61  turn $::build_ba
44e0: 73 65 5f 64 69 72 65 63 74 6f 72 79 0d 0a 20 20  se_directory..  
44f0: 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69      } elseif {[i
4500: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 63 6f 6d  nfo exists ::com
4510: 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79 5d 20 26  mon_directory] &
4520: 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b  & \..          [
4530: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a  string length $:
4540: 3a 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f 72  :common_director
4550: 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  y] > 0} then {..
4560: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
4570: 20 20 20 23 20 4e 4f 54 45 3a 20 4e 65 78 74 2c     # NOTE: Next,
4580: 20 66 61 6c 6c 62 61 63 6b 20 74 6f 20 74 68 65   fallback to the
4590: 20 67 72 61 6e 64 70 61 72 65 6e 74 20 64 69 72   grandparent dir
45a0: 65 63 74 6f 72 79 20 6f 66 20 74 68 65 20 6f 6e  ectory of the on
45b0: 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
45c0: 20 20 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68     containing th
45d0: 69 73 20 66 69 6c 65 20 28 69 2e 65 2e 20 22 63  is file (i.e. "c
45e0: 6f 6d 6d 6f 6e 2e 65 61 67 6c 65 22 29 2c 20 69  ommon.eagle"), i
45f0: 66 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0a 20 20  f available...  
4600: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
4610: 20 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 64 69   return [file di
4620: 72 6e 61 6d 65 20 5b 66 69 6c 65 20 64 69 72 6e  rname [file dirn
4630: 61 6d 65 20 24 3a 3a 63 6f 6d 6d 6f 6e 5f 64 69  ame $::common_di
4640: 72 65 63 74 6f 72 79 5d 5d 0d 0a 20 20 20 20 20  rectory]]..     
4650: 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f   } elseif {[info
4660: 20 65 78 69 73 74 73 20 3a 3a 70 61 74 68 5d 20   exists ::path] 
4670: 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
4680: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
4690: 3a 3a 70 61 74 68 5d 20 3e 20 30 7d 20 74 68 65  ::path] > 0} the
46a0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
46b0: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
46c0: 46 69 6e 61 6c 6c 79 2c 20 66 61 6c 6c 62 61 63  Finally, fallbac
46d0: 6b 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20  k to the parent 
46e0: 64 69 72 65 63 74 6f 72 79 20 6f 66 20 74 68 65  directory of the
46f0: 20 45 61 67 6c 65 54 65 73 74 0d 0a 20 20 20 20   EagleTest..    
4700: 20 20 20 20 23 20 20 20 20 20 20 20 70 61 74 68      #       path
4710: 2e 20 20 54 68 65 20 45 61 67 6c 65 54 65 73 74  .  The EagleTest
4720: 20 70 61 63 6b 61 67 65 20 67 75 61 72 61 6e 74   package guarant
4730: 65 65 73 20 74 68 61 74 20 74 68 69 73 20 76 61  ees that this va
4740: 72 69 61 62 6c 65 0d 0a 20 20 20 20 20 20 20 20  riable..        
4750: 23 20 20 20 20 20 20 20 77 69 6c 6c 20 62 65 20  #       will be 
4760: 73 65 74 20 74 6f 20 74 68 65 20 64 69 72 65 63  set to the direc
4770: 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20  tory containing 
4780: 74 68 65 20 66 69 72 73 74 20 66 69 6c 65 20 74  the first file t
4790: 6f 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  o..        #    
47a0: 20 20 20 65 78 65 63 75 74 65 20 74 68 65 20 5b     execute the [
47b0: 72 75 6e 54 65 73 74 50 72 6f 6c 6f 67 75 65 5d  runTestPrologue]
47c0: 20 73 63 72 69 70 74 20 6c 69 62 72 61 72 79 20   script library 
47d0: 70 72 6f 63 65 64 75 72 65 2e 0d 0a 20 20 20 20  procedure...    
47e0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
47f0: 65 74 75 72 6e 20 5b 66 69 6c 65 20 64 69 72 6e  eturn [file dirn
4800: 61 6d 65 20 24 3a 3a 70 61 74 68 5d 0d 0a 20 20  ame $::path]..  
4810: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
4820: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
4830: 20 23 20 4e 4f 54 45 3a 20 4e 6f 20 70 61 74 68   # NOTE: No path
4840: 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 72   is available, r
4850: 65 74 75 72 6e 20 61 6e 20 65 6d 70 74 79 20 73  eturn an empty s
4860: 74 72 69 6e 67 2e 20 20 54 68 69 73 20 70 6f 69  tring.  This poi
4870: 6e 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  nt..        #   
4880: 20 20 20 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62      should not b
4890: 65 20 72 65 61 63 68 65 64 2e 0d 0a 20 20 20 20  e reached...    
48a0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
48b0: 65 74 75 72 6e 20 22 22 0d 0a 20 20 20 20 20 20  eturn ""..      
48c0: 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
48d0: 20 70 72 6f 63 20 67 65 74 53 51 4c 69 74 65 54   proc getSQLiteT
48e0: 65 73 74 44 61 74 61 50 61 74 68 20 7b 7d 20 7b  estDataPath {} {
48f0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
4900: 20 23 20 4e 4f 54 45 3a 20 46 69 67 75 72 65 20   # NOTE: Figure 
4910: 6f 75 74 20 74 68 65 20 64 69 72 65 63 74 6f 72  out the director
4920: 79 20 77 68 65 72 65 20 61 6c 6c 20 74 68 65 20  y where all the 
4930: 74 65 73 74 20 64 61 74 61 20 66 69 6c 65 73 20  test data files 
4940: 73 68 6f 75 6c 64 0d 0a 20 20 20 20 20 20 23 20  should..      # 
4950: 20 20 20 20 20 20 62 65 20 6c 6f 63 61 74 65 64        be located
4960: 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62  .  This should b
4970: 65 20 74 68 65 20 22 64 61 74 61 22 20 64 69 72  e the "data" dir
4980: 65 63 74 6f 72 79 20 62 65 6e 65 61 74 68 20 74  ectory beneath t
4990: 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  he..      #     
49a0: 20 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 74    directory cont
49b0: 61 69 6e 69 6e 67 20 74 68 65 20 61 63 74 75 61  aining the actua
49c0: 6c 20 74 65 73 74 20 73 63 72 69 70 74 73 2e 0d  l test scripts..
49d0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
49e0: 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 6a 6f 69  return [file joi
49f0: 6e 20 24 3a 3a 70 61 74 68 20 64 61 74 61 5d 0d  n $::path data].
4a00: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
4a10: 72 6f 63 20 69 73 52 75 6e 6e 69 6e 67 57 6f 57  roc isRunningWoW
4a20: 36 34 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23  64 {} {..      #
4a30: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
4a40: 46 6f 72 20 6e 6f 77 2c 20 6a 75 73 74 20 75 73  For now, just us
4a50: 65 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 74  e the existing t
4a60: 65 73 74 20 63 6f 6e 73 74 72 61 69 6e 74 20 66  est constraint f
4a70: 6f 72 20 64 65 74 65 63 74 69 6e 67 0d 0a 20 20  or detecting..  
4a80: 20 20 20 20 23 20 20 20 20 20 20 20 61 20 57 6f      #       a Wo
4a90: 57 36 34 20 70 72 6f 63 65 73 73 2e 0d 0a 20 20  W64 process...  
4aa0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74      #..      ret
4ab0: 75 72 6e 20 5b 68 61 76 65 43 6f 6e 73 74 72 61  urn [haveConstra
4ac0: 69 6e 74 20 77 6f 77 36 34 5d 0d 0a 20 20 20 20  int wow64]..    
4ad0: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 69  }.....    proc i
4ae0: 73 4d 69 78 65 64 4d 6f 64 65 41 73 73 65 6d 62  sMixedModeAssemb
4af0: 6c 79 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7b 76  ly { fileName {v
4b00: 61 72 4e 61 6d 65 20 22 22 7d 20 7d 20 7b 0d 0a  arName ""} } {..
4b10: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
4b20: 20 4e 4f 54 45 3a 20 46 69 72 73 74 2c 20 6d 61   NOTE: First, ma
4b30: 6b 65 20 73 75 72 65 20 74 68 65 20 74 65 73 74  ke sure the test
4b40: 20 73 75 69 74 65 20 69 6e 66 72 61 73 74 72 75   suite infrastru
4b50: 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 77 65 64  cture is allowed
4b60: 20 74 6f 0d 0a 20 20 20 20 20 20 23 20 20 20 20   to..      #    
4b70: 20 20 20 75 73 65 20 74 68 65 20 5b 65 78 65 63     use the [exec
4b80: 5d 20 63 6f 6d 6d 61 6e 64 2e 0d 0a 20 20 20 20  ] command...    
4b90: 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 21    #..      if {!
4ba0: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
4bb0: 6f 28 65 78 65 63 29 5d 20 26 26 20 21 5b 69 6e  o(exec)] && ![in
4bc0: 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63  fo exists ::no(c
4bd0: 6f 72 46 6c 61 67 73 29 5d 7d 20 74 68 65 6e 20  orFlags)]} then 
4be0: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
4bf0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66        # NOTE: If
4c00: 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66   the location of
4c10: 20 43 6f 72 46 6c 61 67 73 20 69 73 20 70 72 65   CorFlags is pre
4c20: 73 65 6e 74 20 69 6e 20 74 68 65 20 65 6e 76 69  sent in the envi
4c30: 72 6f 6e 6d 65 6e 74 2c 0d 0a 20 20 20 20 20 20  ronment,..      
4c40: 20 20 23 20 20 20 20 20 20 20 75 73 65 20 69 74    #       use it
4c50: 3b 20 6f 74 68 65 72 77 69 73 65 20 61 73 73 75  ; otherwise assu
4c60: 6d 65 20 69 74 20 69 73 20 69 6e 20 74 68 65 20  me it is in the 
4c70: 50 41 54 48 2e 0d 0a 20 20 20 20 20 20 20 20 23  PATH...        #
4c80: 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 63 6f  ..        set co
4c90: 72 46 6c 61 67 73 20 5b 65 78 70 72 20 7b 0d 0a  rFlags [expr {..
4ca0: 20 20 20 20 20 20 20 20 20 20 5b 69 6e 66 6f 20            [info 
4cb0: 65 78 69 73 74 73 20 3a 3a 65 6e 76 28 43 6f 72  exists ::env(Cor
4cc0: 46 6c 61 67 73 29 5d 20 3f 20 24 3a 3a 65 6e 76  Flags)] ? $::env
4cd0: 28 43 6f 72 46 6c 61 67 73 29 20 3a 20 22 43 6f  (CorFlags) : "Co
4ce0: 72 46 6c 61 67 73 22 0d 0a 20 20 20 20 20 20 20  rFlags"..       
4cf0: 20 7d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23   }]....        #
4d00: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
4d10: 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 65 78 65  : Attempt to exe
4d20: 63 75 74 65 20 43 6f 72 46 6c 61 67 73 20 6f 6e  cute CorFlags on
4d30: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66   the specified f
4d40: 69 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ile...        #.
4d50: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61  .        if {[ca
4d60: 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
4d70: 20 65 78 65 63 20 2d 2d 20 24 63 6f 72 46 6c 61   exec -- $corFla
4d80: 67 73 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e  gs [file nativen
4d90: 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a  ame $fileName]..
4da0: 20 20 20 20 20 20 20 20 7d 20 65 78 65 63 5d 20          } exec] 
4db0: 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
4dc0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
4dd0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20       # NOTE: If 
4de0: 72 65 71 75 65 73 74 65 64 20 62 79 20 6f 75 72  requested by our
4df0: 20 63 61 6c 6c 65 72 2c 20 61 74 74 65 6d 70 74   caller, attempt
4e00: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
4e10: 65 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20  e..          #  
4e20: 20 20 20 20 20 70 6c 61 74 66 6f 72 6d 20 66 6f       platform fo
4e30: 72 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  r the specified 
4e40: 66 69 6c 65 20 61 73 20 77 65 6c 6c 2e 0d 0a 20  file as well... 
4e50: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
4e60: 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
4e70: 67 20 6c 65 6e 67 74 68 20 24 76 61 72 4e 61 6d  g length $varNam
4e80: 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  e] > 0} then {..
4e90: 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
4ea0: 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
4eb0: 45 3a 20 53 74 6f 72 65 20 74 68 65 20 70 6c 61  E: Store the pla
4ec0: 74 66 6f 72 6d 20 69 6e 20 74 68 65 20 6e 61 6d  tform in the nam
4ed0: 65 64 20 76 61 72 69 61 62 6c 65 20 69 6e 20 74  ed variable in t
4ee0: 68 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  he..            
4ef0: 23 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74 20  #       context 
4f00: 6f 66 20 6f 75 72 20 63 61 6c 6c 65 72 2e 0d 0a  of our caller...
4f10: 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
4f20: 20 20 20 20 20 20 20 20 20 20 20 75 70 76 61 72             upvar
4f30: 20 31 20 24 76 61 72 4e 61 6d 65 20 70 6c 61 74   1 $varName plat
4f40: 66 6f 72 6d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  form....        
4f50: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
4f60: 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d     # NOTE: Attem
4f70: 70 74 20 74 6f 20 65 78 74 72 61 63 74 20 74 68  pt to extract th
4f80: 65 20 50 45 20 6c 69 6e 65 20 66 72 6f 6d 20 74  e PE line from t
4f90: 68 65 20 63 61 70 74 75 72 65 64 0d 0a 20 20 20  he captured..   
4fa0: 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
4fb0: 20 6f 75 74 70 75 74 2e 20 20 49 66 20 74 68 69   output.  If thi
4fc0: 73 20 76 61 6c 75 65 20 69 73 20 22 50 45 33 32  s value is "PE32
4fd0: 22 20 6f 72 20 22 50 45 33 32 2b 22 2c 20 74 68  " or "PE32+", th
4fe0: 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  e..            #
4ff0: 20 20 20 20 20 20 20 61 73 73 65 6d 62 6c 79 20         assembly 
5000: 66 69 6c 65 20 69 73 20 33 32 2d 62 69 74 20 6f  file is 32-bit o
5010: 72 20 36 34 2d 62 69 74 2c 20 72 65 73 70 65 63  r 64-bit, respec
5020: 74 69 76 65 6c 79 3b 0d 0a 20 20 20 20 20 20 20  tively;..       
5030: 20 20 20 20 20 23 20 20 20 20 20 20 20 6f 74 68       #       oth
5040: 65 72 77 69 73 65 2c 20 69 74 73 20 74 79 70 65  erwise, its type
5050: 20 69 73 20 75 6e 6b 6e 6f 77 6e 2e 0d 0a 20 20   is unknown...  
5060: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
5070: 20 20 20 20 20 20 20 20 20 73 65 74 20 70 61 74           set pat
5080: 74 65 72 6e 20 7b 5e 50 45 20 20 20 20 20 20 20  tern {^PE       
5090: 20 3a 20 28 50 45 33 32 7c 50 45 33 32 5c 2b 29   : (PE32|PE32\+)
50a0: 5c 73 2b 24 7d 0d 0a 0d 0a 20 20 20 20 20 20 20  \s+$}....       
50b0: 20 20 20 20 20 69 66 20 7b 5b 72 65 67 65 78 70       if {[regexp
50c0: 20 2d 6c 69 6e 65 20 2d 2d 20 24 70 61 74 74 65   -line -- $patte
50d0: 72 6e 20 24 65 78 65 63 20 64 75 6d 6d 79 20 70  rn $exec dummy p
50e0: 65 33 32 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  e32]} then {..  
50f0: 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
5100: 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 48               # H
5110: 41 43 4b 3a 20 54 68 69 73 20 5b 73 77 69 74 63  ACK: This [switc
5120: 68 5d 20 61 73 73 75 6d 65 73 20 74 68 61 74 20  h] assumes that 
5130: 33 32 2d 62 69 74 20 65 78 65 63 75 74 61 62 6c  32-bit executabl
5140: 65 73 20 61 72 65 0d 0a 20 20 20 20 20 20 20 20  es are..        
5150: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61 6c        #       al
5160: 77 61 79 73 20 78 38 36 20 61 6e 64 20 74 68 61  ways x86 and tha
5170: 74 20 36 34 2d 62 69 74 20 65 78 65 63 75 74 61  t 64-bit executa
5180: 62 6c 65 73 20 61 72 65 20 61 6c 77 61 79 73 0d  bles are always.
5190: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
51a0: 20 20 20 20 20 20 20 78 36 34 2e 0d 0a 20 20 20         x64...   
51b0: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
51c0: 20 20 20 20 20 20 20 20 20 20 20 20 73 77 69 74              swit
51d0: 63 68 20 2d 65 78 61 63 74 20 2d 2d 20 24 70 65  ch -exact -- $pe
51e0: 33 32 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  32 {..          
51f0: 20 20 20 20 20 20 50 45 33 32 20 7b 0d 0a 20 20        PE32 {..  
5200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5210: 73 65 74 20 70 6c 61 74 66 6f 72 6d 20 57 69 6e  set platform Win
5220: 33 32 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  32..            
5230: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
5240: 20 20 20 20 20 20 20 50 45 33 32 2b 20 7b 0d 0a         PE32+ {..
5250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5260: 20 20 73 65 74 20 70 6c 61 74 66 6f 72 6d 20 78    set platform x
5270: 36 34 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  64..            
5280: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
5290: 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 20 7b         default {
52a0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
52b0: 20 20 20 20 73 65 74 20 70 6c 61 74 66 6f 72 6d      set platform
52c0: 20 22 22 0d 0a 20 20 20 20 20 20 20 20 20 20 20   ""..           
52d0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
52e0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
52f0: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
5300: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74               set
5310: 20 70 6c 61 74 66 6f 72 6d 20 22 22 0d 0a 20 20   platform ""..  
5320: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
5330: 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
5340: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
5350: 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d     # NOTE: Attem
5360: 70 74 20 74 6f 20 65 78 74 72 61 63 74 20 74 68  pt to extract th
5370: 65 20 49 4c 4f 4e 4c 59 20 6c 69 6e 65 20 66 72  e ILONLY line fr
5380: 6f 6d 20 74 68 65 20 63 61 70 74 75 72 65 64 0d  om the captured.
5390: 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20  .          #    
53a0: 20 20 20 6f 75 74 70 75 74 2e 20 20 49 66 20 74     output.  If t
53b0: 68 69 73 20 76 61 6c 75 65 20 69 73 20 7a 65 72  his value is zer
53c0: 6f 2c 20 74 68 65 20 73 70 65 63 69 66 69 65 64  o, the specified
53d0: 20 66 69 6c 65 20 6d 75 73 74 0d 0a 20 20 20 20   file must..    
53e0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62 65        #       be
53f0: 20 61 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73   a mixed-mode as
5400: 73 65 6d 62 6c 79 3b 20 6f 74 68 65 72 77 69 73  sembly; otherwis
5410: 65 2c 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 6f  e, it contains o
5420: 6e 6c 79 0d 0a 20 20 20 20 20 20 20 20 20 20 23  nly..          #
5430: 20 20 20 20 20 20 20 6d 61 6e 61 67 65 64 20 63         managed c
5440: 6f 6d 70 6f 6e 65 6e 74 73 2e 0d 0a 20 20 20 20  omponents...    
5450: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
5460: 20 20 20 73 65 74 20 70 61 74 74 65 72 6e 20 7b     set pattern {
5470: 5e 49 4c 4f 4e 4c 59 20 20 20 20 3a 20 28 30 7c  ^ILONLY    : (0|
5480: 31 29 5c 73 2b 24 7d 0d 0a 0d 0a 20 20 20 20 20  1)\s+$}....     
5490: 20 20 20 20 20 69 66 20 7b 21 5b 72 65 67 65 78       if {![regex
54a0: 70 20 2d 6c 69 6e 65 20 2d 2d 20 24 70 61 74 74  p -line -- $patt
54b0: 65 72 6e 20 24 65 78 65 63 20 64 75 6d 6d 79 20  ern $exec dummy 
54c0: 69 6c 4f 6e 6c 79 5d 7d 20 74 68 65 6e 20 7b 0d  ilOnly]} then {.
54d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
54e0: 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20 20  urn false..     
54f0: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
5500: 20 20 20 20 69 66 20 7b 21 24 69 6c 4f 6e 6c 79      if {!$ilOnly
5510: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
5520: 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75        return tru
5530: 65 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  e..          }..
5540: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
5550: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   }....      #.. 
5560: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20       # NOTE: If 
5570: 74 68 65 20 74 65 73 74 20 73 75 69 74 65 20 63  the test suite c
5580: 61 6e 6e 6f 74 20 75 73 65 20 5b 65 78 65 63 5d  annot use [exec]
5590: 20 6f 72 20 65 78 65 63 75 74 69 6f 6e 20 6f 66   or execution of
55a0: 20 43 6f 72 46 6c 61 67 73 0d 0a 20 20 20 20 20   CorFlags..     
55b0: 20 23 20 20 20 20 20 20 20 66 61 69 6c 65 64 2c   #       failed,
55c0: 20 72 65 74 75 72 6e 20 66 61 6c 73 65 2e 0d 0a   return false...
55d0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72        #..      r
55e0: 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20  eturn false..   
55f0: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
5600: 69 73 44 61 72 77 69 6e 20 7b 7d 20 7b 0d 0a 20  isDarwin {} {.. 
5610: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 65 78 70       return [exp
5620: 72 20 7b 0d 0a 20 20 20 20 20 20 20 20 5b 69 6e  r {..        [in
5630: 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 63 6c 5f  fo exists ::tcl_
5640: 70 6c 61 74 66 6f 72 6d 28 6f 73 29 5d 20 26 26  platform(os)] &&
5650: 20 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d   $::tcl_platform
5660: 28 6f 73 29 20 65 71 20 22 44 61 72 77 69 6e 22  (os) eq "Darwin"
5670: 0d 0a 20 20 20 20 20 20 7d 5d 0d 0a 20 20 20 20  ..      }]..    
5680: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67  }.....    proc g
5690: 65 74 4e 61 74 69 76 65 4c 69 62 72 61 72 79 46  etNativeLibraryF
56a0: 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79 20 7b 7d 20  ileNamesOnly {} 
56b0: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
56c0: 20 20 23 20 4e 4f 54 45 3a 20 46 69 72 73 74 2c    # NOTE: First,
56d0: 20 63 68 65 63 6b 20 69 66 20 74 68 65 20 6c 69   check if the li
56e0: 73 74 20 6f 66 20 6e 61 74 69 76 65 20 6c 69 62  st of native lib
56f0: 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 73 20  rary file names 
5700: 68 61 73 20 62 65 65 6e 0d 0a 20 20 20 20 20 20  has been..      
5710: 23 20 20 20 20 20 20 20 6d 61 6e 75 61 6c 6c 79  #       manually
5720: 20 6f 76 65 72 72 69 64 64 65 6e 2e 0d 0a 20 20   overridden...  
5730: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
5740: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
5750: 6e 61 74 69 76 65 5f 6c 69 62 72 61 72 79 5f 66  native_library_f
5760: 69 6c 65 5f 6e 61 6d 65 73 5d 20 26 26 20 5c 0d  ile_names] && \.
5770: 0a 20 20 20 20 20 20 20 20 20 20 5b 6c 6c 65 6e  .          [llen
5780: 67 74 68 20 24 3a 3a 6e 61 74 69 76 65 5f 6c 69  gth $::native_li
5790: 62 72 61 72 79 5f 66 69 6c 65 5f 6e 61 6d 65 73  brary_file_names
57a0: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
57b0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
57c0: 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c 69    # NOTE: The li
57d0: 73 74 20 6f 66 20 6e 61 74 69 76 65 20 6c 69 62  st of native lib
57e0: 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 73 20  rary file names 
57f0: 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72 69 64  has been overrid
5800: 64 65 6e 3b 0d 0a 20 20 20 20 20 20 20 20 23 20  den;..        # 
5810: 20 20 20 20 20 20 74 68 65 72 65 66 6f 72 65 2c        therefore,
5820: 20 75 73 65 20 69 74 20 76 65 72 62 61 74 69 6d   use it verbatim
5830: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
5840: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a        return $::
5850: 6e 61 74 69 76 65 5f 6c 69 62 72 61 72 79 5f 66  native_library_f
5860: 69 6c 65 5f 6e 61 6d 65 73 0d 0a 20 20 20 20 20  ile_names..     
5870: 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69 73 57 69   } elseif {[isWi
5880: 6e 64 6f 77 73 5d 7d 20 74 68 65 6e 20 7b 0d 0a  ndows]} then {..
5890: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
58a0: 20 20 20 23 20 4e 4f 54 45 3a 20 4f 74 68 65 72     # NOTE: Other
58b0: 77 69 73 65 2c 20 6f 6e 20 57 69 6e 33 32 2c 20  wise, on Win32, 
58c0: 61 6c 77 61 79 73 20 75 73 65 20 74 68 65 20 73  always use the s
58d0: 74 61 6e 64 61 72 64 20 6e 61 74 69 76 65 20 6c  tandard native l
58e0: 69 62 72 61 72 79 0d 0a 20 20 20 20 20 20 20 20  ibrary..        
58f0: 23 20 20 20 20 20 20 20 66 69 6c 65 20 6e 61 6d  #       file nam
5900: 65 20 22 73 71 6c 69 74 65 33 2e 64 6c 6c 22 2e  e "sqlite3.dll".
5910: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
5920: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6c 69 73       return [lis
5930: 74 20 73 71 6c 69 74 65 33 2e 64 6c 6c 5d 0d 0a  t sqlite3.dll]..
5940: 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b        } elseif {
5950: 5b 69 73 44 6f 74 4e 65 74 43 6f 72 65 5d 7d 20  [isDotNetCore]} 
5960: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
5970: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  #..        #    
5980: 20 20 20 57 68 65 6e 20 72 75 6e 6e 69 6e 67 20     When running 
5990: 6f 6e 20 2e 4e 45 54 20 43 6f 72 65 2c 20 72 65  on .NET Core, re
59a0: 74 75 72 6e 20 74 68 65 20 73 61 6d 65 20 6e 61  turn the same na
59b0: 74 69 76 65 20 6c 69 62 72 61 72 79 0d 0a 20 20  tive library..  
59c0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 66 69        #       fi
59d0: 6c 65 20 6e 61 6d 65 20 74 68 61 74 20 69 73 20  le name that is 
59e0: 75 73 65 64 20 6f 6e 20 57 69 6e 64 6f 77 73 20  used on Windows 
59f0: 28 69 2e 65 2e 20 6f 74 68 65 72 77 69 73 65 2c  (i.e. otherwise,
5a00: 20 61 73 73 75 6d 65 0d 0a 20 20 20 20 20 20 20   assume..       
5a10: 20 23 20 20 20 20 20 20 20 77 65 20 61 72 65 20   #       we are 
5a20: 72 75 6e 6e 69 6e 67 20 6f 6e 20 4d 6f 6e 6f 20  running on Mono 
5a30: 61 6e 64 20 75 73 65 20 69 74 73 20 50 2f 49 6e  and use its P/In
5a40: 76 6f 6b 65 20 63 6f 6e 76 65 6e 74 69 6f 6e 73  voke conventions
5a50: 29 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  )...        #.. 
5a60: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6c         return [l
5a70: 69 73 74 20 73 71 6c 69 74 65 33 2e 64 6c 6c 5d  ist sqlite3.dll]
5a80: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66  ..      } elseif
5a90: 20 7b 5b 69 73 44 61 72 77 69 6e 5d 7d 20 74 68   {[isDarwin]} th
5aa0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
5ab0: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
5ac0: 20 57 68 65 6e 20 72 75 6e 6e 69 6e 67 20 6f 6e   When running on
5ad0: 20 44 61 72 77 69 6e 20 28 69 2e 65 2e 20 74 68   Darwin (i.e. th
5ae0: 65 20 6b 65 72 6e 65 6c 20 6f 66 20 69 4f 53 20  e kernel of iOS 
5af0: 2f 20 4d 61 63 20 4f 53 20 58 29 2c 0d 0a 20 20  / Mac OS X),..  
5b00: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 72 65        #       re
5b10: 74 75 72 6e 20 74 68 65 20 4d 61 63 20 4f 53 20  turn the Mac OS 
5b20: 58 20 6e 61 74 69 76 65 20 6c 69 62 72 61 72 79  X native library
5b30: 20 66 69 6c 65 20 6e 61 6d 65 2e 20 20 54 68 69   file name.  Thi
5b40: 73 20 66 69 6c 65 0d 0a 20 20 20 20 20 20 20 20  s file..        
5b50: 23 20 20 20 20 20 20 20 6e 61 6d 65 20 69 73 20  #       name is 
5b60: 6e 6f 72 6d 61 6c 6c 79 20 72 65 71 75 69 72 65  normally require
5b70: 64 20 66 6f 72 20 4d 6f 6e 6f 2e 0d 0a 20 20 20  d for Mono...   
5b80: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
5b90: 72 65 74 75 72 6e 20 5b 6c 69 73 74 20 6c 69 62  return [list lib
5ba0: 73 71 6c 69 74 65 33 2e 64 79 6c 69 62 5d 0d 0a  sqlite3.dylib]..
5bb0: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
5bc0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
5bd0: 20 20 20 23 20 4e 4f 54 45 3a 20 4f 74 68 65 72     # NOTE: Other
5be0: 77 69 73 65 2c 20 72 65 74 75 72 6e 20 74 68 65  wise, return the
5bf0: 20 67 65 6e 65 72 69 63 20 50 4f 53 49 58 20 6e   generic POSIX n
5c00: 61 74 69 76 65 20 6c 69 62 72 61 72 79 20 66 69  ative library fi
5c10: 6c 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  le..        #   
5c20: 20 20 20 20 6e 61 6d 65 2e 20 20 54 68 69 73 20      name.  This 
5c30: 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 6e 6f 72  file name is nor
5c40: 6d 61 6c 6c 79 20 72 65 71 75 69 72 65 64 20 66  mally required f
5c50: 6f 72 20 4d 6f 6e 6f 2e 0d 0a 20 20 20 20 20 20  or Mono...      
5c60: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
5c70: 75 72 6e 20 5b 6c 69 73 74 20 6c 69 62 73 71 6c  urn [list libsql
5c80: 69 74 65 33 2e 73 6f 5d 0d 0a 20 20 20 20 20 20  ite3.so]..      
5c90: 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
5ca0: 20 70 72 6f 63 20 67 65 74 49 6e 74 65 72 6f 70   proc getInterop
5cb0: 41 73 73 65 6d 62 6c 79 46 69 6c 65 4e 61 6d 65  AssemblyFileName
5cc0: 73 4f 6e 6c 79 20 7b 7d 20 7b 0d 0a 20 20 20 20  sOnly {} {..    
5cd0: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
5ce0: 45 3a 20 46 69 72 73 74 2c 20 63 68 65 63 6b 20  E: First, check 
5cf0: 69 66 20 74 68 65 20 6c 69 73 74 20 6f 66 20 69  if the list of i
5d00: 6e 74 65 72 6f 70 20 61 73 73 65 6d 62 6c 79 20  nterop assembly 
5d10: 66 69 6c 65 20 6e 61 6d 65 73 20 68 61 73 20 62  file names has b
5d20: 65 65 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20  een..      #    
5d30: 20 20 20 6d 61 6e 75 61 6c 6c 79 20 6f 76 65 72     manually over
5d40: 72 69 64 64 65 6e 2e 0d 0a 20 20 20 20 20 20 23  ridden...      #
5d50: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66  ..      if {[inf
5d60: 6f 20 65 78 69 73 74 73 20 3a 3a 69 6e 74 65 72  o exists ::inter
5d70: 6f 70 5f 61 73 73 65 6d 62 6c 79 5f 66 69 6c 65  op_assembly_file
5d80: 5f 6e 61 6d 65 73 5d 20 26 26 20 5c 0d 0a 20 20  _names] && \..  
5d90: 20 20 20 20 20 20 20 20 5b 6c 6c 65 6e 67 74 68          [llength
5da0: 20 24 3a 3a 69 6e 74 65 72 6f 70 5f 61 73 73 65   $::interop_asse
5db0: 6d 62 6c 79 5f 66 69 6c 65 5f 6e 61 6d 65 73 5d  mbly_file_names]
5dc0: 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
5dd0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
5de0: 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c 69 73   # NOTE: The lis
5df0: 74 20 6f 66 20 69 6e 74 65 72 6f 70 20 61 73 73  t of interop ass
5e00: 65 6d 62 6c 79 20 66 69 6c 65 20 6e 61 6d 65 73  embly file names
5e10: 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72 69   has been overri
5e20: 64 64 65 6e 3b 0d 0a 20 20 20 20 20 20 20 20 23  dden;..        #
5e30: 20 20 20 20 20 20 20 74 68 65 72 65 66 6f 72 65         therefore
5e40: 2c 20 75 73 65 20 69 74 20 76 65 72 62 61 74 69  , use it verbati
5e50: 6d 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  m...        #.. 
5e60: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a         return $:
5e70: 3a 69 6e 74 65 72 6f 70 5f 61 73 73 65 6d 62 6c  :interop_assembl
5e80: 79 5f 66 69 6c 65 5f 6e 61 6d 65 73 0d 0a 20 20  y_file_names..  
5e90: 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69      } elseif {[i
5ea0: 73 57 69 6e 64 6f 77 73 5d 7d 20 74 68 65 6e 20  sWindows]} then 
5eb0: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
5ec0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4f 74        # NOTE: Ot
5ed0: 68 65 72 77 69 73 65 2c 20 6f 6e 20 57 69 6e 33  herwise, on Win3
5ee0: 32 2c 20 61 6c 77 61 79 73 20 75 73 65 20 74 68  2, always use th
5ef0: 65 20 69 6e 74 65 72 6f 70 20 61 73 73 65 6d 62  e interop assemb
5f00: 6c 79 20 66 69 6c 65 0d 0a 20 20 20 20 20 20 20  ly file..       
5f10: 20 23 20 20 20 20 20 20 20 6e 61 6d 65 20 22 53   #       name "S
5f20: 51 4c 69 74 65 2e 49 6e 74 65 72 6f 70 2e 64 6c  QLite.Interop.dl
5f30: 6c 22 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  l"...        #..
5f40: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b          return [
5f50: 6c 69 73 74 20 53 51 4c 69 74 65 2e 49 6e 74 65  list SQLite.Inte
5f60: 72 6f 70 2e 64 6c 6c 5d 0d 0a 20 20 20 20 20 20  rop.dll]..      
5f70: 7d 20 65 6c 73 65 69 66 20 7b 5b 69 73 44 6f 74  } elseif {[isDot
5f80: 4e 65 74 43 6f 72 65 5d 7d 20 74 68 65 6e 20 7b  NetCore]} then {
5f90: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
5fa0: 20 20 20 20 20 23 20 20 20 20 20 20 20 57 68 65       #       Whe
5fb0: 6e 20 72 75 6e 6e 69 6e 67 20 6f 6e 20 2e 4e 45  n running on .NE
5fc0: 54 20 43 6f 72 65 2c 20 72 65 74 75 72 6e 20 74  T Core, return t
5fd0: 68 65 20 73 61 6d 65 20 69 6e 74 65 72 70 20 61  he same interp a
5fe0: 73 73 65 6d 62 6c 79 0d 0a 20 20 20 20 20 20 20  ssembly..       
5ff0: 20 23 20 20 20 20 20 20 20 66 69 6c 65 20 6e 61   #       file na
6000: 6d 65 20 74 68 61 74 20 69 73 20 75 73 65 64 20  me that is used 
6010: 6f 6e 20 57 69 6e 64 6f 77 73 20 28 69 2e 65 2e  on Windows (i.e.
6020: 20 6f 74 68 65 72 77 69 73 65 2c 20 61 73 73 75   otherwise, assu
6030: 6d 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  me..        #   
6040: 20 20 20 20 77 65 20 61 72 65 20 72 75 6e 6e 69      we are runni
6050: 6e 67 20 6f 6e 20 4d 6f 6e 6f 20 61 6e 64 20 75  ng on Mono and u
6060: 73 65 20 69 74 73 20 50 2f 49 6e 76 6f 6b 65 20  se its P/Invoke 
6070: 63 6f 6e 76 65 6e 74 69 6f 6e 73 29 2e 0d 0a 20  conventions)... 
6080: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
6090: 20 20 72 65 74 75 72 6e 20 5b 6c 69 73 74 20 53    return [list S
60a0: 51 4c 69 74 65 2e 49 6e 74 65 72 6f 70 2e 64 6c  QLite.Interop.dl
60b0: 6c 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  l]..      } else
60c0: 69 66 20 7b 5b 69 73 44 61 72 77 69 6e 5d 7d 20  if {[isDarwin]} 
60d0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
60e0: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
60f0: 45 3a 20 57 68 65 6e 20 72 75 6e 6e 69 6e 67 20  E: When running 
6100: 6f 6e 20 44 61 72 77 69 6e 20 28 69 2e 65 2e 20  on Darwin (i.e. 
6110: 74 68 65 20 6b 65 72 6e 65 6c 20 6f 66 20 69 4f  the kernel of iO
6120: 53 20 2f 20 4d 61 63 20 4f 53 20 58 29 2c 0d 0a  S / Mac OS X),..
6130: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
6140: 72 65 74 75 72 6e 20 74 68 65 20 4d 61 63 20 4f  return the Mac O
6150: 53 20 58 20 69 6e 74 65 72 70 20 61 73 73 65 6d  S X interp assem
6160: 62 6c 79 20 66 69 6c 65 20 6e 61 6d 65 2e 20 20  bly file name.  
6170: 54 68 69 73 20 66 69 6c 65 0d 0a 20 20 20 20 20  This file..     
6180: 20 20 20 23 20 20 20 20 20 20 20 6e 61 6d 65 20     #       name 
6190: 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 72 65 71 75  is normally requ
61a0: 69 72 65 64 20 66 6f 72 20 4d 6f 6e 6f 2e 0d 0a  ired for Mono...
61b0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
61c0: 20 20 20 72 65 74 75 72 6e 20 5b 6c 69 73 74 20     return [list 
61d0: 6c 69 62 53 51 4c 69 74 65 2e 49 6e 74 65 72 6f  libSQLite.Intero
61e0: 70 2e 64 79 6c 69 62 5d 0d 0a 20 20 20 20 20 20  p.dylib]..      
61f0: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
6200: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
6210: 4f 54 45 3a 20 4f 74 68 65 72 77 69 73 65 2c 20  OTE: Otherwise, 
6220: 72 65 74 75 72 6e 20 74 68 65 20 67 65 6e 65 72  return the gener
6230: 69 63 20 50 4f 53 49 58 20 69 6e 74 65 72 70 20  ic POSIX interp 
6240: 61 73 73 65 6d 62 6c 79 20 66 69 6c 65 0d 0a 20  assembly file.. 
6250: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6e         #       n
6260: 61 6d 65 2e 20 20 54 68 69 73 20 66 69 6c 65 20  ame.  This file 
6270: 6e 61 6d 65 20 69 73 20 6e 6f 72 6d 61 6c 6c 79  name is normally
6280: 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 4d 6f   required for Mo
6290: 6e 6f 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  no...        #..
62a0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b          return [
62b0: 6c 69 73 74 20 6c 69 62 53 51 4c 69 74 65 2e 49  list libSQLite.I
62c0: 6e 74 65 72 6f 70 2e 73 6f 5d 0d 0a 20 20 20 20  nterop.so]..    
62d0: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
62e0: 20 20 20 70 72 6f 63 20 67 65 74 43 6f 72 65 45     proc getCoreE
62f0: 78 74 65 6e 73 69 6f 6e 42 69 6e 61 72 79 46 69  xtensionBinaryFi
6300: 6c 65 4e 61 6d 65 20 7b 20 7b 64 65 66 61 75 6c  leName { {defaul
6310: 74 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  t ""} } {..     
6320: 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 67   set fileName [g
6330: 65 74 43 6f 72 65 42 69 6e 61 72 79 46 69 6c 65  etCoreBinaryFile
6340: 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 69  Name]....      i
6350: 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20  f {[file exists 
6360: 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e  $fileName]} then
6370: 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   {..        retu
6380: 72 6e 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20  rn $fileName..  
6390: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72      }....      r
63a0: 65 74 75 72 6e 20 24 64 65 66 61 75 6c 74 0d 0a  eturn $default..
63b0: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
63c0: 6f 63 20 69 73 42 75 69 6c 64 41 76 61 69 6c 61  oc isBuildAvaila
63d0: 62 6c 65 20 7b 20 6e 61 74 69 76 65 20 64 69 72  ble { native dir
63e0: 65 63 74 6f 72 79 20 7b 76 61 72 4e 61 6d 65 20  ectory {varName 
63f0: 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23  ""} } {..      #
6400: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
6410: 42 75 69 6c 64 20 74 68 65 20 66 75 6c 6c 79 20  Build the fully 
6420: 71 75 61 6c 69 66 69 65 64 20 66 69 6c 65 20 6e  qualified file n
6430: 61 6d 65 20 66 6f 72 20 74 68 65 20 70 72 69 6d  ame for the prim
6440: 61 72 79 20 61 73 73 65 6d 62 6c 79 0d 0a 20 20  ary assembly..  
6450: 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e 74      #       cont
6460: 61 69 6e 69 6e 67 20 74 68 65 20 53 79 73 74 65  aining the Syste
6470: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 6d 61  m.Data.SQLite ma
6480: 6e 61 67 65 64 20 63 6f 6d 70 6f 6e 65 6e 74 73  naged components
6490: 2e 20 20 49 74 0d 0a 20 20 20 20 20 20 23 20 20  .  It..      #  
64a0: 20 20 20 20 20 73 68 6f 75 6c 64 20 62 65 20 6e       should be n
64b0: 6f 74 65 64 20 74 68 61 74 20 74 68 69 73 20 61  oted that this a
64c0: 73 73 65 6d 62 6c 79 20 66 69 6c 65 20 6d 61 79  ssembly file may
64d0: 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 20 74 68   also contain th
64e0: 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
64f0: 20 6e 61 74 69 76 65 20 63 6f 6d 70 6f 6e 65 6e   native componen
6500: 74 73 2c 20 69 66 20 61 20 6e 61 74 69 76 65 20  ts, if a native 
6510: 62 75 69 6c 64 20 69 73 20 69 6e 20 75 73 65 2e  build is in use.
6520: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
6530: 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66   set fileName [f
6540: 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b  ile nativename [
6550: 66 69 6c 65 20 6a 6f 69 6e 20 24 64 69 72 65 63  file join $direc
6560: 74 6f 72 79 20 5c 0d 0a 20 20 20 20 20 20 20 20  tory \..        
6570: 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51    System.Data.SQ
6580: 4c 69 74 65 2e 64 6c 6c 5d 5d 0d 0a 0d 0a 20 20  Lite.dll]]....  
6590: 20 20 20 20 69 66 20 7b 21 5b 66 69 6c 65 20 65      if {![file e
65a0: 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d  xists $fileName]
65b0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
65c0: 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a    return false..
65d0: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
65e0: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
65f0: 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 61 75 74  : Attempt to aut
6600: 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 74 65 63  omatically detec
6610: 74 20 69 66 20 74 68 65 20 70 72 69 6d 61 72 79  t if the primary
6620: 20 61 73 73 65 6d 62 6c 79 0d 0a 20 20 20 20 20   assembly..     
6630: 20 23 20 20 20 20 20 20 20 63 6f 6e 74 61 69 6e   #       contain
6640: 73 20 61 6e 79 20 6e 61 74 69 76 65 20 63 6f 6d  s any native com
6650: 70 6f 6e 65 6e 74 73 2c 20 69 66 20 6e 65 63 65  ponents, if nece
6660: 73 73 61 72 79 2e 0d 0a 20 20 20 20 20 20 23 0d  ssary...      #.
6670: 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69  .      if {[stri
6680: 6e 67 20 6c 65 6e 67 74 68 20 24 6e 61 74 69 76  ng length $nativ
6690: 65 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  e] == 0} then {.
66a0: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74  .        if {[st
66b0: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 61 72  ring length $var
66c0: 4e 61 6d 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20  Name] > 0} then 
66d0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 75 70 76  {..          upv
66e0: 61 72 20 31 20 24 76 61 72 4e 61 6d 65 20 24 76  ar 1 $varName $v
66f0: 61 72 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20  arName..        
6700: 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74  }....        set
6710: 20 6e 61 74 69 76 65 20 5b 69 73 4d 69 78 65 64   native [isMixed
6720: 4d 6f 64 65 41 73 73 65 6d 62 6c 79 20 24 66 69  ModeAssembly $fi
6730: 6c 65 4e 61 6d 65 20 24 76 61 72 4e 61 6d 65 5d  leName $varName]
6740: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
6750: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
6760: 54 45 3a 20 49 66 20 74 68 65 20 70 72 69 6d 61  TE: If the prima
6770: 72 79 20 61 73 73 65 6d 62 6c 79 20 61 6c 73 6f  ry assembly also
6780: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 61   contains the na
6790: 74 69 76 65 20 63 6f 6d 70 6f 6e 65 6e 74 73 2c  tive components,
67a0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
67b0: 77 65 20 68 61 76 65 20 65 76 65 72 79 74 68 69  we have everythi
67c0: 6e 67 20 77 65 20 6e 65 65 64 2e 0d 0a 20 20 20  ng we need...   
67d0: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
67e0: 24 6e 61 74 69 76 65 7d 20 74 68 65 6e 20 7b 0d  $native} then {.
67f0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
6800: 74 72 75 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  true..      }...
6810: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
6820: 23 20 4e 4f 54 45 3a 20 49 66 20 74 68 65 20 6d  # NOTE: If the m
6830: 61 63 68 69 6e 65 20 6e 61 6d 65 20 69 73 20 75  achine name is u
6840: 6e 61 76 61 69 6c 61 62 6c 65 2c 20 74 68 65 72  navailable, ther
6850: 65 20 69 73 20 6e 6f 74 68 69 6e 67 20 65 6c 73  e is nothing els
6860: 65 20 77 65 0d 0a 20 20 20 20 20 20 23 20 20 20  e we..      #   
6870: 20 20 20 20 63 61 6e 20 64 6f 2e 0d 0a 20 20 20      can do...   
6880: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
6890: 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
68a0: 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 6d 61 63  tcl_platform(mac
68b0: 68 69 6e 65 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  hine)]} then {..
68c0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 66          return f
68d0: 61 6c 73 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  alse..      }...
68e0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
68f0: 23 20 4e 4f 54 45 3a 20 57 68 61 74 20 69 73 20  # NOTE: What is 
6900: 74 68 65 20 61 72 63 68 69 74 65 63 74 75 72 65  the architecture
6910: 20 66 6f 72 20 74 68 69 73 20 6d 61 63 68 69 6e   for this machin
6920: 65 3f 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  e?..      #..   
6930: 20 20 20 73 65 74 20 61 72 63 68 69 74 65 63 74     set architect
6940: 75 72 65 20 5b 6d 61 63 68 69 6e 65 54 6f 50 6c  ure [machineToPl
6950: 61 74 66 6f 72 6d 20 24 3a 3a 74 63 6c 5f 70 6c  atform $::tcl_pl
6960: 61 74 66 6f 72 6d 28 6d 61 63 68 69 6e 65 29 20  atform(machine) 
6970: 74 72 75 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 23  true]....      #
6980: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
6990: 57 68 61 74 20 69 73 20 74 68 65 20 70 6c 61 74  What is the plat
69a0: 66 6f 72 6d 20 66 6f 72 20 74 68 69 73 20 6d 61  form for this ma
69b0: 63 68 69 6e 65 3f 0d 0a 20 20 20 20 20 20 23 0d  chine?..      #.
69c0: 0a 20 20 20 20 20 20 73 65 74 20 70 6c 61 74 66  .      set platf
69d0: 6f 72 6d 20 5b 6d 61 63 68 69 6e 65 54 6f 50 6c  orm [machineToPl
69e0: 61 74 66 6f 72 6d 20 24 3a 3a 74 63 6c 5f 70 6c  atform $::tcl_pl
69f0: 61 74 66 6f 72 6d 28 6d 61 63 68 69 6e 65 29 5d  atform(machine)]
6a00: 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
6a10: 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64     # NOTE: Build
6a20: 20 74 68 65 20 66 75 6c 6c 79 20 71 75 61 6c 69   the fully quali
6a30: 66 69 65 64 20 66 69 6c 65 20 6e 61 6d 65 20 66  fied file name f
6a40: 6f 72 20 74 68 65 20 69 6e 74 65 72 6f 70 20 61  or the interop a
6a50: 73 73 65 6d 62 6c 79 0d 0a 20 20 20 20 20 20 23  ssembly..      #
6a60: 20 20 20 20 20 20 20 63 6f 6e 74 61 69 6e 69 6e         containin
6a70: 67 20 74 68 65 20 53 79 73 74 65 6d 2e 44 61 74  g the System.Dat
6a80: 61 2e 53 51 4c 69 74 65 20 6e 61 74 69 76 65 20  a.SQLite native 
6a90: 63 6f 6d 70 6f 6e 65 6e 74 73 2e 20 20 49 66 20  components.  If 
6aa0: 74 68 69 73 0d 0a 20 20 20 20 20 20 23 20 20 20  this..      #   
6ab0: 20 20 20 20 66 69 6c 65 20 65 78 69 73 74 73 2c      file exists,
6ac0: 20 77 65 20 73 68 6f 75 6c 64 20 68 61 76 65 20   we should have 
6ad0: 65 76 65 72 79 74 68 69 6e 67 20 77 65 20 6e 65  everything we ne
6ae0: 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ed...      #..  
6af0: 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65      foreach file
6b00: 4e 61 6d 65 4f 6e 6c 79 20 5b 67 65 74 49 6e 74  NameOnly [getInt
6b10: 65 72 6f 70 41 73 73 65 6d 62 6c 79 46 69 6c 65  eropAssemblyFile
6b20: 4e 61 6d 65 73 4f 6e 6c 79 5d 20 7b 0d 0a 20 20  NamesOnly] {..  
6b30: 20 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61        set fileNa
6b40: 6d 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e  me [file nativen
6b50: 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24  ame [file join $
6b60: 64 69 72 65 63 74 6f 72 79 20 5c 0d 0a 20 20 20  directory \..   
6b70: 20 20 20 20 20 20 20 20 20 24 61 72 63 68 69 74           $archit
6b80: 65 63 74 75 72 65 20 24 66 69 6c 65 4e 61 6d 65  ecture $fileName
6b90: 4f 6e 6c 79 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20  Only]]....      
6ba0: 20 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73    if {[file exis
6bb0: 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74  ts $fileName]} t
6bc0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
6bd0: 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20   return true..  
6be0: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
6bf0: 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 20     set fileName 
6c00: 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65  [file nativename
6c10: 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 64 69 72   [file join $dir
6c20: 65 63 74 6f 72 79 20 5c 0d 0a 20 20 20 20 20 20  ectory \..      
6c30: 20 20 20 20 20 20 24 70 6c 61 74 66 6f 72 6d 20        $platform 
6c40: 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 5d 5d 0d  $fileNameOnly]].
6c50: 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  ...        if {[
6c60: 66 69 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c  file exists $fil
6c70: 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a  eName]} then {..
6c80: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
6c90: 20 74 72 75 65 0d 0a 20 20 20 20 20 20 20 20 7d   true..        }
6ca0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20  ....        set 
6cb0: 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6e  fileName [file n
6cc0: 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20  ativename [file 
6cd0: 6a 6f 69 6e 20 24 64 69 72 65 63 74 6f 72 79 20  join $directory 
6ce0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 24  \..            $
6cf0: 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 5d 5d 0d 0a  fileNameOnly]]..
6d00: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 66  ..        if {[f
6d10: 69 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c 65  ile exists $file
6d20: 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  Name]} then {.. 
6d30: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
6d40: 74 72 75 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d  true..        }.
6d50: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
6d60: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
6d70: 45 3a 20 42 75 69 6c 64 20 74 68 65 20 66 75 6c  E: Build the ful
6d80: 6c 79 20 71 75 61 6c 69 66 69 65 64 20 66 69 6c  ly qualified fil
6d90: 65 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 53  e name for the S
6da0: 51 4c 69 74 65 20 63 6f 72 65 0d 0a 20 20 20 20  QLite core..    
6db0: 20 20 23 20 20 20 20 20 20 20 6c 69 62 72 61 72    #       librar
6dc0: 79 2e 20 20 49 66 20 74 68 69 73 20 66 69 6c 65  y.  If this file
6dd0: 20 65 78 69 73 74 73 2c 20 77 65 20 73 68 6f 75   exists, we shou
6de0: 6c 64 20 68 61 76 65 20 65 76 65 72 79 74 68 69  ld have everythi
6df0: 6e 67 20 77 65 0d 0a 20 20 20 20 20 20 23 20 20  ng we..      #  
6e00: 20 20 20 20 20 6e 65 65 64 2e 0d 0a 20 20 20 20       need...    
6e10: 20 20 23 0d 0a 20 20 20 20 20 20 66 6f 72 65 61    #..      forea
6e20: 63 68 20 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20  ch fileNameOnly 
6e30: 5b 67 65 74 4e 61 74 69 76 65 4c 69 62 72 61 72  [getNativeLibrar
6e40: 79 46 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79 5d 20  yFileNamesOnly] 
6e50: 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 66  {..        set f
6e60: 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6e 61  ileName [file na
6e70: 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a  tivename [file j
6e80: 6f 69 6e 20 24 64 69 72 65 63 74 6f 72 79 20 5c  oin $directory \
6e90: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 24 61  ..            $a
6ea0: 72 63 68 69 74 65 63 74 75 72 65 20 24 66 69 6c  rchitecture $fil
6eb0: 65 4e 61 6d 65 4f 6e 6c 79 5d 5d 0d 0a 0d 0a 20  eNameOnly]].... 
6ec0: 20 20 20 20 20 20 20 69 66 20 7b 5b 66 69 6c 65         if {[file
6ed0: 20 65 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d   exists $fileNam
6ee0: 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  e]} then {..    
6ef0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75        return tru
6f00: 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  e..        }....
6f10: 20 20 20 20 20 20 20 20 73 65 74 20 66 69 6c 65          set file
6f20: 4e 61 6d 65 20 5b 66 69 6c 65 20 6e 61 74 69 76  Name [file nativ
6f30: 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e  ename [file join
6f40: 20 24 64 69 72 65 63 74 6f 72 79 20 5c 0d 0a 20   $directory \.. 
6f50: 20 20 20 20 20 20 20 20 20 20 20 24 70 6c 61 74             $plat
6f60: 66 6f 72 6d 20 24 66 69 6c 65 4e 61 6d 65 4f 6e  form $fileNameOn
6f70: 6c 79 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ly]]....        
6f80: 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73  if {[file exists
6f90: 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65   $fileName]} the
6fa0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 72  n {..          r
6fb0: 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20  eturn true..    
6fc0: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
6fd0: 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66   set fileName [f
6fe0: 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b  ile nativename [
6ff0: 66 69 6c 65 20 6a 6f 69 6e 20 24 64 69 72 65 63  file join $direc
7000: 74 6f 72 79 20 5c 0d 0a 20 20 20 20 20 20 20 20  tory \..        
7010: 20 20 20 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c      $fileNameOnl
7020: 79 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69  y]]....        i
7030: 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20  f {[file exists 
7040: 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e  $fileName]} then
7050: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65   {..          re
7060: 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20  turn true..     
7070: 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d     }..      }...
7080: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
7090: 23 20 4e 4f 54 45 3a 20 4f 6e 65 20 6f 72 20 6d  # NOTE: One or m
70a0: 6f 72 65 20 6e 61 74 69 76 65 20 63 6f 6d 70 6f  ore native compo
70b0: 6e 65 6e 74 73 20 6e 65 65 64 65 64 20 62 79 20  nents needed by 
70c0: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
70d0: 74 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  te..      #     
70e0: 20 20 61 72 65 20 6d 69 73 73 69 6e 67 2e 0d 0a    are missing...
70f0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72        #..      r
7100: 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20  eturn false..   
7110: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
7120: 69 73 52 65 6c 65 61 73 65 41 76 61 69 6c 61 62  isReleaseAvailab
7130: 6c 65 20 7b 20 64 69 72 65 63 74 6f 72 79 20 7b  le { directory {
7140: 76 61 72 4e 61 6d 65 20 22 22 7d 20 7d 20 7b 0d  varName ""} } {.
7150: 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69  .      if {[stri
7160: 6e 67 20 6c 65 6e 67 74 68 20 24 76 61 72 4e 61  ng length $varNa
7170: 6d 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  me] > 0} then {.
7180: 0a 20 20 20 20 20 20 20 20 75 70 76 61 72 20 31  .        upvar 1
7190: 20 24 76 61 72 4e 61 6d 65 20 24 76 61 72 4e 61   $varName $varNa
71a0: 6d 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  me..      }.... 
71b0: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 69 73 42       return [isB
71c0: 75 69 6c 64 41 76 61 69 6c 61 62 6c 65 20 22 22  uildAvailable ""
71d0: 20 24 64 69 72 65 63 74 6f 72 79 20 24 76 61 72   $directory $var
71e0: 4e 61 6d 65 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d  Name]..    }....
71f0: 0a 20 20 20 20 70 72 6f 63 20 6a 6f 69 6e 42 75  .    proc joinBu
7200: 69 6c 64 44 69 72 65 63 74 6f 72 79 20 7b 20 6e  ildDirectory { n
7210: 61 74 69 76 65 20 70 61 74 68 20 79 65 61 72 20  ative path year 
7220: 70 6c 61 74 66 6f 72 6d 20 63 6f 6e 66 69 67 75  platform configu
7230: 72 61 74 69 6f 6e 20 65 78 74 72 61 20 7d 20 7b  ration extra } {
7240: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
7250: 20 23 20 4e 4f 54 45 3a 20 46 69 67 75 72 65 20   # NOTE: Figure 
7260: 6f 75 74 20 61 6e 64 20 74 68 65 6e 20 72 65 74  out and then ret
7270: 75 72 6e 20 74 68 65 20 66 75 6c 6c 79 20 71 75  urn the fully qu
7280: 61 6c 69 66 69 65 64 20 70 61 74 68 20 74 6f 20  alified path to 
7290: 74 68 65 20 62 75 69 6c 64 0d 0a 20 20 20 20 20  the build..     
72a0: 20 23 20 20 20 20 20 20 20 64 69 72 65 63 74 6f   #       directo
72b0: 72 79 20 62 61 73 65 64 20 6f 6e 20 61 6c 6c 20  ry based on all 
72c0: 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20 70 72  the arguments pr
72d0: 6f 76 69 64 65 64 20 62 79 20 6f 75 72 20 63 61  ovided by our ca
72e0: 6c 6c 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  ller...      #..
72f0: 20 20 20 20 20 20 69 66 20 7b 24 6e 61 74 69 76        if {$nativ
7300: 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  e} then {..     
7310: 20 20 20 72 65 74 75 72 6e 20 5b 66 69 6c 65 20     return [file 
7320: 6a 6f 69 6e 20 24 70 61 74 68 20 62 69 6e 20 24  join $path bin $
7330: 79 65 61 72 20 24 70 6c 61 74 66 6f 72 6d 20 24  year $platform $
7340: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 24 65  configuration $e
7350: 78 74 72 61 5d 0d 0a 20 20 20 20 20 20 7d 20 65  xtra]..      } e
7360: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 72  lse {..        r
7370: 65 74 75 72 6e 20 5b 66 69 6c 65 20 6a 6f 69 6e  eturn [file join
7380: 20 24 70 61 74 68 20 62 69 6e 20 24 79 65 61 72   $path bin $year
7390: 20 24 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20   $configuration 
73a0: 62 69 6e 20 24 65 78 74 72 61 5d 0d 0a 20 20 20  bin $extra]..   
73b0: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
73c0: 20 20 20 20 70 72 6f 63 20 67 65 74 42 75 69 6c      proc getBuil
73d0: 64 44 69 72 65 63 74 6f 72 79 20 7b 20 6d 61 6e  dDirectory { man
73e0: 61 67 65 64 4f 6e 6c 79 20 7d 20 7b 0d 0a 20 20  agedOnly } {..  
73f0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
7400: 4f 54 45 3a 20 53 65 65 20 69 66 20 74 68 65 20  OTE: See if the 
7410: 22 6e 61 74 69 76 65 22 20 72 75 6e 74 69 6d 65  "native" runtime
7420: 20 6f 70 74 69 6f 6e 20 68 61 73 20 62 65 65 6e   option has been
7430: 20 73 65 74 2e 20 20 49 66 20 73 6f 2c 20 75 73   set.  If so, us
7440: 65 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20  e the..      #  
7450: 20 20 20 20 20 64 69 72 65 63 74 6f 72 79 20 66       directory f
7460: 6f 72 20 74 68 65 20 6d 69 78 65 64 2d 6d 6f 64  or the mixed-mod
7470: 65 20 61 73 73 65 6d 62 6c 79 20 28 61 2e 6b 2e  e assembly (a.k.
7480: 61 2e 20 74 68 65 20 6e 61 74 69 76 65 20 69 6e  a. the native in
7490: 74 65 72 6f 70 0d 0a 20 20 20 20 20 20 23 20 20  terop..      #  
74a0: 20 20 20 20 20 61 73 73 65 6d 62 6c 79 29 2e 20       assembly). 
74b0: 20 54 6f 20 65 6e 61 62 6c 65 20 74 68 69 73 20   To enable this 
74c0: 6f 70 74 69 6f 6e 20 76 69 61 20 74 68 65 20 63  option via the c
74d0: 6f 6d 6d 61 6e 64 20 6c 69 6e 65 2c 20 65 6e 74  ommand line, ent
74e0: 65 72 20 61 0d 0a 20 20 20 20 20 20 23 20 20 20  er a..      #   
74f0: 20 20 20 20 63 6f 6d 6d 61 6e 64 20 73 69 6d 69      command simi
7500: 6c 61 72 20 74 6f 20 6f 6e 65 20 6f 66 20 74 68  lar to one of th
7510: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 28 61 6c 6c  e following (all
7520: 20 6f 6e 20 6f 6e 65 20 6c 69 6e 65 29 3a 0d 0a   on one line):..
7530: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
7540: 20 20 20 20 20 20 20 45 61 67 6c 65 53 68 65 6c         EagleShel
7550: 6c 2e 65 78 65 20 2d 69 6e 69 74 69 61 6c 69 7a  l.exe -initializ
7560: 65 20 2d 72 75 6e 74 69 6d 65 4f 70 74 69 6f 6e  e -runtimeOption
7570: 20 6e 61 74 69 76 65 0d 0a 20 20 20 20 20 20 23   native..      #
7580: 20 20 20 20 20 20 20 20 20 2d 66 69 6c 65 20 2e           -file .
7590: 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67  \path\to\all.eag
75a0: 6c 65 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  le..      #..   
75b0: 20 20 20 23 20 20 20 20 20 20 20 54 6f 20 65 6e     #       To en
75c0: 61 62 6c 65 20 74 68 69 73 20 6f 70 74 69 6f 6e  able this option
75d0: 20 76 69 61 20 74 68 65 20 63 6f 6d 6d 61 6e 64   via the command
75e0: 20 6c 69 6e 65 20 70 72 69 6f 72 20 74 6f 20 74   line prior to t
75f0: 68 65 20 22 62 65 74 61 20 31 36 22 0d 0a 20 20  he "beta 16"..  
7600: 20 20 20 20 23 20 20 20 20 20 20 20 72 65 6c 65      #       rele
7610: 61 73 65 20 6f 66 20 45 61 67 6c 65 2c 20 74 68  ase of Eagle, th
7620: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 6d  e following comm
7630: 61 6e 64 20 6d 75 73 74 20 62 65 20 75 73 65 64  and must be used
7640: 20 69 6e 73 74 65 61 64 0d 0a 20 20 20 20 20 20   instead..      
7650: 23 20 20 20 20 20 20 20 28 61 6c 73 6f 20 61 6c  #       (also al
7660: 6c 20 6f 6e 20 6f 6e 65 20 6c 69 6e 65 29 3a 0d  l on one line):.
7670: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
7680: 23 20 20 20 20 20 20 20 45 61 67 6c 65 53 68 65  #       EagleShe
7690: 6c 6c 2e 65 78 65 20 2d 69 6e 69 74 69 61 6c 69  ll.exe -initiali
76a0: 7a 65 20 2d 70 6f 73 74 49 6e 69 74 69 61 6c 69  ze -postInitiali
76b0: 7a 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ze..      #     
76c0: 20 20 20 20 22 6f 62 6a 65 63 74 20 69 6e 76 6f      "object invo
76d0: 6b 65 20 49 6e 74 65 72 70 72 65 74 65 72 2e 47  ke Interpreter.G
76e0: 65 74 41 63 74 69 76 65 20 41 64 64 52 75 6e 74  etActive AddRunt
76f0: 69 6d 65 4f 70 74 69 6f 6e 20 6e 61 74 69 76 65  imeOption native
7700: 22 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  "..      #      
7710: 20 20 20 2d 66 69 6c 65 20 2e 5c 70 61 74 68 5c     -file .\path\
7720: 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a 20 20  to\all.eagle..  
7730: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
7740: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
7750: 62 75 69 6c 64 5f 64 69 72 65 63 74 6f 72 79 5d  build_directory]
7760: 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
7770: 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20   [string length 
7780: 24 3a 3a 62 75 69 6c 64 5f 64 69 72 65 63 74 6f  $::build_directo
7790: 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  ry] > 0} then {.
77a0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
77b0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20      # NOTE: The 
77c0: 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  location of the 
77d0: 62 75 69 6c 64 20 64 69 72 65 63 74 6f 72 79 20  build directory 
77e0: 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72 69 64  has been overrid
77f0: 64 65 6e 3b 0d 0a 20 20 20 20 20 20 20 20 23 20  den;..        # 
7800: 20 20 20 20 20 20 74 68 65 72 65 66 6f 72 65 2c        therefore,
7810: 20 75 73 65 20 69 74 20 76 65 72 62 61 74 69 6d   use it verbatim
7820: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
7830: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a        return $::
7840: 62 75 69 6c 64 5f 64 69 72 65 63 74 6f 72 79 0d  build_directory.
7850: 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
7860: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
7870: 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 74      # NOTE: If t
7880: 68 65 20 22 6e 61 74 69 76 65 22 20 72 75 6e 74  he "native" runt
7890: 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 73 65  ime option is se
78a0: 74 2c 20 74 68 65 20 6d 69 78 65 64 2d 6d 6f 64  t, the mixed-mod
78b0: 65 20 61 73 73 65 6d 62 6c 79 0d 0a 20 20 20 20  e assembly..    
78c0: 20 20 20 20 23 20 20 20 20 20 20 20 69 73 20 62      #       is b
78d0: 65 69 6e 67 20 74 65 73 74 65 64 2e 20 20 49 6e  eing tested.  In
78e0: 20 74 68 61 74 20 63 61 73 65 2c 20 74 68 65 20   that case, the 
78f0: 70 61 74 68 20 74 6f 20 74 68 65 20 62 75 69 6c  path to the buil
7900: 64 20 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20  d directory..   
7910: 20 20 20 20 20 23 20 20 20 20 20 20 20 77 69 6c       #       wil
7920: 6c 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 70 6c  l contain the pl
7930: 61 74 66 6f 72 6d 20 6e 61 6d 65 20 61 6e 64 20  atform name and 
7940: 61 6c 6c 20 74 68 65 20 62 69 6e 61 72 69 65 73  all the binaries
7950: 20 75 6e 64 65 72 20 74 65 73 74 0d 0a 20 20 20   under test..   
7960: 20 20 20 20 20 23 20 20 20 20 20 20 20 73 68 6f       #       sho
7970: 75 6c 64 20 62 65 20 70 72 65 73 65 6e 74 20 69  uld be present i
7980: 6e 20 74 68 61 74 20 64 69 72 65 63 74 6f 72 79  n that directory
7990: 2e 20 20 49 66 20 74 68 65 20 22 6e 61 74 69 76  .  If the "nativ
79a0: 65 22 20 72 75 6e 74 69 6d 65 0d 0a 20 20 20 20  e" runtime..    
79b0: 20 20 20 20 23 20 20 20 20 20 20 20 6f 70 74 69      #       opti
79c0: 6f 6e 20 69 73 20 6e 6f 74 20 73 65 74 2c 20 74  on is not set, t
79d0: 68 65 20 62 75 69 6c 64 20 64 69 72 65 63 74 6f  he build directo
79e0: 72 79 20 77 69 6c 6c 20 62 65 20 63 6f 6e 73 69  ry will be consi
79f0: 64 65 72 65 64 20 74 6f 20 62 65 0d 0a 20 20 20  dered to be..   
7a00: 20 20 20 20 20 23 20 20 20 20 20 20 20 22 70 6c       #       "pl
7a10: 61 74 66 6f 72 6d 2d 6e 65 75 74 72 61 6c 22 2c  atform-neutral",
7a20: 20 77 69 74 68 20 74 68 65 20 6e 6f 74 61 62 6c   with the notabl
7a30: 65 20 65 78 63 65 70 74 69 6f 6e 20 6f 66 20 61  e exception of a
7a40: 6e 79 20 6e 61 74 69 76 65 0d 0a 20 20 20 20 20  ny native..     
7a50: 20 20 20 23 20 20 20 20 20 20 20 61 73 73 65 6d     #       assem
7a60: 62 6c 79 20 28 65 2e 67 2e 20 22 53 51 4c 69 74  bly (e.g. "SQLit
7a70: 65 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c 22 29 20  e.Interop.dll") 
7a80: 63 6f 70 69 65 64 20 74 68 65 72 65 20 64 75 72  copied there dur
7a90: 69 6e 67 20 74 68 65 0d 0a 20 20 20 20 20 20 20  ing the..       
7aa0: 20 23 20 20 20 20 20 20 20 62 75 69 6c 64 20 70   #       build p
7ab0: 72 6f 63 65 73 73 20 69 74 73 65 6c 66 2e 20 20  rocess itself.  
7ac0: 49 66 20 74 68 65 20 62 75 69 6c 64 20 70 72 6f  If the build pro
7ad0: 63 65 73 73 20 73 6f 6d 65 68 6f 77 20 64 6f 65  cess somehow doe
7ae0: 73 20 6e 6f 74 0d 0a 20 20 20 20 20 20 20 20 23  s not..        #
7af0: 20 20 20 20 20 20 20 63 6f 70 79 20 74 68 65 20         copy the 
7b00: 6e 61 74 69 76 65 20 61 73 73 65 6d 62 6c 79 20  native assembly 
7b10: 66 6f 72 20 74 68 69 73 20 70 6c 61 74 66 6f 72  for this platfor
7b20: 6d 2c 20 6d 6f 73 74 20 6f 66 20 74 68 65 20 74  m, most of the t
7b30: 65 73 74 73 0d 0a 20 20 20 20 20 20 20 20 23 20  ests..        # 
7b40: 20 20 20 20 20 20 69 6e 20 74 68 65 20 73 75 69        in the sui
7b50: 74 65 20 77 69 6c 6c 20 73 69 6d 70 6c 79 20 62  te will simply b
7b60: 65 20 73 6b 69 70 70 65 64 2e 20 20 47 65 6e 65  e skipped.  Gene
7b70: 72 61 6c 6c 79 20 73 70 65 61 6b 69 6e 67 2c 20  rally speaking, 
7b80: 74 68 65 72 65 0d 0a 20 20 20 20 20 20 20 20 23  there..        #
7b90: 20 20 20 20 20 20 20 61 72 65 20 74 77 6f 20 77         are two w
7ba0: 61 79 73 20 74 6f 20 62 75 69 6c 64 20 74 68 65  ays to build the
7bb0: 20 62 69 6e 61 72 69 65 73 20 77 68 65 6e 20 70   binaries when p
7bc0: 72 65 70 61 72 69 6e 67 20 74 6f 20 72 75 6e 20  reparing to run 
7bd0: 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  the..        #  
7be0: 20 20 20 20 20 74 65 73 74 20 73 75 69 74 65 3a       test suite:
7bf0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
7c00: 20 20 20 20 20 23 20 20 20 20 20 20 20 31 2e 20       #       1. 
7c10: 42 75 69 6c 64 20 74 68 65 20 73 65 70 61 72 61  Build the separa
7c20: 74 65 20 6d 61 6e 61 67 65 64 20 61 6e 64 20 6e  te managed and n
7c30: 61 74 69 76 65 20 61 73 73 65 6d 62 6c 69 65 73  ative assemblies
7c40: 20 75 73 69 6e 67 20 73 6f 6d 65 0d 0a 20 20 20   using some..   
7c50: 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20 20       #          
7c60: 63 6f 6d 6d 61 6e 64 73 20 73 69 6d 69 6c 61 72  commands similar
7c70: 20 74 6f 3a 0d 0a 20 20 20 20 20 20 20 20 23 0d   to:..        #.
7c80: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
7c90: 20 20 20 20 62 75 69 6c 64 2e 62 61 74 20 24 7b      build.bat ${
7ca0: 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 7d 4d 61  Configuration}Ma
7cb0: 6e 61 67 65 64 4f 6e 6c 79 20 24 7b 50 6c 61 74  nagedOnly ${Plat
7cc0: 66 6f 72 6d 7d 0d 0a 20 20 20 20 20 20 20 20 23  form}..        #
7cd0: 20 20 20 20 20 20 20 20 20 20 62 75 69 6c 64 2e            build.
7ce0: 62 61 74 20 24 7b 43 6f 6e 66 69 67 75 72 61 74  bat ${Configurat
7cf0: 69 6f 6e 7d 4e 61 74 69 76 65 4f 6e 6c 79 20 24  ion}NativeOnly $
7d00: 7b 50 6c 61 74 66 6f 72 6d 7d 0d 0a 20 20 20 20  {Platform}..    
7d10: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
7d20: 20 20 20 20 20 20 20 20 20 20 57 68 65 72 65 20            Where 
7d30: 24 7b 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 7d  ${Configuration}
7d40: 20 69 73 20 65 69 74 68 65 72 20 22 44 65 62 75   is either "Debu
7d50: 67 22 20 6f 72 20 22 52 65 6c 65 61 73 65 22 20  g" or "Release" 
7d60: 61 6e 64 0d 0a 20 20 20 20 20 20 20 20 23 20 20  and..        #  
7d70: 20 20 20 20 20 20 20 20 24 7b 50 6c 61 74 66 6f          ${Platfo
7d80: 72 6d 7d 20 69 73 20 65 69 74 68 65 72 20 22 57  rm} is either "W
7d90: 69 6e 33 32 22 20 6f 72 20 22 78 36 34 22 2e 0d  in32" or "x64"..
7da0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
7db0: 20 20 20 20 23 20 20 20 20 20 20 20 32 2e 20 42      #       2. B
7dc0: 75 69 6c 64 20 74 68 65 20 6d 69 78 65 64 2d 6d  uild the mixed-m
7dd0: 6f 64 65 20 61 73 73 65 6d 62 6c 79 20 75 73 69  ode assembly usi
7de0: 6e 67 20 61 20 63 6f 6d 6d 61 6e 64 20 73 69 6d  ng a command sim
7df0: 69 6c 61 72 20 74 6f 3a 0d 0a 20 20 20 20 20 20  ilar to:..      
7e00: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 20    #..        #  
7e10: 20 20 20 20 20 20 20 20 62 75 69 6c 64 2e 62 61          build.ba
7e20: 74 20 24 7b 43 6f 6e 66 69 67 75 72 61 74 69 6f  t ${Configuratio
7e30: 6e 7d 20 24 7b 50 6c 61 74 66 6f 72 6d 7d 0d 0a  n} ${Platform}..
7e40: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
7e50: 20 20 20 23 20 20 20 20 20 20 20 20 20 20 57 68     #          Wh
7e60: 65 72 65 20 24 7b 43 6f 6e 66 69 67 75 72 61 74  ere ${Configurat
7e70: 69 6f 6e 7d 20 69 73 20 65 69 74 68 65 72 20 22  ion} is either "
7e80: 44 65 62 75 67 22 20 6f 72 20 22 52 65 6c 65 61  Debug" or "Relea
7e90: 73 65 22 20 61 6e 64 0d 0a 20 20 20 20 20 20 20  se" and..       
7ea0: 20 23 20 20 20 20 20 20 20 20 20 20 24 7b 50 6c   #          ${Pl
7eb0: 61 74 66 6f 72 6d 7d 20 69 73 20 65 69 74 68 65  atform} is eithe
7ec0: 72 20 22 57 69 6e 33 32 22 20 6f 72 20 22 78 36  r "Win32" or "x6
7ed0: 34 22 2e 20 20 49 66 20 74 68 69 73 20 63 6f 6d  4".  If this com
7ee0: 6d 61 6e 64 20 69 73 0d 0a 20 20 20 20 20 20 20  mand is..       
7ef0: 20 23 20 20 20 20 20 20 20 20 20 20 75 73 65 64   #          used
7f00: 2c 20 76 61 72 69 6f 75 73 20 74 65 73 74 73 20  , various tests 
7f10: 74 68 61 74 20 72 65 71 75 69 72 65 20 73 75 70  that require sup
7f20: 70 6c 65 6d 65 6e 74 61 72 79 20 6d 61 6e 61 67  plementary manag
7f30: 65 64 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ed..        #   
7f40: 20 20 20 20 20 20 20 61 73 73 65 6d 62 6c 69 65         assemblie
7f50: 73 20 28 65 2e 67 2e 20 4c 49 4e 51 29 20 6d 61  s (e.g. LINQ) ma
7f60: 79 20 62 65 20 73 6b 69 70 70 65 64 20 75 6e 6c  y be skipped unl
7f70: 65 73 73 20 74 68 6f 73 65 20 62 69 6e 61 72 69  ess those binari
7f80: 65 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  es..        #   
7f90: 20 20 20 20 20 20 20 61 72 65 20 73 75 62 73 65         are subse
7fa0: 71 75 65 6e 74 6c 79 20 63 6f 70 69 65 64 20 69  quently copied i
7fb0: 6e 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20  nto the correct 
7fc0: 64 69 72 65 63 74 6f 72 79 20 28 69 2e 65 2e 20  directory (i.e. 
7fd0: 62 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  by..        #   
7fe0: 20 20 20 20 20 20 20 22 74 65 73 74 5f 61 6c 6c         "test_all
7ff0: 2e 62 61 74 22 29 2e 0d 0a 20 20 20 20 20 20 20  .bat")...       
8000: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20   #..        #   
8010: 20 20 20 20 4e 6f 74 65 20 74 68 61 74 20 61 6c      Note that al
8020: 6c 20 6f 66 20 74 68 65 20 62 75 69 6c 64 20 63  l of the build c
8030: 6f 6d 6d 61 6e 64 73 20 61 62 6f 76 65 20 77 69  ommands above wi
8040: 6c 6c 20 64 65 66 61 75 6c 74 20 74 6f 20 75 73  ll default to us
8050: 69 6e 67 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ing..        #  
8060: 20 20 20 20 20 74 68 65 20 6c 61 74 65 73 74 20       the latest 
8070: 76 65 72 73 69 6f 6e 20 6f 66 20 4d 53 42 75 69  version of MSBui
8080: 6c 64 20 61 76 61 69 6c 61 62 6c 65 20 61 6e 64  ld available and
8090: 20 74 68 65 20 22 74 65 73 74 5f 79 65 61 72 22   the "test_year"
80a0: 20 6d 61 79 0d 0a 20 20 20 20 20 20 20 20 23 20   may..        # 
80b0: 20 20 20 20 20 20 6e 65 65 64 20 74 6f 20 62 65        need to be
80c0: 20 61 64 6a 75 73 74 65 64 20 61 63 63 6f 72 64   adjusted accord
80d0: 69 6e 67 6c 79 20 74 6f 20 61 63 74 75 61 6c 6c  ingly to actuall
80e0: 79 20 72 75 6e 20 74 68 65 20 74 65 73 74 20 73  y run the test s
80f0: 75 69 74 65 2e 0d 0a 20 20 20 20 20 20 20 20 23  uite...        #
8100: 20 20 20 20 20 20 20 52 65 66 65 72 20 74 6f 20         Refer to 
8110: 74 68 65 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20  the comments in 
8120: 5b 67 65 74 42 75 69 6c 64 59 65 61 72 5d 20 66  [getBuildYear] f
8130: 6f 72 20 6d 6f 72 65 20 69 6e 66 6f 72 6d 61 74  or more informat
8140: 69 6f 6e 20 6f 6e 0d 0a 20 20 20 20 20 20 20 20  ion on..        
8150: 23 20 20 20 20 20 20 20 68 6f 77 20 74 6f 20 73  #       how to s
8160: 65 74 20 74 68 69 73 20 76 61 72 69 61 62 6c 65  et this variable
8170: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
8180: 20 20 20 20 20 20 73 65 74 20 6e 61 74 69 76 65        set native
8190: 20 5b 65 78 70 72 20 7b 21 24 6d 61 6e 61 67 65   [expr {!$manage
81a0: 64 4f 6e 6c 79 20 26 26 20 5b 68 61 73 52 75 6e  dOnly && [hasRun
81b0: 74 69 6d 65 4f 70 74 69 6f 6e 20 6e 61 74 69 76  timeOption nativ
81c0: 65 5d 7d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  e]}]....        
81d0: 72 65 74 75 72 6e 20 5b 6a 6f 69 6e 42 75 69 6c  return [joinBuil
81e0: 64 44 69 72 65 63 74 6f 72 79 20 24 6e 61 74 69  dDirectory $nati
81f0: 76 65 20 5b 67 65 74 42 75 69 6c 64 42 61 73 65  ve [getBuildBase
8200: 44 69 72 65 63 74 6f 72 79 5d 20 5c 0d 0a 20 20  Directory] \..  
8210: 20 20 20 20 20 20 20 20 20 20 5b 65 78 70 72 20            [expr 
8220: 7b 24 6d 61 6e 61 67 65 64 4f 6e 6c 79 20 3f 20  {$managedOnly ? 
8230: 5b 67 65 74 42 75 69 6c 64 59 65 61 72 5d 20 3a  [getBuildYear] :
8240: 20 5b 67 65 74 42 75 69 6c 64 4e 61 74 69 76 65   [getBuildNative
8250: 59 65 61 72 5d 7d 5d 20 5c 0d 0a 20 20 20 20 20  Year]}] \..     
8260: 20 20 20 20 20 20 20 5b 67 65 74 42 75 69 6c 64         [getBuild
8270: 50 6c 61 74 66 6f 72 6d 20 24 6e 61 74 69 76 65  Platform $native
8280: 5d 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5b 67  ] [appendArgs [g
8290: 65 74 42 75 69 6c 64 43 6f 6e 66 69 67 75 72 61  etBuildConfigura
82a0: 74 69 6f 6e 5d 20 5c 0d 0a 20 20 20 20 20 20 20  tion] \..       
82b0: 20 20 20 20 20 5b 67 65 74 42 75 69 6c 64 43 6f       [getBuildCo
82c0: 6e 66 69 67 75 72 61 74 69 6f 6e 53 75 66 66 69  nfigurationSuffi
82d0: 78 5d 5d 20 5b 65 78 70 72 20 7b 24 6d 61 6e 61  x]] [expr {$mana
82e0: 67 65 64 4f 6e 6c 79 20 3f 20 5c 0d 0a 20 20 20  gedOnly ? \..   
82f0: 20 20 20 20 20 20 20 20 20 5b 67 65 74 42 75 69           [getBui
8300: 6c 64 45 78 74 72 61 5d 20 3a 20 22 22 7d 5d 5d  ldExtra] : ""}]]
8310: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
8320: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65  .....    proc ge
8330: 74 52 65 6c 65 61 73 65 56 65 72 73 69 6f 6e 20  tReleaseVersion 
8340: 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20  {} {..      #.. 
8350: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69 67       # NOTE: Fig
8360: 75 72 65 20 6f 75 74 20 74 68 65 20 72 65 6c 65  ure out the rele
8370: 61 73 65 20 76 65 72 73 69 6f 6e 20 66 6f 72 20  ase version for 
8380: 75 73 65 20 77 69 74 68 20 74 68 65 20 62 75 69  use with the bui
8390: 6c 64 20 64 69 72 65 63 74 6f 72 79 0d 0a 20 20  ld directory..  
83a0: 20 20 20 20 23 20 20 20 20 20 20 20 77 68 65 6e      #       when
83b0: 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 61 76   checking for av
83c0: 61 69 6c 61 62 6c 65 20 72 65 6c 65 61 73 65 73  ailable releases
83d0: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
83e0: 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73    if {[info exis
83f0: 74 73 20 3a 3a 72 65 6c 65 61 73 65 5f 76 65 72  ts ::release_ver
8400: 73 69 6f 6e 5d 20 26 26 20 5c 0d 0a 20 20 20 20  sion] && \..    
8410: 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65        [string le
8420: 6e 67 74 68 20 24 3a 3a 72 65 6c 65 61 73 65 5f  ngth $::release_
8430: 76 65 72 73 69 6f 6e 5d 20 3e 20 30 7d 20 74 68  version] > 0} th
8440: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
8450: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
8460: 20 54 68 65 20 72 65 6c 65 61 73 65 20 76 65 72   The release ver
8470: 73 69 6f 6e 20 68 61 73 20 62 65 65 6e 20 6f 76  sion has been ov
8480: 65 72 72 69 64 64 65 6e 3b 20 74 68 65 72 65 66  erridden; theref
8490: 6f 72 65 2c 20 75 73 65 20 69 74 0d 0a 20 20 20  ore, use it..   
84a0: 20 20 20 20 20 23 20 20 20 20 20 20 20 76 65 72       #       ver
84b0: 62 61 74 69 6d 2e 0d 0a 20 20 20 20 20 20 20 20  batim...        
84c0: 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  #..        retur
84d0: 6e 20 24 3a 3a 72 65 6c 65 61 73 65 5f 76 65 72  n $::release_ver
84e0: 73 69 6f 6e 0d 0a 20 20 20 20 20 20 7d 20 65 6c  sion..      } el
84f0: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  se {..        #.
8500: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
8510: 20 4e 6f 20 72 65 6c 65 61 73 65 20 76 65 72 73   No release vers
8520: 69 6f 6e 20 69 73 20 61 76 61 69 6c 61 62 6c 65  ion is available
8530: 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 6d 70 74  , return an empt
8540: 79 20 73 74 72 69 6e 67 2e 0d 0a 20 20 20 20 20  y string...     
8550: 20 20 20 23 20 20 20 20 20 20 20 49 74 20 69 73     #       It is
8560: 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 72 65   important to re
8570: 74 75 72 6e 20 61 6e 20 65 6d 70 74 79 20 73 74  turn an empty st
8580: 72 69 6e 67 20 68 65 72 65 20 62 65 63 61 75 73  ring here becaus
8590: 65 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23  e the..        #
85a0: 20 20 20 20 20 20 20 72 65 73 75 6c 74 20 6f 66         result of
85b0: 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 20   this procedure 
85c0: 6d 61 79 20 62 65 20 75 73 65 64 20 77 69 74 68  may be used with
85d0: 20 5b 66 69 6c 65 20 6a 6f 69 6e 5d 2e 0d 0a 20   [file join]... 
85e0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
85f0: 20 20 72 65 74 75 72 6e 20 22 22 0d 0a 20 20 20    return ""..   
8600: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
8610: 20 20 20 20 70 72 6f 63 20 67 65 74 42 75 69 6c      proc getBuil
8620: 64 46 69 6c 65 4e 61 6d 65 20 7b 20 66 69 6c 65  dFileName { file
8630: 4e 61 6d 65 20 6d 61 6e 61 67 65 64 4f 6e 6c 79  Name managedOnly
8640: 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20 7d   {platform ""} }
8650: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
8660: 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 74 75 72     # NOTE: Retur
8670: 6e 73 20 74 68 65 20 73 70 65 63 69 66 69 65 64  ns the specified
8680: 20 66 69 6c 65 20 6e 61 6d 65 20 61 73 20 69 66   file name as if
8690: 20 69 74 20 77 65 72 65 20 6c 6f 63 61 74 65 64   it were located
86a0: 20 69 6e 20 74 68 65 0d 0a 20 20 20 20 20 20 23   in the..      #
86b0: 20 20 20 20 20 20 20 62 75 69 6c 64 20 64 69 72         build dir
86c0: 65 63 74 6f 72 79 2c 20 64 69 73 63 61 72 64 69  ectory, discardi
86d0: 6e 67 20 61 6e 79 20 64 69 72 65 63 74 6f 72 79  ng any directory
86e0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 70 72 65   information pre
86f0: 73 65 6e 74 0d 0a 20 20 20 20 20 20 23 20 20 20  sent..      #   
8700: 20 20 20 20 69 6e 20 74 68 65 20 66 69 6c 65 20      in the file 
8710: 6e 61 6d 65 20 61 73 20 70 72 6f 76 69 64 65 64  name as provided
8720: 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 2e 0d   by our caller..
8730: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
8740: 73 65 74 20 72 65 73 75 6c 74 20 5b 66 69 6c 65  set result [file
8750: 20 6e 61 74 69 76 65 6e 61 6d 65 20 5c 0d 0a 20   nativename \.. 
8760: 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 6a           [file j
8770: 6f 69 6e 20 5b 67 65 74 42 75 69 6c 64 44 69 72  oin [getBuildDir
8780: 65 63 74 6f 72 79 20 24 6d 61 6e 61 67 65 64 4f  ectory $managedO
8790: 6e 6c 79 5d 20 24 70 6c 61 74 66 6f 72 6d 20 5c  nly] $platform \
87a0: 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c  ..          [fil
87b0: 65 20 74 61 69 6c 20 24 66 69 6c 65 4e 61 6d 65  e tail $fileName
87c0: 5d 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a  ]]]....      #..
87d0: 20 20 20 20 20 20 23 20 48 41 43 4b 3a 20 57 68        # HACK: Wh
87e0: 65 6e 20 72 75 6e 6e 69 6e 67 20 6f 6e 20 57 6f  en running on Wo
87f0: 57 36 34 2c 20 61 73 73 75 6d 65 20 74 68 65 20  W64, assume the 
8800: 74 65 73 74 20 65 78 65 63 75 74 61 62 6c 65 73  test executables
8810: 20 61 72 65 20 70 72 65 73 65 6e 74 0d 0a 20 20   are present..  
8820: 20 20 20 20 23 20 20 20 20 20 20 20 77 69 74 68      #       with
8830: 20 74 68 65 20 22 33 32 22 20 73 75 66 66 69 78   the "32" suffix
8840: 20 6f 6e 20 74 68 65 6d 2e 0d 0a 20 20 20 20 20   on them...     
8850: 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69   #..      if {[i
8860: 73 52 75 6e 6e 69 6e 67 57 6f 57 36 34 5d 20 26  sRunningWoW64] &
8870: 26 20 5b 66 69 6c 65 20 65 78 74 65 6e 73 69 6f  & [file extensio
8880: 6e 20 24 72 65 73 75 6c 74 5d 20 65 71 20 22 2e  n $result] eq ".
8890: 65 78 65 22 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  exe"} then {..  
88a0: 20 20 20 20 20 20 73 65 74 20 72 65 73 75 6c 74        set result
88b0: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5b 66 69   [appendArgs [fi
88c0: 6c 65 20 72 6f 6f 74 6e 61 6d 65 20 24 72 65 73  le rootname $res
88d0: 75 6c 74 5d 20 33 32 2e 65 78 65 5d 0d 0a 20 20  ult] 32.exe]..  
88e0: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72      }....      r
88f0: 65 74 75 72 6e 20 24 72 65 73 75 6c 74 0d 0a 20  eturn $result.. 
8900: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
8910: 63 20 67 65 74 45 78 74 65 72 6e 61 6c 44 69 72  c getExternalDir
8920: 65 63 74 6f 72 79 20 7b 7d 20 7b 0d 0a 20 20 20  ectory {} {..   
8930: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
8940: 54 45 3a 20 54 68 69 73 20 70 72 6f 63 65 64 75  TE: This procedu
8950: 72 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 64  re returns the d
8960: 69 72 65 63 74 6f 72 79 20 77 68 65 72 65 20 74  irectory where t
8970: 68 65 20 65 78 74 65 72 6e 61 6c 20 62 69 6e 61  he external bina
8980: 72 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ry..      #     
8990: 20 20 66 69 6c 65 73 20 61 72 65 20 6c 6f 63 61    files are loca
89a0: 74 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ted...      #.. 
89b0: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 66 69 6c       return [fil
89c0: 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5c 0d 0a  e nativename \..
89d0: 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20            [file 
89e0: 64 69 72 6e 61 6d 65 20 5b 66 69 6c 65 20 64 69  dirname [file di
89f0: 72 6e 61 6d 65 20 5b 66 69 6c 65 20 64 69 72 6e  rname [file dirn
8a00: 61 6d 65 20 5b 69 6e 66 6f 20 62 69 6e 61 72 79  ame [info binary
8a10: 5d 5d 5d 5d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d  ]]]]]..    }....
8a20: 0a 20 20 20 20 70 72 6f 63 20 67 65 74 42 69 6e  .    proc getBin
8a30: 61 72 79 44 69 72 65 63 74 6f 72 79 20 7b 7d 20  aryDirectory {} 
8a40: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
8a50: 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 70    # NOTE: This p
8a60: 72 6f 63 65 64 75 72 65 20 72 65 74 75 72 6e 73  rocedure returns
8a70: 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 77   the directory w
8a80: 68 65 72 65 20 74 68 65 20 74 65 73 74 20 61 70  here the test ap
8a90: 70 6c 69 63 61 74 69 6f 6e 0d 0a 20 20 20 20 20  plication..     
8aa0: 20 23 20 20 20 20 20 20 20 69 74 73 65 6c 66 20   #       itself 
8ab0: 28 69 2e 65 2e 20 74 68 65 20 45 61 67 6c 65 20  (i.e. the Eagle 
8ac0: 73 68 65 6c 6c 29 20 69 73 20 6c 6f 63 61 74 65  shell) is locate
8ad0: 64 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 62 65  d.  This will be
8ae0: 20 75 73 65 64 20 61 73 0d 0a 20 20 20 20 20 20   used as..      
8af0: 23 20 20 20 20 20 20 20 74 68 65 20 64 65 73 74  #       the dest
8b00: 69 6e 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20  ination for the 
8b10: 63 6f 70 69 65 64 20 53 79 73 74 65 6d 2e 44 61  copied System.Da
8b20: 74 61 2e 53 51 4c 69 74 65 20 6e 61 74 69 76 65  ta.SQLite native
8b30: 20 61 6e 64 0d 0a 20 20 20 20 20 20 23 20 20 20   and..      #   
8b40: 20 20 20 20 6d 61 6e 61 67 65 64 20 61 73 73 65      managed asse
8b50: 6d 62 6c 69 65 73 20 28 69 2e 65 2e 20 62 65 63  mblies (i.e. bec
8b60: 61 75 73 65 20 74 68 69 73 20 69 73 20 6f 6e 65  ause this is one
8b70: 20 6f 66 20 74 68 65 20 66 65 77 20 70 6c 61 63   of the few plac
8b80: 65 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  es..      #     
8b90: 20 20 77 68 65 72 65 20 74 68 65 20 43 4c 52 20    where the CLR 
8ba0: 77 69 6c 6c 20 61 63 74 75 61 6c 6c 79 20 66 69  will actually fi
8bb0: 6e 64 20 61 6e 64 20 6c 6f 61 64 20 74 68 65 6d  nd and load them
8bc0: 20 70 72 6f 70 65 72 6c 79 29 2e 0d 0a 20 20 20   properly)...   
8bd0: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
8be0: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 62  [info exists ::b
8bf0: 69 6e 61 72 79 5f 64 69 72 65 63 74 6f 72 79 5d  inary_directory]
8c00: 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
8c10: 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20   [string length 
8c20: 24 3a 3a 62 69 6e 61 72 79 5f 64 69 72 65 63 74  $::binary_direct
8c30: 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ory] > 0} then {
8c40: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
8c50: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65       # NOTE: The
8c60: 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65   location of the
8c70: 20 62 69 6e 61 72 79 20 64 69 72 65 63 74 6f 72   binary director
8c80: 79 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72  y has been overr
8c90: 69 64 64 65 6e 3b 0d 0a 20 20 20 20 20 20 20 20  idden;..        
8ca0: 23 20 20 20 20 20 20 20 74 68 65 72 65 66 6f 72  #       therefor
8cb0: 65 2c 20 75 73 65 20 69 74 20 76 65 72 62 61 74  e, use it verbat
8cc0: 69 6d 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  im...        #..
8cd0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24          return $
8ce0: 3a 3a 62 69 6e 61 72 79 5f 64 69 72 65 63 74 6f  ::binary_directo
8cf0: 72 79 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  ry..      } else
8d00: 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   {..        retu
8d10: 72 6e 20 5b 69 6e 66 6f 20 62 69 6e 61 72 79 5d  rn [info binary]
8d20: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
8d30: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65  .....    proc ge
8d40: 74 45 78 74 65 72 6e 61 6c 46 69 6c 65 4e 61 6d  tExternalFileNam
8d50: 65 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7d 20 7b  e { fileName } {
8d60: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
8d70: 20 23 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e 73   # NOTE: Returns
8d80: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66   the specified f
8d90: 69 6c 65 20 6e 61 6d 65 20 61 73 20 69 66 20 69  ile name as if i
8da0: 74 20 77 65 72 65 20 6c 6f 63 61 74 65 64 20 69  t were located i
8db0: 6e 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20  n the..      #  
8dc0: 20 20 20 20 20 64 69 72 65 63 74 6f 72 79 20 63       directory c
8dd0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 65 78  ontaining the ex
8de0: 74 65 72 6e 61 6c 20 62 69 6e 61 72 69 65 73 2e  ternal binaries.
8df0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
8e00: 20 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 6e 61   return [file na
8e10: 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a  tivename [file j
8e20: 6f 69 6e 20 5b 67 65 74 45 78 74 65 72 6e 61 6c  oin [getExternal
8e30: 44 69 72 65 63 74 6f 72 79 5d 20 24 66 69 6c 65  Directory] $file
8e40: 4e 61 6d 65 5d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c  Name]]..    }...
8e50: 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 42 69  ..    proc getBi
8e60: 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 7b 20 66  naryFileName { f
8e70: 69 6c 65 4e 61 6d 65 20 7b 70 6c 61 74 66 6f 72  ileName {platfor
8e80: 6d 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  m ""} } {..     
8e90: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
8ea0: 3a 20 52 65 74 75 72 6e 73 20 74 68 65 20 73 70  : Returns the sp
8eb0: 65 63 69 66 69 65 64 20 66 69 6c 65 20 6e 61 6d  ecified file nam
8ec0: 65 20 61 73 20 69 66 20 69 74 20 77 65 72 65 20  e as if it were 
8ed0: 6c 6f 63 61 74 65 64 20 69 6e 20 74 68 65 0d 0a  located in the..
8ee0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62 69        #       bi
8ef0: 6e 61 72 79 20 64 69 72 65 63 74 6f 72 79 2c 20  nary directory, 
8f00: 64 69 73 63 61 72 64 69 6e 67 20 61 6e 79 20 64  discarding any d
8f10: 69 72 65 63 74 6f 72 79 20 69 6e 66 6f 72 6d 61  irectory informa
8f20: 74 69 6f 6e 20 70 72 65 73 65 6e 74 0d 0a 20 20  tion present..  
8f30: 20 20 20 20 23 20 20 20 20 20 20 20 69 6e 20 74      #       in t
8f40: 68 65 20 66 69 6c 65 20 6e 61 6d 65 20 61 73 20  he file name as 
8f50: 70 72 6f 76 69 64 65 64 20 62 79 20 6f 75 72 20  provided by our 
8f60: 63 61 6c 6c 65 72 2e 0d 0a 20 20 20 20 20 20 23  caller...      #
8f70: 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b  ..      return [
8f80: 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20  file nativename 
8f90: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 66 69  \..          [fi
8fa0: 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 42 69 6e 61  le join [getBina
8fb0: 72 79 44 69 72 65 63 74 6f 72 79 5d 20 24 70 6c  ryDirectory] $pl
8fc0: 61 74 66 6f 72 6d 20 5b 66 69 6c 65 20 74 61 69  atform [file tai
8fd0: 6c 20 24 66 69 6c 65 4e 61 6d 65 5d 5d 5d 0d 0a  l $fileName]]]..
8fe0: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
8ff0: 6f 63 20 67 65 74 43 6f 72 65 42 69 6e 61 72 79  oc getCoreBinary
9000: 46 69 6c 65 4e 61 6d 65 20 7b 20 7b 70 6c 61 74  FileName { {plat
9010: 66 6f 72 6d 20 22 22 7d 20 7b 73 74 61 6e 64 61  form ""} {standa
9020: 72 64 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20  rd ""} } {..    
9030: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
9040: 45 3a 20 52 65 74 75 72 6e 73 20 74 68 65 20 66  E: Returns the f
9050: 75 6c 6c 20 70 61 74 68 20 66 6f 72 20 74 68 65  ull path for the
9060: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67   file containing
9070: 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65   the SQLite core
9080: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
9090: 6e 61 74 69 76 65 20 6c 69 62 72 61 72 79 20 63  native library c
90a0: 6f 64 65 20 66 6f 72 20 74 68 69 73 20 70 6c 61  ode for this pla
90b0: 74 66 6f 72 6d 2e 20 20 46 69 72 73 74 2c 20 63  tform.  First, c
90c0: 68 65 63 6b 20 61 6e 64 20 73 65 65 20 69 66 0d  heck and see if.
90d0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74  .      #       t
90e0: 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20 6e  he SQLite core n
90f0: 61 74 69 76 65 20 6c 69 62 72 61 72 79 20 68 61  ative library ha
9100: 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6c  s already been l
9110: 6f 61 64 65 64 2e 20 20 4e 65 78 74 2c 0d 0a 20  oaded.  Next,.. 
9120: 20 20 20 20 20 23 20 20 20 20 20 20 20 66 61 6c       #       fal
9130: 6c 62 61 63 6b 20 74 6f 20 77 68 61 74 20 74 68  lback to what th
9140: 65 20 66 75 6c 6c 20 70 61 74 68 20 73 68 6f 75  e full path shou
9150: 6c 64 20 62 65 2c 20 62 61 73 65 64 20 6f 6e 20  ld be, based on 
9160: 77 68 65 74 68 65 72 20 74 68 65 0d 0a 20 20 20  whether the..   
9170: 20 20 20 23 20 20 20 20 20 20 20 6d 69 78 65 64     #       mixed
9180: 2d 6d 6f 64 65 20 61 73 73 65 6d 62 6c 79 20 69  -mode assembly i
9190: 73 20 62 65 69 6e 67 20 75 73 65 64 20 61 6e 64  s being used and
91a0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
91b0: 20 63 75 72 72 65 6e 74 0d 0a 20 20 20 20 20 20   current..      
91c0: 23 20 20 20 20 20 20 20 70 6c 61 74 66 6f 72 6d  #       platform
91d0: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
91e0: 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
91f0: 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69          object i
9200: 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f  nvoke -flags +No
9210: 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20  nPublic \..     
9220: 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61         System.Da
9230: 74 61 2e 53 51 4c 69 74 65 2e 55 6e 73 61 66 65  ta.SQLite.Unsafe
9240: 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 20 5f 53  NativeMethods _S
9250: 51 4c 69 74 65 4e 61 74 69 76 65 4d 6f 64 75 6c  QLiteNativeModul
9260: 65 46 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20  eFileName..     
9270: 20 7d 20 66 69 6c 65 4e 61 6d 65 5d 20 3d 3d 20   } fileName] == 
9280: 30 20 26 26 20 5b 73 74 72 69 6e 67 20 6c 65 6e  0 && [string len
9290: 67 74 68 20 24 66 69 6c 65 4e 61 6d 65 5d 20 3e  gth $fileName] >
92a0: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
92b0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
92c0: 20 4e 4f 54 45 3a 20 54 68 65 20 53 51 4c 69 74   NOTE: The SQLit
92d0: 65 20 63 6f 72 65 20 6e 61 74 69 76 65 20 6c 69  e core native li
92e0: 62 72 61 72 79 20 68 61 73 20 61 6c 72 65 61 64  brary has alread
92f0: 79 20 62 65 65 6e 20 6c 6f 61 64 65 64 20 76 69  y been loaded vi
9300: 61 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  a..        #    
9310: 20 20 20 74 68 65 20 6e 61 74 69 76 65 20 6c 69     the native li
9320: 62 72 61 72 79 20 70 72 65 2d 6c 6f 61 64 65 72  brary pre-loader
9330: 2e 20 20 52 65 74 75 72 6e 20 74 68 61 74 20 66  .  Return that f
9340: 69 6c 65 20 6e 61 6d 65 20 6e 6f 77 2e 0d 0a 20  ile name now... 
9350: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
9360: 20 20 72 65 74 75 72 6e 20 24 66 69 6c 65 4e 61    return $fileNa
9370: 6d 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  me..      }.... 
9380: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
9390: 4e 4f 54 45 3a 20 49 66 20 74 68 65 20 22 6e 61  NOTE: If the "na
93a0: 74 69 76 65 22 20 72 75 6e 74 69 6d 65 20 6f 70  tive" runtime op
93b0: 74 69 6f 6e 20 68 61 73 20 62 65 65 6e 20 73 65  tion has been se
93c0: 74 2c 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e  t, always return
93d0: 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20   the..      #   
93e0: 20 20 20 20 66 69 6c 65 20 6e 61 6d 65 20 66 6f      file name fo
93f0: 72 20 74 68 65 20 6d 69 78 65 64 2d 6d 6f 64 65  r the mixed-mode
9400: 20 61 73 73 65 6d 62 6c 79 2e 0d 0a 20 20 20 20   assembly...    
9410: 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
9420: 68 61 73 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e  hasRuntimeOption
9430: 20 6e 61 74 69 76 65 5d 7d 20 74 68 65 6e 20 7b   native]} then {
9440: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
9450: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 74       # NOTE: Ret
9460: 75 72 6e 20 74 68 65 20 6d 69 78 65 64 2d 6d 6f  urn the mixed-mo
9470: 64 65 20 61 73 73 65 6d 62 6c 79 20 66 69 6c 65  de assembly file
9480: 20 6e 61 6d 65 2e 0d 0a 20 20 20 20 20 20 20 20   name...        
9490: 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  #..        retur
94a0: 6e 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61  n [file nativena
94b0: 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  me \..          
94c0: 20 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65    [file join [ge
94d0: 74 42 69 6e 61 72 79 44 69 72 65 63 74 6f 72 79  tBinaryDirectory
94e0: 5d 20 24 70 6c 61 74 66 6f 72 6d 20 53 79 73 74  ] $platform Syst
94f0: 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64  em.Data.SQLite.d
9500: 6c 6c 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  ll]]..      }...
9510: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
9520: 23 20 4e 4f 54 45 3a 20 41 72 65 20 77 65 20 61  # NOTE: Are we a
9530: 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 61 75 74  ttempting to aut
9540: 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 74 65 63  omatically detec
9550: 74 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  t whether or not
9560: 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20   the..      #   
9570: 20 20 20 20 69 6e 74 65 72 6f 70 20 61 73 73 65      interop asse
9580: 6d 62 6c 79 20 73 68 6f 75 6c 64 20 62 65 20 75  mbly should be u
9590: 73 65 64 3f 0d 0a 20 20 20 20 20 20 23 0d 0a 20  sed?..      #.. 
95a0: 20 20 20 20 20 73 65 74 20 61 75 74 6f 6d 61 74       set automat
95b0: 69 63 20 5b 65 78 70 72 20 7b 5b 73 74 72 69 6e  ic [expr {[strin
95c0: 67 20 6c 65 6e 67 74 68 20 24 73 74 61 6e 64 61  g length $standa
95d0: 72 64 5d 20 3d 3d 20 30 7d 5d 0d 0a 0d 0a 20 20  rd] == 0}]....  
95e0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
95f0: 4f 54 45 3a 20 46 69 72 73 74 2c 20 69 6e 20 65  OTE: First, in e
9600: 69 74 68 65 72 20 22 61 75 74 6f 6d 61 74 69 63  ither "automatic
9610: 22 20 6f 72 20 22 6e 6f 6e 2d 73 74 61 6e 64 61  " or "non-standa
9620: 72 64 22 20 6d 6f 64 65 73 2c 20 61 74 74 65 6d  rd" modes, attem
9630: 70 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  pt..      #     
9640: 20 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6e 61    to find the na
9650: 74 69 76 65 2d 6f 6e 6c 79 20 69 6e 74 65 72 6f  tive-only intero
9660: 70 20 61 73 73 65 6d 62 6c 79 2e 0d 0a 20 20 20  p assembly...   
9670: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
9680: 24 61 75 74 6f 6d 61 74 69 63 20 7c 7c 20 21 24  $automatic || !$
9690: 73 74 61 6e 64 61 72 64 7d 20 74 68 65 6e 20 7b  standard} then {
96a0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
96b0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74       # NOTE: Att
96c0: 65 6d 70 74 20 74 6f 20 64 65 74 65 72 6d 69 6e  empt to determin
96d0: 65 20 74 68 65 20 6e 61 74 69 76 65 2d 6f 6e 6c  e the native-onl
96e0: 79 20 69 6e 74 65 72 6f 70 20 61 73 73 65 6d 62  y interop assemb
96f0: 6c 79 20 66 69 6c 65 0d 0a 20 20 20 20 20 20 20  ly file..       
9700: 20 23 20 20 20 20 20 20 20 6e 61 6d 65 20 66 6f   #       name fo
9710: 72 20 74 68 69 73 20 70 6c 61 74 66 6f 72 6d 20  r this platform 
9720: 61 6e 64 20 74 68 65 6e 20 72 65 74 75 72 6e 20  and then return 
9730: 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  it...        #..
9740: 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
9750: 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 5b 67 65  fileNameOnly [ge
9760: 74 49 6e 74 65 72 6f 70 41 73 73 65 6d 62 6c 79  tInteropAssembly
9770: 46 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79 5d 20 7b  FileNamesOnly] {
9780: 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
9790: 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6e  fileName [file n
97a0: 61 74 69 76 65 6e 61 6d 65 20 5c 0d 0a 20 20 20  ativename \..   
97b0: 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65             [file
97c0: 20 6a 6f 69 6e 20 5b 67 65 74 42 69 6e 61 72 79   join [getBinary
97d0: 44 69 72 65 63 74 6f 72 79 5d 20 24 70 6c 61 74  Directory] $plat
97e0: 66 6f 72 6d 20 24 66 69 6c 65 4e 61 6d 65 4f 6e  form $fileNameOn
97f0: 6c 79 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ly]]....        
9800: 20 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73    if {[file exis
9810: 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74  ts $fileName]} t
9820: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
9830: 20 20 20 72 65 74 75 72 6e 20 24 66 69 6c 65 4e     return $fileN
9840: 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  ame..          }
9850: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
9860: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
9870: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54  .      # NOTE: T
9880: 68 65 6e 2c 20 69 6e 20 65 69 74 68 65 72 20 22  hen, in either "
9890: 61 75 74 6f 6d 61 74 69 63 22 20 6f 72 20 22 73  automatic" or "s
98a0: 74 61 6e 64 61 72 64 22 20 6d 6f 64 65 73 2c 20  tandard" modes, 
98b0: 61 74 74 65 6d 70 74 20 74 6f 0d 0a 20 20 20 20  attempt to..    
98c0: 20 20 23 20 20 20 20 20 20 20 66 69 6e 64 20 74    #       find t
98d0: 68 65 20 73 74 61 6e 64 61 72 64 20 53 51 4c 69  he standard SQLi
98e0: 74 65 20 6c 69 62 72 61 72 79 2e 0d 0a 20 20 20  te library...   
98f0: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
9900: 24 61 75 74 6f 6d 61 74 69 63 20 7c 7c 20 24 73  $automatic || $s
9910: 74 61 6e 64 61 72 64 7d 20 74 68 65 6e 20 7b 0d  tandard} then {.
9920: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
9930: 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65      # NOTE: Atte
9940: 6d 70 74 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  mpt to determine
9950: 20 74 68 65 20 6e 61 74 69 76 65 2d 6f 6e 6c 79   the native-only
9960: 20 73 74 61 6e 64 61 72 64 20 53 51 4c 69 74 65   standard SQLite
9970: 20 6c 69 62 72 61 72 79 0d 0a 20 20 20 20 20 20   library..      
9980: 20 20 23 20 20 20 20 20 20 20 66 69 6c 65 20 6e    #       file n
9990: 61 6d 65 20 66 6f 72 20 74 68 69 73 20 70 6c 61  ame for this pla
99a0: 74 66 6f 72 6d 20 61 6e 64 20 74 68 65 6e 20 72  tform and then r
99b0: 65 74 75 72 6e 20 69 74 2e 0d 0a 20 20 20 20 20  eturn it...     
99c0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 66 6f     #..        fo
99d0: 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 4f 6e  reach fileNameOn
99e0: 6c 79 20 5b 67 65 74 4e 61 74 69 76 65 4c 69 62  ly [getNativeLib
99f0: 72 61 72 79 46 69 6c 65 4e 61 6d 65 73 4f 6e 6c  raryFileNamesOnl
9a00: 79 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  y] {..          
9a10: 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69  set fileName [fi
9a20: 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5c 0d  le nativename \.
9a30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b  .              [
9a40: 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 42 69  file join [getBi
9a50: 6e 61 72 79 44 69 72 65 63 74 6f 72 79 5d 20 24  naryDirectory] $
9a60: 70 6c 61 74 66 6f 72 6d 20 24 66 69 6c 65 4e 61  platform $fileNa
9a70: 6d 65 4f 6e 6c 79 5d 5d 0d 0a 0d 0a 20 20 20 20  meOnly]]....    
9a80: 20 20 20 20 20 20 69 66 20 7b 5b 66 69 6c 65 20        if {[file 
9a90: 65 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65  exists $fileName
9aa0: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
9ab0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 66         return $f
9ac0: 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20  ileName..       
9ad0: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
9ae0: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
9af0: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
9b00: 45 3a 20 57 61 73 20 74 68 65 20 6d 61 6e 61 67  E: Was the manag
9b10: 65 64 20 61 73 73 65 6d 62 6c 79 20 63 6f 6d 70  ed assembly comp
9b20: 69 6c 65 64 20 65 78 70 65 63 74 69 6e 67 20 74  iled expecting t
9b30: 6f 20 64 65 61 6c 20 77 69 74 68 20 74 68 65 0d  o deal with the.
9b40: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73  .      #       s
9b50: 74 61 6e 64 61 72 64 20 63 6f 72 65 20 6c 69 62  tandard core lib
9b60: 72 61 72 79 3f 0d 0a 20 20 20 20 20 20 23 0d 0a  rary?..      #..
9b70: 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65 53        if {[haveS
9b80: 51 4c 69 74 65 44 65 66 69 6e 65 43 6f 6e 73 74  QLiteDefineConst
9b90: 61 6e 74 20 53 51 4c 49 54 45 5f 53 54 41 4e 44  ant SQLITE_STAND
9ba0: 41 52 44 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ARD]} then {..  
9bb0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
9bc0: 20 23 20 4e 4f 54 45 3a 20 46 61 6c 6c 62 61 63   # NOTE: Fallbac
9bd0: 6b 20 74 6f 20 72 65 74 75 72 6e 69 6e 67 20 74  k to returning t
9be0: 68 65 20 6e 61 74 69 76 65 2d 6f 6e 6c 79 20 73  he native-only s
9bf0: 74 61 6e 64 61 72 64 20 53 51 4c 69 74 65 20 6c  tandard SQLite l
9c00: 69 62 72 61 72 79 0d 0a 20 20 20 20 20 20 20 20  ibrary..        
9c10: 23 20 20 20 20 20 20 20 66 69 6c 65 20 6e 61 6d  #       file nam
9c20: 65 20 66 6f 72 20 74 68 65 20 70 6c 61 74 66 6f  e for the platfo
9c30: 72 6d 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  rm...        #..
9c40: 20 20 20 20 20 20 20 20 73 65 74 20 66 69 6c 65          set file
9c50: 4e 61 6d 65 73 4f 6e 6c 79 20 5b 67 65 74 4e 61  NamesOnly [getNa
9c60: 74 69 76 65 4c 69 62 72 61 72 79 46 69 6c 65 4e  tiveLibraryFileN
9c70: 61 6d 65 73 4f 6e 6c 79 5d 0d 0a 0d 0a 20 20 20  amesOnly]....   
9c80: 20 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67 74       if {[llengt
9c90: 68 20 24 66 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79  h $fileNamesOnly
9ca0: 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
9cb0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
9cc0: 20 22 22 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a   ""..        }..
9cd0: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
9ce0: 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d   [file nativenam
9cf0: 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a  e [file join \..
9d00: 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74              [get
9d10: 42 69 6e 61 72 79 44 69 72 65 63 74 6f 72 79 5d  BinaryDirectory]
9d20: 20 24 70 6c 61 74 66 6f 72 6d 20 5b 6c 69 6e 64   $platform [lind
9d30: 65 78 20 24 66 69 6c 65 4e 61 6d 65 73 4f 6e 6c  ex $fileNamesOnl
9d40: 79 20 30 5d 5d 5d 0d 0a 20 20 20 20 20 20 7d 20  y 0]]]..      } 
9d50: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
9d60: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
9d70: 45 3a 20 46 61 6c 6c 62 61 63 6b 20 74 6f 20 72  E: Fallback to r
9d80: 65 74 75 72 6e 69 6e 67 20 74 68 65 20 6e 61 74  eturning the nat
9d90: 69 76 65 2d 6f 6e 6c 79 20 69 6e 74 65 72 6f 70  ive-only interop
9da0: 20 61 73 73 65 6d 62 6c 79 20 66 69 6c 65 0d 0a   assembly file..
9db0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
9dc0: 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 70 6c 61  name for the pla
9dd0: 74 66 6f 72 6d 2e 0d 0a 20 20 20 20 20 20 20 20  tform...        
9de0: 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 66  #..        set f
9df0: 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79 20 5b 67 65  ileNamesOnly [ge
9e00: 74 49 6e 74 65 72 6f 70 41 73 73 65 6d 62 6c 79  tInteropAssembly
9e10: 46 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79 5d 0d 0a  FileNamesOnly]..
9e20: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 6c  ..        if {[l
9e30: 6c 65 6e 67 74 68 20 24 66 69 6c 65 4e 61 6d 65  length $fileName
9e40: 73 4f 6e 6c 79 5d 20 3d 3d 20 30 7d 20 74 68 65  sOnly] == 0} the
9e50: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 72  n {..          r
9e60: 65 74 75 72 6e 20 22 22 0d 0a 20 20 20 20 20 20  eturn ""..      
9e70: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 72    }....        r
9e80: 65 74 75 72 6e 20 5b 66 69 6c 65 20 6e 61 74 69  eturn [file nati
9e90: 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69  vename [file joi
9ea0: 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n \..           
9eb0: 20 5b 67 65 74 42 69 6e 61 72 79 44 69 72 65 63   [getBinaryDirec
9ec0: 74 6f 72 79 5d 20 24 70 6c 61 74 66 6f 72 6d 20  tory] $platform 
9ed0: 5b 6c 69 6e 64 65 78 20 24 66 69 6c 65 4e 61 6d  [lindex $fileNam
9ee0: 65 73 4f 6e 6c 79 20 30 5d 5d 5d 0d 0a 20 20 20  esOnly 0]]]..   
9ef0: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
9f00: 20 20 20 20 70 72 6f 63 20 67 65 74 43 6f 6d 6d      proc getComm
9f10: 6f 6e 44 69 72 65 63 74 6f 72 79 20 7b 7d 20 7b  onDirectory {} {
9f20: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
9f30: 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 70 72   # NOTE: This pr
9f40: 6f 63 65 64 75 72 65 20 72 65 74 75 72 6e 73 20  ocedure returns 
9f50: 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 77 68  the directory wh
9f60: 65 72 65 20 74 68 65 20 74 65 73 74 20 73 63 72  ere the test scr
9f70: 69 70 74 73 0d 0a 20 20 20 20 20 20 23 20 20 20  ipts..      #   
9f80: 20 20 20 20 73 68 6f 75 6c 64 20 62 65 20 6c 6f      should be lo
9f90: 63 61 74 65 64 2e 20 20 42 79 20 64 65 66 61 75  cated.  By defau
9fa0: 6c 74 2c 20 74 68 69 73 20 6a 75 73 74 20 72 65  lt, this just re
9fb0: 74 75 72 6e 73 20 74 68 65 20 45 61 67 6c 65 0d  turns the Eagle.
9fc0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62  .      #       b
9fd0: 69 6e 61 72 79 20 64 69 72 65 63 74 6f 72 79 2e  inary directory.
9fe0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
9ff0: 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
a000: 73 20 3a 3a 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63  s ::common_direc
a010: 74 6f 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20  tory] && \..    
a020: 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65        [string le
a030: 6e 67 74 68 20 24 3a 3a 63 6f 6d 6d 6f 6e 5f 64  ngth $::common_d
a040: 69 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74  irectory] > 0} t
a050: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
a060: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
a070: 3a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f  : The location o
a080: 66 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 64 69 72  f the common dir
a090: 65 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20  ectory has been 
a0a0: 73 65 74 3b 0d 0a 20 20 20 20 20 20 20 20 23 20  set;..        # 
a0b0: 20 20 20 20 20 20 74 68 65 72 65 66 6f 72 65 2c        therefore,
a0c0: 20 75 73 65 20 69 74 2e 0d 0a 20 20 20 20 20 20   use it...      
a0d0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
a0e0: 75 72 6e 20 24 3a 3a 63 6f 6d 6d 6f 6e 5f 64 69  urn $::common_di
a0f0: 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d  rectory..      }
a100: 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20 65   elseif {[info e
a110: 78 69 73 74 73 20 3a 3a 76 65 6e 64 6f 72 5f 64  xists ::vendor_d
a120: 69 72 65 63 74 6f 72 79 5d 20 26 26 20 5c 0d 0a  irectory] && \..
a130: 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e            [strin
a140: 67 20 6c 65 6e 67 74 68 20 24 3a 3a 76 65 6e 64  g length $::vend
a150: 6f 72 5f 64 69 72 65 63 74 6f 72 79 5d 20 3e 20  or_directory] > 
a160: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
a170: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
a180: 4e 4f 54 45 3a 20 54 68 65 20 6c 6f 63 61 74 69  NOTE: The locati
a190: 6f 6e 20 6f 66 20 74 68 65 20 76 65 6e 64 6f 72  on of the vendor
a1a0: 20 64 69 72 65 63 74 6f 72 79 20 68 61 73 20 62   directory has b
a1b0: 65 65 6e 20 73 65 74 3b 0d 0a 20 20 20 20 20 20  een set;..      
a1c0: 20 20 23 20 20 20 20 20 20 20 74 68 65 72 65 66    #       theref
a1d0: 6f 72 65 2c 20 75 73 65 20 69 74 2e 0d 0a 20 20  ore, use it...  
a1e0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
a1f0: 20 72 65 74 75 72 6e 20 24 3a 3a 76 65 6e 64 6f   return $::vendo
a200: 72 5f 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20  r_directory..   
a210: 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e     } elseif {[in
a220: 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 63 6c 5f  fo exists ::tcl_
a230: 6c 69 62 72 61 72 79 5d 20 26 26 20 5c 0d 0a 20  library] && \.. 
a240: 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67           [string
a250: 20 6c 65 6e 67 74 68 20 24 3a 3a 74 63 6c 5f 6c   length $::tcl_l
a260: 69 62 72 61 72 79 5d 20 3e 20 30 20 26 26 20 5c  ibrary] > 0 && \
a270: 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c  ..          [fil
a280: 65 20 69 73 64 69 72 65 63 74 6f 72 79 20 24 3a  e isdirectory $:
a290: 3a 74 63 6c 5f 6c 69 62 72 61 72 79 5d 7d 20 74  :tcl_library]} t
a2a0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
a2b0: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
a2c0: 3a 20 54 68 65 20 76 61 72 69 61 62 6c 65 20 77  : The variable w
a2d0: 69 74 68 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e  ith the location
a2e0: 20 6f 66 20 74 68 65 20 73 63 72 69 70 74 20 6c   of the script l
a2f0: 69 62 72 61 72 79 20 69 73 0d 0a 20 20 20 20 20  ibrary is..     
a300: 20 20 20 23 20 20 20 20 20 20 20 73 65 74 20 61     #       set a
a310: 6e 64 20 61 70 70 65 61 72 73 20 74 6f 20 62 65  nd appears to be
a320: 20 61 20 72 65 61 6c 20 64 69 72 65 63 74 6f 72   a real director
a330: 79 20 28 69 2e 65 2e 20 6e 6f 74 20 65 6d 62 65  y (i.e. not embe
a340: 64 64 65 64 0d 0a 20 20 20 20 20 20 20 20 23 20  dded..        # 
a350: 20 20 20 20 20 20 77 69 74 68 69 6e 20 61 20 66        within a f
a360: 69 6c 65 29 3b 20 74 68 65 72 65 66 6f 72 65 2c  ile); therefore,
a370: 20 75 73 65 20 69 74 2e 0d 0a 20 20 20 20 20 20   use it...      
a380: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
a390: 75 72 6e 20 24 3a 3a 74 63 6c 5f 6c 69 62 72 61  urn $::tcl_libra
a3a0: 72 79 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  ry..      } else
a3b0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
a3c0: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46         # NOTE: F
a3d0: 61 6c 6c 62 61 63 6b 20 74 6f 20 74 68 65 20 64  allback to the d
a3e0: 69 72 65 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e  irectory contain
a3f0: 69 6e 67 20 74 68 65 20 65 78 65 63 75 74 61 62  ing the executab
a400: 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  le...        #..
a410: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b          return [
a420: 69 6e 66 6f 20 62 69 6e 61 72 79 5d 0d 0a 20 20  info binary]..  
a430: 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
a440: 0a 20 20 20 20 70 72 6f 63 20 67 65 74 44 61 74  .    proc getDat
a450: 61 62 61 73 65 44 69 72 65 63 74 6f 72 79 20 7b  abaseDirectory {
a460: 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
a470: 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73      # NOTE: This
a480: 20 70 72 6f 63 65 64 75 72 65 20 72 65 74 75 72   procedure retur
a490: 6e 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  ns the directory
a4a0: 20 77 68 65 72 65 20 74 68 65 20 74 65 73 74 20   where the test 
a4b0: 64 61 74 61 62 61 73 65 73 0d 0a 20 20 20 20 20  databases..     
a4c0: 20 23 20 20 20 20 20 20 20 73 68 6f 75 6c 64 20   #       should 
a4d0: 62 65 20 6c 6f 63 61 74 65 64 2e 20 20 42 79 20  be located.  By 
a4e0: 64 65 66 61 75 6c 74 2c 20 74 68 69 73 20 6a 75  default, this ju
a4f0: 73 74 20 75 73 65 73 20 74 68 65 20 74 65 6d 70  st uses the temp
a500: 6f 72 61 72 79 0d 0a 20 20 20 20 20 20 23 20 20  orary..      #  
a510: 20 20 20 20 20 64 69 72 65 63 74 6f 72 79 20 63       directory c
a520: 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20 74 68  onfigured for th
a530: 69 73 20 73 79 73 74 65 6d 2e 0d 0a 20 20 20 20  is system...    
a540: 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
a550: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 64 61  info exists ::da
a560: 74 61 62 61 73 65 5f 64 69 72 65 63 74 6f 72 79  tabase_directory
a570: 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
a580: 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
a590: 20 24 3a 3a 64 61 74 61 62 61 73 65 5f 64 69 72   $::database_dir
a5a0: 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65  ectory] > 0} the
a5b0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
a5c0: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
a5d0: 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20  The location of 
a5e0: 74 68 65 20 64 61 74 61 62 61 73 65 20 64 69 72  the database dir
a5f0: 65 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20  ectory has been 
a600: 6f 76 65 72 72 69 64 64 65 6e 3b 0d 0a 20 20 20  overridden;..   
a610: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
a620: 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74 2e 0d  refore, use it..
a630: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
a640: 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 64 61      return $::da
a650: 74 61 62 61 73 65 5f 64 69 72 65 63 74 6f 72 79  tabase_directory
a660: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66  ..      } elseif
a670: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
a680: 3a 73 63 72 61 74 63 68 5f 64 69 72 65 63 74 6f  :scratch_directo
a690: 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  ry] && \..      
a6a0: 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67      [string leng
a6b0: 74 68 20 24 3a 3a 73 63 72 61 74 63 68 5f 64 69  th $::scratch_di
a6c0: 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68  rectory] > 0} th
a6d0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
a6e0: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
a6f0: 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66   The location of
a700: 20 74 68 65 20 73 63 72 61 74 63 68 20 64 69 72   the scratch dir
a710: 65 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20  ectory has been 
a720: 6f 76 65 72 72 69 64 64 65 6e 3b 0d 0a 20 20 20  overridden;..   
a730: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
a740: 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74 2e 0d  refore, use it..
a750: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
a760: 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 73 63      return $::sc
a770: 72 61 74 63 68 5f 64 69 72 65 63 74 6f 72 79 0d  ratch_directory.
a780: 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
a790: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
a7a0: 5b 67 65 74 54 65 6d 70 6f 72 61 72 79 50 61 74  [getTemporaryPat
a7b0: 68 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  h]..      }..   
a7c0: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
a7d0: 67 65 74 54 65 6d 70 6f 72 61 72 79 44 69 72 65  getTemporaryDire
a7e0: 63 74 6f 72 79 20 7b 7d 20 7b 0d 0a 20 20 20 20  ctory {} {..    
a7f0: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
a800: 45 3a 20 54 68 69 73 20 70 72 6f 63 65 64 75 72  E: This procedur
a810: 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 64 69  e returns the di
a820: 72 65 63 74 6f 72 79 20 77 68 65 72 65 20 74 68  rectory where th
a830: 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  e temporary file
a840: 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  s..      #      
a850: 20 73 68 6f 75 6c 64 20 62 65 20 6c 6f 63 61 74   should be locat
a860: 65 64 2e 20 20 42 79 20 64 65 66 61 75 6c 74 2c  ed.  By default,
a870: 20 74 68 69 73 20 6a 75 73 74 20 75 73 65 73 20   this just uses 
a880: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0d 0a 20  the temporary.. 
a890: 20 20 20 20 20 23 20 20 20 20 20 20 20 64 69 72       #       dir
a8a0: 65 63 74 6f 72 79 20 63 6f 6e 66 69 67 75 72 65  ectory configure
a8b0: 64 20 66 6f 72 20 74 68 69 73 20 73 79 73 74 65  d for this syste
a8c0: 6d 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  m...      #..   
a8d0: 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69     if {[info exi
a8e0: 73 74 73 20 3a 3a 74 65 6d 70 6f 72 61 72 79 5f  sts ::temporary_
a8f0: 64 69 72 65 63 74 6f 72 79 5d 20 26 26 20 5c 0d  directory] && \.
a900: 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69  .          [stri
a910: 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 74 65 6d  ng length $::tem
a920: 70 6f 72 61 72 79 5f 64 69 72 65 63 74 6f 72 79  porary_directory
a930: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
a940: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
a950: 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c 6f    # NOTE: The lo
a960: 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 65  cation of the te
a970: 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72  mporary director
a980: 79 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72  y has been overr
a990: 69 64 64 65 6e 3b 0d 0a 20 20 20 20 20 20 20 20  idden;..        
a9a0: 23 20 20 20 20 20 20 20 74 68 65 72 65 66 6f 72  #       therefor
a9b0: 65 2c 20 75 73 65 20 69 74 2e 0d 0a 20 20 20 20  e, use it...    
a9c0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
a9d0: 65 74 75 72 6e 20 24 3a 3a 74 65 6d 70 6f 72 61  eturn $::tempora
a9e0: 72 79 5f 64 69 72 65 63 74 6f 72 79 0d 0a 20 20  ry_directory..  
a9f0: 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69      } elseif {[i
aa00: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 73 63 72  nfo exists ::scr
aa10: 61 74 63 68 5f 64 69 72 65 63 74 6f 72 79 5d 20  atch_directory] 
aa20: 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
aa30: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
aa40: 3a 3a 73 63 72 61 74 63 68 5f 64 69 72 65 63 74  ::scratch_direct
aa50: 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ory] > 0} then {
aa60: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
aa70: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65       # NOTE: The
aa80: 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65   location of the
aa90: 20 73 63 72 61 74 63 68 20 64 69 72 65 63 74 6f   scratch directo
aaa0: 72 79 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72  ry has been over
aab0: 72 69 64 64 65 6e 3b 0d 0a 20 20 20 20 20 20 20  ridden;..       
aac0: 20 23 20 20 20 20 20 20 20 74 68 65 72 65 66 6f   #       therefo
aad0: 72 65 2c 20 75 73 65 20 69 74 2e 0d 0a 20 20 20  re, use it...   
aae0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
aaf0: 72 65 74 75 72 6e 20 24 3a 3a 73 63 72 61 74 63  return $::scratc
ab00: 68 5f 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20  h_directory..   
ab10: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
ab20: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 67 65 74       return [get
ab30: 54 65 6d 70 6f 72 61 72 79 50 61 74 68 5d 0d 0a  TemporaryPath]..
ab40: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
ab50: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 45  ...    proc getE
ab60: 78 65 63 75 74 65 4f 6e 53 65 74 75 70 20 7b 7d  xecuteOnSetup {}
ab70: 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69   {..      if {[i
ab80: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 65 78 65  nfo exists ::exe
ab90: 63 75 74 65 5f 6f 6e 5f 73 65 74 75 70 5d 20 26  cute_on_setup] &
aba0: 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b  & \..          [
abb0: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a  string length $:
abc0: 3a 65 78 65 63 75 74 65 5f 6f 6e 5f 73 65 74 75  :execute_on_setu
abd0: 70 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  p] > 0} then {..
abe0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
abf0: 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 74 75 72     # NOTE: Retur
ac00: 6e 20 74 68 65 20 63 6f 6e 66 69 67 75 72 65 64  n the configured
ac10: 20 53 51 4c 20 74 6f 20 65 78 65 63 75 74 65 20   SQL to execute 
ac20: 64 75 72 69 6e 67 20 74 68 65 20 63 6f 6e 6e 65  during the conne
ac30: 63 74 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20 23  ction..        #
ac40: 20 20 20 20 20 20 20 73 65 74 75 70 20 70 72 6f         setup pro
ac50: 63 65 64 75 72 65 20 28 69 2e 65 2e 20 66 6f 72  cedure (i.e. for
ac60: 20 65 76 65 72 79 20 74 65 73 74 20 64 61 74 61   every test data
ac70: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 29  base connection)
ac80: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
ac90: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a        return $::
aca0: 65 78 65 63 75 74 65 5f 6f 6e 5f 73 65 74 75 70  execute_on_setup
acb0: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
acc0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
acd0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 79 20       # NOTE: By 
ace0: 64 65 66 61 75 6c 74 2c 20 74 68 65 72 65 20 69  default, there i
acf0: 73 20 6e 6f 20 53 51 4c 20 74 6f 20 65 78 65 63  s no SQL to exec
ad00: 75 74 65 20 64 75 72 69 6e 67 20 74 68 65 20 63  ute during the c
ad10: 6f 6e 6e 65 63 74 69 6f 6e 0d 0a 20 20 20 20 20  onnection..     
ad20: 20 20 20 23 20 20 20 20 20 20 20 73 65 74 75 70     #       setup
ad30: 20 70 72 6f 63 65 64 75 72 65 20 28 69 2e 65 2e   procedure (i.e.
ad40: 20 66 6f 72 20 65 76 65 72 79 20 74 65 73 74 20   for every test 
ad50: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
ad60: 69 6f 6e 29 2e 0d 0a 20 20 20 20 20 20 20 20 23  ion)...        #
ad70: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
ad80: 20 22 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20   ""..      }..  
ad90: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
ada0: 20 67 65 74 53 74 72 69 6e 67 4d 61 70 46 6f 72   getStringMapFor
adb0: 54 63 6c 45 73 63 61 70 65 20 7b 7d 20 7b 0d 0a  TclEscape {} {..
adc0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6c 69        return [li
add0: 73 74 20 5c 5c 20 5c 5c 5c 5c 20 5c 5b 20 5c 5c  st \\ \\\\ \[ \\
ade0: 5c 5b 20 5c 5d 20 5c 5c 5c 5d 20 5c 24 20 5c 5c  \[ \] \\\] \$ \\
adf0: 5c 24 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20  \$]..    }..... 
ae00: 20 20 20 70 72 6f 63 20 67 65 74 54 65 73 74 4f     proc getTestO
ae10: 76 65 72 72 69 64 65 73 50 72 65 61 6d 62 6c 65  verridesPreamble
ae20: 20 7b 20 7b 65 78 74 72 61 56 61 72 4e 61 6d 65   { {extraVarName
ae30: 73 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  s ""} } {..     
ae40: 20 73 65 74 20 76 61 72 4e 61 6d 65 73 20 5b 6c   set varNames [l
ae50: 69 73 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d  ist]....      #.
ae60: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49  .      # NOTE: I
ae70: 66 20 61 76 61 69 6c 61 62 6c 65 2c 20 73 74 61  f available, sta
ae80: 72 74 20 77 69 74 68 20 74 68 65 20 6d 61 73 74  rt with the mast
ae90: 65 72 20 6c 69 73 74 20 6f 66 20 74 65 73 74 20  er list of test 
aea0: 6f 76 65 72 72 69 64 65 0d 0a 20 20 20 20 20 20  override..      
aeb0: 23 20 20 20 20 20 20 20 76 61 72 69 61 62 6c 65  #       variable
aec0: 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  s...      #..   
aed0: 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69     if {[info exi
aee0: 73 74 73 20 3a 3a 74 65 73 74 5f 6f 76 65 72 72  sts ::test_overr
aef0: 69 64 65 73 5d 20 26 26 20 5c 0d 0a 20 20 20 20  ides] && \..    
af00: 20 20 20 20 20 20 5b 6c 6c 65 6e 67 74 68 20 24        [llength $
af10: 3a 3a 74 65 73 74 5f 6f 76 65 72 72 69 64 65 73  ::test_overrides
af20: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
af30: 20 20 20 20 20 20 20 65 76 61 6c 20 6c 61 70 70         eval lapp
af40: 65 6e 64 20 76 61 72 4e 61 6d 65 73 20 24 3a 3a  end varNames $::
af50: 74 65 73 74 5f 6f 76 65 72 72 69 64 65 73 0d 0a  test_overrides..
af60: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
af70: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
af80: 3a 20 49 66 20 72 65 71 75 65 73 74 65 64 20 62  : If requested b
af90: 79 20 6f 75 72 20 63 61 6c 6c 65 72 2c 20 61 64  y our caller, ad
afa0: 64 20 61 6e 79 20 61 64 64 69 74 69 6f 6e 61 6c  d any additional
afb0: 20 76 61 72 69 61 62 6c 65 0d 0a 20 20 20 20 20   variable..     
afc0: 20 23 20 20 20 20 20 20 20 6e 61 6d 65 73 20 74   #       names t
afd0: 6f 20 63 6f 70 79 20 6e 6f 77 2e 0d 0a 20 20 20  o copy now...   
afe0: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
aff0: 5b 6c 6c 65 6e 67 74 68 20 24 65 78 74 72 61 56  [llength $extraV
b000: 61 72 4e 61 6d 65 73 5d 20 3e 20 30 7d 20 74 68  arNames] > 0} th
b010: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 65 76  en {..        ev
b020: 61 6c 20 6c 61 70 70 65 6e 64 20 76 61 72 4e 61  al lappend varNa
b030: 6d 65 73 20 24 65 78 74 72 61 56 61 72 4e 61 6d  mes $extraVarNam
b040: 65 73 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  es..      }.... 
b050: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
b060: 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74 68 65 20  NOTE: Build the 
b070: 73 63 72 69 70 74 20 66 72 61 67 6d 65 6e 74 20  script fragment 
b080: 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 62  to be returned b
b090: 79 20 70 72 6f 63 65 73 73 69 6e 67 20 65 61 63  y processing eac
b0a0: 68 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  h..      #      
b0b0: 20 76 61 72 69 61 62 6c 65 20 6e 61 6d 65 20 61   variable name a
b0c0: 6e 64 20 61 64 64 69 6e 67 20 74 68 65 20 6e 65  nd adding the ne
b0d0: 63 65 63 65 73 73 61 72 79 20 73 63 72 69 70 74  cecessary script
b0e0: 20 66 72 61 67 6d 65 6e 74 73 20 66 6f 72 0d 0a   fragments for..
b0f0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 65 61        #       ea
b100: 63 68 20 6f 6e 65 2e 0d 0a 20 20 20 20 20 20 23  ch one...      #
b110: 0d 0a 20 20 20 20 20 20 73 65 74 20 72 65 73 75  ..      set resu
b120: 6c 74 20 22 22 0d 0a 0d 0a 20 20 20 20 20 20 66  lt ""....      f
b130: 6f 72 65 61 63 68 20 76 61 72 4e 61 6d 65 20 24  oreach varName $
b140: 76 61 72 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20  varNames {..    
b150: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
b160: 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74 68 65   NOTE: Build the
b170: 20 71 75 61 6c 69 66 69 65 64 20 67 6c 6f 62 61   qualified globa
b180: 6c 20 76 61 72 69 61 62 6c 65 20 6e 61 6d 65 2e  l variable name.
b190: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
b1a0: 20 20 20 20 20 73 65 74 20 66 75 6c 6c 56 61 72       set fullVar
b1b0: 4e 61 6d 65 20 5b 61 70 70 65 6e 64 41 72 67 73  Name [appendArgs
b1c0: 20 3a 3a 20 24 76 61 72 4e 61 6d 65 5d 0d 0a 0d   :: $varName]...
b1d0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
b1e0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 44 6f 65 73      # NOTE: Does
b1f0: 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 65 78   the variable ex
b200: 69 73 74 20 69 6e 20 74 68 69 73 20 69 6e 74 65  ist in this inte
b210: 72 70 72 65 74 65 72 20 63 6f 6e 74 65 78 74 3f  rpreter context?
b220: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
b230: 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65       if {[info e
b240: 78 69 73 74 73 20 24 66 75 6c 6c 56 61 72 4e 61  xists $fullVarNa
b250: 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  me]} then {..   
b260: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
b270: 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 70 70 65      # NOTE: Appe
b280: 6e 64 20 61 20 73 63 72 69 70 74 20 66 72 61 67  nd a script frag
b290: 6d 65 6e 74 20 74 6f 20 74 68 65 20 72 65 73 75  ment to the resu
b2a0: 6c 74 20 74 68 61 74 20 77 69 6c 6c 20 63 6f 72  lt that will cor
b2b0: 72 65 63 74 6c 79 0d 0a 20 20 20 20 20 20 20 20  rectly..        
b2c0: 20 20 23 20 20 20 20 20 20 20 63 6f 70 79 20 61    #       copy a
b2d0: 6e 79 20 63 6f 6e 74 61 69 6e 65 64 20 76 61 6c  ny contained val
b2e0: 75 65 20 74 6f 20 61 6e 6f 74 68 65 72 20 69 6e  ue to another in
b2f0: 74 65 72 70 72 65 74 65 72 20 63 6f 6e 74 65 78  terpreter contex
b300: 74 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  t...          #.
b310: 0a 20 20 20 20 20 20 20 20 20 20 61 70 70 65 6e  .          appen
b320: 64 20 72 65 73 75 6c 74 20 5c 6e 20 22 73 65 74  d result \n "set
b330: 20 22 20 24 66 75 6c 6c 56 61 72 4e 61 6d 65 20   " $fullVarName 
b340: 22 20 5c 7b 22 20 5b 73 74 72 69 6e 67 20 6d 61  " \{" [string ma
b350: 70 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  p \..           
b360: 20 20 20 5b 67 65 74 53 74 72 69 6e 67 4d 61 70     [getStringMap
b370: 46 6f 72 54 63 6c 45 73 63 61 70 65 5d 20 5b 73  ForTclEscape] [s
b380: 65 74 20 24 66 75 6c 6c 56 61 72 4e 61 6d 65 5d  et $fullVarName]
b390: 5d 20 5c 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d  ] \}..        }.
b3a0: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
b3b0: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
b3c0: 45 3a 20 49 66 20 74 68 65 20 72 65 73 75 6c 74  E: If the result
b3d0: 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72   contains one or
b3e0: 20 6d 6f 72 65 20 73 63 72 69 70 74 20 66 72 61   more script fra
b3f0: 67 6d 65 6e 74 73 2c 20 61 70 70 65 6e 64 20 61  gments, append a
b400: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
b410: 6e 65 77 6c 69 6e 65 2e 0d 0a 20 20 20 20 20 20  newline...      
b420: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74  #..      if {[st
b430: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 72 65 73  ring length $res
b440: 75 6c 74 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ult] > 0} then {
b450: 0d 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64  ..        append
b460: 20 72 65 73 75 6c 74 20 5c 6e 0d 0a 20 20 20 20   result \n..    
b470: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74    }....      ret
b480: 75 72 6e 20 24 72 65 73 75 6c 74 0d 0a 20 20 20  urn $result..   
b490: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
b4a0: 6d 6f 76 65 53 79 73 74 65 6d 44 61 74 61 53 51  moveSystemDataSQ
b4b0: 4c 69 74 65 44 6c 6c 43 6f 6e 66 69 67 20 7b 20  LiteDllConfig { 
b4c0: 7b 72 65 73 74 6f 72 65 20 66 61 6c 73 65 7d 20  {restore false} 
b4d0: 7b 76 65 72 62 6f 73 65 20 74 72 75 65 7d 20 7d  {verbose true} }
b4e0: 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 64 69   {..      set di
b4f0: 72 65 63 74 6f 72 79 20 5b 67 65 74 42 69 6e 61  rectory [getBina
b500: 72 79 44 69 72 65 63 74 6f 72 79 5d 0d 0a 0d 0a  ryDirectory]....
b510: 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
b520: 67 20 6c 65 6e 67 74 68 20 24 64 69 72 65 63 74  g length $direct
b530: 6f 72 79 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ory] == 0} then 
b540: 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 24  {..        if {$
b550: 76 65 72 62 6f 73 65 7d 20 74 68 65 6e 20 7b 0d  verbose} then {.
b560: 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
b570: 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
b580: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
b590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
b5a0: 2d 2d 2d 20 73 6b 69 70 70 65 64 20 6d 6f 76 69  --- skipped movi
b5b0: 6e 67 20 5c 22 53 79 73 74 65 6d 2e 44 61 74 61  ng \"System.Data
b5c0: 2e 53 51 4c 69 74 65 2e 64 6c 6c 2e 63 6f 6e 66  .SQLite.dll.conf
b5d0: 69 67 5c 22 2c 20 22 20 5c 0d 0a 20 20 20 20 20  ig\", " \..     
b5e0: 20 20 20 20 20 20 20 20 20 22 6e 6f 20 62 69 6e           "no bin
b5f0: 61 72 79 20 64 69 72 65 63 74 6f 72 79 5c 6e 22  ary directory\n"
b600: 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  ]..        }....
b610: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 0d 0a          return..
b620: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
b630: 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 28 31 29   set fileName(1)
b640: 20 5b 66 69 6c 65 20 6e 6f 72 6d 61 6c 69 7a 65   [file normalize
b650: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 66   \..          [f
b660: 69 6c 65 20 6a 6f 69 6e 20 24 64 69 72 65 63 74  ile join $direct
b670: 6f 72 79 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  ory System.Data.
b680: 53 51 4c 69 74 65 2e 64 6c 6c 2e 63 6f 6e 66 69  SQLite.dll.confi
b690: 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 73 65 74  g]]....      set
b6a0: 20 66 69 6c 65 4e 61 6d 65 28 32 29 20 5b 61 70   fileName(2) [ap
b6b0: 70 65 6e 64 41 72 67 73 20 24 66 69 6c 65 4e 61  pendArgs $fileNa
b6c0: 6d 65 28 31 29 20 2e 6d 6f 76 65 64 5d 0d 0a 0d  me(1) .moved]...
b6d0: 0a 20 20 20 20 20 20 69 66 20 7b 24 72 65 73 74  .      if {$rest
b6e0: 6f 72 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ore} then {..   
b6f0: 20 20 20 20 20 69 66 20 7b 5b 66 69 6c 65 20 65       if {[file e
b700: 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 28  xists $fileName(
b710: 32 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  2)]} then {..   
b720: 20 20 20 20 20 20 20 66 69 6c 65 20 72 65 6e 61         file rena
b730: 6d 65 20 24 66 69 6c 65 4e 61 6d 65 28 32 29 20  me $fileName(2) 
b740: 24 66 69 6c 65 4e 61 6d 65 28 31 29 0d 0a 0d 0a  $fileName(1)....
b750: 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 24 76            if {$v
b760: 65 72 62 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a  erbose} then {..
b770: 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
b780: 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
b790: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
b7a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b7b0: 20 22 2d 2d 2d 2d 20 6d 6f 76 65 64 20 5c 22 22   "---- moved \""
b7c0: 20 24 66 69 6c 65 4e 61 6d 65 28 32 29 20 22 5c   $fileName(2) "\
b7d0: 22 20 74 6f 20 5c 22 22 20 5c 0d 0a 20 20 20 20  " to \"" \..    
b7e0: 20 20 20 20 20 20 20 20 20 20 20 20 24 66 69 6c              $fil
b7f0: 65 4e 61 6d 65 28 31 29 20 5c 22 5c 6e 5d 0d 0a  eName(1) \"\n]..
b800: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
b810: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
b820: 20 20 20 20 20 20 20 20 20 69 66 20 7b 24 76 65           if {$ve
b830: 72 62 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20  rbose} then {.. 
b840: 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
b850: 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
b860: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
b870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b880: 22 2d 2d 2d 2d 20 73 6b 69 70 70 65 64 20 6d 6f  "---- skipped mo
b890: 76 69 6e 67 20 5c 22 22 20 24 66 69 6c 65 4e 61  ving \"" $fileNa
b8a0: 6d 65 28 32 29 20 5c 0d 0a 20 20 20 20 20 20 20  me(2) \..       
b8b0: 20 20 20 20 20 20 20 20 20 22 5c 22 2c 20 69 74           "\", it
b8c0: 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 5c   does not exist\
b8d0: 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  n"]..          }
b8e0: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
b8f0: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
b900: 20 20 20 20 20 69 66 20 7b 5b 66 69 6c 65 20 65       if {[file e
b910: 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 28  xists $fileName(
b920: 31 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  1)]} then {..   
b930: 20 20 20 20 20 20 20 66 69 6c 65 20 72 65 6e 61         file rena
b940: 6d 65 20 24 66 69 6c 65 4e 61 6d 65 28 31 29 20  me $fileName(1) 
b950: 24 66 69 6c 65 4e 61 6d 65 28 32 29 0d 0a 0d 0a  $fileName(2)....
b960: 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 24 76            if {$v
b970: 65 72 62 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a  erbose} then {..
b980: 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
b990: 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
b9a0: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
b9b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b9c0: 20 22 2d 2d 2d 2d 20 6d 6f 76 65 64 20 5c 22 22   "---- moved \""
b9d0: 20 24 66 69 6c 65 4e 61 6d 65 28 31 29 20 22 5c   $fileName(1) "\
b9e0: 22 20 74 6f 20 5c 22 22 20 5c 0d 0a 20 20 20 20  " to \"" \..    
b9f0: 20 20 20 20 20 20 20 20 20 20 20 20 24 66 69 6c              $fil
ba00: 65 4e 61 6d 65 28 32 29 20 5c 22 5c 6e 5d 0d 0a  eName(2) \"\n]..
ba10: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
ba20: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
ba30: 20 20 20 20 20 20 20 20 20 69 66 20 7b 24 76 65           if {$ve
ba40: 72 62 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20  rbose} then {.. 
ba50: 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
ba60: 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
ba70: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
ba80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba90: 22 2d 2d 2d 2d 20 73 6b 69 70 70 65 64 20 6d 6f  "---- skipped mo
baa0: 76 69 6e 67 20 5c 22 22 20 24 66 69 6c 65 4e 61  ving \"" $fileNa
bab0: 6d 65 28 31 29 20 5c 0d 0a 20 20 20 20 20 20 20  me(1) \..       
bac0: 20 20 20 20 20 20 20 20 20 22 5c 22 2c 20 69 74           "\", it
bad0: 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 5c   does not exist\
bae0: 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  n"]..          }
baf0: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
bb00: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
bb10: 20 20 20 20 70 72 6f 63 20 77 72 69 74 65 53 79      proc writeSy
bb20: 73 74 65 6d 44 61 74 61 53 51 4c 69 74 65 44 6c  stemDataSQLiteDl
bb30: 6c 43 6f 6e 66 69 67 20 7b 20 64 61 74 61 20 7b  lConfig { data {
bb40: 76 65 72 62 6f 73 65 20 74 72 75 65 7d 20 7d 20  verbose true} } 
bb50: 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 64 69 72  {..      set dir
bb60: 65 63 74 6f 72 79 20 5b 67 65 74 42 69 6e 61 72  ectory [getBinar
bb70: 79 44 69 72 65 63 74 6f 72 79 5d 0d 0a 0d 0a 20  yDirectory].... 
bb80: 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
bb90: 20 6c 65 6e 67 74 68 20 24 64 69 72 65 63 74 6f   length $directo
bba0: 72 79 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  ry] == 0} then {
bbb0: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 24 76  ..        if {$v
bbc0: 65 72 62 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a  erbose} then {..
bbd0: 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
bbe0: 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
bbf0: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
bc00: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
bc10: 2d 2d 20 73 6b 69 70 70 65 64 20 6d 6f 76 69 6e  -- skipped movin
bc20: 67 20 5c 22 53 79 73 74 65 6d 2e 44 61 74 61 2e  g \"System.Data.
bc30: 53 51 4c 69 74 65 2e 64 6c 6c 2e 63 6f 6e 66 69  SQLite.dll.confi
bc40: 67 5c 22 2c 20 22 20 5c 0d 0a 20 20 20 20 20 20  g\", " \..      
bc50: 20 20 20 20 20 20 20 20 22 6e 6f 20 62 69 6e 61          "no bina
bc60: 72 79 20 64 69 72 65 63 74 6f 72 79 5c 6e 22 5d  ry directory\n"]
bc70: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
bc80: 20 20 20 20 20 20 20 72 65 74 75 72 6e 0d 0a 20         return.. 
bc90: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
bca0: 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69  set fileName [fi
bcb0: 6c 65 20 6e 6f 72 6d 61 6c 69 7a 65 20 5c 0d 0a  le normalize \..
bcc0: 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20            [file 
bcd0: 6a 6f 69 6e 20 24 64 69 72 65 63 74 6f 72 79 20  join $directory 
bce0: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
bcf0: 74 65 2e 64 6c 6c 2e 63 6f 6e 66 69 67 5d 5d 0d  te.dll.config]].
bd00: 0a 0d 0a 20 20 20 20 20 20 77 72 69 74 65 46 69  ...      writeFi
bd10: 6c 65 20 24 66 69 6c 65 4e 61 6d 65 20 24 64 61  le $fileName $da
bd20: 74 61 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b  ta....      if {
bd30: 24 76 65 72 62 6f 73 65 7d 20 74 68 65 6e 20 7b  $verbose} then {
bd40: 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
bd50: 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
bd60: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  \..            "
bd70: 2d 2d 2d 2d 20 77 72 6f 74 65 20 5c 22 53 79 73  ---- wrote \"Sys
bd80: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
bd90: 64 6c 6c 2e 63 6f 6e 66 69 67 5c 22 5c 6e 22 0d  dll.config\"\n".
bda0: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
bdb0: 20 20 72 65 74 75 72 6e 20 24 66 69 6c 65 4e 61    return $fileNa
bdc0: 6d 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  me..    }.....  
bdd0: 20 20 70 72 6f 63 20 6d 6f 76 65 45 61 67 6c 65    proc moveEagle
bde0: 53 68 65 6c 6c 4d 64 61 43 6f 6e 66 69 67 20 7b  ShellMdaConfig {
bdf0: 20 7b 72 65 73 74 6f 72 65 20 66 61 6c 73 65 7d   {restore false}
be00: 20 7b 76 65 72 62 6f 73 65 20 74 72 75 65 7d 20   {verbose true} 
be10: 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 64  } {..      set d
be20: 69 72 65 63 74 6f 72 79 20 5b 67 65 74 42 69 6e  irectory [getBin
be30: 61 72 79 44 69 72 65 63 74 6f 72 79 5d 0d 0a 0d  aryDirectory]...
be40: 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69  .      if {[stri
be50: 6e 67 20 6c 65 6e 67 74 68 20 24 64 69 72 65 63  ng length $direc
be60: 74 6f 72 79 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  tory] == 0} then
be70: 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   {..        if {
be80: 24 76 65 72 62 6f 73 65 7d 20 74 68 65 6e 20 7b  $verbose} then {
be90: 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74  ..          tput
bea0: 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
beb0: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
bec0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
bed0: 2d 2d 2d 2d 20 73 6b 69 70 70 65 64 20 6d 6f 76  ---- skipped mov
bee0: 69 6e 67 20 5c 22 45 61 67 6c 65 53 68 65 6c 6c  ing \"EagleShell
bef0: 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e 66 69 67 5c  .exe.mda.config\
bf00: 22 2c 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20  ", " \..        
bf10: 20 20 20 20 20 20 22 6e 6f 20 62 69 6e 61 72 79        "no binary
bf20: 20 64 69 72 65 63 74 6f 72 79 5c 6e 22 5d 0d 0a   directory\n"]..
bf30: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
bf40: 20 20 20 20 20 72 65 74 75 72 6e 0d 0a 20 20 20       return..   
bf50: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 73 65     }....      se
bf60: 74 20 66 69 6c 65 4e 61 6d 65 28 31 29 20 5b 66  t fileName(1) [f
bf70: 69 6c 65 20 6e 6f 72 6d 61 6c 69 7a 65 20 5c 0d  ile normalize \.
bf80: 0a 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65  .          [file
bf90: 20 6a 6f 69 6e 20 24 64 69 72 65 63 74 6f 72 79   join $directory
bfa0: 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65 2e   EagleShell.exe.
bfb0: 6d 64 61 2e 63 6f 6e 66 69 67 5d 5d 0d 0a 0d 0a  mda.config]]....
bfc0: 20 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61        set fileNa
bfd0: 6d 65 28 32 29 20 5b 61 70 70 65 6e 64 41 72 67  me(2) [appendArg
bfe0: 73 20 24 66 69 6c 65 4e 61 6d 65 28 31 29 20 2e  s $fileName(1) .
bff0: 6d 6f 76 65 64 5d 0d 0a 0d 0a 20 20 20 20 20 20  moved]....      
c000: 69 66 20 7b 24 72 65 73 74 6f 72 65 7d 20 74 68  if {$restore} th
c010: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66  en {..        if
c020: 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24   {[file exists $
c030: 66 69 6c 65 4e 61 6d 65 28 32 29 5d 7d 20 74 68  fileName(2)]} th
c040: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
c050: 66 69 6c 65 20 72 65 6e 61 6d 65 20 24 66 69 6c  file rename $fil
c060: 65 4e 61 6d 65 28 32 29 20 24 66 69 6c 65 4e 61  eName(2) $fileNa
c070: 6d 65 28 31 29 0d 0a 0d 0a 20 20 20 20 20 20 20  me(1)....       
c080: 20 20 20 69 66 20 7b 24 76 65 72 62 6f 73 65 7d     if {$verbose}
c090: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
c0a0: 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
c0b0: 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
c0c0: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
c0d0: 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
c0e0: 6d 6f 76 65 64 20 5c 22 22 20 24 66 69 6c 65 4e  moved \"" $fileN
c0f0: 61 6d 65 28 32 29 20 22 5c 22 20 74 6f 20 5c 22  ame(2) "\" to \"
c100: 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
c110: 20 20 20 20 20 24 66 69 6c 65 4e 61 6d 65 28 31       $fileName(1
c120: 29 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ) \"\n]..       
c130: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20     }..        } 
c140: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
c150: 20 20 69 66 20 7b 24 76 65 72 62 6f 73 65 7d 20    if {$verbose} 
c160: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
c170: 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
c180: 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
c190: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
c1a0: 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73           "---- s
c1b0: 6b 69 70 70 65 64 20 6d 6f 76 69 6e 67 20 5c 22  kipped moving \"
c1c0: 22 20 24 66 69 6c 65 4e 61 6d 65 28 32 29 20 5c  " $fileName(2) \
c1d0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
c1e0: 20 20 22 5c 22 2c 20 69 74 20 64 6f 65 73 20 6e    "\", it does n
c1f0: 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a 20 20  ot exist\n"]..  
c200: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
c210: 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c     }..      } el
c220: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66  se {..        if
c230: 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24   {[file exists $
c240: 66 69 6c 65 4e 61 6d 65 28 31 29 5d 7d 20 74 68  fileName(1)]} th
c250: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
c260: 66 69 6c 65 20 72 65 6e 61 6d 65 20 24 66 69 6c  file rename $fil
c270: 65 4e 61 6d 65 28 31 29 20 24 66 69 6c 65 4e 61  eName(1) $fileNa
c280: 6d 65 28 32 29 0d 0a 0d 0a 20 20 20 20 20 20 20  me(2)....       
c290: 20 20 20 69 66 20 7b 24 76 65 72 62 6f 73 65 7d     if {$verbose}
c2a0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
c2b0: 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
c2c0: 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
c2d0: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
c2e0: 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
c2f0: 6d 6f 76 65 64 20 5c 22 22 20 24 66 69 6c 65 4e  moved \"" $fileN
c300: 61 6d 65 28 31 29 20 22 5c 22 20 74 6f 20 5c 22  ame(1) "\" to \"
c310: 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
c320: 20 20 20 20 20 24 66 69 6c 65 4e 61 6d 65 28 32       $fileName(2
c330: 29 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ) \"\n]..       
c340: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20     }..        } 
c350: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
c360: 20 20 69 66 20 7b 24 76 65 72 62 6f 73 65 7d 20    if {$verbose} 
c370: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
c380: 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
c390: 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
c3a0: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
c3b0: 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73           "---- s
c3c0: 6b 69 70 70 65 64 20 6d 6f 76 69 6e 67 20 5c 22  kipped moving \"
c3d0: 22 20 24 66 69 6c 65 4e 61 6d 65 28 31 29 20 5c  " $fileName(1) \
c3e0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
c3f0: 20 20 22 5c 22 2c 20 69 74 20 64 6f 65 73 20 6e    "\", it does n
c400: 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a 20 20  ot exist\n"]..  
c410: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
c420: 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20     }..      }.. 
c430: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
c440: 63 20 77 72 69 74 65 45 61 67 6c 65 53 68 65 6c  c writeEagleShel
c450: 6c 4d 64 61 43 6f 6e 66 69 67 20 7b 20 64 61 74  lMdaConfig { dat
c460: 61 20 7b 76 65 72 62 6f 73 65 20 74 72 75 65 7d  a {verbose true}
c470: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20   } {..      set 
c480: 64 69 72 65 63 74 6f 72 79 20 5b 67 65 74 42 69  directory [getBi
c490: 6e 61 72 79 44 69 72 65 63 74 6f 72 79 5d 0d 0a  naryDirectory]..
c4a0: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72  ..      if {[str
c4b0: 69 6e 67 20 6c 65 6e 67 74 68 20 24 64 69 72 65  ing length $dire
c4c0: 63 74 6f 72 79 5d 20 3d 3d 20 30 7d 20 74 68 65  ctory] == 0} the
c4d0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20  n {..        if 
c4e0: 7b 24 76 65 72 62 6f 73 65 7d 20 74 68 65 6e 20  {$verbose} then 
c4f0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75  {..          tpu
c500: 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
c510: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
c520: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
c530: 22 2d 2d 2d 2d 20 73 6b 69 70 70 65 64 20 6d 6f  "---- skipped mo
c540: 76 69 6e 67 20 5c 22 45 61 67 6c 65 53 68 65 6c  ving \"EagleShel
c550: 6c 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e 66 69 67  l.exe.mda.config
c560: 5c 22 2c 20 22 20 5c 0d 0a 20 20 20 20 20 20 20  \", " \..       
c570: 20 20 20 20 20 20 20 22 6e 6f 20 62 69 6e 61 72         "no binar
c580: 79 20 64 69 72 65 63 74 6f 72 79 5c 6e 22 5d 0d  y directory\n"].
c590: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
c5a0: 20 20 20 20 20 20 72 65 74 75 72 6e 0d 0a 20 20        return..  
c5b0: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 73      }....      s
c5c0: 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c  et fileName [fil
c5d0: 65 20 6e 6f 72 6d 61 6c 69 7a 65 20 5c 0d 0a 20  e normalize \.. 
c5e0: 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 6a           [file j
c5f0: 6f 69 6e 20 24 64 69 72 65 63 74 6f 72 79 20 45  oin $directory E
c600: 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65 2e 6d 64  agleShell.exe.md
c610: 61 2e 63 6f 6e 66 69 67 5d 5d 0d 0a 0d 0a 20 20  a.config]]....  
c620: 20 20 20 20 77 72 69 74 65 46 69 6c 65 20 24 66      writeFile $f
c630: 69 6c 65 4e 61 6d 65 20 24 64 61 74 61 0d 0a 0d  ileName $data...
c640: 0a 20 20 20 20 20 20 69 66 20 7b 24 76 65 72 62  .      if {$verb
c650: 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ose} then {..   
c660: 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
c670: 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20  st_channel \..  
c680: 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
c690: 77 72 6f 74 65 20 5c 22 45 61 67 6c 65 53 68 65  wrote \"EagleShe
c6a0: 6c 6c 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e 66 69  ll.exe.mda.confi
c6b0: 67 5c 22 5c 6e 22 0d 0a 20 20 20 20 20 20 7d 0d  g\"\n"..      }.
c6c0: 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ...      return 
c6d0: 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 7d  $fileName..    }
c6e0: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65  .....    proc ge
c6f0: 74 41 70 70 44 6f 6d 61 69 6e 50 72 65 61 6d 62  tAppDomainPreamb
c700: 6c 65 20 7b 20 7b 70 72 65 66 69 78 20 22 22 7d  le { {prefix ""}
c710: 20 7b 73 75 66 66 69 78 20 22 22 7d 20 7d 20 7b   {suffix ""} } {
c720: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
c730: 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 70 72   # NOTE: This pr
c740: 6f 63 65 64 75 72 65 20 72 65 74 75 72 6e 73 20  ocedure returns 
c750: 61 20 74 65 73 74 20 73 65 74 75 70 20 73 63 72  a test setup scr
c760: 69 70 74 20 66 72 61 67 6d 65 6e 74 20 73 75 69  ipt fragment sui
c770: 74 61 62 6c 65 20 66 6f 72 0d 0a 20 20 20 20 20  table for..     
c780: 20 23 20 20 20 20 20 20 20 65 76 61 6c 75 61 74   #       evaluat
c790: 69 6f 6e 20 62 79 20 61 6e 20 69 6e 74 65 72 70  ion by an interp
c7a0: 72 65 74 65 72 20 63 72 65 61 74 65 64 20 69 6e  reter created in
c7b0: 20 61 6e 20 69 73 6f 6c 61 74 65 64 20 61 70 70   an isolated app
c7c0: 6c 69 63 61 74 69 6f 6e 0d 0a 20 20 20 20 20 20  lication..      
c7d0: 23 20 20 20 20 20 20 20 64 6f 6d 61 69 6e 2e 20  #       domain. 
c7e0: 20 54 68 65 20 73 63 72 69 70 74 20 66 72 61 67   The script frag
c7f0: 6d 65 6e 74 20 62 65 69 6e 67 20 72 65 74 75 72  ment being retur
c800: 6e 65 64 20 77 69 6c 6c 20 62 65 20 73 75 72 72  ned will be surr
c810: 6f 75 6e 64 65 64 20 62 79 0d 0a 20 20 20 20 20  ounded by..     
c820: 20 23 20 20 20 20 20 20 20 74 68 65 20 70 72 65   #       the pre
c830: 66 69 78 20 61 6e 64 20 73 75 66 66 69 78 20 22  fix and suffix "
c840: 73 63 72 69 70 74 20 66 72 61 67 6d 65 6e 74 73  script fragments
c850: 22 20 73 70 65 63 69 66 69 65 64 20 62 79 20 6f  " specified by o
c860: 75 72 20 63 61 6c 6c 65 72 2c 0d 0a 20 20 20 20  ur caller,..    
c870: 20 20 23 20 20 20 20 20 20 20 69 66 20 61 6e 79    #       if any
c880: 2e 20 20 54 68 65 20 65 6e 74 69 72 65 20 73 63  .  The entire sc
c890: 72 69 70 74 20 62 65 69 6e 67 20 72 65 74 75 72  ript being retur
c8a0: 6e 65 64 20 77 69 6c 6c 20 62 65 20 73 75 62 73  ned will be subs
c8b0: 74 69 74 75 74 65 64 20 76 69 61 0d 0a 20 20 20  tituted via..   
c8c0: 20 20 20 23 20 20 20 20 20 20 20 5b 73 75 62 73     #       [subs
c8d0: 74 5d 2c 20 69 6e 20 74 68 65 20 63 6f 6e 74 65  t], in the conte
c8e0: 78 74 20 6f 66 20 6f 75 72 20 63 61 6c 6c 65 72  xt of our caller
c8f0: 2c 20 62 65 66 6f 72 65 20 62 65 69 6e 67 20 72  , before being r
c900: 65 74 75 72 6e 65 64 2e 0d 0a 20 20 20 20 20 20  eturned...      
c910: 23 20 20 20 20 20 20 20 54 68 69 73 20 73 74 65  #       This ste
c920: 70 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 73  p is necessary s
c930: 6f 20 74 68 61 74 20 73 6f 6d 65 20 6c 69 6d 69  o that some limi
c940: 74 65 64 20 63 6f 6e 74 65 78 74 20 69 6e 66 6f  ted context info
c950: 72 6d 61 74 69 6f 6e 2c 0d 0a 20 20 20 20 20 20  rmation,..      
c960: 23 20 20 20 20 20 20 20 70 72 69 6d 61 72 69 6c  #       primaril
c970: 79 20 72 65 6c 61 74 65 64 20 74 6f 20 74 68 65  y related to the
c980: 20 74 65 73 74 69 6e 67 20 64 69 72 65 63 74 6f   testing directo
c990: 72 69 65 73 2c 20 63 61 6e 20 62 65 20 74 72 61  ries, can be tra
c9a0: 6e 73 66 65 72 72 65 64 0d 0a 20 20 20 20 20 20  nsferred..      
c9b0: 23 20 20 20 20 20 20 20 74 6f 20 74 68 65 20 69  #       to the i
c9c0: 6e 74 65 72 70 72 65 74 65 72 20 69 6e 20 74 68  nterpreter in th
c9d0: 65 20 69 73 6f 6c 61 74 65 64 20 61 70 70 6c 69  e isolated appli
c9e0: 63 61 74 69 6f 6e 20 64 6f 6d 61 69 6e 2c 20 6d  cation domain, m
c9f0: 61 6b 69 6e 67 20 69 74 0d 0a 20 20 20 20 20 20  aking it..      
ca00: 23 20 20 20 20 20 20 20 61 62 6c 65 20 74 6f 20  #       able to 
ca10: 73 75 63 63 65 73 73 66 75 6c 6c 79 20 72 75 6e  successfully run
ca20: 20 74 65 73 74 73 20 74 68 61 74 20 72 65 71 75   tests that requ
ca30: 69 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  ire one or more 
ca40: 6f 66 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20  of the..      # 
ca50: 20 20 20 20 20 20 66 69 6c 65 73 20 69 6e 20 6f        files in o
ca60: 6e 65 20 6f 66 20 74 68 65 20 74 65 73 74 69 6e  ne of the testin
ca70: 67 20 64 69 72 65 63 74 6f 72 69 65 73 2e 20 20  g directories.  
ca80: 43 61 6c 6c 65 72 73 20 73 68 6f 75 6c 64 20 6b  Callers should k
ca90: 65 65 70 20 69 6e 0d 0a 20 20 20 20 20 20 23 20  eep in..      # 
caa0: 20 20 20 20 20 20 6d 69 6e 64 20 74 68 61 74 20        mind that 
cab0: 74 68 65 20 74 65 73 74 20 73 63 72 69 70 74 20  the test script 
cac0: 66 72 61 67 6d 65 6e 74 20 62 65 69 6e 67 20 72  fragment being r
cad0: 65 74 75 72 6e 65 64 20 63 61 6e 6e 6f 74 20 72  eturned cannot r
cae0: 65 6c 79 20 6f 6e 0d 0a 20 20 20 20 20 20 23 20  ely on..      # 
caf0: 20 20 20 20 20 20 61 6e 79 20 73 63 72 69 70 74        any script
cb00: 20 6c 69 62 72 61 72 79 20 70 72 6f 63 65 64 75   library procedu
cb10: 72 65 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74  res that are not
cb20: 20 70 72 6f 76 69 64 65 64 20 62 79 20 74 68 65   provided by the
cb30: 20 45 61 67 6c 65 0d 0a 20 20 20 20 20 20 23 20   Eagle..      # 
cb40: 20 20 20 20 20 20 6c 69 62 72 61 72 79 20 70 61        library pa
cb50: 63 6b 61 67 65 20 28 69 2e 65 2e 20 22 69 6e 69  ckage (i.e. "ini
cb60: 74 2e 65 61 67 6c 65 22 29 2c 20 69 6e 63 6c 75  t.eagle"), inclu
cb70: 64 69 6e 67 20 74 68 6f 73 65 20 70 72 6f 76 69  ding those provi
cb80: 64 65 64 20 62 79 0d 0a 20 20 20 20 20 20 23 20  ded by..      # 
cb90: 20 20 20 20 20 20 74 68 65 20 45 61 67 6c 65 20        the Eagle 
cba0: 74 65 73 74 20 70 61 63 6b 61 67 65 2c 20 75 6e  test package, un
cbb0: 6c 65 73 73 20 74 68 65 20 66 69 6c 65 20 63 6f  less the file co
cbc0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 6d 20 69 73  ntaining them is
cbd0: 20 6c 6f 61 64 65 64 0d 0a 20 20 20 20 20 20 23   loaded..      #
cbe0: 20 20 20 20 20 20 20 6d 61 6e 75 61 6c 6c 79 20         manually 
cbf0: 76 69 61 20 73 6f 6d 65 20 6f 74 68 65 72 20 6d  via some other m
cc00: 65 63 68 61 6e 69 73 6d 20 28 65 2e 67 2e 20 62  echanism (e.g. b
cc10: 79 20 69 6e 63 6c 75 64 69 6e 67 20 61 70 70 72  y including appr
cc20: 6f 70 72 69 61 74 65 0d 0a 20 20 20 20 20 20 23  opriate..      #
cc30: 20 20 20 20 20 20 20 5b 70 61 63 6b 61 67 65 20         [package 
cc40: 72 65 71 75 69 72 65 5d 20 6f 72 20 5b 73 6f 75  require] or [sou
cc50: 72 63 65 5d 20 63 6f 6d 6d 61 6e 64 73 20 69 6e  rce] commands in
cc60: 20 74 68 65 20 70 72 65 66 69 78 20 6f 72 20 73   the prefix or s
cc70: 75 66 66 69 78 0d 0a 20 20 20 20 20 20 23 20 20  uffix..      #  
cc80: 20 20 20 20 20 73 63 72 69 70 74 20 66 72 61 67       script frag
cc90: 6d 65 6e 74 73 29 2e 20 20 41 6c 73 6f 2c 20 61  ments).  Also, a
cca0: 6c 6c 20 76 61 72 69 61 62 6c 65 20 72 65 66 65  ll variable refe
ccb0: 72 65 6e 63 65 73 20 61 6e 64 20 61 6c 6c 20 6e  rences and all n
ccc0: 65 73 74 65 64 0d 0a 20 20 20 20 20 20 23 20 20  ested..      #  
ccd0: 20 20 20 20 20 63 6f 6d 6d 61 6e 64 73 20 28 69       commands (i
cce0: 2e 65 2e 20 74 68 6f 73 65 20 69 6e 20 73 71 75  .e. those in squ
ccf0: 61 72 65 20 62 72 61 63 6b 65 74 73 29 20 63 6f  are brackets) co
cd00: 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 66  ntained in the f
cd10: 69 6e 61 6c 0d 0a 20 20 20 20 20 20 23 20 20 20  inal..      #   
cd20: 20 20 20 20 73 63 72 69 70 74 20 66 72 61 67 6d      script fragm
cd30: 65 6e 74 20 77 69 6c 6c 20 65 6e 64 20 75 70 20  ent will end up 
cd40: 62 65 69 6e 67 20 65 76 61 6c 75 61 74 65 64 20  being evaluated 
cd50: 69 6e 20 74 68 65 20 63 6f 6e 74 65 78 74 20 6f  in the context o
cd60: 66 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20  f the..      #  
cd70: 20 20 20 20 20 63 61 6c 6c 69 6e 67 20 69 6e 74       calling int
cd80: 65 72 70 72 65 74 65 72 20 61 6e 64 20 6e 6f 74  erpreter and not
cd90: 20 74 68 65 20 74 61 72 67 65 74 20 69 6e 74 65   the target inte
cda0: 72 70 72 65 74 65 72 20 63 72 65 61 74 65 64 20  rpreter created 
cdb0: 69 6e 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20  in the..      # 
cdc0: 20 20 20 20 20 20 69 73 6f 6c 61 74 65 64 20 61        isolated a
cdd0: 70 70 6c 69 63 61 74 69 6f 6e 20 64 6f 6d 61 69  pplication domai
cde0: 6e 20 75 6e 6c 65 73 73 20 74 68 65 20 64 6f 6c  n unless the dol
cdf0: 6c 61 72 20 73 69 67 6e 73 20 61 6e 64 2f 6f 72  lar signs and/or
ce00: 20 73 71 75 61 72 65 0d 0a 20 20 20 20 20 20 23   square..      #
ce10: 20 20 20 20 20 20 20 62 72 61 63 6b 65 74 73 20         brackets 
ce20: 61 72 65 20 73 70 65 63 69 61 6c 6c 79 20 71 75  are specially qu
ce30: 6f 74 65 64 20 77 69 74 68 20 62 61 63 6b 73 6c  oted with backsl
ce40: 61 73 68 65 73 2e 0d 0a 20 20 20 20 20 20 23 0d  ashes...      #.
ce50: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 75  .      return [u
ce60: 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74 20 73  plevel 1 [list s
ce70: 75 62 73 74 20 5b 61 70 70 65 6e 64 41 72 67 73  ubst [appendArgs
ce80: 20 24 70 72 65 66 69 78 20 7b 0d 0a 20 20 20 20   $prefix {..    
ce90: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
cea0: 20 4e 4f 54 45 3a 20 54 68 65 20 5c 5b 6f 62 6a   NOTE: The \[obj
ceb0: 65 63 74 5c 5d 20 63 6f 6d 6d 61 6e 64 20 6d 61  ect\] command ma
cec0: 79 20 62 65 20 6d 69 73 73 69 6e 67 20 69 6e 20  y be missing in 
ced0: 73 6f 6d 65 20 45 61 67 6c 65 20 63 6f 72 65 0d  some Eagle core.
cee0: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
cef0: 20 6c 69 62 72 61 72 79 20 63 6f 6e 66 69 67 75   library configu
cf00: 72 61 74 69 6f 6e 73 2e 20 20 43 6c 6f 6e 69 6e  rations.  Clonin
cf10: 67 20 61 6e 64 20 75 73 69 6e 67 20 74 68 65 20  g and using the 
cf20: 70 72 6f 63 65 64 75 72 65 0d 0a 20 20 20 20 20  procedure..     
cf30: 20 20 20 23 20 20 20 20 20 20 20 5c 5b 63 68 61     #       \[cha
cf40: 6e 67 65 4e 61 74 69 76 65 52 75 6e 74 69 6d 65  ngeNativeRuntime
cf50: 4f 70 74 69 6f 6e 5c 5d 20 6d 61 79 20 68 65 6c  Option\] may hel
cf60: 70 20 74 6f 20 6d 69 74 69 67 61 74 65 20 74 68  p to mitigate th
cf70: 69 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  is...        #..
cf80: 20 20 20 20 20 20 20 20 70 72 6f 63 20 63 68 61          proc cha
cf90: 6e 67 65 4e 61 74 69 76 65 52 75 6e 74 69 6d 65  ngeNativeRuntime
cfa0: 4f 70 74 69 6f 6e 20 5c 0d 0a 20 20 20 20 20 20  Option \..      
cfb0: 20 20 20 20 20 20 7b 5b 69 6e 66 6f 20 61 72 67        {[info arg
cfc0: 73 20 63 68 61 6e 67 65 4e 61 74 69 76 65 52 75  s changeNativeRu
cfd0: 6e 74 69 6d 65 4f 70 74 69 6f 6e 5d 7d 20 5c 0d  ntimeOption]} \.
cfe0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 5b 69  .            {[i
cff0: 6e 66 6f 20 62 6f 64 79 20 63 68 61 6e 67 65 4e  nfo body changeN
d000: 61 74 69 76 65 52 75 6e 74 69 6d 65 4f 70 74 69  ativeRuntimeOpti
d010: 6f 6e 5d 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  on]}....        
d020: 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
d030: 20 20 20 63 68 61 6e 67 65 4e 61 74 69 76 65 52     changeNativeR
d040: 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 5b 68 61  untimeOption [ha
d050: 73 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 6e  sRuntimeOption n
d060: 61 74 69 76 65 5d 0d 0a 20 20 20 20 20 20 20 20  ative]..        
d070: 7d 0d 0a 20 20 20 20 20 20 7d 20 5b 67 65 74 54  }..      } [getT
d080: 65 73 74 4f 76 65 72 72 69 64 65 73 50 72 65 61  estOverridesPrea
d090: 6d 62 6c 65 20 5b 6c 69 73 74 20 70 61 74 68 20  mble [list path 
d0a0: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 5d 5d 20 24  test_channel]] $
d0b0: 73 75 66 66 69 78 5d 5d 5d 0d 0a 20 20 20 20 7d  suffix]]]..    }
d0c0: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 74 72  .....    proc tr
d0d0: 79 43 6f 70 79 45 78 74 65 72 6e 61 6c 46 69 6c  yCopyExternalFil
d0e0: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e {..           
d0f0: 20 66 69 6c 65 4e 61 6d 65 20 7b 70 6c 61 74 66   fileName {platf
d100: 6f 72 6d 20 22 22 7d 20 7b 6e 65 77 46 69 6c 65  orm ""} {newFile
d110: 4e 61 6d 65 20 22 22 7d 20 7b 76 65 72 62 6f 73  Name ""} {verbos
d120: 65 20 74 72 75 65 7d 20 7d 20 7b 0d 0a 20 20 20  e true} } {..   
d130: 20 20 20 73 65 74 20 73 6f 75 72 63 65 46 69 6c     set sourceFil
d140: 65 4e 61 6d 65 20 5b 67 65 74 45 78 74 65 72 6e  eName [getExtern
d150: 61 6c 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65  alFileName $file
d160: 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 69  Name]....      i
d170: 66 20 7b 21 5b 66 69 6c 65 20 65 78 69 73 74 73  f {![file exists
d180: 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65   $sourceFileName
d190: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
d1a0: 20 20 20 69 66 20 7b 24 76 65 72 62 6f 73 65 7d     if {$verbose}
d1b0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
d1c0: 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
d1d0: 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
d1e0: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
d1f0: 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6b 69 70        "---- skip
d200: 70 65 64 20 63 6f 70 79 69 6e 67 20 65 78 74 65  ped copying exte
d210: 72 6e 61 6c 20 66 69 6c 65 20 5c 22 22 20 24 73  rnal file \"" $s
d220: 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 5c 0d  ourceFileName \.
d230: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
d240: 5c 22 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20  \", it does not 
d250: 65 78 69 73 74 5c 6e 22 5d 0d 0a 20 20 20 20 20  exist\n"]..     
d260: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
d270: 72 65 74 75 72 6e 0d 0a 20 20 20 20 20 20 7d 0d  return..      }.
d280: 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74  ...      if {[st
d290: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 6e 65 77  ring length $new
d2a0: 46 69 6c 65 4e 61 6d 65 5d 20 3e 20 30 7d 20 74  FileName] > 0} t
d2b0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 73  hen {..        s
d2c0: 65 74 20 74 61 72 67 65 74 46 69 6c 65 4e 61 6d  et targetFileNam
d2d0: 65 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65  e [getBinaryFile
d2e0: 4e 61 6d 65 20 24 6e 65 77 46 69 6c 65 4e 61 6d  Name $newFileNam
d2f0: 65 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a 20 20  e $platform]..  
d300: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
d310: 20 20 20 20 20 20 73 65 74 20 74 61 72 67 65 74        set target
d320: 46 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42 69 6e  FileName [getBin
d330: 61 72 79 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c  aryFileName $fil
d340: 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 5d  eName $platform]
d350: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
d360: 20 20 20 73 65 74 20 74 61 72 67 65 74 44 69 72     set targetDir
d370: 65 63 74 6f 72 79 20 5b 66 69 6c 65 20 64 69 72  ectory [file dir
d380: 6e 61 6d 65 20 24 74 61 72 67 65 74 46 69 6c 65  name $targetFile
d390: 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 69  Name]....      i
d3a0: 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  f {[catch {..   
d3b0: 20 20 20 20 20 69 66 20 7b 21 5b 66 69 6c 65 20       if {![file 
d3c0: 65 78 69 73 74 73 20 24 74 61 72 67 65 74 44 69  exists $targetDi
d3d0: 72 65 63 74 6f 72 79 5d 7d 20 74 68 65 6e 20 7b  rectory]} then {
d3e0: 0d 0a 20 20 20 20 20 20 20 20 20 20 66 69 6c 65  ..          file
d3f0: 20 6d 6b 64 69 72 20 24 74 61 72 67 65 74 44 69   mkdir $targetDi
d400: 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 20  rectory..       
d410: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 66 69   }....        fi
d420: 6c 65 20 63 6f 70 79 20 2d 66 6f 72 63 65 20 24  le copy -force $
d430: 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 24  sourceFileName $
d440: 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 0d 0a  targetFileName..
d450: 20 20 20 20 20 20 7d 5d 20 3d 3d 20 30 7d 20 74        }] == 0} t
d460: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74  hen {..        t
d470: 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
d480: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
d490: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
d4a0: 22 2d 2d 2d 2d 20 63 6f 70 69 65 64 20 65 78 74  "---- copied ext
d4b0: 65 72 6e 61 6c 20 66 69 6c 65 20 66 72 6f 6d 20  ernal file from 
d4c0: 5c 22 22 20 24 73 6f 75 72 63 65 46 69 6c 65 4e  \"" $sourceFileN
d4d0: 61 6d 65 20 22 5c 22 20 74 6f 20 5c 22 22 20 5c  ame "\" to \"" \
d4e0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 24 74  ..            $t
d4f0: 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 20 5c 22  argetFileName \"
d500: 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  \n]..      } els
d510: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75  e {..        tpu
d520: 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
d530: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
d540: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d  ..            "-
d550: 2d 2d 2d 20 66 61 69 6c 65 64 20 74 6f 20 63 6f  --- failed to co
d560: 70 79 20 65 78 74 65 72 6e 61 6c 20 66 69 6c 65  py external file
d570: 20 66 72 6f 6d 20 5c 22 22 20 24 73 6f 75 72 63   from \"" $sourc
d580: 65 46 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20  eFileName \..   
d590: 20 20 20 20 20 20 20 20 20 22 5c 22 20 74 6f 20           "\" to 
d5a0: 5c 22 22 20 24 74 61 72 67 65 74 46 69 6c 65 4e  \"" $targetFileN
d5b0: 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20  ame \"\n]..     
d5c0: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
d5d0: 20 20 70 72 6f 63 20 74 72 79 43 6f 70 79 42 69    proc tryCopyBi
d5e0: 6e 61 72 79 46 69 6c 65 20 7b 0d 0a 20 20 20 20  naryFile {..    
d5f0: 20 20 20 20 20 20 20 20 66 69 6c 65 4e 61 6d 65          fileName
d600: 20 6d 61 6e 61 67 65 64 4f 6e 6c 79 20 7b 70 6c   managedOnly {pl
d610: 61 74 66 6f 72 6d 20 22 22 7d 20 7b 6e 65 77 46  atform ""} {newF
d620: 69 6c 65 4e 61 6d 65 20 22 22 7d 0d 0a 20 20 20  ileName ""}..   
d630: 20 20 20 20 20 20 20 20 20 7b 76 65 72 62 6f 73           {verbos
d640: 65 20 74 72 75 65 7d 20 7d 20 7b 0d 0a 20 20 20  e true} } {..   
d650: 20 20 20 73 65 74 20 73 6f 75 72 63 65 46 69 6c     set sourceFil
d660: 65 4e 61 6d 65 20 5b 67 65 74 42 69 6e 61 72 79  eName [getBinary
d670: 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61  FileName $fileNa
d680: 6d 65 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a 0d  me $platform]...
d690: 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 66 69 6c  .      if {![fil
d6a0: 65 20 65 78 69 73 74 73 20 24 73 6f 75 72 63 65  e exists $source
d6b0: 46 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20  FileName]} then 
d6c0: 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 24  {..        if {$
d6d0: 76 65 72 62 6f 73 65 7d 20 74 68 65 6e 20 7b 0d  verbose} then {.
d6e0: 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
d6f0: 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
d700: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
d710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
d720: 2d 2d 2d 20 73 6b 69 70 70 65 64 20 63 6f 70 79  --- skipped copy
d730: 69 6e 67 20 62 69 6e 61 72 79 20 66 69 6c 65 20  ing binary file 
d740: 5c 22 22 20 24 73 6f 75 72 63 65 46 69 6c 65 4e  \"" $sourceFileN
d750: 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ame \..         
d760: 20 20 20 20 20 22 5c 22 2c 20 69 74 20 64 6f 65       "\", it doe
d770: 73 20 6e 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d  s not exist\n"].
d780: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
d790: 20 20 20 20 20 20 72 65 74 75 72 6e 0d 0a 20 20        return..  
d7a0: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69      }....      i
d7b0: 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  f {[string lengt
d7c0: 68 20 24 6e 65 77 46 69 6c 65 4e 61 6d 65 5d 20  h $newFileName] 
d7d0: 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
d7e0: 20 20 20 20 20 73 65 74 20 74 61 72 67 65 74 46       set targetF
d7f0: 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42 75 69 6c  ileName [getBuil
d800: 64 46 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20  dFileName \..   
d810: 20 20 20 20 20 20 20 20 20 24 6e 65 77 46 69 6c           $newFil
d820: 65 4e 61 6d 65 20 24 6d 61 6e 61 67 65 64 4f 6e  eName $managedOn
d830: 6c 79 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a 20  ly $platform].. 
d840: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
d850: 20 20 20 20 20 20 20 73 65 74 20 74 61 72 67 65         set targe
d860: 74 46 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42 75  tFileName [getBu
d870: 69 6c 64 46 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20  ildFileName \.. 
d880: 20 20 20 20 20 20 20 20 20 20 20 24 66 69 6c 65             $file
d890: 4e 61 6d 65 20 24 6d 61 6e 61 67 65 64 4f 6e 6c  Name $managedOnl
d8a0: 79 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a 20 20  y $platform]..  
d8b0: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 73      }....      s
d8c0: 65 74 20 74 61 72 67 65 74 44 69 72 65 63 74 6f  et targetDirecto
d8d0: 72 79 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65  ry [file dirname
d8e0: 20 24 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65   $targetFileName
d8f0: 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  ]....      if {[
d900: 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
d910: 20 69 66 20 7b 21 5b 66 69 6c 65 20 65 78 69 73   if {![file exis
d920: 74 73 20 24 74 61 72 67 65 74 44 69 72 65 63 74  ts $targetDirect
d930: 6f 72 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ory]} then {..  
d940: 20 20 20 20 20 20 20 20 66 69 6c 65 20 6d 6b 64          file mkd
d950: 69 72 20 24 74 61 72 67 65 74 44 69 72 65 63 74  ir $targetDirect
d960: 6f 72 79 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  ory..        }..
d970: 0d 0a 20 20 20 20 20 20 20 20 66 69 6c 65 20 63  ..        file c
d980: 6f 70 79 20 2d 66 6f 72 63 65 20 24 73 6f 75 72  opy -force $sour
d990: 63 65 46 69 6c 65 4e 61 6d 65 20 24 74 61 72 67  ceFileName $targ
d9a0: 65 74 46 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20  etFileName..    
d9b0: 20 20 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20    }] == 0} then 
d9c0: 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  {..        tputs
d9d0: 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
d9e0: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
d9f0: 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
da00: 2d 20 63 6f 70 69 65 64 20 62 69 6e 61 72 79 20  - copied binary 
da10: 66 69 6c 65 20 66 72 6f 6d 20 5c 22 22 20 24 73  file from \"" $s
da20: 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 22 5c  ourceFileName "\
da30: 22 20 74 6f 20 5c 22 22 20 5c 0d 0a 20 20 20 20  " to \"" \..    
da40: 20 20 20 20 20 20 20 20 24 74 61 72 67 65 74 46          $targetF
da50: 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20  ileName \"\n].. 
da60: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
da70: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
da80: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
da90: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
daa0: 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 61          "---- fa
dab0: 69 6c 65 64 20 74 6f 20 63 6f 70 79 20 62 69 6e  iled to copy bin
dac0: 61 72 79 20 66 69 6c 65 20 66 72 6f 6d 20 5c 22  ary file from \"
dad0: 22 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d  " $sourceFileNam
dae0: 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
daf0: 20 22 5c 22 20 74 6f 20 5c 22 22 20 24 74 61 72   "\" to \"" $tar
db00: 67 65 74 46 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e  getFileName \"\n
db10: 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  ]..      }..    
db20: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 74  }.....    proc t
db30: 72 79 43 6f 70 79 42 75 69 6c 64 46 69 6c 65 20  ryCopyBuildFile 
db40: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  {..            f
db50: 69 6c 65 4e 61 6d 65 20 6d 61 6e 61 67 65 64 4f  ileName managedO
db60: 6e 6c 79 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22  nly {platform ""
db70: 7d 20 7b 6e 65 77 46 69 6c 65 4e 61 6d 65 20 22  } {newFileName "
db80: 22 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  "}..            
db90: 7b 76 65 72 62 6f 73 65 20 74 72 75 65 7d 20 7d  {verbose true} }
dba0: 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 73 6f   {..      set so
dbb0: 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 5b 67 65  urceFileName [ge
dbc0: 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20 24  tBuildFileName $
dbd0: 66 69 6c 65 4e 61 6d 65 20 24 6d 61 6e 61 67 65  fileName $manage
dbe0: 64 4f 6e 6c 79 20 24 70 6c 61 74 66 6f 72 6d 5d  dOnly $platform]
dbf0: 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b  ....      if {![
dc00: 66 69 6c 65 20 65 78 69 73 74 73 20 24 73 6f 75  file exists $sou
dc10: 72 63 65 46 69 6c 65 4e 61 6d 65 5d 7d 20 74 68  rceFileName]} th
dc20: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66  en {..        if
dc30: 20 7b 24 76 65 72 62 6f 73 65 7d 20 74 68 65 6e   {$verbose} then
dc40: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70   {..          tp
dc50: 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
dc60: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
dc70: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
dc80: 20 22 2d 2d 2d 2d 20 73 6b 69 70 70 65 64 20 63   "---- skipped c
dc90: 6f 70 79 69 6e 67 20 62 75 69 6c 64 20 66 69 6c  opying build fil
dca0: 65 20 5c 22 22 20 24 73 6f 75 72 63 65 46 69 6c  e \"" $sourceFil
dcb0: 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20  eName \..       
dcc0: 20 20 20 20 20 20 20 22 5c 22 2c 20 69 74 20 64         "\", it d
dcd0: 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 5c 6e 22  oes not exist\n"
dce0: 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  ]..        }....
dcf0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 0d 0a          return..
dd00: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
dd10: 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
dd20: 67 74 68 20 24 6e 65 77 46 69 6c 65 4e 61 6d 65  gth $newFileName
dd30: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
dd40: 20 20 20 20 20 20 20 73 65 74 20 74 61 72 67 65         set targe
dd50: 74 46 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42 69  tFileName [getBi
dd60: 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 24 6e 65  naryFileName $ne
dd70: 77 46 69 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66  wFileName $platf
dd80: 6f 72 6d 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c  orm]..      } el
dd90: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65  se {..        se
dda0: 74 20 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65  t targetFileName
ddb0: 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e   [getBinaryFileN
ddc0: 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 20 24 70  ame $fileName $p
ddd0: 6c 61 74 66 6f 72 6d 5d 0d 0a 20 20 20 20 20 20  latform]..      
dde0: 7d 0d 0a 0d 0a 20 20 20 20 20 20 73 65 74 20 74  }....      set t
ddf0: 61 72 67 65 74 44 69 72 65 63 74 6f 72 79 20 5b  argetDirectory [
de00: 66 69 6c 65 20 64 69 72 6e 61 6d 65 20 24 74 61  file dirname $ta
de10: 72 67 65 74 46 69 6c 65 4e 61 6d 65 5d 0d 0a 0d  rgetFileName]...
de20: 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63  .      if {[catc
de30: 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20  h {..        if 
de40: 7b 21 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24  {![file exists $
de50: 74 61 72 67 65 74 44 69 72 65 63 74 6f 72 79 5d  targetDirectory]
de60: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
de70: 20 20 20 20 66 69 6c 65 20 6d 6b 64 69 72 20 24      file mkdir $
de80: 74 61 72 67 65 74 44 69 72 65 63 74 6f 72 79 0d  targetDirectory.
de90: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
dea0: 20 20 20 20 20 20 66 69 6c 65 20 63 6f 70 79 20        file copy 
deb0: 2d 66 6f 72 63 65 20 24 73 6f 75 72 63 65 46 69  -force $sourceFi
dec0: 6c 65 4e 61 6d 65 20 24 74 61 72 67 65 74 46 69  leName $targetFi
ded0: 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 7d 5d  leName..      }]
dee0: 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
def0: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
df00: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
df10: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
df20: 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6f          "---- co
df30: 70 69 65 64 20 62 75 69 6c 64 20 66 69 6c 65 20  pied build file 
df40: 66 72 6f 6d 20 5c 22 22 20 24 73 6f 75 72 63 65  from \"" $source
df50: 46 69 6c 65 4e 61 6d 65 20 22 5c 22 20 74 6f 20  FileName "\" to 
df60: 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  \"" \..         
df70: 20 20 20 24 74 61 72 67 65 74 46 69 6c 65 4e 61     $targetFileNa
df80: 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20  me \"\n]..      
df90: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
dfa0: 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
dfb0: 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
dfc0: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
dfd0: 20 20 20 22 2d 2d 2d 2d 20 66 61 69 6c 65 64 20     "---- failed 
dfe0: 74 6f 20 63 6f 70 79 20 62 75 69 6c 64 20 66 69  to copy build fi
dff0: 6c 65 20 66 72 6f 6d 20 5c 22 22 20 24 73 6f 75  le from \"" $sou
e000: 72 63 65 46 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20  rceFileName \.. 
e010: 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 20 74             "\" t
e020: 6f 20 5c 22 22 20 24 74 61 72 67 65 74 46 69 6c  o \"" $targetFil
e030: 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20  eName \"\n]..   
e040: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
e050: 20 20 20 20 70 72 6f 63 20 74 72 79 44 65 6c 65      proc tryDele
e060: 74 65 42 69 6e 61 72 79 46 69 6c 65 20 7b 20 66  teBinaryFile { f
e070: 69 6c 65 4e 61 6d 65 20 7b 70 6c 61 74 66 6f 72  ileName {platfor
e080: 6d 20 22 22 7d 20 7b 76 65 72 62 6f 73 65 20 74  m ""} {verbose t
e090: 72 75 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20  rue} } {..      
e0a0: 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 67 65  set fileName [ge
e0b0: 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20  tBinaryFileName 
e0c0: 24 66 69 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66  $fileName $platf
e0d0: 6f 72 6d 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66  orm]....      if
e0e0: 20 7b 21 5b 66 69 6c 65 20 65 78 69 73 74 73 20   {![file exists 
e0f0: 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e  $fileName]} then
e100: 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   {..        if {
e110: 24 76 65 72 62 6f 73 65 7d 20 74 68 65 6e 20 7b  $verbose} then {
e120: 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74  ..          tput
e130: 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
e140: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
e150: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
e160: 2d 2d 2d 2d 20 73 6b 69 70 70 65 64 20 64 65 6c  ---- skipped del
e170: 65 74 69 6e 67 20 62 69 6e 61 72 79 20 66 69 6c  eting binary fil
e180: 65 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 20  e \"" $fileName 
e190: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
e1a0: 20 22 5c 22 2c 20 69 74 20 64 6f 65 73 20 6e 6f   "\", it does no
e1b0: 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a 20 20 20  t exist\n"]..   
e1c0: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
e1d0: 20 20 72 65 74 75 72 6e 0d 0a 20 20 20 20 20 20    return..      
e1e0: 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  }....      if {[
e1f0: 63 61 74 63 68 20 7b 66 69 6c 65 20 64 65 6c 65  catch {file dele
e200: 74 65 20 24 66 69 6c 65 4e 61 6d 65 7d 5d 20 3d  te $fileName}] =
e210: 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
e220: 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
e230: 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
e240: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
e250: 20 20 20 20 20 20 22 2d 2d 2d 2d 20 64 65 6c 65        "---- dele
e260: 74 65 64 20 62 69 6e 61 72 79 20 66 69 6c 65 20  ted binary file 
e270: 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c 22  \"" $fileName \"
e280: 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  \n]..      } els
e290: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75  e {..        tpu
e2a0: 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
e2b0: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
e2c0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d  ..            "-
e2d0: 2d 2d 2d 20 66 61 69 6c 65 64 20 74 6f 20 64 65  --- failed to de
e2e0: 6c 65 74 65 20 62 69 6e 61 72 79 20 66 69 6c 65  lete binary file
e2f0: 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c   \"" $fileName \
e300: 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  "\n]..      }.. 
e310: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
e320: 63 20 74 72 79 44 65 6c 65 74 65 42 75 69 6c 64  c tryDeleteBuild
e330: 46 69 6c 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  File {..        
e340: 20 20 20 20 66 69 6c 65 4e 61 6d 65 20 6d 61 6e      fileName man
e350: 61 67 65 64 4f 6e 6c 79 20 7b 70 6c 61 74 66 6f  agedOnly {platfo
e360: 72 6d 20 22 22 7d 20 7b 76 65 72 62 6f 73 65 20  rm ""} {verbose 
e370: 74 72 75 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  true} } {..     
e380: 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 67   set fileName [g
e390: 65 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20  etBuildFileName 
e3a0: 24 66 69 6c 65 4e 61 6d 65 20 24 6d 61 6e 61 67  $fileName $manag
e3b0: 65 64 4f 6e 6c 79 20 24 70 6c 61 74 66 6f 72 6d  edOnly $platform
e3c0: 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 21  ]....      if {!
e3d0: 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 66 69  [file exists $fi
e3e0: 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d  leName]} then {.
e3f0: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 24 76 65  .        if {$ve
e400: 72 62 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20  rbose} then {.. 
e410: 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
e420: 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
e430: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
e440: 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
e450: 2d 20 73 6b 69 70 70 65 64 20 64 65 6c 65 74 69  - skipped deleti
e460: 6e 67 20 62 75 69 6c 64 20 66 69 6c 65 20 5c 22  ng build file \"
e470: 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20  " $fileName \.. 
e480: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22               "\"
e490: 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78  , it does not ex
e4a0: 69 73 74 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20  ist\n"]..       
e4b0: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 72 65   }....        re
e4c0: 74 75 72 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  turn..      }...
e4d0: 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63  .      if {[catc
e4e0: 68 20 7b 66 69 6c 65 20 64 65 6c 65 74 65 20 24  h {file delete $
e4f0: 66 69 6c 65 4e 61 6d 65 7d 5d 20 3d 3d 20 30 7d  fileName}] == 0}
e500: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
e510: 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
e520: 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
e530: 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
e540: 20 20 22 2d 2d 2d 2d 20 64 65 6c 65 74 65 64 20    "---- deleted 
e550: 62 75 69 6c 64 20 66 69 6c 65 20 5c 22 22 20 24  build file \"" $
e560: 66 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a  fileName \"\n]..
e570: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
e580: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
e590: 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
e5a0: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
e5b0: 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66           "---- f
e5c0: 61 69 6c 65 64 20 74 6f 20 64 65 6c 65 74 65 20  ailed to delete 
e5d0: 62 75 69 6c 64 20 66 69 6c 65 20 5c 22 22 20 24  build file \"" $
e5e0: 66 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a  fileName \"\n]..
e5f0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
e600: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 74 72 79 43  ...    proc tryC
e610: 6f 70 79 41 73 73 65 6d 62 6c 79 20 7b 0d 0a 20  opyAssembly {.. 
e620: 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 4e             fileN
e630: 61 6d 65 20 6d 61 6e 61 67 65 64 4f 6e 6c 79 20  ame managedOnly 
e640: 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20 7b 70  {platform ""} {p
e650: 64 62 20 74 72 75 65 7d 20 7b 76 65 72 62 6f 73  db true} {verbos
e660: 65 20 74 72 75 65 7d 20 7d 20 7b 0d 0a 20 20 20  e true} } {..   
e670: 20 20 20 74 72 79 43 6f 70 79 42 75 69 6c 64 46     tryCopyBuildF
e680: 69 6c 65 20 24 66 69 6c 65 4e 61 6d 65 20 24 6d  ile $fileName $m
e690: 61 6e 61 67 65 64 4f 6e 6c 79 20 24 70 6c 61 74  anagedOnly $plat
e6a0: 66 6f 72 6d 20 22 22 20 24 76 65 72 62 6f 73 65  form "" $verbose
e6b0: 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 70  ....      if {$p
e6c0: 64 62 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  db} then {..    
e6d0: 20 20 20 20 74 72 79 43 6f 70 79 42 75 69 6c 64      tryCopyBuild
e6e0: 46 69 6c 65 20 5b 61 70 70 65 6e 64 41 72 67 73  File [appendArgs
e6f0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
e700: 5b 66 69 6c 65 20 72 6f 6f 74 6e 61 6d 65 20 24  [file rootname $
e710: 66 69 6c 65 4e 61 6d 65 5d 20 2e 70 64 62 5d 20  fileName] .pdb] 
e720: 24 6d 61 6e 61 67 65 64 4f 6e 6c 79 20 24 70 6c  $managedOnly $pl
e730: 61 74 66 6f 72 6d 20 22 22 20 24 76 65 72 62 6f  atform "" $verbo
e740: 73 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  se..      }..   
e750: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
e760: 74 72 79 44 65 6c 65 74 65 41 73 73 65 6d 62 6c  tryDeleteAssembl
e770: 79 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  y {..           
e780: 20 66 69 6c 65 4e 61 6d 65 20 7b 70 6c 61 74 66   fileName {platf
e790: 6f 72 6d 20 22 22 7d 20 7b 70 64 62 20 74 72 75  orm ""} {pdb tru
e7a0: 65 7d 20 7b 76 65 72 62 6f 73 65 20 74 72 75 65  e} {verbose true
e7b0: 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74 72 79  } } {..      try
e7c0: 44 65 6c 65 74 65 42 69 6e 61 72 79 46 69 6c 65  DeleteBinaryFile
e7d0: 20 24 66 69 6c 65 4e 61 6d 65 20 24 70 6c 61 74   $fileName $plat
e7e0: 66 6f 72 6d 20 24 76 65 72 62 6f 73 65 0d 0a 0d  form $verbose...
e7f0: 0a 20 20 20 20 20 20 69 66 20 7b 24 70 64 62 7d  .      if {$pdb}
e800: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
e810: 20 74 72 79 44 65 6c 65 74 65 42 69 6e 61 72 79   tryDeleteBinary
e820: 46 69 6c 65 20 5b 61 70 70 65 6e 64 41 72 67 73  File [appendArgs
e830: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
e840: 5b 66 69 6c 65 20 72 6f 6f 74 6e 61 6d 65 20 24  [file rootname $
e850: 66 69 6c 65 4e 61 6d 65 5d 20 2e 70 64 62 5d 20  fileName] .pdb] 
e860: 24 70 6c 61 74 66 6f 72 6d 20 24 76 65 72 62 6f  $platform $verbo
e870: 73 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  se..      }..   
e880: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
e890: 74 72 79 4c 6f 61 64 41 73 73 65 6d 62 6c 79 20  tryLoadAssembly 
e8a0: 7b 20 66 69 6c 65 4e 61 6d 65 20 7b 70 6c 61 74  { fileName {plat
e8b0: 66 6f 72 6d 20 22 22 7d 20 7d 20 7b 0d 0a 20 20  form ""} } {..  
e8c0: 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65      set fileName
e8d0: 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e   [getBinaryFileN
e8e0: 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 20 24 70  ame $fileName $p
e8f0: 6c 61 74 66 6f 72 6d 5d 0d 0a 0d 0a 20 20 20 20  latform]....    
e900: 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
e910: 20 20 20 20 20 20 20 20 73 65 74 20 61 73 73 65          set asse
e920: 6d 62 6c 79 20 5b 6f 62 6a 65 63 74 20 6c 6f 61  mbly [object loa
e930: 64 20 2d 6c 6f 61 64 74 79 70 65 20 46 69 6c 65  d -loadtype File
e940: 20 2d 61 6c 69 61 73 20 24 66 69 6c 65 4e 61 6d   -alias $fileNam
e950: 65 5d 0d 0a 20 20 20 20 20 20 7d 5d 20 3d 3d 20  e]..      }] == 
e960: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
e970: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
e980: 4e 4f 54 45 3a 20 4e 6f 77 2c 20 61 64 64 20 74  NOTE: Now, add t
e990: 68 65 20 6e 65 63 65 73 73 61 72 79 20 74 65 73  he necessary tes
e9a0: 74 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0d 0a 20  t constraint... 
e9b0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
e9c0: 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20    addConstraint 
e9d0: 5b 66 69 6c 65 20 72 6f 6f 74 6e 61 6d 65 20 5b  [file rootname [
e9e0: 66 69 6c 65 20 74 61 69 6c 20 24 66 69 6c 65 4e  file tail $fileN
e9f0: 61 6d 65 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  ame]]....       
ea00: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
ea10: 54 45 3a 20 47 72 61 62 20 74 68 65 20 69 6d 61  TE: Grab the ima
ea20: 67 65 20 72 75 6e 74 69 6d 65 20 76 65 72 73 69  ge runtime versi
ea30: 6f 6e 20 66 72 6f 6d 20 74 68 65 20 61 73 73 65  on from the asse
ea40: 6d 62 6c 79 20 62 65 63 61 75 73 65 0d 0a 20 20  mbly because..  
ea50: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73 65        #       se
ea60: 76 65 72 61 6c 20 74 65 73 74 73 20 72 65 6c 79  veral tests rely
ea70: 20 6f 6e 20 69 74 20 68 61 76 69 6e 67 20 61 20   on it having a 
ea80: 63 65 72 74 61 69 6e 20 76 61 6c 75 65 2e 0d 0a  certain value...
ea90: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
eaa0: 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74     addConstraint
eab0: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5b 66 69   [appendArgs [fi
eac0: 6c 65 20 74 61 69 6c 20 24 66 69 6c 65 4e 61 6d  le tail $fileNam
ead0: 65 5d 20 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20  e] _ \..        
eae0: 20 20 20 20 5b 24 61 73 73 65 6d 62 6c 79 20 49      [$assembly I
eaf0: 6d 61 67 65 52 75 6e 74 69 6d 65 56 65 72 73 69  mageRuntimeVersi
eb00: 6f 6e 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  on]]....        
eb10: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
eb20: 45 3a 20 52 65 74 75 72 6e 20 74 68 65 20 66 75  E: Return the fu
eb30: 6c 6c 20 70 61 74 68 20 6f 66 20 74 68 65 20 6c  ll path of the l
eb40: 6f 61 64 65 64 20 66 69 6c 65 2e 0d 0a 20 20 20  oaded file...   
eb50: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
eb60: 72 65 74 75 72 6e 20 24 66 69 6c 65 4e 61 6d 65  return $fileName
eb70: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
eb80: 20 20 20 72 65 74 75 72 6e 20 22 22 0d 0a 20 20     return ""..  
eb90: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
eba0: 20 69 73 53 51 4c 69 74 65 52 65 61 64 79 20 7b   isSQLiteReady {
ebb0: 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
ebc0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73      # NOTE: This
ebd0: 20 70 72 6f 63 65 64 75 72 65 20 6d 75 73 74 20   procedure must 
ebe0: 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20  return non-zero 
ebf0: 6f 6e 6c 79 20 69 66 20 74 68 65 20 53 51 4c 69  only if the SQLi
ec00: 74 65 20 6e 61 74 69 76 65 0d 0a 20 20 20 20 20  te native..     
ec10: 20 23 20 20 20 20 20 20 20 6c 69 62 72 61 72 79   #       library
ec20: 20 61 6e 64 20 74 68 65 20 53 79 73 74 65 6d 2e   and the System.
ec30: 44 61 74 61 2e 53 51 4c 69 74 65 20 6d 61 6e 61  Data.SQLite mana
ec40: 67 65 64 20 61 73 73 65 6d 62 6c 79 20 61 72 65  ged assembly are
ec50: 20 6c 6f 61 64 65 64 0d 0a 20 20 20 20 20 20 23   loaded..      #
ec60: 20 20 20 20 20 20 20 61 6e 64 20 72 65 61 64 79         and ready
ec70: 20 66 6f 72 20 75 73 65 20 62 79 20 74 68 65 20   for use by the 
ec80: 74 65 73 74 20 73 75 69 74 65 2e 20 20 43 75 72  test suite.  Cur
ec90: 72 65 6e 74 6c 79 2c 20 74 68 69 73 20 70 72 6f  rently, this pro
eca0: 63 65 64 75 72 65 0d 0a 20 20 20 20 20 20 23 20  cedure..      # 
ecb0: 20 20 20 20 20 20 73 68 6f 75 6c 64 20 62 65 20        should be 
ecc0: 63 61 6c 6c 65 64 20 6f 6e 6c 79 20 61 66 74 65  called only afte
ecd0: 72 20 74 68 65 20 5b 74 72 79 4c 6f 61 64 41 73  r the [tryLoadAs
ece0: 73 65 6d 62 6c 79 5d 20 70 72 6f 63 65 64 75 72  sembly] procedur
ecf0: 65 20 68 61 73 0d 0a 20 20 20 20 20 20 23 20 20  e has..      #  
ed00: 20 20 20 20 20 62 65 65 6e 20 63 61 6c 6c 65 64       been called
ed10: 20 74 6f 20 70 72 6f 62 65 20 66 6f 72 20 74 68   to probe for th
ed20: 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  e System.Data.SQ
ed30: 4c 69 74 65 20 6d 61 6e 61 67 65 64 20 61 73 73  Lite managed ass
ed40: 65 6d 62 6c 79 0d 0a 20 20 20 20 20 20 23 20 20  embly..      #  
ed50: 20 20 20 20 20 61 6e 64 20 74 68 65 20 5b 63 68       and the [ch
ed60: 65 63 6b 46 6f 72 53 51 4c 69 74 65 5d 20 70 72  eckForSQLite] pr
ed70: 6f 63 65 64 75 72 65 20 68 61 73 20 62 65 65 6e  ocedure has been
ed80: 20 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f 62 65   called to probe
ed90: 20 66 6f 72 0d 0a 20 20 20 20 20 20 23 20 20 20   for..      #   
eda0: 20 20 20 20 74 68 65 20 53 51 4c 69 74 65 20 6e      the SQLite n
edb0: 61 74 69 76 65 20 6c 69 62 72 61 72 79 3b 20 6f  ative library; o
edc0: 74 68 65 72 77 69 73 65 2c 20 74 68 69 73 20 70  therwise, this p
edd0: 72 6f 63 65 64 75 72 65 20 77 69 6c 6c 20 73 69  rocedure will si
ede0: 6d 70 6c 79 0d 0a 20 20 20 20 20 20 23 20 20 20  mply..      #   
edf0: 20 20 20 20 61 6c 77 61 79 73 20 72 65 74 75 72      always retur
ee00: 6e 20 7a 65 72 6f 2e 0d 0a 20 20 20 20 20 20 23  n zero...      #
ee10: 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b  ..      return [
ee20: 65 78 70 72 20 7b 0d 0a 20 20 20 20 20 20 20 20  expr {..        
ee30: 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20  [haveConstraint 
ee40: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
ee50: 74 65 5d 20 26 26 20 5b 68 61 76 65 43 6f 6e 73  te] && [haveCons
ee60: 74 72 61 69 6e 74 20 53 51 4c 69 74 65 5d 0d 0a  traint SQLite]..
ee70: 20 20 20 20 20 20 7d 5d 0d 0a 20 20 20 20 7d 0d        }]..    }.
ee80: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 6d 61 74  ....    proc mat
ee90: 63 68 50 6c 61 74 66 6f 72 6d 20 7b 20 70 6c 61  chPlatform { pla
eea0: 74 66 6f 72 6d 20 7d 20 7b 0d 0a 20 20 20 20 20  tform } {..     
eeb0: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
eec0: 3a 20 41 6e 20 65 6d 70 74 79 20 73 74 72 69 6e  : An empty strin
eed0: 67 20 66 6f 72 20 74 68 65 20 70 6c 61 74 66 6f  g for the platfo
eee0: 72 6d 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  rm means that th
eef0: 65 20 62 75 69 6c 64 20 69 73 20 6e 6f 74 0d 0a  e build is not..
ef00: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 5b 70        #       [p
ef10: 72 69 6d 61 72 69 6c 79 5d 20 61 20 6e 61 74 69  rimarily] a nati
ef20: 76 65 20 62 75 69 6c 64 3b 20 74 68 65 72 65 66  ve build; theref
ef30: 6f 72 65 2c 20 69 74 20 61 6c 77 61 79 73 20 6d  ore, it always m
ef40: 61 74 63 68 65 73 2e 0d 0a 20 20 20 20 20 20 23  atches...      #
ef50: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72  ..      if {[str
ef60: 69 6e 67 20 6c 65 6e 67 74 68 20 24 70 6c 61 74  ing length $plat
ef70: 66 6f 72 6d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  form] == 0} then
ef80: 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   {..        retu
ef90: 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20 7d  rn true..      }
efa0: 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
efb0: 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 74 68     # NOTE: If th
efc0: 65 20 6d 61 63 68 69 6e 65 20 6e 61 6d 65 20 69  e machine name i
efd0: 73 20 75 6e 61 76 61 69 6c 61 62 6c 65 2c 20 74  s unavailable, t
efe0: 68 65 72 65 20 69 73 20 6e 6f 74 68 69 6e 67 20  here is nothing 
eff0: 65 6c 73 65 20 77 65 0d 0a 20 20 20 20 20 20 23  else we..      #
f000: 20 20 20 20 20 20 20 63 61 6e 20 64 6f 2e 0d 0a         can do...
f010: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
f020: 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
f030: 20 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28   ::tcl_platform(
f040: 6d 61 63 68 69 6e 65 29 5d 7d 20 74 68 65 6e 20  machine)]} then 
f050: 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  {..        retur
f060: 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20 20 20 7d  n false..      }
f070: 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
f080: 20 20 20 23 20 4e 4f 54 45 3a 20 44 6f 65 73 20     # NOTE: Does 
f090: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70 6c  the specified pl
f0a0: 61 74 66 6f 72 6d 20 6d 61 74 63 68 20 75 70 20  atform match up 
f0b0: 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  to the current p
f0c0: 72 6f 63 65 73 73 3f 0d 0a 20 20 20 20 20 20 23  rocess?..      #
f0d0: 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 70 6c 61  ..      if {$pla
f0e0: 74 66 6f 72 6d 20 65 71 20 5b 6d 61 63 68 69 6e  tform eq [machin
f0f0: 65 54 6f 50 6c 61 74 66 6f 72 6d 20 24 3a 3a 74  eToPlatform $::t
f100: 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 6d 61 63 68  cl_platform(mach
f110: 69 6e 65 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  ine)]} then {.. 
f120: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72         return tr
f130: 75 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ue..      }.... 
f140: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
f150: 4e 4f 54 45 3a 20 54 68 65 20 73 70 65 63 69 66  NOTE: The specif
f160: 69 65 64 20 70 6c 61 74 66 6f 72 6d 20 64 6f 65  ied platform doe
f170: 73 20 6e 6f 74 20 6d 61 74 63 68 20 75 70 20 77  s not match up w
f180: 69 74 68 20 74 68 65 20 70 6c 61 74 66 6f 72 6d  ith the platform
f190: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
f1a0: 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
f1b0: 70 72 6f 63 65 73 73 2e 0d 0a 20 20 20 20 20 20  process...      
f1c0: 23 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  #..      return 
f1d0: 66 61 6c 73 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d  false..    }....
f1e0: 0a 20 20 20 20 70 72 6f 63 20 68 61 76 65 53 51  .    proc haveSQ
f1f0: 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e  LiteObjectComman
f200: 64 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  d {} {..      #.
f210: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49  .      # NOTE: I
f220: 73 20 74 68 65 20 5b 6f 62 6a 65 63 74 5d 20 63  s the [object] c
f230: 6f 6d 6d 61 6e 64 20 63 75 72 72 65 6e 74 6c 79  ommand currently
f240: 20 61 76 61 69 6c 61 62 6c 65 3f 0d 0a 20 20 20   available?..   
f250: 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75     #..      retu
f260: 72 6e 20 5b 65 78 70 72 20 7b 5b 6c 6c 65 6e 67  rn [expr {[lleng
f270: 74 68 20 5b 69 6e 66 6f 20 63 6f 6d 6d 61 6e 64  th [info command
f280: 73 20 6f 62 6a 65 63 74 5d 5d 20 3e 20 30 7d 5d  s object]] > 0}]
f290: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
f2a0: 70 72 6f 63 20 63 68 65 63 6b 46 6f 72 53 51 4c  proc checkForSQL
f2b0: 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64  iteObjectCommand
f2c0: 20 7b 20 63 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a   { channel } {..
f2d0: 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
f2e0: 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 68 65 63 6b  nnel "---- check
f2f0: 69 6e 67 20 66 6f 72 20 5c 22 6f 62 6a 65 63 74  ing for \"object
f300: 5c 22 20 63 6f 6d 6d 61 6e 64 20 75 73 61 67 65  \" command usage
f310: 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 69  ... "....      i
f320: 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
f330: 20 3a 3a 6e 6f 28 73 71 6c 69 74 65 4f 62 6a 65   ::no(sqliteObje
f340: 63 74 43 6f 6d 6d 61 6e 64 29 5d 20 26 26 20 5c  ctCommand)] && \
f350: 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 68 61 76  ..          [hav
f360: 65 53 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d  eSQLiteObjectCom
f370: 6d 61 6e 64 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  mand]} then {.. 
f380: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
f390: 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20 20 20  annel yes\n..   
f3a0: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
f3b0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
f3c0: 23 20 4e 4f 54 45 3a 20 55 6e 6c 65 73 73 20 77  # NOTE: Unless w
f3d0: 65 20 61 72 65 20 66 6f 72 62 69 64 64 65 6e 20  e are forbidden 
f3e0: 66 72 6f 6d 20 64 6f 69 6e 67 20 73 6f 2c 20 61  from doing so, a
f3f0: 64 64 20 73 6f 6d 65 20 63 6f 6e 73 74 72 61 69  dd some constrai
f400: 6e 74 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20  nts..        #  
f410: 20 20 20 20 20 74 68 61 74 20 77 69 6c 6c 20 61       that will a
f420: 6c 6c 6f 77 20 6d 6f 73 74 20 6f 66 20 74 68 65  llow most of the
f430: 20 74 65 73 74 20 73 75 69 74 65 20 74 6f 20 72   test suite to r
f440: 75 6e 20 28 69 2e 65 2e 20 74 68 6f 73 65 0d 0a  un (i.e. those..
f450: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
f460: 74 65 73 74 73 20 74 68 61 74 20 64 6f 20 6e 6f  tests that do no
f470: 74 20 64 69 72 65 63 74 6c 79 20 72 65 6c 79 20  t directly rely 
f480: 75 70 6f 6e 20 74 68 65 20 5b 6f 62 6a 65 63 74  upon the [object
f490: 5d 20 63 6f 6d 6d 61 6e 64 29 2e 0d 0a 20 20 20  ] command)...   
f4a0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
f4b0: 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
f4c0: 73 20 3a 3a 6e 6f 28 73 68 69 6d 53 51 4c 69 74  s ::no(shimSQLit
f4d0: 65 41 73 73 65 6d 62 6c 79 43 6f 6e 73 74 72 61  eAssemblyConstra
f4e0: 69 6e 74 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  ints)]} then {..
f4f0: 20 20 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e            addCon
f500: 73 74 72 61 69 6e 74 20 53 51 4c 69 74 65 0d 0a  straint SQLite..
f510: 20 20 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e            addCon
f520: 73 74 72 61 69 6e 74 20 53 51 4c 69 74 65 49 6e  straint SQLiteIn
f530: 74 65 72 6f 70 0d 0a 20 20 20 20 20 20 20 20 20  terop..         
f540: 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 53   addConstraint S
f550: 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
f560: 65 0d 0a 20 20 20 20 20 20 20 20 20 20 61 64 64  e..          add
f570: 43 6f 6e 73 74 72 61 69 6e 74 20 53 79 73 74 65  Constraint Syste
f580: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 45 6e  m.Data.SQLite.En
f590: 63 72 79 70 74 69 6f 6e 0d 0a 20 20 20 20 20 20  cryption..      
f5a0: 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e      addConstrain
f5b0: 74 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  t System.Data.SQ
f5c0: 4c 69 74 65 2e 4c 69 6e 71 0d 0a 0d 0a 20 20 20  Lite.Linq....   
f5d0: 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72         addConstr
f5e0: 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
f5f0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
f600: 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51    System.Data.SQ
f610: 4c 69 74 65 2e 64 6c 6c 5f 76 20 5b 67 65 74 42  Lite.dll_v [getB
f620: 75 69 6c 64 43 6c 72 56 65 72 73 69 6f 6e 5d 5d  uildClrVersion]]
f630: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
f640: 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
f650: 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 73 68  o exists ::no(sh
f660: 69 6d 53 51 4c 69 74 65 44 65 66 69 6e 65 43 6f  imSQLiteDefineCo
f670: 6e 73 74 61 6e 74 43 6f 6e 73 74 72 61 69 6e 74  nstantConstraint
f680: 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  s)]} then {..   
f690: 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 64         foreach d
f6a0: 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 20 5b 6c  efineConstant [l
f6b0: 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ist \..         
f6c0: 20 20 20 20 20 49 4e 54 45 52 4f 50 5f 45 58 54       INTEROP_EXT
f6d0: 45 4e 53 49 4f 4e 5f 46 55 4e 43 54 49 4f 4e 53  ENSION_FUNCTIONS
f6e0: 20 49 4e 54 45 52 4f 50 5f 46 54 53 35 5f 45 58   INTEROP_FTS5_EX
f6f0: 54 45 4e 53 49 4f 4e 20 5c 0d 0a 20 20 20 20 20  TENSION \..     
f700: 20 20 20 20 20 20 20 20 20 49 4e 54 45 52 4f 50           INTEROP
f710: 5f 4a 53 4f 4e 31 5f 45 58 54 45 4e 53 49 4f 4e  _JSON1_EXTENSION
f720: 20 49 4e 54 45 52 4f 50 5f 50 45 52 43 45 4e 54   INTEROP_PERCENT
f730: 49 4c 45 5f 45 58 54 45 4e 53 49 4f 4e 20 5c 0d  ILE_EXTENSION \.
f740: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 49  .              I
f750: 4e 54 45 52 4f 50 5f 52 45 47 45 58 50 5f 45 58  NTEROP_REGEXP_EX
f760: 54 45 4e 53 49 4f 4e 20 49 4e 54 45 52 4f 50 5f  TENSION INTEROP_
f770: 54 45 53 54 5f 45 58 54 45 4e 53 49 4f 4e 20 5c  TEST_EXTENSION \
f780: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
f790: 49 4e 54 45 52 4f 50 5f 53 45 53 53 49 4f 4e 5f  INTEROP_SESSION_
f7a0: 45 58 54 45 4e 53 49 4f 4e 20 49 4e 54 45 52 4f  EXTENSION INTERO
f7b0: 50 5f 53 48 41 31 5f 45 58 54 45 4e 53 49 4f 4e  P_SHA1_EXTENSION
f7c0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
f7d0: 20 20 49 4e 54 45 52 4f 50 5f 54 4f 54 59 50 45    INTEROP_TOTYPE
f7e0: 5f 45 58 54 45 4e 53 49 4f 4e 20 49 4e 54 45 52  _EXTENSION INTER
f7f0: 4f 50 5f 56 49 52 54 55 41 4c 5f 54 41 42 4c 45  OP_VIRTUAL_TABLE
f800: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
f810: 20 20 55 53 45 5f 49 4e 54 45 52 4f 50 5f 44 4c    USE_INTEROP_DL
f820: 4c 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  L] {..          
f830: 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20    addConstraint 
f840: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
f850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b                 [
f860: 67 65 74 53 51 4c 69 74 65 44 65 66 69 6e 65 43  getSQLiteDefineC
f870: 6f 6e 73 74 61 6e 74 50 72 65 66 69 78 5d 20 24  onstantPrefix] $
f880: 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 5d 0d  defineConstant].
f890: 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
f8a0: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
f8b0: 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
f8c0: 69 73 74 73 20 3a 3a 6e 6f 28 73 68 69 6d 53 51  ists ::no(shimSQ
f8d0: 4c 69 74 65 56 69 73 75 61 6c 53 74 75 64 69 6f  LiteVisualStudio
f8e0: 43 6f 6e 73 74 72 61 69 6e 74 73 29 5d 7d 20 74  Constraints)]} t
f8f0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
f900: 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b   addConstraint [
f910: 61 70 70 65 6e 64 41 72 67 73 20 76 69 73 75 61  appendArgs visua
f920: 6c 53 74 75 64 69 6f 20 5b 67 65 74 42 75 69 6c  lStudio [getBuil
f930: 64 59 65 61 72 5d 5d 0d 0a 20 20 20 20 20 20 20  dYear]]..       
f940: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 70   }....        tp
f950: 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c  uts $channel no\
f960: 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  n..      }..    
f970: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63  }.....    proc c
f980: 68 61 6e 67 65 4e 61 74 69 76 65 52 75 6e 74 69  hangeNativeRunti
f990: 6d 65 4f 70 74 69 6f 6e 20 7b 20 6e 61 74 69 76  meOption { nativ
f9a0: 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66 20  e } {..      if 
f9b0: 7b 5b 6c 6c 65 6e 67 74 68 20 5b 69 6e 66 6f 20  {[llength [info 
f9c0: 63 6f 6d 6d 61 6e 64 73 20 64 65 62 75 67 5d 5d  commands debug]]
f9d0: 20 3e 20 30 20 26 26 20 5c 0d 0a 20 20 20 20 20   > 0 && \..     
f9e0: 20 20 20 20 20 5b 6c 6c 65 6e 67 74 68 20 5b 69       [llength [i
f9f0: 6e 66 6f 20 73 75 62 63 6f 6d 6d 61 6e 64 73 20  nfo subcommands 
fa00: 64 65 62 75 67 20 72 75 6e 74 69 6d 65 6f 70 74  debug runtimeopt
fa10: 69 6f 6e 5d 5d 20 3e 20 30 20 26 26 20 5b 63 61  ion]] > 0 && [ca
fa20: 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 64  tch {..        d
fa30: 65 62 75 67 20 72 75 6e 74 69 6d 65 6f 70 74 69  ebug runtimeopti
fa40: 6f 6e 20 5b 65 78 70 72 20 7b 24 6e 61 74 69 76  on [expr {$nativ
fa50: 65 20 3f 20 22 61 64 64 22 20 3a 20 22 72 65 6d  e ? "add" : "rem
fa60: 6f 76 65 22 7d 5d 20 6e 61 74 69 76 65 0d 0a 20  ove"}] native.. 
fa70: 20 20 20 20 20 7d 5d 20 3d 3d 20 30 7d 20 74 68       }] == 0} th
fa80: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65  en {..        re
fa90: 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20  turn true..     
faa0: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b   }....      if {
fab0: 5b 68 61 76 65 53 51 4c 69 74 65 4f 62 6a 65 63  [haveSQLiteObjec
fac0: 74 43 6f 6d 6d 61 6e 64 5d 20 26 26 20 5b 63 61  tCommand] && [ca
fad0: 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 6f  tch {..        o
fae0: 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 49 6e 74  bject invoke Int
faf0: 65 72 70 72 65 74 65 72 2e 47 65 74 41 63 74 69  erpreter.GetActi
fb00: 76 65 20 5b 65 78 70 72 20 7b 24 6e 61 74 69 76  ve [expr {$nativ
fb10: 65 20 3f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  e ? \..         
fb20: 20 20 20 22 41 64 64 52 75 6e 74 69 6d 65 4f 70     "AddRuntimeOp
fb30: 74 69 6f 6e 22 20 3a 20 22 52 65 6d 6f 76 65 52  tion" : "RemoveR
fb40: 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 22 7d 5d 20  untimeOption"}] 
fb50: 6e 61 74 69 76 65 0d 0a 20 20 20 20 20 20 7d 5d  native..      }]
fb60: 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
fb70: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72         return tr
fb80: 75 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ue..      }.... 
fb90: 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73       return fals
fba0: 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  e..    }.....   
fbb0: 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72 53 51   proc checkForSQ
fbc0: 4c 69 74 65 42 75 69 6c 64 73 20 7b 20 63 68 61  LiteBuilds { cha
fbd0: 6e 6e 65 6c 20 7b 73 65 6c 65 63 74 20 66 61 6c  nnel {select fal
fbe0: 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23  se} } {..      #
fbf0: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
fc00: 43 68 65 63 6b 20 66 6f 72 20 65 76 65 72 79 20  Check for every 
fc10: 70 6f 73 73 69 62 6c 65 20 76 61 6c 69 64 20 63  possible valid c
fc20: 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 76 61  ombination of va
fc30: 6c 75 65 73 20 75 73 65 64 20 77 68 65 6e 0d 0a  lues used when..
fc40: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6c 6f        #       lo
fc50: 63 61 74 69 6e 67 20 6f 75 74 20 74 68 65 20 62  cating out the b
fc60: 75 69 6c 64 20 6f 75 74 70 75 74 20 64 69 72 65  uild output dire
fc70: 63 74 6f 72 79 2c 20 73 68 6f 77 69 6e 67 20 65  ctory, showing e
fc80: 61 63 68 20 61 76 61 69 6c 61 62 6c 65 0d 0a 20  ach available.. 
fc90: 20 20 20 20 20 23 20 20 20 20 20 20 20 62 75 69       #       bui
fca0: 6c 64 20 76 61 72 69 61 74 69 6f 6e 20 61 6c 6f  ld variation alo
fcb0: 6e 67 20 74 68 65 20 77 61 79 2e 0d 0a 20 20 20  ng the way...   
fcc0: 20 20 20 23 0d 0a 20 20 20 20 20 20 66 6f 72 65     #..      fore
fcd0: 61 63 68 20 6e 61 74 69 76 65 20 5b 6c 69 73 74  ach native [list
fce0: 20 66 61 6c 73 65 20 74 72 75 65 5d 20 7b 0d 0a   false true] {..
fcf0: 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
fd00: 79 65 61 72 20 5b 67 65 74 42 75 69 6c 64 59 65  year [getBuildYe
fd10: 61 72 73 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20  ars] {..        
fd20: 20 20 66 6f 72 65 61 63 68 20 63 6f 6e 66 69 67    foreach config
fd30: 75 72 61 74 69 6f 6e 20 5b 67 65 74 42 75 69 6c  uration [getBuil
fd40: 64 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 5d  dConfigurations]
fd50: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
fd60: 66 6f 72 65 61 63 68 20 65 78 74 72 61 20 5b 67  foreach extra [g
fd70: 65 74 42 75 69 6c 64 45 78 74 72 61 73 5d 20 7b  etBuildExtras] {
fd80: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
fd90: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  #..             
fda0: 20 23 20 4e 4f 54 45 3a 20 46 69 67 75 72 65 20   # NOTE: Figure 
fdb0: 6f 75 74 20 74 68 65 20 65 66 66 65 63 74 69 76  out the effectiv
fdc0: 65 20 62 75 69 6c 64 20 70 6c 61 74 66 6f 72 6d  e build platform
fdd0: 2e 20 20 54 68 69 73 20 69 73 0d 0a 20 20 20 20  .  This is..    
fde0: 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
fdf0: 20 20 62 61 73 65 64 20 6f 6e 20 77 68 65 74 68    based on wheth
fe00: 65 72 20 6f 72 20 6e 6f 74 20 61 20 5b 70 72 69  er or not a [pri
fe10: 6d 61 72 69 6c 79 5d 20 6e 61 74 69 76 65 20 62  marily] native b
fe20: 75 69 6c 64 0d 0a 20 20 20 20 20 20 20 20 20 20  uild..          
fe30: 20 20 20 20 23 20 20 20 20 20 20 20 69 73 20 62      #       is b
fe40: 65 69 6e 67 20 75 73 65 64 2e 20 20 46 6f 72 20  eing used.  For 
fe50: 5b 70 72 69 6d 61 72 69 6c 79 5d 20 6e 6f 6e 2d  [primarily] non-
fe60: 6e 61 74 69 76 65 20 62 75 69 6c 64 73 2c 0d 0a  native builds,..
fe70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
fe80: 20 20 20 20 20 20 74 68 69 73 20 77 69 6c 6c 20        this will 
fe90: 62 65 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69  be an empty stri
fea0: 6e 67 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ng...           
feb0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
fec0: 20 20 20 20 73 65 74 20 70 6c 61 74 66 6f 72 6d      set platform
fed0: 20 5b 67 65 74 42 75 69 6c 64 50 6c 61 74 66 6f   [getBuildPlatfo
fee0: 72 6d 20 24 6e 61 74 69 76 65 5d 0d 0a 0d 0a 20  rm $native].... 
fef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
ff00: 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
ff10: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
ff20: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
ff30: 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20  -- checking for 
ff40: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
ff50: 74 65 20 62 75 69 6c 64 20 5c 22 22 20 5b 65 78  te build \"" [ex
ff60: 70 72 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  pr \..          
ff70: 20 20 20 20 20 20 20 20 7b 24 6e 61 74 69 76 65          {$native
ff80: 20 3f 20 22 6e 61 74 69 76 65 2f 22 20 3a 20 22   ? "native/" : "
ff90: 22 7d 5d 20 5b 65 78 70 72 20 7b 5b 73 74 72 69  "}] [expr {[stri
ffa0: 6e 67 20 6c 65 6e 67 74 68 20 5c 0d 0a 20 20 20  ng length \..   
ffb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24                 $
ffc0: 70 6c 61 74 66 6f 72 6d 5d 20 3e 20 30 20 3f 20  platform] > 0 ? 
ffd0: 5b 61 70 70 65 6e 64 41 72 67 73 20 24 70 6c 61  [appendArgs $pla
ffe0: 74 66 6f 72 6d 20 2f 5d 20 3a 20 22 22 7d 5d 20  tform /] : ""}] 
fff0: 24 79 65 61 72 20 5c 0d 0a 20 20 20 20 20 20 20  $year \..       
10000 20 20 20 20 20 20 20 20 20 20 20 2f 20 24 63 6f             / $co
10010 6e 66 69 67 75 72 61 74 69 6f 6e 20 22 5c 22 2e  nfiguration "\".
10020 2e 2e 20 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  .. "]....       
10030 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
10040 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
10050 42 75 69 6c 64 20 74 68 65 20 66 75 6c 6c 79 20  Build the fully 
10060 71 75 61 6c 69 66 69 65 64 20 64 69 72 65 63 74  qualified direct
10070 6f 72 79 20 77 68 65 72 65 20 74 68 65 20 6e 65  ory where the ne
10080 63 65 73 73 61 72 79 0d 0a 20 20 20 20 20 20 20  cessary..       
10090 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63         #       c
100a0 6f 6d 70 6f 6e 65 6e 74 73 20 66 6f 72 20 53 79  omponents for Sy
100b0 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
100c0 20 73 68 6f 75 6c 64 20 62 65 20 66 6f 75 6e 64   should be found
100d0 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
100e0 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
100f0 20 20 73 65 74 20 64 69 72 65 63 74 6f 72 79 20    set directory 
10100 5b 6a 6f 69 6e 42 75 69 6c 64 44 69 72 65 63 74  [joinBuildDirect
10110 6f 72 79 20 24 6e 61 74 69 76 65 20 5c 0d 0a 20  ory $native \.. 
10120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10130 20 5b 67 65 74 42 75 69 6c 64 42 61 73 65 44 69   [getBuildBaseDi
10140 72 65 63 74 6f 72 79 5d 20 24 79 65 61 72 20 24  rectory] $year $
10150 70 6c 61 74 66 6f 72 6d 20 24 63 6f 6e 66 69 67  platform $config
10160 75 72 61 74 69 6f 6e 20 5c 0d 0a 20 20 20 20 20  uration \..     
10170 20 20 20 20 20 20 20 20 20 20 20 20 20 24 65 78               $ex
10180 74 72 61 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  tra]....        
10190 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
101a0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 44         # NOTE: D
101b0 6f 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20  o the necessary 
101c0 66 69 6c 65 73 20 65 78 69 73 74 3f 20 20 43 75  files exist?  Cu
101d0 72 72 65 6e 74 6c 79 2c 20 6e 6f 20 6f 74 68 65  rrently, no othe
101e0 72 20 73 74 65 70 73 0d 0a 20 20 20 20 20 20 20  r steps..       
101f0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61         #       a
10200 72 65 20 74 61 6b 65 6e 20 74 6f 20 76 65 72 69  re taken to veri
10210 66 79 20 74 68 69 73 20 62 75 69 6c 64 20 69 73  fy this build is
10220 20 61 63 74 75 61 6c 6c 79 20 76 69 61 62 6c 65   actually viable
10230 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
10240 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
10250 20 20 69 66 20 7b 5b 69 73 42 75 69 6c 64 41 76    if {[isBuildAv
10260 61 69 6c 61 62 6c 65 20 24 6e 61 74 69 76 65 20  ailable $native 
10270 24 64 69 72 65 63 74 6f 72 79 5d 7d 20 74 68 65  $directory]} the
10280 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
10290 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
102a0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
102b0 57 68 65 6e 20 69 6e 20 22 73 65 6c 65 63 74 22  When in "select"
102c0 20 6d 6f 64 65 2c 20 61 75 74 6f 6d 61 74 69 63   mode, automatic
102d0 61 6c 6c 79 20 73 65 6c 65 63 74 20 74 68 65 20  ally select the 
102e0 66 69 72 73 74 0d 0a 20 20 20 20 20 20 20 20 20  first..         
102f0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61         #       a
10300 76 61 69 6c 61 62 6c 65 20 62 75 69 6c 64 20 6f  vailable build o
10310 66 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  f System.Data.SQ
10320 4c 69 74 65 20 61 6e 64 20 74 68 65 6e 20 72 65  Lite and then re
10330 74 75 72 6e 0d 0a 20 20 20 20 20 20 20 20 20 20  turn..          
10340 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69 6d        #       im
10350 6d 65 64 69 61 74 65 6c 79 2e 0d 0a 20 20 20 20  mediately...    
10360 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
10370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
10380 66 20 7b 24 73 65 6c 65 63 74 20 26 26 20 5b 6d  f {$select && [m
10390 61 74 63 68 50 6c 61 74 66 6f 72 6d 20 24 70 6c  atchPlatform $pl
103a0 61 74 66 6f 72 6d 5d 7d 20 74 68 65 6e 20 7b 0d  atform]} then {.
103b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
103c0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
103d0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
103e0 4d 61 6e 75 61 6c 6c 79 20 6f 76 65 72 72 69 64  Manually overrid
103f0 65 20 61 6c 6c 20 74 68 65 20 62 75 69 6c 64 20  e all the build 
10400 64 69 72 65 63 74 6f 72 79 20 73 65 6c 65 63 74  directory select
10410 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ion..           
10420 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 72         #       r
10430 65 6c 61 74 65 64 20 74 65 73 74 20 73 65 74 74  elated test sett
10440 69 6e 67 73 20 69 6e 20 6f 72 64 65 72 20 74 6f  ings in order to
10450 20 66 6f 72 63 65 20 74 68 69 73 20 62 75 69 6c   force this buil
10460 64 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d..             
10470 20 20 20 20 20 23 20 20 20 20 20 20 20 6f 66 20       #       of 
10480 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
10490 74 65 20 74 6f 20 62 65 20 75 73 65 64 2e 0d 0a  te to be used...
104a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
104b0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
104c0 20 20 20 20 20 20 20 69 66 20 7b 21 5b 63 68 61         if {![cha
104d0 6e 67 65 4e 61 74 69 76 65 52 75 6e 74 69 6d 65  ngeNativeRuntime
104e0 4f 70 74 69 6f 6e 20 24 6e 61 74 69 76 65 5d 7d  Option $native]}
104f0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
10500 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
10510 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
10520 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
10530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10540 20 20 20 22 6e 6f 2c 20 66 61 69 6c 65 64 20 74     "no, failed t
10550 6f 20 22 20 5b 65 78 70 72 20 7b 24 6e 61 74 69  o " [expr {$nati
10560 76 65 20 3f 20 22 61 64 64 22 20 3a 20 22 72 65  ve ? "add" : "re
10570 6d 6f 76 65 22 7d 5d 20 5c 0d 0a 20 20 20 20 20  move"}] \..     
10580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10590 20 20 20 22 20 74 68 65 20 5c 22 6e 61 74 69 76     " the \"nativ
105a0 65 5c 22 20 72 75 6e 74 69 6d 65 20 6f 70 74 69  e\" runtime opti
105b0 6f 6e 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20 20  on\n"]....      
105c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
105d0 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20  turn false..    
105e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
105f0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
10600 20 20 20 20 20 73 65 74 20 3a 3a 74 65 73 74 5f       set ::test_
10610 79 65 61 72 20 24 79 65 61 72 0d 0a 20 20 20 20  year $year..    
10620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
10630 74 20 3a 3a 74 65 73 74 5f 70 6c 61 74 66 6f 72  t ::test_platfor
10640 6d 20 24 70 6c 61 74 66 6f 72 6d 0d 0a 20 20 20  m $platform..   
10650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
10660 65 74 20 3a 3a 74 65 73 74 5f 63 6f 6e 66 69 67  et ::test_config
10670 75 72 61 74 69 6f 6e 20 24 63 6f 6e 66 69 67 75  uration $configu
10680 72 61 74 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20  ration....      
10690 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
106a0 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
106b0 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
106c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
106d0 22 79 65 73 2c 20 73 65 6c 65 63 74 65 64 20 28  "yes, selected (
106e0 22 20 5b 65 78 70 72 20 7b 24 6e 61 74 69 76 65  " [expr {$native
106f0 20 3f 20 22 6e 61 74 69 76 65 2f 22 20 3a 20 22   ? "native/" : "
10700 22 7d 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  "}] \..         
10710 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 65 78               [ex
10720 70 72 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  pr {[string leng
10730 74 68 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3e 20  th $platform] > 
10740 30 20 3f 20 5b 61 70 70 65 6e 64 41 72 67 73 20  0 ? [appendArgs 
10750 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
10760 20 20 20 20 20 20 20 20 20 24 70 6c 61 74 66 6f           $platfo
10770 72 6d 20 2f 5d 20 3a 20 22 22 7d 5d 20 24 79 65  rm /] : ""}] $ye
10780 61 72 20 2f 20 24 63 6f 6e 66 69 67 75 72 61 74  ar / $configurat
10790 69 6f 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ion \..         
107a0 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 65 78               [ex
107b0 70 72 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  pr {[string leng
107c0 74 68 20 24 65 78 74 72 61 5d 20 3e 20 30 20 3f  th $extra] > 0 ?
107d0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 2f 20 5c   [appendArgs / \
107e0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
107f0 20 20 20 20 20 20 20 20 24 65 78 74 72 61 5d 20          $extra] 
10800 3a 20 22 22 7d 5d 20 22 29 5c 6e 22 5d 0d 0a 0d  : ""}] ")\n"]...
10810 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10820 20 20 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a     return true..
10830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10840 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
10850 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
10860 73 20 24 63 68 61 6e 6e 65 6c 20 79 65 73 5c 6e  s $channel yes\n
10870 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
10880 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
10890 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
108a0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
108b0 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e  ts $channel no\n
108c0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
108d0 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  }..            }
108e0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
108f0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
10900 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72  }....      retur
10910 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20 7d 0d 0a  n false..    }..
10920 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 68 65 63  ...    proc chec
10930 6b 46 6f 72 53 51 4c 69 74 65 52 65 6c 65 61 73  kForSQLiteReleas
10940 65 73 20 7b 20 63 68 61 6e 6e 65 6c 20 7b 73 65  es { channel {se
10950 6c 65 63 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d  lect false} } {.
10960 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
10970 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 66 6f  # NOTE: Check fo
10980 72 20 70 61 73 74 20 72 65 6c 65 61 73 65 73 20  r past releases 
10990 6f 66 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  of System.Data.S
109a0 51 4c 69 74 65 20 69 6e 20 74 68 65 20 64 69 72  QLite in the dir
109b0 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 23 20  ectory..      # 
109c0 20 20 20 20 20 20 63 6f 6e 74 61 69 6e 65 64 20        contained 
109d0 69 6e 20 74 68 65 20 22 53 79 73 74 65 6d 2e 44  in the "System.D
109e0 61 74 61 2e 53 51 4c 69 74 65 22 20 65 6e 76 69  ata.SQLite" envi
109f0 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65  ronment variable
10a00 2c 20 69 66 0d 0a 20 20 20 20 20 20 23 20 20 20  , if..      #   
10a10 20 20 20 20 70 72 65 73 65 6e 74 2e 0d 0a 20 20      present...  
10a20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
10a30 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
10a40 65 6e 76 28 53 79 73 74 65 6d 2e 44 61 74 61 2e  env(System.Data.
10a50 53 51 4c 69 74 65 29 5d 20 26 26 20 5c 0d 0a 20  SQLite)] && \.. 
10a60 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67           [string
10a70 20 6c 65 6e 67 74 68 20 24 3a 3a 65 6e 76 28 53   length $::env(S
10a80 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
10a90 65 29 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  e)] > 0} then {.
10aa0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
10ab0 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c      # NOTE: Buil
10ac0 64 20 74 68 65 20 66 75 6c 6c 79 20 71 75 61 6c  d the fully qual
10ad0 69 66 69 65 64 20 64 69 72 65 63 74 6f 72 79 20  ified directory 
10ae0 77 68 65 72 65 20 74 68 65 20 6e 65 63 65 73 73  where the necess
10af0 61 72 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ary..        #  
10b00 20 20 20 20 20 63 6f 6d 70 6f 6e 65 6e 74 73 20       components 
10b10 66 6f 72 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  for System.Data.
10b20 53 51 4c 69 74 65 20 73 68 6f 75 6c 64 20 62 65  SQLite should be
10b30 20 66 6f 75 6e 64 2e 0d 0a 20 20 20 20 20 20 20   found...       
10b40 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   #..        set 
10b50 64 69 72 65 63 74 6f 72 79 20 5b 66 69 6c 65 20  directory [file 
10b60 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65  nativename [file
10b70 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20   join \..       
10b80 20 20 20 20 20 24 3a 3a 65 6e 76 28 53 79 73 74       $::env(Syst
10b90 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 29 20  em.Data.SQLite) 
10ba0 5b 67 65 74 52 65 6c 65 61 73 65 56 65 72 73 69  [getReleaseVersi
10bb0 6f 6e 5d 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  on]]]....       
10bc0 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
10bd0 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
10be0 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
10bf0 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 53 79   checking for Sy
10c00 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
10c10 20 72 65 6c 65 61 73 65 20 5c 22 22 20 5c 0d 0a   release \"" \..
10c20 20 20 20 20 20 20 20 20 20 20 20 20 24 64 69 72              $dir
10c30 65 63 74 6f 72 79 20 22 5c 22 2e 2e 2e 20 22 5d  ectory "\"... "]
10c40 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b  ....        if {
10c50 5b 69 73 52 65 6c 65 61 73 65 41 76 61 69 6c 61  [isReleaseAvaila
10c60 62 6c 65 20 24 64 69 72 65 63 74 6f 72 79 20 70  ble $directory p
10c70 6c 61 74 66 6f 72 6d 5d 7d 20 74 68 65 6e 20 7b  latform]} then {
10c80 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
10c90 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
10ca0 70 6c 61 74 66 6f 72 6d 5d 20 3d 3d 20 30 7d 20  platform] == 0} 
10cb0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
10cc0 20 20 20 20 73 65 74 20 70 6c 61 74 66 6f 72 6d      set platform
10cd0 20 75 6e 6b 6e 6f 77 6e 0d 0a 20 20 20 20 20 20   unknown..      
10ce0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
10cf0 20 20 20 69 66 20 7b 24 73 65 6c 65 63 74 20 26     if {$select &
10d00 26 20 5b 6d 61 74 63 68 50 6c 61 74 66 6f 72 6d  & [matchPlatform
10d10 20 24 70 6c 61 74 66 6f 72 6d 5d 7d 20 74 68 65   $platform]} the
10d20 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
10d30 20 73 65 74 20 3a 3a 62 75 69 6c 64 5f 64 69 72   set ::build_dir
10d40 65 63 74 6f 72 79 20 24 64 69 72 65 63 74 6f 72  ectory $director
10d50 79 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  y....           
10d60 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
10d70 5b 61 70 70 65 6e 64 41 72 67 73 20 22 79 65 73  [appendArgs "yes
10d80 2c 20 73 65 6c 65 63 74 65 64 20 28 22 20 24 70  , selected (" $p
10d90 6c 61 74 66 6f 72 6d 20 22 29 5c 6e 22 5d 0d 0a  latform ")\n"]..
10da0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ..            re
10db0 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20  turn true..     
10dc0 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
10dd0 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
10de0 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
10df0 64 41 72 67 73 20 22 79 65 73 20 28 22 20 24 70  dArgs "yes (" $p
10e00 6c 61 74 66 6f 72 6d 20 22 29 5c 6e 22 5d 0d 0a  latform ")\n"]..
10e10 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
10e20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
10e30 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
10e40 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 0d 0a  channel no\n....
10e50 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
10e60 66 69 6c 65 20 65 78 69 73 74 73 20 24 64 69 72  file exists $dir
10e70 65 63 74 6f 72 79 5d 20 7c 7c 20 5c 0d 0a 20 20  ectory] || \..  
10e80 20 20 20 20 20 20 20 20 20 20 20 20 21 5b 66 69              ![fi
10e90 6c 65 20 69 73 64 69 72 65 63 74 6f 72 79 20 24  le isdirectory $
10ea0 64 69 72 65 63 74 6f 72 79 5d 7d 20 74 68 65 6e  directory]} then
10eb0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
10ec0 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
10ed0 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
10ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
10ef0 2d 2d 2d 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20  --- environment 
10f00 76 61 72 69 61 62 6c 65 20 5c 22 53 79 73 74 65  variable \"Syste
10f10 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 5c 22 20  m.Data.SQLite\" 
10f20 69 73 20 61 6e 20 22 20 5c 0d 0a 20 20 20 20 20  is an " \..     
10f30 20 20 20 20 20 20 20 20 20 20 20 22 69 6e 76 61             "inva
10f40 6c 69 64 20 64 69 72 65 63 74 6f 72 79 2c 20 73  lid directory, s
10f50 6b 69 70 70 69 6e 67 20 63 68 65 63 6b 20 66 6f  kipping check fo
10f60 72 20 72 65 6c 65 61 73 65 73 2e 2e 2e 5c 6e 22  r releases...\n"
10f70 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ]....           
10f80 20 72 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20   return false.. 
10f90 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
10fa0 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
10fb0 70 61 74 68 20 5b 6c 73 6f 72 74 20 2d 64 65 63  path [lsort -dec
10fc0 72 65 61 73 69 6e 67 20 5b 66 69 6c 65 20 6c 69  reasing [file li
10fd0 73 74 20 24 64 69 72 65 63 74 6f 72 79 20 2a 5d  st $directory *]
10fe0 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ] {..           
10ff0 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74   if {[file exist
11000 73 20 24 70 61 74 68 5d 20 26 26 20 5b 66 69 6c  s $path] && [fil
11010 65 20 69 73 64 69 72 65 63 74 6f 72 79 20 24 70  e isdirectory $p
11020 61 74 68 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ath]} then {..  
11030 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
11040 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
11050 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
11060 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
11070 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 53  - checking for S
11080 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
11090 65 20 72 65 6c 65 61 73 65 20 5c 22 22 20 5c 0d  e release \"" \.
110a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
110b0 20 20 20 24 70 61 74 68 20 22 5c 22 2e 2e 2e 20     $path "\"... 
110c0 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  "]....          
110d0 20 20 20 20 69 66 20 7b 5b 69 73 52 65 6c 65 61      if {[isRelea
110e0 73 65 41 76 61 69 6c 61 62 6c 65 20 24 70 61 74  seAvailable $pat
110f0 68 20 70 6c 61 74 66 6f 72 6d 5d 7d 20 74 68 65  h platform]} the
11100 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
11110 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
11120 20 6c 65 6e 67 74 68 20 24 70 6c 61 74 66 6f 72   length $platfor
11130 6d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  m] == 0} then {.
11140 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11150 20 20 20 73 65 74 20 70 6c 61 74 66 6f 72 6d 20     set platform 
11160 75 6e 6b 6e 6f 77 6e 0d 0a 20 20 20 20 20 20 20  unknown..       
11170 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
11180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
11190 20 7b 24 73 65 6c 65 63 74 20 26 26 20 5b 6d 61   {$select && [ma
111a0 74 63 68 50 6c 61 74 66 6f 72 6d 20 24 70 6c 61  tchPlatform $pla
111b0 74 66 6f 72 6d 5d 7d 20 74 68 65 6e 20 7b 0d 0a  tform]} then {..
111c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
111d0 20 20 73 65 74 20 3a 3a 62 75 69 6c 64 5f 64 69    set ::build_di
111e0 72 65 63 74 6f 72 79 20 24 70 61 74 68 0d 0a 0d  rectory $path...
111f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11200 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
11210 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 79  l [appendArgs "y
11220 65 73 2c 20 73 65 6c 65 63 74 65 64 20 28 22 20  es, selected (" 
11230 24 70 6c 61 74 66 6f 72 6d 20 22 29 5c 6e 22 5d  $platform ")\n"]
11240 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
11250 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75        return tru
11260 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e..             
11270 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
11280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
11290 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
112a0 70 70 65 6e 64 41 72 67 73 20 22 79 65 73 20 28  ppendArgs "yes (
112b0 22 20 24 70 6c 61 74 66 6f 72 6d 20 22 29 5c 6e  " $platform ")\n
112c0 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  "]..            
112d0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
112e0 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
112f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
11300 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f  puts $channel no
11310 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  \n..            
11320 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
11330 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d   }..          }.
11340 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
11350 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
11360 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
11370 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
11380 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d  ..            "-
11390 2d 2d 2d 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20  --- environment 
113a0 76 61 72 69 61 62 6c 65 20 5c 22 53 79 73 74 65  variable \"Syste
113b0 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 5c 22 20  m.Data.SQLite\" 
113c0 69 73 20 6e 6f 74 20 22 20 5c 0d 0a 20 20 20 20  is not " \..    
113d0 20 20 20 20 20 20 20 20 22 73 65 74 2c 20 73 6b          "set, sk
113e0 69 70 70 69 6e 67 20 63 68 65 63 6b 20 66 6f 72  ipping check for
113f0 20 72 65 6c 65 61 73 65 73 2e 2e 2e 5c 6e 22 5d   releases...\n"]
11400 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
11410 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 0d     return false.
11420 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
11430 72 6f 63 20 63 68 65 63 6b 46 6f 72 53 51 4c 69  roc checkForSQLi
11440 74 65 4c 69 62 72 61 72 79 20 7b 20 63 68 61 6e  teLibrary { chan
11450 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74  nel } {..      t
11460 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d  puts $channel "-
11470 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72  --- checking for
11480 20 53 51 4c 69 74 65 20 63 6f 72 65 20 6c 69 62   SQLite core lib
11490 72 61 72 79 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20  rary... "....   
114a0 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d     if {[catch {.
114b0 0a 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20  .        object 
114c0 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e  invoke -flags +N
114d0 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20  onPublic \..    
114e0 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44          System.D
114f0 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74  ata.SQLite.SQLit
11500 65 33 20 53 51 4c 69 74 65 56 65 72 73 69 6f 6e  e3 SQLiteVersion
11510 0d 0a 20 20 20 20 20 20 7d 20 76 65 72 73 69 6f  ..      } versio
11520 6e 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  n] == 0} then {.
11530 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
11540 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63      # NOTE: Chec
11550 6b 20 69 66 20 74 68 65 20 72 65 74 75 72 6e 65  k if the returne
11560 64 20 76 65 72 73 69 6f 6e 20 77 61 73 20 6e 75  d version was nu
11570 6c 6c 2e 20 20 49 66 20 73 6f 2c 20 6d 61 6b 65  ll.  If so, make
11580 20 69 74 20 65 61 73 79 0d 0a 20 20 20 20 20 20   it easy..      
11590 20 20 23 20 20 20 20 20 20 20 74 6f 20 73 70 6f    #       to spo
115a0 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  t...        #.. 
115b0 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69         if {[stri
115c0 6e 67 20 6c 65 6e 67 74 68 20 24 76 65 72 73 69  ng length $versi
115d0 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  on] == 0} then {
115e0 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
115f0 76 65 72 73 69 6f 6e 20 6e 75 6c 6c 0d 0a 20 20  version null..  
11600 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
11610 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
11620 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f  NOTE: Attempt to
11630 20 71 75 65 72 79 20 74 68 65 20 46 6f 73 73 69   query the Fossi
11640 6c 20 73 6f 75 72 63 65 20 69 64 65 6e 74 69 66  l source identif
11650 69 65 72 20 66 6f 72 20 74 68 65 20 53 51 4c 69  ier for the SQLi
11660 74 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  te..        #   
11670 20 20 20 20 63 6f 72 65 20 6c 69 62 72 61 72 79      core library
11680 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
11690 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
116a0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62   {..          ob
116b0 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61  ject invoke -fla
116c0 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d  gs +NonPublic \.
116d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53  .              S
116e0 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
116f0 65 2e 53 51 4c 69 74 65 33 20 53 51 4c 69 74 65  e.SQLite3 SQLite
11700 53 6f 75 72 63 65 49 64 0d 0a 20 20 20 20 20 20  SourceId..      
11710 20 20 7d 20 73 6f 75 72 63 65 49 64 5d 7d 20 74    } sourceId]} t
11720 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
11730 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
11740 4e 4f 54 45 3a 20 57 65 20 66 61 69 6c 65 64 20  NOTE: We failed 
11750 74 6f 20 71 75 65 72 79 20 74 68 65 20 46 6f 73  to query the Fos
11760 73 69 6c 20 73 6f 75 72 63 65 20 69 64 65 6e 74  sil source ident
11770 69 66 69 65 72 2e 0d 0a 20 20 20 20 20 20 20 20  ifier...        
11780 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73    #..          s
11790 65 74 20 73 6f 75 72 63 65 49 64 20 75 6e 6b 6e  et sourceId unkn
117a0 6f 77 6e 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  own..        }..
117b0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
117c0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65       # NOTE: Che
117d0 63 6b 20 69 66 20 74 68 65 20 72 65 74 75 72 6e  ck if the return
117e0 65 64 20 46 6f 73 73 69 6c 20 73 6f 75 72 63 65  ed Fossil source
117f0 20 69 64 65 6e 74 69 66 69 65 72 20 77 61 73 20   identifier was 
11800 6e 75 6c 6c 2e 20 20 49 66 0d 0a 20 20 20 20 20  null.  If..     
11810 20 20 20 23 20 20 20 20 20 20 20 73 6f 2c 20 6d     #       so, m
11820 61 6b 65 20 69 74 20 65 61 73 79 20 74 6f 20 73  ake it easy to s
11830 70 6f 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  pot...        #.
11840 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74  .        if {[st
11850 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 73 6f 75  ring length $sou
11860 72 63 65 49 64 5d 20 3d 3d 20 30 7d 20 74 68 65  rceId] == 0} the
11870 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73  n {..          s
11880 65 74 20 73 6f 75 72 63 65 49 64 20 6e 75 6c 6c  et sourceId null
11890 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
118a0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
118b0 20 20 23 20 4e 4f 54 45 3a 20 59 65 73 2c 20 74    # NOTE: Yes, t
118c0 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20 6c  he SQLite core l
118d0 69 62 72 61 72 79 20 61 70 70 65 61 72 73 20 74  ibrary appears t
118e0 6f 20 62 65 20 61 76 61 69 6c 61 62 6c 65 2e 0d  o be available..
118f0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
11900 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e      addConstrain
11910 74 20 53 51 4c 69 74 65 0d 0a 0d 0a 20 20 20 20  t SQLite....    
11920 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
11930 20 4e 4f 54 45 3a 20 52 65 63 6f 72 64 20 76 65   NOTE: Record ve
11940 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 53 51 4c  rsion of the SQL
11950 69 74 65 20 63 6f 72 65 20 6c 69 62 72 61 72 79  ite core library
11960 20 66 6f 72 20 6c 61 74 65 72 20 75 73 65 0d 0a   for later use..
11970 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
11980 62 79 20 74 65 73 74 20 63 6f 6e 73 74 72 61 69  by test constrai
11990 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20  nt expressions, 
119a0 65 74 63 2e 20 20 49 66 20 74 68 69 73 20 76 61  etc.  If this va
119b0 6c 75 65 20 68 61 73 0d 0a 20 20 20 20 20 20 20  lue has..       
119c0 20 23 20 20 20 20 20 20 20 61 6c 72 65 61 64 79   #       already
119d0 20 62 65 65 6e 20 73 65 74 20 28 6f 72 20 6f 76   been set (or ov
119e0 65 72 72 69 64 64 65 6e 29 2c 20 73 6b 69 70 20  erridden), skip 
119f0 73 65 74 74 69 6e 67 20 69 74 2e 0d 0a 20 20 20  setting it...   
11a00 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
11a10 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
11a20 73 20 3a 3a 63 6f 72 65 5f 6c 69 62 72 61 72 79  s ::core_library
11a30 5f 76 65 72 73 69 6f 6e 5d 7d 20 74 68 65 6e 20  _version]} then 
11a40 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  {..          set
11a50 20 3a 3a 63 6f 72 65 5f 6c 69 62 72 61 72 79 5f   ::core_library_
11a60 76 65 72 73 69 6f 6e 20 24 76 65 72 73 69 6f 6e  version $version
11a70 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
11a80 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
11a90 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
11aa0 73 20 22 79 65 73 20 28 22 20 24 76 65 72 73 69  s "yes (" $versi
11ab0 6f 6e 20 22 20 22 20 24 73 6f 75 72 63 65 49 64  on " " $sourceId
11ac0 20 22 29 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 7d   ")\n"]..      }
11ad0 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
11ae0 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
11af0 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  no\n..      }.. 
11b00 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
11b10 63 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65  c checkForSQLite
11b20 49 6e 74 65 72 6f 70 20 7b 20 63 68 61 6e 6e 65  Interop { channe
11b30 6c 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74 70 75  l } {..      tpu
11b40 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d  ts $channel "---
11b50 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 53  - checking for S
11b60 51 4c 69 74 65 20 69 6e 74 65 72 6f 70 20 61 73  QLite interop as
11b70 73 65 6d 62 6c 79 2e 2e 2e 20 22 0d 0a 0d 0a 20  sembly... ".... 
11b80 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
11b90 7b 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a 65 63  {..        objec
11ba0 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20  t invoke -flags 
11bb0 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20  +NonPublic \..  
11bc0 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d            System
11bd0 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c  .Data.SQLite.SQL
11be0 69 74 65 33 20 49 6e 74 65 72 6f 70 56 65 72 73  ite3 InteropVers
11bf0 69 6f 6e 0d 0a 20 20 20 20 20 20 7d 20 76 65 72  ion..      } ver
11c00 73 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  sion] == 0} then
11c10 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
11c20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43         # NOTE: C
11c30 68 65 63 6b 20 69 66 20 74 68 65 20 72 65 74 75  heck if the retu
11c40 72 6e 65 64 20 76 65 72 73 69 6f 6e 20 77 61 73  rned version was
11c50 20 6e 75 6c 6c 2e 20 20 49 66 20 73 6f 2c 20 6d   null.  If so, m
11c60 61 6b 65 20 69 74 20 65 61 73 79 0d 0a 20 20 20  ake it easy..   
11c70 20 20 20 20 20 23 20 20 20 20 20 20 20 74 6f 20       #       to 
11c80 73 70 6f 74 2e 0d 0a 20 20 20 20 20 20 20 20 23  spot...        #
11c90 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73  ..        if {[s
11ca0 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 65  tring length $ve
11cb0 72 73 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65  rsion] == 0} the
11cc0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73  n {..          s
11cd0 65 74 20 76 65 72 73 69 6f 6e 20 6e 75 6c 6c 0d  et version null.
11ce0 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
11cf0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
11d00 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74   # NOTE: Attempt
11d10 20 74 6f 20 71 75 65 72 79 20 74 68 65 20 46 6f   to query the Fo
11d20 73 73 69 6c 20 73 6f 75 72 63 65 20 69 64 65 6e  ssil source iden
11d30 74 69 66 69 65 72 20 66 6f 72 20 74 68 65 20 53  tifier for the S
11d40 51 4c 69 74 65 0d 0a 20 20 20 20 20 20 20 20 23  QLite..        #
11d50 20 20 20 20 20 20 20 63 6f 72 65 20 6c 69 62 72         core libr
11d60 61 72 79 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ary...        #.
11d70 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61  .        if {[ca
11d80 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
11d90 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d   object invoke -
11da0 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63  flags +NonPublic
11db0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
11dc0 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51    System.Data.SQ
11dd0 4c 69 74 65 2e 53 51 4c 69 74 65 33 20 49 6e 74  Lite.SQLite3 Int
11de0 65 72 6f 70 53 6f 75 72 63 65 49 64 0d 0a 20 20  eropSourceId..  
11df0 20 20 20 20 20 20 7d 20 73 6f 75 72 63 65 49 64        } sourceId
11e00 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
11e10 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
11e20 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 66 61 69    # NOTE: We fai
11e30 6c 65 64 20 74 6f 20 71 75 65 72 79 20 74 68 65  led to query the
11e40 20 46 6f 73 73 69 6c 20 73 6f 75 72 63 65 20 69   Fossil source i
11e50 64 65 6e 74 69 66 69 65 72 2e 0d 0a 20 20 20 20  dentifier...    
11e60 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
11e70 20 20 20 73 65 74 20 73 6f 75 72 63 65 49 64 20     set sourceId 
11e80 75 6e 6b 6e 6f 77 6e 0d 0a 20 20 20 20 20 20 20  unknown..       
11e90 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d   }....        #.
11ea0 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
11eb0 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 72 65   Check if the re
11ec0 74 75 72 6e 65 64 20 46 6f 73 73 69 6c 20 73 6f  turned Fossil so
11ed0 75 72 63 65 20 69 64 65 6e 74 69 66 69 65 72 20  urce identifier 
11ee0 77 61 73 20 6e 75 6c 6c 2e 20 20 49 66 0d 0a 20  was null.  If.. 
11ef0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73         #       s
11f00 6f 2c 20 6d 61 6b 65 20 69 74 20 65 61 73 79 20  o, make it easy 
11f10 74 6f 20 73 70 6f 74 2e 0d 0a 20 20 20 20 20 20  to spot...      
11f20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20    #..        if 
11f30 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
11f40 24 73 6f 75 72 63 65 49 64 5d 20 3d 3d 20 30 7d  $sourceId] == 0}
11f50 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
11f60 20 20 20 73 65 74 20 73 6f 75 72 63 65 49 64 20     set sourceId 
11f70 6e 75 6c 6c 0d 0a 20 20 20 20 20 20 20 20 7d 0d  null..        }.
11f80 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
11f90 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 65        # NOTE: Be
11fa0 66 6f 72 65 20 61 63 74 75 61 6c 6c 79 20 61 64  fore actually ad
11fb0 64 69 6e 67 20 74 68 65 20 74 65 73 74 20 63 6f  ding the test co
11fc0 6e 73 74 72 61 69 6e 74 2c 20 6d 61 6b 65 20 73  nstraint, make s
11fd0 75 72 65 20 74 68 65 0d 0a 20 20 20 20 20 20 20  ure the..       
11fe0 20 23 20 20 20 20 20 20 20 76 65 72 73 69 6f 6e   #       version
11ff0 20 69 73 20 76 61 6c 69 64 20 28 69 2e 65 2e 20   is valid (i.e. 
12000 6e 6f 74 20 6a 75 73 74 20 74 68 61 74 20 77 65  not just that we
12010 20 63 6f 75 6c 64 20 71 75 65 72 79 20 69 74 29   could query it)
12020 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
12030 20 20 20 20 20 20 69 66 20 7b 24 76 65 72 73 69        if {$versi
12040 6f 6e 20 6e 65 20 22 6e 75 6c 6c 22 7d 20 74 68  on ne "null"} th
12050 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
12060 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e  #..          # N
12070 4f 54 45 3a 20 59 65 73 2c 20 74 68 65 20 53 51  OTE: Yes, the SQ
12080 4c 69 74 65 20 69 6e 74 65 72 6f 70 20 61 73 73  Lite interop ass
12090 65 6d 62 6c 79 20 61 70 70 65 61 72 73 20 74 6f  embly appears to
120a0 20 62 65 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0a   be available...
120b0 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
120c0 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72         addConstr
120d0 61 69 6e 74 20 53 51 4c 69 74 65 49 6e 74 65 72  aint SQLiteInter
120e0 6f 70 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  op....          
120f0 73 65 74 20 61 6e 73 77 65 72 20 79 65 73 0d 0a  set answer yes..
12100 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
12110 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
12120 61 6e 73 77 65 72 20 6e 6f 0d 0a 20 20 20 20 20  answer no..     
12130 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
12140 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
12150 61 70 70 65 6e 64 41 72 67 73 20 24 61 6e 73 77  appendArgs $answ
12160 65 72 20 22 20 28 22 20 24 76 65 72 73 69 6f 6e  er " (" $version
12170 20 22 20 22 20 24 73 6f 75 72 63 65 49 64 20 22   " " $sourceId "
12180 29 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 7d 20 65  )\n"]..      } e
12190 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74  lse {..        t
121a0 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f  puts $channel no
121b0 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  \n..      }..   
121c0 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
121d0 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 44 65  checkForSQLiteDe
121e0 66 69 6e 65 43 6f 6e 73 74 61 6e 74 20 7b 20 63  fineConstant { c
121f0 68 61 6e 6e 65 6c 20 6e 61 6d 65 20 7d 20 7b 0d  hannel name } {.
12200 0a 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68  .      tputs $ch
12210 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
12220 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 22  s \..          "
12230 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f  ---- checking fo
12240 72 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  r System.Data.SQ
12250 4c 69 74 65 20 64 65 66 69 6e 65 20 63 6f 6e 73  Lite define cons
12260 74 61 6e 74 20 5c 22 22 20 24 6e 61 6d 65 20 5c  tant \"" $name \
12270 0d 0a 20 20 20 20 20 20 20 20 20 20 22 5c 22 2e  ..          "\".
12280 2e 2e 20 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 69  .. "]....      i
12290 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  f {[catch {..   
122a0 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f       object invo
122b0 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75  ke -flags +NonPu
122c0 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20  blic \..        
122d0 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e      System.Data.
122e0 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 33 20 44  SQLite.SQLite3 D
122f0 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 73 0d 0a  efineConstants..
12300 20 20 20 20 20 20 7d 20 64 65 66 69 6e 65 43 6f        } defineCo
12310 6e 73 74 61 6e 74 73 5d 20 3d 3d 20 30 7d 20 74  nstants] == 0} t
12320 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69  hen {..        i
12330 66 20 7b 5b 6c 73 65 61 72 63 68 20 2d 65 78 61  f {[lsearch -exa
12340 63 74 20 2d 6e 6f 63 61 73 65 20 24 64 65 66 69  ct -nocase $defi
12350 6e 65 43 6f 6e 73 74 61 6e 74 73 20 24 6e 61 6d  neConstants $nam
12360 65 5d 20 21 3d 20 2d 31 7d 20 74 68 65 6e 20 7b  e] != -1} then {
12370 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
12380 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
12390 20 59 65 73 2c 20 74 68 69 73 20 64 65 66 69 6e   Yes, this defin
123a0 65 20 63 6f 6e 73 74 61 6e 74 20 77 61 73 20 65  e constant was e
123b0 6e 61 62 6c 65 64 20 77 68 65 6e 20 74 68 65 20  nabled when the 
123c0 6d 61 6e 61 67 65 64 0d 0a 20 20 20 20 20 20 20  managed..       
123d0 20 20 20 23 20 20 20 20 20 20 20 61 73 73 65 6d     #       assem
123e0 62 6c 79 20 77 61 73 20 63 6f 6d 70 69 6c 65 64  bly was compiled
123f0 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
12400 20 20 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e            addCon
12410 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41  straint [appendA
12420 72 67 73 20 5b 67 65 74 53 51 4c 69 74 65 44 65  rgs [getSQLiteDe
12430 66 69 6e 65 43 6f 6e 73 74 61 6e 74 50 72 65 66  fineConstantPref
12440 69 78 5d 20 24 6e 61 6d 65 5d 0d 0a 0d 0a 20 20  ix] $name]....  
12450 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
12460 68 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20 20  hannel yes\n..  
12470 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
12480 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
12490 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20  $channel no\n.. 
124a0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
124b0 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
124c0 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
124d0 20 65 72 72 6f 72 5c 6e 0d 0a 20 20 20 20 20 20   error\n..      
124e0 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
124f0 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72 53 51   proc checkForSQ
12500 4c 69 74 65 43 6f 6d 70 69 6c 65 4f 70 74 69 6f  LiteCompileOptio
12510 6e 20 7b 20 63 68 61 6e 6e 65 6c 20 6e 61 6d 65  n { channel name
12520 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74 70 75 74   } {..      tput
12530 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
12540 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
12550 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69      "---- checki
12560 6e 67 20 66 6f 72 20 53 51 4c 69 74 65 20 69 6e  ng for SQLite in
12570 74 65 72 6f 70 20 61 73 73 65 6d 62 6c 79 20 63  terop assembly c
12580 6f 6d 70 69 6c 65 20 6f 70 74 69 6f 6e 20 5c 22  ompile option \"
12590 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 24  " \..          $
125a0 6e 61 6d 65 20 22 5c 22 2e 2e 2e 20 22 5d 0d 0a  name "\"... "]..
125b0 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74  ..      if {[cat
125c0 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 6f 62  ch {..        ob
125d0 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61  ject invoke -fla
125e0 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d  gs +NonPublic \.
125f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73  .            Sys
12600 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
12610 53 51 4c 69 74 65 33 20 49 6e 74 65 72 6f 70 43  SQLite3 InteropC
12620 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 73 0d 0a 20  ompileOptions.. 
12630 20 20 20 20 20 7d 20 63 6f 6d 70 69 6c 65 4f 70       } compileOp
12640 74 69 6f 6e 73 5d 20 3d 3d 20 30 7d 20 74 68 65  tions] == 0} the
12650 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20  n {..        if 
12660 7b 5b 6c 73 65 61 72 63 68 20 2d 65 78 61 63 74  {[lsearch -exact
12670 20 2d 6e 6f 63 61 73 65 20 24 63 6f 6d 70 69 6c   -nocase $compil
12680 65 4f 70 74 69 6f 6e 73 20 24 6e 61 6d 65 5d 20  eOptions $name] 
12690 21 3d 20 2d 31 7d 20 74 68 65 6e 20 7b 0d 0a 20  != -1} then {.. 
126a0 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
126b0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 59 65        # NOTE: Ye
126c0 73 2c 20 74 68 69 73 20 63 6f 6d 70 69 6c 65 20  s, this compile 
126d0 6f 70 74 69 6f 6e 20 77 61 73 20 65 6e 61 62 6c  option was enabl
126e0 65 64 20 77 68 65 6e 20 74 68 65 20 69 6e 74 65  ed when the inte
126f0 72 6f 70 0d 0a 20 20 20 20 20 20 20 20 20 20 23  rop..          #
12700 20 20 20 20 20 20 20 61 73 73 65 6d 62 6c 79 20         assembly 
12710 77 61 73 20 63 6f 6d 70 69 6c 65 64 2e 0d 0a 20  was compiled... 
12720 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
12730 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61        addConstra
12740 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20  int [appendArgs 
12750 5b 67 65 74 53 51 4c 69 74 65 43 6f 6d 70 69 6c  [getSQLiteCompil
12760 65 4f 70 74 69 6f 6e 50 72 65 66 69 78 5d 20 24  eOptionPrefix] $
12770 6e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  name]....       
12780 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
12790 6c 20 79 65 73 5c 6e 0d 0a 20 20 20 20 20 20 20  l yes\n..       
127a0 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
127b0 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
127c0 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20  nel no\n..      
127d0 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73    }..      } els
127e0 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75  e {..        tpu
127f0 74 73 20 24 63 68 61 6e 6e 65 6c 20 65 72 72 6f  ts $channel erro
12800 72 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  r\n..      }....
12810 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
12820 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
12830 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 22 2d   \..          "-
12840 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72  --- checking for
12850 20 53 51 4c 69 74 65 20 63 6f 72 65 20 6c 69 62   SQLite core lib
12860 72 61 72 79 20 63 6f 6d 70 69 6c 65 20 6f 70 74  rary compile opt
12870 69 6f 6e 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20  ion \"" \..     
12880 20 20 20 20 20 24 6e 61 6d 65 20 22 5c 22 2e 2e       $name "\"..
12890 2e 20 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66  . "]....      if
128a0 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
128b0 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b      object invok
128c0 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62  e -flags +NonPub
128d0 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  lic \..         
128e0 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53     System.Data.S
128f0 51 4c 69 74 65 2e 53 51 4c 69 74 65 33 20 53 51  QLite.SQLite3 SQ
12900 4c 69 74 65 43 6f 6d 70 69 6c 65 4f 70 74 69 6f  LiteCompileOptio
12910 6e 73 0d 0a 20 20 20 20 20 20 7d 20 63 6f 6d 70  ns..      } comp
12920 69 6c 65 4f 70 74 69 6f 6e 73 5d 20 3d 3d 20 30  ileOptions] == 0
12930 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
12940 20 20 69 66 20 7b 5b 6c 73 65 61 72 63 68 20 2d    if {[lsearch -
12950 65 78 61 63 74 20 2d 6e 6f 63 61 73 65 20 24 63  exact -nocase $c
12960 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 73 20 24 6e  ompileOptions $n
12970 61 6d 65 5d 20 21 3d 20 2d 31 7d 20 74 68 65 6e  ame] != -1} then
12980 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d   {..          #.
12990 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
129a0 45 3a 20 59 65 73 2c 20 74 68 69 73 20 63 6f 6d  E: Yes, this com
129b0 70 69 6c 65 20 6f 70 74 69 6f 6e 20 77 61 73 20  pile option was 
129c0 65 6e 61 62 6c 65 64 20 77 68 65 6e 20 74 68 65  enabled when the
129d0 20 53 51 4c 69 74 65 0d 0a 20 20 20 20 20 20 20   SQLite..       
129e0 20 20 20 23 20 20 20 20 20 20 20 63 6f 72 65 20     #       core 
129f0 6c 69 62 72 61 72 79 20 77 61 73 20 63 6f 6d 70  library was comp
12a00 69 6c 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 20  iled...         
12a10 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 61 64   #..          ad
12a20 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70  dConstraint [app
12a30 65 6e 64 41 72 67 73 20 5b 67 65 74 53 51 4c 69  endArgs [getSQLi
12a40 74 65 43 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 50  teCompileOptionP
12a50 72 65 66 69 78 5d 20 24 6e 61 6d 65 5d 0d 0a 0d  refix] $name]...
12a60 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
12a70 20 24 63 68 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d   $channel yes\n.
12a80 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20  .        } else 
12a90 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75  {..          tpu
12aa0 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e  ts $channel no\n
12ab0 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
12ac0 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
12ad0 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
12ae0 6e 65 6c 20 65 72 72 6f 72 5c 6e 0d 0a 20 20 20  nel error\n..   
12af0 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
12b00 20 20 20 20 70 72 6f 63 20 67 65 74 44 61 74 65      proc getDate
12b10 54 69 6d 65 46 6f 72 6d 61 74 20 7b 20 7b 74 69  TimeFormat { {ti
12b20 6d 65 5a 6f 6e 65 20 74 72 75 65 7d 20 7d 20 7b  meZone true} } {
12b30 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
12b40 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 70 72   # NOTE: This pr
12b50 6f 63 65 64 75 72 65 20 73 69 6d 70 6c 79 20 72  ocedure simply r
12b60 65 74 75 72 6e 73 20 74 68 65 20 22 64 65 66 61  eturns the "defa
12b70 75 6c 74 22 20 44 61 74 65 54 69 6d 65 20 66 6f  ult" DateTime fo
12b80 72 6d 61 74 20 75 73 65 64 0d 0a 20 20 20 20 20  rmat used..     
12b90 20 23 20 20 20 20 20 20 20 62 79 20 74 68 65 20   #       by the 
12ba0 74 65 73 74 20 73 75 69 74 65 2e 0d 0a 20 20 20  test suite...   
12bb0 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
12bc0 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 64  [info exists ::d
12bd0 61 74 65 74 69 6d 65 5f 66 6f 72 6d 61 74 5d 20  atetime_format] 
12be0 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
12bf0 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
12c00 3a 3a 64 61 74 65 74 69 6d 65 5f 66 6f 72 6d 61  ::datetime_forma
12c10 74 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  t] > 0} then {..
12c20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
12c30 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 74 75 72     # NOTE: Retur
12c40 6e 20 74 68 65 20 6d 61 6e 75 61 6c 6c 79 20 6f  n the manually o
12c50 76 65 72 72 69 64 64 65 6e 20 76 61 6c 75 65 20  verridden value 
12c60 66 6f 72 20 74 68 65 20 44 61 74 65 54 69 6d 65  for the DateTime
12c70 20 66 6f 72 6d 61 74 2e 0d 0a 20 20 20 20 20 20   format...      
12c80 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
12c90 75 72 6e 20 24 3a 3a 64 61 74 65 74 69 6d 65 5f  urn $::datetime_
12ca0 66 6f 72 6d 61 74 0d 0a 20 20 20 20 20 20 7d 20  format..      } 
12cb0 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
12cc0 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
12cd0 45 3a 20 52 65 74 75 72 6e 20 61 6e 20 49 53 4f  E: Return an ISO
12ce0 38 36 30 31 20 44 61 74 65 54 69 6d 65 20 66 6f  8601 DateTime fo
12cf0 72 6d 61 74 20 63 6f 6d 70 61 74 69 62 6c 65 20  rmat compatible 
12d00 77 69 74 68 20 53 51 4c 69 74 65 2c 0d 0a 20 20  with SQLite,..  
12d10 20 20 20 20 20 20 23 20 20 20 20 20 20 20 53 79        #       Sy
12d20 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
12d30 2c 20 61 6e 64 20 73 75 69 74 61 62 6c 65 20 66  , and suitable f
12d40 6f 72 20 72 6f 75 6e 64 2d 74 72 69 70 70 69 6e  or round-trippin
12d50 67 20 77 69 74 68 20 74 68 65 0d 0a 20 20 20 20  g with the..    
12d60 20 20 20 20 23 20 20 20 20 20 20 20 44 61 74 65      #       Date
12d70 54 69 6d 65 20 63 6c 61 73 73 20 6f 66 20 74 68  Time class of th
12d80 65 20 66 72 61 6d 65 77 6f 72 6b 2e 20 20 49 66  e framework.  If
12d90 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 20 63   this value is c
12da0 68 61 6e 67 65 64 2c 0d 0a 20 20 20 20 20 20 20  hanged,..       
12db0 20 23 20 20 20 20 20 20 20 76 61 72 69 6f 75 73   #       various
12dc0 20 74 65 73 74 73 20 6d 61 79 20 66 61 69 6c 2e   tests may fail.
12dd0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
12de0 20 20 20 20 20 72 65 74 75 72 6e 20 5b 61 70 70       return [app
12df0 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
12e00 20 20 20 20 20 20 20 22 79 79 79 79 2d 4d 4d 2d         "yyyy-MM-
12e10 64 64 20 48 48 3a 6d 6d 3a 73 73 2e 46 46 46 46  dd HH:mm:ss.FFFF
12e20 46 46 46 22 20 5b 65 78 70 72 20 7b 24 74 69 6d  FFF" [expr {$tim
12e30 65 5a 6f 6e 65 20 3f 20 22 4b 22 20 3a 20 22 22  eZone ? "K" : ""
12e40 7d 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  }]]..      }..  
12e50 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
12e60 20 67 65 74 44 61 74 65 54 69 6d 65 54 69 63 6b   getDateTimeTick
12e70 73 20 7b 20 76 61 6c 75 65 20 7b 6c 6f 63 61 6c  s { value {local
12e80 20 22 22 7d 20 7b 64 65 66 61 75 6c 74 20 22 22   ""} {default ""
12e90 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66 20  } } {..      if 
12ea0 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
12eb0 24 76 61 6c 75 65 5d 20 3d 3d 20 30 7d 20 74 68  $value] == 0} th
12ec0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65  en {..        re
12ed0 74 75 72 6e 20 24 64 65 66 61 75 6c 74 0d 0a 20  turn $default.. 
12ee0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
12ef0 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20  if {[catch {..  
12f00 20 20 20 20 20 20 73 65 74 20 64 61 74 65 54 69        set dateTi
12f10 6d 65 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b  me [object invok
12f20 65 20 2d 63 72 65 61 74 65 20 5c 0d 0a 20 20 20  e -create \..   
12f30 20 20 20 20 20 20 20 20 20 2d 70 61 72 61 6d 65           -parame
12f40 74 65 72 74 79 70 65 73 20 5b 6c 69 73 74 20 53  tertypes [list S
12f50 74 72 69 6e 67 20 53 74 72 69 6e 67 20 49 46 6f  tring String IFo
12f60 72 6d 61 74 50 72 6f 76 69 64 65 72 20 5c 0d 0a  rmatProvider \..
12f70 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74              Syst
12f80 65 6d 2e 47 6c 6f 62 61 6c 69 7a 61 74 69 6f 6e  em.Globalization
12f90 2e 44 61 74 65 54 69 6d 65 53 74 79 6c 65 73 5d  .DateTimeStyles]
12fa0 20 44 61 74 65 54 69 6d 65 20 50 61 72 73 65 45   DateTime ParseE
12fb0 78 61 63 74 20 5c 0d 0a 20 20 20 20 20 20 20 20  xact \..        
12fc0 20 20 20 20 24 76 61 6c 75 65 20 5b 67 65 74 44      $value [getD
12fd0 61 74 65 54 69 6d 65 46 6f 72 6d 61 74 5d 20 6e  ateTimeFormat] n
12fe0 75 6c 6c 20 41 64 6a 75 73 74 54 6f 55 6e 69 76  ull AdjustToUniv
12ff0 65 72 73 61 6c 5d 0d 0a 20 20 20 20 20 20 7d 5d  ersal]..      }]
13000 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
13010 20 20 72 65 74 75 72 6e 20 24 64 65 66 61 75 6c    return $defaul
13020 74 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  t..      }....  
13030 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
13040 69 73 20 62 6f 6f 6c 65 61 6e 20 2d 73 74 72 69  is boolean -stri
13050 63 74 20 24 6c 6f 63 61 6c 5d 7d 20 74 68 65 6e  ct $local]} then
13060 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   {..        set 
13070 64 61 74 65 54 69 6d 65 20 5b 6f 62 6a 65 63 74  dateTime [object
13080 20 69 6e 76 6f 6b 65 20 2d 63 72 65 61 74 65 20   invoke -create 
13090 44 61 74 65 54 69 6d 65 20 53 70 65 63 69 66 79  DateTime Specify
130a0 4b 69 6e 64 20 5c 0d 0a 20 20 20 20 20 20 20 20  Kind \..        
130b0 20 20 20 20 24 64 61 74 65 54 69 6d 65 20 55 74      $dateTime Ut
130c0 63 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  c]..      } else
130d0 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   {..        retu
130e0 72 6e 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b  rn [object invok
130f0 65 20 24 64 61 74 65 54 69 6d 65 20 54 69 63 6b  e $dateTime Tick
13100 73 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  s]..      }.... 
13110 20 20 20 20 20 69 66 20 7b 24 6c 6f 63 61 6c 7d       if {$local}
13120 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
13130 20 72 65 74 75 72 6e 20 5b 6f 62 6a 65 63 74 20   return [object 
13140 69 6e 76 6f 6b 65 20 24 64 61 74 65 54 69 6d 65  invoke $dateTime
13150 20 54 6f 4c 6f 63 61 6c 54 69 6d 65 2e 54 69 63   ToLocalTime.Tic
13160 6b 73 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  ks]..      } els
13170 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74  e {..        ret
13180 75 72 6e 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f  urn [object invo
13190 6b 65 20 24 64 61 74 65 54 69 6d 65 20 54 6f 55  ke $dateTime ToU
131a0 6e 69 76 65 72 73 61 6c 54 69 6d 65 2e 54 69 63  niversalTime.Tic
131b0 6b 73 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  ks]..      }..  
131c0 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
131d0 20 67 65 74 50 72 6f 70 65 72 74 69 65 73 20 7b   getProperties {
131e0 20 6f 62 6a 65 63 74 20 76 61 72 4e 61 6d 65 20   object varName 
131f0 7d 20 7b 0d 0a 20 20 20 20 20 20 75 70 76 61 72  } {..      upvar
13200 20 31 20 24 76 61 72 4e 61 6d 65 20 70 72 6f 70   1 $varName prop
13210 65 72 74 69 65 73 0d 0a 0d 0a 20 20 20 20 20 20  erties....      
13220 73 65 74 20 63 6f 75 6e 74 20 30 0d 0a 20 20 20  set count 0..   
13230 20 20 20 73 65 74 20 6e 61 6d 65 73 20 5b 6c 69     set names [li
13240 73 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20  st]....      if 
13250 7b 5b 69 73 4f 62 6a 65 63 74 48 61 6e 64 6c 65  {[isObjectHandle
13260 20 24 6f 62 6a 65 63 74 5d 20 26 26 20 24 6f 62   $object] && $ob
13270 6a 65 63 74 20 6e 65 20 22 6e 75 6c 6c 22 7d 20  ject ne "null"} 
13280 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
13290 65 76 61 6c 20 6c 61 70 70 65 6e 64 20 6e 61 6d  eval lappend nam
132a0 65 73 20 5b 6f 62 6a 65 63 74 20 6d 65 6d 62 65  es [object membe
132b0 72 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  rs \..          
132c0 20 20 2d 6d 65 6d 62 65 72 74 79 70 65 73 20 50    -membertypes P
132d0 72 6f 70 65 72 74 79 20 2d 6e 61 6d 65 6f 6e 6c  roperty -nameonl
132e0 79 20 24 6f 62 6a 65 63 74 5d 0d 0a 0d 0a 20 20  y $object]....  
132f0 20 20 20 20 20 20 65 76 61 6c 20 6c 61 70 70 65        eval lappe
13300 6e 64 20 6e 61 6d 65 73 20 5b 6f 62 6a 65 63 74  nd names [object
13310 20 6d 65 6d 62 65 72 73 20 5c 0d 0a 20 20 20 20   members \..    
13320 20 20 20 20 20 20 20 20 2d 6d 65 6d 62 65 72 74          -membert
13330 79 70 65 73 20 46 69 65 6c 64 20 2d 6e 61 6d 65  ypes Field -name
13340 6f 6e 6c 79 20 24 6f 62 6a 65 63 74 5d 0d 0a 20  only $object].. 
13350 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
13360 66 6f 72 65 61 63 68 20 6e 61 6d 65 20 24 6e 61  foreach name $na
13370 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 69  mes {..        i
13380 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  f {[catch {..   
13390 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e         object in
133a0 76 6f 6b 65 20 2d 6f 62 6a 65 63 74 66 6c 61 67  voke -objectflag
133b0 73 20 2b 4e 6f 44 69 73 70 6f 73 65 20 24 6f 62  s +NoDispose $ob
133c0 6a 65 63 74 20 24 6e 61 6d 65 0d 0a 20 20 20 20  ject $name..    
133d0 20 20 20 20 7d 20 76 61 6c 75 65 5d 20 3d 3d 20      } value] == 
133e0 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
133f0 20 20 20 20 20 69 66 20 7b 5b 69 73 4f 62 6a 65       if {[isObje
13400 63 74 48 61 6e 64 6c 65 20 24 76 61 6c 75 65 5d  ctHandle $value]
13410 20 26 26 20 24 76 61 6c 75 65 20 6e 65 20 22 6e   && $value ne "n
13420 75 6c 6c 22 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ull"} then {..  
13430 20 20 20 20 20 20 20 20 20 20 73 65 74 20 65 72            set er
13440 72 6f 72 20 6e 75 6c 6c 3b 20 6f 62 6a 65 63 74  ror null; object
13450 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b   invoke -flags +
13460 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20  NonPublic \..   
13470 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 6d 61               -ma
13480 72 73 68 61 6c 66 6c 61 67 73 20 2b 4e 6f 48 61  rshalflags +NoHa
13490 6e 64 6c 65 20 49 6e 74 65 72 70 72 65 74 65 72  ndle Interpreter
134a0 2e 47 65 74 41 63 74 69 76 65 20 5c 0d 0a 20 20  .GetActive \..  
134b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 41 64                Ad
134c0 64 4f 62 6a 65 63 74 52 65 66 65 72 65 6e 63 65  dObjectReference
134d0 20 4f 6b 20 24 76 61 6c 75 65 20 65 72 72 6f 72   Ok $value error
134e0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
134f0 6c 61 70 70 65 6e 64 20 70 72 6f 70 65 72 74 69  lappend properti
13500 65 73 28 6f 62 6a 65 63 74 73 29 20 5b 6c 69 73  es(objects) [lis
13510 74 20 24 6e 61 6d 65 20 24 76 61 6c 75 65 5d 0d  t $name $value].
13520 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73  .          } els
13530 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e {..           
13540 20 6c 61 70 70 65 6e 64 20 70 72 6f 70 65 72 74   lappend propert
13550 69 65 73 28 76 61 6c 75 65 73 29 20 5b 6c 69 73  ies(values) [lis
13560 74 20 24 6e 61 6d 65 20 24 76 61 6c 75 65 5d 0d  t $name $value].
13570 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  .          }....
13580 20 20 20 20 20 20 20 20 20 20 69 6e 63 72 20 63            incr c
13590 6f 75 6e 74 0d 0a 20 20 20 20 20 20 20 20 7d 20  ount..        } 
135a0 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
135b0 20 20 6c 61 70 70 65 6e 64 20 70 72 6f 70 65 72    lappend proper
135c0 74 69 65 73 28 65 72 72 6f 72 73 29 20 5b 6c 69  ties(errors) [li
135d0 73 74 20 24 6e 61 6d 65 20 24 3a 3a 65 72 72 6f  st $name $::erro
135e0 72 43 6f 64 65 5d 0d 0a 20 20 20 20 20 20 20 20  rCode]..        
135f0 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  }..      }....  
13600 20 20 20 20 72 65 74 75 72 6e 20 24 63 6f 75 6e      return $coun
13610 74 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  t..    }.....   
13620 20 70 72 6f 63 20 67 65 74 41 6c 6c 50 72 6f 70   proc getAllProp
13630 65 72 74 69 65 73 20 7b 20 6f 62 6a 65 63 74 20  erties { object 
13640 76 61 72 4e 61 6d 65 20 7d 20 7b 0d 0a 20 20 20  varName } {..   
13650 20 20 20 75 70 76 61 72 20 31 20 24 76 61 72 4e     upvar 1 $varN
13660 61 6d 65 20 70 72 6f 70 65 72 74 69 65 73 0d 0a  ame properties..
13670 20 20 20 20 20 20 73 65 74 20 76 61 6c 75 65 20        set value 
13680 24 6f 62 6a 65 63 74 0d 0a 0d 0a 20 20 20 20 20  $object....     
13690 20 77 68 69 6c 65 20 7b 74 72 75 65 7d 20 7b 0d   while {true} {.
136a0 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69  .        if {![i
136b0 6e 66 6f 20 65 78 69 73 74 73 20 70 72 6f 70 65  nfo exists prope
136c0 72 74 69 65 73 28 73 65 65 6e 4f 62 6a 65 63 74  rties(seenObject
136d0 73 29 5d 20 7c 7c 20 5c 0d 0a 20 20 20 20 20 20  s)] || \..      
136e0 20 20 20 20 20 20 24 76 61 6c 75 65 20 6e 69 20        $value ni 
136f0 24 70 72 6f 70 65 72 74 69 65 73 28 73 65 65 6e  $properties(seen
13700 4f 62 6a 65 63 74 73 29 7d 20 74 68 65 6e 20 7b  Objects)} then {
13710 0d 0a 20 20 20 20 20 20 20 20 20 20 67 65 74 50  ..          getP
13720 72 6f 70 65 72 74 69 65 73 20 24 76 61 6c 75 65  roperties $value
13730 20 70 72 6f 70 65 72 74 69 65 73 0d 0a 20 20 20   properties..   
13740 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 70         lappend p
13750 72 6f 70 65 72 74 69 65 73 28 73 65 65 6e 4f 62  roperties(seenOb
13760 6a 65 63 74 73 29 20 24 76 61 6c 75 65 0d 0a 20  jects) $value.. 
13770 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
13780 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
13790 78 69 73 74 73 20 70 72 6f 70 65 72 74 69 65 73  xists properties
137a0 28 6f 62 6a 65 63 74 73 29 5d 7d 20 74 68 65 6e  (objects)]} then
137b0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 62 72   {..          br
137c0 65 61 6b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  eak..        }..
137d0 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 6c  ..        if {[l
137e0 6c 65 6e 67 74 68 20 24 70 72 6f 70 65 72 74 69  length $properti
137f0 65 73 28 6f 62 6a 65 63 74 73 29 5d 20 3d 3d 20  es(objects)] == 
13800 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
13810 20 20 20 20 20 75 6e 73 65 74 20 70 72 6f 70 65       unset prope
13820 72 74 69 65 73 28 6f 62 6a 65 63 74 73 29 3b 20  rties(objects); 
13830 62 72 65 61 6b 0d 0a 20 20 20 20 20 20 20 20 7d  break..        }
13840 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20  ....        set 
13850 76 61 6c 75 65 20 5b 6c 69 6e 64 65 78 20 5b 6c  value [lindex [l
13860 69 6e 64 65 78 20 24 70 72 6f 70 65 72 74 69 65  index $propertie
13870 73 28 6f 62 6a 65 63 74 73 29 20 30 5d 20 65 6e  s(objects) 0] en
13880 64 5d 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20  d]..        set 
13890 70 72 6f 70 65 72 74 69 65 73 28 6f 62 6a 65 63  properties(objec
138a0 74 73 29 20 5b 6c 72 61 6e 67 65 20 24 70 72 6f  ts) [lrange $pro
138b0 70 65 72 74 69 65 73 28 6f 62 6a 65 63 74 73 29  perties(objects)
138c0 20 31 20 65 6e 64 5d 0d 0a 20 20 20 20 20 20 7d   1 end]..      }
138d0 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69  ....      if {[i
138e0 6e 66 6f 20 65 78 69 73 74 73 20 70 72 6f 70 65  nfo exists prope
138f0 72 74 69 65 73 28 73 65 65 6e 4f 62 6a 65 63 74  rties(seenObject
13900 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  s)]} then {..   
13910 20 20 20 20 20 66 6f 72 65 61 63 68 20 76 61 6c       foreach val
13920 75 65 20 24 70 72 6f 70 65 72 74 69 65 73 28 73  ue $properties(s
13930 65 65 6e 4f 62 6a 65 63 74 73 29 20 7b 0d 0a 20  eenObjects) {.. 
13940 20 20 20 20 20 20 20 20 20 69 66 20 7b 24 76 61           if {$va
13950 6c 75 65 20 65 71 20 24 6f 62 6a 65 63 74 7d 20  lue eq $object} 
13960 63 6f 6e 74 69 6e 75 65 0d 0a 20 20 20 20 20 20  continue..      
13970 20 20 20 20 63 61 74 63 68 20 7b 6f 62 6a 65 63      catch {objec
13980 74 20 64 69 73 70 6f 73 65 20 24 76 61 6c 75 65  t dispose $value
13990 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  }..        }....
139a0 20 20 20 20 20 20 20 20 75 6e 73 65 74 20 70 72          unset pr
139b0 6f 70 65 72 74 69 65 73 28 73 65 65 6e 4f 62 6a  operties(seenObj
139c0 65 63 74 73 29 0d 0a 20 20 20 20 20 20 7d 0d 0a  ects)..      }..
139d0 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
139e0 6f 63 20 67 65 74 56 61 72 69 61 62 6c 65 73 20  oc getVariables 
139f0 7b 20 76 61 72 4e 61 6d 65 73 20 7b 6f 62 6a 65  { varNames {obje
13a00 63 74 73 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a  cts false} } {..
13a10 20 20 20 20 20 20 73 65 74 20 72 65 73 75 6c 74        set result
13a20 20 5b 6c 69 73 74 5d 0d 0a 0d 0a 20 20 20 20 20   [list]....     
13a30 20 66 6f 72 65 61 63 68 20 76 61 72 4e 61 6d 65   foreach varName
13a40 20 24 76 61 72 4e 61 6d 65 73 20 7b 0d 0a 20 20   $varNames {..  
13a50 20 20 20 20 20 20 69 66 20 7b 5b 75 70 6c 65 76        if {[uplev
13a60 65 6c 20 31 20 5b 6c 69 73 74 20 61 72 72 61 79  el 1 [list array
13a70 20 65 78 69 73 74 73 20 24 76 61 72 4e 61 6d 65   exists $varName
13a80 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  ]]} then {..    
13a90 20 20 20 20 20 20 73 65 74 20 61 72 72 61 79 4e        set arrayN
13aa0 61 6d 65 20 24 76 61 72 4e 61 6d 65 0d 0a 0d 0a  ame $varName....
13ab0 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63            foreac
13ac0 68 20 65 6c 65 6d 65 6e 74 4e 61 6d 65 20 5b 75  h elementName [u
13ad0 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74 20 61  plevel 1 [list a
13ae0 72 72 61 79 20 6e 61 6d 65 73 20 24 61 72 72 61  rray names $arra
13af0 79 4e 61 6d 65 5d 5d 20 7b 0d 0a 20 20 20 20 20  yName]] {..     
13b00 20 20 20 20 20 20 20 73 65 74 20 6e 61 6d 65 20         set name 
13b10 5b 61 70 70 65 6e 64 41 72 67 73 20 24 61 72 72  [appendArgs $arr
13b20 61 79 4e 61 6d 65 20 28 20 24 65 6c 65 6d 65 6e  ayName ( $elemen
13b30 74 4e 61 6d 65 20 29 5d 0d 0a 20 20 20 20 20 20  tName )]..      
13b40 20 20 20 20 20 20 73 65 74 20 76 61 72 56 61 6c        set varVal
13b50 75 65 20 5b 75 70 6c 65 76 65 6c 20 31 20 5b 6c  ue [uplevel 1 [l
13b60 69 73 74 20 73 65 74 20 24 6e 61 6d 65 5d 5d 0d  ist set $name]].
13b70 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ...            i
13b80 66 20 7b 24 6f 62 6a 65 63 74 73 20 26 26 20 5b  f {$objects && [
13b90 69 73 4f 62 6a 65 63 74 48 61 6e 64 6c 65 20 24  isObjectHandle $
13ba0 76 61 72 56 61 6c 75 65 5d 7d 20 74 68 65 6e 20  varValue]} then 
13bb0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
13bc0 20 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61   unset -nocompla
13bd0 69 6e 20 70 72 6f 70 65 72 74 69 65 73 0d 0a 20  in properties.. 
13be0 20 20 20 20 20 20 20 20 20 20 20 20 20 67 65 74               get
13bf0 41 6c 6c 50 72 6f 70 65 72 74 69 65 73 20 24 76  AllProperties $v
13c00 61 72 56 61 6c 75 65 20 70 72 6f 70 65 72 74 69  arValue properti
13c10 65 73 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  es....          
13c20 20 20 20 20 6c 61 70 70 65 6e 64 20 72 65 73 75      lappend resu
13c30 6c 74 20 5b 6c 69 73 74 20 24 6e 61 6d 65 20 5b  lt [list $name [
13c40 61 72 72 61 79 20 67 65 74 20 70 72 6f 70 65 72  array get proper
13c50 74 69 65 73 5d 5d 0d 0a 20 20 20 20 20 20 20 20  ties]]..        
13c60 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
13c70 20 20 20 20 20 20 20 20 20 20 20 20 6c 61 70 70              lapp
13c80 65 6e 64 20 72 65 73 75 6c 74 20 5b 6c 69 73 74  end result [list
13c90 20 24 6e 61 6d 65 20 24 76 61 72 56 61 6c 75 65   $name $varValue
13ca0 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ]..            }
13cb0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
13cc0 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
13cd0 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20 76  .          set v
13ce0 61 72 56 61 6c 75 65 20 5b 75 70 6c 65 76 65 6c  arValue [uplevel
13cf0 20 31 20 5b 6c 69 73 74 20 73 65 74 20 24 76 61   1 [list set $va
13d00 72 4e 61 6d 65 5d 5d 0d 0a 0d 0a 20 20 20 20 20  rName]]....     
13d10 20 20 20 20 20 69 66 20 7b 24 6f 62 6a 65 63 74       if {$object
13d20 73 20 26 26 20 5b 69 73 4f 62 6a 65 63 74 48 61  s && [isObjectHa
13d30 6e 64 6c 65 20 24 76 61 72 56 61 6c 75 65 5d 7d  ndle $varValue]}
13d40 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
13d50 20 20 20 20 20 75 6e 73 65 74 20 2d 6e 6f 63 6f       unset -noco
13d60 6d 70 6c 61 69 6e 20 70 72 6f 70 65 72 74 69 65  mplain propertie
13d70 73 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  s..            g
13d80 65 74 41 6c 6c 50 72 6f 70 65 72 74 69 65 73 20  etAllProperties 
13d90 24 76 61 72 56 61 6c 75 65 20 70 72 6f 70 65 72  $varValue proper
13da0 74 69 65 73 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ties....        
13db0 20 20 20 20 6c 61 70 70 65 6e 64 20 72 65 73 75      lappend resu
13dc0 6c 74 20 5b 6c 69 73 74 20 24 76 61 72 4e 61 6d  lt [list $varNam
13dd0 65 20 5b 61 72 72 61 79 20 67 65 74 20 70 72 6f  e [array get pro
13de0 70 65 72 74 69 65 73 5d 5d 0d 0a 20 20 20 20 20  perties]]..     
13df0 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
13e00 20 20 20 20 20 20 20 20 20 20 20 6c 61 70 70 65             lappe
13e10 6e 64 20 72 65 73 75 6c 74 20 5b 6c 69 73 74 20  nd result [list 
13e20 24 76 61 72 4e 61 6d 65 20 24 76 61 72 56 61 6c  $varName $varVal
13e30 75 65 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  ue]..          }
13e40 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
13e50 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65     }....      re
13e60 74 75 72 6e 20 24 72 65 73 75 6c 74 0d 0a 20 20  turn $result..  
13e70 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
13e80 20 65 6e 75 6d 65 72 61 62 6c 65 54 6f 4c 69 73   enumerableToLis
13e90 74 20 7b 20 65 6e 75 6d 65 72 61 62 6c 65 20 7d  t { enumerable }
13ea0 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 72 65   {..      set re
13eb0 73 75 6c 74 20 5b 6c 69 73 74 5d 0d 0a 0d 0a 20  sult [list].... 
13ec0 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
13ed0 20 6c 65 6e 67 74 68 20 24 65 6e 75 6d 65 72 61   length $enumera
13ee0 62 6c 65 5d 20 3d 3d 20 30 20 7c 7c 20 24 65 6e  ble] == 0 || $en
13ef0 75 6d 65 72 61 62 6c 65 20 65 71 20 22 6e 75 6c  umerable eq "nul
13f00 6c 22 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  l"} then {..    
13f10 20 20 20 20 72 65 74 75 72 6e 20 24 72 65 73 75      return $resu
13f20 6c 74 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  lt..      }.... 
13f30 20 20 20 20 20 6f 62 6a 65 63 74 20 66 6f 72 65       object fore
13f40 61 63 68 20 2d 61 6c 69 61 73 20 69 74 65 6d 20  ach -alias item 
13f50 24 65 6e 75 6d 65 72 61 62 6c 65 20 7b 0d 0a 20  $enumerable {.. 
13f60 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69         if {[stri
13f70 6e 67 20 6c 65 6e 67 74 68 20 24 69 74 65 6d 5d  ng length $item]
13f80 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
13f90 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20          lappend 
13fa0 72 65 73 75 6c 74 20 5b 24 69 74 65 6d 20 54 6f  result [$item To
13fb0 53 74 72 69 6e 67 5d 0d 0a 20 20 20 20 20 20 20  String]..       
13fc0 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20   }..      }.... 
13fd0 20 20 20 20 20 72 65 74 75 72 6e 20 24 72 65 73       return $res
13fe0 75 6c 74 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20  ult..    }..... 
13ff0 20 20 20 70 72 6f 63 20 63 61 74 63 68 41 6e 64     proc catchAnd
14000 52 65 74 75 72 6e 20 7b 20 73 63 72 69 70 74 20  Return { script 
14010 7b 73 74 61 63 6b 54 72 61 63 65 20 66 61 6c 73  {stackTrace fals
14020 65 7d 20 7b 73 74 72 69 63 74 20 74 72 75 65 7d  e} {strict true}
14030 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20   } {..      #.. 
14040 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 45 76 61       # NOTE: Eva
14050 6c 75 61 74 65 20 74 68 65 20 73 63 72 69 70 74  luate the script
14060 20 70 72 6f 76 69 64 65 64 20 62 79 20 6f 75 72   provided by our
14070 20 63 61 6c 6c 65 72 20 69 6e 20 74 68 65 69 72   caller in their
14080 20 63 6f 6e 74 65 78 74 2c 0d 0a 20 20 20 20 20   context,..     
14090 20 23 20 20 20 20 20 20 20 63 61 70 74 75 72 69   #       capturi
140a0 6e 67 20 62 6f 74 68 20 74 68 65 20 72 65 73 75  ng both the resu
140b0 6c 74 20 61 6e 64 20 74 68 65 20 72 65 74 75 72  lt and the retur
140c0 6e 20 63 6f 64 65 2e 0d 0a 20 20 20 20 20 20 23  n code...      #
140d0 0d 0a 20 20 20 20 20 20 73 65 74 20 63 6f 64 65  ..      set code
140e0 20 5b 63 61 74 63 68 20 7b 75 70 6c 65 76 65 6c   [catch {uplevel
140f0 20 31 20 24 73 63 72 69 70 74 7d 20 72 65 73 75   1 $script} resu
14100 6c 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a  lt]....      #..
14110 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 44 69        # NOTE: Di
14120 64 20 74 68 65 20 73 63 72 69 70 74 20 70 72 6f  d the script pro
14130 76 69 64 65 64 20 62 79 20 6f 75 72 20 63 61 6c  vided by our cal
14140 6c 65 72 20 4e 4f 54 20 72 61 69 73 65 20 61 6e  ler NOT raise an
14150 20 65 72 72 6f 72 3f 0d 0a 20 20 20 20 20 20 23   error?..      #
14160 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 73 74 72  ..      if {$str
14170 69 63 74 20 26 26 20 24 63 6f 64 65 20 3d 3d 20  ict && $code == 
14180 30 20 7c 7c 20 21 24 73 74 72 69 63 74 20 26 26  0 || !$strict &&
14190 20 24 63 6f 64 65 20 21 3d 20 31 7d 20 74 68 65   $code != 1} the
141a0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
141b0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
141c0 53 75 63 63 65 73 73 2e 20 20 52 65 74 75 72 6e  Success.  Return
141d0 20 61 20 6c 69 73 74 20 77 69 74 68 20 74 68 65   a list with the
141e0 20 72 65 74 75 72 6e 20 63 6f 64 65 20 61 6e 64   return code and
141f0 20 74 68 65 20 72 65 73 75 6c 74 2e 0d 0a 20 20   the result...  
14200 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
14210 20 72 65 74 75 72 6e 20 5b 6c 69 73 74 20 24 63   return [list $c
14220 6f 64 65 20 24 72 65 73 75 6c 74 5d 0d 0a 20 20  ode $result]..  
14230 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 24 73      } elseif {$s
14240 74 61 63 6b 54 72 61 63 65 7d 20 74 68 65 6e 20  tackTrace} then 
14250 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
14260 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 61        # NOTE: Fa
14270 69 6c 75 72 65 2e 20 20 4f 75 72 20 63 61 6c 6c  ilure.  Our call
14280 65 72 20 77 61 6e 74 73 20 61 20 66 75 6c 6c 20  er wants a full 
14290 73 74 61 63 6b 20 74 72 61 63 65 20 28 69 66 20  stack trace (if 
142a0 61 70 70 6c 69 63 61 62 6c 65 29 2c 0d 0a 20 20  applicable),..  
142b0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 72 65        #       re
142c0 74 75 72 6e 20 61 20 6c 69 73 74 20 77 69 74 68  turn a list with
142d0 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   the return code
142e0 20 61 6e 64 20 74 68 65 20 72 65 73 75 6c 74 20   and the result 
142f0 76 65 72 62 61 74 69 6d 2e 0d 0a 20 20 20 20 20  verbatim...     
14300 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65     #..        re
14310 74 75 72 6e 20 5b 6c 69 73 74 20 24 63 6f 64 65  turn [list $code
14320 20 24 72 65 73 75 6c 74 5d 0d 0a 20 20 20 20 20   $result]..     
14330 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
14340 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
14350 4e 4f 54 45 3a 20 46 61 69 6c 75 72 65 2e 20 20  NOTE: Failure.  
14360 4f 75 72 20 63 61 6c 6c 65 72 20 64 6f 65 73 20  Our caller does 
14370 6e 6f 74 20 77 61 6e 74 20 61 20 66 75 6c 6c 20  not want a full 
14380 73 74 61 63 6b 20 74 72 61 63 65 20 28 69 66 0d  stack trace (if.
14390 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
143a0 20 61 70 70 6c 69 63 61 62 6c 65 29 2c 20 72 65   applicable), re
143b0 74 75 72 6e 20 61 20 6c 69 73 74 20 77 69 74 68  turn a list with
143c0 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   the return code
143d0 2c 20 74 68 65 20 65 72 72 6f 72 0d 0a 20 20 20  , the error..   
143e0 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 64       #       cod
143f0 65 20 66 6f 72 20 74 68 65 20 69 6e 74 65 72 70  e for the interp
14400 72 65 74 65 72 2c 20 61 6e 64 20 74 68 65 20 65  reter, and the e
14410 72 72 6f 72 20 6d 65 73 73 61 67 65 20 75 70 20  rror message up 
14420 74 6f 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20  to the..        
14430 23 20 20 20 20 20 20 20 70 6f 69 6e 74 20 77 68  #       point wh
14440 65 72 65 20 74 68 65 20 73 74 61 63 6b 20 74 72  ere the stack tr
14450 61 63 65 20 73 68 6f 75 6c 64 20 73 74 61 72 74  ace should start
14460 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
14470 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6c 69        return [li
14480 73 74 20 24 63 6f 64 65 20 24 3a 3a 65 72 72 6f  st $code $::erro
14490 72 43 6f 64 65 20 5c 0d 0a 20 20 20 20 20 20 20  rCode \..       
144a0 20 20 20 20 20 5b 65 78 74 72 61 63 74 53 79 73       [extractSys
144b0 74 65 6d 44 61 74 61 53 51 4c 69 74 65 45 78 63  temDataSQLiteExc
144c0 65 70 74 69 6f 6e 4d 65 73 73 61 67 65 20 24 72  eptionMessage $r
144d0 65 73 75 6c 74 5d 5d 0d 0a 20 20 20 20 20 20 7d  esult]]..      }
144e0 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
144f0 70 72 6f 63 20 72 65 73 65 74 45 78 63 65 70 74  proc resetExcept
14500 69 6f 6e 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20  ion {} {..      
14510 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
14520 20 52 65 73 65 74 20 65 78 63 65 70 74 69 6f 6e   Reset exception
14530 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
14540 20 74 68 69 73 20 69 6e 74 65 72 70 72 65 74 65   this interprete
14550 72 20 28 74 6f 20 6e 75 6c 6c 29 2e 0d 0a 20 20  r (to null)...  
14560 20 20 20 20 23 20 20 20 20 20 20 20 54 68 69 73      #       This
14570 20 28 70 72 69 76 61 74 65 29 20 70 72 6f 70 65   (private) prope
14580 72 74 79 20 69 73 20 6d 61 69 6e 74 61 69 6e 65  rty is maintaine
14590 64 20 6f 6e 20 61 20 70 65 72 2d 74 68 72 65 61  d on a per-threa
145a0 64 20 62 61 73 69 73 2e 0d 0a 20 20 20 20 20 20  d basis...      
145b0 23 0d 0a 20 20 20 20 20 20 6f 62 6a 65 63 74 20  #..      object 
145c0 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e  invoke -flags +N
145d0 6f 6e 50 75 62 6c 69 63 20 49 6e 74 65 72 70 72  onPublic Interpr
145e0 65 74 65 72 2e 47 65 74 41 63 74 69 76 65 20 45  eter.GetActive E
145f0 78 63 65 70 74 69 6f 6e 20 6e 75 6c 6c 0d 0a 20  xception null.. 
14600 20 20 20 20 20 72 65 74 75 72 6e 20 22 22 0d 0a       return ""..
14610 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
14620 6f 63 20 63 61 74 63 68 41 6e 64 53 65 74 45 78  oc catchAndSetEx
14630 63 65 70 74 69 6f 6e 20 7b 20 73 63 72 69 70 74  ception { script
14640 20 7b 76 61 72 4e 61 6d 65 20 22 22 7d 20 7d 20   {varName ""} } 
14650 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
14660 20 20 23 20 4e 4f 54 45 3a 20 45 76 61 6c 75 61    # NOTE: Evalua
14670 74 65 20 74 68 65 20 73 63 72 69 70 74 20 70 72  te the script pr
14680 6f 76 69 64 65 64 20 62 79 20 6f 75 72 20 63 61  ovided by our ca
14690 6c 6c 65 72 20 69 6e 20 74 68 65 69 72 20 63 6f  ller in their co
146a0 6e 74 65 78 74 2e 0d 0a 20 20 20 20 20 20 23 0d  ntext...      #.
146b0 0a 20 20 20 20 20 20 63 61 74 63 68 20 7b 75 70  .      catch {up
146c0 6c 65 76 65 6c 20 31 20 24 73 63 72 69 70 74 7d  level 1 $script}
146d0 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
146e0 20 20 20 23 20 4e 4f 54 45 3a 20 47 72 61 62 20     # NOTE: Grab 
146f0 74 68 65 20 28 70 72 69 76 61 74 65 29 20 65 78  the (private) ex
14700 63 65 70 74 69 6f 6e 20 70 72 6f 70 65 72 74 79  ception property
14710 20 66 72 6f 6d 20 74 68 69 73 20 69 6e 74 65 72   from this inter
14720 70 72 65 74 65 72 2c 0d 0a 20 20 20 20 20 20 23  preter,..      #
14730 20 20 20 20 20 20 20 66 6f 72 20 74 68 69 73 20         for this 
14740 74 68 72 65 61 64 2c 20 61 6e 64 20 61 64 64 20  thread, and add 
14750 61 73 20 61 6e 20 6f 70 61 71 75 65 20 6f 62 6a  as an opaque obj
14760 65 63 74 20 68 61 6e 64 6c 65 20 69 6e 20 74 68  ect handle in th
14770 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
14780 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72 20   context of our 
14790 63 61 6c 6c 65 72 2e 0d 0a 20 20 20 20 20 20 23  caller...      #
147a0 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72  ..      if {[str
147b0 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 61 72 4e  ing length $varN
147c0 61 6d 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ame] > 0} then {
147d0 0d 0a 20 20 20 20 20 20 20 20 75 70 76 61 72 20  ..        upvar 
147e0 31 20 24 76 61 72 4e 61 6d 65 20 65 78 63 65 70  1 $varName excep
147f0 74 69 6f 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  tion..      }...
14800 0a 20 20 20 20 20 20 73 65 74 20 65 78 63 65 70  .      set excep
14810 74 69 6f 6e 20 5b 6f 62 6a 65 63 74 20 69 6e 76  tion [object inv
14820 6f 6b 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  oke \..         
14830 20 2d 61 6c 69 61 73 20 2d 66 6c 61 67 73 20 2b   -alias -flags +
14840 4e 6f 6e 50 75 62 6c 69 63 20 49 6e 74 65 72 70  NonPublic Interp
14850 72 65 74 65 72 2e 47 65 74 41 63 74 69 76 65 20  reter.GetActive 
14860 45 78 63 65 70 74 69 6f 6e 5d 0d 0a 0d 0a 20 20  Exception]....  
14870 20 20 20 20 72 65 74 75 72 6e 20 22 22 0d 0a 20      return "".. 
14880 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
14890 63 20 63 6f 6d 70 69 6c 65 43 53 68 61 72 70 57  c compileCSharpW
148a0 69 74 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  ith {..         
148b0 20 20 20 74 65 78 74 20 6d 65 6d 6f 72 79 20 73     text memory s
148c0 79 6d 62 6f 6c 73 20 73 74 72 69 63 74 20 72 65  ymbols strict re
148d0 73 75 6c 74 73 56 61 72 4e 61 6d 65 20 65 72 72  sultsVarName err
148e0 6f 72 73 56 61 72 4e 61 6d 65 20 66 69 6c 65 4e  orsVarName fileN
148f0 61 6d 65 73 0d 0a 20 20 20 20 20 20 20 20 20 20  ames..          
14900 20 20 61 72 67 73 20 7d 20 7b 0d 0a 20 20 20 20    args } {..    
14910 20 20 74 72 79 20 7b 0d 0a 20 20 20 20 20 20 20    try {..       
14920 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
14930 54 45 3a 20 53 69 6e 63 65 20 77 65 20 61 72 65  TE: Since we are
14940 20 67 6f 69 6e 67 20 74 6f 20 75 73 65 20 74 68   going to use th
14950 69 73 20 6d 65 74 68 6f 64 20 6e 61 6d 65 20 61  is method name a
14960 20 6c 6f 74 2c 20 61 73 73 69 67 6e 0d 0a 20 20   lot, assign..  
14970 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69 74        #       it
14980 20 74 6f 20 61 20 76 61 72 69 61 62 6c 65 20 66   to a variable f
14990 69 72 73 74 2e 0d 0a 20 20 20 20 20 20 20 20 23  irst...        #
149a0 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 61 64  ..        set ad
149b0 64 20 52 65 66 65 72 65 6e 63 65 64 41 73 73 65  d ReferencedAsse
149c0 6d 62 6c 69 65 73 2e 41 64 64 0d 0a 0d 0a 20 20  mblies.Add....  
149d0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
149e0 20 23 20 4e 4f 54 45 3a 20 43 72 65 61 74 65 20   # NOTE: Create 
149f0 74 68 65 20 62 61 73 65 20 63 6f 6d 6d 61 6e 64  the base command
14a00 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6e 64   to evaluate and
14a10 20 61 64 64 20 74 68 65 20 70 72 6f 70 65 72 74   add the propert
14a20 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  y..        #    
14a30 20 20 20 73 65 74 74 69 6e 67 73 20 74 68 61 74     settings that
14a40 20 61 72 65 20 61 6c 6d 6f 73 74 20 61 6c 77 61   are almost alwa
14a50 79 73 20 6e 65 65 64 65 64 20 62 79 20 6f 75 72  ys needed by our
14a60 20 75 6e 69 74 20 74 65 73 74 73 0d 0a 20 20 20   unit tests..   
14a70 20 20 20 20 20 23 20 20 20 20 20 20 20 28 69 2e       #       (i.
14a80 65 2e 20 74 68 65 20 53 79 73 74 65 6d 20 61 6e  e. the System an
14a90 64 20 53 79 73 74 65 6d 2e 44 61 74 61 20 61 73  d System.Data as
14aa0 73 65 6d 62 6c 79 20 72 65 66 65 72 65 6e 63 65  sembly reference
14ab0 73 29 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  s)...        #..
14ac0 20 20 20 20 20 20 20 20 73 65 74 20 63 6f 6d 6d          set comm
14ad0 61 6e 64 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20  and [list \..   
14ae0 20 20 20 20 20 20 20 20 20 63 6f 6d 70 69 6c 65           compile
14af0 43 53 68 61 72 70 20 24 74 65 78 74 20 24 6d 65  CSharp $text $me
14b00 6d 6f 72 79 20 24 73 79 6d 62 6f 6c 73 20 24 73  mory $symbols $s
14b10 74 72 69 63 74 20 72 65 73 75 6c 74 73 20 5c 0d  trict results \.
14b20 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 72 72  .            err
14b30 6f 72 73 20 24 61 64 64 20 53 79 73 74 65 6d 2e  ors $add System.
14b40 64 6c 6c 20 24 61 64 64 20 53 79 73 74 65 6d 2e  dll $add System.
14b50 44 61 74 61 2e 64 6c 6c 20 24 61 64 64 20 5c 0d  Data.dll $add \.
14b60 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73  .            Sys
14b70 74 65 6d 2e 54 72 61 6e 73 61 63 74 69 6f 6e 73  tem.Transactions
14b80 2e 64 6c 6c 20 24 61 64 64 20 53 79 73 74 65 6d  .dll $add System
14b90 2e 58 6d 6c 2e 64 6c 6c 5d 0d 0a 0d 0a 20 20 20  .Xml.dll]....   
14ba0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
14bb0 23 20 4e 4f 54 45 3a 20 41 64 64 20 61 6c 6c 20  # NOTE: Add all 
14bc0 74 68 65 20 70 72 6f 76 69 64 65 64 20 66 69 6c  the provided fil
14bd0 65 20 6e 61 6d 65 73 20 61 73 20 61 73 73 65 6d  e names as assem
14be0 62 6c 79 20 72 65 66 65 72 65 6e 63 65 73 2e 0d  bly references..
14bf0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
14c00 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65      foreach file
14c10 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 73 20  Name $fileNames 
14c20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6c 61 70  {..          lap
14c30 70 65 6e 64 20 63 6f 6d 6d 61 6e 64 20 24 61 64  pend command $ad
14c40 64 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65  d [getBinaryFile
14c50 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 5d 0d  Name $fileName].
14c60 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
14c70 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
14c80 20 23 20 4e 4f 54 45 3a 20 41 64 64 20 65 78 74   # NOTE: Add ext
14c90 72 61 20 61 72 67 75 6d 65 6e 74 73 2c 20 69 66  ra arguments, if
14ca0 20 61 6e 79 2c 20 74 6f 20 74 68 65 20 63 6f 6d   any, to the com
14cb0 6d 61 6e 64 20 74 6f 20 65 76 61 6c 75 61 74 65  mand to evaluate
14cc0 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
14cd0 20 20 20 20 20 20 65 76 61 6c 20 6c 61 70 70 65        eval lappe
14ce0 6e 64 20 63 6f 6d 6d 61 6e 64 20 24 61 72 67 73  nd command $args
14cf0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
14d00 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41         # NOTE: A
14d10 6c 69 61 73 20 74 68 65 20 63 6f 6d 70 69 6c 65  lias the compile
14d20 72 20 6c 6f 63 61 6c 20 72 65 73 75 6c 74 73 20  r local results 
14d30 61 6e 64 20 65 72 72 6f 72 73 20 76 61 72 69 61  and errors varia
14d40 62 6c 65 73 20 74 6f 0d 0a 20 20 20 20 20 20 20  bles to..       
14d50 20 23 20 20 20 20 20 20 20 74 68 65 20 76 61 72   #       the var
14d60 69 61 62 6c 65 20 6e 61 6d 65 73 20 70 72 6f 76  iable names prov
14d70 69 64 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c  ided by our call
14d80 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  er...        #..
14d90 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72          if {[str
14da0 69 6e 67 20 6c 65 6e 67 74 68 20 24 72 65 73 75  ing length $resu
14db0 6c 74 73 56 61 72 4e 61 6d 65 5d 20 3e 20 30 7d  ltsVarName] > 0}
14dc0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
14dd0 20 20 20 75 70 76 61 72 20 31 20 24 72 65 73 75     upvar 1 $resu
14de0 6c 74 73 56 61 72 4e 61 6d 65 20 72 65 73 75 6c  ltsVarName resul
14df0 74 73 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  ts..        }...
14e00 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74  .        if {[st
14e10 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 65 72 72  ring length $err
14e20 6f 72 73 56 61 72 4e 61 6d 65 5d 20 3e 20 30 7d  orsVarName] > 0}
14e30 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
14e40 20 20 20 75 70 76 61 72 20 31 20 24 65 72 72 6f     upvar 1 $erro
14e50 72 73 56 61 72 4e 61 6d 65 20 65 72 72 6f 72 73  rsVarName errors
14e60 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
14e70 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
14e80 20 20 23 20 4e 4f 54 45 3a 20 45 76 61 6c 75 61    # NOTE: Evalua
14e90 74 65 20 74 68 65 20 63 6f 6e 73 74 72 75 63 74  te the construct
14ea0 65 64 20 5b 63 6f 6d 70 69 6c 65 43 53 68 61 72  ed [compileCShar
14eb0 70 5d 20 63 6f 6d 6d 61 6e 64 20 61 6e 64 0d 0a  p] command and..
14ec0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
14ed0 72 65 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c  return the resul
14ee0 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  t...        #.. 
14ef0 20 20 20 20 20 20 20 65 76 61 6c 20 24 63 6f 6d         eval $com
14f00 6d 61 6e 64 0d 0a 20 20 20 20 20 20 7d 20 66 69  mand..      } fi
14f10 6e 61 6c 6c 79 20 7b 0d 0a 20 20 20 20 20 20 20  nally {..       
14f20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
14f30 54 45 3a 20 49 66 20 74 68 65 20 43 23 20 63 6f  TE: If the C# co
14f40 6d 70 69 6c 65 72 20 77 61 73 20 69 6e 76 6f 6b  mpiler was invok
14f50 65 64 20 75 73 69 6e 67 20 5b 65 78 65 63 5d 2c  ed using [exec],
14f60 20 72 65 73 65 74 20 74 68 65 0d 0a 20 20 20 20   reset the..    
14f70 20 20 20 20 23 20 20 20 20 20 20 20 70 72 65 76      #       prev
14f80 69 6f 75 73 20 70 72 6f 63 65 73 73 20 69 64 65  ious process ide
14f90 6e 74 69 66 69 65 72 20 6e 6f 77 20 28 69 2e 65  ntifier now (i.e
14fa0 2e 20 74 68 61 74 20 77 61 79 2c 20 69 74 20 64  . that way, it d
14fb0 6f 65 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20  oes..        #  
14fc0 20 20 20 20 20 6e 6f 74 20 73 68 6f 77 20 75 70       not show up
14fd0 20 61 73 20 62 65 69 6e 67 20 22 6c 65 61 6b 65   as being "leake
14fe0 64 22 29 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  d")...        #.
14ff0 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69 73  .        if {[is
15000 44 6f 74 4e 65 74 43 6f 72 65 5d 7d 20 74 68 65  DotNetCore]} the
15010 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63  n {..          c
15020 61 74 63 68 20 7b 69 6e 66 6f 20 70 72 65 76 69  atch {info previ
15030 6f 75 73 70 69 64 20 74 72 75 65 7d 0d 0a 20 20  ouspid true}..  
15040 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
15050 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
15060 70 72 6f 63 20 69 73 4d 65 6d 6f 72 79 44 62 20  proc isMemoryDb 
15070 7b 20 66 69 6c 65 4e 61 6d 65 20 7d 20 7b 0d 0a  { fileName } {..
15080 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
15090 20 4e 4f 54 45 3a 20 49 73 20 74 68 65 20 73 70   NOTE: Is the sp
150a0 65 63 69 66 69 65 64 20 64 61 74 61 62 61 73 65  ecified database
150b0 20 66 69 6c 65 20 6e 61 6d 65 20 72 65 61 6c 6c   file name reall
150c0 79 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  y an in-memory d
150d0 61 74 61 62 61 73 65 3f 0d 0a 20 20 20 20 20 20  atabase?..      
150e0 23 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  #..      return 
150f0 5b 65 78 70 72 20 7b 24 66 69 6c 65 4e 61 6d 65  [expr {$fileName
15100 20 65 71 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 7c   eq ":memory:" |
15110 7c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b  | \..          [
15120 73 74 72 69 6e 67 20 72 61 6e 67 65 20 24 66 69  string range $fi
15130 6c 65 4e 61 6d 65 20 30 20 31 32 5d 20 65 71 20  leName 0 12] eq 
15140 22 66 69 6c 65 3a 3a 6d 65 6d 6f 72 79 3a 22 7d  "file::memory:"}
15150 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  ]..    }.....   
15160 20 70 72 6f 63 20 69 73 54 61 62 6c 65 49 6e 44   proc isTableInD
15170 62 20 7b 20 6e 61 6d 65 20 7b 76 61 72 4e 61 6d  b { name {varNam
15180 65 20 64 62 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  e db} } {..     
15190 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
151a0 3a 20 52 65 66 65 72 20 74 6f 20 74 68 65 20 73  : Refer to the s
151b0 70 65 63 69 66 69 65 64 20 76 61 72 69 61 62 6c  pecified variabl
151c0 65 20 28 65 2e 67 2e 20 22 64 62 22 29 20 69 6e  e (e.g. "db") in
151d0 20 74 68 65 20 63 6f 6e 74 65 78 74 20 6f 66 20   the context of 
151e0 6f 75 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20  our..      #    
151f0 20 20 20 63 61 6c 6c 65 72 2e 20 20 49 74 20 63     caller.  It c
15200 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74 61  ontains the data
15210 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
15220 68 61 6e 64 6c 65 20 74 68 61 74 20 77 69 6c 6c  handle that will
15230 20 62 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20   be..      #    
15240 20 20 20 75 73 65 64 20 74 6f 20 65 78 65 63 75     used to execu
15250 74 65 20 74 68 65 20 71 75 65 72 79 20 75 73 65  te the query use
15260 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69  d to determine i
15270 66 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c  f the named tabl
15280 65 20 69 73 0d 0a 20 20 20 20 20 20 23 20 20 20  e is..      #   
15290 20 20 20 20 70 72 65 73 65 6e 74 20 69 6e 20 74      present in t
152a0 68 61 74 20 64 61 74 61 62 61 73 65 2e 0d 0a 20  hat database... 
152b0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 75 70       #..      up
152c0 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65 20 64  var 1 $varName d
152d0 62 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  b....      #..  
152e0 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20      # NOTE: Use 
152f0 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
15300 72 20 74 61 62 6c 65 20 74 6f 20 64 65 74 65 72  r table to deter
15310 6d 69 6e 65 20 69 66 20 74 68 65 20 6e 61 6d 65  mine if the name
15320 64 20 74 61 62 6c 65 20 69 73 0d 0a 20 20 20 20  d table is..    
15330 20 20 23 20 20 20 20 20 20 20 70 72 65 73 65 6e    #       presen
15340 74 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  t in the databas
15350 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  e...      #..   
15360 20 20 20 73 65 74 20 73 71 6c 20 7b 0d 0a 20 20     set sql {..  
15370 20 20 20 20 20 20 53 45 4c 45 43 54 20 43 4f 55        SELECT COU
15380 4e 54 28 2a 29 20 46 52 4f 4d 20 73 71 6c 69 74  NT(*) FROM sqlit
15390 65 5f 6d 61 73 74 65 72 20 57 48 45 52 45 20 74  e_master WHERE t
153a0 79 70 65 20 3d 20 27 74 61 62 6c 65 27 20 41 4e  ype = 'table' AN
153b0 44 20 6e 61 6d 65 20 3d 20 3f 3b 0d 0a 20 20 20  D name = ?;..   
153c0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
153d0 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52  .      # NOTE: R
153e0 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69  eturn non-zero i
153f0 66 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c  f the named tabl
15400 65 20 69 73 20 70 72 65 73 65 6e 74 2e 0d 0a 20  e is present... 
15410 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65       #..      re
15420 74 75 72 6e 20 5b 65 78 70 72 20 7b 0d 0a 20 20  turn [expr {..  
15430 20 20 20 20 20 20 5b 73 71 6c 20 65 78 65 63 75        [sql execu
15440 74 65 20 2d 65 78 65 63 75 74 65 20 73 63 61 6c  te -execute scal
15450 61 72 20 24 64 62 20 24 73 71 6c 20 5b 6c 69 73  ar $db $sql [lis
15460 74 20 70 61 72 61 6d 31 20 53 74 72 69 6e 67 20  t param1 String 
15470 24 6e 61 6d 65 5d 5d 20 3e 20 30 0d 0a 20 20 20  $name]] > 0..   
15480 20 20 20 7d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d     }]..    }....
15490 0a 20 20 20 20 70 72 6f 63 20 67 65 74 44 62 44  .    proc getDbD
154a0 65 66 61 75 6c 74 50 61 67 65 53 69 7a 65 20 7b  efaultPageSize {
154b0 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  } {..      if {[
154c0 63 61 74 63 68 20 7b 65 78 65 63 75 74 65 53 71  catch {executeSq
154d0 6c 20 22 50 52 41 47 4d 41 20 70 61 67 65 5f 73  l "PRAGMA page_s
154e0 69 7a 65 3b 22 20 73 63 61 6c 61 72 7d 20 72 65  ize;" scalar} re
154f0 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  sult] == 0} then
15500 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   {..        retu
15510 72 6e 20 24 72 65 73 75 6c 74 0d 0a 20 20 20 20  rn $result..    
15520 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
15530 20 20 20 20 72 65 74 75 72 6e 20 30 0d 0a 20 20      return 0..  
15540 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
15550 0a 20 20 20 20 70 72 6f 63 20 67 65 74 44 62 44  .    proc getDbD
15560 65 66 61 75 6c 74 43 61 63 68 65 53 69 7a 65 20  efaultCacheSize 
15570 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b  {} {..      if {
15580 5b 63 61 74 63 68 20 7b 65 78 65 63 75 74 65 53  [catch {executeS
15590 71 6c 20 22 50 52 41 47 4d 41 20 63 61 63 68 65  ql "PRAGMA cache
155a0 5f 73 69 7a 65 3b 22 20 73 63 61 6c 61 72 7d 20  _size;" scalar} 
155b0 72 65 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68  result] == 0} th
155c0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65  en {..        re
155d0 74 75 72 6e 20 24 72 65 73 75 6c 74 0d 0a 20 20  turn $result..  
155e0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
155f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 0d 0a        return 0..
15600 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
15610 0c 0d 0a 20 20 20 20 70 72 6f 63 20 75 73 65 4c  ...    proc useL
15620 65 67 61 63 79 44 62 50 61 67 65 41 6e 64 43 61  egacyDbPageAndCa
15630 63 68 65 53 69 7a 65 73 20 7b 20 76 61 72 4e 61  cheSizes { varNa
15640 6d 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  me } {..      #.
15650 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52  .      # NOTE: R
15660 65 66 65 72 20 74 6f 20 74 68 65 20 73 70 65 63  efer to the spec
15670 69 66 69 65 64 20 76 61 72 69 61 62 6c 65 20 28  ified variable (
15680 65 2e 67 2e 20 22 64 62 22 29 20 69 6e 20 74 68  e.g. "db") in th
15690 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72  e context of our
156a0 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
156b0 63 61 6c 6c 65 72 2e 20 20 49 74 20 63 6f 6e 74  caller.  It cont
156c0 61 69 6e 73 20 74 68 65 20 64 61 74 61 62 61 73  ains the databas
156d0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e  e connection han
156e0 64 6c 65 20 74 68 61 74 20 77 69 6c 6c 20 62 65  dle that will be
156f0 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
15700 75 73 65 64 20 74 6f 20 65 78 65 63 75 74 65 20  used to execute 
15710 71 75 65 72 69 65 73 20 75 73 65 64 20 74 6f 20  queries used to 
15720 73 65 74 20 74 68 65 20 70 61 67 65 20 61 6e 64  set the page and
15730 20 63 61 63 68 65 20 73 69 7a 65 73 2e 0d 0a 20   cache sizes... 
15740 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 75 70       #..      up
15750 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65 20 64  var 1 $varName d
15760 62 0d 0a 0d 0a 20 20 20 20 20 20 73 71 6c 20 65  b....      sql e
15770 78 65 63 75 74 65 20 24 64 62 20 7b 0d 0a 20 20  xecute $db {..  
15780 20 20 20 20 20 20 50 52 41 47 4d 41 20 70 61 67        PRAGMA pag
15790 65 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b 0d 0a  e_size = 1024;..
157a0 20 20 20 20 20 20 20 20 50 52 41 47 4d 41 20 63          PRAGMA c
157b0 61 63 68 65 5f 73 69 7a 65 20 3d 20 32 30 30 30  ache_size = 2000
157c0 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  ;..      }....  
157d0 20 20 20 20 72 65 74 75 72 6e 20 5b 6c 69 73 74      return [list
157e0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73   \..          [s
157f0 71 6c 20 65 78 65 63 75 74 65 20 2d 65 78 65 63  ql execute -exec
15800 75 74 65 20 73 63 61 6c 61 72 20 24 64 62 20 22  ute scalar $db "
15810 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65  PRAGMA page_size
15820 3b 22 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ;"] \..         
15830 20 5b 73 71 6c 20 65 78 65 63 75 74 65 20 2d 65   [sql execute -e
15840 78 65 63 75 74 65 20 73 63 61 6c 61 72 20 24 64  xecute scalar $d
15850 62 20 22 50 52 41 47 4d 41 20 63 61 63 68 65 5f  b "PRAGMA cache_
15860 73 69 7a 65 3b 22 5d 5d 0d 0a 20 20 20 20 7d 0d  size;"]]..    }.
15870 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 6e 6f 72  ....    proc nor
15880 6d 61 6c 69 7a 65 45 78 63 65 70 74 69 6f 6e 4d  malizeExceptionM
15890 65 73 73 61 67 65 20 7b 20 76 61 6c 75 65 20 7d  essage { value }
158a0 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73   {..      if {[s
158b0 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 61  tring length $va
158c0 6c 75 65 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  lue] == 0} then 
158d0 7b 72 65 74 75 72 6e 20 24 76 61 6c 75 65 7d 0d  {return $value}.
158e0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 73  .      return [s
158f0 74 72 69 6e 67 20 6d 61 70 20 5b 6c 69 73 74 20  tring map [list 
15900 5c 72 5c 6e 20 22 20 3d 3d 3e 20 22 20 5c 6e 20  \r\n " ==> " \n 
15910 22 20 3d 3d 3e 20 22 5d 20 24 76 61 6c 75 65 5d  " ==> "] $value]
15920 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
15930 70 72 6f 63 20 65 78 74 72 61 63 74 53 79 73 74  proc extractSyst
15940 65 6d 44 61 74 61 53 51 4c 69 74 65 45 78 63 65  emDataSQLiteExce
15950 70 74 69 6f 6e 4d 65 73 73 61 67 65 20 7b 20 76  ptionMessage { v
15960 61 6c 75 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20  alue } {..      
15970 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
15980 20 49 66 20 74 68 65 20 73 74 72 69 6e 67 20 63   If the string c
15990 6f 6e 66 6f 72 6d 73 20 74 6f 20 66 6f 72 6d 61  onforms to forma
159a0 74 20 6f 66 20 74 68 65 20 6e 6f 72 6d 61 6c 20  t of the normal 
159b0 65 78 63 65 70 74 69 6f 6e 0d 0a 20 20 20 20 20  exception..     
159c0 20 23 20 20 20 20 20 20 20 65 72 72 6f 72 20 73   #       error s
159d0 74 72 69 6e 67 73 2c 20 65 78 74 72 61 63 74 20  trings, extract 
159e0 61 6e 64 20 72 65 74 75 72 6e 20 6f 6e 6c 79 20  and return only 
159f0 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  the error messag
15a00 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
15a10 20 70 6f 72 74 69 6f 6e 20 69 74 73 65 6c 66 2e   portion itself.
15a20 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
15a30 20 73 65 74 20 70 61 74 74 65 72 6e 73 20 5b 6c   set patterns [l
15a40 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 7b 53 79  ist \..      {Sy
15a50 73 74 65 6d 5c 2e 44 61 74 61 5c 2e 53 51 4c 69  stem\.Data\.SQLi
15a60 74 65 5c 2e 53 51 4c 69 74 65 45 78 63 65 70 74  te\.SQLiteExcept
15a70 69 6f 6e 20 5c 28 30 78 28 3f 3a 30 7c 38 29 5b  ion \(0x(?:0|8)[
15a80 30 2d 39 41 2d 46 61 2d 66 5d 7b 37 7d 5c 29 3a  0-9A-Fa-f]{7}\):
15a90 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 28 2e 2b  \..          (.+
15aa0 3f 29 20 20 28 3f 3a 20 29 3f 61 74 7d 20 5c 0d  ?)  (?: )?at} \.
15ab0 0a 20 20 20 20 20 20 7b 53 79 73 74 65 6d 5c 2e  .      {System\.
15ac0 44 61 74 61 5c 2e 53 51 4c 69 74 65 5c 2e 53 51  Data\.SQLite\.SQ
15ad0 4c 69 74 65 45 78 63 65 70 74 69 6f 6e 3a 20 28  LiteException: (
15ae0 2e 2b 3f 29 20 20 28 3f 3a 20 29 3f 61 74 7d 20  .+?)  (?: )?at} 
15af0 5c 0d 0a 20 20 20 20 20 20 7b 45 61 67 6c 65 5c  \..      {Eagle\
15b00 2e 5f 43 6f 6d 70 6f 6e 65 6e 74 73 5c 2e 50 75  ._Components\.Pu
15b10 62 6c 69 63 5c 2e 53 63 72 69 70 74 45 78 63 65  blic\.ScriptExce
15b20 70 74 69 6f 6e 3a 20 28 2e 2b 3f 29 20 20 28 3f  ption: (.+?)  (?
15b30 3a 20 29 3f 61 74 7d 5d 0d 0a 0d 0a 20 20 20 20  : )?at}]....    
15b40 20 20 66 6f 72 65 61 63 68 20 70 61 74 74 65 72    foreach patter
15b50 6e 20 24 70 61 74 74 65 72 6e 73 20 7b 0d 0a 20  n $patterns {.. 
15b60 20 20 20 20 20 20 20 69 66 20 7b 5b 72 65 67 65         if {[rege
15b70 78 70 20 2d 2d 20 24 70 61 74 74 65 72 6e 20 24  xp -- $pattern $
15b80 76 61 6c 75 65 20 64 75 6d 6d 79 20 6d 65 73 73  value dummy mess
15b90 61 67 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  age]} then {..  
15ba0 20 20 20 20 20 20 20 20 73 65 74 20 6d 65 73 73          set mess
15bb0 61 67 65 20 5b 73 74 72 69 6e 67 20 6d 61 70 20  age [string map 
15bc0 5b 6c 69 73 74 20 5c 72 5c 6e 20 5c 6e 5d 20 5b  [list \r\n \n] [
15bd0 73 74 72 69 6e 67 20 74 72 69 6d 20 24 6d 65 73  string trim $mes
15be0 73 61 67 65 5d 5d 0d 0a 20 20 20 20 20 20 20 20  sage]]..        
15bf0 20 20 73 65 74 20 6c 69 6e 65 73 20 5b 73 70 6c    set lines [spl
15c00 69 74 20 24 6d 65 73 73 61 67 65 20 5c 6e 5d 0d  it $message \n].
15c10 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  ...          if 
15c20 7b 5b 6c 6c 65 6e 67 74 68 20 24 6c 69 6e 65 73  {[llength $lines
15c30 5d 20 3d 3d 20 32 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 2} then {..
15c40 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
15c50 5b 6c 69 6e 64 65 78 20 24 6c 69 6e 65 73 20 30  [lindex $lines 0
15c60 5d 20 65 71 20 5b 6c 69 6e 64 65 78 20 24 6c 69  ] eq [lindex $li
15c70 6e 65 73 20 31 5d 7d 20 74 68 65 6e 20 7b 0d 0a  nes 1]} then {..
15c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
15c90 74 75 72 6e 20 5b 6c 69 6e 64 65 78 20 24 6c 69  turn [lindex $li
15ca0 6e 65 73 20 30 5d 0d 0a 20 20 20 20 20 20 20 20  nes 0]..        
15cb0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
15cc0 20 20 20 20 20 72 65 74 75 72 6e 20 5b 61 70 70       return [app
15cd0 65 6e 64 41 72 67 73 20 5b 6c 69 6e 64 65 78 20  endArgs [lindex 
15ce0 24 6c 69 6e 65 73 20 30 5d 20 22 20 2d 2d 20 22  $lines 0] " -- "
15cf0 20 5b 6c 69 6e 64 65 78 20 24 6c 69 6e 65 73 20   [lindex $lines 
15d00 31 5d 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  1]]..          }
15d10 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65  ....          re
15d20 74 75 72 6e 20 24 6d 65 73 73 61 67 65 0d 0a 20  turn $message.. 
15d30 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
15d40 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72  }....      retur
15d50 6e 20 24 76 61 6c 75 65 0d 0a 20 20 20 20 7d 0d  n $value..    }.
15d60 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 74 72 69  ....    proc tri
15d70 6d 53 71 6c 20 7b 20 73 71 6c 20 7d 20 7b 0d 0a  mSql { sql } {..
15d80 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 72 65        return [re
15d90 67 73 75 62 20 2d 61 6c 6c 20 2d 2d 20 7b 5c 73  gsub -all -- {\s
15da0 2b 7d 20 5b 73 74 72 69 6e 67 20 74 72 69 6d 20  +} [string trim 
15db0 24 73 71 6c 5d 20 22 20 22 5d 0d 0a 20 20 20 20  $sql] " "]..    
15dc0 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 65  }.....    proc e
15dd0 78 65 63 75 74 65 53 71 6c 20 7b 20 73 71 6c 20  xecuteSql { sql 
15de0 7b 65 78 65 63 75 74 65 20 6e 6f 6e 65 7d 20 7b  {execute none} {
15df0 66 6f 72 6d 61 74 20 6e 6f 6e 65 7d 20 7b 66 69  format none} {fi
15e00 6c 65 4e 61 6d 65 20 22 22 7d 20 7d 20 7b 0d 0a  leName ""} } {..
15e10 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
15e20 67 20 6c 65 6e 67 74 68 20 24 66 69 6c 65 4e 61  g length $fileNa
15e30 6d 65 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  me] == 0} then {
15e40 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 3a 6d 65  set fileName :me
15e50 6d 6f 72 79 3a 7d 0d 0a 20 20 20 20 20 20 73 65  mory:}..      se
15e60 74 75 70 44 62 20 24 66 69 6c 65 4e 61 6d 65 20  tupDb $fileName 
15e70 22 22 20 22 22 20 22 22 20 22 22 20 22 22 20 66  "" "" "" "" "" f
15e80 61 6c 73 65 20 66 61 6c 73 65 20 66 61 6c 73 65  alse false false
15e90 20 66 61 6c 73 65 20 64 62 20 74 72 75 65 0d 0a   false db true..
15ea0 0d 0a 20 20 20 20 20 20 74 72 79 20 7b 0d 0a 20  ..      try {.. 
15eb0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 75         return [u
15ec0 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74 20 5c  plevel 1 [list \
15ed0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ..            sq
15ee0 6c 20 65 78 65 63 75 74 65 20 2d 65 78 65 63 75  l execute -execu
15ef0 74 65 20 24 65 78 65 63 75 74 65 20 2d 66 6f 72  te $execute -for
15f00 6d 61 74 20 24 66 6f 72 6d 61 74 20 24 64 62 20  mat $format $db 
15f10 24 73 71 6c 5d 5d 0d 0a 20 20 20 20 20 20 7d 20  $sql]]..      } 
15f20 66 69 6e 61 6c 6c 79 20 7b 0d 0a 20 20 20 20 20  finally {..     
15f30 20 20 20 73 65 74 20 63 6f 6e 6e 65 63 74 69 6f     set connectio
15f40 6e 20 5b 67 65 74 44 62 43 6f 6e 6e 65 63 74 69  n [getDbConnecti
15f50 6f 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74  on]....        t
15f60 72 79 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ry {..          
15f70 63 6c 65 61 6e 75 70 44 62 20 24 66 69 6c 65 4e  cleanupDb $fileN
15f80 61 6d 65 20 64 62 20 66 61 6c 73 65 20 66 61 6c  ame db false fal
15f90 73 65 20 66 61 6c 73 65 0d 0a 20 20 20 20 20 20  se false..      
15fa0 20 20 7d 20 66 69 6e 61 6c 6c 79 20 7b 0d 0a 20    } finally {.. 
15fb0 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20           object 
15fc0 66 6c 61 67 73 20 24 63 6f 6e 6e 65 63 74 69 6f  flags $connectio
15fd0 6e 20 2d 4e 6f 44 69 73 70 6f 73 65 3b 20 66 72  n -NoDispose; fr
15fe0 65 65 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 0d 0a  eeDbConnection..
15ff0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
16000 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
16010 20 20 70 72 6f 63 20 68 61 73 4e 6f 46 6c 61 67    proc hasNoFlag
16020 73 20 7b 20 76 61 72 4e 61 6d 65 20 6e 6f 6e 65  s { varName none
16030 20 7d 20 7b 0d 0a 20 20 20 20 20 20 75 70 76 61   } {..      upva
16040 72 20 31 20 24 76 61 72 4e 61 6d 65 20 66 6c 61  r 1 $varName fla
16050 67 73 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b  gs....      if {
16060 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 66 6c  ![info exists fl
16070 61 67 73 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ags]} then {..  
16080 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75        return tru
16090 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  e..      }....  
160a0 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
160b0 6c 65 6e 67 74 68 20 24 66 6c 61 67 73 5d 20 3d  length $flags] =
160c0 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
160d0 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65       return true
160e0 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
160f0 20 20 20 69 66 20 7b 24 6e 6f 6e 65 20 26 26 20     if {$none && 
16100 24 66 6c 61 67 73 20 65 71 20 22 4e 6f 6e 65 22  $flags eq "None"
16110 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
16120 20 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20    return true.. 
16130 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
16140 72 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20  return false..  
16150 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
16160 20 67 65 74 43 6f 6e 6e 65 63 74 69 6f 6e 46 6c   getConnectionFl
16170 61 67 73 20 7b 20 66 69 6c 65 4e 61 6d 65 20 66  ags { fileName f
16180 6c 61 67 73 20 7b 71 75 69 65 74 20 66 61 6c 73  lags {quiet fals
16190 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  e} } {..      #.
161a0 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46  .      # NOTE: F
161b0 69 67 75 72 65 20 6f 75 74 20 77 68 69 63 68 20  igure out which 
161c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61  database file na
161d0 6d 65 20 6f 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  me or connection
161e0 20 73 74 72 69 6e 67 20 74 68 65 73 65 0d 0a 20   string these.. 
161f0 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e       #       con
16200 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 77 69  nection flags wi
16210 6c 6c 20 61 63 74 75 61 6c 6c 79 20 61 70 70 6c  ll actually appl
16220 79 20 74 6f 2e 20 20 54 68 69 73 20 69 73 20 6e  y to.  This is n
16230 6f 74 20 6e 65 63 65 73 73 61 72 79 0d 0a 20 20  ot necessary..  
16240 20 20 20 20 23 20 20 20 20 20 20 20 69 6e 20 71      #       in q
16250 75 69 65 74 20 6d 6f 64 65 20 62 65 63 61 75 73  uiet mode becaus
16260 65 20 74 68 69 73 20 69 6e 66 6f 72 6d 61 74 69  e this informati
16270 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  on is only used 
16280 66 6f 72 20 6c 6f 67 67 69 6e 67 0d 0a 20 20 20  for logging..   
16290 20 20 20 23 20 20 20 20 20 20 20 61 6e 64 20 72     #       and r
162a0 65 70 6f 72 74 69 6e 67 20 70 75 72 70 6f 73 65  eporting purpose
162b0 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  s...      #..   
162c0 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
162d0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
162e0 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
162f0 74 68 20 24 66 69 6c 65 4e 61 6d 65 5d 20 3e 20  th $fileName] > 
16300 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
16310 20 20 20 20 20 73 65 74 20 64 61 74 61 62 61 73       set databas
16320 65 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 66  e [appendArgs "f
16330 69 6c 65 20 6e 61 6d 65 20 5c 22 22 20 24 66 69  ile name \"" $fi
16340 6c 65 4e 61 6d 65 20 5c 22 5d 0d 0a 20 20 20 20  leName \"]..    
16350 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69      } elseif {[i
16360 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 64 61 74  nfo exists ::dat
16370 61 53 6f 75 72 63 65 5d 20 26 26 20 5c 0d 0a 20  aSource] && \.. 
16380 20 20 20 20 20 20 20 20 20 20 20 21 5b 61 72 72             ![arr
16390 61 79 20 65 78 69 73 74 73 20 3a 3a 64 61 74 61  ay exists ::data
163a0 53 6f 75 72 63 65 5d 7d 20 74 68 65 6e 20 7b 0d  Source]} then {.
163b0 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20 64  .          set d
163c0 61 74 61 62 61 73 65 20 5b 61 70 70 65 6e 64 41  atabase [appendA
163d0 72 67 73 20 22 64 61 74 61 20 73 6f 75 72 63 65  rgs "data source
163e0 20 5c 22 22 20 24 3a 3a 64 61 74 61 53 6f 75 72   \"" $::dataSour
163f0 63 65 20 5c 22 5d 0d 0a 20 20 20 20 20 20 20 20  ce \"]..        
16400 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
16410 20 20 20 20 73 65 74 20 64 61 74 61 62 61 73 65      set database
16420 20 3c 75 6e 6b 6e 6f 77 6e 3e 0d 0a 20 20 20 20   <unknown>..    
16430 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
16440 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
16450 20 23 20 4e 4f 54 45 3a 20 45 76 65 6e 20 74 68   # NOTE: Even th
16460 6f 75 67 68 20 74 68 65 72 65 20 69 73 20 6f 6e  ough there is on
16470 6c 79 20 6f 6e 65 20 73 6f 75 72 63 65 20 6f 66  ly one source of
16480 20 66 6c 61 67 73 20 73 6f 20 66 61 72 2c 20 74   flags so far, t
16490 68 65 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20  hey..      #    
164a0 20 20 20 6d 75 73 74 20 62 65 20 63 6f 6d 62 69     must be combi
164b0 6e 65 64 20 75 73 69 6e 67 20 74 68 65 20 63 6f  ned using the co
164c0 72 72 65 63 74 20 73 79 6e 74 61 78 20 66 6f 72  rrect syntax for
164d0 20 65 6e 75 6d 65 72 61 74 65 64 0d 0a 20 20 20   enumerated..   
164e0 20 20 20 23 20 20 20 20 20 20 20 66 6c 61 67 20     #       flag 
164f0 76 61 6c 75 65 73 20 66 6f 72 20 74 68 65 20 2e  values for the .
16500 4e 45 54 20 46 72 61 6d 65 77 6f 72 6b 2e 0d 0a  NET Framework...
16510 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73        #..      s
16520 65 74 20 66 6c 61 67 73 20 5b 63 6f 6d 62 69 6e  et flags [combin
16530 65 46 6c 61 67 73 20 24 66 6c 61 67 73 20 22 22  eFlags $flags ""
16540 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ]....      #..  
16550 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77      # NOTE: Show
16560 20 28 61 6e 64 20 6c 6f 67 29 20 74 68 65 20 6c   (and log) the l
16570 6f 63 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ocal connection 
16580 66 6c 61 67 73 20 61 6e 64 20 74 68 65 20 61 73  flags and the as
16590 73 6f 63 69 61 74 65 64 0d 0a 20 20 20 20 20 20  sociated..      
165a0 23 20 20 20 20 20 20 20 64 61 74 61 20 73 6f 75  #       data sou
165b0 72 63 65 20 6f 72 20 66 69 6c 65 20 6e 61 6d 65  rce or file name
165c0 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
165d0 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
165e0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69  hen {..        i
165f0 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
16600 20 3a 3a 6e 6f 28 65 6d 69 74 4c 6f 63 61 6c 46   ::no(emitLocalF
16610 6c 61 67 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20  lags)] && \..   
16620 20 20 20 20 20 20 20 20 20 28 21 5b 69 6e 66 6f           (![info
16630 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 65 6d 69   exists ::no(emi
16640 74 4c 6f 63 61 6c 46 6c 61 67 73 49 66 4e 6f 6e  tLocalFlagsIfNon
16650 65 29 5d 20 7c 7c 20 5c 0d 0a 20 20 20 20 20 20  e)] || \..      
16660 20 20 20 20 20 20 20 21 5b 68 61 73 4e 6f 46 6c         ![hasNoFl
16670 61 67 73 20 66 6c 61 67 73 20 66 61 6c 73 65 5d  ags flags false]
16680 29 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  )} then {..     
16690 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
166a0 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
166b0 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
166c0 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6c 6f          "---- lo
166d0 63 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66  cal connection f
166e0 6c 61 67 73 20 66 6f 72 20 22 20 24 64 61 74 61  lags for " $data
166f0 62 61 73 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  base \..        
16700 20 20 20 20 20 20 22 20 61 72 65 3a 20 22 20 5b        " are: " [
16710 65 78 70 72 20 7b 21 5b 68 61 73 4e 6f 46 6c 61  expr {![hasNoFla
16720 67 73 20 66 6c 61 67 73 20 66 61 6c 73 65 5d 20  gs flags false] 
16730 3f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ? \..           
16740 20 20 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c     [appendArgs \
16750 22 20 24 66 6c 61 67 73 20 5c 22 5d 20 3a 20 22  " $flags \"] : "
16760 3c 6e 6f 6e 65 3e 22 7d 5d 20 5c 6e 5d 0d 0a 20  <none>"}] \n].. 
16770 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
16780 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
16790 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77      # NOTE: Show
167a0 20 28 61 6e 64 20 6c 6f 67 29 20 74 68 65 20 73   (and log) the s
167b0 68 61 72 65 64 20 63 6f 6e 6e 65 63 74 69 6f 6e  hared connection
167c0 20 66 6c 61 67 73 2e 0d 0a 20 20 20 20 20 20 23   flags...      #
167d0 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 24 71 75  ..      if {!$qu
167e0 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
167f0 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
16800 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a  {..          obj
16810 65 63 74 20 69 6e 76 6f 6b 65 20 53 79 73 74 65  ect invoke Syste
16820 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51  m.Data.SQLite.SQ
16830 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 53  LiteConnection S
16840 68 61 72 65 64 46 6c 61 67 73 0d 0a 20 20 20 20  haredFlags..    
16850 20 20 20 20 7d 20 73 68 61 72 65 64 46 6c 61 67      } sharedFlag
16860 73 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  s] == 0} then {.
16870 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21  .          if {!
16880 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
16890 6f 28 65 6d 69 74 53 68 61 72 65 64 46 6c 61 67  o(emitSharedFlag
168a0 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  s)] && \..      
168b0 20 20 20 20 20 20 20 20 28 21 5b 69 6e 66 6f 20          (![info 
168c0 65 78 69 73 74 73 20 3a 3a 6e 6f 28 65 6d 69 74  exists ::no(emit
168d0 53 68 61 72 65 64 46 6c 61 67 73 49 66 4e 6f 6e  SharedFlagsIfNon
168e0 65 29 5d 20 7c 7c 20 5c 0d 0a 20 20 20 20 20 20  e)] || \..      
168f0 20 20 20 20 20 20 20 20 20 21 5b 68 61 73 4e 6f           ![hasNo
16900 46 6c 61 67 73 20 73 68 61 72 65 64 46 6c 61 67  Flags sharedFlag
16910 73 20 74 72 75 65 5d 29 7d 20 74 68 65 6e 20 7b  s true])} then {
16920 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
16930 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
16940 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
16950 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
16960 20 20 20 22 2d 2d 2d 2d 20 73 68 61 72 65 64 20     "---- shared 
16970 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73  connection flags
16980 20 66 6f 72 20 22 20 24 64 61 74 61 62 61 73 65   for " $database
16990 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
169a0 20 20 20 20 22 20 61 72 65 3a 20 22 20 5b 65 78      " are: " [ex
169b0 70 72 20 7b 21 5b 68 61 73 4e 6f 46 6c 61 67 73  pr {![hasNoFlags
169c0 20 73 68 61 72 65 64 46 6c 61 67 73 20 74 72 75   sharedFlags tru
169d0 65 5d 20 3f 20 5c 0d 0a 20 20 20 20 20 20 20 20  e] ? \..        
169e0 20 20 20 20 20 20 20 20 5b 61 70 70 65 6e 64 41          [appendA
169f0 72 67 73 20 5c 22 20 24 73 68 61 72 65 64 46 6c  rgs \" $sharedFl
16a00 61 67 73 20 5c 22 5d 20 3a 20 22 3c 6e 6f 6e 65  ags \"] : "<none
16a10 3e 22 7d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  >"}] \n]..      
16a20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
16a30 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
16a40 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
16a50 69 73 74 73 20 3a 3a 6e 6f 28 65 6d 69 74 53 68  ists ::no(emitSh
16a60 61 72 65 64 46 6c 61 67 73 29 5d 20 26 26 20 5c  aredFlags)] && \
16a70 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
16a80 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
16a90 6e 6f 28 65 6d 69 74 53 68 61 72 65 64 46 6c 61  no(emitSharedFla
16aa0 67 73 49 66 55 6e 61 76 61 69 6c 61 62 6c 65 29  gsIfUnavailable)
16ab0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
16ac0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
16ad0 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
16ae0 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
16af0 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
16b00 2d 20 73 68 61 72 65 64 20 63 6f 6e 6e 65 63 74  - shared connect
16b10 69 6f 6e 20 66 6c 61 67 73 20 66 6f 72 20 22 20  ion flags for " 
16b20 24 64 61 74 61 62 61 73 65 20 5c 0d 0a 20 20 20  $database \..   
16b30 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 61               " a
16b40 72 65 3a 20 3c 75 6e 61 76 61 69 6c 61 62 6c 65  re: <unavailable
16b50 3e 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20  >\n"]..         
16b60 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20   }..        }.. 
16b70 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
16b80 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
16b90 20 53 68 6f 77 20 28 61 6e 64 20 6c 6f 67 29 20   Show (and log) 
16ba0 74 68 65 20 64 65 74 65 63 74 65 64 20 67 6c 6f  the detected glo
16bb0 62 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66  bal connection f
16bc0 6c 61 67 73 2c 20 69 66 20 61 6e 79 2e 0d 0a 20  lags, if any... 
16bd0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
16be0 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
16bf0 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21  {..        if {!
16c00 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
16c10 6f 28 65 6d 69 74 47 6c 6f 62 61 6c 46 6c 61 67  o(emitGlobalFlag
16c20 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  s)] && \..      
16c30 20 20 20 20 20 20 28 21 5b 69 6e 66 6f 20 65 78        (![info ex
16c40 69 73 74 73 20 3a 3a 6e 6f 28 65 6d 69 74 47 6c  ists ::no(emitGl
16c50 6f 62 61 6c 46 6c 61 67 73 49 66 4e 6f 6e 65 29  obalFlagsIfNone)
16c60 5d 20 7c 7c 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] || \..        
16c70 20 20 20 20 20 21 5b 68 61 73 4e 6f 46 6c 61 67       ![hasNoFlag
16c80 73 20 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e 5f 66  s ::connection_f
16c90 6c 61 67 73 20 66 61 6c 73 65 5d 29 7d 20 74 68  lags false])} th
16ca0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
16cb0 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
16cc0 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
16cd0 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
16ce0 20 20 20 22 2d 2d 2d 2d 20 67 6c 6f 62 61 6c 20     "---- global 
16cf0 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73  connection flags
16d00 20 61 72 65 3a 20 22 20 5c 0d 0a 20 20 20 20 20   are: " \..     
16d10 20 20 20 20 20 20 20 20 20 5b 65 78 70 72 20 7b           [expr {
16d20 21 5b 68 61 73 4e 6f 46 6c 61 67 73 20 3a 3a 63  ![hasNoFlags ::c
16d30 6f 6e 6e 65 63 74 69 6f 6e 5f 66 6c 61 67 73 20  onnection_flags 
16d40 66 61 6c 73 65 5d 20 3f 20 5c 0d 0a 20 20 20 20  false] ? \..    
16d50 20 20 20 20 20 20 20 20 20 20 5b 61 70 70 65 6e            [appen
16d60 64 41 72 67 73 20 5c 22 20 24 3a 3a 63 6f 6e 6e  dArgs \" $::conn
16d70 65 63 74 69 6f 6e 5f 66 6c 61 67 73 20 5c 22 5d  ection_flags \"]
16d80 20 3a 20 22 3c 6e 6f 6e 65 3e 22 7d 5d 20 5c 6e   : "<none>"}] \n
16d90 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  ]..        }..  
16da0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
16db0 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
16dc0 49 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79  If there are any
16dd0 20 67 6c 6f 62 61 6c 20 28 70 65 72 20 74 65 73   global (per tes
16de0 74 20 72 75 6e 29 20 63 6f 6e 6e 65 63 74 69 6f  t run) connectio
16df0 6e 20 66 6c 61 67 73 20 63 75 72 72 65 6e 74 6c  n flags currentl
16e00 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  y..      #      
16e10 20 73 65 74 2c 20 75 73 65 20 74 68 65 6d 20 6e   set, use them n
16e20 6f 77 20 28 69 2e 65 2e 20 62 79 20 63 6f 6d 62  ow (i.e. by comb
16e30 69 6e 69 6e 67 20 74 68 65 6d 20 77 69 74 68 20  ining them with 
16e40 74 68 65 20 6f 6e 65 73 20 66 6f 72 20 74 68 69  the ones for thi
16e50 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  s..      #      
16e60 20 63 6f 6e 6e 65 63 74 69 6f 6e 29 2e 0d 0a 20   connection)... 
16e70 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
16e80 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
16e90 3a 63 6f 6e 6e 65 63 74 69 6f 6e 5f 66 6c 61 67  :connection_flag
16ea0 73 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  s]} then {..    
16eb0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
16ec0 20 4e 4f 54 45 3a 20 43 6f 6d 62 69 6e 65 20 61   NOTE: Combine a
16ed0 6e 64 2f 6f 72 20 72 65 70 6c 61 63 65 20 74 68  nd/or replace th
16ee0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61  e connection fla
16ef0 67 73 20 61 6e 64 20 74 68 65 6e 20 73 68 6f 77  gs and then show
16f00 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20   the..        # 
16f10 20 20 20 20 20 20 6e 65 77 20 76 61 6c 75 65 2e        new value.
16f20 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
16f30 20 20 20 20 20 73 65 74 20 66 6c 61 67 73 20 5b       set flags [
16f40 63 6f 6d 62 69 6e 65 46 6c 61 67 73 20 24 66 6c  combineFlags $fl
16f50 61 67 73 20 24 3a 3a 63 6f 6e 6e 65 63 74 69 6f  ags $::connectio
16f60 6e 5f 66 6c 61 67 73 5d 0d 0a 0d 0a 20 20 20 20  n_flags]....    
16f70 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
16f80 20 4e 4f 54 45 3a 20 53 68 6f 77 20 28 61 6e 64   NOTE: Show (and
16f90 20 6c 6f 67 29 20 74 68 65 20 6e 65 77 20 65 66   log) the new ef
16fa0 66 65 63 74 69 76 65 20 63 6f 6e 6e 65 63 74 69  fective connecti
16fb0 6f 6e 20 66 6c 61 67 73 2e 0d 0a 20 20 20 20 20  on flags...     
16fc0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66     #..        if
16fd0 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
16fe0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  {..          if 
16ff0 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
17000 3a 6e 6f 28 65 6d 69 74 43 6f 6d 62 69 6e 65 64  :no(emitCombined
17010 46 6c 61 67 73 29 5d 20 26 26 20 5c 0d 0a 20 20  Flags)] && \..  
17020 20 20 20 20 20 20 20 20 20 20 20 20 28 21 5b 69              (![i
17030 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
17040 65 6d 69 74 43 6f 6d 62 69 6e 65 64 46 6c 61 67  emitCombinedFlag
17050 73 49 66 4e 6f 6e 65 29 5d 20 7c 7c 20 5c 0d 0a  sIfNone)] || \..
17060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 21                 !
17070 5b 68 61 73 4e 6f 46 6c 61 67 73 20 66 6c 61 67  [hasNoFlags flag
17080 73 20 66 61 6c 73 65 5d 29 7d 20 74 68 65 6e 20  s false])} then 
17090 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
170a0 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
170b0 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
170c0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
170d0 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 6d 62 69 6e      "---- combin
170e0 65 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c  ed connection fl
170f0 61 67 73 20 66 6f 72 20 22 20 24 64 61 74 61 62  ags for " $datab
17100 61 73 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ase \..         
17110 20 20 20 20 20 20 20 22 20 61 72 65 3a 20 22 20         " are: " 
17120 5b 65 78 70 72 20 7b 21 5b 68 61 73 4e 6f 46 6c  [expr {![hasNoFl
17130 61 67 73 20 66 6c 61 67 73 20 66 61 6c 73 65 5d  ags flags false]
17140 20 3f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   ? \..          
17150 20 20 20 20 20 20 5b 61 70 70 65 6e 64 41 72 67        [appendArg
17160 73 20 5c 22 20 24 66 6c 61 67 73 20 5c 22 5d 20  s \" $flags \"] 
17170 3a 20 22 3c 6e 6f 6e 65 3e 22 7d 5d 20 5c 6e 5d  : "<none>"}] \n]
17180 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
17190 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
171a0 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72  }....      retur
171b0 6e 20 24 66 6c 61 67 73 0d 0a 20 20 20 20 7d 0d  n $flags..    }.
171c0 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74  ....    proc get
171d0 46 6c 61 67 73 50 72 6f 70 65 72 74 79 20 7b 20  FlagsProperty { 
171e0 7b 66 6c 61 67 73 20 22 22 7d 20 7b 71 75 69 65  {flags ""} {quie
171f0 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20  t false} } {..  
17200 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
17210 4f 54 45 3a 20 44 65 74 65 72 6d 69 6e 65 20 77  OTE: Determine w
17220 68 61 74 20 74 68 65 20 63 6f 6d 62 69 6e 65 64  hat the combined
17230 20 28 67 6c 6f 62 61 6c 20 61 6e 64 20 6c 6f 63   (global and loc
17240 61 6c 29 20 63 6f 6e 6e 65 63 74 69 6f 6e 0d 0a  al) connection..
17250 20 20 20 20 20 20 23 20 20 20 20 20 20 20 66 6c        #       fl
17260 61 67 73 20 73 68 6f 75 6c 64 20 62 65 2c 20 70  ags should be, p
17270 6f 73 73 69 62 6c 79 20 71 75 69 65 74 6c 79 2e  ossibly quietly.
17280 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
17290 20 73 65 74 20 66 6c 61 67 73 20 5b 67 65 74 43   set flags [getC
172a0 6f 6e 6e 65 63 74 69 6f 6e 46 6c 61 67 73 20 22  onnectionFlags "
172b0 22 20 24 66 6c 61 67 73 20 24 71 75 69 65 74 5d  " $flags $quiet]
172c0 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
172d0 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 6e 6f     # NOTE: If no
172e0 20 67 6c 6f 62 61 6c 20 6f 72 20 6c 6f 63 61 6c   global or local
172f0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67   connection flag
17300 73 20 77 65 72 65 20 73 70 65 63 69 66 69 65 64  s were specified
17310 2c 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20  , the..      #  
17320 20 20 20 20 20 64 65 66 61 75 6c 74 20 63 6f 6e       default con
17330 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 73 68  nection flags sh
17340 6f 75 6c 64 20 62 65 20 75 73 65 64 3b 20 74 68  ould be used; th
17350 65 72 65 66 6f 72 65 2c 20 72 65 74 75 72 6e 0d  erefore, return.
17360 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61  .      #       a
17370 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 20 69  n empty string i
17380 6e 20 74 68 61 74 20 63 61 73 65 2e 0d 0a 20 20  n that case...  
17390 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
173a0 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
173b0 24 66 6c 61 67 73 5d 20 3d 3d 20 30 7d 20 74 68  $flags] == 0} th
173c0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65  en {..        re
173d0 74 75 72 6e 20 22 22 0d 0a 20 20 20 20 20 20 7d  turn ""..      }
173e0 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
173f0 20 20 20 23 20 4e 4f 54 45 3a 20 49 6e 20 6f 72     # NOTE: In or
17400 64 65 72 20 74 6f 20 63 68 65 63 6b 20 69 66 20  der to check if 
17410 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6e 6e  the default conn
17420 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 61 72 65  ection flags are
17430 20 62 65 69 6e 67 20 75 73 65 64 0d 0a 20 20 20   being used..   
17440 20 20 20 23 20 20 20 20 20 20 20 69 74 20 69 73     #       it is
17450 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 61 74   necessary to at
17460 74 65 6d 70 74 20 61 20 63 6f 6e 76 65 72 73 69  tempt a conversi
17470 6f 6e 20 74 6f 20 74 68 65 20 61 63 74 75 61 6c  on to the actual
17480 20 65 6e 75 6d 65 72 61 74 65 64 0d 0a 20 20 20   enumerated..   
17490 20 20 20 23 20 20 20 20 20 20 20 74 79 70 65 2e     #       type.
174a0 20 20 46 61 69 6c 69 6e 67 20 74 68 61 74 2c 20    Failing that, 
174b0 74 68 65 20 63 68 65 63 6b 20 61 67 61 69 6e 73  the check agains
174c0 74 20 74 68 65 20 64 65 66 61 75 6c 74 20 76 61  t the default va
174d0 6c 75 65 20 77 69 6c 6c 20 62 65 0d 0a 20 20 20  lue will be..   
174e0 20 20 20 23 20 20 20 20 20 20 20 73 6b 69 70 70     #       skipp
174f0 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ed...      #..  
17500 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
17510 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 65 72  ..        set er
17520 72 6f 72 20 6e 75 6c 6c 3b 20 23 20 49 47 4e 4f  ror null; # IGNO
17530 52 45 44 0d 0a 0d 0a 20 20 20 20 20 20 20 20 6f  RED....        o
17540 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 55 74 69  bject invoke Uti
17550 6c 69 74 79 20 54 72 79 50 61 72 73 65 46 6c 61  lity TryParseFla
17560 67 73 45 6e 75 6d 20 22 22 20 5c 0d 0a 20 20 20  gsEnum "" \..   
17570 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e           System.
17580 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69  Data.SQLite.SQLi
17590 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 46 6c 61 67  teConnectionFlag
175a0 73 20 22 22 20 24 66 6c 61 67 73 20 6e 75 6c 6c  s "" $flags null
175b0 20 74 72 75 65 20 5c 0d 0a 20 20 20 20 20 20 20   true \..       
175c0 20 20 20 20 20 74 72 75 65 20 74 72 75 65 20 65       true true e
175d0 72 72 6f 72 0d 0a 20 20 20 20 20 20 7d 20 76 61  rror..      } va
175e0 6c 75 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  lue]} then {..  
175f0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
17600 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74   # NOTE: Attempt
17610 69 6e 67 20 74 6f 20 70 61 72 73 65 20 74 68 65  ing to parse the
17620 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67   connection flag
17630 73 20 63 61 75 73 65 64 20 61 20 73 63 72 69 70  s caused a scrip
17640 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  t..        #    
17650 20 20 20 65 72 72 6f 72 2e 20 20 45 6d 69 74 20     error.  Emit 
17660 61 20 77 61 72 6e 69 6e 67 20 74 6f 20 74 68 65  a warning to the
17670 20 74 65 73 74 20 6c 6f 67 20 66 69 6c 65 20 61   test log file a
17680 6e 64 20 63 6f 6e 74 69 6e 75 65 0d 0a 20 20 20  nd continue..   
17690 20 20 20 20 20 23 20 20 20 20 20 20 20 75 73 69       #       usi
176a0 6e 67 20 61 6e 20 65 6d 74 70 79 20 73 74 72 69  ng an emtpy stri
176b0 6e 67 20 69 6e 73 74 65 61 64 2e 0d 0a 20 20 20  ng instead...   
176c0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
176d0 74 6c 6f 67 20 5b 61 70 70 65 6e 64 41 72 67 73  tlog [appendArgs
176e0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
176f0 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66  "==== WARNING: f
17700 61 69 6c 65 64 20 74 6f 20 70 61 72 73 65 20 63  ailed to parse c
17710 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 2c  onnection flags,
17720 20 65 72 72 6f 72 3a 20 22 20 5c 0d 0a 20 20 20   error: " \..   
17730 20 20 20 20 20 20 20 20 20 5c 6e 5c 74 20 24 76           \n\t $v
17740 61 6c 75 65 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20  alue \n]....    
17750 20 20 20 20 73 65 74 20 76 61 6c 75 65 20 22 22      set value ""
17760 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
17770 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
17780 54 45 3a 20 49 66 20 74 68 65 20 63 6f 6d 62 69  TE: If the combi
17790 6e 65 64 20 66 6c 61 67 73 20 73 74 72 69 6e 67  ned flags string
177a0 20 63 6f 75 6c 64 20 6e 6f 74 20 61 63 74 75 61   could not actua
177b0 6c 6c 79 20 62 65 20 63 6f 6e 76 65 72 74 65 64  lly be converted
177c0 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
177d0 74 6f 20 74 68 65 20 65 6e 75 6d 65 72 61 74 65  to the enumerate
177e0 64 20 74 79 70 65 20 69 74 20 69 73 20 74 68 65  d type it is the
177f0 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 2c 20   default value, 
17800 74 68 65 6e 20 6a 75 73 74 20 75 73 65 0d 0a 20  then just use.. 
17810 20 20 20 20 20 23 20 20 20 20 20 20 20 69 74 20       #       it 
17820 76 65 72 62 61 74 69 6d 3b 20 6f 74 68 65 72 77  verbatim; otherw
17830 69 73 65 2c 20 6a 75 73 74 20 72 65 74 75 72 6e  ise, just return
17840 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67   an empty string
17850 2e 20 20 49 6e 20 74 68 61 74 0d 0a 20 20 20 20  .  In that..    
17860 20 20 23 20 20 20 20 20 20 20 63 61 73 65 2c 20    #       case, 
17870 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6e 6e  the default conn
17880 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 77 69 6c  ection flags wil
17890 6c 20 62 65 20 75 73 65 64 2e 0d 0a 20 20 20 20  l be used...    
178a0 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
178b0 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76  string length $v
178c0 61 6c 75 65 5d 20 3d 3d 20 30 20 7c 7c 20 24 76  alue] == 0 || $v
178d0 61 6c 75 65 20 6e 65 20 22 44 65 66 61 75 6c 74  alue ne "Default
178e0 22 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  "} then {..     
178f0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
17900 57 41 52 4e 49 4e 47 3a 20 54 68 69 73 20 72 65  WARNING: This re
17910 74 75 72 6e 73 20 74 68 65 20 73 74 72 69 6e 67  turns the string
17920 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 63 6f   value of the co
17930 6d 62 69 6e 65 64 20 66 6c 61 67 73 2c 20 6e 6f  mbined flags, no
17940 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  t..        #    
17950 20 20 20 20 20 20 74 68 65 20 65 6e 75 6d 65 72        the enumer
17960 61 74 65 64 20 76 61 6c 75 65 2e 20 20 54 68 69  ated value.  Thi
17970 73 20 69 73 20 62 79 20 64 65 73 69 67 6e 20 61  s is by design a
17980 6e 64 20 73 68 6f 75 6c 64 20 6e 6f 74 0d 0a 20  nd should not.. 
17990 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20         #        
179a0 20 20 62 65 20 63 68 61 6e 67 65 64 20 77 69 74    be changed wit
179b0 68 6f 75 74 20 63 61 72 65 66 75 6c 20 63 6f 6e  hout careful con
179c0 73 69 64 65 72 61 74 69 6f 6e 20 28 65 2e 67 2e  sideration (e.g.
179d0 20 69 74 20 77 6f 75 6c 64 0d 0a 20 20 20 20 20   it would..     
179e0 20 20 20 23 20 20 20 20 20 20 20 20 20 20 70 72     #          pr
179f0 65 76 65 6e 74 20 74 68 65 20 53 51 4c 69 74 65  event the SQLite
17a00 43 6f 6e 6e 65 63 74 69 6f 6e 20 63 6c 61 73 73  Connection class
17a10 20 66 72 6f 6d 20 61 6c 6c 6f 77 69 6e 67 20 69   from allowing i
17a20 6e 76 61 6c 69 64 0d 0a 20 20 20 20 20 20 20 20  nvalid..        
17a30 23 20 20 20 20 20 20 20 20 20 20 5b 22 6d 61 67  #          ["mag
17a40 69 63 61 6c 22 5d 20 6d 65 74 61 2d 66 6c 61 67  ical"] meta-flag
17a50 73 29 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  s)...        #..
17a60 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b          return [
17a70 61 70 70 65 6e 64 41 72 67 73 20 22 46 6c 61 67  appendArgs "Flag
17a80 73 3d 22 20 24 66 6c 61 67 73 20 5c 3b 5d 0d 0a  s=" $flags \;]..
17a90 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
17aa0 20 72 65 74 75 72 6e 20 22 22 0d 0a 20 20 20 20   return ""..    
17ab0 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67  }.....    proc g
17ac0 65 74 54 65 73 74 50 72 6f 70 65 72 74 69 65 73  etTestProperties
17ad0 20 7b 20 7b 66 6c 61 67 73 20 22 22 7d 20 7b 71   { {flags ""} {q
17ae0 75 69 65 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d  uiet false} } {.
17af0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
17b00 23 20 4e 4f 54 45 3a 20 53 74 61 72 74 20 77 69  # NOTE: Start wi
17b10 74 68 20 22 46 6c 61 67 73 22 20 70 72 6f 70 65  th "Flags" prope
17b20 72 74 79 20 66 6f 72 20 74 68 65 20 6e 65 77 20  rty for the new 
17b30 63 6f 6e 6e 65 63 74 69 6f 6e 2c 20 69 66 20 61  connection, if a
17b40 6e 79 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ny...      #..  
17b50 20 20 20 20 73 65 74 20 72 65 73 75 6c 74 20 5b      set result [
17b60 67 65 74 46 6c 61 67 73 50 72 6f 70 65 72 74 79  getFlagsProperty
17b70 20 24 66 6c 61 67 73 20 24 71 75 69 65 74 5d 0d   $flags $quiet].
17b80 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
17b90 20 20 23 20 4e 4f 54 45 3a 20 41 64 64 20 74 68    # NOTE: Add th
17ba0 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 63 75  e name of the cu
17bb0 72 72 65 6e 74 20 74 65 73 74 20 66 69 6c 65 2c  rrent test file,
17bc0 20 69 66 20 61 76 61 69 6c 61 62 6c 65 2e 20 20   if available.  
17bd0 54 68 69 73 20 69 73 0d 0a 20 20 20 20 20 20 23  This is..      #
17be0 20 20 20 20 20 20 20 6f 6e 6c 79 20 75 73 65 64         only used
17bf0 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 2e 0d   for debugging..
17c00 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
17c10 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
17c20 20 3a 3a 74 65 73 74 5f 66 69 6c 65 5d 7d 20 74   ::test_file]} t
17c30 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 61  hen {..        a
17c40 70 70 65 6e 64 20 72 65 73 75 6c 74 20 54 65 73  ppend result Tes
17c50 74 46 69 6c 65 3d 20 24 3a 3a 74 65 73 74 5f 66  tFile= $::test_f
17c60 69 6c 65 20 5c 3b 0d 0a 20 20 20 20 20 20 7d 0d  ile \;..      }.
17c70 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
17c80 20 20 23 20 4e 4f 54 45 3a 20 41 64 64 20 74 68    # NOTE: Add th
17c90 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 63 75  e name of the cu
17ca0 72 72 65 6e 74 20 74 65 73 74 2c 20 69 66 20 61  rrent test, if a
17cb0 76 61 69 6c 61 62 6c 65 2e 20 20 54 68 69 73 20  vailable.  This 
17cc0 69 73 20 6f 6e 6c 79 0d 0a 20 20 20 20 20 20 23  is only..      #
17cd0 20 20 20 20 20 20 20 75 73 65 64 20 66 6f 72 20         used for 
17ce0 64 65 62 75 67 67 69 6e 67 2e 0d 0a 20 20 20 20  debugging...    
17cf0 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
17d00 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 65 61  info exists ::ea
17d10 67 6c 65 5f 74 65 73 74 73 28 43 75 72 72 65 6e  gle_tests(Curren
17d20 74 4e 61 6d 65 29 5d 7d 20 74 68 65 6e 20 7b 0d  tName)]} then {.
17d30 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 20  .        append 
17d40 72 65 73 75 6c 74 20 54 65 73 74 4e 61 6d 65 3d  result TestName=
17d50 20 24 3a 3a 65 61 67 6c 65 5f 74 65 73 74 73 28   $::eagle_tests(
17d60 43 75 72 72 65 6e 74 4e 61 6d 65 29 20 5c 3b 0d  CurrentName) \;.
17d70 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
17d80 20 20 72 65 74 75 72 6e 20 24 72 65 73 75 6c 74    return $result
17d90 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
17da0 70 72 6f 63 20 65 6e 61 62 6c 65 53 68 61 72 65  proc enableShare
17db0 64 43 61 63 68 65 20 7b 20 63 68 61 6e 6e 65 6c  dCache { channel
17dc0 20 65 6e 61 62 6c 65 20 7b 71 75 69 65 74 20 66   enable {quiet f
17dd0 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  alse} } {..     
17de0 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
17df0 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e         object in
17e00 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e  voke -flags +Non
17e10 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20  Public \..      
17e20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74        System.Dat
17e30 61 2e 53 51 4c 69 74 65 2e 55 6e 73 61 66 65 4e  a.SQLite.UnsafeN
17e40 61 74 69 76 65 4d 65 74 68 6f 64 73 20 5c 0d 0a  ativeMethods \..
17e50 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
17e60 74 65 33 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65  te3_enable_share
17e70 64 5f 63 61 63 68 65 20 5b 65 78 70 72 20 69 6e  d_cache [expr in
17e80 74 28 24 65 6e 61 62 6c 65 29 5d 0d 0a 20 20 20  t($enable)]..   
17e90 20 20 20 7d 20 72 65 73 75 6c 74 5d 20 3d 3d 20     } result] == 
17ea0 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
17eb0 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
17ec0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
17ed0 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
17ee0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
17ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
17f00 2d 2d 2d 20 63 61 6c 6c 20 73 71 6c 69 74 65 33  --- call sqlite3
17f10 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f 63  _enable_shared_c
17f20 61 63 68 65 28 22 20 24 65 6e 61 62 6c 65 20 5c  ache(" $enable \
17f30 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
17f40 22 29 2e 2e 2e 20 6f 6b 3a 20 22 20 24 72 65 73  ")... ok: " $res
17f50 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ult \n]..       
17f60 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65   }..      } else
17f70 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   {..        if {
17f80 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
17f90 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
17fa0 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
17fb0 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
17fc0 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 61 6c         "---- cal
17fd0 6c 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65  l sqlite3_enable
17fe0 5f 73 68 61 72 65 64 5f 63 61 63 68 65 28 22 20  _shared_cache(" 
17ff0 24 65 6e 61 62 6c 65 20 5c 0d 0a 20 20 20 20 20  $enable \..     
18000 20 20 20 20 20 20 20 20 20 22 29 2e 2e 2e 20 65           ")... e
18010 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 72 65  rror: " \n\t $re
18020 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  sult \n]..      
18030 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20    }..      }..  
18040 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
18050 20 73 65 74 75 70 44 62 20 7b 0d 0a 20 20 20 20   setupDb {..    
18060 20 20 20 20 20 20 20 20 66 69 6c 65 4e 61 6d 65          fileName
18070 20 7b 6d 6f 64 65 20 22 22 7d 20 7b 64 61 74 65   {mode ""} {date
18080 54 69 6d 65 46 6f 72 6d 61 74 20 22 22 7d 20 7b  TimeFormat ""} {
18090 64 61 74 65 54 69 6d 65 4b 69 6e 64 20 22 22 7d  dateTimeKind ""}
180a0 20 7b 66 6c 61 67 73 20 22 22 7d 0d 0a 20 20 20   {flags ""}..   
180b0 20 20 20 20 20 20 20 20 20 7b 65 78 74 72 61 20           {extra 
180c0 22 22 7d 20 7b 71 75 61 6c 69 66 79 20 74 72 75  ""} {qualify tru
180d0 65 7d 20 7b 64 65 6c 65 74 65 20 74 72 75 65 7d  e} {delete true}
180e0 20 7b 75 72 69 20 66 61 6c 73 65 7d 0d 0a 20 20   {uri false}..  
180f0 20 20 20 20 20 20 20 20 20 20 7b 74 65 6d 70 6f            {tempo
18100 72 61 72 79 20 74 72 75 65 7d 20 7b 76 61 72 4e  rary true} {varN
18110 61 6d 65 20 64 62 7d 20 7b 71 75 69 65 74 20 66  ame db} {quiet f
18120 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  alse} } {..     
18130 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
18140 3a 20 46 69 72 73 74 2c 20 73 65 65 20 69 66 20  : First, see if 
18150 6f 75 72 20 63 61 6c 6c 65 72 20 68 61 73 20 72  our caller has r
18160 65 71 75 65 73 74 65 64 20 61 6e 20 69 6e 2d 6d  equested an in-m
18170 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0d  emory database..
18180 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
18190 73 65 74 20 69 73 4d 65 6d 6f 72 79 20 5b 69 73  set isMemory [is
181a0 4d 65 6d 6f 72 79 44 62 20 24 66 69 6c 65 4e 61  MemoryDb $fileNa
181b0 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a  me]....      #..
181c0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 6f        # NOTE: Fo
181d0 72 20 6e 6f 77 2c 20 61 6c 6c 20 74 65 73 74 20  r now, all test 
181e0 64 61 74 61 62 61 73 65 73 20 75 73 65 64 20 62  databases used b
181f0 79 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65  y the test suite
18200 20 61 72 65 20 70 6c 61 63 65 64 0d 0a 20 20 20   are placed..   
18210 20 20 20 23 20 20 20 20 20 20 20 69 6e 74 6f 20     #       into 
18220 74 68 65 20 64 61 74 61 62 61 73 65 20 64 69 72  the database dir
18230 65 63 74 6f 72 79 2e 20 20 45 61 63 68 20 64 61  ectory.  Each da
18240 74 61 62 61 73 65 20 61 6e 64 20 72 65 6c 61 74  tabase and relat
18250 65 64 20 66 69 6c 65 73 0d 0a 20 20 20 20 20 20  ed files..      
18260 23 20 20 20 20 20 20 20 75 73 65 64 20 62 79 20  #       used by 
18270 61 20 74 65 73 74 20 73 68 6f 75 6c 64 20 62 65  a test should be
18280 20 63 6c 65 61 6e 65 64 20 75 70 20 62 79 20 74   cleaned up by t
18290 68 61 74 20 74 65 73 74 20 75 73 69 6e 67 20 74  hat test using t
182a0 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  he..      #     
182b0 20 20 22 63 6c 65 61 6e 75 70 44 62 22 20 70 72    "cleanupDb" pr
182c0 6f 63 65 64 75 72 65 2c 20 62 65 6c 6f 77 2e 0d  ocedure, below..
182d0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
182e0 69 66 20 7b 21 24 69 73 4d 65 6d 6f 72 79 20 26  if {!$isMemory &
182f0 26 20 24 71 75 61 6c 69 66 79 7d 20 74 68 65 6e  & $qualify} then
18300 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   {..        set 
18310 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6a  fileName [file j
18320 6f 69 6e 20 5b 67 65 74 44 61 74 61 62 61 73 65  oin [getDatabase
18330 44 69 72 65 63 74 6f 72 79 5d 20 5b 66 69 6c 65  Directory] [file
18340 20 74 61 69 6c 20 24 66 69 6c 65 4e 61 6d 65 5d   tail $fileName]
18350 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  ]..      }....  
18360 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
18370 4f 54 45 3a 20 42 79 20 64 65 66 61 75 6c 74 2c  OTE: By default,
18380 20 64 65 6c 65 74 65 20 61 6e 79 20 70 72 65 2d   delete any pre-
18390 65 78 69 73 74 69 6e 67 20 64 61 74 61 62 61 73  existing databas
183a0 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  e with the same 
183b0 66 69 6c 65 0d 0a 20 20 20 20 20 20 23 20 20 20  file..      #   
183c0 20 20 20 20 6e 61 6d 65 20 69 66 20 69 74 20 63      name if it c
183d0 75 72 72 65 6e 74 6c 79 20 65 78 69 73 74 73 2e  urrently exists.
183e0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
183f0 20 69 66 20 7b 21 24 69 73 4d 65 6d 6f 72 79 20   if {!$isMemory 
18400 26 26 20 24 64 65 6c 65 74 65 20 26 26 20 5b 66  && $delete && [f
18410 69 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c 65  ile exists $file
18420 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  Name]} then {.. 
18430 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
18440 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70    # NOTE: Attemp
18450 74 20 74 6f 20 64 65 6c 65 74 65 20 61 6e 79 20  t to delete any 
18460 70 72 65 2d 65 78 69 73 74 69 6e 67 20 64 61 74  pre-existing dat
18470 61 62 61 73 65 20 77 69 74 68 20 74 68 65 20 73  abase with the s
18480 61 6d 65 20 66 69 6c 65 0d 0a 20 20 20 20 20 20  ame file..      
18490 20 20 23 20 20 20 20 20 20 20 6e 61 6d 65 2e 0d    #       name..
184a0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
184b0 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
184c0 66 69 6c 65 20 64 65 6c 65 74 65 20 24 66 69 6c  file delete $fil
184d0 65 4e 61 6d 65 7d 20 65 72 72 6f 72 5d 7d 20 74  eName} error]} t
184e0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
184f0 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
18500 4e 4f 54 45 3a 20 57 65 20 73 6f 6d 65 68 6f 77  NOTE: We somehow
18510 20 66 61 69 6c 65 64 20 74 6f 20 64 65 6c 65 74   failed to delet
18520 65 20 74 68 65 20 66 69 6c 65 2c 20 72 65 70 6f  e the file, repo
18530 72 74 20 77 68 79 2e 0d 0a 20 20 20 20 20 20 20  rt why...       
18540 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
18550 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
18560 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
18570 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
18580 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
18590 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
185a0 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e        "==== WARN
185b0 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 64  ING: failed to d
185c0 65 6c 65 74 65 20 64 61 74 61 62 61 73 65 20 66  elete database f
185d0 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d  ile \"" $fileNam
185e0 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
185f0 20 20 20 20 20 22 5c 22 20 64 75 72 69 6e 67 20       "\" during 
18600 73 65 74 75 70 2c 20 65 72 72 6f 72 3a 20 22 20  setup, error: " 
18610 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d  \n\t $error \n].
18620 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
18630 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
18640 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
18650 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 66 65 72     # NOTE: Refer
18660 20 74 6f 20 74 68 65 20 73 70 65 63 69 66 69 65   to the specifie
18670 64 20 76 61 72 69 61 62 6c 65 20 28 65 2e 67 2e  d variable (e.g.
18680 20 22 64 62 22 29 20 69 6e 20 74 68 65 20 63 6f   "db") in the co
18690 6e 74 65 78 74 20 6f 66 20 6f 75 72 0d 0a 20 20  ntext of our..  
186a0 20 20 20 20 23 20 20 20 20 20 20 20 63 61 6c 6c      #       call
186b0 65 72 2e 20 20 54 68 65 20 68 61 6e 64 6c 65 20  er.  The handle 
186c0 74 6f 20 74 68 65 20 6f 70 65 6e 65 64 20 64 61  to the opened da
186d0 74 61 62 61 73 65 20 77 69 6c 6c 20 62 65 20 73  tabase will be s
186e0 74 6f 72 65 64 20 74 68 65 72 65 2e 0d 0a 20 20  tored there...  
186f0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 75 70 76      #..      upv
18700 61 72 20 31 20 24 76 61 72 4e 61 6d 65 20 64 62  ar 1 $varName db
18710 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
18720 20 20 20 23 20 4e 4f 54 45 3a 20 53 74 61 72 74     # NOTE: Start
18730 20 62 75 69 6c 64 69 6e 67 20 74 68 65 20 63 6f   building the co
18740 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e 67 2e  nnection string.
18750 20 20 54 68 65 20 6f 6e 6c 79 20 72 65 71 75 69    The only requi
18760 72 65 64 20 70 6f 72 74 69 6f 6e 0d 0a 20 20 20  red portion..   
18770 20 20 20 23 20 20 20 20 20 20 20 6f 66 20 74 68     #       of th
18780 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72  e connection str
18790 69 6e 67 20 69 73 20 74 68 65 20 64 61 74 61 20  ing is the data 
187a0 73 6f 75 72 63 65 2c 20 77 68 69 63 68 20 63 6f  source, which co
187b0 6e 74 61 69 6e 73 20 74 68 65 0d 0a 20 20 20 20  ntains the..    
187c0 20 20 23 20 20 20 20 20 20 20 64 61 74 61 62 61    #       databa
187d0 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 69 74 73  se file name its
187e0 65 6c 66 2e 20 20 49 66 20 6f 75 72 20 63 61 6c  elf.  If our cal
187f0 6c 65 72 20 77 61 6e 74 73 20 74 6f 20 75 73 65  ler wants to use
18800 20 61 20 55 52 49 20 61 73 0d 0a 20 20 20 20 20   a URI as..     
18810 20 23 20 20 20 20 20 20 20 74 68 65 20 64 61 74   #       the dat
18820 61 20 73 6f 75 72 63 65 2c 20 75 73 65 20 74 68  a source, use th
18830 65 20 46 75 6c 6c 55 72 69 20 63 6f 6e 6e 65 63  e FullUri connec
18840 74 69 6f 6e 20 73 74 72 69 6e 67 20 70 72 6f 70  tion string prop
18850 65 72 74 79 20 74 6f 0d 0a 20 20 20 20 20 20 23  erty to..      #
18860 20 20 20 20 20 20 20 70 72 65 76 65 6e 74 20 74         prevent t
18870 68 65 20 64 61 74 61 20 73 6f 75 72 63 65 20 73  he data source s
18880 74 72 69 6e 67 20 66 72 6f 6d 20 62 65 69 6e 67  tring from being
18890 20 6d 61 6e 67 6c 65 64 2e 0d 0a 20 20 20 20 20   mangled...     
188a0 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 75   #..      if {$u
188b0 72 69 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  ri} then {..    
188c0 20 20 20 20 73 65 74 20 63 6f 6e 6e 65 63 74 69      set connecti
188d0 6f 6e 20 7b 46 75 6c 6c 55 72 69 3d 24 7b 66 69  on {FullUri=${fi
188e0 6c 65 4e 61 6d 65 7d 7d 0d 0a 20 20 20 20 20 20  leName}}..      
188f0 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
18900 20 20 73 65 74 20 63 6f 6e 6e 65 63 74 69 6f 6e    set connection
18910 20 7b 44 61 74 61 20 53 6f 75 72 63 65 3d 24 7b   {Data Source=${
18920 66 69 6c 65 4e 61 6d 65 7d 7d 0d 0a 20 20 20 20  fileName}}..    
18930 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
18940 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 69        # NOTE: Si
18950 6e 63 65 20 74 68 69 73 20 70 72 6f 63 65 64 75  nce this procedu
18960 72 65 20 68 61 73 20 6e 6f 20 73 70 65 63 69 61  re has no specia
18970 6c 20 6b 6e 6f 77 6c 65 64 67 65 20 6f 66 20 77  l knowledge of w
18980 68 61 74 20 74 68 65 20 64 65 66 61 75 6c 74 0d  hat the default.
18990 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73  .      #       s
189a0 65 74 74 69 6e 67 20 69 73 20 66 6f 72 20 74 68  etting is for th
189b0 65 20 54 6f 46 75 6c 6c 50 61 74 68 20 63 6f 6e  e ToFullPath con
189c0 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e 67 20 70  nection string p
189d0 72 6f 70 65 72 79 2c 20 61 6c 77 61 79 73 0d 0a  ropery, always..
189e0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61 64        #       ad
189f0 64 20 74 68 65 20 76 61 6c 75 65 20 77 65 20 6b  d the value we k
18a00 6e 6f 77 20 61 62 6f 75 74 20 74 6f 20 74 68 65  now about to the
18a10 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69   connection stri
18a20 6e 67 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ng...      #..  
18a30 20 20 20 20 61 70 70 65 6e 64 20 63 6f 6e 6e 65      append conne
18a40 63 74 69 6f 6e 20 7b 3b 54 6f 46 75 6c 6c 50 61  ction {;ToFullPa
18a50 74 68 3d 24 7b 71 75 61 6c 69 66 79 7d 7d 0d 0a  th=${qualify}}..
18a60 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
18a70 20 23 20 4e 4f 54 45 3a 20 49 66 20 6f 75 72 20   # NOTE: If our 
18a80 63 61 6c 6c 65 72 20 73 70 65 63 69 66 69 65 64  caller specified
18a90 20 61 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2c   a journal mode,
18aa0 20 61 64 64 20 74 68 65 20 6e 65 63 65 73 73 61   add the necessa
18ab0 72 79 20 70 6f 72 74 69 6f 6e 0d 0a 20 20 20 20  ry portion..    
18ac0 20 20 23 20 20 20 20 20 20 20 6f 66 20 74 68 65    #       of the
18ad0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69   connection stri
18ae0 6e 67 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 23  ng now...      #
18af0 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72  ..      if {[str
18b00 69 6e 67 20 6c 65 6e 67 74 68 20 24 6d 6f 64 65  ing length $mode
18b10 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
18b20 20 20 20 20 20 20 20 61 70 70 65 6e 64 20 63 6f         append co
18b30 6e 6e 65 63 74 69 6f 6e 20 7b 3b 4a 6f 75 72 6e  nnection {;Journ
18b40 61 6c 20 4d 6f 64 65 3d 24 7b 6d 6f 64 65 7d 7d  al Mode=${mode}}
18b50 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
18b60 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
18b70 54 45 3a 20 49 66 20 6f 75 72 20 63 61 6c 6c 65  TE: If our calle
18b80 72 20 73 70 65 63 69 66 69 65 64 20 61 20 44 61  r specified a Da
18b90 74 65 54 69 6d 65 20 66 6f 72 6d 61 74 2c 20 61  teTime format, a
18ba0 64 64 20 74 68 65 20 6e 65 63 65 73 73 61 72 79  dd the necessary
18bb0 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
18bc0 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 63  portion of the c
18bd0 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e 67  onnection string
18be0 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 23 0d 0a   now...      #..
18bf0 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
18c00 67 20 6c 65 6e 67 74 68 20 24 64 61 74 65 54 69  g length $dateTi
18c10 6d 65 46 6f 72 6d 61 74 5d 20 3e 20 30 7d 20 74  meFormat] > 0} t
18c20 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 61  hen {..        a
18c30 70 70 65 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e  ppend connection
18c40 20 7b 3b 44 61 74 65 54 69 6d 65 46 6f 72 6d 61   {;DateTimeForma
18c50 74 3d 24 7b 64 61 74 65 54 69 6d 65 46 6f 72 6d  t=${dateTimeForm
18c60 61 74 7d 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  at}}..      }...
18c70 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
18c80 23 20 4e 4f 54 45 3a 20 49 66 20 6f 75 72 20 63  # NOTE: If our c
18c90 61 6c 6c 65 72 20 73 70 65 63 69 66 69 65 64 20  aller specified 
18ca0 61 20 44 61 74 65 54 69 6d 65 4b 69 6e 64 2c 20  a DateTimeKind, 
18cb0 61 64 64 20 74 68 65 20 6e 65 63 65 73 73 61 72  add the necessar
18cc0 79 20 70 6f 72 74 69 6f 6e 0d 0a 20 20 20 20 20  y portion..     
18cd0 20 23 20 20 20 20 20 20 20 6f 66 20 74 68 65 20   #       of the 
18ce0 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e  connection strin
18cf0 67 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 23 0d  g now...      #.
18d00 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69  .      if {[stri
18d10 6e 67 20 6c 65 6e 67 74 68 20 24 64 61 74 65 54  ng length $dateT
18d20 69 6d 65 4b 69 6e 64 5d 20 3e 20 30 7d 20 74 68  imeKind] > 0} th
18d30 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 61 70  en {..        ap
18d40 70 65 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  pend connection 
18d50 7b 3b 44 61 74 65 54 69 6d 65 4b 69 6e 64 3d 24  {;DateTimeKind=$
18d60 7b 64 61 74 65 54 69 6d 65 4b 69 6e 64 7d 7d 0d  {dateTimeKind}}.
18d70 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
18d80 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
18d90 45 3a 20 46 69 67 75 72 65 20 6f 75 74 20 77 68  E: Figure out wh
18da0 61 74 20 74 68 65 20 66 69 6e 61 6c 20 66 6c 61  at the final fla
18db0 67 73 20 66 6f 72 20 74 68 69 73 20 63 6f 6e 6e  gs for this conn
18dc0 65 63 74 69 6f 6e 20 6e 65 65 64 20 74 6f 20 62  ection need to b
18dd0 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  e...      #..   
18de0 20 20 20 73 65 74 20 66 6c 61 67 73 20 5b 67 65     set flags [ge
18df0 74 43 6f 6e 6e 65 63 74 69 6f 6e 46 6c 61 67 73  tConnectionFlags
18e00 20 24 66 69 6c 65 4e 61 6d 65 20 24 66 6c 61 67   $fileName $flag
18e10 73 20 24 71 75 69 65 74 5d 0d 0a 0d 0a 20 20 20  s $quiet]....   
18e20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
18e30 54 45 3a 20 49 66 20 6f 75 72 20 63 61 6c 6c 65  TE: If our calle
18e40 72 20 73 70 65 63 69 66 69 65 64 20 73 6f 6d 65  r specified some
18e50 20 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f   SQLiteConnectio
18e60 6e 46 6c 61 67 73 2c 20 61 64 64 20 74 68 65 0d  nFlags, add the.
18e70 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6e  .      #       n
18e80 65 63 65 73 73 61 72 79 20 70 6f 72 74 69 6f 6e  ecessary portion
18e90 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   of the connecti
18ea0 6f 6e 20 73 74 72 69 6e 67 20 6e 6f 77 2e 0d 0a  on string now...
18eb0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
18ec0 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  f {[string lengt
18ed0 68 20 24 66 6c 61 67 73 5d 20 3e 20 30 7d 20 74  h $flags] > 0} t
18ee0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 61  hen {..        a
18ef0 70 70 65 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e  ppend connection
18f00 20 7b 3b 46 6c 61 67 73 3d 24 7b 66 6c 61 67 73   {;Flags=${flags
18f10 7d 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  }}..      }.... 
18f20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
18f30 4e 4f 54 45 3a 20 49 66 20 6f 75 72 20 63 61 6c  NOTE: If our cal
18f40 6c 65 72 20 73 70 65 63 69 66 69 65 64 20 61 6e  ler specified an
18f50 20 65 78 74 72 61 20 70 61 79 6c 6f 61 64 20 74   extra payload t
18f60 6f 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  o the connection
18f70 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
18f80 73 74 72 69 6e 67 2c 20 61 70 70 65 6e 64 20 69  string, append i
18f90 74 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 23 0d  t now...      #.
18fa0 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69  .      if {[stri
18fb0 6e 67 20 6c 65 6e 67 74 68 20 24 65 78 74 72 61  ng length $extra
18fc0 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
18fd0 20 20 20 20 20 20 20 61 70 70 65 6e 64 20 63 6f         append co
18fe0 6e 6e 65 63 74 69 6f 6e 20 5c 3b 20 24 65 78 74  nnection \; $ext
18ff0 72 61 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ra..      }.... 
19000 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
19010 4e 4f 54 45 3a 20 41 64 64 20 74 68 65 20 6e 61  NOTE: Add the na
19020 6d 65 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  me of the curren
19030 74 20 74 65 73 74 20 66 69 6c 65 2c 20 69 66 20  t test file, if 
19040 61 76 61 69 6c 61 62 6c 65 2e 20 20 54 68 69 73  available.  This
19050 20 69 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20   is..      #    
19060 20 20 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72     only used for
19070 20 64 65 62 75 67 67 69 6e 67 2e 0d 0a 20 20 20   debugging...   
19080 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
19090 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74  [info exists ::t
190a0 65 73 74 5f 66 69 6c 65 5d 7d 20 74 68 65 6e 20  est_file]} then 
190b0 7b 0d 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e  {..        appen
190c0 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 3b 54  d connection {;T
190d0 65 73 74 46 69 6c 65 3d 24 7b 3a 3a 74 65 73 74  estFile=${::test
190e0 5f 66 69 6c 65 7d 7d 0d 0a 20 20 20 20 20 20 7d  _file}}..      }
190f0 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
19100 20 20 20 23 20 4e 4f 54 45 3a 20 41 64 64 20 74     # NOTE: Add t
19110 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 63  he name of the c
19120 75 72 72 65 6e 74 20 74 65 73 74 2c 20 69 66 20  urrent test, if 
19130 61 76 61 69 6c 61 62 6c 65 2e 20 20 54 68 69 73  available.  This
19140 20 69 73 20 6f 6e 6c 79 0d 0a 20 20 20 20 20 20   is only..      
19150 23 20 20 20 20 20 20 20 75 73 65 64 20 66 6f 72  #       used for
19160 20 64 65 62 75 67 67 69 6e 67 2e 0d 0a 20 20 20   debugging...   
19170 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
19180 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 65  [info exists ::e
19190 61 67 6c 65 5f 74 65 73 74 73 28 43 75 72 72 65  agle_tests(Curre
191a0 6e 74 4e 61 6d 65 29 5d 7d 20 74 68 65 6e 20 7b  ntName)]} then {
191b0 0d 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64  ..        append
191c0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 3b 54 65   connection {;Te
191d0 73 74 4e 61 6d 65 3d 24 7b 3a 3a 65 61 67 6c 65  stName=${::eagle
191e0 5f 74 65 73 74 73 28 43 75 72 72 65 6e 74 4e 61  _tests(CurrentNa
191f0 6d 65 29 7d 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a  me)}}..      }..
19200 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
19210 20 23 20 4e 4f 54 45 3a 20 46 6f 72 20 63 6c 61   # NOTE: For cla
19220 72 69 74 79 2c 20 61 70 70 65 6e 64 20 61 20 66  rity, append a f
19230 69 6e 61 6c 20 73 65 6d 69 63 6f 6c 6f 6e 20 74  inal semicolon t
19240 6f 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  o the connection
19250 20 73 74 72 69 6e 67 2e 0d 0a 20 20 20 20 20 20   string...      
19260 23 0d 0a 20 20 20 20 20 20 61 70 70 65 6e 64 20  #..      append 
19270 63 6f 6e 6e 65 63 74 69 6f 6e 20 5c 3b 0d 0a 0d  connection \;...
19280 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
19290 23 20 4e 4f 54 45 3a 20 4f 70 65 6e 20 74 68 65  # NOTE: Open the
192a0 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
192b0 74 69 6f 6e 20 6e 6f 77 2c 20 70 6c 61 63 69 6e  tion now, placin
192c0 67 20 74 68 65 20 6f 70 61 71 75 65 20 68 61 6e  g the opaque han
192d0 64 6c 65 20 76 61 6c 75 65 0d 0a 20 20 20 20 20  dle value..     
192e0 20 23 20 20 20 20 20 20 20 69 6e 74 6f 20 74 68   #       into th
192f0 65 20 76 61 72 69 61 62 6c 65 20 73 70 65 63 69  e variable speci
19300 66 69 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c  fied by our call
19310 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  er...      #..  
19320 20 20 20 20 73 65 74 20 64 62 20 5b 73 71 6c 20      set db [sql 
19330 6f 70 65 6e 20 2d 74 79 70 65 20 53 51 4c 69 74  open -type SQLit
19340 65 20 5b 73 75 62 73 74 20 24 63 6f 6e 6e 65 63  e [subst $connec
19350 74 69 6f 6e 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20  tion]]....      
19360 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
19370 20 43 6f 6e 66 69 67 75 72 65 20 74 68 65 20 74   Configure the t
19380 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f  emporary directo
19390 72 79 20 66 6f 72 20 74 68 65 20 6e 65 77 6c 79  ry for the newly
193a0 20 6f 70 65 6e 65 64 20 64 61 74 61 62 61 73 65   opened database
193b0 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
193c0 63 6f 6e 6e 65 63 74 69 6f 6e 20 6e 6f 77 20 75  connection now u
193d0 6e 6c 65 73 73 20 6f 75 72 20 63 61 6c 6c 65 72  nless our caller
193e0 20 66 6f 72 62 69 64 73 20 69 74 2e 0d 0a 20 20   forbids it...  
193f0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
19400 7b 24 74 65 6d 70 6f 72 61 72 79 20 26 26 20 21  {$temporary && !
19410 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
19420 6f 28 73 65 74 54 65 6d 70 6f 72 61 72 79 44 69  o(setTemporaryDi
19430 72 65 63 74 6f 72 79 29 5d 7d 20 74 68 65 6e 20  rectory)]} then 
19440 7b 0d 0a 20 20 20 20 20 20 20 20 73 71 6c 20 65  {..        sql e
19450 78 65 63 75 74 65 20 24 64 62 20 5b 61 70 70 65  xecute $db [appe
19460 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
19470 20 20 20 20 20 20 22 50 52 41 47 4d 41 20 74 65        "PRAGMA te
19480 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f  mp_store_directo
19490 72 79 20 3d 20 5c 22 22 20 5b 67 65 74 54 65 6d  ry = \"" [getTem
194a0 70 6f 72 61 72 79 44 69 72 65 63 74 6f 72 79 5d  poraryDirectory]
194b0 20 5c 22 5c 3b 5d 0d 0a 20 20 20 20 20 20 7d 0d   \"\;]..      }.
194c0 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
194d0 20 20 23 20 4e 4f 54 45 3a 20 50 65 72 66 6f 72    # NOTE: Perfor
194e0 6d 20 61 6e 79 20 65 78 74 72 61 20 70 65 72 2d  m any extra per-
194f0 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 65 74 75 70  connection setup
19500 20 66 6f 72 20 74 68 65 20 6e 65 77 6c 79 20 6f   for the newly o
19510 70 65 6e 65 64 0d 0a 20 20 20 20 20 20 23 20 20  pened..      #  
19520 20 20 20 20 20 64 61 74 61 62 61 73 65 20 6e 6f       database no
19530 77 20 75 6e 6c 65 73 73 20 6f 75 72 20 63 61 6c  w unless our cal
19540 6c 65 72 20 66 6f 72 62 69 64 73 20 69 74 2e 0d  ler forbids it..
19550 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
19560 73 65 74 20 65 78 65 63 75 74 65 4f 6e 53 65 74  set executeOnSet
19570 75 70 20 5b 67 65 74 45 78 65 63 75 74 65 4f 6e  up [getExecuteOn
19580 53 65 74 75 70 5d 0d 0a 0d 0a 20 20 20 20 20 20  Setup]....      
19590 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
195a0 74 68 20 24 65 78 65 63 75 74 65 4f 6e 53 65 74  th $executeOnSet
195b0 75 70 5d 20 3e 20 30 20 26 26 20 5c 0d 0a 20 20  up] > 0 && \..  
195c0 20 20 20 20 20 20 20 20 21 5b 69 6e 66 6f 20 65          ![info e
195d0 78 69 73 74 73 20 3a 3a 6e 6f 28 65 78 65 63 75  xists ::no(execu
195e0 74 65 4f 6e 53 65 74 75 70 29 5d 7d 20 74 68 65  teOnSetup)]} the
195f0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
19600 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
19610 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 6d 61 79  This command may
19620 20 72 61 69 73 65 20 61 6e 20 65 72 72 6f 72 3b   raise an error;
19630 20 69 66 20 73 6f 2c 20 74 68 61 74 20 69 73 20   if so, that is 
19640 66 69 6e 65 2c 20 61 73 0d 0a 20 20 20 20 20 20  fine, as..      
19650 20 20 23 20 20 20 20 20 20 20 74 68 65 20 65 6e    #       the en
19660 63 6c 6f 73 69 6e 67 20 74 65 73 74 20 77 69 6c  closing test wil
19670 6c 20 74 68 65 6e 20 66 61 69 6c 2e 20 20 54 68  l then fail.  Th
19680 65 20 5b 73 75 62 73 74 5d 20 63 6f 6d 6d 61 6e  e [subst] comman
19690 64 20 69 73 0d 0a 20 20 20 20 20 20 20 20 23 20  d is..        # 
196a0 20 20 20 20 20 20 75 73 65 64 20 6f 6e 20 74 68        used on th
196b0 65 20 53 51 4c 20 69 6e 20 63 61 73 65 20 69 74  e SQL in case it
196c0 20 6e 65 65 64 73 20 74 6f 20 72 65 66 65 72 20   needs to refer 
196d0 74 6f 20 73 74 61 74 65 20 69 6e 20 6f 75 72 0d  to state in our.
196e0 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
196f0 20 63 6f 6e 74 65 78 74 2e 0d 0a 20 20 20 20 20   context...     
19700 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73 71     #..        sq
19710 6c 20 65 78 65 63 75 74 65 20 24 64 62 20 5b 73  l execute $db [s
19720 75 62 73 74 20 24 65 78 65 63 75 74 65 4f 6e 53  ubst $executeOnS
19730 65 74 75 70 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a  etup]..      }..
19740 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
19750 20 23 20 4e 4f 54 45 3a 20 41 6c 77 61 79 73 20   # NOTE: Always 
19760 72 65 74 75 72 6e 20 74 68 65 20 63 6f 6e 6e 65  return the conne
19770 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20 75 70 6f  ction handle upo
19780 6e 20 73 75 63 63 65 73 73 2e 0d 0a 20 20 20 20  n success...    
19790 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75 72    #..      retur
197a0 6e 20 24 64 62 0d 0a 20 20 20 20 7d 0d 0a 0c 0d  n $db..    }....
197b0 0a 20 20 20 20 70 72 6f 63 20 67 65 74 44 62 43  .    proc getDbC
197c0 6f 6e 6e 65 63 74 69 6f 6e 20 7b 20 7b 76 61 72  onnection { {var
197d0 4e 61 6d 65 20 64 62 7d 20 7d 20 7b 0d 0a 20 20  Name db} } {..  
197e0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
197f0 4f 54 45 3a 20 52 65 66 65 72 20 74 6f 20 74 68  OTE: Refer to th
19800 65 20 73 70 65 63 69 66 69 65 64 20 76 61 72 69  e specified vari
19810 61 62 6c 65 20 28 65 2e 67 2e 20 22 64 62 22 29  able (e.g. "db")
19820 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 78 74 20   in the context 
19830 6f 66 20 6f 75 72 0d 0a 20 20 20 20 20 20 23 20  of our..      # 
19840 20 20 20 20 20 20 63 61 6c 6c 65 72 2e 20 20 54        caller.  T
19850 68 65 20 68 61 6e 64 6c 65 20 74 6f 20 74 68 65  he handle to the
19860 20 64 61 74 61 62 61 73 65 20 70 72 65 76 69 6f   database previo
19870 75 73 6c 79 20 6f 70 65 6e 65 64 20 76 69 61 20  usly opened via 
19880 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  the..      #    
19890 20 20 20 5b 73 65 74 75 70 44 62 5d 20 70 72 6f     [setupDb] pro
198a0 63 65 64 75 72 65 20 73 68 6f 75 6c 64 20 62 65  cedure should be
198b0 20 73 74 6f 72 65 64 20 74 68 65 72 65 2e 0d 0a   stored there...
198c0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 75        #..      u
198d0 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65 20  pvar 1 $varName 
198e0 64 62 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20  db....      #.. 
198f0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69       # NOTE: Thi
19900 73 20 72 65 74 75 72 6e 73 20 74 68 65 20 41 44  s returns the AD
19910 4f 2e 4e 45 54 20 49 44 62 43 6f 6e 6e 65 63 74  O.NET IDbConnect
19920 69 6f 6e 20 6f 62 6a 65 63 74 20 69 6e 73 74 61  ion object insta
19930 6e 63 65 20 66 6f 72 20 74 68 65 0d 0a 20 20 20  nce for the..   
19940 20 20 20 23 20 20 20 20 20 20 20 73 70 65 63 69     #       speci
19950 66 69 65 64 20 64 61 74 61 62 73 65 20 68 61 6e  fied databse han
19960 64 6c 65 2e 20 20 53 69 6e 63 65 20 67 65 74 74  dle.  Since gett
19970 69 6e 67 20 74 68 69 73 20 6f 62 6a 65 63 74 20  ing this object 
19980 72 65 6c 69 65 73 20 75 70 6f 6e 0d 0a 20 20 20  relies upon..   
19990 20 20 20 23 20 20 20 20 20 20 20 45 61 67 6c 65     #       Eagle
199a0 20 69 6e 74 65 72 6e 61 6c 73 2c 20 67 72 65 61   internals, grea
199b0 74 20 63 61 72 65 20 73 68 6f 75 6c 64 20 62 65  t care should be
199c0 20 74 61 6b 65 6e 20 74 6f 20 61 76 6f 69 64 20   taken to avoid 
199d0 64 69 73 70 6f 73 69 6e 67 20 6f 66 0d 0a 20 20  disposing of..  
199e0 20 20 20 20 23 20 20 20 20 20 20 20 74 68 69 73      #       this
199f0 20 6f 62 6a 65 63 74 20 6f 72 20 6f 74 68 65 72   object or other
19a00 77 69 73 65 20 70 75 74 74 69 6e 67 20 69 74 20  wise putting it 
19a10 69 6e 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64 20  into an invalid 
19a20 73 74 61 74 65 2e 0d 0a 20 20 20 20 20 20 23 0d  state...      #.
19a30 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f  .      if {[info
19a40 20 65 78 69 73 74 73 20 64 62 5d 7d 20 74 68 65   exists db]} the
19a50 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20  n {..        if 
19a60 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
19a70 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f       object invo
19a80 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75  ke -flags +NonPu
19a90 62 6c 69 63 20 2d 6f 62 6a 65 63 74 66 6c 61 67  blic -objectflag
19aa0 73 20 2b 4e 6f 44 69 73 70 6f 73 65 20 2d 61 6c  s +NoDispose -al
19ab0 69 61 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ias \..         
19ac0 20 20 20 20 20 49 6e 74 65 72 70 72 65 74 65 72       Interpreter
19ad0 2e 47 65 74 41 63 74 69 76 65 2e 63 6f 6e 6e 65  .GetActive.conne
19ae0 63 74 69 6f 6e 73 20 49 74 65 6d 20 24 64 62 0d  ctions Item $db.
19af0 0a 20 20 20 20 20 20 20 20 7d 20 72 65 73 75 6c  .        } resul
19b00 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  t] == 0} then {.
19b10 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
19b20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
19b30 53 75 63 63 65 73 73 2c 20 72 65 74 75 72 6e 20  Success, return 
19b40 74 68 65 20 6f 70 61 71 75 65 20 6f 62 6a 65 63  the opaque objec
19b50 74 20 68 61 6e 64 6c 65 2e 0d 0a 20 20 20 20 20  t handle...     
19b60 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
19b70 20 20 72 65 74 75 72 6e 20 24 72 65 73 75 6c 74    return $result
19b80 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65  ..        } else
19b90 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d   {..          #.
19ba0 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
19bb0 45 3a 20 46 61 69 6c 75 72 65 2c 20 72 65 70 6f  E: Failure, repo
19bc0 72 74 20 77 68 79 2e 0d 0a 20 20 20 20 20 20 20  rt why...       
19bd0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
19be0 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
19bf0 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
19c00 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
19c10 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47     "==== WARNING
19c20 3a 20 66 61 69 6c 65 64 20 74 6f 20 67 65 74 20  : failed to get 
19c30 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c  connection handl
19c40 65 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 5c  e for database \
19c50 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  "" \..          
19c60 20 20 20 20 24 64 62 20 22 5c 22 2c 20 65 72 72      $db "\", err
19c70 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 72 65 73 75  or: " \n\t $resu
19c80 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  lt \n]..        
19c90 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  }..      }....  
19ca0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
19cb0 4f 54 45 3a 20 46 61 69 6c 75 72 65 2c 20 72 65  OTE: Failure, re
19cc0 74 75 72 6e 20 61 6e 20 6f 62 76 69 6f 75 73 6c  turn an obviousl
19cd0 79 20 69 6e 76 61 6c 69 64 20 6f 70 61 71 75 65  y invalid opaque
19ce0 20 6f 62 6a 65 63 74 20 68 61 6e 64 6c 65 2e 0d   object handle..
19cf0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
19d00 72 65 74 75 72 6e 20 22 22 0d 0a 20 20 20 20 7d  return ""..    }
19d10 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 66 72  .....    proc fr
19d20 65 65 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 20 7b  eeDbConnection {
19d30 20 7b 76 61 72 4e 61 6d 65 20 63 6f 6e 6e 65 63   {varName connec
19d40 74 69 6f 6e 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  tion} } {..     
19d50 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
19d60 3a 20 52 65 66 65 72 20 74 6f 20 74 68 65 20 73  : Refer to the s
19d70 70 65 63 69 66 69 65 64 20 76 61 72 69 61 62 6c  pecified variabl
19d80 65 20 28 65 2e 67 2e 20 22 63 6f 6e 6e 65 63 74  e (e.g. "connect
19d90 69 6f 6e 22 29 20 69 6e 20 74 68 65 0d 0a 20 20  ion") in the..  
19da0 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e 74      #       cont
19db0 65 78 74 20 6f 66 20 6f 75 72 20 63 61 6c 6c 65  ext of our calle
19dc0 72 2e 20 20 54 68 65 20 6f 70 61 71 75 65 20 6f  r.  The opaque o
19dd0 62 6a 65 63 74 20 68 61 6e 64 6c 65 20 66 6f 72  bject handle for
19de0 20 61 6e 20 41 44 4f 2e 4e 45 54 0d 0a 20 20 20   an ADO.NET..   
19df0 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e 6e 65     #       conne
19e00 63 74 69 6f 6e 20 70 72 65 76 69 6f 75 73 6c 79  ction previously
19e10 20 72 65 74 75 72 6e 65 64 20 62 79 20 5b 67 65   returned by [ge
19e20 74 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 5d 20 73  tDbConnection] s
19e30 68 6f 75 6c 64 20 62 65 0d 0a 20 20 20 20 20 20  hould be..      
19e40 23 20 20 20 20 20 20 20 73 74 6f 72 65 64 20 74  #       stored t
19e50 68 65 72 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  here...      #..
19e60 20 20 20 20 20 20 75 70 76 61 72 20 31 20 24 76        upvar 1 $v
19e70 61 72 4e 61 6d 65 20 63 6f 6e 6e 65 63 74 69 6f  arName connectio
19e80 6e 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  n....      #..  
19e90 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65      # NOTE: Atte
19ea0 6d 70 74 20 74 6f 20 72 65 6d 6f 76 65 20 74 68  mpt to remove th
19eb0 65 20 6f 70 61 71 75 65 20 6f 62 6a 65 63 74 20  e opaque object 
19ec0 68 61 6e 64 6c 65 20 66 72 6f 6d 20 74 68 65 20  handle from the 
19ed0 69 6e 74 65 72 70 72 65 74 65 72 0d 0a 20 20 20  interpreter..   
19ee0 20 20 20 23 20 20 20 20 20 20 20 6e 6f 77 2e 20     #       now. 
19ef0 20 54 68 69 73 20 5b 6f 62 6a 65 63 74 20 64 69   This [object di
19f00 73 70 6f 73 65 5d 20 63 61 6c 6c 20 77 69 6c 6c  spose] call will
19f10 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 64 69   not actually di
19f20 73 70 6f 73 65 20 6f 66 20 74 68 65 0d 0a 20 20  spose of the..  
19f30 20 20 20 20 23 20 20 20 20 20 20 20 75 6e 64 65      #       unde
19f40 72 6c 79 69 6e 67 20 6f 62 6a 65 63 74 20 62 65  rlying object be
19f50 63 61 75 73 65 20 74 68 65 20 2b 4e 6f 44 69 73  cause the +NoDis
19f60 70 6f 73 65 20 66 6c 61 67 20 77 61 73 20 73 65  pose flag was se
19f70 74 20 6f 6e 20 69 74 0d 0a 20 20 20 20 20 20 23  t on it..      #
19f80 20 20 20 20 20 20 20 64 75 72 69 6e 67 20 63 72         during cr
19f90 65 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6f 70  eation of the op
19fa0 61 71 75 65 20 6f 62 6a 65 63 74 20 68 61 6e 64  aque object hand
19fb0 6c 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  le...      #..  
19fc0 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
19fd0 69 73 74 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 5d  ists connection]
19fe0 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
19ff0 20 5b 63 61 74 63 68 20 7b 6f 62 6a 65 63 74 20   [catch {object 
1a000 64 69 73 70 6f 73 65 20 24 63 6f 6e 6e 65 63 74  dispose $connect
1a010 69 6f 6e 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65  ion} error]} the
1a020 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
1a030 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
1a040 57 65 20 73 6f 6d 65 68 6f 77 20 66 61 69 6c 65  We somehow faile
1a050 64 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20  d to remove the 
1a060 68 61 6e 64 6c 65 2c 20 72 65 70 6f 72 74 20 77  handle, report w
1a070 68 79 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  hy...        #..
1a080 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
1a090 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
1a0a0 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
1a0b0 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57           "==== W
1a0c0 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74  ARNING: failed t
1a0d0 6f 20 72 65 6d 6f 76 65 20 63 6f 6e 6e 65 63 74  o remove connect
1a0e0 69 6f 6e 20 68 61 6e 64 6c 65 20 5c 22 22 20 24  ion handle \"" $
1a0f0 63 6f 6e 6e 65 63 74 69 6f 6e 20 5c 0d 0a 20 20  connection \..  
1a100 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c 20 65            "\", e
1a110 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72  rror: " \n\t $er
1a120 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d  ror \n]..      }
1a130 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
1a140 70 72 6f 63 20 61 64 64 44 62 43 6f 6e 6e 65 63  proc addDbConnec
1a150 74 69 6f 6e 20 7b 20 63 6f 6e 6e 65 63 74 69 6f  tion { connectio
1a160 6e 20 7b 76 61 72 4e 61 6d 65 20 64 62 7d 20 7d  n {varName db} }
1a170 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
1a180 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 66 65 72     # NOTE: Refer
1a190 20 74 6f 20 74 68 65 20 73 70 65 63 69 66 69 65   to the specifie
1a1a0 64 20 76 61 72 69 61 62 6c 65 20 28 65 2e 67 2e  d variable (e.g.
1a1b0 20 22 64 62 22 29 20 69 6e 20 74 68 65 20 63 6f   "db") in the co
1a1c0 6e 74 65 78 74 20 6f 66 20 6f 75 72 0d 0a 20 20  ntext of our..  
1a1d0 20 20 20 20 23 20 20 20 20 20 20 20 63 61 6c 6c      #       call
1a1e0 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  er...      #..  
1a1f0 20 20 20 20 75 70 76 61 72 20 31 20 24 76 61 72      upvar 1 $var
1a200 4e 61 6d 65 20 64 62 0d 0a 0d 0a 20 20 20 20 20  Name db....     
1a210 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
1a220 3a 20 43 72 65 61 74 65 20 61 20 63 6f 72 72 65  : Create a corre
1a230 63 74 6c 79 20 66 6f 72 6d 61 74 74 65 64 20 6e  ctly formatted n
1a240 61 6d 65 20 66 6f 72 20 74 68 65 20 64 61 74 61  ame for the data
1a250 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
1a260 74 6f 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  to..      #     
1a270 20 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68    be added to th
1a280 65 20 6c 69 73 74 20 6d 61 6e 61 67 65 64 20 62  e list managed b
1a290 79 20 74 68 65 20 45 61 67 6c 65 20 69 6e 74 65  y the Eagle inte
1a2a0 72 70 72 65 74 65 72 2e 0d 0a 20 20 20 20 20 20  rpreter...      
1a2b0 23 0d 0a 20 20 20 20 20 20 73 65 74 20 64 62 20  #..      set db 
1a2c0 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d  [object invoke -
1a2d0 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63  flags +NonPublic
1a2e0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 45 61   \..          Ea
1a2f0 67 6c 65 2e 5f 43 6f 6d 70 6f 6e 65 6e 74 73 2e  gle._Components.
1a300 50 72 69 76 61 74 65 2e 46 6f 72 6d 61 74 4f 70  Private.FormatOp
1a310 73 20 44 61 74 61 62 61 73 65 4f 62 6a 65 63 74  s DatabaseObject
1a320 4e 61 6d 65 20 24 63 6f 6e 6e 65 63 74 69 6f 6e  Name $connection
1a330 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 53 51   \..          SQ
1a340 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 5b  LiteConnection [
1a350 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 49 6e  object invoke In
1a360 74 65 72 70 72 65 74 65 72 2e 47 65 74 41 63 74  terpreter.GetAct
1a370 69 76 65 20 4e 65 78 74 49 64 5d 5d 0d 0a 0d 0a  ive NextId]]....
1a380 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
1a390 20 4e 4f 54 45 3a 20 41 64 64 20 74 68 65 20 64   NOTE: Add the d
1a3a0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
1a3b0 6f 6e 20 70 72 6f 76 69 64 65 64 20 62 79 20 6f  on provided by o
1a3c0 75 72 20 63 61 6c 6c 65 72 20 74 6f 20 74 68 65  ur caller to the
1a3d0 20 6c 69 73 74 0d 0a 20 20 20 20 20 20 23 20 20   list..      #  
1a3e0 20 20 20 20 20 6f 66 20 74 68 6f 73 65 20 6b 6e       of those kn
1a3f0 6f 77 6e 20 74 6f 20 74 68 65 20 45 61 67 6c 65  own to the Eagle
1a400 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a 20   interpreter... 
1a410 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 6f 62       #..      ob
1a420 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61  ject invoke -fla
1a430 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 49 6e  gs +NonPublic In
1a440 74 65 72 70 72 65 74 65 72 2e 47 65 74 41 63 74  terpreter.GetAct
1a450 69 76 65 2e 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ive.connections 
1a460 41 64 64 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  Add \..         
1a470 20 24 64 62 20 24 63 6f 6e 6e 65 63 74 69 6f 6e   $db $connection
1a480 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
1a490 70 72 6f 63 20 72 65 6d 6f 76 65 44 62 54 72 61  proc removeDbTra
1a4a0 6e 73 61 63 74 69 6f 6e 20 7b 20 74 72 61 6e 73  nsaction { trans
1a4b0 61 63 74 69 6f 6e 20 7d 20 7b 0d 0a 20 20 20 20  action } {..    
1a4c0 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
1a4d0 45 3a 20 52 65 6d 6f 76 65 20 74 68 65 20 64 61  E: Remove the da
1a4e0 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69  tabase transacti
1a4f0 6f 6e 20 70 72 6f 76 69 64 65 64 20 62 79 20 6f  on provided by o
1a500 75 72 20 63 61 6c 6c 65 72 20 66 72 6f 6d 20 74  ur caller from t
1a510 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  he..      #     
1a520 20 20 6c 69 73 74 20 6f 66 20 74 68 6f 73 65 20    list of those 
1a530 6b 6e 6f 77 6e 20 74 6f 20 74 68 65 20 45 61 67  known to the Eag
1a540 6c 65 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0d  le interpreter..
1a550 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
1a560 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66  object invoke -f
1a570 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20  lags +NonPublic 
1a580 49 6e 74 65 72 70 72 65 74 65 72 2e 47 65 74 41  Interpreter.GetA
1a590 63 74 69 76 65 2e 74 72 61 6e 73 61 63 74 69 6f  ctive.transactio
1a5a0 6e 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ns \..          
1a5b0 52 65 6d 6f 76 65 20 24 74 72 61 6e 73 61 63 74  Remove $transact
1a5c0 69 6f 6e 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20  ion..    }..... 
1a5d0 20 20 20 70 72 6f 63 20 67 65 74 52 6f 77 73 46     proc getRowsF
1a5e0 72 6f 6d 44 61 74 61 54 61 62 6c 65 20 7b 20 64  romDataTable { d
1a5f0 61 74 61 54 61 62 6c 65 20 7b 76 61 6c 75 65 43  ataTable {valueC
1a600 61 6c 6c 62 61 63 6b 20 22 22 7d 20 7d 20 7b 0d  allback ""} } {.
1a610 0a 20 20 20 20 20 20 73 65 74 20 72 6f 77 73 20  .      set rows 
1a620 5b 6c 69 73 74 5d 0d 0a 20 20 20 20 20 20 73 65  [list]..      se
1a630 74 20 63 6f 75 6e 74 20 5b 24 64 61 74 61 54 61  t count [$dataTa
1a640 62 6c 65 20 43 6f 6c 75 6d 6e 73 2e 43 6f 75 6e  ble Columns.Coun
1a650 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 66 6f 72 20  t]....      for 
1a660 7b 73 65 74 20 69 6e 64 65 78 20 30 7d 20 7b 24  {set index 0} {$
1a670 69 6e 64 65 78 20 3c 20 24 63 6f 75 6e 74 7d 20  index < $count} 
1a680 7b 69 6e 63 72 20 69 6e 64 65 78 7d 20 7b 0d 0a  {incr index} {..
1a690 20 20 20 20 20 20 20 20 73 65 74 20 64 61 74 61          set data
1a6a0 43 6f 6c 75 6d 6e 20 5b 24 64 61 74 61 54 61 62  Column [$dataTab
1a6b0 6c 65 20 2d 61 6c 69 61 73 20 43 6f 6c 75 6d 6e  le -alias Column
1a6c0 73 2e 67 65 74 5f 49 74 65 6d 20 24 69 6e 64 65  s.get_Item $inde
1a6d0 78 5d 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20  x]..        set 
1a6e0 6e 61 6d 65 73 28 24 69 6e 64 65 78 29 20 5b 24  names($index) [$
1a6f0 64 61 74 61 43 6f 6c 75 6d 6e 20 43 6f 6c 75 6d  dataColumn Colum
1a700 6e 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20 7d 0d  nName]..      }.
1a710 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
1a720 20 20 23 20 4e 4f 54 45 3a 20 53 65 74 75 70 20    # NOTE: Setup 
1a730 73 6f 6d 65 20 54 63 6c 20 72 65 74 75 72 6e 20  some Tcl return 
1a740 63 6f 64 65 20 63 6f 6e 73 74 61 6e 74 73 2e 0d  code constants..
1a750 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
1a760 73 65 74 20 4f 6b 20 30 3b 20 73 65 74 20 45 72  set Ok 0; set Er
1a770 72 6f 72 20 31 3b 20 73 65 74 20 52 65 74 75 72  ror 1; set Retur
1a780 6e 20 32 3b 20 73 65 74 20 42 72 65 61 6b 20 33  n 2; set Break 3
1a790 3b 20 73 65 74 20 43 6f 6e 74 69 6e 75 65 20 34  ; set Continue 4
1a7a0 0d 0a 0d 0a 20 20 20 20 20 20 6f 62 6a 65 63 74  ....      object
1a7b0 20 66 6f 72 65 61 63 68 20 2d 61 6c 69 61 73 20   foreach -alias 
1a7c0 64 61 74 61 52 6f 77 20 5b 73 65 74 20 64 61 74  dataRow [set dat
1a7d0 61 52 6f 77 73 20 5b 24 64 61 74 61 54 61 62 6c  aRows [$dataTabl
1a7e0 65 20 52 6f 77 73 5d 5d 20 7b 0d 0a 20 20 20 20  e Rows]] {..    
1a7f0 20 20 20 20 73 65 74 20 72 6f 77 20 5b 6c 69 73      set row [lis
1a800 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 66 6f  t]....        fo
1a810 72 20 7b 73 65 74 20 69 6e 64 65 78 20 30 7d 20  r {set index 0} 
1a820 7b 24 69 6e 64 65 78 20 3c 20 24 63 6f 75 6e 74  {$index < $count
1a830 7d 20 7b 69 6e 63 72 20 69 6e 64 65 78 7d 20 7b  } {incr index} {
1a840 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
1a850 76 61 6c 75 65 20 5b 24 64 61 74 61 52 6f 77 20  value [$dataRow 
1a860 2d 63 72 65 61 74 65 20 2d 61 6c 69 61 73 20 67  -create -alias g
1a870 65 74 5f 49 74 65 6d 20 24 69 6e 64 65 78 5d 0d  et_Item $index].
1a880 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  ...          if 
1a890 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
1a8a0 24 76 61 6c 75 65 43 61 6c 6c 62 61 63 6b 5d 20  $valueCallback] 
1a8b0 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
1a8c0 20 20 20 20 20 20 20 20 20 73 65 74 20 63 6f 64           set cod
1a8d0 65 20 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20  e [catch {..    
1a8e0 20 20 20 20 20 20 20 20 20 20 24 76 61 6c 75 65            $value
1a8f0 43 61 6c 6c 62 61 63 6b 20 24 64 61 74 61 54 61  Callback $dataTa
1a900 62 6c 65 20 24 64 61 74 61 52 6f 77 20 24 69 6e  ble $dataRow $in
1a910 64 65 78 20 24 76 61 6c 75 65 0d 0a 20 20 20 20  dex $value..    
1a920 20 20 20 20 20 20 20 20 7d 20 6e 65 77 56 61 6c          } newVal
1a930 75 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ue]....         
1a940 20 20 20 69 66 20 7b 24 63 6f 64 65 20 3d 3d 20     if {$code == 
1a950 24 4f 6b 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  $Ok} then {..   
1a960 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
1a970 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f              # NO
1a980 54 45 3a 20 55 73 65 20 74 68 65 20 73 70 65 63  TE: Use the spec
1a990 69 66 69 65 64 20 28 6e 65 77 3f 29 20 72 6f 77  ified (new?) row
1a9a0 20 76 61 6c 75 65 2e 0d 0a 20 20 20 20 20 20 20   value...       
1a9b0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1a9c0 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20          lappend 
1a9d0 72 6f 77 20 5b 6c 69 73 74 20 24 6e 61 6d 65 73  row [list $names
1a9e0 28 24 69 6e 64 65 78 29 20 24 6e 65 77 56 61 6c  ($index) $newVal
1a9f0 75 65 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ue]..           
1aa00 20 7d 20 65 6c 73 65 69 66 20 7b 24 63 6f 64 65   } elseif {$code
1aa10 20 3d 3d 20 24 45 72 72 6f 72 7d 20 74 68 65 6e   == $Error} then
1aa20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1aa30 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
1aa40 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20 74     # NOTE: Use t
1aa50 68 65 20 28 6e 65 77 3f 29 20 4e 55 4c 4c 20 72  he (new?) NULL r
1aa60 6f 77 20 76 61 6c 75 65 2e 0d 0a 20 20 20 20 20  ow value...     
1aa70 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
1aa80 20 20 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e            lappen
1aa90 64 20 72 6f 77 20 5b 6c 69 73 74 20 24 6e 61 6d  d row [list $nam
1aaa0 65 73 28 24 69 6e 64 65 78 29 5d 0d 0a 20 20 20  es($index)]..   
1aab0 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 69           } elsei
1aac0 66 20 7b 24 63 6f 64 65 20 3d 3d 20 24 52 65 74  f {$code == $Ret
1aad0 75 72 6e 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  urn} then {..   
1aae0 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
1aaf0 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f              # NO
1ab00 54 45 3a 20 53 6b 69 70 20 72 65 6d 61 69 6e 69  TE: Skip remaini
1ab10 6e 67 20 76 61 6c 75 65 73 20 66 6f 72 20 74 68  ng values for th
1ab20 69 73 20 72 6f 77 2e 0d 0a 20 20 20 20 20 20 20  is row...       
1ab30 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1ab40 20 20 20 20 20 20 20 20 62 72 65 61 6b 0d 0a 20          break.. 
1ab50 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73             } els
1ab60 65 69 66 20 7b 24 63 6f 64 65 20 3d 3d 20 24 42  eif {$code == $B
1ab70 72 65 61 6b 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  reak} then {..  
1ab80 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
1ab90 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e               # N
1aba0 4f 54 45 3a 20 53 6b 69 70 20 70 72 6f 63 65 73  OTE: Skip proces
1abb0 73 69 6e 67 20 74 68 69 73 20 72 6f 77 20 76 61  sing this row va
1abc0 6c 75 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  lue...          
1abd0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
1abe0 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 24 63 6f     } elseif {$co
1abf0 64 65 20 3d 3d 20 24 43 6f 6e 74 69 6e 75 65 7d  de == $Continue}
1ac00 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1ac10 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1ac20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
1ac30 55 73 65 20 64 65 66 61 75 6c 74 20 72 6f 77 20  Use default row 
1ac40 76 61 6c 75 65 20 68 61 6e 64 6c 69 6e 67 2e 0d  value handling..
1ac50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
1ac60 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
1ac70 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73  .          } els
1ac80 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e {..           
1ac90 20 73 65 74 20 63 6f 64 65 20 24 43 6f 6e 74 69   set code $Conti
1aca0 6e 75 65 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  nue..          }
1acb0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66  ....          if
1acc0 20 7b 24 63 6f 64 65 20 3d 3d 20 24 43 6f 6e 74   {$code == $Cont
1acd0 69 6e 75 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  inue} then {..  
1ace0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73            if {[s
1acf0 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 61  tring length $va
1ad00 6c 75 65 5d 20 3e 20 30 20 26 26 20 5c 0d 0a 20  lue] > 0 && \.. 
1ad10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 21                 !
1ad20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 43  [object invoke C
1ad30 6f 6e 76 65 72 74 20 49 73 44 42 4e 75 6c 6c 20  onvert IsDBNull 
1ad40 24 76 61 6c 75 65 5d 7d 20 74 68 65 6e 20 7b 0d  $value]} then {.
1ad50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c  .              l
1ad60 61 70 70 65 6e 64 20 72 6f 77 20 5b 6c 69 73 74  append row [list
1ad70 20 24 6e 61 6d 65 73 28 24 69 6e 64 65 78 29 20   $names($index) 
1ad80 5b 24 76 61 6c 75 65 20 54 6f 53 74 72 69 6e 67  [$value ToString
1ad90 5d 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ]]..            
1ada0 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
1adb0 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20          lappend 
1adc0 72 6f 77 20 5b 6c 69 73 74 20 24 6e 61 6d 65 73  row [list $names
1add0 28 24 69 6e 64 65 78 29 5d 0d 0a 20 20 20 20 20  ($index)]..     
1ade0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1adf0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
1ae00 0d 0a 0d 0a 20 20 20 20 20 20 20 20 6c 61 70 70  ....        lapp
1ae10 65 6e 64 20 72 6f 77 73 20 24 72 6f 77 0d 0a 20  end rows $row.. 
1ae20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
1ae30 72 65 74 75 72 6e 20 24 72 6f 77 73 0d 0a 20 20  return $rows..  
1ae40 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
1ae50 20 64 75 6d 70 52 6f 77 73 46 72 6f 6d 44 61 74   dumpRowsFromDat
1ae60 61 54 61 62 6c 65 20 7b 20 63 68 61 6e 6e 65 6c  aTable { channel
1ae70 20 72 6f 77 73 20 7d 20 7b 0d 0a 20 20 20 20 20   rows } {..     
1ae80 20 73 65 74 20 73 65 71 75 65 6e 63 65 20 31 0d   set sequence 1.
1ae90 0a 0d 0a 20 20 20 20 20 20 66 6f 72 65 61 63 68  ...      foreach
1aea0 20 72 6f 77 20 24 72 6f 77 73 20 7b 0d 0a 20 20   row $rows {..  
1aeb0 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
1aec0 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
1aed0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1aee0 5b 65 78 70 72 20 7b 24 73 65 71 75 65 6e 63 65  [expr {$sequence
1aef0 20 3e 20 31 20 3f 20 22 5c 6e 22 20 3a 20 22 22   > 1 ? "\n" : ""
1af00 7d 5d 20 22 2d 2d 2d 2d 20 52 4f 57 20 23 22 20  }] "---- ROW #" 
1af10 24 73 65 71 75 65 6e 63 65 20 3a 5c 6e 5d 0d 0a  $sequence :\n]..
1af20 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63  ..        foreac
1af30 68 20 70 61 69 72 20 24 72 6f 77 20 7b 0d 0a 20  h pair $row {.. 
1af40 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 6c 6c           if {[ll
1af50 65 6e 67 74 68 20 24 70 61 69 72 5d 20 3e 3d 20  ength $pair] >= 
1af60 32 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  2} then {..     
1af70 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
1af80 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
1af90 73 20 5c 74 20 5c 0d 0a 20 20 20 20 20 20 20 20  s \t \..        
1afa0 20 20 20 20 20 20 20 20 5b 6c 69 73 74 20 5b 6c          [list [l
1afb0 69 6e 64 65 78 20 24 70 61 69 72 20 30 5d 5d 20  index $pair 0]] 
1afc0 22 3a 20 22 20 5b 6c 69 73 74 20 5b 6c 69 6e 64  ": " [list [lind
1afd0 65 78 20 24 70 61 69 72 20 31 5d 5d 20 5c 6e 5d  ex $pair 1]] \n]
1afe0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c  ..          } el
1aff0 73 65 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24  seif {[llength $
1b000 70 61 69 72 5d 20 3d 3d 20 31 7d 20 74 68 65 6e  pair] == 1} then
1b010 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1b020 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
1b030 61 70 70 65 6e 64 41 72 67 73 20 5c 74 20 5c 0d  appendArgs \t \.
1b040 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b050 20 5b 6c 69 73 74 20 5b 6c 69 6e 64 65 78 20 24   [list [lindex $
1b060 70 61 69 72 20 30 5d 5d 20 22 3a 20 3c 6e 75 6c  pair 0]] ": <nul
1b070 6c 3e 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20  l>\n"]..        
1b080 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
1b090 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
1b0a0 68 61 6e 6e 65 6c 20 5c 74 3c 65 6d 70 74 79 3e  hannel \t<empty>
1b0b0 5c 6e 3b 20 23 20 4e 4f 54 45 3a 20 4e 6f 20 64  \n; # NOTE: No d
1b0c0 61 74 61 3f 0d 0a 20 20 20 20 20 20 20 20 20 20  ata?..          
1b0d0 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  }..        }....
1b0e0 20 20 20 20 20 20 20 20 69 6e 63 72 20 73 65 71          incr seq
1b0f0 75 65 6e 63 65 0d 0a 20 20 20 20 20 20 7d 0d 0a  uence..      }..
1b100 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
1b110 6f 63 20 63 6c 65 61 6e 75 70 44 62 20 7b 20 66  oc cleanupDb { f
1b120 69 6c 65 4e 61 6d 65 20 7b 76 61 72 4e 61 6d 65  ileName {varName
1b130 20 64 62 7d 20 7b 63 6f 6c 6c 65 63 74 20 74 72   db} {collect tr
1b140 75 65 7d 20 7b 71 75 61 6c 69 66 79 20 74 72 75  ue} {qualify tru
1b150 65 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e}..            
1b160 20 20 20 20 20 20 20 20 20 7b 64 65 6c 65 74 65           {delete
1b170 20 74 72 75 65 7d 20 7d 20 7b 0d 0a 20 20 20 20   true} } {..    
1b180 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
1b190 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 66 6f  E: Attempt to fo
1b1a0 72 63 65 20 61 6c 6c 20 70 65 6e 64 69 6e 67 20  rce all pending 
1b1b0 22 67 61 72 62 61 67 65 22 20 6f 62 6a 65 63 74  "garbage" object
1b1c0 73 20 74 6f 20 62 65 20 63 6f 6c 6c 65 63 74 65  s to be collecte
1b1d0 64 2c 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  d,..      #     
1b1e0 20 20 69 6e 63 6c 75 64 69 6e 67 20 53 51 4c 69    including SQLi
1b1f0 74 65 20 73 74 61 74 65 6d 65 6e 74 73 20 61 6e  te statements an
1b200 64 20 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73  d backup objects
1b210 3b 20 74 68 69 73 20 73 68 6f 75 6c 64 20 61 6c  ; this should al
1b220 6c 6f 77 0d 0a 20 20 20 20 20 20 23 20 20 20 20  low..      #    
1b230 20 20 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e     the underlyin
1b240 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  g database file 
1b250 74 6f 20 62 65 20 64 65 6c 65 74 65 64 2e 0d 0a  to be deleted...
1b260 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
1b270 66 20 7b 24 63 6f 6c 6c 65 63 74 7d 20 74 68 65  f {$collect} the
1b280 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 63 6f 6c  n {..        col
1b290 6c 65 63 74 47 61 72 62 61 67 65 20 24 3a 3a 74  lectGarbage $::t
1b2a0 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 20 20 20  est_channel..   
1b2b0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
1b2c0 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52  .      # NOTE: R
1b2d0 65 66 65 72 20 74 6f 20 74 68 65 20 73 70 65 63  efer to the spec
1b2e0 69 66 69 65 64 20 76 61 72 69 61 62 6c 65 20 28  ified variable (
1b2f0 65 2e 67 2e 20 22 64 62 22 29 20 69 6e 20 74 68  e.g. "db") in th
1b300 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72  e context of our
1b310 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
1b320 63 61 6c 6c 65 72 2e 20 20 54 68 65 20 68 61 6e  caller.  The han
1b330 64 6c 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  dle to the datab
1b340 61 73 65 20 70 72 65 76 69 6f 75 73 6c 79 20 6f  ase previously o
1b350 70 65 6e 65 64 20 76 69 61 20 74 68 65 0d 0a 20  pened via the.. 
1b360 20 20 20 20 20 23 20 20 20 20 20 20 20 5b 73 65       #       [se
1b370 74 75 70 44 62 5d 20 70 72 6f 63 65 64 75 72 65  tupDb] procedure
1b380 20 73 68 6f 75 6c 64 20 62 65 20 73 74 6f 72 65   should be store
1b390 64 20 74 68 65 72 65 2e 0d 0a 20 20 20 20 20 20  d there...      
1b3a0 23 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20 31  #..      upvar 1
1b3b0 20 24 76 61 72 4e 61 6d 65 20 64 62 0d 0a 0d 0a   $varName db....
1b3c0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
1b3d0 20 4e 4f 54 45 3a 20 43 6c 6f 73 65 20 74 68 65   NOTE: Close the
1b3e0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 74   connection to t
1b3f0 68 65 20 64 61 74 61 62 61 73 65 20 6e 6f 77 2e  he database now.
1b400 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20 61 6c    This should al
1b410 6c 6f 77 20 75 73 0d 0a 20 20 20 20 20 20 23 20  low us..      # 
1b420 20 20 20 20 20 20 74 6f 20 64 65 6c 65 74 65 20        to delete 
1b430 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64  the underlying d
1b440 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0d 0a 20  atabase file... 
1b450 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
1b460 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 64   {[info exists d
1b470 62 5d 20 26 26 20 5b 63 61 74 63 68 20 7b 73 71  b] && [catch {sq
1b480 6c 20 63 6c 6f 73 65 20 24 64 62 7d 20 65 72 72  l close $db} err
1b490 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  or]} then {..   
1b4a0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1b4b0 23 20 4e 4f 54 45 3a 20 57 65 20 73 6f 6d 65 68  # NOTE: We someh
1b4c0 6f 77 20 66 61 69 6c 65 64 20 74 6f 20 63 6c 6f  ow failed to clo
1b4d0 73 65 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  se the database,
1b4e0 20 72 65 70 6f 72 74 20 77 68 79 2e 0d 0a 20 20   report why...  
1b4f0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1b500 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
1b510 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
1b520 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
1b530 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a    "==== WARNING:
1b540 20 66 61 69 6c 65 64 20 74 6f 20 63 6c 6f 73 65   failed to close
1b550 20 64 61 74 61 62 61 73 65 20 5c 22 22 20 24 64   database \"" $d
1b560 62 20 22 5c 22 2c 20 65 72 72 6f 72 3a 20 22 20  b "\", error: " 
1b570 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5c  \..            \
1b580 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a  n\t $error \n]..
1b590 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
1b5a0 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
1b5b0 3a 20 46 69 72 73 74 2c 20 73 65 65 20 69 66 20  : First, see if 
1b5c0 6f 75 72 20 63 61 6c 6c 65 72 20 68 61 73 20 72  our caller has r
1b5d0 65 71 75 65 73 74 65 64 20 61 6e 20 69 6e 2d 6d  equested an in-m
1b5e0 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0d  emory database..
1b5f0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
1b600 73 65 74 20 69 73 4d 65 6d 6f 72 79 20 5b 69 73  set isMemory [is
1b610 4d 65 6d 6f 72 79 44 62 20 24 66 69 6c 65 4e 61  MemoryDb $fileNa
1b620 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a  me]....      #..
1b630 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75        # NOTE: Bu
1b640 69 6c 64 20 74 68 65 20 66 75 6c 6c 20 70 61 74  ild the full pat
1b650 68 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  h to the databas
1b660 65 20 66 69 6c 65 20 6e 61 6d 65 2e 20 20 46 6f  e file name.  Fo
1b670 72 20 6e 6f 77 2c 20 61 6c 6c 20 74 65 73 74 0d  r now, all test.
1b680 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64  .      #       d
1b690 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 61 72  atabase files ar
1b6a0 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  e stored in the 
1b6b0 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74  temporary direct
1b6c0 6f 72 79 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ory...      #.. 
1b6d0 20 20 20 20 20 69 66 20 7b 21 24 69 73 4d 65 6d       if {!$isMem
1b6e0 6f 72 79 20 26 26 20 24 71 75 61 6c 69 66 79 7d  ory && $qualify}
1b6f0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1b700 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66   set fileName [f
1b710 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 44 61 74  ile join [getDat
1b720 61 62 61 73 65 44 69 72 65 63 74 6f 72 79 5d 20  abaseDirectory] 
1b730 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69 6c 65  [file tail $file
1b740 4e 61 6d 65 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d  Name]]..      }.
1b750 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
1b760 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20    # NOTE: Check 
1b770 69 66 20 74 68 65 20 66 69 6c 65 20 73 74 69 6c  if the file stil
1b780 6c 20 65 78 69 73 74 73 3b 20 69 6e 69 74 69 61  l exists; initia
1b790 6c 6c 79 2c 20 61 73 73 75 6d 65 20 61 6c 6c 20  lly, assume all 
1b7a0 66 69 6c 65 73 20 77 69 6c 6c 0d 0a 20 20 20 20  files will..    
1b7b0 20 20 23 20 20 20 20 20 20 20 62 65 20 64 65 6c    #       be del
1b7c0 65 74 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c  eted successfull
1b7d0 79 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  y, if necessary.
1b7e0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
1b7f0 20 73 65 74 20 73 75 63 63 65 73 73 20 74 72 75   set success tru
1b800 65 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 21  e....      if {!
1b810 24 69 73 4d 65 6d 6f 72 79 20 26 26 20 24 64 65  $isMemory && $de
1b820 6c 65 74 65 20 26 26 20 5b 66 69 6c 65 20 65 78  lete && [file ex
1b830 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d  ists $fileName]}
1b840 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1b850 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
1b860 54 45 3a 20 53 6b 69 70 20 64 65 6c 65 74 69 6e  TE: Skip deletin
1b870 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  g database files
1b880 20 69 66 20 73 6f 6d 65 62 6f 64 79 20 73 65 74   if somebody set
1b890 73 20 74 68 65 20 67 6c 6f 62 61 6c 0d 0a 20 20  s the global..  
1b8a0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 76 61        #       va
1b8b0 72 69 61 62 6c 65 20 74 6f 20 70 72 65 76 65 6e  riable to preven
1b8c0 74 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23  t it...        #
1b8d0 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b  ..        if {![
1b8e0 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
1b8f0 28 63 6c 65 61 6e 75 70 44 62 46 69 6c 65 73 29  (cleanupDbFiles)
1b900 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
1b910 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1b920 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70    # NOTE: Attemp
1b930 74 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20  t to delete the 
1b940 74 65 73 74 20 57 41 4c 20 66 69 6c 65 2c 20 69  test WAL file, i
1b950 66 20 61 6e 79 2c 20 6e 6f 77 2e 0d 0a 20 20 20  f any, now...   
1b960 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1b970 20 20 20 20 73 65 74 20 77 61 6c 46 69 6c 65 4e      set walFileN
1b980 61 6d 65 20 5b 61 70 70 65 6e 64 41 72 67 73 20  ame [appendArgs 
1b990 24 66 69 6c 65 4e 61 6d 65 20 2d 77 61 6c 5d 0d  $fileName -wal].
1b9a0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  ...          if 
1b9b0 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 77  {[file exists $w
1b9c0 61 6c 46 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65  alFileName]} the
1b9d0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
1b9e0 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
1b9f0 23 20 4e 4f 54 45 3a 20 49 66 20 74 68 65 72 65  # NOTE: If there
1ba00 20 69 73 20 61 20 57 41 4c 20 66 69 6c 65 2c 20   is a WAL file, 
1ba10 69 74 20 73 68 6f 75 6c 64 20 62 65 20 7a 65 72  it should be zer
1ba20 6f 20 62 79 74 65 73 20 61 74 20 74 68 69 73 0d  o bytes at this.
1ba30 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20  .            #  
1ba40 20 20 20 20 20 70 6f 69 6e 74 2e 0d 0a 20 20 20       point...   
1ba50 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
1ba60 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 65 74          if {[set
1ba70 20 73 69 7a 65 20 5b 66 69 6c 65 20 73 69 7a 65   size [file size
1ba80 20 24 77 61 6c 46 69 6c 65 4e 61 6d 65 5d 5d 20   $walFileName]] 
1ba90 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
1baa0 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
1bab0 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e               # N
1bac0 4f 54 45 3a 20 57 65 20 73 6f 6d 65 68 6f 77 20  OTE: We somehow 
1bad0 66 61 69 6c 65 64 20 74 6f 20 64 65 6c 65 74 65  failed to delete
1bae0 20 74 68 65 20 57 41 4c 20 66 69 6c 65 2c 20 72   the WAL file, r
1baf0 65 70 6f 72 74 20 77 68 79 2e 0d 0a 20 20 20 20  eport why...    
1bb00 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
1bb10 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b             if {[
1bb20 63 61 74 63 68 20 7b 66 69 6c 65 20 64 65 6c 65  catch {file dele
1bb30 74 65 20 24 77 61 6c 46 69 6c 65 4e 61 6d 65 7d  te $walFileName}
1bb40 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d   error]} then {.
1bb50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1bb60 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
1bb70 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
1bb80 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
1bb90 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20            "==== 
1bba0 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20  WARNING: failed 
1bbb0 74 6f 20 64 65 6c 65 74 65 20 57 41 4c 20 66 69  to delete WAL fi
1bbc0 6c 65 20 5c 22 22 20 24 77 61 6c 46 69 6c 65 4e  le \"" $walFileN
1bbd0 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ame \..         
1bbe0 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 20 64             "\" d
1bbf0 75 72 69 6e 67 20 63 6c 65 61 6e 75 70 2c 20 65  uring cleanup, e
1bc00 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72  rror: " \n\t $er
1bc10 72 6f 72 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20  ror \n]....     
1bc20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 73             set s
1bc30 75 63 63 65 73 73 20 66 61 6c 73 65 0d 0a 20 20  uccess false..  
1bc40 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
1bc50 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73             } els
1bc60 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e {..           
1bc70 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
1bc80 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
1bc90 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
1bca0 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20            "==== 
1bcb0 57 41 52 4e 49 4e 47 3a 20 57 41 4c 20 66 69 6c  WARNING: WAL fil
1bcc0 65 20 5c 22 22 20 24 77 61 6c 46 69 6c 65 4e 61  e \"" $walFileNa
1bcd0 6d 65 20 22 5c 22 20 69 73 20 22 20 24 73 69 7a  me "\" is " $siz
1bce0 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
1bcf0 20 20 20 20 20 20 20 22 20 62 79 74 65 73 20 69         " bytes i
1bd00 6e 20 73 69 7a 65 2c 20 73 6b 69 70 70 69 6e 67  n size, skipping
1bd10 20 61 6c 6c 20 66 69 6c 65 20 64 65 6c 65 74 69   all file deleti
1bd20 6f 6e 73 2e 2e 2e 5c 6e 22 5d 0d 0a 0d 0a 20 20  ons...\n"]....  
1bd30 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
1bd40 72 6e 20 31 3b 20 23 20 65 72 72 6f 72 0d 0a 20  rn 1; # error.. 
1bd50 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
1bd60 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
1bd70 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1bd80 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65      # NOTE: Atte
1bd90 6d 70 74 20 74 6f 20 64 65 6c 65 74 65 20 74 68  mpt to delete th
1bda0 65 20 74 65 73 74 20 53 48 4d 20 66 69 6c 65 2c  e test SHM file,
1bdb0 20 69 66 20 61 6e 79 2c 20 6e 6f 77 2e 0d 0a 20   if any, now... 
1bdc0 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
1bdd0 20 20 20 20 20 20 73 65 74 20 73 68 6d 46 69 6c        set shmFil
1bde0 65 4e 61 6d 65 20 5b 61 70 70 65 6e 64 41 72 67  eName [appendArg
1bdf0 73 20 24 66 69 6c 65 4e 61 6d 65 20 2d 73 68 6d  s $fileName -shm
1be00 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69  ]....          i
1be10 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20  f {[file exists 
1be20 24 73 68 6d 46 69 6c 65 4e 61 6d 65 5d 20 26 26  $shmFileName] &&
1be30 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1be40 20 20 5b 63 61 74 63 68 20 7b 66 69 6c 65 20 64    [catch {file d
1be50 65 6c 65 74 65 20 24 73 68 6d 46 69 6c 65 4e 61  elete $shmFileNa
1be60 6d 65 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e  me} error]} then
1be70 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1be80 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  #..            #
1be90 20 4e 4f 54 45 3a 20 57 65 20 73 6f 6d 65 68 6f   NOTE: We someho
1bea0 77 20 66 61 69 6c 65 64 20 74 6f 20 64 65 6c 65  w failed to dele
1beb0 74 65 20 74 68 65 20 53 48 4d 20 66 69 6c 65 2c  te the SHM file,
1bec0 20 72 65 70 6f 72 74 20 77 68 79 2e 0d 0a 20 20   report why...  
1bed0 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
1bee0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
1bef0 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
1bf00 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
1bf10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d                "=
1bf20 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69  === WARNING: fai
1bf30 6c 65 64 20 74 6f 20 64 65 6c 65 74 65 20 53 48  led to delete SH
1bf40 4d 20 66 69 6c 65 20 5c 22 22 20 24 73 68 6d 46  M file \"" $shmF
1bf50 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20  ileName \..     
1bf60 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 20 64             "\" d
1bf70 75 72 69 6e 67 20 63 6c 65 61 6e 75 70 2c 20 65  uring cleanup, e
1bf80 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72  rror: " \n\t $er
1bf90 72 6f 72 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20  ror \n]....     
1bfa0 20 20 20 20 20 20 20 73 65 74 20 73 75 63 63 65         set succe
1bfb0 73 73 20 66 61 6c 73 65 0d 0a 20 20 20 20 20 20  ss false..      
1bfc0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
1bfd0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
1bfe0 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20  # NOTE: Attempt 
1bff0 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 74 65  to delete the te
1c000 73 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  st database file
1c010 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 20   now...         
1c020 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   #..          if
1c030 20 7b 5b 63 61 74 63 68 20 7b 66 69 6c 65 20 64   {[catch {file d
1c040 65 6c 65 74 65 20 24 66 69 6c 65 4e 61 6d 65 7d  elete $fileName}
1c050 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d   error]} then {.
1c060 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a  .            #..
1c070 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f              # NO
1c080 54 45 3a 20 57 65 20 73 6f 6d 65 68 6f 77 20 66  TE: We somehow f
1c090 61 69 6c 65 64 20 74 6f 20 64 65 6c 65 74 65 20  ailed to delete 
1c0a0 74 68 65 20 66 69 6c 65 2c 20 72 65 70 6f 72 74  the file, report
1c0b0 20 77 68 79 2e 0d 0a 20 20 20 20 20 20 20 20 20   why...         
1c0c0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
1c0d0 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
1c0e0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
1c0f0 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
1c100 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52         "==== WAR
1c110 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20  NING: failed to 
1c120 64 65 6c 65 74 65 20 64 61 74 61 62 61 73 65 20  delete database 
1c130 66 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e 61  file \"" $fileNa
1c140 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  me \..          
1c150 20 20 20 20 20 20 22 5c 22 20 64 75 72 69 6e 67        "\" during
1c160 20 63 6c 65 61 6e 75 70 2c 20 65 72 72 6f 72 3a   cleanup, error:
1c170 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c   " \n\t $error \
1c180 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  n]....          
1c190 20 20 73 65 74 20 73 75 63 63 65 73 73 20 66 61    set success fa
1c1a0 6c 73 65 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  lse..          }
1c1b0 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65  ..        } else
1c1c0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d   {..          #.
1c1d0 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
1c1e0 45 3a 20 53 68 6f 77 20 74 68 61 74 20 77 65 20  E: Show that we 
1c1f0 73 6b 69 70 70 65 64 20 64 65 6c 65 74 69 6e 67  skipped deleting
1c200 20 74 68 65 20 66 69 6c 65 2e 0d 0a 20 20 20 20   the file...    
1c210 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1c220 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
1c230 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
1c240 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
1c250 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e        "==== WARN
1c260 49 4e 47 3a 20 73 6b 69 70 70 65 64 20 64 65 6c  ING: skipped del
1c270 65 74 69 6e 67 20 64 61 74 61 62 61 73 65 20 66  eting database f
1c280 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d  ile \"" $fileNam
1c290 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
1c2a0 20 20 20 22 5c 22 20 64 75 72 69 6e 67 20 63 6c     "\" during cl
1c2b0 65 61 6e 75 70 5c 6e 22 5d 0d 0a 20 20 20 20 20  eanup\n"]..     
1c2c0 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d     }..      }...
1c2d0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 65  .      return [e
1c2e0 78 70 72 20 7b 24 73 75 63 63 65 73 73 20 3f 20  xpr {$success ? 
1c2f0 30 20 3a 20 31 7d 5d 0d 0a 20 20 20 20 7d 0d 0a  0 : 1}]..    }..
1c300 0c 0d 0a 20 20 20 20 70 72 6f 63 20 73 61 76 65  ...    proc save
1c310 45 6e 76 69 72 6f 6e 6d 65 6e 74 56 61 72 69 61  EnvironmentVaria
1c320 62 6c 65 73 20 7b 20 6e 61 6d 65 73 20 7b 76 61  bles { names {va
1c330 72 4e 61 6d 65 20 22 22 7d 20 7d 20 7b 0d 0a 20  rName ""} } {.. 
1c340 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
1c350 4e 4f 54 45 3a 20 46 6f 72 20 65 61 63 68 20 6e  NOTE: For each n
1c360 61 6d 65 2c 20 64 6f 65 73 20 74 68 65 20 6c 69  ame, does the li
1c370 76 65 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76  ve environment v
1c380 61 72 69 61 62 6c 65 20 65 78 69 73 74 3f 20 20  ariable exist?  
1c390 49 66 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  If..      #     
1c3a0 20 20 73 6f 2c 20 73 61 76 65 20 74 68 65 20 76    so, save the v
1c3b0 61 6c 75 65 20 66 6f 72 20 6c 61 74 65 72 3b 20  alue for later; 
1c3c0 6f 74 68 65 72 77 69 73 65 2c 20 6d 61 6b 65 20  otherwise, make 
1c3d0 73 75 72 65 20 74 68 65 20 73 61 76 65 64 0d 0a  sure the saved..
1c3e0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 76 61        #       va
1c3f0 6c 75 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  lue does not exi
1c400 73 74 20 65 69 74 68 65 72 2e 20 20 54 68 65 20  st either.  The 
1c410 6c 69 76 65 20 65 6e 76 69 72 6f 6e 6d 65 6e 74  live environment
1c420 20 76 61 72 69 61 62 6c 65 73 0d 0a 20 20 20 20   variables..    
1c430 20 20 23 20 20 20 20 20 20 20 41 52 45 20 4e 4f    #       ARE NO
1c440 54 20 63 68 61 6e 67 65 64 20 62 79 20 74 68 69  T changed by thi
1c450 73 20 70 72 6f 63 65 64 75 72 65 2e 0d 0a 20 20  s procedure...  
1c460 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
1c470 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
1c480 24 76 61 72 4e 61 6d 65 5d 20 3d 3d 20 30 7d 20  $varName] == 0} 
1c490 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1c4a0 73 65 74 20 76 61 72 4e 61 6d 65 20 73 61 76 65  set varName save
1c4b0 64 45 6e 76 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  dEnv..      }...
1c4c0 0a 20 20 20 20 20 20 75 70 76 61 72 20 31 20 24  .      upvar 1 $
1c4d0 76 61 72 4e 61 6d 65 20 73 61 76 65 64 45 6e 76  varName savedEnv
1c4e0 0d 0a 0d 0a 20 20 20 20 20 20 66 6f 72 65 61 63  ....      foreac
1c4f0 68 20 6e 61 6d 65 20 24 6e 61 6d 65 73 20 7b 0d  h name $names {.
1c500 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69 6e  .        if {[in
1c510 66 6f 20 65 78 69 73 74 73 20 3a 3a 65 6e 76 28  fo exists ::env(
1c520 24 6e 61 6d 65 29 5d 7d 20 74 68 65 6e 20 7b 0d  $name)]} then {.
1c530 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20 73  .          set s
1c540 61 76 65 64 45 6e 76 28 24 6e 61 6d 65 29 20 24  avedEnv($name) $
1c550 3a 3a 65 6e 76 28 24 6e 61 6d 65 29 0d 0a 20 20  ::env($name)..  
1c560 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
1c570 20 20 20 20 20 20 20 20 20 20 75 6e 73 65 74 20            unset 
1c580 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 73 61 76 65  -nocomplain save
1c590 64 45 6e 76 28 24 6e 61 6d 65 29 0d 0a 20 20 20  dEnv($name)..   
1c5a0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
1c5b0 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
1c5c0 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 69    # NOTE: This i
1c5d0 73 20 73 65 6c 66 2d 63 6c 65 61 6e 69 6e 67 2e  s self-cleaning.
1c5e0 20 20 49 66 20 6e 6f 20 73 61 76 65 64 20 65 6e    If no saved en
1c5f0 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62  vironment variab
1c600 6c 65 73 20 6e 6f 77 0d 0a 20 20 20 20 20 20 23  les now..      #
1c610 20 20 20 20 20 20 20 65 78 69 73 74 2c 20 72 65         exist, re
1c620 6d 6f 76 65 20 74 68 65 20 61 72 72 61 79 2e 0d  move the array..
1c630 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
1c640 69 66 20 7b 5b 61 72 72 61 79 20 73 69 7a 65 20  if {[array size 
1c650 73 61 76 65 64 45 6e 76 5d 20 3d 3d 20 30 7d 20  savedEnv] == 0} 
1c660 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1c670 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69  unset -nocomplai
1c680 6e 20 73 61 76 65 64 45 6e 76 0d 0a 20 20 20 20  n savedEnv..    
1c690 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
1c6a0 20 20 20 70 72 6f 63 20 72 65 73 74 6f 72 65 45     proc restoreE
1c6b0 6e 76 69 72 6f 6e 6d 65 6e 74 56 61 72 69 61 62  nvironmentVariab
1c6c0 6c 65 73 20 7b 20 6e 61 6d 65 73 20 7b 76 61 72  les { names {var
1c6d0 4e 61 6d 65 20 22 22 7d 20 7d 20 7b 0d 0a 20 20  Name ""} } {..  
1c6e0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
1c6f0 4f 54 45 3a 20 46 6f 72 20 65 61 63 68 20 6e 61  OTE: For each na
1c700 6d 65 2c 20 64 6f 65 73 20 74 68 65 20 73 61 76  me, does the sav
1c710 65 64 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76  ed environment v
1c720 61 72 69 61 62 6c 65 20 65 78 69 73 74 3f 20 20  ariable exist?  
1c730 49 66 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  If..      #     
1c740 20 20 73 6f 2c 20 72 65 73 74 6f 72 65 20 74 68    so, restore th
1c750 65 20 73 61 76 65 64 20 76 61 6c 75 65 20 61 6e  e saved value an
1c760 64 20 75 6e 73 65 74 20 69 74 3b 20 6f 74 68 65  d unset it; othe
1c770 72 77 69 73 65 2c 20 6d 61 6b 65 20 73 75 72 65  rwise, make sure
1c780 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
1c790 74 68 65 20 6c 69 76 65 20 65 6e 76 69 72 6f 6e  the live environ
1c7a0 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 20 64 6f  ment variable do
1c7b0 65 73 20 6e 6f 74 20 65 78 69 73 74 20 65 69 74  es not exist eit
1c7c0 68 65 72 20 28 69 2e 65 2e 20 69 74 0d 0a 20 20  her (i.e. it..  
1c7d0 20 20 20 20 23 20 20 20 20 20 20 20 77 61 73 20      #       was 
1c7e0 6e 6f 74 20 73 65 74 20 74 6f 20 62 65 67 69 6e  not set to begin
1c7f0 20 77 69 74 68 29 2e 20 20 42 6f 74 68 20 73 61   with).  Both sa
1c800 76 65 64 20 61 6e 64 20 6c 69 76 65 20 65 6e 76  ved and live env
1c810 69 72 6f 6e 6d 65 6e 74 0d 0a 20 20 20 20 20 20  ironment..      
1c820 23 20 20 20 20 20 20 20 76 61 72 69 61 62 6c 65  #       variable
1c830 73 20 41 52 45 20 63 68 61 6e 67 65 64 20 62 79  s ARE changed by
1c840 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 2e   this procedure.
1c850 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
1c860 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
1c870 67 74 68 20 24 76 61 72 4e 61 6d 65 5d 20 3d 3d  gth $varName] ==
1c880 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
1c890 20 20 20 20 73 65 74 20 76 61 72 4e 61 6d 65 20      set varName 
1c8a0 73 61 76 65 64 45 6e 76 0d 0a 20 20 20 20 20 20  savedEnv..      
1c8b0 7d 0d 0a 0d 0a 20 20 20 20 20 20 75 70 76 61 72  }....      upvar
1c8c0 20 31 20 24 76 61 72 4e 61 6d 65 20 73 61 76 65   1 $varName save
1c8d0 64 45 6e 76 0d 0a 0d 0a 20 20 20 20 20 20 66 6f  dEnv....      fo
1c8e0 72 65 61 63 68 20 6e 61 6d 65 20 24 6e 61 6d 65  reach name $name
1c8f0 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20  s {..        if 
1c900 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 73 61  {[info exists sa
1c910 76 65 64 45 6e 76 28 24 6e 61 6d 65 29 5d 7d 20  vedEnv($name)]} 
1c920 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1c930 20 20 73 65 74 20 3a 3a 65 6e 76 28 24 6e 61 6d    set ::env($nam
1c940 65 29 20 24 73 61 76 65 64 45 6e 76 28 24 6e 61  e) $savedEnv($na
1c950 6d 65 29 0d 0a 20 20 20 20 20 20 20 20 20 20 75  me)..          u
1c960 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e  nset -nocomplain
1c970 20 73 61 76 65 64 45 6e 76 28 24 6e 61 6d 65 29   savedEnv($name)
1c980 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65  ..        } else
1c990 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 75 6e   {..          un
1c9a0 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20  set -nocomplain 
1c9b0 3a 3a 65 6e 76 28 24 6e 61 6d 65 29 0d 0a 20 20  ::env($name)..  
1c9c0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
1c9d0 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
1c9e0 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20     # NOTE: This 
1c9f0 69 73 20 73 65 6c 66 2d 63 6c 65 61 6e 69 6e 67  is self-cleaning
1ca00 2e 20 20 49 66 20 6e 6f 20 73 61 76 65 64 20 65  .  If no saved e
1ca10 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61  nvironment varia
1ca20 62 6c 65 73 20 6e 6f 77 0d 0a 20 20 20 20 20 20  bles now..      
1ca30 23 20 20 20 20 20 20 20 65 78 69 73 74 2c 20 72  #       exist, r
1ca40 65 6d 6f 76 65 20 74 68 65 20 61 72 72 61 79 2e  emove the array.
1ca50 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
1ca60 20 69 66 20 7b 5b 61 72 72 61 79 20 73 69 7a 65   if {[array size
1ca70 20 73 61 76 65 64 45 6e 76 5d 20 3d 3d 20 30 7d   savedEnv] == 0}
1ca80 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1ca90 20 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61   unset -nocompla
1caa0 69 6e 20 73 61 76 65 64 45 6e 76 0d 0a 20 20 20  in savedEnv..   
1cab0 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
1cac0 20 20 20 20 70 72 6f 63 20 73 61 76 65 45 61 67      proc saveEag
1cad0 6c 65 53 68 65 6c 6c 45 6e 76 69 72 6f 6e 6d 65  leShellEnvironme
1cae0 6e 74 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 75  nt {} {..      u
1caf0 70 76 61 72 20 31 20 73 61 76 65 64 45 6e 76 20  pvar 1 savedEnv 
1cb00 73 61 76 65 64 45 6e 76 0d 0a 0d 0a 20 20 20 20  savedEnv....    
1cb10 20 20 73 61 76 65 45 6e 76 69 72 6f 6e 6d 65 6e    saveEnvironmen
1cb20 74 56 61 72 69 61 62 6c 65 73 20 5b 6c 69 73 74  tVariables [list
1cb30 20 4e 6f 4d 75 74 65 78 65 73 5d 20 73 61 76 65   NoMutexes] save
1cb40 64 45 6e 76 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  dEnv..    }.....
1cb50 20 20 20 20 70 72 6f 63 20 72 65 73 74 6f 72 65      proc restore
1cb60 45 61 67 6c 65 53 68 65 6c 6c 45 6e 76 69 72 6f  EagleShellEnviro
1cb70 6e 6d 65 6e 74 20 7b 7d 20 7b 0d 0a 20 20 20 20  nment {} {..    
1cb80 20 20 75 70 76 61 72 20 31 20 73 61 76 65 64 45    upvar 1 savedE
1cb90 6e 76 20 73 61 76 65 64 45 6e 76 0d 0a 0d 0a 20  nv savedEnv.... 
1cba0 20 20 20 20 20 72 65 73 74 6f 72 65 45 6e 76 69       restoreEnvi
1cbb0 72 6f 6e 6d 65 6e 74 56 61 72 69 61 62 6c 65 73  ronmentVariables
1cbc0 20 5b 6c 69 73 74 20 4e 6f 4d 75 74 65 78 65 73   [list NoMutexes
1cbd0 5d 20 73 61 76 65 64 45 6e 76 0d 0a 20 20 20 20  ] savedEnv..    
1cbe0 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 73  }.....    proc s
1cbf0 61 76 65 4d 64 61 43 6f 6e 66 69 67 45 6e 76 69  aveMdaConfigEnvi
1cc00 72 6f 6e 6d 65 6e 74 20 7b 7d 20 7b 0d 0a 20 20  ronment {} {..  
1cc10 20 20 20 20 75 70 76 61 72 20 31 20 73 61 76 65      upvar 1 save
1cc20 64 45 6e 76 20 73 61 76 65 64 45 6e 76 0d 0a 0d  dEnv savedEnv...
1cc30 0a 20 20 20 20 20 20 73 61 76 65 45 6e 76 69 72  .      saveEnvir
1cc40 6f 6e 6d 65 6e 74 56 61 72 69 61 62 6c 65 73 20  onmentVariables 
1cc50 5b 6c 69 73 74 20 43 4f 4d 50 4c 55 53 5f 4d 44  [list COMPLUS_MD
1cc60 41 5d 20 73 61 76 65 64 45 6e 76 0d 0a 20 20 20  A] savedEnv..   
1cc70 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
1cc80 72 65 73 74 6f 72 65 4d 64 61 43 6f 6e 66 69 67  restoreMdaConfig
1cc90 45 6e 76 69 72 6f 6e 6d 65 6e 74 20 7b 7d 20 7b  Environment {} {
1cca0 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20 31 20  ..      upvar 1 
1ccb0 73 61 76 65 64 45 6e 76 20 73 61 76 65 64 45 6e  savedEnv savedEn
1ccc0 76 0d 0a 0d 0a 20 20 20 20 20 20 72 65 73 74 6f  v....      resto
1ccd0 72 65 45 6e 76 69 72 6f 6e 6d 65 6e 74 56 61 72  reEnvironmentVar
1cce0 69 61 62 6c 65 73 20 5b 6c 69 73 74 20 43 4f 4d  iables [list COM
1ccf0 50 4c 55 53 5f 4d 44 41 5d 20 73 61 76 65 64 45  PLUS_MDA] savedE
1cd00 6e 76 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  nv..    }.....  
1cd10 20 20 70 72 6f 63 20 73 61 76 65 47 65 74 53 65    proc saveGetSe
1cd20 74 74 69 6e 67 56 61 6c 75 65 45 6e 76 69 72 6f  ttingValueEnviro
1cd30 6e 6d 65 6e 74 20 7b 7d 20 7b 0d 0a 20 20 20 20  nment {} {..    
1cd40 20 20 75 70 76 61 72 20 31 20 73 61 76 65 64 45    upvar 1 savedE
1cd50 6e 76 20 73 61 76 65 64 45 6e 76 0d 0a 0d 0a 20  nv savedEnv.... 
1cd60 20 20 20 20 20 73 61 76 65 45 6e 76 69 72 6f 6e       saveEnviron
1cd70 6d 65 6e 74 56 61 72 69 61 62 6c 65 73 20 5b 6c  mentVariables [l
1cd80 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ist \..         
1cd90 20 4e 6f 5f 45 78 70 61 6e 64 20 4e 6f 5f 53 51   No_Expand No_SQ
1cda0 4c 69 74 65 47 65 74 53 65 74 74 69 6e 67 56 61  LiteGetSettingVa
1cdb0 6c 75 65 20 4e 6f 5f 53 51 4c 69 74 65 58 6d 6c  lue No_SQLiteXml
1cdc0 43 6f 6e 66 69 67 46 69 6c 65 5d 20 5c 0d 0a 20  ConfigFile] \.. 
1cdd0 20 20 20 20 20 20 20 20 20 73 61 76 65 64 45 6e           savedEn
1cde0 76 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  v..    }.....   
1cdf0 20 70 72 6f 63 20 72 65 73 74 6f 72 65 47 65 74   proc restoreGet
1ce00 53 65 74 74 69 6e 67 56 61 6c 75 65 45 6e 76 69  SettingValueEnvi
1ce10 72 6f 6e 6d 65 6e 74 20 7b 7d 20 7b 0d 0a 20 20  ronment {} {..  
1ce20 20 20 20 20 75 70 76 61 72 20 31 20 73 61 76 65      upvar 1 save
1ce30 64 45 6e 76 20 73 61 76 65 64 45 6e 76 0d 0a 0d  dEnv savedEnv...
1ce40 0a 20 20 20 20 20 20 72 65 73 74 6f 72 65 45 6e  .      restoreEn
1ce50 76 69 72 6f 6e 6d 65 6e 74 56 61 72 69 61 62 6c  vironmentVariabl
1ce60 65 73 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20  es [list \..    
1ce70 20 20 20 20 20 20 4e 6f 5f 45 78 70 61 6e 64 20        No_Expand 
1ce80 4e 6f 5f 53 51 4c 69 74 65 47 65 74 53 65 74 74  No_SQLiteGetSett
1ce90 69 6e 67 56 61 6c 75 65 20 4e 6f 5f 53 51 4c 69  ingValue No_SQLi
1cea0 74 65 58 6d 6c 43 6f 6e 66 69 67 46 69 6c 65 5d  teXmlConfigFile]
1ceb0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 73 61   \..          sa
1cec0 76 65 64 45 6e 76 0d 0a 20 20 20 20 7d 0d 0a 0c  vedEnv..    }...
1ced0 0d 0a 20 20 20 20 70 72 6f 63 20 73 61 76 65 53  ..    proc saveS
1cee0 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 45  QLiteConnectionE
1cef0 6e 76 69 72 6f 6e 6d 65 6e 74 20 7b 7d 20 7b 0d  nvironment {} {.
1cf00 0a 20 20 20 20 20 20 75 70 76 61 72 20 31 20 73  .      upvar 1 s
1cf10 61 76 65 64 45 6e 76 20 73 61 76 65 64 45 6e 76  avedEnv savedEnv
1cf20 0d 0a 0d 0a 20 20 20 20 20 20 73 61 76 65 45 6e  ....      saveEn
1cf30 76 69 72 6f 6e 6d 65 6e 74 56 61 72 69 61 62 6c  vironmentVariabl
1cf40 65 73 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20  es [list \..    
1cf50 20 20 20 20 20 20 44 65 66 61 75 6c 74 46 6c 61        DefaultFla
1cf60 67 73 5f 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74  gs_SQLiteConnect
1cf70 69 6f 6e 20 4e 6f 5f 53 51 4c 69 74 65 43 6f 6e  ion No_SQLiteCon
1cf80 6e 65 63 74 69 6f 6e 4e 65 77 50 61 72 73 65 72  nectionNewParser
1cf90 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 73  ] \..          s
1cfa0 61 76 65 64 45 6e 76 0d 0a 20 20 20 20 7d 0d 0a  avedEnv..    }..
1cfb0 0c 0d 0a 20 20 20 20 70 72 6f 63 20 72 65 73 74  ...    proc rest
1cfc0 6f 72 65 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74  oreSQLiteConnect
1cfd0 69 6f 6e 45 6e 76 69 72 6f 6e 6d 65 6e 74 20 7b  ionEnvironment {
1cfe0 7d 20 7b 0d 0a 20 20 20 20 20 20 75 70 76 61 72  } {..      upvar
1cff0 20 31 20 73 61 76 65 64 45 6e 76 20 73 61 76 65   1 savedEnv save
1d000 64 45 6e 76 0d 0a 0d 0a 20 20 20 20 20 20 72 65  dEnv....      re
1d010 73 74 6f 72 65 45 6e 76 69 72 6f 6e 6d 65 6e 74  storeEnvironment
1d020 56 61 72 69 61 62 6c 65 73 20 5b 6c 69 73 74 20  Variables [list 
1d030 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 44 65 66  \..          Def
1d040 61 75 6c 74 46 6c 61 67 73 5f 53 51 4c 69 74 65  aultFlags_SQLite
1d050 43 6f 6e 6e 65 63 74 69 6f 6e 20 4e 6f 5f 53 51  Connection No_SQ
1d060 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 4e 65  LiteConnectionNe
1d070 77 50 61 72 73 65 72 5d 20 5c 0d 0a 20 20 20 20  wParser] \..    
1d080 20 20 20 20 20 20 73 61 76 65 64 45 6e 76 0d 0a        savedEnv..
1d090 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
1d0a0 6f 63 20 73 61 76 65 53 51 4c 69 74 65 43 6f 6e  oc saveSQLiteCon
1d0b0 76 65 72 74 45 6e 76 69 72 6f 6e 6d 65 6e 74 20  vertEnvironment 
1d0c0 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 75 70 76 61  {} {..      upva
1d0d0 72 20 31 20 73 61 76 65 64 45 6e 76 20 73 61 76  r 1 savedEnv sav
1d0e0 65 64 45 6e 76 0d 0a 0d 0a 20 20 20 20 20 20 73  edEnv....      s
1d0f0 61 76 65 45 6e 76 69 72 6f 6e 6d 65 6e 74 56 61  aveEnvironmentVa
1d100 72 69 61 62 6c 65 73 20 5b 6c 69 73 74 20 5c 0d  riables [list \.
1d110 0a 20 20 20 20 20 20 20 20 20 20 55 73 65 5f 53  .          Use_S
1d120 51 4c 69 74 65 43 6f 6e 76 65 72 74 5f 44 65 66  QLiteConvert_Def
1d130 61 75 6c 74 44 62 54 79 70 65 20 55 73 65 5f 53  aultDbType Use_S
1d140 51 4c 69 74 65 43 6f 6e 76 65 72 74 5f 44 65 66  QLiteConvert_Def
1d150 61 75 6c 74 54 79 70 65 4e 61 6d 65 5d 20 5c 0d  aultTypeName] \.
1d160 0a 20 20 20 20 20 20 20 20 20 20 73 61 76 65 64  .          saved
1d170 45 6e 76 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20  Env..    }..... 
1d180 20 20 20 70 72 6f 63 20 72 65 73 74 6f 72 65 53     proc restoreS
1d190 51 4c 69 74 65 43 6f 6e 76 65 72 74 45 6e 76 69  QLiteConvertEnvi
1d1a0 72 6f 6e 6d 65 6e 74 20 7b 7d 20 7b 0d 0a 20 20  ronment {} {..  
1d1b0 20 20 20 20 75 70 76 61 72 20 31 20 73 61 76 65      upvar 1 save
1d1c0 64 45 6e 76 20 73 61 76 65 64 45 6e 76 0d 0a 0d  dEnv savedEnv...
1d1d0 0a 20 20 20 20 20 20 72 65 73 74 6f 72 65 45 6e  .      restoreEn
1d1e0 76 69 72 6f 6e 6d 65 6e 74 56 61 72 69 61 62 6c  vironmentVariabl
1d1f0 65 73 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20  es [list \..    
1d200 20 20 20 20 20 20 55 73 65 5f 53 51 4c 69 74 65        Use_SQLite
1d210 43 6f 6e 76 65 72 74 5f 44 65 66 61 75 6c 74 44  Convert_DefaultD
1d220 62 54 79 70 65 20 55 73 65 5f 53 51 4c 69 74 65  bType Use_SQLite
1d230 43 6f 6e 76 65 72 74 5f 44 65 66 61 75 6c 74 54  Convert_DefaultT
1d240 79 70 65 4e 61 6d 65 5d 20 5c 0d 0a 20 20 20 20  ypeName] \..    
1d250 20 20 20 20 20 20 73 61 76 65 64 45 6e 76 0d 0a        savedEnv..
1d260 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
1d270 6f 63 20 73 65 74 75 70 44 62 49 6e 74 65 72 72  oc setupDbInterr
1d280 75 70 74 43 61 6c 6c 62 61 63 6b 20 7b 20 63 68  uptCallback { ch
1d290 61 6e 6e 65 6c 20 6c 6f 67 20 7d 20 7b 0d 0a 20  annel log } {.. 
1d2a0 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
1d2b0 6e 65 6c 20 22 2d 2d 2d 2d 20 73 65 74 74 69 6e  nel "---- settin
1d2c0 67 20 75 70 20 64 65 62 75 67 67 65 72 20 69 6e  g up debugger in
1d2d0 74 65 72 72 75 70 74 20 63 61 6c 6c 62 61 63 6b  terrupt callback
1d2e0 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 69  ... "....      i
1d2f0 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  f {[catch {..   
1d300 20 20 20 20 20 73 61 76 65 45 6e 76 69 72 6f 6e       saveEnviron
1d310 6d 65 6e 74 56 61 72 69 61 62 6c 65 73 20 5b 6c  mentVariables [l
1d320 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ist \..         
1d330 20 20 20 71 75 69 65 74 46 69 6e 64 49 6e 74 65     quietFindInte
1d340 72 70 72 65 74 65 72 54 65 73 74 50 61 74 68 20  rpreterTestPath 
1d350 71 75 69 65 74 53 65 74 75 70 49 6e 74 65 72 70  quietSetupInterp
1d360 72 65 74 65 72 54 65 73 74 50 61 74 68 5d 0d 0a  reterTestPath]..
1d370 0d 0a 20 20 20 20 20 20 20 20 74 72 79 20 7b 0d  ..        try {.
1d380 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
1d390 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
1d3a0 50 72 65 76 65 6e 74 20 74 68 65 20 76 65 6e 64  Prevent the vend
1d3b0 6f 72 20 73 63 72 69 70 74 20 66 72 6f 6d 20 62  or script from b
1d3c0 65 69 6e 67 20 6e 6f 69 73 79 20 77 68 65 6e 20  eing noisy when 
1d3d0 63 72 65 61 74 69 6e 67 0d 0a 20 20 20 20 20 20  creating..      
1d3e0 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20      #       the 
1d3f0 69 73 6f 6c 61 74 65 64 20 69 6e 74 65 72 70 72  isolated interpr
1d400 65 74 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 20  eter...         
1d410 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   #..          se
1d420 74 20 3a 3a 65 6e 76 28 71 75 69 65 74 46 69 6e  t ::env(quietFin
1d430 64 49 6e 74 65 72 70 72 65 74 65 72 54 65 73 74  dInterpreterTest
1d440 50 61 74 68 29 20 31 0d 0a 20 20 20 20 20 20 20  Path) 1..       
1d450 20 20 20 73 65 74 20 3a 3a 65 6e 76 28 71 75 69     set ::env(qui
1d460 65 74 53 65 74 75 70 49 6e 74 65 72 70 72 65 74  etSetupInterpret
1d470 65 72 54 65 73 74 50 61 74 68 29 20 31 0d 0a 0d  erTestPath) 1...
1d480 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
1d490 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
1d4a0 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 63  Make sure the sc
1d4b0 72 69 70 74 20 64 65 62 75 67 67 65 72 20 61 6e  ript debugger an
1d4c0 64 20 74 68 65 20 69 73 6f 6c 61 74 65 64 20 69  d the isolated i
1d4d0 6e 74 65 72 70 72 65 74 65 72 0d 0a 20 20 20 20  nterpreter..    
1d4e0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61 72        #       ar
1d4f0 65 20 73 65 74 75 70 20 61 6e 64 20 72 65 61 64  e setup and read
1d500 79 20 66 6f 72 20 75 73 65 2e 0d 0a 20 20 20 20  y for use...    
1d510 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1d520 20 20 20 64 65 62 75 67 20 73 65 74 75 70 20 74     debug setup t
1d530 72 75 65 20 74 72 75 65 0d 0a 0d 0a 20 20 20 20  rue true....    
1d540 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1d550 20 20 20 23 20 4e 4f 54 45 3a 20 4c 6f 61 64 20     # NOTE: Load 
1d560 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 70 61  the necessary pa
1d570 63 6b 61 67 65 73 20 69 6e 74 6f 20 74 68 65 20  ckages into the 
1d580 69 73 6f 6c 61 74 65 64 20 69 6e 74 65 72 70 72  isolated interpr
1d590 65 74 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 20  eter...         
1d5a0 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 64 65   #..          de
1d5b0 62 75 67 20 65 76 61 6c 20 7b 0d 0a 20 20 20 20  bug eval {..    
1d5c0 20 20 20 20 20 20 20 20 70 61 63 6b 61 67 65 20          package 
1d5d0 72 65 71 75 69 72 65 20 45 61 67 6c 65 0d 0a 20  require Eagle.. 
1d5e0 20 20 20 20 20 20 20 20 20 20 20 70 61 63 6b 61             packa
1d5f0 67 65 20 72 65 71 75 69 72 65 20 45 61 67 6c 65  ge require Eagle
1d600 2e 4c 69 62 72 61 72 79 0d 0a 20 20 20 20 20 20  .Library..      
1d610 20 20 20 20 20 20 70 61 63 6b 61 67 65 20 72 65        package re
1d620 71 75 69 72 65 20 45 61 67 6c 65 2e 54 65 73 74  quire Eagle.Test
1d630 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d  ..          }...
1d640 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
1d650 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
1d660 43 6f 70 79 20 74 68 65 20 6e 65 63 65 73 73 61  Copy the necessa
1d670 72 79 20 76 61 72 69 61 62 6c 65 73 20 69 6e 74  ry variables int
1d680 6f 20 74 68 65 20 69 73 6f 6c 61 74 65 64 20 69  o the isolated i
1d690 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a 20 20 20  nterpreter...   
1d6a0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1d6b0 20 20 20 20 64 65 62 75 67 20 69 6e 76 6f 6b 65      debug invoke
1d6c0 20 30 20 73 65 74 20 3a 3a 74 65 73 74 5f 63 68   0 set ::test_ch
1d6d0 61 6e 6e 65 6c 20 24 63 68 61 6e 6e 65 6c 3b 20  annel $channel; 
1d6e0 23 20 4e 4f 54 45 3a 20 46 6f 72 20 5b 74 70 75  # NOTE: For [tpu
1d6f0 74 73 5d 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ts]...          
1d700 64 65 62 75 67 20 69 6e 76 6f 6b 65 20 30 20 73  debug invoke 0 s
1d710 65 74 20 3a 3a 74 65 73 74 5f 6c 6f 67 20 24 6c  et ::test_log $l
1d720 6f 67 3b 20 23 20 4e 4f 54 45 3a 20 46 6f 72 20  og; # NOTE: For 
1d730 5b 74 6c 6f 67 5d 2e 0d 0a 0d 0a 20 20 20 20 20  [tlog].....     
1d740 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1d750 20 20 23 20 4e 4f 54 45 3a 20 49 6e 73 74 61 6c    # NOTE: Instal
1d760 6c 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 73  l the callback s
1d770 63 72 69 70 74 20 74 6f 20 62 65 20 65 76 61 6c  cript to be eval
1d780 75 61 74 65 64 20 69 6e 20 74 68 65 20 69 73 6f  uated in the iso
1d790 6c 61 74 65 64 0d 0a 20 20 20 20 20 20 20 20 20  lated..         
1d7a0 20 23 20 20 20 20 20 20 20 69 6e 74 65 72 70 72   #       interpr
1d7b0 65 74 65 72 20 77 68 65 6e 20 74 68 69 73 20 69  eter when this i
1d7c0 6e 74 65 72 70 72 65 74 65 72 20 69 73 20 69 6e  nterpreter is in
1d7d0 74 65 72 72 75 70 74 65 64 20 62 79 20 73 63 72  terrupted by scr
1d7e0 69 70 74 0d 0a 20 20 20 20 20 20 20 20 20 20 23  ipt..          #
1d7f0 20 20 20 20 20 20 20 63 61 6e 63 65 6c 6c 61 74         cancellat
1d800 69 6f 6e 2c 20 65 74 63 2e 0d 0a 20 20 20 20 20  ion, etc...     
1d810 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1d820 20 20 64 65 62 75 67 20 63 61 6c 6c 62 61 63 6b    debug callback
1d830 20 61 70 70 6c 79 20 7b 7b 73 65 6e 64 65 72 20   apply {{sender 
1d840 65 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  e} {..          
1d850 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
1d860 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69   # NOTE: Check i
1d870 66 20 74 68 69 73 20 64 65 62 75 67 67 65 72 20  f this debugger 
1d880 63 61 6c 6c 62 61 63 6b 20 69 73 20 6f 6e 65 20  callback is one 
1d890 74 68 61 74 20 77 65 20 63 61 72 65 20 61 62 6f  that we care abo
1d8a0 75 74 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ut...           
1d8b0 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
1d8c0 73 65 74 20 69 6e 74 65 72 72 75 70 74 54 79 70  set interruptTyp
1d8d0 65 73 20 5b 73 70 6c 69 74 20 5b 24 65 20 49 6e  es [split [$e In
1d8e0 74 65 72 72 75 70 74 54 79 70 65 5d 20 22 2c 20  terruptType] ", 
1d8f0 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  "]....          
1d900 20 20 69 66 20 7b 22 43 61 6e 63 65 6c 65 64 22    if {"Canceled"
1d910 20 69 6e 20 24 69 6e 74 65 72 72 75 70 74 54 79   in $interruptTy
1d920 70 65 73 20 7c 7c 20 5c 0d 0a 20 20 20 20 20 20  pes || \..      
1d930 20 20 20 20 20 20 20 20 20 20 22 55 6e 77 6f 75            "Unwou
1d940 6e 64 22 20 69 6e 20 24 69 6e 74 65 72 72 75 70  nd" in $interrup
1d950 74 54 79 70 65 73 7d 20 74 68 65 6e 20 7b 0d 0a  tTypes} then {..
1d960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
1d970 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
1d980 20 4e 4f 54 45 3a 20 4d 61 6b 65 20 73 75 72 65   NOTE: Make sure
1d990 20 74 68 65 20 5b 6f 62 6a 65 63 74 5d 20 63 6f   the [object] co
1d9a0 6d 6d 61 6e 64 20 69 73 20 61 76 61 69 6c 61 62  mmand is availab
1d9b0 6c 65 2e 20 20 53 69 6e 63 65 0d 0a 20 20 20 20  le.  Since..    
1d9c0 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
1d9d0 20 20 74 68 69 73 20 69 73 20 61 6e 20 69 73 6f    this is an iso
1d9e0 6c 61 74 65 64 20 69 6e 74 65 72 70 72 65 74 65  lated interprete
1d9f0 72 2c 20 63 68 65 63 6b 20 66 6f 72 20 69 74 20  r, check for it 
1da00 74 68 65 20 68 61 72 64 0d 0a 20 20 20 20 20 20  the hard..      
1da10 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
1da20 77 61 79 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  way...          
1da30 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
1da40 20 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67 74       if {[llengt
1da50 68 20 5b 69 6e 66 6f 20 63 6f 6d 6d 61 6e 64 73  h [info commands
1da60 20 6f 62 6a 65 63 74 5d 5d 20 3e 20 30 7d 20 74   object]] > 0} t
1da70 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1da80 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1da90 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
1daa0 3a 20 49 74 65 72 61 74 65 20 74 68 72 6f 75 67  : Iterate throug
1dab0 68 20 61 6c 6c 20 64 61 74 61 62 61 73 65 20 63  h all database c
1dac0 6f 6e 6e 65 63 74 69 6f 6e 73 20 6b 6e 6f 77 6e  onnections known
1dad0 20 74 6f 20 74 68 65 0d 0a 20 20 20 20 20 20 20   to the..       
1dae0 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
1daf0 20 70 61 72 65 6e 74 20 69 6e 74 65 72 70 72 65   parent interpre
1db00 74 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ter...          
1db10 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1db20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20           object 
1db30 66 6f 72 65 61 63 68 20 2d 61 6c 69 61 73 20 70  foreach -alias p
1db40 61 69 72 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f  air [object invo
1db50 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75  ke -flags +NonPu
1db60 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20  blic \..        
1db70 20 20 20 20 20 20 20 20 20 20 20 20 24 65 20 49              $e I
1db80 6e 74 65 72 70 72 65 74 65 72 2e 63 6f 6e 6e 65  nterpreter.conne
1db90 63 74 69 6f 6e 73 5d 20 7b 0d 0a 20 20 20 20 20  ctions] {..     
1dba0 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a               #..
1dbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dbc0 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70    # NOTE: Attemp
1dbd0 74 20 74 6f 20 63 61 6e 63 65 6c 20 61 6e 79 20  t to cancel any 
1dbe0 53 51 4c 20 71 75 65 72 69 65 73 20 69 6e 20 70  SQL queries in p
1dbf0 72 6f 67 72 65 73 73 20 6f 6e 0d 0a 20 20 20 20  rogress on..    
1dc00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
1dc10 20 20 20 20 20 20 74 68 69 73 20 64 61 74 61 62        this datab
1dc20 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0d  ase connection..
1dc30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1dc40 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
1dc50 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
1dc60 63 68 20 7b 24 70 61 69 72 20 56 61 6c 75 65 2e  ch {$pair Value.
1dc70 43 61 6e 63 65 6c 7d 20 65 72 72 6f 72 5d 7d 20  Cancel} error]} 
1dc80 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1dc90 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
1dca0 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
1dcb0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 6e  l [appendArgs \n
1dcc0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1dcd0 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d              "===
1dce0 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65  = WARNING: faile
1dcf0 64 20 74 6f 20 63 61 6e 63 65 6c 20 71 75 65 72  d to cancel quer
1dd00 79 20 66 6f 72 20 22 20 5c 0d 0a 20 20 20 20 20  y for " \..     
1dd10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd20 20 20 20 22 63 6f 6e 6e 65 63 74 69 6f 6e 20 5c     "connection \
1dd30 22 22 20 5b 24 70 61 69 72 20 4b 65 79 5d 20 22  "" [$pair Key] "
1dd40 5c 22 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c  \", error: " \n\
1dd50 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  t \..           
1dd60 20 20 20 20 20 20 20 20 20 20 20 20 20 24 65 72               $er
1dd70 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ror \n]..       
1dd80 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
1dd90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
1dda0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
1ddb0 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
1ddc0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
1ddd0 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
1dde0 61 70 70 65 6e 64 41 72 67 73 20 5c 6e 20 5c 0d  appendArgs \n \.
1ddf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1de00 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49       "==== WARNI
1de10 4e 47 3a 20 63 61 6e 6e 6f 74 20 63 61 6e 63 65  NG: cannot cance
1de20 6c 20 61 6e 79 20 71 75 65 72 69 65 73 3a 20 22  l any queries: "
1de30 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1de40 20 20 20 20 20 20 20 20 22 74 68 65 20 5c 22 6f          "the \"o
1de50 62 6a 65 63 74 5c 22 20 63 6f 6d 6d 61 6e 64 20  bject\" command 
1de60 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  is not available
1de70 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  \n"]..          
1de80 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
1de90 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
1dea0 7d 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 66 69  }}..        } fi
1deb0 6e 61 6c 6c 79 20 7b 0d 0a 20 20 20 20 20 20 20  nally {..       
1dec0 20 20 20 72 65 73 74 6f 72 65 45 6e 76 69 72 6f     restoreEnviro
1ded0 6e 6d 65 6e 74 56 61 72 69 61 62 6c 65 73 20 5b  nmentVariables [
1dee0 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20  list \..        
1def0 20 20 20 20 20 20 71 75 69 65 74 46 69 6e 64 49        quietFindI
1df00 6e 74 65 72 70 72 65 74 65 72 54 65 73 74 50 61  nterpreterTestPa
1df10 74 68 20 71 75 69 65 74 53 65 74 75 70 49 6e 74  th quietSetupInt
1df20 65 72 70 72 65 74 65 72 54 65 73 74 50 61 74 68  erpreterTestPath
1df30 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  ]..        }..  
1df40 20 20 20 20 7d 20 65 72 72 6f 72 5d 20 3d 3d 20      } error] == 
1df50 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
1df60 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74     addConstraint
1df70 20 69 6e 74 65 72 72 75 70 74 43 61 6c 6c 62 61   interruptCallba
1df80 63 6b 2e 73 71 6c 69 74 65 33 0d 0a 0d 0a 20 20  ck.sqlite3....  
1df90 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
1dfa0 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20 20 20 20  nnel yes\n..    
1dfb0 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
1dfc0 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
1dfd0 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22  el [appendArgs "
1dfe0 6e 6f 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c  no, error: " \n\
1dff0 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20  t $error \n]..  
1e000 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
1e010 0a 20 20 20 20 70 72 6f 63 20 63 6c 65 61 6e 75  .    proc cleanu
1e020 70 46 69 6c 65 20 7b 20 66 69 6c 65 4e 61 6d 65  pFile { fileName
1e030 20 7b 63 6f 6c 6c 65 63 74 20 74 72 75 65 7d 20   {collect true} 
1e040 7b 66 6f 72 63 65 20 66 61 6c 73 65 7d 20 7d 20  {force false} } 
1e050 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
1e060 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70    # NOTE: Attemp
1e070 74 20 74 6f 20 66 6f 72 63 65 20 61 6c 6c 20 70  t to force all p
1e080 65 6e 64 69 6e 67 20 22 67 61 72 62 61 67 65 22  ending "garbage"
1e090 20 6f 62 6a 65 63 74 73 20 74 6f 20 62 65 20 63   objects to be c
1e0a0 6f 6c 6c 65 63 74 65 64 2c 0d 0a 20 20 20 20 20  ollected,..     
1e0b0 20 23 20 20 20 20 20 20 20 69 6e 63 6c 75 64 69   #       includi
1e0c0 6e 67 20 53 51 4c 69 74 65 20 73 74 61 74 65 6d  ng SQLite statem
1e0d0 65 6e 74 73 20 61 6e 64 20 62 61 63 6b 75 70 20  ents and backup 
1e0e0 6f 62 6a 65 63 74 73 3b 20 74 68 69 73 20 73 68  objects; this sh
1e0f0 6f 75 6c 64 20 61 6c 6c 6f 77 0d 0a 20 20 20 20  ould allow..    
1e100 20 20 23 20 20 20 20 20 20 20 74 68 65 20 75 6e    #       the un
1e110 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73  derlying databas
1e120 65 20 66 69 6c 65 20 74 6f 20 62 65 20 64 65 6c  e file to be del
1e130 65 74 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  eted...      #..
1e140 20 20 20 20 20 20 69 66 20 7b 24 63 6f 6c 6c 65        if {$colle
1e150 63 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  ct} then {..    
1e160 20 20 20 20 63 6f 6c 6c 65 63 74 47 61 72 62 61      collectGarba
1e170 67 65 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ge $::test_chann
1e180 65 6c 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  el..      }.... 
1e190 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
1e1a0 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20 74  NOTE: Check if t
1e1b0 68 65 20 66 69 6c 65 20 73 74 69 6c 6c 20 65 78  he file still ex
1e1c0 69 73 74 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  ists...      #..
1e1d0 20 20 20 20 20 20 69 66 20 7b 5b 66 69 6c 65 20        if {[file 
1e1e0 65 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65  exists $fileName
1e1f0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
1e200 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
1e210 4e 4f 54 45 3a 20 53 6b 69 70 20 64 65 6c 65 74  NOTE: Skip delet
1e220 69 6e 67 20 74 65 73 74 20 66 69 6c 65 73 20 69  ing test files i
1e230 66 20 73 6f 6d 65 62 6f 64 79 20 73 65 74 73 20  f somebody sets 
1e240 74 68 65 20 67 6c 6f 62 61 6c 20 76 61 72 69 61  the global varia
1e250 62 6c 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ble..        #  
1e260 20 20 20 20 20 74 6f 20 70 72 65 76 65 6e 74 20       to prevent 
1e270 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  it...        #..
1e280 20 20 20 20 20 20 20 20 69 66 20 7b 24 66 6f 72          if {$for
1e290 63 65 20 7c 7c 20 21 5b 69 6e 66 6f 20 65 78 69  ce || ![info exi
1e2a0 73 74 73 20 3a 3a 6e 6f 28 63 6c 65 61 6e 75 70  sts ::no(cleanup
1e2b0 46 69 6c 65 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  File)]} then {..
1e2c0 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
1e2d0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41         # NOTE: A
1e2e0 74 74 65 6d 70 74 20 74 6f 20 64 65 6c 65 74 65  ttempt to delete
1e2f0 20 74 68 65 20 74 65 73 74 20 66 69 6c 65 20 6e   the test file n
1e300 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  ow...          #
1e310 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
1e320 5b 73 65 74 20 63 6f 64 65 20 5b 63 61 74 63 68  [set code [catch
1e330 20 7b 66 69 6c 65 20 64 65 6c 65 74 65 20 24 66   {file delete $f
1e340 69 6c 65 4e 61 6d 65 7d 20 65 72 72 6f 72 5d 5d  ileName} error]]
1e350 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1e360 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1e370 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 65 20       # NOTE: We 
1e380 73 6f 6d 65 68 6f 77 20 66 61 69 6c 65 64 20 74  somehow failed t
1e390 6f 20 64 65 6c 65 74 65 20 74 68 65 20 66 69 6c  o delete the fil
1e3a0 65 2c 20 72 65 70 6f 72 74 20 77 68 79 2e 0d 0a  e, report why...
1e3b0 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
1e3c0 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
1e3d0 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
1e3e0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
1e3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e400 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66  "==== WARNING: f
1e410 61 69 6c 65 64 20 74 6f 20 64 65 6c 65 74 65 20  ailed to delete 
1e420 74 65 73 74 20 66 69 6c 65 20 5c 22 22 20 24 66  test file \"" $f
1e430 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20  ileName \..     
1e440 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 20 64             "\" d
1e450 75 72 69 6e 67 20 63 6c 65 61 6e 75 70 2c 20 65  uring cleanup, e
1e460 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72  rror: " \n\t $er
1e470 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ror \n]..       
1e480 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20     }..        } 
1e490 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
1e4a0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23    #..          #
1e4b0 20 4e 4f 54 45 3a 20 53 68 6f 77 20 74 68 61 74   NOTE: Show that
1e4c0 20 77 65 20 73 6b 69 70 70 65 64 20 64 65 6c 65   we skipped dele
1e4d0 74 69 6e 67 20 74 68 65 20 66 69 6c 65 2e 0d 0a  ting the file...
1e4e0 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
1e4f0 20 20 20 20 20 20 20 73 65 74 20 63 6f 64 65 20         set code 
1e500 30 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 74  0....          t
1e510 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
1e520 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
1e530 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1e540 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a    "==== WARNING:
1e550 20 73 6b 69 70 70 65 64 20 64 65 6c 65 74 69 6e   skipped deletin
1e560 67 20 74 65 73 74 20 66 69 6c 65 20 5c 22 22 20  g test file \"" 
1e570 24 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20  $fileName \..   
1e580 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 20 64             "\" d
1e590 75 72 69 6e 67 20 63 6c 65 61 6e 75 70 5c 6e 22  uring cleanup\n"
1e5a0 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  ]..        }..  
1e5b0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
1e5c0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1e5d0 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 66 69 6c   # NOTE: The fil
1e5e0 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  e does not exist
1e5f0 2c 20 73 75 63 63 65 73 73 21 0d 0a 20 20 20 20  , success!..    
1e600 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73      #..        s
1e610 65 74 20 63 6f 64 65 20 30 0d 0a 20 20 20 20 20  et code 0..     
1e620 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75   }....      retu
1e630 72 6e 20 24 63 6f 64 65 0d 0a 20 20 20 20 7d 0d  rn $code..    }.
1e640 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 6c 65  ....    proc cle
1e650 61 6e 75 70 4d 65 6d 6f 72 79 20 7b 20 76 61 72  anupMemory { var
1e660 4e 61 6d 65 20 7b 71 75 69 65 74 20 66 61 6c 73  Name {quiet fals
1e670 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66  e} } {..      if
1e680 20 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f 62 6a   {[haveSQLiteObj
1e690 65 63 74 43 6f 6d 6d 61 6e 64 5d 20 26 26 20 5c  ectCommand] && \
1e6a0 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72  ..          [str
1e6b0 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 61 72 4e  ing length $varN
1e6c0 61 6d 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ame] > 0} then {
1e6d0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1e6e0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 66       # NOTE: Ref
1e6f0 65 72 20 74 6f 20 74 68 65 20 73 70 65 63 69 66  er to the specif
1e700 69 65 64 20 76 61 72 69 61 62 6c 65 20 28 65 2e  ied variable (e.
1e710 67 2e 20 22 63 6f 6e 6e 65 63 74 69 6f 6e 22 29  g. "connection")
1e720 20 69 6e 20 74 68 65 0d 0a 20 20 20 20 20 20 20   in the..       
1e730 20 23 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74   #       context
1e740 20 6f 66 20 6f 75 72 20 63 61 6c 6c 65 72 2e 20   of our caller. 
1e750 20 54 68 65 20 6f 70 61 71 75 65 20 6f 62 6a 65   The opaque obje
1e760 63 74 20 68 61 6e 64 6c 65 20 66 6f 72 20 61 6e  ct handle for an
1e770 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
1e780 20 20 41 44 4f 2e 4e 45 54 20 63 6f 6e 6e 65 63    ADO.NET connec
1e790 74 69 6f 6e 20 70 72 65 76 69 6f 75 73 6c 79 20  tion previously 
1e7a0 72 65 74 75 72 6e 65 64 20 62 79 20 5b 67 65 74  returned by [get
1e7b0 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 5d 0d 0a 20  DbConnection].. 
1e7c0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73         #       s
1e7d0 68 6f 75 6c 64 20 62 65 20 73 74 6f 72 65 64 20  hould be stored 
1e7e0 74 68 65 72 65 2e 0d 0a 20 20 20 20 20 20 20 20  there...        
1e7f0 23 0d 0a 20 20 20 20 20 20 20 20 75 70 76 61 72  #..        upvar
1e800 20 31 20 24 76 61 72 4e 61 6d 65 20 63 6f 6e 6e   1 $varName conn
1e810 65 63 74 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20  ection....      
1e820 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
1e830 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74            object
1e840 20 69 6e 76 6f 6b 65 20 24 63 6f 6e 6e 65 63 74   invoke $connect
1e850 69 6f 6e 20 52 65 6c 65 61 73 65 4d 65 6d 6f 72  ion ReleaseMemor
1e860 79 0d 0a 20 20 20 20 20 20 20 20 7d 20 72 65 73  y..        } res
1e870 75 6c 74 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ult]} then {..  
1e880 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
1e890 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
1e8a0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
1e8b0 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
1e8c0 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
1e8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d                "=
1e8e0 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69  === WARNING: fai
1e8f0 6c 65 64 20 74 6f 20 72 65 6c 65 61 73 65 20 64  led to release d
1e900 61 74 61 62 61 73 65 20 6d 65 6d 6f 72 79 2c 20  atabase memory, 
1e910 65 72 72 6f 72 3a 20 22 20 5c 0d 0a 20 20 20 20  error: " \..    
1e920 20 20 20 20 20 20 20 20 20 20 20 20 5c 6e 5c 74              \n\t
1e930 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20   $result \n]..  
1e940 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
1e950 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d     }..      }...
1e960 0a 20 20 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e  .      if {[llen
1e970 67 74 68 20 5b 69 6e 66 6f 20 63 6f 6d 6d 61 6e  gth [info comman
1e980 64 73 20 64 65 62 75 67 5d 5d 20 3e 20 30 7d 20  ds debug]] > 0} 
1e990 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1e9a0 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20  if {[catch {..  
1e9b0 20 20 20 20 20 20 20 20 75 70 6c 65 76 65 6c 20          uplevel 
1e9c0 31 20 5b 6c 69 73 74 20 64 65 62 75 67 20 70 75  1 [list debug pu
1e9d0 72 67 65 5d 0d 0a 20 20 20 20 20 20 20 20 7d 20  rge]..        } 
1e9e0 72 65 73 75 6c 74 5d 7d 20 74 68 65 6e 20 7b 0d  result]} then {.
1e9f0 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21  .          if {!
1ea00 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
1ea10 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
1ea20 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
1ea30 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
1ea40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1ea50 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20   "==== WARNING: 
1ea60 66 61 69 6c 65 64 20 74 6f 20 70 75 72 67 65 20  failed to purge 
1ea70 63 61 6c 6c 20 66 72 61 6d 65 2c 20 65 72 72 6f  call frame, erro
1ea80 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20  r: " \..        
1ea90 20 20 20 20 20 20 20 20 5c 6e 5c 74 20 24 72 65          \n\t $re
1eaa0 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  sult \n]..      
1eab0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
1eac0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b  ....        if {
1ead0 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
1eae0 20 20 20 20 75 70 6c 65 76 65 6c 20 31 20 5b 6c      uplevel 1 [l
1eaf0 69 73 74 20 64 65 62 75 67 20 63 6c 65 61 6e 75  ist debug cleanu
1eb00 70 5d 0d 0a 20 20 20 20 20 20 20 20 7d 20 72 65  p]..        } re
1eb10 73 75 6c 74 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  sult]} then {.. 
1eb20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71           if {!$q
1eb30 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
1eb40 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
1eb50 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
1eb60 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
1eb70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1eb80 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61  ==== WARNING: fa
1eb90 69 6c 65 64 20 74 6f 20 63 6c 65 61 6e 75 70 20  iled to cleanup 
1eba0 69 6e 74 65 72 70 72 65 74 65 72 2c 20 65 72 72  interpreter, err
1ebb0 6f 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20  or: " \..       
1ebc0 20 20 20 20 20 20 20 20 20 5c 6e 5c 74 20 24 72           \n\t $r
1ebd0 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20  esult \n]..     
1ebe0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
1ebf0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20  }....        if 
1ec00 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
1ec10 20 20 20 20 20 75 70 6c 65 76 65 6c 20 31 20 5b       uplevel 1 [
1ec20 6c 69 73 74 20 64 65 62 75 67 20 63 6f 6c 6c 65  list debug colle
1ec30 63 74 5d 0d 0a 20 20 20 20 20 20 20 20 7d 20 72  ct]..        } r
1ec40 65 73 75 6c 74 5d 7d 20 74 68 65 6e 20 7b 0d 0a  esult]} then {..
1ec50 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24            if {!$
1ec60 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
1ec70 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
1ec80 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
1ec90 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
1eca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ecb0 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66  "==== WARNING: f
1ecc0 61 69 6c 65 64 20 74 6f 20 63 6f 6c 6c 65 63 74  ailed to collect
1ecd0 20 67 61 72 62 61 67 65 2c 20 65 72 72 6f 72 3a   garbage, error:
1ece0 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   " \..          
1ecf0 20 20 20 20 20 20 5c 6e 5c 74 20 24 72 65 73 75        \n\t $resu
1ed00 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  lt \n]..        
1ed10 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
1ed20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
1ed30 0c 0d 0a 20 20 20 20 70 72 6f 63 20 73 65 74 75  ...    proc setu
1ed40 70 4d 65 6d 6f 72 79 43 6f 75 6e 74 65 72 73 20  pMemoryCounters 
1ed50 7b 20 76 61 72 4e 61 6d 65 20 7d 20 7b 0d 0a 20  { varName } {.. 
1ed60 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65 53 51       if {[haveSQ
1ed70 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e  LiteObjectComman
1ed80 64 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  d]} then {..    
1ed90 20 20 20 20 75 70 76 61 72 20 31 20 24 76 61 72      upvar 1 $var
1eda0 4e 61 6d 65 20 63 6f 75 6e 74 65 72 0d 0a 0d 0a  Name counter....
1edb0 20 20 20 20 20 20 20 20 73 65 74 20 63 6f 75 6e          set coun
1edc0 74 65 72 28 31 29 20 5b 6f 62 6a 65 63 74 20 63  ter(1) [object c
1edd0 72 65 61 74 65 20 2d 61 6c 69 61 73 20 5c 0d 0a  reate -alias \..
1ede0 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74              Syst
1edf0 65 6d 2e 44 69 61 67 6e 6f 73 74 69 63 73 2e 50  em.Diagnostics.P
1ee00 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74 65  erformanceCounte
1ee10 72 20 50 72 6f 63 65 73 73 20 5c 0d 0a 20 20 20  r Process \..   
1ee20 20 20 20 20 20 20 20 20 20 22 57 6f 72 6b 69 6e           "Workin
1ee30 67 20 53 65 74 22 20 5b 66 69 6c 65 20 72 6f 6f  g Set" [file roo
1ee40 74 6e 61 6d 65 20 5b 66 69 6c 65 20 74 61 69 6c  tname [file tail
1ee50 20 24 3a 3a 62 69 6e 5f 66 69 6c 65 5d 5d 5d 0d   $::bin_file]]].
1ee60 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 63  ...        set c
1ee70 6f 75 6e 74 65 72 28 32 29 20 5b 6f 62 6a 65 63  ounter(2) [objec
1ee80 74 20 63 72 65 61 74 65 20 2d 61 6c 69 61 73 20  t create -alias 
1ee90 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 53  \..            S
1eea0 79 73 74 65 6d 2e 44 69 61 67 6e 6f 73 74 69 63  ystem.Diagnostic
1eeb0 73 2e 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75  s.PerformanceCou
1eec0 6e 74 65 72 20 50 72 6f 63 65 73 73 20 5c 0d 0a  nter Process \..
1eed0 20 20 20 20 20 20 20 20 20 20 20 20 22 57 6f 72              "Wor
1eee0 6b 69 6e 67 20 53 65 74 20 50 65 61 6b 22 20 5b  king Set Peak" [
1eef0 66 69 6c 65 20 72 6f 6f 74 6e 61 6d 65 20 5b 66  file rootname [f
1ef00 69 6c 65 20 74 61 69 6c 20 24 3a 3a 62 69 6e 5f  ile tail $::bin_
1ef10 66 69 6c 65 5d 5d 5d 0d 0a 0d 0a 20 20 20 20 20  file]]]....     
1ef20 20 20 20 73 65 74 20 63 6f 75 6e 74 65 72 28 33     set counter(3
1ef30 29 20 5b 6f 62 6a 65 63 74 20 63 72 65 61 74 65  ) [object create
1ef40 20 2d 61 6c 69 61 73 20 5c 0d 0a 20 20 20 20 20   -alias \..     
1ef50 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 69         System.Di
1ef60 61 67 6e 6f 73 74 69 63 73 2e 50 65 72 66 6f 72  agnostics.Perfor
1ef70 6d 61 6e 63 65 43 6f 75 6e 74 65 72 20 50 72 6f  manceCounter Pro
1ef80 63 65 73 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  cess \..        
1ef90 20 20 20 20 22 50 72 69 76 61 74 65 20 42 79 74      "Private Byt
1efa0 65 73 22 20 5b 66 69 6c 65 20 72 6f 6f 74 6e 61  es" [file rootna
1efb0 6d 65 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 3a  me [file tail $:
1efc0 3a 62 69 6e 5f 66 69 6c 65 5d 5d 5d 0d 0a 20 20  :bin_file]]]..  
1efd0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72      }....      r
1efe0 65 74 75 72 6e 20 22 22 0d 0a 20 20 20 20 7d 0d  eturn ""..    }.
1eff0 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 72 65 70  ....    proc rep
1f000 6f 72 74 4d 65 6d 6f 72 79 43 6f 75 6e 74 65 72  ortMemoryCounter
1f010 73 20 7b 20 63 68 61 6e 6e 65 6c 20 76 61 72 4e  s { channel varN
1f020 61 6d 65 20 70 72 65 66 69 78 20 7d 20 7b 0d 0a  ame prefix } {..
1f030 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65 53        if {[haveS
1f040 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61  QLiteObjectComma
1f050 6e 64 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  nd]} then {..   
1f060 20 20 20 20 20 75 70 76 61 72 20 31 20 24 76 61       upvar 1 $va
1f070 72 4e 61 6d 65 20 63 6f 75 6e 74 65 72 0d 0a 0d  rName counter...
1f080 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
1f090 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
1f0a0 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
1f0b0 20 20 20 22 2d 2d 2d 2d 20 22 20 24 70 72 65 66     "---- " $pref
1f0c0 69 78 20 22 20 63 6f 75 6e 74 65 72 20 5c 22 22  ix " counter \""
1f0d0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1f0e0 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 24  [object invoke $
1f0f0 63 6f 75 6e 74 65 72 28 31 29 20 43 6f 75 6e 74  counter(1) Count
1f100 65 72 4e 61 6d 65 5d 20 22 5c 22 20 76 61 6c 75  erName] "\" valu
1f110 65 20 69 73 20 22 20 5c 0d 0a 20 20 20 20 20 20  e is " \..      
1f120 20 20 20 20 20 20 5b 6f 62 6a 65 63 74 20 69 6e        [object in
1f130 76 6f 6b 65 20 24 63 6f 75 6e 74 65 72 28 31 29  voke $counter(1)
1f140 20 52 61 77 56 61 6c 75 65 5d 20 5c 6e 5d 0d 0a   RawValue] \n]..
1f150 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
1f160 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
1f170 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
1f180 20 20 20 20 22 2d 2d 2d 2d 20 22 20 24 70 72 65      "---- " $pre
1f190 66 69 78 20 22 20 63 6f 75 6e 74 65 72 20 5c 22  fix " counter \"
1f1a0 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
1f1b0 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20   [object invoke 
1f1c0 24 63 6f 75 6e 74 65 72 28 32 29 20 43 6f 75 6e  $counter(2) Coun
1f1d0 74 65 72 4e 61 6d 65 5d 20 22 5c 22 20 76 61 6c  terName] "\" val
1f1e0 75 65 20 69 73 20 22 20 5c 0d 0a 20 20 20 20 20  ue is " \..     
1f1f0 20 20 20 20 20 20 20 5b 6f 62 6a 65 63 74 20 69         [object i
1f200 6e 76 6f 6b 65 20 24 63 6f 75 6e 74 65 72 28 32  nvoke $counter(2
1f210 29 20 52 61 77 56 61 6c 75 65 5d 20 5c 6e 5d 0d  ) RawValue] \n].
1f220 0a 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  ...        tputs
1f230 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
1f240 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
1f250 20 20 20 20 20 22 2d 2d 2d 2d 20 22 20 24 70 72       "---- " $pr
1f260 65 66 69 78 20 22 20 63 6f 75 6e 74 65 72 20 5c  efix " counter \
1f270 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  "" \..          
1f280 20 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65    [object invoke
1f290 20 24 63 6f 75 6e 74 65 72 28 33 29 20 43 6f 75   $counter(3) Cou
1f2a0 6e 74 65 72 4e 61 6d 65 5d 20 22 5c 22 20 76 61  nterName] "\" va
1f2b0 6c 75 65 20 69 73 20 22 20 5c 0d 0a 20 20 20 20  lue is " \..    
1f2c0 20 20 20 20 20 20 20 20 5b 6f 62 6a 65 63 74 20          [object 
1f2d0 69 6e 76 6f 6b 65 20 24 63 6f 75 6e 74 65 72 28  invoke $counter(
1f2e0 33 29 20 52 61 77 56 61 6c 75 65 5d 20 5c 6e 5d  3) RawValue] \n]
1f2f0 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
1f300 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 6f  .....    proc co
1f310 6c 6c 65 63 74 47 61 72 62 61 67 65 20 7b 20 63  llectGarbage { c
1f320 68 61 6e 6e 65 6c 20 7b 6d 69 6c 6c 69 73 65 63  hannel {millisec
1f330 6f 6e 64 73 20 31 30 30 30 7d 20 7b 71 75 69 65  onds 1000} {quie
1f340 74 20 74 72 75 65 7d 20 7d 20 7b 0d 0a 20 20 20  t true} } {..   
1f350 20 20 20 69 66 20 7b 5b 68 61 76 65 53 51 4c 69     if {[haveSQLi
1f360 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d  teObjectCommand]
1f370 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1f380 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
1f390 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74            object
1f3a0 20 69 6e 76 6f 6b 65 20 47 43 20 47 65 74 54 6f   invoke GC GetTo
1f3b0 74 61 6c 4d 65 6d 6f 72 79 20 66 61 6c 73 65 0d  talMemory false.
1f3c0 0a 20 20 20 20 20 20 20 20 7d 20 72 65 73 75 6c  .        } resul
1f3d0 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  t] == 0} then {.
1f3e0 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21  .          if {!
1f3f0 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
1f400 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
1f410 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
1f420 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
1f430 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
1f440 6d 65 6d 6f 72 79 20 69 6e 20 75 73 65 20 62 79  memory in use by
1f450 20 74 68 65 20 43 4c 52 20 62 65 66 6f 72 65 20   the CLR before 
1f460 63 6f 6c 6c 65 63 74 69 6f 6e 2e 2e 2e 20 22 20  collection... " 
1f470 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1f480 20 20 20 24 72 65 73 75 6c 74 20 22 20 62 79 74     $result " byt
1f490 65 73 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20  es\n"]..        
1f4a0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65    }..        } e
1f4b0 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
1f4c0 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
1f4d0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
1f4e0 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
1f4f0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
1f500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f510 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66  "==== WARNING: f
1f520 61 69 6c 65 64 20 74 6f 20 67 65 74 20 43 4c 52  ailed to get CLR
1f530 20 6d 65 6d 6f 72 79 20 75 73 61 67 65 2c 20 65   memory usage, e
1f540 72 72 6f 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20  rror: " \..     
1f550 20 20 20 20 20 20 20 20 20 20 20 5c 6e 5c 74 20             \n\t 
1f560 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20  $result \n]..   
1f570 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1f580 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a    }..      }....
1f590 20 20 20 20 20 20 23 23 23 23 23 23 23 23 23 23        ##########
1f5a0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1f5b0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1f5c0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1f5d0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d  ###############.
1f5e0 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
1f5f0 20 20 23 20 4e 4f 54 45 3a 20 52 65 70 65 61 74    # NOTE: Repeat
1f600 65 64 6c 79 20 61 74 74 65 6d 70 74 20 74 6f 20  edly attempt to 
1f610 63 6f 6c 6c 65 63 74 20 67 61 72 62 61 67 65 20  collect garbage 
1f620 75 6e 74 69 6c 20 74 68 65 20 61 6c 6c 6f 74 74  until the allott
1f630 65 64 20 6e 75 6d 62 65 72 0d 0a 20 20 20 20 20  ed number..     
1f640 20 23 20 20 20 20 20 20 20 6f 66 20 6d 69 6c 6c   #       of mill
1f650 69 73 65 63 6f 6e 64 73 20 68 61 73 20 65 6c 61  iseconds has ela
1f660 70 73 65 64 2e 20 20 41 6c 77 61 79 73 20 61 74  psed.  Always at
1f670 74 65 6d 70 74 20 74 6f 20 63 6f 6c 6c 65 63 74  tempt to collect
1f680 20 67 61 72 62 61 67 65 0d 0a 20 20 20 20 20 20   garbage..      
1f690 23 20 20 20 20 20 20 20 61 74 20 6c 65 61 73 74  #       at least
1f6a0 20 6f 6e 63 65 2e 0d 0a 20 20 20 20 20 20 23 0d   once...      #.
1f6b0 0a 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65  .      if {[have
1f6c0 53 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d  SQLiteObjectComm
1f6d0 61 6e 64 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  and]} then {..  
1f6e0 20 20 20 20 20 20 73 65 74 20 73 74 61 72 74 20        set start 
1f6f0 5b 63 6c 6f 63 6b 20 73 65 63 6f 6e 64 73 5d 0d  [clock seconds].
1f700 0a 20 20 20 20 20 20 20 20 73 65 74 20 73 74 6f  .        set sto
1f710 70 20 5b 65 78 70 72 20 7b 24 73 74 61 72 74 20  p [expr {$start 
1f720 2b 20 28 24 6d 69 6c 6c 69 73 65 63 6f 6e 64 73  + ($milliseconds
1f730 20 2f 20 31 30 30 30 29 7d 5d 0d 0a 0d 0a 20 20   / 1000)}]....  
1f740 20 20 20 20 20 20 64 6f 20 7b 0d 0a 20 20 20 20        do {..    
1f750 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1f760 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d     # NOTE: Attem
1f770 70 74 20 74 6f 20 66 6f 72 63 65 20 61 20 66 75  pt to force a fu
1f780 6c 6c 20 67 61 72 62 61 67 65 20 63 6f 6c 6c 65  ll garbage colle
1f790 63 74 69 6f 6e 20 6e 6f 77 2e 20 20 52 65 70 6f  ction now.  Repo
1f7a0 72 74 20 61 6e 79 0d 0a 20 20 20 20 20 20 20 20  rt any..        
1f7b0 20 20 23 20 20 20 20 20 20 20 65 72 72 6f 72 20    #       error 
1f7c0 74 68 61 74 20 69 73 20 65 6e 63 6f 75 6e 74 65  that is encounte
1f7d0 72 65 64 20 69 66 20 77 65 20 66 61 69 6c 2e 0d  red if we fail..
1f7e0 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
1f7f0 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
1f800 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
1f810 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20    object invoke 
1f820 47 43 20 47 65 74 54 6f 74 61 6c 4d 65 6d 6f 72  GC GetTotalMemor
1f830 79 20 74 72 75 65 0d 0a 20 20 20 20 20 20 20 20  y true..        
1f840 20 20 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e    } error]} then
1f850 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1f860 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
1f870 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
1f880 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
1f890 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
1f8a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f8b0 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47     "==== WARNING
1f8c0 3a 20 66 61 69 6c 65 64 20 66 75 6c 6c 20 67 61  : failed full ga
1f8d0 72 62 61 67 65 20 63 6f 6c 6c 65 63 74 69 6f 6e  rbage collection
1f8e0 2c 20 65 72 72 6f 72 3a 20 22 20 5c 0d 0a 20 20  , error: " \..  
1f8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f900 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d  \n\t $error \n].
1f910 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
1f920 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
1f930 20 20 20 20 20 20 20 20 20 73 65 74 20 6e 6f 77           set now
1f940 20 5b 63 6c 6f 63 6b 20 73 65 63 6f 6e 64 73 5d   [clock seconds]
1f950 0d 0a 20 20 20 20 20 20 20 20 7d 20 77 68 69 6c  ..        } whil
1f960 65 20 7b 24 73 74 61 72 74 20 3c 3d 20 24 6e 6f  e {$start <= $no
1f970 77 20 26 26 20 24 6e 6f 77 20 3c 20 24 73 74 6f  w && $now < $sto
1f980 70 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  p}..      }.... 
1f990 20 20 20 20 20 23 23 23 23 23 23 23 23 23 23 23       ###########
1f9a0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1f9b0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1f9c0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1f9d0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a  ##############..
1f9e0 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76  ..      if {[hav
1f9f0 65 53 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d  eSQLiteObjectCom
1fa00 6d 61 6e 64 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  mand]} then {.. 
1fa10 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
1fa20 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6f  h {..          o
1fa30 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 47 43 20  bject invoke GC 
1fa40 47 65 74 54 6f 74 61 6c 4d 65 6d 6f 72 79 20 66  GetTotalMemory f
1fa50 61 6c 73 65 0d 0a 20 20 20 20 20 20 20 20 7d 20  alse..        } 
1fa60 72 65 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68  result] == 0} th
1fa70 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
1fa80 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
1fa90 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
1faa0 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
1fab0 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
1fac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1fad0 2d 2d 2d 2d 20 6d 65 6d 6f 72 79 20 69 6e 20 75  ---- memory in u
1fae0 73 65 20 62 79 20 74 68 65 20 43 4c 52 20 61 66  se by the CLR af
1faf0 74 65 72 20 63 6f 6c 6c 65 63 74 69 6f 6e 2e 2e  ter collection..
1fb00 2e 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  . " \..         
1fb10 20 20 20 20 20 20 20 24 72 65 73 75 6c 74 20 22         $result "
1fb20 20 62 79 74 65 73 5c 6e 22 5d 0d 0a 20 20 20 20   bytes\n"]..    
1fb30 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
1fb40 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
1fb50 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
1fb60 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1fb70 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
1fb80 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
1fb90 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1fba0 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e      "==== WARNIN
1fbb0 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 67 65 74  G: failed to get
1fbc0 20 43 4c 52 20 6d 65 6d 6f 72 79 20 75 73 61 67   CLR memory usag
1fbd0 65 2c 20 65 72 72 6f 72 3a 20 22 20 5c 0d 0a 20  e, error: " \.. 
1fbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
1fbf0 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d  n\t $result \n].
1fc00 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
1fc10 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
1fc20 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
1fc30 70 72 6f 63 20 67 65 74 53 51 4c 69 74 65 48 61  proc getSQLiteHa
1fc40 6e 64 6c 65 43 6f 75 6e 74 73 20 7b 20 63 68 61  ndleCounts { cha
1fc50 6e 6e 65 6c 20 7b 71 75 69 65 74 20 66 61 6c 73  nnel {quiet fals
1fc60 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65  e} } {..      se
1fc70 74 20 72 65 73 75 6c 74 20 5b 6c 69 73 74 5d 0d  t result [list].
1fc80 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 68 61  ...      if {[ha
1fc90 76 65 53 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f  veSQLiteObjectCo
1fca0 6d 6d 61 6e 64 5d 20 26 26 20 5c 0d 0a 20 20 20  mmand] && \..   
1fcb0 20 20 20 20 20 20 20 5b 68 61 76 65 53 51 4c 69         [haveSQLi
1fcc0 74 65 44 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74  teDefineConstant
1fcd0 20 43 4f 55 4e 54 5f 48 41 4e 44 4c 45 5d 7d 20   COUNT_HANDLE]} 
1fce0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1fcf0 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
1fd00 45 3a 20 41 64 64 20 65 61 63 68 20 63 72 69 74  E: Add each crit
1fd10 69 63 61 6c 20 68 61 6e 64 6c 65 20 63 6f 75 6e  ical handle coun
1fd20 74 20 74 6f 20 74 68 65 20 72 65 73 75 6c 74 69  t to the resulti
1fd30 6e 67 20 6c 69 73 74 2e 0d 0a 20 20 20 20 20 20  ng list...      
1fd40 20 20 23 0d 0a 20 20 20 20 20 20 20 20 66 6f 72    #..        for
1fd50 65 61 63 68 20 6e 61 6d 65 20 5b 6c 69 73 74 20  each name [list 
1fd60 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  \..            c
1fd70 6f 6e 6e 65 63 74 69 6f 6e 43 6f 75 6e 74 20 73  onnectionCount s
1fd80 74 61 74 65 6d 65 6e 74 43 6f 75 6e 74 20 62 61  tatementCount ba
1fd90 63 6b 75 70 43 6f 75 6e 74 20 62 6c 6f 62 43 6f  ckupCount blobCo
1fda0 75 6e 74 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20  unt] {..        
1fdb0 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
1fdc0 20 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65              obje
1fdd0 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73  ct invoke -flags
1fde0 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20   +NonPublic \.. 
1fdf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
1fe00 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
1fe10 65 2e 44 65 62 75 67 44 61 74 61 20 24 6e 61 6d  e.DebugData $nam
1fe20 65 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 76  e..          } v
1fe30 61 6c 75 65 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  alue] == 0} then
1fe40 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1fe50 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
1fe60 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
1fe70 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
1fe80 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
1fe90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1fea0 20 20 20 22 2d 2d 2d 2d 20 63 72 69 74 69 63 61     "---- critica
1feb0 6c 20 68 61 6e 64 6c 65 20 63 6f 75 6e 74 20 5c  l handle count \
1fec0 22 22 20 24 6e 61 6d 65 20 22 5c 22 20 69 73 20  "" $name "\" is 
1fed0 22 20 24 76 61 6c 75 65 20 5c 6e 5d 0d 0a 20 20  " $value \n]..  
1fee0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
1fef0 20 20 20 20 20 20 20 20 20 20 20 6c 61 70 70 65             lappe
1ff00 6e 64 20 72 65 73 75 6c 74 20 24 76 61 6c 75 65  nd result $value
1ff10 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c  ..          } el
1ff20 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
1ff30 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
1ff40 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1ff50 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
1ff60 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
1ff70 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1ff80 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49       "==== WARNI
1ff90 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 67 65  NG: failed to ge
1ffa0 74 20 63 72 69 74 69 63 61 6c 20 68 61 6e 64 6c  t critical handl
1ffb0 65 20 63 6f 75 6e 74 20 5c 22 22 20 5c 0d 0a 20  e count \"" \.. 
1ffc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ffd0 20 24 6e 61 6d 65 20 22 5c 22 2c 20 65 72 72 6f   $name "\", erro
1ffe0 72 3a 20 22 20 5c 6e 5c 74 20 24 76 61 6c 75 65  r: " \n\t $value
1fff0 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \n]..          
20000 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d    }..          }
20010 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
20020 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 21 24 71     } elseif {!$q
20030 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
20040 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
20050 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 61 63 74   # NOTE: The act
20060 75 61 6c 20 68 61 6e 64 6c 65 20 63 6f 75 6e 74  ual handle count
20070 73 20 61 72 65 20 6e 6f 74 20 61 76 61 69 6c 61  s are not availa
20080 62 6c 65 3b 20 74 68 65 72 65 66 6f 72 65 2c 20  ble; therefore, 
20090 6a 75 73 74 0d 0a 20 20 20 20 20 20 20 20 23 20  just..        # 
200a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 6e 20        return an 
200b0 65 6d 70 74 79 20 6c 69 73 74 2e 0d 0a 20 20 20  empty list...   
200c0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
200d0 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22  tputs $channel "
200e0 2d 2d 2d 2d 20 63 72 69 74 69 63 61 6c 20 68 61  ---- critical ha
200f0 6e 64 6c 65 20 63 6f 75 6e 74 73 20 75 6e 61 76  ndle counts unav
20100 61 69 6c 61 62 6c 65 5c 6e 22 0d 0a 20 20 20 20  ailable\n"..    
20110 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74    }....      ret
20120 75 72 6e 20 24 72 65 73 75 6c 74 0d 0a 20 20 20  urn $result..   
20130 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
20140 73 68 75 74 64 6f 77 6e 53 51 4c 69 74 65 20 7b  shutdownSQLite {
20150 20 63 68 61 6e 6e 65 6c 20 7b 66 6f 72 63 65 20   channel {force 
20160 66 61 6c 73 65 7d 20 7b 71 75 69 65 74 20 66 61  false} {quiet fa
20170 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20  lse} } {..      
20180 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
20190 20 4d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   Make sure that 
201a0 53 51 4c 69 74 65 20 63 6f 72 65 20 6c 69 62 72  SQLite core libr
201b0 61 72 79 20 69 73 20 63 6f 6d 70 6c 65 74 65 6c  ary is completel
201c0 79 20 73 68 75 74 64 6f 77 6e 2e 20 20 54 68 69  y shutdown.  Thi
201d0 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  s..      #      
201e0 20 69 73 20 75 73 65 64 20 62 79 20 74 65 73 74   is used by test
201f0 73 20 74 68 61 74 20 63 68 61 6e 67 65 20 63 6f  s that change co
20200 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 70 74 69  nfiguration opti
20210 6f 6e 73 20 61 6e 64 2f 6f 72 20 74 68 6f 73 65  ons and/or those
20220 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
20230 74 68 61 74 20 6e 65 65 64 20 74 6f 20 6d 61 6b  that need to mak
20240 65 20 73 75 72 65 20 6c 6f 67 67 69 6e 67 20 69  e sure logging i
20250 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 28 69  s initialized (i
20260 2e 65 2e 20 6a 75 73 74 20 69 6e 20 63 61 73 65  .e. just in case
20270 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
20280 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20  the SQLite core 
20290 6c 69 62 72 61 72 79 20 77 61 73 20 69 6e 69 74  library was init
202a0 69 61 6c 69 7a 65 64 20 69 6e 20 74 68 65 20 70  ialized in the p
202b0 72 6f 63 65 73 73 20 70 72 69 6f 72 20 74 6f 0d  rocess prior to.
202c0 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74  .      #       t
202d0 68 65 20 53 51 4c 69 74 65 4c 6f 67 20 63 6c 61  he SQLiteLog cla
202e0 73 73 20 62 65 69 6e 67 20 61 62 6c 65 20 74 6f  ss being able to
202f0 20 73 65 74 75 70 20 69 74 73 20 6c 6f 67 67 69   setup its loggi
20300 6e 67 20 63 61 6c 6c 62 61 63 6b 29 2e 0d 0a 20  ng callback)... 
20310 20 20 20 20 20 23 20 20 20 20 20 20 20 4e 6f 72       #       Nor
20320 6d 61 6c 6c 79 2c 20 74 68 69 73 20 73 68 6f 75  mally, this shou
20330 6c 64 20 6f 6e 6c 79 20 62 65 20 70 65 72 66 6f  ld only be perfo
20340 72 6d 65 64 20 69 66 20 53 51 4c 69 74 65 20 69  rmed if SQLite i
20350 73 20 6c 6f 61 64 65 64 20 61 6e 64 0d 0a 20 20  s loaded and..  
20360 20 20 20 20 23 20 20 20 20 20 20 20 72 65 61 64      #       read
20370 79 20 66 6f 72 20 75 73 65 20 62 79 20 74 68 65  y for use by the
20380 20 74 65 73 74 20 73 75 69 74 65 2e 0d 0a 20 20   test suite...  
20390 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
203a0 7b 24 66 6f 72 63 65 20 7c 7c 20 5b 69 73 53 51  {$force || [isSQ
203b0 4c 69 74 65 52 65 61 64 79 5d 7d 20 74 68 65 6e  LiteReady]} then
203c0 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
203d0 20 20 20 20 20 20 20 23 20 42 55 47 46 49 58 3a         # BUGFIX:
203e0 20 4d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   Make sure that 
203f0 61 6e 79 20 22 6c 65 61 6b 65 64 22 20 74 72 61  any "leaked" tra
20400 6e 73 61 63 74 69 6f 6e 73 20 61 6e 64 2f 6f 72  nsactions and/or
20410 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0d 0a 20 20   connections..  
20420 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20        #         
20430 61 72 65 20 63 6c 65 61 6e 65 64 20 75 70 20 62  are cleaned up b
20440 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74 68  efore calling th
20450 65 20 6e 61 74 69 76 65 20 73 68 75 74 64 6f 77  e native shutdow
20460 6e 20 66 75 6e 63 74 69 6f 6e 2e 0d 0a 20 20 20  n function...   
20470 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
20480 66 6f 72 65 61 63 68 20 74 72 61 6e 73 61 63 74  foreach transact
20490 69 6f 6e 20 5b 69 6e 66 6f 20 74 72 61 6e 73 61  ion [info transa
204a0 63 74 69 6f 6e 73 5d 20 7b 0d 0a 20 20 20 20 20  ctions] {..     
204b0 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
204c0 20 6d 61 74 63 68 20 5c 0d 0a 20 20 20 20 20 20   match \..      
204d0 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 23 44          System#D
204e0 61 74 61 23 53 51 4c 69 74 65 23 53 51 4c 69 74  ata#SQLite#SQLit
204f0 65 54 72 61 6e 73 61 63 74 69 6f 6e 23 2a 20 24  eTransaction#* $
20500 74 72 61 6e 73 61 63 74 69 6f 6e 5d 7d 20 74 68  transaction]} th
20510 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
20520 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
20530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
20540 6c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f  l transaction ro
20550 6c 6c 62 61 63 6b 20 24 74 72 61 6e 73 61 63 74  llback $transact
20560 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ion..           
20570 20 7d 20 65 72 72 6f 72 5d 20 3d 3d 20 30 7d 20   } error] == 0} 
20580 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
20590 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
205a0 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
205b0 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
205c0 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
205d0 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
205e0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
205f0 2d 2d 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 6c  -- rolled back l
20600 65 61 6b 65 64 20 74 72 61 6e 73 61 63 74 69 6f  eaked transactio
20610 6e 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20  n \"" \..       
20620 20 20 20 20 20 20 20 20 20 20 20 20 20 24 74 72               $tr
20630 61 6e 73 61 63 74 69 6f 6e 20 5c 22 5c 6e 5d 0d  ansaction \"\n].
20640 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
20650 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20  ..            } 
20660 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
20670 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
20680 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
20690 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
206a0 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
206b0 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
206c0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d               "==
206d0 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c  == WARNING: fail
206e0 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 6c  ed to rollback l
206f0 65 61 6b 65 64 20 74 72 61 6e 73 61 63 74 69 6f  eaked transactio
20700 6e 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20  n \"" \..       
20710 20 20 20 20 20 20 20 20 20 20 20 20 20 24 74 72               $tr
20720 61 6e 73 61 63 74 69 6f 6e 20 22 5c 22 2c 20 65  ansaction "\", e
20730 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72  rror: " \n\t $er
20740 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ror \n]..       
20750 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
20760 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
20770 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
20780 0a 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61  ...        forea
20790 63 68 20 64 62 20 5b 69 6e 66 6f 20 63 6f 6e 6e  ch db [info conn
207a0 65 63 74 69 6f 6e 73 5d 20 7b 0d 0a 20 20 20 20  ections] {..    
207b0 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
207c0 67 20 6d 61 74 63 68 20 5c 0d 0a 20 20 20 20 20  g match \..     
207d0 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 23           System#
207e0 44 61 74 61 23 53 51 4c 69 74 65 23 53 51 4c 69  Data#SQLite#SQLi
207f0 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 23 2a 20 24  teConnection#* $
20800 64 62 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  db]} then {..   
20810 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61           if {[ca
20820 74 63 68 20 7b 73 71 6c 20 63 6c 6f 73 65 20 24  tch {sql close $
20830 64 62 7d 20 65 72 72 6f 72 5d 20 3d 3d 20 30 7d  db} error] == 0}
20840 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
20850 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
20860 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
20870 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
20880 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
20890 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
208a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
208b0 2d 2d 2d 20 63 6c 6f 73 65 64 20 6c 65 61 6b 65  --- closed leake
208c0 64 20 64 61 74 61 62 61 73 65 20 5c 22 22 20 24  d database \"" $
208d0 64 62 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20  db \"\n]..      
208e0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
208f0 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
20900 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
20910 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
20920 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
20930 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
20940 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
20950 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
20960 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e        "==== WARN
20970 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 63  ING: failed to c
20980 6c 6f 73 65 20 6c 65 61 6b 65 64 20 64 61 74 61  lose leaked data
20990 62 61 73 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20  base \"" \..    
209a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
209b0 24 64 62 20 22 5c 22 2c 20 65 72 72 6f 72 3a 20  $db "\", error: 
209c0 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e  " \n\t $error \n
209d0 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ]..             
209e0 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
209f0 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  }..          }..
20a00 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
20a10 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
20a20 23 20 42 55 47 46 49 58 3a 20 42 65 66 6f 72 65  # BUGFIX: Before
20a30 20 63 61 6c 6c 69 6e 67 20 74 68 65 20 6e 61 74   calling the nat
20a40 69 76 65 20 73 68 75 74 64 6f 77 6e 20 66 75 6e  ive shutdown fun
20a50 63 74 69 6f 6e 2c 20 6d 61 6b 65 20 73 75 72 65  ction, make sure
20a60 20 62 6f 74 68 0d 0a 20 20 20 20 20 20 20 20 23   both..        #
20a70 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20           of the 
20a80 50 52 41 47 4d 41 20 72 65 6c 61 74 65 64 20 64  PRAGMA related d
20a90 69 72 65 63 74 6f 72 79 20 6e 61 6d 65 73 20 61  irectory names a
20aa0 72 65 20 66 72 65 65 64 2e 0d 0a 20 20 20 20 20  re freed...     
20ab0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 63 68     #..        ch
20ac0 65 63 6b 46 6f 72 53 51 4c 69 74 65 44 69 72 65  eckForSQLiteDire
20ad0 63 74 6f 72 69 65 73 20 24 63 68 61 6e 6e 65 6c  ctories $channel
20ae0 20 74 72 75 65 0d 0a 0d 0a 20 20 20 20 20 20 20   true....       
20af0 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
20b00 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20           object 
20b10 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e  invoke -flags +N
20b20 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20  onPublic \..    
20b30 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d            System
20b40 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 55 6e 73  .Data.SQLite.Uns
20b50 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73  afeNativeMethods
20b60 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77   sqlite3_shutdow
20b70 6e 0d 0a 20 20 20 20 20 20 20 20 7d 20 72 65 73  n..        } res
20b80 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ult] == 0} then 
20b90 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  {..          if 
20ba0 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
20bb0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
20bc0 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
20bd0 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
20be0 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
20bf0 2d 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f 73  - call sqlite3_s
20c00 68 75 74 64 6f 77 6e 28 29 2e 2e 2e 20 6f 6b 3a  hutdown()... ok:
20c10 20 22 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a   " $result \n]..
20c20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
20c30 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
20c40 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71           if {!$q
20c50 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
20c60 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
20c70 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
20c80 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
20c90 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 61          "---- ca
20ca0 6c 6c 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64  ll sqlite3_shutd
20cb0 6f 77 6e 28 29 2e 2e 2e 20 65 72 72 6f 72 3a 20  own()... error: 
20cc0 22 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c  " \n\t $result \
20cd0 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  n]..          }.
20ce0 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
20cf0 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
20d00 20 20 20 70 72 6f 63 20 67 65 74 53 65 74 74 69     proc getSetti
20d10 6e 67 52 65 61 64 43 6f 75 6e 74 20 7b 20 6e 61  ngReadCount { na
20d20 6d 65 20 7b 76 69 61 46 69 6c 65 20 66 61 6c 73  me {viaFile fals
20d30 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66  e} } {..      if
20d40 20 7b 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e   {[haveConstrain
20d50 74 20 62 75 69 6c 64 43 6f 6e 66 69 67 75 72 61  t buildConfigura
20d60 74 69 6f 6e 2e 44 65 62 75 67 5d 20 26 26 20 5b  tion.Debug] && [
20d70 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
20d80 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d   object invoke -
20d90 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63  flags +NonPublic
20da0 20 2d 61 6c 69 61 73 20 5c 0d 0a 20 20 20 20 20   -alias \..     
20db0 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61         System.Da
20dc0 74 61 2e 53 51 4c 69 74 65 2e 44 65 62 75 67 44  ta.SQLite.DebugD
20dd0 61 74 61 20 47 65 74 53 65 74 74 69 6e 67 52 65  ata GetSettingRe
20de0 61 64 43 6f 75 6e 74 73 20 24 76 69 61 46 69 6c  adCounts $viaFil
20df0 65 0d 0a 20 20 20 20 20 20 7d 20 73 65 74 74 69  e..      } setti
20e00 6e 67 52 65 61 64 43 6f 75 6e 74 73 5d 20 3d 3d  ngReadCounts] ==
20e10 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
20e20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
20e30 6c 65 6e 67 74 68 20 24 6e 61 6d 65 5d 20 3e 20  length $name] > 
20e40 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
20e50 20 20 20 20 20 69 66 20 7b 5b 24 73 65 74 74 69       if {[$setti
20e60 6e 67 52 65 61 64 43 6f 75 6e 74 73 20 54 72 79  ngReadCounts Try
20e70 47 65 74 56 61 6c 75 65 20 24 6e 61 6d 65 20 76  GetValue $name v
20e80 61 6c 75 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  alue]} then {.. 
20e90 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
20ea0 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
20eb0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
20ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ed0 22 2d 2d 2d 2d 20 73 65 74 74 69 6e 67 20 5c 22  "---- setting \"
20ee0 22 20 24 6e 61 6d 65 20 22 5c 22 20 77 61 73 20  " $name "\" was 
20ef0 72 65 61 64 20 22 20 24 76 61 6c 75 65 20 22 20  read " $value " 
20f00 74 69 6d 65 73 22 20 5c 0d 0a 20 20 20 20 20 20  times" \..      
20f10 20 20 20 20 20 20 20 20 20 20 5b 65 78 70 72 20            [expr 
20f20 7b 24 76 69 61 46 69 6c 65 20 3f 20 22 20 66 72  {$viaFile ? " fr
20f30 6f 6d 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61  om the configura
20f40 74 69 6f 6e 20 66 69 6c 65 22 20 3a 20 22 22 7d  tion file" : ""}
20f50 5d 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  ] \n]....       
20f60 20 20 20 20 20 72 65 74 75 72 6e 20 24 76 61 6c       return $val
20f70 75 65 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  ue..          }.
20f80 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20  .        } else 
20f90 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  {..          set
20fa0 20 6e 61 6d 65 43 6f 75 6e 74 20 5b 24 73 65 74   nameCount [$set
20fb0 74 69 6e 67 52 65 61 64 43 6f 75 6e 74 73 20 43  tingReadCounts C
20fc0 6f 75 6e 74 5d 0d 0a 20 20 20 20 20 20 20 20 20  ount]..         
20fd0 20 73 65 74 20 76 61 6c 75 65 43 6f 75 6e 74 20   set valueCount 
20fe0 30 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 6f  0....          o
20ff0 62 6a 65 63 74 20 66 6f 72 65 61 63 68 20 2d 61  bject foreach -a
21000 6c 69 61 73 20 70 61 69 72 20 24 73 65 74 74 69  lias pair $setti
21010 6e 67 52 65 61 64 43 6f 75 6e 74 73 20 7b 0d 0a  ngReadCounts {..
21020 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 63 72              incr
21030 20 76 61 6c 75 65 43 6f 75 6e 74 20 5b 24 70 61   valueCount [$pa
21040 69 72 20 56 61 6c 75 65 5d 0d 0a 0d 0a 20 20 20  ir Value]....   
21050 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
21060 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
21070 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
21080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
21090 2d 2d 2d 20 73 65 74 74 69 6e 67 20 5c 22 22 20  --- setting \"" 
210a0 5b 24 70 61 69 72 20 4b 65 79 5d 20 22 5c 22 20  [$pair Key] "\" 
210b0 77 61 73 20 72 65 61 64 20 22 20 5b 24 70 61 69  was read " [$pai
210c0 72 20 56 61 6c 75 65 5d 20 5c 0d 0a 20 20 20 20  r Value] \..    
210d0 20 20 20 20 20 20 20 20 20 20 20 20 22 20 74 69              " ti
210e0 6d 65 73 22 20 5b 65 78 70 72 20 7b 24 76 69 61  mes" [expr {$via
210f0 46 69 6c 65 20 3f 20 22 20 66 72 6f 6d 20 74 68  File ? " from th
21100 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  e configuration 
21110 66 69 6c 65 22 20 3a 20 5c 0d 0a 20 20 20 20 20  file" : \..     
21120 20 20 20 20 20 20 20 20 20 20 20 22 22 7d 5d 20             ""}] 
21130 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  \n]..          }
21140 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65  ....          re
21150 74 75 72 6e 20 5b 6c 69 73 74 20 24 6e 61 6d 65  turn [list $name
21160 43 6f 75 6e 74 20 24 76 61 6c 75 65 43 6f 75 6e  Count $valueCoun
21170 74 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  t]..        }.. 
21180 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
21190 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
211a0 74 68 20 24 6e 61 6d 65 5d 20 3e 20 30 7d 20 74  th $name] > 0} t
211b0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74  hen {..        t
211c0 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
211d0 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
211e0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
211f0 22 2d 2d 2d 2d 20 73 65 74 74 69 6e 67 20 5c 22  "---- setting \"
21200 22 20 24 6e 61 6d 65 20 22 5c 22 20 77 61 73 20  " $name "\" was 
21210 6e 6f 74 20 72 65 61 64 22 20 5b 65 78 70 72 20  not read" [expr 
21220 7b 24 76 69 61 46 69 6c 65 20 3f 20 5c 0d 0a 20  {$viaFile ? \.. 
21230 20 20 20 20 20 20 20 20 20 20 20 22 20 66 72 6f             " fro
21240 6d 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74  m the configurat
21250 69 6f 6e 20 66 69 6c 65 22 20 3a 20 22 22 7d 5d  ion file" : ""}]
21260 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c   \n]..      } el
21270 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70  se {..        tp
21280 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
21290 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
212a0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  \..            "
212b0 2d 2d 2d 2d 20 6e 6f 20 73 65 74 74 69 6e 67 73  ---- no settings
212c0 20 77 65 72 65 20 72 65 61 64 22 20 5b 65 78 70   were read" [exp
212d0 72 20 7b 24 76 69 61 46 69 6c 65 20 3f 20 5c 0d  r {$viaFile ? \.
212e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 20 66  .            " f
212f0 72 6f 6d 20 74 68 65 20 63 6f 6e 66 69 67 75 72  rom the configur
21300 61 74 69 6f 6e 20 66 69 6c 65 22 20 3a 20 22 22  ation file" : ""
21310 7d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d  }] \n]..      }.
21320 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ...      return 
21330 2d 31 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  -1..    }.....  
21340 20 20 70 72 6f 63 20 67 65 74 4f 74 68 65 72 43    proc getOtherC
21350 6f 75 6e 74 20 7b 20 6e 61 6d 65 20 7d 20 7b 0d  ount { name } {.
21360 0a 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65  .      if {[have
21370 43 6f 6e 73 74 72 61 69 6e 74 20 62 75 69 6c 64  Constraint build
21380 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 44 65  Configuration.De
21390 62 75 67 5d 20 26 26 20 5b 63 61 74 63 68 20 7b  bug] && [catch {
213a0 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74  ..        object
213b0 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b   invoke -flags +
213c0 4e 6f 6e 50 75 62 6c 69 63 20 2d 61 6c 69 61 73  NonPublic -alias
213d0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
213e0 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
213f0 74 65 2e 44 65 62 75 67 44 61 74 61 20 47 65 74  te.DebugData Get
21400 4f 74 68 65 72 43 6f 75 6e 74 73 0d 0a 20 20 20  OtherCounts..   
21410 20 20 20 7d 20 6f 74 68 65 72 43 6f 75 6e 74 73     } otherCounts
21420 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
21430 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72          if {[str
21440 69 6e 67 20 6c 65 6e 67 74 68 20 24 6e 61 6d 65  ing length $name
21450 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
21460 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 24 6f           if {[$o
21470 74 68 65 72 43 6f 75 6e 74 73 20 54 72 79 47 65  therCounts TryGe
21480 74 56 61 6c 75 65 20 24 6e 61 6d 65 20 76 61 6c  tValue $name val
21490 75 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ue]} then {..   
214a0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
214b0 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
214c0 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
214d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
214e0 2d 2d 2d 20 6f 74 68 65 72 20 63 6f 75 6e 74 65  --- other counte
214f0 72 20 5c 22 22 20 24 6e 61 6d 65 20 22 5c 22 20  r \"" $name "\" 
21500 68 61 73 20 76 61 6c 75 65 20 22 20 24 76 61 6c  has value " $val
21510 75 65 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20  ue \n]....      
21520 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 76 61        return $va
21530 6c 75 65 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  lue..          }
21540 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65  ..        } else
21550 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   {..          se
21560 74 20 6e 61 6d 65 43 6f 75 6e 74 20 5b 24 6f 74  t nameCount [$ot
21570 68 65 72 43 6f 75 6e 74 73 20 43 6f 75 6e 74 5d  herCounts Count]
21580 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
21590 76 61 6c 75 65 43 6f 75 6e 74 20 30 0d 0a 0d 0a  valueCount 0....
215a0 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74            object
215b0 20 66 6f 72 65 61 63 68 20 2d 61 6c 69 61 73 20   foreach -alias 
215c0 70 61 69 72 20 24 6f 74 68 65 72 43 6f 75 6e 74  pair $otherCount
215d0 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s {..           
215e0 20 69 6e 63 72 20 76 61 6c 75 65 43 6f 75 6e 74   incr valueCount
215f0 20 5b 24 70 61 69 72 20 56 61 6c 75 65 5d 0d 0a   [$pair Value]..
21600 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
21610 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
21620 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
21630 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
21640 20 20 20 22 2d 2d 2d 2d 20 6f 74 68 65 72 20 63     "---- other c
21650 6f 75 6e 74 65 72 20 5c 22 22 20 5b 24 70 61 69  ounter \"" [$pai
21660 72 20 4b 65 79 5d 20 22 5c 22 20 68 61 73 20 76  r Key] "\" has v
21670 61 6c 75 65 20 22 20 5c 0d 0a 20 20 20 20 20 20  alue " \..      
21680 20 20 20 20 20 20 20 20 20 20 5b 24 70 61 69 72            [$pair
21690 20 56 61 6c 75 65 5d 20 5c 6e 5d 0d 0a 20 20 20   Value] \n]..   
216a0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
216b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6c 69        return [li
216c0 73 74 20 24 6e 61 6d 65 43 6f 75 6e 74 20 24 76  st $nameCount $v
216d0 61 6c 75 65 43 6f 75 6e 74 5d 0d 0a 20 20 20 20  alueCount]..    
216e0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
216f0 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72  ..      if {[str
21700 69 6e 67 20 6c 65 6e 67 74 68 20 24 6e 61 6d 65  ing length $name
21710 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
21720 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
21730 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
21740 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
21750 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6f 74          "---- ot
21760 68 65 72 20 63 6f 75 6e 74 65 72 20 5c 22 22 20  her counter \"" 
21770 24 6e 61 6d 65 20 22 5c 22 20 68 61 73 20 6e 6f  $name "\" has no
21780 20 76 61 6c 75 65 5c 6e 22 5d 0d 0a 20 20 20 20   value\n"]..    
21790 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
217a0 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
217b0 74 5f 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20  t_channel "---- 
217c0 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 74 68  there are no oth
217d0 65 72 20 63 6f 75 6e 74 65 72 73 5c 6e 22 0d 0a  er counters\n"..
217e0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
217f0 20 72 65 74 75 72 6e 20 2d 31 0d 0a 20 20 20 20   return -1..    
21800 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 72  }.....    proc r
21810 65 70 6f 72 74 53 51 4c 69 74 65 52 65 73 6f 75  eportSQLiteResou
21820 72 63 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20  rces {..        
21830 20 20 20 20 63 68 61 6e 6e 65 6c 20 7b 71 75 69      channel {qui
21840 65 74 20 66 61 6c 73 65 7d 20 7b 72 65 73 65 74  et false} {reset
21850 20 74 72 75 65 7d 20 7b 63 6f 6c 6c 65 63 74 20   true} {collect 
21860 74 72 75 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  true} } {..     
21870 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
21880 3a 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 61  : If possible, a
21890 6c 77 61 79 73 20 72 65 73 65 74 20 74 68 65 20  lways reset the 
218a0 63 61 63 68 65 64 20 61 73 73 65 6d 62 6c 79 20  cached assembly 
218b0 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20  directory..     
218c0 20 23 20 20 20 20 20 20 20 61 6e 64 20 74 68 65   #       and the
218d0 20 63 61 63 68 65 64 20 58 4d 4c 20 63 6f 6e 66   cached XML conf
218e0 69 67 75 72 61 74 69 6f 6e 20 66 69 6c 65 20 6e  iguration file n
218f0 61 6d 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ame...      #.. 
21900 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65 53 51       if {[haveSQ
21910 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e  LiteObjectComman
21920 64 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  d]} then {..    
21930 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
21940 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65  ..          obje
21950 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73  ct invoke -flags
21960 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20   +NonPublic \.. 
21970 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73               Sys
21980 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
21990 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68  UnsafeNativeMeth
219a0 6f 64 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ods \..         
219b0 20 20 20 20 20 52 65 73 65 74 43 61 63 68 65 64       ResetCached
219c0 41 73 73 65 6d 62 6c 79 44 69 72 65 63 74 6f 72  AssemblyDirector
219d0 79 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 72 72  y..        } err
219e0 6f 72 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  or] == 0} then {
219f0 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
21a00 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
21a10 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
21a20 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d  ts $channel "---
21a30 2d 20 72 65 73 65 74 20 63 61 63 68 65 64 20 61  - reset cached a
21a40 73 73 65 6d 62 6c 79 20 64 69 72 65 63 74 6f 72  ssembly director
21a50 79 5c 6e 22 0d 0a 20 20 20 20 20 20 20 20 20 20  y\n"..          
21a60 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73  }..        } els
21a70 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69  e {..          i
21a80 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
21a90 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
21aa0 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
21ab0 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
21ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d                "=
21ad0 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69  === WARNING: fai
21ae0 6c 65 64 20 74 6f 20 72 65 73 65 74 20 63 61 63  led to reset cac
21af0 68 65 64 20 61 73 73 65 6d 62 6c 79 20 64 69 72  hed assembly dir
21b00 65 63 74 6f 72 79 2c 20 22 20 5c 0d 0a 20 20 20  ectory, " \..   
21b10 20 20 20 20 20 20 20 20 20 20 20 20 20 22 65 72               "er
21b20 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72  ror: " \n\t $err
21b30 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  or \n]..        
21b40 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
21b50 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63  ..        if {[c
21b60 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
21b70 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20    object invoke 
21b80 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69  -flags +NonPubli
21b90 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  c \..           
21ba0 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53     System.Data.S
21bb0 51 4c 69 74 65 2e 55 6e 73 61 66 65 4e 61 74 69  QLite.UnsafeNati
21bc0 76 65 4d 65 74 68 6f 64 73 20 5c 0d 0a 20 20 20  veMethods \..   
21bd0 20 20 20 20 20 20 20 20 20 20 20 52 65 73 65 74             Reset
21be0 43 61 63 68 65 64 58 6d 6c 43 6f 6e 66 69 67 46  CachedXmlConfigF
21bf0 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20  ileName..       
21c00 20 7d 20 65 72 72 6f 72 5d 20 3d 3d 20 30 7d 20   } error] == 0} 
21c10 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
21c20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
21c30 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
21c40 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
21c50 6c 20 22 2d 2d 2d 2d 20 72 65 73 65 74 20 63 61  l "---- reset ca
21c60 63 68 65 64 20 58 4d 4c 20 63 6f 6e 66 69 67 75  ched XML configu
21c70 72 61 74 69 6f 6e 20 66 69 6c 65 20 6e 61 6d 65  ration file name
21c80 5c 6e 22 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  \n"..          }
21c90 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65  ..        } else
21ca0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   {..          if
21cb0 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
21cc0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
21cd0 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
21ce0 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
21cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d               "==
21d00 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c  == WARNING: fail
21d10 65 64 20 74 6f 20 72 65 73 65 74 20 63 61 63 68  ed to reset cach
21d20 65 64 20 58 4d 4c 20 63 6f 6e 66 69 67 75 72 61  ed XML configura
21d30 74 69 6f 6e 20 22 20 5c 0d 0a 20 20 20 20 20 20  tion " \..      
21d40 20 20 20 20 20 20 20 20 20 20 22 66 69 6c 65 20            "file 
21d50 6e 61 6d 65 2c 20 65 72 72 6f 72 3a 20 22 20 5c  name, error: " \
21d60 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a  n\t $error \n]..
21d70 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
21d80 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
21d90 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
21da0 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 61 76 61    # NOTE: If ava
21db0 69 6c 61 62 6c 65 2c 20 72 65 70 6f 72 74 20 6f  ilable, report o
21dc0 6e 20 28 61 6e 64 20 70 6f 73 73 69 62 6c 79 20  n (and possibly 
21dd0 72 65 73 65 74 29 20 74 68 65 20 72 75 6e 74 69  reset) the runti
21de0 6d 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  me..      #     
21df0 20 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20    configuration 
21e00 73 74 61 74 69 73 74 69 63 73 2e 0d 0a 20 20 20  statistics...   
21e10 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
21e20 5b 68 61 76 65 53 51 4c 69 74 65 4f 62 6a 65 63  [haveSQLiteObjec
21e30 74 43 6f 6d 6d 61 6e 64 5d 20 26 26 20 5c 0d 0a  tCommand] && \..
21e40 20 20 20 20 20 20 20 20 20 20 5b 68 61 76 65 43            [haveC
21e50 6f 6e 73 74 72 61 69 6e 74 20 62 75 69 6c 64 43  onstraint buildC
21e60 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 44 65 62  onfiguration.Deb
21e70 75 67 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ug]} then {..   
21e80 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
21e90 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a  {..          obj
21ea0 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67  ect invoke -flag
21eb0 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 2d 61 6c  s +NonPublic -al
21ec0 69 61 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ias \..         
21ed0 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61       System.Data
21ee0 2e 53 51 4c 69 74 65 2e 44 65 62 75 67 44 61 74  .SQLite.DebugDat
21ef0 61 20 47 65 74 53 65 74 74 69 6e 67 52 65 61 64  a GetSettingRead
21f00 43 6f 75 6e 74 73 20 66 61 6c 73 65 0d 0a 20 20  Counts false..  
21f10 20 20 20 20 20 20 7d 20 73 65 74 74 69 6e 67 52        } settingR
21f20 65 61 64 43 6f 75 6e 74 73 5d 20 3d 3d 20 30 7d  eadCounts] == 0}
21f30 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
21f40 20 20 20 73 65 74 20 6e 61 6d 65 43 6f 75 6e 74     set nameCount
21f50 20 5b 24 73 65 74 74 69 6e 67 52 65 61 64 43 6f   [$settingReadCo
21f60 75 6e 74 73 20 43 6f 75 6e 74 5d 0d 0a 20 20 20  unts Count]..   
21f70 20 20 20 20 20 20 20 73 65 74 20 76 61 6c 75 65         set value
21f80 43 6f 75 6e 74 20 30 0d 0a 0d 0a 20 20 20 20 20  Count 0....     
21f90 20 20 20 20 20 6f 62 6a 65 63 74 20 66 6f 72 65       object fore
21fa0 61 63 68 20 2d 61 6c 69 61 73 20 70 61 69 72 20  ach -alias pair 
21fb0 24 73 65 74 74 69 6e 67 52 65 61 64 43 6f 75 6e  $settingReadCoun
21fc0 74 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ts {..          
21fd0 20 20 69 6e 63 72 20 76 61 6c 75 65 43 6f 75 6e    incr valueCoun
21fe0 74 20 5b 24 70 61 69 72 20 56 61 6c 75 65 5d 0d  t [$pair Value].
21ff0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ...            i
22000 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
22010 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
22020 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
22030 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
22040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22050 20 20 22 2d 2d 2d 2d 20 73 65 74 74 69 6e 67 20    "---- setting 
22060 5c 22 22 20 5b 24 70 61 69 72 20 4b 65 79 5d 20  \"" [$pair Key] 
22070 22 5c 22 20 77 61 73 20 72 65 61 64 20 22 20 5c  "\" was read " \
22080 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
22090 20 20 20 20 5b 24 70 61 69 72 20 56 61 6c 75 65      [$pair Value
220a0 5d 20 22 20 74 69 6d 65 73 5c 6e 22 5d 0d 0a 20  ] " times\n"].. 
220b0 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
220c0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
220d0 20 20 20 20 20 20 20 69 66 20 7b 24 72 65 73 65         if {$rese
220e0 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
220f0 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
22100 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  h {..           
22110 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65     object invoke
22120 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c   -flags +NonPubl
22130 69 63 20 2d 61 6c 69 61 73 20 5c 0d 0a 20 20 20  ic -alias \..   
22140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
22150 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
22160 65 2e 44 65 62 75 67 44 61 74 61 20 43 6c 65 61  e.DebugData Clea
22170 72 53 65 74 74 69 6e 67 52 65 61 64 43 6f 75 6e  rSettingReadCoun
22180 74 73 20 66 61 6c 73 65 0d 0a 20 20 20 20 20 20  ts false..      
22190 20 20 20 20 20 20 7d 20 65 72 72 6f 72 5d 20 3d        } error] =
221a0 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
221b0 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
221c0 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
221d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
221e0 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
221f0 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
22200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22210 20 20 22 2d 2d 2d 2d 20 72 65 73 65 74 20 73 65    "---- reset se
22220 74 74 69 6e 67 20 73 74 61 74 69 73 74 69 63 73  tting statistics
22230 20 66 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75   for the previou
22240 73 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  s " \..         
22250 20 20 20 20 20 20 20 20 20 20 20 24 6e 61 6d 65             $name
22260 43 6f 75 6e 74 20 22 20 6e 61 6d 65 73 20 61 6e  Count " names an
22270 64 20 22 20 24 76 61 6c 75 65 43 6f 75 6e 74 20  d " $valueCount 
22280 22 20 76 61 6c 75 65 73 20 72 65 61 64 5c 6e 22  " values read\n"
22290 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ]..             
222a0 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
222b0 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
222c0 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
222d0 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
222e0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
222f0 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
22300 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
22310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
22320 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61  ==== WARNING: fa
22330 69 6c 65 64 20 74 6f 20 72 65 73 65 74 20 73 65  iled to reset se
22340 74 74 69 6e 67 20 73 74 61 74 69 73 74 69 63 73  tting statistics
22350 20 66 6f 72 20 22 20 5c 0d 0a 20 20 20 20 20 20   for " \..      
22360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 74                "t
22370 68 65 20 70 72 65 76 69 6f 75 73 20 22 20 24 6e  he previous " $n
22380 61 6d 65 43 6f 75 6e 74 20 22 20 6e 61 6d 65 73  ameCount " names
22390 20 61 6e 64 20 22 20 24 76 61 6c 75 65 43 6f 75   and " $valueCou
223a0 6e 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  nt \..          
223b0 20 20 20 20 20 20 20 20 20 20 22 20 76 61 6c 75            " valu
223c0 65 73 20 72 65 61 64 2c 20 65 72 72 6f 72 3a 20  es read, error: 
223d0 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e  " \n\t $error \n
223e0 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ]..             
223f0 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
22400 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  }..          }..
22410 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
22420 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
22430 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a  {..          obj
22440 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67  ect invoke -flag
22450 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 2d 61 6c  s +NonPublic -al
22460 69 61 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ias \..         
22470 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61       System.Data
22480 2e 53 51 4c 69 74 65 2e 44 65 62 75 67 44 61 74  .SQLite.DebugDat
22490 61 20 47 65 74 53 65 74 74 69 6e 67 52 65 61 64  a GetSettingRead
224a0 43 6f 75 6e 74 73 20 74 72 75 65 0d 0a 20 20 20  Counts true..   
224b0 20 20 20 20 20 7d 20 73 65 74 74 69 6e 67 46 69       } settingFi
224c0 6c 65 52 65 61 64 43 6f 75 6e 74 73 5d 20 3d 3d  leReadCounts] ==
224d0 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
224e0 20 20 20 20 20 20 73 65 74 20 6e 61 6d 65 43 6f        set nameCo
224f0 75 6e 74 20 5b 24 73 65 74 74 69 6e 67 46 69 6c  unt [$settingFil
22500 65 52 65 61 64 43 6f 75 6e 74 73 20 43 6f 75 6e  eReadCounts Coun
22510 74 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65  t]..          se
22520 74 20 76 61 6c 75 65 43 6f 75 6e 74 20 30 0d 0a  t valueCount 0..
22530 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65  ..          obje
22540 63 74 20 66 6f 72 65 61 63 68 20 2d 61 6c 69 61  ct foreach -alia
22550 73 20 70 61 69 72 20 24 73 65 74 74 69 6e 67 46  s pair $settingF
22560 69 6c 65 52 65 61 64 43 6f 75 6e 74 73 20 7b 0d  ileReadCounts {.
22570 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 63  .            inc
22580 72 20 76 61 6c 75 65 43 6f 75 6e 74 20 5b 24 70  r valueCount [$p
22590 61 69 72 20 56 61 6c 75 65 5d 0d 0a 0d 0a 20 20  air Value]....  
225a0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24            if {!$
225b0 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
225c0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
225d0 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
225e0 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
225f0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
22600 2d 2d 20 73 65 74 74 69 6e 67 20 5c 22 22 20 5b  -- setting \"" [
22610 24 70 61 69 72 20 4b 65 79 5d 20 22 5c 22 20 77  $pair Key] "\" w
22620 61 73 20 72 65 61 64 20 22 20 5c 0d 0a 20 20 20  as read " \..   
22630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b                 [
22640 24 70 61 69 72 20 56 61 6c 75 65 5d 20 22 20 74  $pair Value] " t
22650 69 6d 65 73 20 66 72 6f 6d 20 74 68 65 20 63 6f  imes from the co
22660 6e 66 69 67 75 72 61 74 69 6f 6e 20 66 69 6c 65  nfiguration file
22670 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  \n"]..          
22680 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d    }..          }
22690 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66  ....          if
226a0 20 7b 24 72 65 73 65 74 7d 20 74 68 65 6e 20 7b   {$reset} then {
226b0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
226c0 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
226d0 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74            object
226e0 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b   invoke -flags +
226f0 4e 6f 6e 50 75 62 6c 69 63 20 2d 61 6c 69 61 73  NonPublic -alias
22700 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
22710 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74        System.Dat
22720 61 2e 53 51 4c 69 74 65 2e 44 65 62 75 67 44 61  a.SQLite.DebugDa
22730 74 61 20 43 6c 65 61 72 53 65 74 74 69 6e 67 52  ta ClearSettingR
22740 65 61 64 43 6f 75 6e 74 73 20 74 72 75 65 0d 0a  eadCounts true..
22750 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 72              } er
22760 72 6f 72 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ror] == 0} then 
22770 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
22780 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
22790 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
227a0 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
227b0 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
227c0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
227d0 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 72 65          "---- re
227e0 73 65 74 20 73 65 74 74 69 6e 67 20 73 74 61 74  set setting stat
227f0 69 73 74 69 63 73 20 66 6f 72 20 74 68 65 20 70  istics for the p
22800 72 65 76 69 6f 75 73 20 22 20 5c 0d 0a 20 20 20  revious " \..   
22810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22820 20 24 6e 61 6d 65 43 6f 75 6e 74 20 22 20 6e 61   $nameCount " na
22830 6d 65 73 20 61 6e 64 20 22 20 24 76 61 6c 75 65  mes and " $value
22840 43 6f 75 6e 74 20 22 20 76 61 6c 75 65 73 20 72  Count " values r
22850 65 61 64 20 22 20 5c 0d 0a 20 20 20 20 20 20 20  ead " \..       
22860 20 20 20 20 20 20 20 20 20 20 20 20 20 22 66 72               "fr
22870 6f 6d 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61  om the configura
22880 74 69 6f 6e 20 66 69 6c 65 5c 6e 22 5d 0d 0a 20  tion file\n"].. 
22890 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
228a0 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c              } el
228b0 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
228c0 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
228d0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
228e0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
228f0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
22900 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
22910 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d             "====
22920 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64   WARNING: failed
22930 20 74 6f 20 72 65 73 65 74 20 73 65 74 74 69 6e   to reset settin
22940 67 20 73 74 61 74 69 73 74 69 63 73 20 66 6f 72  g statistics for
22950 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   " \..          
22960 20 20 20 20 20 20 20 20 20 20 22 74 68 65 20 70            "the p
22970 72 65 76 69 6f 75 73 20 22 20 24 6e 61 6d 65 43  revious " $nameC
22980 6f 75 6e 74 20 22 20 6e 61 6d 65 73 20 61 6e 64  ount " names and
22990 20 22 20 24 76 61 6c 75 65 43 6f 75 6e 74 20 5c   " $valueCount \
229a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
229b0 20 20 20 20 20 20 22 20 76 61 6c 75 65 73 20 72        " values r
229c0 65 61 64 20 66 72 6f 6d 20 74 68 65 20 63 6f 6e  ead from the con
229d0 66 69 67 75 72 61 74 69 6f 6e 20 66 69 6c 65 2c  figuration file,
229e0 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 5c   error: " \n\t \
229f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
22a00 20 20 20 20 20 20 24 65 72 72 6f 72 20 5c 6e 5d        $error \n]
22a10 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
22a20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  }..            }
22a30 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
22a40 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
22a50 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
22a60 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65  ..          obje
22a70 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73  ct invoke -flags
22a80 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 2d 61 6c 69   +NonPublic -ali
22a90 61 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  as \..          
22aa0 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e      System.Data.
22ab0 53 51 4c 69 74 65 2e 44 65 62 75 67 44 61 74 61  SQLite.DebugData
22ac0 20 47 65 74 4f 74 68 65 72 43 6f 75 6e 74 73 0d   GetOtherCounts.
22ad0 0a 20 20 20 20 20 20 20 20 7d 20 6f 74 68 65 72  .        } other
22ae0 43 6f 75 6e 74 73 5d 20 3d 3d 20 30 7d 20 74 68  Counts] == 0} th
22af0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
22b00 73 65 74 20 6e 61 6d 65 43 6f 75 6e 74 20 5b 24  set nameCount [$
22b10 6f 74 68 65 72 43 6f 75 6e 74 73 20 43 6f 75 6e  otherCounts Coun
22b20 74 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65  t]..          se
22b30 74 20 76 61 6c 75 65 43 6f 75 6e 74 20 30 0d 0a  t valueCount 0..
22b40 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65  ..          obje
22b50 63 74 20 66 6f 72 65 61 63 68 20 2d 61 6c 69 61  ct foreach -alia
22b60 73 20 70 61 69 72 20 24 6f 74 68 65 72 43 6f 75  s pair $otherCou
22b70 6e 74 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  nts {..         
22b80 20 20 20 69 6e 63 72 20 76 61 6c 75 65 43 6f 75     incr valueCou
22b90 6e 74 20 5b 24 70 61 69 72 20 56 61 6c 75 65 5d  nt [$pair Value]
22ba0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
22bb0 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
22bc0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
22bd0 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
22be0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
22bf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22c00 20 20 20 22 2d 2d 2d 2d 20 6f 74 68 65 72 20 63     "---- other c
22c10 6f 75 6e 74 65 72 20 5c 22 22 20 5b 24 70 61 69  ounter \"" [$pai
22c20 72 20 4b 65 79 5d 20 22 5c 22 20 68 61 73 20 76  r Key] "\" has v
22c30 61 6c 75 65 20 22 20 5c 0d 0a 20 20 20 20 20 20  alue " \..      
22c40 20 20 20 20 20 20 20 20 20 20 20 20 5b 24 70 61              [$pa
22c50 69 72 20 56 61 6c 75 65 5d 20 5c 6e 5d 0d 0a 20  ir Value] \n].. 
22c60 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
22c70 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
22c80 20 20 20 20 20 20 20 69 66 20 7b 24 72 65 73 65         if {$rese
22c90 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
22ca0 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
22cb0 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  h {..           
22cc0 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65     object invoke
22cd0 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c   -flags +NonPubl
22ce0 69 63 20 2d 61 6c 69 61 73 20 5c 0d 0a 20 20 20  ic -alias \..   
22cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
22d00 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
22d10 65 2e 44 65 62 75 67 44 61 74 61 20 43 6c 65 61  e.DebugData Clea
22d20 72 4f 74 68 65 72 43 6f 75 6e 74 73 0d 0a 20 20  rOtherCounts..  
22d30 20 20 20 20 20 20 20 20 20 20 7d 20 65 72 72 6f            } erro
22d40 72 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  r] == 0} then {.
22d50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
22d60 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
22d70 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
22d80 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
22d90 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
22da0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
22db0 20 20 20 20 20 20 22 2d 2d 2d 2d 20 72 65 73 65        "---- rese
22dc0 74 20 6f 74 68 65 72 20 63 6f 75 6e 74 65 72 73  t other counters
22dd0 20 66 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75   for the previou
22de0 73 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  s " \..         
22df0 20 20 20 20 20 20 20 20 20 20 20 24 6e 61 6d 65             $name
22e00 43 6f 75 6e 74 20 22 20 6e 61 6d 65 73 20 61 6e  Count " names an
22e10 64 20 22 20 24 76 61 6c 75 65 43 6f 75 6e 74 20  d " $valueCount 
22e20 22 20 76 61 6c 75 65 73 5c 6e 22 5d 0d 0a 20 20  " values\n"]..  
22e30 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
22e40 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73             } els
22e50 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e {..           
22e60 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
22e70 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
22e80 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
22e90 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
22ea0 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
22eb0 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20            "==== 
22ec0 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20  WARNING: failed 
22ed0 74 6f 20 72 65 73 65 74 20 6f 74 68 65 72 20 63  to reset other c
22ee0 6f 75 6e 74 65 72 73 20 66 6f 72 20 22 20 5c 0d  ounters for " \.
22ef0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22f00 20 20 20 20 20 22 74 68 65 20 70 72 65 76 69 6f       "the previo
22f10 75 73 20 22 20 24 6e 61 6d 65 43 6f 75 6e 74 20  us " $nameCount 
22f20 22 20 6e 61 6d 65 73 20 61 6e 64 20 22 20 24 76  " names and " $v
22f30 61 6c 75 65 43 6f 75 6e 74 20 5c 0d 0a 20 20 20  alueCount \..   
22f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f50 20 22 20 76 61 6c 75 65 73 2c 20 65 72 72 6f 72   " values, error
22f60 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20  : " \n\t $error 
22f70 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  \n]..           
22f80 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
22f90 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d    }..          }
22fa0 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
22fb0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66     }....      if
22fc0 20 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f 62 6a   {[haveSQLiteObj
22fd0 65 63 74 43 6f 6d 6d 61 6e 64 5d 20 26 26 20 5c  ectCommand] && \
22fe0 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 68 61 76  ..          [hav
22ff0 65 53 51 4c 69 74 65 44 65 66 69 6e 65 43 6f 6e  eSQLiteDefineCon
23000 73 74 61 6e 74 20 49 4e 54 45 52 4f 50 5f 56 49  stant INTEROP_VI
23010 52 54 55 41 4c 5f 54 41 42 4c 45 5d 20 26 26 20  RTUAL_TABLE] && 
23020 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 68 61  \..          [ha
23030 76 65 53 51 4c 69 74 65 44 65 66 69 6e 65 43 6f  veSQLiteDefineCo
23040 6e 73 74 61 6e 74 20 54 52 41 43 4b 5f 4d 45 4d  nstant TRACK_MEM
23050 4f 52 59 5f 42 59 54 45 53 5d 7d 20 74 68 65 6e  ORY_BYTES]} then
23060 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   {..        if {
23070 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
23080 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
23090 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20   $channel "---- 
230a0 63 75 72 72 65 6e 74 20 6d 65 6d 6f 72 79 20 69  current memory i
230b0 6e 20 75 73 65 20 62 79 20 53 51 4c 69 74 65 4d  n use by SQLiteM
230c0 65 6d 6f 72 79 2e 2e 2e 20 22 0d 0a 20 20 20 20  emory... "..    
230d0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
230e0 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
230f0 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20           object 
23100 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e  invoke -flags +N
23110 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20  onPublic \..    
23120 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d            System
23130 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c  .Data.SQLite.SQL
23140 69 74 65 4d 65 6d 6f 72 79 20 62 79 74 65 73 41  iteMemory bytesA
23150 6c 6c 6f 63 61 74 65 64 0d 0a 20 20 20 20 20 20  llocated..      
23160 20 20 7d 20 6d 65 6d 6f 72 79 5d 20 3d 3d 20 30    } memory] == 0
23170 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
23180 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
23190 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
231a0 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
231b0 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
231c0 24 6d 65 6d 6f 72 79 20 22 20 62 79 74 65 73 5c  $memory " bytes\
231d0 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  n"]..          }
231e0 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65  ..        } else
231f0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   {..          se
23200 74 20 6d 65 6d 6f 72 79 20 75 6e 6b 6e 6f 77 6e  t memory unknown
23210 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66  ....          if
23220 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
23230 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
23240 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
23250 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72  ppendArgs $memor
23260 79 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  y \n]..         
23270 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d   }..        }...
23280 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71  .        if {!$q
23290 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
232a0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
232b0 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 6d 61 78  hannel "---- max
232c0 69 6d 75 6d 20 6d 65 6d 6f 72 79 20 69 6e 20 75  imum memory in u
232d0 73 65 20 62 79 20 53 51 4c 69 74 65 4d 65 6d 6f  se by SQLiteMemo
232e0 72 79 2e 2e 2e 20 22 0d 0a 20 20 20 20 20 20 20  ry... "..       
232f0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66   }....        if
23300 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
23310 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76        object inv
23320 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50  oke -flags +NonP
23330 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20  ublic \..       
23340 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61         System.Da
23350 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65  ta.SQLite.SQLite
23360 4d 65 6d 6f 72 79 20 6d 61 78 69 6d 75 6d 42 79  Memory maximumBy
23370 74 65 73 41 6c 6c 6f 63 61 74 65 64 0d 0a 20 20  tesAllocated..  
23380 20 20 20 20 20 20 7d 20 6d 65 6d 6f 72 79 5d 20        } memory] 
23390 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
233a0 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
233b0 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
233c0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
233d0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
233e0 72 67 73 20 24 6d 65 6d 6f 72 79 20 22 20 62 79  rgs $memory " by
233f0 74 65 73 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20  tes\n"]..       
23400 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20     }..        } 
23410 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
23420 20 20 73 65 74 20 6d 65 6d 6f 72 79 20 75 6e 6b    set memory unk
23430 6e 6f 77 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20  nown....        
23440 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
23450 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
23460 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
23470 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d  l [appendArgs $m
23480 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20 20 20  emory \n]..     
23490 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
234a0 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  }..      }....  
234b0 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
234c0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
234d0 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
234e0 22 2d 2d 2d 2d 20 63 75 72 72 65 6e 74 20 6d 65  "---- current me
234f0 6d 6f 72 79 20 69 6e 20 75 73 65 20 62 79 20 53  mory in use by S
23500 51 4c 69 74 65 2e 2e 2e 20 22 0d 0a 20 20 20 20  QLite... "..    
23510 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20    }....      if 
23520 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f 62 6a 65  {[haveSQLiteObje
23530 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65 6e  ctCommand]} then
23540 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   {..        if {
23550 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
23560 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b      object invok
23570 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62  e -flags +NonPub
23580 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  lic \..         
23590 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61       System.Data
235a0 2e 53 51 4c 69 74 65 2e 55 6e 73 61 66 65 4e 61  .SQLite.UnsafeNa
235b0 74 69 76 65 4d 65 74 68 6f 64 73 20 73 71 6c 69  tiveMethods sqli
235c0 74 65 33 5f 6d 65 6d 6f 72 79 5f 75 73 65 64 0d  te3_memory_used.
235d0 0a 20 20 20 20 20 20 20 20 7d 20 6d 65 6d 6f 72  .        } memor
235e0 79 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  y] == 0} then {.
235f0 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21  .          if {!
23600 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
23610 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
23620 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
23630 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 22  ndArgs $memory "
23640 20 62 79 74 65 73 5c 6e 22 5d 0d 0a 20 20 20 20   bytes\n"]..    
23650 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
23660 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
23670 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
23680 20 20 23 20 4e 4f 54 45 3a 20 4d 61 79 62 65 20    # NOTE: Maybe 
23690 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20  the SQLite core 
236a0 6c 69 62 72 61 72 79 20 69 73 20 75 6e 61 76 61  library is unava
236b0 69 6c 61 62 6c 65 3f 0d 0a 20 20 20 20 20 20 20  ilable?..       
236c0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
236d0 73 65 74 20 6d 65 6d 6f 72 79 20 75 6e 6b 6e 6f  set memory unkno
236e0 77 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  wn....          
236f0 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
23700 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
23710 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
23720 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d  [appendArgs $mem
23730 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ory \n]..       
23740 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
23750 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
23760 0a 20 20 20 20 20 20 20 20 73 65 74 20 6d 65 6d  .        set mem
23770 6f 72 79 20 75 6e 61 76 61 69 6c 61 62 6c 65 0d  ory unavailable.
23780 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21  ...        if {!
23790 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
237a0 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
237b0 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
237c0 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d  Args $memory \n]
237d0 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
237e0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 73 65     }....      se
237f0 74 20 72 65 73 75 6c 74 20 24 6d 65 6d 6f 72 79  t result $memory
23800 3b 20 23 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e  ; # NOTE: Return
23810 20 6d 65 6d 6f 72 79 20 69 6e 2d 75 73 65 20 74   memory in-use t
23820 6f 20 6f 75 72 20 63 61 6c 6c 65 72 2e 0d 0a 0d  o our caller....
23830 0a 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69  .      if {!$qui
23840 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
23850 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
23860 65 6c 20 22 2d 2d 2d 2d 20 6d 61 78 69 6d 75 6d  el "---- maximum
23870 20 6d 65 6d 6f 72 79 20 69 6e 20 75 73 65 20 62   memory in use b
23880 79 20 53 51 4c 69 74 65 2e 2e 2e 20 22 0d 0a 20  y SQLite... ".. 
23890 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
238a0 69 66 20 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f  if {[haveSQLiteO
238b0 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74  bjectCommand]} t
238c0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69  hen {..        i
238d0 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  f {[catch {..   
238e0 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e         object in
238f0 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e  voke -flags +Non
23900 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20  Public \..      
23910 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44          System.D
23920 61 74 61 2e 53 51 4c 69 74 65 2e 55 6e 73 61 66  ata.SQLite.Unsaf
23930 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 20 5c  eNativeMethods \
23940 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
23950 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 68  sqlite3_memory_h
23960 69 67 68 77 61 74 65 72 20 30 0d 0a 20 20 20 20  ighwater 0..    
23970 20 20 20 20 7d 20 6d 65 6d 6f 72 79 5d 20 3d 3d      } memory] ==
23980 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
23990 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
239a0 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
239b0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
239c0 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
239d0 73 20 24 6d 65 6d 6f 72 79 20 22 20 62 79 74 65  s $memory " byte
239e0 73 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20  s\n"]..         
239f0 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c   }..        } el
23a00 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
23a10 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e  #..          # N
23a20 4f 54 45 3a 20 4d 61 79 62 65 20 74 68 65 20 53  OTE: Maybe the S
23a30 51 4c 69 74 65 20 63 6f 72 65 20 6c 69 62 72 61  QLite core libra
23a40 72 79 20 69 73 20 75 6e 61 76 61 69 6c 61 62 6c  ry is unavailabl
23a50 65 3f 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  e?..          #.
23a60 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20 6d  .          set m
23a70 65 6d 6f 72 79 20 75 6e 6b 6e 6f 77 6e 0d 0a 0d  emory unknown...
23a80 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21  .          if {!
23a90 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
23aa0 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
23ab0 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
23ac0 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 5c  ndArgs $memory \
23ad0 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  n]..          }.
23ae0 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
23af0 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
23b00 20 20 20 20 73 65 74 20 6d 65 6d 6f 72 79 20 75      set memory u
23b10 6e 61 76 61 69 6c 61 62 6c 65 0d 0a 0d 0a 20 20  navailable....  
23b20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
23b30 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
23b40 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
23b50 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
23b60 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20  $memory \n]..   
23b70 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
23b80 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 63 6f  ...      if {$co
23b90 6c 6c 65 63 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  llect} then {.. 
23ba0 20 20 20 20 20 20 20 63 6f 6c 6c 65 63 74 47 61         collectGa
23bb0 72 62 61 67 65 20 24 63 68 61 6e 6e 65 6c 0d 0a  rbage $channel..
23bc0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
23bd0 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
23be0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70  en {..        tp
23bf0 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d  uts $channel "--
23c00 2d 2d 20 63 75 72 72 65 6e 74 20 6d 65 6d 6f 72  -- current memor
23c10 79 20 69 6e 20 75 73 65 20 62 79 20 74 68 65 20  y in use by the 
23c20 43 4c 52 2e 2e 2e 20 22 0d 0a 20 20 20 20 20 20  CLR... "..      
23c30 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  }....      if {[
23c40 68 61 76 65 53 51 4c 69 74 65 4f 62 6a 65 63 74  haveSQLiteObject
23c50 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65 6e 20 7b  Command]} then {
23c60 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63  ..        if {[c
23c70 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
23c80 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20    object invoke 
23c90 47 43 20 47 65 74 54 6f 74 61 6c 4d 65 6d 6f 72  GC GetTotalMemor
23ca0 79 20 66 61 6c 73 65 0d 0a 20 20 20 20 20 20 20  y false..       
23cb0 20 7d 20 6d 65 6d 6f 72 79 5d 20 3d 3d 20 30 7d   } memory] == 0}
23cc0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
23cd0 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 69     if {[string i
23ce0 73 20 69 6e 74 65 67 65 72 20 2d 73 74 72 69 63  s integer -stric
23cf0 74 20 24 6d 65 6d 6f 72 79 5d 7d 20 74 68 65 6e  t $memory]} then
23d00 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
23d10 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
23d20 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
23d30 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
23d40 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d  l [appendArgs $m
23d50 65 6d 6f 72 79 20 22 20 62 79 74 65 73 5c 6e 22  emory " bytes\n"
23d60 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ]..            }
23d70 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c  ..          } el
23d80 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
23d90 20 20 73 65 74 20 6d 65 6d 6f 72 79 20 69 6e 76    set memory inv
23da0 61 6c 69 64 0d 0a 0d 0a 20 20 20 20 20 20 20 20  alid....        
23db0 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
23dc0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
23dd0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
23de0 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
23df0 73 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20  s $memory \n].. 
23e00 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
23e10 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
23e20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
23e30 20 20 20 20 20 20 20 73 65 74 20 6d 65 6d 6f 72         set memor
23e40 79 20 75 6e 6b 6e 6f 77 6e 0d 0a 0d 0a 20 20 20  y unknown....   
23e50 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
23e60 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
23e70 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
23e80 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
23e90 67 73 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a  gs $memory \n]..
23ea0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
23eb0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20       }..      } 
23ec0 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
23ed0 73 65 74 20 6d 65 6d 6f 72 79 20 75 6e 61 76 61  set memory unava
23ee0 69 6c 61 62 6c 65 0d 0a 0d 0a 20 20 20 20 20 20  ilable....      
23ef0 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
23f00 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
23f10 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
23f20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d  [appendArgs $mem
23f30 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ory \n]..       
23f40 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20   }..      }.... 
23f50 20 20 20 20 20 72 65 74 75 72 6e 20 24 72 65 73       return $res
23f60 75 6c 74 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20  ult..    }..... 
23f70 20 20 20 70 72 6f 63 20 72 65 73 65 74 53 51 4c     proc resetSQL
23f80 69 74 65 44 69 72 65 63 74 6f 72 69 65 73 20 7b  iteDirectories {
23f90 20 63 68 61 6e 6e 65 6c 20 6e 61 74 69 76 65 20   channel native 
23fa0 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
23fb0 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65      # NOTE: Atte
23fc0 6d 70 74 20 74 6f 20 75 73 65 20 74 68 65 20 6e  mpt to use the n
23fd0 61 74 69 76 65 20 41 50 49 20 28 76 69 61 20 74  ative API (via t
23fe0 68 65 20 6d 61 6e 61 67 65 64 20 61 73 73 65 6d  he managed assem
23ff0 62 6c 79 29 3f 0d 0a 20 20 20 20 20 20 23 0d 0a  bly)?..      #..
24000 20 20 20 20 20 20 69 66 20 7b 24 6e 61 74 69 76        if {$nativ
24010 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  e} then {..     
24020 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
24030 4e 4f 54 45 3a 20 4e 6f 77 20 6d 61 6b 65 20 73  NOTE: Now make s
24040 75 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ure the database
24050 20 61 6e 64 20 74 65 6d 70 6f 72 61 72 79 20 64   and temporary d
24060 69 72 65 63 74 6f 72 69 65 73 20 61 72 65 0d 0a  irectories are..
24070 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
24080 72 65 73 65 74 20 74 68 65 69 72 20 64 65 66 61  reset their defa
24090 75 6c 74 20 76 61 6c 75 65 73 2c 20 77 68 69 63  ult values, whic
240a0 68 20 73 68 6f 75 6c 64 20 62 65 20 6e 75 6c 6c  h should be null
240b0 20 66 6f 72 20 62 6f 74 68 2e 0d 0a 20 20 20 20   for both...    
240c0 20 20 20 20 23 20 20 20 20 20 20 20 53 69 6e 63      #       Sinc
240d0 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f 77 69  e the sqlite3_wi
240e0 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72  n32_set_director
240f0 79 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 76  y function is av
24100 61 69 6c 61 62 6c 65 2c 0d 0a 20 20 20 20 20 20  ailable,..      
24110 20 20 23 20 20 20 20 20 20 20 75 73 65 20 69 74    #       use it
24120 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
24130 20 20 20 20 20 20 66 6f 72 20 7b 73 65 74 20 69        for {set i
24140 6e 64 65 78 20 31 7d 20 7b 24 69 6e 64 65 78 20  ndex 1} {$index 
24150 3c 20 33 7d 20 7b 69 6e 63 72 20 69 6e 64 65 78  < 3} {incr index
24160 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69  } {..          i
24170 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  f {[catch {..   
24180 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20           object 
24190 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e  invoke -flags +N
241a0 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20  onPublic \..    
241b0 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74              Syst
241c0 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 55  em.Data.SQLite.U
241d0 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f  nsafeNativeMetho
241e0 64 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ds \..          
241f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 77 69        sqlite3_wi
24200 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72  n32_set_director
24210 79 20 24 69 6e 64 65 78 20 6e 75 6c 6c 0d 0a 20  y $index null.. 
24220 20 20 20 20 20 20 20 20 20 7d 20 72 65 73 75 6c           } resul
24230 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  t] == 0} then {.
24240 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
24250 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
24260 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
24270 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
24280 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f 77 69   call sqlite3_wi
24290 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72  n32_set_director
242a0 79 28 22 20 24 69 6e 64 65 78 20 5c 0d 0a 20 20  y(" $index \..  
242b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2c                ",
242c0 20 6e 75 6c 6c 29 2e 2e 2e 20 6f 6b 3a 20 22 20   null)... ok: " 
242d0 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20  $result \n]..   
242e0 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
242f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
24300 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
24310 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
24320 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
24330 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f 77 69   call sqlite3_wi
24340 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72  n32_set_director
24350 79 28 22 20 24 69 6e 64 65 78 20 5c 0d 0a 20 20  y(" $index \..  
24360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2c                ",
24370 20 6e 75 6c 6c 29 2e 2e 2e 20 65 72 72 6f 72 3a   null)... error:
24380 20 22 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20   " \n\t $result 
24390 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  \n]..          }
243a0 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
243b0 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
243c0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
243d0 23 20 4e 4f 54 45 3a 20 4e 6f 77 20 6d 61 6b 65  # NOTE: Now make
243e0 20 73 75 72 65 20 74 68 65 20 64 61 74 61 62 61   sure the databa
243f0 73 65 20 61 6e 64 20 74 65 6d 70 6f 72 61 72 79  se and temporary
24400 20 64 69 72 65 63 74 6f 72 69 65 73 20 61 72 65   directories are
24410 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
24420 20 20 72 65 73 65 74 20 74 68 65 69 72 20 64 65    reset their de
24430 66 61 75 6c 74 20 76 61 6c 75 65 73 2c 20 77 68  fault values, wh
24440 69 63 68 20 73 68 6f 75 6c 64 20 62 65 20 6e 75  ich should be nu
24450 6c 6c 20 66 6f 72 20 62 6f 74 68 2e 0d 0a 20 20  ll for both...  
24460 20 20 20 20 20 20 23 20 20 20 20 20 20 20 53 69        #       Si
24470 6e 63 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f  nce the sqlite3_
24480 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74  win32_set_direct
24490 6f 72 79 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  ory function doe
244a0 73 20 6e 6f 74 0d 0a 20 20 20 20 20 20 20 20 23  s not..        #
244b0 20 20 20 20 20 20 20 61 70 70 65 61 72 20 74 6f         appear to
244c0 20 62 65 20 61 76 61 69 6c 61 62 6c 65 2c 20 75   be available, u
244d0 73 65 20 74 68 65 20 61 73 73 6f 63 69 61 74 65  se the associate
244e0 64 20 50 52 41 47 4d 41 20 63 6f 6d 6d 61 6e 64  d PRAGMA command
244f0 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  s..        #    
24500 20 20 20 69 6e 73 74 65 61 64 2e 0d 0a 20 20 20     instead...   
24510 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
24520 66 6f 72 65 61 63 68 20 64 69 72 65 63 74 6f 72  foreach director
24530 79 20 5b 6c 69 73 74 20 64 61 74 61 5f 73 74 6f  y [list data_sto
24540 72 65 5f 64 69 72 65 63 74 6f 72 79 20 74 65 6d  re_directory tem
24550 70 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72  p_store_director
24560 79 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  y] {..          
24570 73 65 74 20 73 71 6c 20 5b 61 70 70 65 6e 64 41  set sql [appendA
24580 72 67 73 20 22 50 52 41 47 4d 41 20 22 20 24 64  rgs "PRAGMA " $d
24590 69 72 65 63 74 6f 72 79 20 22 20 3d 20 5c 22 5c  irectory " = \"\
245a0 22 3b 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ";"]....        
245b0 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 65 78    if {[catch {ex
245c0 65 63 75 74 65 53 71 6c 20 24 73 71 6c 7d 20 72  ecuteSql $sql} r
245d0 65 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65  esult] == 0} the
245e0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
245f0 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
24600 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
24610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
24620 2d 2d 2d 2d 20 65 78 65 63 75 74 65 20 50 52 41  ---- execute PRA
24630 47 4d 41 20 22 20 24 64 69 72 65 63 74 6f 72 79  GMA " $directory
24640 20 22 2e 2e 2e 20 6f 6b 3a 20 5c 22 22 20 5c 0d   "... ok: \"" \.
24650 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
24660 20 24 72 65 73 75 6c 74 20 5c 22 5c 6e 5d 0d 0a   $result \"\n]..
24670 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
24680 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
24690 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
246a0 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
246b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
246c0 2d 2d 2d 20 65 78 65 63 75 74 65 20 50 52 41 47  --- execute PRAG
246d0 4d 41 20 22 20 24 64 69 72 65 63 74 6f 72 79 20  MA " $directory 
246e0 22 2e 2e 2e 20 65 72 72 6f 72 3a 20 22 20 5c 0d  "... error: " \.
246f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
24700 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e   \n\t $result \n
24710 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ]..          }..
24720 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
24730 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
24740 20 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72 53    proc checkForS
24750 51 4c 69 74 65 44 69 72 65 63 74 6f 72 69 65 73  QLiteDirectories
24760 20 7b 20 63 68 61 6e 6e 65 6c 20 7b 72 65 73 65   { channel {rese
24770 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20  t false} } {..  
24780 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
24790 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20 74 68  OTE: Check if th
247a0 65 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  e sqlite3_win32_
247b0 73 65 74 5f 64 69 72 65 63 74 6f 72 79 20 66 75  set_directory fu
247c0 6e 63 74 69 6f 6e 20 69 73 20 61 76 61 69 6c 61  nction is availa
247d0 62 6c 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ble...      #.. 
247e0 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
247f0 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  nel \..         
24800 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20   "---- checking 
24810 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20 73 71 6c  for function sql
24820 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64  ite3_win32_set_d
24830 69 72 65 63 74 6f 72 79 2e 2e 2e 20 22 0d 0a 0d  irectory... "...
24840 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
24850 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 63 61 6c  # NOTE: This cal
24860 6c 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33  l to the sqlite3
24870 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63  _win32_set_direc
24880 74 6f 72 79 20 66 75 6e 63 74 69 6f 6e 20 75 73  tory function us
24890 65 73 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20  es the..      # 
248a0 20 20 20 20 20 20 69 6e 76 61 6c 69 64 20 76 61        invalid va
248b0 6c 75 65 20 30 20 66 6f 72 20 74 68 65 20 66 69  lue 0 for the fi
248c0 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 20 54  rst argument.  T
248d0 68 69 73 20 63 6f 64 65 20 69 73 20 64 65 73 69  his code is desi
248e0 67 6e 65 64 0d 0a 20 20 20 20 20 20 23 20 20 20  gned..      #   
248f0 20 20 20 20 74 6f 20 63 68 65 63 6b 20 69 66 20      to check if 
24900 63 61 6c 6c 69 6e 67 20 74 68 65 20 66 75 6e 63  calling the func
24910 74 69 6f 6e 20 77 69 6c 6c 20 72 61 69 73 65 20  tion will raise 
24920 61 6e 20 65 78 63 65 70 74 69 6f 6e 20 28 69 2e  an exception (i.
24930 65 2e 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  e...      #     
24940 20 20 74 68 65 20 61 63 74 75 61 6c 20 72 65 73    the actual res
24950 75 6c 74 20 6f 66 20 74 68 65 20 66 75 6e 63 74  ult of the funct
24960 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74  ion does not mat
24970 74 65 72 20 61 73 20 6c 6f 6e 67 20 61 73 20 6e  ter as long as n
24980 6f 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  o..      #      
24990 20 64 69 72 65 63 74 6f 72 79 20 69 73 20 63 68   directory is ch
249a0 61 6e 67 65 64 29 2e 0d 0a 20 20 20 20 20 20 23  anged)...      #
249b0 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 73 57  ..      if {[isW
249c0 69 6e 64 6f 77 73 5d 20 26 26 20 5b 63 61 74 63  indows] && [catc
249d0 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a  h {..        obj
249e0 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67  ect invoke -flag
249f0 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a  s +NonPublic \..
24a00 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74              Syst
24a10 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 55  em.Data.SQLite.U
24a20 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f  nsafeNativeMetho
24a30 64 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ds \..          
24a40 20 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f    sqlite3_win32_
24a50 73 65 74 5f 64 69 72 65 63 74 6f 72 79 20 30 20  set_directory 0 
24a60 6e 75 6c 6c 0d 0a 20 20 20 20 20 20 7d 5d 20 3d  null..      }] =
24a70 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
24a80 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
24a90 23 20 4e 4f 54 45 3a 20 43 61 6c 6c 69 6e 67 20  # NOTE: Calling 
24aa0 74 68 65 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  the sqlite3_win3
24ab0 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79 20  2_set_directory 
24ac0 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  function does no
24ad0 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  t..        #    
24ae0 20 20 20 63 61 75 73 65 20 61 6e 20 65 78 63 65     cause an exce
24af0 70 74 69 6f 6e 3b 20 74 68 65 72 65 66 6f 72 65  ption; therefore
24b00 2c 20 69 74 20 6d 75 73 74 20 62 65 20 61 76 61  , it must be ava
24b10 69 6c 61 62 6c 65 20 28 69 2e 65 2e 0d 0a 20 20  ilable (i.e...  
24b20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 65 76        #       ev
24b30 65 6e 20 74 68 6f 75 67 68 20 69 74 20 73 68 6f  en though it sho
24b40 75 6c 64 20 72 65 74 75 72 6e 20 61 20 66 61 69  uld return a fai
24b50 6c 75 72 65 20 72 65 74 75 72 6e 20 63 6f 64 65  lure return code
24b60 20 69 6e 20 74 68 69 73 0d 0a 20 20 20 20 20 20   in this..      
24b70 20 20 23 20 20 20 20 20 20 20 63 61 73 65 29 2e    #       case).
24b80 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
24b90 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
24ba0 6e 74 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32  nt sqlite3_win32
24bb0 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79 0d 0a  _set_directory..
24bc0 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
24bd0 24 63 68 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a  $channel yes\n..
24be0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
24bf0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 44 6f 65       # NOTE: Doe
24c00 73 20 6f 75 72 20 63 61 6c 6c 65 72 20 77 61 6e  s our caller wan
24c10 74 20 74 6f 20 72 65 73 65 74 20 74 68 65 20 64  t to reset the d
24c20 69 72 65 63 74 6f 72 69 65 73 3f 0d 0a 20 20 20  irectories?..   
24c30 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
24c40 69 66 20 7b 24 72 65 73 65 74 7d 20 74 68 65 6e  if {$reset} then
24c50 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65   {..          re
24c60 73 65 74 53 51 4c 69 74 65 44 69 72 65 63 74 6f  setSQLiteDirecto
24c70 72 69 65 73 20 24 63 68 61 6e 6e 65 6c 20 74 72  ries $channel tr
24c80 75 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  ue..        }.. 
24c90 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
24ca0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
24cb0 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 0d 0a 20 20  annel no\n....  
24cc0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
24cd0 20 23 20 4e 4f 54 45 3a 20 44 6f 65 73 20 6f 75   # NOTE: Does ou
24ce0 72 20 63 61 6c 6c 65 72 20 77 61 6e 74 20 74 6f  r caller want to
24cf0 20 72 65 73 65 74 20 74 68 65 20 64 69 72 65 63   reset the direc
24d00 74 6f 72 69 65 73 3f 20 20 54 68 69 73 20 63 61  tories?  This ca
24d10 6e 20 6f 6e 6c 79 0d 0a 20 20 20 20 20 20 20 20  n only..        
24d20 23 20 20 20 20 20 20 20 62 65 20 70 65 72 66 6f  #       be perfo
24d30 72 6d 65 64 20 69 66 20 53 51 4c 69 74 65 20 69  rmed if SQLite i
24d40 73 20 6c 6f 61 64 65 64 20 61 6e 64 20 72 65 61  s loaded and rea
24d50 64 79 20 66 6f 72 20 75 73 65 20 62 79 20 74 68  dy for use by th
24d60 65 20 74 65 73 74 0d 0a 20 20 20 20 20 20 20 20  e test..        
24d70 23 20 20 20 20 20 20 20 73 75 69 74 65 2e 0d 0a  #       suite...
24d80 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
24d90 20 20 20 69 66 20 7b 24 72 65 73 65 74 20 26 26     if {$reset &&
24da0 20 5b 69 73 53 51 4c 69 74 65 52 65 61 64 79 5d   [isSQLiteReady]
24db0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
24dc0 20 20 20 20 72 65 73 65 74 53 51 4c 69 74 65 44      resetSQLiteD
24dd0 69 72 65 63 74 6f 72 69 65 73 20 24 63 68 61 6e  irectories $chan
24de0 6e 65 6c 20 66 61 6c 73 65 0d 0a 20 20 20 20 20  nel false..     
24df0 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d     }..      }...
24e00 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
24e10 23 20 4e 4f 54 45 3a 20 46 69 6e 61 6c 6c 79 2c  # NOTE: Finally,
24e20 20 73 68 6f 77 20 74 68 65 20 63 75 72 72 65 6e   show the curren
24e30 74 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 64  t value of the d
24e40 61 74 61 62 61 73 65 20 61 6e 64 20 74 65 6d 70  atabase and temp
24e50 6f 72 61 72 79 0d 0a 20 20 20 20 20 20 23 20 20  orary..      #  
24e60 20 20 20 20 20 64 69 72 65 63 74 6f 72 69 65 73       directories
24e70 2e 20 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79  .  This can only
24e80 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20 69 66   be performed if
24e90 20 53 51 4c 69 74 65 20 69 73 20 6c 6f 61 64 65   SQLite is loade
24ea0 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  d..      #      
24eb0 20 61 6e 64 20 72 65 61 64 79 20 66 6f 72 20 75   and ready for u
24ec0 73 65 20 62 79 20 74 68 65 20 74 65 73 74 20 73  se by the test s
24ed0 75 69 74 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  uite...      #..
24ee0 20 20 20 20 20 20 69 66 20 7b 5b 69 73 53 51 4c        if {[isSQL
24ef0 69 74 65 52 65 61 64 79 5d 7d 20 74 68 65 6e 20  iteReady]} then 
24f00 7b 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61  {..        forea
24f10 63 68 20 64 69 72 65 63 74 6f 72 79 20 5b 6c 69  ch directory [li
24f20 73 74 20 64 61 74 61 5f 73 74 6f 72 65 5f 64 69  st data_store_di
24f30 72 65 63 74 6f 72 79 20 74 65 6d 70 5f 73 74 6f  rectory temp_sto
24f40 72 65 5f 64 69 72 65 63 74 6f 72 79 5d 20 7b 0d  re_directory] {.
24f50 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
24f60 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
24f70 64 41 72 67 73 20 22 2d 2d 2d 2d 20 63 68 65 63  dArgs "---- chec
24f80 6b 69 6e 67 20 22 20 24 64 69 72 65 63 74 6f 72  king " $director
24f90 79 20 22 2e 2e 2e 20 22 5d 0d 0a 0d 0a 20 20 20  y "... "]....   
24fa0 20 20 20 20 20 20 20 73 65 74 20 73 71 6c 20 5b         set sql [
24fb0 61 70 70 65 6e 64 41 72 67 73 20 22 50 52 41 47  appendArgs "PRAG
24fc0 4d 41 20 22 20 24 64 69 72 65 63 74 6f 72 79 20  MA " $directory 
24fd0 5c 3b 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  \;]....         
24fe0 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 65 78 65   if {[catch {exe
24ff0 63 75 74 65 53 71 6c 20 24 73 71 6c 20 73 63 61  cuteSql $sql sca
25000 6c 61 72 7d 20 72 65 73 75 6c 74 5d 20 3d 3d 20  lar} result] == 
25010 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
25020 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
25030 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
25040 73 20 22 6f 6b 3a 20 5c 22 22 20 24 72 65 73 75  s "ok: \"" $resu
25050 6c 74 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20  lt \"\n]..      
25060 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
25070 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
25080 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
25090 41 72 67 73 20 22 65 72 72 6f 72 3a 20 22 20 5c  Args "error: " \
250a0 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d  n\t $result \n].
250b0 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
250c0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
250d0 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
250e0 70 72 6f 63 20 6c 6f 61 64 53 51 4c 69 74 65 54  proc loadSQLiteT
250f0 65 73 74 53 65 74 74 69 6e 67 73 20 7b 20 63 68  estSettings { ch
25100 61 6e 6e 65 6c 20 7b 73 75 66 66 69 78 20 22 22  annel {suffix ""
25110 7d 20 7b 71 75 69 65 74 20 66 61 6c 73 65 7d 20  } {quiet false} 
25120 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
25130 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70      # NOTE: Skip
25140 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 73 65 74   loading the set
25150 74 69 6e 67 73 20 69 66 20 74 68 65 69 72 20 75  tings if their u
25160 73 61 67 65 20 68 61 73 20 62 65 65 6e 20 64 69  sage has been di
25170 73 61 62 6c 65 64 2e 0d 0a 20 20 20 20 20 20 23  sabled...      #
25180 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e  ..      if {![in
25190 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 73  fo exists ::no(s
251a0 71 6c 69 74 65 54 65 73 74 53 65 74 74 69 6e 67  qliteTestSetting
251b0 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  s)]} then {..   
251c0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
251d0 23 20 4e 4f 54 45 3a 20 4c 6f 61 64 20 63 75 73  # NOTE: Load cus
251e0 74 6f 6d 20 70 65 72 2d 75 73 65 72 20 61 6e 64  tom per-user and
251f0 2f 6f 72 20 70 65 72 2d 68 6f 73 74 20 74 65 73  /or per-host tes
25200 74 20 73 65 74 74 69 6e 67 73 20 6e 6f 77 2e 0d  t settings now..
25210 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
25220 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
25230 69 73 74 73 20 3a 3a 74 63 6c 5f 70 6c 61 74 66  ists ::tcl_platf
25240 6f 72 6d 28 75 73 65 72 29 5d 7d 20 74 68 65 6e  orm(user)]} then
25250 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   {..          se
25260 74 20 75 73 65 72 53 65 74 74 69 6e 67 73 46 69  t userSettingsFi
25270 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69  leName [file joi
25280 6e 20 5b 67 65 74 43 6f 6d 6d 6f 6e 44 69 72 65  n [getCommonDire
25290 63 74 6f 72 79 5d 20 5c 0d 0a 20 20 20 20 20 20  ctory] \..      
252a0 20 20 20 20 20 20 20 20 5b 61 70 70 65 6e 64 41          [appendA
252b0 72 67 73 20 73 65 74 74 69 6e 67 73 20 24 73 75  rgs settings $su
252c0 66 66 69 78 20 2e 20 24 3a 3a 74 63 6c 5f 70 6c  ffix . $::tcl_pl
252d0 61 74 66 6f 72 6d 28 75 73 65 72 29 20 2e 65 61  atform(user) .ea
252e0 67 6c 65 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  gle]]....       
252f0 20 20 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69     if {[file exi
25300 73 74 73 20 24 75 73 65 72 53 65 74 74 69 6e 67  sts $userSetting
25310 73 46 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e  sFileName]} then
25320 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
25330 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
25340 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
25350 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
25360 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
25370 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25380 20 20 20 22 2d 2d 2d 2d 20 6c 6f 61 64 69 6e 67     "---- loading
25390 20 70 65 72 2d 75 73 65 72 20 74 65 73 74 20 73   per-user test s
253a0 65 74 74 69 6e 67 73 20 66 69 6c 65 20 5c 22 22  ettings file \""
253b0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
253c0 20 20 20 20 20 20 24 75 73 65 72 53 65 74 74 69        $userSetti
253d0 6e 67 73 46 69 6c 65 4e 61 6d 65 20 5c 22 2e 2e  ngsFileName \"..
253e0 2e 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  .\n]..          
253f0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
25400 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d     if {[catch {.
25410 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 75  .              u
25420 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74 20 73  plevel 1 [list s
25430 6f 75 72 63 65 20 24 75 73 65 72 53 65 74 74 69  ource $userSetti
25440 6e 67 73 46 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20  ngsFileName]..  
25450 20 20 20 20 20 20 20 20 20 20 7d 20 65 72 72 6f            } erro
25460 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  r]} then {..    
25470 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24            if {!$
25480 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
25490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
254a0 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
254b0 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
254c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
254d0 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20   "==== WARNING: 
254e0 66 61 69 6c 65 64 20 74 6f 20 6c 6f 61 64 20 70  failed to load p
254f0 65 72 2d 75 73 65 72 20 73 65 74 74 69 6e 67 73  er-user settings
25500 20 66 69 6c 65 20 5c 22 22 20 5c 0d 0a 20 20 20   file \"" \..   
25510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25520 20 24 75 73 65 72 53 65 74 74 69 6e 67 73 46 69   $userSettingsFi
25530 6c 65 4e 61 6d 65 20 22 5c 22 2c 20 65 72 72 6f  leName "\", erro
25540 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72  r: " \n\t $error
25550 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \n]..          
25560 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
25570 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
25580 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
25590 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
255a0 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
255b0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
255c0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
255d0 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
255e0 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73           "---- s
255f0 6b 69 70 70 65 64 20 6c 6f 61 64 69 6e 67 20 70  kipped loading p
25600 65 72 2d 75 73 65 72 20 74 65 73 74 20 73 65 74  er-user test set
25610 74 69 6e 67 73 20 66 69 6c 65 20 5c 22 22 20 5c  tings file \"" \
25620 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
25630 20 20 20 20 24 75 73 65 72 53 65 74 74 69 6e 67      $userSetting
25640 73 46 69 6c 65 4e 61 6d 65 20 22 5c 22 2c 20 69  sFileName "\", i
25650 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  t does not exist
25660 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  \n"]..          
25670 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d    }..          }
25680 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
25690 20 20 20 20 20 20 20 23 23 23 23 23 23 23 23 23         #########
256a0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
256b0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
256c0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
256d0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a  ##############..
256e0 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69  ..        if {[i
256f0 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 63 6c  nfo exists ::tcl
25700 5f 70 6c 61 74 66 6f 72 6d 28 68 6f 73 74 29 5d  _platform(host)]
25710 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
25720 20 20 20 20 73 65 74 20 68 6f 73 74 53 65 74 74      set hostSett
25730 69 6e 67 73 46 69 6c 65 4e 61 6d 65 20 5b 66 69  ingsFileName [fi
25740 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 43 6f 6d 6d  le join [getComm
25750 6f 6e 44 69 72 65 63 74 6f 72 79 5d 20 5c 0d 0a  onDirectory] \..
25760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 61                [a
25770 70 70 65 6e 64 41 72 67 73 20 73 65 74 74 69 6e  ppendArgs settin
25780 67 73 20 24 73 75 66 66 69 78 20 2e 20 24 3a 3a  gs $suffix . $::
25790 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 68 6f 73  tcl_platform(hos
257a0 74 29 20 2e 65 61 67 6c 65 5d 5d 0d 0a 0d 0a 20  t) .eagle]].... 
257b0 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 66 69           if {[fi
257c0 6c 65 20 65 78 69 73 74 73 20 24 68 6f 73 74 53  le exists $hostS
257d0 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 5d  ettingsFileName]
257e0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
257f0 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
25800 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
25810 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
25820 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
25830 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
25840 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6c           "---- l
25850 6f 61 64 69 6e 67 20 70 65 72 2d 68 6f 73 74 20  oading per-host 
25860 74 65 73 74 20 73 65 74 74 69 6e 67 73 20 66 69  test settings fi
25870 6c 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20  le \"" \..      
25880 20 20 20 20 20 20 20 20 20 20 20 20 24 68 6f 73              $hos
25890 74 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d  tSettingsFileNam
258a0 65 20 5c 22 2e 2e 2e 5c 6e 5d 0d 0a 20 20 20 20  e \"...\n]..    
258b0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
258c0 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61           if {[ca
258d0 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
258e0 20 20 20 20 20 75 70 6c 65 76 65 6c 20 31 20 5b       uplevel 1 [
258f0 6c 69 73 74 20 73 6f 75 72 63 65 20 24 68 6f 73  list source $hos
25900 74 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d  tSettingsFileNam
25910 65 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e]..            
25920 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b  } error]} then {
25930 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
25940 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
25950 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
25960 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
25970 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
25980 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
25990 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52         "==== WAR
259a0 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20  NING: failed to 
259b0 6c 6f 61 64 20 70 65 72 2d 68 6f 73 74 20 73 65  load per-host se
259c0 74 74 69 6e 67 73 20 66 69 6c 65 20 5c 22 22 20  ttings file \"" 
259d0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
259e0 20 20 20 20 20 20 20 24 68 6f 73 74 53 65 74 74         $hostSett
259f0 69 6e 67 73 46 69 6c 65 4e 61 6d 65 20 22 5c 22  ingsFileName "\"
25a00 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20  , error: " \n\t 
25a10 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20  $error \n]..    
25a20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
25a30 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
25a40 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
25a50 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
25a60 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
25a70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  .              t
25a80 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
25a90 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
25aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
25ab0 2d 2d 2d 2d 20 73 6b 69 70 70 65 64 20 6c 6f 61  ---- skipped loa
25ac0 64 69 6e 67 20 70 65 72 2d 68 6f 73 74 20 74 65  ding per-host te
25ad0 73 74 20 73 65 74 74 69 6e 67 73 20 66 69 6c 65  st settings file
25ae0 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20   \"" \..        
25af0 20 20 20 20 20 20 20 20 20 20 24 68 6f 73 74 53            $hostS
25b00 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 20  ettingsFileName 
25b10 22 5c 22 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74  "\", it does not
25b20 20 65 78 69 73 74 5c 6e 22 5d 0d 0a 20 20 20 20   exist\n"]..    
25b30 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
25b40 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
25b50 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  }..      }..    
25b60 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63  }.....    proc c
25b70 6f 70 79 53 61 6d 70 6c 65 44 61 74 61 62 61 73  opySampleDatabas
25b80 65 46 69 6c 65 73 20 7b 7d 20 7b 0d 0a 20 20 20  eFiles {} {..   
25b90 20 20 20 75 70 6c 65 76 65 6c 20 31 20 7b 0d 0a     uplevel 1 {..
25ba0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
25bb0 20 20 20 23 20 4e 4f 54 45 3a 20 43 6f 70 79 20     # NOTE: Copy 
25bc0 28 6f 72 20 72 65 2d 63 6f 70 79 29 20 74 68 65  (or re-copy) the
25bd0 20 72 65 66 65 72 65 6e 63 65 20 64 61 74 61 62   reference datab
25be0 61 73 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f  ase file used fo
25bf0 72 20 74 68 69 73 0d 0a 20 20 20 20 20 20 20 20  r this..        
25c00 23 20 20 20 20 20 20 20 75 6e 69 74 20 74 65 73  #       unit tes
25c10 74 20 74 6f 20 74 68 65 20 62 75 69 6c 64 20 64  t to the build d
25c20 69 72 65 63 74 6f 72 79 20 69 6e 20 63 61 73 65  irectory in case
25c30 20 69 74 20 68 61 73 20 62 65 65 6e 20 63 68 61   it has been cha
25c40 6e 67 65 64 0d 0a 20 20 20 20 20 20 20 20 23 20  nged..        # 
25c50 20 20 20 20 20 20 62 79 20 61 20 70 72 65 76 69        by a previ
25c60 6f 75 73 20 74 65 73 74 20 72 75 6e 2e 0d 0a 20  ous test run... 
25c70 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
25c80 20 20 66 69 6c 65 20 63 6f 70 79 20 2d 66 6f 72    file copy -for
25c90 63 65 20 24 6e 6f 72 74 68 77 69 6e 64 45 66 44  ce $northwindEfD
25ca0 62 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20  bFile \..       
25cb0 20 20 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67     [file join [g
25cc0 65 74 42 75 69 6c 64 44 69 72 65 63 74 6f 72 79  etBuildDirectory
25cd0 20 74 72 75 65 5d 20 5b 66 69 6c 65 20 74 61 69   true] [file tai
25ce0 6c 20 24 6e 6f 72 74 68 77 69 6e 64 45 66 44 62  l $northwindEfDb
25cf0 46 69 6c 65 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d  File]]..      }.
25d00 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
25d10 72 6f 63 20 6d 6f 76 65 54 65 73 74 4c 6f 67 46  roc moveTestLogF
25d20 69 6c 65 20 7b 20 70 61 74 68 20 7d 20 7b 0d 0a  ile { path } {..
25d30 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20        if {[info 
25d40 65 78 69 73 74 73 20 3a 3a 74 65 73 74 5f 6c 6f  exists ::test_lo
25d50 67 5d 20 26 26 20 5b 66 69 6c 65 20 65 78 69 73  g] && [file exis
25d60 74 73 20 24 3a 3a 74 65 73 74 5f 6c 6f 67 5d 7d  ts $::test_log]}
25d70 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
25d80 20 73 65 74 20 6f 6c 64 5f 74 65 73 74 5f 6c 6f   set old_test_lo
25d90 67 20 24 3a 3a 74 65 73 74 5f 6c 6f 67 0d 0a 20  g $::test_log.. 
25da0 20 20 20 20 20 20 20 73 65 74 20 6e 65 77 5f 74         set new_t
25db0 65 73 74 5f 6c 6f 67 20 5b 66 69 6c 65 20 6a 6f  est_log [file jo
25dc0 69 6e 20 24 70 61 74 68 20 5b 66 69 6c 65 20 74  in $path [file t
25dd0 61 69 6c 20 24 6f 6c 64 5f 74 65 73 74 5f 6c 6f  ail $old_test_lo
25de0 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 66  g]]....        f
25df0 69 6c 65 20 63 6f 70 79 20 24 6f 6c 64 5f 74 65  ile copy $old_te
25e00 73 74 5f 6c 6f 67 20 24 6e 65 77 5f 74 65 73 74  st_log $new_test
25e10 5f 6c 6f 67 3b 20 66 69 6c 65 20 64 65 6c 65 74  _log; file delet
25e20 65 20 24 6f 6c 64 5f 74 65 73 74 5f 6c 6f 67 0d  e $old_test_log.
25e30 0a 20 20 20 20 20 20 20 20 73 65 74 20 3a 3a 74  .        set ::t
25e40 65 73 74 5f 6c 6f 67 20 24 6e 65 77 5f 74 65 73  est_log $new_tes
25e50 74 5f 6c 6f 67 0d 0a 0d 0a 20 20 20 20 20 20 20  t_log....       
25e60 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
25e70 73 20 3a 3a 74 65 73 74 5f 6c 6f 67 5f 70 61 74  s ::test_log_pat
25e80 68 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  h]} then {..    
25e90 20 20 20 20 20 20 73 65 74 20 3a 3a 74 65 73 74        set ::test
25ea0 5f 6c 6f 67 5f 70 61 74 68 20 24 70 61 74 68 0d  _log_path $path.
25eb0 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
25ec0 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
25ed0 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
25ee0 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
25ef0 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6d 6f 76         "---- mov
25f00 65 64 20 74 65 73 74 20 6c 6f 67 20 66 72 6f 6d  ed test log from
25f10 20 5c 22 22 20 24 6f 6c 64 5f 74 65 73 74 5f 6c   \"" $old_test_l
25f20 6f 67 20 22 5c 22 20 74 6f 20 5c 22 22 20 5c 0d  og "\" to \"" \.
25f30 0a 20 20 20 20 20 20 20 20 20 20 20 20 24 6e 65  .            $ne
25f40 77 5f 74 65 73 74 5f 6c 6f 67 20 5c 22 5c 6e 5d  w_test_log \"\n]
25f50 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
25f60 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 72 75  .....    proc ru
25f70 6e 53 51 4c 69 74 65 54 65 73 74 50 72 6f 6c 6f  nSQLiteTestProlo
25f80 67 75 65 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20  gue {} {..      
25f90 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
25fa0 20 53 6b 69 70 20 72 75 6e 6e 69 6e 67 20 6f 75   Skip running ou
25fb0 72 20 63 75 73 74 6f 6d 20 70 72 6f 6c 6f 67 75  r custom prologu
25fc0 65 20 69 66 20 74 68 65 20 6d 61 69 6e 20 6f 6e  e if the main on
25fd0 65 20 68 61 73 20 62 65 65 6e 0d 0a 20 20 20 20  e has been..    
25fe0 20 20 23 20 20 20 20 20 20 20 73 6b 69 70 70 65    #       skippe
25ff0 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  d...      #..   
26000 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
26010 69 73 74 73 20 3a 3a 6e 6f 28 70 72 6f 6c 6f 67  ists ::no(prolog
26020 75 65 2e 65 61 67 6c 65 29 5d 7d 20 74 68 65 6e  ue.eagle)]} then
26030 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
26040 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53         # NOTE: S
26050 61 76 65 20 74 68 65 20 65 6e 76 69 72 6f 6e 6d  ave the environm
26060 65 6e 74 20 76 61 72 69 61 62 6c 65 73 20 74 68  ent variables th
26070 61 74 20 77 65 20 69 6e 74 65 6e 64 20 74 6f 20  at we intend to 
26080 63 68 61 6e 67 65 20 66 6f 72 0d 0a 20 20 20 20  change for..    
26090 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20      #       the 
260a0 74 65 73 74 20 73 75 69 74 65 2e 0d 0a 20 20 20  test suite...   
260b0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
260c0 73 61 76 65 45 6e 76 69 72 6f 6e 6d 65 6e 74 56  saveEnvironmentV
260d0 61 72 69 61 62 6c 65 73 20 5c 0d 0a 20 20 20 20  ariables \..    
260e0 20 20 20 20 20 20 20 20 5b 6c 69 73 74 20 49 6e          [list In
260f0 69 74 69 61 6c 69 7a 65 5f 53 51 4c 69 74 65 4c  itialize_SQLiteL
26100 6f 67 5d 20 3a 3a 74 65 73 74 53 75 69 74 65 53  og] ::testSuiteS
26110 61 76 65 64 45 6e 76 0d 0a 0d 0a 20 20 20 20 20  avedEnv....     
26120 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
26130 4e 4f 54 45 3a 20 46 6f 72 63 65 20 74 68 65 20  NOTE: Force the 
26140 6d 61 6e 61 67 65 64 20 6c 6f 67 67 69 6e 67 20  managed logging 
26150 73 75 62 73 79 73 74 65 6d 20 74 6f 20 61 74 74  subsystem to att
26160 65 6d 70 74 20 74 6f 20 69 6e 69 74 69 61 6c 69  empt to initiali
26170 7a 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ze..        #   
26180 20 20 20 20 69 74 73 65 6c 66 20 6d 6f 72 65 20      itself more 
26190 74 68 61 6e 20 6f 6e 63 65 2e 0d 0a 20 20 20 20  than once...    
261a0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73      #..        s
261b0 65 74 20 3a 3a 65 6e 76 28 49 6e 69 74 69 61 6c  et ::env(Initial
261c0 69 7a 65 5f 53 51 4c 69 74 65 4c 6f 67 29 20 31  ize_SQLiteLog) 1
261d0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
261e0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4c         # NOTE: L
261f0 6f 61 64 20 74 68 65 20 22 62 65 66 6f 72 65 2d  oad the "before-
26200 63 6f 6e 73 74 72 61 69 6e 74 73 22 20 63 75 73  constraints" cus
26210 74 6f 6d 20 70 65 72 2d 75 73 65 72 20 61 6e 64  tom per-user and
26220 2f 6f 72 20 70 65 72 2d 68 6f 73 74 0d 0a 20 20  /or per-host..  
26230 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 65        #       te
26240 73 74 20 73 65 74 74 69 6e 67 73 20 6e 6f 77 2e  st settings now.
26250 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
26260 20 20 20 20 20 75 70 6c 65 76 65 6c 20 31 20 5b       uplevel 1 [
26270 6c 69 73 74 20 6c 6f 61 64 53 51 4c 69 74 65 54  list loadSQLiteT
26280 65 73 74 53 65 74 74 69 6e 67 73 20 24 3a 3a 74  estSettings $::t
26290 65 73 74 5f 63 68 61 6e 6e 65 6c 20 2e 62 65 66  est_channel .bef
262a0 6f 72 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ore]....        
262b0 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
262c0 45 3a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20  E: Check if the 
262d0 5b 6f 62 6a 65 63 74 5d 20 63 6f 6d 6d 61 6e 64  [object] command
262e0 20 69 73 20 61 76 61 69 6c 61 62 6c 65 3b 20 69   is available; i
262f0 66 20 6e 6f 74 2c 20 61 64 64 20 73 6f 6d 65 0d  f not, add some.
26300 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
26310 20 73 68 69 6d 73 20 74 6f 20 6d 61 6b 65 20 74   shims to make t
26320 68 65 20 74 65 73 74 20 73 75 69 74 65 20 72 75  he test suite ru
26330 6e 20 73 6d 6f 6f 74 68 65 72 2e 0d 0a 20 20 20  n smoother...   
26340 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
26350 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 4f 62  checkForSQLiteOb
26360 6a 65 63 74 43 6f 6d 6d 61 6e 64 20 24 3a 3a 74  jectCommand $::t
26370 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20  est_channel.... 
26380 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
26390 20 20 23 20 4e 4f 54 45 3a 20 44 65 74 65 72 6d    # NOTE: Determ
263a0 69 6e 65 20 74 68 65 20 6e 61 6d 65 73 20 6f 66  ine the names of
263b0 20 74 68 65 20 6e 61 74 69 76 65 20 70 6c 61 74   the native plat
263c0 66 6f 72 6d 20 61 6e 64 20 61 72 63 68 69 74 65  form and archite
263d0 63 74 75 72 65 2e 0d 0a 20 20 20 20 20 20 20 20  cture...        
263e0 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 70  #..        set p
263f0 6c 61 74 66 6f 72 6d 20 5b 67 65 74 42 75 69 6c  latform [getBuil
26400 64 50 6c 61 74 66 6f 72 6d 20 74 72 75 65 5d 0d  dPlatform true].
26410 0a 20 20 20 20 20 20 20 20 73 65 74 20 61 72 63  .        set arc
26420 68 69 74 65 63 74 75 72 65 20 5b 61 72 63 68 69  hitecture [archi
26430 74 65 63 74 75 72 65 46 6f 72 50 6c 61 74 66 6f  tectureForPlatfo
26440 72 6d 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a 0d  rm $platform]...
26450 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
26460 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77      # NOTE: Show
26470 20 74 68 65 20 70 6c 61 74 66 6f 72 6d 20 61 6e   the platform an
26480 64 20 61 72 63 68 69 74 65 63 74 75 72 65 20 75  d architecture u
26490 73 65 64 20 74 6f 20 68 65 6c 70 20 6c 6f 63 61  sed to help loca
264a0 74 65 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20  te the..        
264b0 23 20 20 20 20 20 20 20 6e 61 74 69 76 65 20 62  #       native b
264c0 75 69 6c 64 20 66 69 6c 65 73 2e 0d 0a 20 20 20  uild files...   
264d0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
264e0 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
264f0 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
26500 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
26510 20 22 2d 2d 2d 2d 20 70 6c 61 74 66 6f 72 6d 20   "---- platform 
26520 66 6f 72 20 6c 6f 63 61 74 69 6e 67 20 6e 61 74  for locating nat
26530 69 76 65 20 62 75 69 6c 64 20 66 69 6c 65 73 20  ive build files 
26540 69 73 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20  is \"" \..      
26550 20 20 20 20 20 20 24 70 6c 61 74 66 6f 72 6d 20        $platform 
26560 5c 22 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  \"\n]....       
26570 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
26580 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
26590 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
265a0 20 20 22 2d 2d 2d 2d 20 61 72 63 68 69 74 65 63    "---- architec
265b0 74 75 72 65 20 66 6f 72 20 6c 6f 63 61 74 69 6e  ture for locatin
265c0 67 20 6e 61 74 69 76 65 20 62 75 69 6c 64 20 66  g native build f
265d0 69 6c 65 73 20 69 73 20 5c 22 22 20 5c 0d 0a 20  iles is \"" \.. 
265e0 20 20 20 20 20 20 20 20 20 20 20 24 61 72 63 68             $arch
265f0 69 74 65 63 74 75 72 65 20 5c 22 5c 6e 5d 0d 0a  itecture \"\n]..
26600 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
26610 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69       # NOTE: Bui
26620 6c 64 20 61 20 6c 69 73 74 20 6f 66 20 63 6f 6e  ld a list of con
26630 66 69 67 75 72 61 74 69 6f 6e 20 66 69 6c 65 73  figuration files
26640 20 74 68 61 74 20 77 65 20 68 61 6e 64 6c 65 2e   that we handle.
26650 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
26660 20 20 20 20 20 73 65 74 20 63 6f 6e 66 69 67 46       set configF
26670 69 6c 65 4e 61 6d 65 73 20 5b 6c 69 73 74 20 5c  ileNames [list \
26680 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 79  ..            Sy
26690 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
266a0 2e 64 6c 6c 2e 63 6f 6e 66 69 67 5d 0d 0a 0d 0a  .dll.config]....
266b0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
266c0 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64     # NOTE: Build
266d0 20 61 20 6c 69 73 74 20 6f 66 20 61 75 78 69 6c   a list of auxil
266e0 69 61 72 79 20 4d 61 6e 61 67 65 64 20 44 65 62  iary Managed Deb
266f0 75 67 67 69 6e 67 20 41 73 73 69 73 74 61 6e 74  ugging Assistant
26700 73 20 28 4d 44 41 29 0d 0a 20 20 20 20 20 20 20  s (MDA)..       
26710 20 23 20 20 20 20 20 20 20 63 6f 6e 66 69 67 75   #       configu
26720 72 61 74 69 6f 6e 20 66 69 6c 65 73 20 74 68 61  ration files tha
26730 74 20 77 65 20 68 61 6e 64 6c 65 2e 0d 0a 20 20  t we handle...  
26740 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
26750 20 73 65 74 20 6d 64 61 43 6f 6e 66 69 67 46 69   set mdaConfigFi
26760 6c 65 4e 61 6d 65 73 20 5b 6c 69 73 74 20 5c 0d  leNames [list \.
26770 0a 20 20 20 20 20 20 20 20 20 20 20 20 45 61 67  .            Eag
26780 6c 65 53 68 65 6c 6c 33 32 2e 65 78 65 2e 6d 64  leShell32.exe.md
26790 61 2e 63 6f 6e 66 69 67 20 49 6e 73 74 61 6c 6c  a.config Install
267a0 65 72 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e 66 69  er.exe.mda.confi
267b0 67 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  g \..           
267c0 20 74 65 73 74 2e 65 78 65 2e 6d 64 61 2e 63 6f   test.exe.mda.co
267d0 6e 66 69 67 20 74 65 73 74 6c 69 6e 71 2e 65 78  nfig testlinq.ex
267e0 65 2e 6d 64 61 2e 63 6f 6e 66 69 67 20 5c 0d 0a  e.mda.config \..
267f0 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
26800 65 66 36 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e 66  ef6.exe.mda.conf
26810 69 67 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23  ig]....        #
26820 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
26830 3a 20 42 75 69 6c 64 20 74 68 65 20 6c 69 73 74  : Build the list
26840 20 6f 66 20 65 78 74 65 72 6e 61 6c 20 66 69 6c   of external fil
26850 65 73 20 74 68 61 74 20 77 65 20 68 61 6e 64 6c  es that we handl
26860 65 2e 20 20 53 6f 6d 65 20 6f 66 0d 0a 20 20 20  e.  Some of..   
26870 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
26880 73 65 20 66 69 6c 65 73 20 6d 61 79 20 62 65 20  se files may be 
26890 6e 61 74 69 76 65 20 61 6e 64 2f 6f 72 20 6d 61  native and/or ma
268a0 6e 61 67 65 64 20 61 73 73 65 6d 62 6c 69 65 73  naged assemblies
268b0 20 74 68 61 74 20 61 72 65 0d 0a 20 20 20 20 20   that are..     
268c0 20 20 20 23 20 20 20 20 20 20 20 72 65 71 75 69     #       requi
268d0 72 65 64 20 74 6f 20 70 65 72 66 6f 72 6d 20 76  red to perform v
268e0 61 72 69 6f 75 73 20 74 65 73 74 73 2e 0d 0a 20  arious tests... 
268f0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
26900 20 20 73 65 74 20 65 78 74 65 72 6e 61 6c 46 69    set externalFi
26910 6c 65 4e 61 6d 65 73 20 5b 6c 69 73 74 20 5c 0d  leNames [list \.
26920 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69  .            [fi
26930 6c 65 20 6a 6f 69 6e 20 45 6e 74 69 74 79 46 72  le join EntityFr
26940 61 6d 65 77 6f 72 6b 20 6c 69 62 20 5b 73 74 72  amework lib [str
26950 69 6e 67 20 6d 61 70 20 5b 6c 69 73 74 20 46 78  ing map [list Fx
26960 20 22 22 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20   ""] \..        
26970 20 20 20 20 5b 73 74 72 69 6e 67 20 6d 61 70 20      [string map 
26980 5b 6c 69 73 74 20 6e 65 74 46 78 34 35 31 20 6e  [list netFx451 n
26990 65 74 46 78 34 35 20 6e 65 74 46 78 34 35 32 20  etFx45 netFx452 
269a0 6e 65 74 46 78 34 35 20 6e 65 74 46 78 34 36 20  netFx45 netFx46 
269b0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e  \..            n
269c0 65 74 46 78 34 35 20 6e 65 74 46 78 34 36 31 20  etFx45 netFx461 
269d0 6e 65 74 46 78 34 35 20 6e 65 74 46 78 34 36 32  netFx45 netFx462
269e0 20 6e 65 74 46 78 34 35 20 6e 65 74 46 78 34 37   netFx45 netFx47
269f0 20 6e 65 74 46 78 34 35 20 5c 0d 0a 20 20 20 20   netFx45 \..    
26a00 20 20 20 20 20 20 20 20 6e 65 74 46 78 34 37 31          netFx471
26a10 20 6e 65 74 46 78 34 35 20 6e 65 74 46 78 34 37   netFx45 netFx47
26a20 32 20 6e 65 74 46 78 34 35 20 6e 65 74 53 74 61  2 netFx45 netSta
26a30 6e 64 61 72 64 32 30 20 6e 65 74 46 78 34 35 5d  ndard20 netFx45]
26a40 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
26a50 5b 67 65 74 42 75 69 6c 64 4e 65 74 46 78 5d 5d  [getBuildNetFx]]
26a60 5d 20 45 6e 74 69 74 79 46 72 61 6d 65 77 6f 72  ] EntityFramewor
26a70 6b 2e 64 6c 6c 5d 5d 0d 0a 0d 0a 20 20 20 20 20  k.dll]]....     
26a80 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
26a90 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74 68 65 20  NOTE: Build the 
26aa0 6c 69 73 74 20 6f 66 20 6e 61 74 69 76 65 20 61  list of native a
26ab0 73 73 65 6d 62 6c 79 20 66 69 6c 65 73 20 74 68  ssembly files th
26ac0 61 74 20 77 65 20 68 61 6e 64 6c 65 2e 0d 0a 20  at we handle... 
26ad0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
26ae0 20 20 73 65 74 20 6e 61 74 69 76 65 46 69 6c 65    set nativeFile
26af0 4e 61 6d 65 73 20 5b 6c 69 73 74 5d 0d 0a 0d 0a  Names [list]....
26b00 20 20 20 20 20 20 20 20 65 76 61 6c 20 6c 61 70          eval lap
26b10 70 65 6e 64 20 6e 61 74 69 76 65 46 69 6c 65 4e  pend nativeFileN
26b20 61 6d 65 73 20 5b 67 65 74 4e 61 74 69 76 65 4c  ames [getNativeL
26b30 69 62 72 61 72 79 46 69 6c 65 4e 61 6d 65 73 4f  ibraryFileNamesO
26b40 6e 6c 79 5d 0d 0a 20 20 20 20 20 20 20 20 65 76  nly]..        ev
26b50 61 6c 20 6c 61 70 70 65 6e 64 20 6e 61 74 69 76  al lappend nativ
26b60 65 46 69 6c 65 4e 61 6d 65 73 20 5b 67 65 74 49  eFileNames [getI
26b70 6e 74 65 72 6f 70 41 73 73 65 6d 62 6c 79 46 69  nteropAssemblyFi
26b80 6c 65 4e 61 6d 65 73 4f 6e 6c 79 5d 0d 0a 0d 0a  leNamesOnly]....
26b90 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
26ba0 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64     # NOTE: Build
26bb0 20 74 68 65 20 6c 69 73 74 20 6f 66 20 6d 69 78   the list of mix
26bc0 65 64 2d 6d 6f 64 65 20 61 73 73 65 6d 62 6c 79  ed-mode assembly
26bd0 20 66 69 6c 65 73 20 74 68 61 74 20 77 65 20 68   files that we h
26be0 61 6e 64 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20  andle...        
26bf0 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 6d  #..        set m
26c00 69 78 65 64 46 69 6c 65 4e 61 6d 65 73 20 5b 6c  ixedFileNames [l
26c10 69 73 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ist]....        
26c20 69 66 20 7b 5b 68 61 73 52 75 6e 74 69 6d 65 4f  if {[hasRuntimeO
26c30 70 74 69 6f 6e 20 6e 61 74 69 76 65 5d 7d 20 74  ption native]} t
26c40 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
26c50 20 6c 61 70 70 65 6e 64 20 6d 69 78 65 64 46 69   lappend mixedFi
26c60 6c 65 4e 61 6d 65 73 20 53 79 73 74 65 6d 2e 44  leNames System.D
26c70 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 0d 0a  ata.SQLite.dll..
26c80 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
26c90 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
26ca0 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74 68  # NOTE: Build th
26cb0 65 20 6c 69 73 74 20 6f 66 20 6d 61 6e 61 67 65  e list of manage
26cc0 64 20 61 73 73 65 6d 62 6c 79 20 66 69 6c 65 73  d assembly files
26cd0 20 74 68 61 74 20 77 65 20 68 61 6e 64 6c 65 2e   that we handle.
26ce0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
26cf0 20 20 20 20 20 73 65 74 20 6d 61 6e 61 67 65 64       set managed
26d00 46 69 6c 65 4e 61 6d 65 73 20 5b 6c 69 73 74 20  FileNames [list 
26d10 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 53  \..            S
26d20 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
26d30 65 2e 4c 69 6e 71 2e 64 6c 6c 20 53 79 73 74 65  e.Linq.dll Syste
26d40 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 45 46  m.Data.SQLite.EF
26d50 36 2e 64 6c 6c 5d 0d 0a 0d 0a 20 20 20 20 20 20  6.dll]....      
26d60 20 20 69 66 20 7b 21 5b 68 61 73 52 75 6e 74 69    if {![hasRunti
26d70 6d 65 4f 70 74 69 6f 6e 20 6e 61 74 69 76 65 5d  meOption native]
26d80 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
26d90 20 20 20 20 6c 61 70 70 65 6e 64 20 6d 61 6e 61      lappend mana
26da0 67 65 64 46 69 6c 65 4e 61 6d 65 73 20 53 79 73  gedFileNames Sys
26db0 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
26dc0 64 6c 6c 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  dll..        }..
26dd0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
26de0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f       # NOTE: Sho
26df0 77 20 74 68 65 20 76 61 72 69 6f 75 73 20 6c 69  w the various li
26e00 73 74 73 20 6f 66 20 66 69 6c 65 20 6e 61 6d 65  sts of file name
26e10 73 20 74 68 61 74 20 61 72 65 20 68 61 6e 64 6c  s that are handl
26e20 65 64 20 62 79 20 74 68 69 73 0d 0a 20 20 20 20  ed by this..    
26e30 20 20 20 20 23 20 20 20 20 20 20 20 70 72 6f 63      #       proc
26e40 65 64 75 72 65 2e 0d 0a 20 20 20 20 20 20 20 20  edure...        
26e50 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  #..        tputs
26e60 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
26e70 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
26e80 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
26e90 2d 20 6c 69 73 74 20 6f 66 20 5c 22 63 6f 6e 66  - list of \"conf
26ea0 69 67 75 72 61 74 69 6f 6e 5c 22 20 66 69 6c 65  iguration\" file
26eb0 20 6e 61 6d 65 73 20 69 73 3a 20 22 20 5c 0d 0a   names is: " \..
26ec0 20 20 20 20 20 20 20 20 20 20 20 20 24 63 6f 6e              $con
26ed0 66 69 67 46 69 6c 65 4e 61 6d 65 73 20 5c 6e 5d  figFileNames \n]
26ee0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74  ....        tput
26ef0 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
26f00 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
26f10 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d  .            "--
26f20 2d 2d 20 6c 69 73 74 20 6f 66 20 5c 22 4d 44 41  -- list of \"MDA
26f30 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 5c 22   configuration\"
26f40 20 66 69 6c 65 20 6e 61 6d 65 73 20 69 73 3a 20   file names is: 
26f50 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
26f60 20 24 6d 64 61 43 6f 6e 66 69 67 46 69 6c 65 4e   $mdaConfigFileN
26f70 61 6d 65 73 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20  ames \n]....    
26f80 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
26f90 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
26fa0 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
26fb0 20 20 20 20 20 22 2d 2d 2d 2d 20 6c 69 73 74 20       "---- list 
26fc0 6f 66 20 5c 22 65 78 74 65 72 6e 61 6c 5c 22 20  of \"external\" 
26fd0 66 69 6c 65 20 6e 61 6d 65 73 20 69 73 3a 20 22  file names is: "
26fe0 20 24 65 78 74 65 72 6e 61 6c 46 69 6c 65 4e 61   $externalFileNa
26ff0 6d 65 73 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20  mes \n]....     
27000 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
27010 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
27020 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
27030 20 20 20 20 22 2d 2d 2d 2d 20 6c 69 73 74 20 6f      "---- list o
27040 66 20 5c 22 6e 61 74 69 76 65 5c 22 20 66 69 6c  f \"native\" fil
27050 65 20 6e 61 6d 65 73 20 69 73 3a 20 22 20 24 6e  e names is: " $n
27060 61 74 69 76 65 46 69 6c 65 4e 61 6d 65 73 20 5c  ativeFileNames \
27070 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 70  n]....        tp
27080 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
27090 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
270a0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  \..            "
270b0 2d 2d 2d 2d 20 6c 69 73 74 20 6f 66 20 5c 22 6d  ---- list of \"m
270c0 69 78 65 64 5c 22 20 66 69 6c 65 20 6e 61 6d 65  ixed\" file name
270d0 73 20 69 73 3a 20 22 20 24 6d 69 78 65 64 46 69  s is: " $mixedFi
270e0 6c 65 4e 61 6d 65 73 20 5c 6e 5d 0d 0a 0d 0a 20  leNames \n].... 
270f0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
27100 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
27110 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
27120 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6c 69          "---- li
27130 73 74 20 6f 66 20 5c 22 6d 61 6e 61 67 65 64 5c  st of \"managed\
27140 22 20 66 69 6c 65 20 6e 61 6d 65 73 20 69 73 3a  " file names is:
27150 20 22 20 24 6d 61 6e 61 67 65 64 46 69 6c 65 4e   " $managedFileN
27160 61 6d 65 73 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20  ames \n]....    
27170 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
27180 20 4e 4f 54 45 3a 20 52 65 6d 6f 76 65 20 61 6e   NOTE: Remove an
27190 79 20 74 65 73 74 20 63 6f 6e 73 74 72 61 69 6e  y test constrain
271a0 74 73 20 74 68 61 74 20 72 65 66 65 72 20 74 6f  ts that refer to
271b0 20 74 68 65 20 6e 61 74 69 76 65 20 61 6e 64 2f   the native and/
271c0 6f 72 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  or..        #   
271d0 20 20 20 20 6d 61 6e 61 67 65 64 20 61 73 73 65      managed asse
271e0 6d 62 6c 79 20 66 69 6c 65 73 20 74 68 61 74 20  mbly files that 
271f0 77 65 20 68 61 6e 64 6c 65 20 75 6e 6c 65 73 73  we handle unless
27200 20 66 6f 72 62 69 64 64 65 6e 20 66 72 6f 6d 0d   forbidden from.
27210 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
27220 20 64 6f 69 6e 67 20 73 6f 2e 0d 0a 20 20 20 20   doing so...    
27230 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69      #..        i
27240 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
27250 20 3a 3a 6e 6f 28 73 71 6c 69 74 65 52 65 6d 6f   ::no(sqliteRemo
27260 76 65 43 6f 6e 73 74 72 61 69 6e 74 73 29 5d 7d  veConstraints)]}
27270 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
27280 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e     foreach fileN
27290 61 6d 65 20 24 63 6f 6e 66 69 67 46 69 6c 65 4e  ame $configFileN
272a0 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20  ames {..        
272b0 20 20 20 20 72 65 6d 6f 76 65 43 6f 6e 73 74 72      removeConstr
272c0 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
272d0 20 66 69 6c 65 5f 20 24 66 69 6c 65 4e 61 6d 65   file_ $fileName
272e0 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ]..          }..
272f0 0d 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 65  ..          fore
27300 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6d 64  ach fileName $md
27310 61 43 6f 6e 66 69 67 46 69 6c 65 4e 61 6d 65 73  aConfigFileNames
27320 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
27330 72 65 6d 6f 76 65 43 6f 6e 73 74 72 61 69 6e 74  removeConstraint
27340 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c   [appendArgs fil
27350 65 5f 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20  e_ $fileName].. 
27360 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
27370 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
27380 66 69 6c 65 4e 61 6d 65 20 24 65 78 74 65 72 6e  fileName $extern
27390 61 6c 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20  alFileNames {.. 
273a0 20 20 20 20 20 20 20 20 20 20 20 72 65 6d 6f 76             remov
273b0 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70  eConstraint [app
273c0 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5b 66  endArgs file_ [f
273d0 69 6c 65 20 74 61 69 6c 20 24 66 69 6c 65 4e 61  ile tail $fileNa
273e0 6d 65 5d 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  me]]..          
273f0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 66  }....          f
27400 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20  oreach fileName 
27410 24 6e 61 74 69 76 65 46 69 6c 65 4e 61 6d 65 73  $nativeFileNames
27420 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
27430 72 65 6d 6f 76 65 43 6f 6e 73 74 72 61 69 6e 74  removeConstraint
27440 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c   [appendArgs fil
27450 65 5f 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20  e_ $fileName].. 
27460 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
27470 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
27480 66 69 6c 65 4e 61 6d 65 20 24 6d 69 78 65 64 46  fileName $mixedF
27490 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20  ileNames {..    
274a0 20 20 20 20 20 20 20 20 72 65 6d 6f 76 65 43 6f          removeCo
274b0 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64  nstraint [append
274c0 41 72 67 73 20 66 69 6c 65 5f 20 24 66 69 6c 65  Args file_ $file
274d0 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20 20 20 20  Name]..         
274e0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
274f0 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65  foreach fileName
27500 20 24 6d 61 6e 61 67 65 64 46 69 6c 65 4e 61 6d   $managedFileNam
27510 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  es {..          
27520 20 20 72 65 6d 6f 76 65 43 6f 6e 73 74 72 61 69    removeConstrai
27530 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66  nt [appendArgs f
27540 69 6c 65 5f 20 24 66 69 6c 65 4e 61 6d 65 5d 0d  ile_ $fileName].
27550 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
27560 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
27570 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
27580 4e 4f 54 45 3a 20 53 6b 69 70 20 61 6c 6c 20 53  NOTE: Skip all S
27590 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
275a0 65 20 72 65 6c 61 74 65 64 20 66 69 6c 65 20 68  e related file h
275b0 61 6e 64 6c 69 6e 67 20 28 64 65 6c 65 74 69 6e  andling (deletin
275c0 67 2c 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  g,..        #   
275d0 20 20 20 20 63 6f 70 79 69 6e 67 2c 20 61 6e 64      copying, and
275e0 20 6c 6f 61 64 69 6e 67 29 20 69 66 20 69 6e 73   loading) if ins
275f0 74 72 75 63 74 65 64 2e 0d 0a 20 20 20 20 20 20  tructed...      
27600 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20    #..        if 
27610 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
27620 3a 6e 6f 28 73 71 6c 69 74 65 46 69 6c 65 73 29  :no(sqliteFiles)
27630 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
27640 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
27650 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20 74    # NOTE: Skip t
27660 72 79 69 6e 67 20 74 6f 20 64 65 6c 65 74 65 20  rying to delete 
27670 61 6e 79 20 66 69 6c 65 73 20 69 66 20 69 6e 73  any files if ins
27680 74 72 75 63 74 65 64 2e 0d 0a 20 20 20 20 20 20  tructed...      
27690 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
276a0 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
276b0 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71  ts ::no(deleteSq
276c0 6c 69 74 65 46 69 6c 65 73 29 5d 7d 20 74 68 65  liteFiles)]} the
276d0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
276e0 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
276f0 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71  ts ::no(deleteSq
27700 6c 69 74 65 43 6f 6e 66 69 67 46 69 6c 65 73 29  liteConfigFiles)
27710 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
27720 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
27730 20 66 69 6c 65 4e 61 6d 65 20 24 63 6f 6e 66 69   fileName $confi
27740 67 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20  gFileNames {..  
27750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72                tr
27760 79 44 65 6c 65 74 65 42 69 6e 61 72 79 46 69 6c  yDeleteBinaryFil
27770 65 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20  e $fileName..   
27780 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
27790 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
277a0 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
277b0 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
277c0 6f 28 64 65 6c 65 74 65 53 71 6c 69 74 65 45 78  o(deleteSqliteEx
277d0 74 65 72 6e 61 6c 46 69 6c 65 73 29 5d 7d 20 74  ternalFiles)]} t
277e0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
277f0 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c       foreach fil
27800 65 4e 61 6d 65 20 24 6d 64 61 43 6f 6e 66 69 67  eName $mdaConfig
27810 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20  FileNames {..   
27820 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79               try
27830 44 65 6c 65 74 65 42 75 69 6c 64 46 69 6c 65 20  DeleteBuildFile 
27840 24 66 69 6c 65 4e 61 6d 65 20 66 61 6c 73 65 0d  $fileName false.
27850 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
27860 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
27870 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61    foreach fileNa
27880 6d 65 20 24 65 78 74 65 72 6e 61 6c 46 69 6c 65  me $externalFile
27890 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20  Names {..       
278a0 20 20 20 20 20 20 20 20 20 74 72 79 44 65 6c 65           tryDele
278b0 74 65 42 69 6e 61 72 79 46 69 6c 65 20 24 66 69  teBinaryFile $fi
278c0 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20  leName..        
278d0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
278e0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
278f0 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
27900 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c   exists ::no(del
27910 65 74 65 53 71 6c 69 74 65 4e 61 74 69 76 65 46  eteSqliteNativeF
27920 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  iles)]} then {..
27930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
27940 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
27950 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69 74  ::no(deleteSqlit
27960 65 49 6d 70 6c 69 63 69 74 4e 61 74 69 76 65 46  eImplicitNativeF
27970 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  iles)]} then {..
27980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27990 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65  foreach fileName
279a0 20 24 6e 61 74 69 76 65 46 69 6c 65 4e 61 6d 65   $nativeFileName
279b0 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s {..           
279c0 20 20 20 20 20 20 20 74 72 79 44 65 6c 65 74 65         tryDelete
279d0 41 73 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61  Assembly $fileNa
279e0 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  me..            
279f0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
27a00 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
27a10 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
27a20 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64  fo exists ::no(d
27a30 65 6c 65 74 65 53 71 6c 69 74 65 4e 6f 6e 49 6d  eleteSqliteNonIm
27a40 70 6c 69 63 69 74 46 69 6c 65 73 29 5d 7d 20 74  plicitFiles)]} t
27a50 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
27a60 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
27a70 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65  o exists ::no(de
27a80 6c 65 74 65 53 71 6c 69 74 65 50 6c 61 74 66 6f  leteSqlitePlatfo
27a90 72 6d 46 69 6c 65 73 29 5d 20 26 26 20 5c 0d 0a  rmFiles)] && \..
27aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27ab0 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67      [string leng
27ac0 74 68 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3e 20  th $platform] > 
27ad0 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
27ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
27af0 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6e  each fileName $n
27b00 61 74 69 76 65 46 69 6c 65 4e 61 6d 65 73 20 7b  ativeFileNames {
27b10 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
27b20 20 20 20 20 20 20 74 72 79 44 65 6c 65 74 65 41        tryDeleteA
27b30 73 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61 6d  ssembly $fileNam
27b40 65 20 24 70 6c 61 74 66 6f 72 6d 0d 0a 20 20 20  e $platform..   
27b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
27b60 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
27b70 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
27b80 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
27b90 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65  o exists ::no(de
27ba0 6c 65 74 65 53 71 6c 69 74 65 41 72 63 68 69 74  leteSqliteArchit
27bb0 65 63 74 75 72 65 46 69 6c 65 73 29 5d 20 26 26  ectureFiles)] &&
27bc0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
27bd0 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20          [string 
27be0 6c 65 6e 67 74 68 20 24 61 72 63 68 69 74 65 63  length $architec
27bf0 74 75 72 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20  ture] > 0} then 
27c00 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
27c10 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c       foreach fil
27c20 65 4e 61 6d 65 20 24 6e 61 74 69 76 65 46 69 6c  eName $nativeFil
27c30 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20  eNames {..      
27c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72                tr
27c50 79 44 65 6c 65 74 65 41 73 73 65 6d 62 6c 79 20  yDeleteAssembly 
27c60 24 66 69 6c 65 4e 61 6d 65 20 24 61 72 63 68 69  $fileName $archi
27c70 74 65 63 74 75 72 65 0d 0a 20 20 20 20 20 20 20  tecture..       
27c80 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
27c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
27ca0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
27cb0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
27cc0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ...            i
27cd0 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
27ce0 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69   ::no(deleteSqli
27cf0 74 65 4d 69 78 65 64 46 69 6c 65 73 29 5d 7d 20  teMixedFiles)]} 
27d00 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
27d10 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
27d20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49         # NOTE: I
27d30 66 20 74 68 65 20 22 6e 61 74 69 76 65 22 20 72  f the "native" r
27d40 75 6e 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73  untime option is
27d50 20 73 65 74 2c 20 64 65 6c 65 74 65 20 69 6d 70   set, delete imp
27d60 6c 69 63 69 74 0d 0a 20 20 20 20 20 20 20 20 20  licit..         
27d70 20 20 20 20 20 23 20 20 20 20 20 20 20 6d 69 78       #       mix
27d80 65 64 2d 6d 6f 64 65 20 61 73 73 65 6d 62 6c 79  ed-mode assembly
27d90 20 66 69 6c 65 73 20 61 73 20 77 65 6c 6c 2e 20   files as well. 
27da0 20 54 68 69 73 20 72 75 6e 74 69 6d 65 20 6f 70   This runtime op
27db0 74 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20 20 20  tion..          
27dc0 20 20 20 20 23 20 20 20 20 20 20 20 63 68 65 63      #       chec
27dd0 6b 20 69 73 20 68 61 6e 64 6c 65 64 20 77 68 65  k is handled whe
27de0 6e 20 62 75 69 6c 64 69 6e 67 20 74 68 65 20 6c  n building the l
27df0 69 73 74 20 6f 66 20 6d 69 78 65 64 2d 6d 6f 64  ist of mixed-mod
27e00 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e..             
27e10 20 23 20 20 20 20 20 20 20 61 73 73 65 6d 62 6c   #       assembl
27e20 79 20 66 69 6c 65 20 6e 61 6d 65 73 2e 0d 0a 20  y file names... 
27e30 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a               #..
27e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
27e50 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
27e60 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69 74  ::no(deleteSqlit
27e70 65 49 6d 70 6c 69 63 69 74 4d 69 78 65 64 46 69  eImplicitMixedFi
27e80 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  les)]} then {.. 
27e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
27ea0 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20  oreach fileName 
27eb0 24 6d 69 78 65 64 46 69 6c 65 4e 61 6d 65 73 20  $mixedFileNames 
27ec0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
27ed0 20 20 20 20 20 74 72 79 44 65 6c 65 74 65 41 73       tryDeleteAs
27ee0 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61 6d 65  sembly $fileName
27ef0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
27f00 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
27f10 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
27f20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
27f30 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c   exists ::no(del
27f40 65 74 65 53 71 6c 69 74 65 4e 6f 6e 49 6d 70 6c  eteSqliteNonImpl
27f50 69 63 69 74 46 69 6c 65 73 29 5d 7d 20 74 68 65  icitFiles)]} the
27f60 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
27f70 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
27f80 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65  exists ::no(dele
27f90 74 65 53 71 6c 69 74 65 50 6c 61 74 66 6f 72 6d  teSqlitePlatform
27fa0 46 69 6c 65 73 29 5d 20 26 26 20 5c 0d 0a 20 20  Files)] && \..  
27fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27fc0 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
27fd0 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3e 20 30 7d   $platform] > 0}
27fe0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
27ff0 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61             forea
28000 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6d 69 78  ch fileName $mix
28010 65 64 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20  edFileNames {.. 
28020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28030 20 20 20 74 72 79 44 65 6c 65 74 65 41 73 73 65     tryDeleteAsse
28040 6d 62 6c 79 20 24 66 69 6c 65 4e 61 6d 65 20 24  mbly $fileName $
28050 70 6c 61 74 66 6f 72 6d 0d 0a 20 20 20 20 20 20  platform..      
28060 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
28070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
28080 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
28090 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
280a0 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74  xists ::no(delet
280b0 65 53 71 6c 69 74 65 41 72 63 68 69 74 65 63 74  eSqliteArchitect
280c0 75 72 65 46 69 6c 65 73 29 5d 20 26 26 20 5c 0d  ureFiles)] && \.
280d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
280e0 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
280f0 67 74 68 20 24 61 72 63 68 69 74 65 63 74 75 72  gth $architectur
28100 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  e] > 0} then {..
28110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28120 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61    foreach fileNa
28130 6d 65 20 24 6d 69 78 65 64 46 69 6c 65 4e 61 6d  me $mixedFileNam
28140 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  es {..          
28150 20 20 20 20 20 20 20 20 20 20 74 72 79 44 65 6c            tryDel
28160 65 74 65 41 73 73 65 6d 62 6c 79 20 24 66 69 6c  eteAssembly $fil
28170 65 4e 61 6d 65 20 24 61 72 63 68 69 74 65 63 74  eName $architect
28180 75 72 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ure..           
28190 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
281a0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
281b0 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
281c0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
281d0 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
281e0 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
281f0 6f 28 64 65 6c 65 74 65 53 71 6c 69 74 65 4d 61  o(deleteSqliteMa
28200 6e 61 67 65 64 46 69 6c 65 73 29 5d 7d 20 74 68  nagedFiles)]} th
28210 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
28220 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65      foreach file
28230 4e 61 6d 65 20 24 6d 61 6e 61 67 65 64 46 69 6c  Name $managedFil
28240 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20  eNames {..      
28250 20 20 20 20 20 20 20 20 20 20 74 72 79 44 65 6c            tryDel
28260 65 74 65 41 73 73 65 6d 62 6c 79 20 24 66 69 6c  eteAssembly $fil
28270 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 20  eName..         
28280 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
28290 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
282a0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
282b0 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e  #..          # N
282c0 4f 54 45 3a 20 43 68 65 63 6b 20 66 6f 72 20 74  OTE: Check for t
282d0 68 65 20 22 61 75 74 6f 53 65 6c 65 63 74 22 20  he "autoSelect" 
282e0 72 75 6e 74 69 6d 65 20 6f 70 74 69 6f 6e 2e 20  runtime option. 
282f0 20 49 66 20 70 72 65 73 65 6e 74 2c 0d 0a 20 20   If present,..  
28300 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
28310 61 74 74 65 6d 70 74 20 74 6f 20 61 75 74 6f 6d  attempt to autom
28320 61 74 69 63 61 6c 6c 79 20 73 65 6c 65 63 74 20  atically select 
28330 74 68 65 20 66 69 72 73 74 20 61 76 61 69 6c 61  the first availa
28340 62 6c 65 0d 0a 20 20 20 20 20 20 20 20 20 20 23  ble..          #
28350 20 20 20 20 20 20 20 62 75 69 6c 64 20 28 6f 72         build (or
28360 20 22 72 65 6c 65 61 73 65 22 29 20 6f 66 20 53   "release") of S
28370 51 4c 69 74 65 20 61 6e 64 20 53 79 73 74 65 6d  QLite and System
28380 2e 44 61 74 61 2e 53 51 4c 69 74 65 0d 0a 20 20  .Data.SQLite..  
28390 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
283a0 66 6f 72 20 75 73 65 20 77 69 74 68 20 74 68 65  for use with the
283b0 20 74 65 73 74 20 73 75 69 74 65 2e 0d 0a 20 20   test suite...  
283c0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
283d0 20 20 20 20 20 69 66 20 7b 5b 68 61 73 52 75 6e       if {[hasRun
283e0 74 69 6d 65 4f 70 74 69 6f 6e 20 61 75 74 6f 53  timeOption autoS
283f0 65 6c 65 63 74 5d 7d 20 74 68 65 6e 20 7b 0d 0a  elect]} then {..
28400 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
28410 21 5b 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65  ![checkForSQLite
28420 42 75 69 6c 64 73 20 24 3a 3a 74 65 73 74 5f 63  Builds $::test_c
28430 68 61 6e 6e 65 6c 20 74 72 75 65 5d 7d 20 74 68  hannel true]} th
28440 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
28450 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51 4c 69      checkForSQLi
28460 74 65 52 65 6c 65 61 73 65 73 20 24 3a 3a 74 65  teReleases $::te
28470 73 74 5f 63 68 61 6e 6e 65 6c 20 74 72 75 65 0d  st_channel true.
28480 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
28490 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
284a0 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
284b0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b        # NOTE: Sk
284c0 69 70 20 74 72 79 69 6e 67 20 74 6f 20 76 65 72  ip trying to ver
284d0 69 66 79 20 74 68 65 20 62 75 69 6c 64 20 64 69  ify the build di
284e0 72 65 63 74 6f 72 79 20 69 66 20 69 6e 73 74 72  rectory if instr
284f0 75 63 74 65 64 3b 0d 0a 20 20 20 20 20 20 20 20  ucted;..        
28500 20 20 23 20 20 20 20 20 20 20 6f 74 68 65 72 77    #       otherw
28510 69 73 65 2c 20 6d 61 6b 65 20 73 75 72 65 20 69  ise, make sure i
28520 74 20 61 63 74 75 61 6c 6c 79 20 65 78 69 73 74  t actually exist
28530 73 20 6f 72 20 68 61 6c 74 20 74 68 65 20 65 6e  s or halt the en
28540 74 69 72 65 0d 0a 20 20 20 20 20 20 20 20 20 20  tire..          
28550 23 20 20 20 20 20 20 20 74 65 73 74 69 6e 67 20  #       testing 
28560 70 72 6f 63 65 73 73 20 69 66 20 69 74 20 64 6f  process if it do
28570 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 0d 0a 20  es not exist... 
28580 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
28590 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
285a0 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 76 65 72   exists ::no(ver
285b0 69 66 79 42 75 69 6c 64 44 69 72 65 63 74 6f 72  ifyBuildDirector
285c0 79 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  y)]} then {..   
285d0 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
285e0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
285f0 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74  At this point, t
28600 68 65 20 62 75 69 6c 64 20 64 69 72 65 63 74 6f  he build directo
28610 72 69 65 73 20 4d 55 53 54 20 65 78 69 73 74 20  ries MUST exist 
28620 66 6f 72 0d 0a 20 20 20 20 20 20 20 20 20 20 20  for..           
28630 20 23 20 20 20 20 20 20 20 74 68 65 20 74 65 73   #       the tes
28640 74 69 6e 67 20 70 72 6f 63 65 73 73 20 74 6f 20  ting process to 
28650 63 6f 6e 74 69 6e 75 65 2e 0d 0a 20 20 20 20 20  continue...     
28660 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
28670 20 20 20 20 20 20 73 65 74 20 64 69 72 65 63 74        set direct
28680 6f 72 79 20 5b 67 65 74 42 75 69 6c 64 44 69 72  ory [getBuildDir
28690 65 63 74 6f 72 79 20 66 61 6c 73 65 5d 0d 0a 0d  ectory false]...
286a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
286b0 7b 21 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24  {![file exists $
286c0 64 69 72 65 63 74 6f 72 79 5d 20 7c 7c 20 5c 0d  directory] || \.
286d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
286e0 20 21 5b 66 69 6c 65 20 69 73 64 69 72 65 63 74   ![file isdirect
286f0 6f 72 79 20 24 64 69 72 65 63 74 6f 72 79 5d 7d  ory $directory]}
28700 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
28710 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
28720 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
28730 4a 75 73 74 20 70 72 69 6f 72 20 74 6f 20 61 63  Just prior to ac
28740 74 75 61 6c 6c 79 20 68 61 6c 74 69 6e 67 20 74  tually halting t
28750 68 65 20 74 65 73 74 69 6e 67 20 70 72 6f 63 65  he testing proce
28760 73 73 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ss,..           
28770 20 20 20 23 20 20 20 20 20 20 20 61 64 64 20 61     #       add a
28780 6e 20 65 72 72 6f 72 20 74 6f 20 74 68 65 20 74  n error to the t
28790 65 73 74 20 6c 6f 67 20 66 69 6c 65 2e 0d 0a 20  est log file... 
287a0 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a               #..
287b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70                tp
287c0 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
287d0 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
287e0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
287f0 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 75 6c 64       "---- could
28800 20 6e 6f 74 20 76 65 72 69 66 79 20 6e 61 74 69   not verify nati
28810 76 65 20 62 75 69 6c 64 20 64 69 72 65 63 74 6f  ve build directo
28820 72 79 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20  ry \"" \..      
28830 20 20 20 20 20 20 20 20 20 20 20 20 24 64 69 72              $dir
28840 65 63 74 6f 72 79 20 22 5c 22 2c 20 61 6c 6c 20  ectory "\", all 
28850 74 65 73 74 69 6e 67 20 68 61 6c 74 65 64 5c 6e  testing halted\n
28860 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  "]....          
28870 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
28880 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 61 69       # NOTE: Rai
28890 73 69 6e 67 20 61 20 73 63 72 69 70 74 20 65 72  sing a script er
288a0 72 6f 72 20 66 72 6f 6d 20 74 68 69 73 20 70 6f  ror from this po
288b0 69 6e 74 20 73 68 6f 75 6c 64 20 68 61 6c 74 0d  int should halt.
288c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
288d0 20 20 20 20 20 20 20 74 68 65 20 74 65 73 74 69         the testi
288e0 6e 67 20 70 72 6f 63 65 73 73 2e 0d 0a 20 20 20  ng process...   
288f0 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
28900 20 20 20 20 20 20 20 20 20 20 20 20 65 72 72 6f              erro
28910 72 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  r [appendArgs \.
28920 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
28930 20 20 20 22 63 6f 75 6c 64 20 6e 6f 74 20 76 65     "could not ve
28940 72 69 66 79 20 6e 61 74 69 76 65 20 62 75 69 6c  rify native buil
28950 64 20 64 69 72 65 63 74 6f 72 79 20 5c 22 22 20  d directory \"" 
28960 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
28970 20 20 20 20 20 24 64 69 72 65 63 74 6f 72 79 20       $directory 
28980 22 5c 22 2c 20 61 6c 6c 20 74 65 73 74 69 6e 67  "\", all testing
28990 20 68 61 6c 74 65 64 22 5d 0d 0a 20 20 20 20 20   halted"]..     
289a0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
289b0 20 20 20 20 20 20 20 20 73 65 74 20 64 69 72 65          set dire
289c0 63 74 6f 72 79 20 5b 67 65 74 42 75 69 6c 64 44  ctory [getBuildD
289d0 69 72 65 63 74 6f 72 79 20 74 72 75 65 5d 0d 0a  irectory true]..
289e0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
289f0 20 7b 21 5b 66 69 6c 65 20 65 78 69 73 74 73 20   {![file exists 
28a00 24 64 69 72 65 63 74 6f 72 79 5d 20 7c 7c 20 5c  $directory] || \
28a10 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
28a20 20 20 21 5b 66 69 6c 65 20 69 73 64 69 72 65 63    ![file isdirec
28a30 74 6f 72 79 20 24 64 69 72 65 63 74 6f 72 79 5d  tory $directory]
28a40 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
28a50 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
28a60 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
28a70 20 4a 75 73 74 20 70 72 69 6f 72 20 74 6f 20 61   Just prior to a
28a80 63 74 75 61 6c 6c 79 20 68 61 6c 74 69 6e 67 20  ctually halting 
28a90 74 68 65 20 74 65 73 74 69 6e 67 20 70 72 6f 63  the testing proc
28aa0 65 73 73 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  ess,..          
28ab0 20 20 20 20 23 20 20 20 20 20 20 20 61 64 64 20      #       add 
28ac0 61 6e 20 65 72 72 6f 72 20 74 6f 20 74 68 65 20  an error to the 
28ad0 74 65 73 74 20 6c 6f 67 20 66 69 6c 65 2e 0d 0a  test log file...
28ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
28af0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  .              t
28b00 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
28b10 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
28b20 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
28b30 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 75 6c        "---- coul
28b40 64 20 6e 6f 74 20 76 65 72 69 66 79 20 6d 61 6e  d not verify man
28b50 61 67 65 64 20 62 75 69 6c 64 20 64 69 72 65 63  aged build direc
28b60 74 6f 72 79 20 5c 22 22 20 5c 0d 0a 20 20 20 20  tory \"" \..    
28b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24 64                $d
28b80 69 72 65 63 74 6f 72 79 20 22 5c 22 2c 20 61 6c  irectory "\", al
28b90 6c 20 74 65 73 74 69 6e 67 20 68 61 6c 74 65 64  l testing halted
28ba0 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  \n"]....        
28bb0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
28bc0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52         # NOTE: R
28bd0 61 69 73 69 6e 67 20 61 20 73 63 72 69 70 74 20  aising a script 
28be0 65 72 72 6f 72 20 66 72 6f 6d 20 74 68 69 73 20  error from this 
28bf0 70 6f 69 6e 74 20 73 68 6f 75 6c 64 20 68 61 6c  point should hal
28c00 74 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t..             
28c10 20 23 20 20 20 20 20 20 20 74 68 65 20 74 65 73   #       the tes
28c20 74 69 6e 67 20 70 72 6f 63 65 73 73 2e 0d 0a 20  ting process... 
28c30 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a               #..
28c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 72                er
28c50 72 6f 72 20 5b 61 70 70 65 6e 64 41 72 67 73 20  ror [appendArgs 
28c60 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
28c70 20 20 20 20 20 22 63 6f 75 6c 64 20 6e 6f 74 20       "could not 
28c80 76 65 72 69 66 79 20 6d 61 6e 61 67 65 64 20 62  verify managed b
28c90 75 69 6c 64 20 64 69 72 65 63 74 6f 72 79 20 5c  uild directory \
28ca0 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  "" \..          
28cb0 20 20 20 20 20 20 20 20 24 64 69 72 65 63 74 6f          $directo
28cc0 72 79 20 22 5c 22 2c 20 61 6c 6c 20 74 65 73 74  ry "\", all test
28cd0 69 6e 67 20 68 61 6c 74 65 64 22 5d 0d 0a 20 20  ing halted"]..  
28ce0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
28cf0 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 6c             set l
28d00 6f 67 44 69 72 65 63 74 6f 72 79 20 24 64 69 72  ogDirectory $dir
28d10 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 20 20  ectory..        
28d20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
28d30 20 20 20 20 20 20 20 20 73 65 74 20 6c 6f 67 44          set logD
28d40 69 72 65 63 74 6f 72 79 20 5b 67 65 74 42 75 69  irectory [getBui
28d50 6c 64 44 69 72 65 63 74 6f 72 79 20 74 72 75 65  ldDirectory true
28d60 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ]..          }..
28d70 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
28d80 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
28d90 20 57 65 27 72 65 20 67 6f 69 6e 67 20 74 6f 20   We're going to 
28da0 6d 6f 76 65 20 74 68 65 20 74 65 73 74 20 6c 6f  move the test lo
28db0 67 20 66 69 6c 65 20 74 6f 20 74 68 65 20 64 69  g file to the di
28dc0 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 20  rectory..       
28dd0 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e 74 61     #       conta
28de0 69 6e 69 6e 67 20 74 68 65 20 6d 61 6e 61 67 65  ining the manage
28df0 64 20 61 73 73 65 6d 62 6c 69 65 73 20 62 65 69  d assemblies bei
28e00 6e 67 20 74 65 73 74 65 64 2e 0d 0a 20 20 20 20  ng tested...    
28e10 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
28e20 20 20 20 6d 6f 76 65 54 65 73 74 4c 6f 67 46 69     moveTestLogFi
28e30 6c 65 20 24 6c 6f 67 44 69 72 65 63 74 6f 72 79  le $logDirectory
28e40 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  ....          #.
28e50 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
28e60 45 3a 20 53 6b 69 70 20 74 72 79 69 6e 67 20 74  E: Skip trying t
28e70 6f 20 63 6f 70 79 20 61 6e 79 20 66 69 6c 65 73  o copy any files
28e80 20 69 66 20 69 6e 73 74 72 75 63 74 65 64 2e 0d   if instructed..
28e90 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
28ea0 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
28eb0 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63  fo exists ::no(c
28ec0 6f 70 79 53 71 6c 69 74 65 46 69 6c 65 73 29 5d  opySqliteFiles)]
28ed0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
28ee0 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
28ef0 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70   exists ::no(cop
28f00 79 53 71 6c 69 74 65 43 6f 6e 66 69 67 46 69 6c  ySqliteConfigFil
28f10 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  es)]} then {..  
28f20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
28f30 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
28f40 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  l \..           
28f50 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 70         "---- cop
28f60 79 69 6e 67 20 5c 22 63 6f 6e 66 69 67 75 72 61  ying \"configura
28f70 74 69 6f 6e 5c 22 20 66 69 6c 65 73 2e 2e 2e 5c  tion\" files...\
28f80 6e 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  n"....          
28f90 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65      foreach file
28fa0 4e 61 6d 65 20 24 63 6f 6e 66 69 67 46 69 6c 65  Name $configFile
28fb0 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20  Names {..       
28fc0 20 20 20 20 20 20 20 20 20 74 72 79 43 6f 70 79           tryCopy
28fd0 42 75 69 6c 64 46 69 6c 65 20 24 66 69 6c 65 4e  BuildFile $fileN
28fe0 61 6d 65 20 66 61 6c 73 65 0d 0a 20 20 20 20 20  ame false..     
28ff0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
29000 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
29010 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69           if {![i
29020 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
29030 63 6f 70 79 53 71 6c 69 74 65 45 78 74 65 72 6e  copySqliteExtern
29040 61 6c 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20  alFiles)]} then 
29050 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
29060 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
29070 20 20 23 20 4e 4f 54 45 3a 20 43 6f 70 79 20 74    # NOTE: Copy t
29080 68 65 20 4d 61 6e 61 67 65 64 20 44 65 62 75 67  he Managed Debug
29090 67 69 6e 67 20 41 73 73 69 73 74 61 6e 74 73 20  ging Assistants 
290a0 28 4d 44 41 29 20 63 6f 6e 66 69 67 75 72 61 74  (MDA) configurat
290b0 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ion..           
290c0 20 20 20 23 20 20 20 20 20 20 20 66 69 6c 65 20     #       file 
290d0 66 6f 72 20 74 68 65 20 45 61 67 6c 65 20 73 68  for the Eagle sh
290e0 65 6c 6c 20 74 6f 20 74 68 65 20 62 75 69 6c 64  ell to the build
290f0 20 6f 75 74 70 75 74 20 64 69 72 65 63 74 6f 72   output director
29100 79 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  y,..            
29110 20 20 23 20 20 20 20 20 20 20 77 68 69 6c 65 20    #       while 
29120 75 73 69 6e 67 20 65 61 63 68 20 6f 66 20 74 68  using each of th
29130 65 20 6e 61 6d 65 73 20 6f 66 20 74 68 65 20 76  e names of the v
29140 61 72 69 6f 75 73 20 6c 65 67 61 63 79 20 74 65  arious legacy te
29150 73 74 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  st..            
29160 20 20 23 20 20 20 20 20 20 20 65 78 65 63 75 74    #       execut
29170 61 62 6c 65 73 2e 20 20 54 68 69 73 20 77 69 6c  ables.  This wil
29180 6c 20 68 65 6c 70 20 74 6f 20 6d 61 6b 65 20 73  l help to make s
29190 75 72 65 20 74 68 61 74 20 61 6c 6c 20 74 68 65  ure that all the
291a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
291b0 23 20 20 20 20 20 20 20 6c 65 67 61 63 79 20 74  #       legacy t
291c0 65 73 74 73 20 72 75 6e 20 77 69 74 68 20 65 78  ests run with ex
291d0 61 63 74 6c 79 20 74 68 65 20 73 61 6d 65 20 73  actly the same s
291e0 65 74 20 6f 66 20 4d 61 6e 61 67 65 64 0d 0a 20  et of Managed.. 
291f0 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20               #  
29200 20 20 20 20 20 44 65 62 75 67 67 69 6e 67 20 41       Debugging A
29210 73 73 69 73 74 61 6e 74 73 20 63 6f 6e 66 69 67  ssistants config
29220 75 72 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 20  ured...         
29230 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
29240 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
29250 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20  est_channel \.. 
29260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29270 20 22 2d 2d 2d 2d 20 63 6f 70 79 69 6e 67 20 5c   "---- copying \
29280 22 4d 44 41 20 63 6f 6e 66 69 67 75 72 61 74 69  "MDA configurati
29290 6f 6e 5c 22 20 66 69 6c 65 73 2e 2e 2e 5c 6e 22  on\" files...\n"
292a0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
292b0 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61    foreach fileNa
292c0 6d 65 20 24 6d 64 61 43 6f 6e 66 69 67 46 69 6c  me $mdaConfigFil
292d0 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20  eNames {..      
292e0 20 20 20 20 20 20 20 20 20 20 74 72 79 43 6f 70            tryCop
292f0 79 42 69 6e 61 72 79 46 69 6c 65 20 45 61 67 6c  yBinaryFile Eagl
29300 65 53 68 65 6c 6c 2e 65 78 65 2e 6d 64 61 2e 63  eShell.exe.mda.c
29310 6f 6e 66 69 67 20 74 72 75 65 20 22 22 20 24 66  onfig true "" $f
29320 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20  ileName..       
29330 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
29340 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
29350 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
29360 45 3a 20 43 6f 70 79 20 74 68 65 20 65 78 74 65  E: Copy the exte
29370 72 6e 61 6c 20 62 69 6e 61 72 69 65 73 2c 20 69  rnal binaries, i
29380 66 20 61 6e 79 2c 20 74 6f 20 74 68 65 20 64 69  f any, to the di
29390 72 65 63 74 6f 72 79 20 74 68 61 74 0d 0a 20 20  rectory that..  
293a0 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20              #   
293b0 20 20 20 20 63 6f 6e 74 61 69 6e 73 20 74 68 65      contains the
293c0 20 45 61 67 6c 65 20 73 68 65 6c 6c 2e 20 20 54   Eagle shell.  T
293d0 68 69 73 20 69 73 20 74 79 70 69 63 61 6c 6c 79  his is typically
293e0 20 75 73 65 64 20 74 6f 20 6d 61 6b 65 0d 0a 20   used to make.. 
293f0 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20               #  
29400 20 20 20 20 20 73 75 72 65 20 61 73 73 65 6d 62       sure assemb
29410 6c 69 65 73 20 72 65 66 65 72 65 6e 63 65 64 20  lies referenced 
29420 62 79 20 74 68 65 20 6f 6e 65 73 20 62 65 69 6e  by the ones bein
29430 67 20 74 65 73 74 65 64 20 61 72 65 0d 0a 20 20  g tested are..  
29440 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20              #   
29450 20 20 20 20 61 76 61 69 6c 61 62 6c 65 20 64 75      available du
29460 72 69 6e 67 20 74 68 65 20 74 65 73 74 69 6e 67  ring the testing
29470 20 70 72 6f 63 65 73 73 2e 0d 0a 20 20 20 20 20   process...     
29480 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
29490 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
294a0 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
294b0 22 2d 2d 2d 2d 20 63 6f 70 79 69 6e 67 20 5c 22  "---- copying \"
294c0 65 78 74 65 72 6e 61 6c 5c 22 20 66 69 6c 65 73  external\" files
294d0 2e 2e 2e 5c 6e 22 0d 0a 0d 0a 20 20 20 20 20 20  ...\n"....      
294e0 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
294f0 66 69 6c 65 4e 61 6d 65 20 24 65 78 74 65 72 6e  fileName $extern
29500 61 6c 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20  alFileNames {.. 
29510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
29520 72 79 43 6f 70 79 45 78 74 65 72 6e 61 6c 46 69  ryCopyExternalFi
29530 6c 65 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20  le $fileName..  
29540 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
29550 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
29560 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
29570 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
29580 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65 4e 61 74  no(copySqliteNat
29590 69 76 65 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e  iveFiles)]} then
295a0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
295b0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
295c0 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 74 68     # NOTE: If th
295d0 65 20 74 65 73 74 20 70 6c 61 74 66 6f 72 6d 20  e test platform 
295e0 69 73 20 6c 69 6b 65 6c 79 20 74 68 65 20 64 65  is likely the de
295f0 66 61 75 6c 74 20 66 6f 72 20 74 68 69 73 0d 0a  fault for this..
29600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
29610 20 20 20 20 20 20 6d 61 63 68 69 6e 65 2c 20 61        machine, a
29620 6c 73 6f 20 74 72 79 20 74 6f 20 63 6f 70 79 20  lso try to copy 
29630 74 68 65 20 6e 61 74 69 76 65 20 66 69 6c 65 73  the native files
29640 20 74 6f 20 74 68 65 0d 0a 20 20 20 20 20 20 20   to the..       
29650 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62         #       b
29660 69 6e 61 72 79 20 6c 6f 63 61 74 69 6f 6e 2e 0d  inary location..
29670 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
29680 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
29690 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
296a0 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74  s ::no(copySqlit
296b0 65 49 6d 70 6c 69 63 69 74 4e 61 74 69 76 65 46  eImplicitNativeF
296c0 69 6c 65 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20  iles)] && \..   
296d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b                 [
296e0 69 73 44 65 66 61 75 6c 74 42 75 69 6c 64 50 6c  isDefaultBuildPl
296f0 61 74 66 6f 72 6d 5d 7d 20 74 68 65 6e 20 7b 0d  atform]} then {.
29700 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
29710 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
29720 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20  hannel \..      
29730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
29740 2d 2d 2d 20 63 6f 70 79 69 6e 67 20 69 6d 70 6c  --- copying impl
29750 69 63 69 74 20 5c 22 6e 61 74 69 76 65 5c 22 20  icit \"native\" 
29760 66 69 6c 65 73 2e 2e 2e 5c 6e 22 0d 0a 0d 0a 20  files...\n".... 
29770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
29780 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20  oreach fileName 
29790 24 6e 61 74 69 76 65 46 69 6c 65 4e 61 6d 65 73  $nativeFileNames
297a0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
297b0 20 20 20 20 20 20 74 72 79 43 6f 70 79 41 73 73        tryCopyAss
297c0 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61 6d 65 20  embly $fileName 
297d0 66 61 6c 73 65 0d 0a 20 20 20 20 20 20 20 20 20  false..         
297e0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
297f0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
29800 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
29810 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
29820 6f 28 63 6f 70 79 53 71 6c 69 74 65 4e 6f 6e 49  o(copySqliteNonI
29830 6d 70 6c 69 63 69 74 46 69 6c 65 73 29 5d 7d 20  mplicitFiles)]} 
29840 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
29850 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
29860 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63  fo exists ::no(c
29870 6f 70 79 53 71 6c 69 74 65 50 6c 61 74 66 6f 72  opySqlitePlatfor
29880 6d 46 69 6c 65 73 29 5d 20 26 26 20 5c 0d 0a 20  mFiles)] && \.. 
29890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
298a0 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74     [string lengt
298b0 68 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3e 20 30  h $platform] > 0
298c0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
298d0 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
298e0 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
298f0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
29900 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
29910 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 70         "---- cop
29920 79 69 6e 67 20 5c 22 6e 61 74 69 76 65 5c 22 20  ying \"native\" 
29930 66 69 6c 65 73 20 66 6f 72 20 70 6c 61 74 66 6f  files for platfo
29940 72 6d 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20  rm \"" \..      
29950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29960 24 70 6c 61 74 66 6f 72 6d 20 5c 22 2e 2e 2e 5c  $platform \"...\
29970 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  n]....          
29980 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
29990 66 69 6c 65 4e 61 6d 65 20 24 6e 61 74 69 76 65  fileName $native
299a0 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20  FileNames {..   
299b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
299c0 20 74 72 79 43 6f 70 79 41 73 73 65 6d 62 6c 79   tryCopyAssembly
299d0 20 24 66 69 6c 65 4e 61 6d 65 20 66 61 6c 73 65   $fileName false
299e0 20 24 70 6c 61 74 66 6f 72 6d 0d 0a 20 20 20 20   $platform..    
299f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
29a00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
29a10 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
29a20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
29a30 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70   exists ::no(cop
29a40 79 53 71 6c 69 74 65 41 72 63 68 69 74 65 63 74  ySqliteArchitect
29a50 75 72 65 46 69 6c 65 73 29 5d 20 26 26 20 5c 0d  ureFiles)] && \.
29a60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
29a70 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
29a80 67 74 68 20 24 61 72 63 68 69 74 65 63 74 75 72  gth $architectur
29a90 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  e] > 0} then {..
29aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29ab0 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
29ac0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
29ad0 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
29ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
29af0 2d 2d 20 63 6f 70 79 69 6e 67 20 5c 22 6e 61 74  -- copying \"nat
29b00 69 76 65 5c 22 20 66 69 6c 65 73 20 66 6f 72 20  ive\" files for 
29b10 61 72 63 68 69 74 65 63 74 75 72 65 20 5c 22 22  architecture \""
29b20 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
29b30 20 20 20 20 20 20 20 20 20 20 24 61 72 63 68 69            $archi
29b40 74 65 63 74 75 72 65 20 5c 22 2e 2e 2e 5c 6e 5d  tecture \"...\n]
29b50 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
29b60 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69        foreach fi
29b70 6c 65 4e 61 6d 65 20 24 6e 61 74 69 76 65 46 69  leName $nativeFi
29b80 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20  leNames {..     
29b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
29ba0 72 79 43 6f 70 79 41 73 73 65 6d 62 6c 79 20 24  ryCopyAssembly $
29bb0 66 69 6c 65 4e 61 6d 65 20 66 61 6c 73 65 20 24  fileName false $
29bc0 61 72 63 68 69 74 65 63 74 75 72 65 0d 0a 20 20  architecture..  
29bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29be0 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  }..             
29bf0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
29c00 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
29c10 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
29c20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
29c30 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53  xists ::no(copyS
29c40 71 6c 69 74 65 4d 69 78 65 64 46 69 6c 65 73 29  qliteMixedFiles)
29c50 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
29c60 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
29c70 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
29c80 3a 20 49 66 20 74 68 65 20 22 6e 61 74 69 76 65  : If the "native
29c90 22 20 72 75 6e 74 69 6d 65 20 6f 70 74 69 6f 6e  " runtime option
29ca0 20 69 73 20 73 65 74 2c 20 63 6f 70 79 20 69 6d   is set, copy im
29cb0 70 6c 69 63 69 74 0d 0a 20 20 20 20 20 20 20 20  plicit..        
29cc0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6d 69        #       mi
29cd0 78 65 64 2d 6d 6f 64 65 20 61 73 73 65 6d 62 6c  xed-mode assembl
29ce0 79 20 66 69 6c 65 73 20 61 73 20 77 65 6c 6c 2e  y files as well.
29cf0 20 20 54 68 65 20 72 75 6e 74 69 6d 65 20 6f 70    The runtime op
29d00 74 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20 20 20  tion..          
29d10 20 20 20 20 23 20 20 20 20 20 20 20 63 68 65 63      #       chec
29d20 6b 20 69 73 20 68 61 6e 64 6c 65 64 20 77 68 65  k is handled whe
29d30 6e 20 62 75 69 6c 64 69 6e 67 20 74 68 65 20 6c  n building the l
29d40 69 73 74 20 6f 66 20 6d 69 78 65 64 2d 6d 6f 64  ist of mixed-mod
29d50 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e..             
29d60 20 23 20 20 20 20 20 20 20 61 73 73 65 6d 62 6c   #       assembl
29d70 79 20 66 69 6c 65 20 6e 61 6d 65 73 2e 0d 0a 20  y file names... 
29d80 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a               #..
29d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
29da0 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
29db0 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65 49  ::no(copySqliteI
29dc0 6d 70 6c 69 63 69 74 4d 69 78 65 64 46 69 6c 65  mplicitMixedFile
29dd0 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  s)]} then {..   
29de0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
29df0 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
29e00 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  el \..          
29e10 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
29e20 63 6f 70 79 69 6e 67 20 69 6d 70 6c 69 63 69 74  copying implicit
29e30 20 5c 22 6d 69 78 65 64 5c 22 20 66 69 6c 65 73   \"mixed\" files
29e40 2e 2e 2e 5c 6e 22 0d 0a 0d 0a 20 20 20 20 20 20  ...\n"....      
29e50 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63            foreac
29e60 68 20 66 69 6c 65 4e 61 6d 65 20 24 6d 69 78 65  h fileName $mixe
29e70 64 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20  dFileNames {..  
29e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29e90 74 72 79 43 6f 70 79 41 73 73 65 6d 62 6c 79 20  tryCopyAssembly 
29ea0 24 66 69 6c 65 4e 61 6d 65 20 66 61 6c 73 65 0d  $fileName false.
29eb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
29ec0 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
29ed0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
29ee0 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
29ef0 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79  exists ::no(copy
29f00 53 71 6c 69 74 65 4e 6f 6e 49 6d 70 6c 69 63 69  SqliteNonImplici
29f10 74 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b  tFiles)]} then {
29f20 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
29f30 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
29f40 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c  sts ::no(copySql
29f50 69 74 65 50 6c 61 74 66 6f 72 6d 46 69 6c 65 73  itePlatformFiles
29f60 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  )] && \..       
29f70 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 73 74               [st
29f80 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 70 6c 61  ring length $pla
29f90 74 66 6f 72 6d 5d 20 3e 20 30 7d 20 74 68 65 6e  tform] > 0} then
29fa0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
29fb0 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
29fc0 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
29fd0 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
29fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29ff0 20 22 2d 2d 2d 2d 20 63 6f 70 79 69 6e 67 20 5c   "---- copying \
2a000 22 6d 69 78 65 64 5c 22 20 66 69 6c 65 73 20 66  "mixed\" files f
2a010 6f 72 20 70 6c 61 74 66 6f 72 6d 20 5c 22 22 20  or platform \"" 
2a020 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
2a030 20 20 20 20 20 20 20 20 20 24 70 6c 61 74 66 6f           $platfo
2a040 72 6d 20 5c 22 2e 2e 2e 5c 6e 5d 0d 0a 0d 0a 20  rm \"...\n].... 
2a050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a060 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d   foreach fileNam
2a070 65 20 24 6d 69 78 65 64 46 69 6c 65 4e 61 6d 65  e $mixedFileName
2a080 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s {..           
2a090 20 20 20 20 20 20 20 20 20 74 72 79 43 6f 70 79           tryCopy
2a0a0 41 73 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61  Assembly $fileNa
2a0b0 6d 65 20 66 61 6c 73 65 20 24 70 6c 61 74 66 6f  me false $platfo
2a0c0 72 6d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  rm..            
2a0d0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
2a0e0 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
2a0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
2a100 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
2a110 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65 41  ::no(copySqliteA
2a120 72 63 68 69 74 65 63 74 75 72 65 46 69 6c 65 73  rchitectureFiles
2a130 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  )] && \..       
2a140 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 73 74               [st
2a150 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 61 72 63  ring length $arc
2a160 68 69 74 65 63 74 75 72 65 5d 20 3e 20 30 7d 20  hitecture] > 0} 
2a170 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
2a180 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
2a190 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
2a1a0 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
2a1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a1c0 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 70 79 69       "---- copyi
2a1d0 6e 67 20 5c 22 6d 69 78 65 64 5c 22 20 66 69 6c  ng \"mixed\" fil
2a1e0 65 73 20 66 6f 72 20 61 72 63 68 69 74 65 63 74  es for architect
2a1f0 75 72 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20  ure \"" \..     
2a200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a210 20 24 61 72 63 68 69 74 65 63 74 75 72 65 20 5c   $architecture \
2a220 22 2e 2e 2e 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20  "...\n]....     
2a230 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
2a240 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6d  each fileName $m
2a250 69 78 65 64 46 69 6c 65 4e 61 6d 65 73 20 7b 0d  ixedFileNames {.
2a260 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2a270 20 20 20 20 20 74 72 79 43 6f 70 79 41 73 73 65       tryCopyAsse
2a280 6d 62 6c 79 20 24 66 69 6c 65 4e 61 6d 65 20 66  mbly $fileName f
2a290 61 6c 73 65 20 24 61 72 63 68 69 74 65 63 74 75  alse $architectu
2a2a0 72 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  re..            
2a2b0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
2a2c0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
2a2d0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
2a2e0 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
2a2f0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
2a300 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
2a310 28 63 6f 70 79 53 71 6c 69 74 65 4d 61 6e 61 67  (copySqliteManag
2a320 65 64 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20  edFiles)]} then 
2a330 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
2a340 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
2a350 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 6f 70  hannel "---- cop
2a360 79 69 6e 67 20 5c 22 6d 61 6e 61 67 65 64 5c 22  ying \"managed\"
2a370 20 66 69 6c 65 73 2e 2e 2e 5c 6e 22 0d 0a 0d 0a   files...\n"....
2a380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f                fo
2a390 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24  reach fileName $
2a3a0 6d 61 6e 61 67 65 64 46 69 6c 65 4e 61 6d 65 73  managedFileNames
2a3b0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
2a3c0 20 20 20 20 74 72 79 43 6f 70 79 41 73 73 65 6d      tryCopyAssem
2a3d0 62 6c 79 20 24 66 69 6c 65 4e 61 6d 65 20 74 72  bly $fileName tr
2a3e0 75 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue..            
2a3f0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
2a400 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d   }..          }.
2a410 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
2a420 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
2a430 3a 20 53 6b 69 70 20 74 72 79 69 6e 67 20 74 6f  : Skip trying to
2a440 20 6c 6f 61 64 20 61 6e 79 20 66 69 6c 65 73 20   load any files 
2a450 69 66 20 69 6e 73 74 72 75 63 74 65 64 2e 0d 0a  if instructed...
2a460 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
2a470 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
2a480 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 6c 6f  o exists ::no(lo
2a490 61 64 53 71 6c 69 74 65 46 69 6c 65 73 29 5d 7d  adSqliteFiles)]}
2a4a0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
2a4b0 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
2a4c0 65 78 69 73 74 73 20 3a 3a 6e 6f 28 6c 6f 61 64  exists ::no(load
2a4d0 53 71 6c 69 74 65 49 6d 70 6c 69 63 69 74 46 69  SqliteImplicitFi
2a4e0 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  les)]} then {.. 
2a4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79               try
2a500 4c 6f 61 64 41 73 73 65 6d 62 6c 79 20 53 79 73  LoadAssembly Sys
2a510 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
2a520 64 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  dll..           
2a530 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
2a540 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
2a550 73 74 73 20 3a 3a 6e 6f 28 6c 6f 61 64 53 71 6c  sts ::no(loadSql
2a560 69 74 65 4c 69 6e 71 46 69 6c 65 73 29 5d 7d 20  iteLinqFiles)]} 
2a570 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
2a580 20 20 20 20 20 20 74 72 79 4c 6f 61 64 41 73 73        tryLoadAss
2a590 65 6d 62 6c 79 20 53 79 73 74 65 6d 2e 44 61 74  embly System.Dat
2a5a0 61 2e 53 51 4c 69 74 65 2e 4c 69 6e 71 2e 64 6c  a.SQLite.Linq.dl
2a5b0 6c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  l..            }
2a5c0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
2a5d0 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
2a5e0 73 20 3a 3a 6e 6f 28 6c 6f 61 64 53 71 6c 69 74  s ::no(loadSqlit
2a5f0 65 45 66 36 46 69 6c 65 73 29 5d 7d 20 74 68 65  eEf6Files)]} the
2a600 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
2a610 20 20 20 74 72 79 4c 6f 61 64 41 73 73 65 6d 62     tryLoadAssemb
2a620 6c 79 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  ly System.Data.S
2a630 51 4c 69 74 65 2e 45 46 36 2e 64 6c 6c 0d 0a 20  QLite.EF6.dll.. 
2a640 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
2a650 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
2a660 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
2a670 6e 6f 28 6c 6f 61 64 53 71 6c 69 74 65 4e 6f 6e  no(loadSqliteNon
2a680 49 6d 70 6c 69 63 69 74 46 69 6c 65 73 29 5d 7d  ImplicitFiles)]}
2a690 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
2a6a0 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
2a6b0 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 6c 6f  o exists ::no(lo
2a6c0 61 64 53 71 6c 69 74 65 50 6c 61 74 66 6f 72 6d  adSqlitePlatform
2a6d0 46 69 6c 65 73 29 5d 20 26 26 20 5c 0d 0a 20 20  Files)] && \..  
2a6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a6f0 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
2a700 70 6c 61 74 66 6f 72 6d 5d 20 3e 20 30 7d 20 74  platform] > 0} t
2a710 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
2a720 20 20 20 20 20 20 20 74 72 79 4c 6f 61 64 41 73         tryLoadAs
2a730 73 65 6d 62 6c 79 20 53 79 73 74 65 6d 2e 44 61  sembly System.Da
2a740 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 20 24 70  ta.SQLite.dll $p
2a750 6c 61 74 66 6f 72 6d 0d 0a 20 20 20 20 20 20 20  latform..       
2a760 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
2a770 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
2a780 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
2a790 28 6c 6f 61 64 53 71 6c 69 74 65 41 72 63 68 69  (loadSqliteArchi
2a7a0 74 65 63 74 75 72 65 46 69 6c 65 73 29 5d 20 26  tectureFiles)] &
2a7b0 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  & \..           
2a7c0 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c         [string l
2a7d0 65 6e 67 74 68 20 24 61 72 63 68 69 74 65 63 74  ength $architect
2a7e0 75 72 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ure] > 0} then {
2a7f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2a800 20 20 74 72 79 4c 6f 61 64 41 73 73 65 6d 62 6c    tryLoadAssembl
2a810 79 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  y System.Data.SQ
2a820 4c 69 74 65 2e 64 6c 6c 20 24 61 72 63 68 69 74  Lite.dll $archit
2a830 65 63 74 75 72 65 0d 0a 20 20 20 20 20 20 20 20  ecture..        
2a840 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
2a850 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
2a860 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
2a870 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63  ..        foreac
2a880 68 20 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 24  h fileNameOnly $
2a890 6e 61 74 69 76 65 46 69 6c 65 4e 61 6d 65 73 20  nativeFileNames 
2a8a0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 61 74  {..          cat
2a8b0 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
2a8c0 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
2a8d0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
2a8e0 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
2a8f0 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c         "---- fil
2a900 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22 22  e version of \""
2a910 20 6e 61 74 69 76 65 2f 20 24 66 69 6c 65 4e 61   native/ $fileNa
2a920 6d 65 4f 6e 6c 79 20 5c 0d 0a 20 20 20 20 20 20  meOnly \..      
2a930 20 20 20 20 20 20 20 20 20 20 22 5c 22 2e 2e 2e            "\"...
2a940 20 5c 22 22 20 5b 66 69 6c 65 20 76 65 72 73 69   \"" [file versi
2a950 6f 6e 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c  on [getBinaryFil
2a960 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20  eName \..       
2a970 20 20 20 20 20 20 20 20 20 24 66 69 6c 65 4e 61           $fileNa
2a980 6d 65 4f 6e 6c 79 5d 5d 20 5c 22 5c 6e 5d 0d 0a  meOnly]] \"\n]..
2a990 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
2a9a0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
2a9b0 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61    foreach fileNa
2a9c0 6d 65 4f 6e 6c 79 20 24 6d 69 78 65 64 46 69 6c  meOnly $mixedFil
2a9d0 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20  eNames {..      
2a9e0 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20      catch {..   
2a9f0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
2aa00 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
2aa10 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
2aa20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
2aa30 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73 69 6f 6e  --- file version
2aa40 20 6f 66 20 5c 22 22 20 6d 69 78 65 64 2f 20 24   of \"" mixed/ $
2aa50 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 5c 0d 0a  fileNameOnly \..
2aa60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aa70 22 5c 22 2e 2e 2e 20 5c 22 22 20 5b 66 69 6c 65  "\"... \"" [file
2aa80 20 76 65 72 73 69 6f 6e 20 5b 67 65 74 42 69 6e   version [getBin
2aa90 61 72 79 46 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20  aryFileName \.. 
2aaa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24                 $
2aab0 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 5d 5d 20 5c  fileNameOnly]] \
2aac0 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  "\n]..          
2aad0 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  }..        }....
2aae0 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
2aaf0 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 24 6d 61  fileNameOnly $ma
2ab00 6e 61 67 65 64 46 69 6c 65 4e 61 6d 65 73 20 7b  nagedFileNames {
2ab10 0d 0a 20 20 20 20 20 20 20 20 20 20 63 61 74 63  ..          catc
2ab20 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  h {..           
2ab30 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
2ab40 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
2ab50 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
2ab60 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65        "---- file
2ab70 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22 22 20   version of \"" 
2ab80 6d 61 6e 61 67 65 64 2f 20 24 66 69 6c 65 4e 61  managed/ $fileNa
2ab90 6d 65 4f 6e 6c 79 20 5c 0d 0a 20 20 20 20 20 20  meOnly \..      
2aba0 20 20 20 20 20 20 20 20 20 20 22 5c 22 2e 2e 2e            "\"...
2abb0 20 5c 22 22 20 5b 66 69 6c 65 20 76 65 72 73 69   \"" [file versi
2abc0 6f 6e 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c  on [getBinaryFil
2abd0 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20  eName \..       
2abe0 20 20 20 20 20 20 20 20 20 24 66 69 6c 65 4e 61           $fileNa
2abf0 6d 65 4f 6e 6c 79 5d 5d 20 5c 22 5c 6e 5d 0d 0a  meOnly]] \"\n]..
2ac00 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
2ac10 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
2ac20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
2ac30 6e 67 74 68 20 24 70 6c 61 74 66 6f 72 6d 5d 20  ngth $platform] 
2ac40 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
2ac50 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66         foreach f
2ac60 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 24 6e 61 74  ileNameOnly $nat
2ac70 69 76 65 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a  iveFileNames {..
2ac80 20 20 20 20 20 20 20 20 20 20 20 20 63 61 74 63              catc
2ac90 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  h {..           
2aca0 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
2acb0 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
2acc0 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
2acd0 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
2ace0 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66 20  file version of 
2acf0 5c 22 22 20 6e 61 74 69 76 65 2f 70 6c 61 74 66  \"" native/platf
2ad00 6f 72 6d 2f 20 5c 0d 0a 20 20 20 20 20 20 20 20  orm/ \..        
2ad10 20 20 20 20 20 20 20 20 20 20 24 70 6c 61 74 66            $platf
2ad20 6f 72 6d 20 2f 20 24 66 69 6c 65 4e 61 6d 65 4f  orm / $fileNameO
2ad30 6e 6c 79 20 22 5c 22 2e 2e 2e 20 5c 22 22 20 5b  nly "\"... \"" [
2ad40 66 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  file \..        
2ad50 20 20 20 20 20 20 20 20 20 20 76 65 72 73 69 6f            versio
2ad60 6e 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65  n [getBinaryFile
2ad70 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 4f 6e  Name $fileNameOn
2ad80 6c 79 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ly \..          
2ad90 20 20 20 20 20 20 20 20 24 70 6c 61 74 66 6f 72          $platfor
2ada0 6d 5d 5d 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20  m]] \"\n]..     
2adb0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
2adc0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
2add0 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e     foreach fileN
2ade0 61 6d 65 4f 6e 6c 79 20 24 6d 69 78 65 64 46 69  ameOnly $mixedFi
2adf0 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20  leNames {..     
2ae00 20 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a         catch {..
2ae10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70                tp
2ae20 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
2ae30 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
2ae40 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
2ae50 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20       "---- file 
2ae60 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22 22 20 6d  version of \"" m
2ae70 69 78 65 64 2f 70 6c 61 74 66 6f 72 6d 2f 20 5c  ixed/platform/ \
2ae80 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2ae90 20 20 20 20 24 70 6c 61 74 66 6f 72 6d 20 2f 20      $platform / 
2aea0 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 22 5c  $fileNameOnly "\
2aeb0 22 2e 2e 2e 20 5c 22 22 20 5b 66 69 6c 65 20 5c  "... \"" [file \
2aec0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2aed0 20 20 20 20 76 65 72 73 69 6f 6e 20 5b 67 65 74      version [get
2aee0 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 24  BinaryFileName $
2aef0 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 5c 0d 0a  fileNameOnly \..
2af00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2af10 20 20 24 70 6c 61 74 66 6f 72 6d 5d 5d 20 5c 22    $platform]] \"
2af20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  \n]..           
2af30 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d   }..          }.
2af40 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
2af50 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
2af60 67 20 6c 65 6e 67 74 68 20 24 61 72 63 68 69 74  g length $archit
2af70 65 63 74 75 72 65 5d 20 3e 20 30 7d 20 74 68 65  ecture] > 0} the
2af80 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 66  n {..          f
2af90 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 4f  oreach fileNameO
2afa0 6e 6c 79 20 24 6e 61 74 69 76 65 46 69 6c 65 4e  nly $nativeFileN
2afb0 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20  ames {..        
2afc0 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20      catch {..   
2afd0 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
2afe0 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
2aff0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
2b000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b010 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72    "---- file ver
2b020 73 69 6f 6e 20 6f 66 20 5c 22 22 20 6e 61 74 69  sion of \"" nati
2b030 76 65 2f 61 72 63 68 69 74 65 63 74 75 72 65 2f  ve/architecture/
2b040 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
2b050 20 20 20 20 20 20 24 61 72 63 68 69 74 65 63 74        $architect
2b060 75 72 65 20 2f 20 24 66 69 6c 65 4e 61 6d 65 4f  ure / $fileNameO
2b070 6e 6c 79 20 22 5c 22 2e 2e 2e 20 5c 22 22 20 5b  nly "\"... \"" [
2b080 66 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  file \..        
2b090 20 20 20 20 20 20 20 20 20 20 76 65 72 73 69 6f            versio
2b0a0 6e 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65  n [getBinaryFile
2b0b0 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 4f 6e  Name $fileNameOn
2b0c0 6c 79 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ly \..          
2b0d0 20 20 20 20 20 20 20 20 24 61 72 63 68 69 74 65          $archite
2b0e0 63 74 75 72 65 5d 5d 20 5c 22 5c 6e 5d 0d 0a 20  cture]] \"\n].. 
2b0f0 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
2b100 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
2b110 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66         foreach f
2b120 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 24 6d 69 78  ileNameOnly $mix
2b130 65 64 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20  edFileNames {.. 
2b140 20 20 20 20 20 20 20 20 20 20 20 63 61 74 63 68             catch
2b150 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
2b160 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
2b170 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
2b180 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
2b190 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66           "---- f
2b1a0 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c  ile version of \
2b1b0 22 22 20 6d 69 78 65 64 2f 61 72 63 68 69 74 65  "" mixed/archite
2b1c0 63 74 75 72 65 2f 20 5c 0d 0a 20 20 20 20 20 20  cture/ \..      
2b1d0 20 20 20 20 20 20 20 20 20 20 20 20 24 61 72 63              $arc
2b1e0 68 69 74 65 63 74 75 72 65 20 2f 20 24 66 69 6c  hitecture / $fil
2b1f0 65 4e 61 6d 65 4f 6e 6c 79 20 22 5c 22 2e 2e 2e  eNameOnly "\"...
2b200 20 5c 22 22 20 5b 66 69 6c 65 20 5c 0d 0a 20 20   \"" [file \..  
2b210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b220 76 65 72 73 69 6f 6e 20 5b 67 65 74 42 69 6e 61  version [getBina
2b230 72 79 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65  ryFileName $file
2b240 4e 61 6d 65 4f 6e 6c 79 20 5c 0d 0a 20 20 20 20  NameOnly \..    
2b250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24 61                $a
2b260 72 63 68 69 74 65 63 74 75 72 65 5d 5d 20 5c 22  rchitecture]] \"
2b270 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  \n]..           
2b280 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d   }..          }.
2b290 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
2b2a0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
2b2b0 20 23 20 4e 4f 54 45 3a 20 47 72 61 62 20 74 68   # NOTE: Grab th
2b2c0 65 20 6c 69 73 74 20 6f 66 20 6d 61 6e 61 67 65  e list of manage
2b2d0 64 20 61 73 73 65 6d 62 6c 69 65 73 20 66 6f 72  d assemblies for
2b2e0 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 72 6f   the current pro
2b2f0 63 65 73 73 0d 0a 20 20 20 20 20 20 20 20 23 20  cess..        # 
2b300 20 20 20 20 20 20 61 6e 64 20 72 65 70 6f 72 74        and report
2b310 20 6f 6e 20 74 68 65 20 53 79 73 74 65 6d 2e 44   on the System.D
2b320 61 74 61 2e 53 51 4c 69 74 65 20 72 65 6c 61 74  ata.SQLite relat
2b330 65 64 20 6f 6e 65 73 2e 0d 0a 20 20 20 20 20 20  ed ones...      
2b340 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20    #..        if 
2b350 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f 62 6a 65  {[haveSQLiteObje
2b360 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65 6e  ctCommand]} then
2b370 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   {..          if
2b380 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
2b390 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69          object i
2b3a0 6e 76 6f 6b 65 20 55 74 69 6c 69 74 79 20 47 65  nvoke Utility Ge
2b3b0 74 41 73 73 65 6d 62 6c 69 65 73 0d 0a 20 20 20  tAssemblies..   
2b3c0 20 20 20 20 20 20 20 7d 20 61 73 73 65 6d 62 6c         } assembl
2b3d0 69 65 73 5d 20 3d 3d 20 30 20 7c 7c 20 5b 63 61  ies] == 0 || [ca
2b3e0 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
2b3f0 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65     object invoke
2b400 20 41 70 70 44 6f 6d 61 69 6e 2e 43 75 72 72 65   AppDomain.Curre
2b410 6e 74 44 6f 6d 61 69 6e 20 47 65 74 41 73 73 65  ntDomain GetAsse
2b420 6d 62 6c 69 65 73 0d 0a 20 20 20 20 20 20 20 20  mblies..        
2b430 20 20 7d 20 61 73 73 65 6d 62 6c 69 65 73 5d 20    } assemblies] 
2b440 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
2b450 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74            object
2b460 20 66 6f 72 65 61 63 68 20 61 73 73 65 6d 62 6c   foreach assembl
2b470 79 20 24 61 73 73 65 6d 62 6c 69 65 73 20 7b 0d  y $assemblies {.
2b480 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
2b490 66 20 7b 5b 73 74 72 69 6e 67 20 6d 61 74 63 68  f {[string match
2b4a0 20 5c 7b 53 79 73 74 65 6d 2e 44 61 74 61 2e 53   \{System.Data.S
2b4b0 51 4c 69 74 65 2a 20 24 61 73 73 65 6d 62 6c 79  QLite* $assembly
2b4c0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
2b4d0 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
2b4e0 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
2b4f0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
2b500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b510 20 20 20 20 22 2d 2d 2d 2d 20 66 6f 75 6e 64 20      "---- found 
2b520 6c 6f 61 64 65 64 20 61 73 73 65 6d 62 6c 79 3a  loaded assembly:
2b530 20 22 20 24 61 73 73 65 6d 62 6c 79 20 5c 6e 5d   " $assembly \n]
2b540 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2b550 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  }..            }
2b560 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
2b570 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
2b580 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20      catch {..   
2b590 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
2b5a0 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a  test_channel \..
2b5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
2b5c0 2d 2d 2d 20 64 65 66 69 6e 65 20 63 6f 6e 73 74  --- define const
2b5d0 61 6e 74 73 20 66 6f 72 20 5c 22 53 79 73 74 65  ants for \"Syste
2b5e0 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 5c 22 2e  m.Data.SQLite\".
2b5f0 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20  .. "....        
2b600 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
2b610 20 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65              obje
2b620 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73  ct invoke -flags
2b630 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20   +NonPublic \.. 
2b640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
2b650 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
2b660 65 2e 53 51 4c 69 74 65 33 20 44 65 66 69 6e 65  e.SQLite3 Define
2b670 43 6f 6e 73 74 61 6e 74 73 0d 0a 20 20 20 20 20  Constants..     
2b680 20 20 20 20 20 7d 20 64 65 66 69 6e 65 43 6f 6e       } defineCon
2b690 73 74 61 6e 74 73 5d 20 3d 3d 20 30 7d 20 74 68  stants] == 0} th
2b6a0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
2b6b0 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
2b6c0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
2b6d0 72 67 73 20 5b 66 6f 72 6d 61 74 4c 69 73 74 20  rgs [formatList 
2b6e0 5b 6c 73 6f 72 74 20 5c 0d 0a 20 20 20 20 20 20  [lsort \..      
2b6f0 20 20 20 20 20 20 20 20 20 20 24 64 65 66 69 6e            $defin
2b700 65 43 6f 6e 73 74 61 6e 74 73 5d 20 3c 6e 6f 6e  eConstants] <non
2b710 65 3e 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  e>] \n]..       
2b720 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
2b730 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
2b740 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 75  ::test_channel u
2b750 6e 6b 6e 6f 77 6e 5c 6e 0d 0a 20 20 20 20 20 20  nknown\n..      
2b760 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
2b770 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63 61 74 63  ....        catc
2b780 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74  h {..          t
2b790 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
2b7a0 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20  nnel \..        
2b7b0 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6f 75 72        "---- sour
2b7c0 63 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22  ce version of \"
2b7d0 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
2b7e0 74 65 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 0d 0a 0d  te.dll\"... "...
2b7f0 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b  .          if {[
2b800 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
2b810 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f       object invo
2b820 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75  ke -flags +NonPu
2b830 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20  blic \..        
2b840 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44          System.D
2b850 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74  ata.SQLite.SQLit
2b860 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 50 72 6f 76  eConnection Prov
2b870 69 64 65 72 56 65 72 73 69 6f 6e 0d 0a 20 20 20  iderVersion..   
2b880 20 20 20 20 20 20 20 7d 20 76 65 72 73 69 6f 6e         } version
2b890 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
2b8a0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
2b8b0 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
2b8c0 76 65 72 73 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74  version] == 0} t
2b8d0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
2b8e0 20 20 20 20 20 73 65 74 20 76 65 72 73 69 6f 6e       set version
2b8f0 20 6e 75 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20   null..         
2b900 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
2b910 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
2b920 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
2b930 72 67 73 20 24 76 65 72 73 69 6f 6e 20 5c 6e 5d  rgs $version \n]
2b940 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c  ..          } el
2b950 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
2b960 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
2b970 63 68 61 6e 6e 65 6c 20 75 6e 6b 6e 6f 77 6e 5c  channel unknown\
2b980 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  n..          }..
2b990 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
2b9a0 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20       catch {..  
2b9b0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
2b9c0 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d  :test_channel \.
2b9d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
2b9e0 2d 2d 2d 2d 20 73 6f 75 72 63 65 20 63 68 65 63  ---- source chec
2b9f0 6b 6f 75 74 20 6f 66 20 5c 22 53 79 73 74 65 6d  kout of \"System
2ba00 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c  .Data.SQLite.dll
2ba10 5c 22 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20  \"... "....     
2ba20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
2ba30 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f  {..            o
2ba40 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c  bject invoke -fl
2ba50 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c  ags +NonPublic \
2ba60 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2ba70 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51    System.Data.SQ
2ba80 4c 69 74 65 2e 53 51 4c 69 74 65 43 6f 6e 6e 65  Lite.SQLiteConne
2ba90 63 74 69 6f 6e 20 50 72 6f 76 69 64 65 72 53 6f  ction ProviderSo
2baa0 75 72 63 65 49 64 0d 0a 20 20 20 20 20 20 20 20  urceId..        
2bab0 20 20 7d 20 73 6f 75 72 63 65 49 64 5d 20 3d 3d    } sourceId] ==
2bac0 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
2bad0 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72          if {[str
2bae0 69 6e 67 20 6c 65 6e 67 74 68 20 24 73 6f 75 72  ing length $sour
2baf0 63 65 49 64 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  ceId] == 0} then
2bb00 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
2bb10 20 20 73 65 74 20 73 6f 75 72 63 65 49 64 20 6e    set sourceId n
2bb20 75 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ull..           
2bb30 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
2bb40 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
2bb50 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
2bb60 73 20 24 73 6f 75 72 63 65 49 64 20 5c 6e 5d 0d  s $sourceId \n].
2bb70 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73  .          } els
2bb80 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e {..           
2bb90 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
2bba0 68 61 6e 6e 65 6c 20 75 6e 6b 6e 6f 77 6e 5c 6e  hannel unknown\n
2bbb0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
2bbc0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
2bbd0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
2bbe0 20 4e 4f 54 45 3a 20 52 65 73 65 74 20 63 61 63   NOTE: Reset cac
2bbf0 68 65 64 20 22 62 72 65 61 6b 20 69 6e 74 6f 20  hed "break into 
2bc00 64 65 62 75 67 67 65 72 22 20 73 65 74 74 69 6e  debugger" settin
2bc10 67 20 73 6f 20 74 68 61 74 20 69 74 20 63 61 6e  g so that it can
2bc20 20 62 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20   be..        #  
2bc30 20 20 20 20 20 75 73 65 64 20 64 75 72 69 6e 67       used during
2bc40 20 74 68 65 20 74 65 73 74 20 66 69 6c 65 2c 20   the test file, 
2bc50 69 66 20 6e 65 65 64 65 64 2e 0d 0a 20 20 20 20  if needed...    
2bc60 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69      #..        i
2bc70 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
2bc80 20 3a 3a 6e 6f 28 72 65 73 65 74 42 72 65 61 6b   ::no(resetBreak
2bc90 49 6e 74 6f 44 65 62 75 67 67 65 72 29 5d 20 26  IntoDebugger)] &
2bca0 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  & \..           
2bcb0 20 5b 68 61 76 65 53 51 4c 69 74 65 4f 62 6a 65   [haveSQLiteObje
2bcc0 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65 6e  ctCommand]} then
2bcd0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   {..          if
2bce0 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
2bcf0 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69          object i
2bd00 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f  nvoke -flags +No
2bd10 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20  nPublic \..     
2bd20 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65             Syste
2bd30 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 48 65  m.Data.SQLite.He
2bd40 6c 70 65 72 4d 65 74 68 6f 64 73 20 52 65 73 65  lperMethods Rese
2bd50 74 42 72 65 61 6b 49 6e 74 6f 44 65 62 75 67 67  tBreakIntoDebugg
2bd60 65 72 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20  er..          } 
2bd70 72 65 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68  result] == 0} th
2bd80 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
2bd90 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
2bda0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
2bdb0 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
2bdc0 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 61 6c         "---- cal
2bdd0 6c 20 52 65 73 65 74 42 72 65 61 6b 49 6e 74 6f  l ResetBreakInto
2bde0 44 65 62 75 67 67 65 72 28 29 2e 2e 2e 20 6f 6b  Debugger()... ok
2bdf0 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  \n"]..          
2be00 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
2be10 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
2be20 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
2be30 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
2be40 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
2be50 20 63 61 6c 6c 20 52 65 73 65 74 42 72 65 61 6b   call ResetBreak
2be60 49 6e 74 6f 44 65 62 75 67 67 65 72 28 29 2e 2e  IntoDebugger()..
2be70 2e 20 65 72 72 6f 72 3a 20 22 20 5c 0d 0a 20 20  . error: " \..  
2be80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 6e                \n
2be90 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a  \t $result \n]..
2bea0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
2beb0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
2bec0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
2bed0 4f 54 45 3a 20 43 68 65 63 6b 20 74 68 65 20 61  OTE: Check the a
2bee0 76 61 69 6c 61 62 6c 65 20 62 75 69 6c 64 73 20  vailable builds 
2bef0 28 61 6e 64 20 22 72 65 6c 65 61 73 65 73 22 29  (and "releases")
2bf00 20 6f 66 20 53 51 4c 69 74 65 20 61 6e 64 0d 0a   of SQLite and..
2bf10 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
2bf20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
2bf30 74 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  te...        #..
2bf40 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72          checkFor
2bf50 53 51 4c 69 74 65 42 75 69 6c 64 73 20 24 3a 3a  SQLiteBuilds $::
2bf60 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 20 20  test_channel..  
2bf70 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51        checkForSQ
2bf80 4c 69 74 65 52 65 6c 65 61 73 65 73 20 24 3a 3a  LiteReleases $::
2bf90 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a  test_channel....
2bfa0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
2bfb0 20 20 20 23 20 4e 4f 54 45 3a 20 4e 6f 77 2c 20     # NOTE: Now, 
2bfc0 77 65 20 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20  we need to know 
2bfd0 69 66 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f  if the SQLite co
2bfe0 72 65 20 6c 69 62 72 61 72 79 20 69 73 20 61 76  re library is av
2bff0 61 69 6c 61 62 6c 65 0d 0a 20 20 20 20 20 20 20  ailable..       
2c000 20 23 20 20 20 20 20 20 20 28 69 2e 65 2e 20 62   #       (i.e. b
2c010 65 63 61 75 73 65 20 74 68 65 20 6d 61 6e 61 67  ecause the manag
2c020 65 64 2d 6f 6e 6c 79 20 53 79 73 74 65 6d 2e 44  ed-only System.D
2c030 61 74 61 2e 53 51 4c 69 74 65 20 61 73 73 65 6d  ata.SQLite assem
2c040 62 6c 79 20 63 61 6e 0d 0a 20 20 20 20 20 20 20  bly can..       
2c050 20 23 20 20 20 20 20 20 20 6c 6f 61 64 20 77 69   #       load wi
2c060 74 68 6f 75 74 20 69 74 3b 20 68 6f 77 65 76 65  thout it; howeve
2c070 72 2c 20 69 74 20 63 61 6e 6e 6f 74 20 64 6f 20  r, it cannot do 
2c080 61 6e 79 74 68 69 6e 67 20 75 73 65 66 75 6c 20  anything useful 
2c090 77 69 74 68 6f 75 74 0d 0a 20 20 20 20 20 20 20  without..       
2c0a0 20 23 20 20 20 20 20 20 20 69 74 29 2e 20 20 49   #       it).  I
2c0b0 66 20 77 65 20 61 72 65 20 75 73 69 6e 67 20 74  f we are using t
2c0c0 68 65 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73  he mixed-mode as
2c0d0 73 65 6d 62 6c 79 20 61 6e 64 20 77 65 20 61 6c  sembly and we al
2c0e0 72 65 61 64 79 0d 0a 20 20 20 20 20 20 20 20 23  ready..        #
2c0f0 20 20 20 20 20 20 20 66 6f 75 6e 64 20 69 74 20         found it 
2c100 28 61 62 6f 76 65 29 2c 20 74 68 69 73 20 73 68  (above), this sh
2c110 6f 75 6c 64 20 61 6c 77 61 79 73 20 73 75 63 63  ould always succ
2c120 65 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  eed...        #.
2c130 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f  .        checkFo
2c140 72 53 51 4c 69 74 65 4c 69 62 72 61 72 79 20 24  rSQLiteLibrary $
2c150 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a  ::test_channel..
2c160 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
2c170 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65       # NOTE: Che
2c180 63 6b 20 69 66 20 74 68 65 20 53 51 4c 69 74 65  ck if the SQLite
2c190 20 69 6e 74 65 72 6f 70 20 61 73 73 65 6d 62 6c   interop assembl
2c1a0 79 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0d  y is available..
2c1b0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
2c1c0 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51 4c 69      checkForSQLi
2c1d0 74 65 49 6e 74 65 72 6f 70 20 24 3a 3a 74 65 73  teInterop $::tes
2c1e0 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20  t_channel....   
2c1f0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
2c200 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 74 68  # NOTE: Check th
2c210 65 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73  e SQLite databas
2c220 65 20 61 6e 64 20 74 65 6d 70 6f 72 61 72 79 20  e and temporary 
2c230 64 69 72 65 63 74 6f 72 69 65 73 2e 0d 0a 20 20  directories...  
2c240 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
2c250 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 44   checkForSQLiteD
2c260 69 72 65 63 74 6f 72 69 65 73 20 24 3a 3a 74 65  irectories $::te
2c270 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20  st_channel....  
2c280 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
2c290 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74   # NOTE: Attempt
2c2a0 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66   to determine if
2c2b0 20 76 61 72 69 6f 75 73 20 63 6f 6d 70 69 6c 65   various compile
2c2c0 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 73 20 6e 65  -time options ne
2c2d0 65 64 65 64 20 66 6f 72 0d 0a 20 20 20 20 20 20  eded for..      
2c2e0 20 20 23 20 20 20 20 20 20 20 74 65 73 74 20 63    #       test c
2c2f0 6f 6e 73 74 72 61 69 6e 74 73 20 77 65 72 65 20  onstraints were 
2c300 65 6e 61 62 6c 65 64 20 66 6f 72 20 74 68 65 20  enabled for the 
2c310 6d 61 6e 61 67 65 64 20 61 73 73 65 6d 62 6c 79  managed assembly
2c320 2e 20 20 54 68 65 72 65 0d 0a 20 20 20 20 20 20  .  There..      
2c330 20 20 23 20 20 20 20 20 20 20 61 72 65 20 73 6f    #       are so
2c340 6d 65 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  me compile-time 
2c350 6f 70 74 69 6f 6e 73 20 74 68 61 74 20 6d 75 73  options that mus
2c360 74 20 61 6c 73 6f 20 68 61 76 65 20 62 65 65 6e  t also have been
2c370 20 65 6e 61 62 6c 65 64 0d 0a 20 20 20 20 20 20   enabled..      
2c380 20 20 23 20 20 20 20 20 20 20 66 6f 72 20 74 68    #       for th
2c390 65 20 69 6e 74 65 72 6f 70 20 61 73 73 65 6d 62  e interop assemb
2c3a0 6c 79 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62  ly in order to b
2c3b0 65 20 65 66 66 65 63 74 69 76 65 2e 20 20 46 6f  e effective.  Fo
2c3c0 72 20 74 68 6f 73 65 0d 0a 20 20 20 20 20 20 20  r those..       
2c3d0 20 23 20 20 20 20 20 20 20 6f 70 74 69 6f 6e 73   #       options
2c3e0 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 61 73 73  , it will be ass
2c3f0 75 6d 65 64 20 74 68 61 74 20 69 74 20 77 61 73  umed that it was
2c400 20 65 6e 61 62 6c 65 64 20 66 6f 72 20 74 68 65   enabled for the
2c410 20 69 6e 74 65 72 6f 70 0d 0a 20 20 20 20 20 20   interop..      
2c420 20 20 23 20 20 20 20 20 20 20 61 73 73 65 6d 62    #       assemb
2c430 6c 79 20 69 66 20 69 74 20 77 61 73 20 65 6e 61  ly if it was ena
2c440 62 6c 65 64 20 66 6f 72 20 74 68 65 20 6d 61 6e  bled for the man
2c450 61 67 65 64 20 61 73 73 65 6d 62 6c 79 2e 0d 0a  aged assembly...
2c460 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
2c470 20 20 20 66 6f 72 65 61 63 68 20 64 65 66 69 6e     foreach defin
2c480 65 43 6f 6e 73 74 61 6e 74 20 5b 6c 69 73 74 20  eConstant [list 
2c490 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 43  \..            C
2c4a0 48 45 43 4b 5f 53 54 41 54 45 20 43 4f 55 4e 54  HECK_STATE COUNT
2c4b0 5f 48 41 4e 44 4c 45 20 44 45 42 55 47 20 49 4e  _HANDLE DEBUG IN
2c4c0 54 45 52 4f 50 5f 43 4f 44 45 43 20 49 4e 54 45  TEROP_CODEC INTE
2c4d0 52 4f 50 5f 44 45 42 55 47 20 5c 0d 0a 20 20 20  ROP_DEBUG \..   
2c4e0 20 20 20 20 20 20 20 20 20 49 4e 54 45 52 4f 50           INTEROP
2c4f0 5f 45 58 54 45 4e 53 49 4f 4e 5f 46 55 4e 43 54  _EXTENSION_FUNCT
2c500 49 4f 4e 53 20 49 4e 54 45 52 4f 50 5f 46 54 53  IONS INTEROP_FTS
2c510 35 5f 45 58 54 45 4e 53 49 4f 4e 20 5c 0d 0a 20  5_EXTENSION \.. 
2c520 20 20 20 20 20 20 20 20 20 20 20 49 4e 54 45 52             INTER
2c530 4f 50 5f 49 4e 43 4c 55 44 45 5f 43 45 52 4f 44  OP_INCLUDE_CEROD
2c540 20 49 4e 54 45 52 4f 50 5f 49 4e 43 4c 55 44 45   INTEROP_INCLUDE
2c550 5f 45 58 54 52 41 20 49 4e 54 45 52 4f 50 5f 49  _EXTRA INTEROP_I
2c560 4e 43 4c 55 44 45 5f 53 45 45 20 5c 0d 0a 20 20  NCLUDE_SEE \..  
2c570 20 20 20 20 20 20 20 20 20 20 49 4e 54 45 52 4f            INTERO
2c580 50 5f 49 4e 43 4c 55 44 45 5f 5a 49 50 56 46 53  P_INCLUDE_ZIPVFS
2c590 20 49 4e 54 45 52 4f 50 5f 4a 53 4f 4e 31 5f 45   INTEROP_JSON1_E
2c5a0 58 54 45 4e 53 49 4f 4e 20 5c 0d 0a 20 20 20 20  XTENSION \..    
2c5b0 20 20 20 20 20 20 20 20 49 4e 54 45 52 4f 50 5f          INTEROP_
2c5c0 4c 45 47 41 43 59 5f 43 4c 4f 53 45 20 49 4e 54  LEGACY_CLOSE INT
2c5d0 45 52 4f 50 5f 4c 4f 47 20 49 4e 54 45 52 4f 50  EROP_LOG INTEROP
2c5e0 5f 50 45 52 43 45 4e 54 49 4c 45 5f 45 58 54 45  _PERCENTILE_EXTE
2c5f0 4e 53 49 4f 4e 20 5c 0d 0a 20 20 20 20 20 20 20  NSION \..       
2c600 20 20 20 20 20 49 4e 54 45 52 4f 50 5f 52 45 47       INTEROP_REG
2c610 45 58 50 5f 45 58 54 45 4e 53 49 4f 4e 20 49 4e  EXP_EXTENSION IN
2c620 54 45 52 4f 50 5f 53 45 53 53 49 4f 4e 5f 45 58  TEROP_SESSION_EX
2c630 54 45 4e 53 49 4f 4e 20 5c 0d 0a 20 20 20 20 20  TENSION \..     
2c640 20 20 20 20 20 20 20 49 4e 54 45 52 4f 50 5f 53         INTEROP_S
2c650 48 41 31 5f 45 58 54 45 4e 53 49 4f 4e 20 49 4e  HA1_EXTENSION IN
2c660 54 45 52 4f 50 5f 54 45 53 54 5f 45 58 54 45 4e  TEROP_TEST_EXTEN
2c670 53 49 4f 4e 20 5c 0d 0a 20 20 20 20 20 20 20 20  SION \..        
2c680 20 20 20 20 49 4e 54 45 52 4f 50 5f 54 4f 54 59      INTEROP_TOTY
2c690 50 45 5f 45 58 54 45 4e 53 49 4f 4e 20 49 4e 54  PE_EXTENSION INT
2c6a0 45 52 4f 50 5f 56 49 52 54 55 41 4c 5f 54 41 42  EROP_VIRTUAL_TAB
2c6b0 4c 45 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  LE \..          
2c6c0 20 20 4e 45 54 5f 32 30 20 4e 45 54 5f 33 35 20    NET_20 NET_35 
2c6d0 4e 45 54 5f 34 30 20 4e 45 54 5f 34 35 20 4e 45  NET_40 NET_45 NE
2c6e0 54 5f 34 35 31 20 4e 45 54 5f 34 35 32 20 4e 45  T_451 NET_452 NE
2c6f0 54 5f 34 36 20 4e 45 54 5f 34 36 31 20 5c 0d 0a  T_46 NET_461 \..
2c700 20 20 20 20 20 20 20 20 20 20 20 20 4e 45 54 5f              NET_
2c710 34 36 32 20 4e 45 54 5f 34 37 20 4e 45 54 5f 34  462 NET_47 NET_4
2c720 37 31 20 4e 45 54 5f 43 4f 4d 50 41 43 54 5f 32  71 NET_COMPACT_2
2c730 30 20 50 4c 41 54 46 4f 52 4d 5f 43 4f 4d 50 41  0 PLATFORM_COMPA
2c740 43 54 46 52 41 4d 45 57 4f 52 4b 20 5c 0d 0a 20  CTFRAMEWORK \.. 
2c750 20 20 20 20 20 20 20 20 20 20 20 50 52 45 4c 4f             PRELO
2c760 41 44 5f 4e 41 54 49 56 45 5f 4c 49 42 52 41 52  AD_NATIVE_LIBRAR
2c770 59 20 52 45 54 41 52 47 45 54 41 42 4c 45 20 53  Y RETARGETABLE S
2c780 51 4c 49 54 45 5f 53 54 41 4e 44 41 52 44 20 5c  QLITE_STANDARD \
2c790 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 54 48  ..            TH
2c7a0 52 4f 57 5f 4f 4e 5f 44 49 53 50 4f 53 45 44 20  ROW_ON_DISPOSED 
2c7b0 54 52 41 43 45 20 54 52 41 43 45 5f 43 4f 4e 4e  TRACE TRACE_CONN
2c7c0 45 43 54 49 4f 4e 20 54 52 41 43 45 5f 44 45 54  ECTION TRACE_DET
2c7d0 45 43 54 49 4f 4e 20 5c 0d 0a 20 20 20 20 20 20  ECTION \..      
2c7e0 20 20 20 20 20 20 54 52 41 43 45 5f 48 41 4e 44        TRACE_HAND
2c7f0 4c 45 20 54 52 41 43 45 5f 50 52 45 4c 4f 41 44  LE TRACE_PRELOAD
2c800 20 54 52 41 43 45 5f 53 48 41 52 45 44 20 54 52   TRACE_SHARED TR
2c810 41 43 45 5f 53 54 41 54 45 4d 45 4e 54 20 5c 0d  ACE_STATEMENT \.
2c820 0a 20 20 20 20 20 20 20 20 20 20 20 20 54 52 41  .            TRA
2c830 43 45 5f 57 41 52 4e 49 4e 47 20 54 52 41 43 4b  CE_WARNING TRACK
2c840 5f 4d 45 4d 4f 52 59 5f 42 59 54 45 53 20 55 53  _MEMORY_BYTES US
2c850 45 5f 45 4e 54 49 54 59 5f 46 52 41 4d 45 57 4f  E_ENTITY_FRAMEWO
2c860 52 4b 5f 36 20 5c 0d 0a 20 20 20 20 20 20 20 20  RK_6 \..        
2c870 20 20 20 20 55 53 45 5f 49 4e 54 45 52 4f 50 5f      USE_INTEROP_
2c880 44 4c 4c 20 55 53 45 5f 50 52 45 50 41 52 45 5f  DLL USE_PREPARE_
2c890 56 32 20 57 49 4e 44 4f 57 53 5d 20 7b 0d 0a 20  V2 WINDOWS] {.. 
2c8a0 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
2c8b0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68        # NOTE: Ch
2c8c0 65 63 6b 20 69 66 20 74 68 65 20 63 6f 6d 70 69  eck if the compi
2c8d0 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69  le-time option i
2c8e0 73 20 6c 69 73 74 65 64 20 69 6e 20 74 68 65 20  s listed in the 
2c8f0 6c 69 73 74 20 6f 66 0d 0a 20 20 20 20 20 20 20  list of..       
2c900 20 20 20 23 20 20 20 20 20 20 20 22 64 65 66 69     #       "defi
2c910 6e 65 20 63 6f 6e 73 74 61 6e 74 73 22 20 6b 65  ne constants" ke
2c920 70 74 20 74 72 61 63 6b 20 6f 66 20 62 79 20 74  pt track of by t
2c930 68 65 20 6d 61 6e 61 67 65 64 20 61 73 73 65 6d  he managed assem
2c940 62 6c 79 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  bly...          
2c950 23 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68 65  #..          che
2c960 63 6b 46 6f 72 53 51 4c 69 74 65 44 65 66 69 6e  ckForSQLiteDefin
2c970 65 43 6f 6e 73 74 61 6e 74 20 24 3a 3a 74 65 73  eConstant $::tes
2c980 74 5f 63 68 61 6e 6e 65 6c 20 24 64 65 66 69 6e  t_channel $defin
2c990 65 43 6f 6e 73 74 61 6e 74 0d 0a 20 20 20 20 20  eConstant..     
2c9a0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
2c9b0 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
2c9c0 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 64 65  E: Attempt to de
2c9d0 74 65 72 6d 69 6e 65 20 69 66 20 76 61 72 69 6f  termine if vario
2c9e0 75 73 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  us compile-time 
2c9f0 6f 70 74 69 6f 6e 73 20 6e 65 65 64 65 64 20 66  options needed f
2ca00 6f 72 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  or..        #   
2ca10 20 20 20 20 74 65 73 74 20 63 6f 6e 73 74 72 61      test constra
2ca20 69 6e 74 73 20 77 65 72 65 20 65 6e 61 62 6c 65  ints were enable
2ca30 64 20 66 6f 72 20 74 68 65 20 69 6e 74 65 72 6f  d for the intero
2ca40 70 20 61 73 73 65 6d 62 6c 79 20 61 6e 64 2f 6f  p assembly and/o
2ca50 72 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  r..        #    
2ca60 20 20 20 66 6f 72 20 74 68 65 20 53 51 4c 69 74     for the SQLit
2ca70 65 20 63 6f 72 65 20 6c 69 62 72 61 72 79 2e 0d  e core library..
2ca80 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
2ca90 20 20 20 20 66 6f 72 65 61 63 68 20 63 6f 6d 70      foreach comp
2caa0 69 6c 65 4f 70 74 69 6f 6e 20 5b 6c 69 73 74 20  ileOption [list 
2cab0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 43  \..            C
2cac0 4f 44 45 43 20 45 58 54 45 4e 53 49 4f 4e 5f 46  ODEC EXTENSION_F
2cad0 55 4e 43 54 49 4f 4e 53 20 48 41 53 5f 43 4f 44  UNCTIONS HAS_COD
2cae0 45 43 20 49 4e 43 4c 55 44 45 5f 43 45 52 4f 44  EC INCLUDE_CEROD
2caf0 20 49 4e 43 4c 55 44 45 5f 45 58 54 52 41 20 5c   INCLUDE_EXTRA \
2cb00 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 49 4e  ..            IN
2cb10 43 4c 55 44 45 5f 53 45 45 20 49 4e 43 4c 55 44  CLUDE_SEE INCLUD
2cb20 45 5f 5a 49 50 56 46 53 20 4a 53 4f 4e 31 5f 45  E_ZIPVFS JSON1_E
2cb30 58 54 45 4e 53 49 4f 4e 20 4c 45 47 41 43 59 5f  XTENSION LEGACY_
2cb40 43 4c 4f 53 45 20 4c 4f 47 20 5c 0d 0a 20 20 20  CLOSE LOG \..   
2cb50 20 20 20 20 20 20 20 20 20 50 45 52 43 45 4e 54           PERCENT
2cb60 49 4c 45 5f 45 58 54 45 4e 53 49 4f 4e 20 52 45  ILE_EXTENSION RE
2cb70 47 45 58 50 5f 45 58 54 45 4e 53 49 4f 4e 20 53  GEXP_EXTENSION S
2cb80 45 53 53 49 4f 4e 5f 45 58 54 45 4e 53 49 4f 4e  ESSION_EXTENSION
2cb90 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
2cba0 53 48 41 31 5f 45 58 54 45 4e 53 49 4f 4e 20 54  SHA1_EXTENSION T
2cbb0 45 53 54 5f 45 58 54 45 4e 53 49 4f 4e 20 54 4f  EST_EXTENSION TO
2cbc0 54 59 50 45 5f 45 58 54 45 4e 53 49 4f 4e 20 56  TYPE_EXTENSION V
2cbd0 49 52 54 55 41 4c 5f 54 41 42 4c 45 5d 20 7b 0d  IRTUAL_TABLE] {.
2cbe0 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
2cbf0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
2cc00 43 68 65 63 6b 20 69 66 20 74 68 65 20 63 6f 6d  Check if the com
2cc10 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e  pile-time option
2cc20 20 69 73 20 6c 69 73 74 65 64 20 69 6e 20 74 68   is listed in th
2cc30 65 20 6c 69 73 74 0d 0a 20 20 20 20 20 20 20 20  e list..        
2cc40 20 20 23 20 20 20 20 20 20 20 6b 65 70 74 20 74    #       kept t
2cc50 72 61 63 6b 20 6f 66 20 62 79 20 74 68 65 20 69  rack of by the i
2cc60 6e 74 65 72 6f 70 20 61 73 73 65 6d 62 6c 79 20  nterop assembly 
2cc70 61 6e 64 2f 6f 72 20 74 68 65 20 53 51 4c 69 74  and/or the SQLit
2cc80 65 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20  e..          #  
2cc90 20 20 20 20 20 63 6f 72 65 20 6c 69 62 72 61 72       core librar
2cca0 79 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  y...          #.
2ccb0 0a 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b  .          check
2ccc0 46 6f 72 53 51 4c 69 74 65 43 6f 6d 70 69 6c 65  ForSQLiteCompile
2ccd0 4f 70 74 69 6f 6e 20 24 3a 3a 74 65 73 74 5f 63  Option $::test_c
2cce0 68 61 6e 6e 65 6c 20 24 63 6f 6d 70 69 6c 65 4f  hannel $compileO
2ccf0 70 74 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20 7d  ption..        }
2cd00 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
2cd10 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43         # NOTE: C
2cd20 68 65 63 6b 20 69 66 20 74 68 65 20 53 79 73 74  heck if the Syst
2cd30 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 70  em.Data.SQLite p
2cd40 72 6f 76 69 64 65 72 20 77 61 73 20 63 6f 6d 70  rovider was comp
2cd50 69 6c 65 64 20 77 69 74 68 0d 0a 20 20 20 20 20  iled with..     
2cd60 20 20 20 23 20 20 20 20 20 20 20 73 75 70 70 6f     #       suppo
2cd70 72 74 20 66 6f 72 20 61 6e 79 20 65 6e 63 72 79  rt for any encry
2cd80 70 74 65 64 20 64 61 74 61 62 61 73 65 73 2e 0d  pted databases..
2cd90 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
2cda0 20 20 20 20 69 66 20 7b 5b 68 61 76 65 53 51 4c      if {[haveSQL
2cdb0 69 74 65 44 65 66 69 6e 65 43 6f 6e 73 74 61 6e  iteDefineConstan
2cdc0 74 20 49 4e 54 45 52 4f 50 5f 43 4f 44 45 43 5d  t INTEROP_CODEC]
2cdd0 20 7c 7c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   || \..         
2cde0 20 20 20 5b 68 61 76 65 53 51 4c 69 74 65 44 65     [haveSQLiteDe
2cdf0 66 69 6e 65 43 6f 6e 73 74 61 6e 74 20 49 4e 54  fineConstant INT
2ce00 45 52 4f 50 5f 49 4e 43 4c 55 44 45 5f 53 45 45  EROP_INCLUDE_SEE
2ce10 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
2ce20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
2ce30 20 20 23 20 4e 4f 54 45 3a 20 4e 6f 77 20 63 68    # NOTE: Now ch
2ce40 65 63 6b 20 69 66 20 74 68 65 20 69 6e 74 65 72  eck if the inter
2ce50 6f 70 20 61 73 73 65 6d 62 6c 79 20 77 61 73 20  op assembly was 
2ce60 61 6c 73 6f 20 63 6f 6d 70 69 6c 65 64 20 77 69  also compiled wi
2ce70 74 68 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20  th..          # 
2ce80 20 20 20 20 20 20 73 75 70 70 6f 72 74 20 66 6f        support fo
2ce90 72 20 65 6e 63 72 79 70 74 65 64 20 64 61 74 61  r encrypted data
2cea0 62 61 73 65 73 2e 0d 0a 20 20 20 20 20 20 20 20  bases...        
2ceb0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69    #..          i
2cec0 66 20 7b 5b 68 61 76 65 53 51 4c 69 74 65 43 6f  f {[haveSQLiteCo
2ced0 6d 70 69 6c 65 4f 70 74 69 6f 6e 20 43 4f 44 45  mpileOption CODE
2cee0 43 5d 20 7c 7c 20 5c 0d 0a 20 20 20 20 20 20 20  C] || \..       
2cef0 20 20 20 20 20 20 20 5b 68 61 76 65 53 51 4c 69         [haveSQLi
2cf00 74 65 43 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 20  teCompileOption 
2cf10 49 4e 43 4c 55 44 45 5f 53 45 45 5d 7d 20 74 68  INCLUDE_SEE]} th
2cf20 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
2cf30 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
2cf40 20 23 20 4e 4f 54 45 3a 20 46 69 6e 61 6c 6c 79   # NOTE: Finally
2cf50 2c 20 63 68 65 63 6b 20 69 66 20 74 68 65 20 53  , check if the S
2cf60 51 4c 69 74 65 20 63 6f 72 65 20 6c 69 62 72 61  QLite core libra
2cf70 72 79 20 77 61 73 20 63 6f 6d 70 69 6c 65 64 0d  ry was compiled.
2cf80 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20  .            #  
2cf90 20 20 20 20 20 77 69 74 68 20 73 75 70 70 6f 72       with suppor
2cfa0 74 20 66 6f 72 20 65 6e 63 72 79 70 74 65 64 20  t for encrypted 
2cfb0 64 61 74 61 62 61 73 65 73 2e 0d 0a 20 20 20 20  databases...    
2cfc0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
2cfd0 20 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65         if {[have
2cfe0 53 51 4c 69 74 65 43 6f 6d 70 69 6c 65 4f 70 74  SQLiteCompileOpt
2cff0 69 6f 6e 20 48 41 53 5f 43 4f 44 45 43 5d 7d 20  ion HAS_CODEC]} 
2d000 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
2d010 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
2d020 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 59         # NOTE: Y
2d030 65 73 2c 20 61 64 64 20 63 6f 6e 73 74 72 61 69  es, add constrai
2d040 6e 74 20 66 6f 72 20 75 73 65 20 62 79 20 74 68  nt for use by th
2d050 65 20 74 65 73 74 20 73 75 69 74 65 2e 0d 0a 20  e test suite... 
2d060 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a               #..
2d070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 64                ad
2d080 64 43 6f 6e 73 74 72 61 69 6e 74 20 53 79 73 74  dConstraint Syst
2d090 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 45  em.Data.SQLite.E
2d0a0 6e 63 72 79 70 74 69 6f 6e 0d 0a 20 20 20 20 20  ncryption..     
2d0b0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
2d0c0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
2d0d0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
2d0e0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43         # NOTE: C
2d0f0 68 65 63 6b 20 74 68 65 20 63 75 72 72 65 6e 74  heck the current
2d100 20 62 75 69 6c 64 20 79 65 61 72 2e 20 20 42 61   build year.  Ba
2d110 73 69 63 61 6c 6c 79 2c 20 74 68 69 73 20 69 6e  sically, this in
2d120 64 69 63 61 74 65 73 0d 0a 20 20 20 20 20 20 20  dicates..       
2d130 20 23 20 20 20 20 20 20 20 77 68 69 63 68 20 76   #       which v
2d140 65 72 73 69 6f 6e 20 6f 66 20 4d 53 42 75 69 6c  ersion of MSBuil
2d150 64 20 61 6e 64 2f 6f 72 20 56 69 73 75 61 6c 20  d and/or Visual 
2d160 53 74 75 64 69 6f 20 77 61 73 20 75 73 65 64 20  Studio was used 
2d170 74 6f 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  to..        #   
2d180 20 20 20 20 63 6f 6d 70 69 6c 65 20 74 68 65 20      compile the 
2d190 61 73 73 65 6d 62 6c 79 20 62 69 6e 61 72 69 65  assembly binarie
2d1a0 73 20 75 6e 64 65 72 20 74 65 73 74 2e 0d 0a 20  s under test... 
2d1b0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
2d1c0 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
2d1d0 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20  channel \..     
2d1e0 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65         "---- che
2d1f0 63 6b 69 6e 67 20 66 6f 72 20 53 79 73 74 65 6d  cking for System
2d200 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 62 75 69  .Data.SQLite bui
2d210 6c 64 20 79 65 61 72 2e 2e 2e 20 22 0d 0a 0d 0a  ld year... "....
2d220 20 20 20 20 20 20 20 20 73 65 74 20 79 65 61 72          set year
2d230 20 5b 67 65 74 42 75 69 6c 64 59 65 61 72 5d 0d   [getBuildYear].
2d240 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73  .        addCons
2d250 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
2d260 67 73 20 62 75 69 6c 64 59 65 61 72 2e 20 24 79  gs buildYear. $y
2d270 65 61 72 5d 0d 0a 20 20 20 20 20 20 20 20 74 70  ear]..        tp
2d280 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
2d290 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
2d2a0 5c 22 20 24 79 65 61 72 20 5c 22 5c 6e 5d 0d 0a  \" $year \"\n]..
2d2b0 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
2d2c0 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
2d2d0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  \..            "
2d2e0 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f  ---- checking fo
2d2f0 72 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  r System.Data.SQ
2d300 4c 69 74 65 20 62 75 69 6c 64 20 6e 61 74 69 76  Lite build nativ
2d310 65 20 79 65 61 72 2e 2e 2e 20 22 0d 0a 0d 0a 20  e year... ".... 
2d320 20 20 20 20 20 20 20 73 65 74 20 79 65 61 72 20         set year 
2d330 5b 67 65 74 42 75 69 6c 64 4e 61 74 69 76 65 59  [getBuildNativeY
2d340 65 61 72 5d 0d 0a 20 20 20 20 20 20 20 20 61 64  ear]..        ad
2d350 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70  dConstraint [app
2d360 65 6e 64 41 72 67 73 20 62 75 69 6c 64 4e 61 74  endArgs buildNat
2d370 69 76 65 59 65 61 72 2e 20 24 79 65 61 72 5d 0d  iveYear. $year].
2d380 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
2d390 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
2d3a0 61 70 70 65 6e 64 41 72 67 73 20 5c 22 20 24 79  appendArgs \" $y
2d3b0 65 61 72 20 5c 22 5c 6e 5d 0d 0a 0d 0a 20 20 20  ear \"\n]....   
2d3c0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
2d3d0 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 74 68  # NOTE: Check th
2d3e0 65 20 63 75 72 72 65 6e 74 20 62 75 69 6c 64 20  e current build 
2d3f0 2e 4e 45 54 20 46 72 61 6d 65 77 6f 72 6b 2e 20  .NET Framework. 
2d400 20 42 61 73 69 63 61 6c 6c 79 2c 20 74 68 69 73   Basically, this
2d410 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
2d420 20 20 69 6e 64 69 63 61 74 65 73 20 77 68 69 63    indicates whic
2d430 68 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65  h version of the
2d440 20 2e 4e 45 54 20 46 72 61 6d 65 77 6f 72 6b 20   .NET Framework 
2d450 69 73 20 62 65 69 6e 67 0d 0a 20 20 20 20 20 20  is being..      
2d460 20 20 23 20 20 20 20 20 20 20 75 73 65 64 20 62    #       used b
2d470 79 20 74 68 65 20 61 73 73 65 6d 62 6c 79 20 62  y the assembly b
2d480 69 6e 61 72 69 65 73 20 75 6e 64 65 72 20 74 65  inaries under te
2d490 73 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  st...        #..
2d4a0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
2d4b0 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d  :test_channel \.
2d4c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d  .            "--
2d4d0 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20  -- checking for 
2d4e0 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
2d4f0 74 65 20 62 75 69 6c 64 20 2e 4e 45 54 20 46 72  te build .NET Fr
2d500 61 6d 65 77 6f 72 6b 2e 2e 2e 20 22 0d 0a 0d 0a  amework... "....
2d510 20 20 20 20 20 20 20 20 73 65 74 20 6e 65 74 46          set netF
2d520 78 20 5b 67 65 74 42 75 69 6c 64 4e 65 74 46 78  x [getBuildNetFx
2d530 5d 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f  ]..        addCo
2d540 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64  nstraint [append
2d550 41 72 67 73 20 62 75 69 6c 64 46 72 61 6d 65 77  Args buildFramew
2d560 6f 72 6b 2e 20 24 6e 65 74 46 78 5d 0d 0a 20 20  ork. $netFx]..  
2d570 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
2d580 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
2d590 65 6e 64 41 72 67 73 20 5c 22 20 24 6e 65 74 46  endArgs \" $netF
2d5a0 78 20 5c 22 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20  x \"\n]....     
2d5b0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
2d5c0 4e 4f 54 45 3a 20 43 68 65 63 6b 20 74 68 65 20  NOTE: Check the 
2d5d0 63 75 72 72 65 6e 74 20 62 75 69 6c 64 20 63 6f  current build co
2d5e0 6e 66 69 67 75 72 61 74 69 6f 6e 2e 20 20 54 68  nfiguration.  Th
2d5f0 69 73 20 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c  is should normal
2d600 6c 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ly..        #   
2d610 20 20 20 20 62 65 20 65 69 74 68 65 72 20 22 44      be either "D
2d620 65 62 75 67 22 20 6f 72 20 22 52 65 6c 65 61 73  ebug" or "Releas
2d630 65 22 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  e"...        #..
2d640 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
2d650 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d  :test_channel \.
2d660 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d  .            "--
2d670 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20  -- checking for 
2d680 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
2d690 74 65 20 62 75 69 6c 64 20 63 6f 6e 66 69 67 75  te build configu
2d6a0 72 61 74 69 6f 6e 2e 2e 2e 20 22 0d 0a 0d 0a 20  ration... ".... 
2d6b0 20 20 20 20 20 20 20 73 65 74 20 63 6f 6e 66 69         set confi
2d6c0 67 75 72 61 74 69 6f 6e 20 5b 67 65 74 42 75 69  guration [getBui
2d6d0 6c 64 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 5d  ldConfiguration]
2d6e0 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e  ..        addCon
2d6f0 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41  straint [appendA
2d700 72 67 73 20 62 75 69 6c 64 43 6f 6e 66 69 67 75  rgs buildConfigu
2d710 72 61 74 69 6f 6e 2e 20 24 63 6f 6e 66 69 67 75  ration. $configu
2d720 72 61 74 69 6f 6e 5d 0d 0a 20 20 20 20 20 20 20  ration]..       
2d730 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
2d740 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
2d750 67 73 20 5c 22 20 24 63 6f 6e 66 69 67 75 72 61  gs \" $configura
2d760 74 69 6f 6e 20 5c 22 5c 6e 5d 0d 0a 0d 0a 20 20  tion \"\n]....  
2d770 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
2d780 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20  est_channel \.. 
2d790 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
2d7a0 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 53 79   checking for Sy
2d7b0 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
2d7c0 20 62 75 69 6c 64 20 65 78 74 72 61 2e 2e 2e 20   build extra... 
2d7d0 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  "....        #..
2d7e0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
2d7f0 43 68 65 63 6b 20 74 68 65 20 63 75 72 72 65 6e  Check the curren
2d800 74 20 62 75 69 6c 64 20 65 78 74 72 61 20 64 69  t build extra di
2d810 72 65 63 74 6f 72 79 2e 20 20 54 68 69 73 20 77  rectory.  This w
2d820 69 6c 6c 20 6e 6f 72 6d 61 6c 6c 79 0d 0a 20 20  ill normally..  
2d830 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62 65        #       be
2d840 20 65 69 74 68 65 72 20 22 6e 65 74 73 74 61 6e   either "netstan
2d850 64 61 72 64 32 2e 30 22 20 6f 72 20 61 6e 20 65  dard2.0" or an e
2d860 6d 70 74 79 20 73 74 72 69 6e 67 2e 0d 0a 20 20  mpty string...  
2d870 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
2d880 20 73 65 74 20 65 78 74 72 61 20 5b 67 65 74 42   set extra [getB
2d890 75 69 6c 64 45 78 74 72 61 5d 0d 0a 0d 0a 20 20  uildExtra]....  
2d8a0 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
2d8b0 67 20 6c 65 6e 67 74 68 20 24 65 78 74 72 61 5d  g length $extra]
2d8c0 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
2d8d0 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74          addConst
2d8e0 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67  raint [appendArg
2d8f0 73 20 62 75 69 6c 64 45 78 74 72 61 2e 20 24 65  s buildExtra. $e
2d900 78 74 72 61 5d 0d 0a 20 20 20 20 20 20 20 20 20  xtra]..         
2d910 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
2d920 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
2d930 67 73 20 5c 22 20 24 65 78 74 72 61 20 5c 22 5c  gs \" $extra \"\
2d940 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c  n]..        } el
2d950 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
2d960 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 62 75  addConstraint bu
2d970 69 6c 64 45 78 74 72 61 2e 6e 6f 6e 65 0d 0a 20  ildExtra.none.. 
2d980 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
2d990 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 3c  ::test_channel <
2d9a0 6e 6f 6e 65 3e 5c 6e 0d 0a 20 20 20 20 20 20 20  none>\n..       
2d9b0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d   }....        #.
2d9c0 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
2d9d0 20 54 72 79 20 74 6f 20 73 65 74 75 70 20 61 6e   Try to setup an
2d9e0 20 69 6e 74 65 72 72 75 70 74 20 63 61 6c 6c 62   interrupt callb
2d9f0 61 63 6b 20 75 73 69 6e 67 20 74 68 65 20 73 63  ack using the sc
2da00 72 69 70 74 20 64 65 62 75 67 67 65 72 0d 0a 20  ript debugger.. 
2da10 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74         #       t
2da20 68 61 74 20 77 69 6c 6c 20 63 61 6e 63 65 6c 20  hat will cancel 
2da30 61 6c 6c 20 53 51 4c 20 71 75 65 72 69 65 73 20  all SQL queries 
2da40 69 6e 20 70 72 6f 67 72 65 73 73 20 66 6f 72 20  in progress for 
2da50 61 6c 6c 20 64 61 74 61 62 61 73 65 0d 0a 20 20  all database..  
2da60 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f        #       co
2da70 6e 6e 65 63 74 69 6f 6e 73 20 6b 6e 6f 77 6e 20  nnections known 
2da80 74 6f 20 74 68 69 73 20 69 6e 74 65 72 70 72 65  to this interpre
2da90 74 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ter...        #.
2daa0 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69  .        if {![i
2dab0 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
2dac0 73 71 6c 69 74 65 49 6e 74 65 72 72 75 70 74 43  sqliteInterruptC
2dad0 61 6c 6c 62 61 63 6b 29 5d 7d 20 74 68 65 6e 20  allback)]} then 
2dae0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  {..          set
2daf0 75 70 44 62 49 6e 74 65 72 72 75 70 74 43 61 6c  upDbInterruptCal
2db00 6c 62 61 63 6b 20 24 3a 3a 74 65 73 74 5f 63 68  lback $::test_ch
2db10 61 6e 6e 65 6c 20 24 3a 3a 74 65 73 74 5f 6c 6f  annel $::test_lo
2db20 67 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  g..        }....
2db30 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
2db40 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b     # NOTE: Check
2db50 20 66 6f 72 20 74 68 65 20 6e 61 74 69 76 65 20   for the native 
2db60 72 75 6e 74 69 6d 65 20 6f 70 74 69 6f 6e 2c 20  runtime option, 
2db70 77 68 69 63 68 20 77 6f 75 6c 64 20 6d 65 61 6e  which would mean
2db80 20 77 65 20 61 72 65 0d 0a 20 20 20 20 20 20 20   we are..       
2db90 20 23 20 20 20 20 20 20 20 75 73 69 6e 67 20 74   #       using t
2dba0 68 65 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73  he mixed-mode as
2dbb0 73 65 6d 62 6c 79 2e 0d 0a 20 20 20 20 20 20 20  sembly...       
2dbc0 20 23 0d 0a 20 20 20 20 20 20 20 20 63 68 65 63   #..        chec
2dbd0 6b 46 6f 72 52 75 6e 74 69 6d 65 4f 70 74 69 6f  kForRuntimeOptio
2dbe0 6e 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  n $::test_channe
2dbf0 6c 20 6e 61 74 69 76 65 0d 0a 0d 0a 20 20 20 20  l native....    
2dc00 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
2dc10 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20   NOTE: Check if 
2dc20 74 68 65 20 74 65 73 74 20 73 75 69 74 65 20 73  the test suite s
2dc30 68 6f 75 6c 64 20 63 6f 75 6e 74 20 74 68 65 20  hould count the 
2dc40 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6e 6e 65 63  number of connec
2dc50 74 69 6f 6e 73 0d 0a 20 20 20 20 20 20 20 20 23  tions..        #
2dc60 20 20 20 20 20 20 20 22 6f 70 65 6e 65 64 22 20         "opened" 
2dc70 61 6e 64 20 22 63 6c 6f 73 65 64 22 20 66 72 6f  and "closed" fro
2dc80 6d 20 74 68 65 20 70 6f 6f 6c 20 77 68 65 6e 20  m the pool when 
2dc90 64 65 74 65 72 6d 69 6e 69 6e 67 20 69 66 20 61  determining if a
2dca0 20 74 65 73 74 0d 0a 20 20 20 20 20 20 20 20 23   test..        #
2dcb0 20 20 20 20 20 20 20 70 61 73 73 65 64 2e 20 20         passed.  
2dcc0 44 69 73 61 62 6c 69 6e 67 20 74 68 69 73 20 62  Disabling this b
2dcd0 65 68 61 76 69 6f 72 20 69 73 20 73 6f 6d 65 74  ehavior is somet
2dce0 69 6d 65 73 20 6e 65 63 65 73 73 61 72 79 20 28  imes necessary (
2dcf0 65 2e 67 2e 0d 0a 20 20 20 20 20 20 20 20 23 20  e.g...        # 
2dd00 20 20 20 20 20 20 64 75 72 69 6e 67 20 74 68 65        during the
2dd10 20 72 65 6c 65 61 73 65 20 74 65 73 74 69 6e 67   release testing
2dd20 20 70 72 6f 63 65 73 73 29 20 62 65 63 61 75 73   process) becaus
2dd30 65 20 74 68 65 72 65 20 61 72 65 20 73 65 76 65  e there are seve
2dd40 72 61 6c 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ral..        #  
2dd50 20 20 20 20 20 74 65 73 74 73 20 74 68 61 74 20       tests that 
2dd60 72 65 6c 79 20 6f 6e 20 74 68 65 20 22 6f 70 65  rely on the "ope
2dd70 6e 65 64 20 66 72 6f 6d 20 70 6f 6f 6c 22 20 63  ned from pool" c
2dd80 6f 75 6e 74 20 62 65 69 6e 67 20 67 72 65 61 74  ount being great
2dd90 65 72 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  er..        #   
2dda0 20 20 20 20 74 68 61 6e 20 7a 65 72 6f 2e 20 20      than zero.  
2ddb0 54 68 65 73 65 20 74 65 73 74 73 20 6d 61 79 20  These tests may 
2ddc0 66 61 69 6c 20 64 75 65 20 74 6f 20 74 68 65 20  fail due to the 
2ddd0 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e 69 73 74 69  non-deterministi
2dde0 63 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  c..        #    
2ddf0 20 20 20 62 65 68 61 76 69 6f 72 20 6f 66 20 74     behavior of t
2de00 68 65 20 43 4c 52 20 47 43 2c 20 65 76 65 6e 20  he CLR GC, even 
2de10 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f  when there is no
2de20 20 62 75 67 20 69 6e 20 74 68 65 20 63 6f 64 65   bug in the code
2de30 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
2de40 20 20 62 65 69 6e 67 20 74 65 73 74 65 64 2e 0d    being tested..
2de50 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
2de60 20 20 20 20 63 68 65 63 6b 46 6f 72 52 75 6e 74      checkForRunt
2de70 69 6d 65 4f 70 74 69 6f 6e 20 24 3a 3a 74 65 73  imeOption $::tes
2de80 74 5f 63 68 61 6e 6e 65 6c 20 6e 6f 50 6f 6f 6c  t_channel noPool
2de90 43 6f 75 6e 74 73 0d 0a 0d 0a 20 20 20 20 20 20  Counts....      
2dea0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
2deb0 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20 74 68  OTE: Check if th
2dec0 65 20 74 65 73 74 20 73 75 69 74 65 20 73 68 6f  e test suite sho
2ded0 75 6c 64 20 75 73 65 20 73 68 61 72 65 64 2d 63  uld use shared-c
2dee0 61 63 68 65 20 6d 6f 64 65 2e 0d 0a 20 20 20 20  ache mode...    
2def0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 63      #..        c
2df00 68 65 63 6b 46 6f 72 52 75 6e 74 69 6d 65 4f 70  heckForRuntimeOp
2df10 74 69 6f 6e 20 24 3a 3a 74 65 73 74 5f 63 68 61  tion $::test_cha
2df20 6e 6e 65 6c 20 73 68 61 72 65 64 43 61 63 68 65  nnel sharedCache
2df30 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
2df40 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52         # NOTE: R
2df50 65 70 6f 72 74 20 74 68 65 20 72 65 73 6f 75 72  eport the resour
2df60 63 65 20 75 73 61 67 65 20 70 72 69 6f 72 20 74  ce usage prior t
2df70 6f 20 72 75 6e 6e 69 6e 67 20 61 6e 79 20 74 65  o running any te
2df80 73 74 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  sts...        #.
2df90 0a 20 20 20 20 20 20 20 20 72 65 70 6f 72 74 53  .        reportS
2dfa0 51 4c 69 74 65 52 65 73 6f 75 72 63 65 73 20 24  QLiteResources $
2dfb0 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a  ::test_channel..
2dfc0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
2dfd0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 47 72 61       # NOTE: Gra
2dfe0 62 20 74 68 65 20 6c 69 73 74 20 6f 66 20 6e 61  b the list of na
2dff0 74 69 76 65 20 6d 6f 64 75 6c 65 73 20 66 6f 72  tive modules for
2e000 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 72 6f   the current pro
2e010 63 65 73 73 20 61 6e 64 0d 0a 20 20 20 20 20 20  cess and..      
2e020 20 20 23 20 20 20 20 20 20 20 72 65 70 6f 72 74    #       report
2e030 20 6f 6e 20 74 68 65 20 53 79 73 74 65 6d 2e 44   on the System.D
2e040 61 74 61 2e 53 51 4c 69 74 65 20 72 65 6c 61 74  ata.SQLite relat
2e050 65 64 20 6f 6e 65 73 2e 0d 0a 20 20 20 20 20 20  ed ones...      
2e060 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20    #..        if 
2e070 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f 62 6a 65  {[haveSQLiteObje
2e080 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65 6e  ctCommand]} then
2e090 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   {..          se
2e0a0 74 20 6d 6f 64 75 6c 65 73 20 5b 6f 62 6a 65 63  t modules [objec
2e0b0 74 20 69 6e 76 6f 6b 65 20 5c 0d 0a 20 20 20 20  t invoke \..    
2e0c0 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d            System
2e0d0 2e 44 69 61 67 6e 6f 73 74 69 63 73 2e 50 72 6f  .Diagnostics.Pro
2e0e0 63 65 73 73 2e 47 65 74 43 75 72 72 65 6e 74 50  cess.GetCurrentP
2e0f0 72 6f 63 65 73 73 20 4d 6f 64 75 6c 65 73 5d 0d  rocess Modules].
2e100 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a  ...          obj
2e110 65 63 74 20 66 6f 72 65 61 63 68 20 2d 61 6c 69  ect foreach -ali
2e120 61 73 20 6d 6f 64 75 6c 65 20 24 6d 6f 64 75 6c  as module $modul
2e130 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  es {..          
2e140 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
2e150 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 6d 6f 64   # NOTE: The mod
2e160 75 6c 65 20 66 69 6c 65 20 6e 61 6d 65 20 68 65  ule file name he
2e170 72 65 20 6d 75 73 74 20 62 65 20 6e 6f 72 6d 61  re must be norma
2e180 6c 69 7a 65 64 2e 0d 0a 20 20 20 20 20 20 20 20  lized...        
2e190 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
2e1a0 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 20     set fileName 
2e1b0 5b 66 69 6c 65 20 6e 6f 72 6d 61 6c 69 7a 65 20  [file normalize 
2e1c0 5b 24 6d 6f 64 75 6c 65 20 46 69 6c 65 4e 61 6d  [$module FileNam
2e1d0 65 5d 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e]]..           
2e1e0 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 4f 6e 6c   set fileNameOnl
2e1f0 79 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69  y [file tail $fi
2e200 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20  leName]....     
2e210 20 20 20 20 20 20 20 69 66 20 7b 5b 6c 73 65 61         if {[lsea
2e220 72 63 68 20 2d 65 78 61 63 74 20 2d 6e 6f 63 61  rch -exact -noca
2e230 73 65 20 2d 2d 20 5c 0d 0a 20 20 20 20 20 20 20  se -- \..       
2e240 20 20 20 20 20 20 20 20 20 5b 67 65 74 4e 61 74           [getNat
2e250 69 76 65 4c 69 62 72 61 72 79 46 69 6c 65 4e 61  iveLibraryFileNa
2e260 6d 65 73 4f 6e 6c 79 5d 20 24 66 69 6c 65 4e 61  mesOnly] $fileNa
2e270 6d 65 4f 6e 6c 79 5d 20 21 3d 20 2d 31 7d 20 74  meOnly] != -1} t
2e280 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
2e290 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
2e2a0 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
2e2b0 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
2e2c0 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
2e2d0 2d 20 66 6f 75 6e 64 20 6c 6f 61 64 65 64 20 53  - found loaded S
2e2e0 51 4c 69 74 65 20 6e 61 74 69 76 65 20 6c 69 62  QLite native lib
2e2f0 72 61 72 79 20 6d 6f 64 75 6c 65 3a 20 22 20 5c  rary module: " \
2e300 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2e310 20 20 20 20 24 66 69 6c 65 4e 61 6d 65 20 5c 6e      $fileName \n
2e320 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ]..            }
2e330 20 65 6c 73 65 69 66 20 7b 5b 6c 73 65 61 72 63   elseif {[lsearc
2e340 68 20 2d 65 78 61 63 74 20 2d 6e 6f 63 61 73 65  h -exact -nocase
2e350 20 2d 2d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   -- \..         
2e360 20 20 20 20 20 20 20 5b 67 65 74 49 6e 74 65 72         [getInter
2e370 6f 70 41 73 73 65 6d 62 6c 79 46 69 6c 65 4e 61  opAssemblyFileNa
2e380 6d 65 73 4f 6e 6c 79 5d 20 24 66 69 6c 65 4e 61  mesOnly] $fileNa
2e390 6d 65 4f 6e 6c 79 5d 20 21 3d 20 2d 31 7d 20 74  meOnly] != -1} t
2e3a0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
2e3b0 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
2e3c0 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
2e3d0 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
2e3e0 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
2e3f0 2d 20 66 6f 75 6e 64 20 6c 6f 61 64 65 64 20 53  - found loaded S
2e400 51 4c 69 74 65 20 69 6e 74 65 72 6f 70 20 61 73  QLite interop as
2e410 73 65 6d 62 6c 79 20 6d 6f 64 75 6c 65 3a 20 22  sembly module: "
2e420 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
2e430 20 20 20 20 20 20 24 66 69 6c 65 4e 61 6d 65 20        $fileName 
2e440 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  \n]..           
2e450 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d   }..          }.
2e460 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
2e470 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20        catch {.. 
2e480 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
2e490 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c  ::test_channel \
2e4a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2e4b0 22 2d 2d 2d 2d 20 63 6f 6d 70 69 6c 65 2d 74 69  "---- compile-ti
2e4c0 6d 65 20 6f 70 74 69 6f 6e 73 20 66 6f 72 20 53  me options for S
2e4d0 51 4c 69 74 65 20 63 6f 72 65 20 6c 69 62 72 61  QLite core libra
2e4e0 72 79 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20  ry... "....     
2e4f0 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
2e500 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f  {..            o
2e510 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c  bject invoke -fl
2e520 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c  ags +NonPublic \
2e530 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2e540 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51    System.Data.SQ
2e550 4c 69 74 65 2e 53 51 4c 69 74 65 33 20 53 51 4c  Lite.SQLite3 SQL
2e560 69 74 65 43 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e  iteCompileOption
2e570 73 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 63  s..          } c
2e580 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 73 5d 20 3d  ompileOptions] =
2e590 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
2e5a0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
2e5b0 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
2e5c0 61 70 70 65 6e 64 41 72 67 73 20 5b 66 6f 72 6d  appendArgs [form
2e5d0 61 74 4c 69 73 74 20 5b 6c 73 6f 72 74 20 5c 0d  atList [lsort \.
2e5e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2e5f0 20 24 63 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 73   $compileOptions
2e600 5d 20 3c 6e 6f 6e 65 3e 5d 20 5c 6e 5d 0d 0a 20  ] <none>] \n].. 
2e610 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20           } else 
2e620 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
2e630 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
2e640 6e 6e 65 6c 20 75 6e 6b 6e 6f 77 6e 5c 6e 0d 0a  nnel unknown\n..
2e650 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
2e660 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
2e670 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20    catch {..     
2e680 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
2e690 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20  st_channel \..  
2e6a0 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
2e6b0 2d 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f  - compile-time o
2e6c0 70 74 69 6f 6e 73 20 66 6f 72 20 53 51 4c 69 74  ptions for SQLit
2e6d0 65 20 69 6e 74 65 72 6f 70 20 61 73 73 65 6d 62  e interop assemb
2e6e0 6c 79 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20  ly... "....     
2e6f0 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
2e700 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f  {..            o
2e710 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c  bject invoke -fl
2e720 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c  ags +NonPublic \
2e730 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2e740 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51    System.Data.SQ
2e750 4c 69 74 65 2e 53 51 4c 69 74 65 33 20 49 6e 74  Lite.SQLite3 Int
2e760 65 72 6f 70 43 6f 6d 70 69 6c 65 4f 70 74 69 6f  eropCompileOptio
2e770 6e 73 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20  ns..          } 
2e780 63 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 73 5d 20  compileOptions] 
2e790 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
2e7a0 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
2e7b0 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
2e7c0 5b 61 70 70 65 6e 64 41 72 67 73 20 5b 66 6f 72  [appendArgs [for
2e7d0 6d 61 74 4c 69 73 74 20 5b 6c 73 6f 72 74 20 5c  matList [lsort \
2e7e0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2e7f0 20 20 24 63 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e    $compileOption
2e800 73 5d 20 3c 6e 6f 6e 65 3e 5d 20 5c 6e 5d 0d 0a  s] <none>] \n]..
2e810 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
2e820 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
2e830 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
2e840 61 6e 6e 65 6c 20 75 6e 6b 6e 6f 77 6e 5c 6e 0d  annel unknown\n.
2e850 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
2e860 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
2e870 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
2e880 4e 4f 54 45 3a 20 53 68 6f 77 20 74 68 65 20 61  NOTE: Show the a
2e890 63 74 69 76 65 20 74 65 73 74 20 63 6f 6e 73 74  ctive test const
2e8a0 72 61 69 6e 74 73 2e 0d 0a 20 20 20 20 20 20 20  raints...       
2e8b0 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   #..        tput
2e8c0 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
2e8d0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 2d  l [appendArgs "-
2e8e0 2d 2d 2d 20 63 6f 6e 73 74 72 61 69 6e 74 73 3a  --- constraints:
2e8f0 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   " \..          
2e900 20 20 5b 66 6f 72 6d 61 74 4c 69 73 74 20 5b 6c    [formatList [l
2e910 73 6f 72 74 20 5b 67 65 74 43 6f 6e 73 74 72 61  sort [getConstra
2e920 69 6e 74 73 5d 5d 20 3c 6e 6f 6e 65 3e 5d 20 5c  ints]] <none>] \
2e930 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d  n]....        #.
2e940 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
2e950 20 53 61 76 65 20 74 68 65 20 74 65 73 74 20 63   Save the test c
2e960 6f 6e 73 74 72 61 69 6e 74 73 20 66 6f 72 20 75  onstraints for u
2e970 73 65 20 62 79 20 74 68 72 65 61 64 73 20 63 72  se by threads cr
2e980 65 61 74 65 64 20 69 6e 20 74 68 69 73 0d 0a 20  eated in this.. 
2e990 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61         #       a
2e9a0 70 70 6c 69 63 61 74 69 6f 6e 20 64 6f 6d 61 69  pplication domai
2e9b0 6e 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63 65  n.  This is nece
2e9c0 73 73 61 72 79 20 62 65 63 61 75 73 65 20 61 6c  ssary because al
2e9d0 6c 20 74 68 65 20 45 61 67 6c 65 0d 0a 20 20 20  l the Eagle..   
2e9e0 20 20 20 20 20 23 20 20 20 20 20 20 20 22 74 65       #       "te
2e9f0 73 74 20 63 6f 6e 74 65 78 74 22 20 69 6e 66 6f  st context" info
2ea00 72 6d 61 74 69 6f 6e 20 69 73 20 70 65 72 2d 74  rmation is per-t
2ea10 68 72 65 61 64 2e 0d 0a 20 20 20 20 20 20 20 20  hread...        
2ea20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21  #..        if {!
2ea30 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74  [info exists ::t
2ea40 65 73 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 5d  est_constraints]
2ea50 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
2ea60 20 20 20 20 73 65 74 20 3a 3a 74 65 73 74 5f 63      set ::test_c
2ea70 6f 6e 73 74 72 61 69 6e 74 73 20 24 3a 3a 65 61  onstraints $::ea
2ea80 67 6c 65 5f 74 65 73 74 73 28 43 6f 6e 73 74 72  gle_tests(Constr
2ea90 61 69 6e 74 73 29 0d 0a 20 20 20 20 20 20 20 20  aints)..        
2eaa0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  }....        #..
2eab0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
2eac0 4c 6f 61 64 20 74 68 65 20 22 61 66 74 65 72 2d  Load the "after-
2ead0 63 6f 6e 73 74 72 61 69 6e 74 73 22 20 63 75 73  constraints" cus
2eae0 74 6f 6d 20 70 65 72 2d 75 73 65 72 20 61 6e 64  tom per-user and
2eaf0 2f 6f 72 20 70 65 72 2d 68 6f 73 74 0d 0a 20 20  /or per-host..  
2eb00 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 65        #       te
2eb10 73 74 20 73 65 74 74 69 6e 67 73 20 6e 6f 77 2e  st settings now.
2eb20 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
2eb30 20 20 20 20 20 75 70 6c 65 76 65 6c 20 31 20 5b       uplevel 1 [
2eb40 6c 69 73 74 20 6c 6f 61 64 53 51 4c 69 74 65 54  list loadSQLiteT
2eb50 65 73 74 53 65 74 74 69 6e 67 73 20 24 3a 3a 74  estSettings $::t
2eb60 65 73 74 5f 63 68 61 6e 6e 65 6c 20 2e 61 66 74  est_channel .aft
2eb70 65 72 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23  er]....        #
2eb80 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
2eb90 3a 20 49 66 20 6e 65 63 65 73 73 61 72 79 2c 20  : If necessary, 
2eba0 65 6e 61 62 6c 65 20 73 68 61 72 65 64 2d 63 61  enable shared-ca
2ebb0 63 68 65 20 6d 6f 64 65 20 6e 6f 77 2e 0d 0a 20  che mode now... 
2ebc0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
2ebd0 20 20 69 66 20 7b 5b 68 61 73 52 75 6e 74 69 6d    if {[hasRuntim
2ebe0 65 4f 70 74 69 6f 6e 20 73 68 61 72 65 64 43 61  eOption sharedCa
2ebf0 63 68 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  che]} then {..  
2ec00 20 20 20 20 20 20 20 20 65 6e 61 62 6c 65 53 68          enableSh
2ec10 61 72 65 64 43 61 63 68 65 20 24 3a 3a 74 65 73  aredCache $::tes
2ec20 74 5f 63 68 61 6e 6e 65 6c 20 74 72 75 65 0d 0a  t_channel true..
2ec30 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
2ec40 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
2ec50 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20 77 68 65  # NOTE: Show whe
2ec60 6e 20 6f 75 72 20 74 65 73 74 73 20 61 63 74 75  n our tests actu
2ec70 61 6c 6c 79 20 62 65 67 61 6e 20 28 6e 6f 77 29  ally began (now)
2ec80 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
2ec90 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
2eca0 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
2ecb0 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
2ecc0 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 53 79 73         "---- Sys
2ecd0 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20  tem.Data.SQLite 
2ece0 74 65 73 74 73 20 62 65 67 61 6e 20 61 74 20 22  tests began at "
2ecf0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
2ed00 5b 63 6c 6f 63 6b 20 66 6f 72 6d 61 74 20 5b 63  [clock format [c
2ed10 6c 6f 63 6b 20 73 65 63 6f 6e 64 73 5d 5d 20 5c  lock seconds]] \
2ed20 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  n]..      }..   
2ed30 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
2ed40 72 75 6e 53 51 4c 69 74 65 54 65 73 74 46 69 6c  runSQLiteTestFil
2ed50 65 73 50 72 6f 6c 6f 67 75 65 20 7b 7d 20 7b 0d  esPrologue {} {.
2ed60 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
2ed70 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20 72 75 6e  # NOTE: Skip run
2ed80 6e 69 6e 67 20 6f 75 72 20 63 75 73 74 6f 6d 20  ning our custom 
2ed90 66 69 6c 65 73 20 70 72 6f 6c 6f 67 75 65 20 69  files prologue i
2eda0 66 20 74 68 65 20 6d 61 69 6e 20 6f 6e 65 20 68  f the main one h
2edb0 61 73 20 62 65 65 6e 0d 0a 20 20 20 20 20 20 23  as been..      #
2edc0 20 20 20 20 20 20 20 73 6b 69 70 70 65 64 2e 0d         skipped..
2edd0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
2ede0 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
2edf0 73 20 3a 3a 6e 6f 28 70 72 6f 6c 6f 67 75 65 2e  s ::no(prologue.
2ee00 65 61 67 6c 65 29 5d 7d 20 74 68 65 6e 20 7b 0d  eagle)]} then {.
2ee10 0a 20 20 20 20 20 20 20 20 75 70 6c 65 76 65 6c  .        uplevel
2ee20 20 31 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20   1 {..          
2ee30 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e  #..          # N
2ee40 4f 54 45 3a 20 53 65 74 75 70 20 74 68 65 20 76  OTE: Setup the v
2ee50 61 72 69 61 62 6c 65 73 20 74 68 61 74 20 72 65  ariables that re
2ee60 66 65 72 20 74 6f 20 74 68 65 20 76 61 72 69 6f  fer to the vario
2ee70 75 73 20 6e 6f 6e 2d 64 61 74 61 20 66 69 6c 65  us non-data file
2ee80 73 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20  s..          #  
2ee90 20 20 20 20 20 72 65 71 75 69 72 65 64 20 62 79       required by
2eea0 20 74 68 65 20 74 65 73 74 73 20 69 6e 20 74 68   the tests in th
2eeb0 69 73 20 66 69 6c 65 2e 0d 0a 20 20 20 20 20 20  is file...      
2eec0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
2eed0 20 73 65 74 20 65 6e 74 69 74 79 46 72 61 6d 65   set entityFrame
2eee0 77 6f 72 6b 44 6c 6c 46 69 6c 65 20 5c 0d 0a 20  workDllFile \.. 
2eef0 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65               [ge
2ef00 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20 45  tBuildFileName E
2ef10 6e 74 69 74 79 46 72 61 6d 65 77 6f 72 6b 2e 64  ntityFramework.d
2ef20 6c 6c 20 74 72 75 65 5d 0d 0a 0d 0a 20 20 20 20  ll true]....    
2ef30 20 20 20 20 20 20 73 65 74 20 69 6e 73 74 61 6c        set instal
2ef40 6c 65 72 45 78 65 46 69 6c 65 20 5c 0d 0a 20 20  lerExeFile \..  
2ef50 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74              [get
2ef60 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20 49 6e  BuildFileName In
2ef70 73 74 61 6c 6c 65 72 2e 65 78 65 20 74 72 75 65  staller.exe true
2ef80 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 73  ]....          s
2ef90 65 74 20 73 71 6c 69 74 65 44 65 73 69 67 6e 65  et sqliteDesigne
2efa0 72 44 6c 6c 46 69 6c 65 20 5c 0d 0a 20 20 20 20  rDllFile \..    
2efb0 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 42 75            [getBu
2efc0 69 6c 64 46 69 6c 65 4e 61 6d 65 20 53 51 4c 69  ildFileName SQLi
2efd0 74 65 2e 44 65 73 69 67 6e 65 72 2e 64 6c 6c 20  te.Designer.dll 
2efe0 74 72 75 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  true]....       
2eff0 20 20 20 73 65 74 20 73 79 73 74 65 6d 44 61 74     set systemDat
2f000 61 53 51 4c 69 74 65 44 6c 6c 46 69 6c 65 20 5c  aSQLiteDllFile \
2f010 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2f020 5b 67 65 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d  [getBuildFileNam
2f030 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  e System.Data.SQ
2f040 4c 69 74 65 2e 64 6c 6c 20 74 72 75 65 5d 0d 0a  Lite.dll true]..
2f050 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
2f060 73 79 73 74 65 6d 44 61 74 61 53 51 4c 69 74 65  systemDataSQLite
2f070 4c 69 6e 71 44 6c 6c 46 69 6c 65 20 5c 0d 0a 20  LinqDllFile \.. 
2f080 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65               [ge
2f090 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20 53  tBuildFileName S
2f0a0 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
2f0b0 65 2e 4c 69 6e 71 2e 64 6c 6c 20 74 72 75 65 5d  e.Linq.dll true]
2f0c0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65  ....          se
2f0d0 74 20 73 79 73 74 65 6d 44 61 74 61 53 51 4c 69  t systemDataSQLi
2f0e0 74 65 45 66 36 44 6c 6c 46 69 6c 65 20 5c 0d 0a  teEf6DllFile \..
2f0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 67                [g
2f100 65 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20  etBuildFileName 
2f110 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
2f120 74 65 2e 45 46 36 2e 64 6c 6c 20 74 72 75 65 5d  te.EF6.dll true]
2f130 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65  ....          se
2f140 74 20 74 65 73 74 45 78 65 46 69 6c 65 20 5b 67  t testExeFile [g
2f150 65 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20  etBuildFileName 
2f160 74 65 73 74 2e 65 78 65 20 74 72 75 65 5d 0d 0a  test.exe true]..
2f170 20 20 20 20 20 20 20 20 20 20 73 65 74 20 74 65            set te
2f180 73 74 4c 69 6e 71 45 78 65 46 69 6c 65 20 5b 67  stLinqExeFile [g
2f190 65 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20  etBuildFileName 
2f1a0 74 65 73 74 6c 69 6e 71 2e 65 78 65 20 74 72 75  testlinq.exe tru
2f1b0 65 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65  e]..          se
2f1c0 74 20 74 65 73 74 45 66 36 45 78 65 46 69 6c 65  t testEf6ExeFile
2f1d0 20 5b 67 65 74 42 75 69 6c 64 46 69 6c 65 4e 61   [getBuildFileNa
2f1e0 6d 65 20 74 65 73 74 65 66 36 2e 65 78 65 20 74  me testef6.exe t
2f1f0 72 75 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  rue]....        
2f200 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23    #..          #
2f210 20 4e 4f 54 45 3a 20 53 65 74 75 70 20 74 68 65   NOTE: Setup the
2f220 20 76 61 72 69 61 62 6c 65 73 20 74 68 61 74 20   variables that 
2f230 72 65 66 65 72 20 74 6f 20 74 68 65 20 76 61 72  refer to the var
2f240 69 6f 75 73 20 64 61 74 61 20 66 69 6c 65 73 0d  ious data files.
2f250 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20  .          #    
2f260 20 20 20 72 65 71 75 69 72 65 64 20 62 79 20 74     required by t
2f270 68 65 20 74 65 73 74 73 20 69 6e 20 74 68 69 73  he tests in this
2f280 20 66 69 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20   file...        
2f290 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73    #..          s
2f2a0 65 74 20 74 65 73 74 4c 69 6e 71 4f 75 74 46 69  et testLinqOutFi
2f2b0 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e  le [file nativen
2f2c0 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c  ame [file join \
2f2d0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2f2e0 5b 67 65 74 53 51 4c 69 74 65 54 65 73 74 44 61  [getSQLiteTestDa
2f2f0 74 61 50 61 74 68 5d 20 74 65 73 74 6c 69 6e 71  taPath] testlinq
2f300 2e 6f 75 74 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20  .out]]....      
2f310 20 20 20 20 73 65 74 20 6e 6f 72 74 68 77 69 6e      set northwin
2f320 64 45 66 44 62 46 69 6c 65 20 5b 66 69 6c 65 20  dEfDbFile [file 
2f330 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65  nativename [file
2f340 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20   join \..       
2f350 20 20 20 20 20 20 20 5b 66 69 6c 65 20 64 69 72         [file dir
2f360 6e 61 6d 65 20 5b 66 69 6c 65 20 64 69 72 6e 61  name [file dirna
2f370 6d 65 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73  me [getSQLiteTes
2f380 74 44 61 74 61 50 61 74 68 5d 5d 5d 20 5c 0d 0a  tDataPath]]] \..
2f390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65                te
2f3a0 73 74 6c 69 6e 71 20 6e 6f 72 74 68 77 69 6e 64  stlinq northwind
2f3b0 45 46 2e 64 62 5d 5d 0d 0a 0d 0a 20 20 20 20 20  EF.db]]....     
2f3c0 20 20 20 20 20 73 65 74 20 6e 6f 6e 57 61 6c 44       set nonWalD
2f3d0 62 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69  bFile [file nati
2f3e0 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69  vename [file joi
2f3f0 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n \..           
2f400 20 20 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73     [getSQLiteTes
2f410 74 44 61 74 61 50 61 74 68 5d 20 6e 6f 6e 57 61  tDataPath] nonWa
2f420 6c 2e 64 62 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20  l.db]]....      
2f430 20 20 20 20 73 65 74 20 77 61 6c 44 62 46 69 6c      set walDbFil
2f440 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61  e [file nativena
2f450 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d  me [file join \.
2f460 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b  .              [
2f470 67 65 74 53 51 4c 69 74 65 54 65 73 74 44 61 74  getSQLiteTestDat
2f480 61 50 61 74 68 5d 20 77 61 6c 2e 64 62 5d 5d 0d  aPath] wal.db]].
2f490 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
2f4a0 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
2f4b0 3a 20 54 68 65 20 76 61 72 69 6f 75 73 20 69 6e  : The various in
2f4c0 73 74 61 6c 6c 2f 75 6e 69 6e 73 74 61 6c 6c 20  stall/uninstall 
2f4d0 6c 6f 67 20 66 69 6c 65 73 20 75 73 65 64 20 74  log files used t
2f4e0 6f 20 74 65 73 74 20 74 68 65 0d 0a 20 20 20 20  o test the..    
2f4f0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64 65        #       de
2f500 73 69 67 6e 2d 74 69 6d 65 20 63 6f 6d 70 6f 6e  sign-time compon
2f510 65 6e 74 20 69 6e 73 74 61 6c 6c 65 72 2e 0d 0a  ent installer...
2f520 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
2f530 20 20 20 20 20 20 20 73 65 74 20 74 65 73 74 49         set testI
2f540 6e 73 74 61 6c 6c 56 73 32 30 30 35 4c 6f 67 46  nstallVs2005LogF
2f550 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65  ile [file native
2f560 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20  name [file join 
2f570 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
2f580 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73 74 44   [getSQLiteTestD
2f590 61 74 61 50 61 74 68 5d 20 49 6e 73 74 61 6c 6c  ataPath] Install
2f5a0 65 72 5f 54 65 73 74 5f 56 73 32 30 30 35 2e 6c  er_Test_Vs2005.l
2f5b0 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  og]]....        
2f5c0 20 20 73 65 74 20 74 65 73 74 49 6e 73 74 61 6c    set testInstal
2f5d0 6c 56 73 32 30 30 38 4c 6f 67 46 69 6c 65 20 5b  lVs2008LogFile [
2f5e0 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20  file nativename 
2f5f0 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20  [file join \..  
2f600 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74              [get
2f610 53 51 4c 69 74 65 54 65 73 74 44 61 74 61 50 61  SQLiteTestDataPa
2f620 74 68 5d 20 49 6e 73 74 61 6c 6c 65 72 5f 54 65  th] Installer_Te
2f630 73 74 5f 56 73 32 30 30 38 2e 6c 6f 67 5d 5d 0d  st_Vs2008.log]].
2f640 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  ...          set
2f650 20 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30   testInstallVs20
2f660 31 30 4c 6f 67 46 69 6c 65 20 5b 66 69 6c 65 20  10LogFile [file 
2f670 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65  nativename [file
2f680 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20   join \..       
2f690 20 20 20 20 20 20 20 5b 67 65 74 53 51 4c 69 74         [getSQLit
2f6a0 65 54 65 73 74 44 61 74 61 50 61 74 68 5d 20 49  eTestDataPath] I
2f6b0 6e 73 74 61 6c 6c 65 72 5f 54 65 73 74 5f 56 73  nstaller_Test_Vs
2f6c0 32 30 31 30 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20  2010.log]]....  
2f6d0 20 20 20 20 20 20 20 20 73 65 74 20 74 65 73 74          set test
2f6e0 49 6e 73 74 61 6c 6c 56 73 32 30 31 32 4c 6f 67  InstallVs2012Log
2f6f0 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69 76  File [file nativ
2f700 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e  ename [file join
2f710 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
2f720 20 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73 74    [getSQLiteTest
2f730 44 61 74 61 50 61 74 68 5d 20 49 6e 73 74 61 6c  DataPath] Instal
2f740 6c 65 72 5f 54 65 73 74 5f 56 73 32 30 31 32 2e  ler_Test_Vs2012.
2f750 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  log]]....       
2f760 20 20 20 73 65 74 20 74 65 73 74 49 6e 73 74 61     set testInsta
2f770 6c 6c 56 73 32 30 31 33 4c 6f 67 46 69 6c 65 20  llVs2013LogFile 
2f780 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65  [file nativename
2f790 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20   [file join \.. 
2f7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65               [ge
2f7b0 74 53 51 4c 69 74 65 54 65 73 74 44 61 74 61 50  tSQLiteTestDataP
2f7c0 61 74 68 5d 20 49 6e 73 74 61 6c 6c 65 72 5f 54  ath] Installer_T
2f7d0 65 73 74 5f 56 73 32 30 31 33 2e 6c 6f 67 5d 5d  est_Vs2013.log]]
2f7e0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65  ....          se
2f7f0 74 20 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32  t testInstallVs2
2f800 30 31 35 4c 6f 67 46 69 6c 65 20 5b 66 69 6c 65  015LogFile [file
2f810 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c   nativename [fil
2f820 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20  e join \..      
2f830 20 20 20 20 20 20 20 20 5b 67 65 74 53 51 4c 69          [getSQLi
2f840 74 65 54 65 73 74 44 61 74 61 50 61 74 68 5d 20  teTestDataPath] 
2f850 49 6e 73 74 61 6c 6c 65 72 5f 54 65 73 74 5f 56  Installer_Test_V
2f860 73 32 30 31 35 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20  s2015.log]].... 
2f870 20 20 20 20 20 20 20 20 20 73 65 74 20 74 65 73           set tes
2f880 74 49 6e 73 74 61 6c 6c 56 73 32 30 31 37 4c 6f  tInstallVs2017Lo
2f890 67 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69  gFile [file nati
2f8a0 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69  vename [file joi
2f8b0 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n \..           
2f8c0 20 20 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73     [getSQLiteTes
2f8d0 74 44 61 74 61 50 61 74 68 5d 20 49 6e 73 74 61  tDataPath] Insta
2f8e0 6c 6c 65 72 5f 54 65 73 74 5f 56 73 32 30 31 37  ller_Test_Vs2017
2f8f0 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20  .log]]....      
2f900 20 20 20 20 73 65 74 20 74 65 73 74 55 6e 69 6e      set testUnin
2f910 73 74 61 6c 6c 56 73 32 30 30 35 4c 6f 67 46 69  stallVs2005LogFi
2f920 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e  le [file nativen
2f930 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c  ame [file join \
2f940 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2f950 5b 67 65 74 53 51 4c 69 74 65 54 65 73 74 44 61  [getSQLiteTestDa
2f960 74 61 50 61 74 68 5d 20 55 6e 69 6e 73 74 61 6c  taPath] Uninstal
2f970 6c 65 72 5f 54 65 73 74 5f 56 73 32 30 30 35 2e  ler_Test_Vs2005.
2f980 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  log]]....       
2f990 20 20 20 73 65 74 20 74 65 73 74 55 6e 69 6e 73     set testUnins
2f9a0 74 61 6c 6c 56 73 32 30 30 38 4c 6f 67 46 69 6c  tallVs2008LogFil
2f9b0 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61  e [file nativena
2f9c0 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d  me [file join \.
2f9d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b  .              [
2f9e0 67 65 74 53 51 4c 69 74 65 54 65 73 74 44 61 74  getSQLiteTestDat
2f9f0 61 50 61 74 68 5d 20 55 6e 69 6e 73 74 61 6c 6c  aPath] Uninstall
2fa00 65 72 5f 54 65 73 74 5f 56 73 32 30 30 38 2e 6c  er_Test_Vs2008.l
2fa10 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  og]]....        
2fa20 20 20 73 65 74 20 74 65 73 74 55 6e 69 6e 73 74    set testUninst
2fa30 61 6c 6c 56 73 32 30 31 30 4c 6f 67 46 69 6c 65  allVs2010LogFile
2fa40 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d   [file nativenam
2fa50 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a  e [file join \..
2fa60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 67                [g
2fa70 65 74 53 51 4c 69 74 65 54 65 73 74 44 61 74 61  etSQLiteTestData
2fa80 50 61 74 68 5d 20 55 6e 69 6e 73 74 61 6c 6c 65  Path] Uninstalle
2fa90 72 5f 54 65 73 74 5f 56 73 32 30 31 30 2e 6c 6f  r_Test_Vs2010.lo
2faa0 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  g]]....         
2fab0 20 73 65 74 20 74 65 73 74 55 6e 69 6e 73 74 61   set testUninsta
2fac0 6c 6c 56 73 32 30 31 32 4c 6f 67 46 69 6c 65 20  llVs2012LogFile 
2fad0 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65  [file nativename
2fae0 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20   [file join \.. 
2faf0 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65               [ge
2fb00 74 53 51 4c 69 74 65 54 65 73 74 44 61 74 61 50  tSQLiteTestDataP
2fb10 61 74 68 5d 20 55 6e 69 6e 73 74 61 6c 6c 65 72  ath] Uninstaller
2fb20 5f 54 65 73 74 5f 56 73 32 30 31 32 2e 6c 6f 67  _Test_Vs2012.log
2fb30 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  ]]....          
2fb40 73 65 74 20 74 65 73 74 55 6e 69 6e 73 74 61 6c  set testUninstal
2fb50 6c 56 73 32 30 31 33 4c 6f 67 46 69 6c 65 20 5b  lVs2013LogFile [
2fb60 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20  file nativename 
2fb70 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20  [file join \..  
2fb80 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74              [get
2fb90 53 51 4c 69 74 65 54 65 73 74 44 61 74 61 50 61  SQLiteTestDataPa
2fba0 74 68 5d 20 55 6e 69 6e 73 74 61 6c 6c 65 72 5f  th] Uninstaller_
2fbb0 54 65 73 74 5f 56 73 32 30 31 33 2e 6c 6f 67 5d  Test_Vs2013.log]
2fbc0 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 73  ]....          s
2fbd0 65 74 20 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c  et testUninstall
2fbe0 56 73 32 30 31 35 4c 6f 67 46 69 6c 65 20 5b 66  Vs2015LogFile [f
2fbf0 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b  ile nativename [
2fc00 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20  file join \..   
2fc10 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 53             [getS
2fc20 51 4c 69 74 65 54 65 73 74 44 61 74 61 50 61 74  QLiteTestDataPat
2fc30 68 5d 20 55 6e 69 6e 73 74 61 6c 6c 65 72 5f 54  h] Uninstaller_T
2fc40 65 73 74 5f 56 73 32 30 31 35 2e 6c 6f 67 5d 5d  est_Vs2015.log]]
2fc50 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65  ....          se
2fc60 74 20 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56  t testUninstallV
2fc70 73 32 30 31 37 4c 6f 67 46 69 6c 65 20 5b 66 69  s2017LogFile [fi
2fc80 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66  le nativename [f
2fc90 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20  ile join \..    
2fca0 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 53 51            [getSQ
2fcb0 4c 69 74 65 54 65 73 74 44 61 74 61 50 61 74 68  LiteTestDataPath
2fcc0 5d 20 55 6e 69 6e 73 74 61 6c 6c 65 72 5f 54 65  ] Uninstaller_Te
2fcd0 73 74 5f 56 73 32 30 31 37 2e 6c 6f 67 5d 5d 0d  st_Vs2017.log]].
2fce0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23 23 23  ...          ###
2fcf0 23 23 23 23 23 23 23 23 23 23 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 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  ##....          
2fd40 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
2fd50 73 20 3a 3a 6e 6f 28 63 68 65 63 6b 46 6f 72 53  s ::no(checkForS
2fd60 71 6c 69 74 65 46 69 6c 65 73 29 5d 7d 20 74 68  qliteFiles)]} th
2fd70 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
2fd80 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73    if {![haveCons
2fd90 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
2fda0 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20  gs file_ \..    
2fdb0 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c              [fil
2fdc0 65 20 74 61 69 6c 20 24 65 6e 74 69 74 79 46 72  e tail $entityFr
2fdd0 61 6d 65 77 6f 72 6b 44 6c 6c 46 69 6c 65 5d 5d  ameworkDllFile]]
2fde0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
2fdf0 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f           checkFo
2fe00 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e  rFile $test_chan
2fe10 6e 65 6c 20 24 65 6e 74 69 74 79 46 72 61 6d 65  nel $entityFrame
2fe20 77 6f 72 6b 44 6c 6c 46 69 6c 65 0d 0a 20 20 20  workDllFile..   
2fe30 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
2fe40 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
2fe50 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b  haveConstraint [
2fe60 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f  appendArgs file_
2fe70 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
2fe80 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24      [file tail $
2fe90 69 6e 73 74 61 6c 6c 65 72 45 78 65 46 69 6c 65  installerExeFile
2fea0 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ]]]} then {..   
2feb0 20 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b             check
2fec0 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68  ForFile $test_ch
2fed0 61 6e 6e 65 6c 20 24 69 6e 73 74 61 6c 6c 65 72  annel $installer
2fee0 45 78 65 46 69 6c 65 20 49 6e 73 74 61 6c 6c 65  ExeFile Installe
2fef0 72 2e 65 78 65 0d 0a 20 20 20 20 20 20 20 20 20  r.exe..         
2ff00 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
2ff10 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f      if {![haveCo
2ff20 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64  nstraint [append
2ff30 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20  Args file_ \..  
2ff40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 66                [f
2ff50 69 6c 65 20 74 61 69 6c 20 24 73 71 6c 69 74 65  ile tail $sqlite
2ff60 44 65 73 69 67 6e 65 72 44 6c 6c 46 69 6c 65 5d  DesignerDllFile]
2ff70 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  ]]} then {..    
2ff80 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 46            checkF
2ff90 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61  orFile $test_cha
2ffa0 6e 6e 65 6c 20 24 73 71 6c 69 74 65 44 65 73 69  nnel $sqliteDesi
2ffb0 67 6e 65 72 44 6c 6c 46 69 6c 65 0d 0a 20 20 20  gnerDllFile..   
2ffc0 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
2ffd0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
2ffe0 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b  haveConstraint [
2fff0 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f  appendArgs file_
30000 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
30010 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24      [file tail $
30020 73 79 73 74 65 6d 44 61 74 61 53 51 4c 69 74 65  systemDataSQLite
30030 44 6c 6c 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e  DllFile]]]} then
30040 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
30050 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24    checkForFile $
30060 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 73 79  test_channel $sy
30070 73 74 65 6d 44 61 74 61 53 51 4c 69 74 65 44 6c  stemDataSQLiteDl
30080 6c 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 20  lFile..         
30090 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
300a0 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f      if {![haveCo
300b0 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64  nstraint [append
300c0 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20  Args file_ \..  
300d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 66                [f
300e0 69 6c 65 20 74 61 69 6c 20 24 73 79 73 74 65 6d  ile tail $system
300f0 44 61 74 61 53 51 4c 69 74 65 4c 69 6e 71 44 6c  DataSQLiteLinqDl
30100 6c 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b  lFile]]]} then {
30110 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
30120 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65  checkForFile $te
30130 73 74 5f 63 68 61 6e 6e 65 6c 20 24 73 79 73 74  st_channel $syst
30140 65 6d 44 61 74 61 53 51 4c 69 74 65 4c 69 6e 71  emDataSQLiteLinq
30150 44 6c 6c 46 69 6c 65 0d 0a 20 20 20 20 20 20 20  DllFile..       
30160 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
30170 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65        if {![have
30180 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65  Constraint [appe
30190 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a  ndArgs file_ \..
301a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
301b0 5b 66 69 6c 65 20 74 61 69 6c 20 24 73 79 73 74  [file tail $syst
301c0 65 6d 44 61 74 61 53 51 4c 69 74 65 45 66 36 44  emDataSQLiteEf6D
301d0 6c 6c 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20  llFile]]]} then 
301e0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
301f0 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74   checkForFile $t
30200 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 73 79 73  est_channel $sys
30210 74 65 6d 44 61 74 61 53 51 4c 69 74 65 45 66 36  temDataSQLiteEf6
30220 44 6c 6c 46 69 6c 65 0d 0a 20 20 20 20 20 20 20  DllFile..       
30230 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
30240 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65        if {![have
30250 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65  Constraint [appe
30260 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a  ndArgs file_ \..
30270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30280 5b 66 69 6c 65 20 74 61 69 6c 20 24 74 65 73 74  [file tail $test
30290 45 78 65 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e  ExeFile]]]} then
302a0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
302b0 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24    checkForFile $
302c0 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65  test_channel $te
302d0 73 74 45 78 65 46 69 6c 65 20 74 65 73 74 2e 65  stExeFile test.e
302e0 78 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  xe..            
302f0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
30300 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74   if {![haveConst
30310 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67  raint [appendArg
30320 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20  s file_ \..     
30330 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65             [file
30340 20 74 61 69 6c 20 24 74 65 73 74 4c 69 6e 71 45   tail $testLinqE
30350 78 65 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20  xeFile]]]} then 
30360 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
30370 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74   checkForFile $t
30380 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73  est_channel $tes
30390 74 4c 69 6e 71 45 78 65 46 69 6c 65 20 74 65 73  tLinqExeFile tes
303a0 74 6c 69 6e 71 2e 65 78 65 0d 0a 20 20 20 20 20  tlinq.exe..     
303b0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
303c0 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61          if {![ha
303d0 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70  veConstraint [ap
303e0 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c  pendArgs file_ \
303f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
30400 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 74 65    [file tail $te
30410 73 74 45 66 36 45 78 65 46 69 6c 65 5d 5d 5d 7d  stEf6ExeFile]]]}
30420 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
30430 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46         checkForF
30440 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65  ile $test_channe
30450 6c 20 24 74 65 73 74 45 66 36 45 78 65 46 69 6c  l $testEf6ExeFil
30460 65 20 74 65 73 74 65 66 36 2e 65 78 65 0d 0a 20  e testef6.exe.. 
30470 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
30480 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
30490 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74  ![haveConstraint
304a0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c   [appendArgs fil
304b0 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  e_ \..          
304c0 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c        [file tail
304d0 20 24 74 65 73 74 4c 69 6e 71 4f 75 74 46 69 6c   $testLinqOutFil
304e0 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  e]]]} then {..  
304f0 20 20 20 20 20 20 20 20 20 20 20 20 63 68 65 63              chec
30500 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63  kForFile $test_c
30510 68 61 6e 6e 65 6c 20 24 74 65 73 74 4c 69 6e 71  hannel $testLinq
30520 4f 75 74 46 69 6c 65 0d 0a 20 20 20 20 20 20 20  OutFile..       
30530 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
30540 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65        if {![have
30550 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65  Constraint [appe
30560 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a  ndArgs file_ \..
30570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30580 5b 66 69 6c 65 20 74 61 69 6c 20 24 6e 6f 72 74  [file tail $nort
30590 68 77 69 6e 64 45 66 44 62 46 69 6c 65 5d 5d 5d  hwindEfDbFile]]]
305a0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
305b0 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72          checkFor
305c0 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e  File $test_chann
305d0 65 6c 20 24 6e 6f 72 74 68 77 69 6e 64 45 66 44  el $northwindEfD
305e0 62 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 20  bFile..         
305f0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
30600 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f      if {![haveCo
30610 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64  nstraint [append
30620 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20  Args file_ \..  
30630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 66                [f
30640 69 6c 65 20 74 61 69 6c 20 24 6e 6f 6e 57 61 6c  ile tail $nonWal
30650 44 62 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20  DbFile]]]} then 
30660 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
30670 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74   checkForFile $t
30680 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 6e 6f 6e  est_channel $non
30690 57 61 6c 44 62 46 69 6c 65 0d 0a 20 20 20 20 20  WalDbFile..     
306a0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
306b0 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61          if {![ha
306c0 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70  veConstraint [ap
306d0 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c  pendArgs file_ \
306e0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
306f0 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 77 61    [file tail $wa
30700 6c 44 62 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e  lDbFile]]]} then
30710 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
30720 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24    checkForFile $
30730 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 77 61  test_channel $wa
30740 6c 44 62 46 69 6c 65 0d 0a 20 20 20 20 20 20 20  lDbFile..       
30750 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
30760 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65        if {![have
30770 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65  Constraint [appe
30780 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a  ndArgs file_ \..
30790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
307a0 5b 66 69 6c 65 20 74 61 69 6c 20 24 74 65 73 74  [file tail $test
307b0 49 6e 73 74 61 6c 6c 56 73 32 30 30 35 4c 6f 67  InstallVs2005Log
307c0 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d  File]]]} then {.
307d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  .              c
307e0 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73  heckForFile $tes
307f0 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73 74 49  t_channel $testI
30800 6e 73 74 61 6c 6c 56 73 32 30 30 35 4c 6f 67 46  nstallVs2005LogF
30810 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ile..           
30820 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
30830 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73    if {![haveCons
30840 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
30850 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20  gs file_ \..    
30860 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c              [fil
30870 65 20 74 61 69 6c 20 24 74 65 73 74 49 6e 73 74  e tail $testInst
30880 61 6c 6c 56 73 32 30 30 38 4c 6f 67 46 69 6c 65  allVs2008LogFile
30890 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ]]]} then {..   
308a0 20 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b             check
308b0 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68  ForFile $test_ch
308c0 61 6e 6e 65 6c 20 24 74 65 73 74 49 6e 73 74 61  annel $testInsta
308d0 6c 6c 56 73 32 30 30 38 4c 6f 67 46 69 6c 65 0d  llVs2008LogFile.
308e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
308f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
30900 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69   {![haveConstrai
30910 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66  nt [appendArgs f
30920 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20  ile_ \..        
30930 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61          [file ta
30940 69 6c 20 24 74 65 73 74 49 6e 73 74 61 6c 6c 56  il $testInstallV
30950 73 32 30 31 30 4c 6f 67 46 69 6c 65 5d 5d 5d 7d  s2010LogFile]]]}
30960 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
30970 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46         checkForF
30980 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65  ile $test_channe
30990 6c 20 24 74 65 73 74 49 6e 73 74 61 6c 6c 56 73  l $testInstallVs
309a0 32 30 31 30 4c 6f 67 46 69 6c 65 0d 0a 20 20 20  2010LogFile..   
309b0 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
309c0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
309d0 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b  haveConstraint [
309e0 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f  appendArgs file_
309f0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
30a00 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24      [file tail $
30a10 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 31  testInstallVs201
30a20 32 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74 68 65  2LogFile]]]} the
30a30 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
30a40 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20     checkForFile 
30a50 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74  $test_channel $t
30a60 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 31 32  estInstallVs2012
30a70 4c 6f 67 46 69 6c 65 0d 0a 20 20 20 20 20 20 20  LogFile..       
30a80 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
30a90 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65        if {![have
30aa0 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65  Constraint [appe
30ab0 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a  ndArgs file_ \..
30ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30ad0 5b 66 69 6c 65 20 74 61 69 6c 20 24 74 65 73 74  [file tail $test
30ae0 49 6e 73 74 61 6c 6c 56 73 32 30 31 33 4c 6f 67  InstallVs2013Log
30af0 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d  File]]]} then {.
30b00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  .              c
30b10 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73  heckForFile $tes
30b20 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73 74 49  t_channel $testI
30b30 6e 73 74 61 6c 6c 56 73 32 30 31 33 4c 6f 67 46  nstallVs2013LogF
30b40 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ile..           
30b50 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
30b60 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73    if {![haveCons
30b70 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
30b80 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20  gs file_ \..    
30b90 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c              [fil
30ba0 65 20 74 61 69 6c 20 24 74 65 73 74 49 6e 73 74  e tail $testInst
30bb0 61 6c 6c 56 73 32 30 31 35 4c 6f 67 46 69 6c 65  allVs2015LogFile
30bc0 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ]]]} then {..   
30bd0 20 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b             check
30be0 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68  ForFile $test_ch
30bf0 61 6e 6e 65 6c 20 24 74 65 73 74 49 6e 73 74 61  annel $testInsta
30c00 6c 6c 56 73 32 30 31 35 4c 6f 67 46 69 6c 65 0d  llVs2015LogFile.
30c10 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
30c20 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
30c30 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69   {![haveConstrai
30c40 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66  nt [appendArgs f
30c50 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20  ile_ \..        
30c60 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61          [file ta
30c70 69 6c 20 24 74 65 73 74 49 6e 73 74 61 6c 6c 56  il $testInstallV
30c80 73 32 30 31 37 4c 6f 67 46 69 6c 65 5d 5d 5d 7d  s2017LogFile]]]}
30c90 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
30ca0 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46         checkForF
30cb0 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65  ile $test_channe
30cc0 6c 20 24 74 65 73 74 49 6e 73 74 61 6c 6c 56 73  l $testInstallVs
30cd0 32 30 31 37 4c 6f 67 46 69 6c 65 0d 0a 20 20 20  2017LogFile..   
30ce0 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
30cf0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
30d00 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b  haveConstraint [
30d10 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f  appendArgs file_
30d20 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
30d30 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24      [file tail $
30d40 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32  testUninstallVs2
30d50 30 30 35 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74  005LogFile]]]} t
30d60 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
30d70 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c       checkForFil
30d80 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  e $test_channel 
30d90 24 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73  $testUninstallVs
30da0 32 30 30 35 4c 6f 67 46 69 6c 65 0d 0a 20 20 20  2005LogFile..   
30db0 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
30dc0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
30dd0 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b  haveConstraint [
30de0 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f  appendArgs file_
30df0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
30e00 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24      [file tail $
30e10 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32  testUninstallVs2
30e20 30 30 38 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74  008LogFile]]]} t
30e30 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
30e40 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c       checkForFil
30e50 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  e $test_channel 
30e60 24 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73  $testUninstallVs
30e70 32 30 30 38 4c 6f 67 46 69 6c 65 0d 0a 20 20 20  2008LogFile..   
30e80 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
30e90 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
30ea0 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b  haveConstraint [
30eb0 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f  appendArgs file_
30ec0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
30ed0 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24      [file tail $
30ee0 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32  testUninstallVs2
30ef0 30 31 30 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74  010LogFile]]]} t
30f00 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
30f10 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c       checkForFil
30f20 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  e $test_channel 
30f30 24 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73  $testUninstallVs
30f40 32 30 31 30 4c 6f 67 46 69 6c 65 0d 0a 20 20 20  2010LogFile..   
30f50 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
30f60 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
30f70 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b  haveConstraint [
30f80 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f  appendArgs file_
30f90 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
30fa0 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24      [file tail $
30fb0 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32  testUninstallVs2
30fc0 30 31 32 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74  012LogFile]]]} t
30fd0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
30fe0 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c       checkForFil
30ff0 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  e $test_channel 
31000 24 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73  $testUninstallVs
31010 32 30 31 32 4c 6f 67 46 69 6c 65 0d 0a 20 20 20  2012LogFile..   
31020 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
31030 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
31040 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b  haveConstraint [
31050 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f  appendArgs file_
31060 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
31070 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24      [file tail $
31080 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32  testUninstallVs2
31090 30 31 33 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74  013LogFile]]]} t
310a0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
310b0 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c       checkForFil
310c0 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  e $test_channel 
310d0 24 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73  $testUninstallVs
310e0 32 30 31 33 4c 6f 67 46 69 6c 65 0d 0a 20 20 20  2013LogFile..   
310f0 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
31100 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
31110 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b  haveConstraint [
31120 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f  appendArgs file_
31130 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
31140 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24      [file tail $
31150 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32  testUninstallVs2
31160 30 31 35 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74  015LogFile]]]} t
31170 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
31180 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c       checkForFil
31190 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  e $test_channel 
311a0 24 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73  $testUninstallVs
311b0 32 30 31 35 4c 6f 67 46 69 6c 65 0d 0a 20 20 20  2015LogFile..   
311c0 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
311d0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
311e0 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b  haveConstraint [
311f0 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f  appendArgs file_
31200 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
31210 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24      [file tail $
31220 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32  testUninstallVs2
31230 30 31 37 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74  017LogFile]]]} t
31240 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
31250 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c       checkForFil
31260 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  e $test_channel 
31270 24 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73  $testUninstallVs
31280 32 30 31 37 4c 6f 67 46 69 6c 65 0d 0a 20 20 20  2017LogFile..   
31290 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
312a0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
312b0 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20   }..      }..   
312c0 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
312d0 72 75 6e 53 51 4c 69 74 65 54 65 73 74 46 69 6c  runSQLiteTestFil
312e0 65 73 45 70 69 6c 6f 67 75 65 20 7b 7d 20 7b 0d  esEpilogue {} {.
312f0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
31300 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20 72 75 6e  # NOTE: Skip run
31310 6e 69 6e 67 20 6f 75 72 20 63 75 73 74 6f 6d 20  ning our custom 
31320 66 69 6c 65 73 20 65 70 69 6c 6f 67 75 65 20 69  files epilogue i
31330 66 20 74 68 65 20 6d 61 69 6e 20 6f 6e 65 20 68  f the main one h
31340 61 73 20 62 65 65 6e 0d 0a 20 20 20 20 20 20 23  as been..      #
31350 20 20 20 20 20 20 20 73 6b 69 70 70 65 64 2e 0d         skipped..
31360 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
31370 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
31380 73 20 3a 3a 6e 6f 28 65 70 69 6c 6f 67 75 65 2e  s ::no(epilogue.
31390 65 61 67 6c 65 29 5d 7d 20 74 68 65 6e 20 7b 0d  eagle)]} then {.
313a0 0a 20 20 20 20 20 20 20 20 75 70 6c 65 76 65 6c  .        uplevel
313b0 20 31 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20   1 {..          
313c0 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69  unset -nocomplai
313d0 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n \..           
313e0 20 20 20 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c     testUninstall
313f0 56 73 32 30 31 37 4c 6f 67 46 69 6c 65 20 74 65  Vs2017LogFile te
31400 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31  stUninstallVs201
31410 35 4c 6f 67 46 69 6c 65 20 5c 0d 0a 20 20 20 20  5LogFile \..    
31420 20 20 20 20 20 20 20 20 20 20 74 65 73 74 55 6e            testUn
31430 69 6e 73 74 61 6c 6c 56 73 32 30 31 33 4c 6f 67  installVs2013Log
31440 46 69 6c 65 20 74 65 73 74 55 6e 69 6e 73 74 61  File testUninsta
31450 6c 6c 56 73 32 30 31 32 4c 6f 67 46 69 6c 65 20  llVs2012LogFile 
31460 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
31470 20 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73   testUninstallVs
31480 32 30 31 30 4c 6f 67 46 69 6c 65 20 74 65 73 74  2010LogFile test
31490 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 30 38 4c  UninstallVs2008L
314a0 6f 67 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20  ogFile \..      
314b0 20 20 20 20 20 20 20 20 74 65 73 74 55 6e 69 6e          testUnin
314c0 73 74 61 6c 6c 56 73 32 30 30 35 4c 6f 67 46 69  stallVs2005LogFi
314d0 6c 65 20 74 65 73 74 49 6e 73 74 61 6c 6c 56 73  le testInstallVs
314e0 32 30 31 37 4c 6f 67 46 69 6c 65 20 5c 0d 0a 20  2017LogFile \.. 
314f0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73               tes
31500 74 49 6e 73 74 61 6c 6c 56 73 32 30 31 35 4c 6f  tInstallVs2015Lo
31510 67 46 69 6c 65 20 74 65 73 74 49 6e 73 74 61 6c  gFile testInstal
31520 6c 56 73 32 30 31 33 4c 6f 67 46 69 6c 65 20 5c  lVs2013LogFile \
31530 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
31540 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 31  testInstallVs201
31550 32 4c 6f 67 46 69 6c 65 20 74 65 73 74 49 6e 73  2LogFile testIns
31560 74 61 6c 6c 56 73 32 30 31 30 4c 6f 67 46 69 6c  tallVs2010LogFil
31570 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
31580 20 20 20 74 65 73 74 49 6e 73 74 61 6c 6c 56 73     testInstallVs
31590 32 30 30 38 4c 6f 67 46 69 6c 65 20 74 65 73 74  2008LogFile test
315a0 49 6e 73 74 61 6c 6c 56 73 32 30 30 35 4c 6f 67  InstallVs2005Log
315b0 46 69 6c 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20  File....        
315c0 20 20 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c    unset -nocompl
315d0 61 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ain \..         
315e0 20 20 20 20 20 6e 6f 72 74 68 77 69 6e 64 45 66       northwindEf
315f0 44 62 46 69 6c 65 20 74 65 73 74 4c 69 6e 71 4f  DbFile testLinqO
31600 75 74 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20  utFile \..      
31610 20 20 20 20 20 20 20 20 77 61 6c 44 62 46 69 6c          walDbFil
31620 65 20 6e 6f 6e 57 61 6c 44 62 46 69 6c 65 0d 0a  e nonWalDbFile..
31630 0d 0a 20 20 20 20 20 20 20 20 20 20 75 6e 73 65  ..          unse
31640 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 5c 0d  t -nocomplain \.
31650 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  .              t
31660 65 73 74 45 66 36 45 78 65 46 69 6c 65 20 74 65  estEf6ExeFile te
31670 73 74 4c 69 6e 71 45 78 65 46 69 6c 65 20 5c 0d  stLinqExeFile \.
31680 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  .              t
31690 65 73 74 45 78 65 46 69 6c 65 20 73 79 73 74 65  estExeFile syste
316a0 6d 44 61 74 61 53 51 4c 69 74 65 45 66 36 44 6c  mDataSQLiteEf6Dl
316b0 6c 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20  lFile \..       
316c0 20 20 20 20 20 20 20 73 79 73 74 65 6d 44 61 74         systemDat
316d0 61 53 51 4c 69 74 65 4c 69 6e 71 44 6c 6c 46 69  aSQLiteLinqDllFi
316e0 6c 65 20 73 79 73 74 65 6d 44 61 74 61 53 51 4c  le systemDataSQL
316f0 69 74 65 44 6c 6c 46 69 6c 65 20 5c 0d 0a 20 20  iteDllFile \..  
31700 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
31710 74 65 44 65 73 69 67 6e 65 72 44 6c 6c 46 69 6c  teDesignerDllFil
31720 65 20 69 6e 73 74 61 6c 6c 65 72 45 78 65 46 69  e installerExeFi
31730 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  le \..          
31740 20 20 20 20 65 6e 74 69 74 79 46 72 61 6d 65 77      entityFramew
31750 6f 72 6b 44 6c 6c 46 69 6c 65 0d 0a 20 20 20 20  orkDllFile..    
31760 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
31770 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
31780 6f 63 20 72 75 6e 53 51 4c 69 74 65 54 65 73 74  oc runSQLiteTest
31790 45 70 69 6c 6f 67 75 65 20 7b 7d 20 7b 0d 0a 20  Epilogue {} {.. 
317a0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
317b0 4e 4f 54 45 3a 20 53 6b 69 70 20 72 75 6e 6e 69  NOTE: Skip runni
317c0 6e 67 20 6f 75 72 20 63 75 73 74 6f 6d 20 65 70  ng our custom ep
317d0 69 6c 6f 67 75 65 20 69 66 20 74 68 65 20 6d 61  ilogue if the ma
317e0 69 6e 20 6f 6e 65 20 68 61 73 20 62 65 65 6e 0d  in one has been.
317f0 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73  .      #       s
31800 6b 69 70 70 65 64 2e 0d 0a 20 20 20 20 20 20 23  kipped...      #
31810 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e  ..      if {![in
31820 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 65  fo exists ::no(e
31830 70 69 6c 6f 67 75 65 2e 65 61 67 6c 65 29 5d 7d  pilogue.eagle)]}
31840 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
31850 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
31860 54 45 3a 20 53 68 6f 77 20 77 68 65 6e 20 6f 75  TE: Show when ou
31870 72 20 74 65 73 74 73 20 61 63 74 75 61 6c 6c 79  r tests actually
31880 20 65 6e 64 65 64 20 28 6e 6f 77 29 2e 0d 0a 20   ended (now)... 
31890 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
318a0 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
318b0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
318c0 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
318d0 20 20 20 22 2d 2d 2d 2d 20 53 79 73 74 65 6d 2e     "---- System.
318e0 44 61 74 61 2e 53 51 4c 69 74 65 20 74 65 73 74  Data.SQLite test
318f0 73 20 65 6e 64 65 64 20 61 74 20 22 20 5c 0d 0a  s ended at " \..
31900 20 20 20 20 20 20 20 20 20 20 20 20 5b 63 6c 6f              [clo
31910 63 6b 20 66 6f 72 6d 61 74 20 5b 63 6c 6f 63 6b  ck format [clock
31920 20 73 65 63 6f 6e 64 73 5d 5d 20 5c 6e 5d 0d 0a   seconds]] \n]..
31930 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
31940 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4c 6f 61       # NOTE: Loa
31950 64 20 74 68 65 20 22 65 70 69 6c 6f 67 75 65 22  d the "epilogue"
31960 20 63 75 73 74 6f 6d 20 70 65 72 2d 75 73 65 72   custom per-user
31970 20 61 6e 64 2f 6f 72 20 70 65 72 2d 68 6f 73 74   and/or per-host
31980 20 74 65 73 74 0d 0a 20 20 20 20 20 20 20 20 23   test..        #
31990 20 20 20 20 20 20 20 73 65 74 74 69 6e 67 73 20         settings 
319a0 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  now...        #.
319b0 0a 20 20 20 20 20 20 20 20 75 70 6c 65 76 65 6c  .        uplevel
319c0 20 31 20 5b 6c 69 73 74 20 6c 6f 61 64 53 51 4c   1 [list loadSQL
319d0 69 74 65 54 65 73 74 53 65 74 74 69 6e 67 73 20  iteTestSettings 
319e0 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
319f0 2e 65 70 69 6c 6f 67 75 65 5d 0d 0a 0d 0a 20 20  .epilogue]....  
31a00 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
31a10 20 23 20 42 55 47 46 49 58 3a 20 42 65 66 6f 72   # BUGFIX: Befor
31a20 65 20 63 68 65 63 6b 69 6e 67 20 74 68 65 20 66  e checking the f
31a30 69 6e 61 6c 20 72 65 73 6f 75 72 63 65 73 20 69  inal resources i
31a40 6e 20 75 73 65 20 62 79 20 53 51 4c 69 74 65 2c  n use by SQLite,
31a50 20 6d 61 6b 65 0d 0a 20 20 20 20 20 20 20 20 23   make..        #
31a60 20 20 20 20 20 20 20 20 20 73 75 72 65 20 62 6f           sure bo
31a70 74 68 20 6f 66 20 74 68 65 20 50 52 41 47 4d 41  th of the PRAGMA
31a80 20 72 65 6c 61 74 65 64 20 64 69 72 65 63 74 6f   related directo
31a90 72 79 20 6e 61 6d 65 73 20 61 72 65 20 66 72 65  ry names are fre
31aa0 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ed...        #..
31ab0 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72          checkFor
31ac0 53 51 4c 69 74 65 44 69 72 65 63 74 6f 72 69 65  SQLiteDirectorie
31ad0 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
31ae0 6c 20 74 72 75 65 0d 0a 0d 0a 20 20 20 20 20 20  l true....      
31af0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
31b00 4f 54 45 3a 20 41 6c 73 6f 20 72 65 70 6f 72 74  OTE: Also report
31b10 20 74 68 65 20 72 65 73 6f 75 72 63 65 20 75 73   the resource us
31b20 61 67 65 20 61 66 74 65 72 20 72 75 6e 6e 69 6e  age after runnin
31b30 67 20 74 68 65 20 74 65 73 74 73 2e 0d 0a 20 20  g the tests...  
31b40 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
31b50 20 72 65 70 6f 72 74 53 51 4c 69 74 65 52 65 73   reportSQLiteRes
31b60 6f 75 72 63 65 73 20 24 3a 3a 74 65 73 74 5f 63  ources $::test_c
31b70 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20 20  hannel....      
31b80 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
31b90 4f 54 45 3a 20 52 65 70 6f 72 74 20 74 68 65 20  OTE: Report the 
31ba0 63 72 69 74 69 63 61 6c 20 68 61 6e 64 6c 65 20  critical handle 
31bb0 63 6f 75 6e 74 73 20 61 66 74 65 72 20 72 75 6e  counts after run
31bc0 6e 69 6e 67 20 74 68 65 20 74 65 73 74 73 2e 0d  ning the tests..
31bd0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
31be0 20 20 20 20 67 65 74 53 51 4c 69 74 65 48 61 6e      getSQLiteHan
31bf0 64 6c 65 43 6f 75 6e 74 73 20 24 3a 3a 74 65 73  dleCounts $::tes
31c00 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20  t_channel....   
31c10 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
31c20 23 20 4e 4f 54 45 3a 20 49 66 20 6e 65 63 65 73  # NOTE: If neces
31c30 73 61 72 79 2c 20 64 69 73 61 62 6c 65 20 73 68  sary, disable sh
31c40 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 20  ared-cache mode 
31c50 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  now...        #.
31c60 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 68 61  .        if {[ha
31c70 73 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 73  sRuntimeOption s
31c80 68 61 72 65 64 43 61 63 68 65 5d 7d 20 74 68 65  haredCache]} the
31c90 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 65  n {..          e
31ca0 6e 61 62 6c 65 53 68 61 72 65 64 43 61 63 68 65  nableSharedCache
31cb0 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
31cc0 20 66 61 6c 73 65 0d 0a 20 20 20 20 20 20 20 20   false..        
31cd0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  }....        #..
31ce0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
31cf0 52 65 73 74 6f 72 65 20 74 68 65 20 70 72 65 76  Restore the prev
31d00 69 6f 75 73 6c 79 20 73 61 76 65 64 20 65 6e 76  iously saved env
31d10 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c  ironment variabl
31d20 65 73 20 74 68 61 74 20 77 65 0d 0a 20 20 20 20  es that we..    
31d30 20 20 20 20 23 20 20 20 20 20 20 20 63 68 61 6e      #       chan
31d40 67 65 64 20 66 6f 72 20 74 68 65 20 74 65 73 74  ged for the test
31d50 20 73 75 69 74 65 2e 0d 0a 20 20 20 20 20 20 20   suite...       
31d60 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 73 74   #..        rest
31d70 6f 72 65 45 6e 76 69 72 6f 6e 6d 65 6e 74 56 61  oreEnvironmentVa
31d80 72 69 61 62 6c 65 73 20 5c 0d 0a 20 20 20 20 20  riables \..     
31d90 20 20 20 20 20 20 20 5b 6c 69 73 74 20 49 6e 69         [list Ini
31da0 74 69 61 6c 69 7a 65 5f 53 51 4c 69 74 65 4c 6f  tialize_SQLiteLo
31db0 67 5d 20 3a 3a 74 65 73 74 53 75 69 74 65 53 61  g] ::testSuiteSa
31dc0 76 65 64 45 6e 76 0d 0a 20 20 20 20 20 20 7d 0d  vedEnv..      }.
31dd0 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 23  .    }.....    #
31de0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
31df0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
31e00 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
31e10 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
31e20 23 23 23 23 23 23 23 23 23 23 0d 0a 20 20 20 20  ##########..    
31e30 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
31e40 23 23 23 23 23 23 23 23 23 23 23 23 23 20 45 4e  ############# EN
31e50 44 20 45 61 67 6c 65 20 4f 4e 4c 59 20 23 23 23  D Eagle ONLY ###
31e60 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
31e70 23 23 23 23 23 23 23 23 23 23 23 0d 0a 20 20 20  ###########..   
31e80 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23   ###############
31e90 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
31ea0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
31eb0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
31ec0 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a 20 20  ############..  
31ed0 7d 0d 0a 0d 0a 20 20 23 0d 0a 20 20 23 20 4e 4f  }....  #..  # NO
31ee0 54 45 3a 20 53 61 76 65 20 74 68 65 20 6e 61 6d  TE: Save the nam
31ef0 65 20 6f 66 20 74 68 65 20 64 69 72 65 63 74 6f  e of the directo
31f00 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ry containing th
31f10 69 73 20 66 69 6c 65 2e 0d 0a 20 20 23 0d 0a 20  is file...  #.. 
31f20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
31f30 74 73 20 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74  ts common_direct
31f40 6f 72 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ory]} then {..  
31f50 20 20 73 65 74 20 63 6f 6d 6d 6f 6e 5f 64 69 72    set common_dir
31f60 65 63 74 6f 72 79 20 5b 66 69 6c 65 20 64 69 72  ectory [file dir
31f70 6e 61 6d 65 20 5b 69 6e 66 6f 20 73 63 72 69 70  name [info scrip
31f80 74 5d 5d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 23 0d  t]]..  }....  #.
31f90 0a 20 20 23 20 4e 4f 54 45 3a 20 50 72 6f 76 69  .  # NOTE: Provi
31fa0 64 65 20 74 68 65 20 53 79 73 74 65 6d 2e 44 61  de the System.Da
31fb0 74 61 2e 53 51 4c 69 74 65 20 74 65 73 74 20 70  ta.SQLite test p
31fc0 61 63 6b 61 67 65 20 74 6f 20 74 68 65 20 69 6e  ackage to the in
31fd0 74 65 72 70 72 65 74 65 72 2e 0d 0a 20 20 23 0d  terpreter...  #.
31fe0 0a 20 20 70 61 63 6b 61 67 65 20 70 72 6f 76 69  .  package provi
31ff0 64 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  de System.Data.S
32000 51 4c 69 74 65 2e 54 65 73 74 20 31 2e 30 0d 0a  QLite.Test 1.0..
32010 7d 0d 0a                                         }..