System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact b2b72feda41b47930ea23ee7e9062a0402b35bab:


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 4e 61 74 69 76 65 20 7b 7d 20 7b  BuildNative {} {
0910: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
0920: 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69   # NOTE: Check i
0930: 66 20 77 65 20 61 72 65 20 62 65 69 6e 67 20 66  f we are being f
0940: 6f 72 63 65 64 20 74 6f 20 74 72 65 61 74 20 74  orced to treat t
0950: 68 69 73 20 61 73 20 61 20 6e 61 74 69 76 65 20  his as a native 
0960: 62 75 69 6c 64 2e 0d 0a 20 20 20 20 20 20 23 20  build...      # 
0970: 20 20 20 20 20 20 54 68 69 73 20 69 73 20 6e 6f        This is no
0980: 72 6d 61 6c 6c 79 20 64 6f 6e 65 20 28 61 75 74  rmally done (aut
0990: 6f 6d 61 74 69 63 61 6c 6c 79 29 20 6f 6e 6c 79  omatically) only
09a0: 20 77 68 65 6e 20 74 68 65 20 6d 69 78 65 64 2d   when the mixed-
09b0: 6d 6f 64 65 0d 0a 20 20 20 20 20 20 23 20 20 20  mode..      #   
09c0: 20 20 20 20 61 73 73 65 6d 62 6c 79 20 69 73 20      assembly is 
09d0: 69 6e 20 75 73 65 3b 20 68 6f 77 65 76 65 72 2c  in use; however,
09e0: 20 69 6e 20 73 6f 6d 65 20 63 69 72 63 75 6d 73   in some circums
09f0: 74 61 6e 63 65 73 20 69 74 20 69 73 20 75 73 65  tances it is use
0a00: 66 75 6c 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ful..      #    
0a10: 20 20 20 74 6f 20 66 6f 72 63 65 20 74 68 69 73     to force this
0a20: 20 62 65 68 61 76 69 6f 72 2e 0d 0a 20 20 20 20   behavior...    
0a30: 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
0a40: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65  info exists ::te
0a50: 73 74 5f 6e 61 74 69 76 65 5d 20 26 26 20 5c 0d  st_native] && \.
0a60: 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69  .          [stri
0a70: 6e 67 20 69 73 20 62 6f 6f 6c 65 61 6e 20 2d 73  ng is boolean -s
0a80: 74 72 69 63 74 20 24 3a 3a 74 65 73 74 5f 6e 61  trict $::test_na
0a90: 74 69 76 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  tive]} then {.. 
0aa0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a         return $:
0ab0: 3a 74 65 73 74 5f 6e 61 74 69 76 65 0d 0a 20 20  :test_native..  
0ac0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
0ad0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c        return fal
0ae0: 73 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  se..      }..   
0af0: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
0b00: 67 65 74 42 75 69 6c 64 59 65 61 72 20 7b 7d 20  getBuildYear {} 
0b10: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
0b20: 20 20 23 20 4e 4f 54 45 3a 20 53 65 65 20 69 66    # NOTE: See if
0b30: 20 74 68 65 20 22 79 65 61 72 22 20 73 65 74 74   the "year" sett
0b40: 69 6e 67 20 68 61 73 20 62 65 65 6e 20 6f 76 65  ing has been ove
0b50: 72 72 69 64 64 65 6e 20 62 79 20 74 68 65 20 75  rridden by the u
0b60: 73 65 72 20 28 65 2e 67 2e 0d 0a 20 20 20 20 20  ser (e.g...     
0b70: 20 23 20 20 20 20 20 20 20 6f 6e 20 74 68 65 20   #       on the 
0b80: 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 29 2e 20 20  command line).  
0b90: 54 68 69 73 20 68 65 6c 70 73 20 63 6f 6e 74 72  This helps contr
0ba0: 6f 6c 20 65 78 61 63 74 6c 79 20 77 68 69 63 68  ol exactly which
0bb0: 20 73 65 74 20 6f 66 0d 0a 20 20 20 20 20 20 23   set of..      #
0bc0: 20 20 20 20 20 20 20 62 69 6e 61 72 69 65 73 20         binaries 
0bd0: 77 65 20 61 72 65 20 74 65 73 74 69 6e 67 2c 20  we are testing, 
0be0: 74 68 6f 73 65 20 70 72 6f 64 75 63 65 64 20 75  those produced u
0bf0: 73 69 6e 67 20 74 68 65 20 56 69 73 75 61 6c 20  sing the Visual 
0c00: 53 74 75 64 69 6f 0d 0a 20 20 20 20 20 20 23 20  Studio..      # 
0c10: 20 20 20 20 20 20 32 30 30 35 2c 20 32 30 30 38        2005, 2008
0c20: 2c 20 32 30 31 30 2c 20 32 30 31 32 2c 20 32 30  , 2010, 2012, 20
0c30: 31 33 2c 20 32 30 31 35 2c 20 6f 72 20 32 30 31  13, 2015, or 201
0c40: 37 20 62 75 69 6c 64 20 73 79 73 74 65 6d 73 2e  7 build systems.
0c50: 20 20 54 6f 0d 0a 20 20 20 20 20 20 23 20 20 20    To..      #   
0c60: 20 20 20 20 6f 76 65 72 72 69 64 65 20 74 68 69      override thi
0c70: 73 20 76 61 6c 75 65 20 76 69 61 20 74 68 65 20  s value via the 
0c80: 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 2c 20 65 6e  command line, en
0c90: 74 65 72 20 61 20 63 6f 6d 6d 61 6e 64 20 73 69  ter a command si
0ca0: 6d 69 6c 61 72 0d 0a 20 20 20 20 20 20 23 20 20  milar..      #  
0cb0: 20 20 20 20 20 74 6f 20 6f 6e 65 20 6f 66 20 74       to one of t
0cc0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 28 61 6c  he following (al
0cd0: 6c 20 6f 6e 20 6f 6e 65 20 6c 69 6e 65 29 3a 0d  l on one line):.
0ce0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
0cf0: 23 20 20 20 20 20 20 20 45 61 67 6c 65 53 68 65  #       EagleShe
0d00: 6c 6c 2e 65 78 65 20 2d 61 6e 79 49 6e 69 74 69  ll.exe -anyIniti
0d10: 61 6c 69 7a 65 20 22 73 65 74 20 74 65 73 74 5f  alize "set test_
0d20: 79 65 61 72 20 32 30 30 35 22 0d 0a 20 20 20 20  year 2005"..    
0d30: 20 20 23 20 20 20 20 20 20 20 20 20 2d 66 69 6c    #         -fil
0d40: 65 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e  e .\path\to\all.
0d50: 65 61 67 6c 65 0d 0a 20 20 20 20 20 20 23 0d 0a  eagle..      #..
0d60: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 45 61        #       Ea
0d70: 67 6c 65 53 68 65 6c 6c 2e 65 78 65 20 2d 61 6e  gleShell.exe -an
0d80: 79 49 6e 69 74 69 61 6c 69 7a 65 20 22 73 65 74  yInitialize "set
0d90: 20 74 65 73 74 5f 79 65 61 72 20 32 30 30 38 22   test_year 2008"
0da0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
0db0: 20 20 2d 66 69 6c 65 20 2e 5c 70 61 74 68 5c 74    -file .\path\t
0dc0: 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a 20 20 20  o\all.eagle..   
0dd0: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 20 20     #..      #   
0de0: 20 20 20 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65      EagleShell.e
0df0: 78 65 20 2d 61 6e 79 49 6e 69 74 69 61 6c 69 7a  xe -anyInitializ
0e00: 65 20 22 73 65 74 20 74 65 73 74 5f 79 65 61 72  e "set test_year
0e10: 20 32 30 31 30 22 0d 0a 20 20 20 20 20 20 23 20   2010"..      # 
0e20: 20 20 20 20 20 20 20 20 2d 66 69 6c 65 20 2e 5c          -file .\
0e30: 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c  path\to\all.eagl
0e40: 65 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  e..      #..    
0e50: 20 20 23 20 20 20 20 20 20 20 45 61 67 6c 65 53    #       EagleS
0e60: 68 65 6c 6c 2e 65 78 65 20 2d 61 6e 79 49 6e 69  hell.exe -anyIni
0e70: 74 69 61 6c 69 7a 65 20 22 73 65 74 20 74 65 73  tialize "set tes
0e80: 74 5f 79 65 61 72 20 32 30 31 32 22 0d 0a 20 20  t_year 2012"..  
0e90: 20 20 20 20 23 20 20 20 20 20 20 20 20 20 2d 66      #         -f
0ea0: 69 6c 65 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c  ile .\path\to\al
0eb0: 6c 2e 65 61 67 6c 65 0d 0a 20 20 20 20 20 20 23  l.eagle..      #
0ec0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
0ed0: 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65 20 2d  EagleShell.exe -
0ee0: 61 6e 79 49 6e 69 74 69 61 6c 69 7a 65 20 22 73  anyInitialize "s
0ef0: 65 74 20 74 65 73 74 5f 79 65 61 72 20 32 30 31  et test_year 201
0f00: 33 22 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  3"..      #     
0f10: 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70 61 74 68      -file .\path
0f20: 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a 20  \to\all.eagle.. 
0f30: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
0f40: 20 20 20 20 20 20 45 61 67 6c 65 53 68 65 6c 6c        EagleShell
0f50: 2e 65 78 65 20 2d 61 6e 79 49 6e 69 74 69 61 6c  .exe -anyInitial
0f60: 69 7a 65 20 22 73 65 74 20 74 65 73 74 5f 79 65  ize "set test_ye
0f70: 61 72 20 32 30 31 35 22 0d 0a 20 20 20 20 20 20  ar 2015"..      
0f80: 23 20 20 20 20 20 20 20 20 20 2d 66 69 6c 65 20  #         -file 
0f90: 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61  .\path\to\all.ea
0fa0: 67 6c 65 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  gle..      #..  
0fb0: 20 20 20 20 23 20 20 20 20 20 20 20 45 61 67 6c      #       Eagl
0fc0: 65 53 68 65 6c 6c 2e 65 78 65 20 2d 61 6e 79 49  eShell.exe -anyI
0fd0: 6e 69 74 69 61 6c 69 7a 65 20 22 73 65 74 20 74  nitialize "set t
0fe0: 65 73 74 5f 79 65 61 72 20 32 30 31 37 22 0d 0a  est_year 2017"..
0ff0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20        #         
1000: 2d 66 69 6c 65 20 2e 5c 70 61 74 68 5c 74 6f 5c  -file .\path\to\
1010: 61 6c 6c 2e 65 61 67 6c 65 0d 0a 20 20 20 20 20  all.eagle..     
1020: 20 23 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20   #..      #     
1030: 20 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65    EagleShell.exe
1040: 20 2d 61 6e 79 49 6e 69 74 69 61 6c 69 7a 65 20   -anyInitialize 
1050: 22 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61  "unset -nocompla
1060: 69 6e 20 74 65 73 74 5f 79 65 61 72 22 0d 0a 20  in test_year".. 
1070: 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20 2d       #         -
1080: 66 69 6c 65 20 2e 5c 70 61 74 68 5c 74 6f 5c 61  file .\path\to\a
1090: 6c 6c 2e 65 61 67 6c 65 0d 0a 20 20 20 20 20 20  ll.eagle..      
10a0: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e  #..      if {[in
10b0: 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 73 74  fo exists ::test
10c0: 5f 79 65 61 72 5d 20 26 26 20 5b 73 74 72 69 6e  _year] && [strin
10d0: 67 20 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73 74  g length $::test
10e0: 5f 79 65 61 72 5d 20 3e 20 30 7d 20 74 68 65 6e  _year] > 0} then
10f0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
1100: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55         # NOTE: U
1110: 73 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64  se the specified
1120: 20 74 65 73 74 20 79 65 61 72 2e 20 20 49 66 20   test year.  If 
1130: 74 68 69 73 20 76 61 72 69 61 62 6c 65 20 69 73  this variable is
1140: 20 6e 6f 74 20 73 65 74 2c 20 74 68 65 0d 0a 20   not set, the.. 
1150: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64         #       d
1160: 65 66 61 75 6c 74 20 76 61 6c 75 65 20 77 69 6c  efault value wil
1170: 6c 20 62 65 20 62 61 73 65 64 20 6f 6e 20 77 68  l be based on wh
1180: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 45 61 67  ether or not Eag
1190: 6c 65 20 68 61 73 20 62 65 65 6e 0d 0a 20 20 20  le has been..   
11a0: 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 6d       #       com
11b0: 70 69 6c 65 64 20 61 67 61 69 6e 73 74 20 74 68  piled against th
11c0: 65 20 43 4c 52 20 76 32 2e 30 20 6f 72 20 43 4c  e CLR v2.0 or CL
11d0: 52 20 76 34 2e 30 2e 0d 0a 20 20 20 20 20 20 20  R v4.0...       
11e0: 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   #..        retu
11f0: 72 6e 20 24 3a 3a 74 65 73 74 5f 79 65 61 72 0d  rn $::test_year.
1200: 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
1210: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
1220: 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 45      # NOTE: If E
1230: 61 67 6c 65 20 68 61 73 20 62 65 65 6e 20 63 6f  agle has been co
1240: 6d 70 69 6c 65 64 20 61 67 61 69 6e 73 74 20 74  mpiled against t
1250: 68 65 20 43 4c 52 20 76 34 2e 30 2c 20 75 73 65  he CLR v4.0, use
1260: 20 22 32 30 31 30 22 20 62 79 0d 0a 20 20 20 20   "2010" by..    
1270: 20 20 20 20 23 20 20 20 20 20 20 20 64 65 66 61      #       defa
1280: 75 6c 74 20 28 77 65 20 63 6f 75 6c 64 20 75 73  ult (we could us
1290: 65 20 22 32 30 31 32 22 2c 20 22 32 30 31 33 22  e "2012", "2013"
12a0: 2c 20 22 32 30 31 35 22 2c 20 6f 72 20 22 32 30  , "2015", or "20
12b0: 31 37 22 20 69 6e 20 74 68 61 74 0d 0a 20 20 20  17" in that..   
12c0: 20 20 20 20 20 23 20 20 20 20 20 20 20 63 61 73       #       cas
12d0: 65 20 61 73 20 77 65 6c 6c 29 20 61 73 20 74 68  e as well) as th
12e0: 65 20 74 65 73 74 20 79 65 61 72 3b 20 6f 74 68  e test year; oth
12f0: 65 72 77 69 73 65 2c 20 75 73 65 20 22 32 30 30  erwise, use "200
1300: 38 22 20 62 79 20 64 65 66 61 75 6c 74 0d 0a 20  8" by default.. 
1310: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 28         #       (
1320: 77 65 20 63 6f 75 6c 64 20 75 73 65 20 22 32 30  we could use "20
1330: 30 35 22 20 69 6e 20 74 68 61 74 20 63 61 73 65  05" in that case
1340: 20 61 73 20 77 65 6c 6c 29 2e 20 20 49 66 20 61   as well).  If a
1350: 6e 6f 74 68 65 72 20 6d 61 6a 6f 72 0d 0a 20 20  nother major..  
1360: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 5b 69        #       [i
1370: 6e 63 6f 6d 70 61 74 69 62 6c 65 5d 20 76 65 72  ncompatible] ver
1380: 73 69 6f 6e 20 6f 66 20 74 68 65 20 43 4c 52 20  sion of the CLR 
1390: 69 73 20 72 65 6c 65 61 73 65 64 2c 20 74 68 69  is released, thi
13a0: 73 20 63 68 65 63 6b 20 77 69 6c 6c 0d 0a 20 20  s check will..  
13b0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 68 61        #       ha
13c0: 76 65 20 74 6f 20 62 65 20 63 68 61 6e 67 65 64  ve to be changed
13d0: 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74 20 74  .  The default t
13e0: 65 73 74 20 79 65 61 72 20 74 6f 20 75 73 65 20  est year to use 
13f0: 66 6f 72 20 61 0d 0a 20 20 20 20 20 20 20 20 23  for a..        #
1400: 20 20 20 20 20 20 20 70 61 72 74 69 63 75 6c 61         particula
1410: 72 20 43 4c 52 20 76 65 72 73 69 6f 6e 20 6d 61  r CLR version ma
1420: 79 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e 20  y be overridden 
1430: 62 79 20 73 65 74 74 69 6e 67 20 74 68 65 20 67  by setting the g
1440: 6c 6f 62 61 6c 0d 0a 20 20 20 20 20 20 20 20 23  lobal..        #
1450: 20 20 20 20 20 20 20 76 61 72 69 61 62 6c 65 20         variable 
1460: 22 74 65 73 74 5f 79 65 61 72 5f 63 6c 72 5f 76  "test_year_clr_v
1470: 24 58 22 2c 20 77 68 65 72 65 20 22 24 58 22 20  $X", where "$X" 
1480: 6d 61 79 20 5b 63 75 72 72 65 6e 74 6c 79 5d 20  may [currently] 
1490: 62 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  be..        #   
14a0: 20 20 20 20 65 69 74 68 65 72 20 22 32 22 20 6f      either "2" o
14b0: 72 20 22 34 22 2e 0d 0a 20 20 20 20 20 20 20 20  r "4"...        
14c0: 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  #..        if {[
14d0: 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 69  haveConstraint i
14e0: 6d 61 67 65 52 75 6e 74 69 6d 65 34 30 5d 7d 20  mageRuntime40]} 
14f0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1500: 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73    if {[info exis
1510: 74 73 20 3a 3a 74 65 73 74 5f 79 65 61 72 5f 63  ts ::test_year_c
1520: 6c 72 5f 76 34 5d 20 26 26 20 5c 0d 0a 20 20 20  lr_v4] && \..   
1530: 20 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69             [stri
1540: 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73  ng length $::tes
1550: 74 5f 79 65 61 72 5f 63 6c 72 5f 76 34 5d 20 3e  t_year_clr_v4] >
1560: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
1570: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1580: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55         # NOTE: U
1590: 73 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64  se the specified
15a0: 20 74 65 73 74 20 79 65 61 72 20 66 6f 72 20 74   test year for t
15b0: 68 65 20 43 4c 52 20 76 34 2e 30 2e 0d 0a 20 20  he CLR v4.0...  
15c0: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
15d0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
15e0: 24 3a 3a 74 65 73 74 5f 79 65 61 72 5f 63 6c 72  $::test_year_clr
15f0: 5f 76 34 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  _v4..          }
1600: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
1610: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1620: 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20      # NOTE: Use 
1630: 74 68 65 20 64 65 66 61 75 6c 74 20 74 65 73 74  the default test
1640: 20 79 65 61 72 20 66 6f 72 20 74 68 65 20 43 4c   year for the CL
1650: 52 20 76 34 2e 30 2e 0d 0a 20 20 20 20 20 20 20  R v4.0...       
1660: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1670: 20 20 20 20 72 65 74 75 72 6e 20 32 30 31 30 3b      return 2010;
1680: 20 23 20 54 4f 44 4f 3a 20 47 6f 6f 64 20 22 66   # TODO: Good "f
1690: 61 6c 6c 62 61 63 6b 22 20 64 65 66 61 75 6c 74  allback" default
16a0: 3f 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ?..          }..
16b0: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
16c0: 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
16d0: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74  [info exists ::t
16e0: 65 73 74 5f 79 65 61 72 5f 63 6c 72 5f 76 32 5d  est_year_clr_v2]
16f0: 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
1700: 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
1710: 67 74 68 20 24 3a 3a 74 65 73 74 5f 79 65 61 72  gth $::test_year
1720: 5f 63 6c 72 5f 76 32 5d 20 3e 20 30 7d 20 74 68  _clr_v2] > 0} th
1730: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
1740: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
1750: 20 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65   # NOTE: Use the
1760: 20 73 70 65 63 69 66 69 65 64 20 74 65 73 74 20   specified test 
1770: 79 65 61 72 20 66 6f 72 20 74 68 65 20 43 4c 52  year for the CLR
1780: 20 76 32 2e 30 2e 0d 0a 20 20 20 20 20 20 20 20   v2.0...        
1790: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
17a0: 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 74 65 73     return $::tes
17b0: 74 5f 79 65 61 72 5f 63 6c 72 5f 76 32 0d 0a 20  t_year_clr_v2.. 
17c0: 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20           } else 
17d0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  {..            #
17e0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20  ..            # 
17f0: 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20 64 65  NOTE: Use the de
1800: 66 61 75 6c 74 20 74 65 73 74 20 79 65 61 72 20  fault test year 
1810: 66 6f 72 20 74 68 65 20 43 4c 52 20 76 32 2e 30  for the CLR v2.0
1820: 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  ...            #
1830: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ..            re
1840: 74 75 72 6e 20 32 30 30 38 3b 20 23 20 54 4f 44  turn 2008; # TOD
1850: 4f 3a 20 47 6f 6f 64 20 22 66 61 6c 6c 62 61 63  O: Good "fallbac
1860: 6b 22 20 64 65 66 61 75 6c 74 3f 0d 0a 20 20 20  k" default?..   
1870: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1880: 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20    }..      }..  
1890: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
18a0: 20 67 65 74 42 75 69 6c 64 4e 61 74 69 76 65 59   getBuildNativeY
18b0: 65 61 72 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20  ear {} {..      
18c0: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
18d0: 20 3a 3a 74 65 73 74 5f 6e 61 74 69 76 65 5f 79   ::test_native_y
18e0: 65 61 72 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  ear] && \..     
18f0: 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
1900: 67 74 68 20 24 3a 3a 74 65 73 74 5f 6e 61 74 69  gth $::test_nati
1910: 76 65 5f 79 65 61 72 5d 20 3e 20 30 7d 20 74 68  ve_year] > 0} th
1920: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
1930: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
1940: 20 55 73 65 20 74 68 65 20 73 70 65 63 69 66 69   Use the specifi
1950: 65 64 20 74 65 73 74 20 79 65 61 72 20 66 6f 72  ed test year for
1960: 20 6e 61 74 69 76 65 20 62 69 6e 61 72 69 65 73   native binaries
1970: 2e 20 20 49 66 20 74 68 69 73 0d 0a 20 20 20 20  .  If this..    
1980: 20 20 20 20 23 20 20 20 20 20 20 20 76 61 72 69      #       vari
1990: 61 62 6c 65 20 69 73 20 6e 6f 74 20 73 65 74 2c  able is not set,
19a0: 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   the value retur
19b0: 6e 65 64 20 62 79 20 5b 67 65 74 42 75 69 6c 64  ned by [getBuild
19c0: 59 65 61 72 5d 0d 0a 20 20 20 20 20 20 20 20 23  Year]..        #
19d0: 20 20 20 20 20 20 20 77 69 6c 6c 20 62 65 20 75         will be u
19e0: 73 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  sed...        #.
19f0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1a00: 24 3a 3a 74 65 73 74 5f 6e 61 74 69 76 65 5f 79  $::test_native_y
1a10: 65 61 72 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  ear..      } els
1a20: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  e {..        #..
1a30: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
1a40: 46 61 6c 6c 62 61 63 6b 20 6f 6e 20 74 68 65 20  Fallback on the 
1a50: 28 6e 6f 72 6d 61 6c 29 20 62 75 69 6c 64 20 79  (normal) build y
1a60: 65 61 72 20 66 6f 72 20 6d 61 6e 61 67 65 64 20  ear for managed 
1a70: 62 69 6e 61 72 69 65 73 2e 0d 0a 20 20 20 20 20  binaries...     
1a80: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65     #..        re
1a90: 74 75 72 6e 20 5b 67 65 74 42 75 69 6c 64 59 65  turn [getBuildYe
1aa0: 61 72 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  ar]..      }..  
1ab0: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
1ac0: 20 67 65 74 42 75 69 6c 64 4e 61 74 69 76 65 59   getBuildNativeY
1ad0: 65 61 72 46 6f 72 44 6f 74 4e 65 74 43 6f 72 65  earForDotNetCore
1ae0: 20 7b 20 79 65 61 72 20 7d 20 7b 0d 0a 20 20 20   { year } {..   
1af0: 20 20 20 69 66 20 7b 5b 69 73 44 6f 74 4e 65 74     if {[isDotNet
1b00: 43 6f 72 65 5d 20 26 26 20 5b 69 73 57 69 6e 64  Core] && [isWind
1b10: 6f 77 73 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ows]} then {..  
1b20: 20 20 20 20 20 20 72 65 74 75 72 6e 20 32 30 31        return 201
1b30: 35 3b 20 23 20 48 41 43 4b 3a 20 53 70 65 63 69  5; # HACK: Speci
1b40: 61 6c 20 63 61 73 65 2c 20 75 73 65 20 32 30 31  al case, use 201
1b50: 35 20 6e 61 74 69 76 65 20 62 69 6e 61 72 69 65  5 native binarie
1b60: 73 2e 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  s...      } else
1b70: 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
1b80: 74 68 20 24 79 65 61 72 5d 20 3e 20 30 7d 20 74  th $year] > 0} t
1b90: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72  hen {..        r
1ba0: 65 74 75 72 6e 20 24 79 65 61 72 0d 0a 20 20 20  eturn $year..   
1bb0: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
1bc0: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 67 65 74       return [get
1bd0: 42 75 69 6c 64 4e 61 74 69 76 65 59 65 61 72 5d  BuildNativeYear]
1be0: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
1bf0: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65  .....    proc ge
1c00: 74 42 75 69 6c 64 59 65 61 72 73 20 7b 7d 20 7b  tBuildYears {} {
1c10: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
1c20: 20 23 20 4e 4f 54 45 3a 20 53 65 65 20 69 66 20   # NOTE: See if 
1c30: 74 68 65 20 6c 69 73 74 20 6f 66 20 74 65 73 74  the list of test
1c40: 20 79 65 61 72 73 20 68 61 73 20 62 65 65 6e 20   years has been 
1c50: 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20 74 68  overridden by th
1c60: 65 20 75 73 65 72 0d 0a 20 20 20 20 20 20 23 20  e user..      # 
1c70: 20 20 20 20 20 20 28 65 2e 67 2e 20 6f 6e 20 74        (e.g. on t
1c80: 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 29  he command line)
1c90: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
1ca0: 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73    if {[info exis
1cb0: 74 73 20 3a 3a 74 65 73 74 5f 79 65 61 72 73 5d  ts ::test_years]
1cc0: 20 26 26 20 5b 6c 6c 65 6e 67 74 68 20 24 3a 3a   && [llength $::
1cd0: 74 65 73 74 5f 79 65 61 72 73 5d 20 3e 20 30 7d  test_years] > 0}
1ce0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1cf0: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
1d00: 54 45 3a 20 55 73 65 20 74 68 65 20 73 70 65 63  TE: Use the spec
1d10: 69 66 69 65 64 20 6c 69 73 74 20 6f 66 20 74 65  ified list of te
1d20: 73 74 20 79 65 61 72 73 2e 0d 0a 20 20 20 20 20  st years...     
1d30: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65     #..        re
1d40: 74 75 72 6e 20 24 3a 3a 74 65 73 74 5f 79 65 61  turn $::test_yea
1d50: 72 73 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  rs..      } else
1d60: 69 66 20 7b 5b 69 73 44 6f 74 4e 65 74 43 6f 72  if {[isDotNetCor
1d70: 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  e]} then {..    
1d80: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
1d90: 20 4e 4f 54 45 3a 20 52 75 6e 6e 69 6e 67 20 6f   NOTE: Running o
1da0: 6e 20 2e 4e 45 54 20 43 6f 72 65 2c 20 70 72 69  n .NET Core, pri
1db0: 6f 72 69 74 69 7a 65 20 69 74 73 20 6c 69 73 74  oritize its list
1dc0: 20 6f 66 20 74 65 73 74 20 79 65 61 72 73 2e 0d   of test years..
1dd0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
1de0: 20 20 20 20 72 65 74 75 72 6e 20 5b 6c 69 73 74      return [list
1df0: 20 4e 65 74 53 74 61 6e 64 61 72 64 32 30 5d 0d   NetStandard20].
1e00: 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
1e10: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
1e20: 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20      # NOTE: Use 
1e30: 74 68 65 20 64 65 66 61 75 6c 74 20 6c 69 73 74  the default list
1e40: 20 6f 66 20 74 65 73 74 20 79 65 61 72 73 20 28   of test years (
1e50: 69 2e 65 2e 20 61 6c 6c 29 2e 0d 0a 20 20 20 20  i.e. all)...    
1e60: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
1e70: 65 74 75 72 6e 20 5b 6c 69 73 74 20 32 30 30 35  eturn [list 2005
1e80: 20 32 30 30 38 20 32 30 31 30 20 32 30 31 32 20   2008 2010 2012 
1e90: 32 30 31 33 20 32 30 31 35 20 32 30 31 37 20 4e  2013 2015 2017 N
1ea0: 65 74 53 74 61 6e 64 61 72 64 32 30 5d 0d 0a 20  etStandard20].. 
1eb0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
1ec0: 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 23 20 4e  ..    #..    # N
1ed0: 4f 54 45 3a 20 54 68 69 73 20 70 72 6f 63 65 64  OTE: This proced
1ee0: 75 72 65 20 69 73 20 6f 6e 6c 79 20 75 73 65 64  ure is only used
1ef0: 20 77 68 65 6e 20 61 64 64 69 6e 67 20 73 68 69   when adding shi
1f00: 6d 6d 65 64 20 74 65 73 74 20 63 6f 6e 73 74 72  mmed test constr
1f10: 61 69 6e 74 73 2e 0d 0a 20 20 20 20 23 0d 0a 20  aints...    #.. 
1f20: 20 20 20 70 72 6f 63 20 67 65 74 42 75 69 6c 64     proc getBuild
1f30: 43 6c 72 56 65 72 73 69 6f 6e 20 7b 7d 20 7b 0d  ClrVersion {} {.
1f40: 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f  .      if {[info
1f50: 20 65 78 69 73 74 73 20 3a 3a 74 65 73 74 5f 63   exists ::test_c
1f60: 6c 72 5d 20 26 26 20 5b 73 74 72 69 6e 67 20 6c  lr] && [string l
1f70: 65 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f 63 6c  ength $::test_cl
1f80: 72 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  r] > 0} then {..
1f90: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1fa0: 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20 74     # NOTE: Use t
1fb0: 68 65 20 73 70 65 63 69 66 69 65 64 20 74 65 73  he specified tes
1fc0: 74 20 76 65 72 73 69 6f 6e 20 66 6f 72 20 74 68  t version for th
1fd0: 65 20 43 4c 52 2e 20 20 49 66 20 74 68 69 73 20  e CLR.  If this 
1fe0: 76 61 72 69 61 62 6c 65 0d 0a 20 20 20 20 20 20  variable..      
1ff0: 20 20 23 20 20 20 20 20 20 20 69 73 20 6e 6f 74    #       is not
2000: 20 73 65 74 2c 20 74 68 65 20 64 65 66 61 75 6c   set, the defaul
2010: 74 20 76 61 6c 75 65 20 77 69 6c 6c 20 62 65 20  t value will be 
2020: 62 61 73 65 64 20 6f 6e 20 77 68 65 74 68 65 72  based on whether
2030: 20 6f 72 20 6e 6f 74 0d 0a 20 20 20 20 20 20 20   or not..       
2040: 20 23 20 20 20 20 20 20 20 45 61 67 6c 65 20 68   #       Eagle h
2050: 61 73 20 62 65 65 6e 20 63 6f 6d 70 69 6c 65 64  as been compiled
2060: 20 61 67 61 69 6e 73 74 20 74 68 65 20 43 4c 52   against the CLR
2070: 20 76 32 2e 30 20 6f 72 20 43 4c 52 20 76 34 2e   v2.0 or CLR v4.
2080: 30 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  0...        #.. 
2090: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a         return $:
20a0: 3a 74 65 73 74 5f 63 6c 72 0d 0a 20 20 20 20 20  :test_clr..     
20b0: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
20c0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
20d0: 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20 45  NOTE: Check if E
20e0: 61 67 6c 65 20 68 61 73 20 62 65 65 6e 20 63 6f  agle has been co
20f0: 6d 70 69 6c 65 64 20 61 67 61 69 6e 73 74 20 74  mpiled against t
2100: 68 65 20 43 4c 52 20 76 34 2e 30 2e 20 20 49 66  he CLR v4.0.  If
2110: 20 73 6f 2c 0d 0a 20 20 20 20 20 20 20 20 23 20   so,..        # 
2120: 20 20 20 20 20 20 6a 75 73 74 20 75 73 65 20 74        just use t
2130: 68 61 74 20 43 4c 52 20 76 65 72 73 69 6f 6e 2e  hat CLR version.
2140: 20 20 4f 74 68 65 72 77 69 73 65 2c 20 75 73 65    Otherwise, use
2150: 20 74 68 65 20 76 65 72 73 69 6f 6e 20 66 6f 72   the version for
2160: 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20   the..        # 
2170: 20 20 20 20 20 20 43 4c 52 20 76 32 2e 30 2e 20        CLR v2.0. 
2180: 20 49 66 20 61 6e 6f 74 68 65 72 20 6d 61 6a 6f   If another majo
2190: 72 20 5b 69 6e 63 6f 6d 70 61 74 69 62 6c 65 5d  r [incompatible]
21a0: 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20   version of the 
21b0: 43 4c 52 0d 0a 20 20 20 20 20 20 20 20 23 20 20  CLR..        #  
21c0: 20 20 20 20 20 69 73 20 72 65 6c 65 61 73 65 64       is released
21d0: 2c 20 74 68 69 73 20 63 68 65 63 6b 20 77 69 6c  , this check wil
21e0: 6c 20 68 61 76 65 20 74 6f 20 62 65 20 63 68 61  l have to be cha
21f0: 6e 67 65 64 2e 20 20 54 68 65 20 64 65 66 61 75  nged.  The defau
2200: 6c 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  lt..        #   
2210: 20 20 20 20 76 65 72 73 69 6f 6e 20 76 61 6c 75      version valu
2220: 65 20 66 6f 72 20 61 20 70 61 72 74 69 63 75 6c  e for a particul
2230: 61 72 20 43 4c 52 20 76 65 72 73 69 6f 6e 20 6d  ar CLR version m
2240: 61 79 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e  ay be overridden
2250: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
2260: 20 20 62 79 20 73 65 74 74 69 6e 67 20 74 68 65    by setting the
2270: 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
2280: 20 22 74 65 73 74 5f 63 6c 72 5f 76 24 58 22 2c   "test_clr_v$X",
2290: 20 77 68 65 72 65 20 22 24 58 22 20 6d 61 79 0d   where "$X" may.
22a0: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
22b0: 20 5b 63 75 72 72 65 6e 74 6c 79 5d 20 62 65 20   [currently] be 
22c0: 65 69 74 68 65 72 20 22 32 22 20 6f 72 20 22 34  either "2" or "4
22d0: 22 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  "...        #.. 
22e0: 20 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65         if {[have
22f0: 43 6f 6e 73 74 72 61 69 6e 74 20 69 6d 61 67 65  Constraint image
2300: 52 75 6e 74 69 6d 65 34 30 5d 7d 20 74 68 65 6e  Runtime40]} then
2310: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   {..          if
2320: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
2330: 3a 74 65 73 74 5f 63 6c 72 5f 76 34 5d 20 26 26  :test_clr_v4] &&
2340: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
2350: 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
2360: 20 24 3a 3a 74 65 73 74 5f 63 6c 72 5f 76 34 5d   $::test_clr_v4]
2370: 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
2380: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
2390: 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
23a0: 20 55 73 65 20 74 68 65 20 73 70 65 63 69 66 69   Use the specifi
23b0: 65 64 20 74 65 73 74 20 76 65 72 73 69 6f 6e 20  ed test version 
23c0: 66 6f 72 20 74 68 65 20 43 4c 52 20 76 34 2e 30  for the CLR v4.0
23d0: 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  ...            #
23e0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ..            re
23f0: 74 75 72 6e 20 24 3a 3a 74 65 73 74 5f 63 6c 72  turn $::test_clr
2400: 5f 76 34 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  _v4..          }
2410: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
2420: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
2430: 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20      # NOTE: Use 
2440: 74 68 65 20 64 65 66 61 75 6c 74 20 74 65 73 74  the default test
2450: 20 76 65 72 73 69 6f 6e 20 66 6f 72 20 74 68 65   version for the
2460: 20 43 4c 52 20 76 34 2e 30 2e 0d 0a 20 20 20 20   CLR v4.0...    
2470: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
2480: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 34 2e         return 4.
2490: 30 2e 33 30 33 31 39 3b 20 23 20 54 4f 44 4f 3a  0.30319; # TODO:
24a0: 20 47 6f 6f 64 20 22 66 61 6c 6c 62 61 63 6b 22   Good "fallback"
24b0: 20 64 65 66 61 75 6c 74 3f 0d 0a 20 20 20 20 20   default?..     
24c0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
24d0: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
24e0: 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
24f0: 69 73 74 73 20 3a 3a 74 65 73 74 5f 63 6c 72 5f  ists ::test_clr_
2500: 76 32 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  v2] && \..      
2510: 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20          [string 
2520: 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f 63  length $::test_c
2530: 6c 72 5f 76 32 5d 20 3e 20 30 7d 20 74 68 65 6e  lr_v2] > 0} then
2540: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
2550: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  #..            #
2560: 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20 73   NOTE: Use the s
2570: 70 65 63 69 66 69 65 64 20 74 65 73 74 20 76 65  pecified test ve
2580: 72 73 69 6f 6e 20 66 6f 72 20 74 68 65 20 43 4c  rsion for the CL
2590: 52 20 76 32 2e 30 2e 0d 0a 20 20 20 20 20 20 20  R v2.0...       
25a0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
25b0: 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 74 65      return $::te
25c0: 73 74 5f 63 6c 72 5f 76 32 0d 0a 20 20 20 20 20  st_clr_v2..     
25d0: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
25e0: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
25f0: 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
2600: 3a 20 55 73 65 20 74 68 65 20 64 65 66 61 75 6c  : Use the defaul
2610: 74 20 74 65 73 74 20 76 65 72 73 69 6f 6e 20 66  t test version f
2620: 6f 72 20 74 68 65 20 43 4c 52 20 76 32 2e 30 2e  or the CLR v2.0.
2630: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d  ..            #.
2640: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
2650: 75 72 6e 20 32 2e 30 2e 35 30 37 32 37 3b 20 23  urn 2.0.50727; #
2660: 20 54 4f 44 4f 3a 20 47 6f 6f 64 20 22 66 61 6c   TODO: Good "fal
2670: 6c 62 61 63 6b 22 20 64 65 66 61 75 6c 74 3f 0d  lback" default?.
2680: 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
2690: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
26a0: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
26b0: 70 72 6f 63 20 67 65 74 42 75 69 6c 64 4e 65 74  proc getBuildNet
26c0: 46 78 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23  Fx {} {..      #
26d0: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
26e0: 53 65 65 20 69 66 20 74 68 65 20 74 65 73 74 20  See if the test 
26f0: 2e 4e 45 54 20 46 72 61 6d 65 77 6f 72 6b 20 73  .NET Framework s
2700: 65 74 74 69 6e 67 20 68 61 73 20 62 65 65 6e 20  etting has been 
2710: 6f 76 65 72 72 69 64 64 65 6e 20 62 79 0d 0a 20  overridden by.. 
2720: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
2730: 20 75 73 65 72 20 28 65 2e 67 2e 20 6f 6e 20 74   user (e.g. on t
2740: 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 29  he command line)
2750: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
2760: 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73    if {[info exis
2770: 74 73 20 3a 3a 74 65 73 74 5f 6e 65 74 5f 66 78  ts ::test_net_fx
2780: 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
2790: 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
27a0: 20 24 3a 3a 74 65 73 74 5f 6e 65 74 5f 66 78 5d   $::test_net_fx]
27b0: 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
27c0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
27d0: 20 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65   # NOTE: Use the
27e0: 20 73 70 65 63 69 66 69 65 64 20 74 65 73 74 20   specified test 
27f0: 2e 4e 45 54 20 46 72 61 6d 65 77 6f 72 6b 2e 0d  .NET Framework..
2800: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
2810: 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 74 65      return $::te
2820: 73 74 5f 6e 65 74 5f 66 78 0d 0a 20 20 20 20 20  st_net_fx..     
2830: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
2840: 20 20 20 73 65 74 20 79 65 61 72 20 5b 67 65 74     set year [get
2850: 42 75 69 6c 64 59 65 61 72 5d 0d 0a 20 20 20 20  BuildYear]..    
2860: 20 20 20 20 73 65 74 20 79 65 61 72 56 61 72 4e      set yearVarN
2870: 61 6d 65 20 5b 61 70 70 65 6e 64 41 72 67 73 20  ame [appendArgs 
2880: 3a 3a 74 65 73 74 5f 6e 65 74 5f 66 78 5f 20 24  ::test_net_fx_ $
2890: 79 65 61 72 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  year]....       
28a0: 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
28b0: 73 20 24 79 65 61 72 56 61 72 4e 61 6d 65 5d 20  s $yearVarName] 
28c0: 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
28d0: 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
28e0: 20 5b 73 65 74 20 24 79 65 61 72 56 61 72 4e 61   [set $yearVarNa
28f0: 6d 65 5d 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  me]] > 0} then {
2900: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
2910: 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
2920: 20 55 73 65 20 74 68 65 20 73 70 65 63 69 66 69   Use the specifi
2930: 65 64 20 74 65 73 74 20 2e 4e 45 54 20 46 72 61  ed test .NET Fra
2940: 6d 65 77 6f 72 6b 2c 20 62 61 73 65 64 20 6f 6e  mework, based on
2950: 20 74 68 65 20 62 75 69 6c 64 0d 0a 20 20 20 20   the build..    
2960: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 79 65        #       ye
2970: 61 72 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  ar...          #
2980: 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ..          retu
2990: 72 6e 20 5b 73 65 74 20 24 79 65 61 72 56 61 72  rn [set $yearVar
29a0: 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20 20 20 7d  Name]..        }
29b0: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
29c0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
29d0: 23 20 4e 4f 54 45 3a 20 46 61 6c 6c 62 61 63 6b  # NOTE: Fallback
29e0: 20 74 6f 20 74 68 65 20 22 77 65 6c 6c 20 6b 6e   to the "well kn
29f0: 6f 77 6e 22 20 2e 4e 45 54 20 46 72 61 6d 65 77  own" .NET Framew
2a00: 6f 72 6b 20 76 65 72 73 69 6f 6e 20 74 68 61 74  ork version that
2a10: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20  ..          #   
2a20: 20 20 20 20 69 73 20 6d 6f 73 74 20 63 6c 6f 73      is most clos
2a30: 65 6c 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  ely associated w
2a40: 69 74 68 20 61 20 70 61 72 74 69 63 75 6c 61 72  ith a particular
2a50: 20 76 65 72 73 69 6f 6e 20 6f 66 0d 0a 20 20 20   version of..   
2a60: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 56         #       V
2a70: 69 73 75 61 6c 20 53 74 75 64 69 6f 2e 0d 0a 20  isual Studio... 
2a80: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
2a90: 20 20 20 20 20 20 73 77 69 74 63 68 20 2d 65 78        switch -ex
2aa0: 61 63 74 20 2d 2d 20 24 79 65 61 72 20 7b 0d 0a  act -- $year {..
2ab0: 20 20 20 20 20 20 20 20 20 20 20 20 32 30 30 35              2005
2ac0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
2ad0: 20 20 72 65 74 75 72 6e 20 6e 65 74 46 78 32 30    return netFx20
2ae0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
2af0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 32 30 30  .            200
2b00: 38 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  8 {..           
2b10: 20 20 20 72 65 74 75 72 6e 20 6e 65 74 46 78 33     return netFx3
2b20: 35 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  5..            }
2b30: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 32 30  ..            20
2b40: 31 30 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  10 {..          
2b50: 20 20 20 20 72 65 74 75 72 6e 20 6e 65 74 46 78      return netFx
2b60: 34 30 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  40..            
2b70: 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 32  }..            2
2b80: 30 31 32 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  012 {..         
2b90: 20 20 20 20 20 72 65 74 75 72 6e 20 6e 65 74 46       return netF
2ba0: 78 34 35 0d 0a 20 20 20 20 20 20 20 20 20 20 20  x45..           
2bb0: 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
2bc0: 32 30 31 33 20 7b 0d 0a 20 20 20 20 20 20 20 20  2013 {..        
2bd0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e 65 74        return net
2be0: 46 78 34 35 31 3b 20 23 20 54 4f 44 4f 3a 20 4f  Fx451; # TODO: O
2bf0: 72 20 22 6e 65 74 46 78 34 35 32 22 3f 0d 0a 20  r "netFx452"?.. 
2c00: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
2c10: 20 20 20 20 20 20 20 20 20 20 32 30 31 35 20 7b            2015 {
2c20: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2c30: 72 65 74 75 72 6e 20 6e 65 74 46 78 34 36 3b 20  return netFx46; 
2c40: 23 20 54 4f 44 4f 3a 20 4f 72 20 22 6e 65 74 46  # TODO: Or "netF
2c50: 78 34 36 31 22 20 2f 20 22 6e 65 74 46 78 34 36  x461" / "netFx46
2c60: 32 22 3f 0d 0a 20 20 20 20 20 20 20 20 20 20 20  2"?..           
2c70: 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
2c80: 32 30 31 37 20 7b 0d 0a 20 20 20 20 20 20 20 20  2017 {..        
2c90: 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e 65 74        return net
2ca0: 46 78 34 37 3b 20 23 20 54 4f 44 4f 3a 20 4f 72  Fx47; # TODO: Or
2cb0: 20 22 6e 65 74 46 78 34 37 31 22 20 2f 20 22 6e   "netFx471" / "n
2cc0: 65 74 46 78 34 37 32 22 3f 0d 0a 20 20 20 20 20  etFx472"?..     
2cd0: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
2ce0: 20 20 20 20 20 20 4e 65 74 53 74 61 6e 64 61 72        NetStandar
2cf0: 64 32 30 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  d20 {..         
2d00: 20 20 20 20 20 72 65 74 75 72 6e 20 6e 65 74 53       return netS
2d10: 74 61 6e 64 61 72 64 32 30 0d 0a 20 20 20 20 20  tandard20..     
2d20: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
2d30: 20 20 20 20 20 20 64 65 66 61 75 6c 74 20 7b 0d        default {.
2d40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
2d50: 65 74 75 72 6e 20 6e 65 74 46 78 33 35 3b 20 23  eturn netFx35; #
2d60: 20 54 4f 44 4f 3a 20 47 6f 6f 64 20 22 66 61 6c   TODO: Good "fal
2d70: 6c 62 61 63 6b 22 20 64 65 66 61 75 6c 74 3f 0d  lback" default?.
2d80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
2d90: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
2da0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
2db0: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 23  .    }.....    #
2dc0: 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68  ..    # NOTE: Th
2dd0: 69 73 20 70 72 6f 63 65 64 75 72 65 20 73 68 6f  is procedure sho
2de0: 75 6c 64 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a  uld return non-z
2df0: 65 72 6f 20 69 66 20 74 68 65 20 63 6f 6e 66 69  ero if the confi
2e00: 67 75 72 65 64 20 74 65 73 74 0d 0a 20 20 20 20  gured test..    
2e10: 23 20 20 20 20 20 20 20 70 6c 61 74 66 6f 72 6d  #       platform
2e20: 20 69 73 20 6d 6f 73 74 20 6c 69 6b 65 6c 79 20   is most likely 
2e30: 74 68 65 20 64 65 66 61 75 6c 74 20 66 6f 72 20  the default for 
2e40: 74 68 69 73 20 6d 61 63 68 69 6e 65 2e 0d 0a 20  this machine... 
2e50: 20 20 20 23 0d 0a 20 20 20 20 70 72 6f 63 20 69     #..    proc i
2e60: 73 44 65 66 61 75 6c 74 42 75 69 6c 64 50 6c 61  sDefaultBuildPla
2e70: 74 66 6f 72 6d 20 7b 20 7b 76 65 72 62 6f 73 65  tform { {verbose
2e80: 20 74 72 75 65 7d 20 7d 20 7b 0d 0a 20 20 20 20   true} } {..    
2e90: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
2ea0: 45 3a 20 52 75 6e 6e 69 6e 67 20 6f 6e 20 57 6f  E: Running on Wo
2eb0: 57 36 34 20 69 73 20 6e 65 76 65 72 20 74 68 65  W64 is never the
2ec0: 20 64 65 66 61 75 6c 74 20 70 6c 61 74 66 6f 72   default platfor
2ed0: 6d 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  m...      #..   
2ee0: 20 20 20 69 66 20 7b 5b 69 73 52 75 6e 6e 69 6e     if {[isRunnin
2ef0: 67 57 6f 57 36 34 5d 7d 20 74 68 65 6e 20 7b 0d  gWoW64]} then {.
2f00: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 24 76 65  .        if {$ve
2f10: 72 62 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20  rbose} then {.. 
2f20: 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
2f30: 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c  ::test_channel \
2f40: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2f50: 22 2d 2d 2d 2d 20 64 65 74 65 63 74 65 64 20 6e  "---- detected n
2f60: 6f 6e 2d 64 65 66 61 75 6c 74 20 70 6c 61 74 66  on-default platf
2f70: 6f 72 6d 20 28 57 6f 57 36 34 29 5c 6e 22 0d 0a  orm (WoW64)\n"..
2f80: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
2f90: 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73       return fals
2fa0: 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  e..      }....  
2fb0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
2fc0: 4f 54 45 3a 20 54 68 69 73 20 68 61 73 20 61 20  OTE: This has a 
2fd0: 67 6f 6f 64 20 63 68 61 6e 63 65 20 6f 66 20 62  good chance of b
2fe0: 65 69 6e 67 20 74 68 65 20 64 65 66 61 75 6c 74  eing the default
2ff0: 20 70 6c 61 74 66 6f 72 6d 2e 0d 0a 20 20 20 20   platform...    
3000: 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 24    #..      if {$
3010: 76 65 72 62 6f 73 65 7d 20 74 68 65 6e 20 7b 0d  verbose} then {.
3020: 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
3030: 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 22  ::test_channel "
3040: 2d 2d 2d 2d 20 64 65 74 65 63 74 65 64 20 64 65  ---- detected de
3050: 66 61 75 6c 74 20 70 6c 61 74 66 6f 72 6d 5c 6e  fault platform\n
3060: 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  "..      }....  
3070: 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65 0d      return true.
3080: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
3090: 72 6f 63 20 67 65 74 42 75 69 6c 64 50 6c 61 74  roc getBuildPlat
30a0: 66 6f 72 6d 20 7b 20 6e 61 74 69 76 65 20 7d 20  form { native } 
30b0: 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e  {..      if {[in
30c0: 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 73 74  fo exists ::test
30d0: 5f 70 6c 61 74 66 6f 72 6d 5d 20 26 26 20 5c 0d  _platform] && \.
30e0: 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69  .          [stri
30f0: 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73  ng length $::tes
3100: 74 5f 70 6c 61 74 66 6f 72 6d 5d 20 3e 20 30 7d  t_platform] > 0}
3110: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
3120: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
3130: 54 45 3a 20 50 6f 73 73 69 62 6c 79 20 75 73 65  TE: Possibly use
3140: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 74   the specified t
3150: 65 73 74 20 70 6c 61 74 66 6f 72 6d 2e 20 20 49  est platform.  I
3160: 66 20 74 68 69 73 20 76 61 72 69 61 62 6c 65 0d  f this variable.
3170: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
3180: 20 69 73 20 6e 6f 74 20 73 65 74 2c 20 74 68 65   is not set, the
3190: 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 77   default value w
31a0: 69 6c 6c 20 62 65 20 62 61 73 65 64 20 6f 6e 20  ill be based on 
31b0: 74 68 65 20 6d 61 63 68 69 6e 65 0d 0a 20 20 20  the machine..   
31c0: 20 20 20 20 20 23 20 20 20 20 20 20 20 61 72 63       #       arc
31d0: 68 69 74 65 63 74 75 72 65 2e 20 20 4e 6f 72 6d  hitecture.  Norm
31e0: 61 6c 6c 79 2c 20 74 68 69 73 20 69 73 20 64 6f  ally, this is do
31f0: 6e 65 20 66 6f 72 20 62 75 69 6c 64 73 20 74 68  ne for builds th
3200: 61 74 20 69 6e 76 6f 6c 76 65 0d 0a 20 20 20 20  at involve..    
3210: 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20      #       the 
3220: 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73 65 6d  mixed-mode assem
3230: 62 6c 79 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  bly...        #.
3240: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
3250: 5b 65 78 70 72 20 7b 24 6e 61 74 69 76 65 20 3f  [expr {$native ?
3260: 20 24 3a 3a 74 65 73 74 5f 70 6c 61 74 66 6f 72   $::test_platfor
3270: 6d 20 3a 20 22 22 7d 5d 0d 0a 20 20 20 20 20 20  m : ""}]..      
3280: 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20  } elseif {[info 
3290: 65 78 69 73 74 73 20 3a 3a 74 65 73 74 5f 6d 61  exists ::test_ma
32a0: 63 68 69 6e 65 5d 20 26 26 20 5c 0d 0a 20 20 20  chine] && \..   
32b0: 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c         [string l
32c0: 65 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f 6d 61  ength $::test_ma
32d0: 63 68 69 6e 65 5d 20 3e 20 30 7d 20 74 68 65 6e  chine] > 0} then
32e0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
32f0: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46         # NOTE: F
3300: 6f 72 20 6e 61 74 69 76 65 20 62 75 69 6c 64 73  or native builds
3310: 2c 20 72 65 74 75 72 6e 20 74 68 65 20 70 6c 61  , return the pla
3320: 74 66 6f 72 6d 20 6e 61 6d 65 20 63 6f 72 72 65  tform name corre
3330: 73 70 6f 6e 64 69 6e 67 20 74 6f 0d 0a 20 20 20  sponding to..   
3340: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
3350: 20 74 65 73 74 20 6d 61 63 68 69 6e 65 20 61 72   test machine ar
3360: 63 68 69 74 65 63 74 75 72 65 3b 20 6f 74 68 65  chitecture; othe
3370: 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 61 6e  rwise, return an
3380: 20 65 6d 70 74 79 0d 0a 20 20 20 20 20 20 20 20   empty..        
3390: 23 20 20 20 20 20 20 20 73 74 72 69 6e 67 2e 20  #       string. 
33a0: 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74 68 69 73 20   Normally, this 
33b0: 69 73 20 64 6f 6e 65 20 66 6f 72 20 62 75 69 6c  is done for buil
33c0: 64 73 20 74 68 61 74 20 69 6e 76 6f 6c 76 65 20  ds that involve 
33d0: 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  the..        #  
33e0: 20 20 20 20 20 6d 69 78 65 64 2d 6d 6f 64 65 20       mixed-mode 
33f0: 61 73 73 65 6d 62 6c 79 2e 0d 0a 20 20 20 20 20  assembly...     
3400: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65     #..        re
3410: 74 75 72 6e 20 5b 65 78 70 72 20 7b 0d 0a 20 20  turn [expr {..  
3420: 20 20 20 20 20 20 20 20 24 6e 61 74 69 76 65 20          $native 
3430: 3f 20 5b 6d 61 63 68 69 6e 65 54 6f 50 6c 61 74  ? [machineToPlat
3440: 66 6f 72 6d 20 24 3a 3a 74 65 73 74 5f 6d 61 63  form $::test_mac
3450: 68 69 6e 65 5d 20 3a 20 22 22 0d 0a 20 20 20 20  hine] : ""..    
3460: 20 20 20 20 7d 5d 0d 0a 20 20 20 20 20 20 7d 20      }]..      } 
3470: 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20 65 78  elseif {[info ex
3480: 69 73 74 73 20 3a 3a 74 63 6c 5f 70 6c 61 74 66  ists ::tcl_platf
3490: 6f 72 6d 28 6d 61 63 68 69 6e 65 29 5d 7d 20 74  orm(machine)]} t
34a0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
34b0: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
34c0: 3a 20 46 6f 72 20 6e 61 74 69 76 65 20 62 75 69  : For native bui
34d0: 6c 64 73 2c 20 72 65 74 75 72 6e 20 74 68 65 20  lds, return the 
34e0: 70 6c 61 74 66 6f 72 6d 20 6e 61 6d 65 20 63 6f  platform name co
34f0: 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 0d 0a  rresponding to..
3500: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
3510: 74 68 65 20 6d 61 63 68 69 6e 65 20 61 72 63 68  the machine arch
3520: 69 74 65 63 74 75 72 65 3b 20 6f 74 68 65 72 77  itecture; otherw
3530: 69 73 65 2c 20 72 65 74 75 72 6e 20 61 6e 20 65  ise, return an e
3540: 6d 70 74 79 20 73 74 72 69 6e 67 2e 0d 0a 20 20  mpty string...  
3550: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 4e 6f        #       No
3560: 72 6d 61 6c 6c 79 2c 20 74 68 69 73 20 69 73 20  rmally, this is 
3570: 64 6f 6e 65 20 66 6f 72 20 62 75 69 6c 64 73 20  done for builds 
3580: 74 68 61 74 20 69 6e 76 6f 6c 76 65 20 74 68 65  that involve the
3590: 20 6d 69 78 65 64 2d 6d 6f 64 65 0d 0a 20 20 20   mixed-mode..   
35a0: 20 20 20 20 20 23 20 20 20 20 20 20 20 61 73 73       #       ass
35b0: 65 6d 62 6c 79 2e 0d 0a 20 20 20 20 20 20 20 20  embly...        
35c0: 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  #..        retur
35d0: 6e 20 5b 65 78 70 72 20 7b 0d 0a 20 20 20 20 20  n [expr {..     
35e0: 20 20 20 20 20 24 6e 61 74 69 76 65 20 3f 20 5b       $native ? [
35f0: 6d 61 63 68 69 6e 65 54 6f 50 6c 61 74 66 6f 72  machineToPlatfor
3600: 6d 20 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72  m $::tcl_platfor
3610: 6d 28 6d 61 63 68 69 6e 65 29 5d 20 3a 20 22 22  m(machine)] : ""
3620: 0d 0a 20 20 20 20 20 20 20 20 7d 5d 0d 0a 20 20  ..        }]..  
3630: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
3640: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
3650: 20 23 20 4e 4f 54 45 3a 20 4e 6f 20 6d 61 63 68   # NOTE: No mach
3660: 69 6e 65 20 61 72 63 68 69 74 65 63 74 75 72 65  ine architecture
3670: 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 72   is available, r
3680: 65 74 75 72 6e 20 61 6e 20 65 6d 70 74 79 20 73  eturn an empty s
3690: 74 72 69 6e 67 2e 0d 0a 20 20 20 20 20 20 20 20  tring...        
36a0: 23 20 20 20 20 20 20 20 49 74 20 69 73 20 69 6d  #       It is im
36b0: 70 6f 72 74 61 6e 74 20 74 6f 20 72 65 74 75 72  portant to retur
36c0: 6e 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e  n an empty strin
36d0: 67 20 68 65 72 65 20 62 65 63 61 75 73 65 20 74  g here because t
36e0: 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  he..        #   
36f0: 20 20 20 20 72 65 73 75 6c 74 20 6f 66 20 74 68      result of th
3700: 69 73 20 70 72 6f 63 65 64 75 72 65 20 6d 61 79  is procedure may
3710: 20 62 65 20 75 73 65 64 20 77 69 74 68 20 5b 66   be used with [f
3720: 69 6c 65 20 6a 6f 69 6e 5d 2e 0d 0a 20 20 20 20  ile join]...    
3730: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
3740: 65 74 75 72 6e 20 22 22 0d 0a 20 20 20 20 20 20  eturn ""..      
3750: 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
3760: 20 70 72 6f 63 20 67 65 74 42 75 69 6c 64 43 6f   proc getBuildCo
3770: 6e 66 69 67 75 72 61 74 69 6f 6e 20 7b 7d 20 7b  nfiguration {} {
3780: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
3790: 20 23 20 4e 4f 54 45 3a 20 53 65 65 20 69 66 20   # NOTE: See if 
37a0: 74 68 65 20 22 63 6f 6e 66 69 67 75 72 61 74 69  the "configurati
37b0: 6f 6e 22 20 73 65 74 74 69 6e 67 20 68 61 73 20  on" setting has 
37c0: 62 65 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 20  been overridden 
37d0: 62 79 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20  by the..      # 
37e0: 20 20 20 20 20 20 75 73 65 72 20 28 65 2e 67 2e        user (e.g.
37f0: 20 6f 6e 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20   on the command 
3800: 6c 69 6e 65 29 2e 20 20 54 68 69 73 20 68 65 6c  line).  This hel
3810: 70 73 20 63 6f 6e 74 72 6f 6c 20 65 78 61 63 74  ps control exact
3820: 6c 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ly..      #     
3830: 20 20 77 68 69 63 68 20 73 65 74 20 6f 66 20 62    which set of b
3840: 69 6e 61 72 69 65 73 20 77 65 20 61 72 65 20 74  inaries we are t
3850: 65 73 74 69 6e 67 20 28 69 2e 65 2e 20 74 68 6f  esting (i.e. tho
3860: 73 65 20 62 75 69 6c 74 20 69 6e 20 74 68 65 0d  se built in the.
3870: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 22  .      #       "
3880: 44 65 62 75 67 22 20 6f 72 20 22 52 65 6c 65 61  Debug" or "Relea
3890: 73 65 22 20 62 75 69 6c 64 20 63 6f 6e 66 69 67  se" build config
38a0: 75 72 61 74 69 6f 6e 73 29 2e 20 20 54 6f 20 6f  urations).  To o
38b0: 76 65 72 72 69 64 65 20 74 68 69 73 0d 0a 20 20  verride this..  
38c0: 20 20 20 20 23 20 20 20 20 20 20 20 76 61 6c 75      #       valu
38d0: 65 20 76 69 61 20 74 68 65 20 63 6f 6d 6d 61 6e  e via the comman
38e0: 64 20 6c 69 6e 65 2c 20 65 6e 74 65 72 20 61 20  d line, enter a 
38f0: 63 6f 6d 6d 61 6e 64 20 73 69 6d 69 6c 61 72 20  command similar 
3900: 74 6f 20 6f 6e 65 20 6f 66 0d 0a 20 20 20 20 20  to one of..     
3910: 20 23 20 20 20 20 20 20 20 74 68 65 20 66 6f 6c   #       the fol
3920: 6c 6f 77 69 6e 67 20 28 61 6c 6c 20 6f 6e 20 6f  lowing (all on o
3930: 6e 65 20 6c 69 6e 65 29 3a 0d 0a 20 20 20 20 20  ne line):..     
3940: 20 23 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20   #..      #     
3950: 20 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65    EagleShell.exe
3960: 20 2d 61 6e 79 49 6e 69 74 69 61 6c 69 7a 65 20   -anyInitialize 
3970: 22 73 65 74 20 74 65 73 74 5f 63 6f 6e 66 69 67  "set test_config
3980: 75 72 61 74 69 6f 6e 20 44 65 62 75 67 22 0d 0a  uration Debug"..
3990: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20        #         
39a0: 2d 66 69 6c 65 20 2e 5c 70 61 74 68 5c 74 6f 5c  -file .\path\to\
39b0: 61 6c 6c 2e 65 61 67 6c 65 0d 0a 20 20 20 20 20  all.eagle..     
39c0: 20 23 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20   #..      #     
39d0: 20 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65    EagleShell.exe
39e0: 20 2d 61 6e 79 49 6e 69 74 69 61 6c 69 7a 65 20   -anyInitialize 
39f0: 22 73 65 74 20 74 65 73 74 5f 63 6f 6e 66 69 67  "set test_config
3a00: 75 72 61 74 69 6f 6e 20 52 65 6c 65 61 73 65 22  uration Release"
3a10: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
3a20: 20 20 2d 66 69 6c 65 20 2e 5c 70 61 74 68 5c 74    -file .\path\t
3a30: 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a 20 20 20  o\all.eagle..   
3a40: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 20 20     #..      #   
3a50: 20 20 20 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65      EagleShell.e
3a60: 78 65 20 2d 66 69 6c 65 20 2e 5c 70 61 74 68 5c  xe -file .\path\
3a70: 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 20 2d 70 72  to\all.eagle -pr
3a80: 65 54 65 73 74 0d 0a 20 20 20 20 20 20 23 20 20  eTest..      #  
3a90: 20 20 20 20 20 20 20 22 75 6e 73 65 74 20 2d 6e         "unset -n
3aa0: 6f 63 6f 6d 70 6c 61 69 6e 20 74 65 73 74 5f 63  ocomplain test_c
3ab0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 22 0d 0a 20  onfiguration".. 
3ac0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
3ad0: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
3ae0: 3a 74 65 73 74 5f 63 6f 6e 66 69 67 75 72 61 74  :test_configurat
3af0: 69 6f 6e 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  ion] && \..     
3b00: 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
3b10: 67 74 68 20 24 3a 3a 74 65 73 74 5f 63 6f 6e 66  gth $::test_conf
3b20: 69 67 75 72 61 74 69 6f 6e 5d 20 3e 20 30 7d 20  iguration] > 0} 
3b30: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
3b40: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
3b50: 45 3a 20 55 73 65 20 74 68 65 20 73 70 65 63 69  E: Use the speci
3b60: 66 69 65 64 20 74 65 73 74 20 63 6f 6e 66 69 67  fied test config
3b70: 75 72 61 74 69 6f 6e 2e 20 20 54 68 65 20 64 65  uration.  The de
3b80: 66 61 75 6c 74 20 76 61 6c 75 65 20 75 73 65 64  fault value used
3b90: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
3ba0: 20 20 66 6f 72 20 74 68 69 73 20 76 61 72 69 61    for this varia
3bb0: 62 6c 65 20 69 73 20 74 79 70 69 63 61 6c 6c 79  ble is typically
3bc0: 20 22 52 65 6c 65 61 73 65 22 2c 20 61 73 20 73   "Release", as s
3bd0: 65 74 20 62 79 20 74 68 65 20 74 65 73 74 0d 0a  et by the test..
3be0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
3bf0: 73 75 69 74 65 20 69 74 73 65 6c 66 2e 0d 0a 20  suite itself... 
3c00: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
3c10: 20 20 72 65 74 75 72 6e 20 24 3a 3a 74 65 73 74    return $::test
3c20: 5f 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 0d 0a  _configuration..
3c30: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
3c40: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
3c50: 20 20 20 23 20 4e 4f 54 45 3a 20 4e 6f 72 6d 61     # NOTE: Norma
3c60: 6c 6c 79 2c 20 77 65 20 77 69 6c 6c 20 6e 65 76  lly, we will nev
3c70: 65 72 20 68 69 74 20 74 68 69 73 20 63 61 73 65  er hit this case
3c80: 20 62 65 63 61 75 73 65 20 74 68 65 20 76 61 6c   because the val
3c90: 75 65 20 6f 66 20 74 68 65 0d 0a 20 20 20 20 20  ue of the..     
3ca0: 20 20 20 23 20 20 20 20 20 20 20 74 65 73 74 20     #       test 
3cb0: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 76 61  configuration va
3cc0: 72 69 61 62 6c 65 20 69 73 20 61 6c 77 61 79 73  riable is always
3cd0: 20 73 65 74 20 62 79 20 74 68 65 20 74 65 73 74   set by the test
3ce0: 20 73 75 69 74 65 0d 0a 20 20 20 20 20 20 20 20   suite..        
3cf0: 23 20 20 20 20 20 20 20 69 74 73 65 6c 66 3b 20  #       itself; 
3d00: 68 6f 77 65 76 65 72 2c 20 69 74 20 63 61 6e 20  however, it can 
3d10: 62 65 20 6f 76 65 72 72 69 64 64 65 6e 20 75 73  be overridden us
3d20: 69 6e 67 20 74 68 65 20 75 6e 73 65 74 20 63 6f  ing the unset co
3d30: 6d 6d 61 6e 64 0d 0a 20 20 20 20 20 20 20 20 23  mmand..        #
3d40: 20 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20         from the 
3d50: 2d 70 72 65 54 65 73 74 20 6f 70 74 69 6f 6e 20  -preTest option 
3d60: 74 6f 20 74 68 65 20 74 65 73 74 20 73 75 69 74  to the test suit
3d70: 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  e...        #.. 
3d80: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a         return $:
3d90: 3a 65 61 67 6c 65 5f 70 6c 61 74 66 6f 72 6d 28  :eagle_platform(
3da0: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 29 0d 0a  configuration)..
3db0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
3dc0: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 42  ...    proc getB
3dd0: 75 69 6c 64 43 6f 6e 66 69 67 75 72 61 74 69 6f  uildConfiguratio
3de0: 6e 73 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23  ns {} {..      #
3df0: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
3e00: 53 65 65 20 69 66 20 74 68 65 20 6c 69 73 74 20  See if the list 
3e10: 6f 66 20 74 65 73 74 20 63 6f 6e 66 69 67 75 72  of test configur
3e20: 61 74 69 6f 6e 73 20 68 61 73 20 62 65 65 6e 20  ations has been 
3e30: 6f 76 65 72 72 69 64 64 65 6e 20 62 79 0d 0a 20  overridden by.. 
3e40: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
3e50: 20 75 73 65 72 20 28 65 2e 67 2e 20 6f 6e 20 74   user (e.g. on t
3e60: 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 29  he command line)
3e70: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
3e80: 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73    if {[info exis
3e90: 74 73 20 3a 3a 74 65 73 74 5f 63 6f 6e 66 69 67  ts ::test_config
3ea0: 75 72 61 74 69 6f 6e 73 5d 20 26 26 20 5c 0d 0a  urations] && \..
3eb0: 20 20 20 20 20 20 20 20 20 20 5b 6c 6c 65 6e 67            [lleng
3ec0: 74 68 20 24 3a 3a 74 65 73 74 5f 63 6f 6e 66 69  th $::test_confi
3ed0: 67 75 72 61 74 69 6f 6e 73 5d 20 3e 20 30 7d 20  gurations] > 0} 
3ee0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
3ef0: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
3f00: 45 3a 20 55 73 65 20 74 68 65 20 73 70 65 63 69  E: Use the speci
3f10: 66 69 65 64 20 6c 69 73 74 20 6f 66 20 74 65 73  fied list of tes
3f20: 74 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73  t configurations
3f30: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
3f40: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a        return $::
3f50: 74 65 73 74 5f 63 6f 6e 66 69 67 75 72 61 74 69  test_configurati
3f60: 6f 6e 73 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  ons..      } els
3f70: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  e {..        #..
3f80: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
3f90: 55 73 65 20 74 68 65 20 64 65 66 61 75 6c 74 20  Use the default 
3fa0: 6c 69 73 74 20 6f 66 20 74 65 73 74 20 63 6f 6e  list of test con
3fb0: 66 69 67 75 72 61 74 69 6f 6e 73 2e 0d 0a 20 20  figurations...  
3fc0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
3fd0: 20 72 65 74 75 72 6e 20 5b 6c 69 73 74 20 44 65   return [list De
3fe0: 62 75 67 20 52 65 6c 65 61 73 65 5d 0d 0a 20 20  bug Release]..  
3ff0: 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
4000: 0a 20 20 20 20 70 72 6f 63 20 67 65 74 42 75 69  .    proc getBui
4010: 6c 64 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 53  ldConfigurationS
4020: 75 66 66 69 78 20 7b 7d 20 7b 0d 0a 20 20 20 20  uffix {} {..    
4030: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
4040: 45 3a 20 53 65 65 20 69 66 20 74 68 65 20 74 65  E: See if the te
4050: 73 74 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  st configuration
4060: 20 73 75 66 66 69 78 20 68 61 73 20 62 65 65 6e   suffix has been
4070: 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79 0d 0a   overridden by..
4080: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68        #       th
4090: 65 20 75 73 65 72 20 28 65 2e 67 2e 20 6f 6e 20  e user (e.g. on 
40a0: 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65  the command line
40b0: 29 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  )...      #..   
40c0: 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69     if {[info exi
40d0: 73 74 73 20 3a 3a 74 65 73 74 5f 63 6f 6e 66 69  sts ::test_confi
40e0: 67 75 72 61 74 69 6f 6e 5f 73 75 66 66 69 78 5d  guration_suffix]
40f0: 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
4100: 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20   [string length 
4110: 24 3a 3a 74 65 73 74 5f 63 6f 6e 66 69 67 75 72  $::test_configur
4120: 61 74 69 6f 6e 5f 73 75 66 66 69 78 5d 20 3e 20  ation_suffix] > 
4130: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
4140: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
4150: 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20 73 70  NOTE: Use the sp
4160: 65 63 69 66 69 65 64 20 74 65 73 74 20 63 6f 6e  ecified test con
4170: 66 69 67 75 72 61 74 69 6f 6e 20 73 75 66 66 69  figuration suffi
4180: 78 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  x...        #.. 
4190: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a         return $:
41a0: 3a 74 65 73 74 5f 63 6f 6e 66 69 67 75 72 61 74  :test_configurat
41b0: 69 6f 6e 5f 73 75 66 66 69 78 0d 0a 20 20 20 20  ion_suffix..    
41c0: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
41d0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
41e0: 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20 64   NOTE: Use the d
41f0: 65 66 61 75 6c 74 20 74 65 73 74 20 63 6f 6e 66  efault test conf
4200: 69 67 75 72 61 74 69 6f 6e 20 73 75 66 66 69 78  iguration suffix
4210: 2c 20 77 68 69 63 68 20 73 68 6f 75 6c 64 20 62  , which should b
4220: 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
4230: 20 20 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69     an empty stri
4240: 6e 67 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ng...        #..
4250: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 22          return "
4260: 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  "..      }..    
4270: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67  }.....    proc g
4280: 65 74 42 75 69 6c 64 4e 61 74 69 76 65 43 6f 6e  etBuildNativeCon
4290: 66 69 67 75 72 61 74 69 6f 6e 53 75 66 66 69 78  figurationSuffix
42a0: 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a   {} {..      #..
42b0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 65        # NOTE: Se
42c0: 65 20 69 66 20 74 68 65 20 74 65 73 74 20 6e 61  e if the test na
42d0: 74 69 76 65 20 63 6f 6e 66 69 67 75 72 61 74 69  tive configurati
42e0: 6f 6e 20 73 75 66 66 69 78 20 68 61 73 20 62 65  on suffix has be
42f0: 65 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  en..      #     
4300: 20 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20    overridden by 
4310: 74 68 65 20 75 73 65 72 20 28 65 2e 67 2e 20 6f  the user (e.g. o
4320: 6e 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69  n the command li
4330: 6e 65 29 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ne)...      #.. 
4340: 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65       if {[info e
4350: 78 69 73 74 73 20 3a 3a 74 65 73 74 5f 6e 61 74  xists ::test_nat
4360: 69 76 65 5f 63 6f 6e 66 69 67 75 72 61 74 69 6f  ive_configuratio
4370: 6e 5f 73 75 66 66 69 78 5d 20 26 26 20 5c 0d 0a  n_suffix] && \..
4380: 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e            [strin
4390: 67 20 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73 74  g length $::test
43a0: 5f 6e 61 74 69 76 65 5f 63 6f 6e 66 69 67 75 72  _native_configur
43b0: 61 74 69 6f 6e 5f 73 75 66 66 69 78 5d 20 3e 20  ation_suffix] > 
43c0: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
43d0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
43e0: 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20 73 70  NOTE: Use the sp
43f0: 65 63 69 66 69 65 64 20 74 65 73 74 20 6e 61 74  ecified test nat
4400: 69 76 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  ive configuratio
4410: 6e 20 73 75 66 66 69 78 2e 0d 0a 20 20 20 20 20  n suffix...     
4420: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65     #..        re
4430: 74 75 72 6e 20 24 3a 3a 74 65 73 74 5f 6e 61 74  turn $::test_nat
4440: 69 76 65 5f 63 6f 6e 66 69 67 75 72 61 74 69 6f  ive_configuratio
4450: 6e 5f 73 75 66 66 69 78 0d 0a 20 20 20 20 20 20  n_suffix..      
4460: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
4470: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
4480: 4f 54 45 3a 20 55 73 65 20 74 68 65 20 64 65 66  OTE: Use the def
4490: 61 75 6c 74 20 74 65 73 74 20 6e 61 74 69 76 65  ault test native
44a0: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 73   configuration s
44b0: 75 66 66 69 78 2c 20 77 68 69 63 68 0d 0a 20 20  uffix, which..  
44c0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73 68        #       sh
44d0: 6f 75 6c 64 20 62 65 20 61 6e 20 65 6d 70 74 79  ould be an empty
44e0: 20 73 74 72 69 6e 67 2e 0d 0a 20 20 20 20 20 20   string...      
44f0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
4500: 75 72 6e 20 22 22 0d 0a 20 20 20 20 20 20 7d 0d  urn ""..      }.
4510: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
4520: 72 6f 63 20 67 65 74 42 75 69 6c 64 4e 61 74 69  roc getBuildNati
4530: 76 65 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 53  veConfigurationS
4540: 75 66 66 69 78 46 6f 72 44 6f 74 4e 65 74 43 6f  uffixForDotNetCo
4550: 72 65 20 7b 20 73 75 66 66 69 78 20 7d 20 7b 0d  re { suffix } {.
4560: 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 73 44 6f  .      if {[isDo
4570: 74 4e 65 74 43 6f 72 65 5d 20 26 26 20 5b 69 73  tNetCore] && [is
4580: 57 69 6e 64 6f 77 73 5d 7d 20 74 68 65 6e 20 7b  Windows]} then {
4590: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
45a0: 20 4e 61 74 69 76 65 4f 6e 6c 79 3b 20 23 20 48   NativeOnly; # H
45b0: 41 43 4b 3a 20 53 70 65 63 69 61 6c 20 63 61 73  ACK: Special cas
45c0: 65 2c 20 75 73 65 20 32 30 31 35 20 6e 61 74 69  e, use 2015 nati
45d0: 76 65 20 62 69 6e 61 72 69 65 73 2e 0d 0a 20 20  ve binaries...  
45e0: 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 73      } elseif {[s
45f0: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 73 75  tring length $su
4600: 66 66 69 78 5d 20 3e 20 30 7d 20 74 68 65 6e 20  ffix] > 0} then 
4610: 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  {..        retur
4620: 6e 20 24 73 75 66 66 69 78 0d 0a 20 20 20 20 20  n $suffix..     
4630: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
4640: 20 20 20 72 65 74 75 72 6e 20 5b 67 65 74 42 75     return [getBu
4650: 69 6c 64 4e 61 74 69 76 65 43 6f 6e 66 69 67 75  ildNativeConfigu
4660: 72 61 74 69 6f 6e 53 75 66 66 69 78 5d 0d 0a 20  rationSuffix].. 
4670: 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
4680: 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 42 75  ..    proc getBu
4690: 69 6c 64 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e  ildConfiguration
46a0: 53 75 66 66 69 78 65 73 20 7b 7d 20 7b 0d 0a 20  Suffixes {} {.. 
46b0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
46c0: 4e 4f 54 45 3a 20 53 65 65 20 69 66 20 74 68 65  NOTE: See if the
46d0: 20 6c 69 73 74 20 6f 66 20 74 65 73 74 20 63 6f   list of test co
46e0: 6e 66 69 67 75 72 61 74 69 6f 6e 20 73 75 66 66  nfiguration suff
46f0: 69 78 65 73 20 68 61 73 20 62 65 65 6e 0d 0a 20  ixes has been.. 
4700: 20 20 20 20 20 23 20 20 20 20 20 20 20 6f 76 65       #       ove
4710: 72 72 69 64 64 65 6e 20 62 79 20 74 68 65 20 75  rridden by the u
4720: 73 65 72 20 28 65 2e 67 2e 20 6f 6e 20 74 68 65  ser (e.g. on the
4730: 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 29 2e 0d   command line)..
4740: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
4750: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
4760: 20 3a 3a 74 65 73 74 5f 63 6f 6e 66 69 67 75 72   ::test_configur
4770: 61 74 69 6f 6e 5f 73 75 66 66 69 78 65 73 5d 20  ation_suffixes] 
4780: 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
4790: 5b 6c 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73 74  [llength $::test
47a0: 5f 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 5f 73  _configuration_s
47b0: 75 66 66 69 78 65 73 5d 20 3e 20 30 7d 20 74 68  uffixes] > 0} th
47c0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
47d0: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
47e0: 20 55 73 65 20 74 68 65 20 73 70 65 63 69 66 69   Use the specifi
47f0: 65 64 20 6c 69 73 74 20 6f 66 20 74 65 73 74 20  ed list of test 
4800: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20 73  configurations s
4810: 75 66 66 69 78 65 73 2e 0d 0a 20 20 20 20 20 20  uffixes...      
4820: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
4830: 75 72 6e 20 24 3a 3a 74 65 73 74 5f 63 6f 6e 66  urn $::test_conf
4840: 69 67 75 72 61 74 69 6f 6e 5f 73 75 66 66 69 78  iguration_suffix
4850: 65 73 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  es..      } else
4860: 69 66 20 7b 5b 69 73 44 6f 74 4e 65 74 43 6f 72  if {[isDotNetCor
4870: 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  e]} then {..    
4880: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
4890: 20 4e 4f 54 45 3a 20 52 75 6e 6e 69 6e 67 20 6f   NOTE: Running o
48a0: 6e 20 2e 4e 45 54 20 43 6f 72 65 2c 20 70 72 69  n .NET Core, pri
48b0: 6f 72 69 74 69 7a 65 20 69 74 73 20 74 65 73 74  oritize its test
48c0: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 0d 0a   configuration..
48d0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
48e0: 73 75 66 66 69 78 65 73 20 66 6f 72 20 6c 69 62  suffixes for lib
48f0: 72 61 72 79 20 66 69 6c 65 73 2e 0d 0a 20 20 20  rary files...   
4900: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
4910: 72 65 74 75 72 6e 20 5b 6c 69 73 74 20 4e 65 74  return [list Net
4920: 53 74 61 6e 64 61 72 64 32 30 20 22 22 5d 0d 0a  Standard20 ""]..
4930: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
4940: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
4950: 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20 74     # NOTE: Use t
4960: 68 65 20 64 65 66 61 75 6c 74 20 6c 69 73 74 20  he default list 
4970: 6f 66 20 74 65 73 74 20 63 6f 6e 66 69 67 75 72  of test configur
4980: 61 74 69 6f 6e 73 20 73 75 66 66 69 78 65 73 2e  ations suffixes.
4990: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
49a0: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6c 69 73       return [lis
49b0: 74 20 22 22 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a  t ""]..      }..
49c0: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
49d0: 6f 63 20 67 65 74 42 75 69 6c 64 45 78 74 72 61  oc getBuildExtra
49e0: 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66 20   {} {..      if 
49f0: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
4a00: 74 65 73 74 5f 65 78 74 72 61 5d 20 26 26 20 5c  test_extra] && \
4a10: 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72  ..          [str
4a20: 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 74 65  ing length $::te
4a30: 73 74 5f 65 78 74 72 61 5d 20 3e 20 30 7d 20 74  st_extra] > 0} t
4a40: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
4a50: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
4a60: 3a 20 55 73 65 20 74 68 65 20 73 70 65 63 69 66  : Use the specif
4a70: 69 65 64 20 65 78 74 72 61 20 6f 75 74 70 75 74  ied extra output
4a80: 20 64 69 72 65 63 74 6f 72 79 2e 0d 0a 20 20 20   directory...   
4a90: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
4aa0: 72 65 74 75 72 6e 20 24 3a 3a 74 65 73 74 5f 65  return $::test_e
4ab0: 78 74 72 61 0d 0a 20 20 20 20 20 20 7d 20 65 6c  xtra..      } el
4ac0: 73 65 69 66 20 7b 5b 69 73 44 6f 74 4e 65 74 43  seif {[isDotNetC
4ad0: 6f 72 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ore]} then {..  
4ae0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
4af0: 20 23 20 4e 4f 54 45 3a 20 52 75 6e 6e 69 6e 67   # NOTE: Running
4b00: 20 6f 6e 20 2e 4e 45 54 20 43 6f 72 65 2c 20 75   on .NET Core, u
4b10: 73 65 20 74 68 65 20 65 78 74 72 61 20 6f 75 74  se the extra out
4b20: 70 75 74 20 64 69 72 65 63 74 6f 72 79 20 66 6f  put directory fo
4b30: 72 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  r..        #    
4b40: 20 20 20 6c 69 62 72 61 72 79 20 66 69 6c 65 73     library files
4b50: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
4b60: 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e 65 74        return net
4b70: 73 74 61 6e 64 61 72 64 32 2e 30 0d 0a 20 20 20  standard2.0..   
4b80: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
4b90: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
4ba0: 23 20 4e 4f 54 45 3a 20 4e 6f 20 65 78 74 72 61  # NOTE: No extra
4bb0: 20 6f 75 74 70 75 74 20 64 69 72 65 63 74 6f 72   output director
4bc0: 79 20 69 73 20 72 65 71 75 69 72 65 64 2e 0d 0a  y is required...
4bd0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
4be0: 20 20 20 72 65 74 75 72 6e 20 22 22 0d 0a 20 20     return ""..  
4bf0: 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
4c00: 0a 20 20 20 20 70 72 6f 63 20 67 65 74 42 75 69  .    proc getBui
4c10: 6c 64 45 78 74 72 61 73 20 7b 7d 20 7b 0d 0a 20  ldExtras {} {.. 
4c20: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
4c30: 4e 4f 54 45 3a 20 53 65 65 20 69 66 20 74 68 65  NOTE: See if the
4c40: 20 6c 69 73 74 20 6f 66 20 65 78 74 72 61 20 6f   list of extra o
4c50: 75 74 70 75 74 20 64 69 72 65 63 74 6f 72 69 65  utput directorie
4c60: 73 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72  s has been overr
4c70: 69 64 64 65 6e 0d 0a 20 20 20 20 20 20 23 20 20  idden..      #  
4c80: 20 20 20 20 20 62 79 20 74 68 65 20 75 73 65 72       by the user
4c90: 20 28 65 2e 67 2e 20 6f 6e 20 74 68 65 20 63 6f   (e.g. on the co
4ca0: 6d 6d 61 6e 64 20 6c 69 6e 65 29 2e 0d 0a 20 20  mmand line)...  
4cb0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
4cc0: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
4cd0: 74 65 73 74 5f 65 78 74 72 61 73 5d 20 26 26 20  test_extras] && 
4ce0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 6c 6c  \..          [ll
4cf0: 65 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f 65 78  ength $::test_ex
4d00: 74 72 61 73 5d 20 3e 20 30 7d 20 74 68 65 6e 20  tras] > 0} then 
4d10: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
4d20: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73        # NOTE: Us
4d30: 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  e the specified 
4d40: 6c 69 73 74 20 6f 66 20 65 78 74 72 61 20 6f 75  list of extra ou
4d50: 74 70 75 74 20 64 69 72 65 63 74 6f 72 69 65 73  tput directories
4d60: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
4d70: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a        return $::
4d80: 74 65 73 74 5f 65 78 74 72 61 73 0d 0a 20 20 20  test_extras..   
4d90: 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69 73     } elseif {[is
4da0: 44 6f 74 4e 65 74 43 6f 72 65 5d 7d 20 74 68 65  DotNetCore]} the
4db0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
4dc0: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
4dd0: 52 75 6e 6e 69 6e 67 20 6f 6e 20 2e 4e 45 54 20  Running on .NET 
4de0: 43 6f 72 65 2c 20 70 72 69 6f 72 69 74 69 7a 65  Core, prioritize
4df0: 20 69 74 73 20 65 78 74 72 61 20 6f 75 74 70 75   its extra outpu
4e00: 74 20 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20  t directory..   
4e10: 20 20 20 20 20 23 20 20 20 20 20 20 20 66 6f 72       #       for
4e20: 20 6c 69 62 72 61 72 79 20 66 69 6c 65 73 2e 0d   library files..
4e30: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
4e40: 20 20 20 20 72 65 74 75 72 6e 20 5b 6c 69 73 74      return [list
4e50: 20 6e 65 74 73 74 61 6e 64 61 72 64 32 2e 30 20   netstandard2.0 
4e60: 22 22 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  ""]..      } els
4e70: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  e {..        #..
4e80: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
4e90: 55 73 65 20 64 65 66 61 75 6c 74 20 6c 69 73 74  Use default list
4ea0: 20 6f 66 20 65 78 74 72 61 20 6f 75 74 70 75 74   of extra output
4eb0: 20 64 69 72 65 63 74 6f 72 69 65 73 2c 20 77 68   directories, wh
4ec0: 69 63 68 20 69 73 20 6f 6e 65 0d 0a 20 20 20 20  ich is one..    
4ed0: 20 20 20 20 23 20 20 20 20 20 20 20 65 6d 70 74      #       empt
4ee0: 79 20 73 74 72 69 6e 67 20 28 6e 6f 2d 6f 70 29  y string (no-op)
4ef0: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
4f00: 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6c 69        return [li
4f10: 73 74 20 22 22 5d 0d 0a 20 20 20 20 20 20 7d 0d  st ""]..      }.
4f20: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
4f30: 72 6f 63 20 67 65 74 42 75 69 6c 64 42 61 73 65  roc getBuildBase
4f40: 44 69 72 65 63 74 6f 72 79 20 7b 7d 20 7b 0d 0a  Directory {} {..
4f50: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
4f60: 20 4e 4f 54 45 3a 20 46 69 67 75 72 65 20 6f 75   NOTE: Figure ou
4f70: 74 20 74 68 65 20 62 61 73 65 20 64 69 72 65 63  t the base direc
4f80: 74 6f 72 79 20 77 68 65 72 65 20 61 6c 6c 20 74  tory where all t
4f90: 68 65 20 62 75 69 6c 64 73 20 73 68 6f 75 6c 64  he builds should
4fa0: 20 62 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20   be..      #    
4fb0: 20 20 20 6c 6f 63 61 74 65 64 2e 20 20 54 68 69     located.  Thi
4fc0: 73 20 77 69 6c 6c 20 62 65 20 74 68 65 20 64 69  s will be the di
4fd0: 72 65 63 74 6f 72 79 20 74 68 61 74 20 63 6f 6e  rectory that con
4fe0: 74 61 69 6e 73 20 74 68 65 20 61 63 74 75 61 6c  tains the actual
4ff0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
5000: 62 75 69 6c 64 20 6f 75 74 70 75 74 20 64 69 72  build output dir
5010: 65 63 74 6f 72 79 20 28 65 2e 67 2e 20 70 61 72  ectory (e.g. par
5020: 65 6e 74 20 6f 66 20 22 62 69 6e 22 29 2e 0d 0a  ent of "bin")...
5030: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
5040: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
5050: 3a 3a 62 75 69 6c 64 5f 62 61 73 65 5f 64 69 72  ::build_base_dir
5060: 65 63 74 6f 72 79 5d 20 26 26 20 5c 0d 0a 20 20  ectory] && \..  
5070: 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20          [string 
5080: 6c 65 6e 67 74 68 20 24 3a 3a 62 75 69 6c 64 5f  length $::build_
5090: 62 61 73 65 5f 64 69 72 65 63 74 6f 72 79 5d 20  base_directory] 
50a0: 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
50b0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
50c0: 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c 6f 63 61  # NOTE: The loca
50d0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 62 75 69 6c  tion of the buil
50e0: 64 20 62 61 73 65 20 64 69 72 65 63 74 6f 72 79  d base directory
50f0: 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72 69   has been overri
5100: 64 64 65 6e 3b 0d 0a 20 20 20 20 20 20 20 20 23  dden;..        #
5110: 20 20 20 20 20 20 20 74 68 65 72 65 66 6f 72 65         therefore
5120: 2c 20 75 73 65 20 69 74 20 76 65 72 62 61 74 69  , use it verbati
5130: 6d 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  m...        #.. 
5140: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a         return $:
5150: 3a 62 75 69 6c 64 5f 62 61 73 65 5f 64 69 72 65  :build_base_dire
5160: 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20 65  ctory..      } e
5170: 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69  lseif {[info exi
5180: 73 74 73 20 3a 3a 63 6f 6d 6d 6f 6e 5f 64 69 72  sts ::common_dir
5190: 65 63 74 6f 72 79 5d 20 26 26 20 5c 0d 0a 20 20  ectory] && \..  
51a0: 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20          [string 
51b0: 6c 65 6e 67 74 68 20 24 3a 3a 63 6f 6d 6d 6f 6e  length $::common
51c0: 5f 64 69 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d  _directory] > 0}
51d0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
51e0: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
51f0: 54 45 3a 20 4e 65 78 74 2c 20 66 61 6c 6c 62 61  TE: Next, fallba
5200: 63 6b 20 74 6f 20 74 68 65 20 67 72 61 6e 64 70  ck to the grandp
5210: 61 72 65 6e 74 20 64 69 72 65 63 74 6f 72 79 20  arent directory 
5220: 6f 66 20 74 68 65 20 6f 6e 65 0d 0a 20 20 20 20  of the one..    
5230: 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e 74      #       cont
5240: 61 69 6e 69 6e 67 20 74 68 69 73 20 66 69 6c 65  aining this file
5250: 20 28 69 2e 65 2e 20 22 63 6f 6d 6d 6f 6e 2e 65   (i.e. "common.e
5260: 61 67 6c 65 22 29 2c 20 69 66 20 61 76 61 69 6c  agle"), if avail
5270: 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 23  able...        #
5280: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
5290: 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20 5b   [file dirname [
52a0: 66 69 6c 65 20 64 69 72 6e 61 6d 65 20 24 3a 3a  file dirname $::
52b0: 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79  common_directory
52c0: 5d 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  ]]..      } else
52d0: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
52e0: 20 3a 3a 70 61 74 68 5d 20 26 26 20 5c 0d 0a 20   ::path] && \.. 
52f0: 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67           [string
5300: 20 6c 65 6e 67 74 68 20 24 3a 3a 70 61 74 68 5d   length $::path]
5310: 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
5320: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
5330: 20 23 20 4e 4f 54 45 3a 20 46 69 6e 61 6c 6c 79   # NOTE: Finally
5340: 2c 20 66 61 6c 6c 62 61 63 6b 20 74 6f 20 74 68  , fallback to th
5350: 65 20 70 61 72 65 6e 74 20 64 69 72 65 63 74 6f  e parent directo
5360: 72 79 20 6f 66 20 74 68 65 20 45 61 67 6c 65 54  ry of the EagleT
5370: 65 73 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20  est..        #  
5380: 20 20 20 20 20 70 61 74 68 2e 20 20 54 68 65 20       path.  The 
5390: 45 61 67 6c 65 54 65 73 74 20 70 61 63 6b 61 67  EagleTest packag
53a0: 65 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61  e guarantees tha
53b0: 74 20 74 68 69 73 20 76 61 72 69 61 62 6c 65 0d  t this variable.
53c0: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
53d0: 20 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f 20   will be set to 
53e0: 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 63 6f  the directory co
53f0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 66 69 72  ntaining the fir
5400: 73 74 20 66 69 6c 65 20 74 6f 0d 0a 20 20 20 20  st file to..    
5410: 20 20 20 20 23 20 20 20 20 20 20 20 65 78 65 63      #       exec
5420: 75 74 65 20 74 68 65 20 5b 72 75 6e 54 65 73 74  ute the [runTest
5430: 50 72 6f 6c 6f 67 75 65 5d 20 73 63 72 69 70 74  Prologue] script
5440: 20 6c 69 62 72 61 72 79 20 70 72 6f 63 65 64 75   library procedu
5450: 72 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  re...        #..
5460: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b          return [
5470: 66 69 6c 65 20 64 69 72 6e 61 6d 65 20 24 3a 3a  file dirname $::
5480: 70 61 74 68 5d 0d 0a 20 20 20 20 20 20 7d 20 65  path]..      } e
5490: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  lse {..        #
54a0: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
54b0: 3a 20 4e 6f 20 70 61 74 68 20 69 73 20 61 76 61  : No path is ava
54c0: 69 6c 61 62 6c 65 2c 20 72 65 74 75 72 6e 20 61  ilable, return a
54d0: 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e 20  n empty string. 
54e0: 20 54 68 69 73 20 70 6f 69 6e 74 0d 0a 20 20 20   This point..   
54f0: 20 20 20 20 20 23 20 20 20 20 20 20 20 73 68 6f       #       sho
5500: 75 6c 64 20 6e 6f 74 20 62 65 20 72 65 61 63 68  uld not be reach
5510: 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ed...        #..
5520: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 22          return "
5530: 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  "..      }..    
5540: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67  }.....    proc g
5550: 65 74 53 51 4c 69 74 65 54 65 73 74 44 61 74 61  etSQLiteTestData
5560: 50 61 74 68 20 7b 7d 20 7b 0d 0a 20 20 20 20 20  Path {} {..     
5570: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
5580: 3a 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65  : Figure out the
5590: 20 64 69 72 65 63 74 6f 72 79 20 77 68 65 72 65   directory where
55a0: 20 61 6c 6c 20 74 68 65 20 74 65 73 74 20 64 61   all the test da
55b0: 74 61 20 66 69 6c 65 73 20 73 68 6f 75 6c 64 0d  ta files should.
55c0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62  .      #       b
55d0: 65 20 6c 6f 63 61 74 65 64 2e 20 20 54 68 69 73  e located.  This
55e0: 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65 20 22   should be the "
55f0: 64 61 74 61 22 20 64 69 72 65 63 74 6f 72 79 20  data" directory 
5600: 62 65 6e 65 61 74 68 20 74 68 65 0d 0a 20 20 20  beneath the..   
5610: 20 20 20 23 20 20 20 20 20 20 20 64 69 72 65 63     #       direc
5620: 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20  tory containing 
5630: 74 68 65 20 61 63 74 75 61 6c 20 74 65 73 74 20  the actual test 
5640: 73 63 72 69 70 74 73 2e 0d 0a 20 20 20 20 20 20  scripts...      
5650: 23 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  #..      return 
5660: 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 3a 3a 70 61  [file join $::pa
5670: 74 68 20 64 61 74 61 5d 0d 0a 20 20 20 20 7d 0d  th data]..    }.
5680: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 69 73 52  ....    proc isR
5690: 75 6e 6e 69 6e 67 57 6f 57 36 34 20 7b 7d 20 7b  unningWoW64 {} {
56a0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
56b0: 20 23 20 4e 4f 54 45 3a 20 46 6f 72 20 6e 6f 77   # NOTE: For now
56c0: 2c 20 6a 75 73 74 20 75 73 65 20 74 68 65 20 65  , just use the e
56d0: 78 69 73 74 69 6e 67 20 74 65 73 74 20 63 6f 6e  xisting test con
56e0: 73 74 72 61 69 6e 74 20 66 6f 72 20 64 65 74 65  straint for dete
56f0: 63 74 69 6e 67 0d 0a 20 20 20 20 20 20 23 20 20  cting..      #  
5700: 20 20 20 20 20 61 20 57 6f 57 36 34 20 70 72 6f       a WoW64 pro
5710: 63 65 73 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  cess...      #..
5720: 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 68 61        return [ha
5730: 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 77 6f 77  veConstraint wow
5740: 36 34 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20  64]..    }..... 
5750: 20 20 20 70 72 6f 63 20 69 73 4d 69 78 65 64 4d     proc isMixedM
5760: 6f 64 65 41 73 73 65 6d 62 6c 79 20 7b 20 66 69  odeAssembly { fi
5770: 6c 65 4e 61 6d 65 20 7b 76 61 72 4e 61 6d 65 20  leName {varName 
5780: 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23  ""} } {..      #
5790: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
57a0: 46 69 72 73 74 2c 20 6d 61 6b 65 20 73 75 72 65  First, make sure
57b0: 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65 20   the test suite 
57c0: 69 6e 66 72 61 73 74 72 75 63 74 75 72 65 20 69  infrastructure i
57d0: 73 20 61 6c 6c 6f 77 65 64 20 74 6f 0d 0a 20 20  s allowed to..  
57e0: 20 20 20 20 23 20 20 20 20 20 20 20 75 73 65 20      #       use 
57f0: 74 68 65 20 5b 65 78 65 63 5d 20 63 6f 6d 6d 61  the [exec] comma
5800: 6e 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  nd...      #..  
5810: 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
5820: 78 69 73 74 73 20 3a 3a 6e 6f 28 65 78 65 63 29  xists ::no(exec)
5830: 5d 20 26 26 20 21 5b 69 6e 66 6f 20 65 78 69 73  ] && ![info exis
5840: 74 73 20 3a 3a 6e 6f 28 63 6f 72 46 6c 61 67 73  ts ::no(corFlags
5850: 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
5860: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
5870: 20 4e 4f 54 45 3a 20 49 66 20 74 68 65 20 6c 6f   NOTE: If the lo
5880: 63 61 74 69 6f 6e 20 6f 66 20 43 6f 72 46 6c 61  cation of CorFla
5890: 67 73 20 69 73 20 70 72 65 73 65 6e 74 20 69 6e  gs is present in
58a0: 20 74 68 65 20 65 6e 76 69 72 6f 6e 6d 65 6e 74   the environment
58b0: 2c 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  ,..        #    
58c0: 20 20 20 75 73 65 20 69 74 3b 20 6f 74 68 65 72     use it; other
58d0: 77 69 73 65 20 61 73 73 75 6d 65 20 69 74 20 69  wise assume it i
58e0: 73 20 69 6e 20 74 68 65 20 50 41 54 48 2e 0d 0a  s in the PATH...
58f0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
5900: 20 20 20 73 65 74 20 63 6f 72 46 6c 61 67 73 20     set corFlags 
5910: 5b 65 78 70 72 20 7b 0d 0a 20 20 20 20 20 20 20  [expr {..       
5920: 20 20 20 5b 69 6e 66 6f 20 65 78 69 73 74 73 20     [info exists 
5930: 3a 3a 65 6e 76 28 43 6f 72 46 6c 61 67 73 29 5d  ::env(CorFlags)]
5940: 20 3f 20 24 3a 3a 65 6e 76 28 43 6f 72 46 6c 61   ? $::env(CorFla
5950: 67 73 29 20 3a 20 22 43 6f 72 46 6c 61 67 73 22  gs) : "CorFlags"
5960: 0d 0a 20 20 20 20 20 20 20 20 7d 5d 0d 0a 0d 0a  ..        }]....
5970: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
5980: 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d     # NOTE: Attem
5990: 70 74 20 74 6f 20 65 78 65 63 75 74 65 20 43 6f  pt to execute Co
59a0: 72 46 6c 61 67 73 20 6f 6e 20 74 68 65 20 73 70  rFlags on the sp
59b0: 65 63 69 66 69 65 64 20 66 69 6c 65 2e 0d 0a 20  ecified file... 
59c0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
59d0: 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
59e0: 20 20 20 20 20 20 20 20 20 20 65 78 65 63 20 2d            exec -
59f0: 2d 20 24 63 6f 72 46 6c 61 67 73 20 5b 66 69 6c  - $corFlags [fil
5a00: 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 24 66 69  e nativename $fi
5a10: 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20 20  leName]..       
5a20: 20 7d 20 65 78 65 63 5d 20 3d 3d 20 30 7d 20 74   } exec] == 0} t
5a30: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
5a40: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
5a50: 4e 4f 54 45 3a 20 49 66 20 72 65 71 75 65 73 74  NOTE: If request
5a60: 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72  ed by our caller
5a70: 2c 20 61 74 74 65 6d 70 74 20 74 6f 20 64 65 74  , attempt to det
5a80: 65 72 6d 69 6e 65 20 74 68 65 0d 0a 20 20 20 20  ermine the..    
5a90: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 70 6c        #       pl
5aa0: 61 74 66 6f 72 6d 20 66 6f 72 20 74 68 65 20 73  atform for the s
5ab0: 70 65 63 69 66 69 65 64 20 66 69 6c 65 20 61 73  pecified file as
5ac0: 20 77 65 6c 6c 2e 0d 0a 20 20 20 20 20 20 20 20   well...        
5ad0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69    #..          i
5ae0: 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  f {[string lengt
5af0: 68 20 24 76 61 72 4e 61 6d 65 5d 20 3e 20 30 7d  h $varName] > 0}
5b00: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
5b10: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
5b20: 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 74 6f 72      # NOTE: Stor
5b30: 65 20 74 68 65 20 70 6c 61 74 66 6f 72 6d 20 69  e the platform i
5b40: 6e 20 74 68 65 20 6e 61 6d 65 64 20 76 61 72 69  n the named vari
5b50: 61 62 6c 65 20 69 6e 20 74 68 65 0d 0a 20 20 20  able in the..   
5b60: 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
5b70: 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72 20   context of our 
5b80: 63 61 6c 6c 65 72 2e 0d 0a 20 20 20 20 20 20 20  caller...       
5b90: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
5ba0: 20 20 20 20 75 70 76 61 72 20 31 20 24 76 61 72      upvar 1 $var
5bb0: 4e 61 6d 65 20 70 6c 61 74 66 6f 72 6d 0d 0a 0d  Name platform...
5bc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a  .            #..
5bd0: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f              # NO
5be0: 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 65  TE: Attempt to e
5bf0: 78 74 72 61 63 74 20 74 68 65 20 50 45 20 6c 69  xtract the PE li
5c00: 6e 65 20 66 72 6f 6d 20 74 68 65 20 63 61 70 74  ne from the capt
5c10: 75 72 65 64 0d 0a 20 20 20 20 20 20 20 20 20 20  ured..          
5c20: 20 20 23 20 20 20 20 20 20 20 6f 75 74 70 75 74    #       output
5c30: 2e 20 20 49 66 20 74 68 69 73 20 76 61 6c 75 65  .  If this value
5c40: 20 69 73 20 22 50 45 33 32 22 20 6f 72 20 22 50   is "PE32" or "P
5c50: 45 33 32 2b 22 2c 20 74 68 65 0d 0a 20 20 20 20  E32+", the..    
5c60: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
5c70: 61 73 73 65 6d 62 6c 79 20 66 69 6c 65 20 69 73  assembly file is
5c80: 20 33 32 2d 62 69 74 20 6f 72 20 36 34 2d 62 69   32-bit or 64-bi
5c90: 74 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 3b  t, respectively;
5ca0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20  ..            # 
5cb0: 20 20 20 20 20 20 6f 74 68 65 72 77 69 73 65 2c        otherwise,
5cc0: 20 69 74 73 20 74 79 70 65 20 69 73 20 75 6e 6b   its type is unk
5cd0: 6e 6f 77 6e 2e 0d 0a 20 20 20 20 20 20 20 20 20  nown...         
5ce0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
5cf0: 20 20 73 65 74 20 70 61 74 74 65 72 6e 20 7b 5e    set pattern {^
5d00: 50 45 20 20 20 20 20 20 20 20 3a 20 28 50 45 33  PE        : (PE3
5d10: 32 7c 50 45 33 32 5c 2b 29 5c 73 2b 24 7d 0d 0a  2|PE32\+)\s+$}..
5d20: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
5d30: 20 7b 5b 72 65 67 65 78 70 20 2d 6c 69 6e 65 20   {[regexp -line 
5d40: 2d 2d 20 24 70 61 74 74 65 72 6e 20 24 65 78 65  -- $pattern $exe
5d50: 63 20 64 75 6d 6d 79 20 70 65 33 32 5d 7d 20 74  c dummy pe32]} t
5d60: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
5d70: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
5d80: 20 20 20 20 20 20 23 20 48 41 43 4b 3a 20 54 68        # HACK: Th
5d90: 69 73 20 5b 73 77 69 74 63 68 5d 20 61 73 73 75  is [switch] assu
5da0: 6d 65 73 20 74 68 61 74 20 33 32 2d 62 69 74 20  mes that 32-bit 
5db0: 65 78 65 63 75 74 61 62 6c 65 73 20 61 72 65 0d  executables are.
5dc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
5dd0: 20 20 20 20 20 20 20 61 6c 77 61 79 73 20 78 38         always x8
5de0: 36 20 61 6e 64 20 74 68 61 74 20 36 34 2d 62 69  6 and that 64-bi
5df0: 74 20 65 78 65 63 75 74 61 62 6c 65 73 20 61 72  t executables ar
5e00: 65 20 61 6c 77 61 79 73 0d 0a 20 20 20 20 20 20  e always..      
5e10: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
5e20: 78 36 34 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  x64...          
5e30: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
5e40: 20 20 20 20 20 73 77 69 74 63 68 20 2d 65 78 61       switch -exa
5e50: 63 74 20 2d 2d 20 24 70 65 33 32 20 7b 0d 0a 20  ct -- $pe32 {.. 
5e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
5e70: 45 33 32 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  E32 {..         
5e80: 20 20 20 20 20 20 20 20 20 73 65 74 20 70 6c 61           set pla
5e90: 74 66 6f 72 6d 20 57 69 6e 33 32 0d 0a 20 20 20  tform Win32..   
5ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
5eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ec0: 50 45 33 32 2b 20 7b 0d 0a 20 20 20 20 20 20 20  PE32+ {..       
5ed0: 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 70             set p
5ee0: 6c 61 74 66 6f 72 6d 20 78 36 34 0d 0a 20 20 20  latform x64..   
5ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
5f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5f10: 64 65 66 61 75 6c 74 20 7b 0d 0a 20 20 20 20 20  default {..     
5f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74               set
5f30: 20 70 6c 61 74 66 6f 72 6d 20 22 22 0d 0a 20 20   platform ""..  
5f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
5f50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
5f60: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20  ..            } 
5f70: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
5f80: 20 20 20 20 20 20 73 65 74 20 70 6c 61 74 66 6f        set platfo
5f90: 72 6d 20 22 22 0d 0a 20 20 20 20 20 20 20 20 20  rm ""..         
5fa0: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
5fb0: 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23  }....          #
5fc0: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
5fd0: 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 65  TE: Attempt to e
5fe0: 78 74 72 61 63 74 20 74 68 65 20 49 4c 4f 4e 4c  xtract the ILONL
5ff0: 59 20 6c 69 6e 65 20 66 72 6f 6d 20 74 68 65 20  Y line from the 
6000: 63 61 70 74 75 72 65 64 0d 0a 20 20 20 20 20 20  captured..      
6010: 20 20 20 20 23 20 20 20 20 20 20 20 6f 75 74 70      #       outp
6020: 75 74 2e 20 20 49 66 20 74 68 69 73 20 76 61 6c  ut.  If this val
6030: 75 65 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 20  ue is zero, the 
6040: 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 20 6d  specified file m
6050: 75 73 74 0d 0a 20 20 20 20 20 20 20 20 20 20 23  ust..          #
6060: 20 20 20 20 20 20 20 62 65 20 61 20 6d 69 78 65         be a mixe
6070: 64 2d 6d 6f 64 65 20 61 73 73 65 6d 62 6c 79 3b  d-mode assembly;
6080: 20 6f 74 68 65 72 77 69 73 65 2c 20 69 74 20 63   otherwise, it c
6090: 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79 0d 0a 20 20  ontains only..  
60a0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
60b0: 6d 61 6e 61 67 65 64 20 63 6f 6d 70 6f 6e 65 6e  managed componen
60c0: 74 73 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  ts...          #
60d0: 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
60e0: 70 61 74 74 65 72 6e 20 7b 5e 49 4c 4f 4e 4c 59  pattern {^ILONLY
60f0: 20 20 20 20 3a 20 28 30 7c 31 29 5c 73 2b 24 7d      : (0|1)\s+$}
6100: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66  ....          if
6110: 20 7b 21 5b 72 65 67 65 78 70 20 2d 6c 69 6e 65   {![regexp -line
6120: 20 2d 2d 20 24 70 61 74 74 65 72 6e 20 24 65 78   -- $pattern $ex
6130: 65 63 20 64 75 6d 6d 79 20 69 6c 4f 6e 6c 79 5d  ec dummy ilOnly]
6140: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
6150: 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c        return fal
6160: 73 65 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  se..          }.
6170: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  ...          if 
6180: 7b 21 24 69 6c 4f 6e 6c 79 7d 20 74 68 65 6e 20  {!$ilOnly} then 
6190: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  {..            r
61a0: 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20  eturn true..    
61b0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
61c0: 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20   }..      }.... 
61d0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
61e0: 4e 4f 54 45 3a 20 49 66 20 74 68 65 20 74 65 73  NOTE: If the tes
61f0: 74 20 73 75 69 74 65 20 63 61 6e 6e 6f 74 20 75  t suite cannot u
6200: 73 65 20 5b 65 78 65 63 5d 20 6f 72 20 65 78 65  se [exec] or exe
6210: 63 75 74 69 6f 6e 20 6f 66 20 43 6f 72 46 6c 61  cution of CorFla
6220: 67 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  gs..      #     
6230: 20 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e    failed, return
6240: 20 66 61 6c 73 65 2e 0d 0a 20 20 20 20 20 20 23   false...      #
6250: 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 66  ..      return f
6260: 61 6c 73 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  alse..    }.....
6270: 20 20 20 20 70 72 6f 63 20 69 73 44 61 72 77 69      proc isDarwi
6280: 6e 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 72 65  n {} {..      re
6290: 74 75 72 6e 20 5b 65 78 70 72 20 7b 0d 0a 20 20  turn [expr {..  
62a0: 20 20 20 20 20 20 5b 69 6e 66 6f 20 65 78 69 73        [info exis
62b0: 74 73 20 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72  ts ::tcl_platfor
62c0: 6d 28 6f 73 29 5d 20 26 26 20 24 3a 3a 74 63 6c  m(os)] && $::tcl
62d0: 5f 70 6c 61 74 66 6f 72 6d 28 6f 73 29 20 65 71  _platform(os) eq
62e0: 20 22 44 61 72 77 69 6e 22 0d 0a 20 20 20 20 20   "Darwin"..     
62f0: 20 7d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20   }]..    }..... 
6300: 20 20 20 70 72 6f 63 20 67 65 74 4e 61 74 69 76     proc getNativ
6310: 65 4c 69 62 72 61 72 79 46 69 6c 65 4e 61 6d 65  eLibraryFileName
6320: 73 4f 6e 6c 79 20 7b 7d 20 7b 0d 0a 20 20 20 20  sOnly {} {..    
6330: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
6340: 45 3a 20 46 69 72 73 74 2c 20 63 68 65 63 6b 20  E: First, check 
6350: 69 66 20 74 68 65 20 6c 69 73 74 20 6f 66 20 6e  if the list of n
6360: 61 74 69 76 65 20 6c 69 62 72 61 72 79 20 66 69  ative library fi
6370: 6c 65 20 6e 61 6d 65 73 20 68 61 73 20 62 65 65  le names has bee
6380: 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  n..      #      
6390: 20 6d 61 6e 75 61 6c 6c 79 20 6f 76 65 72 72 69   manually overri
63a0: 64 64 65 6e 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  dden...      #..
63b0: 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20        if {[info 
63c0: 65 78 69 73 74 73 20 3a 3a 6e 61 74 69 76 65 5f  exists ::native_
63d0: 6c 69 62 72 61 72 79 5f 66 69 6c 65 5f 6e 61 6d  library_file_nam
63e0: 65 73 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  es] && \..      
63f0: 20 20 20 20 5b 6c 6c 65 6e 67 74 68 20 24 3a 3a      [llength $::
6400: 6e 61 74 69 76 65 5f 6c 69 62 72 61 72 79 5f 66  native_library_f
6410: 69 6c 65 5f 6e 61 6d 65 73 5d 20 3e 20 30 7d 20  ile_names] > 0} 
6420: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
6430: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
6440: 45 3a 20 54 68 65 20 6c 69 73 74 20 6f 66 20 6e  E: The list of n
6450: 61 74 69 76 65 20 6c 69 62 72 61 72 79 20 66 69  ative library fi
6460: 6c 65 20 6e 61 6d 65 73 20 68 61 73 20 62 65 65  le names has bee
6470: 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b 0d 0a 20  n overridden;.. 
6480: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74         #       t
6490: 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74  herefore, use it
64a0: 20 76 65 72 62 61 74 69 6d 2e 0d 0a 20 20 20 20   verbatim...    
64b0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
64c0: 65 74 75 72 6e 20 24 3a 3a 6e 61 74 69 76 65 5f  eturn $::native_
64d0: 6c 69 62 72 61 72 79 5f 66 69 6c 65 5f 6e 61 6d  library_file_nam
64e0: 65 73 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  es..      } else
64f0: 69 66 20 7b 5b 69 73 57 69 6e 64 6f 77 73 5d 7d  if {[isWindows]}
6500: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
6510: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
6520: 54 45 3a 20 4f 74 68 65 72 77 69 73 65 2c 20 6f  TE: Otherwise, o
6530: 6e 20 57 69 6e 33 32 2c 20 61 6c 77 61 79 73 20  n Win32, always 
6540: 75 73 65 20 74 68 65 20 73 74 61 6e 64 61 72 64  use the standard
6550: 20 6e 61 74 69 76 65 20 6c 69 62 72 61 72 79 0d   native library.
6560: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
6570: 20 66 69 6c 65 20 6e 61 6d 65 20 22 73 71 6c 69   file name "sqli
6580: 74 65 33 2e 64 6c 6c 22 2e 0d 0a 20 20 20 20 20  te3.dll"...     
6590: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65     #..        re
65a0: 74 75 72 6e 20 5b 6c 69 73 74 20 73 71 6c 69 74  turn [list sqlit
65b0: 65 33 2e 64 6c 6c 5d 0d 0a 20 20 20 20 20 20 7d  e3.dll]..      }
65c0: 20 65 6c 73 65 69 66 20 7b 5b 69 73 44 6f 74 4e   elseif {[isDotN
65d0: 65 74 43 6f 72 65 5d 7d 20 74 68 65 6e 20 7b 0d  etCore]} then {.
65e0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
65f0: 20 20 20 20 23 20 20 20 20 20 20 20 57 68 65 6e      #       When
6600: 20 72 75 6e 6e 69 6e 67 20 6f 6e 20 2e 4e 45 54   running on .NET
6610: 20 43 6f 72 65 2c 20 72 65 74 75 72 6e 20 74 68   Core, return th
6620: 65 20 73 61 6d 65 20 6e 61 74 69 76 65 20 6c 69  e same native li
6630: 62 72 61 72 79 0d 0a 20 20 20 20 20 20 20 20 23  brary..        #
6640: 20 20 20 20 20 20 20 66 69 6c 65 20 6e 61 6d 65         file name
6650: 20 74 68 61 74 20 69 73 20 75 73 65 64 20 6f 6e   that is used on
6660: 20 57 69 6e 64 6f 77 73 20 28 69 2e 65 2e 20 6f   Windows (i.e. o
6670: 74 68 65 72 77 69 73 65 2c 20 61 73 73 75 6d 65  therwise, assume
6680: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
6690: 20 20 77 65 20 61 72 65 20 72 75 6e 6e 69 6e 67    we are running
66a0: 20 6f 6e 20 4d 6f 6e 6f 20 61 6e 64 20 75 73 65   on Mono and use
66b0: 20 69 74 73 20 50 2f 49 6e 76 6f 6b 65 20 63 6f   its P/Invoke co
66c0: 6e 76 65 6e 74 69 6f 6e 73 29 2e 0d 0a 20 20 20  nventions)...   
66d0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
66e0: 72 65 74 75 72 6e 20 5b 6c 69 73 74 20 73 71 6c  return [list sql
66f0: 69 74 65 33 2e 64 6c 6c 5d 0d 0a 20 20 20 20 20  ite3.dll]..     
6700: 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69 73 44 61   } elseif {[isDa
6710: 72 77 69 6e 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  rwin]} then {.. 
6720: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
6730: 20 20 23 20 4e 4f 54 45 3a 20 57 68 65 6e 20 72    # NOTE: When r
6740: 75 6e 6e 69 6e 67 20 6f 6e 20 44 61 72 77 69 6e  unning on Darwin
6750: 20 28 69 2e 65 2e 20 74 68 65 20 6b 65 72 6e 65   (i.e. the kerne
6760: 6c 20 6f 66 20 69 4f 53 20 2f 20 4d 61 63 20 4f  l of iOS / Mac O
6770: 53 20 58 29 2c 0d 0a 20 20 20 20 20 20 20 20 23  S X),..        #
6780: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 68         return th
6790: 65 20 4d 61 63 20 4f 53 20 58 20 6e 61 74 69 76  e Mac OS X nativ
67a0: 65 20 6c 69 62 72 61 72 79 20 66 69 6c 65 20 6e  e library file n
67b0: 61 6d 65 2e 20 20 54 68 69 73 20 66 69 6c 65 0d  ame.  This file.
67c0: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
67d0: 20 6e 61 6d 65 20 69 73 20 6e 6f 72 6d 61 6c 6c   name is normall
67e0: 79 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 4d  y required for M
67f0: 6f 6e 6f 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ono...        #.
6800: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
6810: 5b 6c 69 73 74 20 6c 69 62 73 71 6c 69 74 65 33  [list libsqlite3
6820: 2e 64 79 6c 69 62 5d 0d 0a 20 20 20 20 20 20 7d  .dylib]..      }
6830: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
6840: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
6850: 54 45 3a 20 4f 74 68 65 72 77 69 73 65 2c 20 72  TE: Otherwise, r
6860: 65 74 75 72 6e 20 74 68 65 20 67 65 6e 65 72 69  eturn the generi
6870: 63 20 50 4f 53 49 58 20 6e 61 74 69 76 65 20 6c  c POSIX native l
6880: 69 62 72 61 72 79 20 66 69 6c 65 0d 0a 20 20 20  ibrary file..   
6890: 20 20 20 20 20 23 20 20 20 20 20 20 20 6e 61 6d       #       nam
68a0: 65 2e 20 20 54 68 69 73 20 66 69 6c 65 20 6e 61  e.  This file na
68b0: 6d 65 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 72  me is normally r
68c0: 65 71 75 69 72 65 64 20 66 6f 72 20 4d 6f 6e 6f  equired for Mono
68d0: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
68e0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6c 69        return [li
68f0: 73 74 20 6c 69 62 73 71 6c 69 74 65 33 2e 73 6f  st libsqlite3.so
6900: 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  ]..      }..    
6910: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67  }.....    proc g
6920: 65 74 49 6e 74 65 72 6f 70 41 73 73 65 6d 62 6c  etInteropAssembl
6930: 79 46 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79 20 7b  yFileNamesOnly {
6940: 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
6950: 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69 72 73      # NOTE: Firs
6960: 74 2c 20 63 68 65 63 6b 20 69 66 20 74 68 65 20  t, check if the 
6970: 6c 69 73 74 20 6f 66 20 69 6e 74 65 72 6f 70 20  list of interop 
6980: 61 73 73 65 6d 62 6c 79 20 66 69 6c 65 20 6e 61  assembly file na
6990: 6d 65 73 20 68 61 73 20 62 65 65 6e 0d 0a 20 20  mes has been..  
69a0: 20 20 20 20 23 20 20 20 20 20 20 20 6d 61 6e 75      #       manu
69b0: 61 6c 6c 79 20 6f 76 65 72 72 69 64 64 65 6e 2e  ally overridden.
69c0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
69d0: 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
69e0: 73 20 3a 3a 69 6e 74 65 72 6f 70 5f 61 73 73 65  s ::interop_asse
69f0: 6d 62 6c 79 5f 66 69 6c 65 5f 6e 61 6d 65 73 5d  mbly_file_names]
6a00: 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
6a10: 20 5b 6c 6c 65 6e 67 74 68 20 24 3a 3a 69 6e 74   [llength $::int
6a20: 65 72 6f 70 5f 61 73 73 65 6d 62 6c 79 5f 66 69  erop_assembly_fi
6a30: 6c 65 5f 6e 61 6d 65 73 5d 20 3e 20 30 7d 20 74  le_names] > 0} t
6a40: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
6a50: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
6a60: 3a 20 54 68 65 20 6c 69 73 74 20 6f 66 20 69 6e  : The list of in
6a70: 74 65 72 6f 70 20 61 73 73 65 6d 62 6c 79 20 66  terop assembly f
6a80: 69 6c 65 20 6e 61 6d 65 73 20 68 61 73 20 62 65  ile names has be
6a90: 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b 0d 0a  en overridden;..
6aa0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
6ab0: 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69  therefore, use i
6ac0: 74 20 76 65 72 62 61 74 69 6d 2e 0d 0a 20 20 20  t verbatim...   
6ad0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
6ae0: 72 65 74 75 72 6e 20 24 3a 3a 69 6e 74 65 72 6f  return $::intero
6af0: 70 5f 61 73 73 65 6d 62 6c 79 5f 66 69 6c 65 5f  p_assembly_file_
6b00: 6e 61 6d 65 73 0d 0a 20 20 20 20 20 20 7d 20 65  names..      } e
6b10: 6c 73 65 69 66 20 7b 5b 69 73 57 69 6e 64 6f 77  lseif {[isWindow
6b20: 73 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  s]} then {..    
6b30: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
6b40: 20 4e 4f 54 45 3a 20 4f 74 68 65 72 77 69 73 65   NOTE: Otherwise
6b50: 2c 20 6f 6e 20 57 69 6e 33 32 2c 20 61 6c 77 61  , on Win32, alwa
6b60: 79 73 20 75 73 65 20 74 68 65 20 69 6e 74 65 72  ys use the inter
6b70: 6f 70 20 61 73 73 65 6d 62 6c 79 20 66 69 6c 65  op assembly file
6b80: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
6b90: 20 20 6e 61 6d 65 20 22 53 51 4c 69 74 65 2e 49    name "SQLite.I
6ba0: 6e 74 65 72 6f 70 2e 64 6c 6c 22 2e 0d 0a 20 20  nterop.dll"...  
6bb0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
6bc0: 20 72 65 74 75 72 6e 20 5b 6c 69 73 74 20 53 51   return [list SQ
6bd0: 4c 69 74 65 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c  Lite.Interop.dll
6be0: 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 69  ]..      } elsei
6bf0: 66 20 7b 5b 69 73 44 6f 74 4e 65 74 43 6f 72 65  f {[isDotNetCore
6c00: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
6c10: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
6c20: 20 20 20 20 20 20 57 68 65 6e 20 72 75 6e 6e 69        When runni
6c30: 6e 67 20 6f 6e 20 2e 4e 45 54 20 43 6f 72 65 2c  ng on .NET Core,
6c40: 20 72 65 74 75 72 6e 20 74 68 65 20 73 61 6d 65   return the same
6c50: 20 69 6e 74 65 72 70 20 61 73 73 65 6d 62 6c 79   interp assembly
6c60: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
6c70: 20 20 66 69 6c 65 20 6e 61 6d 65 20 74 68 61 74    file name that
6c80: 20 69 73 20 75 73 65 64 20 6f 6e 20 57 69 6e 64   is used on Wind
6c90: 6f 77 73 20 28 69 2e 65 2e 20 6f 74 68 65 72 77  ows (i.e. otherw
6ca0: 69 73 65 2c 20 61 73 73 75 6d 65 0d 0a 20 20 20  ise, assume..   
6cb0: 20 20 20 20 20 23 20 20 20 20 20 20 20 77 65 20       #       we 
6cc0: 61 72 65 20 72 75 6e 6e 69 6e 67 20 6f 6e 20 4d  are running on M
6cd0: 6f 6e 6f 20 61 6e 64 20 75 73 65 20 69 74 73 20  ono and use its 
6ce0: 50 2f 49 6e 76 6f 6b 65 20 63 6f 6e 76 65 6e 74  P/Invoke convent
6cf0: 69 6f 6e 73 29 2e 0d 0a 20 20 20 20 20 20 20 20  ions)...        
6d00: 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  #..        retur
6d10: 6e 20 5b 6c 69 73 74 20 53 51 4c 69 74 65 2e 49  n [list SQLite.I
6d20: 6e 74 65 72 6f 70 2e 64 6c 6c 5d 0d 0a 20 20 20  nterop.dll]..   
6d30: 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69 73     } elseif {[is
6d40: 44 61 72 77 69 6e 5d 7d 20 74 68 65 6e 20 7b 0d  Darwin]} then {.
6d50: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
6d60: 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 68 65 6e      # NOTE: When
6d70: 20 72 75 6e 6e 69 6e 67 20 6f 6e 20 44 61 72 77   running on Darw
6d80: 69 6e 20 28 69 2e 65 2e 20 74 68 65 20 6b 65 72  in (i.e. the ker
6d90: 6e 65 6c 20 6f 66 20 69 4f 53 20 2f 20 4d 61 63  nel of iOS / Mac
6da0: 20 4f 53 20 58 29 2c 0d 0a 20 20 20 20 20 20 20   OS X),..       
6db0: 20 23 20 20 20 20 20 20 20 72 65 74 75 72 6e 20   #       return 
6dc0: 74 68 65 20 4d 61 63 20 4f 53 20 58 20 69 6e 74  the Mac OS X int
6dd0: 65 72 70 20 61 73 73 65 6d 62 6c 79 20 66 69 6c  erp assembly fil
6de0: 65 20 6e 61 6d 65 2e 20 20 54 68 69 73 20 66 69  e name.  This fi
6df0: 6c 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  le..        #   
6e00: 20 20 20 20 6e 61 6d 65 20 69 73 20 6e 6f 72 6d      name is norm
6e10: 61 6c 6c 79 20 72 65 71 75 69 72 65 64 20 66 6f  ally required fo
6e20: 72 20 4d 6f 6e 6f 2e 0d 0a 20 20 20 20 20 20 20  r Mono...       
6e30: 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   #..        retu
6e40: 72 6e 20 5b 6c 69 73 74 20 6c 69 62 53 51 4c 69  rn [list libSQLi
6e50: 74 65 2e 49 6e 74 65 72 6f 70 2e 64 79 6c 69 62  te.Interop.dylib
6e60: 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  ]..      } else 
6e70: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
6e80: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4f 74        # NOTE: Ot
6e90: 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20  herwise, return 
6ea0: 74 68 65 20 67 65 6e 65 72 69 63 20 50 4f 53 49  the generic POSI
6eb0: 58 20 69 6e 74 65 72 70 20 61 73 73 65 6d 62 6c  X interp assembl
6ec0: 79 20 66 69 6c 65 0d 0a 20 20 20 20 20 20 20 20  y file..        
6ed0: 23 20 20 20 20 20 20 20 6e 61 6d 65 2e 20 20 54  #       name.  T
6ee0: 68 69 73 20 66 69 6c 65 20 6e 61 6d 65 20 69 73  his file name is
6ef0: 20 6e 6f 72 6d 61 6c 6c 79 20 72 65 71 75 69 72   normally requir
6f00: 65 64 20 66 6f 72 20 4d 6f 6e 6f 2e 0d 0a 20 20  ed for Mono...  
6f10: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
6f20: 20 72 65 74 75 72 6e 20 5b 6c 69 73 74 20 6c 69   return [list li
6f30: 62 53 51 4c 69 74 65 2e 49 6e 74 65 72 6f 70 2e  bSQLite.Interop.
6f40: 73 6f 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  so]..      }..  
6f50: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
6f60: 20 67 65 74 43 6f 72 65 45 78 74 65 6e 73 69 6f   getCoreExtensio
6f70: 6e 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20  nBinaryFileName 
6f80: 7b 20 7b 64 65 66 61 75 6c 74 20 22 22 7d 20 7d  { {default ""} }
6f90: 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 66 69   {..      set fi
6fa0: 6c 65 4e 61 6d 65 20 5b 67 65 74 43 6f 72 65 42  leName [getCoreB
6fb0: 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 5d 0d 0a  inaryFileName]..
6fc0: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 66 69 6c  ..      if {[fil
6fd0: 65 20 65 78 69 73 74 73 20 24 66 69 6c 65 4e 61  e exists $fileNa
6fe0: 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  me]} then {..   
6ff0: 20 20 20 20 20 72 65 74 75 72 6e 20 24 66 69 6c       return $fil
7000: 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 7d 0d 0a  eName..      }..
7010: 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 24  ..      return $
7020: 64 65 66 61 75 6c 74 0d 0a 20 20 20 20 7d 0d 0a  default..    }..
7030: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 69 73 42 75  ...    proc isBu
7040: 69 6c 64 41 76 61 69 6c 61 62 6c 65 20 7b 20 6e  ildAvailable { n
7050: 61 74 69 76 65 20 73 6b 69 70 4e 61 74 69 76 65  ative skipNative
7060: 20 64 69 72 65 63 74 6f 72 79 20 7b 76 61 72 4e   directory {varN
7070: 61 6d 65 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20  ame ""} } {..   
7080: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
7090: 54 45 3a 20 42 75 69 6c 64 20 74 68 65 20 66 75  TE: Build the fu
70a0: 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 20 66 69  lly qualified fi
70b0: 6c 65 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20  le name for the 
70c0: 70 72 69 6d 61 72 79 20 61 73 73 65 6d 62 6c 79  primary assembly
70d0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
70e0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 53  containing the S
70f0: 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
7100: 65 20 6d 61 6e 61 67 65 64 20 63 6f 6d 70 6f 6e  e managed compon
7110: 65 6e 74 73 2e 20 20 49 74 0d 0a 20 20 20 20 20  ents.  It..     
7120: 20 23 20 20 20 20 20 20 20 73 68 6f 75 6c 64 20   #       should 
7130: 62 65 20 6e 6f 74 65 64 20 74 68 61 74 20 74 68  be noted that th
7140: 69 73 20 61 73 73 65 6d 62 6c 79 20 66 69 6c 65  is assembly file
7150: 20 6d 61 79 20 61 6c 73 6f 20 63 6f 6e 74 61 69   may also contai
7160: 6e 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20  n the..      #  
7170: 20 20 20 20 20 6e 61 74 69 76 65 20 63 6f 6d 70       native comp
7180: 6f 6e 65 6e 74 73 2c 20 69 66 20 61 20 6e 61 74  onents, if a nat
7190: 69 76 65 20 62 75 69 6c 64 20 69 73 20 69 6e 20  ive build is in 
71a0: 75 73 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  use...      #.. 
71b0: 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d       set fileNam
71c0: 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61  e [file nativena
71d0: 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 64  me [file join $d
71e0: 69 72 65 63 74 6f 72 79 20 5c 0d 0a 20 20 20 20  irectory \..    
71f0: 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74        System.Dat
7200: 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 5d 5d 0d 0a  a.SQLite.dll]]..
7210: 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 66 69  ..      if {![fi
7220: 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c 65 4e  le exists $fileN
7230: 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ame]} then {..  
7240: 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c        return fal
7250: 73 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  se..      }.... 
7260: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
7270: 4e 4f 54 45 3a 20 49 66 20 77 65 20 61 72 65 20  NOTE: If we are 
7280: 73 6b 69 70 70 69 6e 67 20 6c 6f 6f 6b 69 6e 67  skipping looking
7290: 20 66 6f 72 20 74 68 65 20 6e 61 74 69 76 65 20   for the native 
72a0: 63 6f 6d 70 6f 6e 65 6e 74 73 2c 20 73 74 6f 70  components, stop
72b0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
72c0: 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  now...      #.. 
72d0: 20 20 20 20 20 69 66 20 7b 24 73 6b 69 70 4e 61       if {$skipNa
72e0: 74 69 76 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  tive} then {..  
72f0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75        return tru
7300: 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  e..      }....  
7310: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
7320: 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20  OTE: Attempt to 
7330: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65  automatically de
7340: 74 65 63 74 20 69 66 20 74 68 65 20 70 72 69 6d  tect if the prim
7350: 61 72 79 20 61 73 73 65 6d 62 6c 79 0d 0a 20 20  ary assembly..  
7360: 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e 74      #       cont
7370: 61 69 6e 73 20 61 6e 79 20 6e 61 74 69 76 65 20  ains any native 
7380: 63 6f 6d 70 6f 6e 65 6e 74 73 2c 20 69 66 20 6e  components, if n
7390: 65 63 65 73 73 61 72 79 2e 0d 0a 20 20 20 20 20  ecessary...     
73a0: 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73   #..      if {[s
73b0: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 6e 61  tring length $na
73c0: 74 69 76 65 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  tive] == 0} then
73d0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   {..        if {
73e0: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
73f0: 76 61 72 4e 61 6d 65 5d 20 3e 20 30 7d 20 74 68  varName] > 0} th
7400: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
7410: 75 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65  upvar 1 $varName
7420: 20 24 76 61 72 4e 61 6d 65 0d 0a 20 20 20 20 20   $varName..     
7430: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
7440: 73 65 74 20 6e 61 74 69 76 65 20 5b 69 73 4d 69  set native [isMi
7450: 78 65 64 4d 6f 64 65 41 73 73 65 6d 62 6c 79 20  xedModeAssembly 
7460: 24 66 69 6c 65 4e 61 6d 65 20 24 76 61 72 4e 61  $fileName $varNa
7470: 6d 65 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  me]..      }....
7480: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
7490: 20 4e 4f 54 45 3a 20 49 66 20 74 68 65 20 70 72   NOTE: If the pr
74a0: 69 6d 61 72 79 20 61 73 73 65 6d 62 6c 79 20 61  imary assembly a
74b0: 6c 73 6f 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  lso contains the
74c0: 20 6e 61 74 69 76 65 20 63 6f 6d 70 6f 6e 65 6e   native componen
74d0: 74 73 2c 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ts,..      #    
74e0: 20 20 20 77 65 20 68 61 76 65 20 65 76 65 72 79     we have every
74f0: 74 68 69 6e 67 20 77 65 20 6e 65 65 64 2e 0d 0a  thing we need...
7500: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
7510: 66 20 7b 24 6e 61 74 69 76 65 7d 20 74 68 65 6e  f {$native} then
7520: 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   {..        retu
7530: 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20 7d  rn true..      }
7540: 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
7550: 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 74 68     # NOTE: If th
7560: 65 20 6d 61 63 68 69 6e 65 20 6e 61 6d 65 20 69  e machine name i
7570: 73 20 75 6e 61 76 61 69 6c 61 62 6c 65 2c 20 74  s unavailable, t
7580: 68 65 72 65 20 69 73 20 6e 6f 74 68 69 6e 67 20  here is nothing 
7590: 65 6c 73 65 20 77 65 0d 0a 20 20 20 20 20 20 23  else we..      #
75a0: 20 20 20 20 20 20 20 63 61 6e 20 64 6f 2e 0d 0a         can do...
75b0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
75c0: 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
75d0: 20 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28   ::tcl_platform(
75e0: 6d 61 63 68 69 6e 65 29 5d 7d 20 74 68 65 6e 20  machine)]} then 
75f0: 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  {..        retur
7600: 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20 20 20 7d  n false..      }
7610: 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
7620: 20 20 20 23 20 4e 4f 54 45 3a 20 57 68 61 74 20     # NOTE: What 
7630: 69 73 20 74 68 65 20 61 72 63 68 69 74 65 63 74  is the architect
7640: 75 72 65 20 66 6f 72 20 74 68 69 73 20 6d 61 63  ure for this mac
7650: 68 69 6e 65 3f 0d 0a 20 20 20 20 20 20 23 0d 0a  hine?..      #..
7660: 20 20 20 20 20 20 73 65 74 20 61 72 63 68 69 74        set archit
7670: 65 63 74 75 72 65 20 5b 6d 61 63 68 69 6e 65 54  ecture [machineT
7680: 6f 50 6c 61 74 66 6f 72 6d 20 24 3a 3a 74 63 6c  oPlatform $::tcl
7690: 5f 70 6c 61 74 66 6f 72 6d 28 6d 61 63 68 69 6e  _platform(machin
76a0: 65 29 20 74 72 75 65 5d 0d 0a 0d 0a 20 20 20 20  e) true]....    
76b0: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
76c0: 45 3a 20 57 68 61 74 20 69 73 20 74 68 65 20 70  E: What is the p
76d0: 6c 61 74 66 6f 72 6d 20 66 6f 72 20 74 68 69 73  latform for this
76e0: 20 6d 61 63 68 69 6e 65 3f 0d 0a 20 20 20 20 20   machine?..     
76f0: 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 70 6c   #..      set pl
7700: 61 74 66 6f 72 6d 20 5b 6d 61 63 68 69 6e 65 54  atform [machineT
7710: 6f 50 6c 61 74 66 6f 72 6d 20 24 3a 3a 74 63 6c  oPlatform $::tcl
7720: 5f 70 6c 61 74 66 6f 72 6d 28 6d 61 63 68 69 6e  _platform(machin
7730: 65 29 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a  e)]....      #..
7740: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75        # NOTE: Bu
7750: 69 6c 64 20 74 68 65 20 66 75 6c 6c 79 20 71 75  ild the fully qu
7760: 61 6c 69 66 69 65 64 20 66 69 6c 65 20 6e 61 6d  alified file nam
7770: 65 20 66 6f 72 20 74 68 65 20 69 6e 74 65 72 6f  e for the intero
7780: 70 20 61 73 73 65 6d 62 6c 79 0d 0a 20 20 20 20  p assembly..    
7790: 20 20 23 20 20 20 20 20 20 20 63 6f 6e 74 61 69    #       contai
77a0: 6e 69 6e 67 20 74 68 65 20 53 79 73 74 65 6d 2e  ning the System.
77b0: 44 61 74 61 2e 53 51 4c 69 74 65 20 6e 61 74 69  Data.SQLite nati
77c0: 76 65 20 63 6f 6d 70 6f 6e 65 6e 74 73 2e 20 20  ve components.  
77d0: 49 66 20 74 68 69 73 0d 0a 20 20 20 20 20 20 23  If this..      #
77e0: 20 20 20 20 20 20 20 66 69 6c 65 20 65 78 69 73         file exis
77f0: 74 73 2c 20 77 65 20 73 68 6f 75 6c 64 20 68 61  ts, we should ha
7800: 76 65 20 65 76 65 72 79 74 68 69 6e 67 20 77 65  ve everything we
7810: 20 6e 65 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d   need...      #.
7820: 0a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66  .      foreach f
7830: 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 5b 67 65 74  ileNameOnly [get
7840: 49 6e 74 65 72 6f 70 41 73 73 65 6d 62 6c 79 46  InteropAssemblyF
7850: 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79 5d 20 7b 0d  ileNamesOnly] {.
7860: 0a 20 20 20 20 20 20 20 20 73 65 74 20 66 69 6c  .        set fil
7870: 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6e 61 74 69  eName [file nati
7880: 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69  vename [file joi
7890: 6e 20 24 64 69 72 65 63 74 6f 72 79 20 5c 0d 0a  n $directory \..
78a0: 20 20 20 20 20 20 20 20 20 20 20 20 24 61 72 63              $arc
78b0: 68 69 74 65 63 74 75 72 65 20 24 66 69 6c 65 4e  hitecture $fileN
78c0: 61 6d 65 4f 6e 6c 79 5d 5d 0d 0a 0d 0a 20 20 20  ameOnly]]....   
78d0: 20 20 20 20 20 69 66 20 7b 5b 66 69 6c 65 20 65       if {[file e
78e0: 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d  xists $fileName]
78f0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
7900: 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65 0d      return true.
7910: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
7920: 20 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61        set fileNa
7930: 6d 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e  me [file nativen
7940: 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24  ame [file join $
7950: 64 69 72 65 63 74 6f 72 79 20 5c 0d 0a 20 20 20  directory \..   
7960: 20 20 20 20 20 20 20 20 20 24 70 6c 61 74 66 6f           $platfo
7970: 72 6d 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79  rm $fileNameOnly
7980: 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66  ]]....        if
7990: 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24   {[file exists $
79a0: 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20  fileName]} then 
79b0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  {..          ret
79c0: 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20  urn true..      
79d0: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73    }....        s
79e0: 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c  et fileName [fil
79f0: 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69  e nativename [fi
7a00: 6c 65 20 6a 6f 69 6e 20 24 64 69 72 65 63 74 6f  le join $directo
7a10: 72 79 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ry \..          
7a20: 20 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 5d    $fileNameOnly]
7a30: 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20  ]....        if 
7a40: 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 66  {[file exists $f
7a50: 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b  ileName]} then {
7a60: 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ..          retu
7a70: 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20 20  rn true..       
7a80: 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20   }..      }.... 
7a90: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
7aa0: 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74 68 65 20  NOTE: Build the 
7ab0: 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 20  fully qualified 
7ac0: 66 69 6c 65 20 6e 61 6d 65 20 66 6f 72 20 74 68  file name for th
7ad0: 65 20 53 51 4c 69 74 65 20 63 6f 72 65 0d 0a 20  e SQLite core.. 
7ae0: 20 20 20 20 20 23 20 20 20 20 20 20 20 6c 69 62       #       lib
7af0: 72 61 72 79 2e 20 20 49 66 20 74 68 69 73 20 66  rary.  If this f
7b00: 69 6c 65 20 65 78 69 73 74 73 2c 20 77 65 20 73  ile exists, we s
7b10: 68 6f 75 6c 64 20 68 61 76 65 20 65 76 65 72 79  hould have every
7b20: 74 68 69 6e 67 20 77 65 0d 0a 20 20 20 20 20 20  thing we..      
7b30: 23 20 20 20 20 20 20 20 6e 65 65 64 2e 0d 0a 20  #       need... 
7b40: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 66 6f       #..      fo
7b50: 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 4f 6e  reach fileNameOn
7b60: 6c 79 20 5b 67 65 74 4e 61 74 69 76 65 4c 69 62  ly [getNativeLib
7b70: 72 61 72 79 46 69 6c 65 4e 61 6d 65 73 4f 6e 6c  raryFileNamesOnl
7b80: 79 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65  y] {..        se
7b90: 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65  t fileName [file
7ba0: 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c   nativename [fil
7bb0: 65 20 6a 6f 69 6e 20 24 64 69 72 65 63 74 6f 72  e join $director
7bc0: 79 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  y \..           
7bd0: 20 24 61 72 63 68 69 74 65 63 74 75 72 65 20 24   $architecture $
7be0: 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 5d 5d 0d 0a  fileNameOnly]]..
7bf0: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 66  ..        if {[f
7c00: 69 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c 65  ile exists $file
7c10: 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  Name]} then {.. 
7c20: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
7c30: 74 72 75 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d  true..        }.
7c40: 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 66  ...        set f
7c50: 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6e 61  ileName [file na
7c60: 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a  tivename [file j
7c70: 6f 69 6e 20 24 64 69 72 65 63 74 6f 72 79 20 5c  oin $directory \
7c80: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 24 70  ..            $p
7c90: 6c 61 74 66 6f 72 6d 20 24 66 69 6c 65 4e 61 6d  latform $fileNam
7ca0: 65 4f 6e 6c 79 5d 5d 0d 0a 0d 0a 20 20 20 20 20  eOnly]]....     
7cb0: 20 20 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69     if {[file exi
7cc0: 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20  sts $fileName]} 
7cd0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
7ce0: 20 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20    return true.. 
7cf0: 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
7d00: 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65      set fileName
7d10: 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d   [file nativenam
7d20: 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 64 69  e [file join $di
7d30: 72 65 63 74 6f 72 79 20 5c 0d 0a 20 20 20 20 20  rectory \..     
7d40: 20 20 20 20 20 20 20 24 66 69 6c 65 4e 61 6d 65         $fileName
7d50: 4f 6e 6c 79 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20  Only]]....      
7d60: 20 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73    if {[file exis
7d70: 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74  ts $fileName]} t
7d80: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
7d90: 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20   return true..  
7da0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
7db0: 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
7dc0: 20 20 20 23 20 4e 4f 54 45 3a 20 4f 6e 65 20 6f     # NOTE: One o
7dd0: 72 20 6d 6f 72 65 20 6e 61 74 69 76 65 20 63 6f  r more native co
7de0: 6d 70 6f 6e 65 6e 74 73 20 6e 65 65 64 65 64 20  mponents needed 
7df0: 62 79 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  by System.Data.S
7e00: 51 4c 69 74 65 0d 0a 20 20 20 20 20 20 23 20 20  QLite..      #  
7e10: 20 20 20 20 20 61 72 65 20 6d 69 73 73 69 6e 67       are missing
7e20: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
7e30: 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a    return false..
7e40: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
7e50: 6f 63 20 69 73 52 65 6c 65 61 73 65 41 76 61 69  oc isReleaseAvai
7e60: 6c 61 62 6c 65 20 7b 20 64 69 72 65 63 74 6f 72  lable { director
7e70: 79 20 7b 76 61 72 4e 61 6d 65 20 22 22 7d 20 7d  y {varName ""} }
7e80: 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73   {..      if {[s
7e90: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 61  tring length $va
7ea0: 72 4e 61 6d 65 5d 20 3e 20 30 7d 20 74 68 65 6e  rName] > 0} then
7eb0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 75 70 76 61   {..        upva
7ec0: 72 20 31 20 24 76 61 72 4e 61 6d 65 20 24 76 61  r 1 $varName $va
7ed0: 72 4e 61 6d 65 0d 0a 20 20 20 20 20 20 7d 0d 0a  rName..      }..
7ee0: 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b  ..      return [
7ef0: 69 73 42 75 69 6c 64 41 76 61 69 6c 61 62 6c 65  isBuildAvailable
7f00: 20 22 22 20 66 61 6c 73 65 20 24 64 69 72 65 63   "" false $direc
7f10: 74 6f 72 79 20 24 76 61 72 4e 61 6d 65 5d 0d 0a  tory $varName]..
7f20: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
7f30: 6f 63 20 6a 6f 69 6e 42 75 69 6c 64 44 69 72 65  oc joinBuildDire
7f40: 63 74 6f 72 79 20 7b 20 6e 61 74 69 76 65 20 70  ctory { native p
7f50: 61 74 68 20 79 65 61 72 20 70 6c 61 74 66 6f 72  ath year platfor
7f60: 6d 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  m configuration 
7f70: 65 78 74 72 61 20 7d 20 7b 0d 0a 20 20 20 20 20  extra } {..     
7f80: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
7f90: 3a 20 46 69 67 75 72 65 20 6f 75 74 20 61 6e 64  : Figure out and
7fa0: 20 74 68 65 6e 20 72 65 74 75 72 6e 20 74 68 65   then return the
7fb0: 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64   fully qualified
7fc0: 20 70 61 74 68 20 74 6f 20 74 68 65 20 62 75 69   path to the bui
7fd0: 6c 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ld..      #     
7fe0: 20 20 64 69 72 65 63 74 6f 72 79 20 62 61 73 65    directory base
7ff0: 64 20 6f 6e 20 61 6c 6c 20 74 68 65 20 61 72 67  d on all the arg
8000: 75 6d 65 6e 74 73 20 70 72 6f 76 69 64 65 64 20  uments provided 
8010: 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 2e 0d 0a  by our caller...
8020: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
8030: 66 20 7b 24 6e 61 74 69 76 65 7d 20 74 68 65 6e  f {$native} then
8040: 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   {..        retu
8050: 72 6e 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 70  rn [file join $p
8060: 61 74 68 20 62 69 6e 20 24 79 65 61 72 20 24 70  ath bin $year $p
8070: 6c 61 74 66 6f 72 6d 20 24 63 6f 6e 66 69 67 75  latform $configu
8080: 72 61 74 69 6f 6e 20 24 65 78 74 72 61 5d 0d 0a  ration $extra]..
8090: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
80a0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b          return [
80b0: 66 69 6c 65 20 6a 6f 69 6e 20 24 70 61 74 68 20  file join $path 
80c0: 62 69 6e 20 24 79 65 61 72 20 24 63 6f 6e 66 69  bin $year $confi
80d0: 67 75 72 61 74 69 6f 6e 20 62 69 6e 20 24 65 78  guration bin $ex
80e0: 74 72 61 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  tra]..      }.. 
80f0: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
8100: 63 20 67 65 74 42 75 69 6c 64 44 69 72 65 63 74  c getBuildDirect
8110: 6f 72 79 20 7b 20 6d 61 6e 61 67 65 64 4f 6e 6c  ory { managedOnl
8120: 79 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a  y } {..      #..
8130: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 65        # NOTE: Se
8140: 65 20 69 66 20 74 68 65 20 22 6e 61 74 69 76 65  e if the "native
8150: 22 20 72 75 6e 74 69 6d 65 20 6f 70 74 69 6f 6e  " runtime option
8160: 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 20   has been set.  
8170: 49 66 20 73 6f 2c 20 75 73 65 20 74 68 65 0d 0a  If so, use the..
8180: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64 69        #       di
8190: 72 65 63 74 6f 72 79 20 66 6f 72 20 74 68 65 20  rectory for the 
81a0: 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73 65 6d  mixed-mode assem
81b0: 62 6c 79 20 28 61 2e 6b 2e 61 2e 20 74 68 65 20  bly (a.k.a. the 
81c0: 6e 61 74 69 76 65 20 69 6e 74 65 72 6f 70 0d 0a  native interop..
81d0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61 73        #       as
81e0: 73 65 6d 62 6c 79 29 2e 20 20 54 6f 20 65 6e 61  sembly).  To ena
81f0: 62 6c 65 20 74 68 69 73 20 6f 70 74 69 6f 6e 20  ble this option 
8200: 76 69 61 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20  via the command 
8210: 6c 69 6e 65 2c 20 65 6e 74 65 72 20 61 0d 0a 20  line, enter a.. 
8220: 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 6d       #       com
8230: 6d 61 6e 64 20 73 69 6d 69 6c 61 72 20 74 6f 20  mand similar to 
8240: 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  one of the follo
8250: 77 69 6e 67 20 28 61 6c 6c 20 6f 6e 20 6f 6e 65  wing (all on one
8260: 20 6c 69 6e 65 29 3a 0d 0a 20 20 20 20 20 20 23   line):..      #
8270: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
8280: 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65 20 2d  EagleShell.exe -
8290: 69 6e 69 74 69 61 6c 69 7a 65 20 2d 72 75 6e 74  initialize -runt
82a0: 69 6d 65 4f 70 74 69 6f 6e 20 6e 61 74 69 76 65  imeOption native
82b0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
82c0: 20 20 2d 66 69 6c 65 20 2e 5c 70 61 74 68 5c 74    -file .\path\t
82d0: 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a 20 20 20  o\all.eagle..   
82e0: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 20 20     #..      #   
82f0: 20 20 20 20 54 6f 20 65 6e 61 62 6c 65 20 74 68      To enable th
8300: 69 73 20 6f 70 74 69 6f 6e 20 76 69 61 20 74 68  is option via th
8310: 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 70  e command line p
8320: 72 69 6f 72 20 74 6f 20 74 68 65 20 22 62 65 74  rior to the "bet
8330: 61 20 31 36 22 0d 0a 20 20 20 20 20 20 23 20 20  a 16"..      #  
8340: 20 20 20 20 20 72 65 6c 65 61 73 65 20 6f 66 20       release of 
8350: 45 61 67 6c 65 2c 20 74 68 65 20 66 6f 6c 6c 6f  Eagle, the follo
8360: 77 69 6e 67 20 63 6f 6d 6d 61 6e 64 20 6d 75 73  wing command mus
8370: 74 20 62 65 20 75 73 65 64 20 69 6e 73 74 65 61  t be used instea
8380: 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  d..      #      
8390: 20 28 61 6c 73 6f 20 61 6c 6c 20 6f 6e 20 6f 6e   (also all on on
83a0: 65 20 6c 69 6e 65 29 3a 0d 0a 20 20 20 20 20 20  e line):..      
83b0: 23 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  #..      #      
83c0: 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65 20   EagleShell.exe 
83d0: 2d 69 6e 69 74 69 61 6c 69 7a 65 20 2d 70 6f 73  -initialize -pos
83e0: 74 49 6e 69 74 69 61 6c 69 7a 65 0d 0a 20 20 20  tInitialize..   
83f0: 20 20 20 23 20 20 20 20 20 20 20 20 20 22 6f 62     #         "ob
8400: 6a 65 63 74 20 69 6e 76 6f 6b 65 20 49 6e 74 65  ject invoke Inte
8410: 72 70 72 65 74 65 72 2e 47 65 74 41 63 74 69 76  rpreter.GetActiv
8420: 65 20 41 64 64 52 75 6e 74 69 6d 65 4f 70 74 69  e AddRuntimeOpti
8430: 6f 6e 20 6e 61 74 69 76 65 22 0d 0a 20 20 20 20  on native"..    
8440: 20 20 23 20 20 20 20 20 20 20 20 20 2d 66 69 6c    #         -fil
8450: 65 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e  e .\path\to\all.
8460: 65 61 67 6c 65 0d 0a 20 20 20 20 20 20 23 0d 0a  eagle..      #..
8470: 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20        if {[info 
8480: 65 78 69 73 74 73 20 3a 3a 62 75 69 6c 64 5f 64  exists ::build_d
8490: 69 72 65 63 74 6f 72 79 5d 20 26 26 20 5c 0d 0a  irectory] && \..
84a0: 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e            [strin
84b0: 67 20 6c 65 6e 67 74 68 20 24 3a 3a 62 75 69 6c  g length $::buil
84c0: 64 5f 64 69 72 65 63 74 6f 72 79 5d 20 3e 20 30  d_directory] > 0
84d0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
84e0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
84f0: 4f 54 45 3a 20 54 68 65 20 6c 6f 63 61 74 69 6f  OTE: The locatio
8500: 6e 20 6f 66 20 74 68 65 20 62 75 69 6c 64 20 64  n of the build d
8510: 69 72 65 63 74 6f 72 79 20 68 61 73 20 62 65 65  irectory has bee
8520: 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b 0d 0a 20  n overridden;.. 
8530: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74         #       t
8540: 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74  herefore, use it
8550: 20 76 65 72 62 61 74 69 6d 2e 0d 0a 20 20 20 20   verbatim...    
8560: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
8570: 65 74 75 72 6e 20 24 3a 3a 62 75 69 6c 64 5f 64  eturn $::build_d
8580: 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20  irectory..      
8590: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
85a0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
85b0: 4f 54 45 3a 20 49 66 20 74 68 65 20 22 6e 61 74  OTE: If the "nat
85c0: 69 76 65 22 20 72 75 6e 74 69 6d 65 20 6f 70 74  ive" runtime opt
85d0: 69 6f 6e 20 69 73 20 73 65 74 2c 20 74 68 65 20  ion is set, the 
85e0: 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73 65 6d  mixed-mode assem
85f0: 62 6c 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20  bly..        #  
8600: 20 20 20 20 20 69 73 20 62 65 69 6e 67 20 74 65       is being te
8610: 73 74 65 64 2e 20 20 49 6e 20 74 68 61 74 20 63  sted.  In that c
8620: 61 73 65 2c 20 74 68 65 20 70 61 74 68 20 74 6f  ase, the path to
8630: 20 74 68 65 20 62 75 69 6c 64 20 64 69 72 65 63   the build direc
8640: 74 6f 72 79 0d 0a 20 20 20 20 20 20 20 20 23 20  tory..        # 
8650: 20 20 20 20 20 20 77 69 6c 6c 20 63 6f 6e 74 61        will conta
8660: 69 6e 20 74 68 65 20 70 6c 61 74 66 6f 72 6d 20  in the platform 
8670: 6e 61 6d 65 20 61 6e 64 20 61 6c 6c 20 74 68 65  name and all the
8680: 20 62 69 6e 61 72 69 65 73 20 75 6e 64 65 72 20   binaries under 
8690: 74 65 73 74 0d 0a 20 20 20 20 20 20 20 20 23 20  test..        # 
86a0: 20 20 20 20 20 20 73 68 6f 75 6c 64 20 62 65 20        should be 
86b0: 70 72 65 73 65 6e 74 20 69 6e 20 74 68 61 74 20  present in that 
86c0: 64 69 72 65 63 74 6f 72 79 2e 20 20 49 66 20 74  directory.  If t
86d0: 68 65 20 22 6e 61 74 69 76 65 22 20 72 75 6e 74  he "native" runt
86e0: 69 6d 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ime..        #  
86f0: 20 20 20 20 20 6f 70 74 69 6f 6e 20 69 73 20 6e       option is n
8700: 6f 74 20 73 65 74 2c 20 74 68 65 20 62 75 69 6c  ot set, the buil
8710: 64 20 64 69 72 65 63 74 6f 72 79 20 77 69 6c 6c  d directory will
8720: 20 62 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74   be considered t
8730: 6f 20 62 65 0d 0a 20 20 20 20 20 20 20 20 23 20  o be..        # 
8740: 20 20 20 20 20 20 22 70 6c 61 74 66 6f 72 6d 2d        "platform-
8750: 6e 65 75 74 72 61 6c 22 2c 20 77 69 74 68 20 74  neutral", with t
8760: 68 65 20 6e 6f 74 61 62 6c 65 20 65 78 63 65 70  he notable excep
8770: 74 69 6f 6e 20 6f 66 20 61 6e 79 20 6e 61 74 69  tion of any nati
8780: 76 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ve..        #   
8790: 20 20 20 20 61 73 73 65 6d 62 6c 79 20 28 65 2e      assembly (e.
87a0: 67 2e 20 22 53 51 4c 69 74 65 2e 49 6e 74 65 72  g. "SQLite.Inter
87b0: 6f 70 2e 64 6c 6c 22 29 20 63 6f 70 69 65 64 20  op.dll") copied 
87c0: 74 68 65 72 65 20 64 75 72 69 6e 67 20 74 68 65  there during the
87d0: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
87e0: 20 20 62 75 69 6c 64 20 70 72 6f 63 65 73 73 20    build process 
87f0: 69 74 73 65 6c 66 2e 20 20 49 66 20 74 68 65 20  itself.  If the 
8800: 62 75 69 6c 64 20 70 72 6f 63 65 73 73 20 73 6f  build process so
8810: 6d 65 68 6f 77 20 64 6f 65 73 20 6e 6f 74 0d 0a  mehow does not..
8820: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
8830: 63 6f 70 79 20 74 68 65 20 6e 61 74 69 76 65 20  copy the native 
8840: 61 73 73 65 6d 62 6c 79 20 66 6f 72 20 74 68 69  assembly for thi
8850: 73 20 70 6c 61 74 66 6f 72 6d 2c 20 6d 6f 73 74  s platform, most
8860: 20 6f 66 20 74 68 65 20 74 65 73 74 73 0d 0a 20   of the tests.. 
8870: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69         #       i
8880: 6e 20 74 68 65 20 73 75 69 74 65 20 77 69 6c 6c  n the suite will
8890: 20 73 69 6d 70 6c 79 20 62 65 20 73 6b 69 70 70   simply be skipp
88a0: 65 64 2e 20 20 47 65 6e 65 72 61 6c 6c 79 20 73  ed.  Generally s
88b0: 70 65 61 6b 69 6e 67 2c 20 74 68 65 72 65 0d 0a  peaking, there..
88c0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
88d0: 61 72 65 20 74 77 6f 20 77 61 79 73 20 74 6f 20  are two ways to 
88e0: 62 75 69 6c 64 20 74 68 65 20 62 69 6e 61 72 69  build the binari
88f0: 65 73 20 77 68 65 6e 20 70 72 65 70 61 72 69 6e  es when preparin
8900: 67 20 74 6f 20 72 75 6e 20 74 68 65 0d 0a 20 20  g to run the..  
8910: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 65        #       te
8920: 73 74 20 73 75 69 74 65 3a 0d 0a 20 20 20 20 20  st suite:..     
8930: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
8940: 20 20 20 20 20 20 31 2e 20 42 75 69 6c 64 20 74        1. Build t
8950: 68 65 20 73 65 70 61 72 61 74 65 20 6d 61 6e 61  he separate mana
8960: 67 65 64 20 61 6e 64 20 6e 61 74 69 76 65 20 61  ged and native a
8970: 73 73 65 6d 62 6c 69 65 73 20 75 73 69 6e 67 20  ssemblies using 
8980: 73 6f 6d 65 0d 0a 20 20 20 20 20 20 20 20 23 20  some..        # 
8990: 20 20 20 20 20 20 20 20 20 63 6f 6d 6d 61 6e 64           command
89a0: 73 20 73 69 6d 69 6c 61 72 20 74 6f 3a 0d 0a 20  s similar to:.. 
89b0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
89c0: 20 20 23 20 20 20 20 20 20 20 20 20 20 62 75 69    #          bui
89d0: 6c 64 2e 62 61 74 20 24 7b 43 6f 6e 66 69 67 75  ld.bat ${Configu
89e0: 72 61 74 69 6f 6e 7d 4d 61 6e 61 67 65 64 4f 6e  ration}ManagedOn
89f0: 6c 79 20 24 7b 50 6c 61 74 66 6f 72 6d 7d 0d 0a  ly ${Platform}..
8a00: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
8a10: 20 20 20 62 75 69 6c 64 2e 62 61 74 20 24 7b 43     build.bat ${C
8a20: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 7d 4e 61 74  onfiguration}Nat
8a30: 69 76 65 4f 6e 6c 79 20 24 7b 50 6c 61 74 66 6f  iveOnly ${Platfo
8a40: 72 6d 7d 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  rm}..        #..
8a50: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
8a60: 20 20 20 57 68 65 72 65 20 24 7b 43 6f 6e 66 69     Where ${Confi
8a70: 67 75 72 61 74 69 6f 6e 7d 20 69 73 20 65 69 74  guration} is eit
8a80: 68 65 72 20 22 44 65 62 75 67 22 20 6f 72 20 22  her "Debug" or "
8a90: 52 65 6c 65 61 73 65 22 20 61 6e 64 0d 0a 20 20  Release" and..  
8aa0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20        #         
8ab0: 20 24 7b 50 6c 61 74 66 6f 72 6d 7d 20 69 73 20   ${Platform} is 
8ac0: 65 69 74 68 65 72 20 22 57 69 6e 33 32 22 20 6f  either "Win32" o
8ad0: 72 20 22 78 36 34 22 2e 0d 0a 20 20 20 20 20 20  r "x64"...      
8ae0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 20    #..        #  
8af0: 20 20 20 20 20 32 2e 20 42 75 69 6c 64 20 74 68       2. Build th
8b00: 65 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73  e mixed-mode ass
8b10: 65 6d 62 6c 79 20 75 73 69 6e 67 20 61 20 63 6f  embly using a co
8b20: 6d 6d 61 6e 64 20 73 69 6d 69 6c 61 72 20 74 6f  mmand similar to
8b30: 3a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  :..        #..  
8b40: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20        #         
8b50: 20 62 75 69 6c 64 2e 62 61 74 20 24 7b 43 6f 6e   build.bat ${Con
8b60: 66 69 67 75 72 61 74 69 6f 6e 7d 20 24 7b 50 6c  figuration} ${Pl
8b70: 61 74 66 6f 72 6d 7d 0d 0a 20 20 20 20 20 20 20  atform}..       
8b80: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20   #..        #   
8b90: 20 20 20 20 20 20 20 57 68 65 72 65 20 24 7b 43         Where ${C
8ba0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 7d 20 69 73  onfiguration} is
8bb0: 20 65 69 74 68 65 72 20 22 44 65 62 75 67 22 20   either "Debug" 
8bc0: 6f 72 20 22 52 65 6c 65 61 73 65 22 20 61 6e 64  or "Release" and
8bd0: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
8be0: 20 20 20 20 20 24 7b 50 6c 61 74 66 6f 72 6d 7d       ${Platform}
8bf0: 20 69 73 20 65 69 74 68 65 72 20 22 57 69 6e 33   is either "Win3
8c00: 32 22 20 6f 72 20 22 78 36 34 22 2e 20 20 49 66  2" or "x64".  If
8c10: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 69 73   this command is
8c20: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
8c30: 20 20 20 20 20 75 73 65 64 2c 20 76 61 72 69 6f       used, vario
8c40: 75 73 20 74 65 73 74 73 20 74 68 61 74 20 72 65  us tests that re
8c50: 71 75 69 72 65 20 73 75 70 70 6c 65 6d 65 6e 74  quire supplement
8c60: 61 72 79 20 6d 61 6e 61 67 65 64 0d 0a 20 20 20  ary managed..   
8c70: 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20 20       #          
8c80: 61 73 73 65 6d 62 6c 69 65 73 20 28 65 2e 67 2e  assemblies (e.g.
8c90: 20 4c 49 4e 51 29 20 6d 61 79 20 62 65 20 73 6b   LINQ) may be sk
8ca0: 69 70 70 65 64 20 75 6e 6c 65 73 73 20 74 68 6f  ipped unless tho
8cb0: 73 65 20 62 69 6e 61 72 69 65 73 0d 0a 20 20 20  se binaries..   
8cc0: 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20 20       #          
8cd0: 61 72 65 20 73 75 62 73 65 71 75 65 6e 74 6c 79  are subsequently
8ce0: 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65   copied into the
8cf0: 20 63 6f 72 72 65 63 74 20 64 69 72 65 63 74 6f   correct directo
8d00: 72 79 20 28 69 2e 65 2e 20 62 79 0d 0a 20 20 20  ry (i.e. by..   
8d10: 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20 20       #          
8d20: 22 74 65 73 74 5f 61 6c 6c 2e 62 61 74 22 29 2e  "test_all.bat").
8d30: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
8d40: 20 20 20 20 20 23 20 20 20 20 20 20 20 4e 6f 74       #       Not
8d50: 65 20 74 68 61 74 20 61 6c 6c 20 6f 66 20 74 68  e that all of th
8d60: 65 20 62 75 69 6c 64 20 63 6f 6d 6d 61 6e 64 73  e build commands
8d70: 20 61 62 6f 76 65 20 77 69 6c 6c 20 64 65 66 61   above will defa
8d80: 75 6c 74 20 74 6f 20 75 73 69 6e 67 0d 0a 20 20  ult to using..  
8d90: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68        #       th
8da0: 65 20 6c 61 74 65 73 74 20 76 65 72 73 69 6f 6e  e latest version
8db0: 20 6f 66 20 4d 53 42 75 69 6c 64 20 61 76 61 69   of MSBuild avai
8dc0: 6c 61 62 6c 65 20 61 6e 64 20 74 68 65 20 22 74  lable and the "t
8dd0: 65 73 74 5f 79 65 61 72 22 20 6d 61 79 0d 0a 20  est_year" may.. 
8de0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6e         #       n
8df0: 65 65 64 20 74 6f 20 62 65 20 61 64 6a 75 73 74  eed to be adjust
8e00: 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 20 74  ed accordingly t
8e10: 6f 20 61 63 74 75 61 6c 6c 79 20 72 75 6e 20 74  o actually run t
8e20: 68 65 20 74 65 73 74 20 73 75 69 74 65 2e 0d 0a  he test suite...
8e30: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
8e40: 52 65 66 65 72 20 74 6f 20 74 68 65 20 63 6f 6d  Refer to the com
8e50: 6d 65 6e 74 73 20 69 6e 20 5b 67 65 74 42 75 69  ments in [getBui
8e60: 6c 64 59 65 61 72 5d 20 66 6f 72 20 6d 6f 72 65  ldYear] for more
8e70: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 0d   information on.
8e80: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
8e90: 20 68 6f 77 20 74 6f 20 73 65 74 20 74 68 69 73   how to set this
8ea0: 20 76 61 72 69 61 62 6c 65 2e 0d 0a 20 20 20 20   variable...    
8eb0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73      #..        s
8ec0: 65 74 20 6e 61 74 69 76 65 20 5b 65 78 70 72 20  et native [expr 
8ed0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 21 24 6d  {..          !$m
8ee0: 61 6e 61 67 65 64 4f 6e 6c 79 20 26 26 20 28 5b  anagedOnly && ([
8ef0: 67 65 74 42 75 69 6c 64 4e 61 74 69 76 65 5d 20  getBuildNative] 
8f00: 7c 7c 20 5b 68 61 73 52 75 6e 74 69 6d 65 4f 70  || [hasRuntimeOp
8f10: 74 69 6f 6e 20 6e 61 74 69 76 65 5d 29 0d 0a 20  tion native]).. 
8f20: 20 20 20 20 20 20 20 7d 5d 0d 0a 0d 0a 20 20 20         }]....   
8f30: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6a 6f 69       return [joi
8f40: 6e 42 75 69 6c 64 44 69 72 65 63 74 6f 72 79 20  nBuildDirectory 
8f50: 24 6e 61 74 69 76 65 20 5b 67 65 74 42 75 69 6c  $native [getBuil
8f60: 64 42 61 73 65 44 69 72 65 63 74 6f 72 79 5d 20  dBaseDirectory] 
8f70: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
8f80: 65 78 70 72 20 7b 24 6d 61 6e 61 67 65 64 4f 6e  expr {$managedOn
8f90: 6c 79 20 3f 20 5b 67 65 74 42 75 69 6c 64 59 65  ly ? [getBuildYe
8fa0: 61 72 5d 20 3a 20 5b 67 65 74 42 75 69 6c 64 4e  ar] : [getBuildN
8fb0: 61 74 69 76 65 59 65 61 72 5d 7d 5d 20 5c 0d 0a  ativeYear]}] \..
8fc0: 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74              [get
8fd0: 42 75 69 6c 64 50 6c 61 74 66 6f 72 6d 20 24 6e  BuildPlatform $n
8fe0: 61 74 69 76 65 5d 20 5b 61 70 70 65 6e 64 41 72  ative] [appendAr
8ff0: 67 73 20 5b 67 65 74 42 75 69 6c 64 43 6f 6e 66  gs [getBuildConf
9000: 69 67 75 72 61 74 69 6f 6e 5d 20 5c 0d 0a 20 20  iguration] \..  
9010: 20 20 20 20 20 20 20 20 20 20 5b 65 78 70 72 20            [expr 
9020: 7b 24 6d 61 6e 61 67 65 64 4f 6e 6c 79 20 3f 20  {$managedOnly ? 
9030: 5b 67 65 74 42 75 69 6c 64 43 6f 6e 66 69 67 75  [getBuildConfigu
9040: 72 61 74 69 6f 6e 53 75 66 66 69 78 5d 20 3a 20  rationSuffix] : 
9050: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
9060: 67 65 74 42 75 69 6c 64 4e 61 74 69 76 65 43 6f  getBuildNativeCo
9070: 6e 66 69 67 75 72 61 74 69 6f 6e 53 75 66 66 69  nfigurationSuffi
9080: 78 5d 7d 5d 5d 20 5b 65 78 70 72 20 7b 24 6d 61  x]}]] [expr {$ma
9090: 6e 61 67 65 64 4f 6e 6c 79 20 3f 20 5c 0d 0a 20  nagedOnly ? \.. 
90a0: 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 42             [getB
90b0: 75 69 6c 64 45 78 74 72 61 5d 20 3a 20 22 22 7d  uildExtra] : ""}
90c0: 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  ]]..      }..   
90d0: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
90e0: 67 65 74 52 65 6c 65 61 73 65 56 65 72 73 69 6f  getReleaseVersio
90f0: 6e 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  n {} {..      #.
9100: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46  .      # NOTE: F
9110: 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 72 65  igure out the re
9120: 6c 65 61 73 65 20 76 65 72 73 69 6f 6e 20 66 6f  lease version fo
9130: 72 20 75 73 65 20 77 69 74 68 20 74 68 65 20 62  r use with the b
9140: 75 69 6c 64 20 64 69 72 65 63 74 6f 72 79 0d 0a  uild directory..
9150: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 77 68        #       wh
9160: 65 6e 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20  en checking for 
9170: 61 76 61 69 6c 61 62 6c 65 20 72 65 6c 65 61 73  available releas
9180: 65 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  es...      #..  
9190: 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
91a0: 69 73 74 73 20 3a 3a 72 65 6c 65 61 73 65 5f 76  ists ::release_v
91b0: 65 72 73 69 6f 6e 5d 20 26 26 20 5c 0d 0a 20 20  ersion] && \..  
91c0: 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20          [string 
91d0: 6c 65 6e 67 74 68 20 24 3a 3a 72 65 6c 65 61 73  length $::releas
91e0: 65 5f 76 65 72 73 69 6f 6e 5d 20 3e 20 30 7d 20  e_version] > 0} 
91f0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
9200: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
9210: 45 3a 20 54 68 65 20 72 65 6c 65 61 73 65 20 76  E: The release v
9220: 65 72 73 69 6f 6e 20 68 61 73 20 62 65 65 6e 20  ersion has been 
9230: 6f 76 65 72 72 69 64 64 65 6e 3b 20 74 68 65 72  overridden; ther
9240: 65 66 6f 72 65 2c 20 75 73 65 20 69 74 0d 0a 20  efore, use it.. 
9250: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 76         #       v
9260: 65 72 62 61 74 69 6d 2e 0d 0a 20 20 20 20 20 20  erbatim...      
9270: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
9280: 75 72 6e 20 24 3a 3a 72 65 6c 65 61 73 65 5f 76  urn $::release_v
9290: 65 72 73 69 6f 6e 0d 0a 20 20 20 20 20 20 7d 20  ersion..      } 
92a0: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
92b0: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
92c0: 45 3a 20 4e 6f 20 72 65 6c 65 61 73 65 20 76 65  E: No release ve
92d0: 72 73 69 6f 6e 20 69 73 20 61 76 61 69 6c 61 62  rsion is availab
92e0: 6c 65 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 6d  le, return an em
92f0: 70 74 79 20 73 74 72 69 6e 67 2e 0d 0a 20 20 20  pty string...   
9300: 20 20 20 20 20 23 20 20 20 20 20 20 20 49 74 20       #       It 
9310: 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20  is important to 
9320: 72 65 74 75 72 6e 20 61 6e 20 65 6d 70 74 79 20  return an empty 
9330: 73 74 72 69 6e 67 20 68 65 72 65 20 62 65 63 61  string here beca
9340: 75 73 65 20 74 68 65 0d 0a 20 20 20 20 20 20 20  use the..       
9350: 20 23 20 20 20 20 20 20 20 72 65 73 75 6c 74 20   #       result 
9360: 6f 66 20 74 68 69 73 20 70 72 6f 63 65 64 75 72  of this procedur
9370: 65 20 6d 61 79 20 62 65 20 75 73 65 64 20 77 69  e may be used wi
9380: 74 68 20 5b 66 69 6c 65 20 6a 6f 69 6e 5d 2e 0d  th [file join]..
9390: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
93a0: 20 20 20 20 72 65 74 75 72 6e 20 22 22 0d 0a 20      return "".. 
93b0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
93c0: 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 42 75  ..    proc getBu
93d0: 69 6c 64 46 69 6c 65 4e 61 6d 65 20 7b 20 66 69  ildFileName { fi
93e0: 6c 65 4e 61 6d 65 20 6d 61 6e 61 67 65 64 4f 6e  leName managedOn
93f0: 6c 79 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d  ly {platform ""}
9400: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20   } {..      #.. 
9410: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 74       # NOTE: Ret
9420: 75 72 6e 73 20 74 68 65 20 73 70 65 63 69 66 69  urns the specifi
9430: 65 64 20 66 69 6c 65 20 6e 61 6d 65 20 61 73 20  ed file name as 
9440: 69 66 20 69 74 20 77 65 72 65 20 6c 6f 63 61 74  if it were locat
9450: 65 64 20 69 6e 20 74 68 65 0d 0a 20 20 20 20 20  ed in the..     
9460: 20 23 20 20 20 20 20 20 20 62 75 69 6c 64 20 64   #       build d
9470: 69 72 65 63 74 6f 72 79 2c 20 64 69 73 63 61 72  irectory, discar
9480: 64 69 6e 67 20 61 6e 79 20 64 69 72 65 63 74 6f  ding any directo
9490: 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 70  ry information p
94a0: 72 65 73 65 6e 74 0d 0a 20 20 20 20 20 20 23 20  resent..      # 
94b0: 20 20 20 20 20 20 69 6e 20 74 68 65 20 66 69 6c        in the fil
94c0: 65 20 6e 61 6d 65 20 61 73 20 70 72 6f 76 69 64  e name as provid
94d0: 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72  ed by our caller
94e0: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
94f0: 20 20 73 65 74 20 72 65 73 75 6c 74 20 5b 66 69    set result [fi
9500: 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5c 0d  le nativename \.
9510: 0a 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65  .          [file
9520: 20 6a 6f 69 6e 20 5b 67 65 74 42 75 69 6c 64 44   join [getBuildD
9530: 69 72 65 63 74 6f 72 79 20 24 6d 61 6e 61 67 65  irectory $manage
9540: 64 4f 6e 6c 79 5d 20 24 70 6c 61 74 66 6f 72 6d  dOnly] $platform
9550: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 66   \..          [f
9560: 69 6c 65 20 74 61 69 6c 20 24 66 69 6c 65 4e 61  ile tail $fileNa
9570: 6d 65 5d 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 23  me]]]....      #
9580: 0d 0a 20 20 20 20 20 20 23 20 48 41 43 4b 3a 20  ..      # HACK: 
9590: 57 68 65 6e 20 72 75 6e 6e 69 6e 67 20 6f 6e 20  When running on 
95a0: 57 6f 57 36 34 2c 20 61 73 73 75 6d 65 20 74 68  WoW64, assume th
95b0: 65 20 74 65 73 74 20 65 78 65 63 75 74 61 62 6c  e test executabl
95c0: 65 73 20 61 72 65 20 70 72 65 73 65 6e 74 0d 0a  es are present..
95d0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 77 69        #       wi
95e0: 74 68 20 74 68 65 20 22 33 32 22 20 73 75 66 66  th the "32" suff
95f0: 69 78 20 6f 6e 20 74 68 65 6d 2e 0d 0a 20 20 20  ix on them...   
9600: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
9610: 5b 69 73 52 75 6e 6e 69 6e 67 57 6f 57 36 34 5d  [isRunningWoW64]
9620: 20 26 26 20 5b 66 69 6c 65 20 65 78 74 65 6e 73   && [file extens
9630: 69 6f 6e 20 24 72 65 73 75 6c 74 5d 20 65 71 20  ion $result] eq 
9640: 22 2e 65 78 65 22 7d 20 74 68 65 6e 20 7b 0d 0a  ".exe"} then {..
9650: 20 20 20 20 20 20 20 20 73 65 74 20 72 65 73 75          set resu
9660: 6c 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5b  lt [appendArgs [
9670: 66 69 6c 65 20 72 6f 6f 74 6e 61 6d 65 20 24 72  file rootname $r
9680: 65 73 75 6c 74 5d 20 33 32 2e 65 78 65 5d 0d 0a  esult] 32.exe]..
9690: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
96a0: 20 72 65 74 75 72 6e 20 24 72 65 73 75 6c 74 0d   return $result.
96b0: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
96c0: 72 6f 63 20 67 65 74 45 78 74 65 72 6e 61 6c 44  roc getExternalD
96d0: 69 72 65 63 74 6f 72 79 20 7b 7d 20 7b 0d 0a 20  irectory {} {.. 
96e0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
96f0: 4e 4f 54 45 3a 20 54 68 69 73 20 70 72 6f 63 65  NOTE: This proce
9700: 64 75 72 65 20 72 65 74 75 72 6e 73 20 74 68 65  dure returns the
9710: 20 64 69 72 65 63 74 6f 72 79 20 77 68 65 72 65   directory where
9720: 20 74 68 65 20 65 78 74 65 72 6e 61 6c 20 62 69   the external bi
9730: 6e 61 72 79 0d 0a 20 20 20 20 20 20 23 20 20 20  nary..      #   
9740: 20 20 20 20 66 69 6c 65 73 20 61 72 65 20 6c 6f      files are lo
9750: 63 61 74 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d  cated...      #.
9760: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 66  .      return [f
9770: 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5c  ile nativename \
9780: 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c  ..          [fil
9790: 65 20 64 69 72 6e 61 6d 65 20 5b 66 69 6c 65 20  e dirname [file 
97a0: 64 69 72 6e 61 6d 65 20 5b 66 69 6c 65 20 64 69  dirname [file di
97b0: 72 6e 61 6d 65 20 5b 69 6e 66 6f 20 62 69 6e 61  rname [info bina
97c0: 72 79 5d 5d 5d 5d 5d 0d 0a 20 20 20 20 7d 0d 0a  ry]]]]]..    }..
97d0: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 42  ...    proc getB
97e0: 69 6e 61 72 79 44 69 72 65 63 74 6f 72 79 20 7b  inaryDirectory {
97f0: 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
9800: 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73      # NOTE: This
9810: 20 70 72 6f 63 65 64 75 72 65 20 72 65 74 75 72   procedure retur
9820: 6e 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  ns the directory
9830: 20 77 68 65 72 65 20 74 68 65 20 74 65 73 74 20   where the test 
9840: 61 70 70 6c 69 63 61 74 69 6f 6e 0d 0a 20 20 20  application..   
9850: 20 20 20 23 20 20 20 20 20 20 20 69 74 73 65 6c     #       itsel
9860: 66 20 28 69 2e 65 2e 20 74 68 65 20 45 61 67 6c  f (i.e. the Eagl
9870: 65 20 73 68 65 6c 6c 29 20 69 73 20 6c 6f 63 61  e shell) is loca
9880: 74 65 64 2e 20 20 54 68 69 73 20 77 69 6c 6c 20  ted.  This will 
9890: 62 65 20 75 73 65 64 20 61 73 0d 0a 20 20 20 20  be used as..    
98a0: 20 20 23 20 20 20 20 20 20 20 74 68 65 20 64 65    #       the de
98b0: 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72 20 74 68  stination for th
98c0: 65 20 63 6f 70 69 65 64 20 53 79 73 74 65 6d 2e  e copied System.
98d0: 44 61 74 61 2e 53 51 4c 69 74 65 20 6e 61 74 69  Data.SQLite nati
98e0: 76 65 20 61 6e 64 0d 0a 20 20 20 20 20 20 23 20  ve and..      # 
98f0: 20 20 20 20 20 20 6d 61 6e 61 67 65 64 20 61 73        managed as
9900: 73 65 6d 62 6c 69 65 73 20 28 69 2e 65 2e 20 62  semblies (i.e. b
9910: 65 63 61 75 73 65 20 74 68 69 73 20 69 73 20 6f  ecause this is o
9920: 6e 65 20 6f 66 20 74 68 65 20 66 65 77 20 70 6c  ne of the few pl
9930: 61 63 65 73 0d 0a 20 20 20 20 20 20 23 20 20 20  aces..      #   
9940: 20 20 20 20 77 68 65 72 65 20 74 68 65 20 43 4c      where the CL
9950: 52 20 77 69 6c 6c 20 61 63 74 75 61 6c 6c 79 20  R will actually 
9960: 66 69 6e 64 20 61 6e 64 20 6c 6f 61 64 20 74 68  find and load th
9970: 65 6d 20 70 72 6f 70 65 72 6c 79 29 2e 0d 0a 20  em properly)... 
9980: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
9990: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
99a0: 3a 62 69 6e 61 72 79 5f 64 69 72 65 63 74 6f 72  :binary_director
99b0: 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  y] && \..       
99c0: 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74     [string lengt
99d0: 68 20 24 3a 3a 62 69 6e 61 72 79 5f 64 69 72 65  h $::binary_dire
99e0: 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e  ctory] > 0} then
99f0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
9a00: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54         # NOTE: T
9a10: 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74  he location of t
9a20: 68 65 20 62 69 6e 61 72 79 20 64 69 72 65 63 74  he binary direct
9a30: 6f 72 79 20 68 61 73 20 62 65 65 6e 20 6f 76 65  ory has been ove
9a40: 72 72 69 64 64 65 6e 3b 0d 0a 20 20 20 20 20 20  rridden;..      
9a50: 20 20 23 20 20 20 20 20 20 20 74 68 65 72 65 66    #       theref
9a60: 6f 72 65 2c 20 75 73 65 20 69 74 20 76 65 72 62  ore, use it verb
9a70: 61 74 69 6d 2e 0d 0a 20 20 20 20 20 20 20 20 23  atim...        #
9a80: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
9a90: 20 24 3a 3a 62 69 6e 61 72 79 5f 64 69 72 65 63   $::binary_direc
9aa0: 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20 65 6c  tory..      } el
9ab0: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65  se {..        re
9ac0: 74 75 72 6e 20 5b 69 6e 66 6f 20 62 69 6e 61 72  turn [info binar
9ad0: 79 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  y]..      }..   
9ae0: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
9af0: 67 65 74 45 78 74 65 72 6e 61 6c 46 69 6c 65 4e  getExternalFileN
9b00: 61 6d 65 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7d  ame { fileName }
9b10: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
9b20: 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 74 75 72     # NOTE: Retur
9b30: 6e 73 20 74 68 65 20 73 70 65 63 69 66 69 65 64  ns the specified
9b40: 20 66 69 6c 65 20 6e 61 6d 65 20 61 73 20 69 66   file name as if
9b50: 20 69 74 20 77 65 72 65 20 6c 6f 63 61 74 65 64   it were located
9b60: 20 69 6e 20 74 68 65 0d 0a 20 20 20 20 20 20 23   in the..      #
9b70: 20 20 20 20 20 20 20 64 69 72 65 63 74 6f 72 79         directory
9b80: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
9b90: 65 78 74 65 72 6e 61 6c 20 62 69 6e 61 72 69 65  external binarie
9ba0: 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  s...      #..   
9bb0: 20 20 20 72 65 74 75 72 6e 20 5b 66 69 6c 65 20     return [file 
9bc0: 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65  nativename [file
9bd0: 20 6a 6f 69 6e 20 5b 67 65 74 45 78 74 65 72 6e   join [getExtern
9be0: 61 6c 44 69 72 65 63 74 6f 72 79 5d 20 24 66 69  alDirectory] $fi
9bf0: 6c 65 4e 61 6d 65 5d 5d 0d 0a 20 20 20 20 7d 0d  leName]]..    }.
9c00: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74  ....    proc get
9c10: 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 7b  BinaryFileName {
9c20: 20 66 69 6c 65 4e 61 6d 65 20 7b 70 6c 61 74 66   fileName {platf
9c30: 6f 72 6d 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20  orm ""} } {..   
9c40: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
9c50: 54 45 3a 20 52 65 74 75 72 6e 73 20 74 68 65 20  TE: Returns the 
9c60: 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 20 6e  specified file n
9c70: 61 6d 65 20 61 73 20 69 66 20 69 74 20 77 65 72  ame as if it wer
9c80: 65 20 6c 6f 63 61 74 65 64 20 69 6e 20 74 68 65  e located in the
9c90: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
9ca0: 62 69 6e 61 72 79 20 64 69 72 65 63 74 6f 72 79  binary directory
9cb0: 2c 20 64 69 73 63 61 72 64 69 6e 67 20 61 6e 79  , discarding any
9cc0: 20 64 69 72 65 63 74 6f 72 79 20 69 6e 66 6f 72   directory infor
9cd0: 6d 61 74 69 6f 6e 20 70 72 65 73 65 6e 74 0d 0a  mation present..
9ce0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69 6e        #       in
9cf0: 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 20 61   the file name a
9d00: 73 20 70 72 6f 76 69 64 65 64 20 62 79 20 6f 75  s provided by ou
9d10: 72 20 63 61 6c 6c 65 72 2e 0d 0a 20 20 20 20 20  r caller...     
9d20: 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e   #..      return
9d30: 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d   [file nativenam
9d40: 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b  e \..          [
9d50: 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 42 69  file join [getBi
9d60: 6e 61 72 79 44 69 72 65 63 74 6f 72 79 5d 20 24  naryDirectory] $
9d70: 70 6c 61 74 66 6f 72 6d 20 5b 66 69 6c 65 20 74  platform [file t
9d80: 61 69 6c 20 24 66 69 6c 65 4e 61 6d 65 5d 5d 5d  ail $fileName]]]
9d90: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
9da0: 70 72 6f 63 20 67 65 74 43 6f 72 65 42 69 6e 61  proc getCoreBina
9db0: 72 79 46 69 6c 65 4e 61 6d 65 20 7b 20 7b 70 6c  ryFileName { {pl
9dc0: 61 74 66 6f 72 6d 20 22 22 7d 20 7b 73 74 61 6e  atform ""} {stan
9dd0: 64 61 72 64 20 22 22 7d 20 7d 20 7b 0d 0a 20 20  dard ""} } {..  
9de0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
9df0: 4f 54 45 3a 20 52 65 74 75 72 6e 73 20 74 68 65  OTE: Returns the
9e00: 20 66 75 6c 6c 20 70 61 74 68 20 66 6f 72 20 74   full path for t
9e10: 68 65 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69  he file containi
9e20: 6e 67 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f  ng the SQLite co
9e30: 72 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  re..      #     
9e40: 20 20 6e 61 74 69 76 65 20 6c 69 62 72 61 72 79    native library
9e50: 20 63 6f 64 65 20 66 6f 72 20 74 68 69 73 20 70   code for this p
9e60: 6c 61 74 66 6f 72 6d 2e 20 20 46 69 72 73 74 2c  latform.  First,
9e70: 20 63 68 65 63 6b 20 61 6e 64 20 73 65 65 20 69   check and see i
9e80: 66 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  f..      #      
9e90: 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65   the SQLite core
9ea0: 20 6e 61 74 69 76 65 20 6c 69 62 72 61 72 79 20   native library 
9eb0: 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
9ec0: 20 6c 6f 61 64 65 64 2e 20 20 4e 65 78 74 2c 0d   loaded.  Next,.
9ed0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 66  .      #       f
9ee0: 61 6c 6c 62 61 63 6b 20 74 6f 20 77 68 61 74 20  allback to what 
9ef0: 74 68 65 20 66 75 6c 6c 20 70 61 74 68 20 73 68  the full path sh
9f00: 6f 75 6c 64 20 62 65 2c 20 62 61 73 65 64 20 6f  ould be, based o
9f10: 6e 20 77 68 65 74 68 65 72 20 74 68 65 0d 0a 20  n whether the.. 
9f20: 20 20 20 20 20 23 20 20 20 20 20 20 20 6d 69 78       #       mix
9f30: 65 64 2d 6d 6f 64 65 20 61 73 73 65 6d 62 6c 79  ed-mode assembly
9f40: 20 69 73 20 62 65 69 6e 67 20 75 73 65 64 20 61   is being used a
9f50: 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  nd the name of t
9f60: 68 65 20 63 75 72 72 65 6e 74 0d 0a 20 20 20 20  he current..    
9f70: 20 20 23 20 20 20 20 20 20 20 70 6c 61 74 66 6f    #       platfo
9f80: 72 6d 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  rm...      #..  
9f90: 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
9fa0: 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74  ..        object
9fb0: 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b   invoke -flags +
9fc0: 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20  NonPublic \..   
9fd0: 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e           System.
9fe0: 44 61 74 61 2e 53 51 4c 69 74 65 2e 55 6e 73 61  Data.SQLite.Unsa
9ff0: 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 20  feNativeMethods 
a000: 5f 53 51 4c 69 74 65 4e 61 74 69 76 65 4d 6f 64  _SQLiteNativeMod
a010: 75 6c 65 46 69 6c 65 4e 61 6d 65 0d 0a 20 20 20  uleFileName..   
a020: 20 20 20 7d 20 66 69 6c 65 4e 61 6d 65 5d 20 3d     } fileName] =
a030: 3d 20 30 20 26 26 20 5b 73 74 72 69 6e 67 20 6c  = 0 && [string l
a040: 65 6e 67 74 68 20 24 66 69 6c 65 4e 61 6d 65 5d  ength $fileName]
a050: 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
a060: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
a070: 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 53 51 4c   # NOTE: The SQL
a080: 69 74 65 20 63 6f 72 65 20 6e 61 74 69 76 65 20  ite core native 
a090: 6c 69 62 72 61 72 79 20 68 61 73 20 61 6c 72 65  library has alre
a0a0: 61 64 79 20 62 65 65 6e 20 6c 6f 61 64 65 64 20  ady been loaded 
a0b0: 76 69 61 0d 0a 20 20 20 20 20 20 20 20 23 20 20  via..        #  
a0c0: 20 20 20 20 20 74 68 65 20 6e 61 74 69 76 65 20       the native 
a0d0: 6c 69 62 72 61 72 79 20 70 72 65 2d 6c 6f 61 64  library pre-load
a0e0: 65 72 2e 20 20 52 65 74 75 72 6e 20 74 68 61 74  er.  Return that
a0f0: 20 66 69 6c 65 20 6e 61 6d 65 20 6e 6f 77 2e 0d   file name now..
a100: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
a110: 20 20 20 20 72 65 74 75 72 6e 20 24 66 69 6c 65      return $file
a120: 4e 61 6d 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  Name..      }...
a130: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
a140: 23 20 4e 4f 54 45 3a 20 49 66 20 74 68 65 20 22  # NOTE: If the "
a150: 6e 61 74 69 76 65 22 20 72 75 6e 74 69 6d 65 20  native" runtime 
a160: 6f 70 74 69 6f 6e 20 68 61 73 20 62 65 65 6e 20  option has been 
a170: 73 65 74 2c 20 61 6c 77 61 79 73 20 72 65 74 75  set, always retu
a180: 72 6e 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20  rn the..      # 
a190: 20 20 20 20 20 20 66 69 6c 65 20 6e 61 6d 65 20        file name 
a1a0: 66 6f 72 20 74 68 65 20 6d 69 78 65 64 2d 6d 6f  for the mixed-mo
a1b0: 64 65 20 61 73 73 65 6d 62 6c 79 2e 0d 0a 20 20  de assembly...  
a1c0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
a1d0: 7b 5b 68 61 73 52 75 6e 74 69 6d 65 4f 70 74 69  {[hasRuntimeOpti
a1e0: 6f 6e 20 6e 61 74 69 76 65 5d 7d 20 74 68 65 6e  on native]} then
a1f0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
a200: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52         # NOTE: R
a210: 65 74 75 72 6e 20 74 68 65 20 6d 69 78 65 64 2d  eturn the mixed-
a220: 6d 6f 64 65 20 61 73 73 65 6d 62 6c 79 20 66 69  mode assembly fi
a230: 6c 65 20 6e 61 6d 65 2e 0d 0a 20 20 20 20 20 20  le name...      
a240: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
a250: 75 72 6e 20 5b 66 69 6c 65 20 6e 61 74 69 76 65  urn [file native
a260: 6e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  name \..        
a270: 20 20 20 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b      [file join [
a280: 67 65 74 42 69 6e 61 72 79 44 69 72 65 63 74 6f  getBinaryDirecto
a290: 72 79 5d 20 24 70 6c 61 74 66 6f 72 6d 20 53 79  ry] $platform Sy
a2a0: 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
a2b0: 2e 64 6c 6c 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d  .dll]]..      }.
a2c0: 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
a2d0: 20 20 23 20 4e 4f 54 45 3a 20 41 72 65 20 77 65    # NOTE: Are we
a2e0: 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 61   attempting to a
a2f0: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 74  utomatically det
a300: 65 63 74 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ect whether or n
a310: 6f 74 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20  ot the..      # 
a320: 20 20 20 20 20 20 69 6e 74 65 72 6f 70 20 61 73        interop as
a330: 73 65 6d 62 6c 79 20 73 68 6f 75 6c 64 20 62 65  sembly should be
a340: 20 75 73 65 64 3f 0d 0a 20 20 20 20 20 20 23 0d   used?..      #.
a350: 0a 20 20 20 20 20 20 73 65 74 20 61 75 74 6f 6d  .      set autom
a360: 61 74 69 63 20 5b 65 78 70 72 20 7b 5b 73 74 72  atic [expr {[str
a370: 69 6e 67 20 6c 65 6e 67 74 68 20 24 73 74 61 6e  ing length $stan
a380: 64 61 72 64 5d 20 3d 3d 20 30 7d 5d 0d 0a 0d 0a  dard] == 0}]....
a390: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
a3a0: 20 4e 4f 54 45 3a 20 46 69 72 73 74 2c 20 69 6e   NOTE: First, in
a3b0: 20 65 69 74 68 65 72 20 22 61 75 74 6f 6d 61 74   either "automat
a3c0: 69 63 22 20 6f 72 20 22 6e 6f 6e 2d 73 74 61 6e  ic" or "non-stan
a3d0: 64 61 72 64 22 20 6d 6f 64 65 73 2c 20 61 74 74  dard" modes, att
a3e0: 65 6d 70 74 0d 0a 20 20 20 20 20 20 23 20 20 20  empt..      #   
a3f0: 20 20 20 20 74 6f 20 66 69 6e 64 20 74 68 65 20      to find the 
a400: 6e 61 74 69 76 65 2d 6f 6e 6c 79 20 69 6e 74 65  native-only inte
a410: 72 6f 70 20 61 73 73 65 6d 62 6c 79 2e 0d 0a 20  rop assembly... 
a420: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
a430: 20 7b 24 61 75 74 6f 6d 61 74 69 63 20 7c 7c 20   {$automatic || 
a440: 21 24 73 74 61 6e 64 61 72 64 7d 20 74 68 65 6e  !$standard} then
a450: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
a460: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41         # NOTE: A
a470: 74 74 65 6d 70 74 20 74 6f 20 64 65 74 65 72 6d  ttempt to determ
a480: 69 6e 65 20 74 68 65 20 6e 61 74 69 76 65 2d 6f  ine the native-o
a490: 6e 6c 79 20 69 6e 74 65 72 6f 70 20 61 73 73 65  nly interop asse
a4a0: 6d 62 6c 79 20 66 69 6c 65 0d 0a 20 20 20 20 20  mbly file..     
a4b0: 20 20 20 23 20 20 20 20 20 20 20 6e 61 6d 65 20     #       name 
a4c0: 66 6f 72 20 74 68 69 73 20 70 6c 61 74 66 6f 72  for this platfor
a4d0: 6d 20 61 6e 64 20 74 68 65 6e 20 72 65 74 75 72  m and then retur
a4e0: 6e 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23  n it...        #
a4f0: 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63  ..        foreac
a500: 68 20 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 5b  h fileNameOnly [
a510: 67 65 74 49 6e 74 65 72 6f 70 41 73 73 65 6d 62  getInteropAssemb
a520: 6c 79 46 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79 5d  lyFileNamesOnly]
a530: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   {..          se
a540: 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65  t fileName [file
a550: 20 6e 61 74 69 76 65 6e 61 6d 65 20 5c 0d 0a 20   nativename \.. 
a560: 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69               [fi
a570: 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 42 69 6e 61  le join [getBina
a580: 72 79 44 69 72 65 63 74 6f 72 79 5d 20 24 70 6c  ryDirectory] $pl
a590: 61 74 66 6f 72 6d 20 24 66 69 6c 65 4e 61 6d 65  atform $fileName
a5a0: 4f 6e 6c 79 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20  Only]]....      
a5b0: 20 20 20 20 69 66 20 7b 5b 66 69 6c 65 20 65 78      if {[file ex
a5c0: 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d  ists $fileName]}
a5d0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
a5e0: 20 20 20 20 20 72 65 74 75 72 6e 20 24 66 69 6c       return $fil
a5f0: 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 20  eName..         
a600: 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20   }..        }.. 
a610: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
a620: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
a630: 20 54 68 65 6e 2c 20 69 6e 20 65 69 74 68 65 72   Then, in either
a640: 20 22 61 75 74 6f 6d 61 74 69 63 22 20 6f 72 20   "automatic" or 
a650: 22 73 74 61 6e 64 61 72 64 22 20 6d 6f 64 65 73  "standard" modes
a660: 2c 20 61 74 74 65 6d 70 74 20 74 6f 0d 0a 20 20  , attempt to..  
a670: 20 20 20 20 23 20 20 20 20 20 20 20 66 69 6e 64      #       find
a680: 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 53 51   the standard SQ
a690: 4c 69 74 65 20 6c 69 62 72 61 72 79 2e 0d 0a 20  Lite library... 
a6a0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
a6b0: 20 7b 24 61 75 74 6f 6d 61 74 69 63 20 7c 7c 20   {$automatic || 
a6c0: 24 73 74 61 6e 64 61 72 64 7d 20 74 68 65 6e 20  $standard} then 
a6d0: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
a6e0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74        # NOTE: At
a6f0: 74 65 6d 70 74 20 74 6f 20 64 65 74 65 72 6d 69  tempt to determi
a700: 6e 65 20 74 68 65 20 6e 61 74 69 76 65 2d 6f 6e  ne the native-on
a710: 6c 79 20 73 74 61 6e 64 61 72 64 20 53 51 4c 69  ly standard SQLi
a720: 74 65 20 6c 69 62 72 61 72 79 0d 0a 20 20 20 20  te library..    
a730: 20 20 20 20 23 20 20 20 20 20 20 20 66 69 6c 65      #       file
a740: 20 6e 61 6d 65 20 66 6f 72 20 74 68 69 73 20 70   name for this p
a750: 6c 61 74 66 6f 72 6d 20 61 6e 64 20 74 68 65 6e  latform and then
a760: 20 72 65 74 75 72 6e 20 69 74 2e 0d 0a 20 20 20   return it...   
a770: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
a780: 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65  foreach fileName
a790: 4f 6e 6c 79 20 5b 67 65 74 4e 61 74 69 76 65 4c  Only [getNativeL
a7a0: 69 62 72 61 72 79 46 69 6c 65 4e 61 6d 65 73 4f  ibraryFileNamesO
a7b0: 6e 6c 79 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20  nly] {..        
a7c0: 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b    set fileName [
a7d0: 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20  file nativename 
a7e0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
a7f0: 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74   [file join [get
a800: 42 69 6e 61 72 79 44 69 72 65 63 74 6f 72 79 5d  BinaryDirectory]
a810: 20 24 70 6c 61 74 66 6f 72 6d 20 24 66 69 6c 65   $platform $file
a820: 4e 61 6d 65 4f 6e 6c 79 5d 5d 0d 0a 0d 0a 20 20  NameOnly]]....  
a830: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 66 69 6c          if {[fil
a840: 65 20 65 78 69 73 74 73 20 24 66 69 6c 65 4e 61  e exists $fileNa
a850: 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  me]} then {..   
a860: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
a870: 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20  $fileName..     
a880: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
a890: 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  }..      }....  
a8a0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
a8b0: 4f 54 45 3a 20 57 61 73 20 74 68 65 20 6d 61 6e  OTE: Was the man
a8c0: 61 67 65 64 20 61 73 73 65 6d 62 6c 79 20 63 6f  aged assembly co
a8d0: 6d 70 69 6c 65 64 20 65 78 70 65 63 74 69 6e 67  mpiled expecting
a8e0: 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 74 68   to deal with th
a8f0: 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
a900: 20 73 74 61 6e 64 61 72 64 20 63 6f 72 65 20 6c   standard core l
a910: 69 62 72 61 72 79 3f 0d 0a 20 20 20 20 20 20 23  ibrary?..      #
a920: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76  ..      if {[hav
a930: 65 53 51 4c 69 74 65 44 65 66 69 6e 65 43 6f 6e  eSQLiteDefineCon
a940: 73 74 61 6e 74 20 53 51 4c 49 54 45 5f 53 54 41  stant SQLITE_STA
a950: 4e 44 41 52 44 5d 7d 20 74 68 65 6e 20 7b 0d 0a  NDARD]} then {..
a960: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
a970: 20 20 20 23 20 4e 4f 54 45 3a 20 46 61 6c 6c 62     # NOTE: Fallb
a980: 61 63 6b 20 74 6f 20 72 65 74 75 72 6e 69 6e 67  ack to returning
a990: 20 74 68 65 20 6e 61 74 69 76 65 2d 6f 6e 6c 79   the native-only
a9a0: 20 73 74 61 6e 64 61 72 64 20 53 51 4c 69 74 65   standard SQLite
a9b0: 20 6c 69 62 72 61 72 79 0d 0a 20 20 20 20 20 20   library..      
a9c0: 20 20 23 20 20 20 20 20 20 20 66 69 6c 65 20 6e    #       file n
a9d0: 61 6d 65 20 66 6f 72 20 74 68 65 20 70 6c 61 74  ame for the plat
a9e0: 66 6f 72 6d 2e 0d 0a 20 20 20 20 20 20 20 20 23  form...        #
a9f0: 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 66 69  ..        set fi
aa00: 6c 65 4e 61 6d 65 73 4f 6e 6c 79 20 5b 67 65 74  leNamesOnly [get
aa10: 4e 61 74 69 76 65 4c 69 62 72 61 72 79 46 69 6c  NativeLibraryFil
aa20: 65 4e 61 6d 65 73 4f 6e 6c 79 5d 0d 0a 0d 0a 20  eNamesOnly].... 
aa30: 20 20 20 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e         if {[llen
aa40: 67 74 68 20 24 66 69 6c 65 4e 61 6d 65 73 4f 6e  gth $fileNamesOn
aa50: 6c 79 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  ly] == 0} then {
aa60: 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ..          retu
aa70: 72 6e 20 22 22 0d 0a 20 20 20 20 20 20 20 20 7d  rn ""..        }
aa80: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75  ....        retu
aa90: 72 6e 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e  rn [file nativen
aaa0: 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c  ame [file join \
aab0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 67  ..            [g
aac0: 65 74 42 69 6e 61 72 79 44 69 72 65 63 74 6f 72  etBinaryDirector
aad0: 79 5d 20 24 70 6c 61 74 66 6f 72 6d 20 5b 6c 69  y] $platform [li
aae0: 6e 64 65 78 20 24 66 69 6c 65 4e 61 6d 65 73 4f  ndex $fileNamesO
aaf0: 6e 6c 79 20 30 5d 5d 5d 0d 0a 20 20 20 20 20 20  nly 0]]]..      
ab00: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
ab10: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
ab20: 4f 54 45 3a 20 46 61 6c 6c 62 61 63 6b 20 74 6f  OTE: Fallback to
ab30: 20 72 65 74 75 72 6e 69 6e 67 20 74 68 65 20 6e   returning the n
ab40: 61 74 69 76 65 2d 6f 6e 6c 79 20 69 6e 74 65 72  ative-only inter
ab50: 6f 70 20 61 73 73 65 6d 62 6c 79 20 66 69 6c 65  op assembly file
ab60: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
ab70: 20 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 70    name for the p
ab80: 6c 61 74 66 6f 72 6d 2e 0d 0a 20 20 20 20 20 20  latform...      
ab90: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74    #..        set
aba0: 20 66 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79 20 5b   fileNamesOnly [
abb0: 67 65 74 49 6e 74 65 72 6f 70 41 73 73 65 6d 62  getInteropAssemb
abc0: 6c 79 46 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79 5d  lyFileNamesOnly]
abd0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b  ....        if {
abe0: 5b 6c 6c 65 6e 67 74 68 20 24 66 69 6c 65 4e 61  [llength $fileNa
abf0: 6d 65 73 4f 6e 6c 79 5d 20 3d 3d 20 30 7d 20 74  mesOnly] == 0} t
ac00: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
ac10: 20 72 65 74 75 72 6e 20 22 22 0d 0a 20 20 20 20   return ""..    
ac20: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
ac30: 20 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 6e 61   return [file na
ac40: 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a  tivename [file j
ac50: 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  oin \..         
ac60: 20 20 20 5b 67 65 74 42 69 6e 61 72 79 44 69 72     [getBinaryDir
ac70: 65 63 74 6f 72 79 5d 20 24 70 6c 61 74 66 6f 72  ectory] $platfor
ac80: 6d 20 5b 6c 69 6e 64 65 78 20 24 66 69 6c 65 4e  m [lindex $fileN
ac90: 61 6d 65 73 4f 6e 6c 79 20 30 5d 5d 5d 0d 0a 20  amesOnly 0]]].. 
aca0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
acb0: 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 43 6f  ..    proc getCo
acc0: 6d 6d 6f 6e 44 69 72 65 63 74 6f 72 79 20 7b 7d  mmonDirectory {}
acd0: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
ace0: 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20     # NOTE: This 
acf0: 70 72 6f 63 65 64 75 72 65 20 72 65 74 75 72 6e  procedure return
ad00: 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  s the directory 
ad10: 77 68 65 72 65 20 74 68 65 20 74 65 73 74 20 73  where the test s
ad20: 63 72 69 70 74 73 0d 0a 20 20 20 20 20 20 23 20  cripts..      # 
ad30: 20 20 20 20 20 20 73 68 6f 75 6c 64 20 62 65 20        should be 
ad40: 6c 6f 63 61 74 65 64 2e 20 20 42 79 20 64 65 66  located.  By def
ad50: 61 75 6c 74 2c 20 74 68 69 73 20 6a 75 73 74 20  ault, this just 
ad60: 72 65 74 75 72 6e 73 20 74 68 65 20 45 61 67 6c  returns the Eagl
ad70: 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
ad80: 20 62 69 6e 61 72 79 20 64 69 72 65 63 74 6f 72   binary director
ad90: 79 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  y...      #..   
ada0: 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69     if {[info exi
adb0: 73 74 73 20 3a 3a 63 6f 6d 6d 6f 6e 5f 64 69 72  sts ::common_dir
adc0: 65 63 74 6f 72 79 5d 20 26 26 20 5c 0d 0a 20 20  ectory] && \..  
add0: 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20          [string 
ade0: 6c 65 6e 67 74 68 20 24 3a 3a 63 6f 6d 6d 6f 6e  length $::common
adf0: 5f 64 69 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d  _directory] > 0}
ae00: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
ae10: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
ae20: 54 45 3a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e  TE: The location
ae30: 20 6f 66 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 64   of the common d
ae40: 69 72 65 63 74 6f 72 79 20 68 61 73 20 62 65 65  irectory has bee
ae50: 6e 20 73 65 74 3b 0d 0a 20 20 20 20 20 20 20 20  n set;..        
ae60: 23 20 20 20 20 20 20 20 74 68 65 72 65 66 6f 72  #       therefor
ae70: 65 2c 20 75 73 65 20 69 74 2e 0d 0a 20 20 20 20  e, use it...    
ae80: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
ae90: 65 74 75 72 6e 20 24 3a 3a 63 6f 6d 6d 6f 6e 5f  eturn $::common_
aea0: 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20  directory..     
aeb0: 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f   } elseif {[info
aec0: 20 65 78 69 73 74 73 20 3a 3a 76 65 6e 64 6f 72   exists ::vendor
aed0: 5f 64 69 72 65 63 74 6f 72 79 5d 20 26 26 20 5c  _directory] && \
aee0: 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72  ..          [str
aef0: 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 76 65  ing length $::ve
af00: 6e 64 6f 72 5f 64 69 72 65 63 74 6f 72 79 5d 20  ndor_directory] 
af10: 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
af20: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
af30: 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c 6f 63 61  # NOTE: The loca
af40: 74 69 6f 6e 20 6f 66 20 74 68 65 20 76 65 6e 64  tion of the vend
af50: 6f 72 20 64 69 72 65 63 74 6f 72 79 20 68 61 73  or directory has
af60: 20 62 65 65 6e 20 73 65 74 3b 0d 0a 20 20 20 20   been set;..    
af70: 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65 72      #       ther
af80: 65 66 6f 72 65 2c 20 75 73 65 20 69 74 2e 0d 0a  efore, use it...
af90: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
afa0: 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 76 65 6e     return $::ven
afb0: 64 6f 72 5f 64 69 72 65 63 74 6f 72 79 0d 0a 20  dor_directory.. 
afc0: 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b       } elseif {[
afd0: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 63  info exists ::tc
afe0: 6c 5f 6c 69 62 72 61 72 79 5d 20 26 26 20 5c 0d  l_library] && \.
aff0: 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69  .          [stri
b000: 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 74 63 6c  ng length $::tcl
b010: 5f 6c 69 62 72 61 72 79 5d 20 3e 20 30 20 26 26  _library] > 0 &&
b020: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 66   \..          [f
b030: 69 6c 65 20 69 73 64 69 72 65 63 74 6f 72 79 20  ile isdirectory 
b040: 24 3a 3a 74 63 6c 5f 6c 69 62 72 61 72 79 5d 7d  $::tcl_library]}
b050: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
b060: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
b070: 54 45 3a 20 54 68 65 20 76 61 72 69 61 62 6c 65  TE: The variable
b080: 20 77 69 74 68 20 74 68 65 20 6c 6f 63 61 74 69   with the locati
b090: 6f 6e 20 6f 66 20 74 68 65 20 73 63 72 69 70 74  on of the script
b0a0: 20 6c 69 62 72 61 72 79 20 69 73 0d 0a 20 20 20   library is..   
b0b0: 20 20 20 20 20 23 20 20 20 20 20 20 20 73 65 74       #       set
b0c0: 20 61 6e 64 20 61 70 70 65 61 72 73 20 74 6f 20   and appears to 
b0d0: 62 65 20 61 20 72 65 61 6c 20 64 69 72 65 63 74  be a real direct
b0e0: 6f 72 79 20 28 69 2e 65 2e 20 6e 6f 74 20 65 6d  ory (i.e. not em
b0f0: 62 65 64 64 65 64 0d 0a 20 20 20 20 20 20 20 20  bedded..        
b100: 23 20 20 20 20 20 20 20 77 69 74 68 69 6e 20 61  #       within a
b110: 20 66 69 6c 65 29 3b 20 74 68 65 72 65 66 6f 72   file); therefor
b120: 65 2c 20 75 73 65 20 69 74 2e 0d 0a 20 20 20 20  e, use it...    
b130: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
b140: 65 74 75 72 6e 20 24 3a 3a 74 63 6c 5f 6c 69 62  eturn $::tcl_lib
b150: 72 61 72 79 0d 0a 20 20 20 20 20 20 7d 20 65 6c  rary..      } el
b160: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  se {..        #.
b170: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
b180: 20 46 61 6c 6c 62 61 63 6b 20 74 6f 20 74 68 65   Fallback to the
b190: 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 74 61   directory conta
b1a0: 69 6e 69 6e 67 20 74 68 65 20 65 78 65 63 75 74  ining the execut
b1b0: 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 23  able...        #
b1c0: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
b1d0: 20 5b 69 6e 66 6f 20 62 69 6e 61 72 79 5d 0d 0a   [info binary]..
b1e0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
b1f0: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 44  ...    proc getD
b200: 61 74 61 62 61 73 65 44 69 72 65 63 74 6f 72 79  atabaseDirectory
b210: 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a   {} {..      #..
b220: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68        # NOTE: Th
b230: 69 73 20 70 72 6f 63 65 64 75 72 65 20 72 65 74  is procedure ret
b240: 75 72 6e 73 20 74 68 65 20 64 69 72 65 63 74 6f  urns the directo
b250: 72 79 20 77 68 65 72 65 20 74 68 65 20 74 65 73  ry where the tes
b260: 74 20 64 61 74 61 62 61 73 65 73 0d 0a 20 20 20  t databases..   
b270: 20 20 20 23 20 20 20 20 20 20 20 73 68 6f 75 6c     #       shoul
b280: 64 20 62 65 20 6c 6f 63 61 74 65 64 2e 20 20 42  d be located.  B
b290: 79 20 64 65 66 61 75 6c 74 2c 20 74 68 69 73 20  y default, this 
b2a0: 6a 75 73 74 20 75 73 65 73 20 74 68 65 20 74 65  just uses the te
b2b0: 6d 70 6f 72 61 72 79 0d 0a 20 20 20 20 20 20 23  mporary..      #
b2c0: 20 20 20 20 20 20 20 64 69 72 65 63 74 6f 72 79         directory
b2d0: 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20   configured for 
b2e0: 74 68 69 73 20 73 79 73 74 65 6d 2e 0d 0a 20 20  this system...  
b2f0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
b300: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
b310: 64 61 74 61 62 61 73 65 5f 64 69 72 65 63 74 6f  database_directo
b320: 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  ry] && \..      
b330: 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67      [string leng
b340: 74 68 20 24 3a 3a 64 61 74 61 62 61 73 65 5f 64  th $::database_d
b350: 69 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74  irectory] > 0} t
b360: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
b370: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
b380: 3a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f  : The location o
b390: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 64  f the database d
b3a0: 69 72 65 63 74 6f 72 79 20 68 61 73 20 62 65 65  irectory has bee
b3b0: 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b 0d 0a 20  n overridden;.. 
b3c0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74         #       t
b3d0: 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74  herefore, use it
b3e0: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
b3f0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a        return $::
b400: 64 61 74 61 62 61 73 65 5f 64 69 72 65 63 74 6f  database_directo
b410: 72 79 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  ry..      } else
b420: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
b430: 20 3a 3a 73 63 72 61 74 63 68 5f 64 69 72 65 63   ::scratch_direc
b440: 74 6f 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20  tory] && \..    
b450: 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65        [string le
b460: 6e 67 74 68 20 24 3a 3a 73 63 72 61 74 63 68 5f  ngth $::scratch_
b470: 64 69 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20  directory] > 0} 
b480: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
b490: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
b4a0: 45 3a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20  E: The location 
b4b0: 6f 66 20 74 68 65 20 73 63 72 61 74 63 68 20 64  of the scratch d
b4c0: 69 72 65 63 74 6f 72 79 20 68 61 73 20 62 65 65  irectory has bee
b4d0: 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b 0d 0a 20  n overridden;.. 
b4e0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74         #       t
b4f0: 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74  herefore, use it
b500: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
b510: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a        return $::
b520: 73 63 72 61 74 63 68 5f 64 69 72 65 63 74 6f 72  scratch_director
b530: 79 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  y..      } else 
b540: 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  {..        retur
b550: 6e 20 5b 67 65 74 54 65 6d 70 6f 72 61 72 79 50  n [getTemporaryP
b560: 61 74 68 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  ath]..      }.. 
b570: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
b580: 63 20 67 65 74 54 65 6d 70 6f 72 61 72 79 44 69  c getTemporaryDi
b590: 72 65 63 74 6f 72 79 20 7b 7d 20 7b 0d 0a 20 20  rectory {} {..  
b5a0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
b5b0: 4f 54 45 3a 20 54 68 69 73 20 70 72 6f 63 65 64  OTE: This proced
b5c0: 75 72 65 20 72 65 74 75 72 6e 73 20 74 68 65 20  ure returns the 
b5d0: 64 69 72 65 63 74 6f 72 79 20 77 68 65 72 65 20  directory where 
b5e0: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69  the temporary fi
b5f0: 6c 65 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20  les..      #    
b600: 20 20 20 73 68 6f 75 6c 64 20 62 65 20 6c 6f 63     should be loc
b610: 61 74 65 64 2e 20 20 42 79 20 64 65 66 61 75 6c  ated.  By defaul
b620: 74 2c 20 74 68 69 73 20 6a 75 73 74 20 75 73 65  t, this just use
b630: 73 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0d  s the temporary.
b640: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64  .      #       d
b650: 69 72 65 63 74 6f 72 79 20 63 6f 6e 66 69 67 75  irectory configu
b660: 72 65 64 20 66 6f 72 20 74 68 69 73 20 73 79 73  red for this sys
b670: 74 65 6d 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  tem...      #.. 
b680: 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65       if {[info e
b690: 78 69 73 74 73 20 3a 3a 74 65 6d 70 6f 72 61 72  xists ::temporar
b6a0: 79 5f 64 69 72 65 63 74 6f 72 79 5d 20 26 26 20  y_directory] && 
b6b0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74  \..          [st
b6c0: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 74  ring length $::t
b6d0: 65 6d 70 6f 72 61 72 79 5f 64 69 72 65 63 74 6f  emporary_directo
b6e0: 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  ry] > 0} then {.
b6f0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
b700: 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20      # NOTE: The 
b710: 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  location of the 
b720: 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74  temporary direct
b730: 6f 72 79 20 68 61 73 20 62 65 65 6e 20 6f 76 65  ory has been ove
b740: 72 72 69 64 64 65 6e 3b 0d 0a 20 20 20 20 20 20  rridden;..      
b750: 20 20 23 20 20 20 20 20 20 20 74 68 65 72 65 66    #       theref
b760: 6f 72 65 2c 20 75 73 65 20 69 74 2e 0d 0a 20 20  ore, use it...  
b770: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
b780: 20 72 65 74 75 72 6e 20 24 3a 3a 74 65 6d 70 6f   return $::tempo
b790: 72 61 72 79 5f 64 69 72 65 63 74 6f 72 79 0d 0a  rary_directory..
b7a0: 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b        } elseif {
b7b0: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 73  [info exists ::s
b7c0: 63 72 61 74 63 68 5f 64 69 72 65 63 74 6f 72 79  cratch_directory
b7d0: 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
b7e0: 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
b7f0: 20 24 3a 3a 73 63 72 61 74 63 68 5f 64 69 72 65   $::scratch_dire
b800: 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e  ctory] > 0} then
b810: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
b820: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54         # NOTE: T
b830: 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74  he location of t
b840: 68 65 20 73 63 72 61 74 63 68 20 64 69 72 65 63  he scratch direc
b850: 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 6f 76  tory has been ov
b860: 65 72 72 69 64 64 65 6e 3b 0d 0a 20 20 20 20 20  erridden;..     
b870: 20 20 20 23 20 20 20 20 20 20 20 74 68 65 72 65     #       there
b880: 66 6f 72 65 2c 20 75 73 65 20 69 74 2e 0d 0a 20  fore, use it... 
b890: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
b8a0: 20 20 72 65 74 75 72 6e 20 24 3a 3a 73 63 72 61    return $::scra
b8b0: 74 63 68 5f 64 69 72 65 63 74 6f 72 79 0d 0a 20  tch_directory.. 
b8c0: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
b8d0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 67         return [g
b8e0: 65 74 54 65 6d 70 6f 72 61 72 79 50 61 74 68 5d  etTemporaryPath]
b8f0: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
b900: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65  .....    proc ge
b910: 74 45 78 65 63 75 74 65 4f 6e 53 65 74 75 70 20  tExecuteOnSetup 
b920: 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b  {} {..      if {
b930: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 65  [info exists ::e
b940: 78 65 63 75 74 65 5f 6f 6e 5f 73 65 74 75 70 5d  xecute_on_setup]
b950: 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
b960: 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20   [string length 
b970: 24 3a 3a 65 78 65 63 75 74 65 5f 6f 6e 5f 73 65  $::execute_on_se
b980: 74 75 70 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  tup] > 0} then {
b990: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
b9a0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 74       # NOTE: Ret
b9b0: 75 72 6e 20 74 68 65 20 63 6f 6e 66 69 67 75 72  urn the configur
b9c0: 65 64 20 53 51 4c 20 74 6f 20 65 78 65 63 75 74  ed SQL to execut
b9d0: 65 20 64 75 72 69 6e 67 20 74 68 65 20 63 6f 6e  e during the con
b9e0: 6e 65 63 74 69 6f 6e 0d 0a 20 20 20 20 20 20 20  nection..       
b9f0: 20 23 20 20 20 20 20 20 20 73 65 74 75 70 20 70   #       setup p
ba00: 72 6f 63 65 64 75 72 65 20 28 69 2e 65 2e 20 66  rocedure (i.e. f
ba10: 6f 72 20 65 76 65 72 79 20 74 65 73 74 20 64 61  or every test da
ba20: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
ba30: 6e 29 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n)...        #..
ba40: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24          return $
ba50: 3a 3a 65 78 65 63 75 74 65 5f 6f 6e 5f 73 65 74  ::execute_on_set
ba60: 75 70 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  up..      } else
ba70: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
ba80: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42         # NOTE: B
ba90: 79 20 64 65 66 61 75 6c 74 2c 20 74 68 65 72 65  y default, there
baa0: 20 69 73 20 6e 6f 20 53 51 4c 20 74 6f 20 65 78   is no SQL to ex
bab0: 65 63 75 74 65 20 64 75 72 69 6e 67 20 74 68 65  ecute during the
bac0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 0d 0a 20 20 20   connection..   
bad0: 20 20 20 20 20 23 20 20 20 20 20 20 20 73 65 74       #       set
bae0: 75 70 20 70 72 6f 63 65 64 75 72 65 20 28 69 2e  up procedure (i.
baf0: 65 2e 20 66 6f 72 20 65 76 65 72 79 20 74 65 73  e. for every tes
bb00: 74 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  t database conne
bb10: 63 74 69 6f 6e 29 2e 0d 0a 20 20 20 20 20 20 20  ction)...       
bb20: 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   #..        retu
bb30: 72 6e 20 22 22 0d 0a 20 20 20 20 20 20 7d 0d 0a  rn ""..      }..
bb40: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
bb50: 6f 63 20 67 65 74 53 74 72 69 6e 67 4d 61 70 46  oc getStringMapF
bb60: 6f 72 54 63 6c 45 73 63 61 70 65 20 7b 7d 20 7b  orTclEscape {} {
bb70: 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b  ..      return [
bb80: 6c 69 73 74 20 5c 5c 20 5c 5c 5c 5c 20 5c 5b 20  list \\ \\\\ \[ 
bb90: 5c 5c 5c 5b 20 5c 5d 20 5c 5c 5c 5d 20 5c 24 20  \\\[ \] \\\] \$ 
bba0: 5c 5c 5c 24 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d  \\\$]..    }....
bbb0: 0a 20 20 20 20 70 72 6f 63 20 67 65 74 54 65 73  .    proc getTes
bbc0: 74 4f 76 65 72 72 69 64 65 73 50 72 65 61 6d 62  tOverridesPreamb
bbd0: 6c 65 20 7b 20 7b 65 78 74 72 61 56 61 72 4e 61  le { {extraVarNa
bbe0: 6d 65 73 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20  mes ""} } {..   
bbf0: 20 20 20 73 65 74 20 76 61 72 4e 61 6d 65 73 20     set varNames 
bc00: 5b 6c 69 73 74 5d 0d 0a 0d 0a 20 20 20 20 20 20  [list]....      
bc10: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
bc20: 20 49 66 20 61 76 61 69 6c 61 62 6c 65 2c 20 73   If available, s
bc30: 74 61 72 74 20 77 69 74 68 20 74 68 65 20 6d 61  tart with the ma
bc40: 73 74 65 72 20 6c 69 73 74 20 6f 66 20 74 65 73  ster list of tes
bc50: 74 20 6f 76 65 72 72 69 64 65 0d 0a 20 20 20 20  t override..    
bc60: 20 20 23 20 20 20 20 20 20 20 76 61 72 69 61 62    #       variab
bc70: 6c 65 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  les...      #.. 
bc80: 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65       if {[info e
bc90: 78 69 73 74 73 20 3a 3a 74 65 73 74 5f 6f 76 65  xists ::test_ove
bca0: 72 72 69 64 65 73 5d 20 26 26 20 5c 0d 0a 20 20  rrides] && \..  
bcb0: 20 20 20 20 20 20 20 20 5b 6c 6c 65 6e 67 74 68          [llength
bcc0: 20 24 3a 3a 74 65 73 74 5f 6f 76 65 72 72 69 64   $::test_overrid
bcd0: 65 73 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  es] > 0} then {.
bce0: 0a 20 20 20 20 20 20 20 20 65 76 61 6c 20 6c 61  .        eval la
bcf0: 70 70 65 6e 64 20 76 61 72 4e 61 6d 65 73 20 24  ppend varNames $
bd00: 3a 3a 74 65 73 74 5f 6f 76 65 72 72 69 64 65 73  ::test_overrides
bd10: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
bd20: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
bd30: 54 45 3a 20 49 66 20 72 65 71 75 65 73 74 65 64  TE: If requested
bd40: 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 2c 20   by our caller, 
bd50: 61 64 64 20 61 6e 79 20 61 64 64 69 74 69 6f 6e  add any addition
bd60: 61 6c 20 76 61 72 69 61 62 6c 65 0d 0a 20 20 20  al variable..   
bd70: 20 20 20 23 20 20 20 20 20 20 20 6e 61 6d 65 73     #       names
bd80: 20 74 6f 20 63 6f 70 79 20 6e 6f 77 2e 0d 0a 20   to copy now... 
bd90: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
bda0: 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 65 78 74 72   {[llength $extr
bdb0: 61 56 61 72 4e 61 6d 65 73 5d 20 3e 20 30 7d 20  aVarNames] > 0} 
bdc0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
bdd0: 65 76 61 6c 20 6c 61 70 70 65 6e 64 20 76 61 72  eval lappend var
bde0: 4e 61 6d 65 73 20 24 65 78 74 72 61 56 61 72 4e  Names $extraVarN
bdf0: 61 6d 65 73 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  ames..      }...
be00: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
be10: 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74 68  # NOTE: Build th
be20: 65 20 73 63 72 69 70 74 20 66 72 61 67 6d 65 6e  e script fragmen
be30: 74 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64  t to be returned
be40: 20 62 79 20 70 72 6f 63 65 73 73 69 6e 67 20 65   by processing e
be50: 61 63 68 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ach..      #    
be60: 20 20 20 76 61 72 69 61 62 6c 65 20 6e 61 6d 65     variable name
be70: 20 61 6e 64 20 61 64 64 69 6e 67 20 74 68 65 20   and adding the 
be80: 6e 65 63 65 63 65 73 73 61 72 79 20 73 63 72 69  nececessary scri
be90: 70 74 20 66 72 61 67 6d 65 6e 74 73 20 66 6f 72  pt fragments for
bea0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
beb0: 65 61 63 68 20 6f 6e 65 2e 0d 0a 20 20 20 20 20  each one...     
bec0: 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 72 65   #..      set re
bed0: 73 75 6c 74 20 22 22 0d 0a 0d 0a 20 20 20 20 20  sult ""....     
bee0: 20 66 6f 72 65 61 63 68 20 76 61 72 4e 61 6d 65   foreach varName
bef0: 20 24 76 61 72 4e 61 6d 65 73 20 7b 0d 0a 20 20   $varNames {..  
bf00: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
bf10: 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74   # NOTE: Build t
bf20: 68 65 20 71 75 61 6c 69 66 69 65 64 20 67 6c 6f  he qualified glo
bf30: 62 61 6c 20 76 61 72 69 61 62 6c 65 20 6e 61 6d  bal variable nam
bf40: 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  e...        #.. 
bf50: 20 20 20 20 20 20 20 73 65 74 20 66 75 6c 6c 56         set fullV
bf60: 61 72 4e 61 6d 65 20 5b 61 70 70 65 6e 64 41 72  arName [appendAr
bf70: 67 73 20 3a 3a 20 24 76 61 72 4e 61 6d 65 5d 0d  gs :: $varName].
bf80: 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
bf90: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 44 6f        # NOTE: Do
bfa0: 65 73 20 74 68 65 20 76 61 72 69 61 62 6c 65 20  es the variable 
bfb0: 65 78 69 73 74 20 69 6e 20 74 68 69 73 20 69 6e  exist in this in
bfc0: 74 65 72 70 72 65 74 65 72 20 63 6f 6e 74 65 78  terpreter contex
bfd0: 74 3f 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  t?..        #.. 
bfe0: 20 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f         if {[info
bff0: 20 65 78 69 73 74 73 20 24 66 75 6c 6c 56 61 72   exists $fullVar
c000: 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  Name]} then {.. 
c010: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
c020: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 70        # NOTE: Ap
c030: 70 65 6e 64 20 61 20 73 63 72 69 70 74 20 66 72  pend a script fr
c040: 61 67 6d 65 6e 74 20 74 6f 20 74 68 65 20 72 65  agment to the re
c050: 73 75 6c 74 20 74 68 61 74 20 77 69 6c 6c 20 63  sult that will c
c060: 6f 72 72 65 63 74 6c 79 0d 0a 20 20 20 20 20 20  orrectly..      
c070: 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 70 79      #       copy
c080: 20 61 6e 79 20 63 6f 6e 74 61 69 6e 65 64 20 76   any contained v
c090: 61 6c 75 65 20 74 6f 20 61 6e 6f 74 68 65 72 20  alue to another 
c0a0: 69 6e 74 65 72 70 72 65 74 65 72 20 63 6f 6e 74  interpreter cont
c0b0: 65 78 74 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ext...          
c0c0: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 61 70 70  #..          app
c0d0: 65 6e 64 20 72 65 73 75 6c 74 20 5c 6e 20 22 73  end result \n "s
c0e0: 65 74 20 22 20 24 66 75 6c 6c 56 61 72 4e 61 6d  et " $fullVarNam
c0f0: 65 20 22 20 5c 7b 22 20 5b 73 74 72 69 6e 67 20  e " \{" [string 
c100: 6d 61 70 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  map \..         
c110: 20 20 20 20 20 5b 67 65 74 53 74 72 69 6e 67 4d       [getStringM
c120: 61 70 46 6f 72 54 63 6c 45 73 63 61 70 65 5d 20  apForTclEscape] 
c130: 5b 73 65 74 20 24 66 75 6c 6c 56 61 72 4e 61 6d  [set $fullVarNam
c140: 65 5d 5d 20 5c 7d 0d 0a 20 20 20 20 20 20 20 20  e]] \}..        
c150: 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  }..      }....  
c160: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
c170: 4f 54 45 3a 20 49 66 20 74 68 65 20 72 65 73 75  OTE: If the resu
c180: 6c 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20  lt contains one 
c190: 6f 72 20 6d 6f 72 65 20 73 63 72 69 70 74 20 66  or more script f
c1a0: 72 61 67 6d 65 6e 74 73 2c 20 61 70 70 65 6e 64  ragments, append
c1b0: 20 61 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20   a..      #     
c1c0: 20 20 6e 65 77 6c 69 6e 65 2e 0d 0a 20 20 20 20    newline...    
c1d0: 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
c1e0: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 72  string length $r
c1f0: 65 73 75 6c 74 5d 20 3e 20 30 7d 20 74 68 65 6e  esult] > 0} then
c200: 20 7b 0d 0a 20 20 20 20 20 20 20 20 61 70 70 65   {..        appe
c210: 6e 64 20 72 65 73 75 6c 74 20 5c 6e 0d 0a 20 20  nd result \n..  
c220: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72      }....      r
c230: 65 74 75 72 6e 20 24 72 65 73 75 6c 74 0d 0a 20  eturn $result.. 
c240: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
c250: 63 20 6d 6f 76 65 53 79 73 74 65 6d 44 61 74 61  c moveSystemData
c260: 53 51 4c 69 74 65 44 6c 6c 43 6f 6e 66 69 67 20  SQLiteDllConfig 
c270: 7b 20 7b 72 65 73 74 6f 72 65 20 66 61 6c 73 65  { {restore false
c280: 7d 20 7b 76 65 72 62 6f 73 65 20 74 72 75 65 7d  } {verbose true}
c290: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20   } {..      set 
c2a0: 64 69 72 65 63 74 6f 72 79 20 5b 67 65 74 42 69  directory [getBi
c2b0: 6e 61 72 79 44 69 72 65 63 74 6f 72 79 5d 0d 0a  naryDirectory]..
c2c0: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72  ..      if {[str
c2d0: 69 6e 67 20 6c 65 6e 67 74 68 20 24 64 69 72 65  ing length $dire
c2e0: 63 74 6f 72 79 5d 20 3d 3d 20 30 7d 20 74 68 65  ctory] == 0} the
c2f0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20  n {..        if 
c300: 7b 24 76 65 72 62 6f 73 65 7d 20 74 68 65 6e 20  {$verbose} then 
c310: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75  {..          tpu
c320: 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
c330: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
c340: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
c350: 22 2d 2d 2d 2d 20 73 6b 69 70 70 65 64 20 6d 6f  "---- skipped mo
c360: 76 69 6e 67 20 5c 22 53 79 73 74 65 6d 2e 44 61  ving \"System.Da
c370: 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 2e 63 6f  ta.SQLite.dll.co
c380: 6e 66 69 67 5c 22 2c 20 22 20 5c 0d 0a 20 20 20  nfig\", " \..   
c390: 20 20 20 20 20 20 20 20 20 20 20 22 6e 6f 20 62             "no b
c3a0: 69 6e 61 72 79 20 64 69 72 65 63 74 6f 72 79 5c  inary directory\
c3b0: 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  n"]..        }..
c3c0: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
c3d0: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
c3e0: 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 28     set fileName(
c3f0: 31 29 20 5b 66 69 6c 65 20 6e 6f 72 6d 61 6c 69  1) [file normali
c400: 7a 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ze \..          
c410: 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 64 69 72 65  [file join $dire
c420: 63 74 6f 72 79 20 53 79 73 74 65 6d 2e 44 61 74  ctory System.Dat
c430: 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 2e 63 6f 6e  a.SQLite.dll.con
c440: 66 69 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 73  fig]]....      s
c450: 65 74 20 66 69 6c 65 4e 61 6d 65 28 32 29 20 5b  et fileName(2) [
c460: 61 70 70 65 6e 64 41 72 67 73 20 24 66 69 6c 65  appendArgs $file
c470: 4e 61 6d 65 28 31 29 20 2e 6d 6f 76 65 64 5d 0d  Name(1) .moved].
c480: 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 72 65  ...      if {$re
c490: 73 74 6f 72 65 7d 20 74 68 65 6e 20 7b 0d 0a 20  store} then {.. 
c4a0: 20 20 20 20 20 20 20 69 66 20 7b 5b 66 69 6c 65         if {[file
c4b0: 20 65 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d   exists $fileNam
c4c0: 65 28 32 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  e(2)]} then {.. 
c4d0: 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 72 65           file re
c4e0: 6e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 28 32  name $fileName(2
c4f0: 29 20 24 66 69 6c 65 4e 61 6d 65 28 31 29 0d 0a  ) $fileName(1)..
c500: 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
c510: 24 76 65 72 62 6f 73 65 7d 20 74 68 65 6e 20 7b  $verbose} then {
c520: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
c530: 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
c540: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
c550: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
c560: 20 20 20 22 2d 2d 2d 2d 20 6d 6f 76 65 64 20 5c     "---- moved \
c570: 22 22 20 24 66 69 6c 65 4e 61 6d 65 28 32 29 20  "" $fileName(2) 
c580: 22 5c 22 20 74 6f 20 5c 22 22 20 5c 0d 0a 20 20  "\" to \"" \..  
c590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24 66                $f
c5a0: 69 6c 65 4e 61 6d 65 28 31 29 20 5c 22 5c 6e 5d  ileName(1) \"\n]
c5b0: 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
c5c0: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
c5d0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 24  .          if {$
c5e0: 76 65 72 62 6f 73 65 7d 20 74 68 65 6e 20 7b 0d  verbose} then {.
c5f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
c600: 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
c610: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
c620: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
c630: 20 20 22 2d 2d 2d 2d 20 73 6b 69 70 70 65 64 20    "---- skipped 
c640: 6d 6f 76 69 6e 67 20 5c 22 22 20 24 66 69 6c 65  moving \"" $file
c650: 4e 61 6d 65 28 32 29 20 5c 0d 0a 20 20 20 20 20  Name(2) \..     
c660: 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c 20             "\", 
c670: 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  it does not exis
c680: 74 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20  t\n"]..         
c690: 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20   }..        }.. 
c6a0: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
c6b0: 20 20 20 20 20 20 20 69 66 20 7b 5b 66 69 6c 65         if {[file
c6c0: 20 65 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d   exists $fileNam
c6d0: 65 28 31 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  e(1)]} then {.. 
c6e0: 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 72 65           file re
c6f0: 6e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 28 31  name $fileName(1
c700: 29 20 24 66 69 6c 65 4e 61 6d 65 28 32 29 0d 0a  ) $fileName(2)..
c710: 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
c720: 24 76 65 72 62 6f 73 65 7d 20 74 68 65 6e 20 7b  $verbose} then {
c730: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
c740: 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
c750: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
c760: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
c770: 20 20 20 22 2d 2d 2d 2d 20 6d 6f 76 65 64 20 5c     "---- moved \
c780: 22 22 20 24 66 69 6c 65 4e 61 6d 65 28 31 29 20  "" $fileName(1) 
c790: 22 5c 22 20 74 6f 20 5c 22 22 20 5c 0d 0a 20 20  "\" to \"" \..  
c7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24 66                $f
c7b0: 69 6c 65 4e 61 6d 65 28 32 29 20 5c 22 5c 6e 5d  ileName(2) \"\n]
c7c0: 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
c7d0: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
c7e0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 24  .          if {$
c7f0: 76 65 72 62 6f 73 65 7d 20 74 68 65 6e 20 7b 0d  verbose} then {.
c800: 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
c810: 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
c820: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
c830: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
c840: 20 20 22 2d 2d 2d 2d 20 73 6b 69 70 70 65 64 20    "---- skipped 
c850: 6d 6f 76 69 6e 67 20 5c 22 22 20 24 66 69 6c 65  moving \"" $file
c860: 4e 61 6d 65 28 31 29 20 5c 0d 0a 20 20 20 20 20  Name(1) \..     
c870: 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c 20             "\", 
c880: 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  it does not exis
c890: 74 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20  t\n"]..         
c8a0: 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20   }..        }.. 
c8b0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
c8c0: 0d 0a 20 20 20 20 70 72 6f 63 20 77 72 69 74 65  ..    proc write
c8d0: 53 79 73 74 65 6d 44 61 74 61 53 51 4c 69 74 65  SystemDataSQLite
c8e0: 44 6c 6c 43 6f 6e 66 69 67 20 7b 20 64 61 74 61  DllConfig { data
c8f0: 20 7b 76 65 72 62 6f 73 65 20 74 72 75 65 7d 20   {verbose true} 
c900: 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 64  } {..      set d
c910: 69 72 65 63 74 6f 72 79 20 5b 67 65 74 42 69 6e  irectory [getBin
c920: 61 72 79 44 69 72 65 63 74 6f 72 79 5d 0d 0a 0d  aryDirectory]...
c930: 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69  .      if {[stri
c940: 6e 67 20 6c 65 6e 67 74 68 20 24 64 69 72 65 63  ng length $direc
c950: 74 6f 72 79 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  tory] == 0} then
c960: 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   {..        if {
c970: 24 76 65 72 62 6f 73 65 7d 20 74 68 65 6e 20 7b  $verbose} then {
c980: 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74  ..          tput
c990: 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
c9a0: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
c9b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
c9c0: 2d 2d 2d 2d 20 73 6b 69 70 70 65 64 20 6d 6f 76  ---- skipped mov
c9d0: 69 6e 67 20 5c 22 53 79 73 74 65 6d 2e 44 61 74  ing \"System.Dat
c9e0: 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 2e 63 6f 6e  a.SQLite.dll.con
c9f0: 66 69 67 5c 22 2c 20 22 20 5c 0d 0a 20 20 20 20  fig\", " \..    
ca00: 20 20 20 20 20 20 20 20 20 20 22 6e 6f 20 62 69            "no bi
ca10: 6e 61 72 79 20 64 69 72 65 63 74 6f 72 79 5c 6e  nary directory\n
ca20: 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  "]..        }...
ca30: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 0d  .        return.
ca40: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
ca50: 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b    set fileName [
ca60: 66 69 6c 65 20 6e 6f 72 6d 61 6c 69 7a 65 20 5c  file normalize \
ca70: 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c  ..          [fil
ca80: 65 20 6a 6f 69 6e 20 24 64 69 72 65 63 74 6f 72  e join $director
ca90: 79 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  y System.Data.SQ
caa0: 4c 69 74 65 2e 64 6c 6c 2e 63 6f 6e 66 69 67 5d  Lite.dll.config]
cab0: 5d 0d 0a 0d 0a 20 20 20 20 20 20 77 72 69 74 65  ]....      write
cac0: 46 69 6c 65 20 24 66 69 6c 65 4e 61 6d 65 20 24  File $fileName $
cad0: 64 61 74 61 0d 0a 0d 0a 20 20 20 20 20 20 69 66  data....      if
cae0: 20 7b 24 76 65 72 62 6f 73 65 7d 20 74 68 65 6e   {$verbose} then
caf0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   {..        tput
cb00: 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
cb10: 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  l \..           
cb20: 20 22 2d 2d 2d 2d 20 77 72 6f 74 65 20 5c 22 53   "---- wrote \"S
cb30: 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
cb40: 65 2e 64 6c 6c 2e 63 6f 6e 66 69 67 5c 22 5c 6e  e.dll.config\"\n
cb50: 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  "..      }....  
cb60: 20 20 20 20 72 65 74 75 72 6e 20 24 66 69 6c 65      return $file
cb70: 4e 61 6d 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  Name..    }.....
cb80: 20 20 20 20 70 72 6f 63 20 6d 6f 76 65 45 61 67      proc moveEag
cb90: 6c 65 53 68 65 6c 6c 4d 64 61 43 6f 6e 66 69 67  leShellMdaConfig
cba0: 20 7b 20 7b 72 65 73 74 6f 72 65 20 66 61 6c 73   { {restore fals
cbb0: 65 7d 20 7b 76 65 72 62 6f 73 65 20 74 72 75 65  e} {verbose true
cbc0: 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74  } } {..      set
cbd0: 20 64 69 72 65 63 74 6f 72 79 20 5b 67 65 74 42   directory [getB
cbe0: 69 6e 61 72 79 44 69 72 65 63 74 6f 72 79 5d 0d  inaryDirectory].
cbf0: 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74  ...      if {[st
cc00: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 64 69 72  ring length $dir
cc10: 65 63 74 6f 72 79 5d 20 3d 3d 20 30 7d 20 74 68  ectory] == 0} th
cc20: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66  en {..        if
cc30: 20 7b 24 76 65 72 62 6f 73 65 7d 20 74 68 65 6e   {$verbose} then
cc40: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70   {..          tp
cc50: 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
cc60: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
cc70: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
cc80: 20 22 2d 2d 2d 2d 20 73 6b 69 70 70 65 64 20 6d   "---- skipped m
cc90: 6f 76 69 6e 67 20 5c 22 45 61 67 6c 65 53 68 65  oving \"EagleShe
cca0: 6c 6c 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e 66 69  ll.exe.mda.confi
ccb0: 67 5c 22 2c 20 22 20 5c 0d 0a 20 20 20 20 20 20  g\", " \..      
ccc0: 20 20 20 20 20 20 20 20 22 6e 6f 20 62 69 6e 61          "no bina
ccd0: 72 79 20 64 69 72 65 63 74 6f 72 79 5c 6e 22 5d  ry directory\n"]
cce0: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
ccf0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 0d 0a 20         return.. 
cd00: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
cd10: 73 65 74 20 66 69 6c 65 4e 61 6d 65 28 31 29 20  set fileName(1) 
cd20: 5b 66 69 6c 65 20 6e 6f 72 6d 61 6c 69 7a 65 20  [file normalize 
cd30: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 66 69  \..          [fi
cd40: 6c 65 20 6a 6f 69 6e 20 24 64 69 72 65 63 74 6f  le join $directo
cd50: 72 79 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78  ry EagleShell.ex
cd60: 65 2e 6d 64 61 2e 63 6f 6e 66 69 67 5d 5d 0d 0a  e.mda.config]]..
cd70: 0d 0a 20 20 20 20 20 20 73 65 74 20 66 69 6c 65  ..      set file
cd80: 4e 61 6d 65 28 32 29 20 5b 61 70 70 65 6e 64 41  Name(2) [appendA
cd90: 72 67 73 20 24 66 69 6c 65 4e 61 6d 65 28 31 29  rgs $fileName(1)
cda0: 20 2e 6d 6f 76 65 64 5d 0d 0a 0d 0a 20 20 20 20   .moved]....    
cdb0: 20 20 69 66 20 7b 24 72 65 73 74 6f 72 65 7d 20    if {$restore} 
cdc0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
cdd0: 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73  if {[file exists
cde0: 20 24 66 69 6c 65 4e 61 6d 65 28 32 29 5d 7d 20   $fileName(2)]} 
cdf0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
ce00: 20 20 66 69 6c 65 20 72 65 6e 61 6d 65 20 24 66    file rename $f
ce10: 69 6c 65 4e 61 6d 65 28 32 29 20 24 66 69 6c 65  ileName(2) $file
ce20: 4e 61 6d 65 28 31 29 0d 0a 0d 0a 20 20 20 20 20  Name(1)....     
ce30: 20 20 20 20 20 69 66 20 7b 24 76 65 72 62 6f 73       if {$verbos
ce40: 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  e} then {..     
ce50: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
ce60: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
ce70: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
ce80: 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
ce90: 2d 20 6d 6f 76 65 64 20 5c 22 22 20 24 66 69 6c  - moved \"" $fil
cea0: 65 4e 61 6d 65 28 32 29 20 22 5c 22 20 74 6f 20  eName(2) "\" to 
ceb0: 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  \"" \..         
cec0: 20 20 20 20 20 20 20 24 66 69 6c 65 4e 61 6d 65         $fileName
ced0: 28 31 29 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20  (1) \"\n]..     
cee0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
cef0: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
cf00: 20 20 20 20 69 66 20 7b 24 76 65 72 62 6f 73 65      if {$verbose
cf10: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
cf20: 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
cf30: 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
cf40: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
cf50: 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
cf60: 20 73 6b 69 70 70 65 64 20 6d 6f 76 69 6e 67 20   skipped moving 
cf70: 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 28 32 29  \"" $fileName(2)
cf80: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
cf90: 20 20 20 20 22 5c 22 2c 20 69 74 20 64 6f 65 73      "\", it does
cfa0: 20 6e 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a   not exist\n"]..
cfb0: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
cfc0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20       }..      } 
cfd0: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
cfe0: 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73  if {[file exists
cff0: 20 24 66 69 6c 65 4e 61 6d 65 28 31 29 5d 7d 20   $fileName(1)]} 
d000: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
d010: 20 20 66 69 6c 65 20 72 65 6e 61 6d 65 20 24 66    file rename $f
d020: 69 6c 65 4e 61 6d 65 28 31 29 20 24 66 69 6c 65  ileName(1) $file
d030: 4e 61 6d 65 28 32 29 0d 0a 0d 0a 20 20 20 20 20  Name(2)....     
d040: 20 20 20 20 20 69 66 20 7b 24 76 65 72 62 6f 73       if {$verbos
d050: 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  e} then {..     
d060: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
d070: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
d080: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
d090: 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
d0a0: 2d 20 6d 6f 76 65 64 20 5c 22 22 20 24 66 69 6c  - moved \"" $fil
d0b0: 65 4e 61 6d 65 28 31 29 20 22 5c 22 20 74 6f 20  eName(1) "\" to 
d0c0: 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  \"" \..         
d0d0: 20 20 20 20 20 20 20 24 66 69 6c 65 4e 61 6d 65         $fileName
d0e0: 28 32 29 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20  (2) \"\n]..     
d0f0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
d100: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
d110: 20 20 20 20 69 66 20 7b 24 76 65 72 62 6f 73 65      if {$verbose
d120: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
d130: 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
d140: 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
d150: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
d160: 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
d170: 20 73 6b 69 70 70 65 64 20 6d 6f 76 69 6e 67 20   skipped moving 
d180: 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 28 31 29  \"" $fileName(1)
d190: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
d1a0: 20 20 20 20 22 5c 22 2c 20 69 74 20 64 6f 65 73      "\", it does
d1b0: 20 6e 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a   not exist\n"]..
d1c0: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
d1d0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
d1e0: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
d1f0: 72 6f 63 20 77 72 69 74 65 45 61 67 6c 65 53 68  roc writeEagleSh
d200: 65 6c 6c 4d 64 61 43 6f 6e 66 69 67 20 7b 20 64  ellMdaConfig { d
d210: 61 74 61 20 7b 76 65 72 62 6f 73 65 20 74 72 75  ata {verbose tru
d220: 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65  e} } {..      se
d230: 74 20 64 69 72 65 63 74 6f 72 79 20 5b 67 65 74  t directory [get
d240: 42 69 6e 61 72 79 44 69 72 65 63 74 6f 72 79 5d  BinaryDirectory]
d250: 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73  ....      if {[s
d260: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 64 69  tring length $di
d270: 72 65 63 74 6f 72 79 5d 20 3d 3d 20 30 7d 20 74  rectory] == 0} t
d280: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69  hen {..        i
d290: 66 20 7b 24 76 65 72 62 6f 73 65 7d 20 74 68 65  f {$verbose} the
d2a0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74  n {..          t
d2b0: 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
d2c0: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
d2d0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
d2e0: 20 20 22 2d 2d 2d 2d 20 73 6b 69 70 70 65 64 20    "---- skipped 
d2f0: 6d 6f 76 69 6e 67 20 5c 22 45 61 67 6c 65 53 68  moving \"EagleSh
d300: 65 6c 6c 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e 66  ell.exe.mda.conf
d310: 69 67 5c 22 2c 20 22 20 5c 0d 0a 20 20 20 20 20  ig\", " \..     
d320: 20 20 20 20 20 20 20 20 20 22 6e 6f 20 62 69 6e           "no bin
d330: 61 72 79 20 64 69 72 65 63 74 6f 72 79 5c 6e 22  ary directory\n"
d340: 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  ]..        }....
d350: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 0d 0a          return..
d360: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
d370: 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66   set fileName [f
d380: 69 6c 65 20 6e 6f 72 6d 61 6c 69 7a 65 20 5c 0d  ile normalize \.
d390: 0a 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65  .          [file
d3a0: 20 6a 6f 69 6e 20 24 64 69 72 65 63 74 6f 72 79   join $directory
d3b0: 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65 2e   EagleShell.exe.
d3c0: 6d 64 61 2e 63 6f 6e 66 69 67 5d 5d 0d 0a 0d 0a  mda.config]]....
d3d0: 20 20 20 20 20 20 77 72 69 74 65 46 69 6c 65 20        writeFile 
d3e0: 24 66 69 6c 65 4e 61 6d 65 20 24 64 61 74 61 0d  $fileName $data.
d3f0: 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 76 65  ...      if {$ve
d400: 72 62 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20  rbose} then {.. 
d410: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
d420: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a  test_channel \..
d430: 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
d440: 2d 20 77 72 6f 74 65 20 5c 22 45 61 67 6c 65 53  - wrote \"EagleS
d450: 68 65 6c 6c 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e  hell.exe.mda.con
d460: 66 69 67 5c 22 5c 6e 22 0d 0a 20 20 20 20 20 20  fig\"\n"..      
d470: 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72  }....      retur
d480: 6e 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20  n $fileName..   
d490: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
d4a0: 67 65 74 41 70 70 44 6f 6d 61 69 6e 50 72 65 61  getAppDomainPrea
d4b0: 6d 62 6c 65 20 7b 20 7b 70 72 65 66 69 78 20 22  mble { {prefix "
d4c0: 22 7d 20 7b 73 75 66 66 69 78 20 22 22 7d 20 7d  "} {suffix ""} }
d4d0: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
d4e0: 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20     # NOTE: This 
d4f0: 70 72 6f 63 65 64 75 72 65 20 72 65 74 75 72 6e  procedure return
d500: 73 20 61 20 74 65 73 74 20 73 65 74 75 70 20 73  s a test setup s
d510: 63 72 69 70 74 20 66 72 61 67 6d 65 6e 74 20 73  cript fragment s
d520: 75 69 74 61 62 6c 65 20 66 6f 72 0d 0a 20 20 20  uitable for..   
d530: 20 20 20 23 20 20 20 20 20 20 20 65 76 61 6c 75     #       evalu
d540: 61 74 69 6f 6e 20 62 79 20 61 6e 20 69 6e 74 65  ation by an inte
d550: 72 70 72 65 74 65 72 20 63 72 65 61 74 65 64 20  rpreter created 
d560: 69 6e 20 61 6e 20 69 73 6f 6c 61 74 65 64 20 61  in an isolated a
d570: 70 70 6c 69 63 61 74 69 6f 6e 0d 0a 20 20 20 20  pplication..    
d580: 20 20 23 20 20 20 20 20 20 20 64 6f 6d 61 69 6e    #       domain
d590: 2e 20 20 54 68 65 20 73 63 72 69 70 74 20 66 72  .  The script fr
d5a0: 61 67 6d 65 6e 74 20 62 65 69 6e 67 20 72 65 74  agment being ret
d5b0: 75 72 6e 65 64 20 77 69 6c 6c 20 62 65 20 73 75  urned will be su
d5c0: 72 72 6f 75 6e 64 65 64 20 62 79 0d 0a 20 20 20  rrounded by..   
d5d0: 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20 70     #       the p
d5e0: 72 65 66 69 78 20 61 6e 64 20 73 75 66 66 69 78  refix and suffix
d5f0: 20 22 73 63 72 69 70 74 20 66 72 61 67 6d 65 6e   "script fragmen
d600: 74 73 22 20 73 70 65 63 69 66 69 65 64 20 62 79  ts" specified by
d610: 20 6f 75 72 20 63 61 6c 6c 65 72 2c 0d 0a 20 20   our caller,..  
d620: 20 20 20 20 23 20 20 20 20 20 20 20 69 66 20 61      #       if a
d630: 6e 79 2e 20 20 54 68 65 20 65 6e 74 69 72 65 20  ny.  The entire 
d640: 73 63 72 69 70 74 20 62 65 69 6e 67 20 72 65 74  script being ret
d650: 75 72 6e 65 64 20 77 69 6c 6c 20 62 65 20 73 75  urned will be su
d660: 62 73 74 69 74 75 74 65 64 20 76 69 61 0d 0a 20  bstituted via.. 
d670: 20 20 20 20 20 23 20 20 20 20 20 20 20 5b 73 75       #       [su
d680: 62 73 74 5d 2c 20 69 6e 20 74 68 65 20 63 6f 6e  bst], in the con
d690: 74 65 78 74 20 6f 66 20 6f 75 72 20 63 61 6c 6c  text of our call
d6a0: 65 72 2c 20 62 65 66 6f 72 65 20 62 65 69 6e 67  er, before being
d6b0: 20 72 65 74 75 72 6e 65 64 2e 0d 0a 20 20 20 20   returned...    
d6c0: 20 20 23 20 20 20 20 20 20 20 54 68 69 73 20 73    #       This s
d6d0: 74 65 70 20 69 73 20 6e 65 63 65 73 73 61 72 79  tep is necessary
d6e0: 20 73 6f 20 74 68 61 74 20 73 6f 6d 65 20 6c 69   so that some li
d6f0: 6d 69 74 65 64 20 63 6f 6e 74 65 78 74 20 69 6e  mited context in
d700: 66 6f 72 6d 61 74 69 6f 6e 2c 0d 0a 20 20 20 20  formation,..    
d710: 20 20 23 20 20 20 20 20 20 20 70 72 69 6d 61 72    #       primar
d720: 69 6c 79 20 72 65 6c 61 74 65 64 20 74 6f 20 74  ily related to t
d730: 68 65 20 74 65 73 74 69 6e 67 20 64 69 72 65 63  he testing direc
d740: 74 6f 72 69 65 73 2c 20 63 61 6e 20 62 65 20 74  tories, can be t
d750: 72 61 6e 73 66 65 72 72 65 64 0d 0a 20 20 20 20  ransferred..    
d760: 20 20 23 20 20 20 20 20 20 20 74 6f 20 74 68 65    #       to the
d770: 20 69 6e 74 65 72 70 72 65 74 65 72 20 69 6e 20   interpreter in 
d780: 74 68 65 20 69 73 6f 6c 61 74 65 64 20 61 70 70  the isolated app
d790: 6c 69 63 61 74 69 6f 6e 20 64 6f 6d 61 69 6e 2c  lication domain,
d7a0: 20 6d 61 6b 69 6e 67 20 69 74 0d 0a 20 20 20 20   making it..    
d7b0: 20 20 23 20 20 20 20 20 20 20 61 62 6c 65 20 74    #       able t
d7c0: 6f 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 72  o successfully r
d7d0: 75 6e 20 74 65 73 74 73 20 74 68 61 74 20 72 65  un tests that re
d7e0: 71 75 69 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72  quire one or mor
d7f0: 65 20 6f 66 20 74 68 65 0d 0a 20 20 20 20 20 20  e of the..      
d800: 23 20 20 20 20 20 20 20 66 69 6c 65 73 20 69 6e  #       files in
d810: 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 65 73 74   one of the test
d820: 69 6e 67 20 64 69 72 65 63 74 6f 72 69 65 73 2e  ing directories.
d830: 20 20 43 61 6c 6c 65 72 73 20 73 68 6f 75 6c 64    Callers should
d840: 20 6b 65 65 70 20 69 6e 0d 0a 20 20 20 20 20 20   keep in..      
d850: 23 20 20 20 20 20 20 20 6d 69 6e 64 20 74 68 61  #       mind tha
d860: 74 20 74 68 65 20 74 65 73 74 20 73 63 72 69 70  t the test scrip
d870: 74 20 66 72 61 67 6d 65 6e 74 20 62 65 69 6e 67  t fragment being
d880: 20 72 65 74 75 72 6e 65 64 20 63 61 6e 6e 6f 74   returned cannot
d890: 20 72 65 6c 79 20 6f 6e 0d 0a 20 20 20 20 20 20   rely on..      
d8a0: 23 20 20 20 20 20 20 20 61 6e 79 20 73 63 72 69  #       any scri
d8b0: 70 74 20 6c 69 62 72 61 72 79 20 70 72 6f 63 65  pt library proce
d8c0: 64 75 72 65 73 20 74 68 61 74 20 61 72 65 20 6e  dures that are n
d8d0: 6f 74 20 70 72 6f 76 69 64 65 64 20 62 79 20 74  ot provided by t
d8e0: 68 65 20 45 61 67 6c 65 0d 0a 20 20 20 20 20 20  he Eagle..      
d8f0: 23 20 20 20 20 20 20 20 6c 69 62 72 61 72 79 20  #       library 
d900: 70 61 63 6b 61 67 65 20 28 69 2e 65 2e 20 22 69  package (i.e. "i
d910: 6e 69 74 2e 65 61 67 6c 65 22 29 2c 20 69 6e 63  nit.eagle"), inc
d920: 6c 75 64 69 6e 67 20 74 68 6f 73 65 20 70 72 6f  luding those pro
d930: 76 69 64 65 64 20 62 79 0d 0a 20 20 20 20 20 20  vided by..      
d940: 23 20 20 20 20 20 20 20 74 68 65 20 45 61 67 6c  #       the Eagl
d950: 65 20 74 65 73 74 20 70 61 63 6b 61 67 65 2c 20  e test package, 
d960: 75 6e 6c 65 73 73 20 74 68 65 20 66 69 6c 65 20  unless the file 
d970: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 6d 20  containing them 
d980: 69 73 20 6c 6f 61 64 65 64 0d 0a 20 20 20 20 20  is loaded..     
d990: 20 23 20 20 20 20 20 20 20 6d 61 6e 75 61 6c 6c   #       manuall
d9a0: 79 20 76 69 61 20 73 6f 6d 65 20 6f 74 68 65 72  y via some other
d9b0: 20 6d 65 63 68 61 6e 69 73 6d 20 28 65 2e 67 2e   mechanism (e.g.
d9c0: 20 62 79 20 69 6e 63 6c 75 64 69 6e 67 20 61 70   by including ap
d9d0: 70 72 6f 70 72 69 61 74 65 0d 0a 20 20 20 20 20  propriate..     
d9e0: 20 23 20 20 20 20 20 20 20 5b 70 61 63 6b 61 67   #       [packag
d9f0: 65 20 72 65 71 75 69 72 65 5d 20 6f 72 20 5b 73  e require] or [s
da00: 6f 75 72 63 65 5d 20 63 6f 6d 6d 61 6e 64 73 20  ource] commands 
da10: 69 6e 20 74 68 65 20 70 72 65 66 69 78 20 6f 72  in the prefix or
da20: 20 73 75 66 66 69 78 0d 0a 20 20 20 20 20 20 23   suffix..      #
da30: 20 20 20 20 20 20 20 73 63 72 69 70 74 20 66 72         script fr
da40: 61 67 6d 65 6e 74 73 29 2e 20 20 41 6c 73 6f 2c  agments).  Also,
da50: 20 61 6c 6c 20 76 61 72 69 61 62 6c 65 20 72 65   all variable re
da60: 66 65 72 65 6e 63 65 73 20 61 6e 64 20 61 6c 6c  ferences and all
da70: 20 6e 65 73 74 65 64 0d 0a 20 20 20 20 20 20 23   nested..      #
da80: 20 20 20 20 20 20 20 63 6f 6d 6d 61 6e 64 73 20         commands 
da90: 28 69 2e 65 2e 20 74 68 6f 73 65 20 69 6e 20 73  (i.e. those in s
daa0: 71 75 61 72 65 20 62 72 61 63 6b 65 74 73 29 20  quare brackets) 
dab0: 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65  contained in the
dac0: 20 66 69 6e 61 6c 0d 0a 20 20 20 20 20 20 23 20   final..      # 
dad0: 20 20 20 20 20 20 73 63 72 69 70 74 20 66 72 61        script fra
dae0: 67 6d 65 6e 74 20 77 69 6c 6c 20 65 6e 64 20 75  gment will end u
daf0: 70 20 62 65 69 6e 67 20 65 76 61 6c 75 61 74 65  p being evaluate
db00: 64 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 78 74  d in the context
db10: 20 6f 66 20 74 68 65 0d 0a 20 20 20 20 20 20 23   of the..      #
db20: 20 20 20 20 20 20 20 63 61 6c 6c 69 6e 67 20 69         calling i
db30: 6e 74 65 72 70 72 65 74 65 72 20 61 6e 64 20 6e  nterpreter and n
db40: 6f 74 20 74 68 65 20 74 61 72 67 65 74 20 69 6e  ot the target in
db50: 74 65 72 70 72 65 74 65 72 20 63 72 65 61 74 65  terpreter create
db60: 64 20 69 6e 20 74 68 65 0d 0a 20 20 20 20 20 20  d in the..      
db70: 23 20 20 20 20 20 20 20 69 73 6f 6c 61 74 65 64  #       isolated
db80: 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 64 6f 6d   application dom
db90: 61 69 6e 20 75 6e 6c 65 73 73 20 74 68 65 20 64  ain unless the d
dba0: 6f 6c 6c 61 72 20 73 69 67 6e 73 20 61 6e 64 2f  ollar signs and/
dbb0: 6f 72 20 73 71 75 61 72 65 0d 0a 20 20 20 20 20  or square..     
dbc0: 20 23 20 20 20 20 20 20 20 62 72 61 63 6b 65 74   #       bracket
dbd0: 73 20 61 72 65 20 73 70 65 63 69 61 6c 6c 79 20  s are specially 
dbe0: 71 75 6f 74 65 64 20 77 69 74 68 20 62 61 63 6b  quoted with back
dbf0: 73 6c 61 73 68 65 73 2e 0d 0a 20 20 20 20 20 20  slashes...      
dc00: 23 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  #..      return 
dc10: 5b 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74  [uplevel 1 [list
dc20: 20 73 75 62 73 74 20 5b 61 70 70 65 6e 64 41 72   subst [appendAr
dc30: 67 73 20 24 70 72 65 66 69 78 20 7b 0d 0a 20 20  gs $prefix {..  
dc40: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
dc50: 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 5c 5b 6f   # NOTE: The \[o
dc60: 62 6a 65 63 74 5c 5d 20 63 6f 6d 6d 61 6e 64 20  bject\] command 
dc70: 6d 61 79 20 62 65 20 6d 69 73 73 69 6e 67 20 69  may be missing i
dc80: 6e 20 73 6f 6d 65 20 45 61 67 6c 65 20 63 6f 72  n some Eagle cor
dc90: 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
dca0: 20 20 20 6c 69 62 72 61 72 79 20 63 6f 6e 66 69     library confi
dcb0: 67 75 72 61 74 69 6f 6e 73 2e 20 20 43 6c 6f 6e  gurations.  Clon
dcc0: 69 6e 67 20 61 6e 64 20 75 73 69 6e 67 20 74 68  ing and using th
dcd0: 65 20 70 72 6f 63 65 64 75 72 65 0d 0a 20 20 20  e procedure..   
dce0: 20 20 20 20 20 23 20 20 20 20 20 20 20 5c 5b 63       #       \[c
dcf0: 68 61 6e 67 65 4e 61 74 69 76 65 52 75 6e 74 69  hangeNativeRunti
dd00: 6d 65 4f 70 74 69 6f 6e 5c 5d 20 6d 61 79 20 68  meOption\] may h
dd10: 65 6c 70 20 74 6f 20 6d 69 74 69 67 61 74 65 20  elp to mitigate 
dd20: 74 68 69 73 2e 0d 0a 20 20 20 20 20 20 20 20 23  this...        #
dd30: 0d 0a 20 20 20 20 20 20 20 20 70 72 6f 63 20 63  ..        proc c
dd40: 68 61 6e 67 65 4e 61 74 69 76 65 52 75 6e 74 69  hangeNativeRunti
dd50: 6d 65 4f 70 74 69 6f 6e 20 5c 0d 0a 20 20 20 20  meOption \..    
dd60: 20 20 20 20 20 20 20 20 7b 5b 69 6e 66 6f 20 61          {[info a
dd70: 72 67 73 20 63 68 61 6e 67 65 4e 61 74 69 76 65  rgs changeNative
dd80: 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 5d 7d 20  RuntimeOption]} 
dd90: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b  \..            {
dda0: 5b 69 6e 66 6f 20 62 6f 64 79 20 63 68 61 6e 67  [info body chang
ddb0: 65 4e 61 74 69 76 65 52 75 6e 74 69 6d 65 4f 70  eNativeRuntimeOp
ddc0: 74 69 6f 6e 5d 7d 0d 0a 0d 0a 20 20 20 20 20 20  tion]}....      
ddd0: 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20    catch {..     
dde0: 20 20 20 20 20 63 68 61 6e 67 65 4e 61 74 69 76       changeNativ
ddf0: 65 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 5b  eRuntimeOption [
de00: 68 61 73 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e  hasRuntimeOption
de10: 20 6e 61 74 69 76 65 5d 0d 0a 20 20 20 20 20 20   native]..      
de20: 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 5b 67 65    }..      } [ge
de30: 74 54 65 73 74 4f 76 65 72 72 69 64 65 73 50 72  tTestOverridesPr
de40: 65 61 6d 62 6c 65 20 5b 6c 69 73 74 20 70 61 74  eamble [list pat
de50: 68 20 74 65 73 74 5f 63 68 61 6e 6e 65 6c 5d 5d  h test_channel]]
de60: 20 24 73 75 66 66 69 78 5d 5d 5d 0d 0a 20 20 20   $suffix]]]..   
de70: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
de80: 74 72 79 43 6f 70 79 45 78 74 65 72 6e 61 6c 46  tryCopyExternalF
de90: 69 6c 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  ile {..         
dea0: 20 20 20 66 69 6c 65 4e 61 6d 65 20 7b 70 6c 61     fileName {pla
deb0: 74 66 6f 72 6d 20 22 22 7d 20 7b 6e 65 77 46 69  tform ""} {newFi
dec0: 6c 65 4e 61 6d 65 20 22 22 7d 20 7b 76 65 72 62  leName ""} {verb
ded0: 6f 73 65 20 74 72 75 65 7d 20 7d 20 7b 0d 0a 20  ose true} } {.. 
dee0: 20 20 20 20 20 73 65 74 20 73 6f 75 72 63 65 46       set sourceF
def0: 69 6c 65 4e 61 6d 65 20 5b 67 65 74 45 78 74 65  ileName [getExte
df00: 72 6e 61 6c 46 69 6c 65 4e 61 6d 65 20 24 66 69  rnalFileName $fi
df10: 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20  leName]....     
df20: 20 69 66 20 7b 21 5b 66 69 6c 65 20 65 78 69 73   if {![file exis
df30: 74 73 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61  ts $sourceFileNa
df40: 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  me]} then {..   
df50: 20 20 20 20 20 69 66 20 7b 24 76 65 72 62 6f 73       if {$verbos
df60: 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  e} then {..     
df70: 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
df80: 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
df90: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
dfa0: 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6b          "---- sk
dfb0: 69 70 70 65 64 20 63 6f 70 79 69 6e 67 20 65 78  ipped copying ex
dfc0: 74 65 72 6e 61 6c 20 66 69 6c 65 20 5c 22 22 20  ternal file \"" 
dfd0: 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20  $sourceFileName 
dfe0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
dff0: 20 22 5c 22 2c 20 69 74 20 64 6f 65 73 20 6e 6f   "\", it does no
e000: 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a 20 20 20  t exist\n"]..   
e010: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
e020: 20 20 72 65 74 75 72 6e 0d 0a 20 20 20 20 20 20    return..      
e030: 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  }....      if {[
e040: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 6e  string length $n
e050: 65 77 46 69 6c 65 4e 61 6d 65 5d 20 3e 20 30 7d  ewFileName] > 0}
e060: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
e070: 20 73 65 74 20 74 61 72 67 65 74 46 69 6c 65 4e   set targetFileN
e080: 61 6d 65 20 5b 67 65 74 42 69 6e 61 72 79 46 69  ame [getBinaryFi
e090: 6c 65 4e 61 6d 65 20 24 6e 65 77 46 69 6c 65 4e  leName $newFileN
e0a0: 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a  ame $platform]..
e0b0: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
e0c0: 20 20 20 20 20 20 20 20 73 65 74 20 74 61 72 67          set targ
e0d0: 65 74 46 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42  etFileName [getB
e0e0: 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 24 66  inaryFileName $f
e0f0: 69 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72  ileName $platfor
e100: 6d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  m]..      }.... 
e110: 20 20 20 20 20 73 65 74 20 74 61 72 67 65 74 44       set targetD
e120: 69 72 65 63 74 6f 72 79 20 5b 66 69 6c 65 20 64  irectory [file d
e130: 69 72 6e 61 6d 65 20 24 74 61 72 67 65 74 46 69  irname $targetFi
e140: 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20  leName]....     
e150: 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
e160: 20 20 20 20 20 20 20 69 66 20 7b 21 5b 66 69 6c         if {![fil
e170: 65 20 65 78 69 73 74 73 20 24 74 61 72 67 65 74  e exists $target
e180: 44 69 72 65 63 74 6f 72 79 5d 7d 20 74 68 65 6e  Directory]} then
e190: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 66 69   {..          fi
e1a0: 6c 65 20 6d 6b 64 69 72 20 24 74 61 72 67 65 74  le mkdir $target
e1b0: 44 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20  Directory..     
e1c0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
e1d0: 66 69 6c 65 20 63 6f 70 79 20 2d 66 6f 72 63 65  file copy -force
e1e0: 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65   $sourceFileName
e1f0: 20 24 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65   $targetFileName
e200: 0d 0a 20 20 20 20 20 20 7d 5d 20 3d 3d 20 30 7d  ..      }] == 0}
e210: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
e220: 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
e230: 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
e240: 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
e250: 20 20 22 2d 2d 2d 2d 20 63 6f 70 69 65 64 20 65    "---- copied e
e260: 78 74 65 72 6e 61 6c 20 66 69 6c 65 20 66 72 6f  xternal file fro
e270: 6d 20 5c 22 22 20 24 73 6f 75 72 63 65 46 69 6c  m \"" $sourceFil
e280: 65 4e 61 6d 65 20 22 5c 22 20 74 6f 20 5c 22 22  eName "\" to \""
e290: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
e2a0: 24 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 20  $targetFileName 
e2b0: 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 20 65  \"\n]..      } e
e2c0: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74  lse {..        t
e2d0: 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
e2e0: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
e2f0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
e300: 22 2d 2d 2d 2d 20 66 61 69 6c 65 64 20 74 6f 20  "---- failed to 
e310: 63 6f 70 79 20 65 78 74 65 72 6e 61 6c 20 66 69  copy external fi
e320: 6c 65 20 66 72 6f 6d 20 5c 22 22 20 24 73 6f 75  le from \"" $sou
e330: 72 63 65 46 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20  rceFileName \.. 
e340: 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 20 74             "\" t
e350: 6f 20 5c 22 22 20 24 74 61 72 67 65 74 46 69 6c  o \"" $targetFil
e360: 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20  eName \"\n]..   
e370: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
e380: 20 20 20 20 70 72 6f 63 20 74 72 79 43 6f 70 79      proc tryCopy
e390: 42 69 6e 61 72 79 46 69 6c 65 20 7b 0d 0a 20 20  BinaryFile {..  
e3a0: 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 4e 61            fileNa
e3b0: 6d 65 20 6d 61 6e 61 67 65 64 4f 6e 6c 79 20 7b  me managedOnly {
e3c0: 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20 7b 6e 65  platform ""} {ne
e3d0: 77 46 69 6c 65 4e 61 6d 65 20 22 22 7d 0d 0a 20  wFileName ""}.. 
e3e0: 20 20 20 20 20 20 20 20 20 20 20 7b 76 65 72 62             {verb
e3f0: 6f 73 65 20 74 72 75 65 7d 20 7d 20 7b 0d 0a 20  ose true} } {.. 
e400: 20 20 20 20 20 73 65 74 20 73 6f 75 72 63 65 46       set sourceF
e410: 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42 69 6e 61  ileName [getBina
e420: 72 79 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65  ryFileName $file
e430: 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 5d 0d  Name $platform].
e440: 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 66  ...      if {![f
e450: 69 6c 65 20 65 78 69 73 74 73 20 24 73 6f 75 72  ile exists $sour
e460: 63 65 46 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65  ceFileName]} the
e470: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20  n {..        if 
e480: 7b 24 76 65 72 62 6f 73 65 7d 20 74 68 65 6e 20  {$verbose} then 
e490: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75  {..          tpu
e4a0: 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
e4b0: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
e4c0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
e4d0: 22 2d 2d 2d 2d 20 73 6b 69 70 70 65 64 20 63 6f  "---- skipped co
e4e0: 70 79 69 6e 67 20 62 69 6e 61 72 79 20 66 69 6c  pying binary fil
e4f0: 65 20 5c 22 22 20 24 73 6f 75 72 63 65 46 69 6c  e \"" $sourceFil
e500: 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20  eName \..       
e510: 20 20 20 20 20 20 20 22 5c 22 2c 20 69 74 20 64         "\", it d
e520: 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 5c 6e 22  oes not exist\n"
e530: 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  ]..        }....
e540: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 0d 0a          return..
e550: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
e560: 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
e570: 67 74 68 20 24 6e 65 77 46 69 6c 65 4e 61 6d 65  gth $newFileName
e580: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
e590: 20 20 20 20 20 20 20 73 65 74 20 74 61 72 67 65         set targe
e5a0: 74 46 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42 75  tFileName [getBu
e5b0: 69 6c 64 46 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20  ildFileName \.. 
e5c0: 20 20 20 20 20 20 20 20 20 20 20 24 6e 65 77 46             $newF
e5d0: 69 6c 65 4e 61 6d 65 20 24 6d 61 6e 61 67 65 64  ileName $managed
e5e0: 4f 6e 6c 79 20 24 70 6c 61 74 66 6f 72 6d 5d 0d  Only $platform].
e5f0: 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
e600: 0a 20 20 20 20 20 20 20 20 73 65 74 20 74 61 72  .        set tar
e610: 67 65 74 46 69 6c 65 4e 61 6d 65 20 5b 67 65 74  getFileName [get
e620: 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20 5c 0d  BuildFileName \.
e630: 0a 20 20 20 20 20 20 20 20 20 20 20 20 24 66 69  .            $fi
e640: 6c 65 4e 61 6d 65 20 24 6d 61 6e 61 67 65 64 4f  leName $managedO
e650: 6e 6c 79 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a  nly $platform]..
e660: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
e670: 20 73 65 74 20 74 61 72 67 65 74 44 69 72 65 63   set targetDirec
e680: 74 6f 72 79 20 5b 66 69 6c 65 20 64 69 72 6e 61  tory [file dirna
e690: 6d 65 20 24 74 61 72 67 65 74 46 69 6c 65 4e 61  me $targetFileNa
e6a0: 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20  me]....      if 
e6b0: 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
e6c0: 20 20 20 69 66 20 7b 21 5b 66 69 6c 65 20 65 78     if {![file ex
e6d0: 69 73 74 73 20 24 74 61 72 67 65 74 44 69 72 65  ists $targetDire
e6e0: 63 74 6f 72 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a  ctory]} then {..
e6f0: 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 6d            file m
e700: 6b 64 69 72 20 24 74 61 72 67 65 74 44 69 72 65  kdir $targetDire
e710: 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 20 20 7d  ctory..        }
e720: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 66 69 6c 65  ....        file
e730: 20 63 6f 70 79 20 2d 66 6f 72 63 65 20 24 73 6f   copy -force $so
e740: 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 24 74 61  urceFileName $ta
e750: 72 67 65 74 46 69 6c 65 4e 61 6d 65 0d 0a 20 20  rgetFileName..  
e760: 20 20 20 20 7d 5d 20 3d 3d 20 30 7d 20 74 68 65      }] == 0} the
e770: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75  n {..        tpu
e780: 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
e790: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
e7a0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d  ..            "-
e7b0: 2d 2d 2d 20 63 6f 70 69 65 64 20 62 69 6e 61 72  --- copied binar
e7c0: 79 20 66 69 6c 65 20 66 72 6f 6d 20 5c 22 22 20  y file from \"" 
e7d0: 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20  $sourceFileName 
e7e0: 22 5c 22 20 74 6f 20 5c 22 22 20 5c 0d 0a 20 20  "\" to \"" \..  
e7f0: 20 20 20 20 20 20 20 20 20 20 24 74 61 72 67 65            $targe
e800: 74 46 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d  tFileName \"\n].
e810: 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
e820: 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
e830: 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
e840: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
e850: 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
e860: 66 61 69 6c 65 64 20 74 6f 20 63 6f 70 79 20 62  failed to copy b
e870: 69 6e 61 72 79 20 66 69 6c 65 20 66 72 6f 6d 20  inary file from 
e880: 5c 22 22 20 24 73 6f 75 72 63 65 46 69 6c 65 4e  \"" $sourceFileN
e890: 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ame \..         
e8a0: 20 20 20 22 5c 22 20 74 6f 20 5c 22 22 20 24 74     "\" to \"" $t
e8b0: 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 20 5c 22  argetFileName \"
e8c0: 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  \n]..      }..  
e8d0: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
e8e0: 20 74 72 79 43 6f 70 79 42 75 69 6c 64 46 69 6c   tryCopyBuildFil
e8f0: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e {..           
e900: 20 66 69 6c 65 4e 61 6d 65 20 6d 61 6e 61 67 65   fileName manage
e910: 64 4f 6e 6c 79 20 7b 70 6c 61 74 66 6f 72 6d 20  dOnly {platform 
e920: 22 22 7d 20 7b 6e 65 77 46 69 6c 65 4e 61 6d 65  ""} {newFileName
e930: 20 22 22 7d 0d 0a 20 20 20 20 20 20 20 20 20 20   ""}..          
e940: 20 20 7b 76 65 72 62 6f 73 65 20 74 72 75 65 7d    {verbose true}
e950: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20   } {..      set 
e960: 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 5b  sourceFileName [
e970: 67 65 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65  getBuildFileName
e980: 20 24 66 69 6c 65 4e 61 6d 65 20 24 6d 61 6e 61   $fileName $mana
e990: 67 65 64 4f 6e 6c 79 20 24 70 6c 61 74 66 6f 72  gedOnly $platfor
e9a0: 6d 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b  m]....      if {
e9b0: 21 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 73  ![file exists $s
e9c0: 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 5d 7d 20  ourceFileName]} 
e9d0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
e9e0: 69 66 20 7b 24 76 65 72 62 6f 73 65 7d 20 74 68  if {$verbose} th
e9f0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
ea00: 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
ea10: 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
ea20: 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
ea30: 20 20 20 22 2d 2d 2d 2d 20 73 6b 69 70 70 65 64     "---- skipped
ea40: 20 63 6f 70 79 69 6e 67 20 62 75 69 6c 64 20 66   copying build f
ea50: 69 6c 65 20 5c 22 22 20 24 73 6f 75 72 63 65 46  ile \"" $sourceF
ea60: 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20  ileName \..     
ea70: 20 20 20 20 20 20 20 20 20 22 5c 22 2c 20 69 74           "\", it
ea80: 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 5c   does not exist\
ea90: 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  n"]..        }..
eaa0: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
eab0: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
eac0: 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
ead0: 65 6e 67 74 68 20 24 6e 65 77 46 69 6c 65 4e 61  ength $newFileNa
eae0: 6d 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  me] > 0} then {.
eaf0: 0a 20 20 20 20 20 20 20 20 73 65 74 20 74 61 72  .        set tar
eb00: 67 65 74 46 69 6c 65 4e 61 6d 65 20 5b 67 65 74  getFileName [get
eb10: 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 24  BinaryFileName $
eb20: 6e 65 77 46 69 6c 65 4e 61 6d 65 20 24 70 6c 61  newFileName $pla
eb30: 74 66 6f 72 6d 5d 0d 0a 20 20 20 20 20 20 7d 20  tform]..      } 
eb40: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
eb50: 73 65 74 20 74 61 72 67 65 74 46 69 6c 65 4e 61  set targetFileNa
eb60: 6d 65 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c  me [getBinaryFil
eb70: 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 20  eName $fileName 
eb80: 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a 20 20 20 20  $platform]..    
eb90: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 73 65 74    }....      set
eba0: 20 74 61 72 67 65 74 44 69 72 65 63 74 6f 72 79   targetDirectory
ebb0: 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20 24   [file dirname $
ebc0: 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 5d 0d  targetFileName].
ebd0: 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61  ...      if {[ca
ebe0: 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 69  tch {..        i
ebf0: 66 20 7b 21 5b 66 69 6c 65 20 65 78 69 73 74 73  f {![file exists
ec00: 20 24 74 61 72 67 65 74 44 69 72 65 63 74 6f 72   $targetDirector
ec10: 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  y]} then {..    
ec20: 20 20 20 20 20 20 66 69 6c 65 20 6d 6b 64 69 72        file mkdir
ec30: 20 24 74 61 72 67 65 74 44 69 72 65 63 74 6f 72   $targetDirector
ec40: 79 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  y..        }....
ec50: 20 20 20 20 20 20 20 20 66 69 6c 65 20 63 6f 70          file cop
ec60: 79 20 2d 66 6f 72 63 65 20 24 73 6f 75 72 63 65  y -force $source
ec70: 46 69 6c 65 4e 61 6d 65 20 24 74 61 72 67 65 74  FileName $target
ec80: 46 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20  FileName..      
ec90: 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  }] == 0} then {.
eca0: 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
ecb0: 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
ecc0: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
ecd0: 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
ece0: 63 6f 70 69 65 64 20 62 75 69 6c 64 20 66 69 6c  copied build fil
ecf0: 65 20 66 72 6f 6d 20 5c 22 22 20 24 73 6f 75 72  e from \"" $sour
ed00: 63 65 46 69 6c 65 4e 61 6d 65 20 22 5c 22 20 74  ceFileName "\" t
ed10: 6f 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20  o \"" \..       
ed20: 20 20 20 20 20 24 74 61 72 67 65 74 46 69 6c 65       $targetFile
ed30: 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20  Name \"\n]..    
ed40: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
ed50: 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
ed60: 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
ed70: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
ed80: 20 20 20 20 20 22 2d 2d 2d 2d 20 66 61 69 6c 65       "---- faile
ed90: 64 20 74 6f 20 63 6f 70 79 20 62 75 69 6c 64 20  d to copy build 
eda0: 66 69 6c 65 20 66 72 6f 6d 20 5c 22 22 20 24 73  file from \"" $s
edb0: 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 5c 0d  ourceFileName \.
edc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22  .            "\"
edd0: 20 74 6f 20 5c 22 22 20 24 74 61 72 67 65 74 46   to \"" $targetF
ede0: 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20  ileName \"\n].. 
edf0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
ee00: 0d 0a 20 20 20 20 70 72 6f 63 20 74 72 79 44 65  ..    proc tryDe
ee10: 6c 65 74 65 42 69 6e 61 72 79 46 69 6c 65 20 7b  leteBinaryFile {
ee20: 20 66 69 6c 65 4e 61 6d 65 20 7b 70 6c 61 74 66   fileName {platf
ee30: 6f 72 6d 20 22 22 7d 20 7b 76 65 72 62 6f 73 65  orm ""} {verbose
ee40: 20 74 72 75 65 7d 20 7d 20 7b 0d 0a 20 20 20 20   true} } {..    
ee50: 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b    set fileName [
ee60: 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d  getBinaryFileNam
ee70: 65 20 24 66 69 6c 65 4e 61 6d 65 20 24 70 6c 61  e $fileName $pla
ee80: 74 66 6f 72 6d 5d 0d 0a 0d 0a 20 20 20 20 20 20  tform]....      
ee90: 69 66 20 7b 21 5b 66 69 6c 65 20 65 78 69 73 74  if {![file exist
eea0: 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68  s $fileName]} th
eeb0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66  en {..        if
eec0: 20 7b 24 76 65 72 62 6f 73 65 7d 20 74 68 65 6e   {$verbose} then
eed0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70   {..          tp
eee0: 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
eef0: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
ef00: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
ef10: 20 22 2d 2d 2d 2d 20 73 6b 69 70 70 65 64 20 64   "---- skipped d
ef20: 65 6c 65 74 69 6e 67 20 62 69 6e 61 72 79 20 66  eleting binary f
ef30: 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d  ile \"" $fileNam
ef40: 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
ef50: 20 20 20 22 5c 22 2c 20 69 74 20 64 6f 65 73 20     "\", it does 
ef60: 6e 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a 20  not exist\n"].. 
ef70: 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
ef80: 20 20 20 20 72 65 74 75 72 6e 0d 0a 20 20 20 20      return..    
ef90: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20    }....      if 
efa0: 7b 5b 63 61 74 63 68 20 7b 66 69 6c 65 20 64 65  {[catch {file de
efb0: 6c 65 74 65 20 24 66 69 6c 65 4e 61 6d 65 7d 5d  lete $fileName}]
efc0: 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
efd0: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
efe0: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
eff0: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
f000: 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 64 65          "---- de
f010: 6c 65 74 65 64 20 62 69 6e 61 72 79 20 66 69 6c  leted binary fil
f020: 65 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 20  e \"" $fileName 
f030: 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 20 65  \"\n]..      } e
f040: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74  lse {..        t
f050: 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
f060: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
f070: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
f080: 22 2d 2d 2d 2d 20 66 61 69 6c 65 64 20 74 6f 20  "---- failed to 
f090: 64 65 6c 65 74 65 20 62 69 6e 61 72 79 20 66 69  delete binary fi
f0a0: 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65  le \"" $fileName
f0b0: 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d   \"\n]..      }.
f0c0: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
f0d0: 72 6f 63 20 74 72 79 44 65 6c 65 74 65 42 75 69  roc tryDeleteBui
f0e0: 6c 64 46 69 6c 65 20 7b 0d 0a 20 20 20 20 20 20  ldFile {..      
f0f0: 20 20 20 20 20 20 66 69 6c 65 4e 61 6d 65 20 6d        fileName m
f100: 61 6e 61 67 65 64 4f 6e 6c 79 20 7b 70 6c 61 74  anagedOnly {plat
f110: 66 6f 72 6d 20 22 22 7d 20 7b 76 65 72 62 6f 73  form ""} {verbos
f120: 65 20 74 72 75 65 7d 20 7d 20 7b 0d 0a 20 20 20  e true} } {..   
f130: 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 20     set fileName 
f140: 5b 67 65 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d  [getBuildFileNam
f150: 65 20 24 66 69 6c 65 4e 61 6d 65 20 24 6d 61 6e  e $fileName $man
f160: 61 67 65 64 4f 6e 6c 79 20 24 70 6c 61 74 66 6f  agedOnly $platfo
f170: 72 6d 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20  rm]....      if 
f180: 7b 21 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24  {![file exists $
f190: 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20  fileName]} then 
f1a0: 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 24  {..        if {$
f1b0: 76 65 72 62 6f 73 65 7d 20 74 68 65 6e 20 7b 0d  verbose} then {.
f1c0: 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
f1d0: 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
f1e0: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
f1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
f200: 2d 2d 2d 20 73 6b 69 70 70 65 64 20 64 65 6c 65  --- skipped dele
f210: 74 69 6e 67 20 62 75 69 6c 64 20 66 69 6c 65 20  ting build file 
f220: 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c 0d  \"" $fileName \.
f230: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
f240: 5c 22 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20  \", it does not 
f250: 65 78 69 73 74 5c 6e 22 5d 0d 0a 20 20 20 20 20  exist\n"]..     
f260: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
f270: 72 65 74 75 72 6e 0d 0a 20 20 20 20 20 20 7d 0d  return..      }.
f280: 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61  ...      if {[ca
f290: 74 63 68 20 7b 66 69 6c 65 20 64 65 6c 65 74 65  tch {file delete
f2a0: 20 24 66 69 6c 65 4e 61 6d 65 7d 5d 20 3d 3d 20   $fileName}] == 
f2b0: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
f2c0: 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
f2d0: 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
f2e0: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
f2f0: 20 20 20 20 22 2d 2d 2d 2d 20 64 65 6c 65 74 65      "---- delete
f300: 64 20 62 75 69 6c 64 20 66 69 6c 65 20 5c 22 22  d build file \""
f310: 20 24 66 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d   $fileName \"\n]
f320: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
f330: 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
f340: 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
f350: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
f360: 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
f370: 20 66 61 69 6c 65 64 20 74 6f 20 64 65 6c 65 74   failed to delet
f380: 65 20 62 75 69 6c 64 20 66 69 6c 65 20 5c 22 22  e build file \""
f390: 20 24 66 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d   $fileName \"\n]
f3a0: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
f3b0: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 74 72  .....    proc tr
f3c0: 79 43 6f 70 79 41 73 73 65 6d 62 6c 79 20 7b 0d  yCopyAssembly {.
f3d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c  .            fil
f3e0: 65 4e 61 6d 65 20 6d 61 6e 61 67 65 64 4f 6e 6c  eName managedOnl
f3f0: 79 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20  y {platform ""} 
f400: 7b 70 64 62 20 74 72 75 65 7d 20 7b 76 65 72 62  {pdb true} {verb
f410: 6f 73 65 20 74 72 75 65 7d 20 7d 20 7b 0d 0a 20  ose true} } {.. 
f420: 20 20 20 20 20 74 72 79 43 6f 70 79 42 75 69 6c       tryCopyBuil
f430: 64 46 69 6c 65 20 24 66 69 6c 65 4e 61 6d 65 20  dFile $fileName 
f440: 24 6d 61 6e 61 67 65 64 4f 6e 6c 79 20 24 70 6c  $managedOnly $pl
f450: 61 74 66 6f 72 6d 20 22 22 20 24 76 65 72 62 6f  atform "" $verbo
f460: 73 65 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b  se....      if {
f470: 24 70 64 62 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  $pdb} then {..  
f480: 20 20 20 20 20 20 74 72 79 43 6f 70 79 42 75 69        tryCopyBui
f490: 6c 64 46 69 6c 65 20 5b 61 70 70 65 6e 64 41 72  ldFile [appendAr
f4a0: 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
f4b0: 20 20 5b 66 69 6c 65 20 72 6f 6f 74 6e 61 6d 65    [file rootname
f4c0: 20 24 66 69 6c 65 4e 61 6d 65 5d 20 2e 70 64 62   $fileName] .pdb
f4d0: 5d 20 24 6d 61 6e 61 67 65 64 4f 6e 6c 79 20 24  ] $managedOnly $
f4e0: 70 6c 61 74 66 6f 72 6d 20 22 22 20 24 76 65 72  platform "" $ver
f4f0: 62 6f 73 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  bose..      }.. 
f500: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
f510: 63 20 74 72 79 44 65 6c 65 74 65 41 73 73 65 6d  c tryDeleteAssem
f520: 62 6c 79 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  bly {..         
f530: 20 20 20 66 69 6c 65 4e 61 6d 65 20 7b 70 6c 61     fileName {pla
f540: 74 66 6f 72 6d 20 22 22 7d 20 7b 70 64 62 20 74  tform ""} {pdb t
f550: 72 75 65 7d 20 7b 76 65 72 62 6f 73 65 20 74 72  rue} {verbose tr
f560: 75 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74  ue} } {..      t
f570: 72 79 44 65 6c 65 74 65 42 69 6e 61 72 79 46 69  ryDeleteBinaryFi
f580: 6c 65 20 24 66 69 6c 65 4e 61 6d 65 20 24 70 6c  le $fileName $pl
f590: 61 74 66 6f 72 6d 20 24 76 65 72 62 6f 73 65 0d  atform $verbose.
f5a0: 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 70 64  ...      if {$pd
f5b0: 62 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  b} then {..     
f5c0: 20 20 20 74 72 79 44 65 6c 65 74 65 42 69 6e 61     tryDeleteBina
f5d0: 72 79 46 69 6c 65 20 5b 61 70 70 65 6e 64 41 72  ryFile [appendAr
f5e0: 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
f5f0: 20 20 5b 66 69 6c 65 20 72 6f 6f 74 6e 61 6d 65    [file rootname
f600: 20 24 66 69 6c 65 4e 61 6d 65 5d 20 2e 70 64 62   $fileName] .pdb
f610: 5d 20 24 70 6c 61 74 66 6f 72 6d 20 24 76 65 72  ] $platform $ver
f620: 62 6f 73 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  bose..      }.. 
f630: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
f640: 63 20 74 72 79 4c 6f 61 64 41 73 73 65 6d 62 6c  c tryLoadAssembl
f650: 79 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7b 70 6c  y { fileName {pl
f660: 61 74 66 6f 72 6d 20 22 22 7d 20 7d 20 7b 0d 0a  atform ""} } {..
f670: 20 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61        set fileNa
f680: 6d 65 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c  me [getBinaryFil
f690: 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 20  eName $fileName 
f6a0: 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a 0d 0a 20 20  $platform]....  
f6b0: 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
f6c0: 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 61 73  ..        set as
f6d0: 73 65 6d 62 6c 79 20 5b 6f 62 6a 65 63 74 20 6c  sembly [object l
f6e0: 6f 61 64 20 2d 6c 6f 61 64 74 79 70 65 20 46 69  oad -loadtype Fi
f6f0: 6c 65 20 2d 61 6c 69 61 73 20 24 66 69 6c 65 4e  le -alias $fileN
f700: 61 6d 65 5d 0d 0a 20 20 20 20 20 20 7d 5d 20 3d  ame]..      }] =
f710: 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
f720: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
f730: 23 20 4e 4f 54 45 3a 20 4e 6f 77 2c 20 61 64 64  # NOTE: Now, add
f740: 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 74   the necessary t
f750: 65 73 74 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0d  est constraint..
f760: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
f770: 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e      addConstrain
f780: 74 20 5b 66 69 6c 65 20 72 6f 6f 74 6e 61 6d 65  t [file rootname
f790: 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69 6c   [file tail $fil
f7a0: 65 4e 61 6d 65 5d 5d 0d 0a 0d 0a 20 20 20 20 20  eName]]....     
f7b0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
f7c0: 4e 4f 54 45 3a 20 47 72 61 62 20 74 68 65 20 69  NOTE: Grab the i
f7d0: 6d 61 67 65 20 72 75 6e 74 69 6d 65 20 76 65 72  mage runtime ver
f7e0: 73 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 61 73  sion from the as
f7f0: 73 65 6d 62 6c 79 20 62 65 63 61 75 73 65 0d 0a  sembly because..
f800: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
f810: 73 65 76 65 72 61 6c 20 74 65 73 74 73 20 72 65  several tests re
f820: 6c 79 20 6f 6e 20 69 74 20 68 61 76 69 6e 67 20  ly on it having 
f830: 61 20 63 65 72 74 61 69 6e 20 76 61 6c 75 65 2e  a certain value.
f840: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
f850: 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
f860: 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5b  nt [appendArgs [
f870: 66 69 6c 65 20 74 61 69 6c 20 24 66 69 6c 65 4e  file tail $fileN
f880: 61 6d 65 5d 20 5f 20 5c 0d 0a 20 20 20 20 20 20  ame] _ \..      
f890: 20 20 20 20 20 20 5b 24 61 73 73 65 6d 62 6c 79        [$assembly
f8a0: 20 49 6d 61 67 65 52 75 6e 74 69 6d 65 56 65 72   ImageRuntimeVer
f8b0: 73 69 6f 6e 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20  sion]]....      
f8c0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
f8d0: 4f 54 45 3a 20 52 65 74 75 72 6e 20 74 68 65 20  OTE: Return the 
f8e0: 66 75 6c 6c 20 70 61 74 68 20 6f 66 20 74 68 65  full path of the
f8f0: 20 6c 6f 61 64 65 64 20 66 69 6c 65 2e 0d 0a 20   loaded file... 
f900: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
f910: 20 20 72 65 74 75 72 6e 20 24 66 69 6c 65 4e 61    return $fileNa
f920: 6d 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  me..      }.... 
f930: 20 20 20 20 20 72 65 74 75 72 6e 20 22 22 0d 0a       return ""..
f940: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
f950: 6f 63 20 69 73 53 51 4c 69 74 65 52 65 61 64 79  oc isSQLiteReady
f960: 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a   {} {..      #..
f970: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68        # NOTE: Th
f980: 69 73 20 70 72 6f 63 65 64 75 72 65 20 6d 75 73  is procedure mus
f990: 74 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72  t return non-zer
f9a0: 6f 20 6f 6e 6c 79 20 69 66 20 74 68 65 20 53 51  o only if the SQ
f9b0: 4c 69 74 65 20 6e 61 74 69 76 65 0d 0a 20 20 20  Lite native..   
f9c0: 20 20 20 23 20 20 20 20 20 20 20 6c 69 62 72 61     #       libra
f9d0: 72 79 20 61 6e 64 20 74 68 65 20 53 79 73 74 65  ry and the Syste
f9e0: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 6d 61  m.Data.SQLite ma
f9f0: 6e 61 67 65 64 20 61 73 73 65 6d 62 6c 79 20 61  naged assembly a
fa00: 72 65 20 6c 6f 61 64 65 64 0d 0a 20 20 20 20 20  re loaded..     
fa10: 20 23 20 20 20 20 20 20 20 61 6e 64 20 72 65 61   #       and rea
fa20: 64 79 20 66 6f 72 20 75 73 65 20 62 79 20 74 68  dy for use by th
fa30: 65 20 74 65 73 74 20 73 75 69 74 65 2e 20 20 43  e test suite.  C
fa40: 75 72 72 65 6e 74 6c 79 2c 20 74 68 69 73 20 70  urrently, this p
fa50: 72 6f 63 65 64 75 72 65 0d 0a 20 20 20 20 20 20  rocedure..      
fa60: 23 20 20 20 20 20 20 20 73 68 6f 75 6c 64 20 62  #       should b
fa70: 65 20 63 61 6c 6c 65 64 20 6f 6e 6c 79 20 61 66  e called only af
fa80: 74 65 72 20 74 68 65 20 5b 74 72 79 4c 6f 61 64  ter the [tryLoad
fa90: 41 73 73 65 6d 62 6c 79 5d 20 70 72 6f 63 65 64  Assembly] proced
faa0: 75 72 65 20 68 61 73 0d 0a 20 20 20 20 20 20 23  ure has..      #
fab0: 20 20 20 20 20 20 20 62 65 65 6e 20 63 61 6c 6c         been call
fac0: 65 64 20 74 6f 20 70 72 6f 62 65 20 66 6f 72 20  ed to probe for 
fad0: 74 68 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  the System.Data.
fae0: 53 51 4c 69 74 65 20 6d 61 6e 61 67 65 64 20 61  SQLite managed a
faf0: 73 73 65 6d 62 6c 79 0d 0a 20 20 20 20 20 20 23  ssembly..      #
fb00: 20 20 20 20 20 20 20 61 6e 64 20 74 68 65 20 5b         and the [
fb10: 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 5d 20  checkForSQLite] 
fb20: 70 72 6f 63 65 64 75 72 65 20 68 61 73 20 62 65  procedure has be
fb30: 65 6e 20 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f  en called to pro
fb40: 62 65 20 66 6f 72 0d 0a 20 20 20 20 20 20 23 20  be for..      # 
fb50: 20 20 20 20 20 20 74 68 65 20 53 51 4c 69 74 65        the SQLite
fb60: 20 6e 61 74 69 76 65 20 6c 69 62 72 61 72 79 3b   native library;
fb70: 20 6f 74 68 65 72 77 69 73 65 2c 20 74 68 69 73   otherwise, this
fb80: 20 70 72 6f 63 65 64 75 72 65 20 77 69 6c 6c 20   procedure will 
fb90: 73 69 6d 70 6c 79 0d 0a 20 20 20 20 20 20 23 20  simply..      # 
fba0: 20 20 20 20 20 20 61 6c 77 61 79 73 20 72 65 74        always ret
fbb0: 75 72 6e 20 7a 65 72 6f 2e 0d 0a 20 20 20 20 20  urn zero...     
fbc0: 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e   #..      return
fbd0: 20 5b 65 78 70 72 20 7b 0d 0a 20 20 20 20 20 20   [expr {..      
fbe0: 20 20 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e    [haveConstrain
fbf0: 74 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  t System.Data.SQ
fc00: 4c 69 74 65 5d 20 26 26 20 5b 68 61 76 65 43 6f  Lite] && [haveCo
fc10: 6e 73 74 72 61 69 6e 74 20 53 51 4c 69 74 65 5d  nstraint SQLite]
fc20: 0d 0a 20 20 20 20 20 20 7d 5d 0d 0a 20 20 20 20  ..      }]..    
fc30: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 6d  }.....    proc m
fc40: 61 74 63 68 50 6c 61 74 66 6f 72 6d 20 7b 20 70  atchPlatform { p
fc50: 6c 61 74 66 6f 72 6d 20 7d 20 7b 0d 0a 20 20 20  latform } {..   
fc60: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
fc70: 54 45 3a 20 41 6e 20 65 6d 70 74 79 20 73 74 72  TE: An empty str
fc80: 69 6e 67 20 66 6f 72 20 74 68 65 20 70 6c 61 74  ing for the plat
fc90: 66 6f 72 6d 20 6d 65 61 6e 73 20 74 68 61 74 20  form means that 
fca0: 74 68 65 20 62 75 69 6c 64 20 69 73 20 6e 6f 74  the build is not
fcb0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
fcc0: 5b 70 72 69 6d 61 72 69 6c 79 5d 20 61 20 6e 61  [primarily] a na
fcd0: 74 69 76 65 20 62 75 69 6c 64 3b 20 74 68 65 72  tive build; ther
fce0: 65 66 6f 72 65 2c 20 69 74 20 61 6c 77 61 79 73  efore, it always
fcf0: 20 6d 61 74 63 68 65 73 2e 0d 0a 20 20 20 20 20   matches...     
fd00: 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73   #..      if {[s
fd10: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 70 6c  tring length $pl
fd20: 61 74 66 6f 72 6d 5d 20 3d 3d 20 30 7d 20 74 68  atform] == 0} th
fd30: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65  en {..        re
fd40: 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20  turn true..     
fd50: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   }....      #.. 
fd60: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20       # NOTE: If 
fd70: 74 68 65 20 6d 61 63 68 69 6e 65 20 6e 61 6d 65  the machine name
fd80: 20 69 73 20 75 6e 61 76 61 69 6c 61 62 6c 65 2c   is unavailable,
fd90: 20 74 68 65 72 65 20 69 73 20 6e 6f 74 68 69 6e   there is nothin
fda0: 67 20 65 6c 73 65 20 77 65 0d 0a 20 20 20 20 20  g else we..     
fdb0: 20 23 20 20 20 20 20 20 20 63 61 6e 20 64 6f 2e   #       can do.
fdc0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
fdd0: 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
fde0: 74 73 20 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72  ts ::tcl_platfor
fdf0: 6d 28 6d 61 63 68 69 6e 65 29 5d 7d 20 74 68 65  m(machine)]} the
fe00: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74  n {..        ret
fe10: 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20 20  urn false..     
fe20: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   }....      #.. 
fe30: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 44 6f 65       # NOTE: Doe
fe40: 73 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  s the specified 
fe50: 70 6c 61 74 66 6f 72 6d 20 6d 61 74 63 68 20 75  platform match u
fe60: 70 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74  p to the current
fe70: 20 70 72 6f 63 65 73 73 3f 0d 0a 20 20 20 20 20   process?..     
fe80: 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 70   #..      if {$p
fe90: 6c 61 74 66 6f 72 6d 20 65 71 20 5b 6d 61 63 68  latform eq [mach
fea0: 69 6e 65 54 6f 50 6c 61 74 66 6f 72 6d 20 24 3a  ineToPlatform $:
feb0: 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 6d 61  :tcl_platform(ma
fec0: 63 68 69 6e 65 29 5d 7d 20 74 68 65 6e 20 7b 0d  chine)]} then {.
fed0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
fee0: 74 72 75 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  true..      }...
fef0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
ff00: 23 20 4e 4f 54 45 3a 20 54 68 65 20 73 70 65 63  # NOTE: The spec
ff10: 69 66 69 65 64 20 70 6c 61 74 66 6f 72 6d 20 64  ified platform d
ff20: 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 75 70  oes not match up
ff30: 20 77 69 74 68 20 74 68 65 20 70 6c 61 74 66 6f   with the platfo
ff40: 72 6d 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  rm..      #     
ff50: 20 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e    for the curren
ff60: 74 20 70 72 6f 63 65 73 73 2e 0d 0a 20 20 20 20  t process...    
ff70: 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75 72    #..      retur
ff80: 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20 7d 0d 0a  n false..    }..
ff90: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 68 61 76 65  ...    proc have
ffa0: 53 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d  SQLiteObjectComm
ffb0: 61 6e 64 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20  and {} {..      
ffc0: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
ffd0: 20 49 73 20 74 68 65 20 5b 6f 62 6a 65 63 74 5d   Is the [object]
ffe0: 20 63 6f 6d 6d 61 6e 64 20 63 75 72 72 65 6e 74   command current
fff0: 6c 79 20 61 76 61 69 6c 61 62 6c 65 3f 0d 0a 20  ly available?.. 
10000 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65       #..      re
10010 74 75 72 6e 20 5b 65 78 70 72 20 7b 5b 6c 6c 65  turn [expr {[lle
10020 6e 67 74 68 20 5b 69 6e 66 6f 20 63 6f 6d 6d 61  ngth [info comma
10030 6e 64 73 20 6f 62 6a 65 63 74 5d 5d 20 3e 20 30  nds object]] > 0
10040 7d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  }]..    }.....  
10050 20 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72 53    proc checkForS
10060 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61  QLiteObjectComma
10070 6e 64 20 7b 20 63 68 61 6e 6e 65 6c 20 7d 20 7b  nd { channel } {
10080 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20 24 63  ..      tputs $c
10090 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 68 65  hannel "---- che
100a0 63 6b 69 6e 67 20 66 6f 72 20 5c 22 6f 62 6a 65  cking for \"obje
100b0 63 74 5c 22 20 63 6f 6d 6d 61 6e 64 20 75 73 61  ct\" command usa
100c0 67 65 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20  ge... "....     
100d0 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
100e0 74 73 20 3a 3a 6e 6f 28 73 71 6c 69 74 65 4f 62  ts ::no(sqliteOb
100f0 6a 65 63 74 43 6f 6d 6d 61 6e 64 29 5d 20 26 26  jectCommand)] &&
10100 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 68   \..          [h
10110 61 76 65 53 51 4c 69 74 65 4f 62 6a 65 63 74 43  aveSQLiteObjectC
10120 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65 6e 20 7b 0d  ommand]} then {.
10130 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
10140 63 68 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20  channel yes\n.. 
10150 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
10160 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
10170 20 20 23 20 4e 4f 54 45 3a 20 55 6e 6c 65 73 73    # NOTE: Unless
10180 20 77 65 20 61 72 65 20 66 6f 72 62 69 64 64 65   we are forbidde
10190 6e 20 66 72 6f 6d 20 64 6f 69 6e 67 20 73 6f 2c  n from doing so,
101a0 20 61 64 64 20 73 6f 6d 65 20 63 6f 6e 73 74 72   add some constr
101b0 61 69 6e 74 73 0d 0a 20 20 20 20 20 20 20 20 23  aints..        #
101c0 20 20 20 20 20 20 20 74 68 61 74 20 77 69 6c 6c         that will
101d0 20 61 6c 6c 6f 77 20 6d 6f 73 74 20 6f 66 20 74   allow most of t
101e0 68 65 20 74 65 73 74 20 73 75 69 74 65 20 74 6f  he test suite to
101f0 20 72 75 6e 20 28 69 2e 65 2e 20 74 68 6f 73 65   run (i.e. those
10200 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
10210 20 20 74 65 73 74 73 20 74 68 61 74 20 64 6f 20    tests that do 
10220 6e 6f 74 20 64 69 72 65 63 74 6c 79 20 72 65 6c  not directly rel
10230 79 20 75 70 6f 6e 20 74 68 65 20 5b 6f 62 6a 65  y upon the [obje
10240 63 74 5d 20 63 6f 6d 6d 61 6e 64 29 2e 0d 0a 20  ct] command)... 
10250 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
10260 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
10270 73 74 73 20 3a 3a 6e 6f 28 73 68 69 6d 53 51 4c  sts ::no(shimSQL
10280 69 74 65 41 73 73 65 6d 62 6c 79 43 6f 6e 73 74  iteAssemblyConst
10290 72 61 69 6e 74 73 29 5d 7d 20 74 68 65 6e 20 7b  raints)]} then {
102a0 0d 0a 20 20 20 20 20 20 20 20 20 20 61 64 64 43  ..          addC
102b0 6f 6e 73 74 72 61 69 6e 74 20 53 51 4c 69 74 65  onstraint SQLite
102c0 0d 0a 20 20 20 20 20 20 20 20 20 20 61 64 64 43  ..          addC
102d0 6f 6e 73 74 72 61 69 6e 74 20 53 51 4c 69 74 65  onstraint SQLite
102e0 49 6e 74 65 72 6f 70 0d 0a 20 20 20 20 20 20 20  Interop..       
102f0 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74     addConstraint
10300 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
10310 69 74 65 0d 0a 20 20 20 20 20 20 20 20 20 20 61  ite..          a
10320 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 53 79 73  ddConstraint Sys
10330 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
10340 45 6e 63 72 79 70 74 69 6f 6e 0d 0a 20 20 20 20  Encryption..    
10350 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61        addConstra
10360 69 6e 74 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  int System.Data.
10370 53 51 4c 69 74 65 2e 4c 69 6e 71 0d 0a 0d 0a 20  SQLite.Linq.... 
10380 20 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73           addCons
10390 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
103a0 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
103b0 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e      System.Data.
103c0 53 51 4c 69 74 65 2e 64 6c 6c 5f 76 20 5b 67 65  SQLite.dll_v [ge
103d0 74 42 75 69 6c 64 43 6c 72 56 65 72 73 69 6f 6e  tBuildClrVersion
103e0 5d 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  ]]..        }...
103f0 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69  .        if {![i
10400 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
10410 73 68 69 6d 53 51 4c 69 74 65 44 65 66 69 6e 65  shimSQLiteDefine
10420 43 6f 6e 73 74 61 6e 74 43 6f 6e 73 74 72 61 69  ConstantConstrai
10430 6e 74 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  nts)]} then {.. 
10440 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
10450 20 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 20   defineConstant 
10460 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 20  [list \..       
10470 20 20 20 20 20 20 20 49 4e 54 45 52 4f 50 5f 45         INTEROP_E
10480 58 54 45 4e 53 49 4f 4e 5f 46 55 4e 43 54 49 4f  XTENSION_FUNCTIO
10490 4e 53 20 49 4e 54 45 52 4f 50 5f 46 54 53 35 5f  NS INTEROP_FTS5_
104a0 45 58 54 45 4e 53 49 4f 4e 20 5c 0d 0a 20 20 20  EXTENSION \..   
104b0 20 20 20 20 20 20 20 20 20 20 20 49 4e 54 45 52             INTER
104c0 4f 50 5f 4a 53 4f 4e 31 5f 45 58 54 45 4e 53 49  OP_JSON1_EXTENSI
104d0 4f 4e 20 49 4e 54 45 52 4f 50 5f 50 45 52 43 45  ON INTEROP_PERCE
104e0 4e 54 49 4c 45 5f 45 58 54 45 4e 53 49 4f 4e 20  NTILE_EXTENSION 
104f0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
10500 20 49 4e 54 45 52 4f 50 5f 52 45 47 45 58 50 5f   INTEROP_REGEXP_
10510 45 58 54 45 4e 53 49 4f 4e 20 49 4e 54 45 52 4f  EXTENSION INTERO
10520 50 5f 54 45 53 54 5f 45 58 54 45 4e 53 49 4f 4e  P_TEST_EXTENSION
10530 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
10540 20 20 49 4e 54 45 52 4f 50 5f 53 45 53 53 49 4f    INTEROP_SESSIO
10550 4e 5f 45 58 54 45 4e 53 49 4f 4e 20 49 4e 54 45  N_EXTENSION INTE
10560 52 4f 50 5f 53 48 41 31 5f 45 58 54 45 4e 53 49  ROP_SHA1_EXTENSI
10570 4f 4e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ON \..          
10580 20 20 20 20 49 4e 54 45 52 4f 50 5f 54 4f 54 59      INTEROP_TOTY
10590 50 45 5f 45 58 54 45 4e 53 49 4f 4e 20 49 4e 54  PE_EXTENSION INT
105a0 45 52 4f 50 5f 56 49 52 54 55 41 4c 5f 54 41 42  EROP_VIRTUAL_TAB
105b0 4c 45 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  LE \..          
105c0 20 20 20 20 55 53 45 5f 49 4e 54 45 52 4f 50 5f      USE_INTEROP_
105d0 44 4c 4c 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20  DLL] {..        
105e0 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e      addConstrain
105f0 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  t [appendArgs \.
10600 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10610 20 5b 67 65 74 53 51 4c 69 74 65 44 65 66 69 6e   [getSQLiteDefin
10620 65 43 6f 6e 73 74 61 6e 74 50 72 65 66 69 78 5d  eConstantPrefix]
10630 20 24 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74   $defineConstant
10640 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ]..          }..
10650 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
10660 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
10670 65 78 69 73 74 73 20 3a 3a 6e 6f 28 73 68 69 6d  exists ::no(shim
10680 53 51 4c 69 74 65 56 69 73 75 61 6c 53 74 75 64  SQLiteVisualStud
10690 69 6f 43 6f 6e 73 74 72 61 69 6e 74 73 29 5d 7d  ioConstraints)]}
106a0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
106b0 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74     addConstraint
106c0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 76 69 73   [appendArgs vis
106d0 75 61 6c 53 74 75 64 69 6f 20 5b 67 65 74 42 75  ualStudio [getBu
106e0 69 6c 64 59 65 61 72 5d 5d 0d 0a 20 20 20 20 20  ildYear]]..     
106f0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
10700 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e  tputs $channel n
10710 6f 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  o\n..      }..  
10720 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
10730 20 63 68 61 6e 67 65 4e 61 74 69 76 65 52 75 6e   changeNativeRun
10740 74 69 6d 65 4f 70 74 69 6f 6e 20 7b 20 6e 61 74  timeOption { nat
10750 69 76 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20 69  ive } {..      i
10760 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 5b 69 6e 66  f {[llength [inf
10770 6f 20 63 6f 6d 6d 61 6e 64 73 20 64 65 62 75 67  o commands debug
10780 5d 5d 20 3e 20 30 20 26 26 20 5c 0d 0a 20 20 20  ]] > 0 && \..   
10790 20 20 20 20 20 20 20 5b 6c 6c 65 6e 67 74 68 20         [llength 
107a0 5b 69 6e 66 6f 20 73 75 62 63 6f 6d 6d 61 6e 64  [info subcommand
107b0 73 20 64 65 62 75 67 20 72 75 6e 74 69 6d 65 6f  s debug runtimeo
107c0 70 74 69 6f 6e 5d 5d 20 3e 20 30 20 26 26 20 5b  ption]] > 0 && [
107d0 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
107e0 20 64 65 62 75 67 20 72 75 6e 74 69 6d 65 6f 70   debug runtimeop
107f0 74 69 6f 6e 20 5b 65 78 70 72 20 7b 24 6e 61 74  tion [expr {$nat
10800 69 76 65 20 3f 20 22 61 64 64 22 20 3a 20 22 72  ive ? "add" : "r
10810 65 6d 6f 76 65 22 7d 5d 20 6e 61 74 69 76 65 0d  emove"}] native.
10820 0a 20 20 20 20 20 20 7d 5d 20 3d 3d 20 30 7d 20  .      }] == 0} 
10830 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
10840 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20  return true..   
10850 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66     }....      if
10860 20 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f 62 6a   {[haveSQLiteObj
10870 65 63 74 43 6f 6d 6d 61 6e 64 5d 20 26 26 20 5b  ectCommand] && [
10880 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
10890 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 49   object invoke I
108a0 6e 74 65 72 70 72 65 74 65 72 2e 47 65 74 41 63  nterpreter.GetAc
108b0 74 69 76 65 20 5b 65 78 70 72 20 7b 24 6e 61 74  tive [expr {$nat
108c0 69 76 65 20 3f 20 5c 0d 0a 20 20 20 20 20 20 20  ive ? \..       
108d0 20 20 20 20 20 22 41 64 64 52 75 6e 74 69 6d 65       "AddRuntime
108e0 4f 70 74 69 6f 6e 22 20 3a 20 22 52 65 6d 6f 76  Option" : "Remov
108f0 65 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 22 7d  eRuntimeOption"}
10900 5d 20 6e 61 74 69 76 65 0d 0a 20 20 20 20 20 20  ] native..      
10910 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  }] == 0} then {.
10920 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
10930 74 72 75 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  true..      }...
10940 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61  .      return fa
10950 6c 73 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20  lse..    }..... 
10960 20 20 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72     proc checkFor
10970 53 51 4c 69 74 65 42 75 69 6c 64 73 20 7b 20 63  SQLiteBuilds { c
10980 68 61 6e 6e 65 6c 20 7b 73 65 6c 65 63 74 20 66  hannel {select f
10990 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  alse} } {..     
109a0 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
109b0 3a 20 43 68 65 63 6b 20 66 6f 72 20 65 76 65 72  : Check for ever
109c0 79 20 70 6f 73 73 69 62 6c 65 20 76 61 6c 69 64  y possible valid
109d0 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20   combination of 
109e0 76 61 6c 75 65 73 20 75 73 65 64 20 77 68 65 6e  values used when
109f0 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
10a00 6c 6f 63 61 74 69 6e 67 20 6f 75 74 20 74 68 65  locating out the
10a10 20 62 75 69 6c 64 20 6f 75 74 70 75 74 20 64 69   build output di
10a20 72 65 63 74 6f 72 79 2c 20 73 68 6f 77 69 6e 67  rectory, showing
10a30 20 65 61 63 68 20 61 76 61 69 6c 61 62 6c 65 0d   each available.
10a40 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62  .      #       b
10a50 75 69 6c 64 20 76 61 72 69 61 74 69 6f 6e 20 61  uild variation a
10a60 6c 6f 6e 67 20 74 68 65 20 77 61 79 2e 0d 0a 20  long the way... 
10a70 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 66 6f       #..      fo
10a80 72 65 61 63 68 20 6e 61 74 69 76 65 20 5b 6c 69  reach native [li
10a90 73 74 20 66 61 6c 73 65 20 74 72 75 65 5d 20 7b  st false true] {
10aa0 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63  ..        foreac
10ab0 68 20 79 65 61 72 20 5b 67 65 74 42 75 69 6c 64  h year [getBuild
10ac0 59 65 61 72 73 5d 20 7b 0d 0a 20 20 20 20 20 20  Years] {..      
10ad0 20 20 20 20 66 6f 72 65 61 63 68 20 63 6f 6e 66      foreach conf
10ae0 69 67 75 72 61 74 69 6f 6e 20 5b 67 65 74 42 75  iguration [getBu
10af0 69 6c 64 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e  ildConfiguration
10b00 73 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  s] {..          
10b10 20 20 66 6f 72 65 61 63 68 20 73 75 66 66 69 78    foreach suffix
10b20 20 5b 67 65 74 42 75 69 6c 64 43 6f 6e 66 69 67   [getBuildConfig
10b30 75 72 61 74 69 6f 6e 53 75 66 66 69 78 65 73 5d  urationSuffixes]
10b40 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
10b50 20 20 66 6f 72 65 61 63 68 20 65 78 74 72 61 20    foreach extra 
10b60 5b 67 65 74 42 75 69 6c 64 45 78 74 72 61 73 5d  [getBuildExtras]
10b70 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
10b80 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
10b90 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46         # NOTE: F
10ba0 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 65 66  igure out the ef
10bb0 66 65 63 74 69 76 65 20 62 75 69 6c 64 20 70 6c  fective build pl
10bc0 61 74 66 6f 72 6d 2e 20 20 54 68 69 73 20 69 73  atform.  This is
10bd0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
10be0 20 20 23 20 20 20 20 20 20 20 62 61 73 65 64 20    #       based 
10bf0 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  on whether or no
10c00 74 20 61 20 5b 70 72 69 6d 61 72 69 6c 79 5d 20  t a [primarily] 
10c10 6e 61 74 69 76 65 20 62 75 69 6c 64 0d 0a 20 20  native build..  
10c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
10c30 20 20 20 20 20 20 69 73 20 62 65 69 6e 67 20 75        is being u
10c40 73 65 64 2e 20 20 46 6f 72 20 5b 70 72 69 6d 61  sed.  For [prima
10c50 72 69 6c 79 5d 20 6e 6f 6e 2d 6e 61 74 69 76 65  rily] non-native
10c60 20 62 75 69 6c 64 73 2c 0d 0a 20 20 20 20 20 20   builds,..      
10c70 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
10c80 20 20 74 68 69 73 20 77 69 6c 6c 20 62 65 20 61    this will be a
10c90 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e 0d  n empty string..
10ca0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10cb0 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
10cc0 20 20 20 20 73 65 74 20 70 6c 61 74 66 6f 72 6d      set platform
10cd0 20 5b 67 65 74 42 75 69 6c 64 50 6c 61 74 66 6f   [getBuildPlatfo
10ce0 72 6d 20 24 6e 61 74 69 76 65 5d 0d 0a 0d 0a 20  rm $native].... 
10cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
10d00 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
10d10 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20    # NOTE: Build 
10d20 74 68 65 20 66 75 6c 6c 79 20 71 75 61 6c 69 66  the fully qualif
10d30 69 65 64 20 64 69 72 65 63 74 6f 72 79 20 77 68  ied directory wh
10d40 65 72 65 20 74 68 65 0d 0a 20 20 20 20 20 20 20  ere the..       
10d50 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
10d60 20 6e 65 63 65 73 73 61 72 79 20 63 6f 6d 70 6f   necessary compo
10d70 6e 65 6e 74 73 20 66 6f 72 20 53 79 73 74 65 6d  nents for System
10d80 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 73 68 6f  .Data.SQLite sho
10d90 75 6c 64 0d 0a 20 20 20 20 20 20 20 20 20 20 20  uld..           
10da0 20 20 20 20 20 23 20 20 20 20 20 20 20 62 65 20       #       be 
10db0 66 6f 75 6e 64 2e 0d 0a 20 20 20 20 20 20 20 20  found...        
10dc0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
10dd0 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 64             set d
10de0 69 72 65 63 74 6f 72 79 20 5b 6a 6f 69 6e 42 75  irectory [joinBu
10df0 69 6c 64 44 69 72 65 63 74 6f 72 79 20 24 6e 61  ildDirectory $na
10e00 74 69 76 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  tive \..        
10e10 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74              [get
10e20 42 75 69 6c 64 42 61 73 65 44 69 72 65 63 74 6f  BuildBaseDirecto
10e30 72 79 5d 20 24 79 65 61 72 20 24 70 6c 61 74 66  ry] $year $platf
10e40 6f 72 6d 20 5b 61 70 70 65 6e 64 41 72 67 73 20  orm [appendArgs 
10e50 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
10e60 20 20 20 20 20 20 20 24 63 6f 6e 66 69 67 75 72         $configur
10e70 61 74 69 6f 6e 20 24 73 75 66 66 69 78 5d 20 24  ation $suffix] $
10e80 65 78 74 72 61 5d 0d 0a 0d 0a 20 20 20 20 20 20  extra]....      
10e90 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
10ea0 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
10eb0 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
10ec0 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
10ed0 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 53  - checking for S
10ee0 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
10ef0 65 20 62 75 69 6c 64 20 5c 22 22 20 5b 65 78 70  e build \"" [exp
10f00 72 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  r \..           
10f10 20 20 20 20 20 20 20 20 20 7b 24 6e 61 74 69 76           {$nativ
10f20 65 20 3f 20 22 6e 61 74 69 76 65 2f 22 20 3a 20  e ? "native/" : 
10f30 22 22 7d 5d 20 5b 65 78 70 72 20 7b 5b 73 74 72  ""}] [expr {[str
10f40 69 6e 67 20 6c 65 6e 67 74 68 20 5c 0d 0a 20 20  ing length \..  
10f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f60 20 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3e 20 30    $platform] > 0
10f70 20 3f 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24   ? [appendArgs $
10f80 70 6c 61 74 66 6f 72 6d 20 2f 5d 20 3a 20 22 22  platform /] : ""
10f90 7d 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  }] \..          
10fa0 20 20 20 20 20 20 20 20 20 20 24 79 65 61 72 20            $year 
10fb0 2f 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 63  / [appendArgs $c
10fc0 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 24 73 75  onfiguration $su
10fd0 66 66 69 78 5d 20 22 5c 22 2e 2e 2e 20 22 5d 0d  ffix] "\"... "].
10fe0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
10ff0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
11000 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 44 6f        # NOTE: Do
11010 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 66   the necessary f
11020 69 6c 65 73 20 65 78 69 73 74 3f 20 20 43 75 72  iles exist?  Cur
11030 72 65 6e 74 6c 79 2c 20 6e 6f 20 6f 74 68 65 72  rently, no other
11040 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
11050 20 20 23 20 20 20 20 20 20 20 73 74 65 70 73 20    #       steps 
11060 61 72 65 20 74 61 6b 65 6e 20 74 6f 20 76 65 72  are taken to ver
11070 69 66 79 20 74 68 69 73 20 62 75 69 6c 64 20 69  ify this build i
11080 73 20 61 63 74 75 61 6c 6c 79 0d 0a 20 20 20 20  s actually..    
11090 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20              #   
110a0 20 20 20 20 76 69 61 62 6c 65 2e 0d 0a 20 20 20      viable...   
110b0 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a               #..
110c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
110d0 73 65 74 20 73 6b 69 70 4e 61 74 69 76 65 20 5b  set skipNative [
110e0 65 78 70 72 20 7b 5b 69 73 44 6f 74 4e 65 74 43  expr {[isDotNetC
110f0 6f 72 65 5d 20 26 26 20 5b 69 73 57 69 6e 64 6f  ore] && [isWindo
11100 77 73 5d 7d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  ws]}]....       
11110 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69 73           if {[is
11120 42 75 69 6c 64 41 76 61 69 6c 61 62 6c 65 20 24  BuildAvailable $
11130 6e 61 74 69 76 65 20 24 73 6b 69 70 4e 61 74 69  native $skipNati
11140 76 65 20 24 64 69 72 65 63 74 6f 72 79 5d 7d 20  ve $directory]} 
11150 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
11160 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
11170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
11180 20 4e 4f 54 45 3a 20 57 68 65 6e 20 69 6e 20 22   NOTE: When in "
11190 73 65 6c 65 63 74 22 20 6d 6f 64 65 2c 20 61 75  select" mode, au
111a0 74 6f 6d 61 74 69 63 61 6c 6c 79 20 73 65 6c 65  tomatically sele
111b0 63 74 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20  ct the..        
111c0 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
111d0 20 20 66 69 72 73 74 20 61 76 61 69 6c 61 62 6c    first availabl
111e0 65 20 62 75 69 6c 64 20 6f 66 20 53 79 73 74 65  e build of Syste
111f0 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 61 6e  m.Data.SQLite an
11200 64 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d..             
11210 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
11220 6e 20 72 65 74 75 72 6e 20 69 6d 6d 65 64 69 61  n return immedia
11230 74 65 6c 79 2e 0d 0a 20 20 20 20 20 20 20 20 20  tely...         
11240 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
11250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
11260 20 7b 24 73 65 6c 65 63 74 20 26 26 20 5b 6d 61   {$select && [ma
11270 74 63 68 50 6c 61 74 66 6f 72 6d 20 24 70 6c 61  tchPlatform $pla
11280 74 66 6f 72 6d 5d 7d 20 74 68 65 6e 20 7b 0d 0a  tform]} then {..
11290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
112a0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
112b0 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
112c0 45 3a 20 4d 61 6e 75 61 6c 6c 79 20 6f 76 65 72  E: Manually over
112d0 72 69 64 65 20 61 6c 6c 20 74 68 65 20 62 75 69  ride all the bui
112e0 6c 64 20 64 69 72 65 63 74 6f 72 79 0d 0a 20 20  ld directory..  
112f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11300 20 20 23 20 20 20 20 20 20 20 73 65 6c 65 63 74    #       select
11310 69 6f 6e 20 72 65 6c 61 74 65 64 20 74 65 73 74  ion related test
11320 20 73 65 74 74 69 6e 67 73 20 69 6e 20 6f 72 64   settings in ord
11330 65 72 20 74 6f 0d 0a 20 20 20 20 20 20 20 20 20  er to..         
11340 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20             #    
11350 20 20 20 66 6f 72 63 65 20 74 68 69 73 20 62 75     force this bu
11360 69 6c 64 20 6f 66 20 53 79 73 74 65 6d 2e 44 61  ild of System.Da
11370 74 61 2e 53 51 4c 69 74 65 20 74 6f 20 62 65 0d  ta.SQLite to be.
11380 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11390 20 20 20 20 20 23 20 20 20 20 20 20 20 75 73 65       #       use
113a0 64 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  d...            
113b0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
113c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
113d0 66 20 7b 21 5b 63 68 61 6e 67 65 4e 61 74 69 76  f {![changeNativ
113e0 65 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 24  eRuntimeOption $
113f0 6e 61 74 69 76 65 5d 7d 20 74 68 65 6e 20 7b 0d  native]} then {.
11400 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11410 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
11420 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
11430 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
11440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
11450 6e 6f 2c 20 66 61 69 6c 65 64 20 74 6f 20 22 20  no, failed to " 
11460 5b 65 78 70 72 20 7b 24 6e 61 74 69 76 65 20 3f  [expr {$native ?
11470 20 22 61 64 64 22 20 3a 20 5c 0d 0a 20 20 20 20   "add" : \..    
11480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11490 20 20 20 20 20 20 22 72 65 6d 6f 76 65 22 7d 5d        "remove"}]
114a0 20 22 20 74 68 65 20 5c 22 6e 61 74 69 76 65 5c   " the \"native\
114b0 22 20 72 75 6e 74 69 6d 65 20 6f 70 74 69 6f 6e  " runtime option
114c0 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  \n"]....        
114d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
114e0 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20  turn false..    
114f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11500 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
11510 20 20 20 20 20 20 20 20 20 73 65 74 20 3a 3a 74           set ::t
11520 65 73 74 5f 6e 61 74 69 76 65 20 24 73 6b 69 70  est_native $skip
11530 4e 61 74 69 76 65 0d 0a 20 20 20 20 20 20 20 20  Native..        
11540 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
11550 3a 3a 74 65 73 74 5f 79 65 61 72 20 24 79 65 61  ::test_year $yea
11560 72 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  r....           
11570 20 20 20 20 20 20 20 20 20 73 65 74 20 3a 3a 74           set ::t
11580 65 73 74 5f 6e 61 74 69 76 65 5f 79 65 61 72 20  est_native_year 
11590 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
115a0 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 42             [getB
115b0 75 69 6c 64 4e 61 74 69 76 65 59 65 61 72 46 6f  uildNativeYearFo
115c0 72 44 6f 74 4e 65 74 43 6f 72 65 20 24 79 65 61  rDotNetCore $yea
115d0 72 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  r]....          
115e0 20 20 20 20 20 20 20 20 20 20 73 65 74 20 3a 3a            set ::
115f0 74 65 73 74 5f 70 6c 61 74 66 6f 72 6d 20 24 70  test_platform $p
11600 6c 61 74 66 6f 72 6d 0d 0a 20 20 20 20 20 20 20  latform..       
11610 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74               set
11620 20 3a 3a 74 65 73 74 5f 63 6f 6e 66 69 67 75 72   ::test_configur
11630 61 74 69 6f 6e 20 24 63 6f 6e 66 69 67 75 72 61  ation $configura
11640 74 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20 20 20  tion..          
11650 20 20 20 20 20 20 20 20 20 20 73 65 74 20 3a 3a            set ::
11660 74 65 73 74 5f 63 6f 6e 66 69 67 75 72 61 74 69  test_configurati
11670 6f 6e 5f 73 75 66 66 69 78 20 24 73 75 66 66 69  on_suffix $suffi
11680 78 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  x....           
11690 20 20 20 20 20 20 20 20 20 73 65 74 20 3a 3a 74           set ::t
116a0 65 73 74 5f 6e 61 74 69 76 65 5f 63 6f 6e 66 69  est_native_confi
116b0 67 75 72 61 74 69 6f 6e 5f 73 75 66 66 69 78 20  guration_suffix 
116c0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
116d0 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 42             [getB
116e0 75 69 6c 64 4e 61 74 69 76 65 43 6f 6e 66 69 67  uildNativeConfig
116f0 75 72 61 74 69 6f 6e 53 75 66 66 69 78 46 6f 72  urationSuffixFor
11700 44 6f 74 4e 65 74 43 6f 72 65 20 5c 0d 0a 20 20  DotNetCore \..  
11710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11720 20 20 20 20 20 20 24 73 75 66 66 69 78 5d 0d 0a        $suffix]..
11730 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
11740 20 20 20 20 20 20 73 65 74 20 3a 3a 74 65 73 74        set ::test
11750 5f 65 78 74 72 61 20 24 65 78 74 72 61 0d 0a 0d  _extra $extra...
11760 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11770 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
11780 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
11790 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
117a0 20 20 20 20 20 20 20 20 20 20 20 22 79 65 73 2c             "yes,
117b0 20 73 65 6c 65 63 74 65 64 20 28 22 20 5b 65 78   selected (" [ex
117c0 70 72 20 7b 24 6e 61 74 69 76 65 20 3f 20 22 6e  pr {$native ? "n
117d0 61 74 69 76 65 2f 22 20 3a 20 22 22 7d 5d 20 5c  ative/" : ""}] \
117e0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
117f0 20 20 20 20 20 20 20 20 20 20 5b 65 78 70 72 20            [expr 
11800 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
11810 24 70 6c 61 74 66 6f 72 6d 5d 20 3e 20 30 20 3f  $platform] > 0 ?
11820 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
11830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11840 20 20 20 20 20 20 20 20 24 70 6c 61 74 66 6f 72          $platfor
11850 6d 20 2f 5d 20 3a 20 22 22 7d 5d 20 24 79 65 61  m /] : ""}] $yea
11860 72 20 2f 20 5b 61 70 70 65 6e 64 41 72 67 73 20  r / [appendArgs 
11870 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
11880 20 20 20 20 20 20 20 20 20 20 20 24 63 6f 6e 66             $conf
11890 69 67 75 72 61 74 69 6f 6e 20 24 73 75 66 66 69  iguration $suffi
118a0 78 5d 20 5b 65 78 70 72 20 7b 5b 73 74 72 69 6e  x] [expr {[strin
118b0 67 20 6c 65 6e 67 74 68 20 5c 0d 0a 20 20 20 20  g length \..    
118c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
118d0 20 20 20 20 24 65 78 74 72 61 5d 20 3e 20 30 20      $extra] > 0 
118e0 3f 20 5b 61 70 70 65 6e 64 41 72 67 73 20 2f 20  ? [appendArgs / 
118f0 24 65 78 74 72 61 5d 20 3a 20 22 22 7d 5d 20 22  $extra] : ""}] "
11900 29 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  )\n"]....       
11910 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
11920 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20  urn true..      
11930 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c              } el
11940 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
11950 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
11960 24 63 68 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a  $channel yes\n..
11970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11980 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
11990 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
119a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
119b0 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
119c0 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20 20  no\n..          
119d0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
119e0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
119f0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
11a00 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
11a10 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
11a20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a    return false..
11a30 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
11a40 6f 63 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74  oc checkForSQLit
11a50 65 52 65 6c 65 61 73 65 73 20 7b 20 63 68 61 6e  eReleases { chan
11a60 6e 65 6c 20 7b 73 65 6c 65 63 74 20 66 61 6c 73  nel {select fals
11a70 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  e} } {..      #.
11a80 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43  .      # NOTE: C
11a90 68 65 63 6b 20 66 6f 72 20 70 61 73 74 20 72 65  heck for past re
11aa0 6c 65 61 73 65 73 20 6f 66 20 53 79 73 74 65 6d  leases of System
11ab0 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 69 6e 20  .Data.SQLite in 
11ac0 74 68 65 20 64 69 72 65 63 74 6f 72 79 0d 0a 20  the directory.. 
11ad0 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e       #       con
11ae0 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 22 53  tained in the "S
11af0 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
11b00 65 22 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76  e" environment v
11b10 61 72 69 61 62 6c 65 2c 20 69 66 0d 0a 20 20 20  ariable, if..   
11b20 20 20 20 23 20 20 20 20 20 20 20 70 72 65 73 65     #       prese
11b30 6e 74 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  nt...      #..  
11b40 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
11b50 69 73 74 73 20 3a 3a 65 6e 76 28 53 79 73 74 65  ists ::env(Syste
11b60 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 29 5d 20  m.Data.SQLite)] 
11b70 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
11b80 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
11b90 3a 3a 65 6e 76 28 53 79 73 74 65 6d 2e 44 61 74  ::env(System.Dat
11ba0 61 2e 53 51 4c 69 74 65 29 5d 20 3e 20 30 7d 20  a.SQLite)] > 0} 
11bb0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
11bc0 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
11bd0 45 3a 20 42 75 69 6c 64 20 74 68 65 20 66 75 6c  E: Build the ful
11be0 6c 79 20 71 75 61 6c 69 66 69 65 64 20 64 69 72  ly qualified dir
11bf0 65 63 74 6f 72 79 20 77 68 65 72 65 20 74 68 65  ectory where the
11c00 20 6e 65 63 65 73 73 61 72 79 0d 0a 20 20 20 20   necessary..    
11c10 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 6d 70      #       comp
11c20 6f 6e 65 6e 74 73 20 66 6f 72 20 53 79 73 74 65  onents for Syste
11c30 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 73 68  m.Data.SQLite sh
11c40 6f 75 6c 64 20 62 65 20 66 6f 75 6e 64 2e 0d 0a  ould be found...
11c50 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
11c60 20 20 20 73 65 74 20 64 69 72 65 63 74 6f 72 79     set directory
11c70 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d   [file nativenam
11c80 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a  e [file join \..
11c90 20 20 20 20 20 20 20 20 20 20 20 20 24 3a 3a 65              $::e
11ca0 6e 76 28 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  nv(System.Data.S
11cb0 51 4c 69 74 65 29 20 5b 67 65 74 52 65 6c 65 61  QLite) [getRelea
11cc0 73 65 56 65 72 73 69 6f 6e 5d 5d 5d 0d 0a 0d 0a  seVersion]]]....
11cd0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
11ce0 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
11cf0 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
11d00 20 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67    "---- checking
11d10 20 66 6f 72 20 53 79 73 74 65 6d 2e 44 61 74 61   for System.Data
11d20 2e 53 51 4c 69 74 65 20 72 65 6c 65 61 73 65 20  .SQLite release 
11d30 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  \"" \..         
11d40 20 20 20 24 64 69 72 65 63 74 6f 72 79 20 22 5c     $directory "\
11d50 22 2e 2e 2e 20 22 5d 0d 0a 0d 0a 20 20 20 20 20  "... "]....     
11d60 20 20 20 69 66 20 7b 5b 69 73 52 65 6c 65 61 73     if {[isReleas
11d70 65 41 76 61 69 6c 61 62 6c 65 20 24 64 69 72 65  eAvailable $dire
11d80 63 74 6f 72 79 20 70 6c 61 74 66 6f 72 6d 5d 7d  ctory platform]}
11d90 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
11da0 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
11db0 65 6e 67 74 68 20 24 70 6c 61 74 66 6f 72 6d 5d  ength $platform]
11dc0 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
11dd0 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 70             set p
11de0 6c 61 74 66 6f 72 6d 20 75 6e 6b 6e 6f 77 6e 0d  latform unknown.
11df0 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  .          }....
11e00 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 24 73            if {$s
11e10 65 6c 65 63 74 20 26 26 20 5b 6d 61 74 63 68 50  elect && [matchP
11e20 6c 61 74 66 6f 72 6d 20 24 70 6c 61 74 66 6f 72  latform $platfor
11e30 6d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  m]} then {..    
11e40 20 20 20 20 20 20 20 20 73 65 74 20 3a 3a 62 75          set ::bu
11e50 69 6c 64 5f 64 69 72 65 63 74 6f 72 79 20 24 64  ild_directory $d
11e60 69 72 65 63 74 6f 72 79 0d 0a 0d 0a 20 20 20 20  irectory....    
11e70 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
11e80 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
11e90 67 73 20 22 79 65 73 2c 20 73 65 6c 65 63 74 65  gs "yes, selecte
11ea0 64 20 28 22 20 24 70 6c 61 74 66 6f 72 6d 20 22  d (" $platform "
11eb0 29 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  )\n"]....       
11ec0 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65       return true
11ed0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c  ..          } el
11ee0 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
11ef0 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
11f00 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 79 65   [appendArgs "ye
11f10 73 20 28 22 20 24 70 6c 61 74 66 6f 72 6d 20 22  s (" $platform "
11f20 29 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20  )\n"]..         
11f30 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c   }..        } el
11f40 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
11f50 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e  tputs $channel n
11f60 6f 5c 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  o\n....         
11f70 20 69 66 20 7b 21 5b 66 69 6c 65 20 65 78 69 73   if {![file exis
11f80 74 73 20 24 64 69 72 65 63 74 6f 72 79 5d 20 7c  ts $directory] |
11f90 7c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  | \..           
11fa0 20 20 20 21 5b 66 69 6c 65 20 69 73 64 69 72 65     ![file isdire
11fb0 63 74 6f 72 79 20 24 64 69 72 65 63 74 6f 72 79  ctory $directory
11fc0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
11fd0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
11fe0 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
11ff0 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
12000 20 20 20 20 20 22 2d 2d 2d 2d 20 65 6e 76 69 72       "---- envir
12010 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 20  onment variable 
12020 5c 22 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  \"System.Data.SQ
12030 4c 69 74 65 5c 22 20 69 73 20 61 6e 20 22 20 5c  Lite\" is an " \
12040 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
12050 20 20 22 69 6e 76 61 6c 69 64 20 64 69 72 65 63    "invalid direc
12060 74 6f 72 79 2c 20 73 6b 69 70 70 69 6e 67 20 63  tory, skipping c
12070 68 65 63 6b 20 66 6f 72 20 72 65 6c 65 61 73 65  heck for release
12080 73 2e 2e 2e 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20  s...\n"]....    
12090 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 66          return f
120a0 61 6c 73 65 0d 0a 20 20 20 20 20 20 20 20 20 20  alse..          
120b0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 66  }....          f
120c0 6f 72 65 61 63 68 20 70 61 74 68 20 5b 6c 73 6f  oreach path [lso
120d0 72 74 20 2d 64 65 63 72 65 61 73 69 6e 67 20 5b  rt -decreasing [
120e0 66 69 6c 65 20 6c 69 73 74 20 24 64 69 72 65 63  file list $direc
120f0 74 6f 72 79 20 2a 5d 5d 20 7b 0d 0a 20 20 20 20  tory *]] {..    
12100 20 20 20 20 20 20 20 20 69 66 20 7b 5b 66 69 6c          if {[fil
12110 65 20 65 78 69 73 74 73 20 24 70 61 74 68 5d 20  e exists $path] 
12120 26 26 20 5b 66 69 6c 65 20 69 73 64 69 72 65 63  && [file isdirec
12130 74 6f 72 79 20 24 70 61 74 68 5d 7d 20 74 68 65  tory $path]} the
12140 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
12150 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
12160 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
12170 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12180 20 20 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e     "---- checkin
12190 67 20 66 6f 72 20 53 79 73 74 65 6d 2e 44 61 74  g for System.Dat
121a0 61 2e 53 51 4c 69 74 65 20 72 65 6c 65 61 73 65  a.SQLite release
121b0 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20   \"" \..        
121c0 20 20 20 20 20 20 20 20 20 20 24 70 61 74 68 20            $path 
121d0 22 5c 22 2e 2e 2e 20 22 5d 0d 0a 0d 0a 20 20 20  "\"... "]....   
121e0 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b             if {[
121f0 69 73 52 65 6c 65 61 73 65 41 76 61 69 6c 61 62  isReleaseAvailab
12200 6c 65 20 24 70 61 74 68 20 70 6c 61 74 66 6f 72  le $path platfor
12210 6d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  m]} then {..    
12220 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
12230 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
12240 70 6c 61 74 66 6f 72 6d 5d 20 3d 3d 20 30 7d 20  platform] == 0} 
12250 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
12260 20 20 20 20 20 20 20 20 20 20 73 65 74 20 70 6c            set pl
12270 61 74 66 6f 72 6d 20 75 6e 6b 6e 6f 77 6e 0d 0a  atform unknown..
12280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12290 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
122a0 20 20 20 20 20 69 66 20 7b 24 73 65 6c 65 63 74       if {$select
122b0 20 26 26 20 5b 6d 61 74 63 68 50 6c 61 74 66 6f   && [matchPlatfo
122c0 72 6d 20 24 70 6c 61 74 66 6f 72 6d 5d 7d 20 74  rm $platform]} t
122d0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
122e0 20 20 20 20 20 20 20 20 20 73 65 74 20 3a 3a 62           set ::b
122f0 75 69 6c 64 5f 64 69 72 65 63 74 6f 72 79 20 24  uild_directory $
12300 70 61 74 68 0d 0a 0d 0a 20 20 20 20 20 20 20 20  path....        
12310 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
12320 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
12330 41 72 67 73 20 22 79 65 73 2c 20 73 65 6c 65 63  Args "yes, selec
12340 74 65 64 20 28 22 20 24 70 6c 61 74 66 6f 72 6d  ted (" $platform
12350 20 22 29 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20   ")\n"]....     
12360 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
12370 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20  urn true..      
12380 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
12390 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
123a0 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
123b0 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
123c0 20 22 79 65 73 20 28 22 20 24 70 6c 61 74 66 6f   "yes (" $platfo
123d0 72 6d 20 22 29 5c 6e 22 5d 0d 0a 20 20 20 20 20  rm ")\n"]..     
123e0 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
123f0 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c              } el
12400 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
12410 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
12420 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20 20  nnel no\n..     
12430 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
12440 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
12450 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
12460 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  }..      } else 
12470 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  {..        tputs
12480 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
12490 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
124a0 20 20 20 20 20 22 2d 2d 2d 2d 20 65 6e 76 69 72       "---- envir
124b0 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 20  onment variable 
124c0 5c 22 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  \"System.Data.SQ
124d0 4c 69 74 65 5c 22 20 69 73 20 6e 6f 74 20 22 20  Lite\" is not " 
124e0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  \..            "
124f0 73 65 74 2c 20 73 6b 69 70 70 69 6e 67 20 63 68  set, skipping ch
12500 65 63 6b 20 66 6f 72 20 72 65 6c 65 61 73 65 73  eck for releases
12510 2e 2e 2e 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 7d  ...\n"]..      }
12520 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ....      return
12530 20 66 61 6c 73 65 0d 0a 20 20 20 20 7d 0d 0a 0c   false..    }...
12540 0d 0a 20 20 20 20 70 72 6f 63 20 63 68 65 63 6b  ..    proc check
12550 46 6f 72 53 51 4c 69 74 65 4c 69 62 72 61 72 79  ForSQLiteLibrary
12560 20 7b 20 63 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a   { channel } {..
12570 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
12580 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 68 65 63 6b  nnel "---- check
12590 69 6e 67 20 66 6f 72 20 53 51 4c 69 74 65 20 63  ing for SQLite c
125a0 6f 72 65 20 6c 69 62 72 61 72 79 2e 2e 2e 20 22  ore library... "
125b0 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63  ....      if {[c
125c0 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
125d0 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66  object invoke -f
125e0 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20  lags +NonPublic 
125f0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 53  \..            S
12600 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
12610 65 2e 53 51 4c 69 74 65 33 20 53 51 4c 69 74 65  e.SQLite3 SQLite
12620 56 65 72 73 69 6f 6e 0d 0a 20 20 20 20 20 20 7d  Version..      }
12630 20 76 65 72 73 69 6f 6e 5d 20 3d 3d 20 30 7d 20   version] == 0} 
12640 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
12650 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
12660 45 3a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20  E: Check if the 
12670 72 65 74 75 72 6e 65 64 20 76 65 72 73 69 6f 6e  returned version
12680 20 77 61 73 20 6e 75 6c 6c 2e 20 20 49 66 20 73   was null.  If s
12690 6f 2c 20 6d 61 6b 65 20 69 74 20 65 61 73 79 0d  o, make it easy.
126a0 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
126b0 20 74 6f 20 73 70 6f 74 2e 0d 0a 20 20 20 20 20   to spot...     
126c0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66     #..        if
126d0 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   {[string length
126e0 20 24 76 65 72 73 69 6f 6e 5d 20 3d 3d 20 30 7d   $version] == 0}
126f0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
12700 20 20 20 73 65 74 20 76 65 72 73 69 6f 6e 20 6e     set version n
12710 75 6c 6c 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  ull..        }..
12720 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
12730 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74       # NOTE: Att
12740 65 6d 70 74 20 74 6f 20 71 75 65 72 79 20 74 68  empt to query th
12750 65 20 46 6f 73 73 69 6c 20 73 6f 75 72 63 65 20  e Fossil source 
12760 69 64 65 6e 74 69 66 69 65 72 20 66 6f 72 20 74  identifier for t
12770 68 65 20 53 51 4c 69 74 65 0d 0a 20 20 20 20 20  he SQLite..     
12780 20 20 20 23 20 20 20 20 20 20 20 63 6f 72 65 20     #       core 
12790 6c 69 62 72 61 72 79 2e 0d 0a 20 20 20 20 20 20  library...      
127a0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20    #..        if 
127b0 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
127c0 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f       object invo
127d0 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75  ke -flags +NonPu
127e0 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20  blic \..        
127f0 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74        System.Dat
12800 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 33  a.SQLite.SQLite3
12810 20 53 51 4c 69 74 65 53 6f 75 72 63 65 49 64 0d   SQLiteSourceId.
12820 0a 20 20 20 20 20 20 20 20 7d 20 73 6f 75 72 63  .        } sourc
12830 65 49 64 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  eId]} then {..  
12840 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
12850 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 65 20       # NOTE: We 
12860 66 61 69 6c 65 64 20 74 6f 20 71 75 65 72 79 20  failed to query 
12870 74 68 65 20 46 6f 73 73 69 6c 20 73 6f 75 72 63  the Fossil sourc
12880 65 20 69 64 65 6e 74 69 66 69 65 72 2e 0d 0a 20  e identifier... 
12890 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
128a0 20 20 20 20 20 20 73 65 74 20 73 6f 75 72 63 65        set source
128b0 49 64 20 75 6e 6b 6e 6f 77 6e 0d 0a 20 20 20 20  Id unknown..    
128c0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
128d0 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
128e0 54 45 3a 20 43 68 65 63 6b 20 69 66 20 74 68 65  TE: Check if the
128f0 20 72 65 74 75 72 6e 65 64 20 46 6f 73 73 69 6c   returned Fossil
12900 20 73 6f 75 72 63 65 20 69 64 65 6e 74 69 66 69   source identifi
12910 65 72 20 77 61 73 20 6e 75 6c 6c 2e 20 20 49 66  er was null.  If
12920 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
12930 20 20 73 6f 2c 20 6d 61 6b 65 20 69 74 20 65 61    so, make it ea
12940 73 79 20 74 6f 20 73 70 6f 74 2e 0d 0a 20 20 20  sy to spot...   
12950 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
12960 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
12970 74 68 20 24 73 6f 75 72 63 65 49 64 5d 20 3d 3d  th $sourceId] ==
12980 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
12990 20 20 20 20 20 20 73 65 74 20 73 6f 75 72 63 65        set source
129a0 49 64 20 6e 75 6c 6c 0d 0a 20 20 20 20 20 20 20  Id null..       
129b0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d   }....        #.
129c0 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
129d0 20 59 65 73 2c 20 74 68 65 20 53 51 4c 69 74 65   Yes, the SQLite
129e0 20 63 6f 72 65 20 6c 69 62 72 61 72 79 20 61 70   core library ap
129f0 70 65 61 72 73 20 74 6f 20 62 65 20 61 76 61 69  pears to be avai
12a00 6c 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20  lable...        
12a10 23 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f  #..        addCo
12a20 6e 73 74 72 61 69 6e 74 20 53 51 4c 69 74 65 0d  nstraint SQLite.
12a30 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
12a40 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65        # NOTE: Re
12a50 63 6f 72 64 20 76 65 72 73 69 6f 6e 20 6f 66 20  cord version of 
12a60 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20  the SQLite core 
12a70 6c 69 62 72 61 72 79 20 66 6f 72 20 6c 61 74 65  library for late
12a80 72 20 75 73 65 0d 0a 20 20 20 20 20 20 20 20 23  r use..        #
12a90 20 20 20 20 20 20 20 62 79 20 74 65 73 74 20 63         by test c
12aa0 6f 6e 73 74 72 61 69 6e 74 20 65 78 70 72 65 73  onstraint expres
12ab0 73 69 6f 6e 73 2c 20 65 74 63 2e 20 20 49 66 20  sions, etc.  If 
12ac0 74 68 69 73 20 76 61 6c 75 65 20 68 61 73 0d 0a  this value has..
12ad0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
12ae0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 65 74  already been set
12af0 20 28 6f 72 20 6f 76 65 72 72 69 64 64 65 6e 29   (or overridden)
12b00 2c 20 73 6b 69 70 20 73 65 74 74 69 6e 67 20 69  , skip setting i
12b10 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  t...        #.. 
12b20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
12b30 6f 20 65 78 69 73 74 73 20 3a 3a 63 6f 72 65 5f  o exists ::core_
12b40 6c 69 62 72 61 72 79 5f 76 65 72 73 69 6f 6e 5d  library_version]
12b50 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
12b60 20 20 20 20 73 65 74 20 3a 3a 63 6f 72 65 5f 6c      set ::core_l
12b70 69 62 72 61 72 79 5f 76 65 72 73 69 6f 6e 20 24  ibrary_version $
12b80 76 65 72 73 69 6f 6e 0d 0a 20 20 20 20 20 20 20  version..       
12b90 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 70   }....        tp
12ba0 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
12bb0 70 65 6e 64 41 72 67 73 20 22 79 65 73 20 28 22  pendArgs "yes ("
12bc0 20 24 76 65 72 73 69 6f 6e 20 22 20 22 20 24 73   $version " " $s
12bd0 6f 75 72 63 65 49 64 20 22 29 5c 6e 22 5d 0d 0a  ourceId ")\n"]..
12be0 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
12bf0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
12c00 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20  hannel no\n..   
12c10 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
12c20 20 20 20 20 70 72 6f 63 20 63 68 65 63 6b 46 6f      proc checkFo
12c30 72 53 51 4c 69 74 65 49 6e 74 65 72 6f 70 20 7b  rSQLiteInterop {
12c40 20 63 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20   channel } {..  
12c50 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
12c60 65 6c 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e  el "---- checkin
12c70 67 20 66 6f 72 20 53 51 4c 69 74 65 20 69 6e 74  g for SQLite int
12c80 65 72 6f 70 20 61 73 73 65 6d 62 6c 79 2e 2e 2e  erop assembly...
12c90 20 22 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b   "....      if {
12ca0 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
12cb0 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20    object invoke 
12cc0 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69  -flags +NonPubli
12cd0 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  c \..           
12ce0 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
12cf0 69 74 65 2e 53 51 4c 69 74 65 33 20 49 6e 74 65  ite.SQLite3 Inte
12d00 72 6f 70 56 65 72 73 69 6f 6e 0d 0a 20 20 20 20  ropVersion..    
12d10 20 20 7d 20 76 65 72 73 69 6f 6e 5d 20 3d 3d 20    } version] == 
12d20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
12d30 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
12d40 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20 74  NOTE: Check if t
12d50 68 65 20 72 65 74 75 72 6e 65 64 20 76 65 72 73  he returned vers
12d60 69 6f 6e 20 77 61 73 20 6e 75 6c 6c 2e 20 20 49  ion was null.  I
12d70 66 20 73 6f 2c 20 6d 61 6b 65 20 69 74 20 65 61  f so, make it ea
12d80 73 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  sy..        #   
12d90 20 20 20 20 74 6f 20 73 70 6f 74 2e 0d 0a 20 20      to spot...  
12da0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
12db0 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
12dc0 67 74 68 20 24 76 65 72 73 69 6f 6e 5d 20 3d 3d  gth $version] ==
12dd0 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
12de0 20 20 20 20 20 20 73 65 74 20 76 65 72 73 69 6f        set versio
12df0 6e 20 6e 75 6c 6c 0d 0a 20 20 20 20 20 20 20 20  n null..        
12e00 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  }....        #..
12e10 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
12e20 41 74 74 65 6d 70 74 20 74 6f 20 71 75 65 72 79  Attempt to query
12e30 20 74 68 65 20 46 6f 73 73 69 6c 20 73 6f 75 72   the Fossil sour
12e40 63 65 20 69 64 65 6e 74 69 66 69 65 72 20 66 6f  ce identifier fo
12e50 72 20 74 68 65 20 53 51 4c 69 74 65 0d 0a 20 20  r the SQLite..  
12e60 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f        #       co
12e70 72 65 20 6c 69 62 72 61 72 79 2e 0d 0a 20 20 20  re library...   
12e80 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
12e90 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20  if {[catch {..  
12ea0 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69          object i
12eb0 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f  nvoke -flags +No
12ec0 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20  nPublic \..     
12ed0 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e           System.
12ee0 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69  Data.SQLite.SQLi
12ef0 74 65 33 20 49 6e 74 65 72 6f 70 53 6f 75 72 63  te3 InteropSourc
12f00 65 49 64 0d 0a 20 20 20 20 20 20 20 20 7d 20 73  eId..        } s
12f10 6f 75 72 63 65 49 64 5d 7d 20 74 68 65 6e 20 7b  ourceId]} then {
12f20 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
12f30 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
12f40 20 57 65 20 66 61 69 6c 65 64 20 74 6f 20 71 75   We failed to qu
12f50 65 72 79 20 74 68 65 20 46 6f 73 73 69 6c 20 73  ery the Fossil s
12f60 6f 75 72 63 65 20 69 64 65 6e 74 69 66 69 65 72  ource identifier
12f70 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
12f80 20 20 20 20 20 20 20 20 20 20 73 65 74 20 73 6f            set so
12f90 75 72 63 65 49 64 20 75 6e 6b 6e 6f 77 6e 0d 0a  urceId unknown..
12fa0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
12fb0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
12fc0 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66  # NOTE: Check if
12fd0 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 46 6f   the returned Fo
12fe0 73 73 69 6c 20 73 6f 75 72 63 65 20 69 64 65 6e  ssil source iden
12ff0 74 69 66 69 65 72 20 77 61 73 20 6e 75 6c 6c 2e  tifier was null.
13000 20 20 49 66 0d 0a 20 20 20 20 20 20 20 20 23 20    If..        # 
13010 20 20 20 20 20 20 73 6f 2c 20 6d 61 6b 65 20 69        so, make i
13020 74 20 65 61 73 79 20 74 6f 20 73 70 6f 74 2e 0d  t easy to spot..
13030 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
13040 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
13050 6c 65 6e 67 74 68 20 24 73 6f 75 72 63 65 49 64  length $sourceId
13060 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
13070 20 20 20 20 20 20 20 20 20 20 73 65 74 20 73 6f            set so
13080 75 72 63 65 49 64 20 6e 75 6c 6c 0d 0a 20 20 20  urceId null..   
13090 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
130a0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
130b0 4f 54 45 3a 20 42 65 66 6f 72 65 20 61 63 74 75  OTE: Before actu
130c0 61 6c 6c 79 20 61 64 64 69 6e 67 20 74 68 65 20  ally adding the 
130d0 74 65 73 74 20 63 6f 6e 73 74 72 61 69 6e 74 2c  test constraint,
130e0 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 0d 0a   make sure the..
130f0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
13100 76 65 72 73 69 6f 6e 20 69 73 20 76 61 6c 69 64  version is valid
13110 20 28 69 2e 65 2e 20 6e 6f 74 20 6a 75 73 74 20   (i.e. not just 
13120 74 68 61 74 20 77 65 20 63 6f 75 6c 64 20 71 75  that we could qu
13130 65 72 79 20 69 74 29 2e 0d 0a 20 20 20 20 20 20  ery it)...      
13140 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20    #..        if 
13150 7b 24 76 65 72 73 69 6f 6e 20 6e 65 20 22 6e 75  {$version ne "nu
13160 6c 6c 22 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ll"} then {..   
13170 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
13180 20 20 20 20 23 20 4e 4f 54 45 3a 20 59 65 73 2c      # NOTE: Yes,
13190 20 74 68 65 20 53 51 4c 69 74 65 20 69 6e 74 65   the SQLite inte
131a0 72 6f 70 20 61 73 73 65 6d 62 6c 79 20 61 70 70  rop assembly app
131b0 65 61 72 73 20 74 6f 20 62 65 20 61 76 61 69 6c  ears to be avail
131c0 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 20  able...         
131d0 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 61 64   #..          ad
131e0 64 43 6f 6e 73 74 72 61 69 6e 74 20 53 51 4c 69  dConstraint SQLi
131f0 74 65 49 6e 74 65 72 6f 70 0d 0a 0d 0a 20 20 20  teInterop....   
13200 20 20 20 20 20 20 20 73 65 74 20 61 6e 73 77 65         set answe
13210 72 20 79 65 73 0d 0a 20 20 20 20 20 20 20 20 7d  r yes..        }
13220 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
13230 20 20 20 73 65 74 20 61 6e 73 77 65 72 20 6e 6f     set answer no
13240 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
13250 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
13260 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
13270 73 20 24 61 6e 73 77 65 72 20 22 20 28 22 20 24  s $answer " (" $
13280 76 65 72 73 69 6f 6e 20 22 20 22 20 24 73 6f 75  version " " $sou
13290 72 63 65 49 64 20 22 29 5c 6e 22 5d 0d 0a 20 20  rceId ")\n"]..  
132a0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
132b0 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
132c0 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20 20  nnel no\n..     
132d0 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
132e0 20 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72 53    proc checkForS
132f0 51 4c 69 74 65 44 65 66 69 6e 65 43 6f 6e 73 74  QLiteDefineConst
13300 61 6e 74 20 7b 20 63 68 61 6e 6e 65 6c 20 6e 61  ant { channel na
13310 6d 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74 70  me } {..      tp
13320 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
13330 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
13340 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65 63        "---- chec
13350 6b 69 6e 67 20 66 6f 72 20 53 79 73 74 65 6d 2e  king for System.
13360 44 61 74 61 2e 53 51 4c 69 74 65 20 64 65 66 69  Data.SQLite defi
13370 6e 65 20 63 6f 6e 73 74 61 6e 74 20 5c 22 22 20  ne constant \"" 
13380 24 6e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20  $name \..       
13390 20 20 20 22 5c 22 2e 2e 2e 20 22 5d 0d 0a 0d 0a     "\"... "]....
133a0 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
133b0 20 7b 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a 65   {..        obje
133c0 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73  ct invoke -flags
133d0 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20   +NonPublic \.. 
133e0 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65             Syste
133f0 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51  m.Data.SQLite.SQ
13400 4c 69 74 65 33 20 44 65 66 69 6e 65 43 6f 6e 73  Lite3 DefineCons
13410 74 61 6e 74 73 0d 0a 20 20 20 20 20 20 7d 20 64  tants..      } d
13420 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 73 5d 20  efineConstants] 
13430 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
13440 20 20 20 20 20 20 69 66 20 7b 5b 6c 73 65 61 72        if {[lsear
13450 63 68 20 2d 65 78 61 63 74 20 2d 6e 6f 63 61 73  ch -exact -nocas
13460 65 20 24 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e  e $defineConstan
13470 74 73 20 24 6e 61 6d 65 5d 20 21 3d 20 2d 31 7d  ts $name] != -1}
13480 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
13490 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
134a0 23 20 4e 4f 54 45 3a 20 59 65 73 2c 20 74 68 69  # NOTE: Yes, thi
134b0 73 20 64 65 66 69 6e 65 20 63 6f 6e 73 74 61 6e  s define constan
134c0 74 20 77 61 73 20 65 6e 61 62 6c 65 64 20 77 68  t was enabled wh
134d0 65 6e 20 74 68 65 20 6d 61 6e 61 67 65 64 0d 0a  en the managed..
134e0 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
134f0 20 20 61 73 73 65 6d 62 6c 79 20 77 61 73 20 63    assembly was c
13500 6f 6d 70 69 6c 65 64 2e 0d 0a 20 20 20 20 20 20  ompiled...      
13510 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
13520 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b   addConstraint [
13530 61 70 70 65 6e 64 41 72 67 73 20 5b 67 65 74 53  appendArgs [getS
13540 51 4c 69 74 65 44 65 66 69 6e 65 43 6f 6e 73 74  QLiteDefineConst
13550 61 6e 74 50 72 65 66 69 78 5d 20 24 6e 61 6d 65  antPrefix] $name
13560 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 74  ]....          t
13570 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 79 65  puts $channel ye
13580 73 5c 6e 0d 0a 20 20 20 20 20 20 20 20 7d 20 65  s\n..        } e
13590 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
135a0 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
135b0 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20 20 20 7d 0d  no\n..        }.
135c0 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
135d0 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
135e0 63 68 61 6e 6e 65 6c 20 65 72 72 6f 72 5c 6e 0d  channel error\n.
135f0 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
13600 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 68 65  ....    proc che
13610 63 6b 46 6f 72 53 51 4c 69 74 65 43 6f 6d 70 69  ckForSQLiteCompi
13620 6c 65 4f 70 74 69 6f 6e 20 7b 20 63 68 61 6e 6e  leOption { chann
13630 65 6c 20 6e 61 6d 65 20 7d 20 7b 0d 0a 20 20 20  el name } {..   
13640 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
13650 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
13660 0a 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d  .          "----
13670 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 53 51   checking for SQ
13680 4c 69 74 65 20 69 6e 74 65 72 6f 70 20 61 73 73  Lite interop ass
13690 65 6d 62 6c 79 20 63 6f 6d 70 69 6c 65 20 6f 70  embly compile op
136a0 74 69 6f 6e 20 5c 22 22 20 5c 0d 0a 20 20 20 20  tion \"" \..    
136b0 20 20 20 20 20 20 24 6e 61 6d 65 20 22 5c 22 2e        $name "\".
136c0 2e 2e 20 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 69  .. "]....      i
136d0 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  f {[catch {..   
136e0 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f       object invo
136f0 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75  ke -flags +NonPu
13700 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20  blic \..        
13710 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e      System.Data.
13720 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 33 20 49  SQLite.SQLite3 I
13730 6e 74 65 72 6f 70 43 6f 6d 70 69 6c 65 4f 70 74  nteropCompileOpt
13740 69 6f 6e 73 0d 0a 20 20 20 20 20 20 7d 20 63 6f  ions..      } co
13750 6d 70 69 6c 65 4f 70 74 69 6f 6e 73 5d 20 3d 3d  mpileOptions] ==
13760 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
13770 20 20 20 20 69 66 20 7b 5b 6c 73 65 61 72 63 68      if {[lsearch
13780 20 2d 65 78 61 63 74 20 2d 6e 6f 63 61 73 65 20   -exact -nocase 
13790 24 63 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 73 20  $compileOptions 
137a0 24 6e 61 6d 65 5d 20 21 3d 20 2d 31 7d 20 74 68  $name] != -1} th
137b0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
137c0 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e  #..          # N
137d0 4f 54 45 3a 20 59 65 73 2c 20 74 68 69 73 20 63  OTE: Yes, this c
137e0 6f 6d 70 69 6c 65 20 6f 70 74 69 6f 6e 20 77 61  ompile option wa
137f0 73 20 65 6e 61 62 6c 65 64 20 77 68 65 6e 20 74  s enabled when t
13800 68 65 20 69 6e 74 65 72 6f 70 0d 0a 20 20 20 20  he interop..    
13810 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61 73        #       as
13820 73 65 6d 62 6c 79 20 77 61 73 20 63 6f 6d 70 69  sembly was compi
13830 6c 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  led...          
13840 23 0d 0a 20 20 20 20 20 20 20 20 20 20 61 64 64  #..          add
13850 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65  Constraint [appe
13860 6e 64 41 72 67 73 20 5b 67 65 74 53 51 4c 69 74  ndArgs [getSQLit
13870 65 43 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 50 72  eCompileOptionPr
13880 65 66 69 78 5d 20 24 6e 61 6d 65 5d 0d 0a 0d 0a  efix] $name]....
13890 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
138a0 24 63 68 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a  $channel yes\n..
138b0 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
138c0 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74  ..          tput
138d0 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d  s $channel no\n.
138e0 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
138f0 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
13900 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
13910 65 6c 20 65 72 72 6f 72 5c 6e 0d 0a 20 20 20 20  el error\n..    
13920 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 74 70 75    }....      tpu
13930 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
13940 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
13950 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65 63 6b       "---- check
13960 69 6e 67 20 66 6f 72 20 53 51 4c 69 74 65 20 63  ing for SQLite c
13970 6f 72 65 20 6c 69 62 72 61 72 79 20 63 6f 6d 70  ore library comp
13980 69 6c 65 20 6f 70 74 69 6f 6e 20 5c 22 22 20 5c  ile option \"" \
13990 0d 0a 20 20 20 20 20 20 20 20 20 20 24 6e 61 6d  ..          $nam
139a0 65 20 22 5c 22 2e 2e 2e 20 22 5d 0d 0a 0d 0a 20  e "\"... "].... 
139b0 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
139c0 7b 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a 65 63  {..        objec
139d0 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20  t invoke -flags 
139e0 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20  +NonPublic \..  
139f0 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d            System
13a00 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c  .Data.SQLite.SQL
13a10 69 74 65 33 20 53 51 4c 69 74 65 43 6f 6d 70 69  ite3 SQLiteCompi
13a20 6c 65 4f 70 74 69 6f 6e 73 0d 0a 20 20 20 20 20  leOptions..     
13a30 20 7d 20 63 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e   } compileOption
13a40 73 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  s] == 0} then {.
13a50 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 6c 73  .        if {[ls
13a60 65 61 72 63 68 20 2d 65 78 61 63 74 20 2d 6e 6f  earch -exact -no
13a70 63 61 73 65 20 24 63 6f 6d 70 69 6c 65 4f 70 74  case $compileOpt
13a80 69 6f 6e 73 20 24 6e 61 6d 65 5d 20 21 3d 20 2d  ions $name] != -
13a90 31 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  1} then {..     
13aa0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
13ab0 20 20 23 20 4e 4f 54 45 3a 20 59 65 73 2c 20 74    # NOTE: Yes, t
13ac0 68 69 73 20 63 6f 6d 70 69 6c 65 20 6f 70 74 69  his compile opti
13ad0 6f 6e 20 77 61 73 20 65 6e 61 62 6c 65 64 20 77  on was enabled w
13ae0 68 65 6e 20 74 68 65 20 53 51 4c 69 74 65 0d 0a  hen the SQLite..
13af0 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
13b00 20 20 63 6f 72 65 20 6c 69 62 72 61 72 79 20 77    core library w
13b10 61 73 20 63 6f 6d 70 69 6c 65 64 2e 0d 0a 20 20  as compiled...  
13b20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
13b30 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
13b40 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5b  nt [appendArgs [
13b50 67 65 74 53 51 4c 69 74 65 43 6f 6d 70 69 6c 65  getSQLiteCompile
13b60 4f 70 74 69 6f 6e 50 72 65 66 69 78 5d 20 24 6e  OptionPrefix] $n
13b70 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ame]....        
13b80 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
13b90 20 79 65 73 5c 6e 0d 0a 20 20 20 20 20 20 20 20   yes\n..        
13ba0 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
13bb0 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
13bc0 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20 20  el no\n..       
13bd0 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65   }..      } else
13be0 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   {..        tput
13bf0 73 20 24 63 68 61 6e 6e 65 6c 20 65 72 72 6f 72  s $channel error
13c00 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  \n..      }..   
13c10 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
13c20 67 65 74 44 61 74 65 54 69 6d 65 46 6f 72 6d 61  getDateTimeForma
13c30 74 20 7b 20 7b 74 69 6d 65 5a 6f 6e 65 20 74 72  t { {timeZone tr
13c40 75 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23  ue} } {..      #
13c50 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
13c60 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 73  This procedure s
13c70 69 6d 70 6c 79 20 72 65 74 75 72 6e 73 20 74 68  imply returns th
13c80 65 20 22 64 65 66 61 75 6c 74 22 20 44 61 74 65  e "default" Date
13c90 54 69 6d 65 20 66 6f 72 6d 61 74 20 75 73 65 64  Time format used
13ca0 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
13cb0 62 79 20 74 68 65 20 74 65 73 74 20 73 75 69 74  by the test suit
13cc0 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  e...      #..   
13cd0 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69     if {[info exi
13ce0 73 74 73 20 3a 3a 64 61 74 65 74 69 6d 65 5f 66  sts ::datetime_f
13cf0 6f 72 6d 61 74 5d 20 26 26 20 5c 0d 0a 20 20 20  ormat] && \..   
13d00 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c         [string l
13d10 65 6e 67 74 68 20 24 3a 3a 64 61 74 65 74 69 6d  ength $::datetim
13d20 65 5f 66 6f 72 6d 61 74 5d 20 3e 20 30 7d 20 74  e_format] > 0} t
13d30 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
13d40 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
13d50 3a 20 52 65 74 75 72 6e 20 74 68 65 20 6d 61 6e  : Return the man
13d60 75 61 6c 6c 79 20 6f 76 65 72 72 69 64 64 65 6e  ually overridden
13d70 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 44   value for the D
13d80 61 74 65 54 69 6d 65 20 66 6f 72 6d 61 74 2e 0d  ateTime format..
13d90 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
13da0 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 64 61      return $::da
13db0 74 65 74 69 6d 65 5f 66 6f 72 6d 61 74 0d 0a 20  tetime_format.. 
13dc0 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
13dd0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
13de0 20 20 23 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e    # NOTE: Return
13df0 20 61 6e 20 49 53 4f 38 36 30 31 20 44 61 74 65   an ISO8601 Date
13e00 54 69 6d 65 20 66 6f 72 6d 61 74 20 63 6f 6d 70  Time format comp
13e10 61 74 69 62 6c 65 20 77 69 74 68 20 53 51 4c 69  atible with SQLi
13e20 74 65 2c 0d 0a 20 20 20 20 20 20 20 20 23 20 20  te,..        #  
13e30 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61       System.Data
13e40 2e 53 51 4c 69 74 65 2c 20 61 6e 64 20 73 75 69  .SQLite, and sui
13e50 74 61 62 6c 65 20 66 6f 72 20 72 6f 75 6e 64 2d  table for round-
13e60 74 72 69 70 70 69 6e 67 20 77 69 74 68 20 74 68  tripping with th
13e70 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
13e80 20 20 20 44 61 74 65 54 69 6d 65 20 63 6c 61 73     DateTime clas
13e90 73 20 6f 66 20 74 68 65 20 66 72 61 6d 65 77 6f  s of the framewo
13ea0 72 6b 2e 20 20 49 66 20 74 68 69 73 20 76 61 6c  rk.  If this val
13eb0 75 65 20 69 73 20 63 68 61 6e 67 65 64 2c 0d 0a  ue is changed,..
13ec0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
13ed0 76 61 72 69 6f 75 73 20 74 65 73 74 73 20 6d 61  various tests ma
13ee0 79 20 66 61 69 6c 2e 0d 0a 20 20 20 20 20 20 20  y fail...       
13ef0 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   #..        retu
13f00 72 6e 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  rn [appendArgs \
13f10 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 79  ..            "y
13f20 79 79 79 2d 4d 4d 2d 64 64 20 48 48 3a 6d 6d 3a  yyy-MM-dd HH:mm:
13f30 73 73 2e 46 46 46 46 46 46 46 22 20 5b 65 78 70  ss.FFFFFFF" [exp
13f40 72 20 7b 24 74 69 6d 65 5a 6f 6e 65 20 3f 20 22  r {$timeZone ? "
13f50 4b 22 20 3a 20 22 22 7d 5d 5d 0d 0a 20 20 20 20  K" : ""}]]..    
13f60 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
13f70 20 20 20 70 72 6f 63 20 67 65 74 44 61 74 65 54     proc getDateT
13f80 69 6d 65 54 69 63 6b 73 20 7b 20 76 61 6c 75 65  imeTicks { value
13f90 20 7b 6c 6f 63 61 6c 20 22 22 7d 20 7b 64 65 66   {local ""} {def
13fa0 61 75 6c 74 20 22 22 7d 20 7d 20 7b 0d 0a 20 20  ault ""} } {..  
13fb0 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
13fc0 6c 65 6e 67 74 68 20 24 76 61 6c 75 65 5d 20 3d  length $value] =
13fd0 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
13fe0 20 20 20 20 20 72 65 74 75 72 6e 20 24 64 65 66       return $def
13ff0 61 75 6c 74 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  ault..      }...
14000 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63  .      if {[catc
14010 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74  h {..        set
14020 20 64 61 74 65 54 69 6d 65 20 5b 6f 62 6a 65 63   dateTime [objec
14030 74 20 69 6e 76 6f 6b 65 20 2d 63 72 65 61 74 65  t invoke -create
14040 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
14050 2d 70 61 72 61 6d 65 74 65 72 74 79 70 65 73 20  -parametertypes 
14060 5b 6c 69 73 74 20 53 74 72 69 6e 67 20 53 74 72  [list String Str
14070 69 6e 67 20 49 46 6f 72 6d 61 74 50 72 6f 76 69  ing IFormatProvi
14080 64 65 72 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  der \..         
14090 20 20 20 53 79 73 74 65 6d 2e 47 6c 6f 62 61 6c     System.Global
140a0 69 7a 61 74 69 6f 6e 2e 44 61 74 65 54 69 6d 65  ization.DateTime
140b0 53 74 79 6c 65 73 5d 20 44 61 74 65 54 69 6d 65  Styles] DateTime
140c0 20 50 61 72 73 65 45 78 61 63 74 20 5c 0d 0a 20   ParseExact \.. 
140d0 20 20 20 20 20 20 20 20 20 20 20 24 76 61 6c 75             $valu
140e0 65 20 5b 67 65 74 44 61 74 65 54 69 6d 65 46 6f  e [getDateTimeFo
140f0 72 6d 61 74 5d 20 6e 75 6c 6c 20 41 64 6a 75 73  rmat] null Adjus
14100 74 54 6f 55 6e 69 76 65 72 73 61 6c 5d 0d 0a 20  tToUniversal].. 
14110 20 20 20 20 20 7d 5d 7d 20 74 68 65 6e 20 7b 0d       }]} then {.
14120 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
14130 24 64 65 66 61 75 6c 74 0d 0a 20 20 20 20 20 20  $default..      
14140 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  }....      if {[
14150 73 74 72 69 6e 67 20 69 73 20 62 6f 6f 6c 65 61  string is boolea
14160 6e 20 2d 73 74 72 69 63 74 20 24 6c 6f 63 61 6c  n -strict $local
14170 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
14180 20 20 20 73 65 74 20 64 61 74 65 54 69 6d 65 20     set dateTime 
14190 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d  [object invoke -
141a0 63 72 65 61 74 65 20 44 61 74 65 54 69 6d 65 20  create DateTime 
141b0 53 70 65 63 69 66 79 4b 69 6e 64 20 5c 0d 0a 20  SpecifyKind \.. 
141c0 20 20 20 20 20 20 20 20 20 20 20 24 64 61 74 65             $date
141d0 54 69 6d 65 20 55 74 63 5d 0d 0a 20 20 20 20 20  Time Utc]..     
141e0 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
141f0 20 20 20 72 65 74 75 72 6e 20 5b 6f 62 6a 65 63     return [objec
14200 74 20 69 6e 76 6f 6b 65 20 24 64 61 74 65 54 69  t invoke $dateTi
14210 6d 65 20 54 69 63 6b 73 5d 0d 0a 20 20 20 20 20  me Ticks]..     
14220 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b   }....      if {
14230 24 6c 6f 63 61 6c 7d 20 74 68 65 6e 20 7b 0d 0a  $local} then {..
14240 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b          return [
14250 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 24 64  object invoke $d
14260 61 74 65 54 69 6d 65 20 54 6f 4c 6f 63 61 6c 54  ateTime ToLocalT
14270 69 6d 65 2e 54 69 63 6b 73 5d 0d 0a 20 20 20 20  ime.Ticks]..    
14280 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
14290 20 20 20 20 72 65 74 75 72 6e 20 5b 6f 62 6a 65      return [obje
142a0 63 74 20 69 6e 76 6f 6b 65 20 24 64 61 74 65 54  ct invoke $dateT
142b0 69 6d 65 20 54 6f 55 6e 69 76 65 72 73 61 6c 54  ime ToUniversalT
142c0 69 6d 65 2e 54 69 63 6b 73 5d 0d 0a 20 20 20 20  ime.Ticks]..    
142d0 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
142e0 20 20 20 70 72 6f 63 20 67 65 74 50 72 6f 70 65     proc getPrope
142f0 72 74 69 65 73 20 7b 20 6f 62 6a 65 63 74 20 76  rties { object v
14300 61 72 4e 61 6d 65 20 7d 20 7b 0d 0a 20 20 20 20  arName } {..    
14310 20 20 75 70 76 61 72 20 31 20 24 76 61 72 4e 61    upvar 1 $varNa
14320 6d 65 20 70 72 6f 70 65 72 74 69 65 73 0d 0a 0d  me properties...
14330 0a 20 20 20 20 20 20 73 65 74 20 63 6f 75 6e 74  .      set count
14340 20 30 0d 0a 20 20 20 20 20 20 73 65 74 20 6e 61   0..      set na
14350 6d 65 73 20 5b 6c 69 73 74 5d 0d 0a 0d 0a 20 20  mes [list]....  
14360 20 20 20 20 69 66 20 7b 5b 69 73 4f 62 6a 65 63      if {[isObjec
14370 74 48 61 6e 64 6c 65 20 24 6f 62 6a 65 63 74 5d  tHandle $object]
14380 20 26 26 20 24 6f 62 6a 65 63 74 20 6e 65 20 22   && $object ne "
14390 6e 75 6c 6c 22 7d 20 74 68 65 6e 20 7b 0d 0a 20  null"} then {.. 
143a0 20 20 20 20 20 20 20 65 76 61 6c 20 6c 61 70 70         eval lapp
143b0 65 6e 64 20 6e 61 6d 65 73 20 5b 6f 62 6a 65 63  end names [objec
143c0 74 20 6d 65 6d 62 65 72 73 20 5c 0d 0a 20 20 20  t members \..   
143d0 20 20 20 20 20 20 20 20 20 2d 6d 65 6d 62 65 72           -member
143e0 74 79 70 65 73 20 50 72 6f 70 65 72 74 79 20 2d  types Property -
143f0 6e 61 6d 65 6f 6e 6c 79 20 24 6f 62 6a 65 63 74  nameonly $object
14400 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 65 76 61  ]....        eva
14410 6c 20 6c 61 70 70 65 6e 64 20 6e 61 6d 65 73 20  l lappend names 
14420 5b 6f 62 6a 65 63 74 20 6d 65 6d 62 65 72 73 20  [object members 
14430 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2d  \..            -
14440 6d 65 6d 62 65 72 74 79 70 65 73 20 46 69 65 6c  membertypes Fiel
14450 64 20 2d 6e 61 6d 65 6f 6e 6c 79 20 24 6f 62 6a  d -nameonly $obj
14460 65 63 74 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  ect]..      }...
14470 0a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 6e  .      foreach n
14480 61 6d 65 20 24 6e 61 6d 65 73 20 7b 0d 0a 20 20  ame $names {..  
14490 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
144a0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62   {..          ob
144b0 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 6f 62 6a  ject invoke -obj
144c0 65 63 74 66 6c 61 67 73 20 2b 4e 6f 44 69 73 70  ectflags +NoDisp
144d0 6f 73 65 20 24 6f 62 6a 65 63 74 20 24 6e 61 6d  ose $object $nam
144e0 65 0d 0a 20 20 20 20 20 20 20 20 7d 20 76 61 6c  e..        } val
144f0 75 65 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  ue] == 0} then {
14500 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
14510 5b 69 73 4f 62 6a 65 63 74 48 61 6e 64 6c 65 20  [isObjectHandle 
14520 24 76 61 6c 75 65 5d 20 26 26 20 24 76 61 6c 75  $value] && $valu
14530 65 20 6e 65 20 22 6e 75 6c 6c 22 7d 20 74 68 65  e ne "null"} the
14540 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
14550 20 73 65 74 20 65 72 72 6f 72 20 6e 75 6c 6c 3b   set error null;
14560 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d   object invoke -
14570 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63  flags +NonPublic
14580 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
14590 20 20 20 20 2d 6d 61 72 73 68 61 6c 66 6c 61 67      -marshalflag
145a0 73 20 2b 4e 6f 48 61 6e 64 6c 65 20 49 6e 74 65  s +NoHandle Inte
145b0 72 70 72 65 74 65 72 2e 47 65 74 41 63 74 69 76  rpreter.GetActiv
145c0 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
145d0 20 20 20 20 20 41 64 64 4f 62 6a 65 63 74 52 65       AddObjectRe
145e0 66 65 72 65 6e 63 65 20 4f 6b 20 24 76 61 6c 75  ference Ok $valu
145f0 65 20 65 72 72 6f 72 0d 0a 0d 0a 20 20 20 20 20  e error....     
14600 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 70         lappend p
14610 72 6f 70 65 72 74 69 65 73 28 6f 62 6a 65 63 74  roperties(object
14620 73 29 20 5b 6c 69 73 74 20 24 6e 61 6d 65 20 24  s) [list $name $
14630 76 61 6c 75 65 5d 0d 0a 20 20 20 20 20 20 20 20  value]..        
14640 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
14650 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20          lappend 
14660 70 72 6f 70 65 72 74 69 65 73 28 76 61 6c 75 65  properties(value
14670 73 29 20 5b 6c 69 73 74 20 24 6e 61 6d 65 20 24  s) [list $name $
14680 76 61 6c 75 65 5d 0d 0a 20 20 20 20 20 20 20 20  value]..        
14690 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
146a0 20 69 6e 63 72 20 63 6f 75 6e 74 0d 0a 20 20 20   incr count..   
146b0 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
146c0 20 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64           lappend
146d0 20 70 72 6f 70 65 72 74 69 65 73 28 65 72 72 6f   properties(erro
146e0 72 73 29 20 5b 6c 69 73 74 20 24 6e 61 6d 65 20  rs) [list $name 
146f0 24 3a 3a 65 72 72 6f 72 43 6f 64 65 5d 0d 0a 20  $::errorCode].. 
14700 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
14710 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72  }....      retur
14720 6e 20 24 63 6f 75 6e 74 0d 0a 20 20 20 20 7d 0d  n $count..    }.
14730 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74  ....    proc get
14740 41 6c 6c 50 72 6f 70 65 72 74 69 65 73 20 7b 20  AllProperties { 
14750 6f 62 6a 65 63 74 20 76 61 72 4e 61 6d 65 20 7d  object varName }
14760 20 7b 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20   {..      upvar 
14770 31 20 24 76 61 72 4e 61 6d 65 20 70 72 6f 70 65  1 $varName prope
14780 72 74 69 65 73 0d 0a 20 20 20 20 20 20 73 65 74  rties..      set
14790 20 76 61 6c 75 65 20 24 6f 62 6a 65 63 74 0d 0a   value $object..
147a0 0d 0a 20 20 20 20 20 20 77 68 69 6c 65 20 7b 74  ..      while {t
147b0 72 75 65 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20  rue} {..        
147c0 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
147d0 73 20 70 72 6f 70 65 72 74 69 65 73 28 73 65 65  s properties(see
147e0 6e 4f 62 6a 65 63 74 73 29 5d 20 7c 7c 20 5c 0d  nObjects)] || \.
147f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 24 76 61  .            $va
14800 6c 75 65 20 6e 69 20 24 70 72 6f 70 65 72 74 69  lue ni $properti
14810 65 73 28 73 65 65 6e 4f 62 6a 65 63 74 73 29 7d  es(seenObjects)}
14820 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
14830 20 20 20 67 65 74 50 72 6f 70 65 72 74 69 65 73     getProperties
14840 20 24 76 61 6c 75 65 20 70 72 6f 70 65 72 74 69   $value properti
14850 65 73 0d 0a 20 20 20 20 20 20 20 20 20 20 6c 61  es..          la
14860 70 70 65 6e 64 20 70 72 6f 70 65 72 74 69 65 73  ppend properties
14870 28 73 65 65 6e 4f 62 6a 65 63 74 73 29 20 24 76  (seenObjects) $v
14880 61 6c 75 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d  alue..        }.
14890 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21  ...        if {!
148a0 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 70 72 6f  [info exists pro
148b0 70 65 72 74 69 65 73 28 6f 62 6a 65 63 74 73 29  perties(objects)
148c0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
148d0 20 20 20 20 20 62 72 65 61 6b 0d 0a 20 20 20 20       break..    
148e0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
148f0 20 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 70   if {[llength $p
14900 72 6f 70 65 72 74 69 65 73 28 6f 62 6a 65 63 74  roperties(object
14910 73 29 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  s)] == 0} then {
14920 0d 0a 20 20 20 20 20 20 20 20 20 20 75 6e 73 65  ..          unse
14930 74 20 70 72 6f 70 65 72 74 69 65 73 28 6f 62 6a  t properties(obj
14940 65 63 74 73 29 3b 20 62 72 65 61 6b 0d 0a 20 20  ects); break..  
14950 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
14960 20 20 20 73 65 74 20 76 61 6c 75 65 20 5b 6c 69     set value [li
14970 6e 64 65 78 20 5b 6c 69 6e 64 65 78 20 24 70 72  ndex [lindex $pr
14980 6f 70 65 72 74 69 65 73 28 6f 62 6a 65 63 74 73  operties(objects
14990 29 20 30 5d 20 65 6e 64 5d 0d 0a 20 20 20 20 20  ) 0] end]..     
149a0 20 20 20 73 65 74 20 70 72 6f 70 65 72 74 69 65     set propertie
149b0 73 28 6f 62 6a 65 63 74 73 29 20 5b 6c 72 61 6e  s(objects) [lran
149c0 67 65 20 24 70 72 6f 70 65 72 74 69 65 73 28 6f  ge $properties(o
149d0 62 6a 65 63 74 73 29 20 31 20 65 6e 64 5d 0d 0a  bjects) 1 end]..
149e0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
149f0 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
14a00 73 20 70 72 6f 70 65 72 74 69 65 73 28 73 65 65  s properties(see
14a10 6e 4f 62 6a 65 63 74 73 29 5d 7d 20 74 68 65 6e  nObjects)]} then
14a20 20 7b 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 65   {..        fore
14a30 61 63 68 20 76 61 6c 75 65 20 24 70 72 6f 70 65  ach value $prope
14a40 72 74 69 65 73 28 73 65 65 6e 4f 62 6a 65 63 74  rties(seenObject
14a50 73 29 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  s) {..          
14a60 69 66 20 7b 24 76 61 6c 75 65 20 65 71 20 24 6f  if {$value eq $o
14a70 62 6a 65 63 74 7d 20 63 6f 6e 74 69 6e 75 65 0d  bject} continue.
14a80 0a 20 20 20 20 20 20 20 20 20 20 63 61 74 63 68  .          catch
14a90 20 7b 6f 62 6a 65 63 74 20 64 69 73 70 6f 73 65   {object dispose
14aa0 20 24 76 61 6c 75 65 7d 0d 0a 20 20 20 20 20 20   $value}..      
14ab0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 75    }....        u
14ac0 6e 73 65 74 20 70 72 6f 70 65 72 74 69 65 73 28  nset properties(
14ad0 73 65 65 6e 4f 62 6a 65 63 74 73 29 0d 0a 20 20  seenObjects)..  
14ae0 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
14af0 0a 20 20 20 20 70 72 6f 63 20 67 65 74 56 61 72  .    proc getVar
14b00 69 61 62 6c 65 73 20 7b 20 76 61 72 4e 61 6d 65  iables { varName
14b10 73 20 7b 6f 62 6a 65 63 74 73 20 66 61 6c 73 65  s {objects false
14b20 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74  } } {..      set
14b30 20 72 65 73 75 6c 74 20 5b 6c 69 73 74 5d 0d 0a   result [list]..
14b40 0d 0a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20  ..      foreach 
14b50 76 61 72 4e 61 6d 65 20 24 76 61 72 4e 61 6d 65  varName $varName
14b60 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20  s {..        if 
14b70 7b 5b 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73  {[uplevel 1 [lis
14b80 74 20 61 72 72 61 79 20 65 78 69 73 74 73 20 24  t array exists $
14b90 76 61 72 4e 61 6d 65 5d 5d 7d 20 74 68 65 6e 20  varName]]} then 
14ba0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  {..          set
14bb0 20 61 72 72 61 79 4e 61 6d 65 20 24 76 61 72 4e   arrayName $varN
14bc0 61 6d 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ame....         
14bd0 20 66 6f 72 65 61 63 68 20 65 6c 65 6d 65 6e 74   foreach element
14be0 4e 61 6d 65 20 5b 75 70 6c 65 76 65 6c 20 31 20  Name [uplevel 1 
14bf0 5b 6c 69 73 74 20 61 72 72 61 79 20 6e 61 6d 65  [list array name
14c00 73 20 24 61 72 72 61 79 4e 61 6d 65 5d 5d 20 7b  s $arrayName]] {
14c10 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65  ..            se
14c20 74 20 6e 61 6d 65 20 5b 61 70 70 65 6e 64 41 72  t name [appendAr
14c30 67 73 20 24 61 72 72 61 79 4e 61 6d 65 20 28 20  gs $arrayName ( 
14c40 24 65 6c 65 6d 65 6e 74 4e 61 6d 65 20 29 5d 0d  $elementName )].
14c50 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74  .            set
14c60 20 76 61 72 56 61 6c 75 65 20 5b 75 70 6c 65 76   varValue [uplev
14c70 65 6c 20 31 20 5b 6c 69 73 74 20 73 65 74 20 24  el 1 [list set $
14c80 6e 61 6d 65 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20  name]]....      
14c90 20 20 20 20 20 20 69 66 20 7b 24 6f 62 6a 65 63        if {$objec
14ca0 74 73 20 26 26 20 5b 69 73 4f 62 6a 65 63 74 48  ts && [isObjectH
14cb0 61 6e 64 6c 65 20 24 76 61 72 56 61 6c 75 65 5d  andle $varValue]
14cc0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
14cd0 20 20 20 20 20 20 20 20 75 6e 73 65 74 20 2d 6e          unset -n
14ce0 6f 63 6f 6d 70 6c 61 69 6e 20 70 72 6f 70 65 72  ocomplain proper
14cf0 74 69 65 73 0d 0a 20 20 20 20 20 20 20 20 20 20  ties..          
14d00 20 20 20 20 67 65 74 41 6c 6c 50 72 6f 70 65 72      getAllProper
14d10 74 69 65 73 20 24 76 61 72 56 61 6c 75 65 20 70  ties $varValue p
14d20 72 6f 70 65 72 74 69 65 73 0d 0a 0d 0a 20 20 20  roperties....   
14d30 20 20 20 20 20 20 20 20 20 20 20 6c 61 70 70 65             lappe
14d40 6e 64 20 72 65 73 75 6c 74 20 5b 6c 69 73 74 20  nd result [list 
14d50 24 6e 61 6d 65 20 5b 61 72 72 61 79 20 67 65 74  $name [array get
14d60 20 70 72 6f 70 65 72 74 69 65 73 5d 5d 0d 0a 20   properties]].. 
14d70 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73             } els
14d80 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e {..           
14d90 20 20 20 6c 61 70 70 65 6e 64 20 72 65 73 75 6c     lappend resul
14da0 74 20 5b 6c 69 73 74 20 24 6e 61 6d 65 20 24 76  t [list $name $v
14db0 61 72 56 61 6c 75 65 5d 0d 0a 20 20 20 20 20 20  arValue]..      
14dc0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
14dd0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20     }..        } 
14de0 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
14df0 20 20 73 65 74 20 76 61 72 56 61 6c 75 65 20 5b    set varValue [
14e00 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74 20  uplevel 1 [list 
14e10 73 65 74 20 24 76 61 72 4e 61 6d 65 5d 5d 0d 0a  set $varName]]..
14e20 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
14e30 24 6f 62 6a 65 63 74 73 20 26 26 20 5b 69 73 4f  $objects && [isO
14e40 62 6a 65 63 74 48 61 6e 64 6c 65 20 24 76 61 72  bjectHandle $var
14e50 56 61 6c 75 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a  Value]} then {..
14e60 20 20 20 20 20 20 20 20 20 20 20 20 75 6e 73 65              unse
14e70 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 70 72  t -nocomplain pr
14e80 6f 70 65 72 74 69 65 73 0d 0a 20 20 20 20 20 20  operties..      
14e90 20 20 20 20 20 20 67 65 74 41 6c 6c 50 72 6f 70        getAllProp
14ea0 65 72 74 69 65 73 20 24 76 61 72 56 61 6c 75 65  erties $varValue
14eb0 20 70 72 6f 70 65 72 74 69 65 73 0d 0a 0d 0a 20   properties.... 
14ec0 20 20 20 20 20 20 20 20 20 20 20 6c 61 70 70 65             lappe
14ed0 6e 64 20 72 65 73 75 6c 74 20 5b 6c 69 73 74 20  nd result [list 
14ee0 24 76 61 72 4e 61 6d 65 20 5b 61 72 72 61 79 20  $varName [array 
14ef0 67 65 74 20 70 72 6f 70 65 72 74 69 65 73 5d 5d  get properties]]
14f00 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c  ..          } el
14f10 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
14f20 20 20 6c 61 70 70 65 6e 64 20 72 65 73 75 6c 74    lappend result
14f30 20 5b 6c 69 73 74 20 24 76 61 72 4e 61 6d 65 20   [list $varName 
14f40 24 76 61 72 56 61 6c 75 65 5d 0d 0a 20 20 20 20  $varValue]..    
14f50 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
14f60 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20   }..      }.... 
14f70 20 20 20 20 20 72 65 74 75 72 6e 20 24 72 65 73       return $res
14f80 75 6c 74 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20  ult..    }..... 
14f90 20 20 20 70 72 6f 63 20 65 6e 75 6d 65 72 61 62     proc enumerab
14fa0 6c 65 54 6f 4c 69 73 74 20 7b 20 65 6e 75 6d 65  leToList { enume
14fb0 72 61 62 6c 65 20 7d 20 7b 0d 0a 20 20 20 20 20  rable } {..     
14fc0 20 73 65 74 20 72 65 73 75 6c 74 20 5b 6c 69 73   set result [lis
14fd0 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b  t]....      if {
14fe0 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
14ff0 65 6e 75 6d 65 72 61 62 6c 65 5d 20 3d 3d 20 30  enumerable] == 0
15000 20 7c 7c 20 24 65 6e 75 6d 65 72 61 62 6c 65 20   || $enumerable 
15010 65 71 20 22 6e 75 6c 6c 22 7d 20 74 68 65 6e 20  eq "null"} then 
15020 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  {..        retur
15030 6e 20 24 72 65 73 75 6c 74 0d 0a 20 20 20 20 20  n $result..     
15040 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 6f 62 6a 65   }....      obje
15050 63 74 20 66 6f 72 65 61 63 68 20 2d 61 6c 69 61  ct foreach -alia
15060 73 20 69 74 65 6d 20 24 65 6e 75 6d 65 72 61 62  s item $enumerab
15070 6c 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66  le {..        if
15080 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   {[string length
15090 20 24 69 74 65 6d 5d 20 3e 20 30 7d 20 74 68 65   $item] > 0} the
150a0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6c  n {..          l
150b0 61 70 70 65 6e 64 20 72 65 73 75 6c 74 20 5b 24  append result [$
150c0 69 74 65 6d 20 54 6f 53 74 72 69 6e 67 5d 0d 0a  item ToString]..
150d0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
150e0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75   }....      retu
150f0 72 6e 20 24 72 65 73 75 6c 74 0d 0a 20 20 20 20  rn $result..    
15100 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63  }.....    proc c
15110 61 74 63 68 41 6e 64 52 65 74 75 72 6e 20 7b 20  atchAndReturn { 
15120 73 63 72 69 70 74 20 7b 73 74 61 63 6b 54 72 61  script {stackTra
15130 63 65 20 66 61 6c 73 65 7d 20 7b 73 74 72 69 63  ce false} {stric
15140 74 20 74 72 75 65 7d 20 7d 20 7b 0d 0a 20 20 20  t true} } {..   
15150 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
15160 54 45 3a 20 45 76 61 6c 75 61 74 65 20 74 68 65  TE: Evaluate the
15170 20 73 63 72 69 70 74 20 70 72 6f 76 69 64 65 64   script provided
15180 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 20 69   by our caller i
15190 6e 20 74 68 65 69 72 20 63 6f 6e 74 65 78 74 2c  n their context,
151a0 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
151b0 63 61 70 74 75 72 69 6e 67 20 62 6f 74 68 20 74  capturing both t
151c0 68 65 20 72 65 73 75 6c 74 20 61 6e 64 20 74 68  he result and th
151d0 65 20 72 65 74 75 72 6e 20 63 6f 64 65 2e 0d 0a  e return code...
151e0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73        #..      s
151f0 65 74 20 63 6f 64 65 20 5b 63 61 74 63 68 20 7b  et code [catch {
15200 75 70 6c 65 76 65 6c 20 31 20 24 73 63 72 69 70  uplevel 1 $scrip
15210 74 7d 20 72 65 73 75 6c 74 5d 0d 0a 0d 0a 20 20  t} result]....  
15220 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
15230 4f 54 45 3a 20 44 69 64 20 74 68 65 20 73 63 72  OTE: Did the scr
15240 69 70 74 20 70 72 6f 76 69 64 65 64 20 62 79 20  ipt provided by 
15250 6f 75 72 20 63 61 6c 6c 65 72 20 4e 4f 54 20 72  our caller NOT r
15260 61 69 73 65 20 61 6e 20 65 72 72 6f 72 3f 0d 0a  aise an error?..
15270 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
15280 66 20 7b 24 73 74 72 69 63 74 20 26 26 20 24 63  f {$strict && $c
15290 6f 64 65 20 3d 3d 20 30 20 7c 7c 20 21 24 73 74  ode == 0 || !$st
152a0 72 69 63 74 20 26 26 20 24 63 6f 64 65 20 21 3d  rict && $code !=
152b0 20 31 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   1} then {..    
152c0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
152d0 20 4e 4f 54 45 3a 20 53 75 63 63 65 73 73 2e 20   NOTE: Success. 
152e0 20 52 65 74 75 72 6e 20 61 20 6c 69 73 74 20 77   Return a list w
152f0 69 74 68 20 74 68 65 20 72 65 74 75 72 6e 20 63  ith the return c
15300 6f 64 65 20 61 6e 64 20 74 68 65 20 72 65 73 75  ode and the resu
15310 6c 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  lt...        #..
15320 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b          return [
15330 6c 69 73 74 20 24 63 6f 64 65 20 24 72 65 73 75  list $code $resu
15340 6c 74 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  lt]..      } els
15350 65 69 66 20 7b 24 73 74 61 63 6b 54 72 61 63 65  eif {$stackTrace
15360 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
15370 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
15380 4f 54 45 3a 20 46 61 69 6c 75 72 65 2e 20 20 4f  OTE: Failure.  O
15390 75 72 20 63 61 6c 6c 65 72 20 77 61 6e 74 73 20  ur caller wants 
153a0 61 20 66 75 6c 6c 20 73 74 61 63 6b 20 74 72 61  a full stack tra
153b0 63 65 20 28 69 66 20 61 70 70 6c 69 63 61 62 6c  ce (if applicabl
153c0 65 29 2c 0d 0a 20 20 20 20 20 20 20 20 23 20 20  e),..        #  
153d0 20 20 20 20 20 72 65 74 75 72 6e 20 61 20 6c 69       return a li
153e0 73 74 20 77 69 74 68 20 74 68 65 20 72 65 74 75  st with the retu
153f0 72 6e 20 63 6f 64 65 20 61 6e 64 20 74 68 65 20  rn code and the 
15400 72 65 73 75 6c 74 20 76 65 72 62 61 74 69 6d 2e  result verbatim.
15410 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
15420 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6c 69 73       return [lis
15430 74 20 24 63 6f 64 65 20 24 72 65 73 75 6c 74 5d  t $code $result]
15440 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
15450 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
15460 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 61 69       # NOTE: Fai
15470 6c 75 72 65 2e 20 20 4f 75 72 20 63 61 6c 6c 65  lure.  Our calle
15480 72 20 64 6f 65 73 20 6e 6f 74 20 77 61 6e 74 20  r does not want 
15490 61 20 66 75 6c 6c 20 73 74 61 63 6b 20 74 72 61  a full stack tra
154a0 63 65 20 28 69 66 0d 0a 20 20 20 20 20 20 20 20  ce (if..        
154b0 23 20 20 20 20 20 20 20 61 70 70 6c 69 63 61 62  #       applicab
154c0 6c 65 29 2c 20 72 65 74 75 72 6e 20 61 20 6c 69  le), return a li
154d0 73 74 20 77 69 74 68 20 74 68 65 20 72 65 74 75  st with the retu
154e0 72 6e 20 63 6f 64 65 2c 20 74 68 65 20 65 72 72  rn code, the err
154f0 6f 72 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  or..        #   
15500 20 20 20 20 63 6f 64 65 20 66 6f 72 20 74 68 65      code for the
15510 20 69 6e 74 65 72 70 72 65 74 65 72 2c 20 61 6e   interpreter, an
15520 64 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73  d the error mess
15530 61 67 65 20 75 70 20 74 6f 20 74 68 65 0d 0a 20  age up to the.. 
15540 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 70         #       p
15550 6f 69 6e 74 20 77 68 65 72 65 20 74 68 65 20 73  oint where the s
15560 74 61 63 6b 20 74 72 61 63 65 20 73 68 6f 75 6c  tack trace shoul
15570 64 20 73 74 61 72 74 2e 0d 0a 20 20 20 20 20 20  d start...      
15580 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
15590 75 72 6e 20 5b 6c 69 73 74 20 24 63 6f 64 65 20  urn [list $code 
155a0 24 3a 3a 65 72 72 6f 72 43 6f 64 65 20 5c 0d 0a  $::errorCode \..
155b0 20 20 20 20 20 20 20 20 20 20 20 20 5b 65 78 74              [ext
155c0 72 61 63 74 53 79 73 74 65 6d 44 61 74 61 53 51  ractSystemDataSQ
155d0 4c 69 74 65 45 78 63 65 70 74 69 6f 6e 4d 65 73  LiteExceptionMes
155e0 73 61 67 65 20 24 72 65 73 75 6c 74 5d 5d 0d 0a  sage $result]]..
155f0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
15600 0c 0d 0a 20 20 20 20 70 72 6f 63 20 72 65 73 65  ...    proc rese
15610 74 45 78 63 65 70 74 69 6f 6e 20 7b 7d 20 7b 0d  tException {} {.
15620 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
15630 23 20 4e 4f 54 45 3a 20 52 65 73 65 74 20 65 78  # NOTE: Reset ex
15640 63 65 70 74 69 6f 6e 20 61 73 73 6f 63 69 61 74  ception associat
15650 65 64 20 77 69 74 68 20 74 68 69 73 20 69 6e 74  ed with this int
15660 65 72 70 72 65 74 65 72 20 28 74 6f 20 6e 75 6c  erpreter (to nul
15670 6c 29 2e 0d 0a 20 20 20 20 20 20 23 20 20 20 20  l)...      #    
15680 20 20 20 54 68 69 73 20 28 70 72 69 76 61 74 65     This (private
15690 29 20 70 72 6f 70 65 72 74 79 20 69 73 20 6d 61  ) property is ma
156a0 69 6e 74 61 69 6e 65 64 20 6f 6e 20 61 20 70 65  intained on a pe
156b0 72 2d 74 68 72 65 61 64 20 62 61 73 69 73 2e 0d  r-thread basis..
156c0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
156d0 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66  object invoke -f
156e0 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20  lags +NonPublic 
156f0 49 6e 74 65 72 70 72 65 74 65 72 2e 47 65 74 41  Interpreter.GetA
15700 63 74 69 76 65 20 45 78 63 65 70 74 69 6f 6e 20  ctive Exception 
15710 6e 75 6c 6c 0d 0a 20 20 20 20 20 20 72 65 74 75  null..      retu
15720 72 6e 20 22 22 0d 0a 20 20 20 20 7d 0d 0a 0c 0d  rn ""..    }....
15730 0a 20 20 20 20 70 72 6f 63 20 63 61 74 63 68 41  .    proc catchA
15740 6e 64 53 65 74 45 78 63 65 70 74 69 6f 6e 20 7b  ndSetException {
15750 20 73 63 72 69 70 74 20 7b 76 61 72 4e 61 6d 65   script {varName
15760 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20   ""} } {..      
15770 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
15780 20 45 76 61 6c 75 61 74 65 20 74 68 65 20 73 63   Evaluate the sc
15790 72 69 70 74 20 70 72 6f 76 69 64 65 64 20 62 79  ript provided by
157a0 20 6f 75 72 20 63 61 6c 6c 65 72 20 69 6e 20 74   our caller in t
157b0 68 65 69 72 20 63 6f 6e 74 65 78 74 2e 0d 0a 20  heir context... 
157c0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 63 61       #..      ca
157d0 74 63 68 20 7b 75 70 6c 65 76 65 6c 20 31 20 24  tch {uplevel 1 $
157e0 73 63 72 69 70 74 7d 0d 0a 0d 0a 20 20 20 20 20  script}....     
157f0 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
15800 3a 20 47 72 61 62 20 74 68 65 20 28 70 72 69 76  : Grab the (priv
15810 61 74 65 29 20 65 78 63 65 70 74 69 6f 6e 20 70  ate) exception p
15820 72 6f 70 65 72 74 79 20 66 72 6f 6d 20 74 68 69  roperty from thi
15830 73 20 69 6e 74 65 72 70 72 65 74 65 72 2c 0d 0a  s interpreter,..
15840 20 20 20 20 20 20 23 20 20 20 20 20 20 20 66 6f        #       fo
15850 72 20 74 68 69 73 20 74 68 72 65 61 64 2c 20 61  r this thread, a
15860 6e 64 20 61 64 64 20 61 73 20 61 6e 20 6f 70 61  nd add as an opa
15870 71 75 65 20 6f 62 6a 65 63 74 20 68 61 6e 64 6c  que object handl
15880 65 20 69 6e 20 74 68 65 0d 0a 20 20 20 20 20 20  e in the..      
15890 23 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74 20  #       context 
158a0 6f 66 20 6f 75 72 20 63 61 6c 6c 65 72 2e 0d 0a  of our caller...
158b0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
158c0 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  f {[string lengt
158d0 68 20 24 76 61 72 4e 61 6d 65 5d 20 3e 20 30 7d  h $varName] > 0}
158e0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
158f0 20 75 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d   upvar 1 $varNam
15900 65 20 65 78 63 65 70 74 69 6f 6e 0d 0a 20 20 20  e exception..   
15910 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 73 65     }....      se
15920 74 20 65 78 63 65 70 74 69 6f 6e 20 5b 6f 62 6a  t exception [obj
15930 65 63 74 20 69 6e 76 6f 6b 65 20 5c 0d 0a 20 20  ect invoke \..  
15940 20 20 20 20 20 20 20 20 2d 61 6c 69 61 73 20 2d          -alias -
15950 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63  flags +NonPublic
15960 20 49 6e 74 65 72 70 72 65 74 65 72 2e 47 65 74   Interpreter.Get
15970 41 63 74 69 76 65 20 45 78 63 65 70 74 69 6f 6e  Active Exception
15980 5d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72  ]....      retur
15990 6e 20 22 22 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  n ""..    }.....
159a0 20 20 20 20 70 72 6f 63 20 63 6f 6d 70 69 6c 65      proc compile
159b0 43 53 68 61 72 70 57 69 74 68 20 7b 0d 0a 20 20  CSharpWith {..  
159c0 20 20 20 20 20 20 20 20 20 20 74 65 78 74 20 6d            text m
159d0 65 6d 6f 72 79 20 73 79 6d 62 6f 6c 73 20 73 74  emory symbols st
159e0 72 69 63 74 20 72 65 73 75 6c 74 73 56 61 72 4e  rict resultsVarN
159f0 61 6d 65 20 65 72 72 6f 72 73 56 61 72 4e 61 6d  ame errorsVarNam
15a00 65 20 66 69 6c 65 4e 61 6d 65 73 0d 0a 20 20 20  e fileNames..   
15a10 20 20 20 20 20 20 20 20 20 61 72 67 73 20 7d 20           args } 
15a20 7b 0d 0a 20 20 20 20 20 20 74 72 79 20 7b 0d 0a  {..      try {..
15a30 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
15a40 20 20 20 23 20 4e 4f 54 45 3a 20 53 69 6e 63 65     # NOTE: Since
15a50 20 77 65 20 61 72 65 20 67 6f 69 6e 67 20 74 6f   we are going to
15a60 20 75 73 65 20 74 68 69 73 20 6d 65 74 68 6f 64   use this method
15a70 20 6e 61 6d 65 20 61 20 6c 6f 74 2c 20 61 73 73   name a lot, ass
15a80 69 67 6e 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ign..        #  
15a90 20 20 20 20 20 69 74 20 74 6f 20 61 20 76 61 72       it to a var
15aa0 69 61 62 6c 65 20 66 69 72 73 74 2e 0d 0a 20 20  iable first...  
15ab0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
15ac0 20 73 65 74 20 61 64 64 20 52 65 66 65 72 65 6e   set add Referen
15ad0 63 65 64 41 73 73 65 6d 62 6c 69 65 73 2e 41 64  cedAssemblies.Ad
15ae0 64 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  d....        #..
15af0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
15b00 43 72 65 61 74 65 20 74 68 65 20 62 61 73 65 20  Create the base 
15b10 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 75  command to evalu
15b20 61 74 65 20 61 6e 64 20 61 64 64 20 74 68 65 20  ate and add the 
15b30 70 72 6f 70 65 72 74 79 0d 0a 20 20 20 20 20 20  property..      
15b40 20 20 23 20 20 20 20 20 20 20 73 65 74 74 69 6e    #       settin
15b50 67 73 20 74 68 61 74 20 61 72 65 20 61 6c 6d 6f  gs that are almo
15b60 73 74 20 61 6c 77 61 79 73 20 6e 65 65 64 65 64  st always needed
15b70 20 62 79 20 6f 75 72 20 75 6e 69 74 20 74 65 73   by our unit tes
15b80 74 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ts..        #   
15b90 20 20 20 20 28 69 2e 65 2e 20 74 68 65 20 53 79      (i.e. the Sy
15ba0 73 74 65 6d 20 61 6e 64 20 53 79 73 74 65 6d 2e  stem and System.
15bb0 44 61 74 61 20 61 73 73 65 6d 62 6c 79 20 72 65  Data assembly re
15bc0 66 65 72 65 6e 63 65 73 29 2e 0d 0a 20 20 20 20  ferences)...    
15bd0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73      #..        s
15be0 65 74 20 63 6f 6d 6d 61 6e 64 20 5b 6c 69 73 74  et command [list
15bf0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
15c00 63 6f 6d 70 69 6c 65 43 53 68 61 72 70 20 24 74  compileCSharp $t
15c10 65 78 74 20 24 6d 65 6d 6f 72 79 20 24 73 79 6d  ext $memory $sym
15c20 62 6f 6c 73 20 24 73 74 72 69 63 74 20 72 65 73  bols $strict res
15c30 75 6c 74 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  ults \..        
15c40 20 20 20 20 65 72 72 6f 72 73 20 24 61 64 64 20      errors $add 
15c50 53 79 73 74 65 6d 2e 64 6c 6c 20 24 61 64 64 20  System.dll $add 
15c60 53 79 73 74 65 6d 2e 44 61 74 61 2e 64 6c 6c 20  System.Data.dll 
15c70 24 61 64 64 20 5c 0d 0a 20 20 20 20 20 20 20 20  $add \..        
15c80 20 20 20 20 53 79 73 74 65 6d 2e 54 72 61 6e 73      System.Trans
15c90 61 63 74 69 6f 6e 73 2e 64 6c 6c 20 24 61 64 64  actions.dll $add
15ca0 20 53 79 73 74 65 6d 2e 58 6d 6c 2e 64 6c 6c 5d   System.Xml.dll]
15cb0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
15cc0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41         # NOTE: A
15cd0 64 64 20 61 6c 6c 20 74 68 65 20 70 72 6f 76 69  dd all the provi
15ce0 64 65 64 20 66 69 6c 65 20 6e 61 6d 65 73 20 61  ded file names a
15cf0 73 20 61 73 73 65 6d 62 6c 79 20 72 65 66 65 72  s assembly refer
15d00 65 6e 63 65 73 2e 0d 0a 20 20 20 20 20 20 20 20  ences...        
15d10 23 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61  #..        forea
15d20 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 66 69 6c  ch fileName $fil
15d30 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20  eNames {..      
15d40 20 20 20 20 6c 61 70 70 65 6e 64 20 63 6f 6d 6d      lappend comm
15d50 61 6e 64 20 24 61 64 64 20 5b 67 65 74 42 69 6e  and $add [getBin
15d60 61 72 79 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c  aryFileName $fil
15d70 65 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20 20 20  eName]..        
15d80 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  }....        #..
15d90 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
15da0 41 64 64 20 65 78 74 72 61 20 61 72 67 75 6d 65  Add extra argume
15db0 6e 74 73 2c 20 69 66 20 61 6e 79 2c 20 74 6f 20  nts, if any, to 
15dc0 74 68 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65  the command to e
15dd0 76 61 6c 75 61 74 65 2e 0d 0a 20 20 20 20 20 20  valuate...      
15de0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 65 76 61    #..        eva
15df0 6c 20 6c 61 70 70 65 6e 64 20 63 6f 6d 6d 61 6e  l lappend comman
15e00 64 20 24 61 72 67 73 0d 0a 0d 0a 20 20 20 20 20  d $args....     
15e10 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
15e20 4e 4f 54 45 3a 20 41 6c 69 61 73 20 74 68 65 20  NOTE: Alias the 
15e30 63 6f 6d 70 69 6c 65 72 20 6c 6f 63 61 6c 20 72  compiler local r
15e40 65 73 75 6c 74 73 20 61 6e 64 20 65 72 72 6f 72  esults and error
15e50 73 20 76 61 72 69 61 62 6c 65 73 20 74 6f 0d 0a  s variables to..
15e60 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
15e70 74 68 65 20 76 61 72 69 61 62 6c 65 20 6e 61 6d  the variable nam
15e80 65 73 20 70 72 6f 76 69 64 65 64 20 62 79 20 6f  es provided by o
15e90 75 72 20 63 61 6c 6c 65 72 2e 0d 0a 20 20 20 20  ur caller...    
15ea0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69      #..        i
15eb0 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  f {[string lengt
15ec0 68 20 24 72 65 73 75 6c 74 73 56 61 72 4e 61 6d  h $resultsVarNam
15ed0 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  e] > 0} then {..
15ee0 20 20 20 20 20 20 20 20 20 20 75 70 76 61 72 20            upvar 
15ef0 31 20 24 72 65 73 75 6c 74 73 56 61 72 4e 61 6d  1 $resultsVarNam
15f00 65 20 72 65 73 75 6c 74 73 0d 0a 20 20 20 20 20  e results..     
15f10 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
15f20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
15f30 74 68 20 24 65 72 72 6f 72 73 56 61 72 4e 61 6d  th $errorsVarNam
15f40 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  e] > 0} then {..
15f50 20 20 20 20 20 20 20 20 20 20 75 70 76 61 72 20            upvar 
15f60 31 20 24 65 72 72 6f 72 73 56 61 72 4e 61 6d 65  1 $errorsVarName
15f70 20 65 72 72 6f 72 73 0d 0a 20 20 20 20 20 20 20   errors..       
15f80 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d   }....        #.
15f90 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
15fa0 20 45 76 61 6c 75 61 74 65 20 74 68 65 20 63 6f   Evaluate the co
15fb0 6e 73 74 72 75 63 74 65 64 20 5b 63 6f 6d 70 69  nstructed [compi
15fc0 6c 65 43 53 68 61 72 70 5d 20 63 6f 6d 6d 61 6e  leCSharp] comman
15fd0 64 20 61 6e 64 0d 0a 20 20 20 20 20 20 20 20 23  d and..        #
15fe0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 68         return th
15ff0 65 20 72 65 73 75 6c 74 2e 0d 0a 20 20 20 20 20  e result...     
16000 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 65 76     #..        ev
16010 61 6c 20 24 63 6f 6d 6d 61 6e 64 0d 0a 20 20 20  al $command..   
16020 20 20 20 7d 20 66 69 6e 61 6c 6c 79 20 7b 0d 0a     } finally {..
16030 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
16040 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 74 68     # NOTE: If th
16050 65 20 43 23 20 63 6f 6d 70 69 6c 65 72 20 77 61  e C# compiler wa
16060 73 20 69 6e 76 6f 6b 65 64 20 75 73 69 6e 67 20  s invoked using 
16070 5b 65 78 65 63 5d 2c 20 72 65 73 65 74 20 74 68  [exec], reset th
16080 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
16090 20 20 20 70 72 65 76 69 6f 75 73 20 70 72 6f 63     previous proc
160a0 65 73 73 20 69 64 65 6e 74 69 66 69 65 72 20 6e  ess identifier n
160b0 6f 77 20 28 69 2e 65 2e 20 74 68 61 74 20 77 61  ow (i.e. that wa
160c0 79 2c 20 69 74 20 64 6f 65 73 0d 0a 20 20 20 20  y, it does..    
160d0 20 20 20 20 23 20 20 20 20 20 20 20 6e 6f 74 20      #       not 
160e0 73 68 6f 77 20 75 70 20 61 73 20 62 65 69 6e 67  show up as being
160f0 20 22 6c 65 61 6b 65 64 22 29 2e 0d 0a 20 20 20   "leaked")...   
16100 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
16110 69 66 20 7b 5b 69 73 44 6f 74 4e 65 74 43 6f 72  if {[isDotNetCor
16120 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  e]} then {..    
16130 20 20 20 20 20 20 63 61 74 63 68 20 7b 69 6e 66        catch {inf
16140 6f 20 70 72 65 76 69 6f 75 73 70 69 64 20 74 72  o previouspid tr
16150 75 65 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  ue}..        }..
16160 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
16170 0c 0d 0a 20 20 20 20 70 72 6f 63 20 69 73 4d 65  ...    proc isMe
16180 6d 6f 72 79 44 62 20 7b 20 66 69 6c 65 4e 61 6d  moryDb { fileNam
16190 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a  e } {..      #..
161a0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 73        # NOTE: Is
161b0 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 64   the specified d
161c0 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d  atabase file nam
161d0 65 20 72 65 61 6c 6c 79 20 61 6e 20 69 6e 2d 6d  e really an in-m
161e0 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 3f 0d  emory database?.
161f0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
16200 72 65 74 75 72 6e 20 5b 65 78 70 72 20 7b 24 66  return [expr {$f
16210 69 6c 65 4e 61 6d 65 20 65 71 20 22 3a 6d 65 6d  ileName eq ":mem
16220 6f 72 79 3a 22 20 7c 7c 20 5c 0d 0a 20 20 20 20  ory:" || \..    
16230 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 72 61        [string ra
16240 6e 67 65 20 24 66 69 6c 65 4e 61 6d 65 20 30 20  nge $fileName 0 
16250 31 32 5d 20 65 71 20 22 66 69 6c 65 3a 3a 6d 65  12] eq "file::me
16260 6d 6f 72 79 3a 22 7d 5d 0d 0a 20 20 20 20 7d 0d  mory:"}]..    }.
16270 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 69 73 54  ....    proc isT
16280 61 62 6c 65 49 6e 44 62 20 7b 20 6e 61 6d 65 20  ableInDb { name 
16290 7b 76 61 72 4e 61 6d 65 20 64 62 7d 20 7d 20 7b  {varName db} } {
162a0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
162b0 20 23 20 4e 4f 54 45 3a 20 52 65 66 65 72 20 74   # NOTE: Refer t
162c0 6f 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  o the specified 
162d0 76 61 72 69 61 62 6c 65 20 28 65 2e 67 2e 20 22  variable (e.g. "
162e0 64 62 22 29 20 69 6e 20 74 68 65 20 63 6f 6e 74  db") in the cont
162f0 65 78 74 20 6f 66 20 6f 75 72 0d 0a 20 20 20 20  ext of our..    
16300 20 20 23 20 20 20 20 20 20 20 63 61 6c 6c 65 72    #       caller
16310 2e 20 20 49 74 20 63 6f 6e 74 61 69 6e 73 20 74  .  It contains t
16320 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
16330 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20 74 68  ection handle th
16340 61 74 20 77 69 6c 6c 20 62 65 0d 0a 20 20 20 20  at will be..    
16350 20 20 23 20 20 20 20 20 20 20 75 73 65 64 20 74    #       used t
16360 6f 20 65 78 65 63 75 74 65 20 74 68 65 20 71 75  o execute the qu
16370 65 72 79 20 75 73 65 64 20 74 6f 20 64 65 74 65  ery used to dete
16380 72 6d 69 6e 65 20 69 66 20 74 68 65 20 6e 61 6d  rmine if the nam
16390 65 64 20 74 61 62 6c 65 20 69 73 0d 0a 20 20 20  ed table is..   
163a0 20 20 20 23 20 20 20 20 20 20 20 70 72 65 73 65     #       prese
163b0 6e 74 20 69 6e 20 74 68 61 74 20 64 61 74 61 62  nt in that datab
163c0 61 73 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ase...      #.. 
163d0 20 20 20 20 20 75 70 76 61 72 20 31 20 24 76 61       upvar 1 $va
163e0 72 4e 61 6d 65 20 64 62 0d 0a 0d 0a 20 20 20 20  rName db....    
163f0 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
16400 45 3a 20 55 73 65 20 74 68 65 20 73 71 6c 69 74  E: Use the sqlit
16410 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 74  e_master table t
16420 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74  o determine if t
16430 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 20 69  he named table i
16440 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  s..      #      
16450 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20   present in the 
16460 64 61 74 61 62 61 73 65 2e 0d 0a 20 20 20 20 20  database...     
16470 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 73 71   #..      set sq
16480 6c 20 7b 0d 0a 20 20 20 20 20 20 20 20 53 45 4c  l {..        SEL
16490 45 43 54 20 43 4f 55 4e 54 28 2a 29 20 46 52 4f  ECT COUNT(*) FRO
164a0 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  M sqlite_master 
164b0 57 48 45 52 45 20 74 79 70 65 20 3d 20 27 74 61  WHERE type = 'ta
164c0 62 6c 65 27 20 41 4e 44 20 6e 61 6d 65 20 3d 20  ble' AND name = 
164d0 3f 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ?;..      }.... 
164e0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
164f0 4e 4f 54 45 3a 20 52 65 74 75 72 6e 20 6e 6f 6e  NOTE: Return non
16500 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 6e 61 6d  -zero if the nam
16510 65 64 20 74 61 62 6c 65 20 69 73 20 70 72 65 73  ed table is pres
16520 65 6e 74 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ent...      #.. 
16530 20 20 20 20 20 72 65 74 75 72 6e 20 5b 65 78 70       return [exp
16540 72 20 7b 0d 0a 20 20 20 20 20 20 20 20 5b 73 71  r {..        [sq
16550 6c 20 65 78 65 63 75 74 65 20 2d 65 78 65 63 75  l execute -execu
16560 74 65 20 73 63 61 6c 61 72 20 24 64 62 20 24 73  te scalar $db $s
16570 71 6c 20 5b 6c 69 73 74 20 70 61 72 61 6d 31 20  ql [list param1 
16580 53 74 72 69 6e 67 20 24 6e 61 6d 65 5d 5d 20 3e  String $name]] >
16590 20 30 0d 0a 20 20 20 20 20 20 7d 5d 0d 0a 20 20   0..      }]..  
165a0 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
165b0 20 67 65 74 44 62 44 65 66 61 75 6c 74 50 61 67   getDbDefaultPag
165c0 65 53 69 7a 65 20 7b 7d 20 7b 0d 0a 20 20 20 20  eSize {} {..    
165d0 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 65 78    if {[catch {ex
165e0 65 63 75 74 65 53 71 6c 20 22 50 52 41 47 4d 41  ecuteSql "PRAGMA
165f0 20 70 61 67 65 5f 73 69 7a 65 3b 22 20 73 63 61   page_size;" sca
16600 6c 61 72 7d 20 72 65 73 75 6c 74 5d 20 3d 3d 20  lar} result] == 
16610 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
16620 20 20 20 72 65 74 75 72 6e 20 24 72 65 73 75 6c     return $resul
16630 74 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  t..      } else 
16640 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  {..        retur
16650 6e 20 30 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  n 0..      }..  
16660 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
16670 20 67 65 74 44 62 44 65 66 61 75 6c 74 43 61 63   getDbDefaultCac
16680 68 65 53 69 7a 65 20 7b 7d 20 7b 0d 0a 20 20 20  heSize {} {..   
16690 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 65     if {[catch {e
166a0 78 65 63 75 74 65 53 71 6c 20 22 50 52 41 47 4d  xecuteSql "PRAGM
166b0 41 20 63 61 63 68 65 5f 73 69 7a 65 3b 22 20 73  A cache_size;" s
166c0 63 61 6c 61 72 7d 20 72 65 73 75 6c 74 5d 20 3d  calar} result] =
166d0 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
166e0 20 20 20 20 20 72 65 74 75 72 6e 20 24 72 65 73       return $res
166f0 75 6c 74 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  ult..      } els
16700 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74  e {..        ret
16710 75 72 6e 20 30 0d 0a 20 20 20 20 20 20 7d 0d 0a  urn 0..      }..
16720 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
16730 6f 63 20 75 73 65 4c 65 67 61 63 79 44 62 50 61  oc useLegacyDbPa
16740 67 65 41 6e 64 43 61 63 68 65 53 69 7a 65 73 20  geAndCacheSizes 
16750 7b 20 76 61 72 4e 61 6d 65 20 7d 20 7b 0d 0a 20  { varName } {.. 
16760 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
16770 4e 4f 54 45 3a 20 52 65 66 65 72 20 74 6f 20 74  NOTE: Refer to t
16780 68 65 20 73 70 65 63 69 66 69 65 64 20 76 61 72  he specified var
16790 69 61 62 6c 65 20 28 65 2e 67 2e 20 22 64 62 22  iable (e.g. "db"
167a0 29 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 78 74  ) in the context
167b0 20 6f 66 20 6f 75 72 0d 0a 20 20 20 20 20 20 23   of our..      #
167c0 20 20 20 20 20 20 20 63 61 6c 6c 65 72 2e 20 20         caller.  
167d0 49 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  It contains the 
167e0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
167f0 69 6f 6e 20 68 61 6e 64 6c 65 20 74 68 61 74 20  ion handle that 
16800 77 69 6c 6c 20 62 65 0d 0a 20 20 20 20 20 20 23  will be..      #
16810 20 20 20 20 20 20 20 75 73 65 64 20 74 6f 20 65         used to e
16820 78 65 63 75 74 65 20 71 75 65 72 69 65 73 20 75  xecute queries u
16830 73 65 64 20 74 6f 20 73 65 74 20 74 68 65 20 70  sed to set the p
16840 61 67 65 20 61 6e 64 20 63 61 63 68 65 20 73 69  age and cache si
16850 7a 65 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  zes...      #.. 
16860 20 20 20 20 20 75 70 76 61 72 20 31 20 24 76 61       upvar 1 $va
16870 72 4e 61 6d 65 20 64 62 0d 0a 0d 0a 20 20 20 20  rName db....    
16880 20 20 73 71 6c 20 65 78 65 63 75 74 65 20 24 64    sql execute $d
16890 62 20 7b 0d 0a 20 20 20 20 20 20 20 20 50 52 41  b {..        PRA
168a0 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20  GMA page_size = 
168b0 31 30 32 34 3b 0d 0a 20 20 20 20 20 20 20 20 50  1024;..        P
168c0 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65  RAGMA cache_size
168d0 20 3d 20 32 30 30 30 3b 0d 0a 20 20 20 20 20 20   = 2000;..      
168e0 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72  }....      retur
168f0 6e 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20  n [list \..     
16900 20 20 20 20 20 5b 73 71 6c 20 65 78 65 63 75 74       [sql execut
16910 65 20 2d 65 78 65 63 75 74 65 20 73 63 61 6c 61  e -execute scala
16920 72 20 24 64 62 20 22 50 52 41 47 4d 41 20 70 61  r $db "PRAGMA pa
16930 67 65 5f 73 69 7a 65 3b 22 5d 20 5c 0d 0a 20 20  ge_size;"] \..  
16940 20 20 20 20 20 20 20 20 5b 73 71 6c 20 65 78 65          [sql exe
16950 63 75 74 65 20 2d 65 78 65 63 75 74 65 20 73 63  cute -execute sc
16960 61 6c 61 72 20 24 64 62 20 22 50 52 41 47 4d 41  alar $db "PRAGMA
16970 20 63 61 63 68 65 5f 73 69 7a 65 3b 22 5d 5d 0d   cache_size;"]].
16980 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
16990 72 6f 63 20 6e 6f 72 6d 61 6c 69 7a 65 45 78 63  roc normalizeExc
169a0 65 70 74 69 6f 6e 4d 65 73 73 61 67 65 20 7b 20  eptionMessage { 
169b0 76 61 6c 75 65 20 7d 20 7b 0d 0a 20 20 20 20 20  value } {..     
169c0 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
169d0 67 74 68 20 24 76 61 6c 75 65 5d 20 3d 3d 20 30  gth $value] == 0
169e0 7d 20 74 68 65 6e 20 7b 72 65 74 75 72 6e 20 24  } then {return $
169f0 76 61 6c 75 65 7d 0d 0a 20 20 20 20 20 20 72 65  value}..      re
16a00 74 75 72 6e 20 5b 73 74 72 69 6e 67 20 6d 61 70  turn [string map
16a10 20 5b 6c 69 73 74 20 5c 72 5c 6e 20 22 20 3d 3d   [list \r\n " ==
16a20 3e 20 22 20 5c 6e 20 22 20 3d 3d 3e 20 22 5d 20  > " \n " ==> "] 
16a30 24 76 61 6c 75 65 5d 0d 0a 20 20 20 20 7d 0d 0a  $value]..    }..
16a40 0c 0d 0a 20 20 20 20 70 72 6f 63 20 65 78 74 72  ...    proc extr
16a50 61 63 74 53 79 73 74 65 6d 44 61 74 61 53 51 4c  actSystemDataSQL
16a60 69 74 65 45 78 63 65 70 74 69 6f 6e 4d 65 73 73  iteExceptionMess
16a70 61 67 65 20 7b 20 76 61 6c 75 65 20 7d 20 7b 0d  age { value } {.
16a80 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
16a90 23 20 4e 4f 54 45 3a 20 49 66 20 74 68 65 20 73  # NOTE: If the s
16aa0 74 72 69 6e 67 20 63 6f 6e 66 6f 72 6d 73 20 74  tring conforms t
16ab0 6f 20 66 6f 72 6d 61 74 20 6f 66 20 74 68 65 20  o format of the 
16ac0 6e 6f 72 6d 61 6c 20 65 78 63 65 70 74 69 6f 6e  normal exception
16ad0 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
16ae0 65 72 72 6f 72 20 73 74 72 69 6e 67 73 2c 20 65  error strings, e
16af0 78 74 72 61 63 74 20 61 6e 64 20 72 65 74 75 72  xtract and retur
16b00 6e 20 6f 6e 6c 79 20 74 68 65 20 65 72 72 6f 72  n only the error
16b10 20 6d 65 73 73 61 67 65 0d 0a 20 20 20 20 20 20   message..      
16b20 23 20 20 20 20 20 20 20 70 6f 72 74 69 6f 6e 20  #       portion 
16b30 69 74 73 65 6c 66 2e 0d 0a 20 20 20 20 20 20 23  itself...      #
16b40 0d 0a 20 20 20 20 20 20 73 65 74 20 70 61 74 74  ..      set patt
16b50 65 72 6e 73 20 5b 6c 69 73 74 20 5c 0d 0a 20 20  erns [list \..  
16b60 20 20 20 20 7b 53 79 73 74 65 6d 5c 2e 44 61 74      {System\.Dat
16b70 61 5c 2e 53 51 4c 69 74 65 5c 2e 53 51 4c 69 74  a\.SQLite\.SQLit
16b80 65 45 78 63 65 70 74 69 6f 6e 20 5c 28 30 78 28  eException \(0x(
16b90 3f 3a 30 7c 38 29 5b 30 2d 39 41 2d 46 61 2d 66  ?:0|8)[0-9A-Fa-f
16ba0 5d 7b 37 7d 5c 29 3a 5c 0d 0a 20 20 20 20 20 20  ]{7}\):\..      
16bb0 20 20 20 20 28 2e 2b 3f 29 20 20 28 3f 3a 20 29      (.+?)  (?: )
16bc0 3f 61 74 7d 20 5c 0d 0a 20 20 20 20 20 20 7b 53  ?at} \..      {S
16bd0 79 73 74 65 6d 5c 2e 44 61 74 61 5c 2e 53 51 4c  ystem\.Data\.SQL
16be0 69 74 65 5c 2e 53 51 4c 69 74 65 45 78 63 65 70  ite\.SQLiteExcep
16bf0 74 69 6f 6e 3a 20 28 2e 2b 3f 29 20 20 28 3f 3a  tion: (.+?)  (?:
16c00 20 29 3f 61 74 7d 20 5c 0d 0a 20 20 20 20 20 20   )?at} \..      
16c10 7b 45 61 67 6c 65 5c 2e 5f 43 6f 6d 70 6f 6e 65  {Eagle\._Compone
16c20 6e 74 73 5c 2e 50 75 62 6c 69 63 5c 2e 53 63 72  nts\.Public\.Scr
16c30 69 70 74 45 78 63 65 70 74 69 6f 6e 3a 20 28 2e  iptException: (.
16c40 2b 3f 29 20 20 28 3f 3a 20 29 3f 61 74 7d 5d 0d  +?)  (?: )?at}].
16c50 0a 0d 0a 20 20 20 20 20 20 66 6f 72 65 61 63 68  ...      foreach
16c60 20 70 61 74 74 65 72 6e 20 24 70 61 74 74 65 72   pattern $patter
16c70 6e 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66  ns {..        if
16c80 20 7b 5b 72 65 67 65 78 70 20 2d 2d 20 24 70 61   {[regexp -- $pa
16c90 74 74 65 72 6e 20 24 76 61 6c 75 65 20 64 75 6d  ttern $value dum
16ca0 6d 79 20 6d 65 73 73 61 67 65 5d 7d 20 74 68 65  my message]} the
16cb0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73  n {..          s
16cc0 65 74 20 6d 65 73 73 61 67 65 20 5b 73 74 72 69  et message [stri
16cd0 6e 67 20 6d 61 70 20 5b 6c 69 73 74 20 5c 72 5c  ng map [list \r\
16ce0 6e 20 5c 6e 5d 20 5b 73 74 72 69 6e 67 20 74 72  n \n] [string tr
16cf0 69 6d 20 24 6d 65 73 73 61 67 65 5d 5d 0d 0a 20  im $message]].. 
16d00 20 20 20 20 20 20 20 20 20 73 65 74 20 6c 69 6e           set lin
16d10 65 73 20 5b 73 70 6c 69 74 20 24 6d 65 73 73 61  es [split $messa
16d20 67 65 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20  ge \n]....      
16d30 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67 74 68      if {[llength
16d40 20 24 6c 69 6e 65 73 5d 20 3d 3d 20 32 7d 20 74   $lines] == 2} t
16d50 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
16d60 20 20 20 69 66 20 7b 5b 6c 69 6e 64 65 78 20 24     if {[lindex $
16d70 6c 69 6e 65 73 20 30 5d 20 65 71 20 5b 6c 69 6e  lines 0] eq [lin
16d80 64 65 78 20 24 6c 69 6e 65 73 20 31 5d 7d 20 74  dex $lines 1]} t
16d90 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
16da0 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6c 69 6e       return [lin
16db0 64 65 78 20 24 6c 69 6e 65 73 20 30 5d 0d 0a 20  dex $lines 0].. 
16dc0 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
16dd0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
16de0 72 6e 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5b  rn [appendArgs [
16df0 6c 69 6e 64 65 78 20 24 6c 69 6e 65 73 20 30 5d  lindex $lines 0]
16e00 20 22 20 2d 2d 20 22 20 5b 6c 69 6e 64 65 78 20   " -- " [lindex 
16e10 24 6c 69 6e 65 73 20 31 5d 5d 0d 0a 20 20 20 20  $lines 1]]..    
16e20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
16e30 20 20 20 20 20 72 65 74 75 72 6e 20 24 6d 65 73       return $mes
16e40 73 61 67 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d  sage..        }.
16e50 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
16e60 20 20 72 65 74 75 72 6e 20 24 76 61 6c 75 65 0d    return $value.
16e70 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
16e80 72 6f 63 20 74 72 69 6d 53 71 6c 20 7b 20 73 71  roc trimSql { sq
16e90 6c 20 7d 20 7b 0d 0a 20 20 20 20 20 20 72 65 74  l } {..      ret
16ea0 75 72 6e 20 5b 72 65 67 73 75 62 20 2d 61 6c 6c  urn [regsub -all
16eb0 20 2d 2d 20 7b 5c 73 2b 7d 20 5b 73 74 72 69 6e   -- {\s+} [strin
16ec0 67 20 74 72 69 6d 20 24 73 71 6c 5d 20 22 20 22  g trim $sql] " "
16ed0 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  ]..    }.....   
16ee0 20 70 72 6f 63 20 65 78 65 63 75 74 65 53 71 6c   proc executeSql
16ef0 20 7b 20 73 71 6c 20 7b 65 78 65 63 75 74 65 20   { sql {execute 
16f00 6e 6f 6e 65 7d 20 7b 66 6f 72 6d 61 74 20 6e 6f  none} {format no
16f10 6e 65 7d 20 7b 66 69 6c 65 4e 61 6d 65 20 22 22  ne} {fileName ""
16f20 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66 20  } } {..      if 
16f30 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
16f40 24 66 69 6c 65 4e 61 6d 65 5d 20 3d 3d 20 30 7d  $fileName] == 0}
16f50 20 74 68 65 6e 20 7b 73 65 74 20 66 69 6c 65 4e   then {set fileN
16f60 61 6d 65 20 3a 6d 65 6d 6f 72 79 3a 7d 0d 0a 20  ame :memory:}.. 
16f70 20 20 20 20 20 73 65 74 75 70 44 62 20 24 66 69       setupDb $fi
16f80 6c 65 4e 61 6d 65 20 22 22 20 22 22 20 22 22 20  leName "" "" "" 
16f90 22 22 20 22 22 20 66 61 6c 73 65 20 66 61 6c 73  "" "" false fals
16fa0 65 20 66 61 6c 73 65 20 66 61 6c 73 65 20 64 62  e false false db
16fb0 20 74 72 75 65 0d 0a 0d 0a 20 20 20 20 20 20 74   true....      t
16fc0 72 79 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65  ry {..        re
16fd0 74 75 72 6e 20 5b 75 70 6c 65 76 65 6c 20 31 20  turn [uplevel 1 
16fe0 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 20  [list \..       
16ff0 20 20 20 20 20 73 71 6c 20 65 78 65 63 75 74 65       sql execute
17000 20 2d 65 78 65 63 75 74 65 20 24 65 78 65 63 75   -execute $execu
17010 74 65 20 2d 66 6f 72 6d 61 74 20 24 66 6f 72 6d  te -format $form
17020 61 74 20 24 64 62 20 24 73 71 6c 5d 5d 0d 0a 20  at $db $sql]].. 
17030 20 20 20 20 20 7d 20 66 69 6e 61 6c 6c 79 20 7b       } finally {
17040 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 63 6f  ..        set co
17050 6e 6e 65 63 74 69 6f 6e 20 5b 67 65 74 44 62 43  nnection [getDbC
17060 6f 6e 6e 65 63 74 69 6f 6e 5d 0d 0a 0d 0a 20 20  onnection]....  
17070 20 20 20 20 20 20 74 72 79 20 7b 0d 0a 20 20 20        try {..   
17080 20 20 20 20 20 20 20 63 6c 65 61 6e 75 70 44 62         cleanupDb
17090 20 24 66 69 6c 65 4e 61 6d 65 20 64 62 20 66 61   $fileName db fa
170a0 6c 73 65 20 66 61 6c 73 65 20 66 61 6c 73 65 0d  lse false false.
170b0 0a 20 20 20 20 20 20 20 20 7d 20 66 69 6e 61 6c  .        } final
170c0 6c 79 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ly {..          
170d0 6f 62 6a 65 63 74 20 66 6c 61 67 73 20 24 63 6f  object flags $co
170e0 6e 6e 65 63 74 69 6f 6e 20 2d 4e 6f 44 69 73 70  nnection -NoDisp
170f0 6f 73 65 3b 20 66 72 65 65 44 62 43 6f 6e 6e 65  ose; freeDbConne
17100 63 74 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20 7d  ction..        }
17110 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
17120 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 68 61  .....    proc ha
17130 73 4e 6f 46 6c 61 67 73 20 7b 20 76 61 72 4e 61  sNoFlags { varNa
17140 6d 65 20 6e 6f 6e 65 20 7d 20 7b 0d 0a 20 20 20  me none } {..   
17150 20 20 20 75 70 76 61 72 20 31 20 24 76 61 72 4e     upvar 1 $varN
17160 61 6d 65 20 66 6c 61 67 73 0d 0a 0d 0a 20 20 20  ame flags....   
17170 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
17180 69 73 74 73 20 66 6c 61 67 73 5d 7d 20 74 68 65  ists flags]} the
17190 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74  n {..        ret
171a0 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20  urn true..      
171b0 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  }....      if {[
171c0 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 66  string length $f
171d0 6c 61 67 73 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  lags] == 0} then
171e0 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   {..        retu
171f0 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20 7d  rn true..      }
17200 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 6e  ....      if {$n
17210 6f 6e 65 20 26 26 20 24 66 6c 61 67 73 20 65 71  one && $flags eq
17220 20 22 4e 6f 6e 65 22 7d 20 74 68 65 6e 20 7b 0d   "None"} then {.
17230 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
17240 74 72 75 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  true..      }...
17250 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61  .      return fa
17260 6c 73 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20  lse..    }..... 
17270 20 20 20 70 72 6f 63 20 67 65 74 43 6f 6e 6e 65     proc getConne
17280 63 74 69 6f 6e 46 6c 61 67 73 20 7b 20 66 69 6c  ctionFlags { fil
17290 65 4e 61 6d 65 20 66 6c 61 67 73 20 7b 71 75 69  eName flags {qui
172a0 65 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20  et false} } {.. 
172b0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
172c0 4e 4f 54 45 3a 20 46 69 67 75 72 65 20 6f 75 74  NOTE: Figure out
172d0 20 77 68 69 63 68 20 64 61 74 61 62 61 73 65 20   which database 
172e0 66 69 6c 65 20 6e 61 6d 65 20 6f 72 20 63 6f 6e  file name or con
172f0 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e 67 20 74  nection string t
17300 68 65 73 65 0d 0a 20 20 20 20 20 20 23 20 20 20  hese..      #   
17310 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66      connection f
17320 6c 61 67 73 20 77 69 6c 6c 20 61 63 74 75 61 6c  lags will actual
17330 6c 79 20 61 70 70 6c 79 20 74 6f 2e 20 20 54 68  ly apply to.  Th
17340 69 73 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73  is is not necess
17350 61 72 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ary..      #    
17360 20 20 20 69 6e 20 71 75 69 65 74 20 6d 6f 64 65     in quiet mode
17370 20 62 65 63 61 75 73 65 20 74 68 69 73 20 69 6e   because this in
17380 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6f 6e 6c  formation is onl
17390 79 20 75 73 65 64 20 66 6f 72 20 6c 6f 67 67 69  y used for loggi
173a0 6e 67 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ng..      #     
173b0 20 20 61 6e 64 20 72 65 70 6f 72 74 69 6e 67 20    and reporting 
173c0 70 75 72 70 6f 73 65 73 2e 0d 0a 20 20 20 20 20  purposes...     
173d0 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 24   #..      if {!$
173e0 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
173f0 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69         if {[stri
17400 6e 67 20 6c 65 6e 67 74 68 20 24 66 69 6c 65 4e  ng length $fileN
17410 61 6d 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ame] > 0} then {
17420 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
17430 64 61 74 61 62 61 73 65 20 5b 61 70 70 65 6e 64  database [append
17440 41 72 67 73 20 22 66 69 6c 65 20 6e 61 6d 65 20  Args "file name 
17450 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c 22  \"" $fileName \"
17460 5d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73  ]..        } els
17470 65 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74  eif {[info exist
17480 73 20 3a 3a 64 61 74 61 53 6f 75 72 63 65 5d 20  s ::dataSource] 
17490 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
174a0 20 20 21 5b 61 72 72 61 79 20 65 78 69 73 74 73    ![array exists
174b0 20 3a 3a 64 61 74 61 53 6f 75 72 63 65 5d 7d 20   ::dataSource]} 
174c0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
174d0 20 20 73 65 74 20 64 61 74 61 62 61 73 65 20 5b    set database [
174e0 61 70 70 65 6e 64 41 72 67 73 20 22 64 61 74 61  appendArgs "data
174f0 20 73 6f 75 72 63 65 20 5c 22 22 20 24 3a 3a 64   source \"" $::d
17500 61 74 61 53 6f 75 72 63 65 20 5c 22 5d 0d 0a 20  ataSource \"].. 
17510 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
17520 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20 64  .          set d
17530 61 74 61 62 61 73 65 20 3c 75 6e 6b 6e 6f 77 6e  atabase <unknown
17540 3e 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  >..        }..  
17550 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
17560 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
17570 45 76 65 6e 20 74 68 6f 75 67 68 20 74 68 65 72  Even though ther
17580 65 20 69 73 20 6f 6e 6c 79 20 6f 6e 65 20 73 6f  e is only one so
17590 75 72 63 65 20 6f 66 20 66 6c 61 67 73 20 73 6f  urce of flags so
175a0 20 66 61 72 2c 20 74 68 65 79 0d 0a 20 20 20 20   far, they..    
175b0 20 20 23 20 20 20 20 20 20 20 6d 75 73 74 20 62    #       must b
175c0 65 20 63 6f 6d 62 69 6e 65 64 20 75 73 69 6e 67  e combined using
175d0 20 74 68 65 20 63 6f 72 72 65 63 74 20 73 79 6e   the correct syn
175e0 74 61 78 20 66 6f 72 20 65 6e 75 6d 65 72 61 74  tax for enumerat
175f0 65 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ed..      #     
17600 20 20 66 6c 61 67 20 76 61 6c 75 65 73 20 66 6f    flag values fo
17610 72 20 74 68 65 20 2e 4e 45 54 20 46 72 61 6d 65  r the .NET Frame
17620 77 6f 72 6b 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  work...      #..
17630 20 20 20 20 20 20 73 65 74 20 66 6c 61 67 73 20        set flags 
17640 5b 63 6f 6d 62 69 6e 65 46 6c 61 67 73 20 24 66  [combineFlags $f
17650 6c 61 67 73 20 22 22 5d 0d 0a 0d 0a 20 20 20 20  lags ""]....    
17660 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
17670 45 3a 20 53 68 6f 77 20 28 61 6e 64 20 6c 6f 67  E: Show (and log
17680 29 20 74 68 65 20 6c 6f 63 61 6c 20 63 6f 6e 6e  ) the local conn
17690 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 61 6e 64  ection flags and
176a0 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 0d   the associated.
176b0 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64  .      #       d
176c0 61 74 61 20 73 6f 75 72 63 65 20 6f 72 20 66 69  ata source or fi
176d0 6c 65 20 6e 61 6d 65 2e 0d 0a 20 20 20 20 20 20  le name...      
176e0 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 24 71  #..      if {!$q
176f0 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
17700 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
17710 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 65 6d 69   exists ::no(emi
17720 74 4c 6f 63 61 6c 46 6c 61 67 73 29 5d 20 26 26  tLocalFlags)] &&
17730 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
17740 28 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  (![info exists :
17750 3a 6e 6f 28 65 6d 69 74 4c 6f 63 61 6c 46 6c 61  :no(emitLocalFla
17760 67 73 49 66 4e 6f 6e 65 29 5d 20 7c 7c 20 5c 0d  gsIfNone)] || \.
17770 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 21 5b  .             ![
17780 68 61 73 4e 6f 46 6c 61 67 73 20 66 6c 61 67 73  hasNoFlags flags
17790 20 66 61 6c 73 65 5d 29 7d 20 74 68 65 6e 20 7b   false])} then {
177a0 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74  ..          tput
177b0 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
177c0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
177d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
177e0 2d 2d 2d 2d 20 6c 6f 63 61 6c 20 63 6f 6e 6e 65  ---- local conne
177f0 63 74 69 6f 6e 20 66 6c 61 67 73 20 66 6f 72 20  ction flags for 
17800 22 20 24 64 61 74 61 62 61 73 65 20 5c 0d 0a 20  " $database \.. 
17810 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 61               " a
17820 72 65 3a 20 22 20 5b 65 78 70 72 20 7b 21 5b 68  re: " [expr {![h
17830 61 73 4e 6f 46 6c 61 67 73 20 66 6c 61 67 73 20  asNoFlags flags 
17840 66 61 6c 73 65 5d 20 3f 20 5c 0d 0a 20 20 20 20  false] ? \..    
17850 20 20 20 20 20 20 20 20 20 20 5b 61 70 70 65 6e            [appen
17860 64 41 72 67 73 20 5c 22 20 24 66 6c 61 67 73 20  dArgs \" $flags 
17870 5c 22 5d 20 3a 20 22 3c 6e 6f 6e 65 3e 22 7d 5d  \"] : "<none>"}]
17880 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d   \n]..        }.
17890 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
178a0 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
178b0 45 3a 20 53 68 6f 77 20 28 61 6e 64 20 6c 6f 67  E: Show (and log
178c0 29 20 74 68 65 20 73 68 61 72 65 64 20 63 6f 6e  ) the shared con
178d0 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 2e 0d 0a  nection flags...
178e0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
178f0 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
17900 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   {..        if {
17910 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
17920 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b      object invok
17930 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  e System.Data.SQ
17940 4c 69 74 65 2e 53 51 4c 69 74 65 43 6f 6e 6e 65  Lite.SQLiteConne
17950 63 74 69 6f 6e 20 53 68 61 72 65 64 46 6c 61 67  ction SharedFlag
17960 73 0d 0a 20 20 20 20 20 20 20 20 7d 20 73 68 61  s..        } sha
17970 72 65 64 46 6c 61 67 73 5d 20 3d 3d 20 30 7d 20  redFlags] == 0} 
17980 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
17990 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
179a0 73 74 73 20 3a 3a 6e 6f 28 65 6d 69 74 53 68 61  sts ::no(emitSha
179b0 72 65 64 46 6c 61 67 73 29 5d 20 26 26 20 5c 0d  redFlags)] && \.
179c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  .              (
179d0 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
179e0 6e 6f 28 65 6d 69 74 53 68 61 72 65 64 46 6c 61  no(emitSharedFla
179f0 67 73 49 66 4e 6f 6e 65 29 5d 20 7c 7c 20 5c 0d  gsIfNone)] || \.
17a00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17a10 21 5b 68 61 73 4e 6f 46 6c 61 67 73 20 73 68 61  ![hasNoFlags sha
17a20 72 65 64 46 6c 61 67 73 20 74 72 75 65 5d 29 7d  redFlags true])}
17a30 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
17a40 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
17a50 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
17a60 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
17a70 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
17a80 73 68 61 72 65 64 20 63 6f 6e 6e 65 63 74 69 6f  shared connectio
17a90 6e 20 66 6c 61 67 73 20 66 6f 72 20 22 20 24 64  n flags for " $d
17aa0 61 74 61 62 61 73 65 20 5c 0d 0a 20 20 20 20 20  atabase \..     
17ab0 20 20 20 20 20 20 20 20 20 20 20 22 20 61 72 65             " are
17ac0 3a 20 22 20 5b 65 78 70 72 20 7b 21 5b 68 61 73  : " [expr {![has
17ad0 4e 6f 46 6c 61 67 73 20 73 68 61 72 65 64 46 6c  NoFlags sharedFl
17ae0 61 67 73 20 74 72 75 65 5d 20 3f 20 5c 0d 0a 20  ags true] ? \.. 
17af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b                 [
17b00 61 70 70 65 6e 64 41 72 67 73 20 5c 22 20 24 73  appendArgs \" $s
17b10 68 61 72 65 64 46 6c 61 67 73 20 5c 22 5d 20 3a  haredFlags \"] :
17b20 20 22 3c 6e 6f 6e 65 3e 22 7d 5d 20 5c 6e 5d 0d   "<none>"}] \n].
17b30 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
17b40 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
17b50 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
17b60 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
17b70 28 65 6d 69 74 53 68 61 72 65 64 46 6c 61 67 73  (emitSharedFlags
17b80 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  )] && \..       
17b90 20 20 20 20 20 20 20 21 5b 69 6e 66 6f 20 65 78         ![info ex
17ba0 69 73 74 73 20 3a 3a 6e 6f 28 65 6d 69 74 53 68  ists ::no(emitSh
17bb0 61 72 65 64 46 6c 61 67 73 49 66 55 6e 61 76 61  aredFlagsIfUnava
17bc0 69 6c 61 62 6c 65 29 5d 7d 20 74 68 65 6e 20 7b  ilable)]} then {
17bd0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
17be0 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
17bf0 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
17c00 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
17c10 20 20 20 22 2d 2d 2d 2d 20 73 68 61 72 65 64 20     "---- shared 
17c20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73  connection flags
17c30 20 66 6f 72 20 22 20 24 64 61 74 61 62 61 73 65   for " $database
17c40 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
17c50 20 20 20 20 22 20 61 72 65 3a 20 3c 75 6e 61 76      " are: <unav
17c60 61 69 6c 61 62 6c 65 3e 5c 6e 22 5d 0d 0a 20 20  ailable>\n"]..  
17c70 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
17c80 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d     }..      }...
17c90 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
17ca0 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20 28 61 6e  # NOTE: Show (an
17cb0 64 20 6c 6f 67 29 20 74 68 65 20 64 65 74 65 63  d log) the detec
17cc0 74 65 64 20 67 6c 6f 62 61 6c 20 63 6f 6e 6e 65  ted global conne
17cd0 63 74 69 6f 6e 20 66 6c 61 67 73 2c 20 69 66 20  ction flags, if 
17ce0 61 6e 79 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  any...      #.. 
17cf0 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
17d00 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
17d10 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
17d20 73 74 73 20 3a 3a 6e 6f 28 65 6d 69 74 47 6c 6f  sts ::no(emitGlo
17d30 62 61 6c 46 6c 61 67 73 29 5d 20 26 26 20 5c 0d  balFlags)] && \.
17d40 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 21 5b  .            (![
17d50 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
17d60 28 65 6d 69 74 47 6c 6f 62 61 6c 46 6c 61 67 73  (emitGlobalFlags
17d70 49 66 4e 6f 6e 65 29 5d 20 7c 7c 20 5c 0d 0a 20  IfNone)] || \.. 
17d80 20 20 20 20 20 20 20 20 20 20 20 20 21 5b 68 61              ![ha
17d90 73 4e 6f 46 6c 61 67 73 20 3a 3a 63 6f 6e 6e 65  sNoFlags ::conne
17da0 63 74 69 6f 6e 5f 66 6c 61 67 73 20 66 61 6c 73  ction_flags fals
17db0 65 5d 29 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  e])} then {..   
17dc0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
17dd0 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
17de0 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
17df0 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
17e00 67 6c 6f 62 61 6c 20 63 6f 6e 6e 65 63 74 69 6f  global connectio
17e10 6e 20 66 6c 61 67 73 20 61 72 65 3a 20 22 20 5c  n flags are: " \
17e20 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
17e30 5b 65 78 70 72 20 7b 21 5b 68 61 73 4e 6f 46 6c  [expr {![hasNoFl
17e40 61 67 73 20 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e  ags ::connection
17e50 5f 66 6c 61 67 73 20 66 61 6c 73 65 5d 20 3f 20  _flags false] ? 
17e60 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
17e70 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 22 20   [appendArgs \" 
17e80 24 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e 5f 66 6c  $::connection_fl
17e90 61 67 73 20 5c 22 5d 20 3a 20 22 3c 6e 6f 6e 65  ags \"] : "<none
17ea0 3e 22 7d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  >"}] \n]..      
17eb0 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a    }..      }....
17ec0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
17ed0 20 4e 4f 54 45 3a 20 49 66 20 74 68 65 72 65 20   NOTE: If there 
17ee0 61 72 65 20 61 6e 79 20 67 6c 6f 62 61 6c 20 28  are any global (
17ef0 70 65 72 20 74 65 73 74 20 72 75 6e 29 20 63 6f  per test run) co
17f00 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 63  nnection flags c
17f10 75 72 72 65 6e 74 6c 79 0d 0a 20 20 20 20 20 20  urrently..      
17f20 23 20 20 20 20 20 20 20 73 65 74 2c 20 75 73 65  #       set, use
17f30 20 74 68 65 6d 20 6e 6f 77 20 28 69 2e 65 2e 20   them now (i.e. 
17f40 62 79 20 63 6f 6d 62 69 6e 69 6e 67 20 74 68 65  by combining the
17f50 6d 20 77 69 74 68 20 74 68 65 20 6f 6e 65 73 20  m with the ones 
17f60 66 6f 72 20 74 68 69 73 0d 0a 20 20 20 20 20 20  for this..      
17f70 23 20 20 20 20 20 20 20 63 6f 6e 6e 65 63 74 69  #       connecti
17f80 6f 6e 29 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  on)...      #.. 
17f90 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65       if {[info e
17fa0 78 69 73 74 73 20 3a 3a 63 6f 6e 6e 65 63 74 69  xists ::connecti
17fb0 6f 6e 5f 66 6c 61 67 73 5d 7d 20 74 68 65 6e 20  on_flags]} then 
17fc0 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
17fd0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 6f        # NOTE: Co
17fe0 6d 62 69 6e 65 20 61 6e 64 2f 6f 72 20 72 65 70  mbine and/or rep
17ff0 6c 61 63 65 20 74 68 65 20 63 6f 6e 6e 65 63 74  lace the connect
18000 69 6f 6e 20 66 6c 61 67 73 20 61 6e 64 20 74 68  ion flags and th
18010 65 6e 20 73 68 6f 77 20 74 68 65 0d 0a 20 20 20  en show the..   
18020 20 20 20 20 20 23 20 20 20 20 20 20 20 6e 65 77       #       new
18030 20 76 61 6c 75 65 2e 0d 0a 20 20 20 20 20 20 20   value...       
18040 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   #..        set 
18050 66 6c 61 67 73 20 5b 63 6f 6d 62 69 6e 65 46 6c  flags [combineFl
18060 61 67 73 20 24 66 6c 61 67 73 20 24 3a 3a 63 6f  ags $flags $::co
18070 6e 6e 65 63 74 69 6f 6e 5f 66 6c 61 67 73 5d 0d  nnection_flags].
18080 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
18090 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 68        # NOTE: Sh
180a0 6f 77 20 28 61 6e 64 20 6c 6f 67 29 20 74 68 65  ow (and log) the
180b0 20 6e 65 77 20 65 66 66 65 63 74 69 76 65 20 63   new effective c
180c0 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 2e  onnection flags.
180d0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
180e0 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
180f0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
18100 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
18110 78 69 73 74 73 20 3a 3a 6e 6f 28 65 6d 69 74 43  xists ::no(emitC
18120 6f 6d 62 69 6e 65 64 46 6c 61 67 73 29 5d 20 26  ombinedFlags)] &
18130 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  & \..           
18140 20 20 20 28 21 5b 69 6e 66 6f 20 65 78 69 73 74     (![info exist
18150 73 20 3a 3a 6e 6f 28 65 6d 69 74 43 6f 6d 62 69  s ::no(emitCombi
18160 6e 65 64 46 6c 61 67 73 49 66 4e 6f 6e 65 29 5d  nedFlagsIfNone)]
18170 20 7c 7c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   || \..         
18180 20 20 20 20 20 20 21 5b 68 61 73 4e 6f 46 6c 61        ![hasNoFla
18190 67 73 20 66 6c 61 67 73 20 66 61 6c 73 65 5d 29  gs flags false])
181a0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
181b0 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
181c0 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
181d0 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
181e0 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
181f0 20 63 6f 6d 62 69 6e 65 64 20 63 6f 6e 6e 65 63   combined connec
18200 74 69 6f 6e 20 66 6c 61 67 73 20 66 6f 72 20 22  tion flags for "
18210 20 24 64 61 74 61 62 61 73 65 20 5c 0d 0a 20 20   $database \..  
18220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
18230 61 72 65 3a 20 22 20 5b 65 78 70 72 20 7b 21 5b  are: " [expr {![
18240 68 61 73 4e 6f 46 6c 61 67 73 20 66 6c 61 67 73  hasNoFlags flags
18250 20 66 61 6c 73 65 5d 20 3f 20 5c 0d 0a 20 20 20   false] ? \..   
18260 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 61 70               [ap
18270 70 65 6e 64 41 72 67 73 20 5c 22 20 24 66 6c 61  pendArgs \" $fla
18280 67 73 20 5c 22 5d 20 3a 20 22 3c 6e 6f 6e 65 3e  gs \"] : "<none>
18290 22 7d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  "}] \n]..       
182a0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
182b0 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
182c0 20 20 72 65 74 75 72 6e 20 24 66 6c 61 67 73 0d    return $flags.
182d0 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
182e0 72 6f 63 20 67 65 74 46 6c 61 67 73 50 72 6f 70  roc getFlagsProp
182f0 65 72 74 79 20 7b 20 7b 66 6c 61 67 73 20 22 22  erty { {flags ""
18300 7d 20 7b 71 75 69 65 74 20 66 61 6c 73 65 7d 20  } {quiet false} 
18310 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
18320 20 20 20 20 23 20 4e 4f 54 45 3a 20 44 65 74 65      # NOTE: Dete
18330 72 6d 69 6e 65 20 77 68 61 74 20 74 68 65 20 63  rmine what the c
18340 6f 6d 62 69 6e 65 64 20 28 67 6c 6f 62 61 6c 20  ombined (global 
18350 61 6e 64 20 6c 6f 63 61 6c 29 20 63 6f 6e 6e 65  and local) conne
18360 63 74 69 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20  ction..      #  
18370 20 20 20 20 20 66 6c 61 67 73 20 73 68 6f 75 6c       flags shoul
18380 64 20 62 65 2c 20 70 6f 73 73 69 62 6c 79 20 71  d be, possibly q
18390 75 69 65 74 6c 79 2e 0d 0a 20 20 20 20 20 20 23  uietly...      #
183a0 0d 0a 20 20 20 20 20 20 73 65 74 20 66 6c 61 67  ..      set flag
183b0 73 20 5b 67 65 74 43 6f 6e 6e 65 63 74 69 6f 6e  s [getConnection
183c0 46 6c 61 67 73 20 22 22 20 24 66 6c 61 67 73 20  Flags "" $flags 
183d0 24 71 75 69 65 74 5d 0d 0a 0d 0a 20 20 20 20 20  $quiet]....     
183e0 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
183f0 3a 20 49 66 20 6e 6f 20 67 6c 6f 62 61 6c 20 6f  : If no global o
18400 72 20 6c 6f 63 61 6c 20 63 6f 6e 6e 65 63 74 69  r local connecti
18410 6f 6e 20 66 6c 61 67 73 20 77 65 72 65 20 73 70  on flags were sp
18420 65 63 69 66 69 65 64 2c 20 74 68 65 0d 0a 20 20  ecified, the..  
18430 20 20 20 20 23 20 20 20 20 20 20 20 64 65 66 61      #       defa
18440 75 6c 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66  ult connection f
18450 6c 61 67 73 20 73 68 6f 75 6c 64 20 62 65 20 75  lags should be u
18460 73 65 64 3b 20 74 68 65 72 65 66 6f 72 65 2c 20  sed; therefore, 
18470 72 65 74 75 72 6e 0d 0a 20 20 20 20 20 20 23 20  return..      # 
18480 20 20 20 20 20 20 61 6e 20 65 6d 70 74 79 20 73        an empty s
18490 74 72 69 6e 67 20 69 6e 20 74 68 61 74 20 63 61  tring in that ca
184a0 73 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  se...      #..  
184b0 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
184c0 6c 65 6e 67 74 68 20 24 66 6c 61 67 73 5d 20 3d  length $flags] =
184d0 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
184e0 20 20 20 20 20 72 65 74 75 72 6e 20 22 22 0d 0a       return ""..
184f0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
18500 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
18510 3a 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 63 68  : In order to ch
18520 65 63 6b 20 69 66 20 74 68 65 20 64 65 66 61 75  eck if the defau
18530 6c 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c  lt connection fl
18540 61 67 73 20 61 72 65 20 62 65 69 6e 67 20 75 73  ags are being us
18550 65 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ed..      #     
18560 20 20 69 74 20 69 73 20 6e 65 63 65 73 73 61 72    it is necessar
18570 79 20 74 6f 20 61 74 74 65 6d 70 74 20 61 20 63  y to attempt a c
18580 6f 6e 76 65 72 73 69 6f 6e 20 74 6f 20 74 68 65  onversion to the
18590 20 61 63 74 75 61 6c 20 65 6e 75 6d 65 72 61 74   actual enumerat
185a0 65 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ed..      #     
185b0 20 20 74 79 70 65 2e 20 20 46 61 69 6c 69 6e 67    type.  Failing
185c0 20 74 68 61 74 2c 20 74 68 65 20 63 68 65 63 6b   that, the check
185d0 20 61 67 61 69 6e 73 74 20 74 68 65 20 64 65 66   against the def
185e0 61 75 6c 74 20 76 61 6c 75 65 20 77 69 6c 6c 20  ault value will 
185f0 62 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  be..      #     
18600 20 20 73 6b 69 70 70 65 64 2e 0d 0a 20 20 20 20    skipped...    
18610 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
18620 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
18630 20 73 65 74 20 65 72 72 6f 72 20 6e 75 6c 6c 3b   set error null;
18640 20 23 20 49 47 4e 4f 52 45 44 0d 0a 0d 0a 20 20   # IGNORED....  
18650 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76        object inv
18660 6f 6b 65 20 55 74 69 6c 69 74 79 20 54 72 79 50  oke Utility TryP
18670 61 72 73 65 46 6c 61 67 73 45 6e 75 6d 20 22 22  arseFlagsEnum ""
18680 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
18690 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
186a0 74 65 2e 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74  te.SQLiteConnect
186b0 69 6f 6e 46 6c 61 67 73 20 22 22 20 24 66 6c 61  ionFlags "" $fla
186c0 67 73 20 6e 75 6c 6c 20 74 72 75 65 20 5c 0d 0a  gs null true \..
186d0 20 20 20 20 20 20 20 20 20 20 20 20 74 72 75 65              true
186e0 20 74 72 75 65 20 65 72 72 6f 72 0d 0a 20 20 20   true error..   
186f0 20 20 20 7d 20 76 61 6c 75 65 5d 7d 20 74 68 65     } value]} the
18700 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
18710 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
18720 41 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 70 61  Attempting to pa
18730 72 73 65 20 74 68 65 20 63 6f 6e 6e 65 63 74 69  rse the connecti
18740 6f 6e 20 66 6c 61 67 73 20 63 61 75 73 65 64 20  on flags caused 
18750 61 20 73 63 72 69 70 74 0d 0a 20 20 20 20 20 20  a script..      
18760 20 20 23 20 20 20 20 20 20 20 65 72 72 6f 72 2e    #       error.
18770 20 20 45 6d 69 74 20 61 20 77 61 72 6e 69 6e 67    Emit a warning
18780 20 74 6f 20 74 68 65 20 74 65 73 74 20 6c 6f 67   to the test log
18790 20 66 69 6c 65 20 61 6e 64 20 63 6f 6e 74 69 6e   file and contin
187a0 75 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ue..        #   
187b0 20 20 20 20 75 73 69 6e 67 20 61 6e 20 65 6d 74      using an emt
187c0 70 79 20 73 74 72 69 6e 67 20 69 6e 73 74 65 61  py string instea
187d0 64 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  d...        #.. 
187e0 20 20 20 20 20 20 20 74 6c 6f 67 20 5b 61 70 70         tlog [app
187f0 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
18800 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52         "==== WAR
18810 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20  NING: failed to 
18820 70 61 72 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  parse connection
18830 20 66 6c 61 67 73 2c 20 65 72 72 6f 72 3a 20 22   flags, error: "
18840 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
18850 5c 6e 5c 74 20 24 76 61 6c 75 65 20 5c 6e 5d 0d  \n\t $value \n].
18860 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 76  ...        set v
18870 61 6c 75 65 20 22 22 0d 0a 20 20 20 20 20 20 7d  alue ""..      }
18880 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
18890 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 74 68     # NOTE: If th
188a0 65 20 63 6f 6d 62 69 6e 65 64 20 66 6c 61 67 73  e combined flags
188b0 20 73 74 72 69 6e 67 20 63 6f 75 6c 64 20 6e 6f   string could no
188c0 74 20 61 63 74 75 61 6c 6c 79 20 62 65 20 63 6f  t actually be co
188d0 6e 76 65 72 74 65 64 0d 0a 20 20 20 20 20 20 23  nverted..      #
188e0 20 20 20 20 20 20 20 74 6f 20 74 68 65 20 65 6e         to the en
188f0 75 6d 65 72 61 74 65 64 20 74 79 70 65 20 69 74  umerated type it
18900 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 20   is the default 
18910 76 61 6c 75 65 2c 20 74 68 65 6e 20 6a 75 73 74  value, then just
18920 20 75 73 65 0d 0a 20 20 20 20 20 20 23 20 20 20   use..      #   
18930 20 20 20 20 69 74 20 76 65 72 62 61 74 69 6d 3b      it verbatim;
18940 20 6f 74 68 65 72 77 69 73 65 2c 20 6a 75 73 74   otherwise, just
18950 20 72 65 74 75 72 6e 20 61 6e 20 65 6d 70 74 79   return an empty
18960 20 73 74 72 69 6e 67 2e 20 20 49 6e 20 74 68 61   string.  In tha
18970 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  t..      #      
18980 20 63 61 73 65 2c 20 74 68 65 20 64 65 66 61 75   case, the defau
18990 6c 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c  lt connection fl
189a0 61 67 73 20 77 69 6c 6c 20 62 65 20 75 73 65 64  ags will be used
189b0 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
189c0 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
189d0 6e 67 74 68 20 24 76 61 6c 75 65 5d 20 3d 3d 20  ngth $value] == 
189e0 30 20 7c 7c 20 24 76 61 6c 75 65 20 6e 65 20 22  0 || $value ne "
189f0 44 65 66 61 75 6c 74 22 7d 20 74 68 65 6e 20 7b  Default"} then {
18a00 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
18a10 20 20 20 20 20 23 20 57 41 52 4e 49 4e 47 3a 20       # WARNING: 
18a20 54 68 69 73 20 72 65 74 75 72 6e 73 20 74 68 65  This returns the
18a30 20 73 74 72 69 6e 67 20 76 61 6c 75 65 20 6f 66   string value of
18a40 20 74 68 65 20 63 6f 6d 62 69 6e 65 64 20 66 6c   the combined fl
18a50 61 67 73 2c 20 6e 6f 74 0d 0a 20 20 20 20 20 20  ags, not..      
18a60 20 20 23 20 20 20 20 20 20 20 20 20 20 74 68 65    #          the
18a70 20 65 6e 75 6d 65 72 61 74 65 64 20 76 61 6c 75   enumerated valu
18a80 65 2e 20 20 54 68 69 73 20 69 73 20 62 79 20 64  e.  This is by d
18a90 65 73 69 67 6e 20 61 6e 64 20 73 68 6f 75 6c 64  esign and should
18aa0 20 6e 6f 74 0d 0a 20 20 20 20 20 20 20 20 23 20   not..        # 
18ab0 20 20 20 20 20 20 20 20 20 62 65 20 63 68 61 6e           be chan
18ac0 67 65 64 20 77 69 74 68 6f 75 74 20 63 61 72 65  ged without care
18ad0 66 75 6c 20 63 6f 6e 73 69 64 65 72 61 74 69 6f  ful consideratio
18ae0 6e 20 28 65 2e 67 2e 20 69 74 20 77 6f 75 6c 64  n (e.g. it would
18af0 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
18b00 20 20 20 20 20 70 72 65 76 65 6e 74 20 74 68 65       prevent the
18b10 20 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f   SQLiteConnectio
18b20 6e 20 63 6c 61 73 73 20 66 72 6f 6d 20 61 6c 6c  n class from all
18b30 6f 77 69 6e 67 20 69 6e 76 61 6c 69 64 0d 0a 20  owing invalid.. 
18b40 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20         #        
18b50 20 20 5b 22 6d 61 67 69 63 61 6c 22 5d 20 6d 65    ["magical"] me
18b60 74 61 2d 66 6c 61 67 73 29 2e 0d 0a 20 20 20 20  ta-flags)...    
18b70 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
18b80 65 74 75 72 6e 20 5b 61 70 70 65 6e 64 41 72 67  eturn [appendArg
18b90 73 20 22 46 6c 61 67 73 3d 22 20 24 66 6c 61 67  s "Flags=" $flag
18ba0 73 20 5c 3b 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a  s \;]..      }..
18bb0 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 22  ..      return "
18bc0 22 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  "..    }.....   
18bd0 20 70 72 6f 63 20 67 65 74 54 65 73 74 50 72 6f   proc getTestPro
18be0 70 65 72 74 69 65 73 20 7b 20 7b 66 6c 61 67 73  perties { {flags
18bf0 20 22 22 7d 20 7b 71 75 69 65 74 20 66 61 6c 73   ""} {quiet fals
18c00 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  e} } {..      #.
18c10 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53  .      # NOTE: S
18c20 74 61 72 74 20 77 69 74 68 20 22 46 6c 61 67 73  tart with "Flags
18c30 22 20 70 72 6f 70 65 72 74 79 20 66 6f 72 20 74  " property for t
18c40 68 65 20 6e 65 77 20 63 6f 6e 6e 65 63 74 69 6f  he new connectio
18c50 6e 2c 20 69 66 20 61 6e 79 2e 0d 0a 20 20 20 20  n, if any...    
18c60 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 72    #..      set r
18c70 65 73 75 6c 74 20 5b 67 65 74 46 6c 61 67 73 50  esult [getFlagsP
18c80 72 6f 70 65 72 74 79 20 24 66 6c 61 67 73 20 24  roperty $flags $
18c90 71 75 69 65 74 5d 0d 0a 0d 0a 20 20 20 20 20 20  quiet]....      
18ca0 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
18cb0 20 41 64 64 20 74 68 65 20 6e 61 6d 65 20 6f 66   Add the name of
18cc0 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 65 73   the current tes
18cd0 74 20 66 69 6c 65 2c 20 69 66 20 61 76 61 69 6c  t file, if avail
18ce0 61 62 6c 65 2e 20 20 54 68 69 73 20 69 73 0d 0a  able.  This is..
18cf0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6f 6e        #       on
18d00 6c 79 20 75 73 65 64 20 66 6f 72 20 64 65 62 75  ly used for debu
18d10 67 67 69 6e 67 2e 0d 0a 20 20 20 20 20 20 23 0d  gging...      #.
18d20 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f  .      if {[info
18d30 20 65 78 69 73 74 73 20 3a 3a 74 65 73 74 5f 66   exists ::test_f
18d40 69 6c 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ile]} then {..  
18d50 20 20 20 20 20 20 61 70 70 65 6e 64 20 72 65 73        append res
18d60 75 6c 74 20 54 65 73 74 46 69 6c 65 3d 20 24 3a  ult TestFile= $:
18d70 3a 74 65 73 74 5f 66 69 6c 65 20 5c 3b 0d 0a 20  :test_file \;.. 
18d80 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
18d90 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
18da0 20 41 64 64 20 74 68 65 20 6e 61 6d 65 20 6f 66   Add the name of
18db0 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 65 73   the current tes
18dc0 74 2c 20 69 66 20 61 76 61 69 6c 61 62 6c 65 2e  t, if available.
18dd0 20 20 54 68 69 73 20 69 73 20 6f 6e 6c 79 0d 0a    This is only..
18de0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 75 73        #       us
18df0 65 64 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67  ed for debugging
18e00 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
18e10 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73    if {[info exis
18e20 74 73 20 3a 3a 65 61 67 6c 65 5f 74 65 73 74 73  ts ::eagle_tests
18e30 28 43 75 72 72 65 6e 74 4e 61 6d 65 29 5d 7d 20  (CurrentName)]} 
18e40 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
18e50 61 70 70 65 6e 64 20 72 65 73 75 6c 74 20 54 65  append result Te
18e60 73 74 4e 61 6d 65 3d 20 24 3a 3a 65 61 67 6c 65  stName= $::eagle
18e70 5f 74 65 73 74 73 28 43 75 72 72 65 6e 74 4e 61  _tests(CurrentNa
18e80 6d 65 29 20 5c 3b 0d 0a 20 20 20 20 20 20 7d 0d  me) \;..      }.
18e90 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ...      return 
18ea0 24 72 65 73 75 6c 74 0d 0a 20 20 20 20 7d 0d 0a  $result..    }..
18eb0 0c 0d 0a 20 20 20 20 70 72 6f 63 20 65 6e 61 62  ...    proc enab
18ec0 6c 65 53 68 61 72 65 64 43 61 63 68 65 20 7b 20  leSharedCache { 
18ed0 63 68 61 6e 6e 65 6c 20 65 6e 61 62 6c 65 20 7b  channel enable {
18ee0 71 75 69 65 74 20 66 61 6c 73 65 7d 20 7d 20 7b  quiet false} } {
18ef0 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74  ..      if {[cat
18f00 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 6f 62  ch {..        ob
18f10 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61  ject invoke -fla
18f20 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d  gs +NonPublic \.
18f30 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73  .            Sys
18f40 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
18f50 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68  UnsafeNativeMeth
18f60 6f 64 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ods \..         
18f70 20 20 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c     sqlite3_enabl
18f80 65 5f 73 68 61 72 65 64 5f 63 61 63 68 65 20 5b  e_shared_cache [
18f90 65 78 70 72 20 69 6e 74 28 24 65 6e 61 62 6c 65  expr int($enable
18fa0 29 5d 0d 0a 20 20 20 20 20 20 7d 20 72 65 73 75  )]..      } resu
18fb0 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  lt] == 0} then {
18fc0 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 24  ..        if {!$
18fd0 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
18fe0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
18ff0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
19000 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
19010 20 20 20 20 20 22 2d 2d 2d 2d 20 63 61 6c 6c 20       "---- call 
19020 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 73  sqlite3_enable_s
19030 68 61 72 65 64 5f 63 61 63 68 65 28 22 20 24 65  hared_cache(" $e
19040 6e 61 62 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20  nable \..       
19050 20 20 20 20 20 20 20 22 29 2e 2e 2e 20 6f 6b 3a         ")... ok:
19060 20 22 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a   " $result \n]..
19070 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
19080 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
19090 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
190a0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
190b0 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
190c0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
190d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
190e0 2d 2d 2d 20 63 61 6c 6c 20 73 71 6c 69 74 65 33  --- call sqlite3
190f0 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f 63  _enable_shared_c
19100 61 63 68 65 28 22 20 24 65 6e 61 62 6c 65 20 5c  ache(" $enable \
19110 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
19120 22 29 2e 2e 2e 20 65 72 72 6f 72 3a 20 22 20 5c  ")... error: " \
19130 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d  n\t $result \n].
19140 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
19150 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
19160 20 20 20 70 72 6f 63 20 73 65 74 75 70 44 62 20     proc setupDb 
19170 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  {..            f
19180 69 6c 65 4e 61 6d 65 20 7b 6d 6f 64 65 20 22 22  ileName {mode ""
19190 7d 20 7b 64 61 74 65 54 69 6d 65 46 6f 72 6d 61  } {dateTimeForma
191a0 74 20 22 22 7d 20 7b 64 61 74 65 54 69 6d 65 4b  t ""} {dateTimeK
191b0 69 6e 64 20 22 22 7d 20 7b 66 6c 61 67 73 20 22  ind ""} {flags "
191c0 22 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  "}..            
191d0 7b 65 78 74 72 61 20 22 22 7d 20 7b 71 75 61 6c  {extra ""} {qual
191e0 69 66 79 20 74 72 75 65 7d 20 7b 64 65 6c 65 74  ify true} {delet
191f0 65 20 74 72 75 65 7d 20 7b 75 72 69 20 66 61 6c  e true} {uri fal
19200 73 65 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  se}..           
19210 20 7b 74 65 6d 70 6f 72 61 72 79 20 74 72 75 65   {temporary true
19220 7d 20 7b 76 61 72 4e 61 6d 65 20 64 62 7d 20 7b  } {varName db} {
19230 71 75 69 65 74 20 66 61 6c 73 65 7d 20 7d 20 7b  quiet false} } {
19240 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
19250 20 23 20 4e 4f 54 45 3a 20 46 69 72 73 74 2c 20   # NOTE: First, 
19260 73 65 65 20 69 66 20 6f 75 72 20 63 61 6c 6c 65  see if our calle
19270 72 20 68 61 73 20 72 65 71 75 65 73 74 65 64 20  r has requested 
19280 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
19290 61 62 61 73 65 2e 0d 0a 20 20 20 20 20 20 23 0d  abase...      #.
192a0 0a 20 20 20 20 20 20 73 65 74 20 69 73 4d 65 6d  .      set isMem
192b0 6f 72 79 20 5b 69 73 4d 65 6d 6f 72 79 44 62 20  ory [isMemoryDb 
192c0 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20 20  $fileName]....  
192d0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
192e0 4f 54 45 3a 20 46 6f 72 20 6e 6f 77 2c 20 61 6c  OTE: For now, al
192f0 6c 20 74 65 73 74 20 64 61 74 61 62 61 73 65 73  l test databases
19300 20 75 73 65 64 20 62 79 20 74 68 65 20 74 65 73   used by the tes
19310 74 20 73 75 69 74 65 20 61 72 65 20 70 6c 61 63  t suite are plac
19320 65 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ed..      #     
19330 20 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62    into the datab
19340 61 73 65 20 64 69 72 65 63 74 6f 72 79 2e 20 20  ase directory.  
19350 45 61 63 68 20 64 61 74 61 62 61 73 65 20 61 6e  Each database an
19360 64 20 72 65 6c 61 74 65 64 20 66 69 6c 65 73 0d  d related files.
19370 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 75  .      #       u
19380 73 65 64 20 62 79 20 61 20 74 65 73 74 20 73 68  sed by a test sh
19390 6f 75 6c 64 20 62 65 20 63 6c 65 61 6e 65 64 20  ould be cleaned 
193a0 75 70 20 62 79 20 74 68 61 74 20 74 65 73 74 20  up by that test 
193b0 75 73 69 6e 67 20 74 68 65 0d 0a 20 20 20 20 20  using the..     
193c0 20 23 20 20 20 20 20 20 20 22 63 6c 65 61 6e 75   #       "cleanu
193d0 70 44 62 22 20 70 72 6f 63 65 64 75 72 65 2c 20  pDb" procedure, 
193e0 62 65 6c 6f 77 2e 0d 0a 20 20 20 20 20 20 23 0d  below...      #.
193f0 0a 20 20 20 20 20 20 69 66 20 7b 21 24 69 73 4d  .      if {!$isM
19400 65 6d 6f 72 79 20 26 26 20 24 71 75 61 6c 69 66  emory && $qualif
19410 79 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  y} then {..     
19420 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 20     set fileName 
19430 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 44  [file join [getD
19440 61 74 61 62 61 73 65 44 69 72 65 63 74 6f 72 79  atabaseDirectory
19450 5d 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69  ] [file tail $fi
19460 6c 65 4e 61 6d 65 5d 5d 0d 0a 20 20 20 20 20 20  leName]]..      
19470 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
19480 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 79 20 64      # NOTE: By d
19490 65 66 61 75 6c 74 2c 20 64 65 6c 65 74 65 20 61  efault, delete a
194a0 6e 79 20 70 72 65 2d 65 78 69 73 74 69 6e 67 20  ny pre-existing 
194b0 64 61 74 61 62 61 73 65 20 77 69 74 68 20 74 68  database with th
194c0 65 20 73 61 6d 65 20 66 69 6c 65 0d 0a 20 20 20  e same file..   
194d0 20 20 20 23 20 20 20 20 20 20 20 6e 61 6d 65 20     #       name 
194e0 69 66 20 69 74 20 63 75 72 72 65 6e 74 6c 79 20  if it currently 
194f0 65 78 69 73 74 73 2e 0d 0a 20 20 20 20 20 20 23  exists...      #
19500 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 24 69 73  ..      if {!$is
19510 4d 65 6d 6f 72 79 20 26 26 20 24 64 65 6c 65 74  Memory && $delet
19520 65 20 26 26 20 5b 66 69 6c 65 20 65 78 69 73 74  e && [file exist
19530 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68  s $fileName]} th
19540 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
19550 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
19560 20 41 74 74 65 6d 70 74 20 74 6f 20 64 65 6c 65   Attempt to dele
19570 74 65 20 61 6e 79 20 70 72 65 2d 65 78 69 73 74  te any pre-exist
19580 69 6e 67 20 64 61 74 61 62 61 73 65 20 77 69 74  ing database wit
19590 68 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 0d  h the same file.
195a0 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
195b0 20 6e 61 6d 65 2e 0d 0a 20 20 20 20 20 20 20 20   name...        
195c0 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  #..        if {[
195d0 63 61 74 63 68 20 7b 66 69 6c 65 20 64 65 6c 65  catch {file dele
195e0 74 65 20 24 66 69 6c 65 4e 61 6d 65 7d 20 65 72  te $fileName} er
195f0 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ror]} then {..  
19600 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
19610 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 65 20       # NOTE: We 
19620 73 6f 6d 65 68 6f 77 20 66 61 69 6c 65 64 20 74  somehow failed t
19630 6f 20 64 65 6c 65 74 65 20 74 68 65 20 66 69 6c  o delete the fil
19640 65 2c 20 72 65 70 6f 72 74 20 77 68 79 2e 0d 0a  e, report why...
19650 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
19660 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
19670 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
19680 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
19690 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
196a0 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
196b0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d               "==
196c0 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c  == WARNING: fail
196d0 65 64 20 74 6f 20 64 65 6c 65 74 65 20 64 61 74  ed to delete dat
196e0 61 62 61 73 65 20 66 69 6c 65 20 5c 22 22 20 24  abase file \"" $
196f0 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20  fileName \..    
19700 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 20              "\" 
19710 64 75 72 69 6e 67 20 73 65 74 75 70 2c 20 65 72  during setup, er
19720 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72  ror: " \n\t $err
19730 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  or \n]..        
19740 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
19750 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
19760 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
19770 3a 20 52 65 66 65 72 20 74 6f 20 74 68 65 20 73  : Refer to the s
19780 70 65 63 69 66 69 65 64 20 76 61 72 69 61 62 6c  pecified variabl
19790 65 20 28 65 2e 67 2e 20 22 64 62 22 29 20 69 6e  e (e.g. "db") in
197a0 20 74 68 65 20 63 6f 6e 74 65 78 74 20 6f 66 20   the context of 
197b0 6f 75 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20  our..      #    
197c0 20 20 20 63 61 6c 6c 65 72 2e 20 20 54 68 65 20     caller.  The 
197d0 68 61 6e 64 6c 65 20 74 6f 20 74 68 65 20 6f 70  handle to the op
197e0 65 6e 65 64 20 64 61 74 61 62 61 73 65 20 77 69  ened database wi
197f0 6c 6c 20 62 65 20 73 74 6f 72 65 64 20 74 68 65  ll be stored the
19800 72 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  re...      #..  
19810 20 20 20 20 75 70 76 61 72 20 31 20 24 76 61 72      upvar 1 $var
19820 4e 61 6d 65 20 64 62 0d 0a 0d 0a 20 20 20 20 20  Name db....     
19830 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
19840 3a 20 53 74 61 72 74 20 62 75 69 6c 64 69 6e 67  : Start building
19850 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
19860 73 74 72 69 6e 67 2e 20 20 54 68 65 20 6f 6e 6c  string.  The onl
19870 79 20 72 65 71 75 69 72 65 64 20 70 6f 72 74 69  y required porti
19880 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  on..      #     
19890 20 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74    of the connect
198a0 69 6f 6e 20 73 74 72 69 6e 67 20 69 73 20 74 68  ion string is th
198b0 65 20 64 61 74 61 20 73 6f 75 72 63 65 2c 20 77  e data source, w
198c0 68 69 63 68 20 63 6f 6e 74 61 69 6e 73 20 74 68  hich contains th
198d0 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
198e0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e   database file n
198f0 61 6d 65 20 69 74 73 65 6c 66 2e 20 20 49 66 20  ame itself.  If 
19900 6f 75 72 20 63 61 6c 6c 65 72 20 77 61 6e 74 73  our caller wants
19910 20 74 6f 20 75 73 65 20 61 20 55 52 49 20 61 73   to use a URI as
19920 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
19930 74 68 65 20 64 61 74 61 20 73 6f 75 72 63 65 2c  the data source,
19940 20 75 73 65 20 74 68 65 20 46 75 6c 6c 55 72 69   use the FullUri
19950 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69   connection stri
19960 6e 67 20 70 72 6f 70 65 72 74 79 20 74 6f 0d 0a  ng property to..
19970 20 20 20 20 20 20 23 20 20 20 20 20 20 20 70 72        #       pr
19980 65 76 65 6e 74 20 74 68 65 20 64 61 74 61 20 73  event the data s
19990 6f 75 72 63 65 20 73 74 72 69 6e 67 20 66 72 6f  ource string fro
199a0 6d 20 62 65 69 6e 67 20 6d 61 6e 67 6c 65 64 2e  m being mangled.
199b0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
199c0 20 69 66 20 7b 24 75 72 69 7d 20 74 68 65 6e 20   if {$uri} then 
199d0 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 63  {..        set c
199e0 6f 6e 6e 65 63 74 69 6f 6e 20 7b 46 75 6c 6c 55  onnection {FullU
199f0 72 69 3d 24 7b 66 69 6c 65 4e 61 6d 65 7d 7d 0d  ri=${fileName}}.
19a00 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
19a10 0a 20 20 20 20 20 20 20 20 73 65 74 20 63 6f 6e  .        set con
19a20 6e 65 63 74 69 6f 6e 20 7b 44 61 74 61 20 53 6f  nection {Data So
19a30 75 72 63 65 3d 24 7b 66 69 6c 65 4e 61 6d 65 7d  urce=${fileName}
19a40 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  }..      }....  
19a50 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
19a60 4f 54 45 3a 20 53 69 6e 63 65 20 74 68 69 73 20  OTE: Since this 
19a70 70 72 6f 63 65 64 75 72 65 20 68 61 73 20 6e 6f  procedure has no
19a80 20 73 70 65 63 69 61 6c 20 6b 6e 6f 77 6c 65 64   special knowled
19a90 67 65 20 6f 66 20 77 68 61 74 20 74 68 65 20 64  ge of what the d
19aa0 65 66 61 75 6c 74 0d 0a 20 20 20 20 20 20 23 20  efault..      # 
19ab0 20 20 20 20 20 20 73 65 74 74 69 6e 67 20 69 73        setting is
19ac0 20 66 6f 72 20 74 68 65 20 54 6f 46 75 6c 6c 50   for the ToFullP
19ad0 61 74 68 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73  ath connection s
19ae0 74 72 69 6e 67 20 70 72 6f 70 65 72 79 2c 20 61  tring propery, a
19af0 6c 77 61 79 73 0d 0a 20 20 20 20 20 20 23 20 20  lways..      #  
19b00 20 20 20 20 20 61 64 64 20 74 68 65 20 76 61 6c       add the val
19b10 75 65 20 77 65 20 6b 6e 6f 77 20 61 62 6f 75 74  ue we know about
19b20 20 74 6f 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   to the connecti
19b30 6f 6e 20 73 74 72 69 6e 67 2e 0d 0a 20 20 20 20  on string...    
19b40 20 20 23 0d 0a 20 20 20 20 20 20 61 70 70 65 6e    #..      appen
19b50 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 3b 54  d connection {;T
19b60 6f 46 75 6c 6c 50 61 74 68 3d 24 7b 71 75 61 6c  oFullPath=${qual
19b70 69 66 79 7d 7d 0d 0a 0d 0a 20 20 20 20 20 20 23  ify}}....      #
19b80 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
19b90 49 66 20 6f 75 72 20 63 61 6c 6c 65 72 20 73 70  If our caller sp
19ba0 65 63 69 66 69 65 64 20 61 20 6a 6f 75 72 6e 61  ecified a journa
19bb0 6c 20 6d 6f 64 65 2c 20 61 64 64 20 74 68 65 20  l mode, add the 
19bc0 6e 65 63 65 73 73 61 72 79 20 70 6f 72 74 69 6f  necessary portio
19bd0 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  n..      #      
19be0 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   of the connecti
19bf0 6f 6e 20 73 74 72 69 6e 67 20 6e 6f 77 2e 0d 0a  on string now...
19c00 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
19c10 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  f {[string lengt
19c20 68 20 24 6d 6f 64 65 5d 20 3e 20 30 7d 20 74 68  h $mode] > 0} th
19c30 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 61 70  en {..        ap
19c40 70 65 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  pend connection 
19c50 7b 3b 4a 6f 75 72 6e 61 6c 20 4d 6f 64 65 3d 24  {;Journal Mode=$
19c60 7b 6d 6f 64 65 7d 7d 0d 0a 20 20 20 20 20 20 7d  {mode}}..      }
19c70 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
19c80 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 6f 75     # NOTE: If ou
19c90 72 20 63 61 6c 6c 65 72 20 73 70 65 63 69 66 69  r caller specifi
19ca0 65 64 20 61 20 44 61 74 65 54 69 6d 65 20 66 6f  ed a DateTime fo
19cb0 72 6d 61 74 2c 20 61 64 64 20 74 68 65 20 6e 65  rmat, add the ne
19cc0 63 65 73 73 61 72 79 0d 0a 20 20 20 20 20 20 23  cessary..      #
19cd0 20 20 20 20 20 20 20 70 6f 72 74 69 6f 6e 20 6f         portion o
19ce0 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  f the connection
19cf0 20 73 74 72 69 6e 67 20 6e 6f 77 2e 0d 0a 20 20   string now...  
19d00 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
19d10 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
19d20 24 64 61 74 65 54 69 6d 65 46 6f 72 6d 61 74 5d  $dateTimeFormat]
19d30 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
19d40 20 20 20 20 20 20 61 70 70 65 6e 64 20 63 6f 6e        append con
19d50 6e 65 63 74 69 6f 6e 20 7b 3b 44 61 74 65 54 69  nection {;DateTi
19d60 6d 65 46 6f 72 6d 61 74 3d 24 7b 64 61 74 65 54  meFormat=${dateT
19d70 69 6d 65 46 6f 72 6d 61 74 7d 7d 0d 0a 20 20 20  imeFormat}}..   
19d80 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
19d90 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49  .      # NOTE: I
19da0 66 20 6f 75 72 20 63 61 6c 6c 65 72 20 73 70 65  f our caller spe
19db0 63 69 66 69 65 64 20 61 20 44 61 74 65 54 69 6d  cified a DateTim
19dc0 65 4b 69 6e 64 2c 20 61 64 64 20 74 68 65 20 6e  eKind, add the n
19dd0 65 63 65 73 73 61 72 79 20 70 6f 72 74 69 6f 6e  ecessary portion
19de0 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
19df0 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  of the connectio
19e00 6e 20 73 74 72 69 6e 67 20 6e 6f 77 2e 0d 0a 20  n string now... 
19e10 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
19e20 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   {[string length
19e30 20 24 64 61 74 65 54 69 6d 65 4b 69 6e 64 5d 20   $dateTimeKind] 
19e40 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
19e50 20 20 20 20 20 61 70 70 65 6e 64 20 63 6f 6e 6e       append conn
19e60 65 63 74 69 6f 6e 20 7b 3b 44 61 74 65 54 69 6d  ection {;DateTim
19e70 65 4b 69 6e 64 3d 24 7b 64 61 74 65 54 69 6d 65  eKind=${dateTime
19e80 4b 69 6e 64 7d 7d 0d 0a 20 20 20 20 20 20 7d 0d  Kind}}..      }.
19e90 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
19ea0 20 20 23 20 4e 4f 54 45 3a 20 46 69 67 75 72 65    # NOTE: Figure
19eb0 20 6f 75 74 20 77 68 61 74 20 74 68 65 20 66 69   out what the fi
19ec0 6e 61 6c 20 66 6c 61 67 73 20 66 6f 72 20 74 68  nal flags for th
19ed0 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6e 65  is connection ne
19ee0 65 64 20 74 6f 20 62 65 2e 0d 0a 20 20 20 20 20  ed to be...     
19ef0 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 66 6c   #..      set fl
19f00 61 67 73 20 5b 67 65 74 43 6f 6e 6e 65 63 74 69  ags [getConnecti
19f10 6f 6e 46 6c 61 67 73 20 24 66 69 6c 65 4e 61 6d  onFlags $fileNam
19f20 65 20 24 66 6c 61 67 73 20 24 71 75 69 65 74 5d  e $flags $quiet]
19f30 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
19f40 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 6f 75     # NOTE: If ou
19f50 72 20 63 61 6c 6c 65 72 20 73 70 65 63 69 66 69  r caller specifi
19f60 65 64 20 73 6f 6d 65 20 53 51 4c 69 74 65 43 6f  ed some SQLiteCo
19f70 6e 6e 65 63 74 69 6f 6e 46 6c 61 67 73 2c 20 61  nnectionFlags, a
19f80 64 64 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20  dd the..      # 
19f90 20 20 20 20 20 20 6e 65 63 65 73 73 61 72 79 20        necessary 
19fa0 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 63  portion of the c
19fb0 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e 67  onnection string
19fc0 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 23 0d 0a   now...      #..
19fd0 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
19fe0 67 20 6c 65 6e 67 74 68 20 24 66 6c 61 67 73 5d  g length $flags]
19ff0 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
1a000 20 20 20 20 20 20 61 70 70 65 6e 64 20 63 6f 6e        append con
1a010 6e 65 63 74 69 6f 6e 20 7b 3b 46 6c 61 67 73 3d  nection {;Flags=
1a020 24 7b 66 6c 61 67 73 7d 7d 0d 0a 20 20 20 20 20  ${flags}}..     
1a030 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   }....      #.. 
1a040 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20       # NOTE: If 
1a050 6f 75 72 20 63 61 6c 6c 65 72 20 73 70 65 63 69  our caller speci
1a060 66 69 65 64 20 61 6e 20 65 78 74 72 61 20 70 61  fied an extra pa
1a070 79 6c 6f 61 64 20 74 6f 20 74 68 65 20 63 6f 6e  yload to the con
1a080 6e 65 63 74 69 6f 6e 0d 0a 20 20 20 20 20 20 23  nection..      #
1a090 20 20 20 20 20 20 20 73 74 72 69 6e 67 2c 20 61         string, a
1a0a0 70 70 65 6e 64 20 69 74 20 6e 6f 77 2e 0d 0a 20  ppend it now... 
1a0b0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
1a0c0 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   {[string length
1a0d0 20 24 65 78 74 72 61 5d 20 3e 20 30 7d 20 74 68   $extra] > 0} th
1a0e0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 61 70  en {..        ap
1a0f0 70 65 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  pend connection 
1a100 5c 3b 20 24 65 78 74 72 61 0d 0a 20 20 20 20 20  \; $extra..     
1a110 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   }....      #.. 
1a120 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 64 64       # NOTE: Add
1a130 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
1a140 20 63 75 72 72 65 6e 74 20 74 65 73 74 20 66 69   current test fi
1a150 6c 65 2c 20 69 66 20 61 76 61 69 6c 61 62 6c 65  le, if available
1a160 2e 20 20 54 68 69 73 20 69 73 0d 0a 20 20 20 20  .  This is..    
1a170 20 20 23 20 20 20 20 20 20 20 6f 6e 6c 79 20 75    #       only u
1a180 73 65 64 20 66 6f 72 20 64 65 62 75 67 67 69 6e  sed for debuggin
1a190 67 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  g...      #..   
1a1a0 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69     if {[info exi
1a1b0 73 74 73 20 3a 3a 74 65 73 74 5f 66 69 6c 65 5d  sts ::test_file]
1a1c0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1a1d0 20 20 61 70 70 65 6e 64 20 63 6f 6e 6e 65 63 74    append connect
1a1e0 69 6f 6e 20 7b 3b 54 65 73 74 46 69 6c 65 3d 24  ion {;TestFile=$
1a1f0 7b 3a 3a 74 65 73 74 5f 66 69 6c 65 7d 7d 0d 0a  {::test_file}}..
1a200 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
1a210 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
1a220 3a 20 41 64 64 20 74 68 65 20 6e 61 6d 65 20 6f  : Add the name o
1a230 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 65  f the current te
1a240 73 74 2c 20 69 66 20 61 76 61 69 6c 61 62 6c 65  st, if available
1a250 2e 20 20 54 68 69 73 20 69 73 20 6f 6e 6c 79 0d  .  This is only.
1a260 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 75  .      #       u
1a270 73 65 64 20 66 6f 72 20 64 65 62 75 67 67 69 6e  sed for debuggin
1a280 67 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  g...      #..   
1a290 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69     if {[info exi
1a2a0 73 74 73 20 3a 3a 65 61 67 6c 65 5f 74 65 73 74  sts ::eagle_test
1a2b0 73 28 43 75 72 72 65 6e 74 4e 61 6d 65 29 5d 7d  s(CurrentName)]}
1a2c0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1a2d0 20 61 70 70 65 6e 64 20 63 6f 6e 6e 65 63 74 69   append connecti
1a2e0 6f 6e 20 7b 3b 54 65 73 74 4e 61 6d 65 3d 24 7b  on {;TestName=${
1a2f0 3a 3a 65 61 67 6c 65 5f 74 65 73 74 73 28 43 75  ::eagle_tests(Cu
1a300 72 72 65 6e 74 4e 61 6d 65 29 7d 7d 0d 0a 20 20  rrentName)}}..  
1a310 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
1a320 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
1a330 46 6f 72 20 63 6c 61 72 69 74 79 2c 20 61 70 70  For clarity, app
1a340 65 6e 64 20 61 20 66 69 6e 61 6c 20 73 65 6d 69  end a final semi
1a350 63 6f 6c 6f 6e 20 74 6f 20 74 68 65 20 63 6f 6e  colon to the con
1a360 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e 67 2e 0d  nection string..
1a370 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
1a380 61 70 70 65 6e 64 20 63 6f 6e 6e 65 63 74 69 6f  append connectio
1a390 6e 20 5c 3b 0d 0a 0d 0a 20 20 20 20 20 20 23 0d  n \;....      #.
1a3a0 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4f  .      # NOTE: O
1a3b0 70 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  pen the database
1a3c0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6e 6f 77 2c   connection now,
1a3d0 20 70 6c 61 63 69 6e 67 20 74 68 65 20 6f 70 61   placing the opa
1a3e0 71 75 65 20 68 61 6e 64 6c 65 20 76 61 6c 75 65  que handle value
1a3f0 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
1a400 69 6e 74 6f 20 74 68 65 20 76 61 72 69 61 62 6c  into the variabl
1a410 65 20 73 70 65 63 69 66 69 65 64 20 62 79 20 6f  e specified by o
1a420 75 72 20 63 61 6c 6c 65 72 2e 0d 0a 20 20 20 20  ur caller...    
1a430 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 64    #..      set d
1a440 62 20 5b 73 71 6c 20 6f 70 65 6e 20 2d 74 79 70  b [sql open -typ
1a450 65 20 53 51 4c 69 74 65 20 5b 73 75 62 73 74 20  e SQLite [subst 
1a460 24 63 6f 6e 6e 65 63 74 69 6f 6e 5d 5d 0d 0a 0d  $connection]]...
1a470 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
1a480 23 20 4e 4f 54 45 3a 20 43 6f 6e 66 69 67 75 72  # NOTE: Configur
1a490 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  e the temporary 
1a4a0 64 69 72 65 63 74 6f 72 79 20 66 6f 72 20 74 68  directory for th
1a4b0 65 20 6e 65 77 6c 79 20 6f 70 65 6e 65 64 20 64  e newly opened d
1a4c0 61 74 61 62 61 73 65 0d 0a 20 20 20 20 20 20 23  atabase..      #
1a4d0 20 20 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f         connectio
1a4e0 6e 20 6e 6f 77 20 75 6e 6c 65 73 73 20 6f 75 72  n now unless our
1a4f0 20 63 61 6c 6c 65 72 20 66 6f 72 62 69 64 73 20   caller forbids 
1a500 69 74 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  it...      #..  
1a510 20 20 20 20 69 66 20 7b 24 74 65 6d 70 6f 72 61      if {$tempora
1a520 72 79 20 26 26 20 21 5b 69 6e 66 6f 20 65 78 69  ry && ![info exi
1a530 73 74 73 20 3a 3a 6e 6f 28 73 65 74 54 65 6d 70  sts ::no(setTemp
1a540 6f 72 61 72 79 44 69 72 65 63 74 6f 72 79 29 5d  oraryDirectory)]
1a550 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1a560 20 20 73 71 6c 20 65 78 65 63 75 74 65 20 24 64    sql execute $d
1a570 62 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  b [appendArgs \.
1a580 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 50 52  .            "PR
1a590 41 47 4d 41 20 74 65 6d 70 5f 73 74 6f 72 65 5f  AGMA temp_store_
1a5a0 64 69 72 65 63 74 6f 72 79 20 3d 20 5c 22 22 20  directory = \"" 
1a5b0 5b 67 65 74 54 65 6d 70 6f 72 61 72 79 44 69 72  [getTemporaryDir
1a5c0 65 63 74 6f 72 79 5d 20 5c 22 5c 3b 5d 0d 0a 20  ectory] \"\;].. 
1a5d0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
1a5e0 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
1a5f0 20 50 65 72 66 6f 72 6d 20 61 6e 79 20 65 78 74   Perform any ext
1a600 72 61 20 70 65 72 2d 63 6f 6e 6e 65 63 74 69 6f  ra per-connectio
1a610 6e 20 73 65 74 75 70 20 66 6f 72 20 74 68 65 20  n setup for the 
1a620 6e 65 77 6c 79 20 6f 70 65 6e 65 64 0d 0a 20 20  newly opened..  
1a630 20 20 20 20 23 20 20 20 20 20 20 20 64 61 74 61      #       data
1a640 62 61 73 65 20 6e 6f 77 20 75 6e 6c 65 73 73 20  base now unless 
1a650 6f 75 72 20 63 61 6c 6c 65 72 20 66 6f 72 62 69  our caller forbi
1a660 64 73 20 69 74 2e 0d 0a 20 20 20 20 20 20 23 0d  ds it...      #.
1a670 0a 20 20 20 20 20 20 73 65 74 20 65 78 65 63 75  .      set execu
1a680 74 65 4f 6e 53 65 74 75 70 20 5b 67 65 74 45 78  teOnSetup [getEx
1a690 65 63 75 74 65 4f 6e 53 65 74 75 70 5d 0d 0a 0d  ecuteOnSetup]...
1a6a0 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69  .      if {[stri
1a6b0 6e 67 20 6c 65 6e 67 74 68 20 24 65 78 65 63 75  ng length $execu
1a6c0 74 65 4f 6e 53 65 74 75 70 5d 20 3e 20 30 20 26  teOnSetup] > 0 &
1a6d0 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 21  & \..          !
1a6e0 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
1a6f0 6f 28 65 78 65 63 75 74 65 4f 6e 53 65 74 75 70  o(executeOnSetup
1a700 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
1a710 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
1a720 20 4e 4f 54 45 3a 20 54 68 69 73 20 63 6f 6d 6d   NOTE: This comm
1a730 61 6e 64 20 6d 61 79 20 72 61 69 73 65 20 61 6e  and may raise an
1a740 20 65 72 72 6f 72 3b 20 69 66 20 73 6f 2c 20 74   error; if so, t
1a750 68 61 74 20 69 73 20 66 69 6e 65 2c 20 61 73 0d  hat is fine, as.
1a760 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
1a770 20 74 68 65 20 65 6e 63 6c 6f 73 69 6e 67 20 74   the enclosing t
1a780 65 73 74 20 77 69 6c 6c 20 74 68 65 6e 20 66 61  est will then fa
1a790 69 6c 2e 20 20 54 68 65 20 5b 73 75 62 73 74 5d  il.  The [subst]
1a7a0 20 63 6f 6d 6d 61 6e 64 20 69 73 0d 0a 20 20 20   command is..   
1a7b0 20 20 20 20 20 23 20 20 20 20 20 20 20 75 73 65       #       use
1a7c0 64 20 6f 6e 20 74 68 65 20 53 51 4c 20 69 6e 20  d on the SQL in 
1a7d0 63 61 73 65 20 69 74 20 6e 65 65 64 73 20 74 6f  case it needs to
1a7e0 20 72 65 66 65 72 20 74 6f 20 73 74 61 74 65 20   refer to state 
1a7f0 69 6e 20 6f 75 72 0d 0a 20 20 20 20 20 20 20 20  in our..        
1a800 23 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74 2e  #       context.
1a810 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1a820 20 20 20 20 20 73 71 6c 20 65 78 65 63 75 74 65       sql execute
1a830 20 24 64 62 20 5b 73 75 62 73 74 20 24 65 78 65   $db [subst $exe
1a840 63 75 74 65 4f 6e 53 65 74 75 70 5d 0d 0a 20 20  cuteOnSetup]..  
1a850 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
1a860 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
1a870 41 6c 77 61 79 73 20 72 65 74 75 72 6e 20 74 68  Always return th
1a880 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e  e connection han
1a890 64 6c 65 20 75 70 6f 6e 20 73 75 63 63 65 73 73  dle upon success
1a8a0 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
1a8b0 20 20 72 65 74 75 72 6e 20 24 64 62 0d 0a 20 20    return $db..  
1a8c0 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
1a8d0 20 67 65 74 44 62 43 6f 6e 6e 65 63 74 69 6f 6e   getDbConnection
1a8e0 20 7b 20 7b 76 61 72 4e 61 6d 65 20 64 62 7d 20   { {varName db} 
1a8f0 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
1a900 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 66 65      # NOTE: Refe
1a910 72 20 74 6f 20 74 68 65 20 73 70 65 63 69 66 69  r to the specifi
1a920 65 64 20 76 61 72 69 61 62 6c 65 20 28 65 2e 67  ed variable (e.g
1a930 2e 20 22 64 62 22 29 20 69 6e 20 74 68 65 20 63  . "db") in the c
1a940 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72 0d 0a 20  ontext of our.. 
1a950 20 20 20 20 20 23 20 20 20 20 20 20 20 63 61 6c       #       cal
1a960 6c 65 72 2e 20 20 54 68 65 20 68 61 6e 64 6c 65  ler.  The handle
1a970 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1a980 20 70 72 65 76 69 6f 75 73 6c 79 20 6f 70 65 6e   previously open
1a990 65 64 20 76 69 61 20 74 68 65 0d 0a 20 20 20 20  ed via the..    
1a9a0 20 20 23 20 20 20 20 20 20 20 5b 73 65 74 75 70    #       [setup
1a9b0 44 62 5d 20 70 72 6f 63 65 64 75 72 65 20 73 68  Db] procedure sh
1a9c0 6f 75 6c 64 20 62 65 20 73 74 6f 72 65 64 20 74  ould be stored t
1a9d0 68 65 72 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  here...      #..
1a9e0 20 20 20 20 20 20 75 70 76 61 72 20 31 20 24 76        upvar 1 $v
1a9f0 61 72 4e 61 6d 65 20 64 62 0d 0a 0d 0a 20 20 20  arName db....   
1aa00 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
1aa10 54 45 3a 20 54 68 69 73 20 72 65 74 75 72 6e 73  TE: This returns
1aa20 20 74 68 65 20 41 44 4f 2e 4e 45 54 20 49 44 62   the ADO.NET IDb
1aa30 43 6f 6e 6e 65 63 74 69 6f 6e 20 6f 62 6a 65 63  Connection objec
1aa40 74 20 69 6e 73 74 61 6e 63 65 20 66 6f 72 20 74  t instance for t
1aa50 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  he..      #     
1aa60 20 20 73 70 65 63 69 66 69 65 64 20 64 61 74 61    specified data
1aa70 62 73 65 20 68 61 6e 64 6c 65 2e 20 20 53 69 6e  bse handle.  Sin
1aa80 63 65 20 67 65 74 74 69 6e 67 20 74 68 69 73 20  ce getting this 
1aa90 6f 62 6a 65 63 74 20 72 65 6c 69 65 73 20 75 70  object relies up
1aaa0 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  on..      #     
1aab0 20 20 45 61 67 6c 65 20 69 6e 74 65 72 6e 61 6c    Eagle internal
1aac0 73 2c 20 67 72 65 61 74 20 63 61 72 65 20 73 68  s, great care sh
1aad0 6f 75 6c 64 20 62 65 20 74 61 6b 65 6e 20 74 6f  ould be taken to
1aae0 20 61 76 6f 69 64 20 64 69 73 70 6f 73 69 6e 67   avoid disposing
1aaf0 20 6f 66 0d 0a 20 20 20 20 20 20 23 20 20 20 20   of..      #    
1ab00 20 20 20 74 68 69 73 20 6f 62 6a 65 63 74 20 6f     this object o
1ab10 72 20 6f 74 68 65 72 77 69 73 65 20 70 75 74 74  r otherwise putt
1ab20 69 6e 67 20 69 74 20 69 6e 74 6f 20 61 6e 20 69  ing it into an i
1ab30 6e 76 61 6c 69 64 20 73 74 61 74 65 2e 0d 0a 20  nvalid state... 
1ab40 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
1ab50 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 64   {[info exists d
1ab60 62 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  b]} then {..    
1ab70 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
1ab80 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65  ..          obje
1ab90 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73  ct invoke -flags
1aba0 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 2d 6f 62 6a   +NonPublic -obj
1abb0 65 63 74 66 6c 61 67 73 20 2b 4e 6f 44 69 73 70  ectflags +NoDisp
1abc0 6f 73 65 20 2d 61 6c 69 61 73 20 5c 0d 0a 20 20  ose -alias \..  
1abd0 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 74 65              Inte
1abe0 72 70 72 65 74 65 72 2e 47 65 74 41 63 74 69 76  rpreter.GetActiv
1abf0 65 2e 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 49 74  e.connections It
1ac00 65 6d 20 24 64 62 0d 0a 20 20 20 20 20 20 20 20  em $db..        
1ac10 7d 20 72 65 73 75 6c 74 5d 20 3d 3d 20 30 7d 20  } result] == 0} 
1ac20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1ac30 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23    #..          #
1ac40 20 4e 4f 54 45 3a 20 53 75 63 63 65 73 73 2c 20   NOTE: Success, 
1ac50 72 65 74 75 72 6e 20 74 68 65 20 6f 70 61 71 75  return the opaqu
1ac60 65 20 6f 62 6a 65 63 74 20 68 61 6e 64 6c 65 2e  e object handle.
1ac70 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
1ac80 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1ac90 24 72 65 73 75 6c 74 0d 0a 20 20 20 20 20 20 20  $result..       
1aca0 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
1acb0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1acc0 20 20 23 20 4e 4f 54 45 3a 20 46 61 69 6c 75 72    # NOTE: Failur
1acd0 65 2c 20 72 65 70 6f 72 74 20 77 68 79 2e 0d 0a  e, report why...
1ace0 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
1acf0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
1ad00 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
1ad10 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
1ad20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20            "==== 
1ad30 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20  WARNING: failed 
1ad40 74 6f 20 67 65 74 20 63 6f 6e 6e 65 63 74 69 6f  to get connectio
1ad50 6e 20 68 61 6e 64 6c 65 20 66 6f 72 20 64 61 74  n handle for dat
1ad60 61 62 61 73 65 20 5c 22 22 20 5c 0d 0a 20 20 20  abase \"" \..   
1ad70 20 20 20 20 20 20 20 20 20 20 20 24 64 62 20 22             $db "
1ad80 5c 22 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c  \", error: " \n\
1ad90 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20  t $result \n].. 
1ada0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1adb0 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
1adc0 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 61 69 6c      # NOTE: Fail
1add0 75 72 65 2c 20 72 65 74 75 72 6e 20 61 6e 20 6f  ure, return an o
1ade0 62 76 69 6f 75 73 6c 79 20 69 6e 76 61 6c 69 64  bviously invalid
1adf0 20 6f 70 61 71 75 65 20 6f 62 6a 65 63 74 20 68   opaque object h
1ae00 61 6e 64 6c 65 2e 0d 0a 20 20 20 20 20 20 23 0d  andle...      #.
1ae10 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 22 22  .      return ""
1ae20 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
1ae30 70 72 6f 63 20 66 72 65 65 44 62 43 6f 6e 6e 65  proc freeDbConne
1ae40 63 74 69 6f 6e 20 7b 20 7b 76 61 72 4e 61 6d 65  ction { {varName
1ae50 20 63 6f 6e 6e 65 63 74 69 6f 6e 7d 20 7d 20 7b   connection} } {
1ae60 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
1ae70 20 23 20 4e 4f 54 45 3a 20 52 65 66 65 72 20 74   # NOTE: Refer t
1ae80 6f 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  o the specified 
1ae90 76 61 72 69 61 62 6c 65 20 28 65 2e 67 2e 20 22  variable (e.g. "
1aea0 63 6f 6e 6e 65 63 74 69 6f 6e 22 29 20 69 6e 20  connection") in 
1aeb0 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  the..      #    
1aec0 20 20 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75     context of ou
1aed0 72 20 63 61 6c 6c 65 72 2e 20 20 54 68 65 20 6f  r caller.  The o
1aee0 70 61 71 75 65 20 6f 62 6a 65 63 74 20 68 61 6e  paque object han
1aef0 64 6c 65 20 66 6f 72 20 61 6e 20 41 44 4f 2e 4e  dle for an ADO.N
1af00 45 54 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ET..      #     
1af10 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 72 65    connection pre
1af20 76 69 6f 75 73 6c 79 20 72 65 74 75 72 6e 65 64  viously returned
1af30 20 62 79 20 5b 67 65 74 44 62 43 6f 6e 6e 65 63   by [getDbConnec
1af40 74 69 6f 6e 5d 20 73 68 6f 75 6c 64 20 62 65 0d  tion] should be.
1af50 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73  .      #       s
1af60 74 6f 72 65 64 20 74 68 65 72 65 2e 0d 0a 20 20  tored there...  
1af70 20 20 20 20 23 0d 0a 20 20 20 20 20 20 75 70 76      #..      upv
1af80 61 72 20 31 20 24 76 61 72 4e 61 6d 65 20 63 6f  ar 1 $varName co
1af90 6e 6e 65 63 74 69 6f 6e 0d 0a 0d 0a 20 20 20 20  nnection....    
1afa0 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
1afb0 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 72 65  E: Attempt to re
1afc0 6d 6f 76 65 20 74 68 65 20 6f 70 61 71 75 65 20  move the opaque 
1afd0 6f 62 6a 65 63 74 20 68 61 6e 64 6c 65 20 66 72  object handle fr
1afe0 6f 6d 20 74 68 65 20 69 6e 74 65 72 70 72 65 74  om the interpret
1aff0 65 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  er..      #     
1b000 20 20 6e 6f 77 2e 20 20 54 68 69 73 20 5b 6f 62    now.  This [ob
1b010 6a 65 63 74 20 64 69 73 70 6f 73 65 5d 20 63 61  ject dispose] ca
1b020 6c 6c 20 77 69 6c 6c 20 6e 6f 74 20 61 63 74 75  ll will not actu
1b030 61 6c 6c 79 20 64 69 73 70 6f 73 65 20 6f 66 20  ally dispose of 
1b040 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  the..      #    
1b050 20 20 20 75 6e 64 65 72 6c 79 69 6e 67 20 6f 62     underlying ob
1b060 6a 65 63 74 20 62 65 63 61 75 73 65 20 74 68 65  ject because the
1b070 20 2b 4e 6f 44 69 73 70 6f 73 65 20 66 6c 61 67   +NoDispose flag
1b080 20 77 61 73 20 73 65 74 20 6f 6e 20 69 74 0d 0a   was set on it..
1b090 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64 75        #       du
1b0a0 72 69 6e 67 20 63 72 65 61 74 69 6f 6e 20 6f 66  ring creation of
1b0b0 20 74 68 65 20 6f 70 61 71 75 65 20 6f 62 6a 65   the opaque obje
1b0c0 63 74 20 68 61 6e 64 6c 65 2e 0d 0a 20 20 20 20  ct handle...    
1b0d0 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
1b0e0 69 6e 66 6f 20 65 78 69 73 74 73 20 63 6f 6e 6e  info exists conn
1b0f0 65 63 74 69 6f 6e 5d 20 26 26 20 5c 0d 0a 20 20  ection] && \..  
1b100 20 20 20 20 20 20 20 20 5b 63 61 74 63 68 20 7b          [catch {
1b110 6f 62 6a 65 63 74 20 64 69 73 70 6f 73 65 20 24  object dispose $
1b120 63 6f 6e 6e 65 63 74 69 6f 6e 7d 20 65 72 72 6f  connection} erro
1b130 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  r]} then {..    
1b140 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
1b150 20 4e 4f 54 45 3a 20 57 65 20 73 6f 6d 65 68 6f   NOTE: We someho
1b160 77 20 66 61 69 6c 65 64 20 74 6f 20 72 65 6d 6f  w failed to remo
1b170 76 65 20 74 68 65 20 68 61 6e 64 6c 65 2c 20 72  ve the handle, r
1b180 65 70 6f 72 74 20 77 68 79 2e 0d 0a 20 20 20 20  eport why...    
1b190 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 74      #..        t
1b1a0 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
1b1b0 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
1b1c0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1b1d0 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66  "==== WARNING: f
1b1e0 61 69 6c 65 64 20 74 6f 20 72 65 6d 6f 76 65 20  ailed to remove 
1b1f0 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c  connection handl
1b200 65 20 5c 22 22 20 24 63 6f 6e 6e 65 63 74 69 6f  e \"" $connectio
1b210 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n \..           
1b220 20 22 5c 22 2c 20 65 72 72 6f 72 3a 20 22 20 5c   "\", error: " \
1b230 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a  n\t $error \n]..
1b240 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
1b250 0c 0d 0a 20 20 20 20 70 72 6f 63 20 61 64 64 44  ...    proc addD
1b260 62 43 6f 6e 6e 65 63 74 69 6f 6e 20 7b 20 63 6f  bConnection { co
1b270 6e 6e 65 63 74 69 6f 6e 20 7b 76 61 72 4e 61 6d  nnection {varNam
1b280 65 20 64 62 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  e db} } {..     
1b290 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
1b2a0 3a 20 52 65 66 65 72 20 74 6f 20 74 68 65 20 73  : Refer to the s
1b2b0 70 65 63 69 66 69 65 64 20 76 61 72 69 61 62 6c  pecified variabl
1b2c0 65 20 28 65 2e 67 2e 20 22 64 62 22 29 20 69 6e  e (e.g. "db") in
1b2d0 20 74 68 65 20 63 6f 6e 74 65 78 74 20 6f 66 20   the context of 
1b2e0 6f 75 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20  our..      #    
1b2f0 20 20 20 63 61 6c 6c 65 72 2e 0d 0a 20 20 20 20     caller...    
1b300 20 20 23 0d 0a 20 20 20 20 20 20 75 70 76 61 72    #..      upvar
1b310 20 31 20 24 76 61 72 4e 61 6d 65 20 64 62 0d 0a   1 $varName db..
1b320 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
1b330 20 23 20 4e 4f 54 45 3a 20 43 72 65 61 74 65 20   # NOTE: Create 
1b340 61 20 63 6f 72 72 65 63 74 6c 79 20 66 6f 72 6d  a correctly form
1b350 61 74 74 65 64 20 6e 61 6d 65 20 66 6f 72 20 74  atted name for t
1b360 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
1b370 65 63 74 69 6f 6e 20 74 6f 0d 0a 20 20 20 20 20  ection to..     
1b380 20 23 20 20 20 20 20 20 20 62 65 20 61 64 64 65   #       be adde
1b390 64 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6d 61  d to the list ma
1b3a0 6e 61 67 65 64 20 62 79 20 74 68 65 20 45 61 67  naged by the Eag
1b3b0 6c 65 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0d  le interpreter..
1b3c0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
1b3d0 73 65 74 20 64 62 20 5b 6f 62 6a 65 63 74 20 69  set db [object i
1b3e0 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f  nvoke -flags +No
1b3f0 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20  nPublic \..     
1b400 20 20 20 20 20 45 61 67 6c 65 2e 5f 43 6f 6d 70       Eagle._Comp
1b410 6f 6e 65 6e 74 73 2e 50 72 69 76 61 74 65 2e 46  onents.Private.F
1b420 6f 72 6d 61 74 4f 70 73 20 44 61 74 61 62 61 73  ormatOps Databas
1b430 65 4f 62 6a 65 63 74 4e 61 6d 65 20 24 63 6f 6e  eObjectName $con
1b440 6e 65 63 74 69 6f 6e 20 5c 0d 0a 20 20 20 20 20  nection \..     
1b450 20 20 20 20 20 53 51 4c 69 74 65 43 6f 6e 6e 65       SQLiteConne
1b460 63 74 69 6f 6e 20 5b 6f 62 6a 65 63 74 20 69 6e  ction [object in
1b470 76 6f 6b 65 20 49 6e 74 65 72 70 72 65 74 65 72  voke Interpreter
1b480 2e 47 65 74 41 63 74 69 76 65 20 4e 65 78 74 49  .GetActive NextI
1b490 64 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a  d]]....      #..
1b4a0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 64        # NOTE: Ad
1b4b0 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  d the database c
1b4c0 6f 6e 6e 65 63 74 69 6f 6e 20 70 72 6f 76 69 64  onnection provid
1b4d0 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72  ed by our caller
1b4e0 20 74 6f 20 74 68 65 20 6c 69 73 74 0d 0a 20 20   to the list..  
1b4f0 20 20 20 20 23 20 20 20 20 20 20 20 6f 66 20 74      #       of t
1b500 68 6f 73 65 20 6b 6e 6f 77 6e 20 74 6f 20 74 68  hose known to th
1b510 65 20 45 61 67 6c 65 20 69 6e 74 65 72 70 72 65  e Eagle interpre
1b520 74 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ter...      #.. 
1b530 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f       object invo
1b540 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75  ke -flags +NonPu
1b550 62 6c 69 63 20 49 6e 74 65 72 70 72 65 74 65 72  blic Interpreter
1b560 2e 47 65 74 41 63 74 69 76 65 2e 63 6f 6e 6e 65  .GetActive.conne
1b570 63 74 69 6f 6e 73 20 41 64 64 20 5c 0d 0a 20 20  ctions Add \..  
1b580 20 20 20 20 20 20 20 20 24 64 62 20 24 63 6f 6e          $db $con
1b590 6e 65 63 74 69 6f 6e 0d 0a 20 20 20 20 7d 0d 0a  nection..    }..
1b5a0 0c 0d 0a 20 20 20 20 70 72 6f 63 20 72 65 6d 6f  ...    proc remo
1b5b0 76 65 44 62 54 72 61 6e 73 61 63 74 69 6f 6e 20  veDbTransaction 
1b5c0 7b 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 7d 20  { transaction } 
1b5d0 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
1b5e0 20 20 23 20 4e 4f 54 45 3a 20 52 65 6d 6f 76 65    # NOTE: Remove
1b5f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 72   the database tr
1b600 61 6e 73 61 63 74 69 6f 6e 20 70 72 6f 76 69 64  ansaction provid
1b610 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72  ed by our caller
1b620 20 66 72 6f 6d 20 74 68 65 0d 0a 20 20 20 20 20   from the..     
1b630 20 23 20 20 20 20 20 20 20 6c 69 73 74 20 6f 66   #       list of
1b640 20 74 68 6f 73 65 20 6b 6e 6f 77 6e 20 74 6f 20   those known to 
1b650 74 68 65 20 45 61 67 6c 65 20 69 6e 74 65 72 70  the Eagle interp
1b660 72 65 74 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d  reter...      #.
1b670 0a 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e  .      object in
1b680 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e  voke -flags +Non
1b690 50 75 62 6c 69 63 20 49 6e 74 65 72 70 72 65 74  Public Interpret
1b6a0 65 72 2e 47 65 74 41 63 74 69 76 65 2e 74 72 61  er.GetActive.tra
1b6b0 6e 73 61 63 74 69 6f 6e 73 20 5c 0d 0a 20 20 20  nsactions \..   
1b6c0 20 20 20 20 20 20 20 52 65 6d 6f 76 65 20 24 74         Remove $t
1b6d0 72 61 6e 73 61 63 74 69 6f 6e 0d 0a 20 20 20 20  ransaction..    
1b6e0 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67  }.....    proc g
1b6f0 65 74 52 6f 77 73 46 72 6f 6d 44 61 74 61 54 61  etRowsFromDataTa
1b700 62 6c 65 20 7b 20 64 61 74 61 54 61 62 6c 65 20  ble { dataTable 
1b710 7b 76 61 6c 75 65 43 61 6c 6c 62 61 63 6b 20 22  {valueCallback "
1b720 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65  "} } {..      se
1b730 74 20 72 6f 77 73 20 5b 6c 69 73 74 5d 0d 0a 20  t rows [list].. 
1b740 20 20 20 20 20 73 65 74 20 63 6f 75 6e 74 20 5b       set count [
1b750 24 64 61 74 61 54 61 62 6c 65 20 43 6f 6c 75 6d  $dataTable Colum
1b760 6e 73 2e 43 6f 75 6e 74 5d 0d 0a 0d 0a 20 20 20  ns.Count]....   
1b770 20 20 20 66 6f 72 20 7b 73 65 74 20 69 6e 64 65     for {set inde
1b780 78 20 30 7d 20 7b 24 69 6e 64 65 78 20 3c 20 24  x 0} {$index < $
1b790 63 6f 75 6e 74 7d 20 7b 69 6e 63 72 20 69 6e 64  count} {incr ind
1b7a0 65 78 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20 73  ex} {..        s
1b7b0 65 74 20 64 61 74 61 43 6f 6c 75 6d 6e 20 5b 24  et dataColumn [$
1b7c0 64 61 74 61 54 61 62 6c 65 20 2d 61 6c 69 61 73  dataTable -alias
1b7d0 20 43 6f 6c 75 6d 6e 73 2e 67 65 74 5f 49 74 65   Columns.get_Ite
1b7e0 6d 20 24 69 6e 64 65 78 5d 0d 0a 20 20 20 20 20  m $index]..     
1b7f0 20 20 20 73 65 74 20 6e 61 6d 65 73 28 24 69 6e     set names($in
1b800 64 65 78 29 20 5b 24 64 61 74 61 43 6f 6c 75 6d  dex) [$dataColum
1b810 6e 20 43 6f 6c 75 6d 6e 4e 61 6d 65 5d 0d 0a 20  n ColumnName].. 
1b820 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
1b830 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
1b840 20 53 65 74 75 70 20 73 6f 6d 65 20 54 63 6c 20   Setup some Tcl 
1b850 72 65 74 75 72 6e 20 63 6f 64 65 20 63 6f 6e 73  return code cons
1b860 74 61 6e 74 73 2e 0d 0a 20 20 20 20 20 20 23 0d  tants...      #.
1b870 0a 20 20 20 20 20 20 73 65 74 20 4f 6b 20 30 3b  .      set Ok 0;
1b880 20 73 65 74 20 45 72 72 6f 72 20 31 3b 20 73 65   set Error 1; se
1b890 74 20 52 65 74 75 72 6e 20 32 3b 20 73 65 74 20  t Return 2; set 
1b8a0 42 72 65 61 6b 20 33 3b 20 73 65 74 20 43 6f 6e  Break 3; set Con
1b8b0 74 69 6e 75 65 20 34 0d 0a 0d 0a 20 20 20 20 20  tinue 4....     
1b8c0 20 6f 62 6a 65 63 74 20 66 6f 72 65 61 63 68 20   object foreach 
1b8d0 2d 61 6c 69 61 73 20 64 61 74 61 52 6f 77 20 5b  -alias dataRow [
1b8e0 73 65 74 20 64 61 74 61 52 6f 77 73 20 5b 24 64  set dataRows [$d
1b8f0 61 74 61 54 61 62 6c 65 20 52 6f 77 73 5d 5d 20  ataTable Rows]] 
1b900 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 72  {..        set r
1b910 6f 77 20 5b 6c 69 73 74 5d 0d 0a 0d 0a 20 20 20  ow [list]....   
1b920 20 20 20 20 20 66 6f 72 20 7b 73 65 74 20 69 6e       for {set in
1b930 64 65 78 20 30 7d 20 7b 24 69 6e 64 65 78 20 3c  dex 0} {$index <
1b940 20 24 63 6f 75 6e 74 7d 20 7b 69 6e 63 72 20 69   $count} {incr i
1b950 6e 64 65 78 7d 20 7b 0d 0a 20 20 20 20 20 20 20  ndex} {..       
1b960 20 20 20 73 65 74 20 76 61 6c 75 65 20 5b 24 64     set value [$d
1b970 61 74 61 52 6f 77 20 2d 63 72 65 61 74 65 20 2d  ataRow -create -
1b980 61 6c 69 61 73 20 67 65 74 5f 49 74 65 6d 20 24  alias get_Item $
1b990 69 6e 64 65 78 5d 0d 0a 0d 0a 20 20 20 20 20 20  index]....      
1b9a0 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
1b9b0 6c 65 6e 67 74 68 20 24 76 61 6c 75 65 43 61 6c  length $valueCal
1b9c0 6c 62 61 63 6b 5d 20 3e 20 30 7d 20 74 68 65 6e  lback] > 0} then
1b9d0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1b9e0 73 65 74 20 63 6f 64 65 20 5b 63 61 74 63 68 20  set code [catch 
1b9f0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
1ba00 20 24 76 61 6c 75 65 43 61 6c 6c 62 61 63 6b 20   $valueCallback 
1ba10 24 64 61 74 61 54 61 62 6c 65 20 24 64 61 74 61  $dataTable $data
1ba20 52 6f 77 20 24 69 6e 64 65 78 20 24 76 61 6c 75  Row $index $valu
1ba30 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e..            }
1ba40 20 6e 65 77 56 61 6c 75 65 5d 0d 0a 0d 0a 20 20   newValue]....  
1ba50 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 24 63            if {$c
1ba60 6f 64 65 20 3d 3d 20 24 4f 6b 7d 20 74 68 65 6e  ode == $Ok} then
1ba70 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1ba80 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
1ba90 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20 74     # NOTE: Use t
1baa0 68 65 20 73 70 65 63 69 66 69 65 64 20 28 6e 65  he specified (ne
1bab0 77 3f 29 20 72 6f 77 20 76 61 6c 75 65 2e 0d 0a  w?) row value...
1bac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
1bad0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c  .              l
1bae0 61 70 70 65 6e 64 20 72 6f 77 20 5b 6c 69 73 74  append row [list
1baf0 20 24 6e 61 6d 65 73 28 24 69 6e 64 65 78 29 20   $names($index) 
1bb00 24 6e 65 77 56 61 6c 75 65 5d 0d 0a 20 20 20 20  $newValue]..    
1bb10 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66          } elseif
1bb20 20 7b 24 63 6f 64 65 20 3d 3d 20 24 45 72 72 6f   {$code == $Erro
1bb30 72 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  r} then {..     
1bb40 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
1bb50 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
1bb60 3a 20 55 73 65 20 74 68 65 20 28 6e 65 77 3f 29  : Use the (new?)
1bb70 20 4e 55 4c 4c 20 72 6f 77 20 76 61 6c 75 65 2e   NULL row value.
1bb80 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1bb90 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  #..             
1bba0 20 6c 61 70 70 65 6e 64 20 72 6f 77 20 5b 6c 69   lappend row [li
1bbb0 73 74 20 24 6e 61 6d 65 73 28 24 69 6e 64 65 78  st $names($index
1bbc0 29 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  )]..            
1bbd0 7d 20 65 6c 73 65 69 66 20 7b 24 63 6f 64 65 20  } elseif {$code 
1bbe0 3d 3d 20 24 52 65 74 75 72 6e 7d 20 74 68 65 6e  == $Return} then
1bbf0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1bc00 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
1bc10 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20     # NOTE: Skip 
1bc20 72 65 6d 61 69 6e 69 6e 67 20 76 61 6c 75 65 73  remaining values
1bc30 20 66 6f 72 20 74 68 69 73 20 72 6f 77 2e 0d 0a   for this row...
1bc40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
1bc50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  .              b
1bc60 72 65 61 6b 0d 0a 20 20 20 20 20 20 20 20 20 20  reak..          
1bc70 20 20 7d 20 65 6c 73 65 69 66 20 7b 24 63 6f 64    } elseif {$cod
1bc80 65 20 3d 3d 20 24 42 72 65 61 6b 7d 20 74 68 65  e == $Break} the
1bc90 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
1bca0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
1bcb0 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70      # NOTE: Skip
1bcc0 20 70 72 6f 63 65 73 73 69 6e 67 20 74 68 69 73   processing this
1bcd0 20 72 6f 77 20 76 61 6c 75 65 2e 0d 0a 20 20 20   row value...   
1bce0 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
1bcf0 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
1bd00 69 66 20 7b 24 63 6f 64 65 20 3d 3d 20 24 43 6f  if {$code == $Co
1bd10 6e 74 69 6e 75 65 7d 20 74 68 65 6e 20 7b 0d 0a  ntinue} then {..
1bd20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
1bd30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
1bd40 20 4e 4f 54 45 3a 20 55 73 65 20 64 65 66 61 75   NOTE: Use defau
1bd50 6c 74 20 72 6f 77 20 76 61 6c 75 65 20 68 61 6e  lt row value han
1bd60 64 6c 69 6e 67 2e 0d 0a 20 20 20 20 20 20 20 20  dling...        
1bd70 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1bd80 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
1bd90 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
1bda0 20 20 20 20 20 20 20 20 73 65 74 20 63 6f 64 65          set code
1bdb0 20 24 43 6f 6e 74 69 6e 75 65 0d 0a 20 20 20 20   $Continue..    
1bdc0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
1bdd0 20 20 20 20 20 69 66 20 7b 24 63 6f 64 65 20 3d       if {$code =
1bde0 3d 20 24 43 6f 6e 74 69 6e 75 65 7d 20 74 68 65  = $Continue} the
1bdf0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
1be00 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
1be10 67 74 68 20 24 76 61 6c 75 65 5d 20 3e 20 30 20  gth $value] > 0 
1be20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
1be30 20 20 20 20 20 20 21 5b 6f 62 6a 65 63 74 20 69        ![object i
1be40 6e 76 6f 6b 65 20 43 6f 6e 76 65 72 74 20 49 73  nvoke Convert Is
1be50 44 42 4e 75 6c 6c 20 24 76 61 6c 75 65 5d 7d 20  DBNull $value]} 
1be60 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1be70 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 72 6f        lappend ro
1be80 77 20 5b 6c 69 73 74 20 24 6e 61 6d 65 73 28 24  w [list $names($
1be90 69 6e 64 65 78 29 20 5b 24 76 61 6c 75 65 20 54  index) [$value T
1bea0 6f 53 74 72 69 6e 67 5d 5d 0d 0a 20 20 20 20 20  oString]]..     
1beb0 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
1bec0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c  .              l
1bed0 61 70 70 65 6e 64 20 72 6f 77 20 5b 6c 69 73 74  append row [list
1bee0 20 24 6e 61 6d 65 73 28 24 69 6e 64 65 78 29 5d   $names($index)]
1bef0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
1bf00 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
1bf10 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
1bf20 20 20 20 6c 61 70 70 65 6e 64 20 72 6f 77 73 20     lappend rows 
1bf30 24 72 6f 77 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  $row..      }...
1bf40 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 72  .      return $r
1bf50 6f 77 73 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20  ows..    }..... 
1bf60 20 20 20 70 72 6f 63 20 64 75 6d 70 52 6f 77 73     proc dumpRows
1bf70 46 72 6f 6d 44 61 74 61 54 61 62 6c 65 20 7b 20  FromDataTable { 
1bf80 63 68 61 6e 6e 65 6c 20 72 6f 77 73 20 7d 20 7b  channel rows } {
1bf90 0d 0a 20 20 20 20 20 20 73 65 74 20 73 65 71 75  ..      set sequ
1bfa0 65 6e 63 65 20 31 0d 0a 0d 0a 20 20 20 20 20 20  ence 1....      
1bfb0 66 6f 72 65 61 63 68 20 72 6f 77 20 24 72 6f 77  foreach row $row
1bfc0 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75  s {..        tpu
1bfd0 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
1bfe0 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
1bff0 20 20 20 20 20 20 20 5b 65 78 70 72 20 7b 24 73         [expr {$s
1c000 65 71 75 65 6e 63 65 20 3e 20 31 20 3f 20 22 5c  equence > 1 ? "\
1c010 6e 22 20 3a 20 22 22 7d 5d 20 22 2d 2d 2d 2d 20  n" : ""}] "---- 
1c020 52 4f 57 20 23 22 20 24 73 65 71 75 65 6e 63 65  ROW #" $sequence
1c030 20 3a 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20   :\n]....       
1c040 20 66 6f 72 65 61 63 68 20 70 61 69 72 20 24 72   foreach pair $r
1c050 6f 77 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ow {..          
1c060 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 70 61  if {[llength $pa
1c070 69 72 5d 20 3e 3d 20 32 7d 20 74 68 65 6e 20 7b  ir] >= 2} then {
1c080 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
1c090 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
1c0a0 70 65 6e 64 41 72 67 73 20 5c 74 20 5c 0d 0a 20  pendArgs \t \.. 
1c0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b                 [
1c0c0 6c 69 73 74 20 5b 6c 69 6e 64 65 78 20 24 70 61  list [lindex $pa
1c0d0 69 72 20 30 5d 5d 20 22 3a 20 22 20 5b 6c 69 73  ir 0]] ": " [lis
1c0e0 74 20 5b 6c 69 6e 64 65 78 20 24 70 61 69 72 20  t [lindex $pair 
1c0f0 31 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  1]] \n]..       
1c100 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 6c 6c     } elseif {[ll
1c110 65 6e 67 74 68 20 24 70 61 69 72 5d 20 3d 3d 20  ength $pair] == 
1c120 31 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  1} then {..     
1c130 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
1c140 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
1c150 73 20 5c 74 20 5c 0d 0a 20 20 20 20 20 20 20 20  s \t \..        
1c160 20 20 20 20 20 20 20 20 5b 6c 69 73 74 20 5b 6c          [list [l
1c170 69 6e 64 65 78 20 24 70 61 69 72 20 30 5d 5d 20  index $pair 0]] 
1c180 22 3a 20 3c 6e 75 6c 6c 3e 5c 6e 22 5d 0d 0a 20  ": <null>\n"].. 
1c190 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20           } else 
1c1a0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
1c1b0 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5c 74  puts $channel \t
1c1c0 3c 65 6d 70 74 79 3e 5c 6e 3b 20 23 20 4e 4f 54  <empty>\n; # NOT
1c1d0 45 3a 20 4e 6f 20 64 61 74 61 3f 0d 0a 20 20 20  E: No data?..   
1c1e0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1c1f0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69    }....        i
1c200 6e 63 72 20 73 65 71 75 65 6e 63 65 0d 0a 20 20  ncr sequence..  
1c210 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
1c220 0a 20 20 20 20 70 72 6f 63 20 63 6c 65 61 6e 75  .    proc cleanu
1c230 70 44 62 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7b  pDb { fileName {
1c240 76 61 72 4e 61 6d 65 20 64 62 7d 20 7b 63 6f 6c  varName db} {col
1c250 6c 65 63 74 20 74 72 75 65 7d 20 7b 71 75 61 6c  lect true} {qual
1c260 69 66 79 20 74 72 75 65 7d 0d 0a 20 20 20 20 20  ify true}..     
1c270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c280 7b 64 65 6c 65 74 65 20 74 72 75 65 7d 20 7d 20  {delete true} } 
1c290 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
1c2a0 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70    # NOTE: Attemp
1c2b0 74 20 74 6f 20 66 6f 72 63 65 20 61 6c 6c 20 70  t to force all p
1c2c0 65 6e 64 69 6e 67 20 22 67 61 72 62 61 67 65 22  ending "garbage"
1c2d0 20 6f 62 6a 65 63 74 73 20 74 6f 20 62 65 20 63   objects to be c
1c2e0 6f 6c 6c 65 63 74 65 64 2c 0d 0a 20 20 20 20 20  ollected,..     
1c2f0 20 23 20 20 20 20 20 20 20 69 6e 63 6c 75 64 69   #       includi
1c300 6e 67 20 53 51 4c 69 74 65 20 73 74 61 74 65 6d  ng SQLite statem
1c310 65 6e 74 73 20 61 6e 64 20 62 61 63 6b 75 70 20  ents and backup 
1c320 6f 62 6a 65 63 74 73 3b 20 74 68 69 73 20 73 68  objects; this sh
1c330 6f 75 6c 64 20 61 6c 6c 6f 77 0d 0a 20 20 20 20  ould allow..    
1c340 20 20 23 20 20 20 20 20 20 20 74 68 65 20 75 6e    #       the un
1c350 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73  derlying databas
1c360 65 20 66 69 6c 65 20 74 6f 20 62 65 20 64 65 6c  e file to be del
1c370 65 74 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  eted...      #..
1c380 20 20 20 20 20 20 69 66 20 7b 24 63 6f 6c 6c 65        if {$colle
1c390 63 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  ct} then {..    
1c3a0 20 20 20 20 63 6f 6c 6c 65 63 74 47 61 72 62 61      collectGarba
1c3b0 67 65 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ge $::test_chann
1c3c0 65 6c 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  el..      }.... 
1c3d0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
1c3e0 4e 4f 54 45 3a 20 52 65 66 65 72 20 74 6f 20 74  NOTE: Refer to t
1c3f0 68 65 20 73 70 65 63 69 66 69 65 64 20 76 61 72  he specified var
1c400 69 61 62 6c 65 20 28 65 2e 67 2e 20 22 64 62 22  iable (e.g. "db"
1c410 29 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 78 74  ) in the context
1c420 20 6f 66 20 6f 75 72 0d 0a 20 20 20 20 20 20 23   of our..      #
1c430 20 20 20 20 20 20 20 63 61 6c 6c 65 72 2e 20 20         caller.  
1c440 54 68 65 20 68 61 6e 64 6c 65 20 74 6f 20 74 68  The handle to th
1c450 65 20 64 61 74 61 62 61 73 65 20 70 72 65 76 69  e database previ
1c460 6f 75 73 6c 79 20 6f 70 65 6e 65 64 20 76 69 61  ously opened via
1c470 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20   the..      #   
1c480 20 20 20 20 5b 73 65 74 75 70 44 62 5d 20 70 72      [setupDb] pr
1c490 6f 63 65 64 75 72 65 20 73 68 6f 75 6c 64 20 62  ocedure should b
1c4a0 65 20 73 74 6f 72 65 64 20 74 68 65 72 65 2e 0d  e stored there..
1c4b0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
1c4c0 75 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65  upvar 1 $varName
1c4d0 20 64 62 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a   db....      #..
1c4e0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 6c        # NOTE: Cl
1c4f0 6f 73 65 20 74 68 65 20 63 6f 6e 6e 65 63 74 69  ose the connecti
1c500 6f 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  on to the databa
1c510 73 65 20 6e 6f 77 2e 20 20 54 68 69 73 20 73 68  se now.  This sh
1c520 6f 75 6c 64 20 61 6c 6c 6f 77 20 75 73 0d 0a 20  ould allow us.. 
1c530 20 20 20 20 20 23 20 20 20 20 20 20 20 74 6f 20       #       to 
1c540 64 65 6c 65 74 65 20 74 68 65 20 75 6e 64 65 72  delete the under
1c550 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65 20 66  lying database f
1c560 69 6c 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ile...      #.. 
1c570 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65       if {[info e
1c580 78 69 73 74 73 20 64 62 5d 20 26 26 20 5b 63 61  xists db] && [ca
1c590 74 63 68 20 7b 73 71 6c 20 63 6c 6f 73 65 20 24  tch {sql close $
1c5a0 64 62 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e  db} error]} then
1c5b0 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
1c5c0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57         # NOTE: W
1c5d0 65 20 73 6f 6d 65 68 6f 77 20 66 61 69 6c 65 64  e somehow failed
1c5e0 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 20 64 61   to close the da
1c5f0 74 61 62 61 73 65 2c 20 72 65 70 6f 72 74 20 77  tabase, report w
1c600 68 79 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  hy...        #..
1c610 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
1c620 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
1c630 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
1c640 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57           "==== W
1c650 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74  ARNING: failed t
1c660 6f 20 63 6c 6f 73 65 20 64 61 74 61 62 61 73 65  o close database
1c670 20 5c 22 22 20 24 64 62 20 22 5c 22 2c 20 65 72   \"" $db "\", er
1c680 72 6f 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20  ror: " \..      
1c690 20 20 20 20 20 20 5c 6e 5c 74 20 24 65 72 72 6f        \n\t $erro
1c6a0 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a  r \n]..      }..
1c6b0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
1c6c0 20 23 20 4e 4f 54 45 3a 20 46 69 72 73 74 2c 20   # NOTE: First, 
1c6d0 73 65 65 20 69 66 20 6f 75 72 20 63 61 6c 6c 65  see if our calle
1c6e0 72 20 68 61 73 20 72 65 71 75 65 73 74 65 64 20  r has requested 
1c6f0 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
1c700 61 62 61 73 65 2e 0d 0a 20 20 20 20 20 20 23 0d  abase...      #.
1c710 0a 20 20 20 20 20 20 73 65 74 20 69 73 4d 65 6d  .      set isMem
1c720 6f 72 79 20 5b 69 73 4d 65 6d 6f 72 79 44 62 20  ory [isMemoryDb 
1c730 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20 20  $fileName]....  
1c740 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
1c750 4f 54 45 3a 20 42 75 69 6c 64 20 74 68 65 20 66  OTE: Build the f
1c760 75 6c 6c 20 70 61 74 68 20 74 6f 20 74 68 65 20  ull path to the 
1c770 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61  database file na
1c780 6d 65 2e 20 20 46 6f 72 20 6e 6f 77 2c 20 61 6c  me.  For now, al
1c790 6c 20 74 65 73 74 0d 0a 20 20 20 20 20 20 23 20  l test..      # 
1c7a0 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 66        database f
1c7b0 69 6c 65 73 20 61 72 65 20 73 74 6f 72 65 64 20  iles are stored 
1c7c0 69 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  in the temporary
1c7d0 20 64 69 72 65 63 74 6f 72 79 2e 0d 0a 20 20 20   directory...   
1c7e0 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
1c7f0 21 24 69 73 4d 65 6d 6f 72 79 20 26 26 20 24 71  !$isMemory && $q
1c800 75 61 6c 69 66 79 7d 20 74 68 65 6e 20 7b 0d 0a  ualify} then {..
1c810 20 20 20 20 20 20 20 20 73 65 74 20 66 69 6c 65          set file
1c820 4e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20  Name [file join 
1c830 5b 67 65 74 44 61 74 61 62 61 73 65 44 69 72 65  [getDatabaseDire
1c840 63 74 6f 72 79 5d 20 5b 66 69 6c 65 20 74 61 69  ctory] [file tai
1c850 6c 20 24 66 69 6c 65 4e 61 6d 65 5d 5d 0d 0a 20  l $fileName]].. 
1c860 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
1c870 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
1c880 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 66 69   Check if the fi
1c890 6c 65 20 73 74 69 6c 6c 20 65 78 69 73 74 73 3b  le still exists;
1c8a0 20 69 6e 69 74 69 61 6c 6c 79 2c 20 61 73 73 75   initially, assu
1c8b0 6d 65 20 61 6c 6c 20 66 69 6c 65 73 20 77 69 6c  me all files wil
1c8c0 6c 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  l..      #      
1c8d0 20 62 65 20 64 65 6c 65 74 65 64 20 73 75 63 63   be deleted succ
1c8e0 65 73 73 66 75 6c 6c 79 2c 20 69 66 20 6e 65 63  essfully, if nec
1c8f0 65 73 73 61 72 79 2e 0d 0a 20 20 20 20 20 20 23  essary...      #
1c900 0d 0a 20 20 20 20 20 20 73 65 74 20 73 75 63 63  ..      set succ
1c910 65 73 73 20 74 72 75 65 0d 0a 0d 0a 20 20 20 20  ess true....    
1c920 20 20 69 66 20 7b 21 24 69 73 4d 65 6d 6f 72 79    if {!$isMemory
1c930 20 26 26 20 24 64 65 6c 65 74 65 20 26 26 20 5b   && $delete && [
1c940 66 69 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c  file exists $fil
1c950 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a  eName]} then {..
1c960 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1c970 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20     # NOTE: Skip 
1c980 64 65 6c 65 74 69 6e 67 20 64 61 74 61 62 61 73  deleting databas
1c990 65 20 66 69 6c 65 73 20 69 66 20 73 6f 6d 65 62  e files if someb
1c9a0 6f 64 79 20 73 65 74 73 20 74 68 65 20 67 6c 6f  ody sets the glo
1c9b0 62 61 6c 0d 0a 20 20 20 20 20 20 20 20 23 20 20  bal..        #  
1c9c0 20 20 20 20 20 76 61 72 69 61 62 6c 65 20 74 6f       variable to
1c9d0 20 70 72 65 76 65 6e 74 20 69 74 2e 0d 0a 20 20   prevent it...  
1c9e0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1c9f0 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
1ca00 74 73 20 3a 3a 6e 6f 28 63 6c 65 61 6e 75 70 44  ts ::no(cleanupD
1ca10 62 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b  bFiles)]} then {
1ca20 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
1ca30 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
1ca40 20 41 74 74 65 6d 70 74 20 74 6f 20 64 65 6c 65   Attempt to dele
1ca50 74 65 20 74 68 65 20 74 65 73 74 20 57 41 4c 20  te the test WAL 
1ca60 66 69 6c 65 2c 20 69 66 20 61 6e 79 2c 20 6e 6f  file, if any, no
1ca70 77 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  w...          #.
1ca80 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20 77  .          set w
1ca90 61 6c 46 69 6c 65 4e 61 6d 65 20 5b 61 70 70 65  alFileName [appe
1caa0 6e 64 41 72 67 73 20 24 66 69 6c 65 4e 61 6d 65  ndArgs $fileName
1cab0 20 2d 77 61 6c 5d 0d 0a 0d 0a 20 20 20 20 20 20   -wal]....      
1cac0 20 20 20 20 69 66 20 7b 5b 66 69 6c 65 20 65 78      if {[file ex
1cad0 69 73 74 73 20 24 77 61 6c 46 69 6c 65 4e 61 6d  ists $walFileNam
1cae0 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  e]} then {..    
1caf0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1cb00 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49         # NOTE: I
1cb10 66 20 74 68 65 72 65 20 69 73 20 61 20 57 41 4c  f there is a WAL
1cb20 20 66 69 6c 65 2c 20 69 74 20 73 68 6f 75 6c 64   file, it should
1cb30 20 62 65 20 7a 65 72 6f 20 62 79 74 65 73 20 61   be zero bytes a
1cb40 74 20 74 68 69 73 0d 0a 20 20 20 20 20 20 20 20  t this..        
1cb50 20 20 20 20 23 20 20 20 20 20 20 20 70 6f 69 6e      #       poin
1cb60 74 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  t...            
1cb70 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  #..            i
1cb80 66 20 7b 5b 73 65 74 20 73 69 7a 65 20 5b 66 69  f {[set size [fi
1cb90 6c 65 20 73 69 7a 65 20 24 77 61 6c 46 69 6c 65  le size $walFile
1cba0 4e 61 6d 65 5d 5d 20 3d 3d 20 30 7d 20 74 68 65  Name]] == 0} the
1cbb0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
1cbc0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
1cbd0 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 73      # NOTE: We s
1cbe0 6f 6d 65 68 6f 77 20 66 61 69 6c 65 64 20 74 6f  omehow failed to
1cbf0 20 64 65 6c 65 74 65 20 74 68 65 20 57 41 4c 20   delete the WAL 
1cc00 66 69 6c 65 2c 20 72 65 70 6f 72 74 20 77 68 79  file, report why
1cc10 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
1cc20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
1cc30 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 66 69    if {[catch {fi
1cc40 6c 65 20 64 65 6c 65 74 65 20 24 77 61 6c 46 69  le delete $walFi
1cc50 6c 65 4e 61 6d 65 7d 20 65 72 72 6f 72 5d 7d 20  leName} error]} 
1cc60 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1cc70 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
1cc80 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
1cc90 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
1cca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ccb0 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20   "==== WARNING: 
1ccc0 66 61 69 6c 65 64 20 74 6f 20 64 65 6c 65 74 65  failed to delete
1ccd0 20 57 41 4c 20 66 69 6c 65 20 5c 22 22 20 24 77   WAL file \"" $w
1cce0 61 6c 46 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20  alFileName \..  
1ccf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd00 20 20 22 5c 22 20 64 75 72 69 6e 67 20 63 6c 65    "\" during cle
1cd10 61 6e 75 70 2c 20 65 72 72 6f 72 3a 20 22 20 5c  anup, error: " \
1cd20 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a  n\t $error \n]..
1cd30 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1cd40 20 20 73 65 74 20 73 75 63 63 65 73 73 20 66 61    set success fa
1cd50 6c 73 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  lse..           
1cd60 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
1cd70 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
1cd80 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
1cd90 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
1cda0 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
1cdb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cdc0 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20   "==== WARNING: 
1cdd0 57 41 4c 20 66 69 6c 65 20 5c 22 22 20 24 77 61  WAL file \"" $wa
1cde0 6c 46 69 6c 65 4e 61 6d 65 20 22 5c 22 20 69 73  lFileName "\" is
1cdf0 20 22 20 24 73 69 7a 65 20 5c 0d 0a 20 20 20 20   " $size \..    
1ce00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
1ce10 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 73  bytes in size, s
1ce20 6b 69 70 70 69 6e 67 20 61 6c 6c 20 66 69 6c 65  kipping all file
1ce30 20 64 65 6c 65 74 69 6f 6e 73 2e 2e 2e 5c 6e 22   deletions...\n"
1ce40 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ]....           
1ce50 20 20 20 72 65 74 75 72 6e 20 31 3b 20 23 20 65     return 1; # e
1ce60 72 72 6f 72 0d 0a 20 20 20 20 20 20 20 20 20 20  rror..          
1ce70 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d    }..          }
1ce80 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  ....          #.
1ce90 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
1cea0 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 64 65  E: Attempt to de
1ceb0 6c 65 74 65 20 74 68 65 20 74 65 73 74 20 53 48  lete the test SH
1cec0 4d 20 66 69 6c 65 2c 20 69 66 20 61 6e 79 2c 20  M file, if any, 
1ced0 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  now...          
1cee0 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  #..          set
1cef0 20 73 68 6d 46 69 6c 65 4e 61 6d 65 20 5b 61 70   shmFileName [ap
1cf00 70 65 6e 64 41 72 67 73 20 24 66 69 6c 65 4e 61  pendArgs $fileNa
1cf10 6d 65 20 2d 73 68 6d 5d 0d 0a 0d 0a 20 20 20 20  me -shm]....    
1cf20 20 20 20 20 20 20 69 66 20 7b 5b 66 69 6c 65 20        if {[file 
1cf30 65 78 69 73 74 73 20 24 73 68 6d 46 69 6c 65 4e  exists $shmFileN
1cf40 61 6d 65 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  ame] && \..     
1cf50 20 20 20 20 20 20 20 20 20 5b 63 61 74 63 68 20           [catch 
1cf60 7b 66 69 6c 65 20 64 65 6c 65 74 65 20 24 73 68  {file delete $sh
1cf70 6d 46 69 6c 65 4e 61 6d 65 7d 20 65 72 72 6f 72  mFileName} error
1cf80 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
1cf90 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1cfa0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 65        # NOTE: We
1cfb0 20 73 6f 6d 65 68 6f 77 20 66 61 69 6c 65 64 20   somehow failed 
1cfc0 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 53 48  to delete the SH
1cfd0 4d 20 66 69 6c 65 2c 20 72 65 70 6f 72 74 20 77  M file, report w
1cfe0 68 79 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  hy...           
1cff0 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
1d000 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
1d010 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
1d020 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
1d030 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49       "==== WARNI
1d040 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 64 65  NG: failed to de
1d050 6c 65 74 65 20 53 48 4d 20 66 69 6c 65 20 5c 22  lete SHM file \"
1d060 22 20 24 73 68 6d 46 69 6c 65 4e 61 6d 65 20 5c  " $shmFileName \
1d070 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1d080 20 20 22 5c 22 20 64 75 72 69 6e 67 20 63 6c 65    "\" during cle
1d090 61 6e 75 70 2c 20 65 72 72 6f 72 3a 20 22 20 5c  anup, error: " \
1d0a0 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a  n\t $error \n]..
1d0b0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65  ..            se
1d0c0 74 20 73 75 63 63 65 73 73 20 66 61 6c 73 65 0d  t success false.
1d0d0 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  .          }....
1d0e0 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
1d0f0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41         # NOTE: A
1d100 74 74 65 6d 70 74 20 74 6f 20 64 65 6c 65 74 65  ttempt to delete
1d110 20 74 68 65 20 74 65 73 74 20 64 61 74 61 62 61   the test databa
1d120 73 65 20 66 69 6c 65 20 6e 6f 77 2e 0d 0a 20 20  se file now...  
1d130 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1d140 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
1d150 7b 66 69 6c 65 20 64 65 6c 65 74 65 20 24 66 69  {file delete $fi
1d160 6c 65 4e 61 6d 65 7d 20 65 72 72 6f 72 5d 7d 20  leName} error]} 
1d170 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1d180 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
1d190 20 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 73 6f     # NOTE: We so
1d1a0 6d 65 68 6f 77 20 66 61 69 6c 65 64 20 74 6f 20  mehow failed to 
1d1b0 64 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65 2c  delete the file,
1d1c0 20 72 65 70 6f 72 74 20 77 68 79 2e 0d 0a 20 20   report why...  
1d1d0 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
1d1e0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
1d1f0 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
1d200 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
1d210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d                "=
1d220 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69  === WARNING: fai
1d230 6c 65 64 20 74 6f 20 64 65 6c 65 74 65 20 64 61  led to delete da
1d240 74 61 62 61 73 65 20 66 69 6c 65 20 5c 22 22 20  tabase file \"" 
1d250 24 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20  $fileName \..   
1d260 20 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22               "\"
1d270 20 64 75 72 69 6e 67 20 63 6c 65 61 6e 75 70 2c   during cleanup,
1d280 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24   error: " \n\t $
1d290 65 72 72 6f 72 20 5c 6e 5d 0d 0a 0d 0a 20 20 20  error \n]....   
1d2a0 20 20 20 20 20 20 20 20 20 73 65 74 20 73 75 63           set suc
1d2b0 63 65 73 73 20 66 61 6c 73 65 0d 0a 20 20 20 20  cess false..    
1d2c0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
1d2d0 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
1d2e0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1d2f0 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20 74    # NOTE: Show t
1d300 68 61 74 20 77 65 20 73 6b 69 70 70 65 64 20 64  hat we skipped d
1d310 65 6c 65 74 69 6e 67 20 74 68 65 20 66 69 6c 65  eleting the file
1d320 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
1d330 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
1d340 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
1d350 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
1d360 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d               "==
1d370 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 73 6b 69 70  == WARNING: skip
1d380 70 65 64 20 64 65 6c 65 74 69 6e 67 20 64 61 74  ped deleting dat
1d390 61 62 61 73 65 20 66 69 6c 65 20 5c 22 22 20 24  abase file \"" $
1d3a0 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20  fileName \..    
1d3b0 20 20 20 20 20 20 20 20 20 20 22 5c 22 20 64 75            "\" du
1d3c0 72 69 6e 67 20 63 6c 65 61 6e 75 70 5c 6e 22 5d  ring cleanup\n"]
1d3d0 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
1d3e0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65     }....      re
1d3f0 74 75 72 6e 20 5b 65 78 70 72 20 7b 24 73 75 63  turn [expr {$suc
1d400 63 65 73 73 20 3f 20 30 20 3a 20 31 7d 5d 0d 0a  cess ? 0 : 1}]..
1d410 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
1d420 6f 63 20 73 61 76 65 45 6e 76 69 72 6f 6e 6d 65  oc saveEnvironme
1d430 6e 74 56 61 72 69 61 62 6c 65 73 20 7b 20 6e 61  ntVariables { na
1d440 6d 65 73 20 7b 76 61 72 4e 61 6d 65 20 22 22 7d  mes {varName ""}
1d450 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20   } {..      #.. 
1d460 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 6f 72       # NOTE: For
1d470 20 65 61 63 68 20 6e 61 6d 65 2c 20 64 6f 65 73   each name, does
1d480 20 74 68 65 20 6c 69 76 65 20 65 6e 76 69 72 6f   the live enviro
1d490 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 20 65  nment variable e
1d4a0 78 69 73 74 3f 20 20 49 66 0d 0a 20 20 20 20 20  xist?  If..     
1d4b0 20 23 20 20 20 20 20 20 20 73 6f 2c 20 73 61 76   #       so, sav
1d4c0 65 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20  e the value for 
1d4d0 6c 61 74 65 72 3b 20 6f 74 68 65 72 77 69 73 65  later; otherwise
1d4e0 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  , make sure the 
1d4f0 73 61 76 65 64 0d 0a 20 20 20 20 20 20 23 20 20  saved..      #  
1d500 20 20 20 20 20 76 61 6c 75 65 20 64 6f 65 73 20       value does 
1d510 6e 6f 74 20 65 78 69 73 74 20 65 69 74 68 65 72  not exist either
1d520 2e 20 20 54 68 65 20 6c 69 76 65 20 65 6e 76 69  .  The live envi
1d530 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65  ronment variable
1d540 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  s..      #      
1d550 20 41 52 45 20 4e 4f 54 20 63 68 61 6e 67 65 64   ARE NOT changed
1d560 20 62 79 20 74 68 69 73 20 70 72 6f 63 65 64 75   by this procedu
1d570 72 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  re...      #..  
1d580 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
1d590 6c 65 6e 67 74 68 20 24 76 61 72 4e 61 6d 65 5d  length $varName]
1d5a0 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
1d5b0 20 20 20 20 20 20 20 73 65 74 20 76 61 72 4e 61         set varNa
1d5c0 6d 65 20 73 61 76 65 64 45 6e 76 0d 0a 20 20 20  me savedEnv..   
1d5d0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 75 70     }....      up
1d5e0 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65 20 73  var 1 $varName s
1d5f0 61 76 65 64 45 6e 76 0d 0a 0d 0a 20 20 20 20 20  avedEnv....     
1d600 20 66 6f 72 65 61 63 68 20 6e 61 6d 65 20 24 6e   foreach name $n
1d610 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20  ames {..        
1d620 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
1d630 20 3a 3a 65 6e 76 28 24 6e 61 6d 65 29 5d 7d 20   ::env($name)]} 
1d640 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1d650 20 20 73 65 74 20 73 61 76 65 64 45 6e 76 28 24    set savedEnv($
1d660 6e 61 6d 65 29 20 24 3a 3a 65 6e 76 28 24 6e 61  name) $::env($na
1d670 6d 65 29 0d 0a 20 20 20 20 20 20 20 20 7d 20 65  me)..        } e
1d680 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
1d690 20 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61   unset -nocompla
1d6a0 69 6e 20 73 61 76 65 64 45 6e 76 28 24 6e 61 6d  in savedEnv($nam
1d6b0 65 29 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  e)..        }.. 
1d6c0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
1d6d0 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
1d6e0 20 54 68 69 73 20 69 73 20 73 65 6c 66 2d 63 6c   This is self-cl
1d6f0 65 61 6e 69 6e 67 2e 20 20 49 66 20 6e 6f 20 73  eaning.  If no s
1d700 61 76 65 64 20 65 6e 76 69 72 6f 6e 6d 65 6e 74  aved environment
1d710 20 76 61 72 69 61 62 6c 65 73 20 6e 6f 77 0d 0a   variables now..
1d720 20 20 20 20 20 20 23 20 20 20 20 20 20 20 65 78        #       ex
1d730 69 73 74 2c 20 72 65 6d 6f 76 65 20 74 68 65 20  ist, remove the 
1d740 61 72 72 61 79 2e 0d 0a 20 20 20 20 20 20 23 0d  array...      #.
1d750 0a 20 20 20 20 20 20 69 66 20 7b 5b 61 72 72 61  .      if {[arra
1d760 79 20 73 69 7a 65 20 73 61 76 65 64 45 6e 76 5d  y size savedEnv]
1d770 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
1d780 20 20 20 20 20 20 20 75 6e 73 65 74 20 2d 6e 6f         unset -no
1d790 63 6f 6d 70 6c 61 69 6e 20 73 61 76 65 64 45 6e  complain savedEn
1d7a0 76 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  v..      }..    
1d7b0 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 72  }.....    proc r
1d7c0 65 73 74 6f 72 65 45 6e 76 69 72 6f 6e 6d 65 6e  estoreEnvironmen
1d7d0 74 56 61 72 69 61 62 6c 65 73 20 7b 20 6e 61 6d  tVariables { nam
1d7e0 65 73 20 7b 76 61 72 4e 61 6d 65 20 22 22 7d 20  es {varName ""} 
1d7f0 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
1d800 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 6f 72 20      # NOTE: For 
1d810 65 61 63 68 20 6e 61 6d 65 2c 20 64 6f 65 73 20  each name, does 
1d820 74 68 65 20 73 61 76 65 64 20 65 6e 76 69 72 6f  the saved enviro
1d830 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 20 65  nment variable e
1d840 78 69 73 74 3f 20 20 49 66 0d 0a 20 20 20 20 20  xist?  If..     
1d850 20 23 20 20 20 20 20 20 20 73 6f 2c 20 72 65 73   #       so, res
1d860 74 6f 72 65 20 74 68 65 20 73 61 76 65 64 20 76  tore the saved v
1d870 61 6c 75 65 20 61 6e 64 20 75 6e 73 65 74 20 69  alue and unset i
1d880 74 3b 20 6f 74 68 65 72 77 69 73 65 2c 20 6d 61  t; otherwise, ma
1d890 6b 65 20 73 75 72 65 0d 0a 20 20 20 20 20 20 23  ke sure..      #
1d8a0 20 20 20 20 20 20 20 74 68 65 20 6c 69 76 65 20         the live 
1d8b0 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69  environment vari
1d8c0 61 62 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78  able does not ex
1d8d0 69 73 74 20 65 69 74 68 65 72 20 28 69 2e 65 2e  ist either (i.e.
1d8e0 20 69 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20   it..      #    
1d8f0 20 20 20 77 61 73 20 6e 6f 74 20 73 65 74 20 74     was not set t
1d900 6f 20 62 65 67 69 6e 20 77 69 74 68 29 2e 20 20  o begin with).  
1d910 42 6f 74 68 20 73 61 76 65 64 20 61 6e 64 20 6c  Both saved and l
1d920 69 76 65 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 0d  ive environment.
1d930 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 76  .      #       v
1d940 61 72 69 61 62 6c 65 73 20 41 52 45 20 63 68 61  ariables ARE cha
1d950 6e 67 65 64 20 62 79 20 74 68 69 73 20 70 72 6f  nged by this pro
1d960 63 65 64 75 72 65 2e 0d 0a 20 20 20 20 20 20 23  cedure...      #
1d970 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72  ..      if {[str
1d980 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 61 72 4e  ing length $varN
1d990 61 6d 65 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ame] == 0} then 
1d9a0 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 76  {..        set v
1d9b0 61 72 4e 61 6d 65 20 73 61 76 65 64 45 6e 76 0d  arName savedEnv.
1d9c0 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
1d9d0 20 20 75 70 76 61 72 20 31 20 24 76 61 72 4e 61    upvar 1 $varNa
1d9e0 6d 65 20 73 61 76 65 64 45 6e 76 0d 0a 0d 0a 20  me savedEnv.... 
1d9f0 20 20 20 20 20 66 6f 72 65 61 63 68 20 6e 61 6d       foreach nam
1da00 65 20 24 6e 61 6d 65 73 20 7b 0d 0a 20 20 20 20  e $names {..    
1da10 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
1da20 69 73 74 73 20 73 61 76 65 64 45 6e 76 28 24 6e  ists savedEnv($n
1da30 61 6d 65 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  ame)]} then {.. 
1da40 20 20 20 20 20 20 20 20 20 73 65 74 20 3a 3a 65           set ::e
1da50 6e 76 28 24 6e 61 6d 65 29 20 24 73 61 76 65 64  nv($name) $saved
1da60 45 6e 76 28 24 6e 61 6d 65 29 0d 0a 20 20 20 20  Env($name)..    
1da70 20 20 20 20 20 20 75 6e 73 65 74 20 2d 6e 6f 63        unset -noc
1da80 6f 6d 70 6c 61 69 6e 20 73 61 76 65 64 45 6e 76  omplain savedEnv
1da90 28 24 6e 61 6d 65 29 0d 0a 20 20 20 20 20 20 20  ($name)..       
1daa0 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
1dab0 20 20 20 20 20 75 6e 73 65 74 20 2d 6e 6f 63 6f       unset -noco
1dac0 6d 70 6c 61 69 6e 20 3a 3a 65 6e 76 28 24 6e 61  mplain ::env($na
1dad0 6d 65 29 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  me)..        }..
1dae0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
1daf0 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
1db00 3a 20 54 68 69 73 20 69 73 20 73 65 6c 66 2d 63  : This is self-c
1db10 6c 65 61 6e 69 6e 67 2e 20 20 49 66 20 6e 6f 20  leaning.  If no 
1db20 73 61 76 65 64 20 65 6e 76 69 72 6f 6e 6d 65 6e  saved environmen
1db30 74 20 76 61 72 69 61 62 6c 65 73 20 6e 6f 77 0d  t variables now.
1db40 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 65  .      #       e
1db50 78 69 73 74 2c 20 72 65 6d 6f 76 65 20 74 68 65  xist, remove the
1db60 20 61 72 72 61 79 2e 0d 0a 20 20 20 20 20 20 23   array...      #
1db70 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 61 72 72  ..      if {[arr
1db80 61 79 20 73 69 7a 65 20 73 61 76 65 64 45 6e 76  ay size savedEnv
1db90 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
1dba0 20 20 20 20 20 20 20 20 75 6e 73 65 74 20 2d 6e          unset -n
1dbb0 6f 63 6f 6d 70 6c 61 69 6e 20 73 61 76 65 64 45  ocomplain savedE
1dbc0 6e 76 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  nv..      }..   
1dbd0 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
1dbe0 73 61 76 65 45 61 67 6c 65 53 68 65 6c 6c 45 6e  saveEagleShellEn
1dbf0 76 69 72 6f 6e 6d 65 6e 74 20 7b 7d 20 7b 0d 0a  vironment {} {..
1dc00 20 20 20 20 20 20 75 70 76 61 72 20 31 20 73 61        upvar 1 sa
1dc10 76 65 64 45 6e 76 20 73 61 76 65 64 45 6e 76 0d  vedEnv savedEnv.
1dc20 0a 0d 0a 20 20 20 20 20 20 73 61 76 65 45 6e 76  ...      saveEnv
1dc30 69 72 6f 6e 6d 65 6e 74 56 61 72 69 61 62 6c 65  ironmentVariable
1dc40 73 20 5b 6c 69 73 74 20 4e 6f 4d 75 74 65 78 65  s [list NoMutexe
1dc50 73 5d 20 73 61 76 65 64 45 6e 76 0d 0a 20 20 20  s] savedEnv..   
1dc60 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
1dc70 72 65 73 74 6f 72 65 45 61 67 6c 65 53 68 65 6c  restoreEagleShel
1dc80 6c 45 6e 76 69 72 6f 6e 6d 65 6e 74 20 7b 7d 20  lEnvironment {} 
1dc90 7b 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20 31  {..      upvar 1
1dca0 20 73 61 76 65 64 45 6e 76 20 73 61 76 65 64 45   savedEnv savedE
1dcb0 6e 76 0d 0a 0d 0a 20 20 20 20 20 20 72 65 73 74  nv....      rest
1dcc0 6f 72 65 45 6e 76 69 72 6f 6e 6d 65 6e 74 56 61  oreEnvironmentVa
1dcd0 72 69 61 62 6c 65 73 20 5b 6c 69 73 74 20 4e 6f  riables [list No
1dce0 4d 75 74 65 78 65 73 5d 20 73 61 76 65 64 45 6e  Mutexes] savedEn
1dcf0 76 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  v..    }.....   
1dd00 20 70 72 6f 63 20 73 61 76 65 4d 64 61 43 6f 6e   proc saveMdaCon
1dd10 66 69 67 45 6e 76 69 72 6f 6e 6d 65 6e 74 20 7b  figEnvironment {
1dd20 7d 20 7b 0d 0a 20 20 20 20 20 20 75 70 76 61 72  } {..      upvar
1dd30 20 31 20 73 61 76 65 64 45 6e 76 20 73 61 76 65   1 savedEnv save
1dd40 64 45 6e 76 0d 0a 0d 0a 20 20 20 20 20 20 73 61  dEnv....      sa
1dd50 76 65 45 6e 76 69 72 6f 6e 6d 65 6e 74 56 61 72  veEnvironmentVar
1dd60 69 61 62 6c 65 73 20 5b 6c 69 73 74 20 43 4f 4d  iables [list COM
1dd70 50 4c 55 53 5f 4d 44 41 5d 20 73 61 76 65 64 45  PLUS_MDA] savedE
1dd80 6e 76 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  nv..    }.....  
1dd90 20 20 70 72 6f 63 20 72 65 73 74 6f 72 65 4d 64    proc restoreMd
1dda0 61 43 6f 6e 66 69 67 45 6e 76 69 72 6f 6e 6d 65  aConfigEnvironme
1ddb0 6e 74 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 75  nt {} {..      u
1ddc0 70 76 61 72 20 31 20 73 61 76 65 64 45 6e 76 20  pvar 1 savedEnv 
1ddd0 73 61 76 65 64 45 6e 76 0d 0a 0d 0a 20 20 20 20  savedEnv....    
1dde0 20 20 72 65 73 74 6f 72 65 45 6e 76 69 72 6f 6e    restoreEnviron
1ddf0 6d 65 6e 74 56 61 72 69 61 62 6c 65 73 20 5b 6c  mentVariables [l
1de00 69 73 74 20 43 4f 4d 50 4c 55 53 5f 4d 44 41 5d  ist COMPLUS_MDA]
1de10 20 73 61 76 65 64 45 6e 76 0d 0a 20 20 20 20 7d   savedEnv..    }
1de20 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 73 61  .....    proc sa
1de30 76 65 47 65 74 53 65 74 74 69 6e 67 56 61 6c 75  veGetSettingValu
1de40 65 45 6e 76 69 72 6f 6e 6d 65 6e 74 20 7b 7d 20  eEnvironment {} 
1de50 7b 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20 31  {..      upvar 1
1de60 20 73 61 76 65 64 45 6e 76 20 73 61 76 65 64 45   savedEnv savedE
1de70 6e 76 0d 0a 0d 0a 20 20 20 20 20 20 73 61 76 65  nv....      save
1de80 45 6e 76 69 72 6f 6e 6d 65 6e 74 56 61 72 69 61  EnvironmentVaria
1de90 62 6c 65 73 20 5b 6c 69 73 74 20 5c 0d 0a 20 20  bles [list \..  
1dea0 20 20 20 20 20 20 20 20 4e 6f 5f 45 78 70 61 6e          No_Expan
1deb0 64 20 4e 6f 5f 53 51 4c 69 74 65 47 65 74 53 65  d No_SQLiteGetSe
1dec0 74 74 69 6e 67 56 61 6c 75 65 20 4e 6f 5f 53 51  ttingValue No_SQ
1ded0 4c 69 74 65 58 6d 6c 43 6f 6e 66 69 67 46 69 6c  LiteXmlConfigFil
1dee0 65 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  e] \..          
1def0 73 61 76 65 64 45 6e 76 0d 0a 20 20 20 20 7d 0d  savedEnv..    }.
1df00 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 72 65 73  ....    proc res
1df10 74 6f 72 65 47 65 74 53 65 74 74 69 6e 67 56 61  toreGetSettingVa
1df20 6c 75 65 45 6e 76 69 72 6f 6e 6d 65 6e 74 20 7b  lueEnvironment {
1df30 7d 20 7b 0d 0a 20 20 20 20 20 20 75 70 76 61 72  } {..      upvar
1df40 20 31 20 73 61 76 65 64 45 6e 76 20 73 61 76 65   1 savedEnv save
1df50 64 45 6e 76 0d 0a 0d 0a 20 20 20 20 20 20 72 65  dEnv....      re
1df60 73 74 6f 72 65 45 6e 76 69 72 6f 6e 6d 65 6e 74  storeEnvironment
1df70 56 61 72 69 61 62 6c 65 73 20 5b 6c 69 73 74 20  Variables [list 
1df80 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 4e 6f 5f  \..          No_
1df90 45 78 70 61 6e 64 20 4e 6f 5f 53 51 4c 69 74 65  Expand No_SQLite
1dfa0 47 65 74 53 65 74 74 69 6e 67 56 61 6c 75 65 20  GetSettingValue 
1dfb0 4e 6f 5f 53 51 4c 69 74 65 58 6d 6c 43 6f 6e 66  No_SQLiteXmlConf
1dfc0 69 67 46 69 6c 65 5d 20 5c 0d 0a 20 20 20 20 20  igFile] \..     
1dfd0 20 20 20 20 20 73 61 76 65 64 45 6e 76 0d 0a 20       savedEnv.. 
1dfe0 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
1dff0 63 20 73 61 76 65 53 51 4c 69 74 65 43 6f 6e 6e  c saveSQLiteConn
1e000 65 63 74 69 6f 6e 45 6e 76 69 72 6f 6e 6d 65 6e  ectionEnvironmen
1e010 74 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 75 70  t {} {..      up
1e020 76 61 72 20 31 20 73 61 76 65 64 45 6e 76 20 73  var 1 savedEnv s
1e030 61 76 65 64 45 6e 76 0d 0a 0d 0a 20 20 20 20 20  avedEnv....     
1e040 20 73 61 76 65 45 6e 76 69 72 6f 6e 6d 65 6e 74   saveEnvironment
1e050 56 61 72 69 61 62 6c 65 73 20 5b 6c 69 73 74 20  Variables [list 
1e060 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 44 65 66  \..          Def
1e070 61 75 6c 74 46 6c 61 67 73 5f 53 51 4c 69 74 65  aultFlags_SQLite
1e080 43 6f 6e 6e 65 63 74 69 6f 6e 20 4e 6f 5f 53 51  Connection No_SQ
1e090 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 4e 65  LiteConnectionNe
1e0a0 77 50 61 72 73 65 72 5d 20 5c 0d 0a 20 20 20 20  wParser] \..    
1e0b0 20 20 20 20 20 20 73 61 76 65 64 45 6e 76 0d 0a        savedEnv..
1e0c0 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20 31 20  ..      upvar 1 
1e0d0 73 61 76 65 64 43 6f 6e 6e 65 63 74 69 6f 6e 46  savedConnectionF
1e0e0 6c 61 67 73 20 73 61 76 65 64 43 6f 6e 6e 65 63  lags savedConnec
1e0f0 74 69 6f 6e 46 6c 61 67 73 0d 0a 0d 0a 20 20 20  tionFlags....   
1e100 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69     if {[info exi
1e110 73 74 73 20 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e  sts ::connection
1e120 5f 66 6c 61 67 73 5d 7d 20 74 68 65 6e 20 7b 0d  _flags]} then {.
1e130 0a 20 20 20 20 20 20 20 20 73 65 74 20 73 61 76  .        set sav
1e140 65 64 43 6f 6e 6e 65 63 74 69 6f 6e 46 6c 61 67  edConnectionFlag
1e150 73 20 24 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e 5f  s $::connection_
1e160 66 6c 61 67 73 0d 0a 20 20 20 20 20 20 7d 20 65  flags..      } e
1e170 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 75  lse {..        u
1e180 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e  nset -nocomplain
1e190 20 73 61 76 65 64 43 6f 6e 6e 65 63 74 69 6f 6e   savedConnection
1e1a0 46 6c 61 67 73 0d 0a 20 20 20 20 20 20 7d 0d 0a  Flags..      }..
1e1b0 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
1e1c0 6f 63 20 72 65 73 74 6f 72 65 53 51 4c 69 74 65  oc restoreSQLite
1e1d0 43 6f 6e 6e 65 63 74 69 6f 6e 45 6e 76 69 72 6f  ConnectionEnviro
1e1e0 6e 6d 65 6e 74 20 7b 7d 20 7b 0d 0a 20 20 20 20  nment {} {..    
1e1f0 20 20 75 70 76 61 72 20 31 20 73 61 76 65 64 45    upvar 1 savedE
1e200 6e 76 20 73 61 76 65 64 45 6e 76 0d 0a 0d 0a 20  nv savedEnv.... 
1e210 20 20 20 20 20 72 65 73 74 6f 72 65 45 6e 76 69       restoreEnvi
1e220 72 6f 6e 6d 65 6e 74 56 61 72 69 61 62 6c 65 73  ronmentVariables
1e230 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20   [list \..      
1e240 20 20 20 20 44 65 66 61 75 6c 74 46 6c 61 67 73      DefaultFlags
1e250 5f 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f  _SQLiteConnectio
1e260 6e 20 4e 6f 5f 53 51 4c 69 74 65 43 6f 6e 6e 65  n No_SQLiteConne
1e270 63 74 69 6f 6e 4e 65 77 50 61 72 73 65 72 5d 20  ctionNewParser] 
1e280 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 73 61 76  \..          sav
1e290 65 64 45 6e 76 0d 0a 0d 0a 20 20 20 20 20 20 75  edEnv....      u
1e2a0 70 76 61 72 20 31 20 73 61 76 65 64 43 6f 6e 6e  pvar 1 savedConn
1e2b0 65 63 74 69 6f 6e 46 6c 61 67 73 20 73 61 76 65  ectionFlags save
1e2c0 64 43 6f 6e 6e 65 63 74 69 6f 6e 46 6c 61 67 73  dConnectionFlags
1e2d0 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69  ....      if {[i
1e2e0 6e 66 6f 20 65 78 69 73 74 73 20 73 61 76 65 64  nfo exists saved
1e2f0 43 6f 6e 6e 65 63 74 69 6f 6e 46 6c 61 67 73 5d  ConnectionFlags]
1e300 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1e310 20 20 73 65 74 20 3a 3a 63 6f 6e 6e 65 63 74 69    set ::connecti
1e320 6f 6e 5f 66 6c 61 67 73 20 24 73 61 76 65 64 43  on_flags $savedC
1e330 6f 6e 6e 65 63 74 69 6f 6e 46 6c 61 67 73 0d 0a  onnectionFlags..
1e340 20 20 20 20 20 20 20 20 75 6e 73 65 74 20 2d 6e          unset -n
1e350 6f 63 6f 6d 70 6c 61 69 6e 20 73 61 76 65 64 43  ocomplain savedC
1e360 6f 6e 6e 65 63 74 69 6f 6e 46 6c 61 67 73 0d 0a  onnectionFlags..
1e370 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
1e380 20 20 20 20 20 20 20 20 75 6e 73 65 74 20 2d 6e          unset -n
1e390 6f 63 6f 6d 70 6c 61 69 6e 20 3a 3a 63 6f 6e 6e  ocomplain ::conn
1e3a0 65 63 74 69 6f 6e 5f 66 6c 61 67 73 0d 0a 20 20  ection_flags..  
1e3b0 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
1e3c0 0a 20 20 20 20 70 72 6f 63 20 73 61 76 65 53 51  .    proc saveSQ
1e3d0 4c 69 74 65 43 6f 6e 76 65 72 74 45 6e 76 69 72  LiteConvertEnvir
1e3e0 6f 6e 6d 65 6e 74 20 7b 7d 20 7b 0d 0a 20 20 20  onment {} {..   
1e3f0 20 20 20 75 70 76 61 72 20 31 20 73 61 76 65 64     upvar 1 saved
1e400 45 6e 76 20 73 61 76 65 64 45 6e 76 0d 0a 0d 0a  Env savedEnv....
1e410 20 20 20 20 20 20 73 61 76 65 45 6e 76 69 72 6f        saveEnviro
1e420 6e 6d 65 6e 74 56 61 72 69 61 62 6c 65 73 20 5b  nmentVariables [
1e430 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20  list \..        
1e440 20 20 55 73 65 5f 53 51 4c 69 74 65 43 6f 6e 76    Use_SQLiteConv
1e450 65 72 74 5f 44 65 66 61 75 6c 74 44 62 54 79 70  ert_DefaultDbTyp
1e460 65 20 55 73 65 5f 53 51 4c 69 74 65 43 6f 6e 76  e Use_SQLiteConv
1e470 65 72 74 5f 44 65 66 61 75 6c 74 54 79 70 65 4e  ert_DefaultTypeN
1e480 61 6d 65 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20  ame] \..        
1e490 20 20 73 61 76 65 64 45 6e 76 0d 0a 20 20 20 20    savedEnv..    
1e4a0 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 72  }.....    proc r
1e4b0 65 73 74 6f 72 65 53 51 4c 69 74 65 43 6f 6e 76  estoreSQLiteConv
1e4c0 65 72 74 45 6e 76 69 72 6f 6e 6d 65 6e 74 20 7b  ertEnvironment {
1e4d0 7d 20 7b 0d 0a 20 20 20 20 20 20 75 70 76 61 72  } {..      upvar
1e4e0 20 31 20 73 61 76 65 64 45 6e 76 20 73 61 76 65   1 savedEnv save
1e4f0 64 45 6e 76 0d 0a 0d 0a 20 20 20 20 20 20 72 65  dEnv....      re
1e500 73 74 6f 72 65 45 6e 76 69 72 6f 6e 6d 65 6e 74  storeEnvironment
1e510 56 61 72 69 61 62 6c 65 73 20 5b 6c 69 73 74 20  Variables [list 
1e520 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 55 73 65  \..          Use
1e530 5f 53 51 4c 69 74 65 43 6f 6e 76 65 72 74 5f 44  _SQLiteConvert_D
1e540 65 66 61 75 6c 74 44 62 54 79 70 65 20 55 73 65  efaultDbType Use
1e550 5f 53 51 4c 69 74 65 43 6f 6e 76 65 72 74 5f 44  _SQLiteConvert_D
1e560 65 66 61 75 6c 74 54 79 70 65 4e 61 6d 65 5d 20  efaultTypeName] 
1e570 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 73 61 76  \..          sav
1e580 65 64 45 6e 76 0d 0a 20 20 20 20 7d 0d 0a 0c 0d  edEnv..    }....
1e590 0a 20 20 20 20 70 72 6f 63 20 73 65 74 75 70 44  .    proc setupD
1e5a0 62 49 6e 74 65 72 72 75 70 74 43 61 6c 6c 62 61  bInterruptCallba
1e5b0 63 6b 20 7b 20 63 68 61 6e 6e 65 6c 20 6c 6f 67  ck { channel log
1e5c0 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74 70 75 74   } {..      tput
1e5d0 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d  s $channel "----
1e5e0 20 73 65 74 74 69 6e 67 20 75 70 20 64 65 62 75   setting up debu
1e5f0 67 67 65 72 20 69 6e 74 65 72 72 75 70 74 20 63  gger interrupt c
1e600 61 6c 6c 62 61 63 6b 2e 2e 2e 20 22 0d 0a 0d 0a  allback... "....
1e610 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
1e620 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 61 76 65   {..        save
1e630 45 6e 76 69 72 6f 6e 6d 65 6e 74 56 61 72 69 61  EnvironmentVaria
1e640 62 6c 65 73 20 5b 6c 69 73 74 20 5c 0d 0a 20 20  bles [list \..  
1e650 20 20 20 20 20 20 20 20 20 20 71 75 69 65 74 46            quietF
1e660 69 6e 64 49 6e 74 65 72 70 72 65 74 65 72 54 65  indInterpreterTe
1e670 73 74 50 61 74 68 20 71 75 69 65 74 53 65 74 75  stPath quietSetu
1e680 70 49 6e 74 65 72 70 72 65 74 65 72 54 65 73 74  pInterpreterTest
1e690 50 61 74 68 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  Path]....       
1e6a0 20 74 72 79 20 7b 0d 0a 20 20 20 20 20 20 20 20   try {..        
1e6b0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23    #..          #
1e6c0 20 4e 4f 54 45 3a 20 50 72 65 76 65 6e 74 20 74   NOTE: Prevent t
1e6d0 68 65 20 76 65 6e 64 6f 72 20 73 63 72 69 70 74  he vendor script
1e6e0 20 66 72 6f 6d 20 62 65 69 6e 67 20 6e 6f 69 73   from being nois
1e6f0 79 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 0d  y when creating.
1e700 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20  .          #    
1e710 20 20 20 74 68 65 20 69 73 6f 6c 61 74 65 64 20     the isolated 
1e720 69 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a 20 20  interpreter...  
1e730 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1e740 20 20 20 20 20 73 65 74 20 3a 3a 65 6e 76 28 71       set ::env(q
1e750 75 69 65 74 46 69 6e 64 49 6e 74 65 72 70 72 65  uietFindInterpre
1e760 74 65 72 54 65 73 74 50 61 74 68 29 20 31 0d 0a  terTestPath) 1..
1e770 20 20 20 20 20 20 20 20 20 20 73 65 74 20 3a 3a            set ::
1e780 65 6e 76 28 71 75 69 65 74 53 65 74 75 70 49 6e  env(quietSetupIn
1e790 74 65 72 70 72 65 74 65 72 54 65 73 74 50 61 74  terpreterTestPat
1e7a0 68 29 20 31 0d 0a 0d 0a 20 20 20 20 20 20 20 20  h) 1....        
1e7b0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23    #..          #
1e7c0 20 4e 4f 54 45 3a 20 4d 61 6b 65 20 73 75 72 65   NOTE: Make sure
1e7d0 20 74 68 65 20 73 63 72 69 70 74 20 64 65 62 75   the script debu
1e7e0 67 67 65 72 20 61 6e 64 20 74 68 65 20 69 73 6f  gger and the iso
1e7f0 6c 61 74 65 64 20 69 6e 74 65 72 70 72 65 74 65  lated interprete
1e800 72 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20  r..          #  
1e810 20 20 20 20 20 61 72 65 20 73 65 74 75 70 20 61       are setup a
1e820 6e 64 20 72 65 61 64 79 20 66 6f 72 20 75 73 65  nd ready for use
1e830 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
1e840 20 20 20 20 20 20 20 20 20 20 64 65 62 75 67 20            debug 
1e850 73 65 74 75 70 20 74 72 75 65 20 74 72 75 65 0d  setup true true.
1e860 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
1e870 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
1e880 3a 20 4c 6f 61 64 20 74 68 65 20 6e 65 63 65 73  : Load the neces
1e890 73 61 72 79 20 70 61 63 6b 61 67 65 73 20 69 6e  sary packages in
1e8a0 74 6f 20 74 68 65 20 69 73 6f 6c 61 74 65 64 20  to the isolated 
1e8b0 69 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a 20 20  interpreter...  
1e8c0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1e8d0 20 20 20 20 20 64 65 62 75 67 20 65 76 61 6c 20       debug eval 
1e8e0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  {..            p
1e8f0 61 63 6b 61 67 65 20 72 65 71 75 69 72 65 20 45  ackage require E
1e900 61 67 6c 65 0d 0a 20 20 20 20 20 20 20 20 20 20  agle..          
1e910 20 20 70 61 63 6b 61 67 65 20 72 65 71 75 69 72    package requir
1e920 65 20 45 61 67 6c 65 2e 4c 69 62 72 61 72 79 0d  e Eagle.Library.
1e930 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 61 63  .            pac
1e940 6b 61 67 65 20 72 65 71 75 69 72 65 20 45 61 67  kage require Eag
1e950 6c 65 2e 54 65 73 74 0d 0a 20 20 20 20 20 20 20  le.Test..       
1e960 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
1e970 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23    #..          #
1e980 20 4e 4f 54 45 3a 20 43 6f 70 79 20 74 68 65 20   NOTE: Copy the 
1e990 6e 65 63 65 73 73 61 72 79 20 76 61 72 69 61 62  necessary variab
1e9a0 6c 65 73 20 69 6e 74 6f 20 74 68 65 20 69 73 6f  les into the iso
1e9b0 6c 61 74 65 64 20 69 6e 74 65 72 70 72 65 74 65  lated interprete
1e9c0 72 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  r...          #.
1e9d0 0a 20 20 20 20 20 20 20 20 20 20 64 65 62 75 67  .          debug
1e9e0 20 69 6e 76 6f 6b 65 20 30 20 73 65 74 20 3a 3a   invoke 0 set ::
1e9f0 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 63 68  test_channel $ch
1ea00 61 6e 6e 65 6c 3b 20 23 20 4e 4f 54 45 3a 20 46  annel; # NOTE: F
1ea10 6f 72 20 5b 74 70 75 74 73 5d 2e 0d 0a 20 20 20  or [tputs]...   
1ea20 20 20 20 20 20 20 20 64 65 62 75 67 20 69 6e 76         debug inv
1ea30 6f 6b 65 20 30 20 73 65 74 20 3a 3a 74 65 73 74  oke 0 set ::test
1ea40 5f 6c 6f 67 20 24 6c 6f 67 3b 20 23 20 4e 4f 54  _log $log; # NOT
1ea50 45 3a 20 46 6f 72 20 5b 74 6c 6f 67 5d 2e 0d 0a  E: For [tlog]...
1ea60 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
1ea70 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
1ea80 20 49 6e 73 74 61 6c 6c 20 74 68 65 20 63 61 6c   Install the cal
1ea90 6c 62 61 63 6b 20 73 63 72 69 70 74 20 74 6f 20  lback script to 
1eaa0 62 65 20 65 76 61 6c 75 61 74 65 64 20 69 6e 20  be evaluated in 
1eab0 74 68 65 20 69 73 6f 6c 61 74 65 64 0d 0a 20 20  the isolated..  
1eac0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
1ead0 69 6e 74 65 72 70 72 65 74 65 72 20 77 68 65 6e  interpreter when
1eae0 20 74 68 69 73 20 69 6e 74 65 72 70 72 65 74 65   this interprete
1eaf0 72 20 69 73 20 69 6e 74 65 72 72 75 70 74 65 64  r is interrupted
1eb00 20 62 79 20 73 63 72 69 70 74 0d 0a 20 20 20 20   by script..    
1eb10 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 61        #       ca
1eb20 6e 63 65 6c 6c 61 74 69 6f 6e 2c 20 65 74 63 2e  ncellation, etc.
1eb30 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
1eb40 20 20 20 20 20 20 20 20 20 64 65 62 75 67 20 63           debug c
1eb50 61 6c 6c 62 61 63 6b 20 61 70 70 6c 79 20 7b 7b  allback apply {{
1eb60 73 65 6e 64 65 72 20 65 7d 20 7b 0d 0a 20 20 20  sender e} {..   
1eb70 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
1eb80 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
1eb90 43 68 65 63 6b 20 69 66 20 74 68 69 73 20 64 65  Check if this de
1eba0 62 75 67 67 65 72 20 63 61 6c 6c 62 61 63 6b 20  bugger callback 
1ebb0 69 73 20 6f 6e 65 20 74 68 61 74 20 77 65 20 63  is one that we c
1ebc0 61 72 65 20 61 62 6f 75 74 2e 0d 0a 20 20 20 20  are about...    
1ebd0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1ebe0 20 20 20 20 20 20 20 73 65 74 20 69 6e 74 65 72         set inter
1ebf0 72 75 70 74 54 79 70 65 73 20 5b 73 70 6c 69 74  ruptTypes [split
1ec00 20 5b 24 65 20 49 6e 74 65 72 72 75 70 74 54 79   [$e InterruptTy
1ec10 70 65 5d 20 22 2c 20 22 5d 0d 0a 0d 0a 20 20 20  pe] ", "]....   
1ec20 20 20 20 20 20 20 20 20 20 69 66 20 7b 22 43 61           if {"Ca
1ec30 6e 63 65 6c 65 64 22 20 69 6e 20 24 69 6e 74 65  nceled" in $inte
1ec40 72 72 75 70 74 54 79 70 65 73 20 7c 7c 20 5c 0d  rruptTypes || \.
1ec50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1ec60 20 22 55 6e 77 6f 75 6e 64 22 20 69 6e 20 24 69   "Unwound" in $i
1ec70 6e 74 65 72 72 75 70 74 54 79 70 65 73 7d 20 74  nterruptTypes} t
1ec80 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1ec90 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1eca0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4d 61        # NOTE: Ma
1ecb0 6b 65 20 73 75 72 65 20 74 68 65 20 5b 6f 62 6a  ke sure the [obj
1ecc0 65 63 74 5d 20 63 6f 6d 6d 61 6e 64 20 69 73 20  ect] command is 
1ecd0 61 76 61 69 6c 61 62 6c 65 2e 20 20 53 69 6e 63  available.  Sinc
1ece0 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e..             
1ecf0 20 23 20 20 20 20 20 20 20 74 68 69 73 20 69 73   #       this is
1ed00 20 61 6e 20 69 73 6f 6c 61 74 65 64 20 69 6e 74   an isolated int
1ed10 65 72 70 72 65 74 65 72 2c 20 63 68 65 63 6b 20  erpreter, check 
1ed20 66 6f 72 20 69 74 20 74 68 65 20 68 61 72 64 0d  for it the hard.
1ed30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
1ed40 20 20 20 20 20 20 20 77 61 79 2e 0d 0a 20 20 20         way...   
1ed50 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
1ed60 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
1ed70 5b 6c 6c 65 6e 67 74 68 20 5b 69 6e 66 6f 20 63  [llength [info c
1ed80 6f 6d 6d 61 6e 64 73 20 6f 62 6a 65 63 74 5d 5d  ommands object]]
1ed90 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
1eda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
1edb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1edc0 20 23 20 4e 4f 54 45 3a 20 49 74 65 72 61 74 65   # NOTE: Iterate
1edd0 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 64 61 74   through all dat
1ede0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
1edf0 73 20 6b 6e 6f 77 6e 20 74 6f 20 74 68 65 0d 0a  s known to the..
1ee00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee10 23 20 20 20 20 20 20 20 70 61 72 65 6e 74 20 69  #       parent i
1ee20 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a 20 20 20  nterpreter...   
1ee30 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a               #..
1ee40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee50 6f 62 6a 65 63 74 20 66 6f 72 65 61 63 68 20 2d  object foreach -
1ee60 61 6c 69 61 73 20 70 61 69 72 20 5b 6f 62 6a 65  alias pair [obje
1ee70 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73  ct invoke -flags
1ee80 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20   +NonPublic \.. 
1ee90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eea0 20 20 20 24 65 20 49 6e 74 65 72 70 72 65 74 65     $e Interprete
1eeb0 72 2e 63 6f 6e 6e 65 63 74 69 6f 6e 73 5d 20 7b  r.connections] {
1eec0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1eed0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
1eee0 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
1eef0 20 41 74 74 65 6d 70 74 20 74 6f 20 63 61 6e 63   Attempt to canc
1ef00 65 6c 20 61 6e 79 20 53 51 4c 20 71 75 65 72 69  el any SQL queri
1ef10 65 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20 6f  es in progress o
1ef20 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n..             
1ef30 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 69       #       thi
1ef40 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  s database conne
1ef50 63 74 69 6f 6e 2e 0d 0a 20 20 20 20 20 20 20 20  ction...        
1ef60 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
1ef70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
1ef80 66 20 7b 5b 63 61 74 63 68 20 7b 24 70 61 69 72  f {[catch {$pair
1ef90 20 56 61 6c 75 65 2e 43 61 6e 63 65 6c 7d 20 65   Value.Cancel} e
1efa0 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  rror]} then {.. 
1efb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1efc0 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
1efd0 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
1efe0 41 72 67 73 20 5c 6e 20 5c 0d 0a 20 20 20 20 20  Args \n \..     
1eff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f000 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47     "==== WARNING
1f010 3a 20 66 61 69 6c 65 64 20 74 6f 20 63 61 6e 63  : failed to canc
1f020 65 6c 20 71 75 65 72 79 20 66 6f 72 20 22 20 5c  el query for " \
1f030 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1f040 20 20 20 20 20 20 20 20 20 20 22 63 6f 6e 6e 65            "conne
1f050 63 74 69 6f 6e 20 5c 22 22 20 5b 24 70 61 69 72  ction \"" [$pair
1f060 20 4b 65 79 5d 20 22 5c 22 2c 20 65 72 72 6f 72   Key] "\", error
1f070 3a 20 22 20 5c 6e 5c 74 20 5c 0d 0a 20 20 20 20  : " \n\t \..    
1f080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f090 20 20 20 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a      $error \n]..
1f0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f0b0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
1f0c0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
1f0d0 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
1f0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f0f0 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
1f100 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
1f110 73 20 5c 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20  s \n \..        
1f120 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d              "===
1f130 3d 20 57 41 52 4e 49 4e 47 3a 20 63 61 6e 6e 6f  = WARNING: canno
1f140 74 20 63 61 6e 63 65 6c 20 61 6e 79 20 71 75 65  t cancel any que
1f150 72 69 65 73 3a 20 22 20 5c 0d 0a 20 20 20 20 20  ries: " \..     
1f160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1f170 74 68 65 20 5c 22 6f 62 6a 65 63 74 5c 22 20 63  the \"object\" c
1f180 6f 6d 6d 61 6e 64 20 69 73 20 6e 6f 74 20 61 76  ommand is not av
1f190 61 69 6c 61 62 6c 65 5c 6e 22 5d 0d 0a 20 20 20  ailable\n"]..   
1f1a0 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
1f1b0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
1f1c0 20 20 20 20 20 20 20 7d 7d 0d 0a 20 20 20 20 20         }}..     
1f1d0 20 20 20 7d 20 66 69 6e 61 6c 6c 79 20 7b 0d 0a     } finally {..
1f1e0 20 20 20 20 20 20 20 20 20 20 72 65 73 74 6f 72            restor
1f1f0 65 45 6e 76 69 72 6f 6e 6d 65 6e 74 56 61 72 69  eEnvironmentVari
1f200 61 62 6c 65 73 20 5b 6c 69 73 74 20 5c 0d 0a 20  ables [list \.. 
1f210 20 20 20 20 20 20 20 20 20 20 20 20 20 71 75 69               qui
1f220 65 74 46 69 6e 64 49 6e 74 65 72 70 72 65 74 65  etFindInterprete
1f230 72 54 65 73 74 50 61 74 68 20 71 75 69 65 74 53  rTestPath quietS
1f240 65 74 75 70 49 6e 74 65 72 70 72 65 74 65 72 54  etupInterpreterT
1f250 65 73 74 50 61 74 68 5d 0d 0a 20 20 20 20 20 20  estPath]..      
1f260 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 72 72    }..      } err
1f270 6f 72 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  or] == 0} then {
1f280 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e  ..        addCon
1f290 73 74 72 61 69 6e 74 20 69 6e 74 65 72 72 75 70  straint interrup
1f2a0 74 43 61 6c 6c 62 61 63 6b 2e 73 71 6c 69 74 65  tCallback.sqlite
1f2b0 33 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 70 75  3....        tpu
1f2c0 74 73 20 24 63 68 61 6e 6e 65 6c 20 79 65 73 5c  ts $channel yes\
1f2d0 6e 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  n..      } else 
1f2e0 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  {..        tputs
1f2f0 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
1f300 64 41 72 67 73 20 22 6e 6f 2c 20 65 72 72 6f 72  dArgs "no, error
1f310 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20  : " \n\t $error 
1f320 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  \n]..      }..  
1f330 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
1f340 20 63 6c 65 61 6e 75 70 46 69 6c 65 20 7b 20 66   cleanupFile { f
1f350 69 6c 65 4e 61 6d 65 20 7b 63 6f 6c 6c 65 63 74  ileName {collect
1f360 20 74 72 75 65 7d 20 7b 66 6f 72 63 65 20 66 61   true} {force fa
1f370 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20  lse} } {..      
1f380 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
1f390 20 41 74 74 65 6d 70 74 20 74 6f 20 66 6f 72 63   Attempt to forc
1f3a0 65 20 61 6c 6c 20 70 65 6e 64 69 6e 67 20 22 67  e all pending "g
1f3b0 61 72 62 61 67 65 22 20 6f 62 6a 65 63 74 73 20  arbage" objects 
1f3c0 74 6f 20 62 65 20 63 6f 6c 6c 65 63 74 65 64 2c  to be collected,
1f3d0 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
1f3e0 69 6e 63 6c 75 64 69 6e 67 20 53 51 4c 69 74 65  including SQLite
1f3f0 20 73 74 61 74 65 6d 65 6e 74 73 20 61 6e 64 20   statements and 
1f400 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 3b 20  backup objects; 
1f410 74 68 69 73 20 73 68 6f 75 6c 64 20 61 6c 6c 6f  this should allo
1f420 77 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  w..      #      
1f430 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
1f440 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
1f450 20 62 65 20 64 65 6c 65 74 65 64 2e 0d 0a 20 20   be deleted...  
1f460 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
1f470 7b 24 63 6f 6c 6c 65 63 74 7d 20 74 68 65 6e 20  {$collect} then 
1f480 7b 0d 0a 20 20 20 20 20 20 20 20 63 6f 6c 6c 65  {..        colle
1f490 63 74 47 61 72 62 61 67 65 20 24 3a 3a 74 65 73  ctGarbage $::tes
1f4a0 74 5f 63 68 61 6e 6e 65 6c 0d 0a 20 20 20 20 20  t_channel..     
1f4b0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   }....      #.. 
1f4c0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65       # NOTE: Che
1f4d0 63 6b 20 69 66 20 74 68 65 20 66 69 6c 65 20 73  ck if the file s
1f4e0 74 69 6c 6c 20 65 78 69 73 74 73 2e 0d 0a 20 20  till exists...  
1f4f0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
1f500 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 66  {[file exists $f
1f510 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b  ileName]} then {
1f520 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1f530 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69       # NOTE: Ski
1f540 70 20 64 65 6c 65 74 69 6e 67 20 74 65 73 74 20  p deleting test 
1f550 66 69 6c 65 73 20 69 66 20 73 6f 6d 65 62 6f 64  files if somebod
1f560 79 20 73 65 74 73 20 74 68 65 20 67 6c 6f 62 61  y sets the globa
1f570 6c 20 76 61 72 69 61 62 6c 65 0d 0a 20 20 20 20  l variable..    
1f580 20 20 20 20 23 20 20 20 20 20 20 20 74 6f 20 70      #       to p
1f590 72 65 76 65 6e 74 20 69 74 2e 0d 0a 20 20 20 20  revent it...    
1f5a0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69      #..        i
1f5b0 66 20 7b 24 66 6f 72 63 65 20 7c 7c 20 21 5b 69  f {$force || ![i
1f5c0 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
1f5d0 63 6c 65 61 6e 75 70 46 69 6c 65 29 5d 7d 20 74  cleanupFile)]} t
1f5e0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1f5f0 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
1f600 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f  NOTE: Attempt to
1f610 20 64 65 6c 65 74 65 20 74 68 65 20 74 65 73 74   delete the test
1f620 20 66 69 6c 65 20 6e 6f 77 2e 0d 0a 20 20 20 20   file now...    
1f630 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1f640 20 20 20 69 66 20 7b 5b 73 65 74 20 63 6f 64 65     if {[set code
1f650 20 5b 63 61 74 63 68 20 7b 66 69 6c 65 20 64 65   [catch {file de
1f660 6c 65 74 65 20 24 66 69 6c 65 4e 61 6d 65 7d 20  lete $fileName} 
1f670 65 72 72 6f 72 5d 5d 7d 20 74 68 65 6e 20 7b 0d  error]]} then {.
1f680 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a  .            #..
1f690 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f              # NO
1f6a0 54 45 3a 20 57 65 20 73 6f 6d 65 68 6f 77 20 66  TE: We somehow f
1f6b0 61 69 6c 65 64 20 74 6f 20 64 65 6c 65 74 65 20  ailed to delete 
1f6c0 74 68 65 20 66 69 6c 65 2c 20 72 65 70 6f 72 74  the file, report
1f6d0 20 77 68 79 2e 0d 0a 20 20 20 20 20 20 20 20 20   why...         
1f6e0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
1f6f0 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
1f700 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
1f710 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
1f720 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52         "==== WAR
1f730 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20  NING: failed to 
1f740 64 65 6c 65 74 65 20 74 65 73 74 20 66 69 6c 65  delete test file
1f750 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c   \"" $fileName \
1f760 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1f770 20 20 22 5c 22 20 64 75 72 69 6e 67 20 63 6c 65    "\" during cle
1f780 61 6e 75 70 2c 20 65 72 72 6f 72 3a 20 22 20 5c  anup, error: " \
1f790 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a  n\t $error \n]..
1f7a0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
1f7b0 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
1f7c0 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
1f7d0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 68        # NOTE: Sh
1f7e0 6f 77 20 74 68 61 74 20 77 65 20 73 6b 69 70 70  ow that we skipp
1f7f0 65 64 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20  ed deleting the 
1f800 66 69 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 20  file...         
1f810 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   #..          se
1f820 74 20 63 6f 64 65 20 30 0d 0a 0d 0a 20 20 20 20  t code 0....    
1f830 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
1f840 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
1f850 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
1f860 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57           "==== W
1f870 41 52 4e 49 4e 47 3a 20 73 6b 69 70 70 65 64 20  ARNING: skipped 
1f880 64 65 6c 65 74 69 6e 67 20 74 65 73 74 20 66 69  deleting test fi
1f890 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65  le \"" $fileName
1f8a0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1f8b0 20 20 22 5c 22 20 64 75 72 69 6e 67 20 63 6c 65    "\" during cle
1f8c0 61 6e 75 70 5c 6e 22 5d 0d 0a 20 20 20 20 20 20  anup\n"]..      
1f8d0 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73    }..      } els
1f8e0 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  e {..        #..
1f8f0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
1f900 54 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  The file does no
1f910 74 20 65 78 69 73 74 2c 20 73 75 63 63 65 73 73  t exist, success
1f920 21 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  !..        #..  
1f930 20 20 20 20 20 20 73 65 74 20 63 6f 64 65 20 30        set code 0
1f940 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
1f950 20 20 20 72 65 74 75 72 6e 20 24 63 6f 64 65 0d     return $code.
1f960 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
1f970 72 6f 63 20 63 6c 65 61 6e 75 70 4d 65 6d 6f 72  roc cleanupMemor
1f980 79 20 7b 20 76 61 72 4e 61 6d 65 20 7b 71 75 69  y { varName {qui
1f990 65 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20  et false} } {.. 
1f9a0 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65 53 51       if {[haveSQ
1f9b0 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e  LiteObjectComman
1f9c0 64 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  d] && \..       
1f9d0 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74     [string lengt
1f9e0 68 20 24 76 61 72 4e 61 6d 65 5d 20 3e 20 30 7d  h $varName] > 0}
1f9f0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1fa00 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
1fa10 54 45 3a 20 52 65 66 65 72 20 74 6f 20 74 68 65  TE: Refer to the
1fa20 20 73 70 65 63 69 66 69 65 64 20 76 61 72 69 61   specified varia
1fa30 62 6c 65 20 28 65 2e 67 2e 20 22 63 6f 6e 6e 65  ble (e.g. "conne
1fa40 63 74 69 6f 6e 22 29 20 69 6e 20 74 68 65 0d 0a  ction") in the..
1fa50 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
1fa60 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72 20 63  context of our c
1fa70 61 6c 6c 65 72 2e 20 20 54 68 65 20 6f 70 61 71  aller.  The opaq
1fa80 75 65 20 6f 62 6a 65 63 74 20 68 61 6e 64 6c 65  ue object handle
1fa90 20 66 6f 72 20 61 6e 0d 0a 20 20 20 20 20 20 20   for an..       
1faa0 20 23 20 20 20 20 20 20 20 41 44 4f 2e 4e 45 54   #       ADO.NET
1fab0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 72 65 76   connection prev
1fac0 69 6f 75 73 6c 79 20 72 65 74 75 72 6e 65 64 20  iously returned 
1fad0 62 79 20 5b 67 65 74 44 62 43 6f 6e 6e 65 63 74  by [getDbConnect
1fae0 69 6f 6e 5d 0d 0a 20 20 20 20 20 20 20 20 23 20  ion]..        # 
1faf0 20 20 20 20 20 20 73 68 6f 75 6c 64 20 62 65 20        should be 
1fb00 73 74 6f 72 65 64 20 74 68 65 72 65 2e 0d 0a 20  stored there... 
1fb10 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1fb20 20 20 75 70 76 61 72 20 31 20 24 76 61 72 4e 61    upvar 1 $varNa
1fb30 6d 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0d 0a 0d  me connection...
1fb40 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61  .        if {[ca
1fb50 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
1fb60 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 24   object invoke $
1fb70 63 6f 6e 6e 65 63 74 69 6f 6e 20 52 65 6c 65 61  connection Relea
1fb80 73 65 4d 65 6d 6f 72 79 0d 0a 20 20 20 20 20 20  seMemory..      
1fb90 20 20 7d 20 72 65 73 75 6c 74 5d 7d 20 74 68 65    } result]} the
1fba0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69  n {..          i
1fbb0 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
1fbc0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1fbd0 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
1fbe0 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
1fbf0 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
1fc00 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49       "==== WARNI
1fc10 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 72 65  NG: failed to re
1fc20 6c 65 61 73 65 20 64 61 74 61 62 61 73 65 20 6d  lease database m
1fc30 65 6d 6f 72 79 2c 20 65 72 72 6f 72 3a 20 22 20  emory, error: " 
1fc40 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1fc50 20 20 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20     \n\t $result 
1fc60 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  \n]..          }
1fc70 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
1fc80 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66     }....      if
1fc90 20 7b 5b 6c 6c 65 6e 67 74 68 20 5b 69 6e 66 6f   {[llength [info
1fca0 20 63 6f 6d 6d 61 6e 64 73 20 64 65 62 75 67 5d   commands debug]
1fcb0 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
1fcc0 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
1fcd0 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 75  h {..          u
1fce0 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74 20 64  plevel 1 [list d
1fcf0 65 62 75 67 20 70 75 72 67 65 5d 0d 0a 20 20 20  ebug purge]..   
1fd00 20 20 20 20 20 7d 20 72 65 73 75 6c 74 5d 7d 20       } result]} 
1fd10 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1fd20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
1fd30 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1fd40 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
1fd50 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
1fd60 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
1fd70 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41          "==== WA
1fd80 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f  RNING: failed to
1fd90 20 70 75 72 67 65 20 63 61 6c 6c 20 66 72 61 6d   purge call fram
1fda0 65 2c 20 65 72 72 6f 72 3a 20 22 20 5c 0d 0a 20  e, error: " \.. 
1fdb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
1fdc0 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d  n\t $result \n].
1fdd0 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
1fde0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
1fdf0 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d     if {[catch {.
1fe00 0a 20 20 20 20 20 20 20 20 20 20 75 70 6c 65 76  .          uplev
1fe10 65 6c 20 31 20 5b 6c 69 73 74 20 64 65 62 75 67  el 1 [list debug
1fe20 20 63 6c 65 61 6e 75 70 5d 0d 0a 20 20 20 20 20   cleanup]..     
1fe30 20 20 20 7d 20 72 65 73 75 6c 74 5d 7d 20 74 68     } result]} th
1fe40 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
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 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
1fe80 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
1fe90 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
1fea0 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e        "==== WARN
1feb0 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 63  ING: failed to c
1fec0 6c 65 61 6e 75 70 20 69 6e 74 65 72 70 72 65 74  leanup interpret
1fed0 65 72 2c 20 65 72 72 6f 72 3a 20 22 20 5c 0d 0a  er, error: " \..
1fee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fef0 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d  \n\t $result \n]
1ff00 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
1ff10 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
1ff20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
1ff30 0d 0a 20 20 20 20 20 20 20 20 20 20 75 70 6c 65  ..          uple
1ff40 76 65 6c 20 31 20 5b 6c 69 73 74 20 64 65 62 75  vel 1 [list debu
1ff50 67 20 63 6f 6c 6c 65 63 74 5d 0d 0a 20 20 20 20  g collect]..    
1ff60 20 20 20 20 7d 20 72 65 73 75 6c 74 5d 7d 20 74      } result]} t
1ff70 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1ff80 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
1ff90 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
1ffa0 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
1ffb0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
1ffc0 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
1ffd0 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52         "==== WAR
1ffe0 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20  NING: failed to 
1fff0 63 6f 6c 6c 65 63 74 20 67 61 72 62 61 67 65 2c  collect garbage,
20000 20 65 72 72 6f 72 3a 20 22 20 5c 0d 0a 20 20 20   error: " \..   
20010 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 6e 5c               \n\
20020 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20  t $result \n].. 
20030 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
20040 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
20050 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
20060 6f 63 20 73 65 74 75 70 4d 65 6d 6f 72 79 43 6f  oc setupMemoryCo
20070 75 6e 74 65 72 73 20 7b 20 76 61 72 4e 61 6d 65  unters { varName
20080 20 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b   } {..      if {
20090 5b 68 61 76 65 53 51 4c 69 74 65 4f 62 6a 65 63  [haveSQLiteObjec
200a0 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65 6e 20  tCommand]} then 
200b0 7b 0d 0a 20 20 20 20 20 20 20 20 75 70 76 61 72  {..        upvar
200c0 20 31 20 24 76 61 72 4e 61 6d 65 20 63 6f 75 6e   1 $varName coun
200d0 74 65 72 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73  ter....        s
200e0 65 74 20 63 6f 75 6e 74 65 72 28 31 29 20 5b 6f  et counter(1) [o
200f0 62 6a 65 63 74 20 63 72 65 61 74 65 20 2d 61 6c  bject create -al
20100 69 61 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ias \..         
20110 20 20 20 53 79 73 74 65 6d 2e 44 69 61 67 6e 6f     System.Diagno
20120 73 74 69 63 73 2e 50 65 72 66 6f 72 6d 61 6e 63  stics.Performanc
20130 65 43 6f 75 6e 74 65 72 20 50 72 6f 63 65 73 73  eCounter Process
20140 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
20150 22 57 6f 72 6b 69 6e 67 20 53 65 74 22 20 5b 66  "Working Set" [f
20160 69 6c 65 20 72 6f 6f 74 6e 61 6d 65 20 5b 66 69  ile rootname [fi
20170 6c 65 20 74 61 69 6c 20 24 3a 3a 62 69 6e 5f 66  le tail $::bin_f
20180 69 6c 65 5d 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20  ile]]]....      
20190 20 20 73 65 74 20 63 6f 75 6e 74 65 72 28 32 29    set counter(2)
201a0 20 5b 6f 62 6a 65 63 74 20 63 72 65 61 74 65 20   [object create 
201b0 2d 61 6c 69 61 73 20 5c 0d 0a 20 20 20 20 20 20  -alias \..      
201c0 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 69 61        System.Dia
201d0 67 6e 6f 73 74 69 63 73 2e 50 65 72 66 6f 72 6d  gnostics.Perform
201e0 61 6e 63 65 43 6f 75 6e 74 65 72 20 50 72 6f 63  anceCounter Proc
201f0 65 73 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ess \..         
20200 20 20 20 22 57 6f 72 6b 69 6e 67 20 53 65 74 20     "Working Set 
20210 50 65 61 6b 22 20 5b 66 69 6c 65 20 72 6f 6f 74  Peak" [file root
20220 6e 61 6d 65 20 5b 66 69 6c 65 20 74 61 69 6c 20  name [file tail 
20230 24 3a 3a 62 69 6e 5f 66 69 6c 65 5d 5d 5d 0d 0a  $::bin_file]]]..
20240 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 63 6f  ..        set co
20250 75 6e 74 65 72 28 33 29 20 5b 6f 62 6a 65 63 74  unter(3) [object
20260 20 63 72 65 61 74 65 20 2d 61 6c 69 61 73 20 5c   create -alias \
20270 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 79  ..            Sy
20280 73 74 65 6d 2e 44 69 61 67 6e 6f 73 74 69 63 73  stem.Diagnostics
20290 2e 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e  .PerformanceCoun
202a0 74 65 72 20 50 72 6f 63 65 73 73 20 5c 0d 0a 20  ter Process \.. 
202b0 20 20 20 20 20 20 20 20 20 20 20 22 50 72 69 76             "Priv
202c0 61 74 65 20 42 79 74 65 73 22 20 5b 66 69 6c 65  ate Bytes" [file
202d0 20 72 6f 6f 74 6e 61 6d 65 20 5b 66 69 6c 65 20   rootname [file 
202e0 74 61 69 6c 20 24 3a 3a 62 69 6e 5f 66 69 6c 65  tail $::bin_file
202f0 5d 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  ]]]..      }....
20300 20 20 20 20 20 20 72 65 74 75 72 6e 20 22 22 0d        return "".
20310 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
20320 72 6f 63 20 72 65 70 6f 72 74 4d 65 6d 6f 72 79  roc reportMemory
20330 43 6f 75 6e 74 65 72 73 20 7b 20 63 68 61 6e 6e  Counters { chann
20340 65 6c 20 76 61 72 4e 61 6d 65 20 70 72 65 66 69  el varName prefi
20350 78 20 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66 20  x } {..      if 
20360 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f 62 6a 65  {[haveSQLiteObje
20370 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65 6e  ctCommand]} then
20380 20 7b 0d 0a 20 20 20 20 20 20 20 20 75 70 76 61   {..        upva
20390 72 20 31 20 24 76 61 72 4e 61 6d 65 20 63 6f 75  r 1 $varName cou
203a0 6e 74 65 72 0d 0a 0d 0a 20 20 20 20 20 20 20 20  nter....        
203b0 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
203c0 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
203d0 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
203e0 22 20 24 70 72 65 66 69 78 20 22 20 63 6f 75 6e  " $prefix " coun
203f0 74 65 72 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20  ter \"" \..     
20400 20 20 20 20 20 20 20 5b 6f 62 6a 65 63 74 20 69         [object i
20410 6e 76 6f 6b 65 20 24 63 6f 75 6e 74 65 72 28 31  nvoke $counter(1
20420 29 20 43 6f 75 6e 74 65 72 4e 61 6d 65 5d 20 22  ) CounterName] "
20430 5c 22 20 76 61 6c 75 65 20 69 73 20 22 20 5c 0d  \" value is " \.
20440 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 6f 62  .            [ob
20450 6a 65 63 74 20 69 6e 76 6f 6b 65 20 24 63 6f 75  ject invoke $cou
20460 6e 74 65 72 28 31 29 20 52 61 77 56 61 6c 75 65  nter(1) RawValue
20470 5d 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  ] \n]....       
20480 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
20490 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
204a0 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
204b0 20 22 20 24 70 72 65 66 69 78 20 22 20 63 6f 75   " $prefix " cou
204c0 6e 74 65 72 20 5c 22 22 20 5c 0d 0a 20 20 20 20  nter \"" \..    
204d0 20 20 20 20 20 20 20 20 5b 6f 62 6a 65 63 74 20          [object 
204e0 69 6e 76 6f 6b 65 20 24 63 6f 75 6e 74 65 72 28  invoke $counter(
204f0 32 29 20 43 6f 75 6e 74 65 72 4e 61 6d 65 5d 20  2) CounterName] 
20500 22 5c 22 20 76 61 6c 75 65 20 69 73 20 22 20 5c  "\" value is " \
20510 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 6f  ..            [o
20520 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 24 63 6f  bject invoke $co
20530 75 6e 74 65 72 28 32 29 20 52 61 77 56 61 6c 75  unter(2) RawValu
20540 65 5d 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20  e] \n]....      
20550 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
20560 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
20570 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
20580 2d 20 22 20 24 70 72 65 66 69 78 20 22 20 63 6f  - " $prefix " co
20590 75 6e 74 65 72 20 5c 22 22 20 5c 0d 0a 20 20 20  unter \"" \..   
205a0 20 20 20 20 20 20 20 20 20 5b 6f 62 6a 65 63 74           [object
205b0 20 69 6e 76 6f 6b 65 20 24 63 6f 75 6e 74 65 72   invoke $counter
205c0 28 33 29 20 43 6f 75 6e 74 65 72 4e 61 6d 65 5d  (3) CounterName]
205d0 20 22 5c 22 20 76 61 6c 75 65 20 69 73 20 22 20   "\" value is " 
205e0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
205f0 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 24 63  object invoke $c
20600 6f 75 6e 74 65 72 28 33 29 20 52 61 77 56 61 6c  ounter(3) RawVal
20610 75 65 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d  ue] \n]..      }
20620 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
20630 70 72 6f 63 20 63 6f 6c 6c 65 63 74 47 61 72 62  proc collectGarb
20640 61 67 65 20 7b 20 63 68 61 6e 6e 65 6c 20 7b 6d  age { channel {m
20650 69 6c 6c 69 73 65 63 6f 6e 64 73 20 31 30 30 30  illiseconds 1000
20660 7d 20 7b 71 75 69 65 74 20 74 72 75 65 7d 20 7d  } {quiet true} }
20670 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 68   {..      if {[h
20680 61 76 65 53 51 4c 69 74 65 4f 62 6a 65 63 74 43  aveSQLiteObjectC
20690 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65 6e 20 7b 0d  ommand]} then {.
206a0 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61  .        if {[ca
206b0 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
206c0 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 47   object invoke G
206d0 43 20 47 65 74 54 6f 74 61 6c 4d 65 6d 6f 72 79  C GetTotalMemory
206e0 20 66 61 6c 73 65 0d 0a 20 20 20 20 20 20 20 20   false..        
206f0 7d 20 72 65 73 75 6c 74 5d 20 3d 3d 20 30 7d 20  } result] == 0} 
20700 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
20710 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
20720 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
20730 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
20740 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
20750 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20760 20 22 2d 2d 2d 2d 20 6d 65 6d 6f 72 79 20 69 6e   "---- memory in
20770 20 75 73 65 20 62 79 20 74 68 65 20 43 4c 52 20   use by the CLR 
20780 62 65 66 6f 72 65 20 63 6f 6c 6c 65 63 74 69 6f  before collectio
20790 6e 2e 2e 2e 20 22 20 5c 0d 0a 20 20 20 20 20 20  n... " \..      
207a0 20 20 20 20 20 20 20 20 20 20 24 72 65 73 75 6c            $resul
207b0 74 20 22 20 62 79 74 65 73 5c 6e 22 5d 0d 0a 20  t " bytes\n"].. 
207c0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
207d0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
207e0 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
207f0 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
20800 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
20810 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
20820 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
20830 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52         "==== WAR
20840 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20  NING: failed to 
20850 67 65 74 20 43 4c 52 20 6d 65 6d 6f 72 79 20 75  get CLR memory u
20860 73 61 67 65 2c 20 65 72 72 6f 72 3a 20 22 20 5c  sage, error: " \
20870 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
20880 20 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c    \n\t $result \
20890 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  n]..          }.
208a0 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
208b0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 23 23    }....      ###
208c0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
208d0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
208e0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
208f0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
20900 23 23 23 23 23 23 0d 0a 0d 0a 20 20 20 20 20 20  ######....      
20910 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
20920 20 52 65 70 65 61 74 65 64 6c 79 20 61 74 74 65   Repeatedly atte
20930 6d 70 74 20 74 6f 20 63 6f 6c 6c 65 63 74 20 67  mpt to collect g
20940 61 72 62 61 67 65 20 75 6e 74 69 6c 20 74 68 65  arbage until the
20950 20 61 6c 6c 6f 74 74 65 64 20 6e 75 6d 62 65 72   allotted number
20960 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
20970 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20  of milliseconds 
20980 68 61 73 20 65 6c 61 70 73 65 64 2e 20 20 41 6c  has elapsed.  Al
20990 77 61 79 73 20 61 74 74 65 6d 70 74 20 74 6f 20  ways attempt to 
209a0 63 6f 6c 6c 65 63 74 20 67 61 72 62 61 67 65 0d  collect garbage.
209b0 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61  .      #       a
209c0 74 20 6c 65 61 73 74 20 6f 6e 63 65 2e 0d 0a 20  t least once... 
209d0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
209e0 20 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f 62 6a   {[haveSQLiteObj
209f0 65 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65  ectCommand]} the
20a00 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74  n {..        set
20a10 20 73 74 61 72 74 20 5b 63 6c 6f 63 6b 20 73 65   start [clock se
20a20 63 6f 6e 64 73 5d 0d 0a 20 20 20 20 20 20 20 20  conds]..        
20a30 73 65 74 20 73 74 6f 70 20 5b 65 78 70 72 20 7b  set stop [expr {
20a40 24 73 74 61 72 74 20 2b 20 28 24 6d 69 6c 6c 69  $start + ($milli
20a50 73 65 63 6f 6e 64 73 20 2f 20 31 30 30 30 29 7d  seconds / 1000)}
20a60 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 64 6f 20  ]....        do 
20a70 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  {..          #..
20a80 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
20a90 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 66 6f 72  : Attempt to for
20aa0 63 65 20 61 20 66 75 6c 6c 20 67 61 72 62 61 67  ce a full garbag
20ab0 65 20 63 6f 6c 6c 65 63 74 69 6f 6e 20 6e 6f 77  e collection now
20ac0 2e 20 20 52 65 70 6f 72 74 20 61 6e 79 0d 0a 20  .  Report any.. 
20ad0 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
20ae0 20 65 72 72 6f 72 20 74 68 61 74 20 69 73 20 65   error that is e
20af0 6e 63 6f 75 6e 74 65 72 65 64 20 69 66 20 77 65  ncountered if we
20b00 20 66 61 69 6c 2e 0d 0a 20 20 20 20 20 20 20 20   fail...        
20b10 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69    #..          i
20b20 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  f {[catch {..   
20b30 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20           object 
20b40 69 6e 76 6f 6b 65 20 47 43 20 47 65 74 54 6f 74  invoke GC GetTot
20b50 61 6c 4d 65 6d 6f 72 79 20 74 72 75 65 0d 0a 20  alMemory true.. 
20b60 20 20 20 20 20 20 20 20 20 7d 20 65 72 72 6f 72           } error
20b70 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
20b80 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
20b90 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
20ba0 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
20bb0 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
20bc0 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
20bd0 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20            "==== 
20be0 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20  WARNING: failed 
20bf0 66 75 6c 6c 20 67 61 72 62 61 67 65 20 63 6f 6c  full garbage col
20c00 6c 65 63 74 69 6f 6e 2c 20 65 72 72 6f 72 3a 20  lection, error: 
20c10 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
20c20 20 20 20 20 20 20 20 5c 6e 5c 74 20 24 65 72 72         \n\t $err
20c30 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  or \n]..        
20c40 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
20c50 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
20c60 73 65 74 20 6e 6f 77 20 5b 63 6c 6f 63 6b 20 73  set now [clock s
20c70 65 63 6f 6e 64 73 5d 0d 0a 20 20 20 20 20 20 20  econds]..       
20c80 20 7d 20 77 68 69 6c 65 20 7b 24 73 74 61 72 74   } while {$start
20c90 20 3c 3d 20 24 6e 6f 77 20 26 26 20 24 6e 6f 77   <= $now && $now
20ca0 20 3c 20 24 73 74 6f 70 7d 0d 0a 20 20 20 20 20   < $stop}..     
20cb0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 23 23 23   }....      ####
20cc0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
20cd0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
20ce0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
20cf0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
20d00 23 23 23 23 23 0d 0a 0d 0a 20 20 20 20 20 20 69  #####....      i
20d10 66 20 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f 62  f {[haveSQLiteOb
20d20 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68  jectCommand]} th
20d30 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66  en {..        if
20d40 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
20d50 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76        object inv
20d60 6f 6b 65 20 47 43 20 47 65 74 54 6f 74 61 6c 4d  oke GC GetTotalM
20d70 65 6d 6f 72 79 20 66 61 6c 73 65 0d 0a 20 20 20  emory false..   
20d80 20 20 20 20 20 7d 20 72 65 73 75 6c 74 5d 20 3d       } result] =
20d90 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
20da0 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
20db0 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
20dc0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
20dd0 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
20de0 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
20df0 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6d 65 6d 6f        "---- memo
20e00 72 79 20 69 6e 20 75 73 65 20 62 79 20 74 68 65  ry in use by the
20e10 20 43 4c 52 20 61 66 74 65 72 20 63 6f 6c 6c 65   CLR after colle
20e20 63 74 69 6f 6e 2e 2e 2e 20 22 20 5c 0d 0a 20 20  ction... " \..  
20e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24 72                $r
20e40 65 73 75 6c 74 20 22 20 62 79 74 65 73 5c 6e 22  esult " bytes\n"
20e50 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ]..          }..
20e60 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
20e70 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
20e80 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
20e90 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
20ea0 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
20eb0 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
20ec0 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d             "====
20ed0 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64   WARNING: failed
20ee0 20 74 6f 20 67 65 74 20 43 4c 52 20 6d 65 6d 6f   to get CLR memo
20ef0 72 79 20 75 73 61 67 65 2c 20 65 72 72 6f 72 3a  ry usage, error:
20f00 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   " \..          
20f10 20 20 20 20 20 20 5c 6e 5c 74 20 24 72 65 73 75        \n\t $resu
20f20 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  lt \n]..        
20f30 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
20f40 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
20f50 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 53  ...    proc getS
20f60 51 4c 69 74 65 48 61 6e 64 6c 65 43 6f 75 6e 74  QLiteHandleCount
20f70 73 20 7b 20 63 68 61 6e 6e 65 6c 20 7b 71 75 69  s { channel {qui
20f80 65 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20  et false} } {.. 
20f90 20 20 20 20 20 73 65 74 20 72 65 73 75 6c 74 20       set result 
20fa0 5b 6c 69 73 74 5d 0d 0a 0d 0a 20 20 20 20 20 20  [list]....      
20fb0 69 66 20 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f  if {[haveSQLiteO
20fc0 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d 20 26 26  bjectCommand] &&
20fd0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 68   \..          [h
20fe0 61 76 65 53 51 4c 69 74 65 44 65 66 69 6e 65 43  aveSQLiteDefineC
20ff0 6f 6e 73 74 61 6e 74 20 43 4f 55 4e 54 5f 48 41  onstant COUNT_HA
21000 4e 44 4c 45 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  NDLE]} then {.. 
21010 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
21020 20 20 23 20 4e 4f 54 45 3a 20 41 64 64 20 65 61    # NOTE: Add ea
21030 63 68 20 63 72 69 74 69 63 61 6c 20 68 61 6e 64  ch critical hand
21040 6c 65 20 63 6f 75 6e 74 20 74 6f 20 74 68 65 20  le count to the 
21050 72 65 73 75 6c 74 69 6e 67 20 6c 69 73 74 2e 0d  resulting list..
21060 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
21070 20 20 20 20 66 6f 72 65 61 63 68 20 6e 61 6d 65      foreach name
21080 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20   [list \..      
21090 20 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e        connection
210a0 43 6f 75 6e 74 20 73 74 61 74 65 6d 65 6e 74 43  Count statementC
210b0 6f 75 6e 74 20 62 61 63 6b 75 70 43 6f 75 6e 74  ount backupCount
210c0 20 62 6c 6f 62 43 6f 75 6e 74 5d 20 7b 0d 0a 20   blobCount] {.. 
210d0 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61           if {[ca
210e0 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
210f0 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65     object invoke
21100 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c   -flags +NonPubl
21110 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ic \..          
21120 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74        System.Dat
21130 61 2e 53 51 4c 69 74 65 2e 44 65 62 75 67 44 61  a.SQLite.DebugDa
21140 74 61 20 24 6e 61 6d 65 0d 0a 20 20 20 20 20 20  ta $name..      
21150 20 20 20 20 7d 20 76 61 6c 75 65 5d 20 3d 3d 20      } value] == 
21160 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
21170 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
21180 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
21190 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
211a0 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
211b0 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
211c0 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
211d0 63 72 69 74 69 63 61 6c 20 68 61 6e 64 6c 65 20  critical handle 
211e0 63 6f 75 6e 74 20 5c 22 22 20 24 6e 61 6d 65 20  count \"" $name 
211f0 22 5c 22 20 69 73 20 22 20 24 76 61 6c 75 65 20  "\" is " $value 
21200 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  \n]..           
21210 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
21220 20 20 6c 61 70 70 65 6e 64 20 72 65 73 75 6c 74    lappend result
21230 20 24 76 61 6c 75 65 0d 0a 20 20 20 20 20 20 20   $value..       
21240 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
21250 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71           if {!$q
21260 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
21270 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
21280 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
21290 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
212a0 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d              "===
212b0 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65  = WARNING: faile
212c0 64 20 74 6f 20 67 65 74 20 63 72 69 74 69 63 61  d to get critica
212d0 6c 20 68 61 6e 64 6c 65 20 63 6f 75 6e 74 20 5c  l handle count \
212e0 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  "" \..          
212f0 20 20 20 20 20 20 20 20 24 6e 61 6d 65 20 22 5c          $name "\
21300 22 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74  ", error: " \n\t
21310 20 24 76 61 6c 75 65 20 5c 6e 5d 0d 0a 20 20 20   $value \n]..   
21320 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
21330 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
21340 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65   }..      } else
21350 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
21360 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
21370 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
21380 54 68 65 20 61 63 74 75 61 6c 20 68 61 6e 64 6c  The actual handl
21390 65 20 63 6f 75 6e 74 73 20 61 72 65 20 6e 6f 74  e counts are not
213a0 20 61 76 61 69 6c 61 62 6c 65 3b 20 74 68 65 72   available; ther
213b0 65 66 6f 72 65 2c 20 6a 75 73 74 0d 0a 20 20 20  efore, just..   
213c0 20 20 20 20 20 23 20 20 20 20 20 20 20 72 65 74       #       ret
213d0 75 72 6e 20 61 6e 20 65 6d 70 74 79 20 6c 69 73  urn an empty lis
213e0 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  t...        #.. 
213f0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
21400 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 72 69 74  annel "---- crit
21410 69 63 61 6c 20 68 61 6e 64 6c 65 20 63 6f 75 6e  ical handle coun
21420 74 73 20 75 6e 61 76 61 69 6c 61 62 6c 65 5c 6e  ts unavailable\n
21430 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  "..      }....  
21440 20 20 20 20 72 65 74 75 72 6e 20 24 72 65 73 75      return $resu
21450 6c 74 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  lt..    }.....  
21460 20 20 70 72 6f 63 20 73 68 75 74 64 6f 77 6e 53    proc shutdownS
21470 51 4c 69 74 65 20 7b 20 63 68 61 6e 6e 65 6c 20  QLite { channel 
21480 7b 66 6f 72 63 65 20 66 61 6c 73 65 7d 20 7b 71  {force false} {q
21490 75 69 65 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d  uiet false} } {.
214a0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
214b0 23 20 4e 4f 54 45 3a 20 4d 61 6b 65 20 73 75 72  # NOTE: Make sur
214c0 65 20 74 68 61 74 20 53 51 4c 69 74 65 20 63 6f  e that SQLite co
214d0 72 65 20 6c 69 62 72 61 72 79 20 69 73 20 63 6f  re library is co
214e0 6d 70 6c 65 74 65 6c 79 20 73 68 75 74 64 6f 77  mpletely shutdow
214f0 6e 2e 20 20 54 68 69 73 0d 0a 20 20 20 20 20 20  n.  This..      
21500 23 20 20 20 20 20 20 20 69 73 20 75 73 65 64 20  #       is used 
21510 62 79 20 74 65 73 74 73 20 74 68 61 74 20 63 68  by tests that ch
21520 61 6e 67 65 20 63 6f 6e 66 69 67 75 72 61 74 69  ange configurati
21530 6f 6e 20 6f 70 74 69 6f 6e 73 20 61 6e 64 2f 6f  on options and/o
21540 72 20 74 68 6f 73 65 0d 0a 20 20 20 20 20 20 23  r those..      #
21550 20 20 20 20 20 20 20 74 68 61 74 20 6e 65 65 64         that need
21560 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 6c 6f   to make sure lo
21570 67 67 69 6e 67 20 69 73 20 69 6e 69 74 69 61 6c  gging is initial
21580 69 7a 65 64 20 28 69 2e 65 2e 20 6a 75 73 74 20  ized (i.e. just 
21590 69 6e 20 63 61 73 65 0d 0a 20 20 20 20 20 20 23  in case..      #
215a0 20 20 20 20 20 20 20 74 68 65 20 53 51 4c 69 74         the SQLit
215b0 65 20 63 6f 72 65 20 6c 69 62 72 61 72 79 20 77  e core library w
215c0 61 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 69  as initialized i
215d0 6e 20 74 68 65 20 70 72 6f 63 65 73 73 20 70 72  n the process pr
215e0 69 6f 72 20 74 6f 0d 0a 20 20 20 20 20 20 23 20  ior to..      # 
215f0 20 20 20 20 20 20 74 68 65 20 53 51 4c 69 74 65        the SQLite
21600 4c 6f 67 20 63 6c 61 73 73 20 62 65 69 6e 67 20  Log class being 
21610 61 62 6c 65 20 74 6f 20 73 65 74 75 70 20 69 74  able to setup it
21620 73 20 6c 6f 67 67 69 6e 67 20 63 61 6c 6c 62 61  s logging callba
21630 63 6b 29 2e 0d 0a 20 20 20 20 20 20 23 20 20 20  ck)...      #   
21640 20 20 20 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74 68      Normally, th
21650 69 73 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62  is should only b
21660 65 20 70 65 72 66 6f 72 6d 65 64 20 69 66 20 53  e performed if S
21670 51 4c 69 74 65 20 69 73 20 6c 6f 61 64 65 64 20  QLite is loaded 
21680 61 6e 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20  and..      #    
21690 20 20 20 72 65 61 64 79 20 66 6f 72 20 75 73 65     ready for use
216a0 20 62 79 20 74 68 65 20 74 65 73 74 20 73 75 69   by the test sui
216b0 74 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  te...      #..  
216c0 20 20 20 20 69 66 20 7b 24 66 6f 72 63 65 20 7c      if {$force |
216d0 7c 20 5b 69 73 53 51 4c 69 74 65 52 65 61 64 79  | [isSQLiteReady
216e0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
216f0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
21700 42 55 47 46 49 58 3a 20 4d 61 6b 65 20 73 75 72  BUGFIX: Make sur
21710 65 20 74 68 61 74 20 61 6e 79 20 22 6c 65 61 6b  e that any "leak
21720 65 64 22 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ed" transactions
21730 20 61 6e 64 2f 6f 72 20 63 6f 6e 6e 65 63 74 69   and/or connecti
21740 6f 6e 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ons..        #  
21750 20 20 20 20 20 20 20 61 72 65 20 63 6c 65 61 6e         are clean
21760 65 64 20 75 70 20 62 65 66 6f 72 65 20 63 61 6c  ed up before cal
21770 6c 69 6e 67 20 74 68 65 20 6e 61 74 69 76 65 20  ling the native 
21780 73 68 75 74 64 6f 77 6e 20 66 75 6e 63 74 69 6f  shutdown functio
21790 6e 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  n...        #.. 
217a0 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 74         foreach t
217b0 72 61 6e 73 61 63 74 69 6f 6e 20 5b 69 6e 66 6f  ransaction [info
217c0 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 5d 20 7b   transactions] {
217d0 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
217e0 5b 73 74 72 69 6e 67 20 6d 61 74 63 68 20 5c 0d  [string match \.
217f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53  .              S
21800 79 73 74 65 6d 23 44 61 74 61 23 53 51 4c 69 74  ystem#Data#SQLit
21810 65 23 53 51 4c 69 74 65 54 72 61 6e 73 61 63 74  e#SQLiteTransact
21820 69 6f 6e 23 2a 20 24 74 72 61 6e 73 61 63 74 69  ion#* $transacti
21830 6f 6e 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  on]} then {..   
21840 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61           if {[ca
21850 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
21860 20 20 20 20 20 73 71 6c 20 74 72 61 6e 73 61 63       sql transac
21870 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 20 24 74  tion rollback $t
21880 72 61 6e 73 61 63 74 69 6f 6e 0d 0a 20 20 20 20  ransaction..    
21890 20 20 20 20 20 20 20 20 7d 20 65 72 72 6f 72 5d          } error]
218a0 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
218b0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
218c0 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
218d0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
218e0 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
218f0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
21900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21910 20 20 20 20 22 2d 2d 2d 2d 20 72 6f 6c 6c 65 64      "---- rolled
21920 20 62 61 63 6b 20 6c 65 61 6b 65 64 20 74 72 61   back leaked tra
21930 6e 73 61 63 74 69 6f 6e 20 5c 22 22 20 5c 0d 0a  nsaction \"" \..
21940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21950 20 20 20 20 24 74 72 61 6e 73 61 63 74 69 6f 6e      $transaction
21960 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20   \"\n]..        
21970 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
21980 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
21990 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
219a0 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
219b0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
219c0 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
219d0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
219e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
219f0 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e      "==== WARNIN
21a00 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 72 6f 6c  G: failed to rol
21a10 6c 62 61 63 6b 20 6c 65 61 6b 65 64 20 74 72 61  lback leaked tra
21a20 6e 73 61 63 74 69 6f 6e 20 5c 22 22 20 5c 0d 0a  nsaction \"" \..
21a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a40 20 20 20 20 24 74 72 61 6e 73 61 63 74 69 6f 6e      $transaction
21a50 20 22 5c 22 2c 20 65 72 72 6f 72 3a 20 22 20 5c   "\", error: " \
21a60 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a  n\t $error \n]..
21a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
21a80 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
21a90 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
21aa0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
21ab0 20 20 66 6f 72 65 61 63 68 20 64 62 20 5b 69 6e    foreach db [in
21ac0 66 6f 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 5d 20  fo connections] 
21ad0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  {..          if 
21ae0 7b 5b 73 74 72 69 6e 67 20 6d 61 74 63 68 20 5c  {[string match \
21af0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
21b00 53 79 73 74 65 6d 23 44 61 74 61 23 53 51 4c 69  System#Data#SQLi
21b10 74 65 23 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74  te#SQLiteConnect
21b20 69 6f 6e 23 2a 20 24 64 62 5d 7d 20 74 68 65 6e  ion#* $db]} then
21b30 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
21b40 69 66 20 7b 5b 63 61 74 63 68 20 7b 73 71 6c 20  if {[catch {sql 
21b50 63 6c 6f 73 65 20 24 64 62 7d 20 65 72 72 6f 72  close $db} error
21b60 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
21b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
21b80 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
21b90 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
21ba0 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
21bb0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
21bc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21bd0 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6c 6f 73 65       "---- close
21be0 64 20 6c 65 61 6b 65 64 20 64 61 74 61 62 61 73  d leaked databas
21bf0 65 20 5c 22 22 20 24 64 62 20 5c 22 5c 6e 5d 0d  e \"" $db \"\n].
21c00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
21c10 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20  ..            } 
21c20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
21c30 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
21c40 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
21c50 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
21c60 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
21c70 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
21c80 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d               "==
21c90 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c  == WARNING: fail
21ca0 65 64 20 74 6f 20 63 6c 6f 73 65 20 6c 65 61 6b  ed to close leak
21cb0 65 64 20 64 61 74 61 62 61 73 65 20 5c 22 22 20  ed database \"" 
21cc0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
21cd0 20 20 20 20 20 20 20 24 64 62 20 22 5c 22 2c 20         $db "\", 
21ce0 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65  error: " \n\t $e
21cf0 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  rror \n]..      
21d00 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
21d10 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
21d20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
21d30 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
21d40 20 20 20 20 20 20 20 23 20 42 55 47 46 49 58 3a         # BUGFIX:
21d50 20 42 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20   Before calling 
21d60 74 68 65 20 6e 61 74 69 76 65 20 73 68 75 74 64  the native shutd
21d70 6f 77 6e 20 66 75 6e 63 74 69 6f 6e 2c 20 6d 61  own function, ma
21d80 6b 65 20 73 75 72 65 20 62 6f 74 68 0d 0a 20 20  ke sure both..  
21d90 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20        #         
21da0 6f 66 20 74 68 65 20 50 52 41 47 4d 41 20 72 65  of the PRAGMA re
21db0 6c 61 74 65 64 20 64 69 72 65 63 74 6f 72 79 20  lated directory 
21dc0 6e 61 6d 65 73 20 61 72 65 20 66 72 65 65 64 2e  names are freed.
21dd0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
21de0 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51 4c       checkForSQL
21df0 69 74 65 44 69 72 65 63 74 6f 72 69 65 73 20 24  iteDirectories $
21e00 63 68 61 6e 6e 65 6c 20 74 72 75 65 0d 0a 0d 0a  channel true....
21e10 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
21e20 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
21e30 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66  object invoke -f
21e40 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20  lags +NonPublic 
21e50 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
21e60 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
21e70 69 74 65 2e 55 6e 73 61 66 65 4e 61 74 69 76 65  ite.UnsafeNative
21e80 4d 65 74 68 6f 64 73 20 73 71 6c 69 74 65 33 5f  Methods sqlite3_
21e90 73 68 75 74 64 6f 77 6e 0d 0a 20 20 20 20 20 20  shutdown..      
21ea0 20 20 7d 20 72 65 73 75 6c 74 5d 20 3d 3d 20 30    } result] == 0
21eb0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
21ec0 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
21ed0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
21ee0 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
21ef0 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
21f00 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
21f10 20 20 20 22 2d 2d 2d 2d 20 63 61 6c 6c 20 73 71     "---- call sq
21f20 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 28 29  lite3_shutdown()
21f30 2e 2e 2e 20 6f 6b 3a 20 22 20 24 72 65 73 75 6c  ... ok: " $resul
21f40 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  t \n]..         
21f50 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c   }..        } el
21f60 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
21f70 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
21f80 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
21f90 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
21fa0 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
21fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
21fc0 2d 2d 2d 2d 20 63 61 6c 6c 20 73 71 6c 69 74 65  ---- call sqlite
21fd0 33 5f 73 68 75 74 64 6f 77 6e 28 29 2e 2e 2e 20  3_shutdown()... 
21fe0 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 72  error: " \n\t $r
21ff0 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20  esult \n]..     
22000 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
22010 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  }..      }..    
22020 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67  }.....    proc g
22030 65 74 53 65 74 74 69 6e 67 52 65 61 64 43 6f 75  etSettingReadCou
22040 6e 74 20 7b 20 6e 61 6d 65 20 7b 76 69 61 46 69  nt { name {viaFi
22050 6c 65 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20  le false} } {.. 
22060 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65 43 6f       if {[haveCo
22070 6e 73 74 72 61 69 6e 74 20 62 75 69 6c 64 43 6f  nstraint buildCo
22080 6e 66 69 67 75 72 61 74 69 6f 6e 2e 44 65 62 75  nfiguration.Debu
22090 67 5d 20 26 26 20 5b 63 61 74 63 68 20 7b 0d 0a  g] && [catch {..
220a0 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69          object i
220b0 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f  nvoke -flags +No
220c0 6e 50 75 62 6c 69 63 20 2d 61 6c 69 61 73 20 5c  nPublic -alias \
220d0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 79  ..            Sy
220e0 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
220f0 2e 44 65 62 75 67 44 61 74 61 20 47 65 74 53 65  .DebugData GetSe
22100 74 74 69 6e 67 52 65 61 64 43 6f 75 6e 74 73 20  ttingReadCounts 
22110 24 76 69 61 46 69 6c 65 0d 0a 20 20 20 20 20 20  $viaFile..      
22120 7d 20 73 65 74 74 69 6e 67 52 65 61 64 43 6f 75  } settingReadCou
22130 6e 74 73 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  nts] == 0} then 
22140 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  {..        if {[
22150 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 6e  string length $n
22160 61 6d 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ame] > 0} then {
22170 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
22180 5b 24 73 65 74 74 69 6e 67 52 65 61 64 43 6f 75  [$settingReadCou
22190 6e 74 73 20 54 72 79 47 65 74 56 61 6c 75 65 20  nts TryGetValue 
221a0 24 6e 61 6d 65 20 76 61 6c 75 65 5d 7d 20 74 68  $name value]} th
221b0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
221c0 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
221d0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
221e0 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
221f0 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 65 74         "---- set
22200 74 69 6e 67 20 5c 22 22 20 24 6e 61 6d 65 20 22  ting \"" $name "
22210 5c 22 20 77 61 73 20 72 65 61 64 20 22 20 24 76  \" was read " $v
22220 61 6c 75 65 20 22 20 74 69 6d 65 73 22 20 5c 0d  alue " times" \.
22230 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22240 20 5b 65 78 70 72 20 7b 24 76 69 61 46 69 6c 65   [expr {$viaFile
22250 20 3f 20 22 20 66 72 6f 6d 20 74 68 65 20 63 6f   ? " from the co
22260 6e 66 69 67 75 72 61 74 69 6f 6e 20 66 69 6c 65  nfiguration file
22270 22 20 3a 20 22 22 7d 5d 20 5c 6e 5d 0d 0a 0d 0a  " : ""}] \n]....
22280 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
22290 72 6e 20 24 76 61 6c 75 65 0d 0a 20 20 20 20 20  rn $value..     
222a0 20 20 20 20 20 7d 0d 0a 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 73 65 74 20 6e 61 6d 65 43 6f 75 6e      set nameCoun
222d0 74 20 5b 24 73 65 74 74 69 6e 67 52 65 61 64 43  t [$settingReadC
222e0 6f 75 6e 74 73 20 43 6f 75 6e 74 5d 0d 0a 20 20  ounts Count]..  
222f0 20 20 20 20 20 20 20 20 73 65 74 20 76 61 6c 75          set valu
22300 65 43 6f 75 6e 74 20 30 0d 0a 0d 0a 20 20 20 20  eCount 0....    
22310 20 20 20 20 20 20 6f 62 6a 65 63 74 20 66 6f 72        object for
22320 65 61 63 68 20 2d 61 6c 69 61 73 20 70 61 69 72  each -alias pair
22330 20 24 73 65 74 74 69 6e 67 52 65 61 64 43 6f 75   $settingReadCou
22340 6e 74 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  nts {..         
22350 20 20 20 69 6e 63 72 20 76 61 6c 75 65 43 6f 75     incr valueCou
22360 6e 74 20 5b 24 70 61 69 72 20 56 61 6c 75 65 5d  nt [$pair Value]
22370 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
22380 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
22390 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
223a0 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
223b0 20 20 20 20 20 22 2d 2d 2d 2d 20 73 65 74 74 69       "---- setti
223c0 6e 67 20 5c 22 22 20 5b 24 70 61 69 72 20 4b 65  ng \"" [$pair Ke
223d0 79 5d 20 22 5c 22 20 77 61 73 20 72 65 61 64 20  y] "\" was read 
223e0 22 20 5b 24 70 61 69 72 20 56 61 6c 75 65 5d 20  " [$pair Value] 
223f0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
22400 20 20 20 22 20 74 69 6d 65 73 22 20 5b 65 78 70     " times" [exp
22410 72 20 7b 24 76 69 61 46 69 6c 65 20 3f 20 22 20  r {$viaFile ? " 
22420 66 72 6f 6d 20 74 68 65 20 63 6f 6e 66 69 67 75  from the configu
22430 72 61 74 69 6f 6e 20 66 69 6c 65 22 20 3a 20 5c  ration file" : \
22440 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
22450 20 20 22 22 7d 5d 20 5c 6e 5d 0d 0a 20 20 20 20    ""}] \n]..    
22460 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
22470 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6c 69 73       return [lis
22480 74 20 24 6e 61 6d 65 43 6f 75 6e 74 20 24 76 61  t $nameCount $va
22490 6c 75 65 43 6f 75 6e 74 5d 0d 0a 20 20 20 20 20  lueCount]..     
224a0 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d     }..      }...
224b0 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69  .      if {[stri
224c0 6e 67 20 6c 65 6e 67 74 68 20 24 6e 61 6d 65 5d  ng length $name]
224d0 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
224e0 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
224f0 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
22500 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
22510 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 65 74         "---- set
22520 74 69 6e 67 20 5c 22 22 20 24 6e 61 6d 65 20 22  ting \"" $name "
22530 5c 22 20 77 61 73 20 6e 6f 74 20 72 65 61 64 22  \" was not read"
22540 20 5b 65 78 70 72 20 7b 24 76 69 61 46 69 6c 65   [expr {$viaFile
22550 20 3f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   ? \..          
22560 20 20 22 20 66 72 6f 6d 20 74 68 65 20 63 6f 6e    " from the con
22570 66 69 67 75 72 61 74 69 6f 6e 20 66 69 6c 65 22  figuration file"
22580 20 3a 20 22 22 7d 5d 20 5c 6e 5d 0d 0a 20 20 20   : ""}] \n]..   
22590 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
225a0 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
225b0 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
225c0 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
225d0 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6e 6f 20 73        "---- no s
225e0 65 74 74 69 6e 67 73 20 77 65 72 65 20 72 65 61  ettings were rea
225f0 64 22 20 5b 65 78 70 72 20 7b 24 76 69 61 46 69  d" [expr {$viaFi
22600 6c 65 20 3f 20 5c 0d 0a 20 20 20 20 20 20 20 20  le ? \..        
22610 20 20 20 20 22 20 66 72 6f 6d 20 74 68 65 20 63      " from the c
22620 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 66 69 6c  onfiguration fil
22630 65 22 20 3a 20 22 22 7d 5d 20 5c 6e 5d 0d 0a 20  e" : ""}] \n].. 
22640 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
22650 72 65 74 75 72 6e 20 2d 31 0d 0a 20 20 20 20 7d  return -1..    }
22660 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65  .....    proc ge
22670 74 4f 74 68 65 72 43 6f 75 6e 74 20 7b 20 6e 61  tOtherCount { na
22680 6d 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66  me } {..      if
22690 20 7b 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e   {[haveConstrain
226a0 74 20 62 75 69 6c 64 43 6f 6e 66 69 67 75 72 61  t buildConfigura
226b0 74 69 6f 6e 2e 44 65 62 75 67 5d 20 26 26 20 5b  tion.Debug] && [
226c0 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
226d0 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d   object invoke -
226e0 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63  flags +NonPublic
226f0 20 2d 61 6c 69 61 73 20 5c 0d 0a 20 20 20 20 20   -alias \..     
22700 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61         System.Da
22710 74 61 2e 53 51 4c 69 74 65 2e 44 65 62 75 67 44  ta.SQLite.DebugD
22720 61 74 61 20 47 65 74 4f 74 68 65 72 43 6f 75 6e  ata GetOtherCoun
22730 74 73 0d 0a 20 20 20 20 20 20 7d 20 6f 74 68 65  ts..      } othe
22740 72 43 6f 75 6e 74 73 5d 20 3d 3d 20 30 7d 20 74  rCounts] == 0} t
22750 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69  hen {..        i
22760 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  f {[string lengt
22770 68 20 24 6e 61 6d 65 5d 20 3e 20 30 7d 20 74 68  h $name] > 0} th
22780 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
22790 69 66 20 7b 5b 24 6f 74 68 65 72 43 6f 75 6e 74  if {[$otherCount
227a0 73 20 54 72 79 47 65 74 56 61 6c 75 65 20 24 6e  s TryGetValue $n
227b0 61 6d 65 20 76 61 6c 75 65 5d 7d 20 74 68 65 6e  ame value]} then
227c0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
227d0 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
227e0 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
227f0 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
22800 20 20 20 20 20 22 2d 2d 2d 2d 20 6f 74 68 65 72       "---- other
22810 20 63 6f 75 6e 74 65 72 20 5c 22 22 20 24 6e 61   counter \"" $na
22820 6d 65 20 22 5c 22 20 68 61 73 20 76 61 6c 75 65  me "\" has value
22830 20 22 20 24 76 61 6c 75 65 20 5c 6e 5d 0d 0a 0d   " $value \n]...
22840 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
22850 75 72 6e 20 24 76 61 6c 75 65 0d 0a 20 20 20 20  urn $value..    
22860 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
22870 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
22880 20 20 20 20 20 73 65 74 20 6e 61 6d 65 43 6f 75       set nameCou
22890 6e 74 20 5b 24 6f 74 68 65 72 43 6f 75 6e 74 73  nt [$otherCounts
228a0 20 43 6f 75 6e 74 5d 0d 0a 20 20 20 20 20 20 20   Count]..       
228b0 20 20 20 73 65 74 20 76 61 6c 75 65 43 6f 75 6e     set valueCoun
228c0 74 20 30 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  t 0....         
228d0 20 6f 62 6a 65 63 74 20 66 6f 72 65 61 63 68 20   object foreach 
228e0 2d 61 6c 69 61 73 20 70 61 69 72 20 24 6f 74 68  -alias pair $oth
228f0 65 72 43 6f 75 6e 74 73 20 7b 0d 0a 20 20 20 20  erCounts {..    
22900 20 20 20 20 20 20 20 20 69 6e 63 72 20 76 61 6c          incr val
22910 75 65 43 6f 75 6e 74 20 5b 24 70 61 69 72 20 56  ueCount [$pair V
22920 61 6c 75 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  alue]....       
22930 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
22940 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
22950 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
22960 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
22970 6f 74 68 65 72 20 63 6f 75 6e 74 65 72 20 5c 22  other counter \"
22980 22 20 5b 24 70 61 69 72 20 4b 65 79 5d 20 22 5c  " [$pair Key] "\
22990 22 20 68 61 73 20 76 61 6c 75 65 20 22 20 5c 0d  " has value " \.
229a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
229b0 20 5b 24 70 61 69 72 20 56 61 6c 75 65 5d 20 5c   [$pair Value] \
229c0 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  n]..          }.
229d0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ...          ret
229e0 75 72 6e 20 5b 6c 69 73 74 20 24 6e 61 6d 65 43  urn [list $nameC
229f0 6f 75 6e 74 20 24 76 61 6c 75 65 43 6f 75 6e 74  ount $valueCount
22a00 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  ]..        }..  
22a10 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69      }....      i
22a20 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  f {[string lengt
22a30 68 20 24 6e 61 6d 65 5d 20 3e 20 30 7d 20 74 68  h $name] > 0} th
22a40 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70  en {..        tp
22a50 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
22a60 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
22a70 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  \..            "
22a80 2d 2d 2d 2d 20 6f 74 68 65 72 20 63 6f 75 6e 74  ---- other count
22a90 65 72 20 5c 22 22 20 24 6e 61 6d 65 20 22 5c 22  er \"" $name "\"
22aa0 20 68 61 73 20 6e 6f 20 76 61 6c 75 65 5c 6e 22   has no value\n"
22ab0 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  ]..      } else 
22ac0 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  {..        tputs
22ad0 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
22ae0 20 22 2d 2d 2d 2d 20 74 68 65 72 65 20 61 72 65   "---- there are
22af0 20 6e 6f 20 6f 74 68 65 72 20 63 6f 75 6e 74 65   no other counte
22b00 72 73 5c 6e 22 0d 0a 20 20 20 20 20 20 7d 0d 0a  rs\n"..      }..
22b10 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d  ..      return -
22b20 31 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  1..    }.....   
22b30 20 70 72 6f 63 20 72 65 70 6f 72 74 53 51 4c 69   proc reportSQLi
22b40 74 65 52 65 73 6f 75 72 63 65 73 20 7b 0d 0a 20  teResources {.. 
22b50 20 20 20 20 20 20 20 20 20 20 20 63 68 61 6e 6e             chann
22b60 65 6c 20 7b 71 75 69 65 74 20 66 61 6c 73 65 7d  el {quiet false}
22b70 20 7b 72 65 73 65 74 20 74 72 75 65 7d 20 7b 63   {reset true} {c
22b80 6f 6c 6c 65 63 74 20 74 72 75 65 7d 20 7d 20 7b  ollect true} } {
22b90 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
22ba0 20 23 20 4e 4f 54 45 3a 20 49 66 20 70 6f 73 73   # NOTE: If poss
22bb0 69 62 6c 65 2c 20 61 6c 77 61 79 73 20 72 65 73  ible, always res
22bc0 65 74 20 74 68 65 20 63 61 63 68 65 64 20 61 73  et the cached as
22bd0 73 65 6d 62 6c 79 20 64 69 72 65 63 74 6f 72 79  sembly directory
22be0 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
22bf0 61 6e 64 20 74 68 65 20 63 61 63 68 65 64 20 58  and the cached X
22c00 4d 4c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  ML configuration
22c10 20 66 69 6c 65 20 6e 61 6d 65 2e 0d 0a 20 20 20   file name...   
22c20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
22c30 5b 68 61 76 65 53 51 4c 69 74 65 4f 62 6a 65 63  [haveSQLiteObjec
22c40 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65 6e 20  tCommand]} then 
22c50 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  {..        if {[
22c60 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
22c70 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65     object invoke
22c80 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c   -flags +NonPubl
22c90 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ic \..          
22ca0 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e      System.Data.
22cb0 53 51 4c 69 74 65 2e 55 6e 73 61 66 65 4e 61 74  SQLite.UnsafeNat
22cc0 69 76 65 4d 65 74 68 6f 64 73 20 5c 0d 0a 20 20  iveMethods \..  
22cd0 20 20 20 20 20 20 20 20 20 20 20 20 52 65 73 65              Rese
22ce0 74 43 61 63 68 65 64 41 73 73 65 6d 62 6c 79 44  tCachedAssemblyD
22cf0 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20  irectory..      
22d00 20 20 7d 20 65 72 72 6f 72 5d 20 3d 3d 20 30 7d    } error] == 0}
22d10 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
22d20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
22d30 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
22d40 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
22d50 65 6c 20 22 2d 2d 2d 2d 20 72 65 73 65 74 20 63  el "---- reset c
22d60 61 63 68 65 64 20 61 73 73 65 6d 62 6c 79 20 64  ached assembly d
22d70 69 72 65 63 74 6f 72 79 5c 6e 22 0d 0a 20 20 20  irectory\n"..   
22d80 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
22d90 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
22da0 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
22db0 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
22dc0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
22dd0 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
22de0 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
22df0 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49       "==== WARNI
22e00 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 72 65  NG: failed to re
22e10 73 65 74 20 63 61 63 68 65 64 20 61 73 73 65 6d  set cached assem
22e20 62 6c 79 20 64 69 72 65 63 74 6f 72 79 2c 20 22  bly directory, "
22e30 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
22e40 20 20 20 20 22 65 72 72 6f 72 3a 20 22 20 5c 6e      "error: " \n
22e50 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20  \t $error \n].. 
22e60 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
22e70 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
22e80 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
22e90 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20           object 
22ea0 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e  invoke -flags +N
22eb0 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20  onPublic \..    
22ec0 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d            System
22ed0 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 55 6e 73  .Data.SQLite.Uns
22ee0 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73  afeNativeMethods
22ef0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
22f00 20 20 52 65 73 65 74 43 61 63 68 65 64 58 6d 6c    ResetCachedXml
22f10 43 6f 6e 66 69 67 46 69 6c 65 4e 61 6d 65 0d 0a  ConfigFileName..
22f20 20 20 20 20 20 20 20 20 7d 20 65 72 72 6f 72 5d          } error]
22f30 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
22f40 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71           if {!$q
22f50 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
22f60 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
22f70 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 72  $channel "---- r
22f80 65 73 65 74 20 63 61 63 68 65 64 20 58 4d 4c 20  eset cached XML 
22f90 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 66 69  configuration fi
22fa0 6c 65 20 6e 61 6d 65 5c 6e 22 0d 0a 20 20 20 20  le name\n"..    
22fb0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
22fc0 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
22fd0 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
22fe0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
22ff0 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
23000 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
23010 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
23020 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e      "==== WARNIN
23030 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 72 65 73  G: failed to res
23040 65 74 20 63 61 63 68 65 64 20 58 4d 4c 20 63 6f  et cached XML co
23050 6e 66 69 67 75 72 61 74 69 6f 6e 20 22 20 5c 0d  nfiguration " \.
23060 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23070 20 22 66 69 6c 65 20 6e 61 6d 65 2c 20 65 72 72   "file name, err
23080 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f  or: " \n\t $erro
23090 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  r \n]..         
230a0 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20   }..        }.. 
230b0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
230c0 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
230d0 20 49 66 20 61 76 61 69 6c 61 62 6c 65 2c 20 72   If available, r
230e0 65 70 6f 72 74 20 6f 6e 20 28 61 6e 64 20 70 6f  eport on (and po
230f0 73 73 69 62 6c 79 20 72 65 73 65 74 29 20 74 68  ssibly reset) th
23100 65 20 72 75 6e 74 69 6d 65 0d 0a 20 20 20 20 20  e runtime..     
23110 20 23 20 20 20 20 20 20 20 63 6f 6e 66 69 67 75   #       configu
23120 72 61 74 69 6f 6e 20 73 74 61 74 69 73 74 69 63  ration statistic
23130 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  s...      #..   
23140 20 20 20 69 66 20 7b 5b 68 61 76 65 53 51 4c 69     if {[haveSQLi
23150 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d  teObjectCommand]
23160 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
23170 20 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74   [haveConstraint
23180 20 62 75 69 6c 64 43 6f 6e 66 69 67 75 72 61 74   buildConfigurat
23190 69 6f 6e 2e 44 65 62 75 67 5d 7d 20 74 68 65 6e  ion.Debug]} then
231a0 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   {..        if {
231b0 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
231c0 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b      object invok
231d0 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62  e -flags +NonPub
231e0 6c 69 63 20 2d 61 6c 69 61 73 20 5c 0d 0a 20 20  lic -alias \..  
231f0 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74              Syst
23200 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 44  em.Data.SQLite.D
23210 65 62 75 67 44 61 74 61 20 47 65 74 53 65 74 74  ebugData GetSett
23220 69 6e 67 52 65 61 64 43 6f 75 6e 74 73 20 66 61  ingReadCounts fa
23230 6c 73 65 0d 0a 20 20 20 20 20 20 20 20 7d 20 73  lse..        } s
23240 65 74 74 69 6e 67 52 65 61 64 43 6f 75 6e 74 73  ettingReadCounts
23250 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
23260 20 20 20 20 20 20 20 20 20 20 73 65 74 20 6e 61            set na
23270 6d 65 43 6f 75 6e 74 20 5b 24 73 65 74 74 69 6e  meCount [$settin
23280 67 52 65 61 64 43 6f 75 6e 74 73 20 43 6f 75 6e  gReadCounts Coun
23290 74 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65  t]..          se
232a0 74 20 76 61 6c 75 65 43 6f 75 6e 74 20 30 0d 0a  t valueCount 0..
232b0 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65  ..          obje
232c0 63 74 20 66 6f 72 65 61 63 68 20 2d 61 6c 69 61  ct foreach -alia
232d0 73 20 70 61 69 72 20 24 73 65 74 74 69 6e 67 52  s pair $settingR
232e0 65 61 64 43 6f 75 6e 74 73 20 7b 0d 0a 20 20 20  eadCounts {..   
232f0 20 20 20 20 20 20 20 20 20 69 6e 63 72 20 76 61           incr va
23300 6c 75 65 43 6f 75 6e 74 20 5b 24 70 61 69 72 20  lueCount [$pair 
23310 56 61 6c 75 65 5d 0d 0a 0d 0a 20 20 20 20 20 20  Value]....      
23320 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
23330 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
23340 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
23350 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
23360 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
23370 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73           "---- s
23380 65 74 74 69 6e 67 20 5c 22 22 20 5b 24 70 61 69  etting \"" [$pai
23390 72 20 4b 65 79 5d 20 22 5c 22 20 77 61 73 20 72  r Key] "\" was r
233a0 65 61 64 20 22 20 5c 0d 0a 20 20 20 20 20 20 20  ead " \..       
233b0 20 20 20 20 20 20 20 20 20 20 20 5b 24 70 61 69             [$pai
233c0 72 20 56 61 6c 75 65 5d 20 22 20 74 69 6d 65 73  r Value] " times
233d0 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  \n"]..          
233e0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d    }..          }
233f0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66  ....          if
23400 20 7b 24 72 65 73 65 74 7d 20 74 68 65 6e 20 7b   {$reset} then {
23410 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
23420 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
23430 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74            object
23440 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b   invoke -flags +
23450 4e 6f 6e 50 75 62 6c 69 63 20 2d 61 6c 69 61 73  NonPublic -alias
23460 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
23470 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74        System.Dat
23480 61 2e 53 51 4c 69 74 65 2e 44 65 62 75 67 44 61  a.SQLite.DebugDa
23490 74 61 20 43 6c 65 61 72 53 65 74 74 69 6e 67 52  ta ClearSettingR
234a0 65 61 64 43 6f 75 6e 74 73 20 66 61 6c 73 65 0d  eadCounts false.
234b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65  .            } e
234c0 72 72 6f 72 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  rror] == 0} then
234d0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
234e0 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
234f0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
23500 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
23510 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
23520 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
23530 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 72           "---- r
23540 65 73 65 74 20 73 65 74 74 69 6e 67 20 73 74 61  eset setting sta
23550 74 69 73 74 69 63 73 20 66 6f 72 20 74 68 65 20  tistics for the 
23560 70 72 65 76 69 6f 75 73 20 22 20 5c 0d 0a 20 20  previous " \..  
23570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23580 20 20 24 6e 61 6d 65 43 6f 75 6e 74 20 22 20 6e    $nameCount " n
23590 61 6d 65 73 20 61 6e 64 20 22 20 24 76 61 6c 75  ames and " $valu
235a0 65 43 6f 75 6e 74 20 22 20 76 61 6c 75 65 73 20  eCount " values 
235b0 72 65 61 64 5c 6e 22 5d 0d 0a 20 20 20 20 20 20  read\n"]..      
235c0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
235d0 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
235e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
235f0 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
23600 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
23610 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
23620 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
23630 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
23640 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e        "==== WARN
23650 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 72  ING: failed to r
23660 65 73 65 74 20 73 65 74 74 69 6e 67 20 73 74 61  eset setting sta
23670 74 69 73 74 69 63 73 20 66 6f 72 20 22 20 5c 0d  tistics for " \.
23680 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23690 20 20 20 20 20 22 74 68 65 20 70 72 65 76 69 6f       "the previo
236a0 75 73 20 22 20 24 6e 61 6d 65 43 6f 75 6e 74 20  us " $nameCount 
236b0 22 20 6e 61 6d 65 73 20 61 6e 64 20 22 20 24 76  " names and " $v
236c0 61 6c 75 65 43 6f 75 6e 74 20 5c 0d 0a 20 20 20  alueCount \..   
236d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
236e0 20 22 20 76 61 6c 75 65 73 20 72 65 61 64 2c 20   " values read, 
236f0 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65  error: " \n\t $e
23700 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  rror \n]..      
23710 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
23720 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
23730 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
23740 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b  ....        if {
23750 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
23760 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b      object invok
23770 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62  e -flags +NonPub
23780 6c 69 63 20 2d 61 6c 69 61 73 20 5c 0d 0a 20 20  lic -alias \..  
23790 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74              Syst
237a0 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 44  em.Data.SQLite.D
237b0 65 62 75 67 44 61 74 61 20 47 65 74 53 65 74 74  ebugData GetSett
237c0 69 6e 67 52 65 61 64 43 6f 75 6e 74 73 20 74 72  ingReadCounts tr
237d0 75 65 0d 0a 20 20 20 20 20 20 20 20 7d 20 73 65  ue..        } se
237e0 74 74 69 6e 67 46 69 6c 65 52 65 61 64 43 6f 75  ttingFileReadCou
237f0 6e 74 73 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  nts] == 0} then 
23800 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  {..          set
23810 20 6e 61 6d 65 43 6f 75 6e 74 20 5b 24 73 65 74   nameCount [$set
23820 74 69 6e 67 46 69 6c 65 52 65 61 64 43 6f 75 6e  tingFileReadCoun
23830 74 73 20 43 6f 75 6e 74 5d 0d 0a 20 20 20 20 20  ts Count]..     
23840 20 20 20 20 20 73 65 74 20 76 61 6c 75 65 43 6f       set valueCo
23850 75 6e 74 20 30 0d 0a 0d 0a 20 20 20 20 20 20 20  unt 0....       
23860 20 20 20 6f 62 6a 65 63 74 20 66 6f 72 65 61 63     object foreac
23870 68 20 2d 61 6c 69 61 73 20 70 61 69 72 20 24 73  h -alias pair $s
23880 65 74 74 69 6e 67 46 69 6c 65 52 65 61 64 43 6f  ettingFileReadCo
23890 75 6e 74 73 20 7b 0d 0a 20 20 20 20 20 20 20 20  unts {..        
238a0 20 20 20 20 69 6e 63 72 20 76 61 6c 75 65 43 6f      incr valueCo
238b0 75 6e 74 20 5b 24 70 61 69 72 20 56 61 6c 75 65  unt [$pair Value
238c0 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ]....           
238d0 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
238e0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
238f0 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
23900 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
23910 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
23920 20 20 20 20 22 2d 2d 2d 2d 20 73 65 74 74 69 6e      "---- settin
23930 67 20 5c 22 22 20 5b 24 70 61 69 72 20 4b 65 79  g \"" [$pair Key
23940 5d 20 22 5c 22 20 77 61 73 20 72 65 61 64 20 22  ] "\" was read "
23950 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
23960 20 20 20 20 20 20 5b 24 70 61 69 72 20 56 61 6c        [$pair Val
23970 75 65 5d 20 22 20 74 69 6d 65 73 20 66 72 6f 6d  ue] " times from
23980 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69   the configurati
23990 6f 6e 20 66 69 6c 65 5c 6e 22 5d 0d 0a 20 20 20  on file\n"]..   
239a0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
239b0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
239c0 20 20 20 20 20 69 66 20 7b 24 72 65 73 65 74 7d       if {$reset}
239d0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
239e0 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
239f0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
23a00 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d   object invoke -
23a10 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63  flags +NonPublic
23a20 20 2d 61 6c 69 61 73 20 5c 0d 0a 20 20 20 20 20   -alias \..     
23a30 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73               Sys
23a40 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
23a50 44 65 62 75 67 44 61 74 61 20 43 6c 65 61 72 53  DebugData ClearS
23a60 65 74 74 69 6e 67 52 65 61 64 43 6f 75 6e 74 73  ettingReadCounts
23a70 20 74 72 75 65 0d 0a 20 20 20 20 20 20 20 20 20   true..         
23a80 20 20 20 7d 20 65 72 72 6f 72 5d 20 3d 3d 20 30     } error] == 0
23a90 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
23aa0 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
23ab0 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
23ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
23ad0 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
23ae0 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
23af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
23b00 2d 2d 2d 2d 20 72 65 73 65 74 20 73 65 74 74 69  ---- reset setti
23b10 6e 67 20 73 74 61 74 69 73 74 69 63 73 20 66 6f  ng statistics fo
23b20 72 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 22  r the previous "
23b30 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
23b40 20 20 20 20 20 20 20 20 24 6e 61 6d 65 43 6f 75          $nameCou
23b50 6e 74 20 22 20 6e 61 6d 65 73 20 61 6e 64 20 22  nt " names and "
23b60 20 24 76 61 6c 75 65 43 6f 75 6e 74 20 22 20 76   $valueCount " v
23b70 61 6c 75 65 73 20 72 65 61 64 20 22 20 5c 0d 0a  alues read " \..
23b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b90 20 20 20 20 22 66 72 6f 6d 20 74 68 65 20 63 6f      "from the co
23ba0 6e 66 69 67 75 72 61 74 69 6f 6e 20 66 69 6c 65  nfiguration file
23bb0 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  \n"]..          
23bc0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
23bd0 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
23be0 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
23bf0 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
23c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c10 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
23c20 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
23c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c40 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a    "==== WARNING:
23c50 20 66 61 69 6c 65 64 20 74 6f 20 72 65 73 65 74   failed to reset
23c60 20 73 65 74 74 69 6e 67 20 73 74 61 74 69 73 74   setting statist
23c70 69 63 73 20 66 6f 72 20 22 20 5c 0d 0a 20 20 20  ics for " \..   
23c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c90 20 22 74 68 65 20 70 72 65 76 69 6f 75 73 20 22   "the previous "
23ca0 20 24 6e 61 6d 65 43 6f 75 6e 74 20 22 20 6e 61   $nameCount " na
23cb0 6d 65 73 20 61 6e 64 20 22 20 24 76 61 6c 75 65  mes and " $value
23cc0 43 6f 75 6e 74 20 5c 0d 0a 20 20 20 20 20 20 20  Count \..       
23cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 76               " v
23ce0 61 6c 75 65 73 20 72 65 61 64 20 66 72 6f 6d 20  alues read from 
23cf0 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  the configuratio
23d00 6e 20 66 69 6c 65 2c 20 65 72 72 6f 72 3a 20 22  n file, error: "
23d10 20 5c 6e 5c 74 20 5c 0d 0a 20 20 20 20 20 20 20   \n\t \..       
23d20 20 20 20 20 20 20 20 20 20 20 20 20 20 24 65 72               $er
23d30 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ror \n]..       
23d40 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
23d50 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
23d60 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
23d70 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  ...        if {[
23d80 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
23d90 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65     object invoke
23da0 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c   -flags +NonPubl
23db0 69 63 20 2d 61 6c 69 61 73 20 5c 0d 0a 20 20 20  ic -alias \..   
23dc0 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65             Syste
23dd0 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 44 65  m.Data.SQLite.De
23de0 62 75 67 44 61 74 61 20 47 65 74 4f 74 68 65 72  bugData GetOther
23df0 43 6f 75 6e 74 73 0d 0a 20 20 20 20 20 20 20 20  Counts..        
23e00 7d 20 6f 74 68 65 72 43 6f 75 6e 74 73 5d 20 3d  } otherCounts] =
23e10 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
23e20 20 20 20 20 20 20 20 73 65 74 20 6e 61 6d 65 43         set nameC
23e30 6f 75 6e 74 20 5b 24 6f 74 68 65 72 43 6f 75 6e  ount [$otherCoun
23e40 74 73 20 43 6f 75 6e 74 5d 0d 0a 20 20 20 20 20  ts Count]..     
23e50 20 20 20 20 20 73 65 74 20 76 61 6c 75 65 43 6f       set valueCo
23e60 75 6e 74 20 30 0d 0a 0d 0a 20 20 20 20 20 20 20  unt 0....       
23e70 20 20 20 6f 62 6a 65 63 74 20 66 6f 72 65 61 63     object foreac
23e80 68 20 2d 61 6c 69 61 73 20 70 61 69 72 20 24 6f  h -alias pair $o
23e90 74 68 65 72 43 6f 75 6e 74 73 20 7b 0d 0a 20 20  therCounts {..  
23ea0 20 20 20 20 20 20 20 20 20 20 69 6e 63 72 20 76            incr v
23eb0 61 6c 75 65 43 6f 75 6e 74 20 5b 24 70 61 69 72  alueCount [$pair
23ec0 20 56 61 6c 75 65 5d 0d 0a 0d 0a 20 20 20 20 20   Value]....     
23ed0 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
23ee0 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
23ef0 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
23f00 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
23f10 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
23f20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
23f30 6f 74 68 65 72 20 63 6f 75 6e 74 65 72 20 5c 22  other counter \"
23f40 22 20 5b 24 70 61 69 72 20 4b 65 79 5d 20 22 5c  " [$pair Key] "\
23f50 22 20 68 61 73 20 76 61 6c 75 65 20 22 20 5c 0d  " has value " \.
23f60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23f70 20 20 20 5b 24 70 61 69 72 20 56 61 6c 75 65 5d     [$pair Value]
23f80 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \n]..          
23f90 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d    }..          }
23fa0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66  ....          if
23fb0 20 7b 24 72 65 73 65 74 7d 20 74 68 65 6e 20 7b   {$reset} then {
23fc0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
23fd0 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
23fe0 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74            object
23ff0 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b   invoke -flags +
24000 4e 6f 6e 50 75 62 6c 69 63 20 2d 61 6c 69 61 73  NonPublic -alias
24010 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
24020 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74        System.Dat
24030 61 2e 53 51 4c 69 74 65 2e 44 65 62 75 67 44 61  a.SQLite.DebugDa
24040 74 61 20 43 6c 65 61 72 4f 74 68 65 72 43 6f 75  ta ClearOtherCou
24050 6e 74 73 0d 0a 20 20 20 20 20 20 20 20 20 20 20  nts..           
24060 20 7d 20 65 72 72 6f 72 5d 20 3d 3d 20 30 7d 20   } error] == 0} 
24070 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
24080 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
24090 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
240a0 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
240b0 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
240c0 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
240d0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
240e0 2d 2d 20 72 65 73 65 74 20 6f 74 68 65 72 20 63  -- reset other c
240f0 6f 75 6e 74 65 72 73 20 66 6f 72 20 74 68 65 20  ounters for the 
24100 70 72 65 76 69 6f 75 73 20 22 20 5c 0d 0a 20 20  previous " \..  
24110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24120 20 20 24 6e 61 6d 65 43 6f 75 6e 74 20 22 20 6e    $nameCount " n
24130 61 6d 65 73 20 61 6e 64 20 22 20 24 76 61 6c 75  ames and " $valu
24140 65 43 6f 75 6e 74 20 22 20 76 61 6c 75 65 73 5c  eCount " values\
24150 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n"]..           
24160 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
24170 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
24180 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24            if {!$
24190 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
241a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
241b0 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
241c0 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
241d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
241e0 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20   "==== WARNING: 
241f0 66 61 69 6c 65 64 20 74 6f 20 72 65 73 65 74 20  failed to reset 
24200 6f 74 68 65 72 20 63 6f 75 6e 74 65 72 73 20 66  other counters f
24210 6f 72 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20  or " \..        
24220 20 20 20 20 20 20 20 20 20 20 20 20 22 74 68 65              "the
24230 20 70 72 65 76 69 6f 75 73 20 22 20 24 6e 61 6d   previous " $nam
24240 65 43 6f 75 6e 74 20 22 20 6e 61 6d 65 73 20 61  eCount " names a
24250 6e 64 20 22 20 24 76 61 6c 75 65 43 6f 75 6e 74  nd " $valueCount
24260 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
24270 20 20 20 20 20 20 20 20 22 20 76 61 6c 75 65 73          " values
24280 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20  , error: " \n\t 
24290 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20  $error \n]..    
242a0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
242b0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
242c0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
242d0 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20   }..      }.... 
242e0 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65 53 51       if {[haveSQ
242f0 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e  LiteObjectComman
24300 64 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  d] && \..       
24310 20 20 20 5b 68 61 76 65 53 51 4c 69 74 65 44 65     [haveSQLiteDe
24320 66 69 6e 65 43 6f 6e 73 74 61 6e 74 20 49 4e 54  fineConstant INT
24330 45 52 4f 50 5f 56 49 52 54 55 41 4c 5f 54 41 42  EROP_VIRTUAL_TAB
24340 4c 45 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  LE] && \..      
24350 20 20 20 20 5b 68 61 76 65 53 51 4c 69 74 65 44      [haveSQLiteD
24360 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 20 54 52  efineConstant TR
24370 41 43 4b 5f 4d 45 4d 4f 52 59 5f 42 59 54 45 53  ACK_MEMORY_BYTES
24380 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
24390 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
243a0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
243b0 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
243c0 20 22 2d 2d 2d 2d 20 63 75 72 72 65 6e 74 20 6d   "---- current m
243d0 65 6d 6f 72 79 20 69 6e 20 75 73 65 20 62 79 20  emory in use by 
243e0 53 51 4c 69 74 65 4d 65 6d 6f 72 79 2e 2e 2e 20  SQLiteMemory... 
243f0 22 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  "..        }....
24400 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
24410 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
24420 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66  object invoke -f
24430 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20  lags +NonPublic 
24440 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
24450 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
24460 69 74 65 2e 53 51 4c 69 74 65 4d 65 6d 6f 72 79  ite.SQLiteMemory
24470 20 62 79 74 65 73 41 6c 6c 6f 63 61 74 65 64 0d   bytesAllocated.
24480 0a 20 20 20 20 20 20 20 20 7d 20 6d 65 6d 6f 72  .        } memor
24490 79 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  y] == 0} then {.
244a0 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21  .          if {!
244b0 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
244c0 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
244d0 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
244e0 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 22  ndArgs $memory "
244f0 20 62 79 74 65 73 5c 6e 22 5d 0d 0a 20 20 20 20   bytes\n"]..    
24500 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
24510 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
24520 20 20 20 20 20 73 65 74 20 6d 65 6d 6f 72 79 20       set memory 
24530 75 6e 6b 6e 6f 77 6e 0d 0a 0d 0a 20 20 20 20 20  unknown....     
24540 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
24550 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
24560 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
24570 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
24580 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20   $memory \n]..  
24590 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
245a0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
245b0 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
245c0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74  n {..          t
245d0 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d  puts $channel "-
245e0 2d 2d 2d 20 6d 61 78 69 6d 75 6d 20 6d 65 6d 6f  --- maximum memo
245f0 72 79 20 69 6e 20 75 73 65 20 62 79 20 53 51 4c  ry in use by SQL
24600 69 74 65 4d 65 6d 6f 72 79 2e 2e 2e 20 22 0d 0a  iteMemory... "..
24610 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
24620 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
24630 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a  {..          obj
24640 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67  ect invoke -flag
24650 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a  s +NonPublic \..
24660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79                Sy
24670 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
24680 2e 53 51 4c 69 74 65 4d 65 6d 6f 72 79 20 6d 61  .SQLiteMemory ma
24690 78 69 6d 75 6d 42 79 74 65 73 41 6c 6c 6f 63 61  ximumBytesAlloca
246a0 74 65 64 0d 0a 20 20 20 20 20 20 20 20 7d 20 6d  ted..        } m
246b0 65 6d 6f 72 79 5d 20 3d 3d 20 30 7d 20 74 68 65  emory] == 0} the
246c0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69  n {..          i
246d0 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
246e0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
246f0 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
24700 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f  appendArgs $memo
24710 72 79 20 22 20 62 79 74 65 73 5c 6e 22 5d 0d 0a  ry " bytes\n"]..
24720 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
24730 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
24740 20 20 20 20 20 20 20 20 20 73 65 74 20 6d 65 6d           set mem
24750 6f 72 79 20 75 6e 6b 6e 6f 77 6e 0d 0a 0d 0a 20  ory unknown.... 
24760 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71           if {!$q
24770 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
24780 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
24790 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
247a0 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d  Args $memory \n]
247b0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
247c0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
247d0 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 21  }....      if {!
247e0 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
247f0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
24800 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 75 72  hannel "---- cur
24810 72 65 6e 74 20 6d 65 6d 6f 72 79 20 69 6e 20 75  rent memory in u
24820 73 65 20 62 79 20 53 51 4c 69 74 65 2e 2e 2e 20  se by SQLite... 
24830 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  "..      }....  
24840 20 20 20 20 69 66 20 7b 5b 68 61 76 65 53 51 4c      if {[haveSQL
24850 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64  iteObjectCommand
24860 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
24870 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d     if {[catch {.
24880 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63  .          objec
24890 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20  t invoke -flags 
248a0 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20  +NonPublic \..  
248b0 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74              Syst
248c0 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 55  em.Data.SQLite.U
248d0 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f  nsafeNativeMetho
248e0 64 73 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72  ds sqlite3_memor
248f0 79 5f 75 73 65 64 0d 0a 20 20 20 20 20 20 20 20  y_used..        
24900 7d 20 6d 65 6d 6f 72 79 5d 20 3d 3d 20 30 7d 20  } memory] == 0} 
24910 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
24920 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
24930 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
24940 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
24950 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d  l [appendArgs $m
24960 65 6d 6f 72 79 20 22 20 62 79 74 65 73 5c 6e 22  emory " bytes\n"
24970 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ]..          }..
24980 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
24990 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
249a0 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
249b0 20 4d 61 79 62 65 20 74 68 65 20 53 51 4c 69 74   Maybe the SQLit
249c0 65 20 63 6f 72 65 20 6c 69 62 72 61 72 79 20 69  e core library i
249d0 73 20 75 6e 61 76 61 69 6c 61 62 6c 65 3f 0d 0a  s unavailable?..
249e0 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
249f0 20 20 20 20 20 20 20 73 65 74 20 6d 65 6d 6f 72         set memor
24a00 79 20 75 6e 6b 6e 6f 77 6e 0d 0a 0d 0a 20 20 20  y unknown....   
24a10 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
24a20 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
24a30 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
24a40 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
24a50 67 73 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a  gs $memory \n]..
24a60 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
24a70 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20       }..      } 
24a80 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
24a90 73 65 74 20 6d 65 6d 6f 72 79 20 75 6e 61 76 61  set memory unava
24aa0 69 6c 61 62 6c 65 0d 0a 0d 0a 20 20 20 20 20 20  ilable....      
24ab0 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
24ac0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
24ad0 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
24ae0 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d  [appendArgs $mem
24af0 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ory \n]..       
24b00 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20   }..      }.... 
24b10 20 20 20 20 20 73 65 74 20 72 65 73 75 6c 74 20       set result 
24b20 24 6d 65 6d 6f 72 79 3b 20 23 20 4e 4f 54 45 3a  $memory; # NOTE:
24b30 20 52 65 74 75 72 6e 20 6d 65 6d 6f 72 79 20 69   Return memory i
24b40 6e 2d 75 73 65 20 74 6f 20 6f 75 72 20 63 61 6c  n-use to our cal
24b50 6c 65 72 2e 0d 0a 0d 0a 20 20 20 20 20 20 69 66  ler.....      if
24b60 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
24b70 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  {..        tputs
24b80 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20   $channel "---- 
24b90 6d 61 78 69 6d 75 6d 20 6d 65 6d 6f 72 79 20 69  maximum memory i
24ba0 6e 20 75 73 65 20 62 79 20 53 51 4c 69 74 65 2e  n use by SQLite.
24bb0 2e 2e 20 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  .. "..      }...
24bc0 0a 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65  .      if {[have
24bd0 53 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d  SQLiteObjectComm
24be0 61 6e 64 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  and]} then {..  
24bf0 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
24c00 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62   {..          ob
24c10 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61  ject invoke -fla
24c20 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d  gs +NonPublic \.
24c30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53  .              S
24c40 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
24c50 65 2e 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65  e.UnsafeNativeMe
24c60 74 68 6f 64 73 20 5c 0d 0a 20 20 20 20 20 20 20  thods \..       
24c70 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d         sqlite3_m
24c80 65 6d 6f 72 79 5f 68 69 67 68 77 61 74 65 72 20  emory_highwater 
24c90 30 0d 0a 20 20 20 20 20 20 20 20 7d 20 6d 65 6d  0..        } mem
24ca0 6f 72 79 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ory] == 0} then 
24cb0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  {..          if 
24cc0 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
24cd0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
24ce0 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
24cf0 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79  pendArgs $memory
24d00 20 22 20 62 79 74 65 73 5c 6e 22 5d 0d 0a 20 20   " bytes\n"]..  
24d10 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
24d20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
24d30 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
24d40 20 20 20 20 23 20 4e 4f 54 45 3a 20 4d 61 79 62      # NOTE: Mayb
24d50 65 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72  e the SQLite cor
24d60 65 20 6c 69 62 72 61 72 79 20 69 73 20 75 6e 61  e library is una
24d70 76 61 69 6c 61 62 6c 65 3f 0d 0a 20 20 20 20 20  vailable?..     
24d80 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
24d90 20 20 73 65 74 20 6d 65 6d 6f 72 79 20 75 6e 6b    set memory unk
24da0 6e 6f 77 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20  nown....        
24db0 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
24dc0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
24dd0 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
24de0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d  l [appendArgs $m
24df0 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20 20 20  emory \n]..     
24e00 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
24e10 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  }..      } else 
24e20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 6d  {..        set m
24e30 65 6d 6f 72 79 20 75 6e 61 76 61 69 6c 61 62 6c  emory unavailabl
24e40 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20  e....        if 
24e50 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
24e60 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74  ..          tput
24e70 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
24e80 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 5c  ndArgs $memory \
24e90 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  n]..        }.. 
24ea0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
24eb0 69 66 20 7b 24 63 6f 6c 6c 65 63 74 7d 20 74 68  if {$collect} th
24ec0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 63 6f  en {..        co
24ed0 6c 6c 65 63 74 47 61 72 62 61 67 65 20 24 63 68  llectGarbage $ch
24ee0 61 6e 6e 65 6c 0d 0a 20 20 20 20 20 20 7d 0d 0a  annel..      }..
24ef0 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 24 71 75  ..      if {!$qu
24f00 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
24f10 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
24f20 6e 65 6c 20 22 2d 2d 2d 2d 20 63 75 72 72 65 6e  nel "---- curren
24f30 74 20 6d 65 6d 6f 72 79 20 69 6e 20 75 73 65 20  t memory in use 
24f40 62 79 20 74 68 65 20 43 4c 52 2e 2e 2e 20 22 0d  by the CLR... ".
24f50 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
24f60 20 20 69 66 20 7b 5b 68 61 76 65 53 51 4c 69 74    if {[haveSQLit
24f70 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d 7d  eObjectCommand]}
24f80 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
24f90 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
24fa0 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20           object 
24fb0 69 6e 76 6f 6b 65 20 47 43 20 47 65 74 54 6f 74  invoke GC GetTot
24fc0 61 6c 4d 65 6d 6f 72 79 20 66 61 6c 73 65 0d 0a  alMemory false..
24fd0 20 20 20 20 20 20 20 20 7d 20 6d 65 6d 6f 72 79          } memory
24fe0 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
24ff0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73            if {[s
25000 74 72 69 6e 67 20 69 73 20 69 6e 74 65 67 65 72  tring is integer
25010 20 2d 73 74 72 69 63 74 20 24 6d 65 6d 6f 72 79   -strict $memory
25020 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
25030 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
25040 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
25050 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
25060 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
25070 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 22 20 62  Args $memory " b
25080 79 74 65 73 5c 6e 22 5d 0d 0a 20 20 20 20 20 20  ytes\n"]..      
25090 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
250a0 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
250b0 20 20 20 20 20 20 20 20 20 73 65 74 20 6d 65 6d           set mem
250c0 6f 72 79 20 69 6e 76 61 6c 69 64 0d 0a 0d 0a 20  ory invalid.... 
250d0 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
250e0 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
250f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70                tp
25100 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
25110 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79  pendArgs $memory
25120 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \n]..          
25130 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d    }..          }
25140 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65  ..        } else
25150 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   {..          se
25160 74 20 6d 65 6d 6f 72 79 20 75 6e 6b 6e 6f 77 6e  t memory unknown
25170 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66  ....          if
25180 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
25190 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
251a0 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
251b0 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72  ppendArgs $memor
251c0 79 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  y \n]..         
251d0 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20   }..        }.. 
251e0 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
251f0 20 20 20 20 20 20 20 73 65 74 20 6d 65 6d 6f 72         set memor
25200 79 20 75 6e 61 76 61 69 6c 61 62 6c 65 0d 0a 0d  y unavailable...
25210 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71  .        if {!$q
25220 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
25230 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
25240 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
25250 67 73 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a  gs $memory \n]..
25260 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
25270 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75   }....      retu
25280 72 6e 20 24 72 65 73 75 6c 74 0d 0a 20 20 20 20  rn $result..    
25290 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 72  }.....    proc r
252a0 65 73 65 74 53 51 4c 69 74 65 44 69 72 65 63 74  esetSQLiteDirect
252b0 6f 72 69 65 73 20 7b 20 63 68 61 6e 6e 65 6c 20  ories { channel 
252c0 6e 61 74 69 76 65 20 7d 20 7b 0d 0a 20 20 20 20  native } {..    
252d0 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
252e0 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 75 73  E: Attempt to us
252f0 65 20 74 68 65 20 6e 61 74 69 76 65 20 41 50 49  e the native API
25300 20 28 76 69 61 20 74 68 65 20 6d 61 6e 61 67 65   (via the manage
25310 64 20 61 73 73 65 6d 62 6c 79 29 3f 0d 0a 20 20  d assembly)?..  
25320 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
25330 7b 24 6e 61 74 69 76 65 7d 20 74 68 65 6e 20 7b  {$native} then {
25340 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
25350 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e 6f 77       # NOTE: Now
25360 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 64   make sure the d
25370 61 74 61 62 61 73 65 20 61 6e 64 20 74 65 6d 70  atabase and temp
25380 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72 69 65  orary directorie
25390 73 20 61 72 65 0d 0a 20 20 20 20 20 20 20 20 23  s are..        #
253a0 20 20 20 20 20 20 20 72 65 73 65 74 20 74 68 65         reset the
253b0 69 72 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  ir default value
253c0 73 2c 20 77 68 69 63 68 20 73 68 6f 75 6c 64 20  s, which should 
253d0 62 65 20 6e 75 6c 6c 20 66 6f 72 20 62 6f 74 68  be null for both
253e0 2e 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  ...        #    
253f0 20 20 20 53 69 6e 63 65 20 74 68 65 20 73 71 6c     Since the sql
25400 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64  ite3_win32_set_d
25410 69 72 65 63 74 6f 72 79 20 66 75 6e 63 74 69 6f  irectory functio
25420 6e 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 0d  n is available,.
25430 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
25440 20 75 73 65 20 69 74 2e 0d 0a 20 20 20 20 20 20   use it...      
25450 20 20 23 0d 0a 20 20 20 20 20 20 20 20 66 6f 72    #..        for
25460 20 7b 73 65 74 20 69 6e 64 65 78 20 31 7d 20 7b   {set index 1} {
25470 24 69 6e 64 65 78 20 3c 20 33 7d 20 7b 69 6e 63  $index < 3} {inc
25480 72 20 69 6e 64 65 78 7d 20 7b 0d 0a 20 20 20 20  r index} {..    
25490 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
254a0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
254b0 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66  object invoke -f
254c0 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20  lags +NonPublic 
254d0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
254e0 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53     System.Data.S
254f0 51 4c 69 74 65 2e 55 6e 73 61 66 65 4e 61 74 69  QLite.UnsafeNati
25500 76 65 4d 65 74 68 6f 64 73 20 5c 0d 0a 20 20 20  veMethods \..   
25510 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
25520 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64  ite3_win32_set_d
25530 69 72 65 63 74 6f 72 79 20 24 69 6e 64 65 78 20  irectory $index 
25540 6e 75 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20 20  null..          
25550 7d 20 72 65 73 75 6c 74 5d 20 3d 3d 20 30 7d 20  } result] == 0} 
25560 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
25570 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
25580 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
25590 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
255a0 20 20 22 2d 2d 2d 2d 20 63 61 6c 6c 20 73 71 6c    "---- call sql
255b0 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64  ite3_win32_set_d
255c0 69 72 65 63 74 6f 72 79 28 22 20 24 69 6e 64 65  irectory(" $inde
255d0 78 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  x \..           
255e0 20 20 20 20 20 22 2c 20 6e 75 6c 6c 29 2e 2e 2e       ", null)...
255f0 20 6f 6b 3a 20 22 20 24 72 65 73 75 6c 74 20 5c   ok: " $result \
25600 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20  n]..          } 
25610 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
25620 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
25630 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
25640 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
25650 20 20 22 2d 2d 2d 2d 20 63 61 6c 6c 20 73 71 6c    "---- call sql
25660 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64  ite3_win32_set_d
25670 69 72 65 63 74 6f 72 79 28 22 20 24 69 6e 64 65  irectory(" $inde
25680 78 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  x \..           
25690 20 20 20 20 20 22 2c 20 6e 75 6c 6c 29 2e 2e 2e       ", null)...
256a0 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24   error: " \n\t $
256b0 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20  result \n]..    
256c0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
256d0 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65   }..      } else
256e0 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
256f0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e         # NOTE: N
25700 6f 77 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  ow make sure the
25710 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 74 65   database and te
25720 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72  mporary director
25730 69 65 73 20 61 72 65 0d 0a 20 20 20 20 20 20 20  ies are..       
25740 20 23 20 20 20 20 20 20 20 72 65 73 65 74 20 74   #       reset t
25750 68 65 69 72 20 64 65 66 61 75 6c 74 20 76 61 6c  heir default val
25760 75 65 73 2c 20 77 68 69 63 68 20 73 68 6f 75 6c  ues, which shoul
25770 64 20 62 65 20 6e 75 6c 6c 20 66 6f 72 20 62 6f  d be null for bo
25780 74 68 2e 0d 0a 20 20 20 20 20 20 20 20 23 20 20  th...        #  
25790 20 20 20 20 20 53 69 6e 63 65 20 74 68 65 20 73       Since the s
257a0 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74  qlite3_win32_set
257b0 5f 64 69 72 65 63 74 6f 72 79 20 66 75 6e 63 74  _directory funct
257c0 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 0d 0a 20 20  ion does not..  
257d0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61 70        #       ap
257e0 70 65 61 72 20 74 6f 20 62 65 20 61 76 61 69 6c  pear to be avail
257f0 61 62 6c 65 2c 20 75 73 65 20 74 68 65 20 61 73  able, use the as
25800 73 6f 63 69 61 74 65 64 20 50 52 41 47 4d 41 20  sociated PRAGMA 
25810 63 6f 6d 6d 61 6e 64 73 0d 0a 20 20 20 20 20 20  commands..      
25820 20 20 23 20 20 20 20 20 20 20 69 6e 73 74 65 61    #       instea
25830 64 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  d...        #.. 
25840 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 64         foreach d
25850 69 72 65 63 74 6f 72 79 20 5b 6c 69 73 74 20 64  irectory [list d
25860 61 74 61 5f 73 74 6f 72 65 5f 64 69 72 65 63 74  ata_store_direct
25870 6f 72 79 20 74 65 6d 70 5f 73 74 6f 72 65 5f 64  ory temp_store_d
25880 69 72 65 63 74 6f 72 79 5d 20 7b 0d 0a 20 20 20  irectory] {..   
25890 20 20 20 20 20 20 20 73 65 74 20 73 71 6c 20 5b         set sql [
258a0 61 70 70 65 6e 64 41 72 67 73 20 22 50 52 41 47  appendArgs "PRAG
258b0 4d 41 20 22 20 24 64 69 72 65 63 74 6f 72 79 20  MA " $directory 
258c0 22 20 3d 20 5c 22 5c 22 3b 22 5d 0d 0a 0d 0a 20  " = \"\";"].... 
258d0 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61           if {[ca
258e0 74 63 68 20 7b 65 78 65 63 75 74 65 53 71 6c 20  tch {executeSql 
258f0 24 73 71 6c 7d 20 72 65 73 75 6c 74 5d 20 3d 3d  $sql} result] ==
25900 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
25910 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
25920 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
25930 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
25940 20 20 20 20 20 20 22 2d 2d 2d 2d 20 65 78 65 63        "---- exec
25950 75 74 65 20 50 52 41 47 4d 41 20 22 20 24 64 69  ute PRAGMA " $di
25960 72 65 63 74 6f 72 79 20 22 2e 2e 2e 20 6f 6b 3a  rectory "... ok:
25970 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20   \"" \..        
25980 20 20 20 20 20 20 20 20 24 72 65 73 75 6c 74 20          $result 
25990 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  \"\n]..         
259a0 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
259b0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
259c0 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
259d0 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
259e0 20 20 20 20 20 22 2d 2d 2d 2d 20 65 78 65 63 75       "---- execu
259f0 74 65 20 50 52 41 47 4d 41 20 22 20 24 64 69 72  te PRAGMA " $dir
25a00 65 63 74 6f 72 79 20 22 2e 2e 2e 20 65 72 72 6f  ectory "... erro
25a10 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20  r: " \..        
25a20 20 20 20 20 20 20 20 20 5c 6e 5c 74 20 24 72 65          \n\t $re
25a30 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  sult \n]..      
25a40 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
25a50 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
25a60 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 68  .....    proc ch
25a70 65 63 6b 46 6f 72 53 51 4c 69 74 65 44 69 72 65  eckForSQLiteDire
25a80 63 74 6f 72 69 65 73 20 7b 20 63 68 61 6e 6e 65  ctories { channe
25a90 6c 20 7b 72 65 73 65 74 20 66 61 6c 73 65 7d 20  l {reset false} 
25aa0 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
25ab0 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63      # NOTE: Chec
25ac0 6b 20 69 66 20 74 68 65 20 73 71 6c 69 74 65 33  k if the sqlite3
25ad0 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63  _win32_set_direc
25ae0 74 6f 72 79 20 66 75 6e 63 74 69 6f 6e 20 69 73  tory function is
25af0 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0a 20 20 20   available...   
25b00 20 20 20 23 0d 0a 20 20 20 20 20 20 74 70 75 74     #..      tput
25b10 73 20 24 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20  s $channel \..  
25b20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68          "---- ch
25b30 65 63 6b 69 6e 67 20 66 6f 72 20 66 75 6e 63 74  ecking for funct
25b40 69 6f 6e 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  ion sqlite3_win3
25b50 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79 2e  2_set_directory.
25b60 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 23 0d  .. "....      #.
25b70 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54  .      # NOTE: T
25b80 68 69 73 20 63 61 6c 6c 20 74 6f 20 74 68 65 20  his call to the 
25b90 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65  sqlite3_win32_se
25ba0 74 5f 64 69 72 65 63 74 6f 72 79 20 66 75 6e 63  t_directory func
25bb0 74 69 6f 6e 20 75 73 65 73 20 74 68 65 0d 0a 20  tion uses the.. 
25bc0 20 20 20 20 20 23 20 20 20 20 20 20 20 69 6e 76       #       inv
25bd0 61 6c 69 64 20 76 61 6c 75 65 20 30 20 66 6f 72  alid value 0 for
25be0 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
25bf0 65 6e 74 2e 20 20 54 68 69 73 20 63 6f 64 65 20  ent.  This code 
25c00 69 73 20 64 65 73 69 67 6e 65 64 0d 0a 20 20 20  is designed..   
25c10 20 20 20 23 20 20 20 20 20 20 20 74 6f 20 63 68     #       to ch
25c20 65 63 6b 20 69 66 20 63 61 6c 6c 69 6e 67 20 74  eck if calling t
25c30 68 65 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c  he function will
25c40 20 72 61 69 73 65 20 61 6e 20 65 78 63 65 70 74   raise an except
25c50 69 6f 6e 20 28 69 2e 65 2e 0d 0a 20 20 20 20 20  ion (i.e...     
25c60 20 23 20 20 20 20 20 20 20 74 68 65 20 61 63 74   #       the act
25c70 75 61 6c 20 72 65 73 75 6c 74 20 6f 66 20 74 68  ual result of th
25c80 65 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20  e function does 
25c90 6e 6f 74 20 6d 61 74 74 65 72 20 61 73 20 6c 6f  not matter as lo
25ca0 6e 67 20 61 73 20 6e 6f 0d 0a 20 20 20 20 20 20  ng as no..      
25cb0 23 20 20 20 20 20 20 20 64 69 72 65 63 74 6f 72  #       director
25cc0 79 20 69 73 20 63 68 61 6e 67 65 64 29 2e 0d 0a  y is changed)...
25cd0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
25ce0 66 20 7b 5b 69 73 57 69 6e 64 6f 77 73 5d 20 26  f {[isWindows] &
25cf0 26 20 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20  & [catch {..    
25d00 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b      object invok
25d10 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62  e -flags +NonPub
25d20 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  lic \..         
25d30 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53     System.Data.S
25d40 51 4c 69 74 65 2e 55 6e 73 61 66 65 4e 61 74 69  QLite.UnsafeNati
25d50 76 65 4d 65 74 68 6f 64 73 20 5c 0d 0a 20 20 20  veMethods \..   
25d60 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
25d70 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63  _win32_set_direc
25d80 74 6f 72 79 20 30 20 6e 75 6c 6c 0d 0a 20 20 20  tory 0 null..   
25d90 20 20 20 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e     }] == 0} then
25da0 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
25db0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43         # NOTE: C
25dc0 61 6c 6c 69 6e 67 20 74 68 65 20 73 71 6c 69 74  alling the sqlit
25dd0 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72  e3_win32_set_dir
25de0 65 63 74 6f 72 79 20 66 75 6e 63 74 69 6f 6e 20  ectory function 
25df0 64 6f 65 73 20 6e 6f 74 0d 0a 20 20 20 20 20 20  does not..      
25e00 20 20 23 20 20 20 20 20 20 20 63 61 75 73 65 20    #       cause 
25e10 61 6e 20 65 78 63 65 70 74 69 6f 6e 3b 20 74 68  an exception; th
25e20 65 72 65 66 6f 72 65 2c 20 69 74 20 6d 75 73 74  erefore, it must
25e30 20 62 65 20 61 76 61 69 6c 61 62 6c 65 20 28 69   be available (i
25e40 2e 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 20 20  .e...        #  
25e50 20 20 20 20 20 65 76 65 6e 20 74 68 6f 75 67 68       even though
25e60 20 69 74 20 73 68 6f 75 6c 64 20 72 65 74 75 72   it should retur
25e70 6e 20 61 20 66 61 69 6c 75 72 65 20 72 65 74 75  n a failure retu
25e80 72 6e 20 63 6f 64 65 20 69 6e 20 74 68 69 73 0d  rn code in this.
25e90 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
25ea0 20 63 61 73 65 29 2e 0d 0a 20 20 20 20 20 20 20   case)...       
25eb0 20 23 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43   #..        addC
25ec0 6f 6e 73 74 72 61 69 6e 74 20 73 71 6c 69 74 65  onstraint sqlite
25ed0 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65  3_win32_set_dire
25ee0 63 74 6f 72 79 0d 0a 0d 0a 20 20 20 20 20 20 20  ctory....       
25ef0 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
25f00 79 65 73 5c 6e 0d 0a 0d 0a 20 20 20 20 20 20 20  yes\n....       
25f10 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
25f20 54 45 3a 20 44 6f 65 73 20 6f 75 72 20 63 61 6c  TE: Does our cal
25f30 6c 65 72 20 77 61 6e 74 20 74 6f 20 72 65 73 65  ler want to rese
25f40 74 20 74 68 65 20 64 69 72 65 63 74 6f 72 69 65  t the directorie
25f50 73 3f 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  s?..        #.. 
25f60 20 20 20 20 20 20 20 69 66 20 7b 24 72 65 73 65         if {$rese
25f70 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
25f80 20 20 20 20 20 72 65 73 65 74 53 51 4c 69 74 65       resetSQLite
25f90 44 69 72 65 63 74 6f 72 69 65 73 20 24 63 68 61  Directories $cha
25fa0 6e 6e 65 6c 20 74 72 75 65 0d 0a 20 20 20 20 20  nnel true..     
25fb0 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c     }..      } el
25fc0 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70  se {..        tp
25fd0 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c  uts $channel no\
25fe0 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n....        #..
25ff0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
26000 44 6f 65 73 20 6f 75 72 20 63 61 6c 6c 65 72 20  Does our caller 
26010 77 61 6e 74 20 74 6f 20 72 65 73 65 74 20 74 68  want to reset th
26020 65 20 64 69 72 65 63 74 6f 72 69 65 73 3f 20 20  e directories?  
26030 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 0d 0a 20  This can only.. 
26040 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62         #       b
26050 65 20 70 65 72 66 6f 72 6d 65 64 20 69 66 20 53  e performed if S
26060 51 4c 69 74 65 20 69 73 20 6c 6f 61 64 65 64 20  QLite is loaded 
26070 61 6e 64 20 72 65 61 64 79 20 66 6f 72 20 75 73  and ready for us
26080 65 20 62 79 20 74 68 65 20 74 65 73 74 0d 0a 20  e by the test.. 
26090 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73         #       s
260a0 75 69 74 65 2e 0d 0a 20 20 20 20 20 20 20 20 23  uite...        #
260b0 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 24 72  ..        if {$r
260c0 65 73 65 74 20 26 26 20 5b 69 73 53 51 4c 69 74  eset && [isSQLit
260d0 65 52 65 61 64 79 5d 7d 20 74 68 65 6e 20 7b 0d  eReady]} then {.
260e0 0a 20 20 20 20 20 20 20 20 20 20 72 65 73 65 74  .          reset
260f0 53 51 4c 69 74 65 44 69 72 65 63 74 6f 72 69 65  SQLiteDirectorie
26100 73 20 24 63 68 61 6e 6e 65 6c 20 66 61 6c 73 65  s $channel false
26110 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
26120 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
26130 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46  .      # NOTE: F
26140 69 6e 61 6c 6c 79 2c 20 73 68 6f 77 20 74 68 65  inally, show the
26150 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f   current value o
26160 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  f the database a
26170 6e 64 20 74 65 6d 70 6f 72 61 72 79 0d 0a 20 20  nd temporary..  
26180 20 20 20 20 23 20 20 20 20 20 20 20 64 69 72 65      #       dire
26190 63 74 6f 72 69 65 73 2e 20 20 54 68 69 73 20 63  ctories.  This c
261a0 61 6e 20 6f 6e 6c 79 20 62 65 20 70 65 72 66 6f  an only be perfo
261b0 72 6d 65 64 20 69 66 20 53 51 4c 69 74 65 20 69  rmed if SQLite i
261c0 73 20 6c 6f 61 64 65 64 0d 0a 20 20 20 20 20 20  s loaded..      
261d0 23 20 20 20 20 20 20 20 61 6e 64 20 72 65 61 64  #       and read
261e0 79 20 66 6f 72 20 75 73 65 20 62 79 20 74 68 65  y for use by the
261f0 20 74 65 73 74 20 73 75 69 74 65 2e 0d 0a 20 20   test suite...  
26200 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
26210 7b 5b 69 73 53 51 4c 69 74 65 52 65 61 64 79 5d  {[isSQLiteReady]
26220 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
26230 20 20 66 6f 72 65 61 63 68 20 64 69 72 65 63 74    foreach direct
26240 6f 72 79 20 5b 6c 69 73 74 20 64 61 74 61 5f 73  ory [list data_s
26250 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 20 74  tore_directory t
26260 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65 63 74  emp_store_direct
26270 6f 72 79 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20  ory] {..        
26280 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
26290 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 2d 2d   [appendArgs "--
262a0 2d 2d 20 63 68 65 63 6b 69 6e 67 20 22 20 24 64  -- checking " $d
262b0 69 72 65 63 74 6f 72 79 20 22 2e 2e 2e 20 22 5d  irectory "... "]
262c0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65  ....          se
262d0 74 20 73 71 6c 20 5b 61 70 70 65 6e 64 41 72 67  t sql [appendArg
262e0 73 20 22 50 52 41 47 4d 41 20 22 20 24 64 69 72  s "PRAGMA " $dir
262f0 65 63 74 6f 72 79 20 5c 3b 5d 0d 0a 0d 0a 20 20  ectory \;]....  
26300 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
26310 63 68 20 7b 65 78 65 63 75 74 65 53 71 6c 20 24  ch {executeSql $
26320 73 71 6c 20 73 63 61 6c 61 72 7d 20 72 65 73 75  sql scalar} resu
26330 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  lt] == 0} then {
26340 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
26350 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
26360 70 65 6e 64 41 72 67 73 20 22 6f 6b 3a 20 5c 22  pendArgs "ok: \"
26370 22 20 24 72 65 73 75 6c 74 20 5c 22 5c 6e 5d 0d  " $result \"\n].
26380 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73  .          } els
26390 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e {..           
263a0 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
263b0 5b 61 70 70 65 6e 64 41 72 67 73 20 22 65 72 72  [appendArgs "err
263c0 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 72 65 73 75  or: " \n\t $resu
263d0 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  lt \n]..        
263e0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
263f0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
26400 0c 0d 0a 20 20 20 20 70 72 6f 63 20 6c 6f 61 64  ...    proc load
26410 53 51 4c 69 74 65 54 65 73 74 53 65 74 74 69 6e  SQLiteTestSettin
26420 67 73 20 7b 20 63 68 61 6e 6e 65 6c 20 7b 73 75  gs { channel {su
26430 66 66 69 78 20 22 22 7d 20 7b 71 75 69 65 74 20  ffix ""} {quiet 
26440 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20  false} } {..    
26450 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
26460 45 3a 20 53 6b 69 70 20 6c 6f 61 64 69 6e 67 20  E: Skip loading 
26470 74 68 65 20 73 65 74 74 69 6e 67 73 20 69 66 20  the settings if 
26480 74 68 65 69 72 20 75 73 61 67 65 20 68 61 73 20  their usage has 
26490 62 65 65 6e 20 64 69 73 61 62 6c 65 64 2e 0d 0a  been disabled...
264a0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
264b0 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
264c0 20 3a 3a 6e 6f 28 73 71 6c 69 74 65 54 65 73 74   ::no(sqliteTest
264d0 53 65 74 74 69 6e 67 73 29 5d 7d 20 74 68 65 6e  Settings)]} then
264e0 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
264f0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4c         # NOTE: L
26500 6f 61 64 20 63 75 73 74 6f 6d 20 70 65 72 2d 75  oad custom per-u
26510 73 65 72 20 61 6e 64 2f 6f 72 20 70 65 72 2d 68  ser and/or per-h
26520 6f 73 74 20 74 65 73 74 20 73 65 74 74 69 6e 67  ost test setting
26530 73 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20  s now...        
26540 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  #..        if {[
26550 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 63  info exists ::tc
26560 6c 5f 70 6c 61 74 66 6f 72 6d 28 75 73 65 72 29  l_platform(user)
26570 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
26580 20 20 20 20 20 73 65 74 20 75 73 65 72 53 65 74       set userSet
26590 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 20 5b 66  tingsFileName [f
265a0 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 43 6f 6d  ile join [getCom
265b0 6d 6f 6e 44 69 72 65 63 74 6f 72 79 5d 20 5c 0d  monDirectory] \.
265c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b  .              [
265d0 61 70 70 65 6e 64 41 72 67 73 20 73 65 74 74 69  appendArgs setti
265e0 6e 67 73 20 24 73 75 66 66 69 78 20 2e 20 24 3a  ngs $suffix . $:
265f0 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 75 73  :tcl_platform(us
26600 65 72 29 20 2e 65 61 67 6c 65 5d 5d 0d 0a 0d 0a  er) .eagle]]....
26610 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 66            if {[f
26620 69 6c 65 20 65 78 69 73 74 73 20 24 75 73 65 72  ile exists $user
26630 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65  SettingsFileName
26640 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
26650 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
26660 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
26670 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
26680 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
26690 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
266a0 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
266b0 6c 6f 61 64 69 6e 67 20 70 65 72 2d 75 73 65 72  loading per-user
266c0 20 74 65 73 74 20 73 65 74 74 69 6e 67 73 20 66   test settings f
266d0 69 6c 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20  ile \"" \..     
266e0 20 20 20 20 20 20 20 20 20 20 20 20 20 24 75 73               $us
266f0 65 72 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61  erSettingsFileNa
26700 6d 65 20 5c 22 2e 2e 2e 5c 6e 5d 0d 0a 20 20 20  me \"...\n]..   
26710 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
26720 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63            if {[c
26730 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
26740 20 20 20 20 20 20 75 70 6c 65 76 65 6c 20 31 20        uplevel 1 
26750 5b 6c 69 73 74 20 73 6f 75 72 63 65 20 24 75 73  [list source $us
26760 65 72 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61  erSettingsFileNa
26770 6d 65 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  me]..           
26780 20 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20   } error]} then 
26790 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
267a0 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
267b0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
267c0 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
267d0 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
267e0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
267f0 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41          "==== WA
26800 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f  RNING: failed to
26810 20 6c 6f 61 64 20 70 65 72 2d 75 73 65 72 20 73   load per-user s
26820 65 74 74 69 6e 67 73 20 66 69 6c 65 20 5c 22 22  ettings file \""
26830 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
26840 20 20 20 20 20 20 20 20 24 75 73 65 72 53 65 74          $userSet
26850 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 20 22 5c  tingsFileName "\
26860 22 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74  ", error: " \n\t
26870 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20   $error \n]..   
26880 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
26890 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
268a0 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
268b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
268c0 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
268d0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
268e0 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
268f0 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
26900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26910 22 2d 2d 2d 2d 20 73 6b 69 70 70 65 64 20 6c 6f  "---- skipped lo
26920 61 64 69 6e 67 20 70 65 72 2d 75 73 65 72 20 74  ading per-user t
26930 65 73 74 20 73 65 74 74 69 6e 67 73 20 66 69 6c  est settings fil
26940 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20  e \"" \..       
26950 20 20 20 20 20 20 20 20 20 20 20 24 75 73 65 72             $user
26960 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65  SettingsFileName
26970 20 22 5c 22 2c 20 69 74 20 64 6f 65 73 20 6e 6f   "\", it does no
26980 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a 20 20 20  t exist\n"]..   
26990 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
269a0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
269b0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 23   }....        ##
269c0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
269d0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
269e0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
269f0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
26a00 23 23 23 23 23 0d 0a 0d 0a 20 20 20 20 20 20 20  #####....       
26a10 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
26a20 73 20 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d  s ::tcl_platform
26a30 28 68 6f 73 74 29 5d 7d 20 74 68 65 6e 20 7b 0d  (host)]} then {.
26a40 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20 68  .          set h
26a50 6f 73 74 53 65 74 74 69 6e 67 73 46 69 6c 65 4e  ostSettingsFileN
26a60 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b  ame [file join [
26a70 67 65 74 43 6f 6d 6d 6f 6e 44 69 72 65 63 74 6f  getCommonDirecto
26a80 72 79 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ry] \..         
26a90 20 20 20 20 20 5b 61 70 70 65 6e 64 41 72 67 73       [appendArgs
26aa0 20 73 65 74 74 69 6e 67 73 20 24 73 75 66 66 69   settings $suffi
26ab0 78 20 2e 20 24 3a 3a 74 63 6c 5f 70 6c 61 74 66  x . $::tcl_platf
26ac0 6f 72 6d 28 68 6f 73 74 29 20 2e 65 61 67 6c 65  orm(host) .eagle
26ad0 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  ]]....          
26ae0 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73  if {[file exists
26af0 20 24 68 6f 73 74 53 65 74 74 69 6e 67 73 46 69   $hostSettingsFi
26b00 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d  leName]} then {.
26b10 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
26b20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
26b30 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
26b40 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
26b50 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
26b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b70 22 2d 2d 2d 2d 20 6c 6f 61 64 69 6e 67 20 70 65  "---- loading pe
26b80 72 2d 68 6f 73 74 20 74 65 73 74 20 73 65 74 74  r-host test sett
26b90 69 6e 67 73 20 66 69 6c 65 20 5c 22 22 20 5c 0d  ings file \"" \.
26ba0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26bb0 20 20 20 24 68 6f 73 74 53 65 74 74 69 6e 67 73     $hostSettings
26bc0 46 69 6c 65 4e 61 6d 65 20 5c 22 2e 2e 2e 5c 6e  FileName \"...\n
26bd0 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ]..            }
26be0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
26bf0 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20  if {[catch {..  
26c00 20 20 20 20 20 20 20 20 20 20 20 20 75 70 6c 65              uple
26c10 76 65 6c 20 31 20 5b 6c 69 73 74 20 73 6f 75 72  vel 1 [list sour
26c20 63 65 20 24 68 6f 73 74 53 65 74 74 69 6e 67 73  ce $hostSettings
26c30 46 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20 20 20  FileName]..     
26c40 20 20 20 20 20 20 20 7d 20 65 72 72 6f 72 5d 7d         } error]}
26c50 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
26c60 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
26c70 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
26c80 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
26c90 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
26ca0 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
26cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d                "=
26cc0 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69  === WARNING: fai
26cd0 6c 65 64 20 74 6f 20 6c 6f 61 64 20 70 65 72 2d  led to load per-
26ce0 68 6f 73 74 20 73 65 74 74 69 6e 67 73 20 66 69  host settings fi
26cf0 6c 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20  le \"" \..      
26d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24 68                $h
26d10 6f 73 74 53 65 74 74 69 6e 67 73 46 69 6c 65 4e  ostSettingsFileN
26d20 61 6d 65 20 22 5c 22 2c 20 65 72 72 6f 72 3a 20  ame "\", error: 
26d30 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e  " \n\t $error \n
26d40 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ]..             
26d50 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
26d60 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65  }..          } e
26d70 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
26d80 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
26d90 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
26da0 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
26db0 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
26dc0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
26dd0 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6b 69 70        "---- skip
26de0 70 65 64 20 6c 6f 61 64 69 6e 67 20 70 65 72 2d  ped loading per-
26df0 68 6f 73 74 20 74 65 73 74 20 73 65 74 74 69 6e  host test settin
26e00 67 73 20 66 69 6c 65 20 5c 22 22 20 5c 0d 0a 20  gs file \"" \.. 
26e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26e20 20 24 68 6f 73 74 53 65 74 74 69 6e 67 73 46 69   $hostSettingsFi
26e30 6c 65 4e 61 6d 65 20 22 5c 22 2c 20 69 74 20 64  leName "\", it d
26e40 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 5c 6e 22  oes not exist\n"
26e50 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ]..            }
26e60 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
26e70 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
26e80 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
26e90 20 70 72 6f 63 20 63 6f 70 79 53 61 6d 70 6c 65   proc copySample
26ea0 44 61 74 61 62 61 73 65 46 69 6c 65 73 20 7b 7d  DatabaseFiles {}
26eb0 20 7b 0d 0a 20 20 20 20 20 20 75 70 6c 65 76 65   {..      upleve
26ec0 6c 20 31 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  l 1 {..        #
26ed0 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
26ee0 3a 20 43 6f 70 79 20 28 6f 72 20 72 65 2d 63 6f  : Copy (or re-co
26ef0 70 79 29 20 74 68 65 20 72 65 66 65 72 65 6e 63  py) the referenc
26f00 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
26f10 75 73 65 64 20 66 6f 72 20 74 68 69 73 0d 0a 20  used for this.. 
26f20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 75         #       u
26f30 6e 69 74 20 74 65 73 74 20 74 6f 20 74 68 65 20  nit test to the 
26f40 62 75 69 6c 64 20 64 69 72 65 63 74 6f 72 79 20  build directory 
26f50 69 6e 20 63 61 73 65 20 69 74 20 68 61 73 20 62  in case it has b
26f60 65 65 6e 20 63 68 61 6e 67 65 64 0d 0a 20 20 20  een changed..   
26f70 20 20 20 20 20 23 20 20 20 20 20 20 20 62 79 20       #       by 
26f80 61 20 70 72 65 76 69 6f 75 73 20 74 65 73 74 20  a previous test 
26f90 72 75 6e 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  run...        #.
26fa0 0a 20 20 20 20 20 20 20 20 66 69 6c 65 20 63 6f  .        file co
26fb0 70 79 20 2d 66 6f 72 63 65 20 24 6e 6f 72 74 68  py -force $north
26fc0 77 69 6e 64 45 66 44 62 46 69 6c 65 20 5c 0d 0a  windEfDbFile \..
26fd0 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20            [file 
26fe0 6a 6f 69 6e 20 5b 67 65 74 42 75 69 6c 64 44 69  join [getBuildDi
26ff0 72 65 63 74 6f 72 79 20 74 72 75 65 5d 20 5b 66  rectory true] [f
27000 69 6c 65 20 74 61 69 6c 20 24 6e 6f 72 74 68 77  ile tail $northw
27010 69 6e 64 45 66 44 62 46 69 6c 65 5d 5d 0d 0a 20  indEfDbFile]].. 
27020 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
27030 0d 0a 20 20 20 20 70 72 6f 63 20 6d 6f 76 65 54  ..    proc moveT
27040 65 73 74 4c 6f 67 46 69 6c 65 20 7b 20 70 61 74  estLogFile { pat
27050 68 20 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66 20  h } {..      if 
27060 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
27070 74 65 73 74 5f 6c 6f 67 5d 20 26 26 20 5b 66 69  test_log] && [fi
27080 6c 65 20 65 78 69 73 74 73 20 24 3a 3a 74 65 73  le exists $::tes
27090 74 5f 6c 6f 67 5d 7d 20 74 68 65 6e 20 7b 0d 0a  t_log]} then {..
270a0 20 20 20 20 20 20 20 20 73 65 74 20 6f 6c 64 5f          set old_
270b0 74 65 73 74 5f 6c 6f 67 20 24 3a 3a 74 65 73 74  test_log $::test
270c0 5f 6c 6f 67 0d 0a 20 20 20 20 20 20 20 20 73 65  _log..        se
270d0 74 20 6e 65 77 5f 74 65 73 74 5f 6c 6f 67 20 5b  t new_test_log [
270e0 66 69 6c 65 20 6a 6f 69 6e 20 24 70 61 74 68 20  file join $path 
270f0 5b 66 69 6c 65 20 74 61 69 6c 20 24 6f 6c 64 5f  [file tail $old_
27100 74 65 73 74 5f 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20  test_log]]....  
27110 20 20 20 20 20 20 66 69 6c 65 20 63 6f 70 79 20        file copy 
27120 24 6f 6c 64 5f 74 65 73 74 5f 6c 6f 67 20 24 6e  $old_test_log $n
27130 65 77 5f 74 65 73 74 5f 6c 6f 67 3b 20 66 69 6c  ew_test_log; fil
27140 65 20 64 65 6c 65 74 65 20 24 6f 6c 64 5f 74 65  e delete $old_te
27150 73 74 5f 6c 6f 67 0d 0a 20 20 20 20 20 20 20 20  st_log..        
27160 73 65 74 20 3a 3a 74 65 73 74 5f 6c 6f 67 20 24  set ::test_log $
27170 6e 65 77 5f 74 65 73 74 5f 6c 6f 67 0d 0a 0d 0a  new_test_log....
27180 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66          if {[inf
27190 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 73 74 5f  o exists ::test_
271a0 6c 6f 67 5f 70 61 74 68 5d 7d 20 74 68 65 6e 20  log_path]} then 
271b0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  {..          set
271c0 20 3a 3a 74 65 73 74 5f 6c 6f 67 5f 70 61 74 68   ::test_log_path
271d0 20 24 70 61 74 68 0d 0a 20 20 20 20 20 20 20 20   $path..        
271e0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 70 75  }....        tpu
271f0 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
27200 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
27210 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d  ..            "-
27220 2d 2d 2d 20 6d 6f 76 65 64 20 74 65 73 74 20 6c  --- moved test l
27230 6f 67 20 66 72 6f 6d 20 5c 22 22 20 24 6f 6c 64  og from \"" $old
27240 5f 74 65 73 74 5f 6c 6f 67 20 22 5c 22 20 74 6f  _test_log "\" to
27250 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20   \"" \..        
27260 20 20 20 20 24 6e 65 77 5f 74 65 73 74 5f 6c 6f      $new_test_lo
27270 67 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d  g \"\n]..      }
27280 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
27290 70 72 6f 63 20 73 68 6f 77 53 51 4c 69 74 65 42  proc showSQLiteB
272a0 75 69 6c 64 50 61 72 61 6d 65 74 65 72 73 20 7b  uildParameters {
272b0 20 63 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20   channel } {..  
272c0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
272d0 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20 74 68  OTE: Check if th
272e0 65 20 6e 61 74 69 76 65 20 62 75 69 6c 64 20 66  e native build f
272f0 6c 61 67 20 68 61 73 20 62 65 65 6e 20 66 6f 72  lag has been for
27300 63 69 62 6c 79 20 73 65 74 2e 0d 0a 20 20 20 20  cibly set...    
27310 20 20 23 0d 0a 20 20 20 20 20 20 74 70 75 74 73    #..      tputs
27320 20 24 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20   $channel \..   
27330 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65         "---- che
27340 63 6b 69 6e 67 20 66 6f 72 20 53 79 73 74 65 6d  cking for System
27350 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 62 75 69  .Data.SQLite bui
27360 6c 64 20 6e 61 74 69 76 65 20 6f 76 65 72 72 69  ld native overri
27370 64 65 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20  de... "....     
27380 20 73 65 74 20 6e 61 74 69 76 65 20 5b 67 65 74   set native [get
27390 42 75 69 6c 64 4e 61 74 69 76 65 5d 0d 0a 0d 0a  BuildNative]....
273a0 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
273b0 67 20 6c 65 6e 67 74 68 20 24 6e 61 74 69 76 65  g length $native
273c0 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
273d0 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72         addConstr
273e0 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
273f0 20 62 75 69 6c 64 4e 61 74 69 76 65 2e 20 24 6e   buildNative. $n
27400 61 74 69 76 65 5d 0d 0a 20 20 20 20 20 20 20 20  ative]..        
27410 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
27420 61 70 70 65 6e 64 41 72 67 73 20 5c 22 20 24 6e  appendArgs \" $n
27430 61 74 69 76 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20  ative \"\n]..   
27440 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
27450 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
27460 6e 74 20 62 75 69 6c 64 4e 61 74 69 76 65 2e 6e  nt buildNative.n
27470 6f 6e 65 0d 0a 20 20 20 20 20 20 20 20 74 70 75  one..        tpu
27480 74 73 20 24 63 68 61 6e 6e 65 6c 20 3c 6e 6f 6e  ts $channel <non
27490 65 3e 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  e>\n..      }...
274a0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
274b0 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 74 68  # NOTE: Check th
274c0 65 20 63 75 72 72 65 6e 74 20 62 75 69 6c 64 20  e current build 
274d0 79 65 61 72 2e 20 20 42 61 73 69 63 61 6c 6c 79  year.  Basically
274e0 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74 65 73  , this indicates
274f0 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
27500 77 68 69 63 68 20 76 65 72 73 69 6f 6e 20 6f 66  which version of
27510 20 4d 53 42 75 69 6c 64 20 61 6e 64 2f 6f 72 20   MSBuild and/or 
27520 56 69 73 75 61 6c 20 53 74 75 64 69 6f 20 77 61  Visual Studio wa
27530 73 20 75 73 65 64 20 74 6f 0d 0a 20 20 20 20 20  s used to..     
27540 20 23 20 20 20 20 20 20 20 63 6f 6d 70 69 6c 65   #       compile
27550 20 74 68 65 20 61 73 73 65 6d 62 6c 79 20 62 69   the assembly bi
27560 6e 61 72 69 65 73 20 75 6e 64 65 72 20 74 65 73  naries under tes
27570 74 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  t...      #..   
27580 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
27590 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 22  l \..          "
275a0 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f  ---- checking fo
275b0 72 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  r System.Data.SQ
275c0 4c 69 74 65 20 62 75 69 6c 64 20 79 65 61 72 2e  Lite build year.
275d0 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 73 65  .. "....      se
275e0 74 20 79 65 61 72 20 5b 67 65 74 42 75 69 6c 64  t year [getBuild
275f0 59 65 61 72 5d 0d 0a 0d 0a 20 20 20 20 20 20 69  Year]....      i
27600 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  f {[string lengt
27610 68 20 24 79 65 61 72 5d 20 3e 20 30 7d 20 74 68  h $year] > 0} th
27620 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 61 64  en {..        ad
27630 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70  dConstraint [app
27640 65 6e 64 41 72 67 73 20 62 75 69 6c 64 59 65 61  endArgs buildYea
27650 72 2e 20 24 79 65 61 72 5d 0d 0a 20 20 20 20 20  r. $year]..     
27660 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
27670 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 22  l [appendArgs \"
27680 20 24 79 65 61 72 20 5c 22 5c 6e 5d 0d 0a 20 20   $year \"\n]..  
27690 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
276a0 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61        addConstra
276b0 69 6e 74 20 62 75 69 6c 64 59 65 61 72 2e 6e 6f  int buildYear.no
276c0 6e 65 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74  ne..        tput
276d0 73 20 24 63 68 61 6e 6e 65 6c 20 3c 6e 6f 6e 65  s $channel <none
276e0 3e 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  >\n..      }....
276f0 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
27700 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20  nnel \..        
27710 20 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67    "---- checking
27720 20 66 6f 72 20 53 79 73 74 65 6d 2e 44 61 74 61   for System.Data
27730 2e 53 51 4c 69 74 65 20 62 75 69 6c 64 20 6e 61  .SQLite build na
27740 74 69 76 65 20 79 65 61 72 2e 2e 2e 20 22 0d 0a  tive year... "..
27750 0d 0a 20 20 20 20 20 20 73 65 74 20 79 65 61 72  ..      set year
27760 20 5b 67 65 74 42 75 69 6c 64 4e 61 74 69 76 65   [getBuildNative
27770 59 65 61 72 5d 0d 0a 0d 0a 20 20 20 20 20 20 69  Year]....      i
27780 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  f {[string lengt
27790 68 20 24 79 65 61 72 5d 20 3e 20 30 7d 20 74 68  h $year] > 0} th
277a0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 61 64  en {..        ad
277b0 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70  dConstraint [app
277c0 65 6e 64 41 72 67 73 20 62 75 69 6c 64 4e 61 74  endArgs buildNat
277d0 69 76 65 59 65 61 72 2e 20 24 79 65 61 72 5d 0d  iveYear. $year].
277e0 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
277f0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
27800 72 67 73 20 5c 22 20 24 79 65 61 72 20 5c 22 5c  rgs \" $year \"\
27810 6e 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  n]..      } else
27820 20 7b 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43   {..        addC
27830 6f 6e 73 74 72 61 69 6e 74 20 62 75 69 6c 64 4e  onstraint buildN
27840 61 74 69 76 65 59 65 61 72 2e 6e 6f 6e 65 0d 0a  ativeYear.none..
27850 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
27860 68 61 6e 6e 65 6c 20 3c 6e 6f 6e 65 3e 5c 6e 0d  hannel <none>\n.
27870 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
27880 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
27890 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 22 2d   \..          "-
278a0 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72  --- checking for
278b0 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
278c0 69 74 65 20 62 75 69 6c 64 20 70 6c 61 74 66 6f  ite build platfo
278d0 72 6d 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20  rm... "....     
278e0 20 73 65 74 20 70 6c 61 74 66 6f 72 6d 20 5b 67   set platform [g
278f0 65 74 42 75 69 6c 64 50 6c 61 74 66 6f 72 6d 20  etBuildPlatform 
27900 74 72 75 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 69  true]....      i
27910 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  f {[string lengt
27920 68 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3e 20 30  h $platform] > 0
27930 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
27940 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20    addConstraint 
27950 5b 61 70 70 65 6e 64 41 72 67 73 20 62 75 69 6c  [appendArgs buil
27960 64 50 6c 61 74 66 6f 72 6d 2e 20 24 70 6c 61 74  dPlatform. $plat
27970 66 6f 72 6d 5d 0d 0a 20 20 20 20 20 20 20 20 74  form]..        t
27980 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
27990 70 70 65 6e 64 41 72 67 73 20 5c 22 20 24 70 6c  ppendArgs \" $pl
279a0 61 74 66 6f 72 6d 20 5c 22 5c 6e 5d 0d 0a 20 20  atform \"\n]..  
279b0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
279c0 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61        addConstra
279d0 69 6e 74 20 62 75 69 6c 64 50 6c 61 74 66 6f 72  int buildPlatfor
279e0 6d 2e 6e 6f 6e 65 0d 0a 20 20 20 20 20 20 20 20  m.none..        
279f0 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 3c  tputs $channel <
27a00 6e 6f 6e 65 3e 5c 6e 0d 0a 20 20 20 20 20 20 7d  none>\n..      }
27a10 0d 0a 0d 0a 20 20 20 20 20 20 73 65 74 20 61 72  ....      set ar
27a20 63 68 69 74 65 63 74 75 72 65 20 5b 61 72 63 68  chitecture [arch
27a30 69 74 65 63 74 75 72 65 46 6f 72 50 6c 61 74 66  itectureForPlatf
27a40 6f 72 6d 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a  orm $platform]..
27a50 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20 24 63  ..      tputs $c
27a60 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20  hannel \..      
27a70 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69      "---- checki
27a80 6e 67 20 66 6f 72 20 53 79 73 74 65 6d 2e 44 61  ng for System.Da
27a90 74 61 2e 53 51 4c 69 74 65 20 62 75 69 6c 64 20  ta.SQLite build 
27aa0 61 72 63 68 69 74 65 63 74 75 72 65 2e 2e 2e 20  architecture... 
27ab0 22 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  "....      if {[
27ac0 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 61  string length $a
27ad0 72 63 68 69 74 65 63 74 75 72 65 5d 20 3e 20 30  rchitecture] > 0
27ae0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
27af0 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20    addConstraint 
27b00 5b 61 70 70 65 6e 64 41 72 67 73 20 62 75 69 6c  [appendArgs buil
27b10 64 41 72 63 68 69 74 65 63 74 75 72 65 2e 20 24  dArchitecture. $
27b20 61 72 63 68 69 74 65 63 74 75 72 65 5d 0d 0a 20  architecture].. 
27b30 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
27b40 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
27b50 73 20 5c 22 20 24 61 72 63 68 69 74 65 63 74 75  s \" $architectu
27b60 72 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20  re \"\n]..      
27b70 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
27b80 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20    addConstraint 
27b90 62 75 69 6c 64 41 72 63 68 69 74 65 63 74 75 72  buildArchitectur
27ba0 65 2e 6e 6f 6e 65 0d 0a 20 20 20 20 20 20 20 20  e.none..        
27bb0 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 3c  tputs $channel <
27bc0 6e 6f 6e 65 3e 5c 6e 0d 0a 20 20 20 20 20 20 7d  none>\n..      }
27bd0 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
27be0 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b     # NOTE: Check
27bf0 20 74 68 65 20 63 75 72 72 65 6e 74 20 62 75 69   the current bui
27c00 6c 64 20 2e 4e 45 54 20 46 72 61 6d 65 77 6f 72  ld .NET Framewor
27c10 6b 2e 20 20 42 61 73 69 63 61 6c 6c 79 2c 20 74  k.  Basically, t
27c20 68 69 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20  his..      #    
27c30 20 20 20 69 6e 64 69 63 61 74 65 73 20 77 68 69     indicates whi
27c40 63 68 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68  ch version of th
27c50 65 20 2e 4e 45 54 20 46 72 61 6d 65 77 6f 72 6b  e .NET Framework
27c60 20 69 73 20 62 65 69 6e 67 0d 0a 20 20 20 20 20   is being..     
27c70 20 23 20 20 20 20 20 20 20 75 73 65 64 20 62 79   #       used by
27c80 20 74 68 65 20 61 73 73 65 6d 62 6c 79 20 62 69   the assembly bi
27c90 6e 61 72 69 65 73 20 75 6e 64 65 72 20 74 65 73  naries under tes
27ca0 74 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  t...      #..   
27cb0 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
27cc0 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 22  l \..          "
27cd0 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f  ---- checking fo
27ce0 72 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  r System.Data.SQ
27cf0 4c 69 74 65 20 62 75 69 6c 64 20 2e 4e 45 54 20  Lite build .NET 
27d00 46 72 61 6d 65 77 6f 72 6b 2e 2e 2e 20 22 0d 0a  Framework... "..
27d10 0d 0a 20 20 20 20 20 20 73 65 74 20 6e 65 74 46  ..      set netF
27d20 78 20 5b 67 65 74 42 75 69 6c 64 4e 65 74 46 78  x [getBuildNetFx
27d30 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  ]....      if {[
27d40 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 6e  string length $n
27d50 65 74 46 78 5d 20 3e 20 30 7d 20 74 68 65 6e 20  etFx] > 0} then 
27d60 7b 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f  {..        addCo
27d70 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64  nstraint [append
27d80 41 72 67 73 20 62 75 69 6c 64 46 72 61 6d 65 77  Args buildFramew
27d90 6f 72 6b 2e 20 24 6e 65 74 46 78 5d 0d 0a 20 20  ork. $netFx]..  
27da0 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
27db0 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
27dc0 20 5c 22 20 24 6e 65 74 46 78 20 5c 22 5c 6e 5d   \" $netFx \"\n]
27dd0 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
27de0 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e  ..        addCon
27df0 73 74 72 61 69 6e 74 20 62 75 69 6c 64 46 72 61  straint buildFra
27e00 6d 65 77 6f 72 6b 2e 6e 6f 6e 65 0d 0a 20 20 20  mework.none..   
27e10 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
27e20 6e 65 6c 20 3c 6e 6f 6e 65 3e 5c 6e 0d 0a 20 20  nel <none>\n..  
27e30 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
27e40 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
27e50 43 68 65 63 6b 20 74 68 65 20 63 75 72 72 65 6e  Check the curren
27e60 74 20 62 75 69 6c 64 20 63 6f 6e 66 69 67 75 72  t build configur
27e70 61 74 69 6f 6e 2e 20 20 54 68 69 73 20 73 68 6f  ation.  This sho
27e80 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79 0d 0a 20 20  uld normally..  
27e90 20 20 20 20 23 20 20 20 20 20 20 20 62 65 20 65      #       be e
27ea0 69 74 68 65 72 20 22 44 65 62 75 67 22 20 6f 72  ither "Debug" or
27eb0 20 22 52 65 6c 65 61 73 65 22 2e 0d 0a 20 20 20   "Release"...   
27ec0 20 20 20 23 0d 0a 20 20 20 20 20 20 74 70 75 74     #..      tput
27ed0 73 20 24 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20  s $channel \..  
27ee0 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68          "---- ch
27ef0 65 63 6b 69 6e 67 20 66 6f 72 20 53 79 73 74 65  ecking for Syste
27f00 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 62 75  m.Data.SQLite bu
27f10 69 6c 64 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  ild configuratio
27f20 6e 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20  n... "....      
27f30 73 65 74 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  set configuratio
27f40 6e 20 5b 67 65 74 42 75 69 6c 64 43 6f 6e 66 69  n [getBuildConfi
27f50 67 75 72 61 74 69 6f 6e 5d 0d 0a 0d 0a 20 20 20  guration]....   
27f60 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
27f70 65 6e 67 74 68 20 24 63 6f 6e 66 69 67 75 72 61  ength $configura
27f80 74 69 6f 6e 5d 20 3e 20 30 7d 20 74 68 65 6e 20  tion] > 0} then 
27f90 7b 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f  {..        addCo
27fa0 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64  nstraint [append
27fb0 41 72 67 73 20 62 75 69 6c 64 43 6f 6e 66 69 67  Args buildConfig
27fc0 75 72 61 74 69 6f 6e 2e 20 24 63 6f 6e 66 69 67  uration. $config
27fd0 75 72 61 74 69 6f 6e 5d 0d 0a 20 20 20 20 20 20  uration]..      
27fe0 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
27ff0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 22 20   [appendArgs \" 
28000 24 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 5c  $configuration \
28010 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c  "\n]..      } el
28020 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 61 64  se {..        ad
28030 64 43 6f 6e 73 74 72 61 69 6e 74 20 62 75 69 6c  dConstraint buil
28040 64 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 6e  dConfiguration.n
28050 6f 6e 65 0d 0a 20 20 20 20 20 20 20 20 74 70 75  one..        tpu
28060 74 73 20 24 63 68 61 6e 6e 65 6c 20 3c 6e 6f 6e  ts $channel <non
28070 65 3e 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  e>\n..      }...
28080 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
28090 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 74 68  # NOTE: Check th
280a0 65 20 63 75 72 72 65 6e 74 20 62 75 69 6c 64 20  e current build 
280b0 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 73 75  configuration su
280c0 66 66 69 78 2e 20 20 54 68 69 73 20 77 69 6c 6c  ffix.  This will
280d0 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
280e0 6e 6f 72 6d 61 6c 6c 79 20 62 65 20 65 69 74 68  normally be eith
280f0 65 72 20 22 4e 65 74 53 74 61 6e 64 61 72 64 32  er "NetStandard2
28100 30 22 20 6f 72 20 61 6e 20 65 6d 70 74 79 20 73  0" or an empty s
28110 74 72 69 6e 67 2e 0d 0a 20 20 20 20 20 20 23 0d  tring...      #.
28120 0a 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68  .      tputs $ch
28130 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20  annel \..       
28140 20 20 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e     "---- checkin
28150 67 20 66 6f 72 20 53 79 73 74 65 6d 2e 44 61 74  g for System.Dat
28160 61 2e 53 51 4c 69 74 65 20 62 75 69 6c 64 20 63  a.SQLite build c
28170 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 73 75 66  onfiguration suf
28180 66 69 78 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20  fix... "....    
28190 20 20 73 65 74 20 73 75 66 66 69 78 20 5b 67 65    set suffix [ge
281a0 74 42 75 69 6c 64 43 6f 6e 66 69 67 75 72 61 74  tBuildConfigurat
281b0 69 6f 6e 53 75 66 66 69 78 5d 0d 0a 0d 0a 20 20  ionSuffix]....  
281c0 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
281d0 6c 65 6e 67 74 68 20 24 73 75 66 66 69 78 5d 20  length $suffix] 
281e0 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
281f0 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
28200 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 62  nt [appendArgs b
28210 75 69 6c 64 43 6f 6e 66 69 67 75 72 61 74 69 6f  uildConfiguratio
28220 6e 53 75 66 66 69 78 2e 20 24 73 75 66 66 69 78  nSuffix. $suffix
28230 5d 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  ]..        tputs
28240 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
28250 64 41 72 67 73 20 5c 22 20 24 73 75 66 66 69 78  dArgs \" $suffix
28260 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 20   \"\n]..      } 
28270 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
28280 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 62 75  addConstraint bu
28290 69 6c 64 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e  ildConfiguration
282a0 53 75 66 66 69 78 2e 6e 6f 6e 65 0d 0a 20 20 20  Suffix.none..   
282b0 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
282c0 6e 65 6c 20 3c 6e 6f 6e 65 3e 5c 6e 0d 0a 20 20  nel <none>\n..  
282d0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 74      }....      t
282e0 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
282f0 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
28300 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65         "---- che
28310 63 6b 69 6e 67 20 66 6f 72 20 53 79 73 74 65 6d  cking for System
28320 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 62 75 69  .Data.SQLite bui
28330 6c 64 20 6e 61 74 69 76 65 20 63 6f 6e 66 69 67  ld native config
28340 75 72 61 74 69 6f 6e 20 22 20 5c 0d 0a 20 20 20  uration " \..   
28350 20 20 20 20 20 20 20 22 73 75 66 66 69 78 2e 2e         "suffix..
28360 2e 20 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 73 65  . "]....      se
28370 74 20 73 75 66 66 69 78 20 5b 67 65 74 42 75 69  t suffix [getBui
28380 6c 64 4e 61 74 69 76 65 43 6f 6e 66 69 67 75 72  ldNativeConfigur
28390 61 74 69 6f 6e 53 75 66 66 69 78 5d 0d 0a 0d 0a  ationSuffix]....
283a0 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
283b0 67 20 6c 65 6e 67 74 68 20 24 73 75 66 66 69 78  g length $suffix
283c0 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
283d0 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72         addConstr
283e0 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
283f0 20 62 75 69 6c 64 4e 61 74 69 76 65 43 6f 6e 66   buildNativeConf
28400 69 67 75 72 61 74 69 6f 6e 53 75 66 66 69 78 2e  igurationSuffix.
28410 20 24 73 75 66 66 69 78 5d 0d 0a 20 20 20 20 20   $suffix]..     
28420 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
28430 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 22  l [appendArgs \"
28440 20 24 73 75 66 66 69 78 20 5c 22 5c 6e 5d 0d 0a   $suffix \"\n]..
28450 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
28460 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74          addConst
28470 72 61 69 6e 74 20 62 75 69 6c 64 4e 61 74 69 76  raint buildNativ
28480 65 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 53 75  eConfigurationSu
28490 66 66 69 78 2e 6e 6f 6e 65 0d 0a 20 20 20 20 20  ffix.none..     
284a0 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
284b0 6c 20 3c 6e 6f 6e 65 3e 5c 6e 0d 0a 20 20 20 20  l <none>\n..    
284c0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
284d0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68        # NOTE: Ch
284e0 65 63 6b 20 74 68 65 20 63 75 72 72 65 6e 74 20  eck the current 
284f0 62 75 69 6c 64 20 65 78 74 72 61 20 64 69 72 65  build extra dire
28500 63 74 6f 72 79 2e 20 20 54 68 69 73 20 77 69 6c  ctory.  This wil
28510 6c 20 6e 6f 72 6d 61 6c 6c 79 0d 0a 20 20 20 20  l normally..    
28520 20 20 23 20 20 20 20 20 20 20 62 65 20 65 69 74    #       be eit
28530 68 65 72 20 22 6e 65 74 73 74 61 6e 64 61 72 64  her "netstandard
28540 32 2e 30 22 20 6f 72 20 61 6e 20 65 6d 70 74 79  2.0" or an empty
28550 20 73 74 72 69 6e 67 2e 0d 0a 20 20 20 20 20 20   string...      
28560 23 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20 24  #..      tputs $
28570 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20  channel \..     
28580 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65 63 6b       "---- check
28590 69 6e 67 20 66 6f 72 20 53 79 73 74 65 6d 2e 44  ing for System.D
285a0 61 74 61 2e 53 51 4c 69 74 65 20 62 75 69 6c 64  ata.SQLite build
285b0 20 65 78 74 72 61 2e 2e 2e 20 22 0d 0a 0d 0a 20   extra... ".... 
285c0 20 20 20 20 20 73 65 74 20 65 78 74 72 61 20 5b       set extra [
285d0 67 65 74 42 75 69 6c 64 45 78 74 72 61 5d 0d 0a  getBuildExtra]..
285e0 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72  ..      if {[str
285f0 69 6e 67 20 6c 65 6e 67 74 68 20 24 65 78 74 72  ing length $extr
28600 61 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  a] > 0} then {..
28610 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74          addConst
28620 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67  raint [appendArg
28630 73 20 62 75 69 6c 64 45 78 74 72 61 2e 20 24 65  s buildExtra. $e
28640 78 74 72 61 5d 0d 0a 20 20 20 20 20 20 20 20 74  xtra]..        t
28650 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
28660 70 70 65 6e 64 41 72 67 73 20 5c 22 20 24 65 78  ppendArgs \" $ex
28670 74 72 61 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20  tra \"\n]..     
28680 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
28690 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74     addConstraint
286a0 20 62 75 69 6c 64 45 78 74 72 61 2e 6e 6f 6e 65   buildExtra.none
286b0 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
286c0 24 63 68 61 6e 6e 65 6c 20 3c 6e 6f 6e 65 3e 5c  $channel <none>\
286d0 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  n..      }..    
286e0 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 72  }.....    proc r
286f0 75 6e 53 51 4c 69 74 65 54 65 73 74 50 72 6f 6c  unSQLiteTestProl
28700 6f 67 75 65 20 7b 7d 20 7b 0d 0a 20 20 20 20 20  ogue {} {..     
28710 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
28720 3a 20 53 6b 69 70 20 72 75 6e 6e 69 6e 67 20 6f  : Skip running o
28730 75 72 20 63 75 73 74 6f 6d 20 70 72 6f 6c 6f 67  ur custom prolog
28740 75 65 20 69 66 20 74 68 65 20 6d 61 69 6e 20 6f  ue if the main o
28750 6e 65 20 68 61 73 20 62 65 65 6e 0d 0a 20 20 20  ne has been..   
28760 20 20 20 23 20 20 20 20 20 20 20 73 6b 69 70 70     #       skipp
28770 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ed...      #..  
28780 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
28790 78 69 73 74 73 20 3a 3a 6e 6f 28 70 72 6f 6c 6f  xists ::no(prolo
287a0 67 75 65 2e 65 61 67 6c 65 29 5d 7d 20 74 68 65  gue.eagle)]} the
287b0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
287c0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
287d0 53 61 76 65 20 74 68 65 20 65 6e 76 69 72 6f 6e  Save the environ
287e0 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 73 20 74  ment variables t
287f0 68 61 74 20 77 65 20 69 6e 74 65 6e 64 20 74 6f  hat we intend to
28800 20 63 68 61 6e 67 65 20 66 6f 72 0d 0a 20 20 20   change for..   
28810 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
28820 20 74 65 73 74 20 73 75 69 74 65 2e 0d 0a 20 20   test suite...  
28830 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
28840 20 73 61 76 65 45 6e 76 69 72 6f 6e 6d 65 6e 74   saveEnvironment
28850 56 61 72 69 61 62 6c 65 73 20 5c 0d 0a 20 20 20  Variables \..   
28860 20 20 20 20 20 20 20 20 20 5b 6c 69 73 74 20 49           [list I
28870 6e 69 74 69 61 6c 69 7a 65 5f 53 51 4c 69 74 65  nitialize_SQLite
28880 4c 6f 67 5d 20 3a 3a 74 65 73 74 53 75 69 74 65  Log] ::testSuite
28890 53 61 76 65 64 45 6e 76 0d 0a 0d 0a 20 20 20 20  SavedEnv....    
288a0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
288b0 20 4e 4f 54 45 3a 20 46 6f 72 63 65 20 74 68 65   NOTE: Force the
288c0 20 6d 61 6e 61 67 65 64 20 6c 6f 67 67 69 6e 67   managed logging
288d0 20 73 75 62 73 79 73 74 65 6d 20 74 6f 20 61 74   subsystem to at
288e0 74 65 6d 70 74 20 74 6f 20 69 6e 69 74 69 61 6c  tempt to initial
288f0 69 7a 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ize..        #  
28900 20 20 20 20 20 69 74 73 65 6c 66 20 6d 6f 72 65       itself more
28910 20 74 68 61 6e 20 6f 6e 63 65 2e 0d 0a 20 20 20   than once...   
28920 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
28930 73 65 74 20 3a 3a 65 6e 76 28 49 6e 69 74 69 61  set ::env(Initia
28940 6c 69 7a 65 5f 53 51 4c 69 74 65 4c 6f 67 29 20  lize_SQLiteLog) 
28950 31 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  1....        #..
28960 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
28970 4c 6f 61 64 20 74 68 65 20 22 62 65 66 6f 72 65  Load the "before
28980 2d 63 6f 6e 73 74 72 61 69 6e 74 73 22 20 63 75  -constraints" cu
28990 73 74 6f 6d 20 70 65 72 2d 75 73 65 72 20 61 6e  stom per-user an
289a0 64 2f 6f 72 20 70 65 72 2d 68 6f 73 74 0d 0a 20  d/or per-host.. 
289b0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74         #       t
289c0 65 73 74 20 73 65 74 74 69 6e 67 73 20 6e 6f 77  est settings now
289d0 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
289e0 20 20 20 20 20 20 75 70 6c 65 76 65 6c 20 31 20        uplevel 1 
289f0 5b 6c 69 73 74 20 6c 6f 61 64 53 51 4c 69 74 65  [list loadSQLite
28a00 54 65 73 74 53 65 74 74 69 6e 67 73 20 24 3a 3a  TestSettings $::
28a10 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 2e 62 65  test_channel .be
28a20 66 6f 72 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  fore]....       
28a30 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
28a40 54 45 3a 20 53 68 6f 77 20 28 61 6e 64 20 6c 6f  TE: Show (and lo
28a50 67 29 20 74 68 65 20 67 6c 6f 62 61 6c 20 70 61  g) the global pa
28a60 72 61 6d 65 74 65 72 73 20 74 68 61 74 20 63 6f  rameters that co
28a70 6e 74 72 6f 6c 20 77 68 65 72 65 20 74 68 65 0d  ntrol where the.
28a80 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
28a90 20 62 75 69 6c 64 20 64 69 72 65 63 74 6f 72 79   build directory
28aa0 20 73 68 6f 75 6c 64 20 62 65 2e 0d 0a 20 20 20   should be...   
28ab0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
28ac0 73 68 6f 77 53 51 4c 69 74 65 42 75 69 6c 64 50  showSQLiteBuildP
28ad0 61 72 61 6d 65 74 65 72 73 20 24 3a 3a 74 65 73  arameters $::tes
28ae0 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20  t_channel....   
28af0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
28b00 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66  # NOTE: Check if
28b10 20 74 68 65 20 5b 6f 62 6a 65 63 74 5d 20 63 6f   the [object] co
28b20 6d 6d 61 6e 64 20 69 73 20 61 76 61 69 6c 61 62  mmand is availab
28b30 6c 65 3b 20 69 66 20 6e 6f 74 2c 20 61 64 64 20  le; if not, add 
28b40 73 6f 6d 65 0d 0a 20 20 20 20 20 20 20 20 23 20  some..        # 
28b50 20 20 20 20 20 20 73 68 69 6d 73 20 74 6f 20 6d        shims to m
28b60 61 6b 65 20 74 68 65 20 74 65 73 74 20 73 75 69  ake the test sui
28b70 74 65 20 72 75 6e 20 73 6d 6f 6f 74 68 65 72 2e  te run smoother.
28b80 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
28b90 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51 4c       checkForSQL
28ba0 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64  iteObjectCommand
28bb0 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
28bc0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
28bd0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 44         # NOTE: D
28be0 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6e 61 6d  etermine the nam
28bf0 65 73 20 6f 66 20 74 68 65 20 6e 61 74 69 76 65  es of the native
28c00 20 70 6c 61 74 66 6f 72 6d 20 61 6e 64 20 61 72   platform and ar
28c10 63 68 69 74 65 63 74 75 72 65 2e 0d 0a 20 20 20  chitecture...   
28c20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
28c30 73 65 74 20 70 6c 61 74 66 6f 72 6d 20 5b 67 65  set platform [ge
28c40 74 42 75 69 6c 64 50 6c 61 74 66 6f 72 6d 20 74  tBuildPlatform t
28c50 72 75 65 5d 0d 0a 20 20 20 20 20 20 20 20 73 65  rue]..        se
28c60 74 20 61 72 63 68 69 74 65 63 74 75 72 65 20 5b  t architecture [
28c70 61 72 63 68 69 74 65 63 74 75 72 65 46 6f 72 50  architectureForP
28c80 6c 61 74 66 6f 72 6d 20 24 70 6c 61 74 66 6f 72  latform $platfor
28c90 6d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d  m]....        #.
28ca0 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
28cb0 20 42 75 69 6c 64 20 61 20 6c 69 73 74 20 6f 66   Build a list of
28cc0 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 66   configuration f
28cd0 69 6c 65 73 20 74 68 61 74 20 77 65 20 68 61 6e  iles that we han
28ce0 64 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  dle...        #.
28cf0 0a 20 20 20 20 20 20 20 20 73 65 74 20 63 6f 6e  .        set con
28d00 66 69 67 46 69 6c 65 4e 61 6d 65 73 20 5b 6c 69  figFileNames [li
28d10 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  st \..          
28d20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51    System.Data.SQ
28d30 4c 69 74 65 2e 64 6c 6c 2e 63 6f 6e 66 69 67 5d  Lite.dll.config]
28d40 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
28d50 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42         # NOTE: B
28d60 75 69 6c 64 20 61 20 6c 69 73 74 20 6f 66 20 61  uild a list of a
28d70 75 78 69 6c 69 61 72 79 20 4d 61 6e 61 67 65 64  uxiliary Managed
28d80 20 44 65 62 75 67 67 69 6e 67 20 41 73 73 69 73   Debugging Assis
28d90 74 61 6e 74 73 20 28 4d 44 41 29 0d 0a 20 20 20  tants (MDA)..   
28da0 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e       #       con
28db0 66 69 67 75 72 61 74 69 6f 6e 20 66 69 6c 65 73  figuration files
28dc0 20 74 68 61 74 20 77 65 20 68 61 6e 64 6c 65 2e   that we handle.
28dd0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
28de0 20 20 20 20 20 73 65 74 20 6d 64 61 43 6f 6e 66       set mdaConf
28df0 69 67 46 69 6c 65 4e 61 6d 65 73 20 5b 6c 69 73  igFileNames [lis
28e00 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  t \..           
28e10 20 45 61 67 6c 65 53 68 65 6c 6c 33 32 2e 65 78   EagleShell32.ex
28e20 65 2e 6d 64 61 2e 63 6f 6e 66 69 67 20 49 6e 73  e.mda.config Ins
28e30 74 61 6c 6c 65 72 2e 65 78 65 2e 6d 64 61 2e 63  taller.exe.mda.c
28e40 6f 6e 66 69 67 20 5c 0d 0a 20 20 20 20 20 20 20  onfig \..       
28e50 20 20 20 20 20 74 65 73 74 2e 65 78 65 2e 6d 64       test.exe.md
28e60 61 2e 63 6f 6e 66 69 67 20 74 65 73 74 6c 69 6e  a.config testlin
28e70 71 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e 66 69 67  q.exe.mda.config
28e80 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
28e90 74 65 73 74 65 66 36 2e 65 78 65 2e 6d 64 61 2e  testef6.exe.mda.
28ea0 63 6f 6e 66 69 67 5d 0d 0a 0d 0a 20 20 20 20 20  config]....     
28eb0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
28ec0 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74 68 65 20  NOTE: Build the 
28ed0 6c 69 73 74 20 6f 66 20 65 78 74 65 72 6e 61 6c  list of external
28ee0 20 66 69 6c 65 73 20 74 68 61 74 20 77 65 20 68   files that we h
28ef0 61 6e 64 6c 65 2e 20 20 53 6f 6d 65 20 6f 66 0d  andle.  Some of.
28f00 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
28f10 20 74 68 65 73 65 20 66 69 6c 65 73 20 6d 61 79   these files may
28f20 20 62 65 20 6e 61 74 69 76 65 20 61 6e 64 2f 6f   be native and/o
28f30 72 20 6d 61 6e 61 67 65 64 20 61 73 73 65 6d 62  r managed assemb
28f40 6c 69 65 73 20 74 68 61 74 20 61 72 65 0d 0a 20  lies that are.. 
28f50 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 72         #       r
28f60 65 71 75 69 72 65 64 20 74 6f 20 70 65 72 66 6f  equired to perfo
28f70 72 6d 20 76 61 72 69 6f 75 73 20 74 65 73 74 73  rm various tests
28f80 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
28f90 20 20 20 20 20 20 73 65 74 20 65 78 74 65 72 6e        set extern
28fa0 61 6c 46 69 6c 65 4e 61 6d 65 73 20 5b 6c 69 73  alFileNames [lis
28fb0 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  t \..           
28fc0 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 45 6e 74 69   [file join Enti
28fd0 74 79 46 72 61 6d 65 77 6f 72 6b 20 6c 69 62 20  tyFramework lib 
28fe0 5b 73 74 72 69 6e 67 20 6d 61 70 20 5b 6c 69 73  [string map [lis
28ff0 74 20 46 78 20 22 22 5d 20 5c 0d 0a 20 20 20 20  t Fx ""] \..    
29000 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20          [string 
29010 6d 61 70 20 5b 6c 69 73 74 20 6e 65 74 46 78 34  map [list netFx4
29020 35 31 20 6e 65 74 46 78 34 35 20 6e 65 74 46 78  51 netFx45 netFx
29030 34 35 32 20 6e 65 74 46 78 34 35 20 6e 65 74 46  452 netFx45 netF
29040 78 34 36 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  x46 \..         
29050 20 20 20 6e 65 74 46 78 34 35 20 6e 65 74 46 78     netFx45 netFx
29060 34 36 31 20 6e 65 74 46 78 34 35 20 6e 65 74 46  461 netFx45 netF
29070 78 34 36 32 20 6e 65 74 46 78 34 35 20 6e 65 74  x462 netFx45 net
29080 46 78 34 37 20 6e 65 74 46 78 34 35 20 5c 0d 0a  Fx47 netFx45 \..
29090 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 74 46              netF
290a0 78 34 37 31 20 6e 65 74 46 78 34 35 20 6e 65 74  x471 netFx45 net
290b0 46 78 34 37 32 20 6e 65 74 46 78 34 35 20 6e 65  Fx472 netFx45 ne
290c0 74 53 74 61 6e 64 61 72 64 32 30 20 6e 65 74 46  tStandard20 netF
290d0 78 34 35 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20  x45] \..        
290e0 20 20 20 20 5b 67 65 74 42 75 69 6c 64 4e 65 74      [getBuildNet
290f0 46 78 5d 5d 5d 20 45 6e 74 69 74 79 46 72 61 6d  Fx]]] EntityFram
29100 65 77 6f 72 6b 2e 64 6c 6c 5d 5d 0d 0a 0d 0a 20  ework.dll]].... 
29110 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
29120 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20    # NOTE: Build 
29130 74 68 65 20 6c 69 73 74 20 6f 66 20 6e 61 74 69  the list of nati
29140 76 65 20 61 73 73 65 6d 62 6c 79 20 66 69 6c 65  ve assembly file
29150 73 20 74 68 61 74 20 77 65 20 68 61 6e 64 6c 65  s that we handle
29160 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
29170 20 20 20 20 20 20 73 65 74 20 6e 61 74 69 76 65        set native
29180 46 69 6c 65 4e 61 6d 65 73 20 5b 6c 69 73 74 5d  FileNames [list]
29190 0d 0a 0d 0a 20 20 20 20 20 20 20 20 65 76 61 6c  ....        eval
291a0 20 6c 61 70 70 65 6e 64 20 6e 61 74 69 76 65 46   lappend nativeF
291b0 69 6c 65 4e 61 6d 65 73 20 5b 67 65 74 4e 61 74  ileNames [getNat
291c0 69 76 65 4c 69 62 72 61 72 79 46 69 6c 65 4e 61  iveLibraryFileNa
291d0 6d 65 73 4f 6e 6c 79 5d 0d 0a 20 20 20 20 20 20  mesOnly]..      
291e0 20 20 65 76 61 6c 20 6c 61 70 70 65 6e 64 20 6e    eval lappend n
291f0 61 74 69 76 65 46 69 6c 65 4e 61 6d 65 73 20 5b  ativeFileNames [
29200 67 65 74 49 6e 74 65 72 6f 70 41 73 73 65 6d 62  getInteropAssemb
29210 6c 79 46 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79 5d  lyFileNamesOnly]
29220 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
29230 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42         # NOTE: B
29240 75 69 6c 64 20 74 68 65 20 6c 69 73 74 20 6f 66  uild the list of
29250 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73 65   mixed-mode asse
29260 6d 62 6c 79 20 66 69 6c 65 73 20 74 68 61 74 20  mbly files that 
29270 77 65 20 68 61 6e 64 6c 65 2e 0d 0a 20 20 20 20  we handle...    
29280 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73      #..        s
29290 65 74 20 6d 69 78 65 64 46 69 6c 65 4e 61 6d 65  et mixedFileName
292a0 73 20 5b 6c 69 73 74 5d 0d 0a 0d 0a 20 20 20 20  s [list]....    
292b0 20 20 20 20 69 66 20 7b 5b 68 61 73 52 75 6e 74      if {[hasRunt
292c0 69 6d 65 4f 70 74 69 6f 6e 20 6e 61 74 69 76 65  imeOption native
292d0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
292e0 20 20 20 20 20 6c 61 70 70 65 6e 64 20 6d 69 78       lappend mix
292f0 65 64 46 69 6c 65 4e 61 6d 65 73 20 53 79 73 74  edFileNames Syst
29300 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64  em.Data.SQLite.d
29310 6c 6c 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  ll..        }...
29320 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
29330 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c      # NOTE: Buil
29340 64 20 74 68 65 20 6c 69 73 74 20 6f 66 20 6d 61  d the list of ma
29350 6e 61 67 65 64 20 61 73 73 65 6d 62 6c 79 20 66  naged assembly f
29360 69 6c 65 73 20 74 68 61 74 20 77 65 20 68 61 6e  iles that we han
29370 64 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  dle...        #.
29380 0a 20 20 20 20 20 20 20 20 73 65 74 20 6d 61 6e  .        set man
29390 61 67 65 64 46 69 6c 65 4e 61 6d 65 73 20 5b 6c  agedFileNames [l
293a0 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ist \..         
293b0 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53     System.Data.S
293c0 51 4c 69 74 65 2e 4c 69 6e 71 2e 64 6c 6c 20 53  QLite.Linq.dll S
293d0 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
293e0 65 2e 45 46 36 2e 64 6c 6c 5d 0d 0a 0d 0a 20 20  e.EF6.dll]....  
293f0 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61 73 52        if {![hasR
29400 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 6e 61 74  untimeOption nat
29410 69 76 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ive]} then {..  
29420 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20          lappend 
29430 6d 61 6e 61 67 65 64 46 69 6c 65 4e 61 6d 65 73  managedFileNames
29440 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
29450 69 74 65 2e 64 6c 6c 0d 0a 20 20 20 20 20 20 20  ite.dll..       
29460 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d   }....        #.
29470 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
29480 20 53 68 6f 77 20 74 68 65 20 76 61 72 69 6f 75   Show the variou
29490 73 20 6c 69 73 74 73 20 6f 66 20 66 69 6c 65 20  s lists of file 
294a0 6e 61 6d 65 73 20 74 68 61 74 20 61 72 65 20 68  names that are h
294b0 61 6e 64 6c 65 64 20 62 79 20 74 68 69 73 0d 0a  andled by this..
294c0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
294d0 70 72 6f 63 65 64 75 72 65 2e 0d 0a 20 20 20 20  procedure...    
294e0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 74      #..        t
294f0 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
29500 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
29510 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
29520 22 2d 2d 2d 2d 20 6c 69 73 74 20 6f 66 20 5c 22  "---- list of \"
29530 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 5c 22 20  configuration\" 
29540 66 69 6c 65 20 6e 61 6d 65 73 20 69 73 3a 20 22  file names is: "
29550 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
29560 5b 65 78 70 72 20 7b 5b 6c 6c 65 6e 67 74 68 20  [expr {[llength 
29570 24 63 6f 6e 66 69 67 46 69 6c 65 4e 61 6d 65 73  $configFileNames
29580 5d 20 3e 20 30 20 3f 20 24 63 6f 6e 66 69 67 46  ] > 0 ? $configF
29590 69 6c 65 4e 61 6d 65 73 20 3a 20 5c 0d 0a 20 20  ileNames : \..  
295a0 20 20 20 20 20 20 20 20 20 20 22 3c 6e 6f 6e 65            "<none
295b0 3e 22 7d 5d 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20  >"}] \n]....    
295c0 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
295d0 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
295e0 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
295f0 20 20 20 20 20 22 2d 2d 2d 2d 20 6c 69 73 74 20       "---- list 
29600 6f 66 20 5c 22 4d 44 41 20 63 6f 6e 66 69 67 75  of \"MDA configu
29610 72 61 74 69 6f 6e 5c 22 20 66 69 6c 65 20 6e 61  ration\" file na
29620 6d 65 73 20 69 73 3a 20 22 20 5c 0d 0a 20 20 20  mes is: " \..   
29630 20 20 20 20 20 20 20 20 20 5b 65 78 70 72 20 7b           [expr {
29640 5b 6c 6c 65 6e 67 74 68 20 24 6d 64 61 43 6f 6e  [llength $mdaCon
29650 66 69 67 46 69 6c 65 4e 61 6d 65 73 5d 20 3e 20  figFileNames] > 
29660 30 20 3f 20 24 6d 64 61 43 6f 6e 66 69 67 46 69  0 ? $mdaConfigFi
29670 6c 65 4e 61 6d 65 73 20 3a 20 5c 0d 0a 20 20 20  leNames : \..   
29680 20 20 20 20 20 20 20 20 20 22 3c 6e 6f 6e 65 3e           "<none>
29690 22 7d 5d 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20  "}] \n]....     
296a0 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
296b0 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
296c0 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
296d0 20 20 20 20 22 2d 2d 2d 2d 20 6c 69 73 74 20 6f      "---- list o
296e0 66 20 5c 22 65 78 74 65 72 6e 61 6c 5c 22 20 66  f \"external\" f
296f0 69 6c 65 20 6e 61 6d 65 73 20 69 73 3a 20 22 20  ile names is: " 
29700 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
29710 65 78 70 72 20 7b 5b 6c 6c 65 6e 67 74 68 20 24  expr {[llength $
29720 65 78 74 65 72 6e 61 6c 46 69 6c 65 4e 61 6d 65  externalFileName
29730 73 5d 20 3e 20 30 20 3f 20 24 65 78 74 65 72 6e  s] > 0 ? $extern
29740 61 6c 46 69 6c 65 4e 61 6d 65 73 20 3a 20 5c 0d  alFileNames : \.
29750 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 3c 6e  .            "<n
29760 6f 6e 65 3e 22 7d 5d 20 5c 6e 5d 0d 0a 0d 0a 20  one>"}] \n].... 
29770 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
29780 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
29790 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
297a0 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6c 69          "---- li
297b0 73 74 20 6f 66 20 5c 22 6e 61 74 69 76 65 5c 22  st of \"native\"
297c0 20 66 69 6c 65 20 6e 61 6d 65 73 20 69 73 3a 20   file names is: 
297d0 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
297e0 20 5b 65 78 70 72 20 7b 5b 6c 6c 65 6e 67 74 68   [expr {[llength
297f0 20 24 6e 61 74 69 76 65 46 69 6c 65 4e 61 6d 65   $nativeFileName
29800 73 5d 20 3e 20 30 20 3f 20 24 6e 61 74 69 76 65  s] > 0 ? $native
29810 46 69 6c 65 4e 61 6d 65 73 20 3a 20 5c 0d 0a 20  FileNames : \.. 
29820 20 20 20 20 20 20 20 20 20 20 20 22 3c 6e 6f 6e             "<non
29830 65 3e 22 7d 5d 20 5c 6e 5d 0d 0a 0d 0a 20 20 20  e>"}] \n]....   
29840 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
29850 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
29860 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
29870 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6c 69 73 74        "---- list
29880 20 6f 66 20 5c 22 6d 69 78 65 64 5c 22 20 66 69   of \"mixed\" fi
29890 6c 65 20 6e 61 6d 65 73 20 69 73 3a 20 22 20 5c  le names is: " \
298a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 65  ..            [e
298b0 78 70 72 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 6d  xpr {[llength $m
298c0 69 78 65 64 46 69 6c 65 4e 61 6d 65 73 5d 20 3e  ixedFileNames] >
298d0 20 30 20 3f 20 24 6d 69 78 65 64 46 69 6c 65 4e   0 ? $mixedFileN
298e0 61 6d 65 73 20 3a 20 5c 0d 0a 20 20 20 20 20 20  ames : \..      
298f0 20 20 20 20 20 20 22 3c 6e 6f 6e 65 3e 22 7d 5d        "<none>"}]
29900 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20   \n]....        
29910 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
29920 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
29930 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
29940 20 22 2d 2d 2d 2d 20 6c 69 73 74 20 6f 66 20 5c   "---- list of \
29950 22 6d 61 6e 61 67 65 64 5c 22 20 66 69 6c 65 20  "managed\" file 
29960 6e 61 6d 65 73 20 69 73 3a 20 22 20 5c 0d 0a 20  names is: " \.. 
29970 20 20 20 20 20 20 20 20 20 20 20 5b 65 78 70 72             [expr
29980 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 6d 61 6e 61   {[llength $mana
29990 67 65 64 46 69 6c 65 4e 61 6d 65 73 5d 20 3e 20  gedFileNames] > 
299a0 30 20 3f 20 24 6d 61 6e 61 67 65 64 46 69 6c 65  0 ? $managedFile
299b0 4e 61 6d 65 73 20 3a 20 5c 0d 0a 20 20 20 20 20  Names : \..     
299c0 20 20 20 20 20 20 20 22 3c 6e 6f 6e 65 3e 22 7d         "<none>"}
299d0 5d 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  ] \n]....       
299e0 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
299f0 54 45 3a 20 52 65 6d 6f 76 65 20 61 6e 79 20 74  TE: Remove any t
29a00 65 73 74 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  est constraints 
29a10 74 68 61 74 20 72 65 66 65 72 20 74 6f 20 74 68  that refer to th
29a20 65 20 6e 61 74 69 76 65 20 61 6e 64 2f 6f 72 0d  e native and/or.
29a30 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
29a40 20 6d 61 6e 61 67 65 64 20 61 73 73 65 6d 62 6c   managed assembl
29a50 79 20 66 69 6c 65 73 20 74 68 61 74 20 77 65 20  y files that we 
29a60 68 61 6e 64 6c 65 20 75 6e 6c 65 73 73 20 66 6f  handle unless fo
29a70 72 62 69 64 64 65 6e 20 66 72 6f 6d 0d 0a 20 20  rbidden from..  
29a80 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64 6f        #       do
29a90 69 6e 67 20 73 6f 2e 0d 0a 20 20 20 20 20 20 20  ing so...       
29aa0 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   #..        if {
29ab0 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
29ac0 6e 6f 28 73 71 6c 69 74 65 52 65 6d 6f 76 65 43  no(sqliteRemoveC
29ad0 6f 6e 73 74 72 61 69 6e 74 73 29 5d 7d 20 74 68  onstraints)]} th
29ae0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
29af0 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65  foreach fileName
29b00 20 24 63 6f 6e 66 69 67 46 69 6c 65 4e 61 6d 65   $configFileName
29b10 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s {..           
29b20 20 72 65 6d 6f 76 65 43 6f 6e 73 74 72 61 69 6e   removeConstrain
29b30 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69  t [appendArgs fi
29b40 6c 65 5f 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a  le_ $fileName]..
29b50 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
29b60 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
29b70 20 66 69 6c 65 4e 61 6d 65 20 24 6d 64 61 43 6f   fileName $mdaCo
29b80 6e 66 69 67 46 69 6c 65 4e 61 6d 65 73 20 7b 0d  nfigFileNames {.
29b90 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6d  .            rem
29ba0 6f 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61  oveConstraint [a
29bb0 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20  ppendArgs file_ 
29bc0 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20 20  $fileName]..    
29bd0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
29be0 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c       foreach fil
29bf0 65 4e 61 6d 65 20 24 65 78 74 65 72 6e 61 6c 46  eName $externalF
29c00 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20  ileNames {..    
29c10 20 20 20 20 20 20 20 20 72 65 6d 6f 76 65 43 6f          removeCo
29c20 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64  nstraint [append
29c30 41 72 67 73 20 66 69 6c 65 5f 20 5b 66 69 6c 65  Args file_ [file
29c40 20 74 61 69 6c 20 24 66 69 6c 65 4e 61 6d 65 5d   tail $fileName]
29c50 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ]..          }..
29c60 0d 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 65  ..          fore
29c70 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6e 61  ach fileName $na
29c80 74 69 76 65 46 69 6c 65 4e 61 6d 65 73 20 7b 0d  tiveFileNames {.
29c90 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6d  .            rem
29ca0 6f 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61  oveConstraint [a
29cb0 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20  ppendArgs file_ 
29cc0 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20 20  $fileName]..    
29cd0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
29ce0 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c       foreach fil
29cf0 65 4e 61 6d 65 20 24 6d 69 78 65 64 46 69 6c 65  eName $mixedFile
29d00 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20  Names {..       
29d10 20 20 20 20 20 72 65 6d 6f 76 65 43 6f 6e 73 74       removeConst
29d20 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67  raint [appendArg
29d30 73 20 66 69 6c 65 5f 20 24 66 69 6c 65 4e 61 6d  s file_ $fileNam
29d40 65 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  e]..          }.
29d50 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  ...          for
29d60 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6d  each fileName $m
29d70 61 6e 61 67 65 64 46 69 6c 65 4e 61 6d 65 73 20  anagedFileNames 
29d80 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  {..            r
29d90 65 6d 6f 76 65 43 6f 6e 73 74 72 61 69 6e 74 20  emoveConstraint 
29da0 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65  [appendArgs file
29db0 5f 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20  _ $fileName]..  
29dc0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
29dd0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
29de0 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
29df0 45 3a 20 43 68 65 63 6b 20 66 6f 72 20 74 68 65  E: Check for the
29e00 20 22 61 75 74 6f 53 65 6c 65 63 74 22 20 72 75   "autoSelect" ru
29e10 6e 74 69 6d 65 20 6f 70 74 69 6f 6e 2e 20 20 49  ntime option.  I
29e20 66 20 70 72 65 73 65 6e 74 2c 0d 0a 20 20 20 20  f present,..    
29e30 20 20 20 20 23 20 20 20 20 20 20 20 61 74 74 65      #       atte
29e40 6d 70 74 20 74 6f 20 61 75 74 6f 6d 61 74 69 63  mpt to automatic
29e50 61 6c 6c 79 20 73 65 6c 65 63 74 20 74 68 65 20  ally select the 
29e60 66 69 72 73 74 20 61 76 61 69 6c 61 62 6c 65 0d  first available.
29e70 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
29e80 20 62 75 69 6c 64 20 28 6f 72 20 22 72 65 6c 65   build (or "rele
29e90 61 73 65 22 29 20 6f 66 20 53 51 4c 69 74 65 20  ase") of SQLite 
29ea0 61 6e 64 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  and System.Data.
29eb0 53 51 4c 69 74 65 0d 0a 20 20 20 20 20 20 20 20  SQLite..        
29ec0 23 20 20 20 20 20 20 20 66 6f 72 20 75 73 65 20  #       for use 
29ed0 77 69 74 68 20 74 68 65 20 74 65 73 74 20 73 75  with the test su
29ee0 69 74 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ite...        #.
29ef0 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 68 61  .        if {[ha
29f00 73 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 61  sRuntimeOption a
29f10 75 74 6f 53 65 6c 65 63 74 5d 7d 20 74 68 65 6e  utoSelect]} then
29f20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   {..          if
29f30 20 7b 21 5b 63 68 65 63 6b 46 6f 72 53 51 4c 69   {![checkForSQLi
29f40 74 65 42 75 69 6c 64 73 20 24 3a 3a 74 65 73 74  teBuilds $::test
29f50 5f 63 68 61 6e 6e 65 6c 20 74 72 75 65 5d 7d 20  _channel true]} 
29f60 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
29f70 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51 4c 69      checkForSQLi
29f80 74 65 52 65 6c 65 61 73 65 73 20 24 3a 3a 74 65  teReleases $::te
29f90 73 74 5f 63 68 61 6e 6e 65 6c 20 74 72 75 65 0d  st_channel true.
29fa0 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  .          }....
29fb0 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
29fc0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53         # NOTE: S
29fd0 68 6f 77 20 28 61 6e 64 20 6c 6f 67 29 20 74 68  how (and log) th
29fe0 65 20 67 6c 6f 62 61 6c 20 70 61 72 61 6d 65 74  e global paramet
29ff0 65 72 73 20 74 68 61 74 20 63 6f 6e 74 72 6f 6c  ers that control
2a000 20 77 68 65 72 65 0d 0a 20 20 20 20 20 20 20 20   where..        
2a010 20 20 23 20 20 20 20 20 20 20 74 68 65 20 62 75    #       the bu
2a020 69 6c 64 20 64 69 72 65 63 74 6f 72 79 20 73 68  ild directory sh
2a030 6f 75 6c 64 20 62 65 2e 20 20 54 68 65 20 61 75  ould be.  The au
2a040 74 6f 2d 73 65 6c 65 63 74 69 6f 6e 20 6d 61 79  to-selection may
2a050 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20  ..          #   
2a060 20 20 20 20 68 61 76 65 20 6d 6f 64 69 66 69 65      have modifie
2a070 64 20 73 6f 6d 65 20 6f 66 20 74 68 65 73 65 20  d some of these 
2a080 70 61 72 61 6d 65 74 65 72 73 2e 0d 0a 20 20 20  parameters...   
2a090 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
2a0a0 20 20 20 20 73 68 6f 77 53 51 4c 69 74 65 42 75      showSQLiteBu
2a0b0 69 6c 64 50 61 72 61 6d 65 74 65 72 73 20 24 3a  ildParameters $:
2a0c0 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 20  :test_channel.. 
2a0d0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
2a0e0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
2a0f0 20 4e 4f 54 45 3a 20 53 6b 69 70 20 61 6c 6c 20   NOTE: Skip all 
2a100 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
2a110 74 65 20 72 65 6c 61 74 65 64 20 66 69 6c 65 20  te related file 
2a120 68 61 6e 64 6c 69 6e 67 20 28 64 65 6c 65 74 69  handling (deleti
2a130 6e 67 2c 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ng,..        #  
2a140 20 20 20 20 20 63 6f 70 79 69 6e 67 2c 20 61 6e       copying, an
2a150 64 20 6c 6f 61 64 69 6e 67 29 20 69 66 20 69 6e  d loading) if in
2a160 73 74 72 75 63 74 65 64 2e 0d 0a 20 20 20 20 20  structed...     
2a170 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66     #..        if
2a180 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
2a190 3a 3a 6e 6f 28 73 71 6c 69 74 65 46 69 6c 65 73  ::no(sqliteFiles
2a1a0 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
2a1b0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
2a1c0 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20     # NOTE: Skip 
2a1d0 74 72 79 69 6e 67 20 74 6f 20 64 65 6c 65 74 65  trying to delete
2a1e0 20 61 6e 79 20 66 69 6c 65 73 20 69 66 20 69 6e   any files if in
2a1f0 73 74 72 75 63 74 65 64 2e 0d 0a 20 20 20 20 20  structed...     
2a200 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
2a210 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
2a220 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53  sts ::no(deleteS
2a230 71 6c 69 74 65 46 69 6c 65 73 29 5d 7d 20 74 68  qliteFiles)]} th
2a240 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
2a250 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
2a260 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53  sts ::no(deleteS
2a270 71 6c 69 74 65 43 6f 6e 66 69 67 46 69 6c 65 73  qliteConfigFiles
2a280 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
2a290 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63            foreac
2a2a0 68 20 66 69 6c 65 4e 61 6d 65 20 24 63 6f 6e 66  h fileName $conf
2a2b0 69 67 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20  igFileNames {.. 
2a2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
2a2d0 72 79 44 65 6c 65 74 65 42 69 6e 61 72 79 46 69  ryDeleteBinaryFi
2a2e0 6c 65 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20  le $fileName..  
2a2f0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
2a300 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
2a310 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
2a320 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
2a330 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69 74 65 45  no(deleteSqliteE
2a340 78 74 65 72 6e 61 6c 46 69 6c 65 73 29 5d 7d 20  xternalFiles)]} 
2a350 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
2a360 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69        foreach fi
2a370 6c 65 4e 61 6d 65 20 24 6d 64 61 43 6f 6e 66 69  leName $mdaConfi
2a380 67 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20  gFileNames {..  
2a390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72                tr
2a3a0 79 44 65 6c 65 74 65 42 75 69 6c 64 46 69 6c 65  yDeleteBuildFile
2a3b0 20 24 66 69 6c 65 4e 61 6d 65 20 74 72 75 65 0d   $fileName true.
2a3c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
2a3d0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
2a3e0 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61    foreach fileNa
2a3f0 6d 65 20 24 65 78 74 65 72 6e 61 6c 46 69 6c 65  me $externalFile
2a400 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20  Names {..       
2a410 20 20 20 20 20 20 20 20 20 74 72 79 44 65 6c 65           tryDele
2a420 74 65 42 69 6e 61 72 79 46 69 6c 65 20 24 66 69  teBinaryFile $fi
2a430 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20  leName..        
2a440 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
2a450 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
2a460 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
2a470 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c   exists ::no(del
2a480 65 74 65 53 71 6c 69 74 65 4e 61 74 69 76 65 46  eteSqliteNativeF
2a490 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  iles)]} then {..
2a4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
2a4b0 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
2a4c0 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69 74  ::no(deleteSqlit
2a4d0 65 49 6d 70 6c 69 63 69 74 4e 61 74 69 76 65 46  eImplicitNativeF
2a4e0 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  iles)]} then {..
2a4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a500 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65  foreach fileName
2a510 20 24 6e 61 74 69 76 65 46 69 6c 65 4e 61 6d 65   $nativeFileName
2a520 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s {..           
2a530 20 20 20 20 20 20 20 74 72 79 44 65 6c 65 74 65         tryDelete
2a540 41 73 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61  Assembly $fileNa
2a550 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  me..            
2a560 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
2a570 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
2a580 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
2a590 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64  fo exists ::no(d
2a5a0 65 6c 65 74 65 53 71 6c 69 74 65 4e 6f 6e 49 6d  eleteSqliteNonIm
2a5b0 70 6c 69 63 69 74 46 69 6c 65 73 29 5d 7d 20 74  plicitFiles)]} t
2a5c0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
2a5d0 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
2a5e0 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65  o exists ::no(de
2a5f0 6c 65 74 65 53 71 6c 69 74 65 50 6c 61 74 66 6f  leteSqlitePlatfo
2a600 72 6d 46 69 6c 65 73 29 5d 20 26 26 20 5c 0d 0a  rmFiles)] && \..
2a610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a620 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67      [string leng
2a630 74 68 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3e 20  th $platform] > 
2a640 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
2a650 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
2a660 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6e  each fileName $n
2a670 61 74 69 76 65 46 69 6c 65 4e 61 6d 65 73 20 7b  ativeFileNames {
2a680 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2a690 20 20 20 20 20 20 74 72 79 44 65 6c 65 74 65 41        tryDeleteA
2a6a0 73 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61 6d  ssembly $fileNam
2a6b0 65 20 24 70 6c 61 74 66 6f 72 6d 0d 0a 20 20 20  e $platform..   
2a6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
2a6d0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2a6e0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
2a6f0 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
2a700 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65  o exists ::no(de
2a710 6c 65 74 65 53 71 6c 69 74 65 41 72 63 68 69 74  leteSqliteArchit
2a720 65 63 74 75 72 65 46 69 6c 65 73 29 5d 20 26 26  ectureFiles)] &&
2a730 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
2a740 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20          [string 
2a750 6c 65 6e 67 74 68 20 24 61 72 63 68 69 74 65 63  length $architec
2a760 74 75 72 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20  ture] > 0} then 
2a770 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
2a780 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c       foreach fil
2a790 65 4e 61 6d 65 20 24 6e 61 74 69 76 65 46 69 6c  eName $nativeFil
2a7a0 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20  eNames {..      
2a7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72                tr
2a7c0 79 44 65 6c 65 74 65 41 73 73 65 6d 62 6c 79 20  yDeleteAssembly 
2a7d0 24 66 69 6c 65 4e 61 6d 65 20 24 61 72 63 68 69  $fileName $archi
2a7e0 74 65 63 74 75 72 65 0d 0a 20 20 20 20 20 20 20  tecture..       
2a7f0 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
2a800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
2a810 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
2a820 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
2a830 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ...            i
2a840 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
2a850 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69   ::no(deleteSqli
2a860 74 65 4d 69 78 65 64 46 69 6c 65 73 29 5d 7d 20  teMixedFiles)]} 
2a870 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
2a880 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
2a890 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49         # NOTE: I
2a8a0 66 20 74 68 65 20 22 6e 61 74 69 76 65 22 20 72  f the "native" r
2a8b0 75 6e 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73  untime option is
2a8c0 20 73 65 74 2c 20 64 65 6c 65 74 65 20 69 6d 70   set, delete imp
2a8d0 6c 69 63 69 74 0d 0a 20 20 20 20 20 20 20 20 20  licit..         
2a8e0 20 20 20 20 20 23 20 20 20 20 20 20 20 6d 69 78       #       mix
2a8f0 65 64 2d 6d 6f 64 65 20 61 73 73 65 6d 62 6c 79  ed-mode assembly
2a900 20 66 69 6c 65 73 20 61 73 20 77 65 6c 6c 2e 20   files as well. 
2a910 20 54 68 69 73 20 72 75 6e 74 69 6d 65 20 6f 70   This runtime op
2a920 74 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20 20 20  tion..          
2a930 20 20 20 20 23 20 20 20 20 20 20 20 63 68 65 63      #       chec
2a940 6b 20 69 73 20 68 61 6e 64 6c 65 64 20 77 68 65  k is handled whe
2a950 6e 20 62 75 69 6c 64 69 6e 67 20 74 68 65 20 6c  n building the l
2a960 69 73 74 20 6f 66 20 6d 69 78 65 64 2d 6d 6f 64  ist of mixed-mod
2a970 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e..             
2a980 20 23 20 20 20 20 20 20 20 61 73 73 65 6d 62 6c   #       assembl
2a990 79 20 66 69 6c 65 20 6e 61 6d 65 73 2e 0d 0a 20  y file names... 
2a9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a               #..
2a9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
2a9c0 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
2a9d0 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69 74  ::no(deleteSqlit
2a9e0 65 49 6d 70 6c 69 63 69 74 4d 69 78 65 64 46 69  eImplicitMixedFi
2a9f0 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  les)]} then {.. 
2aa00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
2aa10 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20  oreach fileName 
2aa20 24 6d 69 78 65 64 46 69 6c 65 4e 61 6d 65 73 20  $mixedFileNames 
2aa30 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
2aa40 20 20 20 20 20 74 72 79 44 65 6c 65 74 65 41 73       tryDeleteAs
2aa50 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61 6d 65  sembly $fileName
2aa60 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2aa70 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
2aa80 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
2aa90 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
2aaa0 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c   exists ::no(del
2aab0 65 74 65 53 71 6c 69 74 65 4e 6f 6e 49 6d 70 6c  eteSqliteNonImpl
2aac0 69 63 69 74 46 69 6c 65 73 29 5d 7d 20 74 68 65  icitFiles)]} the
2aad0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
2aae0 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
2aaf0 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65  exists ::no(dele
2ab00 74 65 53 71 6c 69 74 65 50 6c 61 74 66 6f 72 6d  teSqlitePlatform
2ab10 46 69 6c 65 73 29 5d 20 26 26 20 5c 0d 0a 20 20  Files)] && \..  
2ab20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ab30 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
2ab40 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3e 20 30 7d   $platform] > 0}
2ab50 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
2ab60 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61             forea
2ab70 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6d 69 78  ch fileName $mix
2ab80 65 64 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20  edFileNames {.. 
2ab90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aba0 20 20 20 74 72 79 44 65 6c 65 74 65 41 73 73 65     tryDeleteAsse
2abb0 6d 62 6c 79 20 24 66 69 6c 65 4e 61 6d 65 20 24  mbly $fileName $
2abc0 70 6c 61 74 66 6f 72 6d 0d 0a 20 20 20 20 20 20  platform..      
2abd0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
2abe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
2abf0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
2ac00 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
2ac10 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74  xists ::no(delet
2ac20 65 53 71 6c 69 74 65 41 72 63 68 69 74 65 63 74  eSqliteArchitect
2ac30 75 72 65 46 69 6c 65 73 29 5d 20 26 26 20 5c 0d  ureFiles)] && \.
2ac40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2ac50 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
2ac60 67 74 68 20 24 61 72 63 68 69 74 65 63 74 75 72  gth $architectur
2ac70 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  e] > 0} then {..
2ac80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ac90 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61    foreach fileNa
2aca0 6d 65 20 24 6d 69 78 65 64 46 69 6c 65 4e 61 6d  me $mixedFileNam
2acb0 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  es {..          
2acc0 20 20 20 20 20 20 20 20 20 20 74 72 79 44 65 6c            tryDel
2acd0 65 74 65 41 73 73 65 6d 62 6c 79 20 24 66 69 6c  eteAssembly $fil
2ace0 65 4e 61 6d 65 20 24 61 72 63 68 69 74 65 63 74  eName $architect
2acf0 75 72 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ure..           
2ad00 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
2ad10 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
2ad20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
2ad30 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
2ad40 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
2ad50 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
2ad60 6f 28 64 65 6c 65 74 65 53 71 6c 69 74 65 4d 61  o(deleteSqliteMa
2ad70 6e 61 67 65 64 46 69 6c 65 73 29 5d 7d 20 74 68  nagedFiles)]} th
2ad80 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
2ad90 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65      foreach file
2ada0 4e 61 6d 65 20 24 6d 61 6e 61 67 65 64 46 69 6c  Name $managedFil
2adb0 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20  eNames {..      
2adc0 20 20 20 20 20 20 20 20 20 20 74 72 79 44 65 6c            tryDel
2add0 65 74 65 41 73 73 65 6d 62 6c 79 20 24 66 69 6c  eteAssembly $fil
2ade0 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 20  eName..         
2adf0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
2ae00 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
2ae10 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
2ae20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e  #..          # N
2ae30 4f 54 45 3a 20 53 68 6f 77 20 28 61 6e 64 20 6c  OTE: Show (and l
2ae40 6f 67 29 20 74 68 65 20 67 6c 6f 62 61 6c 20 70  og) the global p
2ae50 61 72 61 6d 65 74 65 72 73 20 74 68 61 74 20 63  arameters that c
2ae60 6f 6e 74 72 6f 6c 20 77 68 65 72 65 0d 0a 20 20  ontrol where..  
2ae70 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
2ae80 74 68 65 20 62 75 69 6c 64 20 64 69 72 65 63 74  the build direct
2ae90 6f 72 79 20 73 68 6f 75 6c 64 20 62 65 2e 0d 0a  ory should be...
2aea0 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
2aeb0 20 20 20 20 20 20 20 73 68 6f 77 53 51 4c 69 74         showSQLit
2aec0 65 42 75 69 6c 64 50 61 72 61 6d 65 74 65 72 73  eBuildParameters
2aed0 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
2aee0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  ....          #.
2aef0 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
2af00 45 3a 20 53 6b 69 70 20 74 72 79 69 6e 67 20 74  E: Skip trying t
2af10 6f 20 76 65 72 69 66 79 20 74 68 65 20 62 75 69  o verify the bui
2af20 6c 64 20 64 69 72 65 63 74 6f 72 79 20 69 66 20  ld directory if 
2af30 69 6e 73 74 72 75 63 74 65 64 3b 0d 0a 20 20 20  instructed;..   
2af40 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6f         #       o
2af50 74 68 65 72 77 69 73 65 2c 20 6d 61 6b 65 20 73  therwise, make s
2af60 75 72 65 20 69 74 20 61 63 74 75 61 6c 6c 79 20  ure it actually 
2af70 65 78 69 73 74 73 20 6f 72 20 68 61 6c 74 20 74  exists or halt t
2af80 68 65 20 65 6e 74 69 72 65 0d 0a 20 20 20 20 20  he entire..     
2af90 20 20 20 20 20 23 20 20 20 20 20 20 20 74 65 73       #       tes
2afa0 74 69 6e 67 20 70 72 6f 63 65 73 73 20 69 66 20  ting process if 
2afb0 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  it does not exis
2afc0 74 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  t...          #.
2afd0 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21  .          if {!
2afe0 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
2aff0 6f 28 76 65 72 69 66 79 42 75 69 6c 64 44 69 72  o(verifyBuildDir
2b000 65 63 74 6f 72 79 29 5d 7d 20 74 68 65 6e 20 7b  ectory)]} then {
2b010 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d  ..            #.
2b020 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e  .            # N
2b030 4f 54 45 3a 20 41 74 20 74 68 69 73 20 70 6f 69  OTE: At this poi
2b040 6e 74 2c 20 74 68 65 20 62 75 69 6c 64 20 64 69  nt, the build di
2b050 72 65 63 74 6f 72 69 65 73 20 4d 55 53 54 20 65  rectories MUST e
2b060 78 69 73 74 20 66 6f 72 0d 0a 20 20 20 20 20 20  xist for..      
2b070 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68        #       th
2b080 65 20 74 65 73 74 69 6e 67 20 70 72 6f 63 65 73  e testing proces
2b090 73 20 74 6f 20 63 6f 6e 74 69 6e 75 65 2e 0d 0a  s to continue...
2b0a0 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
2b0b0 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 64             set d
2b0c0 69 72 65 63 74 6f 72 79 20 5b 67 65 74 42 75 69  irectory [getBui
2b0d0 6c 64 44 69 72 65 63 74 6f 72 79 20 66 61 6c 73  ldDirectory fals
2b0e0 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  e]....          
2b0f0 20 20 69 66 20 7b 21 5b 66 69 6c 65 20 65 78 69    if {![file exi
2b100 73 74 73 20 24 64 69 72 65 63 74 6f 72 79 5d 20  sts $directory] 
2b110 7c 7c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  || \..          
2b120 20 20 20 20 20 20 21 5b 66 69 6c 65 20 69 73 64        ![file isd
2b130 69 72 65 63 74 6f 72 79 20 24 64 69 72 65 63 74  irectory $direct
2b140 6f 72 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ory]} then {..  
2b150 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
2b160 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e               # N
2b170 4f 54 45 3a 20 4a 75 73 74 20 70 72 69 6f 72 20  OTE: Just prior 
2b180 74 6f 20 61 63 74 75 61 6c 6c 79 20 68 61 6c 74  to actually halt
2b190 69 6e 67 20 74 68 65 20 74 65 73 74 69 6e 67 20  ing the testing 
2b1a0 70 72 6f 63 65 73 73 2c 0d 0a 20 20 20 20 20 20  process,..      
2b1b0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
2b1c0 61 64 64 20 61 6e 20 65 72 72 6f 72 20 74 6f 20  add an error to 
2b1d0 74 68 65 20 74 65 73 74 20 6c 6f 67 20 66 69 6c  the test log fil
2b1e0 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e...            
2b1f0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
2b200 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
2b210 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
2b220 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
2b230 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
2b240 63 6f 75 6c 64 20 6e 6f 74 20 76 65 72 69 66 79  could not verify
2b250 20 6e 61 74 69 76 65 20 62 75 69 6c 64 20 64 69   native build di
2b260 72 65 63 74 6f 72 79 20 5c 22 22 20 5c 0d 0a 20  rectory \"" \.. 
2b270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b280 20 24 64 69 72 65 63 74 6f 72 79 20 22 5c 22 2c   $directory "\",
2b290 20 61 6c 6c 20 74 65 73 74 69 6e 67 20 68 61 6c   all testing hal
2b2a0 74 65 64 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20  ted\n"]....     
2b2b0 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
2b2c0 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
2b2d0 3a 20 52 61 69 73 69 6e 67 20 61 20 73 63 72 69  : Raising a scri
2b2e0 70 74 20 65 72 72 6f 72 20 66 72 6f 6d 20 74 68  pt error from th
2b2f0 69 73 20 70 6f 69 6e 74 20 73 68 6f 75 6c 64 20  is point should 
2b300 68 61 6c 74 0d 0a 20 20 20 20 20 20 20 20 20 20  halt..          
2b310 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20      #       the 
2b320 74 65 73 74 69 6e 67 20 70 72 6f 63 65 73 73 2e  testing process.
2b330 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2b340 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  #..             
2b350 20 65 72 72 6f 72 20 5b 61 70 70 65 6e 64 41 72   error [appendAr
2b360 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
2b370 20 20 20 20 20 20 20 20 22 63 6f 75 6c 64 20 6e          "could n
2b380 6f 74 20 76 65 72 69 66 79 20 6e 61 74 69 76 65  ot verify native
2b390 20 62 75 69 6c 64 20 64 69 72 65 63 74 6f 72 79   build directory
2b3a0 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20   \"" \..        
2b3b0 20 20 20 20 20 20 20 20 20 20 24 64 69 72 65 63            $direc
2b3c0 74 6f 72 79 20 22 5c 22 2c 20 61 6c 6c 20 74 65  tory "\", all te
2b3d0 73 74 69 6e 67 20 68 61 6c 74 65 64 22 5d 0d 0a  sting halted"]..
2b3e0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
2b3f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74  .            set
2b400 20 64 69 72 65 63 74 6f 72 79 20 5b 67 65 74 42   directory [getB
2b410 75 69 6c 64 44 69 72 65 63 74 6f 72 79 20 74 72  uildDirectory tr
2b420 75 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ue]....         
2b430 20 20 20 69 66 20 7b 21 5b 66 69 6c 65 20 65 78     if {![file ex
2b440 69 73 74 73 20 24 64 69 72 65 63 74 6f 72 79 5d  ists $directory]
2b450 20 7c 7c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   || \..         
2b460 20 20 20 20 20 20 20 21 5b 66 69 6c 65 20 69 73         ![file is
2b470 64 69 72 65 63 74 6f 72 79 20 24 64 69 72 65 63  directory $direc
2b480 74 6f 72 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  tory]} then {.. 
2b490 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a               #..
2b4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
2b4b0 4e 4f 54 45 3a 20 4a 75 73 74 20 70 72 69 6f 72  NOTE: Just prior
2b4c0 20 74 6f 20 61 63 74 75 61 6c 6c 79 20 68 61 6c   to actually hal
2b4d0 74 69 6e 67 20 74 68 65 20 74 65 73 74 69 6e 67  ting the testing
2b4e0 20 70 72 6f 63 65 73 73 2c 0d 0a 20 20 20 20 20   process,..     
2b4f0 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
2b500 20 61 64 64 20 61 6e 20 65 72 72 6f 72 20 74 6f   add an error to
2b510 20 74 68 65 20 74 65 73 74 20 6c 6f 67 20 66 69   the test log fi
2b520 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  le...           
2b530 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
2b540 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
2b550 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
2b560 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
2b570 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
2b580 20 63 6f 75 6c 64 20 6e 6f 74 20 76 65 72 69 66   could not verif
2b590 79 20 6d 61 6e 61 67 65 64 20 62 75 69 6c 64 20  y managed build 
2b5a0 64 69 72 65 63 74 6f 72 79 20 5c 22 22 20 5c 0d  directory \"" \.
2b5b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2b5c0 20 20 20 24 64 69 72 65 63 74 6f 72 79 20 22 5c     $directory "\
2b5d0 22 2c 20 61 6c 6c 20 74 65 73 74 69 6e 67 20 68  ", all testing h
2b5e0 61 6c 74 65 64 5c 6e 22 5d 0d 0a 0d 0a 20 20 20  alted\n"]....   
2b5f0 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
2b600 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f              # NO
2b610 54 45 3a 20 52 61 69 73 69 6e 67 20 61 20 73 63  TE: Raising a sc
2b620 72 69 70 74 20 65 72 72 6f 72 20 66 72 6f 6d 20  ript error from 
2b630 74 68 69 73 20 70 6f 69 6e 74 20 73 68 6f 75 6c  this point shoul
2b640 64 20 68 61 6c 74 0d 0a 20 20 20 20 20 20 20 20  d halt..        
2b650 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68        #       th
2b660 65 20 74 65 73 74 69 6e 67 20 70 72 6f 63 65 73  e testing proces
2b670 73 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  s...            
2b680 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
2b690 20 20 20 65 72 72 6f 72 20 5b 61 70 70 65 6e 64     error [append
2b6a0 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
2b6b0 20 20 20 20 20 20 20 20 20 20 22 63 6f 75 6c 64            "could
2b6c0 20 6e 6f 74 20 76 65 72 69 66 79 20 6d 61 6e 61   not verify mana
2b6d0 67 65 64 20 62 75 69 6c 64 20 64 69 72 65 63 74  ged build direct
2b6e0 6f 72 79 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20  ory \"" \..     
2b6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 24 64 69               $di
2b700 72 65 63 74 6f 72 79 20 22 5c 22 2c 20 61 6c 6c  rectory "\", all
2b710 20 74 65 73 74 69 6e 67 20 68 61 6c 74 65 64 22   testing halted"
2b720 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ]..            }
2b730 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
2b740 73 65 74 20 6c 6f 67 44 69 72 65 63 74 6f 72 79  set logDirectory
2b750 20 24 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20   $directory..   
2b760 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
2b770 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74  .            set
2b780 20 6c 6f 67 44 69 72 65 63 74 6f 72 79 20 5b 67   logDirectory [g
2b790 65 74 42 75 69 6c 64 44 69 72 65 63 74 6f 72 79  etBuildDirectory
2b7a0 20 74 72 75 65 5d 0d 0a 20 20 20 20 20 20 20 20   true]..        
2b7b0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
2b7c0 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
2b7d0 4e 4f 54 45 3a 20 57 65 27 72 65 20 67 6f 69 6e  NOTE: We're goin
2b7e0 67 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 74 65  g to move the te
2b7f0 73 74 20 6c 6f 67 20 66 69 6c 65 20 74 6f 20 74  st log file to t
2b800 68 65 20 64 69 72 65 63 74 6f 72 79 0d 0a 20 20  he directory..  
2b810 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
2b820 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6d  containing the m
2b830 61 6e 61 67 65 64 20 61 73 73 65 6d 62 6c 69 65  anaged assemblie
2b840 73 20 62 65 69 6e 67 20 74 65 73 74 65 64 2e 0d  s being tested..
2b850 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
2b860 20 20 20 20 20 20 20 20 6d 6f 76 65 54 65 73 74          moveTest
2b870 4c 6f 67 46 69 6c 65 20 24 6c 6f 67 44 69 72 65  LogFile $logDire
2b880 63 74 6f 72 79 0d 0a 0d 0a 20 20 20 20 20 20 20  ctory....       
2b890 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
2b8a0 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20 74 72 79  # NOTE: Skip try
2b8b0 69 6e 67 20 74 6f 20 63 6f 70 79 20 61 6e 79 20  ing to copy any 
2b8c0 66 69 6c 65 73 20 69 66 20 69 6e 73 74 72 75 63  files if instruc
2b8d0 74 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ted...          
2b8e0 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  #..          if 
2b8f0 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
2b900 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65 46 69  :no(copySqliteFi
2b910 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  les)]} then {.. 
2b920 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
2b930 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
2b940 6f 28 63 6f 70 79 53 71 6c 69 74 65 43 6f 6e 66  o(copySqliteConf
2b950 69 67 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20  igFiles)]} then 
2b960 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
2b970 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
2b980 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20  hannel \..      
2b990 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
2b9a0 2d 20 63 6f 70 79 69 6e 67 20 5c 22 63 6f 6e 66  - copying \"conf
2b9b0 69 67 75 72 61 74 69 6f 6e 5c 22 20 66 69 6c 65  iguration\" file
2b9c0 73 2e 2e 2e 5c 6e 22 0d 0a 0d 0a 20 20 20 20 20  s...\n"....     
2b9d0 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
2b9e0 20 66 69 6c 65 4e 61 6d 65 20 24 63 6f 6e 66 69   fileName $confi
2b9f0 67 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20  gFileNames {..  
2ba00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72                tr
2ba10 79 43 6f 70 79 42 75 69 6c 64 46 69 6c 65 20 24  yCopyBuildFile $
2ba20 66 69 6c 65 4e 61 6d 65 20 74 72 75 65 0d 0a 20  fileName true.. 
2ba30 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
2ba40 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
2ba50 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
2ba60 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
2ba70 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65 45 78  :no(copySqliteEx
2ba80 74 65 72 6e 61 6c 46 69 6c 65 73 29 5d 7d 20 74  ternalFiles)]} t
2ba90 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
2baa0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
2bab0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 6f        # NOTE: Co
2bac0 70 79 20 74 68 65 20 4d 61 6e 61 67 65 64 20 44  py the Managed D
2bad0 65 62 75 67 67 69 6e 67 20 41 73 73 69 73 74 61  ebugging Assista
2bae0 6e 74 73 20 28 4d 44 41 29 20 63 6f 6e 66 69 67  nts (MDA) config
2baf0 75 72 61 74 69 6f 6e 0d 0a 20 20 20 20 20 20 20  uration..       
2bb00 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 66         #       f
2bb10 69 6c 65 20 66 6f 72 20 74 68 65 20 45 61 67 6c  ile for the Eagl
2bb20 65 20 73 68 65 6c 6c 20 74 6f 20 74 68 65 20 62  e shell to the b
2bb30 75 69 6c 64 20 6f 75 74 70 75 74 20 64 69 72 65  uild output dire
2bb40 63 74 6f 72 79 2c 0d 0a 20 20 20 20 20 20 20 20  ctory,..        
2bb50 20 20 20 20 20 20 23 20 20 20 20 20 20 20 77 68        #       wh
2bb60 69 6c 65 20 75 73 69 6e 67 20 65 61 63 68 20 6f  ile using each o
2bb70 66 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 74  f the names of t
2bb80 68 65 20 76 61 72 69 6f 75 73 20 6c 65 67 61 63  he various legac
2bb90 79 20 74 65 73 74 0d 0a 20 20 20 20 20 20 20 20  y test..        
2bba0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 65 78        #       ex
2bbb0 65 63 75 74 61 62 6c 65 73 2e 20 20 54 68 69 73  ecutables.  This
2bbc0 20 77 69 6c 6c 20 68 65 6c 70 20 74 6f 20 6d 61   will help to ma
2bbd0 6b 65 20 73 75 72 65 20 74 68 61 74 20 61 6c 6c  ke sure that all
2bbe0 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 20 20   the..          
2bbf0 20 20 20 20 23 20 20 20 20 20 20 20 6c 65 67 61      #       lega
2bc00 63 79 20 74 65 73 74 73 20 72 75 6e 20 77 69 74  cy tests run wit
2bc10 68 20 65 78 61 63 74 6c 79 20 74 68 65 20 73 61  h exactly the sa
2bc20 6d 65 20 73 65 74 20 6f 66 20 4d 61 6e 61 67 65  me set of Manage
2bc30 64 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d..             
2bc40 20 23 20 20 20 20 20 20 20 44 65 62 75 67 67 69   #       Debuggi
2bc50 6e 67 20 41 73 73 69 73 74 61 6e 74 73 20 63 6f  ng Assistants co
2bc60 6e 66 69 67 75 72 65 64 2e 0d 0a 20 20 20 20 20  nfigured...     
2bc70 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
2bc80 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
2bc90 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
2bca0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
2bcb0 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 70 79 69       "---- copyi
2bcc0 6e 67 20 5c 22 4d 44 41 20 63 6f 6e 66 69 67 75  ng \"MDA configu
2bcd0 72 61 74 69 6f 6e 5c 22 20 66 69 6c 65 73 2e 2e  ration\" files..
2bce0 2e 5c 6e 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20  .\n"....        
2bcf0 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69        foreach fi
2bd00 6c 65 4e 61 6d 65 20 24 6d 64 61 43 6f 6e 66 69  leName $mdaConfi
2bd10 67 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20  gFileNames {..  
2bd20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72                tr
2bd30 79 43 6f 70 79 42 69 6e 61 72 79 46 69 6c 65 20  yCopyBinaryFile 
2bd40 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65 2e 6d  EagleShell.exe.m
2bd50 64 61 2e 63 6f 6e 66 69 67 20 74 72 75 65 20 22  da.config true "
2bd60 22 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20  " $fileName..   
2bd70 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
2bd80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
2bd90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
2bda0 20 4e 4f 54 45 3a 20 43 6f 70 79 20 74 68 65 20   NOTE: Copy the 
2bdb0 65 78 74 65 72 6e 61 6c 20 62 69 6e 61 72 69 65  external binarie
2bdc0 73 2c 20 69 66 20 61 6e 79 2c 20 74 6f 20 74 68  s, if any, to th
2bdd0 65 20 64 69 72 65 63 74 6f 72 79 20 74 68 61 74  e directory that
2bde0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2bdf0 23 20 20 20 20 20 20 20 63 6f 6e 74 61 69 6e 73  #       contains
2be00 20 74 68 65 20 45 61 67 6c 65 20 73 68 65 6c 6c   the Eagle shell
2be10 2e 20 20 54 68 69 73 20 69 73 20 74 79 70 69 63  .  This is typic
2be20 61 6c 6c 79 20 75 73 65 64 20 74 6f 20 6d 61 6b  ally used to mak
2be30 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e..             
2be40 20 23 20 20 20 20 20 20 20 73 75 72 65 20 61 73   #       sure as
2be50 73 65 6d 62 6c 69 65 73 20 72 65 66 65 72 65 6e  semblies referen
2be60 63 65 64 20 62 79 20 74 68 65 20 6f 6e 65 73 20  ced by the ones 
2be70 62 65 69 6e 67 20 74 65 73 74 65 64 20 61 72 65  being tested are
2be80 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2be90 23 20 20 20 20 20 20 20 61 76 61 69 6c 61 62 6c  #       availabl
2bea0 65 20 64 75 72 69 6e 67 20 74 68 65 20 74 65 73  e during the tes
2beb0 74 69 6e 67 20 70 72 6f 63 65 73 73 2e 0d 0a 20  ting process... 
2bec0 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a               #..
2bed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70                tp
2bee0 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
2bef0 6e 65 6c 20 22 2d 2d 2d 2d 20 63 6f 70 79 69 6e  nel "---- copyin
2bf00 67 20 5c 22 65 78 74 65 72 6e 61 6c 5c 22 20 66  g \"external\" f
2bf10 69 6c 65 73 2e 2e 2e 5c 6e 22 0d 0a 0d 0a 20 20  iles...\n"....  
2bf20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65              fore
2bf30 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 65 78  ach fileName $ex
2bf40 74 65 72 6e 61 6c 46 69 6c 65 4e 61 6d 65 73 20  ternalFileNames 
2bf50 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
2bf60 20 20 20 74 72 79 43 6f 70 79 45 78 74 65 72 6e     tryCopyExtern
2bf70 61 6c 46 69 6c 65 20 24 66 69 6c 65 4e 61 6d 65  alFile $fileName
2bf80 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2bf90 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  }..            }
2bfa0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
2bfb0 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
2bfc0 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74  s ::no(copySqlit
2bfd0 65 4e 61 74 69 76 65 46 69 6c 65 73 29 5d 7d 20  eNativeFiles)]} 
2bfe0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
2bff0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
2c000 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49         # NOTE: I
2c010 66 20 74 68 65 20 74 65 73 74 20 70 6c 61 74 66  f the test platf
2c020 6f 72 6d 20 69 73 20 6c 69 6b 65 6c 79 20 74 68  orm is likely th
2c030 65 20 64 65 66 61 75 6c 74 20 66 6f 72 20 74 68  e default for th
2c040 69 73 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  is..            
2c050 20 20 23 20 20 20 20 20 20 20 6d 61 63 68 69 6e    #       machin
2c060 65 2c 20 61 6c 73 6f 20 74 72 79 20 74 6f 20 63  e, also try to c
2c070 6f 70 79 20 74 68 65 20 6e 61 74 69 76 65 20 66  opy the native f
2c080 69 6c 65 73 20 74 6f 20 74 68 65 0d 0a 20 20 20  iles to the..   
2c090 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20             #    
2c0a0 20 20 20 62 69 6e 61 72 79 20 6c 6f 63 61 74 69     binary locati
2c0b0 6f 6e 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  on...           
2c0c0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
2c0d0 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
2c0e0 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53  xists ::no(copyS
2c0f0 71 6c 69 74 65 49 6d 70 6c 69 63 69 74 4e 61 74  qliteImplicitNat
2c100 69 76 65 46 69 6c 65 73 29 5d 20 26 26 20 5c 0d  iveFiles)] && \.
2c110 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2c120 20 20 20 5b 69 73 44 65 66 61 75 6c 74 42 75 69     [isDefaultBui
2c130 6c 64 50 6c 61 74 66 6f 72 6d 5d 7d 20 74 68 65  ldPlatform]} the
2c140 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
2c150 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
2c160 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20  st_channel \..  
2c170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c180 20 20 22 2d 2d 2d 2d 20 63 6f 70 79 69 6e 67 20    "---- copying 
2c190 69 6d 70 6c 69 63 69 74 20 5c 22 6e 61 74 69 76  implicit \"nativ
2c1a0 65 5c 22 20 66 69 6c 65 73 2e 2e 2e 5c 6e 22 0d  e\" files...\n".
2c1b0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
2c1c0 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e     foreach fileN
2c1d0 61 6d 65 20 24 6e 61 74 69 76 65 46 69 6c 65 4e  ame $nativeFileN
2c1e0 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20  ames {..        
2c1f0 20 20 20 20 20 20 20 20 20 20 74 72 79 43 6f 70            tryCop
2c200 79 41 73 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e  yAssembly $fileN
2c210 61 6d 65 20 66 61 6c 73 65 0d 0a 20 20 20 20 20  ame false..     
2c220 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
2c230 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
2c240 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
2c250 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
2c260 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65   ::no(copySqlite
2c270 4e 6f 6e 49 6d 70 6c 69 63 69 74 46 69 6c 65 73  NonImplicitFiles
2c280 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
2c290 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
2c2a0 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
2c2b0 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65 50 6c 61  no(copySqlitePla
2c2c0 74 66 6f 72 6d 46 69 6c 65 73 29 5d 20 26 26 20  tformFiles)] && 
2c2d0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
2c2e0 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c         [string l
2c2f0 65 6e 67 74 68 20 24 70 6c 61 74 66 6f 72 6d 5d  ength $platform]
2c300 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
2c310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c320 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
2c330 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
2c340 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
2c350 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
2c360 20 63 6f 70 79 69 6e 67 20 5c 22 6e 61 74 69 76   copying \"nativ
2c370 65 5c 22 20 66 69 6c 65 73 20 66 6f 72 20 70 6c  e\" files for pl
2c380 61 74 66 6f 72 6d 20 5c 22 22 20 5c 0d 0a 20 20  atform \"" \..  
2c390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c3a0 20 20 20 20 24 70 6c 61 74 66 6f 72 6d 20 5c 22      $platform \"
2c3b0 2e 2e 2e 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20  ...\n]....      
2c3c0 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65              fore
2c3d0 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6e 61  ach fileName $na
2c3e0 74 69 76 65 46 69 6c 65 4e 61 6d 65 73 20 7b 0d  tiveFileNames {.
2c3f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2c400 20 20 20 20 20 74 72 79 43 6f 70 79 41 73 73 65       tryCopyAsse
2c410 6d 62 6c 79 20 24 66 69 6c 65 4e 61 6d 65 20 66  mbly $fileName f
2c420 61 6c 73 65 20 24 70 6c 61 74 66 6f 72 6d 0d 0a  alse $platform..
2c430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c440 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
2c450 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
2c460 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
2c470 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
2c480 28 63 6f 70 79 53 71 6c 69 74 65 41 72 63 68 69  (copySqliteArchi
2c490 74 65 63 74 75 72 65 46 69 6c 65 73 29 5d 20 26  tectureFiles)] &
2c4a0 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  & \..           
2c4b0 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67           [string
2c4c0 20 6c 65 6e 67 74 68 20 24 61 72 63 68 69 74 65   length $archite
2c4d0 63 74 75 72 65 5d 20 3e 20 30 7d 20 74 68 65 6e  cture] > 0} then
2c4e0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
2c4f0 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
2c500 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
2c510 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
2c520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c530 20 22 2d 2d 2d 2d 20 63 6f 70 79 69 6e 67 20 5c   "---- copying \
2c540 22 6e 61 74 69 76 65 5c 22 20 66 69 6c 65 73 20  "native\" files 
2c550 66 6f 72 20 61 72 63 68 69 74 65 63 74 75 72 65  for architecture
2c560 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20   \"" \..        
2c570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24 61                $a
2c580 72 63 68 69 74 65 63 74 75 72 65 20 5c 22 2e 2e  rchitecture \"..
2c590 2e 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  .\n]....        
2c5a0 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63            foreac
2c5b0 68 20 66 69 6c 65 4e 61 6d 65 20 24 6e 61 74 69  h fileName $nati
2c5c0 76 65 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20  veFileNames {.. 
2c5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c5e0 20 20 20 74 72 79 43 6f 70 79 41 73 73 65 6d 62     tryCopyAssemb
2c5f0 6c 79 20 24 66 69 6c 65 4e 61 6d 65 20 66 61 6c  ly $fileName fal
2c600 73 65 20 24 61 72 63 68 69 74 65 63 74 75 72 65  se $architecture
2c610 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2c620 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
2c630 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
2c640 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
2c650 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
2c660 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65 46 6f 72  no(copySqliteFor
2c670 63 65 64 4e 61 74 69 76 65 46 69 6c 65 73 29 5d  cedNativeFiles)]
2c680 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
2c690 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 42             [getB
2c6a0 75 69 6c 64 4e 61 74 69 76 65 5d 7d 20 74 68 65  uildNative]} the
2c6b0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
2c6c0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
2c6d0 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a  test_channel \..
2c6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c6f0 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 70 79        "---- copy
2c700 69 6e 67 20 66 6f 72 63 65 64 20 5c 22 6e 61 74  ing forced \"nat
2c710 69 76 65 5c 22 20 66 69 6c 65 73 2e 2e 2e 5c 6e  ive\" files...\n
2c720 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  "....           
2c730 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66         foreach f
2c740 69 6c 65 4e 61 6d 65 20 24 6e 61 74 69 76 65 46  ileName $nativeF
2c750 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20  ileNames {..    
2c760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c770 74 72 79 43 6f 70 79 41 73 73 65 6d 62 6c 79 20  tryCopyAssembly 
2c780 24 66 69 6c 65 4e 61 6d 65 20 66 61 6c 73 65 0d  $fileName false.
2c790 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2c7a0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
2c7b0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
2c7c0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
2c7d0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
2c7e0 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
2c7f0 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f  o exists ::no(co
2c800 70 79 53 71 6c 69 74 65 4d 69 78 65 64 46 69 6c  pySqliteMixedFil
2c810 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  es)]} then {..  
2c820 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
2c830 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e               # N
2c840 4f 54 45 3a 20 49 66 20 74 68 65 20 22 6e 61 74  OTE: If the "nat
2c850 69 76 65 22 20 72 75 6e 74 69 6d 65 20 6f 70 74  ive" runtime opt
2c860 69 6f 6e 20 69 73 20 73 65 74 2c 20 63 6f 70 79  ion is set, copy
2c870 20 69 6d 70 6c 69 63 69 74 0d 0a 20 20 20 20 20   implicit..     
2c880 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
2c890 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73 65   mixed-mode asse
2c8a0 6d 62 6c 79 20 66 69 6c 65 73 20 61 73 20 77 65  mbly files as we
2c8b0 6c 6c 2e 20 20 54 68 65 20 72 75 6e 74 69 6d 65  ll.  The runtime
2c8c0 20 6f 70 74 69 6f 6e 0d 0a 20 20 20 20 20 20 20   option..       
2c8d0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63         #       c
2c8e0 68 65 63 6b 20 69 73 20 68 61 6e 64 6c 65 64 20  heck is handled 
2c8f0 77 68 65 6e 20 62 75 69 6c 64 69 6e 67 20 74 68  when building th
2c900 65 20 6c 69 73 74 20 6f 66 20 6d 69 78 65 64 2d  e list of mixed-
2c910 6d 6f 64 65 0d 0a 20 20 20 20 20 20 20 20 20 20  mode..          
2c920 20 20 20 20 23 20 20 20 20 20 20 20 61 73 73 65      #       asse
2c930 6d 62 6c 79 20 66 69 6c 65 20 6e 61 6d 65 73 2e  mbly file names.
2c940 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2c950 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  #..             
2c960 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
2c970 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69  ts ::no(copySqli
2c980 74 65 49 6d 70 6c 69 63 69 74 4d 69 78 65 64 46  teImplicitMixedF
2c990 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  iles)]} then {..
2c9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c9b0 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
2c9c0 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20  annel \..       
2c9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
2c9e0 2d 2d 20 63 6f 70 79 69 6e 67 20 69 6d 70 6c 69  -- copying impli
2c9f0 63 69 74 20 5c 22 6d 69 78 65 64 5c 22 20 66 69  cit \"mixed\" fi
2ca00 6c 65 73 2e 2e 2e 5c 6e 22 0d 0a 0d 0a 20 20 20  les...\n"....   
2ca10 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
2ca20 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6d  each fileName $m
2ca30 69 78 65 64 46 69 6c 65 4e 61 6d 65 73 20 7b 0d  ixedFileNames {.
2ca40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2ca50 20 20 20 74 72 79 43 6f 70 79 41 73 73 65 6d 62     tryCopyAssemb
2ca60 6c 79 20 24 66 69 6c 65 4e 61 6d 65 20 66 61 6c  ly $fileName fal
2ca70 73 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  se..            
2ca80 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
2ca90 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
2caa0 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
2cab0 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63  fo exists ::no(c
2cac0 6f 70 79 53 71 6c 69 74 65 4e 6f 6e 49 6d 70 6c  opySqliteNonImpl
2cad0 69 63 69 74 46 69 6c 65 73 29 5d 7d 20 74 68 65  icitFiles)]} the
2cae0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
2caf0 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
2cb00 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79  exists ::no(copy
2cb10 53 71 6c 69 74 65 50 6c 61 74 66 6f 72 6d 46 69  SqlitePlatformFi
2cb20 6c 65 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20  les)] && \..    
2cb30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cb40 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
2cb50 70 6c 61 74 66 6f 72 6d 5d 20 3e 20 30 7d 20 74  platform] > 0} t
2cb60 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
2cb70 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
2cb80 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
2cb90 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
2cba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cbb0 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 70 79 69 6e      "---- copyin
2cbc0 67 20 5c 22 6d 69 78 65 64 5c 22 20 66 69 6c 65  g \"mixed\" file
2cbd0 73 20 66 6f 72 20 70 6c 61 74 66 6f 72 6d 20 5c  s for platform \
2cbe0 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  "" \..          
2cbf0 20 20 20 20 20 20 20 20 20 20 20 20 24 70 6c 61              $pla
2cc00 74 66 6f 72 6d 20 5c 22 2e 2e 2e 5c 6e 5d 0d 0a  tform \"...\n]..
2cc10 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2cc20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65      foreach file
2cc30 4e 61 6d 65 20 24 6d 69 78 65 64 46 69 6c 65 4e  Name $mixedFileN
2cc40 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20  ames {..        
2cc50 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79 43              tryC
2cc60 6f 70 79 41 73 73 65 6d 62 6c 79 20 24 66 69 6c  opyAssembly $fil
2cc70 65 4e 61 6d 65 20 66 61 6c 73 65 20 24 70 6c 61  eName false $pla
2cc80 74 66 6f 72 6d 0d 0a 20 20 20 20 20 20 20 20 20  tform..         
2cc90 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
2cca0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
2ccb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2ccc0 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
2ccd0 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69  ts ::no(copySqli
2cce0 74 65 41 72 63 68 69 74 65 63 74 75 72 65 46 69  teArchitectureFi
2ccf0 6c 65 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20  les)] && \..    
2cd00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cd10 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
2cd20 61 72 63 68 69 74 65 63 74 75 72 65 5d 20 3e 20  architecture] > 
2cd30 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
2cd40 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
2cd50 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
2cd60 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
2cd70 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2cd80 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6f          "---- co
2cd90 70 79 69 6e 67 20 5c 22 6d 69 78 65 64 5c 22 20  pying \"mixed\" 
2cda0 66 69 6c 65 73 20 66 6f 72 20 61 72 63 68 69 74  files for archit
2cdb0 65 63 74 75 72 65 20 5c 22 22 20 5c 0d 0a 20 20  ecture \"" \..  
2cdc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cdd0 20 20 20 20 24 61 72 63 68 69 74 65 63 74 75 72      $architectur
2cde0 65 20 5c 22 2e 2e 2e 5c 6e 5d 0d 0a 0d 0a 20 20  e \"...\n]....  
2cdf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ce00 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65  foreach fileName
2ce10 20 24 6d 69 78 65 64 46 69 6c 65 4e 61 6d 65 73   $mixedFileNames
2ce20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
2ce30 20 20 20 20 20 20 20 20 74 72 79 43 6f 70 79 41          tryCopyA
2ce40 73 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61 6d  ssembly $fileNam
2ce50 65 20 66 61 6c 73 65 20 24 61 72 63 68 69 74 65  e false $archite
2ce60 63 74 75 72 65 0d 0a 20 20 20 20 20 20 20 20 20  cture..         
2ce70 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
2ce80 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
2ce90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2cea0 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
2ceb0 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69  ts ::no(copySqli
2cec0 74 65 46 6f 72 63 65 64 4d 69 78 65 64 46 69 6c  teForcedMixedFil
2ced0 65 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  es)] && \..     
2cee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b                 [
2cef0 67 65 74 42 75 69 6c 64 4e 61 74 69 76 65 5d 7d  getBuildNative]}
2cf00 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
2cf10 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
2cf20 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
2cf30 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
2cf40 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
2cf50 63 6f 70 79 69 6e 67 20 66 6f 72 63 65 64 20 5c  copying forced \
2cf60 22 6d 69 78 65 64 5c 22 20 66 69 6c 65 73 2e 2e  "mixed\" files..
2cf70 2e 5c 6e 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20  .\n"....        
2cf80 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63            foreac
2cf90 68 20 66 69 6c 65 4e 61 6d 65 20 24 6d 69 78 65  h fileName $mixe
2cfa0 64 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20  dFileNames {..  
2cfb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cfc0 20 20 74 72 79 43 6f 70 79 41 73 73 65 6d 62 6c    tryCopyAssembl
2cfd0 79 20 24 66 69 6c 65 4e 61 6d 65 20 66 61 6c 73  y $fileName fals
2cfe0 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e..             
2cff0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
2d000 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
2d010 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
2d020 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
2d030 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69           if {![i
2d040 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
2d050 63 6f 70 79 53 71 6c 69 74 65 4d 61 6e 61 67 65  copySqliteManage
2d060 64 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b  dFiles)]} then {
2d070 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2d080 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
2d090 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 6f 70 79  annel "---- copy
2d0a0 69 6e 67 20 5c 22 6d 61 6e 61 67 65 64 5c 22 20  ing \"managed\" 
2d0b0 66 69 6c 65 73 2e 2e 2e 5c 6e 22 0d 0a 0d 0a 20  files...\n".... 
2d0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
2d0d0 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6d  each fileName $m
2d0e0 61 6e 61 67 65 64 46 69 6c 65 4e 61 6d 65 73 20  anagedFileNames 
2d0f0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
2d100 20 20 20 74 72 79 43 6f 70 79 41 73 73 65 6d 62     tryCopyAssemb
2d110 6c 79 20 24 66 69 6c 65 4e 61 6d 65 20 74 72 75  ly $fileName tru
2d120 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e..             
2d130 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
2d140 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  }..          }..
2d150 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
2d160 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
2d170 20 53 6b 69 70 20 74 72 79 69 6e 67 20 74 6f 20   Skip trying to 
2d180 6c 6f 61 64 20 61 6e 79 20 66 69 6c 65 73 20 69  load any files i
2d190 66 20 69 6e 73 74 72 75 63 74 65 64 2e 0d 0a 20  f instructed... 
2d1a0 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
2d1b0 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
2d1c0 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 6c 6f 61   exists ::no(loa
2d1d0 64 53 71 6c 69 74 65 46 69 6c 65 73 29 5d 7d 20  dSqliteFiles)]} 
2d1e0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
2d1f0 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
2d200 78 69 73 74 73 20 3a 3a 6e 6f 28 6c 6f 61 64 53  xists ::no(loadS
2d210 71 6c 69 74 65 49 6d 70 6c 69 63 69 74 46 69 6c  qliteImplicitFil
2d220 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  es)]} then {..  
2d230 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79 4c              tryL
2d240 6f 61 64 41 73 73 65 6d 62 6c 79 20 53 79 73 74  oadAssembly Syst
2d250 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64  em.Data.SQLite.d
2d260 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ll..            
2d270 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
2d280 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
2d290 74 73 20 3a 3a 6e 6f 28 6c 6f 61 64 53 71 6c 69  ts ::no(loadSqli
2d2a0 74 65 4c 69 6e 71 46 69 6c 65 73 29 5d 7d 20 74  teLinqFiles)]} t
2d2b0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
2d2c0 20 20 20 20 20 74 72 79 4c 6f 61 64 41 73 73 65       tryLoadAsse
2d2d0 6d 62 6c 79 20 53 79 73 74 65 6d 2e 44 61 74 61  mbly System.Data
2d2e0 2e 53 51 4c 69 74 65 2e 4c 69 6e 71 2e 64 6c 6c  .SQLite.Linq.dll
2d2f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
2d300 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ...            i
2d310 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
2d320 20 3a 3a 6e 6f 28 6c 6f 61 64 53 71 6c 69 74 65   ::no(loadSqlite
2d330 45 66 36 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e  Ef6Files)]} then
2d340 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
2d350 20 20 74 72 79 4c 6f 61 64 41 73 73 65 6d 62 6c    tryLoadAssembl
2d360 79 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  y System.Data.SQ
2d370 4c 69 74 65 2e 45 46 36 2e 64 6c 6c 0d 0a 20 20  Lite.EF6.dll..  
2d380 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
2d390 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
2d3a0 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
2d3b0 6f 28 6c 6f 61 64 53 71 6c 69 74 65 4e 6f 6e 49  o(loadSqliteNonI
2d3c0 6d 70 6c 69 63 69 74 46 69 6c 65 73 29 5d 7d 20  mplicitFiles)]} 
2d3d0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
2d3e0 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
2d3f0 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 6c 6f 61   exists ::no(loa
2d400 64 53 71 6c 69 74 65 50 6c 61 74 66 6f 72 6d 46  dSqlitePlatformF
2d410 69 6c 65 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20  iles)] && \..   
2d420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b                 [
2d430 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 70  string length $p
2d440 6c 61 74 66 6f 72 6d 5d 20 3e 20 30 7d 20 74 68  latform] > 0} th
2d450 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
2d460 20 20 20 20 20 20 74 72 79 4c 6f 61 64 41 73 73        tryLoadAss
2d470 65 6d 62 6c 79 20 53 79 73 74 65 6d 2e 44 61 74  embly System.Dat
2d480 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 20 24 70 6c  a.SQLite.dll $pl
2d490 61 74 66 6f 72 6d 0d 0a 20 20 20 20 20 20 20 20  atform..        
2d4a0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
2d4b0 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69           if {![i
2d4c0 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
2d4d0 6c 6f 61 64 53 71 6c 69 74 65 41 72 63 68 69 74  loadSqliteArchit
2d4e0 65 63 74 75 72 65 46 69 6c 65 73 29 5d 20 26 26  ectureFiles)] &&
2d4f0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
2d500 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65        [string le
2d510 6e 67 74 68 20 24 61 72 63 68 69 74 65 63 74 75  ngth $architectu
2d520 72 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  re] > 0} then {.
2d530 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2d540 20 74 72 79 4c 6f 61 64 41 73 73 65 6d 62 6c 79   tryLoadAssembly
2d550 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
2d560 69 74 65 2e 64 6c 6c 20 24 61 72 63 68 69 74 65  ite.dll $archite
2d570 63 74 75 72 65 0d 0a 20 20 20 20 20 20 20 20 20  cture..         
2d580 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
2d590 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
2d5a0 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d   }..        }...
2d5b0 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68  .        foreach
2d5c0 20 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 24 6e   fileNameOnly $n
2d5d0 61 74 69 76 65 46 69 6c 65 4e 61 6d 65 73 20 7b  ativeFileNames {
2d5e0 0d 0a 20 20 20 20 20 20 20 20 20 20 63 61 74 63  ..          catc
2d5f0 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  h {..           
2d600 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
2d610 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
2d620 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
2d630 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65        "---- file
2d640 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22 22 20   version of \"" 
2d650 6e 61 74 69 76 65 2f 20 24 66 69 6c 65 4e 61 6d  native/ $fileNam
2d660 65 4f 6e 6c 79 20 5c 0d 0a 20 20 20 20 20 20 20  eOnly \..       
2d670 20 20 20 20 20 20 20 20 20 22 5c 22 2e 2e 2e 20           "\"... 
2d680 5c 22 22 20 5b 66 69 6c 65 20 76 65 72 73 69 6f  \"" [file versio
2d690 6e 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65  n [getBinaryFile
2d6a0 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  Name \..        
2d6b0 20 20 20 20 20 20 20 20 24 66 69 6c 65 4e 61 6d          $fileNam
2d6c0 65 4f 6e 6c 79 5d 5d 20 5c 22 5c 6e 5d 0d 0a 20  eOnly]] \"\n].. 
2d6d0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
2d6e0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
2d6f0 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d   foreach fileNam
2d700 65 4f 6e 6c 79 20 24 6d 69 78 65 64 46 69 6c 65  eOnly $mixedFile
2d710 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20  Names {..       
2d720 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20     catch {..    
2d730 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
2d740 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
2d750 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
2d760 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
2d770 2d 2d 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 20  -- file version 
2d780 6f 66 20 5c 22 22 20 6d 69 78 65 64 2f 20 24 66  of \"" mixed/ $f
2d790 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 5c 0d 0a 20  ileNameOnly \.. 
2d7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
2d7b0 5c 22 2e 2e 2e 20 5c 22 22 20 5b 66 69 6c 65 20  \"... \"" [file 
2d7c0 76 65 72 73 69 6f 6e 20 5b 67 65 74 42 69 6e 61  version [getBina
2d7d0 72 79 46 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20  ryFileName \..  
2d7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24 66                $f
2d7f0 69 6c 65 4e 61 6d 65 4f 6e 6c 79 5d 5d 20 5c 22  ileNameOnly]] \"
2d800 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  \n]..          }
2d810 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
2d820 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66         foreach f
2d830 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 24 6d 61 6e  ileNameOnly $man
2d840 61 67 65 64 46 69 6c 65 4e 61 6d 65 73 20 7b 0d  agedFileNames {.
2d850 0a 20 20 20 20 20 20 20 20 20 20 63 61 74 63 68  .          catch
2d860 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
2d870 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
2d880 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
2d890 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
2d8a0 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20       "---- file 
2d8b0 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22 22 20 6d  version of \"" m
2d8c0 61 6e 61 67 65 64 2f 20 24 66 69 6c 65 4e 61 6d  anaged/ $fileNam
2d8d0 65 4f 6e 6c 79 20 5c 0d 0a 20 20 20 20 20 20 20  eOnly \..       
2d8e0 20 20 20 20 20 20 20 20 20 22 5c 22 2e 2e 2e 20           "\"... 
2d8f0 5c 22 22 20 5b 66 69 6c 65 20 76 65 72 73 69 6f  \"" [file versio
2d900 6e 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65  n [getBinaryFile
2d910 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  Name \..        
2d920 20 20 20 20 20 20 20 20 24 66 69 6c 65 4e 61 6d          $fileNam
2d930 65 4f 6e 6c 79 5d 5d 20 5c 22 5c 6e 5d 0d 0a 20  eOnly]] \"\n].. 
2d940 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
2d950 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
2d960 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
2d970 67 74 68 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3e  gth $platform] >
2d980 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
2d990 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69        foreach fi
2d9a0 6c 65 4e 61 6d 65 4f 6e 6c 79 20 24 6e 61 74 69  leNameOnly $nati
2d9b0 76 65 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20  veFileNames {.. 
2d9c0 20 20 20 20 20 20 20 20 20 20 20 63 61 74 63 68             catch
2d9d0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
2d9e0 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
2d9f0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
2da00 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
2da10 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66           "---- f
2da20 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c  ile version of \
2da30 22 22 20 6e 61 74 69 76 65 2f 70 6c 61 74 66 6f  "" native/platfo
2da40 72 6d 2f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rm/ \..         
2da50 20 20 20 20 20 20 20 20 20 24 70 6c 61 74 66 6f           $platfo
2da60 72 6d 20 2f 20 24 66 69 6c 65 4e 61 6d 65 4f 6e  rm / $fileNameOn
2da70 6c 79 20 22 5c 22 2e 2e 2e 20 5c 22 22 20 5b 66  ly "\"... \"" [f
2da80 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ile \..         
2da90 20 20 20 20 20 20 20 20 20 76 65 72 73 69 6f 6e           version
2daa0 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e   [getBinaryFileN
2dab0 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c  ame $fileNameOnl
2dac0 79 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  y \..           
2dad0 20 20 20 20 20 20 20 24 70 6c 61 74 66 6f 72 6d         $platform
2dae0 5d 5d 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20  ]] \"\n]..      
2daf0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
2db00 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
2db10 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61    foreach fileNa
2db20 6d 65 4f 6e 6c 79 20 24 6d 69 78 65 64 46 69 6c  meOnly $mixedFil
2db30 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20  eNames {..      
2db40 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20        catch {.. 
2db50 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
2db60 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
2db70 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
2db80 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2db90 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76      "---- file v
2dba0 65 72 73 69 6f 6e 20 6f 66 20 5c 22 22 20 6d 69  ersion of \"" mi
2dbb0 78 65 64 2f 70 6c 61 74 66 6f 72 6d 2f 20 5c 0d  xed/platform/ \.
2dbc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2dbd0 20 20 20 24 70 6c 61 74 66 6f 72 6d 20 2f 20 24     $platform / $
2dbe0 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 22 5c 22  fileNameOnly "\"
2dbf0 2e 2e 2e 20 5c 22 22 20 5b 66 69 6c 65 20 5c 0d  ... \"" [file \.
2dc00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2dc10 20 20 20 76 65 72 73 69 6f 6e 20 5b 67 65 74 42     version [getB
2dc20 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 24 66  inaryFileName $f
2dc30 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 5c 0d 0a 20  ileNameOnly \.. 
2dc40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dc50 20 24 70 6c 61 74 66 6f 72 6d 5d 5d 20 5c 22 5c   $platform]] \"\
2dc60 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  n]..            
2dc70 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  }..          }..
2dc80 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
2dc90 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
2dca0 20 6c 65 6e 67 74 68 20 24 61 72 63 68 69 74 65   length $archite
2dcb0 63 74 75 72 65 5d 20 3e 20 30 7d 20 74 68 65 6e  cture] > 0} then
2dcc0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 66 6f   {..          fo
2dcd0 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 4f 6e  reach fileNameOn
2dce0 6c 79 20 24 6e 61 74 69 76 65 46 69 6c 65 4e 61  ly $nativeFileNa
2dcf0 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  mes {..         
2dd00 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20     catch {..    
2dd10 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
2dd20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
2dd30 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
2dd40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dd50 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73   "---- file vers
2dd60 69 6f 6e 20 6f 66 20 5c 22 22 20 6e 61 74 69 76  ion of \"" nativ
2dd70 65 2f 61 72 63 68 69 74 65 63 74 75 72 65 2f 20  e/architecture/ 
2dd80 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
2dd90 20 20 20 20 20 24 61 72 63 68 69 74 65 63 74 75       $architectu
2dda0 72 65 20 2f 20 24 66 69 6c 65 4e 61 6d 65 4f 6e  re / $fileNameOn
2ddb0 6c 79 20 22 5c 22 2e 2e 2e 20 5c 22 22 20 5b 66  ly "\"... \"" [f
2ddc0 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ile \..         
2ddd0 20 20 20 20 20 20 20 20 20 76 65 72 73 69 6f 6e           version
2dde0 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e   [getBinaryFileN
2ddf0 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c  ame $fileNameOnl
2de00 79 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  y \..           
2de10 20 20 20 20 20 20 20 24 61 72 63 68 69 74 65 63         $architec
2de20 74 75 72 65 5d 5d 20 5c 22 5c 6e 5d 0d 0a 20 20  ture]] \"\n]..  
2de30 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
2de40 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
2de50 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69        foreach fi
2de60 6c 65 4e 61 6d 65 4f 6e 6c 79 20 24 6d 69 78 65  leNameOnly $mixe
2de70 64 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20  dFileNames {..  
2de80 20 20 20 20 20 20 20 20 20 20 63 61 74 63 68 20            catch 
2de90 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
2dea0 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
2deb0 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
2dec0 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
2ded0 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69          "---- fi
2dee0 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22  le version of \"
2def0 22 20 6d 69 78 65 64 2f 61 72 63 68 69 74 65 63  " mixed/architec
2df00 74 75 72 65 2f 20 5c 0d 0a 20 20 20 20 20 20 20  ture/ \..       
2df10 20 20 20 20 20 20 20 20 20 20 20 24 61 72 63 68             $arch
2df20 69 74 65 63 74 75 72 65 20 2f 20 24 66 69 6c 65  itecture / $file
2df30 4e 61 6d 65 4f 6e 6c 79 20 22 5c 22 2e 2e 2e 20  NameOnly "\"... 
2df40 5c 22 22 20 5b 66 69 6c 65 20 5c 0d 0a 20 20 20  \"" [file \..   
2df50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 76                 v
2df60 65 72 73 69 6f 6e 20 5b 67 65 74 42 69 6e 61 72  ersion [getBinar
2df70 79 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e  yFileName $fileN
2df80 61 6d 65 4f 6e 6c 79 20 5c 0d 0a 20 20 20 20 20  ameOnly \..     
2df90 20 20 20 20 20 20 20 20 20 20 20 20 20 24 61 72               $ar
2dfa0 63 68 69 74 65 63 74 75 72 65 5d 5d 20 5c 22 5c  chitecture]] \"\
2dfb0 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  n]..            
2dfc0 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  }..          }..
2dfd0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
2dfe0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
2dff0 23 20 4e 4f 54 45 3a 20 47 72 61 62 20 74 68 65  # NOTE: Grab the
2e000 20 6c 69 73 74 20 6f 66 20 6d 61 6e 61 67 65 64   list of managed
2e010 20 61 73 73 65 6d 62 6c 69 65 73 20 66 6f 72 20   assemblies for 
2e020 74 68 65 20 63 75 72 72 65 6e 74 20 70 72 6f 63  the current proc
2e030 65 73 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ess..        #  
2e040 20 20 20 20 20 61 6e 64 20 72 65 70 6f 72 74 20       and report 
2e050 6f 6e 20 74 68 65 20 53 79 73 74 65 6d 2e 44 61  on the System.Da
2e060 74 61 2e 53 51 4c 69 74 65 20 72 65 6c 61 74 65  ta.SQLite relate
2e070 64 20 6f 6e 65 73 2e 0d 0a 20 20 20 20 20 20 20  d ones...       
2e080 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   #..        if {
2e090 5b 68 61 76 65 53 51 4c 69 74 65 4f 62 6a 65 63  [haveSQLiteObjec
2e0a0 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65 6e 20  tCommand]} then 
2e0b0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  {..          if 
2e0c0 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
2e0d0 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e         object in
2e0e0 76 6f 6b 65 20 55 74 69 6c 69 74 79 20 47 65 74  voke Utility Get
2e0f0 41 73 73 65 6d 62 6c 69 65 73 0d 0a 20 20 20 20  Assemblies..    
2e100 20 20 20 20 20 20 7d 20 61 73 73 65 6d 62 6c 69        } assembli
2e110 65 73 5d 20 3d 3d 20 30 20 7c 7c 20 5b 63 61 74  es] == 0 || [cat
2e120 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
2e130 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20    object invoke 
2e140 41 70 70 44 6f 6d 61 69 6e 2e 43 75 72 72 65 6e  AppDomain.Curren
2e150 74 44 6f 6d 61 69 6e 20 47 65 74 41 73 73 65 6d  tDomain GetAssem
2e160 62 6c 69 65 73 0d 0a 20 20 20 20 20 20 20 20 20  blies..         
2e170 20 7d 20 61 73 73 65 6d 62 6c 69 65 73 5d 20 3d   } assemblies] =
2e180 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
2e190 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20           object 
2e1a0 66 6f 72 65 61 63 68 20 61 73 73 65 6d 62 6c 79  foreach assembly
2e1b0 20 24 61 73 73 65 6d 62 6c 69 65 73 20 7b 0d 0a   $assemblies {..
2e1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
2e1d0 20 7b 5b 73 74 72 69 6e 67 20 6d 61 74 63 68 20   {[string match 
2e1e0 5c 7b 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  \{System.Data.SQ
2e1f0 4c 69 74 65 2a 20 24 61 73 73 65 6d 62 6c 79 5d  Lite* $assembly]
2e200 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
2e210 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
2e220 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
2e230 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
2e240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e250 20 20 20 22 2d 2d 2d 2d 20 66 6f 75 6e 64 20 6c     "---- found l
2e260 6f 61 64 65 64 20 61 73 73 65 6d 62 6c 79 3a 20  oaded assembly: 
2e270 22 20 24 61 73 73 65 6d 62 6c 79 20 5c 6e 5d 0d  " $assembly \n].
2e280 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
2e290 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
2e2a0 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
2e2b0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
2e2c0 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20     catch {..    
2e2d0 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
2e2e0 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20  est_channel \.. 
2e2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
2e300 2d 2d 20 64 65 66 69 6e 65 20 63 6f 6e 73 74 61  -- define consta
2e310 6e 74 73 20 66 6f 72 20 5c 22 53 79 73 74 65 6d  nts for \"System
2e320 2e 44 61 74 61 2e 53 51 4c 69 74 65 5c 22 2e 2e  .Data.SQLite\"..
2e330 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  . "....         
2e340 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
2e350 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63             objec
2e360 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20  t invoke -flags 
2e370 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20  +NonPublic \..  
2e380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79                Sy
2e390 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
2e3a0 2e 53 51 4c 69 74 65 33 20 44 65 66 69 6e 65 43  .SQLite3 DefineC
2e3b0 6f 6e 73 74 61 6e 74 73 0d 0a 20 20 20 20 20 20  onstants..      
2e3c0 20 20 20 20 7d 20 64 65 66 69 6e 65 43 6f 6e 73      } defineCons
2e3d0 74 61 6e 74 73 5d 20 3d 3d 20 30 7d 20 74 68 65  tants] == 0} the
2e3e0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
2e3f0 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
2e400 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
2e410 67 73 20 5b 66 6f 72 6d 61 74 4c 69 73 74 20 5b  gs [formatList [
2e420 6c 73 6f 72 74 20 5c 0d 0a 20 20 20 20 20 20 20  lsort \..       
2e430 20 20 20 20 20 20 20 20 20 24 64 65 66 69 6e 65           $define
2e440 43 6f 6e 73 74 61 6e 74 73 5d 20 3c 6e 6f 6e 65  Constants] <none
2e450 3e 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  >] \n]..        
2e460 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
2e470 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
2e480 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 75 6e  :test_channel un
2e490 6b 6e 6f 77 6e 5c 6e 0d 0a 20 20 20 20 20 20 20  known\n..       
2e4a0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
2e4b0 0a 0d 0a 20 20 20 20 20 20 20 20 63 61 74 63 68  ...        catch
2e4c0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70   {..          tp
2e4d0 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
2e4e0 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  nel \..         
2e4f0 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6f 75 72 63       "---- sourc
2e500 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22 53  e version of \"S
2e510 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
2e520 65 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 0d 0a 0d 0a  e.dll\"... "....
2e530 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63            if {[c
2e540 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
2e550 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b      object invok
2e560 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62  e -flags +NonPub
2e570 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  lic \..         
2e580 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61         System.Da
2e590 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65  ta.SQLite.SQLite
2e5a0 43 6f 6e 6e 65 63 74 69 6f 6e 20 50 72 6f 76 69  Connection Provi
2e5b0 64 65 72 56 65 72 73 69 6f 6e 0d 0a 20 20 20 20  derVersion..    
2e5c0 20 20 20 20 20 20 7d 20 76 65 72 73 69 6f 6e 5d        } version]
2e5d0 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
2e5e0 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b             if {[
2e5f0 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76  string length $v
2e600 65 72 73 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68  ersion] == 0} th
2e610 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
2e620 20 20 20 20 73 65 74 20 76 65 72 73 69 6f 6e 20      set version 
2e630 6e 75 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20 20  null..          
2e640 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
2e650 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
2e660 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
2e670 67 73 20 24 76 65 72 73 69 6f 6e 20 5c 6e 5d 0d  gs $version \n].
2e680 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73  .          } els
2e690 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e {..           
2e6a0 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
2e6b0 68 61 6e 6e 65 6c 20 75 6e 6b 6e 6f 77 6e 5c 6e  hannel unknown\n
2e6c0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
2e6d0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
2e6e0 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20      catch {..   
2e6f0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
2e700 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a  test_channel \..
2e710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
2e720 2d 2d 2d 20 73 6f 75 72 63 65 20 63 68 65 63 6b  --- source check
2e730 6f 75 74 20 6f 66 20 5c 22 53 79 73 74 65 6d 2e  out of \"System.
2e740 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 5c  Data.SQLite.dll\
2e750 22 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20  "... "....      
2e760 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
2e770 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 62  ..            ob
2e780 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61  ject invoke -fla
2e790 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d  gs +NonPublic \.
2e7a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2e7b0 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
2e7c0 69 74 65 2e 53 51 4c 69 74 65 43 6f 6e 6e 65 63  ite.SQLiteConnec
2e7d0 74 69 6f 6e 20 50 72 6f 76 69 64 65 72 53 6f 75  tion ProviderSou
2e7e0 72 63 65 49 64 0d 0a 20 20 20 20 20 20 20 20 20  rceId..         
2e7f0 20 7d 20 73 6f 75 72 63 65 49 64 5d 20 3d 3d 20   } sourceId] == 
2e800 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
2e810 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69         if {[stri
2e820 6e 67 20 6c 65 6e 67 74 68 20 24 73 6f 75 72 63  ng length $sourc
2e830 65 49 64 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  eId] == 0} then 
2e840 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
2e850 20 73 65 74 20 73 6f 75 72 63 65 49 64 20 6e 75   set sourceId nu
2e860 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ll..            
2e870 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  }..            t
2e880 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
2e890 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
2e8a0 20 24 73 6f 75 72 63 65 49 64 20 5c 6e 5d 0d 0a   $sourceId \n]..
2e8b0 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
2e8c0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
2e8d0 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
2e8e0 61 6e 6e 65 6c 20 75 6e 6b 6e 6f 77 6e 5c 6e 0d  annel unknown\n.
2e8f0 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
2e900 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
2e910 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
2e920 4e 4f 54 45 3a 20 52 65 73 65 74 20 63 61 63 68  NOTE: Reset cach
2e930 65 64 20 22 62 72 65 61 6b 20 69 6e 74 6f 20 64  ed "break into d
2e940 65 62 75 67 67 65 72 22 20 73 65 74 74 69 6e 67  ebugger" setting
2e950 20 73 6f 20 74 68 61 74 20 69 74 20 63 61 6e 20   so that it can 
2e960 62 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  be..        #   
2e970 20 20 20 20 75 73 65 64 20 64 75 72 69 6e 67 20      used during 
2e980 74 68 65 20 74 65 73 74 20 66 69 6c 65 2c 20 69  the test file, i
2e990 66 20 6e 65 65 64 65 64 2e 0d 0a 20 20 20 20 20  f needed...     
2e9a0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66     #..        if
2e9b0 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
2e9c0 3a 3a 6e 6f 28 72 65 73 65 74 42 72 65 61 6b 49  ::no(resetBreakI
2e9d0 6e 74 6f 44 65 62 75 67 67 65 72 29 5d 20 26 26  ntoDebugger)] &&
2e9e0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
2e9f0 5b 68 61 76 65 53 51 4c 69 74 65 4f 62 6a 65 63  [haveSQLiteObjec
2ea00 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65 6e 20  tCommand]} then 
2ea10 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  {..          if 
2ea20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
2ea30 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e         object in
2ea40 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e  voke -flags +Non
2ea50 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20  Public \..      
2ea60 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d            System
2ea70 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 48 65 6c  .Data.SQLite.Hel
2ea80 70 65 72 4d 65 74 68 6f 64 73 20 52 65 73 65 74  perMethods Reset
2ea90 42 72 65 61 6b 49 6e 74 6f 44 65 62 75 67 67 65  BreakIntoDebugge
2eaa0 72 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 72  r..          } r
2eab0 65 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65  esult] == 0} the
2eac0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
2ead0 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
2eae0 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
2eaf0 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
2eb00 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 61 6c 6c        "---- call
2eb10 20 52 65 73 65 74 42 72 65 61 6b 49 6e 74 6f 44   ResetBreakIntoD
2eb20 65 62 75 67 67 65 72 28 29 2e 2e 2e 20 6f 6b 5c  ebugger()... ok\
2eb30 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  n"]..          }
2eb40 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
2eb50 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
2eb60 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
2eb70 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
2eb80 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
2eb90 63 61 6c 6c 20 52 65 73 65 74 42 72 65 61 6b 49  call ResetBreakI
2eba0 6e 74 6f 44 65 62 75 67 67 65 72 28 29 2e 2e 2e  ntoDebugger()...
2ebb0 20 65 72 72 6f 72 3a 20 22 20 5c 0d 0a 20 20 20   error: " \..   
2ebc0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 6e 5c               \n\
2ebd0 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20  t $result \n].. 
2ebe0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
2ebf0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
2ec00 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
2ec10 54 45 3a 20 43 68 65 63 6b 20 74 68 65 20 61 76  TE: Check the av
2ec20 61 69 6c 61 62 6c 65 20 62 75 69 6c 64 73 20 28  ailable builds (
2ec30 61 6e 64 20 22 72 65 6c 65 61 73 65 73 22 29 20  and "releases") 
2ec40 6f 66 20 53 51 4c 69 74 65 20 61 6e 64 0d 0a 20  of SQLite and.. 
2ec50 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 53         #       S
2ec60 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
2ec70 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  e...        #.. 
2ec80 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53         checkForS
2ec90 51 4c 69 74 65 42 75 69 6c 64 73 20 24 3a 3a 74  QLiteBuilds $::t
2eca0 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 20 20 20  est_channel..   
2ecb0 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51 4c       checkForSQL
2ecc0 69 74 65 52 65 6c 65 61 73 65 73 20 24 3a 3a 74  iteReleases $::t
2ecd0 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20  est_channel.... 
2ece0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
2ecf0 20 20 23 20 4e 4f 54 45 3a 20 4e 6f 77 2c 20 77    # NOTE: Now, w
2ed00 65 20 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20 69  e need to know i
2ed10 66 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72  f the SQLite cor
2ed20 65 20 6c 69 62 72 61 72 79 20 69 73 20 61 76 61  e library is ava
2ed30 69 6c 61 62 6c 65 0d 0a 20 20 20 20 20 20 20 20  ilable..        
2ed40 23 20 20 20 20 20 20 20 28 69 2e 65 2e 20 62 65  #       (i.e. be
2ed50 63 61 75 73 65 20 74 68 65 20 6d 61 6e 61 67 65  cause the manage
2ed60 64 2d 6f 6e 6c 79 20 53 79 73 74 65 6d 2e 44 61  d-only System.Da
2ed70 74 61 2e 53 51 4c 69 74 65 20 61 73 73 65 6d 62  ta.SQLite assemb
2ed80 6c 79 20 63 61 6e 0d 0a 20 20 20 20 20 20 20 20  ly can..        
2ed90 23 20 20 20 20 20 20 20 6c 6f 61 64 20 77 69 74  #       load wit
2eda0 68 6f 75 74 20 69 74 3b 20 68 6f 77 65 76 65 72  hout it; however
2edb0 2c 20 69 74 20 63 61 6e 6e 6f 74 20 64 6f 20 61  , it cannot do a
2edc0 6e 79 74 68 69 6e 67 20 75 73 65 66 75 6c 20 77  nything useful w
2edd0 69 74 68 6f 75 74 0d 0a 20 20 20 20 20 20 20 20  ithout..        
2ede0 23 20 20 20 20 20 20 20 69 74 29 2e 20 20 49 66  #       it).  If
2edf0 20 77 65 20 61 72 65 20 75 73 69 6e 67 20 74 68   we are using th
2ee00 65 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73  e mixed-mode ass
2ee10 65 6d 62 6c 79 20 61 6e 64 20 77 65 20 61 6c 72  embly and we alr
2ee20 65 61 64 79 0d 0a 20 20 20 20 20 20 20 20 23 20  eady..        # 
2ee30 20 20 20 20 20 20 66 6f 75 6e 64 20 69 74 20 28        found it (
2ee40 61 62 6f 76 65 29 2c 20 74 68 69 73 20 73 68 6f  above), this sho
2ee50 75 6c 64 20 61 6c 77 61 79 73 20 73 75 63 63 65  uld always succe
2ee60 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ed...        #..
2ee70 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72          checkFor
2ee80 53 51 4c 69 74 65 4c 69 62 72 61 72 79 20 24 3a  SQLiteLibrary $:
2ee90 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d  :test_channel...
2eea0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
2eeb0 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63      # NOTE: Chec
2eec0 6b 20 69 66 20 74 68 65 20 53 51 4c 69 74 65 20  k if the SQLite 
2eed0 69 6e 74 65 72 6f 70 20 61 73 73 65 6d 62 6c 79  interop assembly
2eee0 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0a   is available...
2eef0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
2ef00 20 20 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74     checkForSQLit
2ef10 65 49 6e 74 65 72 6f 70 20 24 3a 3a 74 65 73 74  eInterop $::test
2ef20 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20  _channel....    
2ef30 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
2ef40 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 74 68 65   NOTE: Check the
2ef50 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65   SQLite database
2ef60 20 61 6e 64 20 74 65 6d 70 6f 72 61 72 79 20 64   and temporary d
2ef70 69 72 65 63 74 6f 72 69 65 73 2e 0d 0a 20 20 20  irectories...   
2ef80 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
2ef90 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 44 69  checkForSQLiteDi
2efa0 72 65 63 74 6f 72 69 65 73 20 24 3a 3a 74 65 73  rectories $::tes
2efb0 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20  t_channel....   
2efc0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
2efd0 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20  # NOTE: Attempt 
2efe0 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20  to determine if 
2eff0 76 61 72 69 6f 75 73 20 63 6f 6d 70 69 6c 65 2d  various compile-
2f000 74 69 6d 65 20 6f 70 74 69 6f 6e 73 20 6e 65 65  time options nee
2f010 64 65 64 20 66 6f 72 0d 0a 20 20 20 20 20 20 20  ded for..       
2f020 20 23 20 20 20 20 20 20 20 74 65 73 74 20 63 6f   #       test co
2f030 6e 73 74 72 61 69 6e 74 73 20 77 65 72 65 20 65  nstraints were e
2f040 6e 61 62 6c 65 64 20 66 6f 72 20 74 68 65 20 6d  nabled for the m
2f050 61 6e 61 67 65 64 20 61 73 73 65 6d 62 6c 79 2e  anaged assembly.
2f060 20 20 54 68 65 72 65 0d 0a 20 20 20 20 20 20 20    There..       
2f070 20 23 20 20 20 20 20 20 20 61 72 65 20 73 6f 6d   #       are som
2f080 65 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f  e compile-time o
2f090 70 74 69 6f 6e 73 20 74 68 61 74 20 6d 75 73 74  ptions that must
2f0a0 20 61 6c 73 6f 20 68 61 76 65 20 62 65 65 6e 20   also have been 
2f0b0 65 6e 61 62 6c 65 64 0d 0a 20 20 20 20 20 20 20  enabled..       
2f0c0 20 23 20 20 20 20 20 20 20 66 6f 72 20 74 68 65   #       for the
2f0d0 20 69 6e 74 65 72 6f 70 20 61 73 73 65 6d 62 6c   interop assembl
2f0e0 79 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 65  y in order to be
2f0f0 20 65 66 66 65 63 74 69 76 65 2e 20 20 46 6f 72   effective.  For
2f100 20 74 68 6f 73 65 0d 0a 20 20 20 20 20 20 20 20   those..        
2f110 23 20 20 20 20 20 20 20 6f 70 74 69 6f 6e 73 2c  #       options,
2f120 20 69 74 20 77 69 6c 6c 20 62 65 20 61 73 73 75   it will be assu
2f130 6d 65 64 20 74 68 61 74 20 69 74 20 77 61 73 20  med that it was 
2f140 65 6e 61 62 6c 65 64 20 66 6f 72 20 74 68 65 20  enabled for the 
2f150 69 6e 74 65 72 6f 70 0d 0a 20 20 20 20 20 20 20  interop..       
2f160 20 23 20 20 20 20 20 20 20 61 73 73 65 6d 62 6c   #       assembl
2f170 79 20 69 66 20 69 74 20 77 61 73 20 65 6e 61 62  y if it was enab
2f180 6c 65 64 20 66 6f 72 20 74 68 65 20 6d 61 6e 61  led for the mana
2f190 67 65 64 20 61 73 73 65 6d 62 6c 79 2e 0d 0a 20  ged assembly... 
2f1a0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
2f1b0 20 20 66 6f 72 65 61 63 68 20 64 65 66 69 6e 65    foreach define
2f1c0 43 6f 6e 73 74 61 6e 74 20 5b 6c 69 73 74 20 5c  Constant [list \
2f1d0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 43 48  ..            CH
2f1e0 45 43 4b 5f 53 54 41 54 45 20 43 4f 55 4e 54 5f  ECK_STATE COUNT_
2f1f0 48 41 4e 44 4c 45 20 44 45 42 55 47 20 49 4e 54  HANDLE DEBUG INT
2f200 45 52 4f 50 5f 43 4f 44 45 43 20 49 4e 54 45 52  EROP_CODEC INTER
2f210 4f 50 5f 44 45 42 55 47 20 5c 0d 0a 20 20 20 20  OP_DEBUG \..    
2f220 20 20 20 20 20 20 20 20 49 4e 54 45 52 4f 50 5f          INTEROP_
2f230 45 58 54 45 4e 53 49 4f 4e 5f 46 55 4e 43 54 49  EXTENSION_FUNCTI
2f240 4f 4e 53 20 49 4e 54 45 52 4f 50 5f 46 54 53 35  ONS INTEROP_FTS5
2f250 5f 45 58 54 45 4e 53 49 4f 4e 20 5c 0d 0a 20 20  _EXTENSION \..  
2f260 20 20 20 20 20 20 20 20 20 20 49 4e 54 45 52 4f            INTERO
2f270 50 5f 49 4e 43 4c 55 44 45 5f 43 45 52 4f 44 20  P_INCLUDE_CEROD 
2f280 49 4e 54 45 52 4f 50 5f 49 4e 43 4c 55 44 45 5f  INTEROP_INCLUDE_
2f290 45 58 54 52 41 20 49 4e 54 45 52 4f 50 5f 49 4e  EXTRA INTEROP_IN
2f2a0 43 4c 55 44 45 5f 53 45 45 20 5c 0d 0a 20 20 20  CLUDE_SEE \..   
2f2b0 20 20 20 20 20 20 20 20 20 49 4e 54 45 52 4f 50           INTEROP
2f2c0 5f 49 4e 43 4c 55 44 45 5f 5a 49 50 56 46 53 20  _INCLUDE_ZIPVFS 
2f2d0 49 4e 54 45 52 4f 50 5f 4a 53 4f 4e 31 5f 45 58  INTEROP_JSON1_EX
2f2e0 54 45 4e 53 49 4f 4e 20 5c 0d 0a 20 20 20 20 20  TENSION \..     
2f2f0 20 20 20 20 20 20 20 49 4e 54 45 52 4f 50 5f 4c         INTEROP_L
2f300 45 47 41 43 59 5f 43 4c 4f 53 45 20 49 4e 54 45  EGACY_CLOSE INTE
2f310 52 4f 50 5f 4c 4f 47 20 49 4e 54 45 52 4f 50 5f  ROP_LOG INTEROP_
2f320 50 45 52 43 45 4e 54 49 4c 45 5f 45 58 54 45 4e  PERCENTILE_EXTEN
2f330 53 49 4f 4e 20 5c 0d 0a 20 20 20 20 20 20 20 20  SION \..        
2f340 20 20 20 20 49 4e 54 45 52 4f 50 5f 52 45 47 45      INTEROP_REGE
2f350 58 50 5f 45 58 54 45 4e 53 49 4f 4e 20 49 4e 54  XP_EXTENSION INT
2f360 45 52 4f 50 5f 53 45 53 53 49 4f 4e 5f 45 58 54  EROP_SESSION_EXT
2f370 45 4e 53 49 4f 4e 20 5c 0d 0a 20 20 20 20 20 20  ENSION \..      
2f380 20 20 20 20 20 20 49 4e 54 45 52 4f 50 5f 53 48        INTEROP_SH
2f390 41 31 5f 45 58 54 45 4e 53 49 4f 4e 20 49 4e 54  A1_EXTENSION INT
2f3a0 45 52 4f 50 5f 54 45 53 54 5f 45 58 54 45 4e 53  EROP_TEST_EXTENS
2f3b0 49 4f 4e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ION \..         
2f3c0 20 20 20 49 4e 54 45 52 4f 50 5f 54 4f 54 59 50     INTEROP_TOTYP
2f3d0 45 5f 45 58 54 45 4e 53 49 4f 4e 20 49 4e 54 45  E_EXTENSION INTE
2f3e0 52 4f 50 5f 56 49 52 54 55 41 4c 5f 54 41 42 4c  ROP_VIRTUAL_TABL
2f3f0 45 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  E \..           
2f400 20 4e 45 54 5f 32 30 20 4e 45 54 5f 33 35 20 4e   NET_20 NET_35 N
2f410 45 54 5f 34 30 20 4e 45 54 5f 34 35 20 4e 45 54  ET_40 NET_45 NET
2f420 5f 34 35 31 20 4e 45 54 5f 34 35 32 20 4e 45 54  _451 NET_452 NET
2f430 5f 34 36 20 4e 45 54 5f 34 36 31 20 5c 0d 0a 20  _46 NET_461 \.. 
2f440 20 20 20 20 20 20 20 20 20 20 20 4e 45 54 5f 34             NET_4
2f450 36 32 20 4e 45 54 5f 34 37 20 4e 45 54 5f 34 37  62 NET_47 NET_47
2f460 31 20 4e 45 54 5f 34 37 32 20 4e 45 54 5f 43 4f  1 NET_472 NET_CO
2f470 4d 50 41 43 54 5f 32 30 20 4e 45 54 5f 53 54 41  MPACT_20 NET_STA
2f480 4e 44 41 52 44 5f 32 30 20 5c 0d 0a 20 20 20 20  NDARD_20 \..    
2f490 20 20 20 20 20 20 20 20 50 4c 41 54 46 4f 52 4d          PLATFORM
2f4a0 5f 43 4f 4d 50 41 43 54 46 52 41 4d 45 57 4f 52  _COMPACTFRAMEWOR
2f4b0 4b 20 50 52 45 4c 4f 41 44 5f 4e 41 54 49 56 45  K PRELOAD_NATIVE
2f4c0 5f 4c 49 42 52 41 52 59 20 52 45 54 41 52 47 45  _LIBRARY RETARGE
2f4d0 54 41 42 4c 45 20 5c 0d 0a 20 20 20 20 20 20 20  TABLE \..       
2f4e0 20 20 20 20 20 53 51 4c 49 54 45 5f 53 54 41 4e       SQLITE_STAN
2f4f0 44 41 52 44 20 54 48 52 4f 57 5f 4f 4e 5f 44 49  DARD THROW_ON_DI
2f500 53 50 4f 53 45 44 20 54 52 41 43 45 20 54 52 41  SPOSED TRACE TRA
2f510 43 45 5f 43 4f 4e 4e 45 43 54 49 4f 4e 20 5c 0d  CE_CONNECTION \.
2f520 0a 20 20 20 20 20 20 20 20 20 20 20 20 54 52 41  .            TRA
2f530 43 45 5f 44 45 54 45 43 54 49 4f 4e 20 54 52 41  CE_DETECTION TRA
2f540 43 45 5f 48 41 4e 44 4c 45 20 54 52 41 43 45 5f  CE_HANDLE TRACE_
2f550 50 52 45 4c 4f 41 44 20 54 52 41 43 45 5f 53 48  PRELOAD TRACE_SH
2f560 41 52 45 44 20 5c 0d 0a 20 20 20 20 20 20 20 20  ARED \..        
2f570 20 20 20 20 54 52 41 43 45 5f 53 54 41 54 45 4d      TRACE_STATEM
2f580 45 4e 54 20 54 52 41 43 45 5f 57 41 52 4e 49 4e  ENT TRACE_WARNIN
2f590 47 20 54 52 41 43 4b 5f 4d 45 4d 4f 52 59 5f 42  G TRACK_MEMORY_B
2f5a0 59 54 45 53 20 5c 0d 0a 20 20 20 20 20 20 20 20  YTES \..        
2f5b0 20 20 20 20 55 53 45 5f 45 4e 54 49 54 59 5f 46      USE_ENTITY_F
2f5c0 52 41 4d 45 57 4f 52 4b 5f 36 20 55 53 45 5f 49  RAMEWORK_6 USE_I
2f5d0 4e 54 45 52 4f 50 5f 44 4c 4c 20 55 53 45 5f 50  NTEROP_DLL USE_P
2f5e0 52 45 50 41 52 45 5f 56 32 20 57 49 4e 44 4f 57  REPARE_V2 WINDOW
2f5f0 53 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  S] {..          
2f600 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e  #..          # N
2f610 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20 74 68  OTE: Check if th
2f620 65 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f  e compile-time o
2f630 70 74 69 6f 6e 20 69 73 20 6c 69 73 74 65 64 20  ption is listed 
2f640 69 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 0d 0a  in the list of..
2f650 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
2f660 20 20 22 64 65 66 69 6e 65 20 63 6f 6e 73 74 61    "define consta
2f670 6e 74 73 22 20 6b 65 70 74 20 74 72 61 63 6b 20  nts" kept track 
2f680 6f 66 20 62 79 20 74 68 65 20 6d 61 6e 61 67 65  of by the manage
2f690 64 20 61 73 73 65 6d 62 6c 79 2e 0d 0a 20 20 20  d assembly...   
2f6a0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
2f6b0 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51 4c 69      checkForSQLi
2f6c0 74 65 44 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74  teDefineConstant
2f6d0 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
2f6e0 20 24 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74   $defineConstant
2f6f0 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
2f700 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
2f710 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70    # NOTE: Attemp
2f720 74 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69  t to determine i
2f730 66 20 76 61 72 69 6f 75 73 20 63 6f 6d 70 69 6c  f various compil
2f740 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 73 20 6e  e-time options n
2f750 65 65 64 65 64 20 66 6f 72 0d 0a 20 20 20 20 20  eeded for..     
2f760 20 20 20 23 20 20 20 20 20 20 20 74 65 73 74 20     #       test 
2f770 63 6f 6e 73 74 72 61 69 6e 74 73 20 77 65 72 65  constraints were
2f780 20 65 6e 61 62 6c 65 64 20 66 6f 72 20 74 68 65   enabled for the
2f790 20 69 6e 74 65 72 6f 70 20 61 73 73 65 6d 62 6c   interop assembl
2f7a0 79 20 61 6e 64 2f 6f 72 0d 0a 20 20 20 20 20 20  y and/or..      
2f7b0 20 20 23 20 20 20 20 20 20 20 66 6f 72 20 74 68    #       for th
2f7c0 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20 6c 69  e SQLite core li
2f7d0 62 72 61 72 79 2e 0d 0a 20 20 20 20 20 20 20 20  brary...        
2f7e0 23 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61  #..        forea
2f7f0 63 68 20 63 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e  ch compileOption
2f800 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20   [list \..      
2f810 20 20 20 20 20 20 43 4f 44 45 43 20 45 58 54 45        CODEC EXTE
2f820 4e 53 49 4f 4e 5f 46 55 4e 43 54 49 4f 4e 53 20  NSION_FUNCTIONS 
2f830 48 41 53 5f 43 4f 44 45 43 20 49 4e 43 4c 55 44  HAS_CODEC INCLUD
2f840 45 5f 43 45 52 4f 44 20 49 4e 43 4c 55 44 45 5f  E_CEROD INCLUDE_
2f850 45 58 54 52 41 20 5c 0d 0a 20 20 20 20 20 20 20  EXTRA \..       
2f860 20 20 20 20 20 49 4e 43 4c 55 44 45 5f 53 45 45       INCLUDE_SEE
2f870 20 49 4e 43 4c 55 44 45 5f 5a 49 50 56 46 53 20   INCLUDE_ZIPVFS 
2f880 4a 53 4f 4e 31 5f 45 58 54 45 4e 53 49 4f 4e 20  JSON1_EXTENSION 
2f890 4c 45 47 41 43 59 5f 43 4c 4f 53 45 20 4c 4f 47  LEGACY_CLOSE LOG
2f8a0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
2f8b0 50 45 52 43 45 4e 54 49 4c 45 5f 45 58 54 45 4e  PERCENTILE_EXTEN
2f8c0 53 49 4f 4e 20 52 45 47 45 58 50 5f 45 58 54 45  SION REGEXP_EXTE
2f8d0 4e 53 49 4f 4e 20 53 45 53 53 49 4f 4e 5f 45 58  NSION SESSION_EX
2f8e0 54 45 4e 53 49 4f 4e 20 5c 0d 0a 20 20 20 20 20  TENSION \..     
2f8f0 20 20 20 20 20 20 20 53 48 41 31 5f 45 58 54 45         SHA1_EXTE
2f900 4e 53 49 4f 4e 20 54 45 53 54 5f 45 58 54 45 4e  NSION TEST_EXTEN
2f910 53 49 4f 4e 20 54 4f 54 59 50 45 5f 45 58 54 45  SION TOTYPE_EXTE
2f920 4e 53 49 4f 4e 20 56 49 52 54 55 41 4c 5f 54 41  NSION VIRTUAL_TA
2f930 42 4c 45 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20  BLE] {..        
2f940 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23    #..          #
2f950 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20   NOTE: Check if 
2f960 74 68 65 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65  the compile-time
2f970 20 6f 70 74 69 6f 6e 20 69 73 20 6c 69 73 74 65   option is liste
2f980 64 20 69 6e 20 74 68 65 20 6c 69 73 74 0d 0a 20  d in the list.. 
2f990 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
2f9a0 20 6b 65 70 74 20 74 72 61 63 6b 20 6f 66 20 62   kept track of b
2f9b0 79 20 74 68 65 20 69 6e 74 65 72 6f 70 20 61 73  y the interop as
2f9c0 73 65 6d 62 6c 79 20 61 6e 64 2f 6f 72 20 74 68  sembly and/or th
2f9d0 65 20 53 51 4c 69 74 65 0d 0a 20 20 20 20 20 20  e SQLite..      
2f9e0 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 72 65      #       core
2f9f0 20 6c 69 62 72 61 72 79 2e 0d 0a 20 20 20 20 20   library...     
2fa00 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
2fa10 20 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65    checkForSQLite
2fa20 43 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 20 24 3a  CompileOption $:
2fa30 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 63  :test_channel $c
2fa40 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 0d 0a 20 20  ompileOption..  
2fa50 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
2fa60 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
2fa70 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20 74  NOTE: Check if t
2fa80 68 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  he System.Data.S
2fa90 51 4c 69 74 65 20 70 72 6f 76 69 64 65 72 20 77  QLite provider w
2faa0 61 73 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68  as compiled with
2fab0 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
2fac0 20 20 73 75 70 70 6f 72 74 20 66 6f 72 20 61 6e    support for an
2fad0 79 20 65 6e 63 72 79 70 74 65 64 20 64 61 74 61  y encrypted data
2fae0 62 61 73 65 73 2e 0d 0a 20 20 20 20 20 20 20 20  bases...        
2faf0 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  #..        if {[
2fb00 68 61 76 65 53 51 4c 69 74 65 44 65 66 69 6e 65  haveSQLiteDefine
2fb10 43 6f 6e 73 74 61 6e 74 20 49 4e 54 45 52 4f 50  Constant INTEROP
2fb20 5f 43 4f 44 45 43 5d 20 7c 7c 20 5c 0d 0a 20 20  _CODEC] || \..  
2fb30 20 20 20 20 20 20 20 20 20 20 5b 68 61 76 65 53            [haveS
2fb40 51 4c 69 74 65 44 65 66 69 6e 65 43 6f 6e 73 74  QLiteDefineConst
2fb50 61 6e 74 20 49 4e 54 45 52 4f 50 5f 49 4e 43 4c  ant INTEROP_INCL
2fb60 55 44 45 5f 53 45 45 5d 7d 20 74 68 65 6e 20 7b  UDE_SEE]} then {
2fb70 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
2fb80 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
2fb90 20 4e 6f 77 20 63 68 65 63 6b 20 69 66 20 74 68   Now check if th
2fba0 65 20 69 6e 74 65 72 6f 70 20 61 73 73 65 6d 62  e interop assemb
2fbb0 6c 79 20 77 61 73 20 61 6c 73 6f 20 63 6f 6d 70  ly was also comp
2fbc0 69 6c 65 64 20 77 69 74 68 0d 0a 20 20 20 20 20  iled with..     
2fbd0 20 20 20 20 20 23 20 20 20 20 20 20 20 73 75 70       #       sup
2fbe0 70 6f 72 74 20 66 6f 72 20 65 6e 63 72 79 70 74  port for encrypt
2fbf0 65 64 20 64 61 74 61 62 61 73 65 73 2e 0d 0a 20  ed databases... 
2fc00 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
2fc10 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65 53        if {[haveS
2fc20 51 4c 69 74 65 43 6f 6d 70 69 6c 65 4f 70 74 69  QLiteCompileOpti
2fc30 6f 6e 20 43 4f 44 45 43 5d 20 7c 7c 20 5c 0d 0a  on CODEC] || \..
2fc40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 68                [h
2fc50 61 76 65 53 51 4c 69 74 65 43 6f 6d 70 69 6c 65  aveSQLiteCompile
2fc60 4f 70 74 69 6f 6e 20 49 4e 43 4c 55 44 45 5f 53  Option INCLUDE_S
2fc70 45 45 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  EE]} then {..   
2fc80 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
2fc90 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
2fca0 46 69 6e 61 6c 6c 79 2c 20 63 68 65 63 6b 20 69  Finally, check i
2fcb0 66 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72  f the SQLite cor
2fcc0 65 20 6c 69 62 72 61 72 79 20 77 61 73 20 63 6f  e library was co
2fcd0 6d 70 69 6c 65 64 0d 0a 20 20 20 20 20 20 20 20  mpiled..        
2fce0 20 20 20 20 23 20 20 20 20 20 20 20 77 69 74 68      #       with
2fcf0 20 73 75 70 70 6f 72 74 20 66 6f 72 20 65 6e 63   support for enc
2fd00 72 79 70 74 65 64 20 64 61 74 61 62 61 73 65 73  rypted databases
2fd10 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  ...            #
2fd20 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
2fd30 20 7b 5b 68 61 76 65 53 51 4c 69 74 65 43 6f 6d   {[haveSQLiteCom
2fd40 70 69 6c 65 4f 70 74 69 6f 6e 20 48 41 53 5f 43  pileOption HAS_C
2fd50 4f 44 45 43 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  ODEC]} then {.. 
2fd60 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a               #..
2fd70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
2fd80 4e 4f 54 45 3a 20 59 65 73 2c 20 61 64 64 20 63  NOTE: Yes, add c
2fd90 6f 6e 73 74 72 61 69 6e 74 20 66 6f 72 20 75 73  onstraint for us
2fda0 65 20 62 79 20 74 68 65 20 74 65 73 74 20 73 75  e by the test su
2fdb0 69 74 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ite...          
2fdc0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
2fdd0 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
2fde0 6e 74 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  nt System.Data.S
2fdf0 51 4c 69 74 65 2e 45 6e 63 72 79 70 74 69 6f 6e  QLite.Encryption
2fe00 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
2fe10 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
2fe20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
2fe30 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
2fe40 4e 4f 54 45 3a 20 54 72 79 20 74 6f 20 73 65 74  NOTE: Try to set
2fe50 75 70 20 61 6e 20 69 6e 74 65 72 72 75 70 74 20  up an interrupt 
2fe60 63 61 6c 6c 62 61 63 6b 20 75 73 69 6e 67 20 74  callback using t
2fe70 68 65 20 73 63 72 69 70 74 20 64 65 62 75 67 67  he script debugg
2fe80 65 72 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  er..        #   
2fe90 20 20 20 20 74 68 61 74 20 77 69 6c 6c 20 63 61      that will ca
2fea0 6e 63 65 6c 20 61 6c 6c 20 53 51 4c 20 71 75 65  ncel all SQL que
2feb0 72 69 65 73 20 69 6e 20 70 72 6f 67 72 65 73 73  ries in progress
2fec0 20 66 6f 72 20 61 6c 6c 20 64 61 74 61 62 61 73   for all databas
2fed0 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
2fee0 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6b     connections k
2fef0 6e 6f 77 6e 20 74 6f 20 74 68 69 73 20 69 6e 74  nown to this int
2ff00 65 72 70 72 65 74 65 72 2e 0d 0a 20 20 20 20 20  erpreter...     
2ff10 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66     #..        if
2ff20 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
2ff30 3a 3a 6e 6f 28 73 71 6c 69 74 65 49 6e 74 65 72  ::no(sqliteInter
2ff40 72 75 70 74 43 61 6c 6c 62 61 63 6b 29 5d 7d 20  ruptCallback)]} 
2ff50 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
2ff60 20 20 73 65 74 75 70 44 62 49 6e 74 65 72 72 75    setupDbInterru
2ff70 70 74 43 61 6c 6c 62 61 63 6b 20 24 3a 3a 74 65  ptCallback $::te
2ff80 73 74 5f 63 68 61 6e 6e 65 6c 20 24 3a 3a 74 65  st_channel $::te
2ff90 73 74 5f 6c 6f 67 0d 0a 20 20 20 20 20 20 20 20  st_log..        
2ffa0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  }....        #..
2ffb0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
2ffc0 43 68 65 63 6b 20 66 6f 72 20 74 68 65 20 6e 61  Check for the na
2ffd0 74 69 76 65 20 72 75 6e 74 69 6d 65 20 6f 70 74  tive runtime opt
2ffe0 69 6f 6e 2c 20 77 68 69 63 68 20 77 6f 75 6c 64  ion, which would
2fff0 20 6d 65 61 6e 20 77 65 20 61 72 65 0d 0a 20 20   mean we are..  
30000 20 20 20 20 20 20 23 20 20 20 20 20 20 20 75 73        #       us
30010 69 6e 67 20 74 68 65 20 6d 69 78 65 64 2d 6d 6f  ing the mixed-mo
30020 64 65 20 61 73 73 65 6d 62 6c 79 2e 0d 0a 20 20  de assembly...  
30030 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
30040 20 63 68 65 63 6b 46 6f 72 52 75 6e 74 69 6d 65   checkForRuntime
30050 4f 70 74 69 6f 6e 20 24 3a 3a 74 65 73 74 5f 63  Option $::test_c
30060 68 61 6e 6e 65 6c 20 6e 61 74 69 76 65 0d 0a 0d  hannel native...
30070 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
30080 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63      # NOTE: Chec
30090 6b 20 69 66 20 74 68 65 20 74 65 73 74 20 73 75  k if the test su
300a0 69 74 65 20 73 68 6f 75 6c 64 20 63 6f 75 6e 74  ite should count
300b0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
300c0 6f 6e 6e 65 63 74 69 6f 6e 73 0d 0a 20 20 20 20  onnections..    
300d0 20 20 20 20 23 20 20 20 20 20 20 20 22 6f 70 65      #       "ope
300e0 6e 65 64 22 20 61 6e 64 20 22 63 6c 6f 73 65 64  ned" and "closed
300f0 22 20 66 72 6f 6d 20 74 68 65 20 70 6f 6f 6c 20  " from the pool 
30100 77 68 65 6e 20 64 65 74 65 72 6d 69 6e 69 6e 67  when determining
30110 20 69 66 20 61 20 74 65 73 74 0d 0a 20 20 20 20   if a test..    
30120 20 20 20 20 23 20 20 20 20 20 20 20 70 61 73 73      #       pass
30130 65 64 2e 20 20 44 69 73 61 62 6c 69 6e 67 20 74  ed.  Disabling t
30140 68 69 73 20 62 65 68 61 76 69 6f 72 20 69 73 20  his behavior is 
30150 73 6f 6d 65 74 69 6d 65 73 20 6e 65 63 65 73 73  sometimes necess
30160 61 72 79 20 28 65 2e 67 2e 0d 0a 20 20 20 20 20  ary (e.g...     
30170 20 20 20 23 20 20 20 20 20 20 20 64 75 72 69 6e     #       durin
30180 67 20 74 68 65 20 72 65 6c 65 61 73 65 20 74 65  g the release te
30190 73 74 69 6e 67 20 70 72 6f 63 65 73 73 29 20 62  sting process) b
301a0 65 63 61 75 73 65 20 74 68 65 72 65 20 61 72 65  ecause there are
301b0 20 73 65 76 65 72 61 6c 0d 0a 20 20 20 20 20 20   several..      
301c0 20 20 23 20 20 20 20 20 20 20 74 65 73 74 73 20    #       tests 
301d0 74 68 61 74 20 72 65 6c 79 20 6f 6e 20 74 68 65  that rely on the
301e0 20 22 6f 70 65 6e 65 64 20 66 72 6f 6d 20 70 6f   "opened from po
301f0 6f 6c 22 20 63 6f 75 6e 74 20 62 65 69 6e 67 20  ol" count being 
30200 67 72 65 61 74 65 72 0d 0a 20 20 20 20 20 20 20  greater..       
30210 20 23 20 20 20 20 20 20 20 74 68 61 6e 20 7a 65   #       than ze
30220 72 6f 2e 20 20 54 68 65 73 65 20 74 65 73 74 73  ro.  These tests
30230 20 6d 61 79 20 66 61 69 6c 20 64 75 65 20 74 6f   may fail due to
30240 20 74 68 65 20 6e 6f 6e 2d 64 65 74 65 72 6d 69   the non-determi
30250 6e 69 73 74 69 63 0d 0a 20 20 20 20 20 20 20 20  nistic..        
30260 23 20 20 20 20 20 20 20 62 65 68 61 76 69 6f 72  #       behavior
30270 20 6f 66 20 74 68 65 20 43 4c 52 20 47 43 2c 20   of the CLR GC, 
30280 65 76 65 6e 20 77 68 65 6e 20 74 68 65 72 65 20  even when there 
30290 69 73 20 6e 6f 20 62 75 67 20 69 6e 20 74 68 65  is no bug in the
302a0 20 63 6f 64 65 0d 0a 20 20 20 20 20 20 20 20 23   code..        #
302b0 20 20 20 20 20 20 20 62 65 69 6e 67 20 74 65 73         being tes
302c0 74 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ted...        #.
302d0 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f  .        checkFo
302e0 72 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 24  rRuntimeOption $
302f0 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 6e  ::test_channel n
30300 6f 50 6f 6f 6c 43 6f 75 6e 74 73 0d 0a 0d 0a 20  oPoolCounts.... 
30310 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
30320 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20    # NOTE: Check 
30330 69 66 20 74 68 65 20 74 65 73 74 20 73 75 69 74  if the test suit
30340 65 20 73 68 6f 75 6c 64 20 75 73 65 20 73 68 61  e should use sha
30350 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 2e 0d  red-cache mode..
30360 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
30370 20 20 20 20 63 68 65 63 6b 46 6f 72 52 75 6e 74      checkForRunt
30380 69 6d 65 4f 70 74 69 6f 6e 20 24 3a 3a 74 65 73  imeOption $::tes
30390 74 5f 63 68 61 6e 6e 65 6c 20 73 68 61 72 65 64  t_channel shared
303a0 43 61 63 68 65 0d 0a 0d 0a 20 20 20 20 20 20 20  Cache....       
303b0 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
303c0 54 45 3a 20 52 65 70 6f 72 74 20 74 68 65 20 72  TE: Report the r
303d0 65 73 6f 75 72 63 65 20 75 73 61 67 65 20 70 72  esource usage pr
303e0 69 6f 72 20 74 6f 20 72 75 6e 6e 69 6e 67 20 61  ior to running a
303f0 6e 79 20 74 65 73 74 73 2e 0d 0a 20 20 20 20 20  ny tests...     
30400 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65     #..        re
30410 70 6f 72 74 53 51 4c 69 74 65 52 65 73 6f 75 72  portSQLiteResour
30420 63 65 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  ces $::test_chan
30430 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23  nel....        #
30440 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
30450 3a 20 47 72 61 62 20 74 68 65 20 6c 69 73 74 20  : Grab the list 
30460 6f 66 20 6e 61 74 69 76 65 20 6d 6f 64 75 6c 65  of native module
30470 73 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e  s for the curren
30480 74 20 70 72 6f 63 65 73 73 20 61 6e 64 0d 0a 20  t process and.. 
30490 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 72         #       r
304a0 65 70 6f 72 74 20 6f 6e 20 74 68 65 20 53 79 73  eport on the Sys
304b0 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20  tem.Data.SQLite 
304c0 72 65 6c 61 74 65 64 20 6f 6e 65 73 2e 0d 0a 20  related ones... 
304d0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
304e0 20 20 69 66 20 7b 5b 68 61 76 65 53 51 4c 69 74    if {[haveSQLit
304f0 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d 7d  eObjectCommand]}
30500 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
30510 20 20 20 73 65 74 20 6d 6f 64 75 6c 65 73 20 5b     set modules [
30520 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 5c 0d  object invoke \.
30530 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53  .              S
30540 79 73 74 65 6d 2e 44 69 61 67 6e 6f 73 74 69 63  ystem.Diagnostic
30550 73 2e 50 72 6f 63 65 73 73 2e 47 65 74 43 75 72  s.Process.GetCur
30560 72 65 6e 74 50 72 6f 63 65 73 73 20 4d 6f 64 75  rentProcess Modu
30570 6c 65 73 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  les]....        
30580 20 20 6f 62 6a 65 63 74 20 66 6f 72 65 61 63 68    object foreach
30590 20 2d 61 6c 69 61 73 20 6d 6f 64 75 6c 65 20 24   -alias module $
305a0 6d 6f 64 75 6c 65 73 20 7b 0d 0a 20 20 20 20 20  modules {..     
305b0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
305c0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68        # NOTE: Th
305d0 65 20 6d 6f 64 75 6c 65 20 66 69 6c 65 20 6e 61  e module file na
305e0 6d 65 20 68 65 72 65 20 6d 75 73 74 20 62 65 20  me here must be 
305f0 6e 6f 72 6d 61 6c 69 7a 65 64 2e 0d 0a 20 20 20  normalized...   
30600 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
30610 20 20 20 20 20 20 20 20 73 65 74 20 66 69 6c 65          set file
30620 4e 61 6d 65 20 5b 66 69 6c 65 20 6e 6f 72 6d 61  Name [file norma
30630 6c 69 7a 65 20 5b 24 6d 6f 64 75 6c 65 20 46 69  lize [$module Fi
30640 6c 65 4e 61 6d 65 5d 5d 0d 0a 20 20 20 20 20 20  leName]]..      
30650 20 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61        set fileNa
30660 6d 65 4f 6e 6c 79 20 5b 66 69 6c 65 20 74 61 69  meOnly [file tai
30670 6c 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a  l $fileName]....
30680 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
30690 5b 6c 73 65 61 72 63 68 20 2d 65 78 61 63 74 20  [lsearch -exact 
306a0 2d 6e 6f 63 61 73 65 20 2d 2d 20 5c 0d 0a 20 20  -nocase -- \..  
306b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 67                [g
306c0 65 74 4e 61 74 69 76 65 4c 69 62 72 61 72 79 46  etNativeLibraryF
306d0 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79 5d 20 24 66  ileNamesOnly] $f
306e0 69 6c 65 4e 61 6d 65 4f 6e 6c 79 5d 20 21 3d 20  ileNameOnly] != 
306f0 2d 31 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  -1} then {..    
30700 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
30710 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
30720 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
30730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30740 20 22 2d 2d 2d 2d 20 66 6f 75 6e 64 20 6c 6f 61   "---- found loa
30750 64 65 64 20 53 51 4c 69 74 65 20 6e 61 74 69 76  ded SQLite nativ
30760 65 20 6c 69 62 72 61 72 79 20 6d 6f 64 75 6c 65  e library module
30770 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  : " \..         
30780 20 20 20 20 20 20 20 20 20 24 66 69 6c 65 4e 61           $fileNa
30790 6d 65 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  me \n]..        
307a0 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 6c      } elseif {[l
307b0 73 65 61 72 63 68 20 2d 65 78 61 63 74 20 2d 6e  search -exact -n
307c0 6f 63 61 73 65 20 2d 2d 20 5c 0d 0a 20 20 20 20  ocase -- \..    
307d0 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74              [get
307e0 49 6e 74 65 72 6f 70 41 73 73 65 6d 62 6c 79 46  InteropAssemblyF
307f0 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79 5d 20 24 66  ileNamesOnly] $f
30800 69 6c 65 4e 61 6d 65 4f 6e 6c 79 5d 20 21 3d 20  ileNameOnly] != 
30810 2d 31 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  -1} then {..    
30820 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
30830 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
30840 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
30850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30860 20 22 2d 2d 2d 2d 20 66 6f 75 6e 64 20 6c 6f 61   "---- found loa
30870 64 65 64 20 53 51 4c 69 74 65 20 69 6e 74 65 72  ded SQLite inter
30880 6f 70 20 61 73 73 65 6d 62 6c 79 20 6d 6f 64 75  op assembly modu
30890 6c 65 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20  le: " \..       
308a0 20 20 20 20 20 20 20 20 20 20 20 24 66 69 6c 65             $file
308b0 4e 61 6d 65 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  Name \n]..      
308c0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
308d0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
308e0 0a 0d 0a 20 20 20 20 20 20 20 20 63 61 74 63 68  ...        catch
308f0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70   {..          tp
30900 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
30910 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  nel \..         
30920 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 6d 70 69       "---- compi
30930 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 73 20  le-time options 
30940 66 6f 72 20 53 51 4c 69 74 65 20 63 6f 72 65 20  for SQLite core 
30950 6c 69 62 72 61 72 79 2e 2e 2e 20 22 0d 0a 0d 0a  library... "....
30960 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63            if {[c
30970 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
30980 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b      object invok
30990 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62  e -flags +NonPub
309a0 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  lic \..         
309b0 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61         System.Da
309c0 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65  ta.SQLite.SQLite
309d0 33 20 53 51 4c 69 74 65 43 6f 6d 70 69 6c 65 4f  3 SQLiteCompileO
309e0 70 74 69 6f 6e 73 0d 0a 20 20 20 20 20 20 20 20  ptions..        
309f0 20 20 7d 20 63 6f 6d 70 69 6c 65 4f 70 74 69 6f    } compileOptio
30a00 6e 73 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  ns] == 0} then {
30a10 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
30a20 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
30a30 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
30a40 5b 66 6f 72 6d 61 74 4c 69 73 74 20 5b 6c 73 6f  [formatList [lso
30a50 72 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  rt \..          
30a60 20 20 20 20 20 20 24 63 6f 6d 70 69 6c 65 4f 70        $compileOp
30a70 74 69 6f 6e 73 5d 20 3c 6e 6f 6e 65 3e 5d 20 5c  tions] <none>] \
30a80 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20  n]..          } 
30a90 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
30aa0 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
30ab0 74 5f 63 68 61 6e 6e 65 6c 20 75 6e 6b 6e 6f 77  t_channel unknow
30ac0 6e 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  n\n..          }
30ad0 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
30ae0 20 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a         catch {..
30af0 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
30b00 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
30b10 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
30b20 20 22 2d 2d 2d 2d 20 63 6f 6d 70 69 6c 65 2d 74   "---- compile-t
30b30 69 6d 65 20 6f 70 74 69 6f 6e 73 20 66 6f 72 20  ime options for 
30b40 53 51 4c 69 74 65 20 69 6e 74 65 72 6f 70 20 61  SQLite interop a
30b50 73 73 65 6d 62 6c 79 2e 2e 2e 20 22 0d 0a 0d 0a  ssembly... "....
30b60 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63            if {[c
30b70 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
30b80 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b      object invok
30b90 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62  e -flags +NonPub
30ba0 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  lic \..         
30bb0 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61         System.Da
30bc0 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65  ta.SQLite.SQLite
30bd0 33 20 49 6e 74 65 72 6f 70 43 6f 6d 70 69 6c 65  3 InteropCompile
30be0 4f 70 74 69 6f 6e 73 0d 0a 20 20 20 20 20 20 20  Options..       
30bf0 20 20 20 7d 20 63 6f 6d 70 69 6c 65 4f 70 74 69     } compileOpti
30c00 6f 6e 73 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ons] == 0} then 
30c10 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
30c20 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
30c30 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
30c40 20 5b 66 6f 72 6d 61 74 4c 69 73 74 20 5b 6c 73   [formatList [ls
30c50 6f 72 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ort \..         
30c60 20 20 20 20 20 20 20 24 63 6f 6d 70 69 6c 65 4f         $compileO
30c70 70 74 69 6f 6e 73 5d 20 3c 6e 6f 6e 65 3e 5d 20  ptions] <none>] 
30c80 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  \n]..          }
30c90 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
30ca0 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
30cb0 73 74 5f 63 68 61 6e 6e 65 6c 20 75 6e 6b 6e 6f  st_channel unkno
30cc0 77 6e 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20 20  wn\n..          
30cd0 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  }..        }....
30ce0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
30cf0 20 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20     # NOTE: Show 
30d00 74 68 65 20 61 63 74 69 76 65 20 74 65 73 74 20  the active test 
30d10 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0d 0a 20 20  constraints...  
30d20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
30d30 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
30d40 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
30d50 67 73 20 22 2d 2d 2d 2d 20 63 6f 6e 73 74 72 61  gs "---- constra
30d60 69 6e 74 73 3a 20 22 20 5c 0d 0a 20 20 20 20 20  ints: " \..     
30d70 20 20 20 20 20 20 20 5b 66 6f 72 6d 61 74 4c 69         [formatLi
30d80 73 74 20 5b 6c 73 6f 72 74 20 5b 67 65 74 43 6f  st [lsort [getCo
30d90 6e 73 74 72 61 69 6e 74 73 5d 5d 20 3c 6e 6f 6e  nstraints]] <non
30da0 65 3e 5d 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20  e>] \n]....     
30db0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
30dc0 4e 4f 54 45 3a 20 53 61 76 65 20 74 68 65 20 74  NOTE: Save the t
30dd0 65 73 74 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  est constraints 
30de0 66 6f 72 20 75 73 65 20 62 79 20 74 68 72 65 61  for use by threa
30df0 64 73 20 63 72 65 61 74 65 64 20 69 6e 20 74 68  ds created in th
30e00 69 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  is..        #   
30e10 20 20 20 20 61 70 70 6c 69 63 61 74 69 6f 6e 20      application 
30e20 64 6f 6d 61 69 6e 2e 20 20 54 68 69 73 20 69 73  domain.  This is
30e30 20 6e 65 63 65 73 73 61 72 79 20 62 65 63 61 75   necessary becau
30e40 73 65 20 61 6c 6c 20 74 68 65 20 45 61 67 6c 65  se all the Eagle
30e50 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
30e60 20 20 22 74 65 73 74 20 63 6f 6e 74 65 78 74 22    "test context"
30e70 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
30e80 70 65 72 2d 74 68 72 65 61 64 2e 0d 0a 20 20 20  per-thread...   
30e90 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
30ea0 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
30eb0 73 20 3a 3a 74 65 73 74 5f 63 6f 6e 73 74 72 61  s ::test_constra
30ec0 69 6e 74 73 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  ints]} then {.. 
30ed0 20 20 20 20 20 20 20 20 20 73 65 74 20 3a 3a 74           set ::t
30ee0 65 73 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20  est_constraints 
30ef0 24 3a 3a 65 61 67 6c 65 5f 74 65 73 74 73 28 43  $::eagle_tests(C
30f00 6f 6e 73 74 72 61 69 6e 74 73 29 0d 0a 20 20 20  onstraints)..   
30f10 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
30f20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
30f30 4f 54 45 3a 20 4c 6f 61 64 20 74 68 65 20 22 61  OTE: Load the "a
30f40 66 74 65 72 2d 63 6f 6e 73 74 72 61 69 6e 74 73  fter-constraints
30f50 22 20 63 75 73 74 6f 6d 20 70 65 72 2d 75 73 65  " custom per-use
30f60 72 20 61 6e 64 2f 6f 72 20 70 65 72 2d 68 6f 73  r and/or per-hos
30f70 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  t..        #    
30f80 20 20 20 74 65 73 74 20 73 65 74 74 69 6e 67 73     test settings
30f90 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 23   now...        #
30fa0 0d 0a 20 20 20 20 20 20 20 20 75 70 6c 65 76 65  ..        upleve
30fb0 6c 20 31 20 5b 6c 69 73 74 20 6c 6f 61 64 53 51  l 1 [list loadSQ
30fc0 4c 69 74 65 54 65 73 74 53 65 74 74 69 6e 67 73  LiteTestSettings
30fd0 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
30fe0 20 2e 61 66 74 65 72 5d 0d 0a 0d 0a 20 20 20 20   .after]....    
30ff0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
31000 20 4e 4f 54 45 3a 20 49 66 20 6e 65 63 65 73 73   NOTE: If necess
31010 61 72 79 2c 20 65 6e 61 62 6c 65 20 73 68 61 72  ary, enable shar
31020 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 20 6e 6f  ed-cache mode no
31030 77 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  w...        #.. 
31040 20 20 20 20 20 20 20 69 66 20 7b 5b 68 61 73 52         if {[hasR
31050 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 73 68 61  untimeOption sha
31060 72 65 64 43 61 63 68 65 5d 7d 20 74 68 65 6e 20  redCache]} then 
31070 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 65 6e 61  {..          ena
31080 62 6c 65 53 68 61 72 65 64 43 61 63 68 65 20 24  bleSharedCache $
31090 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 74  ::test_channel t
310a0 72 75 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  rue..        }..
310b0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
310c0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f       # NOTE: Sho
310d0 77 20 77 68 65 6e 20 6f 75 72 20 74 65 73 74 73  w when our tests
310e0 20 61 63 74 75 61 6c 6c 79 20 62 65 67 61 6e 20   actually began 
310f0 28 6e 6f 77 29 2e 0d 0a 20 20 20 20 20 20 20 20  (now)...        
31100 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  #..        tputs
31110 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
31120 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
31130 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
31140 2d 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  - System.Data.SQ
31150 4c 69 74 65 20 74 65 73 74 73 20 62 65 67 61 6e  Lite tests began
31160 20 61 74 20 22 20 5c 0d 0a 20 20 20 20 20 20 20   at " \..       
31170 20 20 20 20 20 5b 63 6c 6f 63 6b 20 66 6f 72 6d       [clock form
31180 61 74 20 5b 63 6c 6f 63 6b 20 73 65 63 6f 6e 64  at [clock second
31190 73 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d  s]] \n]..      }
311a0 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
311b0 70 72 6f 63 20 72 75 6e 53 51 4c 69 74 65 54 65  proc runSQLiteTe
311c0 73 74 46 69 6c 65 73 50 72 6f 6c 6f 67 75 65 20  stFilesPrologue 
311d0 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20  {} {..      #.. 
311e0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69       # NOTE: Ski
311f0 70 20 72 75 6e 6e 69 6e 67 20 6f 75 72 20 63 75  p running our cu
31200 73 74 6f 6d 20 66 69 6c 65 73 20 70 72 6f 6c 6f  stom files prolo
31210 67 75 65 20 69 66 20 74 68 65 20 6d 61 69 6e 20  gue if the main 
31220 6f 6e 65 20 68 61 73 20 62 65 65 6e 0d 0a 20 20  one has been..  
31230 20 20 20 20 23 20 20 20 20 20 20 20 73 6b 69 70      #       skip
31240 70 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ped...      #.. 
31250 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
31260 65 78 69 73 74 73 20 3a 3a 6e 6f 28 70 72 6f 6c  exists ::no(prol
31270 6f 67 75 65 2e 65 61 67 6c 65 29 5d 7d 20 74 68  ogue.eagle)]} th
31280 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 75 70  en {..        up
31290 6c 65 76 65 6c 20 31 20 7b 0d 0a 20 20 20 20 20  level 1 {..     
312a0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
312b0 20 20 23 20 4e 4f 54 45 3a 20 53 65 74 75 70 20    # NOTE: Setup 
312c0 74 68 65 20 76 61 72 69 61 62 6c 65 73 20 74 68  the variables th
312d0 61 74 20 72 65 66 65 72 20 74 6f 20 74 68 65 20  at refer to the 
312e0 76 61 72 69 6f 75 73 20 6e 6f 6e 2d 64 61 74 61  various non-data
312f0 20 66 69 6c 65 73 0d 0a 20 20 20 20 20 20 20 20   files..        
31300 20 20 23 20 20 20 20 20 20 20 72 65 71 75 69 72    #       requir
31310 65 64 20 62 79 20 74 68 65 20 74 65 73 74 73 20  ed by the tests 
31320 69 6e 20 74 68 69 73 20 66 69 6c 65 2e 0d 0a 20  in this file... 
31330 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
31340 20 20 20 20 20 20 73 65 74 20 65 6e 74 69 74 79        set entity
31350 46 72 61 6d 65 77 6f 72 6b 44 6c 6c 46 69 6c 65  FrameworkDllFile
31360 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
31370 20 20 5b 67 65 74 42 75 69 6c 64 46 69 6c 65 4e    [getBuildFileN
31380 61 6d 65 20 45 6e 74 69 74 79 46 72 61 6d 65 77  ame EntityFramew
31390 6f 72 6b 2e 64 6c 6c 20 74 72 75 65 5d 0d 0a 0d  ork.dll true]...
313a0 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20 69  .          set i
313b0 6e 73 74 61 6c 6c 65 72 45 78 65 46 69 6c 65 20  nstallerExeFile 
313c0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
313d0 20 5b 67 65 74 42 75 69 6c 64 46 69 6c 65 4e 61   [getBuildFileNa
313e0 6d 65 20 49 6e 73 74 61 6c 6c 65 72 2e 65 78 65  me Installer.exe
313f0 20 74 72 75 65 5d 0d 0a 0d 0a 20 20 20 20 20 20   true]....      
31400 20 20 20 20 73 65 74 20 73 71 6c 69 74 65 44 65      set sqliteDe
31410 73 69 67 6e 65 72 44 6c 6c 46 69 6c 65 20 5c 0d  signerDllFile \.
31420 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b  .              [
31430 67 65 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65  getBuildFileName
31440 20 53 51 4c 69 74 65 2e 44 65 73 69 67 6e 65 72   SQLite.Designer
31450 2e 64 6c 6c 20 74 72 75 65 5d 0d 0a 0d 0a 20 20  .dll true]....  
31460 20 20 20 20 20 20 20 20 73 65 74 20 73 79 73 74          set syst
31470 65 6d 44 61 74 61 53 51 4c 69 74 65 44 6c 6c 46  emDataSQLiteDllF
31480 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ile \..         
31490 20 20 20 20 20 5b 67 65 74 42 75 69 6c 64 46 69       [getBuildFi
314a0 6c 65 4e 61 6d 65 20 53 79 73 74 65 6d 2e 44 61  leName System.Da
314b0 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 20 74 72  ta.SQLite.dll tr
314c0 75 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ue]....         
314d0 20 73 65 74 20 73 79 73 74 65 6d 44 61 74 61 53   set systemDataS
314e0 51 4c 69 74 65 4c 69 6e 71 44 6c 6c 46 69 6c 65  QLiteLinqDllFile
314f0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
31500 20 20 5b 67 65 74 42 75 69 6c 64 46 69 6c 65 4e    [getBuildFileN
31510 61 6d 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  ame System.Data.
31520 53 51 4c 69 74 65 2e 4c 69 6e 71 2e 64 6c 6c 20  SQLite.Linq.dll 
31530 74 72 75 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  true]....       
31540 20 20 20 73 65 74 20 73 79 73 74 65 6d 44 61 74     set systemDat
31550 61 53 51 4c 69 74 65 45 66 36 44 6c 6c 46 69 6c  aSQLiteEf6DllFil
31560 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
31570 20 20 20 5b 67 65 74 42 75 69 6c 64 46 69 6c 65     [getBuildFile
31580 4e 61 6d 65 20 53 79 73 74 65 6d 2e 44 61 74 61  Name System.Data
31590 2e 53 51 4c 69 74 65 2e 45 46 36 2e 64 6c 6c 20  .SQLite.EF6.dll 
315a0 74 72 75 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  true]....       
315b0 20 20 20 73 65 74 20 74 65 73 74 45 78 65 46 69     set testExeFi
315c0 6c 65 20 5b 67 65 74 42 75 69 6c 64 46 69 6c 65  le [getBuildFile
315d0 4e 61 6d 65 20 74 65 73 74 2e 65 78 65 20 74 72  Name test.exe tr
315e0 75 65 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 73  ue]..          s
315f0 65 74 20 74 65 73 74 4c 69 6e 71 45 78 65 46 69  et testLinqExeFi
31600 6c 65 20 5b 67 65 74 42 75 69 6c 64 46 69 6c 65  le [getBuildFile
31610 4e 61 6d 65 20 74 65 73 74 6c 69 6e 71 2e 65 78  Name testlinq.ex
31620 65 20 74 72 75 65 5d 0d 0a 20 20 20 20 20 20 20  e true]..       
31630 20 20 20 73 65 74 20 74 65 73 74 45 66 36 45 78     set testEf6Ex
31640 65 46 69 6c 65 20 5b 67 65 74 42 75 69 6c 64 46  eFile [getBuildF
31650 69 6c 65 4e 61 6d 65 20 74 65 73 74 65 66 36 2e  ileName testef6.
31660 65 78 65 20 74 72 75 65 5d 0d 0a 0d 0a 20 20 20  exe true]....   
31670 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
31680 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 65 74 75      # NOTE: Setu
31690 70 20 74 68 65 20 76 61 72 69 61 62 6c 65 73 20  p the variables 
316a0 74 68 61 74 20 72 65 66 65 72 20 74 6f 20 74 68  that refer to th
316b0 65 20 76 61 72 69 6f 75 73 20 64 61 74 61 20 66  e various data f
316c0 69 6c 65 73 0d 0a 20 20 20 20 20 20 20 20 20 20  iles..          
316d0 23 20 20 20 20 20 20 20 72 65 71 75 69 72 65 64  #       required
316e0 20 62 79 20 74 68 65 20 74 65 73 74 73 20 69 6e   by the tests in
316f0 20 74 68 69 73 20 66 69 6c 65 2e 0d 0a 20 20 20   this file...   
31700 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
31710 20 20 20 20 73 65 74 20 74 65 73 74 4c 69 6e 71      set testLinq
31720 4f 75 74 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61  OutFile [file na
31730 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a  tivename [file j
31740 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  oin \..         
31750 20 20 20 20 20 5b 67 65 74 53 51 4c 69 74 65 54       [getSQLiteT
31760 65 73 74 44 61 74 61 50 61 74 68 5d 20 74 65 73  estDataPath] tes
31770 74 6c 69 6e 71 2e 6f 75 74 5d 5d 0d 0a 0d 0a 20  tlinq.out]].... 
31780 20 20 20 20 20 20 20 20 20 73 65 74 20 6e 6f 72           set nor
31790 74 68 77 69 6e 64 45 66 44 62 46 69 6c 65 20 5b  thwindEfDbFile [
317a0 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20  file nativename 
317b0 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20  [file join \..  
317c0 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c              [fil
317d0 65 20 64 69 72 6e 61 6d 65 20 5b 66 69 6c 65 20  e dirname [file 
317e0 64 69 72 6e 61 6d 65 20 5b 67 65 74 53 51 4c 69  dirname [getSQLi
317f0 74 65 54 65 73 74 44 61 74 61 50 61 74 68 5d 5d  teTestDataPath]]
31800 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ] \..           
31810 20 20 20 74 65 73 74 6c 69 6e 71 20 6e 6f 72 74     testlinq nort
31820 68 77 69 6e 64 45 46 2e 64 62 5d 5d 0d 0a 0d 0a  hwindEF.db]]....
31830 20 20 20 20 20 20 20 20 20 20 73 65 74 20 6e 6f            set no
31840 6e 57 61 6c 44 62 46 69 6c 65 20 5b 66 69 6c 65  nWalDbFile [file
31850 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c   nativename [fil
31860 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20  e join \..      
31870 20 20 20 20 20 20 20 20 5b 67 65 74 53 51 4c 69          [getSQLi
31880 74 65 54 65 73 74 44 61 74 61 50 61 74 68 5d 20  teTestDataPath] 
31890 6e 6f 6e 57 61 6c 2e 64 62 5d 5d 0d 0a 0d 0a 20  nonWal.db]].... 
318a0 20 20 20 20 20 20 20 20 20 73 65 74 20 77 61 6c           set wal
318b0 44 62 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74  DbFile [file nat
318c0 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f  ivename [file jo
318d0 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  in \..          
318e0 20 20 20 20 5b 67 65 74 53 51 4c 69 74 65 54 65      [getSQLiteTe
318f0 73 74 44 61 74 61 50 61 74 68 5d 20 77 61 6c 2e  stDataPath] wal.
31900 64 62 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  db]]....        
31910 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23    #..          #
31920 20 4e 4f 54 45 3a 20 54 68 65 20 76 61 72 69 6f   NOTE: The vario
31930 75 73 20 69 6e 73 74 61 6c 6c 2f 75 6e 69 6e 73  us install/unins
31940 74 61 6c 6c 20 6c 6f 67 20 66 69 6c 65 73 20 75  tall log files u
31950 73 65 64 20 74 6f 20 74 65 73 74 20 74 68 65 0d  sed to test the.
31960 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20  .          #    
31970 20 20 20 64 65 73 69 67 6e 2d 74 69 6d 65 20 63     design-time c
31980 6f 6d 70 6f 6e 65 6e 74 20 69 6e 73 74 61 6c 6c  omponent install
31990 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  er...          #
319a0 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
319b0 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 30  testInstallVs200
319c0 35 4c 6f 67 46 69 6c 65 20 5b 66 69 6c 65 20 6e  5LogFile [file n
319d0 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20  ativename [file 
319e0 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20  join \..        
319f0 20 20 20 20 20 20 5b 67 65 74 53 51 4c 69 74 65        [getSQLite
31a00 54 65 73 74 44 61 74 61 50 61 74 68 5d 20 49 6e  TestDataPath] In
31a10 73 74 61 6c 6c 65 72 5f 54 65 73 74 5f 56 73 32  staller_Test_Vs2
31a20 30 30 35 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20  005.log]]....   
31a30 20 20 20 20 20 20 20 73 65 74 20 74 65 73 74 49         set testI
31a40 6e 73 74 61 6c 6c 56 73 32 30 30 38 4c 6f 67 46  nstallVs2008LogF
31a50 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65  ile [file native
31a60 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20  name [file join 
31a70 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
31a80 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73 74 44   [getSQLiteTestD
31a90 61 74 61 50 61 74 68 5d 20 49 6e 73 74 61 6c 6c  ataPath] Install
31aa0 65 72 5f 54 65 73 74 5f 56 73 32 30 30 38 2e 6c  er_Test_Vs2008.l
31ab0 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  og]]....        
31ac0 20 20 73 65 74 20 74 65 73 74 49 6e 73 74 61 6c    set testInstal
31ad0 6c 56 73 32 30 31 30 4c 6f 67 46 69 6c 65 20 5b  lVs2010LogFile [
31ae0 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20  file nativename 
31af0 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20  [file join \..  
31b00 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74              [get
31b10 53 51 4c 69 74 65 54 65 73 74 44 61 74 61 50 61  SQLiteTestDataPa
31b20 74 68 5d 20 49 6e 73 74 61 6c 6c 65 72 5f 54 65  th] Installer_Te
31b30 73 74 5f 56 73 32 30 31 30 2e 6c 6f 67 5d 5d 0d  st_Vs2010.log]].
31b40 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  ...          set
31b50 20 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30   testInstallVs20
31b60 31 32 4c 6f 67 46 69 6c 65 20 5b 66 69 6c 65 20  12LogFile [file 
31b70 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65  nativename [file
31b80 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20   join \..       
31b90 20 20 20 20 20 20 20 5b 67 65 74 53 51 4c 69 74         [getSQLit
31ba0 65 54 65 73 74 44 61 74 61 50 61 74 68 5d 20 49  eTestDataPath] I
31bb0 6e 73 74 61 6c 6c 65 72 5f 54 65 73 74 5f 56 73  nstaller_Test_Vs
31bc0 32 30 31 32 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20  2012.log]]....  
31bd0 20 20 20 20 20 20 20 20 73 65 74 20 74 65 73 74          set test
31be0 49 6e 73 74 61 6c 6c 56 73 32 30 31 33 4c 6f 67  InstallVs2013Log
31bf0 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69 76  File [file nativ
31c00 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e  ename [file join
31c10 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
31c20 20 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73 74    [getSQLiteTest
31c30 44 61 74 61 50 61 74 68 5d 20 49 6e 73 74 61 6c  DataPath] Instal
31c40 6c 65 72 5f 54 65 73 74 5f 56 73 32 30 31 33 2e  ler_Test_Vs2013.
31c50 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  log]]....       
31c60 20 20 20 73 65 74 20 74 65 73 74 49 6e 73 74 61     set testInsta
31c70 6c 6c 56 73 32 30 31 35 4c 6f 67 46 69 6c 65 20  llVs2015LogFile 
31c80 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65  [file nativename
31c90 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20   [file join \.. 
31ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65               [ge
31cb0 74 53 51 4c 69 74 65 54 65 73 74 44 61 74 61 50  tSQLiteTestDataP
31cc0 61 74 68 5d 20 49 6e 73 74 61 6c 6c 65 72 5f 54  ath] Installer_T
31cd0 65 73 74 5f 56 73 32 30 31 35 2e 6c 6f 67 5d 5d  est_Vs2015.log]]
31ce0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65  ....          se
31cf0 74 20 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32  t testInstallVs2
31d00 30 31 37 4c 6f 67 46 69 6c 65 20 5b 66 69 6c 65  017LogFile [file
31d10 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c   nativename [fil
31d20 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20  e join \..      
31d30 20 20 20 20 20 20 20 20 5b 67 65 74 53 51 4c 69          [getSQLi
31d40 74 65 54 65 73 74 44 61 74 61 50 61 74 68 5d 20  teTestDataPath] 
31d50 49 6e 73 74 61 6c 6c 65 72 5f 54 65 73 74 5f 56  Installer_Test_V
31d60 73 32 30 31 37 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20  s2017.log]].... 
31d70 20 20 20 20 20 20 20 20 20 73 65 74 20 74 65 73           set tes
31d80 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 30 35  tUninstallVs2005
31d90 4c 6f 67 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61  LogFile [file na
31da0 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a  tivename [file j
31db0 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  oin \..         
31dc0 20 20 20 20 20 5b 67 65 74 53 51 4c 69 74 65 54       [getSQLiteT
31dd0 65 73 74 44 61 74 61 50 61 74 68 5d 20 55 6e 69  estDataPath] Uni
31de0 6e 73 74 61 6c 6c 65 72 5f 54 65 73 74 5f 56 73  nstaller_Test_Vs
31df0 32 30 30 35 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20  2005.log]]....  
31e00 20 20 20 20 20 20 20 20 73 65 74 20 74 65 73 74          set test
31e10 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 30 38 4c  UninstallVs2008L
31e20 6f 67 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74  ogFile [file nat
31e30 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f  ivename [file jo
31e40 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  in \..          
31e50 20 20 20 20 5b 67 65 74 53 51 4c 69 74 65 54 65      [getSQLiteTe
31e60 73 74 44 61 74 61 50 61 74 68 5d 20 55 6e 69 6e  stDataPath] Unin
31e70 73 74 61 6c 6c 65 72 5f 54 65 73 74 5f 56 73 32  staller_Test_Vs2
31e80 30 30 38 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20  008.log]]....   
31e90 20 20 20 20 20 20 20 73 65 74 20 74 65 73 74 55         set testU
31ea0 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31 30 4c 6f  ninstallVs2010Lo
31eb0 67 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69  gFile [file nati
31ec0 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69  vename [file joi
31ed0 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n \..           
31ee0 20 20 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73     [getSQLiteTes
31ef0 74 44 61 74 61 50 61 74 68 5d 20 55 6e 69 6e 73  tDataPath] Unins
31f00 74 61 6c 6c 65 72 5f 54 65 73 74 5f 56 73 32 30  taller_Test_Vs20
31f10 31 30 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20  10.log]]....    
31f20 20 20 20 20 20 20 73 65 74 20 74 65 73 74 55 6e        set testUn
31f30 69 6e 73 74 61 6c 6c 56 73 32 30 31 32 4c 6f 67  installVs2012Log
31f40 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69 76  File [file nativ
31f50 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e  ename [file join
31f60 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
31f70 20 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73 74    [getSQLiteTest
31f80 44 61 74 61 50 61 74 68 5d 20 55 6e 69 6e 73 74  DataPath] Uninst
31f90 61 6c 6c 65 72 5f 54 65 73 74 5f 56 73 32 30 31  aller_Test_Vs201
31fa0 32 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20  2.log]]....     
31fb0 20 20 20 20 20 73 65 74 20 74 65 73 74 55 6e 69       set testUni
31fc0 6e 73 74 61 6c 6c 56 73 32 30 31 33 4c 6f 67 46  nstallVs2013LogF
31fd0 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65  ile [file native
31fe0 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20  name [file join 
31ff0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
32000 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73 74 44   [getSQLiteTestD
32010 61 74 61 50 61 74 68 5d 20 55 6e 69 6e 73 74 61  ataPath] Uninsta
32020 6c 6c 65 72 5f 54 65 73 74 5f 56 73 32 30 31 33  ller_Test_Vs2013
32030 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20  .log]]....      
32040 20 20 20 20 73 65 74 20 74 65 73 74 55 6e 69 6e      set testUnin
32050 73 74 61 6c 6c 56 73 32 30 31 35 4c 6f 67 46 69  stallVs2015LogFi
32060 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e  le [file nativen
32070 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c  ame [file join \
32080 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
32090 5b 67 65 74 53 51 4c 69 74 65 54 65 73 74 44 61  [getSQLiteTestDa
320a0 74 61 50 61 74 68 5d 20 55 6e 69 6e 73 74 61 6c  taPath] Uninstal
320b0 6c 65 72 5f 54 65 73 74 5f 56 73 32 30 31 35 2e  ler_Test_Vs2015.
320c0 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  log]]....       
320d0 20 20 20 73 65 74 20 74 65 73 74 55 6e 69 6e 73     set testUnins
320e0 74 61 6c 6c 56 73 32 30 31 37 4c 6f 67 46 69 6c  tallVs2017LogFil
320f0 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61  e [file nativena
32100 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d  me [file join \.
32110 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b  .              [
32120 67 65 74 53 51 4c 69 74 65 54 65 73 74 44 61 74  getSQLiteTestDat
32130 61 50 61 74 68 5d 20 55 6e 69 6e 73 74 61 6c 6c  aPath] Uninstall
32140 65 72 5f 54 65 73 74 5f 56 73 32 30 31 37 2e 6c  er_Test_Vs2017.l
32150 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  og]]....        
32160 20 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23    ##############
32170 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
32180 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
32190 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
321a0 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20 20 20 20  #######....     
321b0 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
321c0 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 68 65 63  exists ::no(chec
321d0 6b 46 6f 72 53 71 6c 69 74 65 46 69 6c 65 73 29  kForSqliteFiles)
321e0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
321f0 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76         if {![hav
32200 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70  eConstraint [app
32210 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d  endArgs file_ \.
32220 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
32230 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 65 6e 74   [file tail $ent
32240 69 74 79 46 72 61 6d 65 77 6f 72 6b 44 6c 6c 46  ityFrameworkDllF
32250 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a  ile]]]} then {..
32260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 68                ch
32270 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74  eckForFile $test
32280 5f 63 68 61 6e 6e 65 6c 20 24 65 6e 74 69 74 79  _channel $entity
32290 46 72 61 6d 65 77 6f 72 6b 44 6c 6c 46 69 6c 65  FrameworkDllFile
322a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
322b0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ...            i
322c0 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61  f {![haveConstra
322d0 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20  int [appendArgs 
322e0 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20  file_ \..       
322f0 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74           [file t
32300 61 69 6c 20 24 69 6e 73 74 61 6c 6c 65 72 45 78  ail $installerEx
32310 65 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b  eFile]]]} then {
32320 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
32330 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65  checkForFile $te
32340 73 74 5f 63 68 61 6e 6e 65 6c 20 24 69 6e 73 74  st_channel $inst
32350 61 6c 6c 65 72 45 78 65 46 69 6c 65 20 49 6e 73  allerExeFile Ins
32360 74 61 6c 6c 65 72 2e 65 78 65 0d 0a 20 20 20 20  taller.exe..    
32370 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
32380 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68           if {![h
32390 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61  aveConstraint [a
323a0 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20  ppendArgs file_ 
323b0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
323c0 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 73     [file tail $s
323d0 71 6c 69 74 65 44 65 73 69 67 6e 65 72 44 6c 6c  qliteDesignerDll
323e0 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d  File]]]} then {.
323f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  .              c
32400 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73  heckForFile $tes
32410 74 5f 63 68 61 6e 6e 65 6c 20 24 73 71 6c 69 74  t_channel $sqlit
32420 65 44 65 73 69 67 6e 65 72 44 6c 6c 46 69 6c 65  eDesignerDllFile
32430 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
32440 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ...            i
32450 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61  f {![haveConstra
32460 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20  int [appendArgs 
32470 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20  file_ \..       
32480 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74           [file t
32490 61 69 6c 20 24 73 79 73 74 65 6d 44 61 74 61 53  ail $systemDataS
324a0 51 4c 69 74 65 44 6c 6c 46 69 6c 65 5d 5d 5d 7d  QLiteDllFile]]]}
324b0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
324c0 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46         checkForF
324d0 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65  ile $test_channe
324e0 6c 20 24 73 79 73 74 65 6d 44 61 74 61 53 51 4c  l $systemDataSQL
324f0 69 74 65 44 6c 6c 46 69 6c 65 0d 0a 20 20 20 20  iteDllFile..    
32500 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
32510 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68           if {![h
32520 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61  aveConstraint [a
32530 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20  ppendArgs file_ 
32540 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
32550 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 73     [file tail $s
32560 79 73 74 65 6d 44 61 74 61 53 51 4c 69 74 65 4c  ystemDataSQLiteL
32570 69 6e 71 44 6c 6c 46 69 6c 65 5d 5d 5d 7d 20 74  inqDllFile]]]} t
32580 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
32590 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c       checkForFil
325a0 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  e $test_channel 
325b0 24 73 79 73 74 65 6d 44 61 74 61 53 51 4c 69 74  $systemDataSQLit
325c0 65 4c 69 6e 71 44 6c 6c 46 69 6c 65 0d 0a 20 20  eLinqDllFile..  
325d0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
325e0 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
325f0 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20  [haveConstraint 
32600 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65  [appendArgs file
32610 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  _ \..           
32620 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20       [file tail 
32630 24 73 79 73 74 65 6d 44 61 74 61 53 51 4c 69 74  $systemDataSQLit
32640 65 45 66 36 44 6c 6c 46 69 6c 65 5d 5d 5d 7d 20  eEf6DllFile]]]} 
32650 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
32660 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69        checkForFi
32670 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c  le $test_channel
32680 20 24 73 79 73 74 65 6d 44 61 74 61 53 51 4c 69   $systemDataSQLi
32690 74 65 45 66 36 44 6c 6c 46 69 6c 65 0d 0a 20 20  teEf6DllFile..  
326a0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
326b0 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
326c0 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20  [haveConstraint 
326d0 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65  [appendArgs file
326e0 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  _ \..           
326f0 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20       [file tail 
32700 24 74 65 73 74 45 78 65 46 69 6c 65 5d 5d 5d 7d  $testExeFile]]]}
32710 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
32720 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46         checkForF
32730 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65  ile $test_channe
32740 6c 20 24 74 65 73 74 45 78 65 46 69 6c 65 20 74  l $testExeFile t
32750 65 73 74 2e 65 78 65 0d 0a 20 20 20 20 20 20 20  est.exe..       
32760 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
32770 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65        if {![have
32780 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65  Constraint [appe
32790 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a  ndArgs file_ \..
327a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
327b0 5b 66 69 6c 65 20 74 61 69 6c 20 24 74 65 73 74  [file tail $test
327c0 4c 69 6e 71 45 78 65 46 69 6c 65 5d 5d 5d 7d 20  LinqExeFile]]]} 
327d0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
327e0 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69        checkForFi
327f0 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c  le $test_channel
32800 20 24 74 65 73 74 4c 69 6e 71 45 78 65 46 69 6c   $testLinqExeFil
32810 65 20 74 65 73 74 6c 69 6e 71 2e 65 78 65 0d 0a  e testlinq.exe..
32820 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
32830 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
32840 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e  {![haveConstrain
32850 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69  t [appendArgs fi
32860 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  le_ \..         
32870 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69         [file tai
32880 6c 20 24 74 65 73 74 45 66 36 45 78 65 46 69 6c  l $testEf6ExeFil
32890 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  e]]]} then {..  
328a0 20 20 20 20 20 20 20 20 20 20 20 20 63 68 65 63              chec
328b0 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63  kForFile $test_c
328c0 68 61 6e 6e 65 6c 20 24 74 65 73 74 45 66 36 45  hannel $testEf6E
328d0 78 65 46 69 6c 65 20 74 65 73 74 65 66 36 2e 65  xeFile testef6.e
328e0 78 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  xe..            
328f0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
32900 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74   if {![haveConst
32910 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67  raint [appendArg
32920 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20  s file_ \..     
32930 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65             [file
32940 20 74 61 69 6c 20 24 74 65 73 74 4c 69 6e 71 4f   tail $testLinqO
32950 75 74 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20  utFile]]]} then 
32960 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
32970 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74   checkForFile $t
32980 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73  est_channel $tes
32990 74 4c 69 6e 71 4f 75 74 46 69 6c 65 0d 0a 20 20  tLinqOutFile..  
329a0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
329b0 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
329c0 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20  [haveConstraint 
329d0 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65  [appendArgs file
329e0 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  _ \..           
329f0 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20       [file tail 
32a00 24 6e 6f 72 74 68 77 69 6e 64 45 66 44 62 46 69  $northwindEfDbFi
32a10 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  le]]]} then {.. 
32a20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 68 65               che
32a30 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f  ckForFile $test_
32a40 63 68 61 6e 6e 65 6c 20 24 6e 6f 72 74 68 77 69  channel $northwi
32a50 6e 64 45 66 44 62 46 69 6c 65 0d 0a 20 20 20 20  ndEfDbFile..    
32a60 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
32a70 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68           if {![h
32a80 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61  aveConstraint [a
32a90 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20  ppendArgs file_ 
32aa0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
32ab0 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 6e     [file tail $n
32ac0 6f 6e 57 61 6c 44 62 46 69 6c 65 5d 5d 5d 7d 20  onWalDbFile]]]} 
32ad0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
32ae0 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69        checkForFi
32af0 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c  le $test_channel
32b00 20 24 6e 6f 6e 57 61 6c 44 62 46 69 6c 65 0d 0a   $nonWalDbFile..
32b10 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
32b20 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
32b30 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e  {![haveConstrain
32b40 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69  t [appendArgs fi
32b50 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  le_ \..         
32b60 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69         [file tai
32b70 6c 20 24 77 61 6c 44 62 46 69 6c 65 5d 5d 5d 7d  l $walDbFile]]]}
32b80 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
32b90 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46         checkForF
32ba0 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65  ile $test_channe
32bb0 6c 20 24 77 61 6c 44 62 46 69 6c 65 0d 0a 20 20  l $walDbFile..  
32bc0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
32bd0 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
32be0 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20  [haveConstraint 
32bf0 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65  [appendArgs file
32c00 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  _ \..           
32c10 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20       [file tail 
32c20 24 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30  $testInstallVs20
32c30 30 35 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74 68  05LogFile]]]} th
32c40 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
32c50 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65      checkForFile
32c60 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24   $test_channel $
32c70 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 30  testInstallVs200
32c80 35 4c 6f 67 46 69 6c 65 0d 0a 20 20 20 20 20 20  5LogFile..      
32c90 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
32ca0 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76         if {![hav
32cb0 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70  eConstraint [app
32cc0 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d  endArgs file_ \.
32cd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
32ce0 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 74 65 73   [file tail $tes
32cf0 74 49 6e 73 74 61 6c 6c 56 73 32 30 30 38 4c 6f  tInstallVs2008Lo
32d00 67 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b  gFile]]]} then {
32d10 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
32d20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65  checkForFile $te
32d30 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73 74  st_channel $test
32d40 49 6e 73 74 61 6c 6c 56 73 32 30 30 38 4c 6f 67  InstallVs2008Log
32d50 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 20 20  File..          
32d60 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
32d70 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e     if {![haveCon
32d80 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41  straint [appendA
32d90 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20  rgs file_ \..   
32da0 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69               [fi
32db0 6c 65 20 74 61 69 6c 20 24 74 65 73 74 49 6e 73  le tail $testIns
32dc0 74 61 6c 6c 56 73 32 30 31 30 4c 6f 67 46 69 6c  tallVs2010LogFil
32dd0 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  e]]]} then {..  
32de0 20 20 20 20 20 20 20 20 20 20 20 20 63 68 65 63              chec
32df0 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63  kForFile $test_c
32e00 68 61 6e 6e 65 6c 20 24 74 65 73 74 49 6e 73 74  hannel $testInst
32e10 61 6c 6c 56 73 32 30 31 30 4c 6f 67 46 69 6c 65  allVs2010LogFile
32e20 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
32e30 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ...            i
32e40 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61  f {![haveConstra
32e50 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20  int [appendArgs 
32e60 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20  file_ \..       
32e70 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74           [file t
32e80 61 69 6c 20 24 74 65 73 74 49 6e 73 74 61 6c 6c  ail $testInstall
32e90 56 73 32 30 31 32 4c 6f 67 46 69 6c 65 5d 5d 5d  Vs2012LogFile]]]
32ea0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
32eb0 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72          checkFor
32ec0 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e  File $test_chann
32ed0 65 6c 20 24 74 65 73 74 49 6e 73 74 61 6c 6c 56  el $testInstallV
32ee0 73 32 30 31 32 4c 6f 67 46 69 6c 65 0d 0a 20 20  s2012LogFile..  
32ef0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
32f00 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
32f10 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20  [haveConstraint 
32f20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65  [appendArgs file
32f30 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  _ \..           
32f40 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20       [file tail 
32f50 24 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30  $testInstallVs20
32f60 31 33 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74 68  13LogFile]]]} th
32f70 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
32f80 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65      checkForFile
32f90 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24   $test_channel $
32fa0 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 31  testInstallVs201
32fb0 33 4c 6f 67 46 69 6c 65 0d 0a 20 20 20 20 20 20  3LogFile..      
32fc0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
32fd0 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76         if {![hav
32fe0 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70  eConstraint [app
32ff0 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d  endArgs file_ \.
33000 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
33010 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 74 65 73   [file tail $tes
33020 74 49 6e 73 74 61 6c 6c 56 73 32 30 31 35 4c 6f  tInstallVs2015Lo
33030 67 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b  gFile]]]} then {
33040 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
33050 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65  checkForFile $te
33060 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73 74  st_channel $test
33070 49 6e 73 74 61 6c 6c 56 73 32 30 31 35 4c 6f 67  InstallVs2015Log
33080 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 20 20  File..          
33090 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
330a0 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e     if {![haveCon
330b0 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41  straint [appendA
330c0 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20  rgs file_ \..   
330d0 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69               [fi
330e0 6c 65 20 74 61 69 6c 20 24 74 65 73 74 49 6e 73  le tail $testIns
330f0 74 61 6c 6c 56 73 32 30 31 37 4c 6f 67 46 69 6c  tallVs2017LogFil
33100 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  e]]]} then {..  
33110 20 20 20 20 20 20 20 20 20 20 20 20 63 68 65 63              chec
33120 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63  kForFile $test_c
33130 68 61 6e 6e 65 6c 20 24 74 65 73 74 49 6e 73 74  hannel $testInst
33140 61 6c 6c 56 73 32 30 31 37 4c 6f 67 46 69 6c 65  allVs2017LogFile
33150 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
33160 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ...            i
33170 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61  f {![haveConstra
33180 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20  int [appendArgs 
33190 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20  file_ \..       
331a0 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74           [file t
331b0 61 69 6c 20 24 74 65 73 74 55 6e 69 6e 73 74 61  ail $testUninsta
331c0 6c 6c 56 73 32 30 30 35 4c 6f 67 46 69 6c 65 5d  llVs2005LogFile]
331d0 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  ]]} then {..    
331e0 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 46            checkF
331f0 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61  orFile $test_cha
33200 6e 6e 65 6c 20 24 74 65 73 74 55 6e 69 6e 73 74  nnel $testUninst
33210 61 6c 6c 56 73 32 30 30 35 4c 6f 67 46 69 6c 65  allVs2005LogFile
33220 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
33230 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ...            i
33240 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61  f {![haveConstra
33250 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20  int [appendArgs 
33260 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20  file_ \..       
33270 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74           [file t
33280 61 69 6c 20 24 74 65 73 74 55 6e 69 6e 73 74 61  ail $testUninsta
33290 6c 6c 56 73 32 30 30 38 4c 6f 67 46 69 6c 65 5d  llVs2008LogFile]
332a0 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  ]]} then {..    
332b0 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 46            checkF
332c0 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61  orFile $test_cha
332d0 6e 6e 65 6c 20 24 74 65 73 74 55 6e 69 6e 73 74  nnel $testUninst
332e0 61 6c 6c 56 73 32 30 30 38 4c 6f 67 46 69 6c 65  allVs2008LogFile
332f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
33300 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ...            i
33310 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61  f {![haveConstra
33320 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20  int [appendArgs 
33330 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20  file_ \..       
33340 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74           [file t
33350 61 69 6c 20 24 74 65 73 74 55 6e 69 6e 73 74 61  ail $testUninsta
33360 6c 6c 56 73 32 30 31 30 4c 6f 67 46 69 6c 65 5d  llVs2010LogFile]
33370 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  ]]} then {..    
33380 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 46            checkF
33390 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61  orFile $test_cha
333a0 6e 6e 65 6c 20 24 74 65 73 74 55 6e 69 6e 73 74  nnel $testUninst
333b0 61 6c 6c 56 73 32 30 31 30 4c 6f 67 46 69 6c 65  allVs2010LogFile
333c0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
333d0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ...            i
333e0 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61  f {![haveConstra
333f0 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20  int [appendArgs 
33400 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20  file_ \..       
33410 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74           [file t
33420 61 69 6c 20 24 74 65 73 74 55 6e 69 6e 73 74 61  ail $testUninsta
33430 6c 6c 56 73 32 30 31 32 4c 6f 67 46 69 6c 65 5d  llVs2012LogFile]
33440 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  ]]} then {..    
33450 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 46            checkF
33460 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61  orFile $test_cha
33470 6e 6e 65 6c 20 24 74 65 73 74 55 6e 69 6e 73 74  nnel $testUninst
33480 61 6c 6c 56 73 32 30 31 32 4c 6f 67 46 69 6c 65  allVs2012LogFile
33490 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
334a0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ...            i
334b0 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61  f {![haveConstra
334c0 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20  int [appendArgs 
334d0 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20  file_ \..       
334e0 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74           [file t
334f0 61 69 6c 20 24 74 65 73 74 55 6e 69 6e 73 74 61  ail $testUninsta
33500 6c 6c 56 73 32 30 31 33 4c 6f 67 46 69 6c 65 5d  llVs2013LogFile]
33510 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  ]]} then {..    
33520 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 46            checkF
33530 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61  orFile $test_cha
33540 6e 6e 65 6c 20 24 74 65 73 74 55 6e 69 6e 73 74  nnel $testUninst
33550 61 6c 6c 56 73 32 30 31 33 4c 6f 67 46 69 6c 65  allVs2013LogFile
33560 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
33570 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ...            i
33580 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61  f {![haveConstra
33590 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20  int [appendArgs 
335a0 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20  file_ \..       
335b0 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74           [file t
335c0 61 69 6c 20 24 74 65 73 74 55 6e 69 6e 73 74 61  ail $testUninsta
335d0 6c 6c 56 73 32 30 31 35 4c 6f 67 46 69 6c 65 5d  llVs2015LogFile]
335e0 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  ]]} then {..    
335f0 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 46            checkF
33600 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61  orFile $test_cha
33610 6e 6e 65 6c 20 24 74 65 73 74 55 6e 69 6e 73 74  nnel $testUninst
33620 61 6c 6c 56 73 32 30 31 35 4c 6f 67 46 69 6c 65  allVs2015LogFile
33630 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
33640 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ...            i
33650 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61  f {![haveConstra
33660 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20  int [appendArgs 
33670 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20  file_ \..       
33680 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74           [file t
33690 61 69 6c 20 24 74 65 73 74 55 6e 69 6e 73 74 61  ail $testUninsta
336a0 6c 6c 56 73 32 30 31 37 4c 6f 67 46 69 6c 65 5d  llVs2017LogFile]
336b0 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  ]]} then {..    
336c0 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 46            checkF
336d0 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61  orFile $test_cha
336e0 6e 6e 65 6c 20 24 74 65 73 74 55 6e 69 6e 73 74  nnel $testUninst
336f0 61 6c 6c 56 73 32 30 31 37 4c 6f 67 46 69 6c 65  allVs2017LogFile
33700 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
33710 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
33720 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
33730 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
33740 70 72 6f 63 20 72 75 6e 53 51 4c 69 74 65 54 65  proc runSQLiteTe
33750 73 74 46 69 6c 65 73 45 70 69 6c 6f 67 75 65 20  stFilesEpilogue 
33760 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20  {} {..      #.. 
33770 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69       # NOTE: Ski
33780 70 20 72 75 6e 6e 69 6e 67 20 6f 75 72 20 63 75  p running our cu
33790 73 74 6f 6d 20 66 69 6c 65 73 20 65 70 69 6c 6f  stom files epilo
337a0 67 75 65 20 69 66 20 74 68 65 20 6d 61 69 6e 20  gue if the main 
337b0 6f 6e 65 20 68 61 73 20 62 65 65 6e 0d 0a 20 20  one has been..  
337c0 20 20 20 20 23 20 20 20 20 20 20 20 73 6b 69 70      #       skip
337d0 70 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ped...      #.. 
337e0 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
337f0 65 78 69 73 74 73 20 3a 3a 6e 6f 28 65 70 69 6c  exists ::no(epil
33800 6f 67 75 65 2e 65 61 67 6c 65 29 5d 7d 20 74 68  ogue.eagle)]} th
33810 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 75 70  en {..        up
33820 6c 65 76 65 6c 20 31 20 7b 0d 0a 20 20 20 20 20  level 1 {..     
33830 20 20 20 20 20 75 6e 73 65 74 20 2d 6e 6f 63 6f       unset -noco
33840 6d 70 6c 61 69 6e 20 5c 0d 0a 20 20 20 20 20 20  mplain \..      
33850 20 20 20 20 20 20 20 20 74 65 73 74 55 6e 69 6e          testUnin
33860 73 74 61 6c 6c 56 73 32 30 31 37 4c 6f 67 46 69  stallVs2017LogFi
33870 6c 65 20 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c  le testUninstall
33880 56 73 32 30 31 35 4c 6f 67 46 69 6c 65 20 5c 0d  Vs2015LogFile \.
33890 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  .              t
338a0 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30  estUninstallVs20
338b0 31 33 4c 6f 67 46 69 6c 65 20 74 65 73 74 55 6e  13LogFile testUn
338c0 69 6e 73 74 61 6c 6c 56 73 32 30 31 32 4c 6f 67  installVs2012Log
338d0 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  File \..        
338e0 20 20 20 20 20 20 74 65 73 74 55 6e 69 6e 73 74        testUninst
338f0 61 6c 6c 56 73 32 30 31 30 4c 6f 67 46 69 6c 65  allVs2010LogFile
33900 20 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73   testUninstallVs
33910 32 30 30 38 4c 6f 67 46 69 6c 65 20 5c 0d 0a 20  2008LogFile \.. 
33920 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73               tes
33930 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 30 35  tUninstallVs2005
33940 4c 6f 67 46 69 6c 65 20 74 65 73 74 49 6e 73 74  LogFile testInst
33950 61 6c 6c 56 73 32 30 31 37 4c 6f 67 46 69 6c 65  allVs2017LogFile
33960 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
33970 20 20 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32    testInstallVs2
33980 30 31 35 4c 6f 67 46 69 6c 65 20 74 65 73 74 49  015LogFile testI
33990 6e 73 74 61 6c 6c 56 73 32 30 31 33 4c 6f 67 46  nstallVs2013LogF
339a0 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ile \..         
339b0 20 20 20 20 20 74 65 73 74 49 6e 73 74 61 6c 6c       testInstall
339c0 56 73 32 30 31 32 4c 6f 67 46 69 6c 65 20 74 65  Vs2012LogFile te
339d0 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 31 30 4c  stInstallVs2010L
339e0 6f 67 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20  ogFile \..      
339f0 20 20 20 20 20 20 20 20 74 65 73 74 49 6e 73 74          testInst
33a00 61 6c 6c 56 73 32 30 30 38 4c 6f 67 46 69 6c 65  allVs2008LogFile
33a10 20 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30   testInstallVs20
33a20 30 35 4c 6f 67 46 69 6c 65 0d 0a 0d 0a 20 20 20  05LogFile....   
33a30 20 20 20 20 20 20 20 75 6e 73 65 74 20 2d 6e 6f         unset -no
33a40 63 6f 6d 70 6c 61 69 6e 20 5c 0d 0a 20 20 20 20  complain \..    
33a50 20 20 20 20 20 20 20 20 20 20 6e 6f 72 74 68 77            northw
33a60 69 6e 64 45 66 44 62 46 69 6c 65 20 74 65 73 74  indEfDbFile test
33a70 4c 69 6e 71 4f 75 74 46 69 6c 65 20 5c 0d 0a 20  LinqOutFile \.. 
33a80 20 20 20 20 20 20 20 20 20 20 20 20 20 77 61 6c               wal
33a90 44 62 46 69 6c 65 20 6e 6f 6e 57 61 6c 44 62 46  DbFile nonWalDbF
33aa0 69 6c 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ile....         
33ab0 20 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61   unset -nocompla
33ac0 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  in \..          
33ad0 20 20 20 20 74 65 73 74 45 66 36 45 78 65 46 69      testEf6ExeFi
33ae0 6c 65 20 74 65 73 74 4c 69 6e 71 45 78 65 46 69  le testLinqExeFi
33af0 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  le \..          
33b00 20 20 20 20 74 65 73 74 45 78 65 46 69 6c 65 20      testExeFile 
33b10 73 79 73 74 65 6d 44 61 74 61 53 51 4c 69 74 65  systemDataSQLite
33b20 45 66 36 44 6c 6c 46 69 6c 65 20 5c 0d 0a 20 20  Ef6DllFile \..  
33b30 20 20 20 20 20 20 20 20 20 20 20 20 73 79 73 74              syst
33b40 65 6d 44 61 74 61 53 51 4c 69 74 65 4c 69 6e 71  emDataSQLiteLinq
33b50 44 6c 6c 46 69 6c 65 20 73 79 73 74 65 6d 44 61  DllFile systemDa
33b60 74 61 53 51 4c 69 74 65 44 6c 6c 46 69 6c 65 20  taSQLiteDllFile 
33b70 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
33b80 20 73 71 6c 69 74 65 44 65 73 69 67 6e 65 72 44   sqliteDesignerD
33b90 6c 6c 46 69 6c 65 20 69 6e 73 74 61 6c 6c 65 72  llFile installer
33ba0 45 78 65 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20  ExeFile \..     
33bb0 20 20 20 20 20 20 20 20 20 65 6e 74 69 74 79 46           entityF
33bc0 72 61 6d 65 77 6f 72 6b 44 6c 6c 46 69 6c 65 0d  rameworkDllFile.
33bd0 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
33be0 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
33bf0 20 20 20 70 72 6f 63 20 72 75 6e 53 51 4c 69 74     proc runSQLit
33c00 65 54 65 73 74 45 70 69 6c 6f 67 75 65 20 7b 7d  eTestEpilogue {}
33c10 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
33c20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20     # NOTE: Skip 
33c30 72 75 6e 6e 69 6e 67 20 6f 75 72 20 63 75 73 74  running our cust
33c40 6f 6d 20 65 70 69 6c 6f 67 75 65 20 69 66 20 74  om epilogue if t
33c50 68 65 20 6d 61 69 6e 20 6f 6e 65 20 68 61 73 20  he main one has 
33c60 62 65 65 6e 0d 0a 20 20 20 20 20 20 23 20 20 20  been..      #   
33c70 20 20 20 20 73 6b 69 70 70 65 64 2e 0d 0a 20 20      skipped...  
33c80 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
33c90 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
33ca0 3a 6e 6f 28 65 70 69 6c 6f 67 75 65 2e 65 61 67  :no(epilogue.eag
33cb0 6c 65 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  le)]} then {..  
33cc0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
33cd0 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20 77 68   # NOTE: Show wh
33ce0 65 6e 20 6f 75 72 20 74 65 73 74 73 20 61 63 74  en our tests act
33cf0 75 61 6c 6c 79 20 65 6e 64 65 64 20 28 6e 6f 77  ually ended (now
33d00 29 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  )...        #.. 
33d10 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
33d20 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
33d30 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
33d40 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 53 79          "---- Sy
33d50 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
33d60 20 74 65 73 74 73 20 65 6e 64 65 64 20 61 74 20   tests ended at 
33d70 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
33d80 20 5b 63 6c 6f 63 6b 20 66 6f 72 6d 61 74 20 5b   [clock format [
33d90 63 6c 6f 63 6b 20 73 65 63 6f 6e 64 73 5d 5d 20  clock seconds]] 
33da0 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23  \n]....        #
33db0 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
33dc0 3a 20 4c 6f 61 64 20 74 68 65 20 22 65 70 69 6c  : Load the "epil
33dd0 6f 67 75 65 22 20 63 75 73 74 6f 6d 20 70 65 72  ogue" custom per
33de0 2d 75 73 65 72 20 61 6e 64 2f 6f 72 20 70 65 72  -user and/or per
33df0 2d 68 6f 73 74 20 74 65 73 74 0d 0a 20 20 20 20  -host test..    
33e00 20 20 20 20 23 20 20 20 20 20 20 20 73 65 74 74      #       sett
33e10 69 6e 67 73 20 6e 6f 77 2e 0d 0a 20 20 20 20 20  ings now...     
33e20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 75 70     #..        up
33e30 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74 20 6c 6f  level 1 [list lo
33e40 61 64 53 51 4c 69 74 65 54 65 73 74 53 65 74 74  adSQLiteTestSett
33e50 69 6e 67 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  ings $::test_cha
33e60 6e 6e 65 6c 20 2e 65 70 69 6c 6f 67 75 65 5d 0d  nnel .epilogue].
33e70 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
33e80 20 20 20 20 20 20 23 20 42 55 47 46 49 58 3a 20        # BUGFIX: 
33e90 42 65 66 6f 72 65 20 63 68 65 63 6b 69 6e 67 20  Before checking 
33ea0 74 68 65 20 66 69 6e 61 6c 20 72 65 73 6f 75 72  the final resour
33eb0 63 65 73 20 69 6e 20 75 73 65 20 62 79 20 53 51  ces in use by SQ
33ec0 4c 69 74 65 2c 20 6d 61 6b 65 0d 0a 20 20 20 20  Lite, make..    
33ed0 20 20 20 20 23 20 20 20 20 20 20 20 20 20 73 75      #         su
33ee0 72 65 20 62 6f 74 68 20 6f 66 20 74 68 65 20 50  re both of the P
33ef0 52 41 47 4d 41 20 72 65 6c 61 74 65 64 20 64 69  RAGMA related di
33f00 72 65 63 74 6f 72 79 20 6e 61 6d 65 73 20 61 72  rectory names ar
33f10 65 20 66 72 65 65 64 2e 0d 0a 20 20 20 20 20 20  e freed...      
33f20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 63 68 65    #..        che
33f30 63 6b 46 6f 72 53 51 4c 69 74 65 44 69 72 65 63  ckForSQLiteDirec
33f40 74 6f 72 69 65 73 20 24 3a 3a 74 65 73 74 5f 63  tories $::test_c
33f50 68 61 6e 6e 65 6c 20 74 72 75 65 0d 0a 0d 0a 20  hannel true.... 
33f60 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
33f70 20 20 23 20 4e 4f 54 45 3a 20 41 6c 73 6f 20 72    # NOTE: Also r
33f80 65 70 6f 72 74 20 74 68 65 20 72 65 73 6f 75 72  eport the resour
33f90 63 65 20 75 73 61 67 65 20 61 66 74 65 72 20 72  ce usage after r
33fa0 75 6e 6e 69 6e 67 20 74 68 65 20 74 65 73 74 73  unning the tests
33fb0 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
33fc0 20 20 20 20 20 20 72 65 70 6f 72 74 53 51 4c 69        reportSQLi
33fd0 74 65 52 65 73 6f 75 72 63 65 73 20 24 3a 3a 74  teResources $::t
33fe0 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20  est_channel.... 
33ff0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
34000 20 20 23 20 4e 4f 54 45 3a 20 52 65 70 6f 72 74    # NOTE: Report
34010 20 74 68 65 20 63 72 69 74 69 63 61 6c 20 68 61   the critical ha
34020 6e 64 6c 65 20 63 6f 75 6e 74 73 20 61 66 74 65  ndle counts afte
34030 72 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 74 65  r running the te
34040 73 74 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  sts...        #.
34050 0a 20 20 20 20 20 20 20 20 67 65 74 53 51 4c 69  .        getSQLi
34060 74 65 48 61 6e 64 6c 65 43 6f 75 6e 74 73 20 24  teHandleCounts $
34070 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a  ::test_channel..
34080 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
34090 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20       # NOTE: If 
340a0 6e 65 63 65 73 73 61 72 79 2c 20 64 69 73 61 62  necessary, disab
340b0 6c 65 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  le shared-cache 
340c0 6d 6f 64 65 20 6e 6f 77 2e 0d 0a 20 20 20 20 20  mode now...     
340d0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66     #..        if
340e0 20 7b 5b 68 61 73 52 75 6e 74 69 6d 65 4f 70 74   {[hasRuntimeOpt
340f0 69 6f 6e 20 73 68 61 72 65 64 43 61 63 68 65 5d  ion sharedCache]
34100 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
34110 20 20 20 20 65 6e 61 62 6c 65 53 68 61 72 65 64      enableShared
34120 43 61 63 68 65 20 24 3a 3a 74 65 73 74 5f 63 68  Cache $::test_ch
34130 61 6e 6e 65 6c 20 66 61 6c 73 65 0d 0a 20 20 20  annel false..   
34140 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
34150 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
34160 4f 54 45 3a 20 52 65 73 74 6f 72 65 20 74 68 65  OTE: Restore the
34170 20 70 72 65 76 69 6f 75 73 6c 79 20 73 61 76 65   previously save
34180 64 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61  d environment va
34190 72 69 61 62 6c 65 73 20 74 68 61 74 20 77 65 0d  riables that we.
341a0 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
341b0 20 63 68 61 6e 67 65 64 20 66 6f 72 20 74 68 65   changed for the
341c0 20 74 65 73 74 20 73 75 69 74 65 2e 0d 0a 20 20   test suite...  
341d0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
341e0 20 72 65 73 74 6f 72 65 45 6e 76 69 72 6f 6e 6d   restoreEnvironm
341f0 65 6e 74 56 61 72 69 61 62 6c 65 73 20 5c 0d 0a  entVariables \..
34200 20 20 20 20 20 20 20 20 20 20 20 20 5b 6c 69 73              [lis
34210 74 20 49 6e 69 74 69 61 6c 69 7a 65 5f 53 51 4c  t Initialize_SQL
34220 69 74 65 4c 6f 67 5d 20 3a 3a 74 65 73 74 53 75  iteLog] ::testSu
34230 69 74 65 53 61 76 65 64 45 6e 76 0d 0a 20 20 20  iteSavedEnv..   
34240 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
34250 20 20 20 20 23 23 23 23 23 23 23 23 23 23 23 23      ############
34260 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
34270 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
34280 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
34290 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d  ###############.
342a0 0a 20 20 20 20 23 23 23 23 23 23 23 23 23 23 23  .    ###########
342b0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
342c0 23 23 20 45 4e 44 20 45 61 67 6c 65 20 4f 4e 4c  ## END Eagle ONL
342d0 59 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23  Y ##############
342e0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
342f0 0d 0a 20 20 20 20 23 23 23 23 23 23 23 23 23 23  ..    ##########
34300 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
34310 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
34320 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
34330 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
34340 23 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 23 0d 0a 20  #..  }....  #.. 
34350 20 23 20 4e 4f 54 45 3a 20 53 61 76 65 20 74 68   # NOTE: Save th
34360 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 69  e name of the di
34370 72 65 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69  rectory containi
34380 6e 67 20 74 68 69 73 20 66 69 6c 65 2e 0d 0a 20  ng this file... 
34390 20 23 0d 0a 20 20 69 66 20 7b 21 5b 69 6e 66 6f   #..  if {![info
343a0 20 65 78 69 73 74 73 20 63 6f 6d 6d 6f 6e 5f 64   exists common_d
343b0 69 72 65 63 74 6f 72 79 5d 7d 20 74 68 65 6e 20  irectory]} then 
343c0 7b 0d 0a 20 20 20 20 73 65 74 20 63 6f 6d 6d 6f  {..    set commo
343d0 6e 5f 64 69 72 65 63 74 6f 72 79 20 5b 66 69 6c  n_directory [fil
343e0 65 20 64 69 72 6e 61 6d 65 20 5b 69 6e 66 6f 20  e dirname [info 
343f0 73 63 72 69 70 74 5d 5d 0d 0a 20 20 7d 0d 0a 0d  script]]..  }...
34400 0a 20 20 23 0d 0a 20 20 23 20 4e 4f 54 45 3a 20  .  #..  # NOTE: 
34410 50 72 6f 76 69 64 65 20 74 68 65 20 53 79 73 74  Provide the Syst
34420 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 74  em.Data.SQLite t
34430 65 73 74 20 70 61 63 6b 61 67 65 20 74 6f 20 74  est package to t
34440 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0d  he interpreter..
34450 0a 20 20 23 0d 0a 20 20 70 61 63 6b 61 67 65 20  .  #..  package 
34460 70 72 6f 76 69 64 65 20 53 79 73 74 65 6d 2e 44  provide System.D
34470 61 74 61 2e 53 51 4c 69 74 65 2e 54 65 73 74 20  ata.SQLite.Test 
34480 31 2e 30 0d 0a 7d 0d 0a                          1.0..}..