System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact 7ec6e2c1d0d51416d4963cea289231d4e5543ab9:


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 20 4e   NetStandard20 N
1e00: 65 74 53 74 61 6e 64 61 72 64 32 31 5d 0d 0a 20  etStandard21].. 
1e10: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
1e20: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1e30: 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68    # NOTE: Use th
1e40: 65 20 64 65 66 61 75 6c 74 20 6c 69 73 74 20 6f  e default list o
1e50: 66 20 74 65 73 74 20 79 65 61 72 73 20 28 69 2e  f test years (i.
1e60: 65 2e 20 61 6c 6c 29 2e 0d 0a 20 20 20 20 20 20  e. all)...      
1e70: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
1e80: 75 72 6e 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20  urn [list \..   
1e90: 20 20 20 20 20 20 20 20 20 32 30 30 35 20 32 30           2005 20
1ea0: 30 38 20 32 30 31 30 20 32 30 31 32 20 32 30 31  08 2010 2012 201
1eb0: 33 20 32 30 31 35 20 32 30 31 37 20 4e 65 74 53  3 2015 2017 NetS
1ec0: 74 61 6e 64 61 72 64 32 30 20 4e 65 74 53 74 61  tandard20 NetSta
1ed0: 6e 64 61 72 64 32 31 5d 0d 0a 20 20 20 20 20 20  ndard21]..      
1ee0: 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
1ef0: 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20   #..    # NOTE: 
1f00: 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69  This procedure i
1f10: 73 20 6f 6e 6c 79 20 75 73 65 64 20 77 68 65 6e  s only used when
1f20: 20 61 64 64 69 6e 67 20 73 68 69 6d 6d 65 64 20   adding shimmed 
1f30: 74 65 73 74 20 63 6f 6e 73 74 72 61 69 6e 74 73  test constraints
1f40: 2e 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 70 72  ...    #..    pr
1f50: 6f 63 20 67 65 74 42 75 69 6c 64 43 6c 72 56 65  oc getBuildClrVe
1f60: 72 73 69 6f 6e 20 7b 7d 20 7b 0d 0a 20 20 20 20  rsion {} {..    
1f70: 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73    if {[info exis
1f80: 74 73 20 3a 3a 74 65 73 74 5f 63 6c 72 5d 20 26  ts ::test_clr] &
1f90: 26 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68  & [string length
1fa0: 20 24 3a 3a 74 65 73 74 5f 63 6c 72 5d 20 3e 20   $::test_clr] > 
1fb0: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
1fc0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
1fd0: 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20 73 70  NOTE: Use the sp
1fe0: 65 63 69 66 69 65 64 20 74 65 73 74 20 76 65 72  ecified test ver
1ff0: 73 69 6f 6e 20 66 6f 72 20 74 68 65 20 43 4c 52  sion for the CLR
2000: 2e 20 20 49 66 20 74 68 69 73 20 76 61 72 69 61  .  If this varia
2010: 62 6c 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ble..        #  
2020: 20 20 20 20 20 69 73 20 6e 6f 74 20 73 65 74 2c       is not set,
2030: 20 74 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c   the default val
2040: 75 65 20 77 69 6c 6c 20 62 65 20 62 61 73 65 64  ue will be based
2050: 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e   on whether or n
2060: 6f 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ot..        #   
2070: 20 20 20 20 45 61 67 6c 65 20 68 61 73 20 62 65      Eagle has be
2080: 65 6e 20 63 6f 6d 70 69 6c 65 64 20 61 67 61 69  en compiled agai
2090: 6e 73 74 20 74 68 65 20 43 4c 52 20 76 32 2e 30  nst the CLR v2.0
20a0: 20 6f 72 20 43 4c 52 20 76 34 2e 30 2e 0d 0a 20   or CLR v4.0... 
20b0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
20c0: 20 20 72 65 74 75 72 6e 20 24 3a 3a 74 65 73 74    return $::test
20d0: 5f 63 6c 72 0d 0a 20 20 20 20 20 20 7d 20 65 6c  _clr..      } el
20e0: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  se {..        #.
20f0: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
2100: 20 43 68 65 63 6b 20 69 66 20 45 61 67 6c 65 20   Check if Eagle 
2110: 68 61 73 20 62 65 65 6e 20 63 6f 6d 70 69 6c 65  has been compile
2120: 64 20 61 67 61 69 6e 73 74 20 74 68 65 20 43 4c  d against the CL
2130: 52 20 76 34 2e 30 2e 20 20 49 66 20 73 6f 2c 0d  R v4.0.  If so,.
2140: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
2150: 20 6a 75 73 74 20 75 73 65 20 74 68 61 74 20 43   just use that C
2160: 4c 52 20 76 65 72 73 69 6f 6e 2e 20 20 4f 74 68  LR version.  Oth
2170: 65 72 77 69 73 65 2c 20 75 73 65 20 74 68 65 20  erwise, use the 
2180: 76 65 72 73 69 6f 6e 20 66 6f 72 20 74 68 65 0d  version for the.
2190: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
21a0: 20 43 4c 52 20 76 32 2e 30 2e 20 20 49 66 20 61   CLR v2.0.  If a
21b0: 6e 6f 74 68 65 72 20 6d 61 6a 6f 72 20 5b 69 6e  nother major [in
21c0: 63 6f 6d 70 61 74 69 62 6c 65 5d 20 76 65 72 73  compatible] vers
21d0: 69 6f 6e 20 6f 66 20 74 68 65 20 43 4c 52 0d 0a  ion of the CLR..
21e0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
21f0: 69 73 20 72 65 6c 65 61 73 65 64 2c 20 74 68 69  is released, thi
2200: 73 20 63 68 65 63 6b 20 77 69 6c 6c 20 68 61 76  s check will hav
2210: 65 20 74 6f 20 62 65 20 63 68 61 6e 67 65 64 2e  e to be changed.
2220: 20 20 54 68 65 20 64 65 66 61 75 6c 74 0d 0a 20    The default.. 
2230: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 76         #       v
2240: 65 72 73 69 6f 6e 20 76 61 6c 75 65 20 66 6f 72  ersion value for
2250: 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 43 4c   a particular CL
2260: 52 20 76 65 72 73 69 6f 6e 20 6d 61 79 20 62 65  R version may be
2270: 20 6f 76 65 72 72 69 64 64 65 6e 0d 0a 20 20 20   overridden..   
2280: 20 20 20 20 20 23 20 20 20 20 20 20 20 62 79 20       #       by 
2290: 73 65 74 74 69 6e 67 20 74 68 65 20 67 6c 6f 62  setting the glob
22a0: 61 6c 20 76 61 72 69 61 62 6c 65 20 22 74 65 73  al variable "tes
22b0: 74 5f 63 6c 72 5f 76 24 58 22 2c 20 77 68 65 72  t_clr_v$X", wher
22c0: 65 20 22 24 58 22 20 6d 61 79 0d 0a 20 20 20 20  e "$X" may..    
22d0: 20 20 20 20 23 20 20 20 20 20 20 20 5b 63 75 72      #       [cur
22e0: 72 65 6e 74 6c 79 5d 20 62 65 20 65 69 74 68 65  rently] be eithe
22f0: 72 20 22 32 22 20 6f 72 20 22 34 22 2e 0d 0a 20  r "2" or "4"... 
2300: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
2310: 20 20 69 66 20 7b 5b 68 61 76 65 43 6f 6e 73 74    if {[haveConst
2320: 72 61 69 6e 74 20 69 6d 61 67 65 52 75 6e 74 69  raint imageRunti
2330: 6d 65 34 30 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  me40]} then {.. 
2340: 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69 6e           if {[in
2350: 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 73 74  fo exists ::test
2360: 5f 63 6c 72 5f 76 34 5d 20 26 26 20 5c 0d 0a 20  _clr_v4] && \.. 
2370: 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 73 74               [st
2380: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 74  ring length $::t
2390: 65 73 74 5f 63 6c 72 5f 76 34 5d 20 3e 20 30 7d  est_clr_v4] > 0}
23a0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
23b0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
23c0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20      # NOTE: Use 
23d0: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 74 65  the specified te
23e0: 73 74 20 76 65 72 73 69 6f 6e 20 66 6f 72 20 74  st version for t
23f0: 68 65 20 43 4c 52 20 76 34 2e 30 2e 0d 0a 20 20  he CLR v4.0...  
2400: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
2410: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
2420: 24 3a 3a 74 65 73 74 5f 63 6c 72 5f 76 34 0d 0a  $::test_clr_v4..
2430: 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
2440: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
2450: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  #..            #
2460: 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20 64   NOTE: Use the d
2470: 65 66 61 75 6c 74 20 74 65 73 74 20 76 65 72 73  efault test vers
2480: 69 6f 6e 20 66 6f 72 20 74 68 65 20 43 4c 52 20  ion for the CLR 
2490: 76 34 2e 30 2e 0d 0a 20 20 20 20 20 20 20 20 20  v4.0...         
24a0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
24b0: 20 20 72 65 74 75 72 6e 20 34 2e 30 2e 33 30 33    return 4.0.303
24c0: 31 39 3b 20 23 20 54 4f 44 4f 3a 20 47 6f 6f 64  19; # TODO: Good
24d0: 20 22 66 61 6c 6c 62 61 63 6b 22 20 64 65 66 61   "fallback" defa
24e0: 75 6c 74 3f 0d 0a 20 20 20 20 20 20 20 20 20 20  ult?..          
24f0: 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73  }..        } els
2500: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69  e {..          i
2510: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
2520: 3a 3a 74 65 73 74 5f 63 6c 72 5f 76 32 5d 20 26  ::test_clr_v2] &
2530: 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  & \..           
2540: 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74     [string lengt
2550: 68 20 24 3a 3a 74 65 73 74 5f 63 6c 72 5f 76 32  h $::test_clr_v2
2560: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
2570: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
2580: 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
2590: 3a 20 55 73 65 20 74 68 65 20 73 70 65 63 69 66  : Use the specif
25a0: 69 65 64 20 74 65 73 74 20 76 65 72 73 69 6f 6e  ied test version
25b0: 20 66 6f 72 20 74 68 65 20 43 4c 52 20 76 32 2e   for the CLR v2.
25c0: 30 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  0...            
25d0: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  #..            r
25e0: 65 74 75 72 6e 20 24 3a 3a 74 65 73 74 5f 63 6c  eturn $::test_cl
25f0: 72 5f 76 32 0d 0a 20 20 20 20 20 20 20 20 20 20  r_v2..          
2600: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
2610: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
2620: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65       # NOTE: Use
2630: 20 74 68 65 20 64 65 66 61 75 6c 74 20 74 65 73   the default tes
2640: 74 20 76 65 72 73 69 6f 6e 20 66 6f 72 20 74 68  t version for th
2650: 65 20 43 4c 52 20 76 32 2e 30 2e 0d 0a 20 20 20  e CLR v2.0...   
2660: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
2670: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 32          return 2
2680: 2e 30 2e 35 30 37 32 37 3b 20 23 20 54 4f 44 4f  .0.50727; # TODO
2690: 3a 20 47 6f 6f 64 20 22 66 61 6c 6c 62 61 63 6b  : Good "fallback
26a0: 22 20 64 65 66 61 75 6c 74 3f 0d 0a 20 20 20 20  " default?..    
26b0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
26c0: 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20   }..      }..   
26d0: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
26e0: 67 65 74 42 75 69 6c 64 4e 65 74 46 78 20 7b 7d  getBuildNetFx {}
26f0: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
2700: 20 20 20 23 20 4e 4f 54 45 3a 20 53 65 65 20 69     # NOTE: See i
2710: 66 20 74 68 65 20 74 65 73 74 20 2e 4e 45 54 20  f the test .NET 
2720: 46 72 61 6d 65 77 6f 72 6b 20 73 65 74 74 69 6e  Framework settin
2730: 67 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72  g has been overr
2740: 69 64 64 65 6e 20 62 79 0d 0a 20 20 20 20 20 20  idden by..      
2750: 23 20 20 20 20 20 20 20 74 68 65 20 75 73 65 72  #       the user
2760: 20 28 65 2e 67 2e 20 6f 6e 20 74 68 65 20 63 6f   (e.g. on the co
2770: 6d 6d 61 6e 64 20 6c 69 6e 65 29 2e 0d 0a 20 20  mmand line)...  
2780: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
2790: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
27a0: 74 65 73 74 5f 6e 65 74 5f 66 78 5d 20 26 26 20  test_net_fx] && 
27b0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74  \..          [st
27c0: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 74  ring length $::t
27d0: 65 73 74 5f 6e 65 74 5f 66 78 5d 20 3e 20 30 7d  est_net_fx] > 0}
27e0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
27f0: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
2800: 54 45 3a 20 55 73 65 20 74 68 65 20 73 70 65 63  TE: Use the spec
2810: 69 66 69 65 64 20 74 65 73 74 20 2e 4e 45 54 20  ified test .NET 
2820: 46 72 61 6d 65 77 6f 72 6b 2e 0d 0a 20 20 20 20  Framework...    
2830: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
2840: 65 74 75 72 6e 20 24 3a 3a 74 65 73 74 5f 6e 65  eturn $::test_ne
2850: 74 5f 66 78 0d 0a 20 20 20 20 20 20 7d 20 65 6c  t_fx..      } el
2860: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65  se {..        se
2870: 74 20 79 65 61 72 20 5b 67 65 74 42 75 69 6c 64  t year [getBuild
2880: 59 65 61 72 5d 0d 0a 20 20 20 20 20 20 20 20 73  Year]..        s
2890: 65 74 20 79 65 61 72 56 61 72 4e 61 6d 65 20 5b  et yearVarName [
28a0: 61 70 70 65 6e 64 41 72 67 73 20 3a 3a 74 65 73  appendArgs ::tes
28b0: 74 5f 6e 65 74 5f 66 78 5f 20 24 79 65 61 72 5d  t_net_fx_ $year]
28c0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b  ....        if {
28d0: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 24 79 65  [info exists $ye
28e0: 61 72 56 61 72 4e 61 6d 65 5d 20 26 26 20 5c 0d  arVarName] && \.
28f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 73 74  .            [st
2900: 72 69 6e 67 20 6c 65 6e 67 74 68 20 5b 73 65 74  ring length [set
2910: 20 24 79 65 61 72 56 61 72 4e 61 6d 65 5d 5d 20   $yearVarName]] 
2920: 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
2930: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
2940: 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20      # NOTE: Use 
2950: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 74 65  the specified te
2960: 73 74 20 2e 4e 45 54 20 46 72 61 6d 65 77 6f 72  st .NET Framewor
2970: 6b 2c 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  k, based on the 
2980: 62 75 69 6c 64 0d 0a 20 20 20 20 20 20 20 20 20  build..         
2990: 20 23 20 20 20 20 20 20 20 79 65 61 72 2e 0d 0a   #       year...
29a0: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
29b0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 73         return [s
29c0: 65 74 20 24 79 65 61 72 56 61 72 4e 61 6d 65 5d  et $yearVarName]
29d0: 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65  ..        } else
29e0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d   {..          #.
29f0: 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
2a00: 45 3a 20 46 61 6c 6c 62 61 63 6b 20 74 6f 20 74  E: Fallback to t
2a10: 68 65 20 22 77 65 6c 6c 20 6b 6e 6f 77 6e 22 20  he "well known" 
2a20: 2e 4e 45 54 20 46 72 61 6d 65 77 6f 72 6b 20 76  .NET Framework v
2a30: 65 72 73 69 6f 6e 20 74 68 61 74 0d 0a 20 20 20  ersion that..   
2a40: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69         #       i
2a50: 73 20 6d 6f 73 74 20 63 6c 6f 73 65 6c 79 20 61  s most closely a
2a60: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61  ssociated with a
2a70: 20 70 61 72 74 69 63 75 6c 61 72 20 76 65 72 73   particular vers
2a80: 69 6f 6e 20 6f 66 0d 0a 20 20 20 20 20 20 20 20  ion of..        
2a90: 20 20 23 20 20 20 20 20 20 20 56 69 73 75 61 6c    #       Visual
2aa0: 20 53 74 75 64 69 6f 2e 0d 0a 20 20 20 20 20 20   Studio...      
2ab0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
2ac0: 20 73 77 69 74 63 68 20 2d 65 78 61 63 74 20 2d   switch -exact -
2ad0: 2d 20 24 79 65 61 72 20 7b 0d 0a 20 20 20 20 20  - $year {..     
2ae0: 20 20 20 20 20 20 20 32 30 30 35 20 7b 0d 0a 20         2005 {.. 
2af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
2b00: 75 72 6e 20 6e 65 74 46 78 32 30 0d 0a 20 20 20  urn netFx20..   
2b10: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
2b20: 20 20 20 20 20 20 20 20 32 30 30 38 20 7b 0d 0a          2008 {..
2b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
2b40: 74 75 72 6e 20 6e 65 74 46 78 33 35 0d 0a 20 20  turn netFx35..  
2b50: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
2b60: 20 20 20 20 20 20 20 20 20 32 30 31 30 20 7b 0d           2010 {.
2b70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
2b80: 65 74 75 72 6e 20 6e 65 74 46 78 34 30 0d 0a 20  eturn netFx40.. 
2b90: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
2ba0: 20 20 20 20 20 20 20 20 20 20 32 30 31 32 20 7b            2012 {
2bb0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2bc0: 72 65 74 75 72 6e 20 6e 65 74 46 78 34 35 0d 0a  return netFx45..
2bd0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
2be0: 20 20 20 20 20 20 20 20 20 20 20 32 30 31 33 20             2013 
2bf0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
2c00: 20 72 65 74 75 72 6e 20 6e 65 74 46 78 34 35 31   return netFx451
2c10: 3b 20 23 20 54 4f 44 4f 3a 20 4f 72 20 22 6e 65  ; # TODO: Or "ne
2c20: 74 46 78 34 35 32 22 3f 0d 0a 20 20 20 20 20 20  tFx452"?..      
2c30: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
2c40: 20 20 20 20 20 32 30 31 35 20 7b 0d 0a 20 20 20       2015 {..   
2c50: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
2c60: 6e 20 6e 65 74 46 78 34 36 3b 20 23 20 54 4f 44  n netFx46; # TOD
2c70: 4f 3a 20 4f 72 20 22 6e 65 74 46 78 34 36 31 22  O: Or "netFx461"
2c80: 20 2f 20 22 6e 65 74 46 78 34 36 32 22 3f 0d 0a   / "netFx462"?..
2c90: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
2ca0: 20 20 20 20 20 20 20 20 20 20 20 32 30 31 37 20             2017 
2cb0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
2cc0: 20 72 65 74 75 72 6e 20 6e 65 74 46 78 34 37 3b   return netFx47;
2cd0: 20 23 20 54 4f 44 4f 3a 20 4f 72 20 22 6e 65 74   # TODO: Or "net
2ce0: 46 78 34 37 31 22 20 2f 20 22 6e 65 74 46 78 34  Fx471" / "netFx4
2cf0: 37 32 22 3f 0d 0a 20 20 20 20 20 20 20 20 20 20  72"?..          
2d00: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
2d10: 20 4e 65 74 53 74 61 6e 64 61 72 64 32 30 20 7b   NetStandard20 {
2d20: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2d30: 72 65 74 75 72 6e 20 6e 65 74 53 74 61 6e 64 61  return netStanda
2d40: 72 64 32 30 0d 0a 20 20 20 20 20 20 20 20 20 20  rd20..          
2d50: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
2d60: 20 4e 65 74 53 74 61 6e 64 61 72 64 32 31 20 7b   NetStandard21 {
2d70: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2d80: 72 65 74 75 72 6e 20 6e 65 74 53 74 61 6e 64 61  return netStanda
2d90: 72 64 32 31 0d 0a 20 20 20 20 20 20 20 20 20 20  rd21..          
2da0: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
2db0: 20 64 65 66 61 75 6c 74 20 7b 0d 0a 20 20 20 20   default {..    
2dc0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
2dd0: 20 6e 65 74 46 78 33 35 3b 20 23 20 54 4f 44 4f   netFx35; # TODO
2de0: 3a 20 47 6f 6f 64 20 22 66 61 6c 6c 62 61 63 6b  : Good "fallback
2df0: 22 20 64 65 66 61 75 6c 74 3f 0d 0a 20 20 20 20  " default?..    
2e00: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
2e10: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
2e20: 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  }..      }..    
2e30: 7d 0d 0a 0c 0d 0a 20 20 20 20 23 0d 0a 20 20 20  }.....    #..   
2e40: 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 70 72   # NOTE: This pr
2e50: 6f 63 65 64 75 72 65 20 73 68 6f 75 6c 64 20 72  ocedure should r
2e60: 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69  eturn non-zero i
2e70: 66 20 74 68 65 20 63 6f 6e 66 69 67 75 72 65 64  f the configured
2e80: 20 74 65 73 74 0d 0a 20 20 20 20 23 20 20 20 20   test..    #    
2e90: 20 20 20 70 6c 61 74 66 6f 72 6d 20 69 73 20 6d     platform is m
2ea0: 6f 73 74 20 6c 69 6b 65 6c 79 20 74 68 65 20 64  ost likely the d
2eb0: 65 66 61 75 6c 74 20 66 6f 72 20 74 68 69 73 20  efault for this 
2ec0: 6d 61 63 68 69 6e 65 2e 0d 0a 20 20 20 20 23 0d  machine...    #.
2ed0: 0a 20 20 20 20 70 72 6f 63 20 69 73 44 65 66 61  .    proc isDefa
2ee0: 75 6c 74 42 75 69 6c 64 50 6c 61 74 66 6f 72 6d  ultBuildPlatform
2ef0: 20 7b 20 7b 76 65 72 62 6f 73 65 20 74 72 75 65   { {verbose true
2f00: 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a  } } {..      #..
2f10: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 75        # NOTE: Ru
2f20: 6e 6e 69 6e 67 20 6f 6e 20 57 6f 57 36 34 20 69  nning on WoW64 i
2f30: 73 20 6e 65 76 65 72 20 74 68 65 20 64 65 66 61  s never the defa
2f40: 75 6c 74 20 70 6c 61 74 66 6f 72 6d 2e 0d 0a 20  ult platform... 
2f50: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
2f60: 20 7b 5b 69 73 52 75 6e 6e 69 6e 67 57 6f 57 36   {[isRunningWoW6
2f70: 34 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  4]} then {..    
2f80: 20 20 20 20 69 66 20 7b 24 76 65 72 62 6f 73 65      if {$verbose
2f90: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
2fa0: 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
2fb0: 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20  t_channel \..   
2fc0: 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
2fd0: 20 64 65 74 65 63 74 65 64 20 6e 6f 6e 2d 64 65   detected non-de
2fe0: 66 61 75 6c 74 20 70 6c 61 74 66 6f 72 6d 20 28  fault platform (
2ff0: 57 6f 57 36 34 29 5c 6e 22 0d 0a 20 20 20 20 20  WoW64)\n"..     
3000: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
3010: 72 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20  return false..  
3020: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
3030: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
3040: 54 68 69 73 20 68 61 73 20 61 20 67 6f 6f 64 20  This has a good 
3050: 63 68 61 6e 63 65 20 6f 66 20 62 65 69 6e 67 20  chance of being 
3060: 74 68 65 20 64 65 66 61 75 6c 74 20 70 6c 61 74  the default plat
3070: 66 6f 72 6d 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  form...      #..
3080: 20 20 20 20 20 20 69 66 20 7b 24 76 65 72 62 6f        if {$verbo
3090: 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  se} then {..    
30a0: 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
30b0: 74 5f 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20  t_channel "---- 
30c0: 64 65 74 65 63 74 65 64 20 64 65 66 61 75 6c 74  detected default
30d0: 20 70 6c 61 74 66 6f 72 6d 5c 6e 22 0d 0a 20 20   platform\n"..  
30e0: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72      }....      r
30f0: 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20  eturn true..    
3100: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67  }.....    proc g
3110: 65 74 42 75 69 6c 64 50 6c 61 74 66 6f 72 6d 20  etBuildPlatform 
3120: 7b 20 6e 61 74 69 76 65 20 7d 20 7b 0d 0a 20 20  { native } {..  
3130: 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
3140: 69 73 74 73 20 3a 3a 74 65 73 74 5f 70 6c 61 74  ists ::test_plat
3150: 66 6f 72 6d 5d 20 26 26 20 5c 0d 0a 20 20 20 20  form] && \..    
3160: 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65        [string le
3170: 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f 70 6c 61  ngth $::test_pla
3180: 74 66 6f 72 6d 5d 20 3e 20 30 7d 20 74 68 65 6e  tform] > 0} then
3190: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
31a0: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 50         # NOTE: P
31b0: 6f 73 73 69 62 6c 79 20 75 73 65 20 74 68 65 20  ossibly use the 
31c0: 73 70 65 63 69 66 69 65 64 20 74 65 73 74 20 70  specified test p
31d0: 6c 61 74 66 6f 72 6d 2e 20 20 49 66 20 74 68 69  latform.  If thi
31e0: 73 20 76 61 72 69 61 62 6c 65 0d 0a 20 20 20 20  s variable..    
31f0: 20 20 20 20 23 20 20 20 20 20 20 20 69 73 20 6e      #       is n
3200: 6f 74 20 73 65 74 2c 20 74 68 65 20 64 65 66 61  ot set, the defa
3210: 75 6c 74 20 76 61 6c 75 65 20 77 69 6c 6c 20 62  ult value will b
3220: 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 6d  e based on the m
3230: 61 63 68 69 6e 65 0d 0a 20 20 20 20 20 20 20 20  achine..        
3240: 23 20 20 20 20 20 20 20 61 72 63 68 69 74 65 63  #       architec
3250: 74 75 72 65 2e 20 20 4e 6f 72 6d 61 6c 6c 79 2c  ture.  Normally,
3260: 20 74 68 69 73 20 69 73 20 64 6f 6e 65 20 66 6f   this is done fo
3270: 72 20 62 75 69 6c 64 73 20 74 68 61 74 20 69 6e  r builds that in
3280: 76 6f 6c 76 65 0d 0a 20 20 20 20 20 20 20 20 23  volve..        #
3290: 20 20 20 20 20 20 20 74 68 65 20 6d 69 78 65 64         the mixed
32a0: 2d 6d 6f 64 65 20 61 73 73 65 6d 62 6c 79 2e 0d  -mode assembly..
32b0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
32c0: 20 20 20 20 72 65 74 75 72 6e 20 5b 65 78 70 72      return [expr
32d0: 20 7b 24 6e 61 74 69 76 65 20 3f 20 24 3a 3a 74   {$native ? $::t
32e0: 65 73 74 5f 70 6c 61 74 66 6f 72 6d 20 3a 20 22  est_platform : "
32f0: 22 7d 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  "}]..      } els
3300: 65 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74  eif {[info exist
3310: 73 20 3a 3a 74 65 73 74 5f 6d 61 63 68 69 6e 65  s ::test_machine
3320: 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
3330: 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
3340: 20 24 3a 3a 74 65 73 74 5f 6d 61 63 68 69 6e 65   $::test_machine
3350: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
3360: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
3370: 20 20 23 20 4e 4f 54 45 3a 20 46 6f 72 20 6e 61    # NOTE: For na
3380: 74 69 76 65 20 62 75 69 6c 64 73 2c 20 72 65 74  tive builds, ret
3390: 75 72 6e 20 74 68 65 20 70 6c 61 74 66 6f 72 6d  urn the platform
33a0: 20 6e 61 6d 65 20 63 6f 72 72 65 73 70 6f 6e 64   name correspond
33b0: 69 6e 67 20 74 6f 0d 0a 20 20 20 20 20 20 20 20  ing to..        
33c0: 23 20 20 20 20 20 20 20 74 68 65 20 74 65 73 74  #       the test
33d0: 20 6d 61 63 68 69 6e 65 20 61 72 63 68 69 74 65   machine archite
33e0: 63 74 75 72 65 3b 20 6f 74 68 65 72 77 69 73 65  cture; otherwise
33f0: 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 6d 70 74  , return an empt
3400: 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  y..        #    
3410: 20 20 20 73 74 72 69 6e 67 2e 20 20 4e 6f 72 6d     string.  Norm
3420: 61 6c 6c 79 2c 20 74 68 69 73 20 69 73 20 64 6f  ally, this is do
3430: 6e 65 20 66 6f 72 20 62 75 69 6c 64 73 20 74 68  ne for builds th
3440: 61 74 20 69 6e 76 6f 6c 76 65 20 74 68 65 0d 0a  at involve the..
3450: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
3460: 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73 65 6d  mixed-mode assem
3470: 62 6c 79 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  bly...        #.
3480: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
3490: 5b 65 78 70 72 20 7b 0d 0a 20 20 20 20 20 20 20  [expr {..       
34a0: 20 20 20 24 6e 61 74 69 76 65 20 3f 20 5b 6d 61     $native ? [ma
34b0: 63 68 69 6e 65 54 6f 50 6c 61 74 66 6f 72 6d 20  chineToPlatform 
34c0: 24 3a 3a 74 65 73 74 5f 6d 61 63 68 69 6e 65 5d  $::test_machine]
34d0: 20 3a 20 22 22 0d 0a 20 20 20 20 20 20 20 20 7d   : ""..        }
34e0: 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 69  ]..      } elsei
34f0: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
3500: 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 6d  ::tcl_platform(m
3510: 61 63 68 69 6e 65 29 5d 7d 20 74 68 65 6e 20 7b  achine)]} then {
3520: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
3530: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 6f 72       # NOTE: For
3540: 20 6e 61 74 69 76 65 20 62 75 69 6c 64 73 2c 20   native builds, 
3550: 72 65 74 75 72 6e 20 74 68 65 20 70 6c 61 74 66  return the platf
3560: 6f 72 6d 20 6e 61 6d 65 20 63 6f 72 72 65 73 70  orm name corresp
3570: 6f 6e 64 69 6e 67 20 74 6f 0d 0a 20 20 20 20 20  onding to..     
3580: 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20 6d     #       the m
3590: 61 63 68 69 6e 65 20 61 72 63 68 69 74 65 63 74  achine architect
35a0: 75 72 65 3b 20 6f 74 68 65 72 77 69 73 65 2c 20  ure; otherwise, 
35b0: 72 65 74 75 72 6e 20 61 6e 20 65 6d 70 74 79 20  return an empty 
35c0: 73 74 72 69 6e 67 2e 0d 0a 20 20 20 20 20 20 20  string...       
35d0: 20 23 20 20 20 20 20 20 20 4e 6f 72 6d 61 6c 6c   #       Normall
35e0: 79 2c 20 74 68 69 73 20 69 73 20 64 6f 6e 65 20  y, this is done 
35f0: 66 6f 72 20 62 75 69 6c 64 73 20 74 68 61 74 20  for builds that 
3600: 69 6e 76 6f 6c 76 65 20 74 68 65 20 6d 69 78 65  involve the mixe
3610: 64 2d 6d 6f 64 65 0d 0a 20 20 20 20 20 20 20 20  d-mode..        
3620: 23 20 20 20 20 20 20 20 61 73 73 65 6d 62 6c 79  #       assembly
3630: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
3640: 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 65 78        return [ex
3650: 70 72 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  pr {..          
3660: 24 6e 61 74 69 76 65 20 3f 20 5b 6d 61 63 68 69  $native ? [machi
3670: 6e 65 54 6f 50 6c 61 74 66 6f 72 6d 20 24 3a 3a  neToPlatform $::
3680: 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 6d 61 63  tcl_platform(mac
3690: 68 69 6e 65 29 5d 20 3a 20 22 22 0d 0a 20 20 20  hine)] : ""..   
36a0: 20 20 20 20 20 7d 5d 0d 0a 20 20 20 20 20 20 7d       }]..      }
36b0: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
36c0: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
36d0: 54 45 3a 20 4e 6f 20 6d 61 63 68 69 6e 65 20 61  TE: No machine a
36e0: 72 63 68 69 74 65 63 74 75 72 65 20 69 73 20 61  rchitecture is a
36f0: 76 61 69 6c 61 62 6c 65 2c 20 72 65 74 75 72 6e  vailable, return
3700: 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67   an empty string
3710: 2e 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  ...        #    
3720: 20 20 20 49 74 20 69 73 20 69 6d 70 6f 72 74 61     It is importa
3730: 6e 74 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20  nt to return an 
3740: 65 6d 70 74 79 20 73 74 72 69 6e 67 20 68 65 72  empty string her
3750: 65 20 62 65 63 61 75 73 65 20 74 68 65 0d 0a 20  e because the.. 
3760: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 72         #       r
3770: 65 73 75 6c 74 20 6f 66 20 74 68 69 73 20 70 72  esult of this pr
3780: 6f 63 65 64 75 72 65 20 6d 61 79 20 62 65 20 75  ocedure may be u
3790: 73 65 64 20 77 69 74 68 20 5b 66 69 6c 65 20 6a  sed with [file j
37a0: 6f 69 6e 5d 2e 0d 0a 20 20 20 20 20 20 20 20 23  oin]...        #
37b0: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
37c0: 20 22 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20   ""..      }..  
37d0: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
37e0: 20 67 65 74 42 75 69 6c 64 43 6f 6e 66 69 67 75   getBuildConfigu
37f0: 72 61 74 69 6f 6e 20 7b 7d 20 7b 0d 0a 20 20 20  ration {} {..   
3800: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
3810: 54 45 3a 20 53 65 65 20 69 66 20 74 68 65 20 22  TE: See if the "
3820: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 22 20 73  configuration" s
3830: 65 74 74 69 6e 67 20 68 61 73 20 62 65 65 6e 20  etting has been 
3840: 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20 74 68  overridden by th
3850: 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
3860: 20 75 73 65 72 20 28 65 2e 67 2e 20 6f 6e 20 74   user (e.g. on t
3870: 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 29  he command line)
3880: 2e 20 20 54 68 69 73 20 68 65 6c 70 73 20 63 6f  .  This helps co
3890: 6e 74 72 6f 6c 20 65 78 61 63 74 6c 79 0d 0a 20  ntrol exactly.. 
38a0: 20 20 20 20 20 23 20 20 20 20 20 20 20 77 68 69       #       whi
38b0: 63 68 20 73 65 74 20 6f 66 20 62 69 6e 61 72 69  ch set of binari
38c0: 65 73 20 77 65 20 61 72 65 20 74 65 73 74 69 6e  es we are testin
38d0: 67 20 28 69 2e 65 2e 20 74 68 6f 73 65 20 62 75  g (i.e. those bu
38e0: 69 6c 74 20 69 6e 20 74 68 65 0d 0a 20 20 20 20  ilt in the..    
38f0: 20 20 23 20 20 20 20 20 20 20 22 44 65 62 75 67    #       "Debug
3900: 22 20 6f 72 20 22 52 65 6c 65 61 73 65 22 20 62  " or "Release" b
3910: 75 69 6c 64 20 63 6f 6e 66 69 67 75 72 61 74 69  uild configurati
3920: 6f 6e 73 29 2e 20 20 54 6f 20 6f 76 65 72 72 69  ons).  To overri
3930: 64 65 20 74 68 69 73 0d 0a 20 20 20 20 20 20 23  de this..      #
3940: 20 20 20 20 20 20 20 76 61 6c 75 65 20 76 69 61         value via
3950: 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e   the command lin
3960: 65 2c 20 65 6e 74 65 72 20 61 20 63 6f 6d 6d 61  e, enter a comma
3970: 6e 64 20 73 69 6d 69 6c 61 72 20 74 6f 20 6f 6e  nd similar to on
3980: 65 20 6f 66 0d 0a 20 20 20 20 20 20 23 20 20 20  e of..      #   
3990: 20 20 20 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e      the followin
39a0: 67 20 28 61 6c 6c 20 6f 6e 20 6f 6e 65 20 6c 69  g (all on one li
39b0: 6e 65 29 3a 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ne):..      #.. 
39c0: 20 20 20 20 20 23 20 20 20 20 20 20 20 45 61 67       #       Eag
39d0: 6c 65 53 68 65 6c 6c 2e 65 78 65 20 2d 61 6e 79  leShell.exe -any
39e0: 49 6e 69 74 69 61 6c 69 7a 65 20 22 73 65 74 20  Initialize "set 
39f0: 74 65 73 74 5f 63 6f 6e 66 69 67 75 72 61 74 69  test_configurati
3a00: 6f 6e 20 44 65 62 75 67 22 0d 0a 20 20 20 20 20  on Debug"..     
3a10: 20 23 20 20 20 20 20 20 20 20 20 2d 66 69 6c 65   #         -file
3a20: 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65   .\path\to\all.e
3a30: 61 67 6c 65 0d 0a 20 20 20 20 20 20 23 0d 0a 20  agle..      #.. 
3a40: 20 20 20 20 20 23 20 20 20 20 20 20 20 45 61 67       #       Eag
3a50: 6c 65 53 68 65 6c 6c 2e 65 78 65 20 2d 61 6e 79  leShell.exe -any
3a60: 49 6e 69 74 69 61 6c 69 7a 65 20 22 73 65 74 20  Initialize "set 
3a70: 74 65 73 74 5f 63 6f 6e 66 69 67 75 72 61 74 69  test_configurati
3a80: 6f 6e 20 52 65 6c 65 61 73 65 22 0d 0a 20 20 20  on Release"..   
3a90: 20 20 20 23 20 20 20 20 20 20 20 20 20 2d 66 69     #         -fi
3aa0: 6c 65 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c  le .\path\to\all
3ab0: 2e 65 61 67 6c 65 0d 0a 20 20 20 20 20 20 23 0d  .eagle..      #.
3ac0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 45  .      #       E
3ad0: 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65 20 2d 66  agleShell.exe -f
3ae0: 69 6c 65 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c  ile .\path\to\al
3af0: 6c 2e 65 61 67 6c 65 20 2d 70 72 65 54 65 73 74  l.eagle -preTest
3b00: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
3b10: 20 20 22 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70    "unset -nocomp
3b20: 6c 61 69 6e 20 74 65 73 74 5f 63 6f 6e 66 69 67  lain test_config
3b30: 75 72 61 74 69 6f 6e 22 0d 0a 20 20 20 20 20 20  uration"..      
3b40: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e  #..      if {[in
3b50: 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 73 74  fo exists ::test
3b60: 5f 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 5d 20  _configuration] 
3b70: 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
3b80: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
3b90: 3a 3a 74 65 73 74 5f 63 6f 6e 66 69 67 75 72 61  ::test_configura
3ba0: 74 69 6f 6e 5d 20 3e 20 30 7d 20 74 68 65 6e 20  tion] > 0} then 
3bb0: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
3bc0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73        # NOTE: Us
3bd0: 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  e the specified 
3be0: 74 65 73 74 20 63 6f 6e 66 69 67 75 72 61 74 69  test configurati
3bf0: 6f 6e 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74  on.  The default
3c00: 20 76 61 6c 75 65 20 75 73 65 64 0d 0a 20 20 20   value used..   
3c10: 20 20 20 20 20 23 20 20 20 20 20 20 20 66 6f 72       #       for
3c20: 20 74 68 69 73 20 76 61 72 69 61 62 6c 65 20 69   this variable i
3c30: 73 20 74 79 70 69 63 61 6c 6c 79 20 22 52 65 6c  s typically "Rel
3c40: 65 61 73 65 22 2c 20 61 73 20 73 65 74 20 62 79  ease", as set by
3c50: 20 74 68 65 20 74 65 73 74 0d 0a 20 20 20 20 20   the test..     
3c60: 20 20 20 23 20 20 20 20 20 20 20 73 75 69 74 65     #       suite
3c70: 20 69 74 73 65 6c 66 2e 0d 0a 20 20 20 20 20 20   itself...      
3c80: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
3c90: 75 72 6e 20 24 3a 3a 74 65 73 74 5f 63 6f 6e 66  urn $::test_conf
3ca0: 69 67 75 72 61 74 69 6f 6e 0d 0a 20 20 20 20 20  iguration..     
3cb0: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
3cc0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
3cd0: 4e 4f 54 45 3a 20 4e 6f 72 6d 61 6c 6c 79 2c 20  NOTE: Normally, 
3ce0: 77 65 20 77 69 6c 6c 20 6e 65 76 65 72 20 68 69  we will never hi
3cf0: 74 20 74 68 69 73 20 63 61 73 65 20 62 65 63 61  t this case beca
3d00: 75 73 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  use the value of
3d10: 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20   the..        # 
3d20: 20 20 20 20 20 20 74 65 73 74 20 63 6f 6e 66 69        test confi
3d30: 67 75 72 61 74 69 6f 6e 20 76 61 72 69 61 62 6c  guration variabl
3d40: 65 20 69 73 20 61 6c 77 61 79 73 20 73 65 74 20  e is always set 
3d50: 62 79 20 74 68 65 20 74 65 73 74 20 73 75 69 74  by the test suit
3d60: 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
3d70: 20 20 20 69 74 73 65 6c 66 3b 20 68 6f 77 65 76     itself; howev
3d80: 65 72 2c 20 69 74 20 63 61 6e 20 62 65 20 6f 76  er, it can be ov
3d90: 65 72 72 69 64 64 65 6e 20 75 73 69 6e 67 20 74  erridden using t
3da0: 68 65 20 75 6e 73 65 74 20 63 6f 6d 6d 61 6e 64  he unset command
3db0: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
3dc0: 20 20 66 72 6f 6d 20 74 68 65 20 2d 70 72 65 54    from the -preT
3dd0: 65 73 74 20 6f 70 74 69 6f 6e 20 74 6f 20 74 68  est option to th
3de0: 65 20 74 65 73 74 20 73 75 69 74 65 2e 0d 0a 20  e test suite... 
3df0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
3e00: 20 20 72 65 74 75 72 6e 20 24 3a 3a 65 61 67 6c    return $::eagl
3e10: 65 5f 70 6c 61 74 66 6f 72 6d 28 63 6f 6e 66 69  e_platform(confi
3e20: 67 75 72 61 74 69 6f 6e 29 0d 0a 20 20 20 20 20  guration)..     
3e30: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
3e40: 20 20 70 72 6f 63 20 67 65 74 42 75 69 6c 64 43    proc getBuildC
3e50: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20 7b 7d  onfigurations {}
3e60: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
3e70: 20 20 20 23 20 4e 4f 54 45 3a 20 53 65 65 20 69     # NOTE: See i
3e80: 66 20 74 68 65 20 6c 69 73 74 20 6f 66 20 74 65  f the list of te
3e90: 73 74 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  st configuration
3ea0: 73 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72  s has been overr
3eb0: 69 64 64 65 6e 20 62 79 0d 0a 20 20 20 20 20 20  idden by..      
3ec0: 23 20 20 20 20 20 20 20 74 68 65 20 75 73 65 72  #       the user
3ed0: 20 28 65 2e 67 2e 20 6f 6e 20 74 68 65 20 63 6f   (e.g. on the co
3ee0: 6d 6d 61 6e 64 20 6c 69 6e 65 29 2e 0d 0a 20 20  mmand line)...  
3ef0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
3f00: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
3f10: 74 65 73 74 5f 63 6f 6e 66 69 67 75 72 61 74 69  test_configurati
3f20: 6f 6e 73 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  ons] && \..     
3f30: 20 20 20 20 20 5b 6c 6c 65 6e 67 74 68 20 24 3a       [llength $:
3f40: 3a 74 65 73 74 5f 63 6f 6e 66 69 67 75 72 61 74  :test_configurat
3f50: 69 6f 6e 73 5d 20 3e 20 30 7d 20 74 68 65 6e 20  ions] > 0} then 
3f60: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
3f70: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73        # NOTE: Us
3f80: 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  e the specified 
3f90: 6c 69 73 74 20 6f 66 20 74 65 73 74 20 63 6f 6e  list of test con
3fa0: 66 69 67 75 72 61 74 69 6f 6e 73 2e 0d 0a 20 20  figurations...  
3fb0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
3fc0: 20 72 65 74 75 72 6e 20 24 3a 3a 74 65 73 74 5f   return $::test_
3fd0: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 0d 0a  configurations..
3fe0: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
3ff0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
4000: 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20 74     # NOTE: Use t
4010: 68 65 20 64 65 66 61 75 6c 74 20 6c 69 73 74 20  he default list 
4020: 6f 66 20 74 65 73 74 20 63 6f 6e 66 69 67 75 72  of test configur
4030: 61 74 69 6f 6e 73 2e 0d 0a 20 20 20 20 20 20 20  ations...       
4040: 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   #..        retu
4050: 72 6e 20 5b 6c 69 73 74 20 44 65 62 75 67 20 52  rn [list Debug R
4060: 65 6c 65 61 73 65 5d 0d 0a 20 20 20 20 20 20 7d  elease]..      }
4070: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
4080: 70 72 6f 63 20 67 65 74 42 75 69 6c 64 43 6f 6e  proc getBuildCon
4090: 66 69 67 75 72 61 74 69 6f 6e 53 75 66 66 69 78  figurationSuffix
40a0: 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a   {} {..      #..
40b0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 65        # NOTE: Se
40c0: 65 20 69 66 20 74 68 65 20 74 65 73 74 20 63 6f  e if the test co
40d0: 6e 66 69 67 75 72 61 74 69 6f 6e 20 73 75 66 66  nfiguration suff
40e0: 69 78 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72  ix has been over
40f0: 72 69 64 64 65 6e 20 62 79 0d 0a 20 20 20 20 20  ridden by..     
4100: 20 23 20 20 20 20 20 20 20 74 68 65 20 75 73 65   #       the use
4110: 72 20 28 65 2e 67 2e 20 6f 6e 20 74 68 65 20 63  r (e.g. on the c
4120: 6f 6d 6d 61 6e 64 20 6c 69 6e 65 29 2e 0d 0a 20  ommand line)... 
4130: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
4140: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
4150: 3a 74 65 73 74 5f 63 6f 6e 66 69 67 75 72 61 74  :test_configurat
4160: 69 6f 6e 5f 73 75 66 66 69 78 5d 20 26 26 20 5c  ion_suffix] && \
4170: 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72  ..          [str
4180: 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 74 65  ing length $::te
4190: 73 74 5f 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  st_configuration
41a0: 5f 73 75 66 66 69 78 5d 20 3e 20 30 7d 20 74 68  _suffix] > 0} th
41b0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
41c0: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
41d0: 20 55 73 65 20 74 68 65 20 73 70 65 63 69 66 69   Use the specifi
41e0: 65 64 20 74 65 73 74 20 63 6f 6e 66 69 67 75 72  ed test configur
41f0: 61 74 69 6f 6e 20 73 75 66 66 69 78 2e 0d 0a 20  ation suffix... 
4200: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
4210: 20 20 72 65 74 75 72 6e 20 24 3a 3a 74 65 73 74    return $::test
4220: 5f 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 5f 73  _configuration_s
4230: 75 66 66 69 78 0d 0a 20 20 20 20 20 20 7d 20 65  uffix..      } e
4240: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  lse {..        #
4250: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
4260: 3a 20 55 73 65 20 74 68 65 20 64 65 66 61 75 6c  : Use the defaul
4270: 74 20 74 65 73 74 20 63 6f 6e 66 69 67 75 72 61  t test configura
4280: 74 69 6f 6e 20 73 75 66 66 69 78 2c 20 77 68 69  tion suffix, whi
4290: 63 68 20 73 68 6f 75 6c 64 20 62 65 0d 0a 20 20  ch should be..  
42a0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61 6e        #       an
42b0: 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e 0d 0a   empty string...
42c0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
42d0: 20 20 20 72 65 74 75 72 6e 20 22 22 0d 0a 20 20     return ""..  
42e0: 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
42f0: 0a 20 20 20 20 70 72 6f 63 20 67 65 74 42 75 69  .    proc getBui
4300: 6c 64 4e 61 74 69 76 65 43 6f 6e 66 69 67 75 72  ldNativeConfigur
4310: 61 74 69 6f 6e 53 75 66 66 69 78 20 7b 7d 20 7b  ationSuffix {} {
4320: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
4330: 20 23 20 4e 4f 54 45 3a 20 53 65 65 20 69 66 20   # NOTE: See if 
4340: 74 68 65 20 74 65 73 74 20 6e 61 74 69 76 65 20  the test native 
4350: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 73 75  configuration su
4360: 66 66 69 78 20 68 61 73 20 62 65 65 6e 0d 0a 20  ffix has been.. 
4370: 20 20 20 20 20 23 20 20 20 20 20 20 20 6f 76 65       #       ove
4380: 72 72 69 64 64 65 6e 20 62 79 20 74 68 65 20 75  rridden by the u
4390: 73 65 72 20 28 65 2e 67 2e 20 6f 6e 20 74 68 65  ser (e.g. on the
43a0: 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 29 2e 0d   command line)..
43b0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
43c0: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
43d0: 20 3a 3a 74 65 73 74 5f 6e 61 74 69 76 65 5f 63   ::test_native_c
43e0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 5f 73 75 66  onfiguration_suf
43f0: 66 69 78 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  fix] && \..     
4400: 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
4410: 67 74 68 20 24 3a 3a 74 65 73 74 5f 6e 61 74 69  gth $::test_nati
4420: 76 65 5f 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  ve_configuration
4430: 5f 73 75 66 66 69 78 5d 20 3e 20 30 7d 20 74 68  _suffix] > 0} th
4440: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
4450: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
4460: 20 55 73 65 20 74 68 65 20 73 70 65 63 69 66 69   Use the specifi
4470: 65 64 20 74 65 73 74 20 6e 61 74 69 76 65 20 63  ed test native c
4480: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 73 75 66  onfiguration suf
4490: 66 69 78 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  fix...        #.
44a0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
44b0: 24 3a 3a 74 65 73 74 5f 6e 61 74 69 76 65 5f 63  $::test_native_c
44c0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 5f 73 75 66  onfiguration_suf
44d0: 66 69 78 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  fix..      } els
44e0: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  e {..        #..
44f0: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
4500: 55 73 65 20 74 68 65 20 64 65 66 61 75 6c 74 20  Use the default 
4510: 74 65 73 74 20 6e 61 74 69 76 65 20 63 6f 6e 66  test native conf
4520: 69 67 75 72 61 74 69 6f 6e 20 73 75 66 66 69 78  iguration suffix
4530: 2c 20 77 68 69 63 68 0d 0a 20 20 20 20 20 20 20  , which..       
4540: 20 23 20 20 20 20 20 20 20 73 68 6f 75 6c 64 20   #       should 
4550: 62 65 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69  be an empty stri
4560: 6e 67 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ng...        #..
4570: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 22          return "
4580: 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  "..      }..    
4590: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67  }.....    proc g
45a0: 65 74 42 75 69 6c 64 4e 61 74 69 76 65 43 6f 6e  etBuildNativeCon
45b0: 66 69 67 75 72 61 74 69 6f 6e 53 75 66 66 69 78  figurationSuffix
45c0: 46 6f 72 44 6f 74 4e 65 74 43 6f 72 65 20 7b 20  ForDotNetCore { 
45d0: 73 75 66 66 69 78 20 7d 20 7b 0d 0a 20 20 20 20  suffix } {..    
45e0: 20 20 69 66 20 7b 5b 69 73 44 6f 74 4e 65 74 43    if {[isDotNetC
45f0: 6f 72 65 5d 20 26 26 20 5b 69 73 57 69 6e 64 6f  ore] && [isWindo
4600: 77 73 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ws]} then {..   
4610: 20 20 20 20 20 72 65 74 75 72 6e 20 4e 61 74 69       return Nati
4620: 76 65 4f 6e 6c 79 3b 20 23 20 48 41 43 4b 3a 20  veOnly; # HACK: 
4630: 53 70 65 63 69 61 6c 20 63 61 73 65 2c 20 75 73  Special case, us
4640: 65 20 32 30 31 35 20 6e 61 74 69 76 65 20 62 69  e 2015 native bi
4650: 6e 61 72 69 65 73 2e 0d 0a 20 20 20 20 20 20 7d  naries...      }
4660: 20 65 6c 73 65 69 66 20 7b 5b 73 74 72 69 6e 67   elseif {[string
4670: 20 6c 65 6e 67 74 68 20 24 73 75 66 66 69 78 5d   length $suffix]
4680: 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
4690: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 73 75        return $su
46a0: 66 66 69 78 0d 0a 20 20 20 20 20 20 7d 20 65 6c  ffix..      } el
46b0: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65  se {..        re
46c0: 74 75 72 6e 20 5b 67 65 74 42 75 69 6c 64 4e 61  turn [getBuildNa
46d0: 74 69 76 65 43 6f 6e 66 69 67 75 72 61 74 69 6f  tiveConfiguratio
46e0: 6e 53 75 66 66 69 78 5d 0d 0a 20 20 20 20 20 20  nSuffix]..      
46f0: 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
4700: 20 70 72 6f 63 20 67 65 74 42 75 69 6c 64 43 6f   proc getBuildCo
4710: 6e 66 69 67 75 72 61 74 69 6f 6e 53 75 66 66 69  nfigurationSuffi
4720: 78 65 73 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20  xes {} {..      
4730: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
4740: 20 53 65 65 20 69 66 20 74 68 65 20 6c 69 73 74   See if the list
4750: 20 6f 66 20 74 65 73 74 20 63 6f 6e 66 69 67 75   of test configu
4760: 72 61 74 69 6f 6e 20 73 75 66 66 69 78 65 73 20  ration suffixes 
4770: 68 61 73 20 62 65 65 6e 0d 0a 20 20 20 20 20 20  has been..      
4780: 23 20 20 20 20 20 20 20 6f 76 65 72 72 69 64 64  #       overridd
4790: 65 6e 20 62 79 20 74 68 65 20 75 73 65 72 20 28  en by the user (
47a0: 65 2e 67 2e 20 6f 6e 20 74 68 65 20 63 6f 6d 6d  e.g. on the comm
47b0: 61 6e 64 20 6c 69 6e 65 29 2e 0d 0a 20 20 20 20  and line)...    
47c0: 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
47d0: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65  info exists ::te
47e0: 73 74 5f 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  st_configuration
47f0: 5f 73 75 66 66 69 78 65 73 5d 20 26 26 20 5c 0d  _suffixes] && \.
4800: 0a 20 20 20 20 20 20 20 20 20 20 5b 6c 6c 65 6e  .          [llen
4810: 67 74 68 20 24 3a 3a 74 65 73 74 5f 63 6f 6e 66  gth $::test_conf
4820: 69 67 75 72 61 74 69 6f 6e 5f 73 75 66 66 69 78  iguration_suffix
4830: 65 73 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  es] > 0} then {.
4840: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
4850: 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20      # NOTE: Use 
4860: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6c 69  the specified li
4870: 73 74 20 6f 66 20 74 65 73 74 20 63 6f 6e 66 69  st of test confi
4880: 67 75 72 61 74 69 6f 6e 73 20 73 75 66 66 69 78  gurations suffix
4890: 65 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  es...        #..
48a0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24          return $
48b0: 3a 3a 74 65 73 74 5f 63 6f 6e 66 69 67 75 72 61  ::test_configura
48c0: 74 69 6f 6e 5f 73 75 66 66 69 78 65 73 0d 0a 20  tion_suffixes.. 
48d0: 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b       } elseif {[
48e0: 69 73 44 6f 74 4e 65 74 43 6f 72 65 5d 7d 20 74  isDotNetCore]} t
48f0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
4900: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
4910: 3a 20 52 75 6e 6e 69 6e 67 20 6f 6e 20 2e 4e 45  : Running on .NE
4920: 54 20 43 6f 72 65 2c 20 70 72 69 6f 72 69 74 69  T Core, prioriti
4930: 7a 65 20 69 74 73 20 74 65 73 74 20 63 6f 6e 66  ze its test conf
4940: 69 67 75 72 61 74 69 6f 6e 0d 0a 20 20 20 20 20  iguration..     
4950: 20 20 20 23 20 20 20 20 20 20 20 73 75 66 66 69     #       suffi
4960: 78 65 73 20 66 6f 72 20 6c 69 62 72 61 72 79 20  xes for library 
4970: 66 69 6c 65 73 2e 0d 0a 20 20 20 20 20 20 20 20  files...        
4980: 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  #..        retur
4990: 6e 20 5b 6c 69 73 74 20 4e 65 74 53 74 61 6e 64  n [list NetStand
49a0: 61 72 64 32 30 20 4e 65 74 53 74 61 6e 64 61 72  ard20 NetStandar
49b0: 64 32 31 20 22 22 5d 0d 0a 20 20 20 20 20 20 7d  d21 ""]..      }
49c0: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
49d0: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
49e0: 54 45 3a 20 55 73 65 20 74 68 65 20 64 65 66 61  TE: Use the defa
49f0: 75 6c 74 20 6c 69 73 74 20 6f 66 20 74 65 73 74  ult list of test
4a00: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20   configurations 
4a10: 73 75 66 66 69 78 65 73 2e 0d 0a 20 20 20 20 20  suffixes...     
4a20: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65     #..        re
4a30: 74 75 72 6e 20 5b 6c 69 73 74 20 22 22 5d 0d 0a  turn [list ""]..
4a40: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
4a50: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 42  ...    proc getB
4a60: 75 69 6c 64 45 78 74 72 61 20 7b 7d 20 7b 0d 0a  uildExtra {} {..
4a70: 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20        if {[info 
4a80: 65 78 69 73 74 73 20 3a 3a 74 65 73 74 5f 65 78  exists ::test_ex
4a90: 74 72 61 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  tra] && \..     
4aa0: 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
4ab0: 67 74 68 20 24 3a 3a 74 65 73 74 5f 65 78 74 72  gth $::test_extr
4ac0: 61 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  a] > 0} then {..
4ad0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
4ae0: 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20 74     # NOTE: Use t
4af0: 68 65 20 73 70 65 63 69 66 69 65 64 20 65 78 74  he specified ext
4b00: 72 61 20 6f 75 74 70 75 74 20 64 69 72 65 63 74  ra output direct
4b10: 6f 72 79 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ory...        #.
4b20: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
4b30: 24 3a 3a 74 65 73 74 5f 65 78 74 72 61 0d 0a 20  $::test_extra.. 
4b40: 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b       } elseif {[
4b50: 69 73 44 6f 74 4e 65 74 43 6f 72 65 5d 7d 20 74  isDotNetCore]} t
4b60: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
4b70: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
4b80: 3a 20 52 75 6e 6e 69 6e 67 20 6f 6e 20 2e 4e 45  : Running on .NE
4b90: 54 20 43 6f 72 65 2c 20 75 73 65 20 74 68 65 20  T Core, use the 
4ba0: 65 78 74 72 61 20 6f 75 74 70 75 74 20 64 69 72  extra output dir
4bb0: 65 63 74 6f 72 79 20 66 6f 72 0d 0a 20 20 20 20  ectory for..    
4bc0: 20 20 20 20 23 20 20 20 20 20 20 20 6c 69 62 72      #       libr
4bd0: 61 72 79 20 66 69 6c 65 73 2e 0d 0a 20 20 20 20  ary files...    
4be0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
4bf0: 65 74 75 72 6e 20 6e 65 74 73 74 61 6e 64 61 72  eturn netstandar
4c00: 64 32 2e 30 0d 0a 20 20 20 20 20 20 7d 20 65 6c  d2.0..      } el
4c10: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  se {..        #.
4c20: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
4c30: 20 4e 6f 20 65 78 74 72 61 20 6f 75 74 70 75 74   No extra output
4c40: 20 64 69 72 65 63 74 6f 72 79 20 69 73 20 72 65   directory is re
4c50: 71 75 69 72 65 64 2e 0d 0a 20 20 20 20 20 20 20  quired...       
4c60: 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   #..        retu
4c70: 72 6e 20 22 22 0d 0a 20 20 20 20 20 20 7d 0d 0a  rn ""..      }..
4c80: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
4c90: 6f 63 20 67 65 74 42 75 69 6c 64 45 78 74 72 61  oc getBuildExtra
4ca0: 73 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  s {} {..      #.
4cb0: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53  .      # NOTE: S
4cc0: 65 65 20 69 66 20 74 68 65 20 6c 69 73 74 20 6f  ee if the list o
4cd0: 66 20 65 78 74 72 61 20 6f 75 74 70 75 74 20 64  f extra output d
4ce0: 69 72 65 63 74 6f 72 69 65 73 20 68 61 73 20 62  irectories has b
4cf0: 65 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 0d 0a  een overridden..
4d00: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62 79        #       by
4d10: 20 74 68 65 20 75 73 65 72 20 28 65 2e 67 2e 20   the user (e.g. 
4d20: 6f 6e 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c  on the command l
4d30: 69 6e 65 29 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  ine)...      #..
4d40: 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20        if {[info 
4d50: 65 78 69 73 74 73 20 3a 3a 74 65 73 74 5f 65 78  exists ::test_ex
4d60: 74 72 61 73 5d 20 26 26 20 5c 0d 0a 20 20 20 20  tras] && \..    
4d70: 20 20 20 20 20 20 5b 6c 6c 65 6e 67 74 68 20 24        [llength $
4d80: 3a 3a 74 65 73 74 5f 65 78 74 72 61 73 5d 20 3e  ::test_extras] >
4d90: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
4da0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
4db0: 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20 73   NOTE: Use the s
4dc0: 70 65 63 69 66 69 65 64 20 6c 69 73 74 20 6f 66  pecified list of
4dd0: 20 65 78 74 72 61 20 6f 75 74 70 75 74 20 64 69   extra output di
4de0: 72 65 63 74 6f 72 69 65 73 2e 0d 0a 20 20 20 20  rectories...    
4df0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
4e00: 65 74 75 72 6e 20 24 3a 3a 74 65 73 74 5f 65 78  eturn $::test_ex
4e10: 74 72 61 73 0d 0a 20 20 20 20 20 20 7d 20 65 6c  tras..      } el
4e20: 73 65 69 66 20 7b 5b 69 73 44 6f 74 4e 65 74 43  seif {[isDotNetC
4e30: 6f 72 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ore]} then {..  
4e40: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
4e50: 20 23 20 4e 4f 54 45 3a 20 52 75 6e 6e 69 6e 67   # NOTE: Running
4e60: 20 6f 6e 20 2e 4e 45 54 20 43 6f 72 65 2c 20 70   on .NET Core, p
4e70: 72 69 6f 72 69 74 69 7a 65 20 69 74 73 20 65 78  rioritize its ex
4e80: 74 72 61 20 6f 75 74 70 75 74 20 64 69 72 65 63  tra output direc
4e90: 74 6f 72 79 0d 0a 20 20 20 20 20 20 20 20 23 20  tory..        # 
4ea0: 20 20 20 20 20 20 66 6f 72 20 6c 69 62 72 61 72        for librar
4eb0: 79 20 66 69 6c 65 73 2e 0d 0a 20 20 20 20 20 20  y files...      
4ec0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
4ed0: 75 72 6e 20 5b 6c 69 73 74 20 6e 65 74 73 74 61  urn [list netsta
4ee0: 6e 64 61 72 64 32 2e 30 20 22 22 5d 0d 0a 20 20  ndard2.0 ""]..  
4ef0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
4f00: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
4f10: 20 23 20 4e 4f 54 45 3a 20 55 73 65 20 64 65 66   # NOTE: Use def
4f20: 61 75 6c 74 20 6c 69 73 74 20 6f 66 20 65 78 74  ault list of ext
4f30: 72 61 20 6f 75 74 70 75 74 20 64 69 72 65 63 74  ra output direct
4f40: 6f 72 69 65 73 2c 20 77 68 69 63 68 20 69 73 20  ories, which is 
4f50: 6f 6e 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  one..        #  
4f60: 20 20 20 20 20 65 6d 70 74 79 20 73 74 72 69 6e       empty strin
4f70: 67 20 28 6e 6f 2d 6f 70 29 2e 0d 0a 20 20 20 20  g (no-op)...    
4f80: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
4f90: 65 74 75 72 6e 20 5b 6c 69 73 74 20 22 22 5d 0d  eturn [list ""].
4fa0: 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
4fb0: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74  ....    proc get
4fc0: 42 75 69 6c 64 42 61 73 65 44 69 72 65 63 74 6f  BuildBaseDirecto
4fd0: 72 79 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23  ry {} {..      #
4fe0: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
4ff0: 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 62  Figure out the b
5000: 61 73 65 20 64 69 72 65 63 74 6f 72 79 20 77 68  ase directory wh
5010: 65 72 65 20 61 6c 6c 20 74 68 65 20 62 75 69 6c  ere all the buil
5020: 64 73 20 73 68 6f 75 6c 64 20 62 65 0d 0a 20 20  ds should be..  
5030: 20 20 20 20 23 20 20 20 20 20 20 20 6c 6f 63 61      #       loca
5040: 74 65 64 2e 20 20 54 68 69 73 20 77 69 6c 6c 20  ted.  This will 
5050: 62 65 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  be the directory
5060: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
5070: 68 65 20 61 63 74 75 61 6c 0d 0a 20 20 20 20 20  he actual..     
5080: 20 23 20 20 20 20 20 20 20 62 75 69 6c 64 20 6f   #       build o
5090: 75 74 70 75 74 20 64 69 72 65 63 74 6f 72 79 20  utput directory 
50a0: 28 65 2e 67 2e 20 70 61 72 65 6e 74 20 6f 66 20  (e.g. parent of 
50b0: 22 62 69 6e 22 29 2e 0d 0a 20 20 20 20 20 20 23  "bin")...      #
50c0: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66  ..      if {[inf
50d0: 6f 20 65 78 69 73 74 73 20 3a 3a 62 75 69 6c 64  o exists ::build
50e0: 5f 62 61 73 65 5f 64 69 72 65 63 74 6f 72 79 5d  _base_directory]
50f0: 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
5100: 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20   [string length 
5110: 24 3a 3a 62 75 69 6c 64 5f 62 61 73 65 5f 64 69  $::build_base_di
5120: 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68  rectory] > 0} th
5130: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
5140: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
5150: 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66   The location of
5160: 20 74 68 65 20 62 75 69 6c 64 20 62 61 73 65 20   the build base 
5170: 64 69 72 65 63 74 6f 72 79 20 68 61 73 20 62 65  directory has be
5180: 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b 0d 0a  en overridden;..
5190: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
51a0: 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69  therefore, use i
51b0: 74 20 76 65 72 62 61 74 69 6d 2e 0d 0a 20 20 20  t verbatim...   
51c0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
51d0: 72 65 74 75 72 6e 20 24 3a 3a 62 75 69 6c 64 5f  return $::build_
51e0: 62 61 73 65 5f 64 69 72 65 63 74 6f 72 79 0d 0a  base_directory..
51f0: 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b        } elseif {
5200: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 63  [info exists ::c
5210: 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79 5d  ommon_directory]
5220: 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
5230: 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20   [string length 
5240: 24 3a 3a 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74  $::common_direct
5250: 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ory] > 0} then {
5260: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
5270: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e 65 78       # NOTE: Nex
5280: 74 2c 20 66 61 6c 6c 62 61 63 6b 20 74 6f 20 74  t, fallback to t
5290: 68 65 20 67 72 61 6e 64 70 61 72 65 6e 74 20 64  he grandparent d
52a0: 69 72 65 63 74 6f 72 79 20 6f 66 20 74 68 65 20  irectory of the 
52b0: 6f 6e 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  one..        #  
52c0: 20 20 20 20 20 63 6f 6e 74 61 69 6e 69 6e 67 20       containing 
52d0: 74 68 69 73 20 66 69 6c 65 20 28 69 2e 65 2e 20  this file (i.e. 
52e0: 22 63 6f 6d 6d 6f 6e 2e 65 61 67 6c 65 22 29 2c  "common.eagle"),
52f0: 20 69 66 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0a   if available...
5300: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
5310: 20 20 20 72 65 74 75 72 6e 20 5b 66 69 6c 65 20     return [file 
5320: 64 69 72 6e 61 6d 65 20 5b 66 69 6c 65 20 64 69  dirname [file di
5330: 72 6e 61 6d 65 20 24 3a 3a 63 6f 6d 6d 6f 6e 5f  rname $::common_
5340: 64 69 72 65 63 74 6f 72 79 5d 5d 0d 0a 20 20 20  directory]]..   
5350: 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e     } elseif {[in
5360: 66 6f 20 65 78 69 73 74 73 20 3a 3a 70 61 74 68  fo exists ::path
5370: 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
5380: 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
5390: 20 24 3a 3a 70 61 74 68 5d 20 3e 20 30 7d 20 74   $::path] > 0} t
53a0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
53b0: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
53c0: 3a 20 46 69 6e 61 6c 6c 79 2c 20 66 61 6c 6c 62  : Finally, fallb
53d0: 61 63 6b 20 74 6f 20 74 68 65 20 70 61 72 65 6e  ack to the paren
53e0: 74 20 64 69 72 65 63 74 6f 72 79 20 6f 66 20 74  t directory of t
53f0: 68 65 20 45 61 67 6c 65 54 65 73 74 0d 0a 20 20  he EagleTest..  
5400: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 70 61        #       pa
5410: 74 68 2e 20 20 54 68 65 20 45 61 67 6c 65 54 65  th.  The EagleTe
5420: 73 74 20 70 61 63 6b 61 67 65 20 67 75 61 72 61  st package guara
5430: 6e 74 65 65 73 20 74 68 61 74 20 74 68 69 73 20  ntees that this 
5440: 76 61 72 69 61 62 6c 65 0d 0a 20 20 20 20 20 20  variable..      
5450: 20 20 23 20 20 20 20 20 20 20 77 69 6c 6c 20 62    #       will b
5460: 65 20 73 65 74 20 74 6f 20 74 68 65 20 64 69 72  e set to the dir
5470: 65 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e  ectory containin
5480: 67 20 74 68 65 20 66 69 72 73 74 20 66 69 6c 65  g the first file
5490: 20 74 6f 0d 0a 20 20 20 20 20 20 20 20 23 20 20   to..        #  
54a0: 20 20 20 20 20 65 78 65 63 75 74 65 20 74 68 65       execute the
54b0: 20 5b 72 75 6e 54 65 73 74 50 72 6f 6c 6f 67 75   [runTestPrologu
54c0: 65 5d 20 73 63 72 69 70 74 20 6c 69 62 72 61 72  e] script librar
54d0: 79 20 70 72 6f 63 65 64 75 72 65 2e 0d 0a 20 20  y procedure...  
54e0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
54f0: 20 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 64 69   return [file di
5500: 72 6e 61 6d 65 20 24 3a 3a 70 61 74 68 5d 0d 0a  rname $::path]..
5510: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
5520: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
5530: 20 20 20 23 20 4e 4f 54 45 3a 20 4e 6f 20 70 61     # NOTE: No pa
5540: 74 68 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c  th is available,
5550: 20 72 65 74 75 72 6e 20 61 6e 20 65 6d 70 74 79   return an empty
5560: 20 73 74 72 69 6e 67 2e 20 20 54 68 69 73 20 70   string.  This p
5570: 6f 69 6e 74 0d 0a 20 20 20 20 20 20 20 20 23 20  oint..        # 
5580: 20 20 20 20 20 20 73 68 6f 75 6c 64 20 6e 6f 74        should not
5590: 20 62 65 20 72 65 61 63 68 65 64 2e 0d 0a 20 20   be reached...  
55a0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
55b0: 20 72 65 74 75 72 6e 20 22 22 0d 0a 20 20 20 20   return ""..    
55c0: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
55d0: 20 20 20 70 72 6f 63 20 67 65 74 53 51 4c 69 74     proc getSQLit
55e0: 65 54 65 73 74 44 61 74 61 50 61 74 68 20 7b 7d  eTestDataPath {}
55f0: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
5600: 20 20 20 23 20 4e 4f 54 45 3a 20 46 69 67 75 72     # NOTE: Figur
5610: 65 20 6f 75 74 20 74 68 65 20 64 69 72 65 63 74  e out the direct
5620: 6f 72 79 20 77 68 65 72 65 20 61 6c 6c 20 74 68  ory where all th
5630: 65 20 74 65 73 74 20 64 61 74 61 20 66 69 6c 65  e test data file
5640: 73 20 73 68 6f 75 6c 64 0d 0a 20 20 20 20 20 20  s should..      
5650: 23 20 20 20 20 20 20 20 62 65 20 6c 6f 63 61 74  #       be locat
5660: 65 64 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64  ed.  This should
5670: 20 62 65 20 74 68 65 20 22 64 61 74 61 22 20 64   be the "data" d
5680: 69 72 65 63 74 6f 72 79 20 62 65 6e 65 61 74 68  irectory beneath
5690: 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20   the..      #   
56a0: 20 20 20 20 64 69 72 65 63 74 6f 72 79 20 63 6f      directory co
56b0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 61 63 74  ntaining the act
56c0: 75 61 6c 20 74 65 73 74 20 73 63 72 69 70 74 73  ual test scripts
56d0: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
56e0: 20 20 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 6a    return [file j
56f0: 6f 69 6e 20 24 3a 3a 70 61 74 68 20 64 61 74 61  oin $::path data
5700: 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  ]..    }.....   
5710: 20 70 72 6f 63 20 69 73 52 75 6e 6e 69 6e 67 57   proc isRunningW
5720: 6f 57 36 34 20 7b 7d 20 7b 0d 0a 20 20 20 20 20  oW64 {} {..     
5730: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
5740: 3a 20 46 6f 72 20 6e 6f 77 2c 20 6a 75 73 74 20  : For now, just 
5750: 75 73 65 20 74 68 65 20 65 78 69 73 74 69 6e 67  use the existing
5760: 20 74 65 73 74 20 63 6f 6e 73 74 72 61 69 6e 74   test constraint
5770: 20 66 6f 72 20 64 65 74 65 63 74 69 6e 67 0d 0a   for detecting..
5780: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61 20        #       a 
5790: 57 6f 57 36 34 20 70 72 6f 63 65 73 73 2e 0d 0a  WoW64 process...
57a0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72        #..      r
57b0: 65 74 75 72 6e 20 5b 68 61 76 65 43 6f 6e 73 74  eturn [haveConst
57c0: 72 61 69 6e 74 20 77 6f 77 36 34 5d 0d 0a 20 20  raint wow64]..  
57d0: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
57e0: 20 69 73 4d 69 78 65 64 4d 6f 64 65 41 73 73 65   isMixedModeAsse
57f0: 6d 62 6c 79 20 7b 20 66 69 6c 65 4e 61 6d 65 20  mbly { fileName 
5800: 7b 76 61 72 4e 61 6d 65 20 22 22 7d 20 7d 20 7b  {varName ""} } {
5810: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
5820: 20 23 20 4e 4f 54 45 3a 20 46 69 72 73 74 2c 20   # NOTE: First, 
5830: 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 74 65  make sure the te
5840: 73 74 20 73 75 69 74 65 20 69 6e 66 72 61 73 74  st suite infrast
5850: 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 77  ructure is allow
5860: 65 64 20 74 6f 0d 0a 20 20 20 20 20 20 23 20 20  ed to..      #  
5870: 20 20 20 20 20 75 73 65 20 74 68 65 20 5b 65 78       use the [ex
5880: 65 63 5d 20 63 6f 6d 6d 61 6e 64 2e 0d 0a 20 20  ec] command...  
5890: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
58a0: 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
58b0: 3a 6e 6f 28 65 78 65 63 29 5d 20 26 26 20 21 5b  :no(exec)] && ![
58c0: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
58d0: 28 63 6f 72 46 6c 61 67 73 29 5d 7d 20 74 68 65  (corFlags)]} the
58e0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
58f0: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
5900: 49 66 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20  If the location 
5910: 6f 66 20 43 6f 72 46 6c 61 67 73 20 69 73 20 70  of CorFlags is p
5920: 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 65 6e  resent in the en
5930: 76 69 72 6f 6e 6d 65 6e 74 2c 0d 0a 20 20 20 20  vironment,..    
5940: 20 20 20 20 23 20 20 20 20 20 20 20 75 73 65 20      #       use 
5950: 69 74 3b 20 6f 74 68 65 72 77 69 73 65 20 61 73  it; otherwise as
5960: 73 75 6d 65 20 69 74 20 69 73 20 69 6e 20 74 68  sume it is in th
5970: 65 20 50 41 54 48 2e 0d 0a 20 20 20 20 20 20 20  e PATH...       
5980: 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   #..        set 
5990: 63 6f 72 46 6c 61 67 73 20 5b 65 78 70 72 20 7b  corFlags [expr {
59a0: 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 69 6e 66  ..          [inf
59b0: 6f 20 65 78 69 73 74 73 20 3a 3a 65 6e 76 28 43  o exists ::env(C
59c0: 6f 72 46 6c 61 67 73 29 5d 20 3f 20 24 3a 3a 65  orFlags)] ? $::e
59d0: 6e 76 28 43 6f 72 46 6c 61 67 73 29 20 3a 20 22  nv(CorFlags) : "
59e0: 43 6f 72 46 6c 61 67 73 22 0d 0a 20 20 20 20 20  CorFlags"..     
59f0: 20 20 20 7d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20     }]....       
5a00: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
5a10: 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 65  TE: Attempt to e
5a20: 78 65 63 75 74 65 20 43 6f 72 46 6c 61 67 73 20  xecute CorFlags 
5a30: 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64  on the specified
5a40: 20 66 69 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20   file...        
5a50: 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  #..        if {[
5a60: 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
5a70: 20 20 20 65 78 65 63 20 2d 2d 20 24 63 6f 72 46     exec -- $corF
5a80: 6c 61 67 73 20 5b 66 69 6c 65 20 6e 61 74 69 76  lags [file nativ
5a90: 65 6e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 5d  ename $fileName]
5aa0: 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 78 65 63  ..        } exec
5ab0: 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
5ac0: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
5ad0: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49         # NOTE: I
5ae0: 66 20 72 65 71 75 65 73 74 65 64 20 62 79 20 6f  f requested by o
5af0: 75 72 20 63 61 6c 6c 65 72 2c 20 61 74 74 65 6d  ur caller, attem
5b00: 70 74 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  pt to determine 
5b10: 74 68 65 0d 0a 20 20 20 20 20 20 20 20 20 20 23  the..          #
5b20: 20 20 20 20 20 20 20 70 6c 61 74 66 6f 72 6d 20         platform 
5b30: 66 6f 72 20 74 68 65 20 73 70 65 63 69 66 69 65  for the specifie
5b40: 64 20 66 69 6c 65 20 61 73 20 77 65 6c 6c 2e 0d  d file as well..
5b50: 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
5b60: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72          if {[str
5b70: 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 61 72 4e  ing length $varN
5b80: 61 6d 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ame] > 0} then {
5b90: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d  ..            #.
5ba0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e  .            # N
5bb0: 4f 54 45 3a 20 53 74 6f 72 65 20 74 68 65 20 70  OTE: Store the p
5bc0: 6c 61 74 66 6f 72 6d 20 69 6e 20 74 68 65 20 6e  latform in the n
5bd0: 61 6d 65 64 20 76 61 72 69 61 62 6c 65 20 69 6e  amed variable in
5be0: 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 20 20   the..          
5bf0: 20 20 23 20 20 20 20 20 20 20 63 6f 6e 74 65 78    #       contex
5c00: 74 20 6f 66 20 6f 75 72 20 63 61 6c 6c 65 72 2e  t of our caller.
5c10: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d  ..            #.
5c20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 70 76  .            upv
5c30: 61 72 20 31 20 24 76 61 72 4e 61 6d 65 20 70 6c  ar 1 $varName pl
5c40: 61 74 66 6f 72 6d 0d 0a 0d 0a 20 20 20 20 20 20  atform....      
5c50: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
5c60: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74       # NOTE: Att
5c70: 65 6d 70 74 20 74 6f 20 65 78 74 72 61 63 74 20  empt to extract 
5c80: 74 68 65 20 50 45 20 6c 69 6e 65 20 66 72 6f 6d  the PE line from
5c90: 20 74 68 65 20 63 61 70 74 75 72 65 64 0d 0a 20   the captured.. 
5ca0: 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20             #    
5cb0: 20 20 20 6f 75 74 70 75 74 2e 20 20 49 66 20 74     output.  If t
5cc0: 68 69 73 20 76 61 6c 75 65 20 69 73 20 22 50 45  his value is "PE
5cd0: 33 32 22 20 6f 72 20 22 50 45 33 32 2b 22 2c 20  32" or "PE32+", 
5ce0: 74 68 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  the..           
5cf0: 20 23 20 20 20 20 20 20 20 61 73 73 65 6d 62 6c   #       assembl
5d00: 79 20 66 69 6c 65 20 69 73 20 33 32 2d 62 69 74  y file is 32-bit
5d10: 20 6f 72 20 36 34 2d 62 69 74 2c 20 72 65 73 70   or 64-bit, resp
5d20: 65 63 74 69 76 65 6c 79 3b 0d 0a 20 20 20 20 20  ectively;..     
5d30: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6f         #       o
5d40: 74 68 65 72 77 69 73 65 2c 20 69 74 73 20 74 79  therwise, its ty
5d50: 70 65 20 69 73 20 75 6e 6b 6e 6f 77 6e 2e 0d 0a  pe is unknown...
5d60: 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
5d70: 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 70             set p
5d80: 61 74 74 65 72 6e 20 7b 5e 50 45 20 20 20 20 20  attern {^PE     
5d90: 20 20 20 3a 20 28 50 45 33 32 7c 50 45 33 32 5c     : (PE32|PE32\
5da0: 2b 29 5c 73 2b 24 7d 0d 0a 0d 0a 20 20 20 20 20  +)\s+$}....     
5db0: 20 20 20 20 20 20 20 69 66 20 7b 5b 72 65 67 65         if {[rege
5dc0: 78 70 20 2d 6c 69 6e 65 20 2d 2d 20 24 70 61 74  xp -line -- $pat
5dd0: 74 65 72 6e 20 24 65 78 65 63 20 64 75 6d 6d 79  tern $exec dummy
5de0: 20 70 65 33 32 5d 7d 20 74 68 65 6e 20 7b 0d 0a   pe32]} then {..
5df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
5e00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
5e10: 20 48 41 43 4b 3a 20 54 68 69 73 20 5b 73 77 69   HACK: This [swi
5e20: 74 63 68 5d 20 61 73 73 75 6d 65 73 20 74 68 61  tch] assumes tha
5e30: 74 20 33 32 2d 62 69 74 20 65 78 65 63 75 74 61  t 32-bit executa
5e40: 62 6c 65 73 20 61 72 65 0d 0a 20 20 20 20 20 20  bles are..      
5e50: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
5e60: 61 6c 77 61 79 73 20 78 38 36 20 61 6e 64 20 74  always x86 and t
5e70: 68 61 74 20 36 34 2d 62 69 74 20 65 78 65 63 75  hat 64-bit execu
5e80: 74 61 62 6c 65 73 20 61 72 65 20 61 6c 77 61 79  tables are alway
5e90: 73 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s..             
5ea0: 20 23 20 20 20 20 20 20 20 78 36 34 2e 0d 0a 20   #       x64... 
5eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a               #..
5ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 77                sw
5ed0: 69 74 63 68 20 2d 65 78 61 63 74 20 2d 2d 20 24  itch -exact -- $
5ee0: 70 65 33 32 20 7b 0d 0a 20 20 20 20 20 20 20 20  pe32 {..        
5ef0: 20 20 20 20 20 20 20 20 50 45 33 32 20 7b 0d 0a          PE32 {..
5f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5f10: 20 20 73 65 74 20 70 6c 61 74 66 6f 72 6d 20 57    set platform W
5f20: 69 6e 33 32 0d 0a 20 20 20 20 20 20 20 20 20 20  in32..          
5f30: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
5f40: 20 20 20 20 20 20 20 20 20 50 45 33 32 2b 20 7b           PE32+ {
5f50: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
5f60: 20 20 20 20 73 65 74 20 70 6c 61 74 66 6f 72 6d      set platform
5f70: 20 78 36 34 0d 0a 20 20 20 20 20 20 20 20 20 20   x64..          
5f80: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
5f90: 20 20 20 20 20 20 20 20 20 64 65 66 61 75 6c 74           default
5fa0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
5fb0: 20 20 20 20 20 20 73 65 74 20 70 6c 61 74 66 6f        set platfo
5fc0: 72 6d 20 22 22 0d 0a 20 20 20 20 20 20 20 20 20  rm ""..         
5fd0: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
5fe0: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
5ff0: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
6000: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
6010: 65 74 20 70 6c 61 74 66 6f 72 6d 20 22 22 0d 0a  et platform ""..
6020: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
6030: 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
6040: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
6050: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74       # NOTE: Att
6060: 65 6d 70 74 20 74 6f 20 65 78 74 72 61 63 74 20  empt to extract 
6070: 74 68 65 20 49 4c 4f 4e 4c 59 20 6c 69 6e 65 20  the ILONLY line 
6080: 66 72 6f 6d 20 74 68 65 20 63 61 70 74 75 72 65  from the capture
6090: 64 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20  d..          #  
60a0: 20 20 20 20 20 6f 75 74 70 75 74 2e 20 20 49 66       output.  If
60b0: 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 20 7a   this value is z
60c0: 65 72 6f 2c 20 74 68 65 20 73 70 65 63 69 66 69  ero, the specifi
60d0: 65 64 20 66 69 6c 65 20 6d 75 73 74 0d 0a 20 20  ed file must..  
60e0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
60f0: 62 65 20 61 20 6d 69 78 65 64 2d 6d 6f 64 65 20  be a mixed-mode 
6100: 61 73 73 65 6d 62 6c 79 3b 20 6f 74 68 65 72 77  assembly; otherw
6110: 69 73 65 2c 20 69 74 20 63 6f 6e 74 61 69 6e 73  ise, it contains
6120: 20 6f 6e 6c 79 0d 0a 20 20 20 20 20 20 20 20 20   only..         
6130: 20 23 20 20 20 20 20 20 20 6d 61 6e 61 67 65 64   #       managed
6140: 20 63 6f 6d 70 6f 6e 65 6e 74 73 2e 0d 0a 20 20   components...  
6150: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
6160: 20 20 20 20 20 73 65 74 20 70 61 74 74 65 72 6e       set pattern
6170: 20 7b 5e 49 4c 4f 4e 4c 59 20 20 20 20 3a 20 28   {^ILONLY    : (
6180: 30 7c 31 29 5c 73 2b 24 7d 0d 0a 0d 0a 20 20 20  0|1)\s+$}....   
6190: 20 20 20 20 20 20 20 69 66 20 7b 21 5b 72 65 67         if {![reg
61a0: 65 78 70 20 2d 6c 69 6e 65 20 2d 2d 20 24 70 61  exp -line -- $pa
61b0: 74 74 65 72 6e 20 24 65 78 65 63 20 64 75 6d 6d  ttern $exec dumm
61c0: 79 20 69 6c 4f 6e 6c 79 5d 7d 20 74 68 65 6e 20  y ilOnly]} then 
61d0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  {..            r
61e0: 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20  eturn false..   
61f0: 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
6200: 20 20 20 20 20 20 69 66 20 7b 21 24 69 6c 4f 6e        if {!$ilOn
6210: 6c 79 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  ly} then {..    
6220: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74          return t
6230: 72 75 65 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  rue..          }
6240: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
6250: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
6260: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49  .      # NOTE: I
6270: 66 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65  f the test suite
6280: 20 63 61 6e 6e 6f 74 20 75 73 65 20 5b 65 78 65   cannot use [exe
6290: 63 5d 20 6f 72 20 65 78 65 63 75 74 69 6f 6e 20  c] or execution 
62a0: 6f 66 20 43 6f 72 46 6c 61 67 73 0d 0a 20 20 20  of CorFlags..   
62b0: 20 20 20 23 20 20 20 20 20 20 20 66 61 69 6c 65     #       faile
62c0: 64 2c 20 72 65 74 75 72 6e 20 66 61 6c 73 65 2e  d, return false.
62d0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
62e0: 20 72 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20   return false.. 
62f0: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
6300: 63 20 69 73 44 61 72 77 69 6e 20 7b 7d 20 7b 0d  c isDarwin {} {.
6310: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 65  .      return [e
6320: 78 70 72 20 7b 0d 0a 20 20 20 20 20 20 20 20 5b  xpr {..        [
6330: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 63  info exists ::tc
6340: 6c 5f 70 6c 61 74 66 6f 72 6d 28 6f 73 29 5d 20  l_platform(os)] 
6350: 26 26 20 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f  && $::tcl_platfo
6360: 72 6d 28 6f 73 29 20 65 71 20 22 44 61 72 77 69  rm(os) eq "Darwi
6370: 6e 22 0d 0a 20 20 20 20 20 20 7d 5d 0d 0a 20 20  n"..      }]..  
6380: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
6390: 20 67 65 74 4e 61 74 69 76 65 4c 69 62 72 61 72   getNativeLibrar
63a0: 79 46 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79 20 7b  yFileNamesOnly {
63b0: 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
63c0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69 72 73      # NOTE: Firs
63d0: 74 2c 20 63 68 65 63 6b 20 69 66 20 74 68 65 20  t, check if the 
63e0: 6c 69 73 74 20 6f 66 20 6e 61 74 69 76 65 20 6c  list of native l
63f0: 69 62 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65  ibrary file name
6400: 73 20 68 61 73 20 62 65 65 6e 0d 0a 20 20 20 20  s has been..    
6410: 20 20 23 20 20 20 20 20 20 20 6d 61 6e 75 61 6c    #       manual
6420: 6c 79 20 6f 76 65 72 72 69 64 64 65 6e 2e 0d 0a  ly overridden...
6430: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
6440: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
6450: 3a 3a 6e 61 74 69 76 65 5f 6c 69 62 72 61 72 79  ::native_library
6460: 5f 66 69 6c 65 5f 6e 61 6d 65 73 5d 20 26 26 20  _file_names] && 
6470: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 6c 6c  \..          [ll
6480: 65 6e 67 74 68 20 24 3a 3a 6e 61 74 69 76 65 5f  ength $::native_
6490: 6c 69 62 72 61 72 79 5f 66 69 6c 65 5f 6e 61 6d  library_file_nam
64a0: 65 73 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  es] > 0} then {.
64b0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
64c0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20      # NOTE: The 
64d0: 6c 69 73 74 20 6f 66 20 6e 61 74 69 76 65 20 6c  list of native l
64e0: 69 62 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65  ibrary file name
64f0: 73 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72  s has been overr
6500: 69 64 64 65 6e 3b 0d 0a 20 20 20 20 20 20 20 20  idden;..        
6510: 23 20 20 20 20 20 20 20 74 68 65 72 65 66 6f 72  #       therefor
6520: 65 2c 20 75 73 65 20 69 74 20 76 65 72 62 61 74  e, use it verbat
6530: 69 6d 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  im...        #..
6540: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24          return $
6550: 3a 3a 6e 61 74 69 76 65 5f 6c 69 62 72 61 72 79  ::native_library
6560: 5f 66 69 6c 65 5f 6e 61 6d 65 73 0d 0a 20 20 20  _file_names..   
6570: 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69 73     } elseif {[is
6580: 57 69 6e 64 6f 77 73 5d 7d 20 74 68 65 6e 20 7b  Windows]} then {
6590: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
65a0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4f 74 68       # NOTE: Oth
65b0: 65 72 77 69 73 65 2c 20 6f 6e 20 57 69 6e 33 32  erwise, on Win32
65c0: 2c 20 61 6c 77 61 79 73 20 75 73 65 20 74 68 65  , always use the
65d0: 20 73 74 61 6e 64 61 72 64 20 6e 61 74 69 76 65   standard native
65e0: 20 6c 69 62 72 61 72 79 0d 0a 20 20 20 20 20 20   library..      
65f0: 20 20 23 20 20 20 20 20 20 20 66 69 6c 65 20 6e    #       file n
6600: 61 6d 65 20 22 73 71 6c 69 74 65 33 2e 64 6c 6c  ame "sqlite3.dll
6610: 22 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  "...        #.. 
6620: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6c         return [l
6630: 69 73 74 20 73 71 6c 69 74 65 33 2e 64 6c 6c 5d  ist sqlite3.dll]
6640: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66  ..      } elseif
6650: 20 7b 5b 69 73 44 6f 74 4e 65 74 43 6f 72 65 5d   {[isDotNetCore]
6660: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
6670: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 20    #..        #  
6680: 20 20 20 20 20 57 68 65 6e 20 72 75 6e 6e 69 6e       When runnin
6690: 67 20 6f 6e 20 2e 4e 45 54 20 43 6f 72 65 2c 20  g on .NET Core, 
66a0: 72 65 74 75 72 6e 20 74 68 65 20 73 61 6d 65 20  return the same 
66b0: 6e 61 74 69 76 65 20 6c 69 62 72 61 72 79 0d 0a  native library..
66c0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
66d0: 66 69 6c 65 20 6e 61 6d 65 20 74 68 61 74 20 69  file name that i
66e0: 73 20 75 73 65 64 20 6f 6e 20 57 69 6e 64 6f 77  s used on Window
66f0: 73 20 28 69 2e 65 2e 20 6f 74 68 65 72 77 69 73  s (i.e. otherwis
6700: 65 2c 20 61 73 73 75 6d 65 0d 0a 20 20 20 20 20  e, assume..     
6710: 20 20 20 23 20 20 20 20 20 20 20 77 65 20 61 72     #       we ar
6720: 65 20 72 75 6e 6e 69 6e 67 20 6f 6e 20 4d 6f 6e  e running on Mon
6730: 6f 20 61 6e 64 20 75 73 65 20 69 74 73 20 50 2f  o and use its P/
6740: 49 6e 76 6f 6b 65 20 63 6f 6e 76 65 6e 74 69 6f  Invoke conventio
6750: 6e 73 29 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ns)...        #.
6760: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
6770: 5b 6c 69 73 74 20 73 71 6c 69 74 65 33 2e 64 6c  [list sqlite3.dl
6780: 6c 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  l]..      } else
6790: 69 66 20 7b 5b 69 73 44 61 72 77 69 6e 5d 7d 20  if {[isDarwin]} 
67a0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
67b0: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
67c0: 45 3a 20 57 68 65 6e 20 72 75 6e 6e 69 6e 67 20  E: When running 
67d0: 6f 6e 20 44 61 72 77 69 6e 20 28 69 2e 65 2e 20  on Darwin (i.e. 
67e0: 74 68 65 20 6b 65 72 6e 65 6c 20 6f 66 20 69 4f  the kernel of iO
67f0: 53 20 2f 20 4d 61 63 20 4f 53 20 58 29 2c 0d 0a  S / Mac OS X),..
6800: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
6810: 72 65 74 75 72 6e 20 74 68 65 20 4d 61 63 20 4f  return the Mac O
6820: 53 20 58 20 6e 61 74 69 76 65 20 6c 69 62 72 61  S X native libra
6830: 72 79 20 66 69 6c 65 20 6e 61 6d 65 2e 20 20 54  ry file name.  T
6840: 68 69 73 20 66 69 6c 65 0d 0a 20 20 20 20 20 20  his file..      
6850: 20 20 23 20 20 20 20 20 20 20 6e 61 6d 65 20 69    #       name i
6860: 73 20 6e 6f 72 6d 61 6c 6c 79 20 72 65 71 75 69  s normally requi
6870: 72 65 64 20 66 6f 72 20 4d 6f 6e 6f 2e 0d 0a 20  red for Mono... 
6880: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
6890: 20 20 72 65 74 75 72 6e 20 5b 6c 69 73 74 20 6c    return [list l
68a0: 69 62 73 71 6c 69 74 65 33 2e 64 79 6c 69 62 5d  ibsqlite3.dylib]
68b0: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
68c0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
68d0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4f 74 68       # NOTE: Oth
68e0: 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 74  erwise, return t
68f0: 68 65 20 67 65 6e 65 72 69 63 20 50 4f 53 49 58  he generic POSIX
6900: 20 6e 61 74 69 76 65 20 6c 69 62 72 61 72 79 20   native library 
6910: 66 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 23 20  file..        # 
6920: 20 20 20 20 20 20 6e 61 6d 65 2e 20 20 54 68 69        name.  Thi
6930: 73 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 6e  s file name is n
6940: 6f 72 6d 61 6c 6c 79 20 72 65 71 75 69 72 65 64  ormally required
6950: 20 66 6f 72 20 4d 6f 6e 6f 2e 0d 0a 20 20 20 20   for Mono...    
6960: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
6970: 65 74 75 72 6e 20 5b 6c 69 73 74 20 6c 69 62 73  eturn [list libs
6980: 71 6c 69 74 65 33 2e 73 6f 5d 0d 0a 20 20 20 20  qlite3.so]..    
6990: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
69a0: 20 20 20 70 72 6f 63 20 67 65 74 49 6e 74 65 72     proc getInter
69b0: 6f 70 41 73 73 65 6d 62 6c 79 46 69 6c 65 4e 61  opAssemblyFileNa
69c0: 6d 65 73 4f 6e 6c 79 20 7b 7d 20 7b 0d 0a 20 20  mesOnly {} {..  
69d0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
69e0: 4f 54 45 3a 20 46 69 72 73 74 2c 20 63 68 65 63  OTE: First, chec
69f0: 6b 20 69 66 20 74 68 65 20 6c 69 73 74 20 6f 66  k if the list of
6a00: 20 69 6e 74 65 72 6f 70 20 61 73 73 65 6d 62 6c   interop assembl
6a10: 79 20 66 69 6c 65 20 6e 61 6d 65 73 20 68 61 73  y file names has
6a20: 20 62 65 65 6e 0d 0a 20 20 20 20 20 20 23 20 20   been..      #  
6a30: 20 20 20 20 20 6d 61 6e 75 61 6c 6c 79 20 6f 76       manually ov
6a40: 65 72 72 69 64 64 65 6e 2e 0d 0a 20 20 20 20 20  erridden...     
6a50: 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69   #..      if {[i
6a60: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 69 6e 74  nfo exists ::int
6a70: 65 72 6f 70 5f 61 73 73 65 6d 62 6c 79 5f 66 69  erop_assembly_fi
6a80: 6c 65 5f 6e 61 6d 65 73 5d 20 26 26 20 5c 0d 0a  le_names] && \..
6a90: 20 20 20 20 20 20 20 20 20 20 5b 6c 6c 65 6e 67            [lleng
6aa0: 74 68 20 24 3a 3a 69 6e 74 65 72 6f 70 5f 61 73  th $::interop_as
6ab0: 73 65 6d 62 6c 79 5f 66 69 6c 65 5f 6e 61 6d 65  sembly_file_name
6ac0: 73 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  s] > 0} then {..
6ad0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
6ae0: 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c     # NOTE: The l
6af0: 69 73 74 20 6f 66 20 69 6e 74 65 72 6f 70 20 61  ist of interop a
6b00: 73 73 65 6d 62 6c 79 20 66 69 6c 65 20 6e 61 6d  ssembly file nam
6b10: 65 73 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72  es has been over
6b20: 72 69 64 64 65 6e 3b 0d 0a 20 20 20 20 20 20 20  ridden;..       
6b30: 20 23 20 20 20 20 20 20 20 74 68 65 72 65 66 6f   #       therefo
6b40: 72 65 2c 20 75 73 65 20 69 74 20 76 65 72 62 61  re, use it verba
6b50: 74 69 6d 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  tim...        #.
6b60: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
6b70: 24 3a 3a 69 6e 74 65 72 6f 70 5f 61 73 73 65 6d  $::interop_assem
6b80: 62 6c 79 5f 66 69 6c 65 5f 6e 61 6d 65 73 0d 0a  bly_file_names..
6b90: 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b        } elseif {
6ba0: 5b 69 73 57 69 6e 64 6f 77 73 5d 7d 20 74 68 65  [isWindows]} the
6bb0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
6bc0: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
6bd0: 4f 74 68 65 72 77 69 73 65 2c 20 6f 6e 20 57 69  Otherwise, on Wi
6be0: 6e 33 32 2c 20 61 6c 77 61 79 73 20 75 73 65 20  n32, always use 
6bf0: 74 68 65 20 69 6e 74 65 72 6f 70 20 61 73 73 65  the interop asse
6c00: 6d 62 6c 79 20 66 69 6c 65 0d 0a 20 20 20 20 20  mbly file..     
6c10: 20 20 20 23 20 20 20 20 20 20 20 6e 61 6d 65 20     #       name 
6c20: 22 53 51 4c 69 74 65 2e 49 6e 74 65 72 6f 70 2e  "SQLite.Interop.
6c30: 64 6c 6c 22 2e 0d 0a 20 20 20 20 20 20 20 20 23  dll"...        #
6c40: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
6c50: 20 5b 6c 69 73 74 20 53 51 4c 69 74 65 2e 49 6e   [list SQLite.In
6c60: 74 65 72 6f 70 2e 64 6c 6c 5d 0d 0a 20 20 20 20  terop.dll]..    
6c70: 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69 73 44    } elseif {[isD
6c80: 6f 74 4e 65 74 43 6f 72 65 5d 7d 20 74 68 65 6e  otNetCore]} then
6c90: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
6ca0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 57         #       W
6cb0: 68 65 6e 20 72 75 6e 6e 69 6e 67 20 6f 6e 20 2e  hen running on .
6cc0: 4e 45 54 20 43 6f 72 65 2c 20 72 65 74 75 72 6e  NET Core, return
6cd0: 20 74 68 65 20 73 61 6d 65 20 69 6e 74 65 72 70   the same interp
6ce0: 20 61 73 73 65 6d 62 6c 79 0d 0a 20 20 20 20 20   assembly..     
6cf0: 20 20 20 23 20 20 20 20 20 20 20 66 69 6c 65 20     #       file 
6d00: 6e 61 6d 65 20 74 68 61 74 20 69 73 20 75 73 65  name that is use
6d10: 64 20 6f 6e 20 57 69 6e 64 6f 77 73 20 28 69 2e  d on Windows (i.
6d20: 65 2e 20 6f 74 68 65 72 77 69 73 65 2c 20 61 73  e. otherwise, as
6d30: 73 75 6d 65 0d 0a 20 20 20 20 20 20 20 20 23 20  sume..        # 
6d40: 20 20 20 20 20 20 77 65 20 61 72 65 20 72 75 6e        we are run
6d50: 6e 69 6e 67 20 6f 6e 20 4d 6f 6e 6f 20 61 6e 64  ning on Mono and
6d60: 20 75 73 65 20 69 74 73 20 50 2f 49 6e 76 6f 6b   use its P/Invok
6d70: 65 20 63 6f 6e 76 65 6e 74 69 6f 6e 73 29 2e 0d  e conventions)..
6d80: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
6d90: 20 20 20 20 72 65 74 75 72 6e 20 5b 6c 69 73 74      return [list
6da0: 20 53 51 4c 69 74 65 2e 49 6e 74 65 72 6f 70 2e   SQLite.Interop.
6db0: 64 6c 6c 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c  dll]..      } el
6dc0: 73 65 69 66 20 7b 5b 69 73 44 61 72 77 69 6e 5d  seif {[isDarwin]
6dd0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
6de0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
6df0: 4f 54 45 3a 20 57 68 65 6e 20 72 75 6e 6e 69 6e  OTE: When runnin
6e00: 67 20 6f 6e 20 44 61 72 77 69 6e 20 28 69 2e 65  g on Darwin (i.e
6e10: 2e 20 74 68 65 20 6b 65 72 6e 65 6c 20 6f 66 20  . the kernel of 
6e20: 69 4f 53 20 2f 20 4d 61 63 20 4f 53 20 58 29 2c  iOS / Mac OS X),
6e30: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
6e40: 20 20 72 65 74 75 72 6e 20 74 68 65 20 4d 61 63    return the Mac
6e50: 20 4f 53 20 58 20 69 6e 74 65 72 70 20 61 73 73   OS X interp ass
6e60: 65 6d 62 6c 79 20 66 69 6c 65 20 6e 61 6d 65 2e  embly file name.
6e70: 20 20 54 68 69 73 20 66 69 6c 65 0d 0a 20 20 20    This file..   
6e80: 20 20 20 20 20 23 20 20 20 20 20 20 20 6e 61 6d       #       nam
6e90: 65 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 72 65  e is normally re
6ea0: 71 75 69 72 65 64 20 66 6f 72 20 4d 6f 6e 6f 2e  quired for Mono.
6eb0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
6ec0: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6c 69 73       return [lis
6ed0: 74 20 6c 69 62 53 51 4c 69 74 65 2e 49 6e 74 65  t libSQLite.Inte
6ee0: 72 6f 70 2e 64 79 6c 69 62 5d 0d 0a 20 20 20 20  rop.dylib]..    
6ef0: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
6f00: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
6f10: 20 4e 4f 54 45 3a 20 4f 74 68 65 72 77 69 73 65   NOTE: Otherwise
6f20: 2c 20 72 65 74 75 72 6e 20 74 68 65 20 67 65 6e  , return the gen
6f30: 65 72 69 63 20 50 4f 53 49 58 20 69 6e 74 65 72  eric POSIX inter
6f40: 70 20 61 73 73 65 6d 62 6c 79 20 66 69 6c 65 0d  p assembly file.
6f50: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
6f60: 20 6e 61 6d 65 2e 20 20 54 68 69 73 20 66 69 6c   name.  This fil
6f70: 65 20 6e 61 6d 65 20 69 73 20 6e 6f 72 6d 61 6c  e name is normal
6f80: 6c 79 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  ly required for 
6f90: 4d 6f 6e 6f 2e 0d 0a 20 20 20 20 20 20 20 20 23  Mono...        #
6fa0: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
6fb0: 20 5b 6c 69 73 74 20 6c 69 62 53 51 4c 69 74 65   [list libSQLite
6fc0: 2e 49 6e 74 65 72 6f 70 2e 73 6f 5d 0d 0a 20 20  .Interop.so]..  
6fd0: 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
6fe0: 0a 20 20 20 20 70 72 6f 63 20 67 65 74 43 6f 72  .    proc getCor
6ff0: 65 45 78 74 65 6e 73 69 6f 6e 42 69 6e 61 72 79  eExtensionBinary
7000: 46 69 6c 65 4e 61 6d 65 20 7b 20 7b 64 65 66 61  FileName { {defa
7010: 75 6c 74 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20  ult ""} } {..   
7020: 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 20     set fileName 
7030: 5b 67 65 74 43 6f 72 65 42 69 6e 61 72 79 46 69  [getCoreBinaryFi
7040: 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20  leName]....     
7050: 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74   if {[file exist
7060: 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68  s $fileName]} th
7070: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65  en {..        re
7080: 74 75 72 6e 20 24 66 69 6c 65 4e 61 6d 65 0d 0a  turn $fileName..
7090: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
70a0: 20 72 65 74 75 72 6e 20 24 64 65 66 61 75 6c 74   return $default
70b0: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
70c0: 70 72 6f 63 20 69 73 42 75 69 6c 64 41 76 61 69  proc isBuildAvai
70d0: 6c 61 62 6c 65 20 7b 20 6e 61 74 69 76 65 20 73  lable { native s
70e0: 6b 69 70 4e 61 74 69 76 65 20 64 69 72 65 63 74  kipNative direct
70f0: 6f 72 79 20 7b 76 61 72 4e 61 6d 65 20 22 22 7d  ory {varName ""}
7100: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20   } {..      #.. 
7110: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69       # NOTE: Bui
7120: 6c 64 20 74 68 65 20 66 75 6c 6c 79 20 71 75 61  ld the fully qua
7130: 6c 69 66 69 65 64 20 66 69 6c 65 20 6e 61 6d 65  lified file name
7140: 20 66 6f 72 20 74 68 65 20 70 72 69 6d 61 72 79   for the primary
7150: 20 61 73 73 65 6d 62 6c 79 0d 0a 20 20 20 20 20   assembly..     
7160: 20 23 20 20 20 20 20 20 20 63 6f 6e 74 61 69 6e   #       contain
7170: 69 6e 67 20 74 68 65 20 53 79 73 74 65 6d 2e 44  ing the System.D
7180: 61 74 61 2e 53 51 4c 69 74 65 20 6d 61 6e 61 67  ata.SQLite manag
7190: 65 64 20 63 6f 6d 70 6f 6e 65 6e 74 73 2e 20 20  ed components.  
71a0: 49 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  It..      #     
71b0: 20 20 73 68 6f 75 6c 64 20 62 65 20 6e 6f 74 65    should be note
71c0: 64 20 74 68 61 74 20 74 68 69 73 20 61 73 73 65  d that this asse
71d0: 6d 62 6c 79 20 66 69 6c 65 20 6d 61 79 20 61 6c  mbly file may al
71e0: 73 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 0d 0a  so contain the..
71f0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6e 61        #       na
7200: 74 69 76 65 20 63 6f 6d 70 6f 6e 65 6e 74 73 2c  tive components,
7210: 20 69 66 20 61 20 6e 61 74 69 76 65 20 62 75 69   if a native bui
7220: 6c 64 20 69 73 20 69 6e 20 75 73 65 2e 0d 0a 20  ld is in use... 
7230: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65       #..      se
7240: 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65  t fileName [file
7250: 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c   nativename [fil
7260: 65 20 6a 6f 69 6e 20 24 64 69 72 65 63 74 6f 72  e join $director
7270: 79 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 53  y \..          S
7280: 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
7290: 65 2e 64 6c 6c 5d 5d 0d 0a 0d 0a 20 20 20 20 20  e.dll]]....     
72a0: 20 69 66 20 7b 21 5b 66 69 6c 65 20 65 78 69 73   if {![file exis
72b0: 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74  ts $fileName]} t
72c0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72  hen {..        r
72d0: 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20  eturn false..   
72e0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
72f0: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49  .      # NOTE: I
7300: 66 20 77 65 20 61 72 65 20 73 6b 69 70 70 69 6e  f we are skippin
7310: 67 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 74 68  g looking for th
7320: 65 20 6e 61 74 69 76 65 20 63 6f 6d 70 6f 6e 65  e native compone
7330: 6e 74 73 2c 20 73 74 6f 70 0d 0a 20 20 20 20 20  nts, stop..     
7340: 20 23 20 20 20 20 20 20 20 6e 6f 77 2e 0d 0a 20   #       now... 
7350: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
7360: 20 7b 24 73 6b 69 70 4e 61 74 69 76 65 7d 20 74   {$skipNative} t
7370: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72  hen {..        r
7380: 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20  eturn true..    
7390: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
73a0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74        # NOTE: At
73b0: 74 65 6d 70 74 20 74 6f 20 61 75 74 6f 6d 61 74  tempt to automat
73c0: 69 63 61 6c 6c 79 20 64 65 74 65 63 74 20 69 66  ically detect if
73d0: 20 74 68 65 20 70 72 69 6d 61 72 79 20 61 73 73   the primary ass
73e0: 65 6d 62 6c 79 0d 0a 20 20 20 20 20 20 23 20 20  embly..      #  
73f0: 20 20 20 20 20 63 6f 6e 74 61 69 6e 73 20 61 6e       contains an
7400: 79 20 6e 61 74 69 76 65 20 63 6f 6d 70 6f 6e 65  y native compone
7410: 6e 74 73 2c 20 69 66 20 6e 65 63 65 73 73 61 72  nts, if necessar
7420: 79 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  y...      #..   
7430: 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
7440: 65 6e 67 74 68 20 24 6e 61 74 69 76 65 5d 20 3d  ength $native] =
7450: 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
7460: 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
7470: 20 6c 65 6e 67 74 68 20 24 76 61 72 4e 61 6d 65   length $varName
7480: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
7490: 20 20 20 20 20 20 20 20 20 75 70 76 61 72 20 31           upvar 1
74a0: 20 24 76 61 72 4e 61 6d 65 20 24 76 61 72 4e 61   $varName $varNa
74b0: 6d 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  me..        }...
74c0: 0a 20 20 20 20 20 20 20 20 73 65 74 20 6e 61 74  .        set nat
74d0: 69 76 65 20 5b 69 73 4d 69 78 65 64 4d 6f 64 65  ive [isMixedMode
74e0: 41 73 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61  Assembly $fileNa
74f0: 6d 65 20 24 76 61 72 4e 61 6d 65 5d 0d 0a 20 20  me $varName]..  
7500: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
7510: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
7520: 49 66 20 74 68 65 20 70 72 69 6d 61 72 79 20 61  If the primary a
7530: 73 73 65 6d 62 6c 79 20 61 6c 73 6f 20 63 6f 6e  ssembly also con
7540: 74 61 69 6e 73 20 74 68 65 20 6e 61 74 69 76 65  tains the native
7550: 20 63 6f 6d 70 6f 6e 65 6e 74 73 2c 0d 0a 20 20   components,..  
7560: 20 20 20 20 23 20 20 20 20 20 20 20 77 65 20 68      #       we h
7570: 61 76 65 20 65 76 65 72 79 74 68 69 6e 67 20 77  ave everything w
7580: 65 20 6e 65 65 64 2e 0d 0a 20 20 20 20 20 20 23  e need...      #
7590: 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 6e 61 74  ..      if {$nat
75a0: 69 76 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ive} then {..   
75b0: 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65       return true
75c0: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
75d0: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
75e0: 54 45 3a 20 49 66 20 74 68 65 20 6d 61 63 68 69  TE: If the machi
75f0: 6e 65 20 6e 61 6d 65 20 69 73 20 75 6e 61 76 61  ne name is unava
7600: 69 6c 61 62 6c 65 2c 20 74 68 65 72 65 20 69 73  ilable, there is
7610: 20 6e 6f 74 68 69 6e 67 20 65 6c 73 65 20 77 65   nothing else we
7620: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
7630: 63 61 6e 20 64 6f 2e 0d 0a 20 20 20 20 20 20 23  can do...      #
7640: 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e  ..      if {![in
7650: 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 63 6c 5f  fo exists ::tcl_
7660: 70 6c 61 74 66 6f 72 6d 28 6d 61 63 68 69 6e 65  platform(machine
7670: 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
7680: 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65      return false
7690: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
76a0: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
76b0: 54 45 3a 20 57 68 61 74 20 69 73 20 74 68 65 20  TE: What is the 
76c0: 61 72 63 68 69 74 65 63 74 75 72 65 20 66 6f 72  architecture for
76d0: 20 74 68 69 73 20 6d 61 63 68 69 6e 65 3f 0d 0a   this machine?..
76e0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73        #..      s
76f0: 65 74 20 61 72 63 68 69 74 65 63 74 75 72 65 20  et architecture 
7700: 5b 6d 61 63 68 69 6e 65 54 6f 50 6c 61 74 66 6f  [machineToPlatfo
7710: 72 6d 20 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f  rm $::tcl_platfo
7720: 72 6d 28 6d 61 63 68 69 6e 65 29 20 74 72 75 65  rm(machine) true
7730: 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ]....      #..  
7740: 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 68 61 74      # NOTE: What
7750: 20 69 73 20 74 68 65 20 70 6c 61 74 66 6f 72 6d   is the platform
7760: 20 66 6f 72 20 74 68 69 73 20 6d 61 63 68 69 6e   for this machin
7770: 65 3f 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  e?..      #..   
7780: 20 20 20 73 65 74 20 70 6c 61 74 66 6f 72 6d 20     set platform 
7790: 5b 6d 61 63 68 69 6e 65 54 6f 50 6c 61 74 66 6f  [machineToPlatfo
77a0: 72 6d 20 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f  rm $::tcl_platfo
77b0: 72 6d 28 6d 61 63 68 69 6e 65 29 5d 0d 0a 0d 0a  rm(machine)]....
77c0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
77d0: 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74 68 65   NOTE: Build the
77e0: 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64   fully qualified
77f0: 20 66 69 6c 65 20 6e 61 6d 65 20 66 6f 72 20 74   file name for t
7800: 68 65 20 69 6e 74 65 72 6f 70 20 61 73 73 65 6d  he interop assem
7810: 62 6c 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20  bly..      #    
7820: 20 20 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68     containing th
7830: 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  e System.Data.SQ
7840: 4c 69 74 65 20 6e 61 74 69 76 65 20 63 6f 6d 70  Lite native comp
7850: 6f 6e 65 6e 74 73 2e 20 20 49 66 20 74 68 69 73  onents.  If this
7860: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
7870: 66 69 6c 65 20 65 78 69 73 74 73 2c 20 77 65 20  file exists, we 
7880: 73 68 6f 75 6c 64 20 68 61 76 65 20 65 76 65 72  should have ever
7890: 79 74 68 69 6e 67 20 77 65 20 6e 65 65 64 2e 0d  ything we need..
78a0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
78b0: 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65  foreach fileName
78c0: 4f 6e 6c 79 20 5b 67 65 74 49 6e 74 65 72 6f 70  Only [getInterop
78d0: 41 73 73 65 6d 62 6c 79 46 69 6c 65 4e 61 6d 65  AssemblyFileName
78e0: 73 4f 6e 6c 79 5d 20 7b 0d 0a 20 20 20 20 20 20  sOnly] {..      
78f0: 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b    set fileName [
7900: 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20  file nativename 
7910: 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 64 69 72 65  [file join $dire
7920: 63 74 6f 72 79 20 5c 0d 0a 20 20 20 20 20 20 20  ctory \..       
7930: 20 20 20 20 20 24 61 72 63 68 69 74 65 63 74 75       $architectu
7940: 72 65 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79  re $fileNameOnly
7950: 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66  ]]....        if
7960: 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24   {[file exists $
7970: 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20  fileName]} then 
7980: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  {..          ret
7990: 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20  urn true..      
79a0: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73    }....        s
79b0: 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c  et fileName [fil
79c0: 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69  e nativename [fi
79d0: 6c 65 20 6a 6f 69 6e 20 24 64 69 72 65 63 74 6f  le join $directo
79e0: 72 79 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ry \..          
79f0: 20 20 24 70 6c 61 74 66 6f 72 6d 20 24 66 69 6c    $platform $fil
7a00: 65 4e 61 6d 65 4f 6e 6c 79 5d 5d 0d 0a 0d 0a 20  eNameOnly]].... 
7a10: 20 20 20 20 20 20 20 69 66 20 7b 5b 66 69 6c 65         if {[file
7a20: 20 65 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d   exists $fileNam
7a30: 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  e]} then {..    
7a40: 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75        return tru
7a50: 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  e..        }....
7a60: 20 20 20 20 20 20 20 20 73 65 74 20 66 69 6c 65          set file
7a70: 4e 61 6d 65 20 5b 66 69 6c 65 20 6e 61 74 69 76  Name [file nativ
7a80: 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e  ename [file join
7a90: 20 24 64 69 72 65 63 74 6f 72 79 20 5c 0d 0a 20   $directory \.. 
7aa0: 20 20 20 20 20 20 20 20 20 20 20 24 66 69 6c 65             $file
7ab0: 4e 61 6d 65 4f 6e 6c 79 5d 5d 0d 0a 0d 0a 20 20  NameOnly]]....  
7ac0: 20 20 20 20 20 20 69 66 20 7b 5b 66 69 6c 65 20        if {[file 
7ad0: 65 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65  exists $fileName
7ae0: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
7af0: 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65       return true
7b00: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
7b10: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
7b20: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42  .      # NOTE: B
7b30: 75 69 6c 64 20 74 68 65 20 66 75 6c 6c 79 20 71  uild the fully q
7b40: 75 61 6c 69 66 69 65 64 20 66 69 6c 65 20 6e 61  ualified file na
7b50: 6d 65 20 66 6f 72 20 74 68 65 20 53 51 4c 69 74  me for the SQLit
7b60: 65 20 63 6f 72 65 0d 0a 20 20 20 20 20 20 23 20  e core..      # 
7b70: 20 20 20 20 20 20 6c 69 62 72 61 72 79 2e 20 20        library.  
7b80: 49 66 20 74 68 69 73 20 66 69 6c 65 20 65 78 69  If this file exi
7b90: 73 74 73 2c 20 77 65 20 73 68 6f 75 6c 64 20 68  sts, we should h
7ba0: 61 76 65 20 65 76 65 72 79 74 68 69 6e 67 20 77  ave everything w
7bb0: 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
7bc0: 20 6e 65 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d   need...      #.
7bd0: 0a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66  .      foreach f
7be0: 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 5b 67 65 74  ileNameOnly [get
7bf0: 4e 61 74 69 76 65 4c 69 62 72 61 72 79 46 69 6c  NativeLibraryFil
7c00: 65 4e 61 6d 65 73 4f 6e 6c 79 5d 20 7b 0d 0a 20  eNamesOnly] {.. 
7c10: 20 20 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e         set fileN
7c20: 61 6d 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65  ame [file native
7c30: 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20  name [file join 
7c40: 24 64 69 72 65 63 74 6f 72 79 20 5c 0d 0a 20 20  $directory \..  
7c50: 20 20 20 20 20 20 20 20 20 20 24 61 72 63 68 69            $archi
7c60: 74 65 63 74 75 72 65 20 24 66 69 6c 65 4e 61 6d  tecture $fileNam
7c70: 65 4f 6e 6c 79 5d 5d 0d 0a 0d 0a 20 20 20 20 20  eOnly]]....     
7c80: 20 20 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69     if {[file exi
7c90: 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20  sts $fileName]} 
7ca0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
7cb0: 20 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20    return true.. 
7cc0: 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
7cd0: 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65      set fileName
7ce0: 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d   [file nativenam
7cf0: 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 64 69  e [file join $di
7d00: 72 65 63 74 6f 72 79 20 5c 0d 0a 20 20 20 20 20  rectory \..     
7d10: 20 20 20 20 20 20 20 24 70 6c 61 74 66 6f 72 6d         $platform
7d20: 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 5d 5d   $fileNameOnly]]
7d30: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b  ....        if {
7d40: 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 66 69  [file exists $fi
7d50: 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d  leName]} then {.
7d60: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
7d70: 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20 20 20  n true..        
7d80: 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74  }....        set
7d90: 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20   fileName [file 
7da0: 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65  nativename [file
7db0: 20 6a 6f 69 6e 20 24 64 69 72 65 63 74 6f 72 79   join $directory
7dc0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
7dd0: 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 5d 5d 0d  $fileNameOnly]].
7de0: 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  ...        if {[
7df0: 66 69 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c  file exists $fil
7e00: 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a  eName]} then {..
7e10: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
7e20: 20 74 72 75 65 0d 0a 20 20 20 20 20 20 20 20 7d   true..        }
7e30: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
7e40: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
7e50: 54 45 3a 20 4f 6e 65 20 6f 72 20 6d 6f 72 65 20  TE: One or more 
7e60: 6e 61 74 69 76 65 20 63 6f 6d 70 6f 6e 65 6e 74  native component
7e70: 73 20 6e 65 65 64 65 64 20 62 79 20 53 79 73 74  s needed by Syst
7e80: 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 0d 0a  em.Data.SQLite..
7e90: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61 72        #       ar
7ea0: 65 20 6d 69 73 73 69 6e 67 2e 0d 0a 20 20 20 20  e missing...    
7eb0: 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75 72    #..      retur
7ec0: 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20 7d 0d 0a  n false..    }..
7ed0: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 69 73 52 65  ...    proc isRe
7ee0: 6c 65 61 73 65 41 76 61 69 6c 61 62 6c 65 20 7b  leaseAvailable {
7ef0: 20 64 69 72 65 63 74 6f 72 79 20 7b 76 61 72 4e   directory {varN
7f00: 61 6d 65 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20  ame ""} } {..   
7f10: 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
7f20: 65 6e 67 74 68 20 24 76 61 72 4e 61 6d 65 5d 20  ength $varName] 
7f30: 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
7f40: 20 20 20 20 20 75 70 76 61 72 20 31 20 24 76 61       upvar 1 $va
7f50: 72 4e 61 6d 65 20 24 76 61 72 4e 61 6d 65 0d 0a  rName $varName..
7f60: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
7f70: 20 72 65 74 75 72 6e 20 5b 69 73 42 75 69 6c 64   return [isBuild
7f80: 41 76 61 69 6c 61 62 6c 65 20 22 22 20 66 61 6c  Available "" fal
7f90: 73 65 20 24 64 69 72 65 63 74 6f 72 79 20 24 76  se $directory $v
7fa0: 61 72 4e 61 6d 65 5d 0d 0a 20 20 20 20 7d 0d 0a  arName]..    }..
7fb0: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 6a 6f 69 6e  ...    proc join
7fc0: 42 75 69 6c 64 44 69 72 65 63 74 6f 72 79 20 7b  BuildDirectory {
7fd0: 20 6e 61 74 69 76 65 20 70 61 74 68 20 79 65 61   native path yea
7fe0: 72 20 70 6c 61 74 66 6f 72 6d 20 63 6f 6e 66 69  r platform confi
7ff0: 67 75 72 61 74 69 6f 6e 20 65 78 74 72 61 20 7d  guration extra }
8000: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
8010: 20 20 20 23 20 4e 4f 54 45 3a 20 46 69 67 75 72     # NOTE: Figur
8020: 65 20 6f 75 74 20 61 6e 64 20 74 68 65 6e 20 72  e out and then r
8030: 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 79 20  eturn the fully 
8040: 71 75 61 6c 69 66 69 65 64 20 70 61 74 68 20 74  qualified path t
8050: 6f 20 74 68 65 20 62 75 69 6c 64 0d 0a 20 20 20  o the build..   
8060: 20 20 20 23 20 20 20 20 20 20 20 64 69 72 65 63     #       direc
8070: 74 6f 72 79 20 62 61 73 65 64 20 6f 6e 20 61 6c  tory based on al
8080: 6c 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20  l the arguments 
8090: 70 72 6f 76 69 64 65 64 20 62 79 20 6f 75 72 20  provided by our 
80a0: 63 61 6c 6c 65 72 2e 0d 0a 20 20 20 20 20 20 23  caller...      #
80b0: 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 6e 61 74  ..      if {$nat
80c0: 69 76 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ive} then {..   
80d0: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 66 69 6c       return [fil
80e0: 65 20 6a 6f 69 6e 20 24 70 61 74 68 20 62 69 6e  e join $path bin
80f0: 20 24 79 65 61 72 20 24 70 6c 61 74 66 6f 72 6d   $year $platform
8100: 20 24 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20   $configuration 
8110: 24 65 78 74 72 61 5d 0d 0a 20 20 20 20 20 20 7d  $extra]..      }
8120: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
8130: 20 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 6a 6f   return [file jo
8140: 69 6e 20 24 70 61 74 68 20 62 69 6e 20 24 79 65  in $path bin $ye
8150: 61 72 20 24 63 6f 6e 66 69 67 75 72 61 74 69 6f  ar $configuratio
8160: 6e 20 62 69 6e 20 24 65 78 74 72 61 5d 0d 0a 20  n bin $extra].. 
8170: 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
8180: 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 42 75  ..    proc getBu
8190: 69 6c 64 44 69 72 65 63 74 6f 72 79 20 7b 20 6d  ildDirectory { m
81a0: 61 6e 61 67 65 64 4f 6e 6c 79 20 7d 20 7b 0d 0a  anagedOnly } {..
81b0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
81c0: 20 4e 4f 54 45 3a 20 53 65 65 20 69 66 20 74 68   NOTE: See if th
81d0: 65 20 22 6e 61 74 69 76 65 22 20 72 75 6e 74 69  e "native" runti
81e0: 6d 65 20 6f 70 74 69 6f 6e 20 68 61 73 20 62 65  me option has be
81f0: 65 6e 20 73 65 74 2e 20 20 49 66 20 73 6f 2c 20  en set.  If so, 
8200: 75 73 65 20 74 68 65 0d 0a 20 20 20 20 20 20 23  use the..      #
8210: 20 20 20 20 20 20 20 64 69 72 65 63 74 6f 72 79         directory
8220: 20 66 6f 72 20 74 68 65 20 6d 69 78 65 64 2d 6d   for the mixed-m
8230: 6f 64 65 20 61 73 73 65 6d 62 6c 79 20 28 61 2e  ode assembly (a.
8240: 6b 2e 61 2e 20 74 68 65 20 6e 61 74 69 76 65 20  k.a. the native 
8250: 69 6e 74 65 72 6f 70 0d 0a 20 20 20 20 20 20 23  interop..      #
8260: 20 20 20 20 20 20 20 61 73 73 65 6d 62 6c 79 29         assembly)
8270: 2e 20 20 54 6f 20 65 6e 61 62 6c 65 20 74 68 69  .  To enable thi
8280: 73 20 6f 70 74 69 6f 6e 20 76 69 61 20 74 68 65  s option via the
8290: 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 2c 20 65   command line, e
82a0: 6e 74 65 72 20 61 0d 0a 20 20 20 20 20 20 23 20  nter a..      # 
82b0: 20 20 20 20 20 20 63 6f 6d 6d 61 6e 64 20 73 69        command si
82c0: 6d 69 6c 61 72 20 74 6f 20 6f 6e 65 20 6f 66 20  milar to one of 
82d0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 28 61  the following (a
82e0: 6c 6c 20 6f 6e 20 6f 6e 65 20 6c 69 6e 65 29 3a  ll on one line):
82f0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
8300: 20 23 20 20 20 20 20 20 20 45 61 67 6c 65 53 68   #       EagleSh
8310: 65 6c 6c 2e 65 78 65 20 2d 69 6e 69 74 69 61 6c  ell.exe -initial
8320: 69 7a 65 20 2d 72 75 6e 74 69 6d 65 4f 70 74 69  ize -runtimeOpti
8330: 6f 6e 20 6e 61 74 69 76 65 0d 0a 20 20 20 20 20  on native..     
8340: 20 23 20 20 20 20 20 20 20 20 20 2d 66 69 6c 65   #         -file
8350: 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65   .\path\to\all.e
8360: 61 67 6c 65 0d 0a 20 20 20 20 20 20 23 0d 0a 20  agle..      #.. 
8370: 20 20 20 20 20 23 20 20 20 20 20 20 20 54 6f 20       #       To 
8380: 65 6e 61 62 6c 65 20 74 68 69 73 20 6f 70 74 69  enable this opti
8390: 6f 6e 20 76 69 61 20 74 68 65 20 63 6f 6d 6d 61  on via the comma
83a0: 6e 64 20 6c 69 6e 65 20 70 72 69 6f 72 20 74 6f  nd line prior to
83b0: 20 74 68 65 20 22 62 65 74 61 20 31 36 22 0d 0a   the "beta 16"..
83c0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 72 65        #       re
83d0: 6c 65 61 73 65 20 6f 66 20 45 61 67 6c 65 2c 20  lease of Eagle, 
83e0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f  the following co
83f0: 6d 6d 61 6e 64 20 6d 75 73 74 20 62 65 20 75 73  mmand must be us
8400: 65 64 20 69 6e 73 74 65 61 64 0d 0a 20 20 20 20  ed instead..    
8410: 20 20 23 20 20 20 20 20 20 20 28 61 6c 73 6f 20    #       (also 
8420: 61 6c 6c 20 6f 6e 20 6f 6e 65 20 6c 69 6e 65 29  all on one line)
8430: 3a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  :..      #..    
8440: 20 20 23 20 20 20 20 20 20 20 45 61 67 6c 65 53    #       EagleS
8450: 68 65 6c 6c 2e 65 78 65 20 2d 69 6e 69 74 69 61  hell.exe -initia
8460: 6c 69 7a 65 20 2d 70 6f 73 74 49 6e 69 74 69 61  lize -postInitia
8470: 6c 69 7a 65 0d 0a 20 20 20 20 20 20 23 20 20 20  lize..      #   
8480: 20 20 20 20 20 20 22 6f 62 6a 65 63 74 20 69 6e        "object in
8490: 76 6f 6b 65 20 49 6e 74 65 72 70 72 65 74 65 72  voke Interpreter
84a0: 2e 47 65 74 41 63 74 69 76 65 20 41 64 64 52 75  .GetActive AddRu
84b0: 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 6e 61 74 69  ntimeOption nati
84c0: 76 65 22 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ve"..      #    
84d0: 20 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70 61 74       -file .\pat
84e0: 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a  h\to\all.eagle..
84f0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
8500: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
8510: 3a 3a 62 75 69 6c 64 5f 64 69 72 65 63 74 6f 72  ::build_director
8520: 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  y] && \..       
8530: 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74     [string lengt
8540: 68 20 24 3a 3a 62 75 69 6c 64 5f 64 69 72 65 63  h $::build_direc
8550: 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20  tory] > 0} then 
8560: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
8570: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68        # NOTE: Th
8580: 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68  e location of th
8590: 65 20 62 75 69 6c 64 20 64 69 72 65 63 74 6f 72  e build director
85a0: 79 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72  y has been overr
85b0: 69 64 64 65 6e 3b 0d 0a 20 20 20 20 20 20 20 20  idden;..        
85c0: 23 20 20 20 20 20 20 20 74 68 65 72 65 66 6f 72  #       therefor
85d0: 65 2c 20 75 73 65 20 69 74 20 76 65 72 62 61 74  e, use it verbat
85e0: 69 6d 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  im...        #..
85f0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24          return $
8600: 3a 3a 62 75 69 6c 64 5f 64 69 72 65 63 74 6f 72  ::build_director
8610: 79 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  y..      } else 
8620: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
8630: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66        # NOTE: If
8640: 20 74 68 65 20 22 6e 61 74 69 76 65 22 20 72 75   the "native" ru
8650: 6e 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20  ntime option is 
8660: 73 65 74 2c 20 74 68 65 20 6d 69 78 65 64 2d 6d  set, the mixed-m
8670: 6f 64 65 20 61 73 73 65 6d 62 6c 79 0d 0a 20 20  ode assembly..  
8680: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69 73        #       is
8690: 20 62 65 69 6e 67 20 74 65 73 74 65 64 2e 20 20   being tested.  
86a0: 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74 68  In that case, th
86b0: 65 20 70 61 74 68 20 74 6f 20 74 68 65 20 62 75  e path to the bu
86c0: 69 6c 64 20 64 69 72 65 63 74 6f 72 79 0d 0a 20  ild directory.. 
86d0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 77         #       w
86e0: 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 74 68 65 20  ill contain the 
86f0: 70 6c 61 74 66 6f 72 6d 20 6e 61 6d 65 20 61 6e  platform name an
8700: 64 20 61 6c 6c 20 74 68 65 20 62 69 6e 61 72 69  d all the binari
8710: 65 73 20 75 6e 64 65 72 20 74 65 73 74 0d 0a 20  es under test.. 
8720: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73         #       s
8730: 68 6f 75 6c 64 20 62 65 20 70 72 65 73 65 6e 74  hould be present
8740: 20 69 6e 20 74 68 61 74 20 64 69 72 65 63 74 6f   in that directo
8750: 72 79 2e 20 20 49 66 20 74 68 65 20 22 6e 61 74  ry.  If the "nat
8760: 69 76 65 22 20 72 75 6e 74 69 6d 65 0d 0a 20 20  ive" runtime..  
8770: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6f 70        #       op
8780: 74 69 6f 6e 20 69 73 20 6e 6f 74 20 73 65 74 2c  tion is not set,
8790: 20 74 68 65 20 62 75 69 6c 64 20 64 69 72 65 63   the build direc
87a0: 74 6f 72 79 20 77 69 6c 6c 20 62 65 20 63 6f 6e  tory will be con
87b0: 73 69 64 65 72 65 64 20 74 6f 20 62 65 0d 0a 20  sidered to be.. 
87c0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 22         #       "
87d0: 70 6c 61 74 66 6f 72 6d 2d 6e 65 75 74 72 61 6c  platform-neutral
87e0: 22 2c 20 77 69 74 68 20 74 68 65 20 6e 6f 74 61  ", with the nota
87f0: 62 6c 65 20 65 78 63 65 70 74 69 6f 6e 20 6f 66  ble exception of
8800: 20 61 6e 79 20 6e 61 74 69 76 65 0d 0a 20 20 20   any native..   
8810: 20 20 20 20 20 23 20 20 20 20 20 20 20 61 73 73       #       ass
8820: 65 6d 62 6c 79 20 28 65 2e 67 2e 20 22 53 51 4c  embly (e.g. "SQL
8830: 69 74 65 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c 22  ite.Interop.dll"
8840: 29 20 63 6f 70 69 65 64 20 74 68 65 72 65 20 64  ) copied there d
8850: 75 72 69 6e 67 20 74 68 65 0d 0a 20 20 20 20 20  uring the..     
8860: 20 20 20 23 20 20 20 20 20 20 20 62 75 69 6c 64     #       build
8870: 20 70 72 6f 63 65 73 73 20 69 74 73 65 6c 66 2e   process itself.
8880: 20 20 49 66 20 74 68 65 20 62 75 69 6c 64 20 70    If the build p
8890: 72 6f 63 65 73 73 20 73 6f 6d 65 68 6f 77 20 64  rocess somehow d
88a0: 6f 65 73 20 6e 6f 74 0d 0a 20 20 20 20 20 20 20  oes not..       
88b0: 20 23 20 20 20 20 20 20 20 63 6f 70 79 20 74 68   #       copy th
88c0: 65 20 6e 61 74 69 76 65 20 61 73 73 65 6d 62 6c  e native assembl
88d0: 79 20 66 6f 72 20 74 68 69 73 20 70 6c 61 74 66  y for this platf
88e0: 6f 72 6d 2c 20 6d 6f 73 74 20 6f 66 20 74 68 65  orm, most of the
88f0: 20 74 65 73 74 73 0d 0a 20 20 20 20 20 20 20 20   tests..        
8900: 23 20 20 20 20 20 20 20 69 6e 20 74 68 65 20 73  #       in the s
8910: 75 69 74 65 20 77 69 6c 6c 20 73 69 6d 70 6c 79  uite will simply
8920: 20 62 65 20 73 6b 69 70 70 65 64 2e 20 20 47 65   be skipped.  Ge
8930: 6e 65 72 61 6c 6c 79 20 73 70 65 61 6b 69 6e 67  nerally speaking
8940: 2c 20 74 68 65 72 65 0d 0a 20 20 20 20 20 20 20  , there..       
8950: 20 23 20 20 20 20 20 20 20 61 72 65 20 74 77 6f   #       are two
8960: 20 77 61 79 73 20 74 6f 20 62 75 69 6c 64 20 74   ways to build t
8970: 68 65 20 62 69 6e 61 72 69 65 73 20 77 68 65 6e  he binaries when
8980: 20 70 72 65 70 61 72 69 6e 67 20 74 6f 20 72 75   preparing to ru
8990: 6e 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23  n the..        #
89a0: 20 20 20 20 20 20 20 74 65 73 74 20 73 75 69 74         test suit
89b0: 65 3a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  e:..        #.. 
89c0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 31         #       1
89d0: 2e 20 42 75 69 6c 64 20 74 68 65 20 73 65 70 61  . Build the sepa
89e0: 72 61 74 65 20 6d 61 6e 61 67 65 64 20 61 6e 64  rate managed and
89f0: 20 6e 61 74 69 76 65 20 61 73 73 65 6d 62 6c 69   native assembli
8a00: 65 73 20 75 73 69 6e 67 20 73 6f 6d 65 0d 0a 20  es using some.. 
8a10: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20         #        
8a20: 20 20 63 6f 6d 6d 61 6e 64 73 20 73 69 6d 69 6c    commands simil
8a30: 61 72 20 74 6f 3a 0d 0a 20 20 20 20 20 20 20 20  ar to:..        
8a40: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  #..        #    
8a50: 20 20 20 20 20 20 62 75 69 6c 64 2e 62 61 74 20        build.bat 
8a60: 24 7b 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 7d  ${Configuration}
8a70: 4d 61 6e 61 67 65 64 4f 6e 6c 79 20 24 7b 50 6c  ManagedOnly ${Pl
8a80: 61 74 66 6f 72 6d 7d 0d 0a 20 20 20 20 20 20 20  atform}..       
8a90: 20 23 20 20 20 20 20 20 20 20 20 20 62 75 69 6c   #          buil
8aa0: 64 2e 62 61 74 20 24 7b 43 6f 6e 66 69 67 75 72  d.bat ${Configur
8ab0: 61 74 69 6f 6e 7d 4e 61 74 69 76 65 4f 6e 6c 79  ation}NativeOnly
8ac0: 20 24 7b 50 6c 61 74 66 6f 72 6d 7d 0d 0a 20 20   ${Platform}..  
8ad0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
8ae0: 20 23 20 20 20 20 20 20 20 20 20 20 57 68 65 72   #          Wher
8af0: 65 20 24 7b 43 6f 6e 66 69 67 75 72 61 74 69 6f  e ${Configuratio
8b00: 6e 7d 20 69 73 20 65 69 74 68 65 72 20 22 44 65  n} is either "De
8b10: 62 75 67 22 20 6f 72 20 22 52 65 6c 65 61 73 65  bug" or "Release
8b20: 22 20 61 6e 64 0d 0a 20 20 20 20 20 20 20 20 23  " and..        #
8b30: 20 20 20 20 20 20 20 20 20 20 24 7b 50 6c 61 74            ${Plat
8b40: 66 6f 72 6d 7d 20 69 73 20 65 69 74 68 65 72 20  form} is either 
8b50: 22 57 69 6e 33 32 22 20 6f 72 20 22 78 36 34 22  "Win32" or "x64"
8b60: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
8b70: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 32 2e        #       2.
8b80: 20 42 75 69 6c 64 20 74 68 65 20 6d 69 78 65 64   Build the mixed
8b90: 2d 6d 6f 64 65 20 61 73 73 65 6d 62 6c 79 20 75  -mode assembly u
8ba0: 73 69 6e 67 20 61 20 63 6f 6d 6d 61 6e 64 20 73  sing a command s
8bb0: 69 6d 69 6c 61 72 20 74 6f 3a 0d 0a 20 20 20 20  imilar to:..    
8bc0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
8bd0: 20 20 20 20 20 20 20 20 20 20 62 75 69 6c 64 2e            build.
8be0: 62 61 74 20 24 7b 43 6f 6e 66 69 67 75 72 61 74  bat ${Configurat
8bf0: 69 6f 6e 7d 20 24 7b 50 6c 61 74 66 6f 72 6d 7d  ion} ${Platform}
8c00: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
8c10: 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20 20       #          
8c20: 57 68 65 72 65 20 24 7b 43 6f 6e 66 69 67 75 72  Where ${Configur
8c30: 61 74 69 6f 6e 7d 20 69 73 20 65 69 74 68 65 72  ation} is either
8c40: 20 22 44 65 62 75 67 22 20 6f 72 20 22 52 65 6c   "Debug" or "Rel
8c50: 65 61 73 65 22 20 61 6e 64 0d 0a 20 20 20 20 20  ease" and..     
8c60: 20 20 20 23 20 20 20 20 20 20 20 20 20 20 24 7b     #          ${
8c70: 50 6c 61 74 66 6f 72 6d 7d 20 69 73 20 65 69 74  Platform} is eit
8c80: 68 65 72 20 22 57 69 6e 33 32 22 20 6f 72 20 22  her "Win32" or "
8c90: 78 36 34 22 2e 20 20 49 66 20 74 68 69 73 20 63  x64".  If this c
8ca0: 6f 6d 6d 61 6e 64 20 69 73 0d 0a 20 20 20 20 20  ommand is..     
8cb0: 20 20 20 23 20 20 20 20 20 20 20 20 20 20 75 73     #          us
8cc0: 65 64 2c 20 76 61 72 69 6f 75 73 20 74 65 73 74  ed, various test
8cd0: 73 20 74 68 61 74 20 72 65 71 75 69 72 65 20 73  s that require s
8ce0: 75 70 70 6c 65 6d 65 6e 74 61 72 79 20 6d 61 6e  upplementary man
8cf0: 61 67 65 64 0d 0a 20 20 20 20 20 20 20 20 23 20  aged..        # 
8d00: 20 20 20 20 20 20 20 20 20 61 73 73 65 6d 62 6c           assembl
8d10: 69 65 73 20 28 65 2e 67 2e 20 4c 49 4e 51 29 20  ies (e.g. LINQ) 
8d20: 6d 61 79 20 62 65 20 73 6b 69 70 70 65 64 20 75  may be skipped u
8d30: 6e 6c 65 73 73 20 74 68 6f 73 65 20 62 69 6e 61  nless those bina
8d40: 72 69 65 73 0d 0a 20 20 20 20 20 20 20 20 23 20  ries..        # 
8d50: 20 20 20 20 20 20 20 20 20 61 72 65 20 73 75 62           are sub
8d60: 73 65 71 75 65 6e 74 6c 79 20 63 6f 70 69 65 64  sequently copied
8d70: 20 69 6e 74 6f 20 74 68 65 20 63 6f 72 72 65 63   into the correc
8d80: 74 20 64 69 72 65 63 74 6f 72 79 20 28 69 2e 65  t directory (i.e
8d90: 2e 20 62 79 0d 0a 20 20 20 20 20 20 20 20 23 20  . by..        # 
8da0: 20 20 20 20 20 20 20 20 20 22 74 65 73 74 5f 61           "test_a
8db0: 6c 6c 2e 62 61 74 22 29 2e 0d 0a 20 20 20 20 20  ll.bat")...     
8dc0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
8dd0: 20 20 20 20 20 20 4e 6f 74 65 20 74 68 61 74 20        Note that 
8de0: 61 6c 6c 20 6f 66 20 74 68 65 20 62 75 69 6c 64  all of the build
8df0: 20 63 6f 6d 6d 61 6e 64 73 20 61 62 6f 76 65 20   commands above 
8e00: 77 69 6c 6c 20 64 65 66 61 75 6c 74 20 74 6f 20  will default to 
8e10: 75 73 69 6e 67 0d 0a 20 20 20 20 20 20 20 20 23  using..        #
8e20: 20 20 20 20 20 20 20 74 68 65 20 6c 61 74 65 73         the lates
8e30: 74 20 76 65 72 73 69 6f 6e 20 6f 66 20 4d 53 42  t version of MSB
8e40: 75 69 6c 64 20 61 76 61 69 6c 61 62 6c 65 20 61  uild available a
8e50: 6e 64 20 74 68 65 20 22 74 65 73 74 5f 79 65 61  nd the "test_yea
8e60: 72 22 20 6d 61 79 0d 0a 20 20 20 20 20 20 20 20  r" may..        
8e70: 23 20 20 20 20 20 20 20 6e 65 65 64 20 74 6f 20  #       need to 
8e80: 62 65 20 61 64 6a 75 73 74 65 64 20 61 63 63 6f  be adjusted acco
8e90: 72 64 69 6e 67 6c 79 20 74 6f 20 61 63 74 75 61  rdingly to actua
8ea0: 6c 6c 79 20 72 75 6e 20 74 68 65 20 74 65 73 74  lly run the test
8eb0: 20 73 75 69 74 65 2e 0d 0a 20 20 20 20 20 20 20   suite...       
8ec0: 20 23 20 20 20 20 20 20 20 52 65 66 65 72 20 74   #       Refer t
8ed0: 6f 20 74 68 65 20 63 6f 6d 6d 65 6e 74 73 20 69  o the comments i
8ee0: 6e 20 5b 67 65 74 42 75 69 6c 64 59 65 61 72 5d  n [getBuildYear]
8ef0: 20 66 6f 72 20 6d 6f 72 65 20 69 6e 66 6f 72 6d   for more inform
8f00: 61 74 69 6f 6e 20 6f 6e 0d 0a 20 20 20 20 20 20  ation on..      
8f10: 20 20 23 20 20 20 20 20 20 20 68 6f 77 20 74 6f    #       how to
8f20: 20 73 65 74 20 74 68 69 73 20 76 61 72 69 61 62   set this variab
8f30: 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  le...        #..
8f40: 20 20 20 20 20 20 20 20 73 65 74 20 6e 61 74 69          set nati
8f50: 76 65 20 5b 65 78 70 72 20 7b 0d 0a 20 20 20 20  ve [expr {..    
8f60: 20 20 20 20 20 20 21 24 6d 61 6e 61 67 65 64 4f        !$managedO
8f70: 6e 6c 79 20 26 26 20 28 5b 67 65 74 42 75 69 6c  nly && ([getBuil
8f80: 64 4e 61 74 69 76 65 5d 20 7c 7c 20 5b 68 61 73  dNative] || [has
8f90: 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 6e 61  RuntimeOption na
8fa0: 74 69 76 65 5d 29 0d 0a 20 20 20 20 20 20 20 20  tive])..        
8fb0: 7d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 72 65  }]....        re
8fc0: 74 75 72 6e 20 5b 6a 6f 69 6e 42 75 69 6c 64 44  turn [joinBuildD
8fd0: 69 72 65 63 74 6f 72 79 20 24 6e 61 74 69 76 65  irectory $native
8fe0: 20 5b 67 65 74 42 75 69 6c 64 42 61 73 65 44 69   [getBuildBaseDi
8ff0: 72 65 63 74 6f 72 79 5d 20 5c 0d 0a 20 20 20 20  rectory] \..    
9000: 20 20 20 20 20 20 20 20 5b 65 78 70 72 20 7b 24          [expr {$
9010: 6d 61 6e 61 67 65 64 4f 6e 6c 79 20 3f 20 5b 67  managedOnly ? [g
9020: 65 74 42 75 69 6c 64 59 65 61 72 5d 20 3a 20 5b  etBuildYear] : [
9030: 67 65 74 42 75 69 6c 64 4e 61 74 69 76 65 59 65  getBuildNativeYe
9040: 61 72 5d 7d 5d 20 5c 0d 0a 20 20 20 20 20 20 20  ar]}] \..       
9050: 20 20 20 20 20 5b 67 65 74 42 75 69 6c 64 50 6c       [getBuildPl
9060: 61 74 66 6f 72 6d 20 24 6e 61 74 69 76 65 5d 20  atform $native] 
9070: 5b 61 70 70 65 6e 64 41 72 67 73 20 5b 67 65 74  [appendArgs [get
9080: 42 75 69 6c 64 43 6f 6e 66 69 67 75 72 61 74 69  BuildConfigurati
9090: 6f 6e 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  on] \..         
90a0: 20 20 20 5b 65 78 70 72 20 7b 24 6d 61 6e 61 67     [expr {$manag
90b0: 65 64 4f 6e 6c 79 20 3f 20 5b 67 65 74 42 75 69  edOnly ? [getBui
90c0: 6c 64 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 53  ldConfigurationS
90d0: 75 66 66 69 78 5d 20 3a 20 5c 0d 0a 20 20 20 20  uffix] : \..    
90e0: 20 20 20 20 20 20 20 20 5b 67 65 74 42 75 69 6c          [getBuil
90f0: 64 4e 61 74 69 76 65 43 6f 6e 66 69 67 75 72 61  dNativeConfigura
9100: 74 69 6f 6e 53 75 66 66 69 78 5d 7d 5d 5d 20 5b  tionSuffix]}]] [
9110: 65 78 70 72 20 7b 24 6d 61 6e 61 67 65 64 4f 6e  expr {$managedOn
9120: 6c 79 20 3f 20 5c 0d 0a 20 20 20 20 20 20 20 20  ly ? \..        
9130: 20 20 20 20 5b 67 65 74 42 75 69 6c 64 45 78 74      [getBuildExt
9140: 72 61 5d 20 3a 20 22 22 7d 5d 5d 0d 0a 20 20 20  ra] : ""}]]..   
9150: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
9160: 20 20 20 20 70 72 6f 63 20 67 65 74 52 65 6c 65      proc getRele
9170: 61 73 65 56 65 72 73 69 6f 6e 20 7b 7d 20 7b 0d  aseVersion {} {.
9180: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
9190: 23 20 4e 4f 54 45 3a 20 46 69 67 75 72 65 20 6f  # NOTE: Figure o
91a0: 75 74 20 74 68 65 20 72 65 6c 65 61 73 65 20 76  ut the release v
91b0: 65 72 73 69 6f 6e 20 66 6f 72 20 75 73 65 20 77  ersion for use w
91c0: 69 74 68 20 74 68 65 20 62 75 69 6c 64 20 64 69  ith the build di
91d0: 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 23  rectory..      #
91e0: 20 20 20 20 20 20 20 77 68 65 6e 20 63 68 65 63         when chec
91f0: 6b 69 6e 67 20 66 6f 72 20 61 76 61 69 6c 61 62  king for availab
9200: 6c 65 20 72 65 6c 65 61 73 65 73 2e 0d 0a 20 20  le releases...  
9210: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
9220: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
9230: 72 65 6c 65 61 73 65 5f 76 65 72 73 69 6f 6e 5d  release_version]
9240: 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
9250: 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20   [string length 
9260: 24 3a 3a 72 65 6c 65 61 73 65 5f 76 65 72 73 69  $::release_versi
9270: 6f 6e 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  on] > 0} then {.
9280: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
9290: 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20      # NOTE: The 
92a0: 72 65 6c 65 61 73 65 20 76 65 72 73 69 6f 6e 20  release version 
92b0: 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72 69 64  has been overrid
92c0: 64 65 6e 3b 20 74 68 65 72 65 66 6f 72 65 2c 20  den; therefore, 
92d0: 75 73 65 20 69 74 0d 0a 20 20 20 20 20 20 20 20  use it..        
92e0: 23 20 20 20 20 20 20 20 76 65 72 62 61 74 69 6d  #       verbatim
92f0: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
9300: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a        return $::
9310: 72 65 6c 65 61 73 65 5f 76 65 72 73 69 6f 6e 0d  release_version.
9320: 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
9330: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
9340: 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e 6f 20 72      # NOTE: No r
9350: 65 6c 65 61 73 65 20 76 65 72 73 69 6f 6e 20 69  elease version i
9360: 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 72 65 74  s available, ret
9370: 75 72 6e 20 61 6e 20 65 6d 70 74 79 20 73 74 72  urn an empty str
9380: 69 6e 67 2e 0d 0a 20 20 20 20 20 20 20 20 23 20  ing...        # 
9390: 20 20 20 20 20 20 49 74 20 69 73 20 69 6d 70 6f        It is impo
93a0: 72 74 61 6e 74 20 74 6f 20 72 65 74 75 72 6e 20  rtant to return 
93b0: 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 20  an empty string 
93c0: 68 65 72 65 20 62 65 63 61 75 73 65 20 74 68 65  here because the
93d0: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
93e0: 20 20 72 65 73 75 6c 74 20 6f 66 20 74 68 69 73    result of this
93f0: 20 70 72 6f 63 65 64 75 72 65 20 6d 61 79 20 62   procedure may b
9400: 65 20 75 73 65 64 20 77 69 74 68 20 5b 66 69 6c  e used with [fil
9410: 65 20 6a 6f 69 6e 5d 2e 0d 0a 20 20 20 20 20 20  e join]...      
9420: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
9430: 75 72 6e 20 22 22 0d 0a 20 20 20 20 20 20 7d 0d  urn ""..      }.
9440: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
9450: 72 6f 63 20 67 65 74 42 75 69 6c 64 46 69 6c 65  roc getBuildFile
9460: 4e 61 6d 65 20 7b 20 66 69 6c 65 4e 61 6d 65 20  Name { fileName 
9470: 6d 61 6e 61 67 65 64 4f 6e 6c 79 20 7b 70 6c 61  managedOnly {pla
9480: 74 66 6f 72 6d 20 22 22 7d 20 7d 20 7b 0d 0a 20  tform ""} } {.. 
9490: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
94a0: 4e 4f 54 45 3a 20 52 65 74 75 72 6e 73 20 74 68  NOTE: Returns th
94b0: 65 20 73 70 65 63 69 66 69 65 64 20 66 69 6c 65  e specified file
94c0: 20 6e 61 6d 65 20 61 73 20 69 66 20 69 74 20 77   name as if it w
94d0: 65 72 65 20 6c 6f 63 61 74 65 64 20 69 6e 20 74  ere located in t
94e0: 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  he..      #     
94f0: 20 20 62 75 69 6c 64 20 64 69 72 65 63 74 6f 72    build director
9500: 79 2c 20 64 69 73 63 61 72 64 69 6e 67 20 61 6e  y, discarding an
9510: 79 20 64 69 72 65 63 74 6f 72 79 20 69 6e 66 6f  y directory info
9520: 72 6d 61 74 69 6f 6e 20 70 72 65 73 65 6e 74 0d  rmation present.
9530: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69  .      #       i
9540: 6e 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 20  n the file name 
9550: 61 73 20 70 72 6f 76 69 64 65 64 20 62 79 20 6f  as provided by o
9560: 75 72 20 63 61 6c 6c 65 72 2e 0d 0a 20 20 20 20  ur caller...    
9570: 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 72    #..      set r
9580: 65 73 75 6c 74 20 5b 66 69 6c 65 20 6e 61 74 69  esult [file nati
9590: 76 65 6e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20  vename \..      
95a0: 20 20 20 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b      [file join [
95b0: 67 65 74 42 75 69 6c 64 44 69 72 65 63 74 6f 72  getBuildDirector
95c0: 79 20 24 6d 61 6e 61 67 65 64 4f 6e 6c 79 5d 20  y $managedOnly] 
95d0: 24 70 6c 61 74 66 6f 72 6d 20 5c 0d 0a 20 20 20  $platform \..   
95e0: 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69         [file tai
95f0: 6c 20 24 66 69 6c 65 4e 61 6d 65 5d 5d 5d 0d 0a  l $fileName]]]..
9600: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
9610: 20 23 20 48 41 43 4b 3a 20 57 68 65 6e 20 72 75   # HACK: When ru
9620: 6e 6e 69 6e 67 20 6f 6e 20 57 6f 57 36 34 2c 20  nning on WoW64, 
9630: 61 73 73 75 6d 65 20 74 68 65 20 74 65 73 74 20  assume the test 
9640: 65 78 65 63 75 74 61 62 6c 65 73 20 61 72 65 20  executables are 
9650: 70 72 65 73 65 6e 74 0d 0a 20 20 20 20 20 20 23  present..      #
9660: 20 20 20 20 20 20 20 77 69 74 68 20 74 68 65 20         with the 
9670: 22 33 32 22 20 73 75 66 66 69 78 20 6f 6e 20 74  "32" suffix on t
9680: 68 65 6d 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  hem...      #.. 
9690: 20 20 20 20 20 69 66 20 7b 5b 69 73 52 75 6e 6e       if {[isRunn
96a0: 69 6e 67 57 6f 57 36 34 5d 20 26 26 20 5b 66 69  ingWoW64] && [fi
96b0: 6c 65 20 65 78 74 65 6e 73 69 6f 6e 20 24 72 65  le extension $re
96c0: 73 75 6c 74 5d 20 65 71 20 22 2e 65 78 65 22 7d  sult] eq ".exe"}
96d0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
96e0: 20 73 65 74 20 72 65 73 75 6c 74 20 5b 61 70 70   set result [app
96f0: 65 6e 64 41 72 67 73 20 5b 66 69 6c 65 20 72 6f  endArgs [file ro
9700: 6f 74 6e 61 6d 65 20 24 72 65 73 75 6c 74 5d 20  otname $result] 
9710: 33 32 2e 65 78 65 5d 0d 0a 20 20 20 20 20 20 7d  32.exe]..      }
9720: 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ....      return
9730: 20 24 72 65 73 75 6c 74 0d 0a 20 20 20 20 7d 0d   $result..    }.
9740: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74  ....    proc get
9750: 45 78 74 65 72 6e 61 6c 44 69 72 65 63 74 6f 72  ExternalDirector
9760: 79 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  y {} {..      #.
9770: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54  .      # NOTE: T
9780: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 72 65  his procedure re
9790: 74 75 72 6e 73 20 74 68 65 20 64 69 72 65 63 74  turns the direct
97a0: 6f 72 79 20 77 68 65 72 65 20 74 68 65 20 65 78  ory where the ex
97b0: 74 65 72 6e 61 6c 20 62 69 6e 61 72 79 0d 0a 20  ternal binary.. 
97c0: 20 20 20 20 20 23 20 20 20 20 20 20 20 66 69 6c       #       fil
97d0: 65 73 20 61 72 65 20 6c 6f 63 61 74 65 64 2e 0d  es are located..
97e0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
97f0: 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 6e 61 74  return [file nat
9800: 69 76 65 6e 61 6d 65 20 5c 0d 0a 20 20 20 20 20  ivename \..     
9810: 20 20 20 20 20 5b 66 69 6c 65 20 64 69 72 6e 61       [file dirna
9820: 6d 65 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65  me [file dirname
9830: 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20 5b   [file dirname [
9840: 69 6e 66 6f 20 62 69 6e 61 72 79 5d 5d 5d 5d 5d  info binary]]]]]
9850: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
9860: 70 72 6f 63 20 67 65 74 42 69 6e 61 72 79 44 69  proc getBinaryDi
9870: 72 65 63 74 6f 72 79 20 7b 7d 20 7b 0d 0a 20 20  rectory {} {..  
9880: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
9890: 4f 54 45 3a 20 54 68 69 73 20 70 72 6f 63 65 64  OTE: This proced
98a0: 75 72 65 20 72 65 74 75 72 6e 73 20 74 68 65 20  ure returns the 
98b0: 64 69 72 65 63 74 6f 72 79 20 77 68 65 72 65 20  directory where 
98c0: 74 68 65 20 74 65 73 74 20 61 70 70 6c 69 63 61  the test applica
98d0: 74 69 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20 20  tion..      #   
98e0: 20 20 20 20 69 74 73 65 6c 66 20 28 69 2e 65 2e      itself (i.e.
98f0: 20 74 68 65 20 45 61 67 6c 65 20 73 68 65 6c 6c   the Eagle shell
9900: 29 20 69 73 20 6c 6f 63 61 74 65 64 2e 20 20 54  ) is located.  T
9910: 68 69 73 20 77 69 6c 6c 20 62 65 20 75 73 65 64  his will be used
9920: 20 61 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20   as..      #    
9930: 20 20 20 74 68 65 20 64 65 73 74 69 6e 61 74 69     the destinati
9940: 6f 6e 20 66 6f 72 20 74 68 65 20 63 6f 70 69 65  on for the copie
9950: 64 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  d System.Data.SQ
9960: 4c 69 74 65 20 6e 61 74 69 76 65 20 61 6e 64 0d  Lite native and.
9970: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6d  .      #       m
9980: 61 6e 61 67 65 64 20 61 73 73 65 6d 62 6c 69 65  anaged assemblie
9990: 73 20 28 69 2e 65 2e 20 62 65 63 61 75 73 65 20  s (i.e. because 
99a0: 74 68 69 73 20 69 73 20 6f 6e 65 20 6f 66 20 74  this is one of t
99b0: 68 65 20 66 65 77 20 70 6c 61 63 65 73 0d 0a 20  he few places.. 
99c0: 20 20 20 20 20 23 20 20 20 20 20 20 20 77 68 65       #       whe
99d0: 72 65 20 74 68 65 20 43 4c 52 20 77 69 6c 6c 20  re the CLR will 
99e0: 61 63 74 75 61 6c 6c 79 20 66 69 6e 64 20 61 6e  actually find an
99f0: 64 20 6c 6f 61 64 20 74 68 65 6d 20 70 72 6f 70  d load them prop
9a00: 65 72 6c 79 29 2e 0d 0a 20 20 20 20 20 20 23 0d  erly)...      #.
9a10: 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f  .      if {[info
9a20: 20 65 78 69 73 74 73 20 3a 3a 62 69 6e 61 72 79   exists ::binary
9a30: 5f 64 69 72 65 63 74 6f 72 79 5d 20 26 26 20 5c  _directory] && \
9a40: 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72  ..          [str
9a50: 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 62 69  ing length $::bi
9a60: 6e 61 72 79 5f 64 69 72 65 63 74 6f 72 79 5d 20  nary_directory] 
9a70: 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
9a80: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
9a90: 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c 6f 63 61  # NOTE: The loca
9aa0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 62 69 6e 61  tion of the bina
9ab0: 72 79 20 64 69 72 65 63 74 6f 72 79 20 68 61 73  ry directory has
9ac0: 20 62 65 65 6e 20 6f 76 65 72 72 69 64 64 65 6e   been overridden
9ad0: 3b 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  ;..        #    
9ae0: 20 20 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73     therefore, us
9af0: 65 20 69 74 20 76 65 72 62 61 74 69 6d 2e 0d 0a  e it verbatim...
9b00: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
9b10: 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 62 69 6e     return $::bin
9b20: 61 72 79 5f 64 69 72 65 63 74 6f 72 79 0d 0a 20  ary_directory.. 
9b30: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
9b40: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 69         return [i
9b50: 6e 66 6f 20 62 69 6e 61 72 79 5d 0d 0a 20 20 20  nfo binary]..   
9b60: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
9b70: 20 20 20 20 70 72 6f 63 20 67 65 74 45 78 74 65      proc getExte
9b80: 72 6e 61 6c 46 69 6c 65 4e 61 6d 65 20 7b 20 66  rnalFileName { f
9b90: 69 6c 65 4e 61 6d 65 20 7d 20 7b 0d 0a 20 20 20  ileName } {..   
9ba0: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
9bb0: 54 45 3a 20 52 65 74 75 72 6e 73 20 74 68 65 20  TE: Returns the 
9bc0: 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 20 6e  specified file n
9bd0: 61 6d 65 20 61 73 20 69 66 20 69 74 20 77 65 72  ame as if it wer
9be0: 65 20 6c 6f 63 61 74 65 64 20 69 6e 20 74 68 65  e located in the
9bf0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
9c00: 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 74 61 69  directory contai
9c10: 6e 69 6e 67 20 74 68 65 20 65 78 74 65 72 6e 61  ning the externa
9c20: 6c 20 62 69 6e 61 72 69 65 73 2e 0d 0a 20 20 20  l binaries...   
9c30: 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75     #..      retu
9c40: 72 6e 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e  rn [file nativen
9c50: 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b  ame [file join [
9c60: 67 65 74 45 78 74 65 72 6e 61 6c 44 69 72 65 63  getExternalDirec
9c70: 74 6f 72 79 5d 20 24 66 69 6c 65 4e 61 6d 65 5d  tory] $fileName]
9c80: 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  ]..    }.....   
9c90: 20 70 72 6f 63 20 67 65 74 42 69 6e 61 72 79 46   proc getBinaryF
9ca0: 69 6c 65 4e 61 6d 65 20 7b 20 66 69 6c 65 4e 61  ileName { fileNa
9cb0: 6d 65 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d  me {platform ""}
9cc0: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20   } {..      #.. 
9cd0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 74       # NOTE: Ret
9ce0: 75 72 6e 73 20 74 68 65 20 73 70 65 63 69 66 69  urns the specifi
9cf0: 65 64 20 66 69 6c 65 20 6e 61 6d 65 20 61 73 20  ed file name as 
9d00: 69 66 20 69 74 20 77 65 72 65 20 6c 6f 63 61 74  if it were locat
9d10: 65 64 20 69 6e 20 74 68 65 0d 0a 20 20 20 20 20  ed in the..     
9d20: 20 23 20 20 20 20 20 20 20 62 69 6e 61 72 79 20   #       binary 
9d30: 64 69 72 65 63 74 6f 72 79 2c 20 64 69 73 63 61  directory, disca
9d40: 72 64 69 6e 67 20 61 6e 79 20 64 69 72 65 63 74  rding any direct
9d50: 6f 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ory information 
9d60: 70 72 65 73 65 6e 74 0d 0a 20 20 20 20 20 20 23  present..      #
9d70: 20 20 20 20 20 20 20 69 6e 20 74 68 65 20 66 69         in the fi
9d80: 6c 65 20 6e 61 6d 65 20 61 73 20 70 72 6f 76 69  le name as provi
9d90: 64 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65  ded by our calle
9da0: 72 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  r...      #..   
9db0: 20 20 20 72 65 74 75 72 6e 20 5b 66 69 6c 65 20     return [file 
9dc0: 6e 61 74 69 76 65 6e 61 6d 65 20 5c 0d 0a 20 20  nativename \..  
9dd0: 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 6a 6f          [file jo
9de0: 69 6e 20 5b 67 65 74 42 69 6e 61 72 79 44 69 72  in [getBinaryDir
9df0: 65 63 74 6f 72 79 5d 20 24 70 6c 61 74 66 6f 72  ectory] $platfor
9e00: 6d 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69  m [file tail $fi
9e10: 6c 65 4e 61 6d 65 5d 5d 5d 0d 0a 20 20 20 20 7d  leName]]]..    }
9e20: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65  .....    proc ge
9e30: 74 43 6f 72 65 42 69 6e 61 72 79 46 69 6c 65 4e  tCoreBinaryFileN
9e40: 61 6d 65 20 7b 20 7b 70 6c 61 74 66 6f 72 6d 20  ame { {platform 
9e50: 22 22 7d 20 7b 73 74 61 6e 64 61 72 64 20 22 22  ""} {standard ""
9e60: 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a  } } {..      #..
9e70: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65        # NOTE: Re
9e80: 74 75 72 6e 73 20 74 68 65 20 66 75 6c 6c 20 70  turns the full p
9e90: 61 74 68 20 66 6f 72 20 74 68 65 20 66 69 6c 65  ath for the file
9ea0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
9eb0: 53 51 4c 69 74 65 20 63 6f 72 65 0d 0a 20 20 20  SQLite core..   
9ec0: 20 20 20 23 20 20 20 20 20 20 20 6e 61 74 69 76     #       nativ
9ed0: 65 20 6c 69 62 72 61 72 79 20 63 6f 64 65 20 66  e library code f
9ee0: 6f 72 20 74 68 69 73 20 70 6c 61 74 66 6f 72 6d  or this platform
9ef0: 2e 20 20 46 69 72 73 74 2c 20 63 68 65 63 6b 20  .  First, check 
9f00: 61 6e 64 20 73 65 65 20 69 66 0d 0a 20 20 20 20  and see if..    
9f10: 20 20 23 20 20 20 20 20 20 20 74 68 65 20 53 51    #       the SQ
9f20: 4c 69 74 65 20 63 6f 72 65 20 6e 61 74 69 76 65  Lite core native
9f30: 20 6c 69 62 72 61 72 79 20 68 61 73 20 61 6c 72   library has alr
9f40: 65 61 64 79 20 62 65 65 6e 20 6c 6f 61 64 65 64  eady been loaded
9f50: 2e 20 20 4e 65 78 74 2c 0d 0a 20 20 20 20 20 20  .  Next,..      
9f60: 23 20 20 20 20 20 20 20 66 61 6c 6c 62 61 63 6b  #       fallback
9f70: 20 74 6f 20 77 68 61 74 20 74 68 65 20 66 75 6c   to what the ful
9f80: 6c 20 70 61 74 68 20 73 68 6f 75 6c 64 20 62 65  l path should be
9f90: 2c 20 62 61 73 65 64 20 6f 6e 20 77 68 65 74 68  , based on wheth
9fa0: 65 72 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20  er the..      # 
9fb0: 20 20 20 20 20 20 6d 69 78 65 64 2d 6d 6f 64 65        mixed-mode
9fc0: 20 61 73 73 65 6d 62 6c 79 20 69 73 20 62 65 69   assembly is bei
9fd0: 6e 67 20 75 73 65 64 20 61 6e 64 20 74 68 65 20  ng used and the 
9fe0: 6e 61 6d 65 20 6f 66 20 74 68 65 20 63 75 72 72  name of the curr
9ff0: 65 6e 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ent..      #    
a000: 20 20 20 70 6c 61 74 66 6f 72 6d 2e 0d 0a 20 20     platform...  
a010: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
a020: 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
a030: 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65     object invoke
a040: 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c   -flags +NonPubl
a050: 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ic \..          
a060: 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51    System.Data.SQ
a070: 4c 69 74 65 2e 55 6e 73 61 66 65 4e 61 74 69 76  Lite.UnsafeNativ
a080: 65 4d 65 74 68 6f 64 73 20 5f 53 51 4c 69 74 65  eMethods _SQLite
a090: 4e 61 74 69 76 65 4d 6f 64 75 6c 65 46 69 6c 65  NativeModuleFile
a0a0: 4e 61 6d 65 0d 0a 20 20 20 20 20 20 7d 20 66 69  Name..      } fi
a0b0: 6c 65 4e 61 6d 65 5d 20 3d 3d 20 30 20 26 26 20  leName] == 0 && 
a0c0: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
a0d0: 66 69 6c 65 4e 61 6d 65 5d 20 3e 20 30 7d 20 74  fileName] > 0} t
a0e0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
a0f0: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
a100: 3a 20 54 68 65 20 53 51 4c 69 74 65 20 63 6f 72  : The SQLite cor
a110: 65 20 6e 61 74 69 76 65 20 6c 69 62 72 61 72 79  e native library
a120: 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
a130: 6e 20 6c 6f 61 64 65 64 20 76 69 61 0d 0a 20 20  n loaded via..  
a140: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68        #       th
a150: 65 20 6e 61 74 69 76 65 20 6c 69 62 72 61 72 79  e native library
a160: 20 70 72 65 2d 6c 6f 61 64 65 72 2e 20 20 52 65   pre-loader.  Re
a170: 74 75 72 6e 20 74 68 61 74 20 66 69 6c 65 20 6e  turn that file n
a180: 61 6d 65 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20  ame now...      
a190: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
a1a0: 75 72 6e 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20  urn $fileName.. 
a1b0: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
a1c0: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
a1d0: 20 49 66 20 74 68 65 20 22 6e 61 74 69 76 65 22   If the "native"
a1e0: 20 72 75 6e 74 69 6d 65 20 6f 70 74 69 6f 6e 20   runtime option 
a1f0: 68 61 73 20 62 65 65 6e 20 73 65 74 2c 20 61 6c  has been set, al
a200: 77 61 79 73 20 72 65 74 75 72 6e 20 74 68 65 0d  ways return the.
a210: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 66  .      #       f
a220: 69 6c 65 20 6e 61 6d 65 20 66 6f 72 20 74 68 65  ile name for the
a230: 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73 65   mixed-mode asse
a240: 6d 62 6c 79 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  mbly...      #..
a250: 20 20 20 20 20 20 69 66 20 7b 5b 68 61 73 52 75        if {[hasRu
a260: 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 6e 61 74 69  ntimeOption nati
a270: 76 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ve]} then {..   
a280: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
a290: 23 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e 20 74  # NOTE: Return t
a2a0: 68 65 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73  he mixed-mode as
a2b0: 73 65 6d 62 6c 79 20 66 69 6c 65 20 6e 61 6d 65  sembly file name
a2c0: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
a2d0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 66 69        return [fi
a2e0: 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5c 0d  le nativename \.
a2f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69  .            [fi
a300: 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 42 69 6e 61  le join [getBina
a310: 72 79 44 69 72 65 63 74 6f 72 79 5d 20 24 70 6c  ryDirectory] $pl
a320: 61 74 66 6f 72 6d 20 53 79 73 74 65 6d 2e 44 61  atform System.Da
a330: 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 5d 5d 0d  ta.SQLite.dll]].
a340: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
a350: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
a360: 45 3a 20 41 72 65 20 77 65 20 61 74 74 65 6d 70  E: Are we attemp
a370: 74 69 6e 67 20 74 6f 20 61 75 74 6f 6d 61 74 69  ting to automati
a380: 63 61 6c 6c 79 20 64 65 74 65 63 74 20 77 68 65  cally detect whe
a390: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 0d  ther or not the.
a3a0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69  .      #       i
a3b0: 6e 74 65 72 6f 70 20 61 73 73 65 6d 62 6c 79 20  nterop assembly 
a3c0: 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 3f 0d  should be used?.
a3d0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
a3e0: 73 65 74 20 61 75 74 6f 6d 61 74 69 63 20 5b 65  set automatic [e
a3f0: 78 70 72 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e  xpr {[string len
a400: 67 74 68 20 24 73 74 61 6e 64 61 72 64 5d 20 3d  gth $standard] =
a410: 3d 20 30 7d 5d 0d 0a 0d 0a 20 20 20 20 20 20 23  = 0}]....      #
a420: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
a430: 46 69 72 73 74 2c 20 69 6e 20 65 69 74 68 65 72  First, in either
a440: 20 22 61 75 74 6f 6d 61 74 69 63 22 20 6f 72 20   "automatic" or 
a450: 22 6e 6f 6e 2d 73 74 61 6e 64 61 72 64 22 20 6d  "non-standard" m
a460: 6f 64 65 73 2c 20 61 74 74 65 6d 70 74 0d 0a 20  odes, attempt.. 
a470: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 6f 20       #       to 
a480: 66 69 6e 64 20 74 68 65 20 6e 61 74 69 76 65 2d  find the native-
a490: 6f 6e 6c 79 20 69 6e 74 65 72 6f 70 20 61 73 73  only interop ass
a4a0: 65 6d 62 6c 79 2e 0d 0a 20 20 20 20 20 20 23 0d  embly...      #.
a4b0: 0a 20 20 20 20 20 20 69 66 20 7b 24 61 75 74 6f  .      if {$auto
a4c0: 6d 61 74 69 63 20 7c 7c 20 21 24 73 74 61 6e 64  matic || !$stand
a4d0: 61 72 64 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ard} then {..   
a4e0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
a4f0: 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20  # NOTE: Attempt 
a500: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
a510: 20 6e 61 74 69 76 65 2d 6f 6e 6c 79 20 69 6e 74   native-only int
a520: 65 72 6f 70 20 61 73 73 65 6d 62 6c 79 20 66 69  erop assembly fi
a530: 6c 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  le..        #   
a540: 20 20 20 20 6e 61 6d 65 20 66 6f 72 20 74 68 69      name for thi
a550: 73 20 70 6c 61 74 66 6f 72 6d 20 61 6e 64 20 74  s platform and t
a560: 68 65 6e 20 72 65 74 75 72 6e 20 69 74 2e 0d 0a  hen return it...
a570: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
a580: 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e     foreach fileN
a590: 61 6d 65 4f 6e 6c 79 20 5b 67 65 74 49 6e 74 65  ameOnly [getInte
a5a0: 72 6f 70 41 73 73 65 6d 62 6c 79 46 69 6c 65 4e  ropAssemblyFileN
a5b0: 61 6d 65 73 4f 6e 6c 79 5d 20 7b 0d 0a 20 20 20  amesOnly] {..   
a5c0: 20 20 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e         set fileN
a5d0: 61 6d 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65  ame [file native
a5e0: 6e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  name \..        
a5f0: 20 20 20 20 20 20 5b 66 69 6c 65 20 6a 6f 69 6e        [file join
a600: 20 5b 67 65 74 42 69 6e 61 72 79 44 69 72 65 63   [getBinaryDirec
a610: 74 6f 72 79 5d 20 24 70 6c 61 74 66 6f 72 6d 20  tory] $platform 
a620: 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 5d 5d 0d  $fileNameOnly]].
a630: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  ...          if 
a640: 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 66  {[file exists $f
a650: 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b  ileName]} then {
a660: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ..            re
a670: 74 75 72 6e 20 24 66 69 6c 65 4e 61 6d 65 0d 0a  turn $fileName..
a680: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
a690: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
a6a0: 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
a6b0: 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 6e 2c 20    # NOTE: Then, 
a6c0: 69 6e 20 65 69 74 68 65 72 20 22 61 75 74 6f 6d  in either "autom
a6d0: 61 74 69 63 22 20 6f 72 20 22 73 74 61 6e 64 61  atic" or "standa
a6e0: 72 64 22 20 6d 6f 64 65 73 2c 20 61 74 74 65 6d  rd" modes, attem
a6f0: 70 74 20 74 6f 0d 0a 20 20 20 20 20 20 23 20 20  pt to..      #  
a700: 20 20 20 20 20 66 69 6e 64 20 74 68 65 20 73 74       find the st
a710: 61 6e 64 61 72 64 20 53 51 4c 69 74 65 20 6c 69  andard SQLite li
a720: 62 72 61 72 79 2e 0d 0a 20 20 20 20 20 20 23 0d  brary...      #.
a730: 0a 20 20 20 20 20 20 69 66 20 7b 24 61 75 74 6f  .      if {$auto
a740: 6d 61 74 69 63 20 7c 7c 20 24 73 74 61 6e 64 61  matic || $standa
a750: 72 64 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  rd} then {..    
a760: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
a770: 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74   NOTE: Attempt t
a780: 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
a790: 6e 61 74 69 76 65 2d 6f 6e 6c 79 20 73 74 61 6e  native-only stan
a7a0: 64 61 72 64 20 53 51 4c 69 74 65 20 6c 69 62 72  dard SQLite libr
a7b0: 61 72 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ary..        #  
a7c0: 20 20 20 20 20 66 69 6c 65 20 6e 61 6d 65 20 66       file name f
a7d0: 6f 72 20 74 68 69 73 20 70 6c 61 74 66 6f 72 6d  or this platform
a7e0: 20 61 6e 64 20 74 68 65 6e 20 72 65 74 75 72 6e   and then return
a7f0: 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d   it...        #.
a800: 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68  .        foreach
a810: 20 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 5b 67   fileNameOnly [g
a820: 65 74 4e 61 74 69 76 65 4c 69 62 72 61 72 79 46  etNativeLibraryF
a830: 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79 5d 20 7b 0d  ileNamesOnly] {.
a840: 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20 66  .          set f
a850: 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6e 61  ileName [file na
a860: 74 69 76 65 6e 61 6d 65 20 5c 0d 0a 20 20 20 20  tivename \..    
a870: 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20            [file 
a880: 6a 6f 69 6e 20 5b 67 65 74 42 69 6e 61 72 79 44  join [getBinaryD
a890: 69 72 65 63 74 6f 72 79 5d 20 24 70 6c 61 74 66  irectory] $platf
a8a0: 6f 72 6d 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c  orm $fileNameOnl
a8b0: 79 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  y]]....         
a8c0: 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74   if {[file exist
a8d0: 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68  s $fileName]} th
a8e0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
a8f0: 20 20 72 65 74 75 72 6e 20 24 66 69 6c 65 4e 61    return $fileNa
a900: 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  me..          }.
a910: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
a920: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
a930: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 61        # NOTE: Wa
a940: 73 20 74 68 65 20 6d 61 6e 61 67 65 64 20 61 73  s the managed as
a950: 73 65 6d 62 6c 79 20 63 6f 6d 70 69 6c 65 64 20  sembly compiled 
a960: 65 78 70 65 63 74 69 6e 67 20 74 6f 20 64 65 61  expecting to dea
a970: 6c 20 77 69 74 68 20 74 68 65 0d 0a 20 20 20 20  l with the..    
a980: 20 20 23 20 20 20 20 20 20 20 73 74 61 6e 64 61    #       standa
a990: 72 64 20 63 6f 72 65 20 6c 69 62 72 61 72 79 3f  rd core library?
a9a0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
a9b0: 20 69 66 20 7b 5b 68 61 76 65 53 51 4c 69 74 65   if {[haveSQLite
a9c0: 44 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 20 53  DefineConstant S
a9d0: 51 4c 49 54 45 5f 53 54 41 4e 44 41 52 44 5d 7d  QLITE_STANDARD]}
a9e0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
a9f0: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
aa00: 54 45 3a 20 46 61 6c 6c 62 61 63 6b 20 74 6f 20  TE: Fallback to 
aa10: 72 65 74 75 72 6e 69 6e 67 20 74 68 65 20 6e 61  returning the na
aa20: 74 69 76 65 2d 6f 6e 6c 79 20 73 74 61 6e 64 61  tive-only standa
aa30: 72 64 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72  rd SQLite librar
aa40: 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  y..        #    
aa50: 20 20 20 66 69 6c 65 20 6e 61 6d 65 20 66 6f 72     file name for
aa60: 20 74 68 65 20 70 6c 61 74 66 6f 72 6d 2e 0d 0a   the platform...
aa70: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
aa80: 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 73     set fileNames
aa90: 4f 6e 6c 79 20 5b 67 65 74 4e 61 74 69 76 65 4c  Only [getNativeL
aaa0: 69 62 72 61 72 79 46 69 6c 65 4e 61 6d 65 73 4f  ibraryFileNamesO
aab0: 6e 6c 79 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  nly]....        
aac0: 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 66 69  if {[llength $fi
aad0: 6c 65 4e 61 6d 65 73 4f 6e 6c 79 5d 20 3d 3d 20  leNamesOnly] == 
aae0: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
aaf0: 20 20 20 20 20 72 65 74 75 72 6e 20 22 22 0d 0a       return ""..
ab00: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
ab10: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 66 69 6c       return [fil
ab20: 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69  e nativename [fi
ab30: 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20  le join \..     
ab40: 20 20 20 20 20 20 20 5b 67 65 74 42 69 6e 61 72         [getBinar
ab50: 79 44 69 72 65 63 74 6f 72 79 5d 20 24 70 6c 61  yDirectory] $pla
ab60: 74 66 6f 72 6d 20 5b 6c 69 6e 64 65 78 20 24 66  tform [lindex $f
ab70: 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79 20 30 5d 5d  ileNamesOnly 0]]
ab80: 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  ]..      } else 
ab90: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
aba0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 61        # NOTE: Fa
abb0: 6c 6c 62 61 63 6b 20 74 6f 20 72 65 74 75 72 6e  llback to return
abc0: 69 6e 67 20 74 68 65 20 6e 61 74 69 76 65 2d 6f  ing the native-o
abd0: 6e 6c 79 20 69 6e 74 65 72 6f 70 20 61 73 73 65  nly interop asse
abe0: 6d 62 6c 79 20 66 69 6c 65 0d 0a 20 20 20 20 20  mbly file..     
abf0: 20 20 20 23 20 20 20 20 20 20 20 6e 61 6d 65 20     #       name 
ac00: 66 6f 72 20 74 68 65 20 70 6c 61 74 66 6f 72 6d  for the platform
ac10: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
ac20: 20 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61        set fileNa
ac30: 6d 65 73 4f 6e 6c 79 20 5b 67 65 74 49 6e 74 65  mesOnly [getInte
ac40: 72 6f 70 41 73 73 65 6d 62 6c 79 46 69 6c 65 4e  ropAssemblyFileN
ac50: 61 6d 65 73 4f 6e 6c 79 5d 0d 0a 0d 0a 20 20 20  amesOnly]....   
ac60: 20 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67 74       if {[llengt
ac70: 68 20 24 66 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79  h $fileNamesOnly
ac80: 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
ac90: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
aca0: 20 22 22 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a   ""..        }..
acb0: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
acc0: 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d   [file nativenam
acd0: 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a  e [file join \..
ace0: 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74              [get
acf0: 42 69 6e 61 72 79 44 69 72 65 63 74 6f 72 79 5d  BinaryDirectory]
ad00: 20 24 70 6c 61 74 66 6f 72 6d 20 5b 6c 69 6e 64   $platform [lind
ad10: 65 78 20 24 66 69 6c 65 4e 61 6d 65 73 4f 6e 6c  ex $fileNamesOnl
ad20: 79 20 30 5d 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d  y 0]]]..      }.
ad30: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
ad40: 72 6f 63 20 67 65 74 43 6f 6d 6d 6f 6e 44 69 72  roc getCommonDir
ad50: 65 63 74 6f 72 79 20 7b 7d 20 7b 0d 0a 20 20 20  ectory {} {..   
ad60: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
ad70: 54 45 3a 20 54 68 69 73 20 70 72 6f 63 65 64 75  TE: This procedu
ad80: 72 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 64  re returns the d
ad90: 69 72 65 63 74 6f 72 79 20 77 68 65 72 65 20 74  irectory where t
ada0: 68 65 20 74 65 73 74 20 73 63 72 69 70 74 73 0d  he test scripts.
adb0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73  .      #       s
adc0: 68 6f 75 6c 64 20 62 65 20 6c 6f 63 61 74 65 64  hould be located
add0: 2e 20 20 42 79 20 64 65 66 61 75 6c 74 2c 20 74  .  By default, t
ade0: 68 69 73 20 6a 75 73 74 20 72 65 74 75 72 6e 73  his just returns
adf0: 20 74 68 65 20 45 61 67 6c 65 0d 0a 20 20 20 20   the Eagle..    
ae00: 20 20 23 20 20 20 20 20 20 20 62 69 6e 61 72 79    #       binary
ae10: 20 64 69 72 65 63 74 6f 72 79 2e 0d 0a 20 20 20   directory...   
ae20: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
ae30: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 63  [info exists ::c
ae40: 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79 5d  ommon_directory]
ae50: 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
ae60: 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20   [string length 
ae70: 24 3a 3a 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74  $::common_direct
ae80: 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ory] > 0} then {
ae90: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
aea0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65       # NOTE: The
aeb0: 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65   location of the
aec0: 20 63 6f 6d 6d 6f 6e 20 64 69 72 65 63 74 6f 72   common director
aed0: 79 20 68 61 73 20 62 65 65 6e 20 73 65 74 3b 0d  y has been set;.
aee0: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
aef0: 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20   therefore, use 
af00: 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  it...        #..
af10: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24          return $
af20: 3a 3a 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f  ::common_directo
af30: 72 79 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  ry..      } else
af40: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
af50: 20 3a 3a 76 65 6e 64 6f 72 5f 64 69 72 65 63 74   ::vendor_direct
af60: 6f 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  ory] && \..     
af70: 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
af80: 67 74 68 20 24 3a 3a 76 65 6e 64 6f 72 5f 64 69  gth $::vendor_di
af90: 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68  rectory] > 0} th
afa0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
afb0: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
afc0: 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66   The location of
afd0: 20 74 68 65 20 76 65 6e 64 6f 72 20 64 69 72 65   the vendor dire
afe0: 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 73  ctory has been s
aff0: 65 74 3b 0d 0a 20 20 20 20 20 20 20 20 23 20 20  et;..        #  
b000: 20 20 20 20 20 74 68 65 72 65 66 6f 72 65 2c 20       therefore, 
b010: 75 73 65 20 69 74 2e 0d 0a 20 20 20 20 20 20 20  use it...       
b020: 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   #..        retu
b030: 72 6e 20 24 3a 3a 76 65 6e 64 6f 72 5f 64 69 72  rn $::vendor_dir
b040: 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20  ectory..      } 
b050: 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20 65 78  elseif {[info ex
b060: 69 73 74 73 20 3a 3a 74 63 6c 5f 6c 69 62 72 61  ists ::tcl_libra
b070: 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  ry] && \..      
b080: 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67      [string leng
b090: 74 68 20 24 3a 3a 74 63 6c 5f 6c 69 62 72 61 72  th $::tcl_librar
b0a0: 79 5d 20 3e 20 30 20 26 26 20 5c 0d 0a 20 20 20  y] > 0 && \..   
b0b0: 20 20 20 20 20 20 20 5b 66 69 6c 65 20 69 73 64         [file isd
b0c0: 69 72 65 63 74 6f 72 79 20 24 3a 3a 74 63 6c 5f  irectory $::tcl_
b0d0: 6c 69 62 72 61 72 79 5d 7d 20 74 68 65 6e 20 7b  library]} then {
b0e0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
b0f0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65       # NOTE: The
b100: 20 76 61 72 69 61 62 6c 65 20 77 69 74 68 20 74   variable with t
b110: 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74  he location of t
b120: 68 65 20 73 63 72 69 70 74 20 6c 69 62 72 61 72  he script librar
b130: 79 20 69 73 0d 0a 20 20 20 20 20 20 20 20 23 20  y is..        # 
b140: 20 20 20 20 20 20 73 65 74 20 61 6e 64 20 61 70        set and ap
b150: 70 65 61 72 73 20 74 6f 20 62 65 20 61 20 72 65  pears to be a re
b160: 61 6c 20 64 69 72 65 63 74 6f 72 79 20 28 69 2e  al directory (i.
b170: 65 2e 20 6e 6f 74 20 65 6d 62 65 64 64 65 64 0d  e. not embedded.
b180: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
b190: 20 77 69 74 68 69 6e 20 61 20 66 69 6c 65 29 3b   within a file);
b1a0: 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20   therefore, use 
b1b0: 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  it...        #..
b1c0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24          return $
b1d0: 3a 3a 74 63 6c 5f 6c 69 62 72 61 72 79 0d 0a 20  ::tcl_library.. 
b1e0: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
b1f0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
b200: 20 20 23 20 4e 4f 54 45 3a 20 46 61 6c 6c 62 61    # NOTE: Fallba
b210: 63 6b 20 74 6f 20 74 68 65 20 64 69 72 65 63 74  ck to the direct
b220: 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ory containing t
b230: 68 65 20 65 78 65 63 75 74 61 62 6c 65 2e 0d 0a  he executable...
b240: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
b250: 20 20 20 72 65 74 75 72 6e 20 5b 69 6e 66 6f 20     return [info 
b260: 62 69 6e 61 72 79 5d 0d 0a 20 20 20 20 20 20 7d  binary]..      }
b270: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
b280: 70 72 6f 63 20 67 65 74 44 61 74 61 62 61 73 65  proc getDatabase
b290: 44 69 72 65 63 74 6f 72 79 20 7b 7d 20 7b 0d 0a  Directory {} {..
b2a0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
b2b0: 20 4e 4f 54 45 3a 20 54 68 69 73 20 70 72 6f 63   NOTE: This proc
b2c0: 65 64 75 72 65 20 72 65 74 75 72 6e 73 20 74 68  edure returns th
b2d0: 65 20 64 69 72 65 63 74 6f 72 79 20 77 68 65 72  e directory wher
b2e0: 65 20 74 68 65 20 74 65 73 74 20 64 61 74 61 62  e the test datab
b2f0: 61 73 65 73 0d 0a 20 20 20 20 20 20 23 20 20 20  ases..      #   
b300: 20 20 20 20 73 68 6f 75 6c 64 20 62 65 20 6c 6f      should be lo
b310: 63 61 74 65 64 2e 20 20 42 79 20 64 65 66 61 75  cated.  By defau
b320: 6c 74 2c 20 74 68 69 73 20 6a 75 73 74 20 75 73  lt, this just us
b330: 65 73 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  es the temporary
b340: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
b350: 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 66 69 67  directory config
b360: 75 72 65 64 20 66 6f 72 20 74 68 69 73 20 73 79  ured for this sy
b370: 73 74 65 6d 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  stem...      #..
b380: 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20        if {[info 
b390: 65 78 69 73 74 73 20 3a 3a 64 61 74 61 62 61 73  exists ::databas
b3a0: 65 5f 64 69 72 65 63 74 6f 72 79 5d 20 26 26 20  e_directory] && 
b3b0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74  \..          [st
b3c0: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 64  ring length $::d
b3d0: 61 74 61 62 61 73 65 5f 64 69 72 65 63 74 6f 72  atabase_director
b3e0: 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  y] > 0} then {..
b3f0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
b400: 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c     # NOTE: The l
b410: 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64  ocation of the d
b420: 61 74 61 62 61 73 65 20 64 69 72 65 63 74 6f 72  atabase director
b430: 79 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72  y has been overr
b440: 69 64 64 65 6e 3b 0d 0a 20 20 20 20 20 20 20 20  idden;..        
b450: 23 20 20 20 20 20 20 20 74 68 65 72 65 66 6f 72  #       therefor
b460: 65 2c 20 75 73 65 20 69 74 2e 0d 0a 20 20 20 20  e, use it...    
b470: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
b480: 65 74 75 72 6e 20 24 3a 3a 64 61 74 61 62 61 73  eturn $::databas
b490: 65 5f 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20  e_directory..   
b4a0: 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e     } elseif {[in
b4b0: 66 6f 20 65 78 69 73 74 73 20 3a 3a 73 63 72 61  fo exists ::scra
b4c0: 74 63 68 5f 64 69 72 65 63 74 6f 72 79 5d 20 26  tch_directory] &
b4d0: 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b  & \..          [
b4e0: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a  string length $:
b4f0: 3a 73 63 72 61 74 63 68 5f 64 69 72 65 63 74 6f  :scratch_directo
b500: 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  ry] > 0} then {.
b510: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
b520: 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20      # NOTE: The 
b530: 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  location of the 
b540: 73 63 72 61 74 63 68 20 64 69 72 65 63 74 6f 72  scratch director
b550: 79 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72  y has been overr
b560: 69 64 64 65 6e 3b 0d 0a 20 20 20 20 20 20 20 20  idden;..        
b570: 23 20 20 20 20 20 20 20 74 68 65 72 65 66 6f 72  #       therefor
b580: 65 2c 20 75 73 65 20 69 74 2e 0d 0a 20 20 20 20  e, use it...    
b590: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
b5a0: 65 74 75 72 6e 20 24 3a 3a 73 63 72 61 74 63 68  eturn $::scratch
b5b0: 5f 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20  _directory..    
b5c0: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
b5d0: 20 20 20 20 72 65 74 75 72 6e 20 5b 67 65 74 54      return [getT
b5e0: 65 6d 70 6f 72 61 72 79 50 61 74 68 5d 0d 0a 20  emporaryPath].. 
b5f0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
b600: 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 54 65  ..    proc getTe
b610: 6d 70 6f 72 61 72 79 44 69 72 65 63 74 6f 72 79  mporaryDirectory
b620: 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a   {} {..      #..
b630: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68        # NOTE: Th
b640: 69 73 20 70 72 6f 63 65 64 75 72 65 20 72 65 74  is procedure ret
b650: 75 72 6e 73 20 74 68 65 20 64 69 72 65 63 74 6f  urns the directo
b660: 72 79 20 77 68 65 72 65 20 74 68 65 20 74 65 6d  ry where the tem
b670: 70 6f 72 61 72 79 20 66 69 6c 65 73 0d 0a 20 20  porary files..  
b680: 20 20 20 20 23 20 20 20 20 20 20 20 73 68 6f 75      #       shou
b690: 6c 64 20 62 65 20 6c 6f 63 61 74 65 64 2e 20 20  ld be located.  
b6a0: 42 79 20 64 65 66 61 75 6c 74 2c 20 74 68 69 73  By default, this
b6b0: 20 6a 75 73 74 20 75 73 65 73 20 74 68 65 20 74   just uses the t
b6c0: 65 6d 70 6f 72 61 72 79 0d 0a 20 20 20 20 20 20  emporary..      
b6d0: 23 20 20 20 20 20 20 20 64 69 72 65 63 74 6f 72  #       director
b6e0: 79 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72  y configured for
b6f0: 20 74 68 69 73 20 73 79 73 74 65 6d 2e 0d 0a 20   this system... 
b700: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
b710: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
b720: 3a 74 65 6d 70 6f 72 61 72 79 5f 64 69 72 65 63  :temporary_direc
b730: 74 6f 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20  tory] && \..    
b740: 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65        [string le
b750: 6e 67 74 68 20 24 3a 3a 74 65 6d 70 6f 72 61 72  ngth $::temporar
b760: 79 5f 64 69 72 65 63 74 6f 72 79 5d 20 3e 20 30  y_directory] > 0
b770: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
b780: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
b790: 4f 54 45 3a 20 54 68 65 20 6c 6f 63 61 74 69 6f  OTE: The locatio
b7a0: 6e 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61  n of the tempora
b7b0: 72 79 20 64 69 72 65 63 74 6f 72 79 20 68 61 73  ry directory has
b7c0: 20 62 65 65 6e 20 6f 76 65 72 72 69 64 64 65 6e   been overridden
b7d0: 3b 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  ;..        #    
b7e0: 20 20 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73     therefore, us
b7f0: 65 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23  e it...        #
b800: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
b810: 20 24 3a 3a 74 65 6d 70 6f 72 61 72 79 5f 64 69   $::temporary_di
b820: 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d  rectory..      }
b830: 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20 65   elseif {[info e
b840: 78 69 73 74 73 20 3a 3a 73 63 72 61 74 63 68 5f  xists ::scratch_
b850: 64 69 72 65 63 74 6f 72 79 5d 20 26 26 20 5c 0d  directory] && \.
b860: 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69  .          [stri
b870: 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 73 63 72  ng length $::scr
b880: 61 74 63 68 5f 64 69 72 65 63 74 6f 72 79 5d 20  atch_directory] 
b890: 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
b8a0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
b8b0: 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c 6f 63 61  # NOTE: The loca
b8c0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 63 72 61  tion of the scra
b8d0: 74 63 68 20 64 69 72 65 63 74 6f 72 79 20 68 61  tch directory ha
b8e0: 73 20 62 65 65 6e 20 6f 76 65 72 72 69 64 64 65  s been overridde
b8f0: 6e 3b 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  n;..        #   
b900: 20 20 20 20 74 68 65 72 65 66 6f 72 65 2c 20 75      therefore, u
b910: 73 65 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20  se it...        
b920: 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  #..        retur
b930: 6e 20 24 3a 3a 73 63 72 61 74 63 68 5f 64 69 72  n $::scratch_dir
b940: 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20  ectory..      } 
b950: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
b960: 72 65 74 75 72 6e 20 5b 67 65 74 54 65 6d 70 6f  return [getTempo
b970: 72 61 72 79 50 61 74 68 5d 0d 0a 20 20 20 20 20  raryPath]..     
b980: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
b990: 20 20 70 72 6f 63 20 67 65 74 45 78 65 63 75 74    proc getExecut
b9a0: 65 4f 6e 53 65 74 75 70 20 7b 7d 20 7b 0d 0a 20  eOnSetup {} {.. 
b9b0: 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65       if {[info e
b9c0: 78 69 73 74 73 20 3a 3a 65 78 65 63 75 74 65 5f  xists ::execute_
b9d0: 6f 6e 5f 73 65 74 75 70 5d 20 26 26 20 5c 0d 0a  on_setup] && \..
b9e0: 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e            [strin
b9f0: 67 20 6c 65 6e 67 74 68 20 24 3a 3a 65 78 65 63  g length $::exec
ba00: 75 74 65 5f 6f 6e 5f 73 65 74 75 70 5d 20 3e 20  ute_on_setup] > 
ba10: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
ba20: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
ba30: 4e 4f 54 45 3a 20 52 65 74 75 72 6e 20 74 68 65  NOTE: Return the
ba40: 20 63 6f 6e 66 69 67 75 72 65 64 20 53 51 4c 20   configured SQL 
ba50: 74 6f 20 65 78 65 63 75 74 65 20 64 75 72 69 6e  to execute durin
ba60: 67 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  g the connection
ba70: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
ba80: 20 20 73 65 74 75 70 20 70 72 6f 63 65 64 75 72    setup procedur
ba90: 65 20 28 69 2e 65 2e 20 66 6f 72 20 65 76 65 72  e (i.e. for ever
baa0: 79 20 74 65 73 74 20 64 61 74 61 62 61 73 65 20  y test database 
bab0: 63 6f 6e 6e 65 63 74 69 6f 6e 29 2e 0d 0a 20 20  connection)...  
bac0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
bad0: 20 72 65 74 75 72 6e 20 24 3a 3a 65 78 65 63 75   return $::execu
bae0: 74 65 5f 6f 6e 5f 73 65 74 75 70 0d 0a 20 20 20  te_on_setup..   
baf0: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
bb00: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
bb10: 23 20 4e 4f 54 45 3a 20 42 79 20 64 65 66 61 75  # NOTE: By defau
bb20: 6c 74 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20  lt, there is no 
bb30: 53 51 4c 20 74 6f 20 65 78 65 63 75 74 65 20 64  SQL to execute d
bb40: 75 72 69 6e 67 20 74 68 65 20 63 6f 6e 6e 65 63  uring the connec
bb50: 74 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20 23 20  tion..        # 
bb60: 20 20 20 20 20 20 73 65 74 75 70 20 70 72 6f 63        setup proc
bb70: 65 64 75 72 65 20 28 69 2e 65 2e 20 66 6f 72 20  edure (i.e. for 
bb80: 65 76 65 72 79 20 74 65 73 74 20 64 61 74 61 62  every test datab
bb90: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 29 2e  ase connection).
bba0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
bbb0: 20 20 20 20 20 72 65 74 75 72 6e 20 22 22 0d 0a       return ""..
bbc0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
bbd0: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 53  ...    proc getS
bbe0: 74 72 69 6e 67 4d 61 70 46 6f 72 54 63 6c 45 73  tringMapForTclEs
bbf0: 63 61 70 65 20 7b 7d 20 7b 0d 0a 20 20 20 20 20  cape {} {..     
bc00: 20 72 65 74 75 72 6e 20 5b 6c 69 73 74 20 5c 5c   return [list \\
bc10: 20 5c 5c 5c 5c 20 5c 5b 20 5c 5c 5c 5b 20 5c 5d   \\\\ \[ \\\[ \]
bc20: 20 5c 5c 5c 5d 20 5c 24 20 5c 5c 5c 24 5d 0d 0a   \\\] \$ \\\$]..
bc30: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
bc40: 6f 63 20 67 65 74 54 65 73 74 4f 76 65 72 72 69  oc getTestOverri
bc50: 64 65 73 50 72 65 61 6d 62 6c 65 20 7b 20 7b 65  desPreamble { {e
bc60: 78 74 72 61 56 61 72 4e 61 6d 65 73 20 22 22 7d  xtraVarNames ""}
bc70: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20   } {..      set 
bc80: 76 61 72 4e 61 6d 65 73 20 5b 6c 69 73 74 5d 0d  varNames [list].
bc90: 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
bca0: 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 61 76 61    # NOTE: If ava
bcb0: 69 6c 61 62 6c 65 2c 20 73 74 61 72 74 20 77 69  ilable, start wi
bcc0: 74 68 20 74 68 65 20 6d 61 73 74 65 72 20 6c 69  th the master li
bcd0: 73 74 20 6f 66 20 74 65 73 74 20 6f 76 65 72 72  st of test overr
bce0: 69 64 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ide..      #    
bcf0: 20 20 20 76 61 72 69 61 62 6c 65 73 2e 0d 0a 20     variables... 
bd00: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
bd10: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
bd20: 3a 74 65 73 74 5f 6f 76 65 72 72 69 64 65 73 5d  :test_overrides]
bd30: 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
bd40: 20 5b 6c 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73   [llength $::tes
bd50: 74 5f 6f 76 65 72 72 69 64 65 73 5d 20 3e 20 30  t_overrides] > 0
bd60: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
bd70: 20 20 65 76 61 6c 20 6c 61 70 70 65 6e 64 20 76    eval lappend v
bd80: 61 72 4e 61 6d 65 73 20 24 3a 3a 74 65 73 74 5f  arNames $::test_
bd90: 6f 76 65 72 72 69 64 65 73 0d 0a 20 20 20 20 20  overrides..     
bda0: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   }....      #.. 
bdb0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20       # NOTE: If 
bdc0: 72 65 71 75 65 73 74 65 64 20 62 79 20 6f 75 72  requested by our
bdd0: 20 63 61 6c 6c 65 72 2c 20 61 64 64 20 61 6e 79   caller, add any
bde0: 20 61 64 64 69 74 69 6f 6e 61 6c 20 76 61 72 69   additional vari
bdf0: 61 62 6c 65 0d 0a 20 20 20 20 20 20 23 20 20 20  able..      #   
be00: 20 20 20 20 6e 61 6d 65 73 20 74 6f 20 63 6f 70      names to cop
be10: 79 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 23 0d  y now...      #.
be20: 0a 20 20 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e  .      if {[llen
be30: 67 74 68 20 24 65 78 74 72 61 56 61 72 4e 61 6d  gth $extraVarNam
be40: 65 73 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  es] > 0} then {.
be50: 0a 20 20 20 20 20 20 20 20 65 76 61 6c 20 6c 61  .        eval la
be60: 70 70 65 6e 64 20 76 61 72 4e 61 6d 65 73 20 24  ppend varNames $
be70: 65 78 74 72 61 56 61 72 4e 61 6d 65 73 0d 0a 20  extraVarNames.. 
be80: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
be90: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
bea0: 20 42 75 69 6c 64 20 74 68 65 20 73 63 72 69 70   Build the scrip
beb0: 74 20 66 72 61 67 6d 65 6e 74 20 74 6f 20 62 65  t fragment to be
bec0: 20 72 65 74 75 72 6e 65 64 20 62 79 20 70 72 6f   returned by pro
bed0: 63 65 73 73 69 6e 67 20 65 61 63 68 0d 0a 20 20  cessing each..  
bee0: 20 20 20 20 23 20 20 20 20 20 20 20 76 61 72 69      #       vari
bef0: 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 61 64  able name and ad
bf00: 64 69 6e 67 20 74 68 65 20 6e 65 63 65 63 65 73  ding the nececes
bf10: 73 61 72 79 20 73 63 72 69 70 74 20 66 72 61 67  sary script frag
bf20: 6d 65 6e 74 73 20 66 6f 72 0d 0a 20 20 20 20 20  ments for..     
bf30: 20 23 20 20 20 20 20 20 20 65 61 63 68 20 6f 6e   #       each on
bf40: 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  e...      #..   
bf50: 20 20 20 73 65 74 20 72 65 73 75 6c 74 20 22 22     set result ""
bf60: 0d 0a 0d 0a 20 20 20 20 20 20 66 6f 72 65 61 63  ....      foreac
bf70: 68 20 76 61 72 4e 61 6d 65 20 24 76 61 72 4e 61  h varName $varNa
bf80: 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  mes {..        #
bf90: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
bfa0: 3a 20 42 75 69 6c 64 20 74 68 65 20 71 75 61 6c  : Build the qual
bfb0: 69 66 69 65 64 20 67 6c 6f 62 61 6c 20 76 61 72  ified global var
bfc0: 69 61 62 6c 65 20 6e 61 6d 65 2e 0d 0a 20 20 20  iable name...   
bfd0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
bfe0: 73 65 74 20 66 75 6c 6c 56 61 72 4e 61 6d 65 20  set fullVarName 
bff0: 5b 61 70 70 65 6e 64 41 72 67 73 20 3a 3a 20 24  [appendArgs :: $
c000: 76 61 72 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20  varName]....    
c010: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
c020: 20 4e 4f 54 45 3a 20 44 6f 65 73 20 74 68 65 20   NOTE: Does the 
c030: 76 61 72 69 61 62 6c 65 20 65 78 69 73 74 20 69  variable exist i
c040: 6e 20 74 68 69 73 20 69 6e 74 65 72 70 72 65 74  n this interpret
c050: 65 72 20 63 6f 6e 74 65 78 74 3f 0d 0a 20 20 20  er context?..   
c060: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
c070: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
c080: 20 24 66 75 6c 6c 56 61 72 4e 61 6d 65 5d 7d 20   $fullVarName]} 
c090: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
c0a0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23    #..          #
c0b0: 20 4e 4f 54 45 3a 20 41 70 70 65 6e 64 20 61 20   NOTE: Append a 
c0c0: 73 63 72 69 70 74 20 66 72 61 67 6d 65 6e 74 20  script fragment 
c0d0: 74 6f 20 74 68 65 20 72 65 73 75 6c 74 20 74 68  to the result th
c0e0: 61 74 20 77 69 6c 6c 20 63 6f 72 72 65 63 74 6c  at will correctl
c0f0: 79 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20  y..          #  
c100: 20 20 20 20 20 63 6f 70 79 20 61 6e 79 20 63 6f       copy any co
c110: 6e 74 61 69 6e 65 64 20 76 61 6c 75 65 20 74 6f  ntained value to
c120: 20 61 6e 6f 74 68 65 72 20 69 6e 74 65 72 70 72   another interpr
c130: 65 74 65 72 20 63 6f 6e 74 65 78 74 2e 0d 0a 20  eter context... 
c140: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
c150: 20 20 20 20 20 20 61 70 70 65 6e 64 20 72 65 73        append res
c160: 75 6c 74 20 5c 6e 20 22 73 65 74 20 22 20 24 66  ult \n "set " $f
c170: 75 6c 6c 56 61 72 4e 61 6d 65 20 22 20 5c 7b 22  ullVarName " \{"
c180: 20 5b 73 74 72 69 6e 67 20 6d 61 70 20 5c 0d 0a   [string map \..
c190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 67                [g
c1a0: 65 74 53 74 72 69 6e 67 4d 61 70 46 6f 72 54 63  etStringMapForTc
c1b0: 6c 45 73 63 61 70 65 5d 20 5b 73 65 74 20 24 66  lEscape] [set $f
c1c0: 75 6c 6c 56 61 72 4e 61 6d 65 5d 5d 20 5c 7d 0d  ullVarName]] \}.
c1d0: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
c1e0: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
c1f0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66        # NOTE: If
c200: 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 6e 74   the result cont
c210: 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  ains one or more
c220: 20 73 63 72 69 70 74 20 66 72 61 67 6d 65 6e 74   script fragment
c230: 73 2c 20 61 70 70 65 6e 64 20 61 0d 0a 20 20 20  s, append a..   
c240: 20 20 20 23 20 20 20 20 20 20 20 6e 65 77 6c 69     #       newli
c250: 6e 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ne...      #..  
c260: 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
c270: 6c 65 6e 67 74 68 20 24 72 65 73 75 6c 74 5d 20  length $result] 
c280: 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
c290: 20 20 20 20 20 61 70 70 65 6e 64 20 72 65 73 75       append resu
c2a0: 6c 74 20 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a  lt \n..      }..
c2b0: 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 24  ..      return $
c2c0: 72 65 73 75 6c 74 0d 0a 20 20 20 20 7d 0d 0a 0c  result..    }...
c2d0: 0d 0a 20 20 20 20 70 72 6f 63 20 6d 6f 76 65 53  ..    proc moveS
c2e0: 79 73 74 65 6d 44 61 74 61 53 51 4c 69 74 65 44  ystemDataSQLiteD
c2f0: 6c 6c 43 6f 6e 66 69 67 20 7b 20 7b 72 65 73 74  llConfig { {rest
c300: 6f 72 65 20 66 61 6c 73 65 7d 20 7b 76 65 72 62  ore false} {verb
c310: 6f 73 65 20 74 72 75 65 7d 20 7d 20 7b 0d 0a 20  ose true} } {.. 
c320: 20 20 20 20 20 73 65 74 20 64 69 72 65 63 74 6f       set directo
c330: 72 79 20 5b 67 65 74 42 69 6e 61 72 79 44 69 72  ry [getBinaryDir
c340: 65 63 74 6f 72 79 5d 0d 0a 0d 0a 20 20 20 20 20  ectory]....     
c350: 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
c360: 67 74 68 20 24 64 69 72 65 63 74 6f 72 79 5d 20  gth $directory] 
c370: 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
c380: 20 20 20 20 20 20 69 66 20 7b 24 76 65 72 62 6f        if {$verbo
c390: 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  se} then {..    
c3a0: 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
c3b0: 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
c3c0: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
c3d0: 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73           "---- s
c3e0: 6b 69 70 70 65 64 20 6d 6f 76 69 6e 67 20 5c 22  kipped moving \"
c3f0: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
c400: 74 65 2e 64 6c 6c 2e 63 6f 6e 66 69 67 5c 22 2c  te.dll.config\",
c410: 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   " \..          
c420: 20 20 20 20 22 6e 6f 20 62 69 6e 61 72 79 20 64      "no binary d
c430: 69 72 65 63 74 6f 72 79 5c 6e 22 5d 0d 0a 20 20  irectory\n"]..  
c440: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
c450: 20 20 20 72 65 74 75 72 6e 0d 0a 20 20 20 20 20     return..     
c460: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 73 65 74 20   }....      set 
c470: 66 69 6c 65 4e 61 6d 65 28 31 29 20 5b 66 69 6c  fileName(1) [fil
c480: 65 20 6e 6f 72 6d 61 6c 69 7a 65 20 5c 0d 0a 20  e normalize \.. 
c490: 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 6a           [file j
c4a0: 6f 69 6e 20 24 64 69 72 65 63 74 6f 72 79 20 53  oin $directory S
c4b0: 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
c4c0: 65 2e 64 6c 6c 2e 63 6f 6e 66 69 67 5d 5d 0d 0a  e.dll.config]]..
c4d0: 0d 0a 20 20 20 20 20 20 73 65 74 20 66 69 6c 65  ..      set file
c4e0: 4e 61 6d 65 28 32 29 20 5b 61 70 70 65 6e 64 41  Name(2) [appendA
c4f0: 72 67 73 20 24 66 69 6c 65 4e 61 6d 65 28 31 29  rgs $fileName(1)
c500: 20 2e 6d 6f 76 65 64 5d 0d 0a 0d 0a 20 20 20 20   .moved]....    
c510: 20 20 69 66 20 7b 24 72 65 73 74 6f 72 65 7d 20    if {$restore} 
c520: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
c530: 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73  if {[file exists
c540: 20 24 66 69 6c 65 4e 61 6d 65 28 32 29 5d 7d 20   $fileName(2)]} 
c550: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
c560: 20 20 66 69 6c 65 20 72 65 6e 61 6d 65 20 24 66    file rename $f
c570: 69 6c 65 4e 61 6d 65 28 32 29 20 24 66 69 6c 65  ileName(2) $file
c580: 4e 61 6d 65 28 31 29 0d 0a 0d 0a 20 20 20 20 20  Name(1)....     
c590: 20 20 20 20 20 69 66 20 7b 24 76 65 72 62 6f 73       if {$verbos
c5a0: 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  e} then {..     
c5b0: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
c5c0: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
c5d0: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
c5e0: 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
c5f0: 2d 20 6d 6f 76 65 64 20 5c 22 22 20 24 66 69 6c  - moved \"" $fil
c600: 65 4e 61 6d 65 28 32 29 20 22 5c 22 20 74 6f 20  eName(2) "\" to 
c610: 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  \"" \..         
c620: 20 20 20 20 20 20 20 24 66 69 6c 65 4e 61 6d 65         $fileName
c630: 28 31 29 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20  (1) \"\n]..     
c640: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
c650: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
c660: 20 20 20 20 69 66 20 7b 24 76 65 72 62 6f 73 65      if {$verbose
c670: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
c680: 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
c690: 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
c6a0: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
c6b0: 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
c6c0: 20 73 6b 69 70 70 65 64 20 6d 6f 76 69 6e 67 20   skipped moving 
c6d0: 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 28 32 29  \"" $fileName(2)
c6e0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
c6f0: 20 20 20 20 22 5c 22 2c 20 69 74 20 64 6f 65 73      "\", it does
c700: 20 6e 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a   not exist\n"]..
c710: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
c720: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20       }..      } 
c730: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
c740: 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73  if {[file exists
c750: 20 24 66 69 6c 65 4e 61 6d 65 28 31 29 5d 7d 20   $fileName(1)]} 
c760: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
c770: 20 20 66 69 6c 65 20 72 65 6e 61 6d 65 20 24 66    file rename $f
c780: 69 6c 65 4e 61 6d 65 28 31 29 20 24 66 69 6c 65  ileName(1) $file
c790: 4e 61 6d 65 28 32 29 0d 0a 0d 0a 20 20 20 20 20  Name(2)....     
c7a0: 20 20 20 20 20 69 66 20 7b 24 76 65 72 62 6f 73       if {$verbos
c7b0: 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  e} then {..     
c7c0: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
c7d0: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
c7e0: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
c7f0: 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
c800: 2d 20 6d 6f 76 65 64 20 5c 22 22 20 24 66 69 6c  - moved \"" $fil
c810: 65 4e 61 6d 65 28 31 29 20 22 5c 22 20 74 6f 20  eName(1) "\" to 
c820: 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  \"" \..         
c830: 20 20 20 20 20 20 20 24 66 69 6c 65 4e 61 6d 65         $fileName
c840: 28 32 29 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20  (2) \"\n]..     
c850: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
c860: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
c870: 20 20 20 20 69 66 20 7b 24 76 65 72 62 6f 73 65      if {$verbose
c880: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
c890: 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
c8a0: 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
c8b0: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
c8c0: 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
c8d0: 20 73 6b 69 70 70 65 64 20 6d 6f 76 69 6e 67 20   skipped moving 
c8e0: 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 28 31 29  \"" $fileName(1)
c8f0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
c900: 20 20 20 20 22 5c 22 2c 20 69 74 20 64 6f 65 73      "\", it does
c910: 20 6e 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a   not exist\n"]..
c920: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
c930: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
c940: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
c950: 72 6f 63 20 77 72 69 74 65 53 79 73 74 65 6d 44  roc writeSystemD
c960: 61 74 61 53 51 4c 69 74 65 44 6c 6c 43 6f 6e 66  ataSQLiteDllConf
c970: 69 67 20 7b 20 64 61 74 61 20 7b 76 65 72 62 6f  ig { data {verbo
c980: 73 65 20 74 72 75 65 7d 20 7d 20 7b 0d 0a 20 20  se true} } {..  
c990: 20 20 20 20 73 65 74 20 64 69 72 65 63 74 6f 72      set director
c9a0: 79 20 5b 67 65 74 42 69 6e 61 72 79 44 69 72 65  y [getBinaryDire
c9b0: 63 74 6f 72 79 5d 0d 0a 0d 0a 20 20 20 20 20 20  ctory]....      
c9c0: 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
c9d0: 74 68 20 24 64 69 72 65 63 74 6f 72 79 5d 20 3d  th $directory] =
c9e0: 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
c9f0: 20 20 20 20 20 69 66 20 7b 24 76 65 72 62 6f 73       if {$verbos
ca00: 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  e} then {..     
ca10: 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
ca20: 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
ca30: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
ca40: 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6b          "---- sk
ca50: 69 70 70 65 64 20 6d 6f 76 69 6e 67 20 5c 22 53  ipped moving \"S
ca60: 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
ca70: 65 2e 64 6c 6c 2e 63 6f 6e 66 69 67 5c 22 2c 20  e.dll.config\", 
ca80: 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
ca90: 20 20 20 22 6e 6f 20 62 69 6e 61 72 79 20 64 69     "no binary di
caa0: 72 65 63 74 6f 72 79 5c 6e 22 5d 0d 0a 20 20 20  rectory\n"]..   
cab0: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
cac0: 20 20 72 65 74 75 72 6e 0d 0a 20 20 20 20 20 20    return..      
cad0: 7d 0d 0a 0d 0a 20 20 20 20 20 20 73 65 74 20 66  }....      set f
cae0: 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6e 6f  ileName [file no
caf0: 72 6d 61 6c 69 7a 65 20 5c 0d 0a 20 20 20 20 20  rmalize \..     
cb00: 20 20 20 20 20 5b 66 69 6c 65 20 6a 6f 69 6e 20       [file join 
cb10: 24 64 69 72 65 63 74 6f 72 79 20 53 79 73 74 65  $directory Syste
cb20: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c  m.Data.SQLite.dl
cb30: 6c 2e 63 6f 6e 66 69 67 5d 5d 0d 0a 0d 0a 20 20  l.config]]....  
cb40: 20 20 20 20 77 72 69 74 65 46 69 6c 65 20 24 66      writeFile $f
cb50: 69 6c 65 4e 61 6d 65 20 24 64 61 74 61 0d 0a 0d  ileName $data...
cb60: 0a 20 20 20 20 20 20 69 66 20 7b 24 76 65 72 62  .      if {$verb
cb70: 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ose} then {..   
cb80: 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
cb90: 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20  st_channel \..  
cba0: 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
cbb0: 77 72 6f 74 65 20 5c 22 53 79 73 74 65 6d 2e 44  wrote \"System.D
cbc0: 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 2e 63  ata.SQLite.dll.c
cbd0: 6f 6e 66 69 67 5c 22 5c 6e 22 0d 0a 20 20 20 20  onfig\"\n"..    
cbe0: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74    }....      ret
cbf0: 75 72 6e 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20  urn $fileName.. 
cc00: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
cc10: 63 20 6d 6f 76 65 45 61 67 6c 65 53 68 65 6c 6c  c moveEagleShell
cc20: 4d 64 61 43 6f 6e 66 69 67 20 7b 20 7b 72 65 73  MdaConfig { {res
cc30: 74 6f 72 65 20 66 61 6c 73 65 7d 20 7b 76 65 72  tore false} {ver
cc40: 62 6f 73 65 20 74 72 75 65 7d 20 7d 20 7b 0d 0a  bose true} } {..
cc50: 20 20 20 20 20 20 73 65 74 20 64 69 72 65 63 74        set direct
cc60: 6f 72 79 20 5b 67 65 74 42 69 6e 61 72 79 44 69  ory [getBinaryDi
cc70: 72 65 63 74 6f 72 79 5d 0d 0a 0d 0a 20 20 20 20  rectory]....    
cc80: 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
cc90: 6e 67 74 68 20 24 64 69 72 65 63 74 6f 72 79 5d  ngth $directory]
cca0: 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
ccb0: 20 20 20 20 20 20 20 69 66 20 7b 24 76 65 72 62         if {$verb
ccc0: 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ose} then {..   
ccd0: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
cce0: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
ccf0: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
cd00: 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
cd10: 73 6b 69 70 70 65 64 20 6d 6f 76 69 6e 67 20 5c  skipped moving \
cd20: 22 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65 2e  "EagleShell.exe.
cd30: 6d 64 61 2e 63 6f 6e 66 69 67 5c 22 2c 20 22 20  mda.config\", " 
cd40: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
cd50: 20 22 6e 6f 20 62 69 6e 61 72 79 20 64 69 72 65   "no binary dire
cd60: 63 74 6f 72 79 5c 6e 22 5d 0d 0a 20 20 20 20 20  ctory\n"]..     
cd70: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
cd80: 72 65 74 75 72 6e 0d 0a 20 20 20 20 20 20 7d 0d  return..      }.
cd90: 0a 0d 0a 20 20 20 20 20 20 73 65 74 20 66 69 6c  ...      set fil
cda0: 65 4e 61 6d 65 28 31 29 20 5b 66 69 6c 65 20 6e  eName(1) [file n
cdb0: 6f 72 6d 61 6c 69 7a 65 20 5c 0d 0a 20 20 20 20  ormalize \..    
cdc0: 20 20 20 20 20 20 5b 66 69 6c 65 20 6a 6f 69 6e        [file join
cdd0: 20 24 64 69 72 65 63 74 6f 72 79 20 45 61 67 6c   $directory Eagl
cde0: 65 53 68 65 6c 6c 2e 65 78 65 2e 6d 64 61 2e 63  eShell.exe.mda.c
cdf0: 6f 6e 66 69 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20  onfig]]....     
ce00: 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 28 32 29   set fileName(2)
ce10: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 66 69   [appendArgs $fi
ce20: 6c 65 4e 61 6d 65 28 31 29 20 2e 6d 6f 76 65 64  leName(1) .moved
ce30: 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 24  ]....      if {$
ce40: 72 65 73 74 6f 72 65 7d 20 74 68 65 6e 20 7b 0d  restore} then {.
ce50: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 66 69  .        if {[fi
ce60: 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c 65 4e  le exists $fileN
ce70: 61 6d 65 28 32 29 5d 7d 20 74 68 65 6e 20 7b 0d  ame(2)]} then {.
ce80: 0a 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20  .          file 
ce90: 72 65 6e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65  rename $fileName
cea0: 28 32 29 20 24 66 69 6c 65 4e 61 6d 65 28 31 29  (2) $fileName(1)
ceb0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66  ....          if
cec0: 20 7b 24 76 65 72 62 6f 73 65 7d 20 74 68 65 6e   {$verbose} then
ced0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
cee0: 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
cef0: 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
cf00: 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
cf10: 20 20 20 20 20 22 2d 2d 2d 2d 20 6d 6f 76 65 64       "---- moved
cf20: 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 28 32   \"" $fileName(2
cf30: 29 20 22 5c 22 20 74 6f 20 5c 22 22 20 5c 0d 0a  ) "\" to \"" \..
cf40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf50: 24 66 69 6c 65 4e 61 6d 65 28 31 29 20 5c 22 5c  $fileName(1) \"\
cf60: 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  n]..          }.
cf70: 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20  .        } else 
cf80: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  {..          if 
cf90: 7b 24 76 65 72 62 6f 73 65 7d 20 74 68 65 6e 20  {$verbose} then 
cfa0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
cfb0: 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
cfc0: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
cfd0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
cfe0: 20 20 20 20 22 2d 2d 2d 2d 20 73 6b 69 70 70 65      "---- skippe
cff0: 64 20 6d 6f 76 69 6e 67 20 5c 22 22 20 24 66 69  d moving \"" $fi
d000: 6c 65 4e 61 6d 65 28 32 29 20 5c 0d 0a 20 20 20  leName(2) \..   
d010: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22               "\"
d020: 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78  , it does not ex
d030: 69 73 74 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20  ist\n"]..       
d040: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
d050: 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
d060: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 66 69  .        if {[fi
d070: 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c 65 4e  le exists $fileN
d080: 61 6d 65 28 31 29 5d 7d 20 74 68 65 6e 20 7b 0d  ame(1)]} then {.
d090: 0a 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20  .          file 
d0a0: 72 65 6e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65  rename $fileName
d0b0: 28 31 29 20 24 66 69 6c 65 4e 61 6d 65 28 32 29  (1) $fileName(2)
d0c0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66  ....          if
d0d0: 20 7b 24 76 65 72 62 6f 73 65 7d 20 74 68 65 6e   {$verbose} then
d0e0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
d0f0: 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
d100: 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
d110: 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
d120: 20 20 20 20 20 22 2d 2d 2d 2d 20 6d 6f 76 65 64       "---- moved
d130: 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 28 31   \"" $fileName(1
d140: 29 20 22 5c 22 20 74 6f 20 5c 22 22 20 5c 0d 0a  ) "\" to \"" \..
d150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d160: 24 66 69 6c 65 4e 61 6d 65 28 32 29 20 5c 22 5c  $fileName(2) \"\
d170: 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  n]..          }.
d180: 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20  .        } else 
d190: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  {..          if 
d1a0: 7b 24 76 65 72 62 6f 73 65 7d 20 74 68 65 6e 20  {$verbose} then 
d1b0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
d1c0: 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
d1d0: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
d1e0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
d1f0: 20 20 20 20 22 2d 2d 2d 2d 20 73 6b 69 70 70 65      "---- skippe
d200: 64 20 6d 6f 76 69 6e 67 20 5c 22 22 20 24 66 69  d moving \"" $fi
d210: 6c 65 4e 61 6d 65 28 31 29 20 5c 0d 0a 20 20 20  leName(1) \..   
d220: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22               "\"
d230: 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78  , it does not ex
d240: 69 73 74 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20  ist\n"]..       
d250: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
d260: 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
d270: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 77 72 69  ....    proc wri
d280: 74 65 45 61 67 6c 65 53 68 65 6c 6c 4d 64 61 43  teEagleShellMdaC
d290: 6f 6e 66 69 67 20 7b 20 64 61 74 61 20 7b 76 65  onfig { data {ve
d2a0: 72 62 6f 73 65 20 74 72 75 65 7d 20 7d 20 7b 0d  rbose true} } {.
d2b0: 0a 20 20 20 20 20 20 73 65 74 20 64 69 72 65 63  .      set direc
d2c0: 74 6f 72 79 20 5b 67 65 74 42 69 6e 61 72 79 44  tory [getBinaryD
d2d0: 69 72 65 63 74 6f 72 79 5d 0d 0a 0d 0a 20 20 20  irectory]....   
d2e0: 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
d2f0: 65 6e 67 74 68 20 24 64 69 72 65 63 74 6f 72 79  ength $directory
d300: 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
d310: 20 20 20 20 20 20 20 20 69 66 20 7b 24 76 65 72          if {$ver
d320: 62 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  bose} then {..  
d330: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
d340: 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
d350: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
d360: 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
d370: 20 73 6b 69 70 70 65 64 20 6d 6f 76 69 6e 67 20   skipped moving 
d380: 5c 22 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65  \"EagleShell.exe
d390: 2e 6d 64 61 2e 63 6f 6e 66 69 67 5c 22 2c 20 22  .mda.config\", "
d3a0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
d3b0: 20 20 22 6e 6f 20 62 69 6e 61 72 79 20 64 69 72    "no binary dir
d3c0: 65 63 74 6f 72 79 5c 6e 22 5d 0d 0a 20 20 20 20  ectory\n"]..    
d3d0: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
d3e0: 20 72 65 74 75 72 6e 0d 0a 20 20 20 20 20 20 7d   return..      }
d3f0: 0d 0a 0d 0a 20 20 20 20 20 20 73 65 74 20 66 69  ....      set fi
d400: 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6e 6f 72  leName [file nor
d410: 6d 61 6c 69 7a 65 20 5c 0d 0a 20 20 20 20 20 20  malize \..      
d420: 20 20 20 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24      [file join $
d430: 64 69 72 65 63 74 6f 72 79 20 45 61 67 6c 65 53  directory EagleS
d440: 68 65 6c 6c 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e  hell.exe.mda.con
d450: 66 69 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 77  fig]]....      w
d460: 72 69 74 65 46 69 6c 65 20 24 66 69 6c 65 4e 61  riteFile $fileNa
d470: 6d 65 20 24 64 61 74 61 0d 0a 0d 0a 20 20 20 20  me $data....    
d480: 20 20 69 66 20 7b 24 76 65 72 62 6f 73 65 7d 20    if {$verbose} 
d490: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
d4a0: 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
d4b0: 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20  annel \..       
d4c0: 20 20 20 20 20 22 2d 2d 2d 2d 20 77 72 6f 74 65       "---- wrote
d4d0: 20 5c 22 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78   \"EagleShell.ex
d4e0: 65 2e 6d 64 61 2e 63 6f 6e 66 69 67 5c 22 5c 6e  e.mda.config\"\n
d4f0: 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  "..      }....  
d500: 20 20 20 20 72 65 74 75 72 6e 20 24 66 69 6c 65      return $file
d510: 4e 61 6d 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  Name..    }.....
d520: 20 20 20 20 70 72 6f 63 20 67 65 74 41 70 70 44      proc getAppD
d530: 6f 6d 61 69 6e 50 72 65 61 6d 62 6c 65 20 7b 20  omainPreamble { 
d540: 7b 70 72 65 66 69 78 20 22 22 7d 20 7b 73 75 66  {prefix ""} {suf
d550: 66 69 78 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20  fix ""} } {..   
d560: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
d570: 54 45 3a 20 54 68 69 73 20 70 72 6f 63 65 64 75  TE: This procedu
d580: 72 65 20 72 65 74 75 72 6e 73 20 61 20 74 65 73  re returns a tes
d590: 74 20 73 65 74 75 70 20 73 63 72 69 70 74 20 66  t setup script f
d5a0: 72 61 67 6d 65 6e 74 20 73 75 69 74 61 62 6c 65  ragment suitable
d5b0: 20 66 6f 72 0d 0a 20 20 20 20 20 20 23 20 20 20   for..      #   
d5c0: 20 20 20 20 65 76 61 6c 75 61 74 69 6f 6e 20 62      evaluation b
d5d0: 79 20 61 6e 20 69 6e 74 65 72 70 72 65 74 65 72  y an interpreter
d5e0: 20 63 72 65 61 74 65 64 20 69 6e 20 61 6e 20 69   created in an i
d5f0: 73 6f 6c 61 74 65 64 20 61 70 70 6c 69 63 61 74  solated applicat
d600: 69 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ion..      #    
d610: 20 20 20 64 6f 6d 61 69 6e 2e 20 20 54 68 65 20     domain.  The 
d620: 73 63 72 69 70 74 20 66 72 61 67 6d 65 6e 74 20  script fragment 
d630: 62 65 69 6e 67 20 72 65 74 75 72 6e 65 64 20 77  being returned w
d640: 69 6c 6c 20 62 65 20 73 75 72 72 6f 75 6e 64 65  ill be surrounde
d650: 64 20 62 79 0d 0a 20 20 20 20 20 20 23 20 20 20  d by..      #   
d660: 20 20 20 20 74 68 65 20 70 72 65 66 69 78 20 61      the prefix a
d670: 6e 64 20 73 75 66 66 69 78 20 22 73 63 72 69 70  nd suffix "scrip
d680: 74 20 66 72 61 67 6d 65 6e 74 73 22 20 73 70 65  t fragments" spe
d690: 63 69 66 69 65 64 20 62 79 20 6f 75 72 20 63 61  cified by our ca
d6a0: 6c 6c 65 72 2c 0d 0a 20 20 20 20 20 20 23 20 20  ller,..      #  
d6b0: 20 20 20 20 20 69 66 20 61 6e 79 2e 20 20 54 68       if any.  Th
d6c0: 65 20 65 6e 74 69 72 65 20 73 63 72 69 70 74 20  e entire script 
d6d0: 62 65 69 6e 67 20 72 65 74 75 72 6e 65 64 20 77  being returned w
d6e0: 69 6c 6c 20 62 65 20 73 75 62 73 74 69 74 75 74  ill be substitut
d6f0: 65 64 20 76 69 61 0d 0a 20 20 20 20 20 20 23 20  ed via..      # 
d700: 20 20 20 20 20 20 5b 73 75 62 73 74 5d 2c 20 69        [subst], i
d710: 6e 20 74 68 65 20 63 6f 6e 74 65 78 74 20 6f 66  n the context of
d720: 20 6f 75 72 20 63 61 6c 6c 65 72 2c 20 62 65 66   our caller, bef
d730: 6f 72 65 20 62 65 69 6e 67 20 72 65 74 75 72 6e  ore being return
d740: 65 64 2e 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ed...      #    
d750: 20 20 20 54 68 69 73 20 73 74 65 70 20 69 73 20     This step is 
d760: 6e 65 63 65 73 73 61 72 79 20 73 6f 20 74 68 61  necessary so tha
d770: 74 20 73 6f 6d 65 20 6c 69 6d 69 74 65 64 20 63  t some limited c
d780: 6f 6e 74 65 78 74 20 69 6e 66 6f 72 6d 61 74 69  ontext informati
d790: 6f 6e 2c 0d 0a 20 20 20 20 20 20 23 20 20 20 20  on,..      #    
d7a0: 20 20 20 70 72 69 6d 61 72 69 6c 79 20 72 65 6c     primarily rel
d7b0: 61 74 65 64 20 74 6f 20 74 68 65 20 74 65 73 74  ated to the test
d7c0: 69 6e 67 20 64 69 72 65 63 74 6f 72 69 65 73 2c  ing directories,
d7d0: 20 63 61 6e 20 62 65 20 74 72 61 6e 73 66 65 72   can be transfer
d7e0: 72 65 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20  red..      #    
d7f0: 20 20 20 74 6f 20 74 68 65 20 69 6e 74 65 72 70     to the interp
d800: 72 65 74 65 72 20 69 6e 20 74 68 65 20 69 73 6f  reter in the iso
d810: 6c 61 74 65 64 20 61 70 70 6c 69 63 61 74 69 6f  lated applicatio
d820: 6e 20 64 6f 6d 61 69 6e 2c 20 6d 61 6b 69 6e 67  n domain, making
d830: 20 69 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20   it..      #    
d840: 20 20 20 61 62 6c 65 20 74 6f 20 73 75 63 63 65     able to succe
d850: 73 73 66 75 6c 6c 79 20 72 75 6e 20 74 65 73 74  ssfully run test
d860: 73 20 74 68 61 74 20 72 65 71 75 69 72 65 20 6f  s that require o
d870: 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68  ne or more of th
d880: 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
d890: 20 66 69 6c 65 73 20 69 6e 20 6f 6e 65 20 6f 66   files in one of
d8a0: 20 74 68 65 20 74 65 73 74 69 6e 67 20 64 69 72   the testing dir
d8b0: 65 63 74 6f 72 69 65 73 2e 20 20 43 61 6c 6c 65  ectories.  Calle
d8c0: 72 73 20 73 68 6f 75 6c 64 20 6b 65 65 70 20 69  rs should keep i
d8d0: 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  n..      #      
d8e0: 20 6d 69 6e 64 20 74 68 61 74 20 74 68 65 20 74   mind that the t
d8f0: 65 73 74 20 73 63 72 69 70 74 20 66 72 61 67 6d  est script fragm
d900: 65 6e 74 20 62 65 69 6e 67 20 72 65 74 75 72 6e  ent being return
d910: 65 64 20 63 61 6e 6e 6f 74 20 72 65 6c 79 20 6f  ed cannot rely o
d920: 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  n..      #      
d930: 20 61 6e 79 20 73 63 72 69 70 74 20 6c 69 62 72   any script libr
d940: 61 72 79 20 70 72 6f 63 65 64 75 72 65 73 20 74  ary procedures t
d950: 68 61 74 20 61 72 65 20 6e 6f 74 20 70 72 6f 76  hat are not prov
d960: 69 64 65 64 20 62 79 20 74 68 65 20 45 61 67 6c  ided by the Eagl
d970: 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
d980: 20 6c 69 62 72 61 72 79 20 70 61 63 6b 61 67 65   library package
d990: 20 28 69 2e 65 2e 20 22 69 6e 69 74 2e 65 61 67   (i.e. "init.eag
d9a0: 6c 65 22 29 2c 20 69 6e 63 6c 75 64 69 6e 67 20  le"), including 
d9b0: 74 68 6f 73 65 20 70 72 6f 76 69 64 65 64 20 62  those provided b
d9c0: 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  y..      #      
d9d0: 20 74 68 65 20 45 61 67 6c 65 20 74 65 73 74 20   the Eagle test 
d9e0: 70 61 63 6b 61 67 65 2c 20 75 6e 6c 65 73 73 20  package, unless 
d9f0: 74 68 65 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e  the file contain
da00: 69 6e 67 20 74 68 65 6d 20 69 73 20 6c 6f 61 64  ing them is load
da10: 65 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ed..      #     
da20: 20 20 6d 61 6e 75 61 6c 6c 79 20 76 69 61 20 73    manually via s
da30: 6f 6d 65 20 6f 74 68 65 72 20 6d 65 63 68 61 6e  ome other mechan
da40: 69 73 6d 20 28 65 2e 67 2e 20 62 79 20 69 6e 63  ism (e.g. by inc
da50: 6c 75 64 69 6e 67 20 61 70 70 72 6f 70 72 69 61  luding appropria
da60: 74 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  te..      #     
da70: 20 20 5b 70 61 63 6b 61 67 65 20 72 65 71 75 69    [package requi
da80: 72 65 5d 20 6f 72 20 5b 73 6f 75 72 63 65 5d 20  re] or [source] 
da90: 63 6f 6d 6d 61 6e 64 73 20 69 6e 20 74 68 65 20  commands in the 
daa0: 70 72 65 66 69 78 20 6f 72 20 73 75 66 66 69 78  prefix or suffix
dab0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
dac0: 73 63 72 69 70 74 20 66 72 61 67 6d 65 6e 74 73  script fragments
dad0: 29 2e 20 20 41 6c 73 6f 2c 20 61 6c 6c 20 76 61  ).  Also, all va
dae0: 72 69 61 62 6c 65 20 72 65 66 65 72 65 6e 63 65  riable reference
daf0: 73 20 61 6e 64 20 61 6c 6c 20 6e 65 73 74 65 64  s and all nested
db00: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
db10: 63 6f 6d 6d 61 6e 64 73 20 28 69 2e 65 2e 20 74  commands (i.e. t
db20: 68 6f 73 65 20 69 6e 20 73 71 75 61 72 65 20 62  hose in square b
db30: 72 61 63 6b 65 74 73 29 20 63 6f 6e 74 61 69 6e  rackets) contain
db40: 65 64 20 69 6e 20 74 68 65 20 66 69 6e 61 6c 0d  ed in the final.
db50: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73  .      #       s
db60: 63 72 69 70 74 20 66 72 61 67 6d 65 6e 74 20 77  cript fragment w
db70: 69 6c 6c 20 65 6e 64 20 75 70 20 62 65 69 6e 67  ill end up being
db80: 20 65 76 61 6c 75 61 74 65 64 20 69 6e 20 74 68   evaluated in th
db90: 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 74 68 65  e context of the
dba0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
dbb0: 63 61 6c 6c 69 6e 67 20 69 6e 74 65 72 70 72 65  calling interpre
dbc0: 74 65 72 20 61 6e 64 20 6e 6f 74 20 74 68 65 20  ter and not the 
dbd0: 74 61 72 67 65 74 20 69 6e 74 65 72 70 72 65 74  target interpret
dbe0: 65 72 20 63 72 65 61 74 65 64 20 69 6e 20 74 68  er created in th
dbf0: 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
dc00: 20 69 73 6f 6c 61 74 65 64 20 61 70 70 6c 69 63   isolated applic
dc10: 61 74 69 6f 6e 20 64 6f 6d 61 69 6e 20 75 6e 6c  ation domain unl
dc20: 65 73 73 20 74 68 65 20 64 6f 6c 6c 61 72 20 73  ess the dollar s
dc30: 69 67 6e 73 20 61 6e 64 2f 6f 72 20 73 71 75 61  igns and/or squa
dc40: 72 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  re..      #     
dc50: 20 20 62 72 61 63 6b 65 74 73 20 61 72 65 20 73    brackets are s
dc60: 70 65 63 69 61 6c 6c 79 20 71 75 6f 74 65 64 20  pecially quoted 
dc70: 77 69 74 68 20 62 61 63 6b 73 6c 61 73 68 65 73  with backslashes
dc80: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
dc90: 20 20 72 65 74 75 72 6e 20 5b 75 70 6c 65 76 65    return [upleve
dca0: 6c 20 31 20 5b 6c 69 73 74 20 73 75 62 73 74 20  l 1 [list subst 
dcb0: 5b 61 70 70 65 6e 64 41 72 67 73 20 24 70 72 65  [appendArgs $pre
dcc0: 66 69 78 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  fix {..        #
dcd0: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
dce0: 3a 20 54 68 65 20 5c 5b 6f 62 6a 65 63 74 5c 5d  : The \[object\]
dcf0: 20 63 6f 6d 6d 61 6e 64 20 6d 61 79 20 62 65 20   command may be 
dd00: 6d 69 73 73 69 6e 67 20 69 6e 20 73 6f 6d 65 20  missing in some 
dd10: 45 61 67 6c 65 20 63 6f 72 65 0d 0a 20 20 20 20  Eagle core..    
dd20: 20 20 20 20 23 20 20 20 20 20 20 20 6c 69 62 72      #       libr
dd30: 61 72 79 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  ary configuratio
dd40: 6e 73 2e 20 20 43 6c 6f 6e 69 6e 67 20 61 6e 64  ns.  Cloning and
dd50: 20 75 73 69 6e 67 20 74 68 65 20 70 72 6f 63 65   using the proce
dd60: 64 75 72 65 0d 0a 20 20 20 20 20 20 20 20 23 20  dure..        # 
dd70: 20 20 20 20 20 20 5c 5b 63 68 61 6e 67 65 4e 61        \[changeNa
dd80: 74 69 76 65 52 75 6e 74 69 6d 65 4f 70 74 69 6f  tiveRuntimeOptio
dd90: 6e 5c 5d 20 6d 61 79 20 68 65 6c 70 20 74 6f 20  n\] may help to 
dda0: 6d 69 74 69 67 61 74 65 20 74 68 69 73 2e 0d 0a  mitigate this...
ddb0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
ddc0: 20 20 20 70 72 6f 63 20 63 68 61 6e 67 65 4e 61     proc changeNa
ddd0: 74 69 76 65 52 75 6e 74 69 6d 65 4f 70 74 69 6f  tiveRuntimeOptio
dde0: 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n \..           
ddf0: 20 7b 5b 69 6e 66 6f 20 61 72 67 73 20 63 68 61   {[info args cha
de00: 6e 67 65 4e 61 74 69 76 65 52 75 6e 74 69 6d 65  ngeNativeRuntime
de10: 4f 70 74 69 6f 6e 5d 7d 20 5c 0d 0a 20 20 20 20  Option]} \..    
de20: 20 20 20 20 20 20 20 20 7b 5b 69 6e 66 6f 20 62          {[info b
de30: 6f 64 79 20 63 68 61 6e 67 65 4e 61 74 69 76 65  ody changeNative
de40: 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 5d 7d 0d  RuntimeOption]}.
de50: 0a 0d 0a 20 20 20 20 20 20 20 20 63 61 74 63 68  ...        catch
de60: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68   {..          ch
de70: 61 6e 67 65 4e 61 74 69 76 65 52 75 6e 74 69 6d  angeNativeRuntim
de80: 65 4f 70 74 69 6f 6e 20 5b 68 61 73 52 75 6e 74  eOption [hasRunt
de90: 69 6d 65 4f 70 74 69 6f 6e 20 6e 61 74 69 76 65  imeOption native
dea0: 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  ]..        }..  
deb0: 20 20 20 20 7d 20 5b 67 65 74 54 65 73 74 4f 76      } [getTestOv
dec0: 65 72 72 69 64 65 73 50 72 65 61 6d 62 6c 65 20  erridesPreamble 
ded0: 5b 6c 69 73 74 20 70 61 74 68 20 74 65 73 74 5f  [list path test_
dee0: 63 68 61 6e 6e 65 6c 5d 5d 20 24 73 75 66 66 69  channel]] $suffi
def0: 78 5d 5d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  x]]]..    }.....
df00: 20 20 20 20 70 72 6f 63 20 74 72 79 43 6f 70 79      proc tryCopy
df10: 45 78 74 65 72 6e 61 6c 46 69 6c 65 20 7b 0d 0a  ExternalFile {..
df20: 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65              file
df30: 4e 61 6d 65 20 7b 70 6c 61 74 66 6f 72 6d 20 22  Name {platform "
df40: 22 7d 20 7b 6e 65 77 46 69 6c 65 4e 61 6d 65 20  "} {newFileName 
df50: 22 22 7d 20 7b 76 65 72 62 6f 73 65 20 74 72 75  ""} {verbose tru
df60: 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65  e} } {..      se
df70: 74 20 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65  t sourceFileName
df80: 20 5b 67 65 74 45 78 74 65 72 6e 61 6c 46 69 6c   [getExternalFil
df90: 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 5d  eName $fileName]
dfa0: 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b  ....      if {![
dfb0: 66 69 6c 65 20 65 78 69 73 74 73 20 24 73 6f 75  file exists $sou
dfc0: 72 63 65 46 69 6c 65 4e 61 6d 65 5d 7d 20 74 68  rceFileName]} th
dfd0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66  en {..        if
dfe0: 20 7b 24 76 65 72 62 6f 73 65 7d 20 74 68 65 6e   {$verbose} then
dff0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70   {..          tp
e000: 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
e010: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
e020: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
e030: 20 22 2d 2d 2d 2d 20 73 6b 69 70 70 65 64 20 63   "---- skipped c
e040: 6f 70 79 69 6e 67 20 65 78 74 65 72 6e 61 6c 20  opying external 
e050: 66 69 6c 65 20 5c 22 22 20 24 73 6f 75 72 63 65  file \"" $source
e060: 46 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20  FileName \..    
e070: 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c 20 69            "\", i
e080: 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  t does not exist
e090: 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d  \n"]..        }.
e0a0: 0a 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ...        retur
e0b0: 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  n..      }....  
e0c0: 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
e0d0: 6c 65 6e 67 74 68 20 24 6e 65 77 46 69 6c 65 4e  length $newFileN
e0e0: 61 6d 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ame] > 0} then {
e0f0: 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 74 61  ..        set ta
e100: 72 67 65 74 46 69 6c 65 4e 61 6d 65 20 5b 67 65  rgetFileName [ge
e110: 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20  tBinaryFileName 
e120: 24 6e 65 77 46 69 6c 65 4e 61 6d 65 20 24 70 6c  $newFileName $pl
e130: 61 74 66 6f 72 6d 5d 0d 0a 20 20 20 20 20 20 7d  atform]..      }
e140: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
e150: 20 73 65 74 20 74 61 72 67 65 74 46 69 6c 65 4e   set targetFileN
e160: 61 6d 65 20 5b 67 65 74 42 69 6e 61 72 79 46 69  ame [getBinaryFi
e170: 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65  leName $fileName
e180: 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a 20 20 20   $platform]..   
e190: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 73 65     }....      se
e1a0: 74 20 74 61 72 67 65 74 44 69 72 65 63 74 6f 72  t targetDirector
e1b0: 79 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20  y [file dirname 
e1c0: 24 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 5d  $targetFileName]
e1d0: 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63  ....      if {[c
e1e0: 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
e1f0: 69 66 20 7b 21 5b 66 69 6c 65 20 65 78 69 73 74  if {![file exist
e200: 73 20 24 74 61 72 67 65 74 44 69 72 65 63 74 6f  s $targetDirecto
e210: 72 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ry]} then {..   
e220: 20 20 20 20 20 20 20 66 69 6c 65 20 6d 6b 64 69         file mkdi
e230: 72 20 24 74 61 72 67 65 74 44 69 72 65 63 74 6f  r $targetDirecto
e240: 72 79 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  ry..        }...
e250: 0a 20 20 20 20 20 20 20 20 66 69 6c 65 20 63 6f  .        file co
e260: 70 79 20 2d 66 6f 72 63 65 20 24 73 6f 75 72 63  py -force $sourc
e270: 65 46 69 6c 65 4e 61 6d 65 20 24 74 61 72 67 65  eFileName $targe
e280: 74 46 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20  tFileName..     
e290: 20 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b   }] == 0} then {
e2a0: 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
e2b0: 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
e2c0: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
e2d0: 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
e2e0: 20 63 6f 70 69 65 64 20 65 78 74 65 72 6e 61 6c   copied external
e2f0: 20 66 69 6c 65 20 66 72 6f 6d 20 5c 22 22 20 24   file from \"" $
e300: 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 22  sourceFileName "
e310: 5c 22 20 74 6f 20 5c 22 22 20 5c 0d 0a 20 20 20  \" to \"" \..   
e320: 20 20 20 20 20 20 20 20 20 24 74 61 72 67 65 74           $target
e330: 46 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a  FileName \"\n]..
e340: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
e350: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
e360: 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
e370: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
e380: 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66           "---- f
e390: 61 69 6c 65 64 20 74 6f 20 63 6f 70 79 20 65 78  ailed to copy ex
e3a0: 74 65 72 6e 61 6c 20 66 69 6c 65 20 66 72 6f 6d  ternal file from
e3b0: 20 5c 22 22 20 24 73 6f 75 72 63 65 46 69 6c 65   \"" $sourceFile
e3c0: 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  Name \..        
e3d0: 20 20 20 20 22 5c 22 20 74 6f 20 5c 22 22 20 24      "\" to \"" $
e3e0: 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 20 5c  targetFileName \
e3f0: 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  "\n]..      }.. 
e400: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
e410: 63 20 74 72 79 43 6f 70 79 42 69 6e 61 72 79 46  c tryCopyBinaryF
e420: 69 6c 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  ile {..         
e430: 20 20 20 66 69 6c 65 4e 61 6d 65 20 6d 61 6e 61     fileName mana
e440: 67 65 64 4f 6e 6c 79 20 7b 70 6c 61 74 66 6f 72  gedOnly {platfor
e450: 6d 20 22 22 7d 20 7b 6e 65 77 46 69 6c 65 4e 61  m ""} {newFileNa
e460: 6d 65 20 22 22 7d 0d 0a 20 20 20 20 20 20 20 20  me ""}..        
e470: 20 20 20 20 7b 76 65 72 62 6f 73 65 20 74 72 75      {verbose tru
e480: 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65  e} } {..      se
e490: 74 20 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65  t sourceFileName
e4a0: 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e   [getBinaryFileN
e4b0: 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 20 24 70  ame $fileName $p
e4c0: 6c 61 74 66 6f 72 6d 5d 0d 0a 0d 0a 20 20 20 20  latform]....    
e4d0: 20 20 69 66 20 7b 21 5b 66 69 6c 65 20 65 78 69    if {![file exi
e4e0: 73 74 73 20 24 73 6f 75 72 63 65 46 69 6c 65 4e  sts $sourceFileN
e4f0: 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ame]} then {..  
e500: 20 20 20 20 20 20 69 66 20 7b 24 76 65 72 62 6f        if {$verbo
e510: 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  se} then {..    
e520: 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
e530: 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
e540: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
e550: 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73           "---- s
e560: 6b 69 70 70 65 64 20 63 6f 70 79 69 6e 67 20 62  kipped copying b
e570: 69 6e 61 72 79 20 66 69 6c 65 20 5c 22 22 20 24  inary file \"" $
e580: 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 5c  sourceFileName \
e590: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
e5a0: 22 5c 22 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74  "\", it does not
e5b0: 20 65 78 69 73 74 5c 6e 22 5d 0d 0a 20 20 20 20   exist\n"]..    
e5c0: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
e5d0: 20 72 65 74 75 72 6e 0d 0a 20 20 20 20 20 20 7d   return..      }
e5e0: 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73  ....      if {[s
e5f0: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 6e 65  tring length $ne
e600: 77 46 69 6c 65 4e 61 6d 65 5d 20 3e 20 30 7d 20  wFileName] > 0} 
e610: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
e620: 73 65 74 20 74 61 72 67 65 74 46 69 6c 65 4e 61  set targetFileNa
e630: 6d 65 20 5b 67 65 74 42 75 69 6c 64 46 69 6c 65  me [getBuildFile
e640: 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  Name \..        
e650: 20 20 20 20 24 6e 65 77 46 69 6c 65 4e 61 6d 65      $newFileName
e660: 20 24 6d 61 6e 61 67 65 64 4f 6e 6c 79 20 24 70   $managedOnly $p
e670: 6c 61 74 66 6f 72 6d 5d 0d 0a 20 20 20 20 20 20  latform]..      
e680: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
e690: 20 20 73 65 74 20 74 61 72 67 65 74 46 69 6c 65    set targetFile
e6a0: 4e 61 6d 65 20 5b 67 65 74 42 75 69 6c 64 46 69  Name [getBuildFi
e6b0: 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20  leName \..      
e6c0: 20 20 20 20 20 20 24 66 69 6c 65 4e 61 6d 65 20        $fileName 
e6d0: 24 6d 61 6e 61 67 65 64 4f 6e 6c 79 20 24 70 6c  $managedOnly $pl
e6e0: 61 74 66 6f 72 6d 5d 0d 0a 20 20 20 20 20 20 7d  atform]..      }
e6f0: 0d 0a 0d 0a 20 20 20 20 20 20 73 65 74 20 74 61  ....      set ta
e700: 72 67 65 74 44 69 72 65 63 74 6f 72 79 20 5b 66  rgetDirectory [f
e710: 69 6c 65 20 64 69 72 6e 61 6d 65 20 24 74 61 72  ile dirname $tar
e720: 67 65 74 46 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a  getFileName]....
e730: 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
e740: 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   {..        if {
e750: 21 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 74  ![file exists $t
e760: 61 72 67 65 74 44 69 72 65 63 74 6f 72 79 5d 7d  argetDirectory]}
e770: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
e780: 20 20 20 66 69 6c 65 20 6d 6b 64 69 72 20 24 74     file mkdir $t
e790: 61 72 67 65 74 44 69 72 65 63 74 6f 72 79 0d 0a  argetDirectory..
e7a0: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
e7b0: 20 20 20 20 20 66 69 6c 65 20 63 6f 70 79 20 2d       file copy -
e7c0: 66 6f 72 63 65 20 24 73 6f 75 72 63 65 46 69 6c  force $sourceFil
e7d0: 65 4e 61 6d 65 20 24 74 61 72 67 65 74 46 69 6c  eName $targetFil
e7e0: 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 7d 5d 20  eName..      }] 
e7f0: 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
e800: 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
e810: 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
e820: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
e830: 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 70         "---- cop
e840: 69 65 64 20 62 69 6e 61 72 79 20 66 69 6c 65 20  ied binary file 
e850: 66 72 6f 6d 20 5c 22 22 20 24 73 6f 75 72 63 65  from \"" $source
e860: 46 69 6c 65 4e 61 6d 65 20 22 5c 22 20 74 6f 20  FileName "\" to 
e870: 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  \"" \..         
e880: 20 20 20 24 74 61 72 67 65 74 46 69 6c 65 4e 61     $targetFileNa
e890: 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20  me \"\n]..      
e8a0: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
e8b0: 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
e8c0: 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
e8d0: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
e8e0: 20 20 20 22 2d 2d 2d 2d 20 66 61 69 6c 65 64 20     "---- failed 
e8f0: 74 6f 20 63 6f 70 79 20 62 69 6e 61 72 79 20 66  to copy binary f
e900: 69 6c 65 20 66 72 6f 6d 20 5c 22 22 20 24 73 6f  ile from \"" $so
e910: 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 5c 0d 0a  urceFileName \..
e920: 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 20              "\" 
e930: 74 6f 20 5c 22 22 20 24 74 61 72 67 65 74 46 69  to \"" $targetFi
e940: 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20  leName \"\n]..  
e950: 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
e960: 0a 20 20 20 20 70 72 6f 63 20 74 72 79 43 6f 70  .    proc tryCop
e970: 79 42 75 69 6c 64 46 69 6c 65 20 7b 0d 0a 20 20  yBuildFile {..  
e980: 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 4e 61            fileNa
e990: 6d 65 20 6d 61 6e 61 67 65 64 4f 6e 6c 79 20 7b  me managedOnly {
e9a0: 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20 7b 6e 65  platform ""} {ne
e9b0: 77 46 69 6c 65 4e 61 6d 65 20 22 22 7d 0d 0a 20  wFileName ""}.. 
e9c0: 20 20 20 20 20 20 20 20 20 20 20 7b 76 65 72 62             {verb
e9d0: 6f 73 65 20 74 72 75 65 7d 20 7d 20 7b 0d 0a 20  ose true} } {.. 
e9e0: 20 20 20 20 20 73 65 74 20 73 6f 75 72 63 65 46       set sourceF
e9f0: 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42 75 69 6c  ileName [getBuil
ea00: 64 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e  dFileName $fileN
ea10: 61 6d 65 20 24 6d 61 6e 61 67 65 64 4f 6e 6c 79  ame $managedOnly
ea20: 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a 0d 0a 20   $platform].... 
ea30: 20 20 20 20 20 69 66 20 7b 21 5b 66 69 6c 65 20       if {![file 
ea40: 65 78 69 73 74 73 20 24 73 6f 75 72 63 65 46 69  exists $sourceFi
ea50: 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d  leName]} then {.
ea60: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 24 76 65  .        if {$ve
ea70: 72 62 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20  rbose} then {.. 
ea80: 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
ea90: 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
eaa0: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
eab0: 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
eac0: 2d 20 73 6b 69 70 70 65 64 20 63 6f 70 79 69 6e  - skipped copyin
ead0: 67 20 62 75 69 6c 64 20 66 69 6c 65 20 5c 22 22  g build file \""
eae0: 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65   $sourceFileName
eaf0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
eb00: 20 20 22 5c 22 2c 20 69 74 20 64 6f 65 73 20 6e    "\", it does n
eb10: 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a 20 20  ot exist\n"]..  
eb20: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
eb30: 20 20 20 72 65 74 75 72 6e 0d 0a 20 20 20 20 20     return..     
eb40: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b   }....      if {
eb50: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
eb60: 6e 65 77 46 69 6c 65 4e 61 6d 65 5d 20 3e 20 30  newFileName] > 0
eb70: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
eb80: 20 20 73 65 74 20 74 61 72 67 65 74 46 69 6c 65    set targetFile
eb90: 4e 61 6d 65 20 5b 67 65 74 42 69 6e 61 72 79 46  Name [getBinaryF
eba0: 69 6c 65 4e 61 6d 65 20 24 6e 65 77 46 69 6c 65  ileName $newFile
ebb0: 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 5d 0d  Name $platform].
ebc0: 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
ebd0: 0a 20 20 20 20 20 20 20 20 73 65 74 20 74 61 72  .        set tar
ebe0: 67 65 74 46 69 6c 65 4e 61 6d 65 20 5b 67 65 74  getFileName [get
ebf0: 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 24  BinaryFileName $
ec00: 66 69 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f  fileName $platfo
ec10: 72 6d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  rm]..      }....
ec20: 20 20 20 20 20 20 73 65 74 20 74 61 72 67 65 74        set target
ec30: 44 69 72 65 63 74 6f 72 79 20 5b 66 69 6c 65 20  Directory [file 
ec40: 64 69 72 6e 61 6d 65 20 24 74 61 72 67 65 74 46  dirname $targetF
ec50: 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20  ileName]....    
ec60: 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
ec70: 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 66 69          if {![fi
ec80: 6c 65 20 65 78 69 73 74 73 20 24 74 61 72 67 65  le exists $targe
ec90: 74 44 69 72 65 63 74 6f 72 79 5d 7d 20 74 68 65  tDirectory]} the
eca0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 66  n {..          f
ecb0: 69 6c 65 20 6d 6b 64 69 72 20 24 74 61 72 67 65  ile mkdir $targe
ecc0: 74 44 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20  tDirectory..    
ecd0: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
ece0: 20 66 69 6c 65 20 63 6f 70 79 20 2d 66 6f 72 63   file copy -forc
ecf0: 65 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d  e $sourceFileNam
ed00: 65 20 24 74 61 72 67 65 74 46 69 6c 65 4e 61 6d  e $targetFileNam
ed10: 65 0d 0a 20 20 20 20 20 20 7d 5d 20 3d 3d 20 30  e..      }] == 0
ed20: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
ed30: 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
ed40: 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
ed50: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
ed60: 20 20 20 22 2d 2d 2d 2d 20 63 6f 70 69 65 64 20     "---- copied 
ed70: 62 75 69 6c 64 20 66 69 6c 65 20 66 72 6f 6d 20  build file from 
ed80: 5c 22 22 20 24 73 6f 75 72 63 65 46 69 6c 65 4e  \"" $sourceFileN
ed90: 61 6d 65 20 22 5c 22 20 74 6f 20 5c 22 22 20 5c  ame "\" to \"" \
eda0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 24 74  ..            $t
edb0: 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 20 5c 22  argetFileName \"
edc0: 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  \n]..      } els
edd0: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75  e {..        tpu
ede0: 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
edf0: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
ee00: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d  ..            "-
ee10: 2d 2d 2d 20 66 61 69 6c 65 64 20 74 6f 20 63 6f  --- failed to co
ee20: 70 79 20 62 75 69 6c 64 20 66 69 6c 65 20 66 72  py build file fr
ee30: 6f 6d 20 5c 22 22 20 24 73 6f 75 72 63 65 46 69  om \"" $sourceFi
ee40: 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20  leName \..      
ee50: 20 20 20 20 20 20 22 5c 22 20 74 6f 20 5c 22 22        "\" to \""
ee60: 20 24 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65   $targetFileName
ee70: 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d   \"\n]..      }.
ee80: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
ee90: 72 6f 63 20 74 72 79 44 65 6c 65 74 65 42 69 6e  roc tryDeleteBin
eea0: 61 72 79 46 69 6c 65 20 7b 20 66 69 6c 65 4e 61  aryFile { fileNa
eeb0: 6d 65 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d  me {platform ""}
eec0: 20 7b 76 65 72 62 6f 73 65 20 74 72 75 65 7d 20   {verbose true} 
eed0: 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 66  } {..      set f
eee0: 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42 69 6e 61  ileName [getBina
eef0: 72 79 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65  ryFileName $file
ef00: 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 5d 0d  Name $platform].
ef10: 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 66  ...      if {![f
ef20: 69 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c 65  ile exists $file
ef30: 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  Name]} then {.. 
ef40: 20 20 20 20 20 20 20 69 66 20 7b 24 76 65 72 62         if {$verb
ef50: 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ose} then {..   
ef60: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
ef70: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
ef80: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
ef90: 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
efa0: 73 6b 69 70 70 65 64 20 64 65 6c 65 74 69 6e 67  skipped deleting
efb0: 20 62 69 6e 61 72 79 20 66 69 6c 65 20 5c 22 22   binary file \""
efc0: 20 24 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20   $fileName \..  
efd0: 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c              "\",
efe0: 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69   it does not exi
eff0: 73 74 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20  st\n"]..        
f000: 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 72 65 74  }....        ret
f010: 75 72 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  urn..      }....
f020: 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
f030: 20 7b 66 69 6c 65 20 64 65 6c 65 74 65 20 24 66   {file delete $f
f040: 69 6c 65 4e 61 6d 65 7d 5d 20 3d 3d 20 30 7d 20  ileName}] == 0} 
f050: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
f060: 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
f070: 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
f080: 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
f090: 20 22 2d 2d 2d 2d 20 64 65 6c 65 74 65 64 20 62   "---- deleted b
f0a0: 69 6e 61 72 79 20 66 69 6c 65 20 5c 22 22 20 24  inary file \"" $
f0b0: 66 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a  fileName \"\n]..
f0c0: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
f0d0: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
f0e0: 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
f0f0: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
f100: 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66           "---- f
f110: 61 69 6c 65 64 20 74 6f 20 64 65 6c 65 74 65 20  ailed to delete 
f120: 62 69 6e 61 72 79 20 66 69 6c 65 20 5c 22 22 20  binary file \"" 
f130: 24 66 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d  $fileName \"\n].
f140: 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
f150: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 74 72 79  ....    proc try
f160: 44 65 6c 65 74 65 42 75 69 6c 64 46 69 6c 65 20  DeleteBuildFile 
f170: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  {..            f
f180: 69 6c 65 4e 61 6d 65 20 6d 61 6e 61 67 65 64 4f  ileName managedO
f190: 6e 6c 79 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22  nly {platform ""
f1a0: 7d 20 7b 76 65 72 62 6f 73 65 20 74 72 75 65 7d  } {verbose true}
f1b0: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20   } {..      set 
f1c0: 66 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42 75 69  fileName [getBui
f1d0: 6c 64 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65  ldFileName $file
f1e0: 4e 61 6d 65 20 24 6d 61 6e 61 67 65 64 4f 6e 6c  Name $managedOnl
f1f0: 79 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a 0d 0a  y $platform]....
f200: 20 20 20 20 20 20 69 66 20 7b 21 5b 66 69 6c 65        if {![file
f210: 20 65 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d   exists $fileNam
f220: 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  e]} then {..    
f230: 20 20 20 20 69 66 20 7b 24 76 65 72 62 6f 73 65      if {$verbose
f240: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
f250: 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
f260: 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
f270: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
f280: 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6b 69         "---- ski
f290: 70 70 65 64 20 64 65 6c 65 74 69 6e 67 20 62 75  pped deleting bu
f2a0: 69 6c 64 20 66 69 6c 65 20 5c 22 22 20 24 66 69  ild file \"" $fi
f2b0: 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20  leName \..      
f2c0: 20 20 20 20 20 20 20 20 22 5c 22 2c 20 69 74 20          "\", it 
f2d0: 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 5c 6e  does not exist\n
f2e0: 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  "]..        }...
f2f0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 0d  .        return.
f300: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
f310: 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 66 69    if {[catch {fi
f320: 6c 65 20 64 65 6c 65 74 65 20 24 66 69 6c 65 4e  le delete $fileN
f330: 61 6d 65 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  ame}] == 0} then
f340: 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   {..        tput
f350: 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
f360: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
f370: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d  .            "--
f380: 2d 2d 20 64 65 6c 65 74 65 64 20 62 75 69 6c 64  -- deleted build
f390: 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e   file \"" $fileN
f3a0: 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20  ame \"\n]..     
f3b0: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
f3c0: 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
f3d0: 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
f3e0: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
f3f0: 20 20 20 20 22 2d 2d 2d 2d 20 66 61 69 6c 65 64      "---- failed
f400: 20 74 6f 20 64 65 6c 65 74 65 20 62 75 69 6c 64   to delete build
f410: 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e   file \"" $fileN
f420: 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20  ame \"\n]..     
f430: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
f440: 20 20 70 72 6f 63 20 74 72 79 43 6f 70 79 41 73    proc tryCopyAs
f450: 73 65 6d 62 6c 79 20 7b 0d 0a 20 20 20 20 20 20  sembly {..      
f460: 20 20 20 20 20 20 66 69 6c 65 4e 61 6d 65 20 6d        fileName m
f470: 61 6e 61 67 65 64 4f 6e 6c 79 20 7b 70 6c 61 74  anagedOnly {plat
f480: 66 6f 72 6d 20 22 22 7d 20 7b 70 64 62 20 74 72  form ""} {pdb tr
f490: 75 65 7d 20 7b 76 65 72 62 6f 73 65 20 74 72 75  ue} {verbose tru
f4a0: 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74 72  e} } {..      tr
f4b0: 79 43 6f 70 79 42 75 69 6c 64 46 69 6c 65 20 24  yCopyBuildFile $
f4c0: 66 69 6c 65 4e 61 6d 65 20 24 6d 61 6e 61 67 65  fileName $manage
f4d0: 64 4f 6e 6c 79 20 24 70 6c 61 74 66 6f 72 6d 20  dOnly $platform 
f4e0: 22 22 20 24 76 65 72 62 6f 73 65 0d 0a 0d 0a 20  "" $verbose.... 
f4f0: 20 20 20 20 20 69 66 20 7b 24 70 64 62 7d 20 74       if {$pdb} t
f500: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74  hen {..        t
f510: 72 79 43 6f 70 79 42 75 69 6c 64 46 69 6c 65 20  ryCopyBuildFile 
f520: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
f530: 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65             [file
f540: 20 72 6f 6f 74 6e 61 6d 65 20 24 66 69 6c 65 4e   rootname $fileN
f550: 61 6d 65 5d 20 2e 70 64 62 5d 20 24 6d 61 6e 61  ame] .pdb] $mana
f560: 67 65 64 4f 6e 6c 79 20 24 70 6c 61 74 66 6f 72  gedOnly $platfor
f570: 6d 20 22 22 20 24 76 65 72 62 6f 73 65 0d 0a 20  m "" $verbose.. 
f580: 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
f590: 0d 0a 20 20 20 20 70 72 6f 63 20 74 72 79 44 65  ..    proc tryDe
f5a0: 6c 65 74 65 41 73 73 65 6d 62 6c 79 20 7b 0d 0a  leteAssembly {..
f5b0: 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65              file
f5c0: 4e 61 6d 65 20 7b 70 6c 61 74 66 6f 72 6d 20 22  Name {platform "
f5d0: 22 7d 20 7b 70 64 62 20 74 72 75 65 7d 20 7b 76  "} {pdb true} {v
f5e0: 65 72 62 6f 73 65 20 74 72 75 65 7d 20 7d 20 7b  erbose true} } {
f5f0: 0d 0a 20 20 20 20 20 20 74 72 79 44 65 6c 65 74  ..      tryDelet
f600: 65 42 69 6e 61 72 79 46 69 6c 65 20 24 66 69 6c  eBinaryFile $fil
f610: 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 20  eName $platform 
f620: 24 76 65 72 62 6f 73 65 0d 0a 0d 0a 20 20 20 20  $verbose....    
f630: 20 20 69 66 20 7b 24 70 64 62 7d 20 74 68 65 6e    if {$pdb} then
f640: 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 72 79 44   {..        tryD
f650: 65 6c 65 74 65 42 69 6e 61 72 79 46 69 6c 65 20  eleteBinaryFile 
f660: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
f670: 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65             [file
f680: 20 72 6f 6f 74 6e 61 6d 65 20 24 66 69 6c 65 4e   rootname $fileN
f690: 61 6d 65 5d 20 2e 70 64 62 5d 20 24 70 6c 61 74  ame] .pdb] $plat
f6a0: 66 6f 72 6d 20 24 76 65 72 62 6f 73 65 0d 0a 20  form $verbose.. 
f6b0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
f6c0: 0d 0a 20 20 20 20 70 72 6f 63 20 74 72 79 4c 6f  ..    proc tryLo
f6d0: 61 64 41 73 73 65 6d 62 6c 79 20 7b 20 66 69 6c  adAssembly { fil
f6e0: 65 4e 61 6d 65 20 7b 70 6c 61 74 66 6f 72 6d 20  eName {platform 
f6f0: 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73  ""} } {..      s
f700: 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 67 65 74  et fileName [get
f710: 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 24  BinaryFileName $
f720: 66 69 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f  fileName $platfo
f730: 72 6d 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20  rm]....      if 
f740: 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
f750: 20 20 20 73 65 74 20 61 73 73 65 6d 62 6c 79 20     set assembly 
f760: 5b 6f 62 6a 65 63 74 20 6c 6f 61 64 20 2d 6c 6f  [object load -lo
f770: 61 64 74 79 70 65 20 46 69 6c 65 20 2d 61 6c 69  adtype File -ali
f780: 61 73 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20  as $fileName].. 
f790: 20 20 20 20 20 7d 5d 20 3d 3d 20 30 7d 20 74 68       }] == 0} th
f7a0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
f7b0: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
f7c0: 20 4e 6f 77 2c 20 61 64 64 20 74 68 65 20 6e 65   Now, add the ne
f7d0: 63 65 73 73 61 72 79 20 74 65 73 74 20 63 6f 6e  cessary test con
f7e0: 73 74 72 61 69 6e 74 2e 0d 0a 20 20 20 20 20 20  straint...      
f7f0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 61 64 64    #..        add
f800: 43 6f 6e 73 74 72 61 69 6e 74 20 5b 66 69 6c 65  Constraint [file
f810: 20 72 6f 6f 74 6e 61 6d 65 20 5b 66 69 6c 65 20   rootname [file 
f820: 74 61 69 6c 20 24 66 69 6c 65 4e 61 6d 65 5d 5d  tail $fileName]]
f830: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
f840: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 47         # NOTE: G
f850: 72 61 62 20 74 68 65 20 69 6d 61 67 65 20 72 75  rab the image ru
f860: 6e 74 69 6d 65 20 76 65 72 73 69 6f 6e 20 66 72  ntime version fr
f870: 6f 6d 20 74 68 65 20 61 73 73 65 6d 62 6c 79 20  om the assembly 
f880: 62 65 63 61 75 73 65 0d 0a 20 20 20 20 20 20 20  because..       
f890: 20 23 20 20 20 20 20 20 20 73 65 76 65 72 61 6c   #       several
f8a0: 20 74 65 73 74 73 20 72 65 6c 79 20 6f 6e 20 69   tests rely on i
f8b0: 74 20 68 61 76 69 6e 67 20 61 20 63 65 72 74 61  t having a certa
f8c0: 69 6e 20 76 61 6c 75 65 2e 0d 0a 20 20 20 20 20  in value...     
f8d0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 61 64     #..        ad
f8e0: 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70  dConstraint [app
f8f0: 65 6e 64 41 72 67 73 20 5b 66 69 6c 65 20 74 61  endArgs [file ta
f900: 69 6c 20 24 66 69 6c 65 4e 61 6d 65 5d 20 5f 20  il $fileName] _ 
f910: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
f920: 24 61 73 73 65 6d 62 6c 79 20 49 6d 61 67 65 52  $assembly ImageR
f930: 75 6e 74 69 6d 65 56 65 72 73 69 6f 6e 5d 5d 0d  untimeVersion]].
f940: 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
f950: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65        # NOTE: Re
f960: 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61  turn the full pa
f970: 74 68 20 6f 66 20 74 68 65 20 6c 6f 61 64 65 64  th of the loaded
f980: 20 66 69 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20   file...        
f990: 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  #..        retur
f9a0: 6e 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20  n $fileName..   
f9b0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65     }....      re
f9c0: 74 75 72 6e 20 22 22 0d 0a 20 20 20 20 7d 0d 0a  turn ""..    }..
f9d0: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 69 73 53 51  ...    proc isSQ
f9e0: 4c 69 74 65 52 65 61 64 79 20 7b 7d 20 7b 0d 0a  LiteReady {} {..
f9f0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
fa00: 20 4e 4f 54 45 3a 20 54 68 69 73 20 70 72 6f 63   NOTE: This proc
fa10: 65 64 75 72 65 20 6d 75 73 74 20 72 65 74 75 72  edure must retur
fa20: 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 6e 6c 79 20  n non-zero only 
fa30: 69 66 20 74 68 65 20 53 51 4c 69 74 65 20 6e 61  if the SQLite na
fa40: 74 69 76 65 0d 0a 20 20 20 20 20 20 23 20 20 20  tive..      #   
fa50: 20 20 20 20 6c 69 62 72 61 72 79 20 61 6e 64 20      library and 
fa60: 74 68 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  the System.Data.
fa70: 53 51 4c 69 74 65 20 6d 61 6e 61 67 65 64 20 61  SQLite managed a
fa80: 73 73 65 6d 62 6c 79 20 61 72 65 20 6c 6f 61 64  ssembly are load
fa90: 65 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ed..      #     
faa0: 20 20 61 6e 64 20 72 65 61 64 79 20 66 6f 72 20    and ready for 
fab0: 75 73 65 20 62 79 20 74 68 65 20 74 65 73 74 20  use by the test 
fac0: 73 75 69 74 65 2e 20 20 43 75 72 72 65 6e 74 6c  suite.  Currentl
fad0: 79 2c 20 74 68 69 73 20 70 72 6f 63 65 64 75 72  y, this procedur
fae0: 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
faf0: 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65   should be calle
fb00: 64 20 6f 6e 6c 79 20 61 66 74 65 72 20 74 68 65  d only after the
fb10: 20 5b 74 72 79 4c 6f 61 64 41 73 73 65 6d 62 6c   [tryLoadAssembl
fb20: 79 5d 20 70 72 6f 63 65 64 75 72 65 20 68 61 73  y] procedure has
fb30: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
fb40: 62 65 65 6e 20 63 61 6c 6c 65 64 20 74 6f 20 70  been called to p
fb50: 72 6f 62 65 20 66 6f 72 20 74 68 65 20 53 79 73  robe for the Sys
fb60: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20  tem.Data.SQLite 
fb70: 6d 61 6e 61 67 65 64 20 61 73 73 65 6d 62 6c 79  managed assembly
fb80: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
fb90: 61 6e 64 20 74 68 65 20 5b 63 68 65 63 6b 46 6f  and the [checkFo
fba0: 72 53 51 4c 69 74 65 5d 20 70 72 6f 63 65 64 75  rSQLite] procedu
fbb0: 72 65 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c  re has been call
fbc0: 65 64 20 74 6f 20 70 72 6f 62 65 20 66 6f 72 0d  ed to probe for.
fbd0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74  .      #       t
fbe0: 68 65 20 53 51 4c 69 74 65 20 6e 61 74 69 76 65  he SQLite native
fbf0: 20 6c 69 62 72 61 72 79 3b 20 6f 74 68 65 72 77   library; otherw
fc00: 69 73 65 2c 20 74 68 69 73 20 70 72 6f 63 65 64  ise, this proced
fc10: 75 72 65 20 77 69 6c 6c 20 73 69 6d 70 6c 79 0d  ure will simply.
fc20: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61  .      #       a
fc30: 6c 77 61 79 73 20 72 65 74 75 72 6e 20 7a 65 72  lways return zer
fc40: 6f 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  o...      #..   
fc50: 20 20 20 72 65 74 75 72 6e 20 5b 65 78 70 72 20     return [expr 
fc60: 7b 0d 0a 20 20 20 20 20 20 20 20 5b 68 61 76 65  {..        [have
fc70: 43 6f 6e 73 74 72 61 69 6e 74 20 53 79 73 74 65  Constraint Syste
fc80: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 5d 20 26  m.Data.SQLite] &
fc90: 26 20 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e  & [haveConstrain
fca0: 74 20 53 51 4c 69 74 65 5d 0d 0a 20 20 20 20 20  t SQLite]..     
fcb0: 20 7d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20   }]..    }..... 
fcc0: 20 20 20 70 72 6f 63 20 6d 61 74 63 68 50 6c 61     proc matchPla
fcd0: 74 66 6f 72 6d 20 7b 20 70 6c 61 74 66 6f 72 6d  tform { platform
fce0: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20   } {..      #.. 
fcf0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 6e 20       # NOTE: An 
fd00: 65 6d 70 74 79 20 73 74 72 69 6e 67 20 66 6f 72  empty string for
fd10: 20 74 68 65 20 70 6c 61 74 66 6f 72 6d 20 6d 65   the platform me
fd20: 61 6e 73 20 74 68 61 74 20 74 68 65 20 62 75 69  ans that the bui
fd30: 6c 64 20 69 73 20 6e 6f 74 0d 0a 20 20 20 20 20  ld is not..     
fd40: 20 23 20 20 20 20 20 20 20 5b 70 72 69 6d 61 72   #       [primar
fd50: 69 6c 79 5d 20 61 20 6e 61 74 69 76 65 20 62 75  ily] a native bu
fd60: 69 6c 64 3b 20 74 68 65 72 65 66 6f 72 65 2c 20  ild; therefore, 
fd70: 69 74 20 61 6c 77 61 79 73 20 6d 61 74 63 68 65  it always matche
fd80: 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  s...      #..   
fd90: 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
fda0: 65 6e 67 74 68 20 24 70 6c 61 74 66 6f 72 6d 5d  ength $platform]
fdb0: 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
fdc0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72         return tr
fdd0: 75 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ue..      }.... 
fde0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
fdf0: 4e 4f 54 45 3a 20 49 66 20 74 68 65 20 6d 61 63  NOTE: If the mac
fe00: 68 69 6e 65 20 6e 61 6d 65 20 69 73 20 75 6e 61  hine name is una
fe10: 76 61 69 6c 61 62 6c 65 2c 20 74 68 65 72 65 20  vailable, there 
fe20: 69 73 20 6e 6f 74 68 69 6e 67 20 65 6c 73 65 20  is nothing else 
fe30: 77 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  we..      #     
fe40: 20 20 63 61 6e 20 64 6f 2e 0d 0a 20 20 20 20 20    can do...     
fe50: 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b   #..      if {![
fe60: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 63  info exists ::tc
fe70: 6c 5f 70 6c 61 74 66 6f 72 6d 28 6d 61 63 68 69  l_platform(machi
fe80: 6e 65 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ne)]} then {..  
fe90: 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c        return fal
fea0: 73 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  se..      }.... 
feb0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
fec0: 4e 4f 54 45 3a 20 44 6f 65 73 20 74 68 65 20 73  NOTE: Does the s
fed0: 70 65 63 69 66 69 65 64 20 70 6c 61 74 66 6f 72  pecified platfor
fee0: 6d 20 6d 61 74 63 68 20 75 70 20 74 6f 20 74 68  m match up to th
fef0: 65 20 63 75 72 72 65 6e 74 20 70 72 6f 63 65 73  e current proces
ff00: 73 3f 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  s?..      #..   
ff10: 20 20 20 69 66 20 7b 24 70 6c 61 74 66 6f 72 6d     if {$platform
ff20: 20 65 71 20 5b 6d 61 63 68 69 6e 65 54 6f 50 6c   eq [machineToPl
ff30: 61 74 66 6f 72 6d 20 24 3a 3a 74 63 6c 5f 70 6c  atform $::tcl_pl
ff40: 61 74 66 6f 72 6d 28 6d 61 63 68 69 6e 65 29 5d  atform(machine)]
ff50: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
ff60: 20 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20    return true.. 
ff70: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
ff80: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
ff90: 20 54 68 65 20 73 70 65 63 69 66 69 65 64 20 70   The specified p
ffa0: 6c 61 74 66 6f 72 6d 20 64 6f 65 73 20 6e 6f 74  latform does not
ffb0: 20 6d 61 74 63 68 20 75 70 20 77 69 74 68 20 74   match up with t
ffc0: 68 65 20 70 6c 61 74 66 6f 72 6d 0d 0a 20 20 20  he platform..   
ffd0: 20 20 20 23 20 20 20 20 20 20 20 66 6f 72 20 74     #       for t
ffe0: 68 65 20 63 75 72 72 65 6e 74 20 70 72 6f 63 65  he current proce
fff0: 73 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ss...      #..  
10000 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65      return false
10010 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
10020 70 72 6f 63 20 68 61 76 65 53 51 4c 69 74 65 4f  proc haveSQLiteO
10030 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 20 7b 7d 20  bjectCommand {} 
10040 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
10050 20 20 23 20 4e 4f 54 45 3a 20 49 73 20 74 68 65    # NOTE: Is the
10060 20 5b 6f 62 6a 65 63 74 5d 20 63 6f 6d 6d 61 6e   [object] comman
10070 64 20 63 75 72 72 65 6e 74 6c 79 20 61 76 61 69  d currently avai
10080 6c 61 62 6c 65 3f 0d 0a 20 20 20 20 20 20 23 0d  lable?..      #.
10090 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 65  .      return [e
100a0 78 70 72 20 7b 5b 6c 6c 65 6e 67 74 68 20 5b 69  xpr {[llength [i
100b0 6e 66 6f 20 63 6f 6d 6d 61 6e 64 73 20 6f 62 6a  nfo commands obj
100c0 65 63 74 5d 5d 20 3e 20 30 7d 5d 0d 0a 20 20 20  ect]] > 0}]..   
100d0 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
100e0 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 4f 62  checkForSQLiteOb
100f0 6a 65 63 74 43 6f 6d 6d 61 6e 64 20 7b 20 63 68  jectCommand { ch
10100 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20 20 20  annel } {..     
10110 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
10120 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66  "---- checking f
10130 6f 72 20 5c 22 6f 62 6a 65 63 74 5c 22 20 63 6f  or \"object\" co
10140 6d 6d 61 6e 64 20 75 73 61 67 65 2e 2e 2e 20 22  mmand usage... "
10150 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b  ....      if {![
10160 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
10170 28 73 71 6c 69 74 65 4f 62 6a 65 63 74 43 6f 6d  (sqliteObjectCom
10180 6d 61 6e 64 29 5d 20 26 26 20 5c 0d 0a 20 20 20  mand)] && \..   
10190 20 20 20 20 20 20 20 5b 68 61 76 65 53 51 4c 69         [haveSQLi
101a0 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d  teObjectCommand]
101b0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
101c0 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
101d0 20 79 65 73 5c 6e 0d 0a 20 20 20 20 20 20 7d 20   yes\n..      } 
101e0 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
101f0 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
10200 45 3a 20 55 6e 6c 65 73 73 20 77 65 20 61 72 65  E: Unless we are
10210 20 66 6f 72 62 69 64 64 65 6e 20 66 72 6f 6d 20   forbidden from 
10220 64 6f 69 6e 67 20 73 6f 2c 20 61 64 64 20 73 6f  doing so, add so
10230 6d 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 0d 0a  me constraints..
10240 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
10250 74 68 61 74 20 77 69 6c 6c 20 61 6c 6c 6f 77 20  that will allow 
10260 6d 6f 73 74 20 6f 66 20 74 68 65 20 74 65 73 74  most of the test
10270 20 73 75 69 74 65 20 74 6f 20 72 75 6e 20 28 69   suite to run (i
10280 2e 65 2e 20 74 68 6f 73 65 0d 0a 20 20 20 20 20  .e. those..     
10290 20 20 20 23 20 20 20 20 20 20 20 74 65 73 74 73     #       tests
102a0 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 64 69 72   that do not dir
102b0 65 63 74 6c 79 20 72 65 6c 79 20 75 70 6f 6e 20  ectly rely upon 
102c0 74 68 65 20 5b 6f 62 6a 65 63 74 5d 20 63 6f 6d  the [object] com
102d0 6d 61 6e 64 29 2e 0d 0a 20 20 20 20 20 20 20 20  mand)...        
102e0 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21  #..        if {!
102f0 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
10300 6f 28 73 68 69 6d 53 51 4c 69 74 65 41 73 73 65  o(shimSQLiteAsse
10310 6d 62 6c 79 43 6f 6e 73 74 72 61 69 6e 74 73 29  mblyConstraints)
10320 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
10330 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
10340 6e 74 20 53 51 4c 69 74 65 0d 0a 20 20 20 20 20  nt SQLite..     
10350 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
10360 6e 74 20 53 51 4c 69 74 65 49 6e 74 65 72 6f 70  nt SQLiteInterop
10370 0d 0a 20 20 20 20 20 20 20 20 20 20 61 64 64 43  ..          addC
10380 6f 6e 73 74 72 61 69 6e 74 20 53 79 73 74 65 6d  onstraint System
10390 2e 44 61 74 61 2e 53 51 4c 69 74 65 0d 0a 20 20  .Data.SQLite..  
103a0 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74          addConst
103b0 72 61 69 6e 74 20 53 79 73 74 65 6d 2e 44 61 74  raint System.Dat
103c0 61 2e 53 51 4c 69 74 65 2e 45 6e 63 72 79 70 74  a.SQLite.Encrypt
103d0 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 61  ion..          a
103e0 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 53 79 73  ddConstraint Sys
103f0 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
10400 4c 69 6e 71 0d 0a 0d 0a 20 20 20 20 20 20 20 20  Linq....        
10410 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20    addConstraint 
10420 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
10430 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73               Sys
10440 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
10450 64 6c 6c 5f 76 20 5b 67 65 74 42 75 69 6c 64 43  dll_v [getBuildC
10460 6c 72 56 65 72 73 69 6f 6e 5d 5d 0d 0a 20 20 20  lrVersion]]..   
10470 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
10480 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
10490 73 74 73 20 3a 3a 6e 6f 28 73 68 69 6d 53 51 4c  sts ::no(shimSQL
104a0 69 74 65 44 65 66 69 6e 65 43 6f 6e 73 74 61 6e  iteDefineConstan
104b0 74 43 6f 6e 73 74 72 61 69 6e 74 73 29 5d 7d 20  tConstraints)]} 
104c0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
104d0 20 20 66 6f 72 65 61 63 68 20 64 65 66 69 6e 65    foreach define
104e0 43 6f 6e 73 74 61 6e 74 20 5b 6c 69 73 74 20 5c  Constant [list \
104f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
10500 49 4e 54 45 52 4f 50 5f 45 58 54 45 4e 53 49 4f  INTEROP_EXTENSIO
10510 4e 5f 46 55 4e 43 54 49 4f 4e 53 20 49 4e 54 45  N_FUNCTIONS INTE
10520 52 4f 50 5f 46 54 53 35 5f 45 58 54 45 4e 53 49  ROP_FTS5_EXTENSI
10530 4f 4e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ON \..          
10540 20 20 20 20 49 4e 54 45 52 4f 50 5f 4a 53 4f 4e      INTEROP_JSON
10550 31 5f 45 58 54 45 4e 53 49 4f 4e 20 49 4e 54 45  1_EXTENSION INTE
10560 52 4f 50 5f 50 45 52 43 45 4e 54 49 4c 45 5f 45  ROP_PERCENTILE_E
10570 58 54 45 4e 53 49 4f 4e 20 5c 0d 0a 20 20 20 20  XTENSION \..    
10580 20 20 20 20 20 20 20 20 20 20 49 4e 54 45 52 4f            INTERO
10590 50 5f 52 45 47 45 58 50 5f 45 58 54 45 4e 53 49  P_REGEXP_EXTENSI
105a0 4f 4e 20 49 4e 54 45 52 4f 50 5f 54 45 53 54 5f  ON INTEROP_TEST_
105b0 45 58 54 45 4e 53 49 4f 4e 20 5c 0d 0a 20 20 20  EXTENSION \..   
105c0 20 20 20 20 20 20 20 20 20 20 20 49 4e 54 45 52             INTER
105d0 4f 50 5f 53 45 53 53 49 4f 4e 5f 45 58 54 45 4e  OP_SESSION_EXTEN
105e0 53 49 4f 4e 20 49 4e 54 45 52 4f 50 5f 53 48 41  SION INTEROP_SHA
105f0 31 5f 45 58 54 45 4e 53 49 4f 4e 20 5c 0d 0a 20  1_EXTENSION \.. 
10600 20 20 20 20 20 20 20 20 20 20 20 20 20 49 4e 54               INT
10610 45 52 4f 50 5f 54 4f 54 59 50 45 5f 45 58 54 45  EROP_TOTYPE_EXTE
10620 4e 53 49 4f 4e 20 49 4e 54 45 52 4f 50 5f 56 49  NSION INTEROP_VI
10630 52 54 55 41 4c 5f 54 41 42 4c 45 20 5c 0d 0a 20  RTUAL_TABLE \.. 
10640 20 20 20 20 20 20 20 20 20 20 20 20 20 55 53 45               USE
10650 5f 49 4e 54 45 52 4f 50 5f 44 4c 4c 5d 20 7b 0d  _INTEROP_DLL] {.
10660 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 64 64  .            add
10670 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65  Constraint [appe
10680 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
10690 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 53 51            [getSQ
106a0 4c 69 74 65 44 65 66 69 6e 65 43 6f 6e 73 74 61  LiteDefineConsta
106b0 6e 74 50 72 65 66 69 78 5d 20 24 64 65 66 69 6e  ntPrefix] $defin
106c0 65 43 6f 6e 73 74 61 6e 74 5d 0d 0a 20 20 20 20  eConstant]..    
106d0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
106e0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66   }....        if
106f0 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
10700 3a 3a 6e 6f 28 73 68 69 6d 53 51 4c 69 74 65 56  ::no(shimSQLiteV
10710 69 73 75 61 6c 53 74 75 64 69 6f 43 6f 6e 73 74  isualStudioConst
10720 72 61 69 6e 74 73 29 5d 7d 20 74 68 65 6e 20 7b  raints)]} then {
10730 0d 0a 20 20 20 20 20 20 20 20 20 20 61 64 64 43  ..          addC
10740 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e  onstraint [appen
10750 64 41 72 67 73 20 76 69 73 75 61 6c 53 74 75 64  dArgs visualStud
10760 69 6f 20 5b 67 65 74 42 75 69 6c 64 59 65 61 72  io [getBuildYear
10770 5d 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  ]]..        }...
10780 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
10790 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20  channel no\n..  
107a0 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
107b0 0a 20 20 20 20 70 72 6f 63 20 63 68 61 6e 67 65  .    proc change
107c0 4e 61 74 69 76 65 52 75 6e 74 69 6d 65 4f 70 74  NativeRuntimeOpt
107d0 69 6f 6e 20 7b 20 6e 61 74 69 76 65 20 7d 20 7b  ion { native } {
107e0 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 6c 6c 65  ..      if {[lle
107f0 6e 67 74 68 20 5b 69 6e 66 6f 20 63 6f 6d 6d 61  ngth [info comma
10800 6e 64 73 20 64 65 62 75 67 5d 5d 20 3e 20 30 20  nds debug]] > 0 
10810 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
10820 5b 6c 6c 65 6e 67 74 68 20 5b 69 6e 66 6f 20 73  [llength [info s
10830 75 62 63 6f 6d 6d 61 6e 64 73 20 64 65 62 75 67  ubcommands debug
10840 20 72 75 6e 74 69 6d 65 6f 70 74 69 6f 6e 5d 5d   runtimeoption]]
10850 20 3e 20 30 20 26 26 20 5b 63 61 74 63 68 20 7b   > 0 && [catch {
10860 0d 0a 20 20 20 20 20 20 20 20 64 65 62 75 67 20  ..        debug 
10870 72 75 6e 74 69 6d 65 6f 70 74 69 6f 6e 20 5b 65  runtimeoption [e
10880 78 70 72 20 7b 24 6e 61 74 69 76 65 20 3f 20 22  xpr {$native ? "
10890 61 64 64 22 20 3a 20 22 72 65 6d 6f 76 65 22 7d  add" : "remove"}
108a0 5d 20 6e 61 74 69 76 65 0d 0a 20 20 20 20 20 20  ] native..      
108b0 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  }] == 0} then {.
108c0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
108d0 74 72 75 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  true..      }...
108e0 0a 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65  .      if {[have
108f0 53 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d  SQLiteObjectComm
10900 61 6e 64 5d 20 26 26 20 5b 63 61 74 63 68 20 7b  and] && [catch {
10910 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74  ..        object
10920 20 69 6e 76 6f 6b 65 20 49 6e 74 65 72 70 72 65   invoke Interpre
10930 74 65 72 2e 47 65 74 41 63 74 69 76 65 20 5b 65  ter.GetActive [e
10940 78 70 72 20 7b 24 6e 61 74 69 76 65 20 3f 20 5c  xpr {$native ? \
10950 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 41  ..            "A
10960 64 64 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 22  ddRuntimeOption"
10970 20 3a 20 22 52 65 6d 6f 76 65 52 75 6e 74 69 6d   : "RemoveRuntim
10980 65 4f 70 74 69 6f 6e 22 7d 5d 20 6e 61 74 69 76  eOption"}] nativ
10990 65 0d 0a 20 20 20 20 20 20 7d 5d 20 3d 3d 20 30  e..      }] == 0
109a0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
109b0 20 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20    return true.. 
109c0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
109d0 72 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20  return false..  
109e0 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
109f0 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 42   checkForSQLiteB
10a00 75 69 6c 64 73 20 7b 20 63 68 61 6e 6e 65 6c 20  uilds { channel 
10a10 7b 73 65 6c 65 63 74 20 66 61 6c 73 65 7d 20 7d  {select false} }
10a20 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
10a30 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b     # NOTE: Check
10a40 20 66 6f 72 20 65 76 65 72 79 20 70 6f 73 73 69   for every possi
10a50 62 6c 65 20 76 61 6c 69 64 20 63 6f 6d 62 69 6e  ble valid combin
10a60 61 74 69 6f 6e 20 6f 66 20 76 61 6c 75 65 73 20  ation of values 
10a70 75 73 65 64 20 77 68 65 6e 0d 0a 20 20 20 20 20  used when..     
10a80 20 23 20 20 20 20 20 20 20 6c 6f 63 61 74 69 6e   #       locatin
10a90 67 20 6f 75 74 20 74 68 65 20 62 75 69 6c 64 20  g out the build 
10aa0 6f 75 74 70 75 74 20 64 69 72 65 63 74 6f 72 79  output directory
10ab0 2c 20 73 68 6f 77 69 6e 67 20 65 61 63 68 20 61  , showing each a
10ac0 76 61 69 6c 61 62 6c 65 0d 0a 20 20 20 20 20 20  vailable..      
10ad0 23 20 20 20 20 20 20 20 62 75 69 6c 64 20 76 61  #       build va
10ae0 72 69 61 74 69 6f 6e 20 61 6c 6f 6e 67 20 74 68  riation along th
10af0 65 20 77 61 79 2e 0d 0a 20 20 20 20 20 20 23 0d  e way...      #.
10b00 0a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 6e  .      foreach n
10b10 61 74 69 76 65 20 5b 6c 69 73 74 20 66 61 6c 73  ative [list fals
10b20 65 20 74 72 75 65 5d 20 7b 0d 0a 20 20 20 20 20  e true] {..     
10b30 20 20 20 66 6f 72 65 61 63 68 20 79 65 61 72 20     foreach year 
10b40 5b 67 65 74 42 75 69 6c 64 59 65 61 72 73 5d 20  [getBuildYears] 
10b50 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  {..          for
10b60 65 61 63 68 20 63 6f 6e 66 69 67 75 72 61 74 69  each configurati
10b70 6f 6e 20 5b 67 65 74 42 75 69 6c 64 43 6f 6e 66  on [getBuildConf
10b80 69 67 75 72 61 74 69 6f 6e 73 5d 20 7b 0d 0a 20  igurations] {.. 
10b90 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61             forea
10ba0 63 68 20 73 75 66 66 69 78 20 5b 67 65 74 42 75  ch suffix [getBu
10bb0 69 6c 64 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e  ildConfiguration
10bc0 53 75 66 66 69 78 65 73 5d 20 7b 0d 0a 20 20 20  Suffixes] {..   
10bd0 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61             forea
10be0 63 68 20 65 78 74 72 61 20 5b 67 65 74 42 75 69  ch extra [getBui
10bf0 6c 64 45 78 74 72 61 73 5d 20 7b 0d 0a 20 20 20  ldExtras] {..   
10c00 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a               #..
10c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c20 23 20 4e 4f 54 45 3a 20 46 69 67 75 72 65 20 6f  # NOTE: Figure o
10c30 75 74 20 74 68 65 20 65 66 66 65 63 74 69 76 65  ut the effective
10c40 20 62 75 69 6c 64 20 70 6c 61 74 66 6f 72 6d 2e   build platform.
10c50 20 20 54 68 69 73 20 69 73 0d 0a 20 20 20 20 20    This is..     
10c60 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20             #    
10c70 20 20 20 62 61 73 65 64 20 6f 6e 20 77 68 65 74     based on whet
10c80 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 5b 70 72  her or not a [pr
10c90 69 6d 61 72 69 6c 79 5d 20 6e 61 74 69 76 65 20  imarily] native 
10ca0 62 75 69 6c 64 0d 0a 20 20 20 20 20 20 20 20 20  build..         
10cb0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69         #       i
10cc0 73 20 62 65 69 6e 67 20 75 73 65 64 2e 20 20 46  s being used.  F
10cd0 6f 72 20 5b 70 72 69 6d 61 72 69 6c 79 5d 20 6e  or [primarily] n
10ce0 6f 6e 2d 6e 61 74 69 76 65 20 62 75 69 6c 64 73  on-native builds
10cf0 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
10d00 20 20 20 23 20 20 20 20 20 20 20 74 68 69 73 20     #       this 
10d10 77 69 6c 6c 20 62 65 20 61 6e 20 65 6d 70 74 79  will be an empty
10d20 20 73 74 72 69 6e 67 2e 0d 0a 20 20 20 20 20 20   string...      
10d30 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
10d40 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74               set
10d50 20 70 6c 61 74 66 6f 72 6d 20 5b 67 65 74 42 75   platform [getBu
10d60 69 6c 64 50 6c 61 74 66 6f 72 6d 20 24 6e 61 74  ildPlatform $nat
10d70 69 76 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ive]....        
10d80 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
10d90 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
10da0 45 3a 20 42 75 69 6c 64 20 74 68 65 20 66 75 6c  E: Build the ful
10db0 6c 79 20 71 75 61 6c 69 66 69 65 64 20 64 69 72  ly qualified dir
10dc0 65 63 74 6f 72 79 20 77 68 65 72 65 20 74 68 65  ectory where the
10dd0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
10de0 20 20 23 20 20 20 20 20 20 20 6e 65 63 65 73 73    #       necess
10df0 61 72 79 20 63 6f 6d 70 6f 6e 65 6e 74 73 20 66  ary components f
10e00 6f 72 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  or System.Data.S
10e10 51 4c 69 74 65 20 73 68 6f 75 6c 64 0d 0a 20 20  QLite should..  
10e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
10e30 20 20 20 20 20 20 62 65 20 66 6f 75 6e 64 2e 0d        be found..
10e40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10e50 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
10e60 20 20 20 20 73 65 74 20 64 69 72 65 63 74 6f 72      set director
10e70 79 20 5b 6a 6f 69 6e 42 75 69 6c 64 44 69 72 65  y [joinBuildDire
10e80 63 74 6f 72 79 20 24 6e 61 74 69 76 65 20 5c 0d  ctory $native \.
10e90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10ea0 20 20 20 20 20 5b 67 65 74 42 75 69 6c 64 42 61       [getBuildBa
10eb0 73 65 44 69 72 65 63 74 6f 72 79 5d 20 24 79 65  seDirectory] $ye
10ec0 61 72 20 24 70 6c 61 74 66 6f 72 6d 20 5b 61 70  ar $platform [ap
10ed0 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
10ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ef0 24 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 24  $configuration $
10f00 73 75 66 66 69 78 5d 20 24 65 78 74 72 61 5d 0d  suffix] $extra].
10f10 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
10f20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
10f30 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
10f40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10f50 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65 63 6b       "---- check
10f60 69 6e 67 20 66 6f 72 20 53 79 73 74 65 6d 2e 44  ing for System.D
10f70 61 74 61 2e 53 51 4c 69 74 65 20 62 75 69 6c 64  ata.SQLite build
10f80 20 5c 22 22 20 5b 65 78 70 72 20 5c 0d 0a 20 20   \"" [expr \..  
10f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10fa0 20 20 7b 24 6e 61 74 69 76 65 20 3f 20 22 6e 61    {$native ? "na
10fb0 74 69 76 65 2f 22 20 3a 20 22 22 7d 5d 20 5b 65  tive/" : ""}] [e
10fc0 78 70 72 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e  xpr {[string len
10fd0 67 74 68 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  gth \..         
10fe0 20 20 20 20 20 20 20 20 20 20 20 24 70 6c 61 74             $plat
10ff0 66 6f 72 6d 5d 20 3e 20 30 20 3f 20 5b 61 70 70  form] > 0 ? [app
11000 65 6e 64 41 72 67 73 20 24 70 6c 61 74 66 6f 72  endArgs $platfor
11010 6d 20 2f 5d 20 3a 20 22 22 7d 5d 20 5c 0d 0a 20  m /] : ""}] \.. 
11020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11030 20 20 20 24 79 65 61 72 20 2f 20 5b 61 70 70 65     $year / [appe
11040 6e 64 41 72 67 73 20 24 63 6f 6e 66 69 67 75 72  ndArgs $configur
11050 61 74 69 6f 6e 20 24 73 75 66 66 69 78 5d 20 22  ation $suffix] "
11060 5c 22 2e 2e 2e 20 22 5d 0d 0a 0d 0a 20 20 20 20  \"... "]....    
11070 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
11080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
11090 20 4e 4f 54 45 3a 20 44 6f 20 74 68 65 20 6e 65   NOTE: Do the ne
110a0 63 65 73 73 61 72 79 20 66 69 6c 65 73 20 65 78  cessary files ex
110b0 69 73 74 3f 20 20 43 75 72 72 65 6e 74 6c 79 2c  ist?  Currently,
110c0 20 6e 6f 20 6f 74 68 65 72 0d 0a 20 20 20 20 20   no other..     
110d0 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20             #    
110e0 20 20 20 73 74 65 70 73 20 61 72 65 20 74 61 6b     steps are tak
110f0 65 6e 20 74 6f 20 76 65 72 69 66 79 20 74 68 69  en to verify thi
11100 73 20 62 75 69 6c 64 20 69 73 20 61 63 74 75 61  s build is actua
11110 6c 6c 79 0d 0a 20 20 20 20 20 20 20 20 20 20 20  lly..           
11120 20 20 20 20 20 23 20 20 20 20 20 20 20 76 69 61       #       via
11130 62 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ble...          
11140 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
11150 20 20 20 20 20 20 20 20 20 73 65 74 20 73 6b 69           set ski
11160 70 4e 61 74 69 76 65 20 5b 65 78 70 72 20 7b 5b  pNative [expr {[
11170 69 73 44 6f 74 4e 65 74 43 6f 72 65 5d 20 26 26  isDotNetCore] &&
11180 20 5b 69 73 57 69 6e 64 6f 77 73 5d 7d 5d 0d 0a   [isWindows]}]..
11190 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
111a0 20 20 69 66 20 7b 5b 69 73 42 75 69 6c 64 41 76    if {[isBuildAv
111b0 61 69 6c 61 62 6c 65 20 24 6e 61 74 69 76 65 20  ailable $native 
111c0 24 73 6b 69 70 4e 61 74 69 76 65 20 24 64 69 72  $skipNative $dir
111d0 65 63 74 6f 72 79 5d 7d 20 74 68 65 6e 20 7b 0d  ectory]} then {.
111e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
111f0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
11200 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
11210 57 68 65 6e 20 69 6e 20 22 73 65 6c 65 63 74 22  When in "select"
11220 20 6d 6f 64 65 2c 20 61 75 74 6f 6d 61 74 69 63   mode, automatic
11230 61 6c 6c 79 20 73 65 6c 65 63 74 20 74 68 65 0d  ally select the.
11240 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11250 20 20 20 23 20 20 20 20 20 20 20 66 69 72 73 74     #       first
11260 20 61 76 61 69 6c 61 62 6c 65 20 62 75 69 6c 64   available build
11270 20 6f 66 20 53 79 73 74 65 6d 2e 44 61 74 61 2e   of System.Data.
11280 53 51 4c 69 74 65 20 61 6e 64 0d 0a 20 20 20 20  SQLite and..    
11290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
112a0 20 20 20 20 20 20 74 68 65 6e 20 72 65 74 75 72        then retur
112b0 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0d 0a  n immediately...
112c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
112d0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
112e0 20 20 20 20 20 20 20 69 66 20 7b 24 73 65 6c 65         if {$sele
112f0 63 74 20 26 26 20 5b 6d 61 74 63 68 50 6c 61 74  ct && [matchPlat
11300 66 6f 72 6d 20 24 70 6c 61 74 66 6f 72 6d 5d 7d  form $platform]}
11310 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
11320 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a               #..
11330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11340 20 20 20 20 23 20 4e 4f 54 45 3a 20 4d 61 6e 75      # NOTE: Manu
11350 61 6c 6c 79 20 6f 76 65 72 72 69 64 65 20 61 6c  ally override al
11360 6c 20 74 68 65 20 62 75 69 6c 64 20 64 69 72 65  l the build dire
11370 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 20 20 20  ctory..         
11380 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20             #    
11390 20 20 20 73 65 6c 65 63 74 69 6f 6e 20 72 65 6c     selection rel
113a0 61 74 65 64 20 74 65 73 74 20 73 65 74 74 69 6e  ated test settin
113b0 67 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 0d 0a  gs in order to..
113c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
113d0 20 20 20 20 23 20 20 20 20 20 20 20 66 6f 72 63      #       forc
113e0 65 20 74 68 69 73 20 62 75 69 6c 64 20 6f 66 20  e this build of 
113f0 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
11400 74 65 20 74 6f 20 62 65 0d 0a 20 20 20 20 20 20  te to be..      
11410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
11420 20 20 20 20 20 20 75 73 65 64 2e 0d 0a 20 20 20        used...   
11430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11440 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
11450 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 63 68          if {![ch
11460 61 6e 67 65 4e 61 74 69 76 65 52 75 6e 74 69 6d  angeNativeRuntim
11470 65 4f 70 74 69 6f 6e 20 24 6e 61 74 69 76 65 5d  eOption $native]
11480 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
11490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
114a0 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
114b0 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
114c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
114d0 20 20 20 20 20 20 20 20 22 6e 6f 2c 20 66 61 69          "no, fai
114e0 6c 65 64 20 74 6f 20 22 20 5b 65 78 70 72 20 7b  led to " [expr {
114f0 24 6e 61 74 69 76 65 20 3f 20 22 61 64 64 22 20  $native ? "add" 
11500 3a 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  : \..           
11510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
11520 72 65 6d 6f 76 65 22 7d 5d 20 22 20 74 68 65 20  remove"}] " the 
11530 5c 22 6e 61 74 69 76 65 5c 22 20 72 75 6e 74 69  \"native\" runti
11540 6d 65 20 6f 70 74 69 6f 6e 5c 6e 22 5d 0d 0a 0d  me option\n"]...
11550 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11560 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61         return fa
11570 6c 73 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  lse..           
11580 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
11590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
115a0 20 20 73 65 74 20 3a 3a 74 65 73 74 5f 6e 61 74    set ::test_nat
115b0 69 76 65 20 24 73 6b 69 70 4e 61 74 69 76 65 0d  ive $skipNative.
115c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
115d0 20 20 20 20 20 73 65 74 20 3a 3a 74 65 73 74 5f       set ::test_
115e0 79 65 61 72 20 24 79 65 61 72 0d 0a 0d 0a 20 20  year $year....  
115f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11600 20 20 73 65 74 20 3a 3a 74 65 73 74 5f 6e 61 74    set ::test_nat
11610 69 76 65 5f 79 65 61 72 20 5c 0d 0a 20 20 20 20  ive_year \..    
11620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11630 20 20 20 20 5b 67 65 74 42 75 69 6c 64 4e 61 74      [getBuildNat
11640 69 76 65 59 65 61 72 46 6f 72 44 6f 74 4e 65 74  iveYearForDotNet
11650 43 6f 72 65 20 24 79 65 61 72 5d 0d 0a 0d 0a 20  Core $year].... 
11660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11670 20 20 20 73 65 74 20 3a 3a 74 65 73 74 5f 70 6c     set ::test_pl
11680 61 74 66 6f 72 6d 20 24 70 6c 61 74 66 6f 72 6d  atform $platform
11690 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
116a0 20 20 20 20 20 20 73 65 74 20 3a 3a 74 65 73 74        set ::test
116b0 5f 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 24  _configuration $
116c0 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 0d 0a 20  configuration.. 
116d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
116e0 20 20 20 73 65 74 20 3a 3a 74 65 73 74 5f 63 6f     set ::test_co
116f0 6e 66 69 67 75 72 61 74 69 6f 6e 5f 73 75 66 66  nfiguration_suff
11700 69 78 20 24 73 75 66 66 69 78 0d 0a 0d 0a 20 20  ix $suffix....  
11710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11720 20 20 73 65 74 20 3a 3a 74 65 73 74 5f 6e 61 74    set ::test_nat
11730 69 76 65 5f 63 6f 6e 66 69 67 75 72 61 74 69 6f  ive_configuratio
11740 6e 5f 73 75 66 66 69 78 20 5c 0d 0a 20 20 20 20  n_suffix \..    
11750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11760 20 20 20 20 5b 67 65 74 42 75 69 6c 64 4e 61 74      [getBuildNat
11770 69 76 65 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e  iveConfiguration
11780 53 75 66 66 69 78 46 6f 72 44 6f 74 4e 65 74 43  SuffixForDotNetC
11790 6f 72 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ore \..         
117a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24                 $
117b0 73 75 66 66 69 78 5d 0d 0a 0d 0a 20 20 20 20 20  suffix]....     
117c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
117d0 65 74 20 3a 3a 74 65 73 74 5f 65 78 74 72 61 20  et ::test_extra 
117e0 24 65 78 74 72 61 0d 0a 0d 0a 20 20 20 20 20 20  $extra....      
117f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70                tp
11800 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
11810 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
11820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11830 20 20 20 20 22 79 65 73 2c 20 73 65 6c 65 63 74      "yes, select
11840 65 64 20 28 22 20 5b 65 78 70 72 20 7b 24 6e 61  ed (" [expr {$na
11850 74 69 76 65 20 3f 20 22 6e 61 74 69 76 65 2f 22  tive ? "native/"
11860 20 3a 20 22 22 7d 5d 20 5c 0d 0a 20 20 20 20 20   : ""}] \..     
11870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11880 20 20 20 5b 65 78 70 72 20 7b 5b 73 74 72 69 6e     [expr {[strin
11890 67 20 6c 65 6e 67 74 68 20 24 70 6c 61 74 66 6f  g length $platfo
118a0 72 6d 5d 20 3e 20 30 20 3f 20 5b 61 70 70 65 6e  rm] > 0 ? [appen
118b0 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
118c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
118d0 20 24 70 6c 61 74 66 6f 72 6d 20 2f 5d 20 3a 20   $platform /] : 
118e0 22 22 7d 5d 20 24 79 65 61 72 20 2f 20 5b 61 70  ""}] $year / [ap
118f0 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
11900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11910 20 20 20 20 24 63 6f 6e 66 69 67 75 72 61 74 69      $configurati
11920 6f 6e 20 24 73 75 66 66 69 78 5d 20 5b 65 78 70  on $suffix] [exp
11930 72 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  r {[string lengt
11940 68 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  h \..           
11950 20 20 20 20 20 20 20 20 20 20 20 20 20 24 65 78               $ex
11960 74 72 61 5d 20 3e 20 30 20 3f 20 5b 61 70 70 65  tra] > 0 ? [appe
11970 6e 64 41 72 67 73 20 2f 20 24 65 78 74 72 61 5d  ndArgs / $extra]
11980 20 3a 20 22 22 7d 5d 20 22 29 5c 6e 22 5d 0d 0a   : ""}] ")\n"]..
11990 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
119a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75        return tru
119b0 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e..             
119c0 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
119d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
119e0 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
119f0 6c 20 79 65 73 5c 6e 0d 0a 20 20 20 20 20 20 20  l yes\n..       
11a00 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
11a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 20                } 
11a20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
11a30 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
11a40 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20  $channel no\n.. 
11a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
11a60 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
11a70 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  }..            }
11a80 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
11a90 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
11aa0 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72  }....      retur
11ab0 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20 7d 0d 0a  n false..    }..
11ac0 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 68 65 63  ...    proc chec
11ad0 6b 46 6f 72 53 51 4c 69 74 65 52 65 6c 65 61 73  kForSQLiteReleas
11ae0 65 73 20 7b 20 63 68 61 6e 6e 65 6c 20 7b 73 65  es { channel {se
11af0 6c 65 63 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d  lect false} } {.
11b00 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
11b10 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 66 6f  # NOTE: Check fo
11b20 72 20 70 61 73 74 20 72 65 6c 65 61 73 65 73 20  r past releases 
11b30 6f 66 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  of System.Data.S
11b40 51 4c 69 74 65 20 69 6e 20 74 68 65 20 64 69 72  QLite in the dir
11b50 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 23 20  ectory..      # 
11b60 20 20 20 20 20 20 63 6f 6e 74 61 69 6e 65 64 20        contained 
11b70 69 6e 20 74 68 65 20 22 53 79 73 74 65 6d 2e 44  in the "System.D
11b80 61 74 61 2e 53 51 4c 69 74 65 22 20 65 6e 76 69  ata.SQLite" envi
11b90 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65  ronment variable
11ba0 2c 20 69 66 0d 0a 20 20 20 20 20 20 23 20 20 20  , if..      #   
11bb0 20 20 20 20 70 72 65 73 65 6e 74 2e 0d 0a 20 20      present...  
11bc0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
11bd0 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
11be0 65 6e 76 28 53 79 73 74 65 6d 2e 44 61 74 61 2e  env(System.Data.
11bf0 53 51 4c 69 74 65 29 5d 20 26 26 20 5c 0d 0a 20  SQLite)] && \.. 
11c00 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67           [string
11c10 20 6c 65 6e 67 74 68 20 24 3a 3a 65 6e 76 28 53   length $::env(S
11c20 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
11c30 65 29 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  e)] > 0} then {.
11c40 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
11c50 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c      # NOTE: Buil
11c60 64 20 74 68 65 20 66 75 6c 6c 79 20 71 75 61 6c  d the fully qual
11c70 69 66 69 65 64 20 64 69 72 65 63 74 6f 72 79 20  ified directory 
11c80 77 68 65 72 65 20 74 68 65 20 6e 65 63 65 73 73  where the necess
11c90 61 72 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ary..        #  
11ca0 20 20 20 20 20 63 6f 6d 70 6f 6e 65 6e 74 73 20       components 
11cb0 66 6f 72 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  for System.Data.
11cc0 53 51 4c 69 74 65 20 73 68 6f 75 6c 64 20 62 65  SQLite should be
11cd0 20 66 6f 75 6e 64 2e 0d 0a 20 20 20 20 20 20 20   found...       
11ce0 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   #..        set 
11cf0 64 69 72 65 63 74 6f 72 79 20 5b 66 69 6c 65 20  directory [file 
11d00 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65  nativename [file
11d10 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20   join \..       
11d20 20 20 20 20 20 24 3a 3a 65 6e 76 28 53 79 73 74       $::env(Syst
11d30 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 29 20  em.Data.SQLite) 
11d40 5b 67 65 74 52 65 6c 65 61 73 65 56 65 72 73 69  [getReleaseVersi
11d50 6f 6e 5d 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  on]]]....       
11d60 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
11d70 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
11d80 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
11d90 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 53 79   checking for Sy
11da0 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
11db0 20 72 65 6c 65 61 73 65 20 5c 22 22 20 5c 0d 0a   release \"" \..
11dc0 20 20 20 20 20 20 20 20 20 20 20 20 24 64 69 72              $dir
11dd0 65 63 74 6f 72 79 20 22 5c 22 2e 2e 2e 20 22 5d  ectory "\"... "]
11de0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b  ....        if {
11df0 5b 69 73 52 65 6c 65 61 73 65 41 76 61 69 6c 61  [isReleaseAvaila
11e00 62 6c 65 20 24 64 69 72 65 63 74 6f 72 79 20 70  ble $directory p
11e10 6c 61 74 66 6f 72 6d 5d 7d 20 74 68 65 6e 20 7b  latform]} then {
11e20 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
11e30 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
11e40 70 6c 61 74 66 6f 72 6d 5d 20 3d 3d 20 30 7d 20  platform] == 0} 
11e50 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
11e60 20 20 20 20 73 65 74 20 70 6c 61 74 66 6f 72 6d      set platform
11e70 20 75 6e 6b 6e 6f 77 6e 0d 0a 20 20 20 20 20 20   unknown..      
11e80 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
11e90 20 20 20 69 66 20 7b 24 73 65 6c 65 63 74 20 26     if {$select &
11ea0 26 20 5b 6d 61 74 63 68 50 6c 61 74 66 6f 72 6d  & [matchPlatform
11eb0 20 24 70 6c 61 74 66 6f 72 6d 5d 7d 20 74 68 65   $platform]} the
11ec0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
11ed0 20 73 65 74 20 3a 3a 62 75 69 6c 64 5f 64 69 72   set ::build_dir
11ee0 65 63 74 6f 72 79 20 24 64 69 72 65 63 74 6f 72  ectory $director
11ef0 79 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  y....           
11f00 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
11f10 5b 61 70 70 65 6e 64 41 72 67 73 20 22 79 65 73  [appendArgs "yes
11f20 2c 20 73 65 6c 65 63 74 65 64 20 28 22 20 24 70  , selected (" $p
11f30 6c 61 74 66 6f 72 6d 20 22 29 5c 6e 22 5d 0d 0a  latform ")\n"]..
11f40 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ..            re
11f50 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20  turn true..     
11f60 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
11f70 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
11f80 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
11f90 64 41 72 67 73 20 22 79 65 73 20 28 22 20 24 70  dArgs "yes (" $p
11fa0 6c 61 74 66 6f 72 6d 20 22 29 5c 6e 22 5d 0d 0a  latform ")\n"]..
11fb0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
11fc0 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
11fd0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
11fe0 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 0d 0a  channel no\n....
11ff0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
12000 66 69 6c 65 20 65 78 69 73 74 73 20 24 64 69 72  file exists $dir
12010 65 63 74 6f 72 79 5d 20 7c 7c 20 5c 0d 0a 20 20  ectory] || \..  
12020 20 20 20 20 20 20 20 20 20 20 20 20 21 5b 66 69              ![fi
12030 6c 65 20 69 73 64 69 72 65 63 74 6f 72 79 20 24  le isdirectory $
12040 64 69 72 65 63 74 6f 72 79 5d 7d 20 74 68 65 6e  directory]} then
12050 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
12060 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
12070 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
12080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
12090 2d 2d 2d 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20  --- environment 
120a0 76 61 72 69 61 62 6c 65 20 5c 22 53 79 73 74 65  variable \"Syste
120b0 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 5c 22 20  m.Data.SQLite\" 
120c0 69 73 20 61 6e 20 22 20 5c 0d 0a 20 20 20 20 20  is an " \..     
120d0 20 20 20 20 20 20 20 20 20 20 20 22 69 6e 76 61             "inva
120e0 6c 69 64 20 64 69 72 65 63 74 6f 72 79 2c 20 73  lid directory, s
120f0 6b 69 70 70 69 6e 67 20 63 68 65 63 6b 20 66 6f  kipping check fo
12100 72 20 72 65 6c 65 61 73 65 73 2e 2e 2e 5c 6e 22  r releases...\n"
12110 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ]....           
12120 20 72 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20   return false.. 
12130 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
12140 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
12150 70 61 74 68 20 5b 6c 73 6f 72 74 20 2d 64 65 63  path [lsort -dec
12160 72 65 61 73 69 6e 67 20 5b 66 69 6c 65 20 6c 69  reasing [file li
12170 73 74 20 24 64 69 72 65 63 74 6f 72 79 20 2a 5d  st $directory *]
12180 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ] {..           
12190 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74   if {[file exist
121a0 73 20 24 70 61 74 68 5d 20 26 26 20 5b 66 69 6c  s $path] && [fil
121b0 65 20 69 73 64 69 72 65 63 74 6f 72 79 20 24 70  e isdirectory $p
121c0 61 74 68 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ath]} then {..  
121d0 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
121e0 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
121f0 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
12200 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
12210 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 53  - checking for S
12220 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
12230 65 20 72 65 6c 65 61 73 65 20 5c 22 22 20 5c 0d  e release \"" \.
12240 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12250 20 20 20 24 70 61 74 68 20 22 5c 22 2e 2e 2e 20     $path "\"... 
12260 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  "]....          
12270 20 20 20 20 69 66 20 7b 5b 69 73 52 65 6c 65 61      if {[isRelea
12280 73 65 41 76 61 69 6c 61 62 6c 65 20 24 70 61 74  seAvailable $pat
12290 68 20 70 6c 61 74 66 6f 72 6d 5d 7d 20 74 68 65  h platform]} the
122a0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
122b0 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
122c0 20 6c 65 6e 67 74 68 20 24 70 6c 61 74 66 6f 72   length $platfor
122d0 6d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  m] == 0} then {.
122e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
122f0 20 20 20 73 65 74 20 70 6c 61 74 66 6f 72 6d 20     set platform 
12300 75 6e 6b 6e 6f 77 6e 0d 0a 20 20 20 20 20 20 20  unknown..       
12310 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
12320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
12330 20 7b 24 73 65 6c 65 63 74 20 26 26 20 5b 6d 61   {$select && [ma
12340 74 63 68 50 6c 61 74 66 6f 72 6d 20 24 70 6c 61  tchPlatform $pla
12350 74 66 6f 72 6d 5d 7d 20 74 68 65 6e 20 7b 0d 0a  tform]} then {..
12360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12370 20 20 73 65 74 20 3a 3a 62 75 69 6c 64 5f 64 69    set ::build_di
12380 72 65 63 74 6f 72 79 20 24 70 61 74 68 0d 0a 0d  rectory $path...
12390 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
123a0 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
123b0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 79  l [appendArgs "y
123c0 65 73 2c 20 73 65 6c 65 63 74 65 64 20 28 22 20  es, selected (" 
123d0 24 70 6c 61 74 66 6f 72 6d 20 22 29 5c 6e 22 5d  $platform ")\n"]
123e0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
123f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75        return tru
12400 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e..             
12410 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
12420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
12430 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
12440 70 70 65 6e 64 41 72 67 73 20 22 79 65 73 20 28  ppendArgs "yes (
12450 22 20 24 70 6c 61 74 66 6f 72 6d 20 22 29 5c 6e  " $platform ")\n
12460 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  "]..            
12470 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
12480 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
12490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
124a0 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f  puts $channel no
124b0 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  \n..            
124c0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
124d0 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d   }..          }.
124e0 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
124f0 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
12500 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
12510 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
12520 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d  ..            "-
12530 2d 2d 2d 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20  --- environment 
12540 76 61 72 69 61 62 6c 65 20 5c 22 53 79 73 74 65  variable \"Syste
12550 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 5c 22 20  m.Data.SQLite\" 
12560 69 73 20 6e 6f 74 20 22 20 5c 0d 0a 20 20 20 20  is not " \..    
12570 20 20 20 20 20 20 20 20 22 73 65 74 2c 20 73 6b          "set, sk
12580 69 70 70 69 6e 67 20 63 68 65 63 6b 20 66 6f 72  ipping check for
12590 20 72 65 6c 65 61 73 65 73 2e 2e 2e 5c 6e 22 5d   releases...\n"]
125a0 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
125b0 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 0d     return false.
125c0 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
125d0 72 6f 63 20 63 68 65 63 6b 46 6f 72 53 51 4c 69  roc checkForSQLi
125e0 74 65 4c 69 62 72 61 72 79 20 7b 20 63 68 61 6e  teLibrary { chan
125f0 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74  nel } {..      t
12600 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d  puts $channel "-
12610 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72  --- checking for
12620 20 53 51 4c 69 74 65 20 63 6f 72 65 20 6c 69 62   SQLite core lib
12630 72 61 72 79 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20  rary... "....   
12640 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d     if {[catch {.
12650 0a 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20  .        object 
12660 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e  invoke -flags +N
12670 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20  onPublic \..    
12680 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44          System.D
12690 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74  ata.SQLite.SQLit
126a0 65 33 20 53 51 4c 69 74 65 56 65 72 73 69 6f 6e  e3 SQLiteVersion
126b0 0d 0a 20 20 20 20 20 20 7d 20 76 65 72 73 69 6f  ..      } versio
126c0 6e 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  n] == 0} then {.
126d0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
126e0 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63      # NOTE: Chec
126f0 6b 20 69 66 20 74 68 65 20 72 65 74 75 72 6e 65  k if the returne
12700 64 20 76 65 72 73 69 6f 6e 20 77 61 73 20 6e 75  d version was nu
12710 6c 6c 2e 20 20 49 66 20 73 6f 2c 20 6d 61 6b 65  ll.  If so, make
12720 20 69 74 20 65 61 73 79 0d 0a 20 20 20 20 20 20   it easy..      
12730 20 20 23 20 20 20 20 20 20 20 74 6f 20 73 70 6f    #       to spo
12740 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  t...        #.. 
12750 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69         if {[stri
12760 6e 67 20 6c 65 6e 67 74 68 20 24 76 65 72 73 69  ng length $versi
12770 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  on] == 0} then {
12780 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
12790 76 65 72 73 69 6f 6e 20 6e 75 6c 6c 0d 0a 20 20  version null..  
127a0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
127b0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
127c0 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f  NOTE: Attempt to
127d0 20 71 75 65 72 79 20 74 68 65 20 46 6f 73 73 69   query the Fossi
127e0 6c 20 73 6f 75 72 63 65 20 69 64 65 6e 74 69 66  l source identif
127f0 69 65 72 20 66 6f 72 20 74 68 65 20 53 51 4c 69  ier for the SQLi
12800 74 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  te..        #   
12810 20 20 20 20 63 6f 72 65 20 6c 69 62 72 61 72 79      core library
12820 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
12830 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
12840 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62   {..          ob
12850 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61  ject invoke -fla
12860 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d  gs +NonPublic \.
12870 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53  .              S
12880 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
12890 65 2e 53 51 4c 69 74 65 33 20 53 51 4c 69 74 65  e.SQLite3 SQLite
128a0 53 6f 75 72 63 65 49 64 0d 0a 20 20 20 20 20 20  SourceId..      
128b0 20 20 7d 20 73 6f 75 72 63 65 49 64 5d 7d 20 74    } sourceId]} t
128c0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
128d0 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
128e0 4e 4f 54 45 3a 20 57 65 20 66 61 69 6c 65 64 20  NOTE: We failed 
128f0 74 6f 20 71 75 65 72 79 20 74 68 65 20 46 6f 73  to query the Fos
12900 73 69 6c 20 73 6f 75 72 63 65 20 69 64 65 6e 74  sil source ident
12910 69 66 69 65 72 2e 0d 0a 20 20 20 20 20 20 20 20  ifier...        
12920 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73    #..          s
12930 65 74 20 73 6f 75 72 63 65 49 64 20 75 6e 6b 6e  et sourceId unkn
12940 6f 77 6e 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  own..        }..
12950 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
12960 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65       # NOTE: Che
12970 63 6b 20 69 66 20 74 68 65 20 72 65 74 75 72 6e  ck if the return
12980 65 64 20 46 6f 73 73 69 6c 20 73 6f 75 72 63 65  ed Fossil source
12990 20 69 64 65 6e 74 69 66 69 65 72 20 77 61 73 20   identifier was 
129a0 6e 75 6c 6c 2e 20 20 49 66 0d 0a 20 20 20 20 20  null.  If..     
129b0 20 20 20 23 20 20 20 20 20 20 20 73 6f 2c 20 6d     #       so, m
129c0 61 6b 65 20 69 74 20 65 61 73 79 20 74 6f 20 73  ake it easy to s
129d0 70 6f 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  pot...        #.
129e0 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74  .        if {[st
129f0 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 73 6f 75  ring length $sou
12a00 72 63 65 49 64 5d 20 3d 3d 20 30 7d 20 74 68 65  rceId] == 0} the
12a10 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73  n {..          s
12a20 65 74 20 73 6f 75 72 63 65 49 64 20 6e 75 6c 6c  et sourceId null
12a30 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
12a40 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
12a50 20 20 23 20 4e 4f 54 45 3a 20 59 65 73 2c 20 74    # NOTE: Yes, t
12a60 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20 6c  he SQLite core l
12a70 69 62 72 61 72 79 20 61 70 70 65 61 72 73 20 74  ibrary appears t
12a80 6f 20 62 65 20 61 76 61 69 6c 61 62 6c 65 2e 0d  o be available..
12a90 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
12aa0 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e      addConstrain
12ab0 74 20 53 51 4c 69 74 65 0d 0a 0d 0a 20 20 20 20  t SQLite....    
12ac0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
12ad0 20 4e 4f 54 45 3a 20 52 65 63 6f 72 64 20 76 65   NOTE: Record ve
12ae0 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 53 51 4c  rsion of the SQL
12af0 69 74 65 20 63 6f 72 65 20 6c 69 62 72 61 72 79  ite core library
12b00 20 66 6f 72 20 6c 61 74 65 72 20 75 73 65 0d 0a   for later use..
12b10 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
12b20 62 79 20 74 65 73 74 20 63 6f 6e 73 74 72 61 69  by test constrai
12b30 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20  nt expressions, 
12b40 65 74 63 2e 20 20 49 66 20 74 68 69 73 20 76 61  etc.  If this va
12b50 6c 75 65 20 68 61 73 0d 0a 20 20 20 20 20 20 20  lue has..       
12b60 20 23 20 20 20 20 20 20 20 61 6c 72 65 61 64 79   #       already
12b70 20 62 65 65 6e 20 73 65 74 20 28 6f 72 20 6f 76   been set (or ov
12b80 65 72 72 69 64 64 65 6e 29 2c 20 73 6b 69 70 20  erridden), skip 
12b90 73 65 74 74 69 6e 67 20 69 74 2e 0d 0a 20 20 20  setting it...   
12ba0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
12bb0 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
12bc0 73 20 3a 3a 63 6f 72 65 5f 6c 69 62 72 61 72 79  s ::core_library
12bd0 5f 76 65 72 73 69 6f 6e 5d 7d 20 74 68 65 6e 20  _version]} then 
12be0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  {..          set
12bf0 20 3a 3a 63 6f 72 65 5f 6c 69 62 72 61 72 79 5f   ::core_library_
12c00 76 65 72 73 69 6f 6e 20 24 76 65 72 73 69 6f 6e  version $version
12c10 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
12c20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
12c30 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
12c40 73 20 22 79 65 73 20 28 22 20 24 76 65 72 73 69  s "yes (" $versi
12c50 6f 6e 20 22 20 22 20 24 73 6f 75 72 63 65 49 64  on " " $sourceId
12c60 20 22 29 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 7d   ")\n"]..      }
12c70 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
12c80 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
12c90 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  no\n..      }.. 
12ca0 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
12cb0 63 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65  c checkForSQLite
12cc0 49 6e 74 65 72 6f 70 20 7b 20 63 68 61 6e 6e 65  Interop { channe
12cd0 6c 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74 70 75  l } {..      tpu
12ce0 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d  ts $channel "---
12cf0 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 53  - checking for S
12d00 51 4c 69 74 65 20 69 6e 74 65 72 6f 70 20 61 73  QLite interop as
12d10 73 65 6d 62 6c 79 2e 2e 2e 20 22 0d 0a 0d 0a 20  sembly... ".... 
12d20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
12d30 7b 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a 65 63  {..        objec
12d40 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20  t invoke -flags 
12d50 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20  +NonPublic \..  
12d60 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d            System
12d70 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c  .Data.SQLite.SQL
12d80 69 74 65 33 20 49 6e 74 65 72 6f 70 56 65 72 73  ite3 InteropVers
12d90 69 6f 6e 0d 0a 20 20 20 20 20 20 7d 20 76 65 72  ion..      } ver
12da0 73 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  sion] == 0} then
12db0 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
12dc0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43         # NOTE: C
12dd0 68 65 63 6b 20 69 66 20 74 68 65 20 72 65 74 75  heck if the retu
12de0 72 6e 65 64 20 76 65 72 73 69 6f 6e 20 77 61 73  rned version was
12df0 20 6e 75 6c 6c 2e 20 20 49 66 20 73 6f 2c 20 6d   null.  If so, m
12e00 61 6b 65 20 69 74 20 65 61 73 79 0d 0a 20 20 20  ake it easy..   
12e10 20 20 20 20 20 23 20 20 20 20 20 20 20 74 6f 20       #       to 
12e20 73 70 6f 74 2e 0d 0a 20 20 20 20 20 20 20 20 23  spot...        #
12e30 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73  ..        if {[s
12e40 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 65  tring length $ve
12e50 72 73 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65  rsion] == 0} the
12e60 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73  n {..          s
12e70 65 74 20 76 65 72 73 69 6f 6e 20 6e 75 6c 6c 0d  et version null.
12e80 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
12e90 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
12ea0 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74   # NOTE: Attempt
12eb0 20 74 6f 20 71 75 65 72 79 20 74 68 65 20 46 6f   to query the Fo
12ec0 73 73 69 6c 20 73 6f 75 72 63 65 20 69 64 65 6e  ssil source iden
12ed0 74 69 66 69 65 72 20 66 6f 72 20 74 68 65 20 53  tifier for the S
12ee0 51 4c 69 74 65 0d 0a 20 20 20 20 20 20 20 20 23  QLite..        #
12ef0 20 20 20 20 20 20 20 63 6f 72 65 20 6c 69 62 72         core libr
12f00 61 72 79 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ary...        #.
12f10 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61  .        if {[ca
12f20 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
12f30 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d   object invoke -
12f40 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63  flags +NonPublic
12f50 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
12f60 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51    System.Data.SQ
12f70 4c 69 74 65 2e 53 51 4c 69 74 65 33 20 49 6e 74  Lite.SQLite3 Int
12f80 65 72 6f 70 53 6f 75 72 63 65 49 64 0d 0a 20 20  eropSourceId..  
12f90 20 20 20 20 20 20 7d 20 73 6f 75 72 63 65 49 64        } sourceId
12fa0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
12fb0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
12fc0 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 66 61 69    # NOTE: We fai
12fd0 6c 65 64 20 74 6f 20 71 75 65 72 79 20 74 68 65  led to query the
12fe0 20 46 6f 73 73 69 6c 20 73 6f 75 72 63 65 20 69   Fossil source i
12ff0 64 65 6e 74 69 66 69 65 72 2e 0d 0a 20 20 20 20  dentifier...    
13000 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
13010 20 20 20 73 65 74 20 73 6f 75 72 63 65 49 64 20     set sourceId 
13020 75 6e 6b 6e 6f 77 6e 0d 0a 20 20 20 20 20 20 20  unknown..       
13030 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d   }....        #.
13040 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
13050 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 72 65   Check if the re
13060 74 75 72 6e 65 64 20 46 6f 73 73 69 6c 20 73 6f  turned Fossil so
13070 75 72 63 65 20 69 64 65 6e 74 69 66 69 65 72 20  urce identifier 
13080 77 61 73 20 6e 75 6c 6c 2e 20 20 49 66 0d 0a 20  was null.  If.. 
13090 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73         #       s
130a0 6f 2c 20 6d 61 6b 65 20 69 74 20 65 61 73 79 20  o, make it easy 
130b0 74 6f 20 73 70 6f 74 2e 0d 0a 20 20 20 20 20 20  to spot...      
130c0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20    #..        if 
130d0 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
130e0 24 73 6f 75 72 63 65 49 64 5d 20 3d 3d 20 30 7d  $sourceId] == 0}
130f0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
13100 20 20 20 73 65 74 20 73 6f 75 72 63 65 49 64 20     set sourceId 
13110 6e 75 6c 6c 0d 0a 20 20 20 20 20 20 20 20 7d 0d  null..        }.
13120 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
13130 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 65        # NOTE: Be
13140 66 6f 72 65 20 61 63 74 75 61 6c 6c 79 20 61 64  fore actually ad
13150 64 69 6e 67 20 74 68 65 20 74 65 73 74 20 63 6f  ding the test co
13160 6e 73 74 72 61 69 6e 74 2c 20 6d 61 6b 65 20 73  nstraint, make s
13170 75 72 65 20 74 68 65 0d 0a 20 20 20 20 20 20 20  ure the..       
13180 20 23 20 20 20 20 20 20 20 76 65 72 73 69 6f 6e   #       version
13190 20 69 73 20 76 61 6c 69 64 20 28 69 2e 65 2e 20   is valid (i.e. 
131a0 6e 6f 74 20 6a 75 73 74 20 74 68 61 74 20 77 65  not just that we
131b0 20 63 6f 75 6c 64 20 71 75 65 72 79 20 69 74 29   could query it)
131c0 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
131d0 20 20 20 20 20 20 69 66 20 7b 24 76 65 72 73 69        if {$versi
131e0 6f 6e 20 6e 65 20 22 6e 75 6c 6c 22 7d 20 74 68  on ne "null"} th
131f0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
13200 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e  #..          # N
13210 4f 54 45 3a 20 59 65 73 2c 20 74 68 65 20 53 51  OTE: Yes, the SQ
13220 4c 69 74 65 20 69 6e 74 65 72 6f 70 20 61 73 73  Lite interop ass
13230 65 6d 62 6c 79 20 61 70 70 65 61 72 73 20 74 6f  embly appears to
13240 20 62 65 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0a   be available...
13250 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
13260 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72         addConstr
13270 61 69 6e 74 20 53 51 4c 69 74 65 49 6e 74 65 72  aint SQLiteInter
13280 6f 70 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  op....          
13290 73 65 74 20 61 6e 73 77 65 72 20 79 65 73 0d 0a  set answer yes..
132a0 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
132b0 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
132c0 61 6e 73 77 65 72 20 6e 6f 0d 0a 20 20 20 20 20  answer no..     
132d0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
132e0 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
132f0 61 70 70 65 6e 64 41 72 67 73 20 24 61 6e 73 77  appendArgs $answ
13300 65 72 20 22 20 28 22 20 24 76 65 72 73 69 6f 6e  er " (" $version
13310 20 22 20 22 20 24 73 6f 75 72 63 65 49 64 20 22   " " $sourceId "
13320 29 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 7d 20 65  )\n"]..      } e
13330 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74  lse {..        t
13340 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f  puts $channel no
13350 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  \n..      }..   
13360 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
13370 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 44 65  checkForSQLiteDe
13380 66 69 6e 65 43 6f 6e 73 74 61 6e 74 20 7b 20 63  fineConstant { c
13390 68 61 6e 6e 65 6c 20 6e 61 6d 65 20 7d 20 7b 0d  hannel name } {.
133a0 0a 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68  .      tputs $ch
133b0 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
133c0 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 22  s \..          "
133d0 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f  ---- checking fo
133e0 72 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  r System.Data.SQ
133f0 4c 69 74 65 20 64 65 66 69 6e 65 20 63 6f 6e 73  Lite define cons
13400 74 61 6e 74 20 5c 22 22 20 24 6e 61 6d 65 20 5c  tant \"" $name \
13410 0d 0a 20 20 20 20 20 20 20 20 20 20 22 5c 22 2e  ..          "\".
13420 2e 2e 20 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 69  .. "]....      i
13430 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  f {[catch {..   
13440 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f       object invo
13450 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75  ke -flags +NonPu
13460 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20  blic \..        
13470 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e      System.Data.
13480 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 33 20 44  SQLite.SQLite3 D
13490 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 73 0d 0a  efineConstants..
134a0 20 20 20 20 20 20 7d 20 64 65 66 69 6e 65 43 6f        } defineCo
134b0 6e 73 74 61 6e 74 73 5d 20 3d 3d 20 30 7d 20 74  nstants] == 0} t
134c0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69  hen {..        i
134d0 66 20 7b 5b 6c 73 65 61 72 63 68 20 2d 65 78 61  f {[lsearch -exa
134e0 63 74 20 2d 6e 6f 63 61 73 65 20 24 64 65 66 69  ct -nocase $defi
134f0 6e 65 43 6f 6e 73 74 61 6e 74 73 20 24 6e 61 6d  neConstants $nam
13500 65 5d 20 21 3d 20 2d 31 7d 20 74 68 65 6e 20 7b  e] != -1} then {
13510 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
13520 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
13530 20 59 65 73 2c 20 74 68 69 73 20 64 65 66 69 6e   Yes, this defin
13540 65 20 63 6f 6e 73 74 61 6e 74 20 77 61 73 20 65  e constant was e
13550 6e 61 62 6c 65 64 20 77 68 65 6e 20 74 68 65 20  nabled when the 
13560 6d 61 6e 61 67 65 64 0d 0a 20 20 20 20 20 20 20  managed..       
13570 20 20 20 23 20 20 20 20 20 20 20 61 73 73 65 6d     #       assem
13580 62 6c 79 20 77 61 73 20 63 6f 6d 70 69 6c 65 64  bly was compiled
13590 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
135a0 20 20 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e            addCon
135b0 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41  straint [appendA
135c0 72 67 73 20 5b 67 65 74 53 51 4c 69 74 65 44 65  rgs [getSQLiteDe
135d0 66 69 6e 65 43 6f 6e 73 74 61 6e 74 50 72 65 66  fineConstantPref
135e0 69 78 5d 20 24 6e 61 6d 65 5d 0d 0a 0d 0a 20 20  ix] $name]....  
135f0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
13600 68 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20 20  hannel yes\n..  
13610 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
13620 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
13630 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20  $channel no\n.. 
13640 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
13650 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
13660 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
13670 20 65 72 72 6f 72 5c 6e 0d 0a 20 20 20 20 20 20   error\n..      
13680 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
13690 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72 53 51   proc checkForSQ
136a0 4c 69 74 65 43 6f 6d 70 69 6c 65 4f 70 74 69 6f  LiteCompileOptio
136b0 6e 20 7b 20 63 68 61 6e 6e 65 6c 20 6e 61 6d 65  n { channel name
136c0 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74 70 75 74   } {..      tput
136d0 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
136e0 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
136f0 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69      "---- checki
13700 6e 67 20 66 6f 72 20 53 51 4c 69 74 65 20 69 6e  ng for SQLite in
13710 74 65 72 6f 70 20 61 73 73 65 6d 62 6c 79 20 63  terop assembly c
13720 6f 6d 70 69 6c 65 20 6f 70 74 69 6f 6e 20 5c 22  ompile option \"
13730 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 24  " \..          $
13740 6e 61 6d 65 20 22 5c 22 2e 2e 2e 20 22 5d 0d 0a  name "\"... "]..
13750 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74  ..      if {[cat
13760 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 6f 62  ch {..        ob
13770 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61  ject invoke -fla
13780 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d  gs +NonPublic \.
13790 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73  .            Sys
137a0 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
137b0 53 51 4c 69 74 65 33 20 49 6e 74 65 72 6f 70 43  SQLite3 InteropC
137c0 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 73 0d 0a 20  ompileOptions.. 
137d0 20 20 20 20 20 7d 20 63 6f 6d 70 69 6c 65 4f 70       } compileOp
137e0 74 69 6f 6e 73 5d 20 3d 3d 20 30 7d 20 74 68 65  tions] == 0} the
137f0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20  n {..        if 
13800 7b 5b 6c 73 65 61 72 63 68 20 2d 65 78 61 63 74  {[lsearch -exact
13810 20 2d 6e 6f 63 61 73 65 20 24 63 6f 6d 70 69 6c   -nocase $compil
13820 65 4f 70 74 69 6f 6e 73 20 24 6e 61 6d 65 5d 20  eOptions $name] 
13830 21 3d 20 2d 31 7d 20 74 68 65 6e 20 7b 0d 0a 20  != -1} then {.. 
13840 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
13850 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 59 65        # NOTE: Ye
13860 73 2c 20 74 68 69 73 20 63 6f 6d 70 69 6c 65 20  s, this compile 
13870 6f 70 74 69 6f 6e 20 77 61 73 20 65 6e 61 62 6c  option was enabl
13880 65 64 20 77 68 65 6e 20 74 68 65 20 69 6e 74 65  ed when the inte
13890 72 6f 70 0d 0a 20 20 20 20 20 20 20 20 20 20 23  rop..          #
138a0 20 20 20 20 20 20 20 61 73 73 65 6d 62 6c 79 20         assembly 
138b0 77 61 73 20 63 6f 6d 70 69 6c 65 64 2e 0d 0a 20  was compiled... 
138c0 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
138d0 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61        addConstra
138e0 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20  int [appendArgs 
138f0 5b 67 65 74 53 51 4c 69 74 65 43 6f 6d 70 69 6c  [getSQLiteCompil
13900 65 4f 70 74 69 6f 6e 50 72 65 66 69 78 5d 20 24  eOptionPrefix] $
13910 6e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  name]....       
13920 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
13930 6c 20 79 65 73 5c 6e 0d 0a 20 20 20 20 20 20 20  l yes\n..       
13940 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
13950 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
13960 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20  nel no\n..      
13970 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73    }..      } els
13980 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75  e {..        tpu
13990 74 73 20 24 63 68 61 6e 6e 65 6c 20 65 72 72 6f  ts $channel erro
139a0 72 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  r\n..      }....
139b0 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
139c0 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
139d0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 22 2d   \..          "-
139e0 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72  --- checking for
139f0 20 53 51 4c 69 74 65 20 63 6f 72 65 20 6c 69 62   SQLite core lib
13a00 72 61 72 79 20 63 6f 6d 70 69 6c 65 20 6f 70 74  rary compile opt
13a10 69 6f 6e 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20  ion \"" \..     
13a20 20 20 20 20 20 24 6e 61 6d 65 20 22 5c 22 2e 2e       $name "\"..
13a30 2e 20 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66  . "]....      if
13a40 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
13a50 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b      object invok
13a60 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62  e -flags +NonPub
13a70 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  lic \..         
13a80 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53     System.Data.S
13a90 51 4c 69 74 65 2e 53 51 4c 69 74 65 33 20 53 51  QLite.SQLite3 SQ
13aa0 4c 69 74 65 43 6f 6d 70 69 6c 65 4f 70 74 69 6f  LiteCompileOptio
13ab0 6e 73 0d 0a 20 20 20 20 20 20 7d 20 63 6f 6d 70  ns..      } comp
13ac0 69 6c 65 4f 70 74 69 6f 6e 73 5d 20 3d 3d 20 30  ileOptions] == 0
13ad0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
13ae0 20 20 69 66 20 7b 5b 6c 73 65 61 72 63 68 20 2d    if {[lsearch -
13af0 65 78 61 63 74 20 2d 6e 6f 63 61 73 65 20 24 63  exact -nocase $c
13b00 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 73 20 24 6e  ompileOptions $n
13b10 61 6d 65 5d 20 21 3d 20 2d 31 7d 20 74 68 65 6e  ame] != -1} then
13b20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d   {..          #.
13b30 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
13b40 45 3a 20 59 65 73 2c 20 74 68 69 73 20 63 6f 6d  E: Yes, this com
13b50 70 69 6c 65 20 6f 70 74 69 6f 6e 20 77 61 73 20  pile option was 
13b60 65 6e 61 62 6c 65 64 20 77 68 65 6e 20 74 68 65  enabled when the
13b70 20 53 51 4c 69 74 65 0d 0a 20 20 20 20 20 20 20   SQLite..       
13b80 20 20 20 23 20 20 20 20 20 20 20 63 6f 72 65 20     #       core 
13b90 6c 69 62 72 61 72 79 20 77 61 73 20 63 6f 6d 70  library was comp
13ba0 69 6c 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 20  iled...         
13bb0 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 61 64   #..          ad
13bc0 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70  dConstraint [app
13bd0 65 6e 64 41 72 67 73 20 5b 67 65 74 53 51 4c 69  endArgs [getSQLi
13be0 74 65 43 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 50  teCompileOptionP
13bf0 72 65 66 69 78 5d 20 24 6e 61 6d 65 5d 0d 0a 0d  refix] $name]...
13c00 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
13c10 20 24 63 68 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d   $channel yes\n.
13c20 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20  .        } else 
13c30 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75  {..          tpu
13c40 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e  ts $channel no\n
13c50 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
13c60 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
13c70 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
13c80 6e 65 6c 20 65 72 72 6f 72 5c 6e 0d 0a 20 20 20  nel error\n..   
13c90 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
13ca0 20 20 20 20 70 72 6f 63 20 67 65 74 44 61 74 65      proc getDate
13cb0 54 69 6d 65 46 6f 72 6d 61 74 20 7b 20 7b 74 69  TimeFormat { {ti
13cc0 6d 65 5a 6f 6e 65 20 74 72 75 65 7d 20 7d 20 7b  meZone true} } {
13cd0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
13ce0 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 70 72   # NOTE: This pr
13cf0 6f 63 65 64 75 72 65 20 73 69 6d 70 6c 79 20 72  ocedure simply r
13d00 65 74 75 72 6e 73 20 74 68 65 20 22 64 65 66 61  eturns the "defa
13d10 75 6c 74 22 20 44 61 74 65 54 69 6d 65 20 66 6f  ult" DateTime fo
13d20 72 6d 61 74 20 75 73 65 64 0d 0a 20 20 20 20 20  rmat used..     
13d30 20 23 20 20 20 20 20 20 20 62 79 20 74 68 65 20   #       by the 
13d40 74 65 73 74 20 73 75 69 74 65 2e 0d 0a 20 20 20  test suite...   
13d50 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
13d60 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 64  [info exists ::d
13d70 61 74 65 74 69 6d 65 5f 66 6f 72 6d 61 74 5d 20  atetime_format] 
13d80 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
13d90 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
13da0 3a 3a 64 61 74 65 74 69 6d 65 5f 66 6f 72 6d 61  ::datetime_forma
13db0 74 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  t] > 0} then {..
13dc0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
13dd0 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 74 75 72     # NOTE: Retur
13de0 6e 20 74 68 65 20 6d 61 6e 75 61 6c 6c 79 20 6f  n the manually o
13df0 76 65 72 72 69 64 64 65 6e 20 76 61 6c 75 65 20  verridden value 
13e00 66 6f 72 20 74 68 65 20 44 61 74 65 54 69 6d 65  for the DateTime
13e10 20 66 6f 72 6d 61 74 2e 0d 0a 20 20 20 20 20 20   format...      
13e20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
13e30 75 72 6e 20 24 3a 3a 64 61 74 65 74 69 6d 65 5f  urn $::datetime_
13e40 66 6f 72 6d 61 74 0d 0a 20 20 20 20 20 20 7d 20  format..      } 
13e50 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
13e60 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
13e70 45 3a 20 52 65 74 75 72 6e 20 61 6e 20 49 53 4f  E: Return an ISO
13e80 38 36 30 31 20 44 61 74 65 54 69 6d 65 20 66 6f  8601 DateTime fo
13e90 72 6d 61 74 20 63 6f 6d 70 61 74 69 62 6c 65 20  rmat compatible 
13ea0 77 69 74 68 20 53 51 4c 69 74 65 2c 0d 0a 20 20  with SQLite,..  
13eb0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 53 79        #       Sy
13ec0 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
13ed0 2c 20 61 6e 64 20 73 75 69 74 61 62 6c 65 20 66  , and suitable f
13ee0 6f 72 20 72 6f 75 6e 64 2d 74 72 69 70 70 69 6e  or round-trippin
13ef0 67 20 77 69 74 68 20 74 68 65 0d 0a 20 20 20 20  g with the..    
13f00 20 20 20 20 23 20 20 20 20 20 20 20 44 61 74 65      #       Date
13f10 54 69 6d 65 20 63 6c 61 73 73 20 6f 66 20 74 68  Time class of th
13f20 65 20 66 72 61 6d 65 77 6f 72 6b 2e 20 20 49 66  e framework.  If
13f30 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 20 63   this value is c
13f40 68 61 6e 67 65 64 2c 0d 0a 20 20 20 20 20 20 20  hanged,..       
13f50 20 23 20 20 20 20 20 20 20 76 61 72 69 6f 75 73   #       various
13f60 20 74 65 73 74 73 20 6d 61 79 20 66 61 69 6c 2e   tests may fail.
13f70 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
13f80 20 20 20 20 20 72 65 74 75 72 6e 20 5b 61 70 70       return [app
13f90 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
13fa0 20 20 20 20 20 20 20 22 79 79 79 79 2d 4d 4d 2d         "yyyy-MM-
13fb0 64 64 20 48 48 3a 6d 6d 3a 73 73 2e 46 46 46 46  dd HH:mm:ss.FFFF
13fc0 46 46 46 22 20 5b 65 78 70 72 20 7b 24 74 69 6d  FFF" [expr {$tim
13fd0 65 5a 6f 6e 65 20 3f 20 22 4b 22 20 3a 20 22 22  eZone ? "K" : ""
13fe0 7d 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  }]]..      }..  
13ff0 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
14000 20 67 65 74 44 61 74 65 54 69 6d 65 54 69 63 6b   getDateTimeTick
14010 73 20 7b 20 76 61 6c 75 65 20 7b 6c 6f 63 61 6c  s { value {local
14020 20 22 22 7d 20 7b 64 65 66 61 75 6c 74 20 22 22   ""} {default ""
14030 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66 20  } } {..      if 
14040 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
14050 24 76 61 6c 75 65 5d 20 3d 3d 20 30 7d 20 74 68  $value] == 0} th
14060 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65  en {..        re
14070 74 75 72 6e 20 24 64 65 66 61 75 6c 74 0d 0a 20  turn $default.. 
14080 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
14090 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20  if {[catch {..  
140a0 20 20 20 20 20 20 73 65 74 20 64 61 74 65 54 69        set dateTi
140b0 6d 65 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b  me [object invok
140c0 65 20 2d 63 72 65 61 74 65 20 5c 0d 0a 20 20 20  e -create \..   
140d0 20 20 20 20 20 20 20 20 20 2d 70 61 72 61 6d 65           -parame
140e0 74 65 72 74 79 70 65 73 20 5b 6c 69 73 74 20 53  tertypes [list S
140f0 74 72 69 6e 67 20 53 74 72 69 6e 67 20 49 46 6f  tring String IFo
14100 72 6d 61 74 50 72 6f 76 69 64 65 72 20 5c 0d 0a  rmatProvider \..
14110 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74              Syst
14120 65 6d 2e 47 6c 6f 62 61 6c 69 7a 61 74 69 6f 6e  em.Globalization
14130 2e 44 61 74 65 54 69 6d 65 53 74 79 6c 65 73 5d  .DateTimeStyles]
14140 20 44 61 74 65 54 69 6d 65 20 50 61 72 73 65 45   DateTime ParseE
14150 78 61 63 74 20 5c 0d 0a 20 20 20 20 20 20 20 20  xact \..        
14160 20 20 20 20 24 76 61 6c 75 65 20 5b 67 65 74 44      $value [getD
14170 61 74 65 54 69 6d 65 46 6f 72 6d 61 74 5d 20 6e  ateTimeFormat] n
14180 75 6c 6c 20 41 64 6a 75 73 74 54 6f 55 6e 69 76  ull AdjustToUniv
14190 65 72 73 61 6c 5d 0d 0a 20 20 20 20 20 20 7d 5d  ersal]..      }]
141a0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
141b0 20 20 72 65 74 75 72 6e 20 24 64 65 66 61 75 6c    return $defaul
141c0 74 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  t..      }....  
141d0 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
141e0 69 73 20 62 6f 6f 6c 65 61 6e 20 2d 73 74 72 69  is boolean -stri
141f0 63 74 20 24 6c 6f 63 61 6c 5d 7d 20 74 68 65 6e  ct $local]} then
14200 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   {..        set 
14210 64 61 74 65 54 69 6d 65 20 5b 6f 62 6a 65 63 74  dateTime [object
14220 20 69 6e 76 6f 6b 65 20 2d 63 72 65 61 74 65 20   invoke -create 
14230 44 61 74 65 54 69 6d 65 20 53 70 65 63 69 66 79  DateTime Specify
14240 4b 69 6e 64 20 5c 0d 0a 20 20 20 20 20 20 20 20  Kind \..        
14250 20 20 20 20 24 64 61 74 65 54 69 6d 65 20 55 74      $dateTime Ut
14260 63 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  c]..      } else
14270 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   {..        retu
14280 72 6e 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b  rn [object invok
14290 65 20 24 64 61 74 65 54 69 6d 65 20 54 69 63 6b  e $dateTime Tick
142a0 73 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  s]..      }.... 
142b0 20 20 20 20 20 69 66 20 7b 24 6c 6f 63 61 6c 7d       if {$local}
142c0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
142d0 20 72 65 74 75 72 6e 20 5b 6f 62 6a 65 63 74 20   return [object 
142e0 69 6e 76 6f 6b 65 20 24 64 61 74 65 54 69 6d 65  invoke $dateTime
142f0 20 54 6f 4c 6f 63 61 6c 54 69 6d 65 2e 54 69 63   ToLocalTime.Tic
14300 6b 73 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  ks]..      } els
14310 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74  e {..        ret
14320 75 72 6e 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f  urn [object invo
14330 6b 65 20 24 64 61 74 65 54 69 6d 65 20 54 6f 55  ke $dateTime ToU
14340 6e 69 76 65 72 73 61 6c 54 69 6d 65 2e 54 69 63  niversalTime.Tic
14350 6b 73 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  ks]..      }..  
14360 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
14370 20 67 65 74 50 72 6f 70 65 72 74 69 65 73 20 7b   getProperties {
14380 20 6f 62 6a 65 63 74 20 76 61 72 4e 61 6d 65 20   object varName 
14390 7d 20 7b 0d 0a 20 20 20 20 20 20 75 70 76 61 72  } {..      upvar
143a0 20 31 20 24 76 61 72 4e 61 6d 65 20 70 72 6f 70   1 $varName prop
143b0 65 72 74 69 65 73 0d 0a 0d 0a 20 20 20 20 20 20  erties....      
143c0 73 65 74 20 63 6f 75 6e 74 20 30 0d 0a 20 20 20  set count 0..   
143d0 20 20 20 73 65 74 20 6e 61 6d 65 73 20 5b 6c 69     set names [li
143e0 73 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20  st]....      if 
143f0 7b 5b 69 73 4f 62 6a 65 63 74 48 61 6e 64 6c 65  {[isObjectHandle
14400 20 24 6f 62 6a 65 63 74 5d 20 26 26 20 24 6f 62   $object] && $ob
14410 6a 65 63 74 20 6e 65 20 22 6e 75 6c 6c 22 7d 20  ject ne "null"} 
14420 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
14430 65 76 61 6c 20 6c 61 70 70 65 6e 64 20 6e 61 6d  eval lappend nam
14440 65 73 20 5b 6f 62 6a 65 63 74 20 6d 65 6d 62 65  es [object membe
14450 72 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  rs \..          
14460 20 20 2d 6d 65 6d 62 65 72 74 79 70 65 73 20 50    -membertypes P
14470 72 6f 70 65 72 74 79 20 2d 6e 61 6d 65 6f 6e 6c  roperty -nameonl
14480 79 20 24 6f 62 6a 65 63 74 5d 0d 0a 0d 0a 20 20  y $object]....  
14490 20 20 20 20 20 20 65 76 61 6c 20 6c 61 70 70 65        eval lappe
144a0 6e 64 20 6e 61 6d 65 73 20 5b 6f 62 6a 65 63 74  nd names [object
144b0 20 6d 65 6d 62 65 72 73 20 5c 0d 0a 20 20 20 20   members \..    
144c0 20 20 20 20 20 20 20 20 2d 6d 65 6d 62 65 72 74          -membert
144d0 79 70 65 73 20 46 69 65 6c 64 20 2d 6e 61 6d 65  ypes Field -name
144e0 6f 6e 6c 79 20 24 6f 62 6a 65 63 74 5d 0d 0a 20  only $object].. 
144f0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
14500 66 6f 72 65 61 63 68 20 6e 61 6d 65 20 24 6e 61  foreach name $na
14510 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 69  mes {..        i
14520 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  f {[catch {..   
14530 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e         object in
14540 76 6f 6b 65 20 2d 6f 62 6a 65 63 74 66 6c 61 67  voke -objectflag
14550 73 20 2b 4e 6f 44 69 73 70 6f 73 65 20 24 6f 62  s +NoDispose $ob
14560 6a 65 63 74 20 24 6e 61 6d 65 0d 0a 20 20 20 20  ject $name..    
14570 20 20 20 20 7d 20 76 61 6c 75 65 5d 20 3d 3d 20      } value] == 
14580 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
14590 20 20 20 20 20 69 66 20 7b 5b 69 73 4f 62 6a 65       if {[isObje
145a0 63 74 48 61 6e 64 6c 65 20 24 76 61 6c 75 65 5d  ctHandle $value]
145b0 20 26 26 20 24 76 61 6c 75 65 20 6e 65 20 22 6e   && $value ne "n
145c0 75 6c 6c 22 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ull"} then {..  
145d0 20 20 20 20 20 20 20 20 20 20 73 65 74 20 65 72            set er
145e0 72 6f 72 20 6e 75 6c 6c 3b 20 6f 62 6a 65 63 74  ror null; object
145f0 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b   invoke -flags +
14600 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20  NonPublic \..   
14610 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 6d 61               -ma
14620 72 73 68 61 6c 66 6c 61 67 73 20 2b 4e 6f 48 61  rshalflags +NoHa
14630 6e 64 6c 65 20 49 6e 74 65 72 70 72 65 74 65 72  ndle Interpreter
14640 2e 47 65 74 41 63 74 69 76 65 20 5c 0d 0a 20 20  .GetActive \..  
14650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 41 64                Ad
14660 64 4f 62 6a 65 63 74 52 65 66 65 72 65 6e 63 65  dObjectReference
14670 20 4f 6b 20 24 76 61 6c 75 65 20 65 72 72 6f 72   Ok $value error
14680 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
14690 6c 61 70 70 65 6e 64 20 70 72 6f 70 65 72 74 69  lappend properti
146a0 65 73 28 6f 62 6a 65 63 74 73 29 20 5b 6c 69 73  es(objects) [lis
146b0 74 20 24 6e 61 6d 65 20 24 76 61 6c 75 65 5d 0d  t $name $value].
146c0 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73  .          } els
146d0 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e {..           
146e0 20 6c 61 70 70 65 6e 64 20 70 72 6f 70 65 72 74   lappend propert
146f0 69 65 73 28 76 61 6c 75 65 73 29 20 5b 6c 69 73  ies(values) [lis
14700 74 20 24 6e 61 6d 65 20 24 76 61 6c 75 65 5d 0d  t $name $value].
14710 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  .          }....
14720 20 20 20 20 20 20 20 20 20 20 69 6e 63 72 20 63            incr c
14730 6f 75 6e 74 0d 0a 20 20 20 20 20 20 20 20 7d 20  ount..        } 
14740 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
14750 20 20 6c 61 70 70 65 6e 64 20 70 72 6f 70 65 72    lappend proper
14760 74 69 65 73 28 65 72 72 6f 72 73 29 20 5b 6c 69  ties(errors) [li
14770 73 74 20 24 6e 61 6d 65 20 24 3a 3a 65 72 72 6f  st $name $::erro
14780 72 43 6f 64 65 5d 0d 0a 20 20 20 20 20 20 20 20  rCode]..        
14790 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  }..      }....  
147a0 20 20 20 20 72 65 74 75 72 6e 20 24 63 6f 75 6e      return $coun
147b0 74 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  t..    }.....   
147c0 20 70 72 6f 63 20 67 65 74 41 6c 6c 50 72 6f 70   proc getAllProp
147d0 65 72 74 69 65 73 20 7b 20 6f 62 6a 65 63 74 20  erties { object 
147e0 76 61 72 4e 61 6d 65 20 7d 20 7b 0d 0a 20 20 20  varName } {..   
147f0 20 20 20 75 70 76 61 72 20 31 20 24 76 61 72 4e     upvar 1 $varN
14800 61 6d 65 20 70 72 6f 70 65 72 74 69 65 73 0d 0a  ame properties..
14810 20 20 20 20 20 20 73 65 74 20 76 61 6c 75 65 20        set value 
14820 24 6f 62 6a 65 63 74 0d 0a 0d 0a 20 20 20 20 20  $object....     
14830 20 77 68 69 6c 65 20 7b 74 72 75 65 7d 20 7b 0d   while {true} {.
14840 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69  .        if {![i
14850 6e 66 6f 20 65 78 69 73 74 73 20 70 72 6f 70 65  nfo exists prope
14860 72 74 69 65 73 28 73 65 65 6e 4f 62 6a 65 63 74  rties(seenObject
14870 73 29 5d 20 7c 7c 20 5c 0d 0a 20 20 20 20 20 20  s)] || \..      
14880 20 20 20 20 20 20 24 76 61 6c 75 65 20 6e 69 20        $value ni 
14890 24 70 72 6f 70 65 72 74 69 65 73 28 73 65 65 6e  $properties(seen
148a0 4f 62 6a 65 63 74 73 29 7d 20 74 68 65 6e 20 7b  Objects)} then {
148b0 0d 0a 20 20 20 20 20 20 20 20 20 20 67 65 74 50  ..          getP
148c0 72 6f 70 65 72 74 69 65 73 20 24 76 61 6c 75 65  roperties $value
148d0 20 70 72 6f 70 65 72 74 69 65 73 0d 0a 20 20 20   properties..   
148e0 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 70         lappend p
148f0 72 6f 70 65 72 74 69 65 73 28 73 65 65 6e 4f 62  roperties(seenOb
14900 6a 65 63 74 73 29 20 24 76 61 6c 75 65 0d 0a 20  jects) $value.. 
14910 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
14920 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
14930 78 69 73 74 73 20 70 72 6f 70 65 72 74 69 65 73  xists properties
14940 28 6f 62 6a 65 63 74 73 29 5d 7d 20 74 68 65 6e  (objects)]} then
14950 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 62 72   {..          br
14960 65 61 6b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  eak..        }..
14970 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 6c  ..        if {[l
14980 6c 65 6e 67 74 68 20 24 70 72 6f 70 65 72 74 69  length $properti
14990 65 73 28 6f 62 6a 65 63 74 73 29 5d 20 3d 3d 20  es(objects)] == 
149a0 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
149b0 20 20 20 20 20 75 6e 73 65 74 20 70 72 6f 70 65       unset prope
149c0 72 74 69 65 73 28 6f 62 6a 65 63 74 73 29 3b 20  rties(objects); 
149d0 62 72 65 61 6b 0d 0a 20 20 20 20 20 20 20 20 7d  break..        }
149e0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20  ....        set 
149f0 76 61 6c 75 65 20 5b 6c 69 6e 64 65 78 20 5b 6c  value [lindex [l
14a00 69 6e 64 65 78 20 24 70 72 6f 70 65 72 74 69 65  index $propertie
14a10 73 28 6f 62 6a 65 63 74 73 29 20 30 5d 20 65 6e  s(objects) 0] en
14a20 64 5d 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20  d]..        set 
14a30 70 72 6f 70 65 72 74 69 65 73 28 6f 62 6a 65 63  properties(objec
14a40 74 73 29 20 5b 6c 72 61 6e 67 65 20 24 70 72 6f  ts) [lrange $pro
14a50 70 65 72 74 69 65 73 28 6f 62 6a 65 63 74 73 29  perties(objects)
14a60 20 31 20 65 6e 64 5d 0d 0a 20 20 20 20 20 20 7d   1 end]..      }
14a70 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69  ....      if {[i
14a80 6e 66 6f 20 65 78 69 73 74 73 20 70 72 6f 70 65  nfo exists prope
14a90 72 74 69 65 73 28 73 65 65 6e 4f 62 6a 65 63 74  rties(seenObject
14aa0 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  s)]} then {..   
14ab0 20 20 20 20 20 66 6f 72 65 61 63 68 20 76 61 6c       foreach val
14ac0 75 65 20 24 70 72 6f 70 65 72 74 69 65 73 28 73  ue $properties(s
14ad0 65 65 6e 4f 62 6a 65 63 74 73 29 20 7b 0d 0a 20  eenObjects) {.. 
14ae0 20 20 20 20 20 20 20 20 20 69 66 20 7b 24 76 61           if {$va
14af0 6c 75 65 20 65 71 20 24 6f 62 6a 65 63 74 7d 20  lue eq $object} 
14b00 63 6f 6e 74 69 6e 75 65 0d 0a 20 20 20 20 20 20  continue..      
14b10 20 20 20 20 63 61 74 63 68 20 7b 6f 62 6a 65 63      catch {objec
14b20 74 20 64 69 73 70 6f 73 65 20 24 76 61 6c 75 65  t dispose $value
14b30 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  }..        }....
14b40 20 20 20 20 20 20 20 20 75 6e 73 65 74 20 70 72          unset pr
14b50 6f 70 65 72 74 69 65 73 28 73 65 65 6e 4f 62 6a  operties(seenObj
14b60 65 63 74 73 29 0d 0a 20 20 20 20 20 20 7d 0d 0a  ects)..      }..
14b70 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
14b80 6f 63 20 67 65 74 56 61 72 69 61 62 6c 65 73 20  oc getVariables 
14b90 7b 20 76 61 72 4e 61 6d 65 73 20 7b 6f 62 6a 65  { varNames {obje
14ba0 63 74 73 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a  cts false} } {..
14bb0 20 20 20 20 20 20 73 65 74 20 72 65 73 75 6c 74        set result
14bc0 20 5b 6c 69 73 74 5d 0d 0a 0d 0a 20 20 20 20 20   [list]....     
14bd0 20 66 6f 72 65 61 63 68 20 76 61 72 4e 61 6d 65   foreach varName
14be0 20 24 76 61 72 4e 61 6d 65 73 20 7b 0d 0a 20 20   $varNames {..  
14bf0 20 20 20 20 20 20 69 66 20 7b 5b 75 70 6c 65 76        if {[uplev
14c00 65 6c 20 31 20 5b 6c 69 73 74 20 61 72 72 61 79  el 1 [list array
14c10 20 65 78 69 73 74 73 20 24 76 61 72 4e 61 6d 65   exists $varName
14c20 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  ]]} then {..    
14c30 20 20 20 20 20 20 73 65 74 20 61 72 72 61 79 4e        set arrayN
14c40 61 6d 65 20 24 76 61 72 4e 61 6d 65 0d 0a 0d 0a  ame $varName....
14c50 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63            foreac
14c60 68 20 65 6c 65 6d 65 6e 74 4e 61 6d 65 20 5b 75  h elementName [u
14c70 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74 20 61  plevel 1 [list a
14c80 72 72 61 79 20 6e 61 6d 65 73 20 24 61 72 72 61  rray names $arra
14c90 79 4e 61 6d 65 5d 5d 20 7b 0d 0a 20 20 20 20 20  yName]] {..     
14ca0 20 20 20 20 20 20 20 73 65 74 20 6e 61 6d 65 20         set name 
14cb0 5b 61 70 70 65 6e 64 41 72 67 73 20 24 61 72 72  [appendArgs $arr
14cc0 61 79 4e 61 6d 65 20 28 20 24 65 6c 65 6d 65 6e  ayName ( $elemen
14cd0 74 4e 61 6d 65 20 29 5d 0d 0a 20 20 20 20 20 20  tName )]..      
14ce0 20 20 20 20 20 20 73 65 74 20 76 61 72 56 61 6c        set varVal
14cf0 75 65 20 5b 75 70 6c 65 76 65 6c 20 31 20 5b 6c  ue [uplevel 1 [l
14d00 69 73 74 20 73 65 74 20 24 6e 61 6d 65 5d 5d 0d  ist set $name]].
14d10 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ...            i
14d20 66 20 7b 24 6f 62 6a 65 63 74 73 20 26 26 20 5b  f {$objects && [
14d30 69 73 4f 62 6a 65 63 74 48 61 6e 64 6c 65 20 24  isObjectHandle $
14d40 76 61 72 56 61 6c 75 65 5d 7d 20 74 68 65 6e 20  varValue]} then 
14d50 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
14d60 20 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61   unset -nocompla
14d70 69 6e 20 70 72 6f 70 65 72 74 69 65 73 0d 0a 20  in properties.. 
14d80 20 20 20 20 20 20 20 20 20 20 20 20 20 67 65 74               get
14d90 41 6c 6c 50 72 6f 70 65 72 74 69 65 73 20 24 76  AllProperties $v
14da0 61 72 56 61 6c 75 65 20 70 72 6f 70 65 72 74 69  arValue properti
14db0 65 73 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  es....          
14dc0 20 20 20 20 6c 61 70 70 65 6e 64 20 72 65 73 75      lappend resu
14dd0 6c 74 20 5b 6c 69 73 74 20 24 6e 61 6d 65 20 5b  lt [list $name [
14de0 61 72 72 61 79 20 67 65 74 20 70 72 6f 70 65 72  array get proper
14df0 74 69 65 73 5d 5d 0d 0a 20 20 20 20 20 20 20 20  ties]]..        
14e00 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
14e10 20 20 20 20 20 20 20 20 20 20 20 20 6c 61 70 70              lapp
14e20 65 6e 64 20 72 65 73 75 6c 74 20 5b 6c 69 73 74  end result [list
14e30 20 24 6e 61 6d 65 20 24 76 61 72 56 61 6c 75 65   $name $varValue
14e40 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ]..            }
14e50 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
14e60 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
14e70 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20 76  .          set v
14e80 61 72 56 61 6c 75 65 20 5b 75 70 6c 65 76 65 6c  arValue [uplevel
14e90 20 31 20 5b 6c 69 73 74 20 73 65 74 20 24 76 61   1 [list set $va
14ea0 72 4e 61 6d 65 5d 5d 0d 0a 0d 0a 20 20 20 20 20  rName]]....     
14eb0 20 20 20 20 20 69 66 20 7b 24 6f 62 6a 65 63 74       if {$object
14ec0 73 20 26 26 20 5b 69 73 4f 62 6a 65 63 74 48 61  s && [isObjectHa
14ed0 6e 64 6c 65 20 24 76 61 72 56 61 6c 75 65 5d 7d  ndle $varValue]}
14ee0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
14ef0 20 20 20 20 20 75 6e 73 65 74 20 2d 6e 6f 63 6f       unset -noco
14f00 6d 70 6c 61 69 6e 20 70 72 6f 70 65 72 74 69 65  mplain propertie
14f10 73 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  s..            g
14f20 65 74 41 6c 6c 50 72 6f 70 65 72 74 69 65 73 20  etAllProperties 
14f30 24 76 61 72 56 61 6c 75 65 20 70 72 6f 70 65 72  $varValue proper
14f40 74 69 65 73 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ties....        
14f50 20 20 20 20 6c 61 70 70 65 6e 64 20 72 65 73 75      lappend resu
14f60 6c 74 20 5b 6c 69 73 74 20 24 76 61 72 4e 61 6d  lt [list $varNam
14f70 65 20 5b 61 72 72 61 79 20 67 65 74 20 70 72 6f  e [array get pro
14f80 70 65 72 74 69 65 73 5d 5d 0d 0a 20 20 20 20 20  perties]]..     
14f90 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
14fa0 20 20 20 20 20 20 20 20 20 20 20 6c 61 70 70 65             lappe
14fb0 6e 64 20 72 65 73 75 6c 74 20 5b 6c 69 73 74 20  nd result [list 
14fc0 24 76 61 72 4e 61 6d 65 20 24 76 61 72 56 61 6c  $varName $varVal
14fd0 75 65 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  ue]..          }
14fe0 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
14ff0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65     }....      re
15000 74 75 72 6e 20 24 72 65 73 75 6c 74 0d 0a 20 20  turn $result..  
15010 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
15020 20 65 6e 75 6d 65 72 61 62 6c 65 54 6f 4c 69 73   enumerableToLis
15030 74 20 7b 20 65 6e 75 6d 65 72 61 62 6c 65 20 7d  t { enumerable }
15040 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 72 65   {..      set re
15050 73 75 6c 74 20 5b 6c 69 73 74 5d 0d 0a 0d 0a 20  sult [list].... 
15060 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
15070 20 6c 65 6e 67 74 68 20 24 65 6e 75 6d 65 72 61   length $enumera
15080 62 6c 65 5d 20 3d 3d 20 30 20 7c 7c 20 24 65 6e  ble] == 0 || $en
15090 75 6d 65 72 61 62 6c 65 20 65 71 20 22 6e 75 6c  umerable eq "nul
150a0 6c 22 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  l"} then {..    
150b0 20 20 20 20 72 65 74 75 72 6e 20 24 72 65 73 75      return $resu
150c0 6c 74 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  lt..      }.... 
150d0 20 20 20 20 20 6f 62 6a 65 63 74 20 66 6f 72 65       object fore
150e0 61 63 68 20 2d 61 6c 69 61 73 20 69 74 65 6d 20  ach -alias item 
150f0 24 65 6e 75 6d 65 72 61 62 6c 65 20 7b 0d 0a 20  $enumerable {.. 
15100 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69         if {[stri
15110 6e 67 20 6c 65 6e 67 74 68 20 24 69 74 65 6d 5d  ng length $item]
15120 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
15130 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20          lappend 
15140 72 65 73 75 6c 74 20 5b 24 69 74 65 6d 20 54 6f  result [$item To
15150 53 74 72 69 6e 67 5d 0d 0a 20 20 20 20 20 20 20  String]..       
15160 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20   }..      }.... 
15170 20 20 20 20 20 72 65 74 75 72 6e 20 24 72 65 73       return $res
15180 75 6c 74 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20  ult..    }..... 
15190 20 20 20 70 72 6f 63 20 63 61 74 63 68 41 6e 64     proc catchAnd
151a0 52 65 74 75 72 6e 20 7b 20 73 63 72 69 70 74 20  Return { script 
151b0 7b 73 74 61 63 6b 54 72 61 63 65 20 66 61 6c 73  {stackTrace fals
151c0 65 7d 20 7b 73 74 72 69 63 74 20 74 72 75 65 7d  e} {strict true}
151d0 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20   } {..      #.. 
151e0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 45 76 61       # NOTE: Eva
151f0 6c 75 61 74 65 20 74 68 65 20 73 63 72 69 70 74  luate the script
15200 20 70 72 6f 76 69 64 65 64 20 62 79 20 6f 75 72   provided by our
15210 20 63 61 6c 6c 65 72 20 69 6e 20 74 68 65 69 72   caller in their
15220 20 63 6f 6e 74 65 78 74 2c 0d 0a 20 20 20 20 20   context,..     
15230 20 23 20 20 20 20 20 20 20 63 61 70 74 75 72 69   #       capturi
15240 6e 67 20 62 6f 74 68 20 74 68 65 20 72 65 73 75  ng both the resu
15250 6c 74 20 61 6e 64 20 74 68 65 20 72 65 74 75 72  lt and the retur
15260 6e 20 63 6f 64 65 2e 0d 0a 20 20 20 20 20 20 23  n code...      #
15270 0d 0a 20 20 20 20 20 20 73 65 74 20 63 6f 64 65  ..      set code
15280 20 5b 63 61 74 63 68 20 7b 75 70 6c 65 76 65 6c   [catch {uplevel
15290 20 31 20 24 73 63 72 69 70 74 7d 20 72 65 73 75   1 $script} resu
152a0 6c 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a  lt]....      #..
152b0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 44 69        # NOTE: Di
152c0 64 20 74 68 65 20 73 63 72 69 70 74 20 70 72 6f  d the script pro
152d0 76 69 64 65 64 20 62 79 20 6f 75 72 20 63 61 6c  vided by our cal
152e0 6c 65 72 20 4e 4f 54 20 72 61 69 73 65 20 61 6e  ler NOT raise an
152f0 20 65 72 72 6f 72 3f 0d 0a 20 20 20 20 20 20 23   error?..      #
15300 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 73 74 72  ..      if {$str
15310 69 63 74 20 26 26 20 24 63 6f 64 65 20 3d 3d 20  ict && $code == 
15320 30 20 7c 7c 20 21 24 73 74 72 69 63 74 20 26 26  0 || !$strict &&
15330 20 24 63 6f 64 65 20 21 3d 20 31 7d 20 74 68 65   $code != 1} the
15340 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
15350 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
15360 53 75 63 63 65 73 73 2e 20 20 52 65 74 75 72 6e  Success.  Return
15370 20 61 20 6c 69 73 74 20 77 69 74 68 20 74 68 65   a list with the
15380 20 72 65 74 75 72 6e 20 63 6f 64 65 20 61 6e 64   return code and
15390 20 74 68 65 20 72 65 73 75 6c 74 2e 0d 0a 20 20   the result...  
153a0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
153b0 20 72 65 74 75 72 6e 20 5b 6c 69 73 74 20 24 63   return [list $c
153c0 6f 64 65 20 24 72 65 73 75 6c 74 5d 0d 0a 20 20  ode $result]..  
153d0 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 24 73      } elseif {$s
153e0 74 61 63 6b 54 72 61 63 65 7d 20 74 68 65 6e 20  tackTrace} then 
153f0 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
15400 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 61        # NOTE: Fa
15410 69 6c 75 72 65 2e 20 20 4f 75 72 20 63 61 6c 6c  ilure.  Our call
15420 65 72 20 77 61 6e 74 73 20 61 20 66 75 6c 6c 20  er wants a full 
15430 73 74 61 63 6b 20 74 72 61 63 65 20 28 69 66 20  stack trace (if 
15440 61 70 70 6c 69 63 61 62 6c 65 29 2c 0d 0a 20 20  applicable),..  
15450 20 20 20 20 20 20 23 20 20 20 20 20 20 20 72 65        #       re
15460 74 75 72 6e 20 61 20 6c 69 73 74 20 77 69 74 68  turn a list with
15470 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   the return code
15480 20 61 6e 64 20 74 68 65 20 72 65 73 75 6c 74 20   and the result 
15490 76 65 72 62 61 74 69 6d 2e 0d 0a 20 20 20 20 20  verbatim...     
154a0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65     #..        re
154b0 74 75 72 6e 20 5b 6c 69 73 74 20 24 63 6f 64 65  turn [list $code
154c0 20 24 72 65 73 75 6c 74 5d 0d 0a 20 20 20 20 20   $result]..     
154d0 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
154e0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
154f0 4e 4f 54 45 3a 20 46 61 69 6c 75 72 65 2e 20 20  NOTE: Failure.  
15500 4f 75 72 20 63 61 6c 6c 65 72 20 64 6f 65 73 20  Our caller does 
15510 6e 6f 74 20 77 61 6e 74 20 61 20 66 75 6c 6c 20  not want a full 
15520 73 74 61 63 6b 20 74 72 61 63 65 20 28 69 66 0d  stack trace (if.
15530 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
15540 20 61 70 70 6c 69 63 61 62 6c 65 29 2c 20 72 65   applicable), re
15550 74 75 72 6e 20 61 20 6c 69 73 74 20 77 69 74 68  turn a list with
15560 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   the return code
15570 2c 20 74 68 65 20 65 72 72 6f 72 0d 0a 20 20 20  , the error..   
15580 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 64       #       cod
15590 65 20 66 6f 72 20 74 68 65 20 69 6e 74 65 72 70  e for the interp
155a0 72 65 74 65 72 2c 20 61 6e 64 20 74 68 65 20 65  reter, and the e
155b0 72 72 6f 72 20 6d 65 73 73 61 67 65 20 75 70 20  rror message up 
155c0 74 6f 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20  to the..        
155d0 23 20 20 20 20 20 20 20 70 6f 69 6e 74 20 77 68  #       point wh
155e0 65 72 65 20 74 68 65 20 73 74 61 63 6b 20 74 72  ere the stack tr
155f0 61 63 65 20 73 68 6f 75 6c 64 20 73 74 61 72 74  ace should start
15600 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
15610 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6c 69        return [li
15620 73 74 20 24 63 6f 64 65 20 24 3a 3a 65 72 72 6f  st $code $::erro
15630 72 43 6f 64 65 20 5c 0d 0a 20 20 20 20 20 20 20  rCode \..       
15640 20 20 20 20 20 5b 65 78 74 72 61 63 74 53 79 73       [extractSys
15650 74 65 6d 44 61 74 61 53 51 4c 69 74 65 45 78 63  temDataSQLiteExc
15660 65 70 74 69 6f 6e 4d 65 73 73 61 67 65 20 24 72  eptionMessage $r
15670 65 73 75 6c 74 5d 5d 0d 0a 20 20 20 20 20 20 7d  esult]]..      }
15680 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
15690 70 72 6f 63 20 72 65 73 65 74 45 78 63 65 70 74  proc resetExcept
156a0 69 6f 6e 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20  ion {} {..      
156b0 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
156c0 20 52 65 73 65 74 20 65 78 63 65 70 74 69 6f 6e   Reset exception
156d0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
156e0 20 74 68 69 73 20 69 6e 74 65 72 70 72 65 74 65   this interprete
156f0 72 20 28 74 6f 20 6e 75 6c 6c 29 2e 0d 0a 20 20  r (to null)...  
15700 20 20 20 20 23 20 20 20 20 20 20 20 54 68 69 73      #       This
15710 20 28 70 72 69 76 61 74 65 29 20 70 72 6f 70 65   (private) prope
15720 72 74 79 20 69 73 20 6d 61 69 6e 74 61 69 6e 65  rty is maintaine
15730 64 20 6f 6e 20 61 20 70 65 72 2d 74 68 72 65 61  d on a per-threa
15740 64 20 62 61 73 69 73 2e 0d 0a 20 20 20 20 20 20  d basis...      
15750 23 0d 0a 20 20 20 20 20 20 6f 62 6a 65 63 74 20  #..      object 
15760 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e  invoke -flags +N
15770 6f 6e 50 75 62 6c 69 63 20 49 6e 74 65 72 70 72  onPublic Interpr
15780 65 74 65 72 2e 47 65 74 41 63 74 69 76 65 20 45  eter.GetActive E
15790 78 63 65 70 74 69 6f 6e 20 6e 75 6c 6c 0d 0a 20  xception null.. 
157a0 20 20 20 20 20 72 65 74 75 72 6e 20 22 22 0d 0a       return ""..
157b0 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
157c0 6f 63 20 63 61 74 63 68 41 6e 64 53 65 74 45 78  oc catchAndSetEx
157d0 63 65 70 74 69 6f 6e 20 7b 20 73 63 72 69 70 74  ception { script
157e0 20 7b 76 61 72 4e 61 6d 65 20 22 22 7d 20 7d 20   {varName ""} } 
157f0 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
15800 20 20 23 20 4e 4f 54 45 3a 20 45 76 61 6c 75 61    # NOTE: Evalua
15810 74 65 20 74 68 65 20 73 63 72 69 70 74 20 70 72  te the script pr
15820 6f 76 69 64 65 64 20 62 79 20 6f 75 72 20 63 61  ovided by our ca
15830 6c 6c 65 72 20 69 6e 20 74 68 65 69 72 20 63 6f  ller in their co
15840 6e 74 65 78 74 2e 0d 0a 20 20 20 20 20 20 23 0d  ntext...      #.
15850 0a 20 20 20 20 20 20 63 61 74 63 68 20 7b 75 70  .      catch {up
15860 6c 65 76 65 6c 20 31 20 24 73 63 72 69 70 74 7d  level 1 $script}
15870 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
15880 20 20 20 23 20 4e 4f 54 45 3a 20 47 72 61 62 20     # NOTE: Grab 
15890 74 68 65 20 28 70 72 69 76 61 74 65 29 20 65 78  the (private) ex
158a0 63 65 70 74 69 6f 6e 20 70 72 6f 70 65 72 74 79  ception property
158b0 20 66 72 6f 6d 20 74 68 69 73 20 69 6e 74 65 72   from this inter
158c0 70 72 65 74 65 72 2c 0d 0a 20 20 20 20 20 20 23  preter,..      #
158d0 20 20 20 20 20 20 20 66 6f 72 20 74 68 69 73 20         for this 
158e0 74 68 72 65 61 64 2c 20 61 6e 64 20 61 64 64 20  thread, and add 
158f0 61 73 20 61 6e 20 6f 70 61 71 75 65 20 6f 62 6a  as an opaque obj
15900 65 63 74 20 68 61 6e 64 6c 65 20 69 6e 20 74 68  ect handle in th
15910 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
15920 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72 20   context of our 
15930 63 61 6c 6c 65 72 2e 0d 0a 20 20 20 20 20 20 23  caller...      #
15940 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72  ..      if {[str
15950 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 61 72 4e  ing length $varN
15960 61 6d 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ame] > 0} then {
15970 0d 0a 20 20 20 20 20 20 20 20 75 70 76 61 72 20  ..        upvar 
15980 31 20 24 76 61 72 4e 61 6d 65 20 65 78 63 65 70  1 $varName excep
15990 74 69 6f 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  tion..      }...
159a0 0a 20 20 20 20 20 20 73 65 74 20 65 78 63 65 70  .      set excep
159b0 74 69 6f 6e 20 5b 6f 62 6a 65 63 74 20 69 6e 76  tion [object inv
159c0 6f 6b 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  oke \..         
159d0 20 2d 61 6c 69 61 73 20 2d 66 6c 61 67 73 20 2b   -alias -flags +
159e0 4e 6f 6e 50 75 62 6c 69 63 20 49 6e 74 65 72 70  NonPublic Interp
159f0 72 65 74 65 72 2e 47 65 74 41 63 74 69 76 65 20  reter.GetActive 
15a00 45 78 63 65 70 74 69 6f 6e 5d 0d 0a 0d 0a 20 20  Exception]....  
15a10 20 20 20 20 72 65 74 75 72 6e 20 22 22 0d 0a 20      return "".. 
15a20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
15a30 63 20 63 6f 6d 70 69 6c 65 43 53 68 61 72 70 57  c compileCSharpW
15a40 69 74 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  ith {..         
15a50 20 20 20 74 65 78 74 20 6d 65 6d 6f 72 79 20 73     text memory s
15a60 79 6d 62 6f 6c 73 20 73 74 72 69 63 74 20 72 65  ymbols strict re
15a70 73 75 6c 74 73 56 61 72 4e 61 6d 65 20 65 72 72  sultsVarName err
15a80 6f 72 73 56 61 72 4e 61 6d 65 20 66 69 6c 65 4e  orsVarName fileN
15a90 61 6d 65 73 0d 0a 20 20 20 20 20 20 20 20 20 20  ames..          
15aa0 20 20 61 72 67 73 20 7d 20 7b 0d 0a 20 20 20 20    args } {..    
15ab0 20 20 74 72 79 20 7b 0d 0a 20 20 20 20 20 20 20    try {..       
15ac0 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
15ad0 54 45 3a 20 53 69 6e 63 65 20 77 65 20 61 72 65  TE: Since we are
15ae0 20 67 6f 69 6e 67 20 74 6f 20 75 73 65 20 74 68   going to use th
15af0 69 73 20 6d 65 74 68 6f 64 20 6e 61 6d 65 20 61  is method name a
15b00 20 6c 6f 74 2c 20 61 73 73 69 67 6e 0d 0a 20 20   lot, assign..  
15b10 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69 74        #       it
15b20 20 74 6f 20 61 20 76 61 72 69 61 62 6c 65 20 66   to a variable f
15b30 69 72 73 74 2e 0d 0a 20 20 20 20 20 20 20 20 23  irst...        #
15b40 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 61 64  ..        set ad
15b50 64 20 52 65 66 65 72 65 6e 63 65 64 41 73 73 65  d ReferencedAsse
15b60 6d 62 6c 69 65 73 2e 41 64 64 0d 0a 0d 0a 20 20  mblies.Add....  
15b70 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
15b80 20 23 20 4e 4f 54 45 3a 20 43 72 65 61 74 65 20   # NOTE: Create 
15b90 74 68 65 20 62 61 73 65 20 63 6f 6d 6d 61 6e 64  the base command
15ba0 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6e 64   to evaluate and
15bb0 20 61 64 64 20 74 68 65 20 70 72 6f 70 65 72 74   add the propert
15bc0 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  y..        #    
15bd0 20 20 20 73 65 74 74 69 6e 67 73 20 74 68 61 74     settings that
15be0 20 61 72 65 20 61 6c 6d 6f 73 74 20 61 6c 77 61   are almost alwa
15bf0 79 73 20 6e 65 65 64 65 64 20 62 79 20 6f 75 72  ys needed by our
15c00 20 75 6e 69 74 20 74 65 73 74 73 0d 0a 20 20 20   unit tests..   
15c10 20 20 20 20 20 23 20 20 20 20 20 20 20 28 69 2e       #       (i.
15c20 65 2e 20 74 68 65 20 53 79 73 74 65 6d 20 61 6e  e. the System an
15c30 64 20 53 79 73 74 65 6d 2e 44 61 74 61 20 61 73  d System.Data as
15c40 73 65 6d 62 6c 79 20 72 65 66 65 72 65 6e 63 65  sembly reference
15c50 73 29 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  s)...        #..
15c60 20 20 20 20 20 20 20 20 73 65 74 20 63 6f 6d 6d          set comm
15c70 61 6e 64 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20  and [list \..   
15c80 20 20 20 20 20 20 20 20 20 63 6f 6d 70 69 6c 65           compile
15c90 43 53 68 61 72 70 20 24 74 65 78 74 20 24 6d 65  CSharp $text $me
15ca0 6d 6f 72 79 20 24 73 79 6d 62 6f 6c 73 20 24 73  mory $symbols $s
15cb0 74 72 69 63 74 20 72 65 73 75 6c 74 73 20 5c 0d  trict results \.
15cc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 72 72  .            err
15cd0 6f 72 73 20 24 61 64 64 20 53 79 73 74 65 6d 2e  ors $add System.
15ce0 64 6c 6c 20 24 61 64 64 20 53 79 73 74 65 6d 2e  dll $add System.
15cf0 44 61 74 61 2e 64 6c 6c 20 24 61 64 64 20 5c 0d  Data.dll $add \.
15d00 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73  .            Sys
15d10 74 65 6d 2e 54 72 61 6e 73 61 63 74 69 6f 6e 73  tem.Transactions
15d20 2e 64 6c 6c 20 24 61 64 64 20 53 79 73 74 65 6d  .dll $add System
15d30 2e 58 6d 6c 2e 64 6c 6c 5d 0d 0a 0d 0a 20 20 20  .Xml.dll]....   
15d40 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
15d50 23 20 4e 4f 54 45 3a 20 41 64 64 20 61 6c 6c 20  # NOTE: Add all 
15d60 74 68 65 20 70 72 6f 76 69 64 65 64 20 66 69 6c  the provided fil
15d70 65 20 6e 61 6d 65 73 20 61 73 20 61 73 73 65 6d  e names as assem
15d80 62 6c 79 20 72 65 66 65 72 65 6e 63 65 73 2e 0d  bly references..
15d90 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
15da0 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65      foreach file
15db0 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 73 20  Name $fileNames 
15dc0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6c 61 70  {..          lap
15dd0 70 65 6e 64 20 63 6f 6d 6d 61 6e 64 20 24 61 64  pend command $ad
15de0 64 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65  d [getBinaryFile
15df0 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 5d 0d  Name $fileName].
15e00 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
15e10 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
15e20 20 23 20 4e 4f 54 45 3a 20 41 64 64 20 65 78 74   # NOTE: Add ext
15e30 72 61 20 61 72 67 75 6d 65 6e 74 73 2c 20 69 66  ra arguments, if
15e40 20 61 6e 79 2c 20 74 6f 20 74 68 65 20 63 6f 6d   any, to the com
15e50 6d 61 6e 64 20 74 6f 20 65 76 61 6c 75 61 74 65  mand to evaluate
15e60 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
15e70 20 20 20 20 20 20 65 76 61 6c 20 6c 61 70 70 65        eval lappe
15e80 6e 64 20 63 6f 6d 6d 61 6e 64 20 24 61 72 67 73  nd command $args
15e90 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
15ea0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41         # NOTE: A
15eb0 6c 69 61 73 20 74 68 65 20 63 6f 6d 70 69 6c 65  lias the compile
15ec0 72 20 6c 6f 63 61 6c 20 72 65 73 75 6c 74 73 20  r local results 
15ed0 61 6e 64 20 65 72 72 6f 72 73 20 76 61 72 69 61  and errors varia
15ee0 62 6c 65 73 20 74 6f 0d 0a 20 20 20 20 20 20 20  bles to..       
15ef0 20 23 20 20 20 20 20 20 20 74 68 65 20 76 61 72   #       the var
15f00 69 61 62 6c 65 20 6e 61 6d 65 73 20 70 72 6f 76  iable names prov
15f10 69 64 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c  ided by our call
15f20 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  er...        #..
15f30 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72          if {[str
15f40 69 6e 67 20 6c 65 6e 67 74 68 20 24 72 65 73 75  ing length $resu
15f50 6c 74 73 56 61 72 4e 61 6d 65 5d 20 3e 20 30 7d  ltsVarName] > 0}
15f60 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
15f70 20 20 20 75 70 76 61 72 20 31 20 24 72 65 73 75     upvar 1 $resu
15f80 6c 74 73 56 61 72 4e 61 6d 65 20 72 65 73 75 6c  ltsVarName resul
15f90 74 73 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  ts..        }...
15fa0 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74  .        if {[st
15fb0 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 65 72 72  ring length $err
15fc0 6f 72 73 56 61 72 4e 61 6d 65 5d 20 3e 20 30 7d  orsVarName] > 0}
15fd0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
15fe0 20 20 20 75 70 76 61 72 20 31 20 24 65 72 72 6f     upvar 1 $erro
15ff0 72 73 56 61 72 4e 61 6d 65 20 65 72 72 6f 72 73  rsVarName errors
16000 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
16010 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
16020 20 20 23 20 4e 4f 54 45 3a 20 45 76 61 6c 75 61    # NOTE: Evalua
16030 74 65 20 74 68 65 20 63 6f 6e 73 74 72 75 63 74  te the construct
16040 65 64 20 5b 63 6f 6d 70 69 6c 65 43 53 68 61 72  ed [compileCShar
16050 70 5d 20 63 6f 6d 6d 61 6e 64 20 61 6e 64 0d 0a  p] command and..
16060 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
16070 72 65 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c  return the resul
16080 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  t...        #.. 
16090 20 20 20 20 20 20 20 65 76 61 6c 20 24 63 6f 6d         eval $com
160a0 6d 61 6e 64 0d 0a 20 20 20 20 20 20 7d 20 66 69  mand..      } fi
160b0 6e 61 6c 6c 79 20 7b 0d 0a 20 20 20 20 20 20 20  nally {..       
160c0 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
160d0 54 45 3a 20 49 66 20 74 68 65 20 43 23 20 63 6f  TE: If the C# co
160e0 6d 70 69 6c 65 72 20 77 61 73 20 69 6e 76 6f 6b  mpiler was invok
160f0 65 64 20 75 73 69 6e 67 20 5b 65 78 65 63 5d 2c  ed using [exec],
16100 20 72 65 73 65 74 20 74 68 65 0d 0a 20 20 20 20   reset the..    
16110 20 20 20 20 23 20 20 20 20 20 20 20 70 72 65 76      #       prev
16120 69 6f 75 73 20 70 72 6f 63 65 73 73 20 69 64 65  ious process ide
16130 6e 74 69 66 69 65 72 20 6e 6f 77 20 28 69 2e 65  ntifier now (i.e
16140 2e 20 74 68 61 74 20 77 61 79 2c 20 69 74 20 64  . that way, it d
16150 6f 65 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20  oes..        #  
16160 20 20 20 20 20 6e 6f 74 20 73 68 6f 77 20 75 70       not show up
16170 20 61 73 20 62 65 69 6e 67 20 22 6c 65 61 6b 65   as being "leake
16180 64 22 29 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  d")...        #.
16190 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69 73  .        if {[is
161a0 44 6f 74 4e 65 74 43 6f 72 65 5d 7d 20 74 68 65  DotNetCore]} the
161b0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63  n {..          c
161c0 61 74 63 68 20 7b 69 6e 66 6f 20 70 72 65 76 69  atch {info previ
161d0 6f 75 73 70 69 64 20 74 72 75 65 7d 0d 0a 20 20  ouspid true}..  
161e0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
161f0 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
16200 70 72 6f 63 20 69 73 4d 65 6d 6f 72 79 44 62 20  proc isMemoryDb 
16210 7b 20 66 69 6c 65 4e 61 6d 65 20 7d 20 7b 0d 0a  { fileName } {..
16220 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
16230 20 4e 4f 54 45 3a 20 49 73 20 74 68 65 20 73 70   NOTE: Is the sp
16240 65 63 69 66 69 65 64 20 64 61 74 61 62 61 73 65  ecified database
16250 20 66 69 6c 65 20 6e 61 6d 65 20 72 65 61 6c 6c   file name reall
16260 79 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  y an in-memory d
16270 61 74 61 62 61 73 65 3f 0d 0a 20 20 20 20 20 20  atabase?..      
16280 23 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  #..      return 
16290 5b 65 78 70 72 20 7b 24 66 69 6c 65 4e 61 6d 65  [expr {$fileName
162a0 20 65 71 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 7c   eq ":memory:" |
162b0 7c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b  | \..          [
162c0 73 74 72 69 6e 67 20 72 61 6e 67 65 20 24 66 69  string range $fi
162d0 6c 65 4e 61 6d 65 20 30 20 31 32 5d 20 65 71 20  leName 0 12] eq 
162e0 22 66 69 6c 65 3a 3a 6d 65 6d 6f 72 79 3a 22 7d  "file::memory:"}
162f0 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  ]..    }.....   
16300 20 70 72 6f 63 20 69 73 54 61 62 6c 65 49 6e 44   proc isTableInD
16310 62 20 7b 20 6e 61 6d 65 20 7b 76 61 72 4e 61 6d  b { name {varNam
16320 65 20 64 62 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  e db} } {..     
16330 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
16340 3a 20 52 65 66 65 72 20 74 6f 20 74 68 65 20 73  : Refer to the s
16350 70 65 63 69 66 69 65 64 20 76 61 72 69 61 62 6c  pecified variabl
16360 65 20 28 65 2e 67 2e 20 22 64 62 22 29 20 69 6e  e (e.g. "db") in
16370 20 74 68 65 20 63 6f 6e 74 65 78 74 20 6f 66 20   the context of 
16380 6f 75 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20  our..      #    
16390 20 20 20 63 61 6c 6c 65 72 2e 20 20 49 74 20 63     caller.  It c
163a0 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74 61  ontains the data
163b0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
163c0 68 61 6e 64 6c 65 20 74 68 61 74 20 77 69 6c 6c  handle that will
163d0 20 62 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20   be..      #    
163e0 20 20 20 75 73 65 64 20 74 6f 20 65 78 65 63 75     used to execu
163f0 74 65 20 74 68 65 20 71 75 65 72 79 20 75 73 65  te the query use
16400 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69  d to determine i
16410 66 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c  f the named tabl
16420 65 20 69 73 0d 0a 20 20 20 20 20 20 23 20 20 20  e is..      #   
16430 20 20 20 20 70 72 65 73 65 6e 74 20 69 6e 20 74      present in t
16440 68 61 74 20 64 61 74 61 62 61 73 65 2e 0d 0a 20  hat database... 
16450 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 75 70       #..      up
16460 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65 20 64  var 1 $varName d
16470 62 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  b....      #..  
16480 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20      # NOTE: Use 
16490 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
164a0 72 20 74 61 62 6c 65 20 74 6f 20 64 65 74 65 72  r table to deter
164b0 6d 69 6e 65 20 69 66 20 74 68 65 20 6e 61 6d 65  mine if the name
164c0 64 20 74 61 62 6c 65 20 69 73 0d 0a 20 20 20 20  d table is..    
164d0 20 20 23 20 20 20 20 20 20 20 70 72 65 73 65 6e    #       presen
164e0 74 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  t in the databas
164f0 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  e...      #..   
16500 20 20 20 73 65 74 20 73 71 6c 20 7b 0d 0a 20 20     set sql {..  
16510 20 20 20 20 20 20 53 45 4c 45 43 54 20 43 4f 55        SELECT COU
16520 4e 54 28 2a 29 20 46 52 4f 4d 20 73 71 6c 69 74  NT(*) FROM sqlit
16530 65 5f 6d 61 73 74 65 72 20 57 48 45 52 45 20 74  e_master WHERE t
16540 79 70 65 20 3d 20 27 74 61 62 6c 65 27 20 41 4e  ype = 'table' AN
16550 44 20 6e 61 6d 65 20 3d 20 3f 3b 0d 0a 20 20 20  D name = ?;..   
16560 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
16570 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52  .      # NOTE: R
16580 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69  eturn non-zero i
16590 66 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c  f the named tabl
165a0 65 20 69 73 20 70 72 65 73 65 6e 74 2e 0d 0a 20  e is present... 
165b0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65       #..      re
165c0 74 75 72 6e 20 5b 65 78 70 72 20 7b 0d 0a 20 20  turn [expr {..  
165d0 20 20 20 20 20 20 5b 73 71 6c 20 65 78 65 63 75        [sql execu
165e0 74 65 20 2d 65 78 65 63 75 74 65 20 73 63 61 6c  te -execute scal
165f0 61 72 20 24 64 62 20 24 73 71 6c 20 5b 6c 69 73  ar $db $sql [lis
16600 74 20 70 61 72 61 6d 31 20 53 74 72 69 6e 67 20  t param1 String 
16610 24 6e 61 6d 65 5d 5d 20 3e 20 30 0d 0a 20 20 20  $name]] > 0..   
16620 20 20 20 7d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d     }]..    }....
16630 0a 20 20 20 20 70 72 6f 63 20 67 65 74 44 62 44  .    proc getDbD
16640 65 66 61 75 6c 74 50 61 67 65 53 69 7a 65 20 7b  efaultPageSize {
16650 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  } {..      if {[
16660 63 61 74 63 68 20 7b 65 78 65 63 75 74 65 53 71  catch {executeSq
16670 6c 20 22 50 52 41 47 4d 41 20 70 61 67 65 5f 73  l "PRAGMA page_s
16680 69 7a 65 3b 22 20 73 63 61 6c 61 72 7d 20 72 65  ize;" scalar} re
16690 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  sult] == 0} then
166a0 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   {..        retu
166b0 72 6e 20 24 72 65 73 75 6c 74 0d 0a 20 20 20 20  rn $result..    
166c0 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
166d0 20 20 20 20 72 65 74 75 72 6e 20 30 0d 0a 20 20      return 0..  
166e0 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
166f0 0a 20 20 20 20 70 72 6f 63 20 67 65 74 44 62 44  .    proc getDbD
16700 65 66 61 75 6c 74 43 61 63 68 65 53 69 7a 65 20  efaultCacheSize 
16710 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b  {} {..      if {
16720 5b 63 61 74 63 68 20 7b 65 78 65 63 75 74 65 53  [catch {executeS
16730 71 6c 20 22 50 52 41 47 4d 41 20 63 61 63 68 65  ql "PRAGMA cache
16740 5f 73 69 7a 65 3b 22 20 73 63 61 6c 61 72 7d 20  _size;" scalar} 
16750 72 65 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68  result] == 0} th
16760 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65  en {..        re
16770 74 75 72 6e 20 24 72 65 73 75 6c 74 0d 0a 20 20  turn $result..  
16780 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
16790 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 0d 0a        return 0..
167a0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
167b0 0c 0d 0a 20 20 20 20 70 72 6f 63 20 75 73 65 4c  ...    proc useL
167c0 65 67 61 63 79 44 62 50 61 67 65 41 6e 64 43 61  egacyDbPageAndCa
167d0 63 68 65 53 69 7a 65 73 20 7b 20 76 61 72 4e 61  cheSizes { varNa
167e0 6d 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  me } {..      #.
167f0 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52  .      # NOTE: R
16800 65 66 65 72 20 74 6f 20 74 68 65 20 73 70 65 63  efer to the spec
16810 69 66 69 65 64 20 76 61 72 69 61 62 6c 65 20 28  ified variable (
16820 65 2e 67 2e 20 22 64 62 22 29 20 69 6e 20 74 68  e.g. "db") in th
16830 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72  e context of our
16840 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
16850 63 61 6c 6c 65 72 2e 20 20 49 74 20 63 6f 6e 74  caller.  It cont
16860 61 69 6e 73 20 74 68 65 20 64 61 74 61 62 61 73  ains the databas
16870 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e  e connection han
16880 64 6c 65 20 74 68 61 74 20 77 69 6c 6c 20 62 65  dle that will be
16890 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
168a0 75 73 65 64 20 74 6f 20 65 78 65 63 75 74 65 20  used to execute 
168b0 71 75 65 72 69 65 73 20 75 73 65 64 20 74 6f 20  queries used to 
168c0 73 65 74 20 74 68 65 20 70 61 67 65 20 61 6e 64  set the page and
168d0 20 63 61 63 68 65 20 73 69 7a 65 73 2e 0d 0a 20   cache sizes... 
168e0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 75 70       #..      up
168f0 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65 20 64  var 1 $varName d
16900 62 0d 0a 0d 0a 20 20 20 20 20 20 73 71 6c 20 65  b....      sql e
16910 78 65 63 75 74 65 20 24 64 62 20 7b 0d 0a 20 20  xecute $db {..  
16920 20 20 20 20 20 20 50 52 41 47 4d 41 20 70 61 67        PRAGMA pag
16930 65 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b 0d 0a  e_size = 1024;..
16940 20 20 20 20 20 20 20 20 50 52 41 47 4d 41 20 63          PRAGMA c
16950 61 63 68 65 5f 73 69 7a 65 20 3d 20 32 30 30 30  ache_size = 2000
16960 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  ;..      }....  
16970 20 20 20 20 72 65 74 75 72 6e 20 5b 6c 69 73 74      return [list
16980 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73   \..          [s
16990 71 6c 20 65 78 65 63 75 74 65 20 2d 65 78 65 63  ql execute -exec
169a0 75 74 65 20 73 63 61 6c 61 72 20 24 64 62 20 22  ute scalar $db "
169b0 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65  PRAGMA page_size
169c0 3b 22 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ;"] \..         
169d0 20 5b 73 71 6c 20 65 78 65 63 75 74 65 20 2d 65   [sql execute -e
169e0 78 65 63 75 74 65 20 73 63 61 6c 61 72 20 24 64  xecute scalar $d
169f0 62 20 22 50 52 41 47 4d 41 20 63 61 63 68 65 5f  b "PRAGMA cache_
16a00 73 69 7a 65 3b 22 5d 5d 0d 0a 20 20 20 20 7d 0d  size;"]]..    }.
16a10 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 6e 6f 72  ....    proc nor
16a20 6d 61 6c 69 7a 65 45 78 63 65 70 74 69 6f 6e 4d  malizeExceptionM
16a30 65 73 73 61 67 65 20 7b 20 76 61 6c 75 65 20 7d  essage { value }
16a40 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73   {..      if {[s
16a50 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 61  tring length $va
16a60 6c 75 65 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  lue] == 0} then 
16a70 7b 72 65 74 75 72 6e 20 24 76 61 6c 75 65 7d 0d  {return $value}.
16a80 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 73  .      return [s
16a90 74 72 69 6e 67 20 6d 61 70 20 5b 6c 69 73 74 20  tring map [list 
16aa0 5c 72 5c 6e 20 22 20 3d 3d 3e 20 22 20 5c 6e 20  \r\n " ==> " \n 
16ab0 22 20 3d 3d 3e 20 22 5d 20 24 76 61 6c 75 65 5d  " ==> "] $value]
16ac0 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
16ad0 70 72 6f 63 20 65 78 74 72 61 63 74 53 79 73 74  proc extractSyst
16ae0 65 6d 44 61 74 61 53 51 4c 69 74 65 45 78 63 65  emDataSQLiteExce
16af0 70 74 69 6f 6e 4d 65 73 73 61 67 65 20 7b 20 76  ptionMessage { v
16b00 61 6c 75 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20  alue } {..      
16b10 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
16b20 20 49 66 20 74 68 65 20 73 74 72 69 6e 67 20 63   If the string c
16b30 6f 6e 66 6f 72 6d 73 20 74 6f 20 66 6f 72 6d 61  onforms to forma
16b40 74 20 6f 66 20 74 68 65 20 6e 6f 72 6d 61 6c 20  t of the normal 
16b50 65 78 63 65 70 74 69 6f 6e 0d 0a 20 20 20 20 20  exception..     
16b60 20 23 20 20 20 20 20 20 20 65 72 72 6f 72 20 73   #       error s
16b70 74 72 69 6e 67 73 2c 20 65 78 74 72 61 63 74 20  trings, extract 
16b80 61 6e 64 20 72 65 74 75 72 6e 20 6f 6e 6c 79 20  and return only 
16b90 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  the error messag
16ba0 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
16bb0 20 70 6f 72 74 69 6f 6e 20 69 74 73 65 6c 66 2e   portion itself.
16bc0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
16bd0 20 73 65 74 20 70 61 74 74 65 72 6e 73 20 5b 6c   set patterns [l
16be0 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 7b 53 79  ist \..      {Sy
16bf0 73 74 65 6d 5c 2e 44 61 74 61 5c 2e 53 51 4c 69  stem\.Data\.SQLi
16c00 74 65 5c 2e 53 51 4c 69 74 65 45 78 63 65 70 74  te\.SQLiteExcept
16c10 69 6f 6e 20 5c 28 30 78 28 3f 3a 30 7c 38 29 5b  ion \(0x(?:0|8)[
16c20 30 2d 39 41 2d 46 61 2d 66 5d 7b 37 7d 5c 29 3a  0-9A-Fa-f]{7}\):
16c30 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 28 2e 2b  \..          (.+
16c40 3f 29 20 20 28 3f 3a 20 29 3f 61 74 7d 20 5c 0d  ?)  (?: )?at} \.
16c50 0a 20 20 20 20 20 20 7b 53 79 73 74 65 6d 5c 2e  .      {System\.
16c60 44 61 74 61 5c 2e 53 51 4c 69 74 65 5c 2e 53 51  Data\.SQLite\.SQ
16c70 4c 69 74 65 45 78 63 65 70 74 69 6f 6e 3a 20 28  LiteException: (
16c80 2e 2b 3f 29 20 20 28 3f 3a 20 29 3f 61 74 7d 20  .+?)  (?: )?at} 
16c90 5c 0d 0a 20 20 20 20 20 20 7b 45 61 67 6c 65 5c  \..      {Eagle\
16ca0 2e 5f 43 6f 6d 70 6f 6e 65 6e 74 73 5c 2e 50 75  ._Components\.Pu
16cb0 62 6c 69 63 5c 2e 53 63 72 69 70 74 45 78 63 65  blic\.ScriptExce
16cc0 70 74 69 6f 6e 3a 20 28 2e 2b 3f 29 20 20 28 3f  ption: (.+?)  (?
16cd0 3a 20 29 3f 61 74 7d 5d 0d 0a 0d 0a 20 20 20 20  : )?at}]....    
16ce0 20 20 66 6f 72 65 61 63 68 20 70 61 74 74 65 72    foreach patter
16cf0 6e 20 24 70 61 74 74 65 72 6e 73 20 7b 0d 0a 20  n $patterns {.. 
16d00 20 20 20 20 20 20 20 69 66 20 7b 5b 72 65 67 65         if {[rege
16d10 78 70 20 2d 2d 20 24 70 61 74 74 65 72 6e 20 24  xp -- $pattern $
16d20 76 61 6c 75 65 20 64 75 6d 6d 79 20 6d 65 73 73  value dummy mess
16d30 61 67 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  age]} then {..  
16d40 20 20 20 20 20 20 20 20 73 65 74 20 6d 65 73 73          set mess
16d50 61 67 65 20 5b 73 74 72 69 6e 67 20 6d 61 70 20  age [string map 
16d60 5b 6c 69 73 74 20 5c 72 5c 6e 20 5c 6e 5d 20 5b  [list \r\n \n] [
16d70 73 74 72 69 6e 67 20 74 72 69 6d 20 24 6d 65 73  string trim $mes
16d80 73 61 67 65 5d 5d 0d 0a 20 20 20 20 20 20 20 20  sage]]..        
16d90 20 20 73 65 74 20 6c 69 6e 65 73 20 5b 73 70 6c    set lines [spl
16da0 69 74 20 24 6d 65 73 73 61 67 65 20 5c 6e 5d 0d  it $message \n].
16db0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  ...          if 
16dc0 7b 5b 6c 6c 65 6e 67 74 68 20 24 6c 69 6e 65 73  {[llength $lines
16dd0 5d 20 3d 3d 20 32 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 2} then {..
16de0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
16df0 5b 6c 69 6e 64 65 78 20 24 6c 69 6e 65 73 20 30  [lindex $lines 0
16e00 5d 20 65 71 20 5b 6c 69 6e 64 65 78 20 24 6c 69  ] eq [lindex $li
16e10 6e 65 73 20 31 5d 7d 20 74 68 65 6e 20 7b 0d 0a  nes 1]} then {..
16e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
16e30 74 75 72 6e 20 5b 6c 69 6e 64 65 78 20 24 6c 69  turn [lindex $li
16e40 6e 65 73 20 30 5d 0d 0a 20 20 20 20 20 20 20 20  nes 0]..        
16e50 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
16e60 20 20 20 20 20 72 65 74 75 72 6e 20 5b 61 70 70       return [app
16e70 65 6e 64 41 72 67 73 20 5b 6c 69 6e 64 65 78 20  endArgs [lindex 
16e80 24 6c 69 6e 65 73 20 30 5d 20 22 20 2d 2d 20 22  $lines 0] " -- "
16e90 20 5b 6c 69 6e 64 65 78 20 24 6c 69 6e 65 73 20   [lindex $lines 
16ea0 31 5d 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  1]]..          }
16eb0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65  ....          re
16ec0 74 75 72 6e 20 24 6d 65 73 73 61 67 65 0d 0a 20  turn $message.. 
16ed0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
16ee0 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72  }....      retur
16ef0 6e 20 24 76 61 6c 75 65 0d 0a 20 20 20 20 7d 0d  n $value..    }.
16f00 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 74 72 69  ....    proc tri
16f10 6d 53 71 6c 20 7b 20 73 71 6c 20 7d 20 7b 0d 0a  mSql { sql } {..
16f20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 72 65        return [re
16f30 67 73 75 62 20 2d 61 6c 6c 20 2d 2d 20 7b 5c 73  gsub -all -- {\s
16f40 2b 7d 20 5b 73 74 72 69 6e 67 20 74 72 69 6d 20  +} [string trim 
16f50 24 73 71 6c 5d 20 22 20 22 5d 0d 0a 20 20 20 20  $sql] " "]..    
16f60 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 65  }.....    proc e
16f70 78 65 63 75 74 65 53 71 6c 20 7b 20 73 71 6c 20  xecuteSql { sql 
16f80 7b 65 78 65 63 75 74 65 20 6e 6f 6e 65 7d 20 7b  {execute none} {
16f90 66 6f 72 6d 61 74 20 6e 6f 6e 65 7d 20 7b 66 69  format none} {fi
16fa0 6c 65 4e 61 6d 65 20 22 22 7d 20 7d 20 7b 0d 0a  leName ""} } {..
16fb0 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
16fc0 67 20 6c 65 6e 67 74 68 20 24 66 69 6c 65 4e 61  g length $fileNa
16fd0 6d 65 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  me] == 0} then {
16fe0 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 3a 6d 65  set fileName :me
16ff0 6d 6f 72 79 3a 7d 0d 0a 20 20 20 20 20 20 73 65  mory:}..      se
17000 74 75 70 44 62 20 24 66 69 6c 65 4e 61 6d 65 20  tupDb $fileName 
17010 22 22 20 22 22 20 22 22 20 22 22 20 22 22 20 66  "" "" "" "" "" f
17020 61 6c 73 65 20 66 61 6c 73 65 20 66 61 6c 73 65  alse false false
17030 20 66 61 6c 73 65 20 64 62 20 74 72 75 65 0d 0a   false db true..
17040 0d 0a 20 20 20 20 20 20 74 72 79 20 7b 0d 0a 20  ..      try {.. 
17050 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 75         return [u
17060 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74 20 5c  plevel 1 [list \
17070 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ..            sq
17080 6c 20 65 78 65 63 75 74 65 20 2d 65 78 65 63 75  l execute -execu
17090 74 65 20 24 65 78 65 63 75 74 65 20 2d 66 6f 72  te $execute -for
170a0 6d 61 74 20 24 66 6f 72 6d 61 74 20 24 64 62 20  mat $format $db 
170b0 24 73 71 6c 5d 5d 0d 0a 20 20 20 20 20 20 7d 20  $sql]]..      } 
170c0 66 69 6e 61 6c 6c 79 20 7b 0d 0a 20 20 20 20 20  finally {..     
170d0 20 20 20 73 65 74 20 63 6f 6e 6e 65 63 74 69 6f     set connectio
170e0 6e 20 5b 67 65 74 44 62 43 6f 6e 6e 65 63 74 69  n [getDbConnecti
170f0 6f 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74  on]....        t
17100 72 79 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ry {..          
17110 63 6c 65 61 6e 75 70 44 62 20 24 66 69 6c 65 4e  cleanupDb $fileN
17120 61 6d 65 20 64 62 20 66 61 6c 73 65 20 66 61 6c  ame db false fal
17130 73 65 20 66 61 6c 73 65 0d 0a 20 20 20 20 20 20  se false..      
17140 20 20 7d 20 66 69 6e 61 6c 6c 79 20 7b 0d 0a 20    } finally {.. 
17150 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20           object 
17160 66 6c 61 67 73 20 24 63 6f 6e 6e 65 63 74 69 6f  flags $connectio
17170 6e 20 2d 4e 6f 44 69 73 70 6f 73 65 3b 20 66 72  n -NoDispose; fr
17180 65 65 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 0d 0a  eeDbConnection..
17190 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
171a0 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
171b0 20 20 70 72 6f 63 20 68 61 73 4e 6f 46 6c 61 67    proc hasNoFlag
171c0 73 20 7b 20 76 61 72 4e 61 6d 65 20 6e 6f 6e 65  s { varName none
171d0 20 7d 20 7b 0d 0a 20 20 20 20 20 20 75 70 76 61   } {..      upva
171e0 72 20 31 20 24 76 61 72 4e 61 6d 65 20 66 6c 61  r 1 $varName fla
171f0 67 73 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b  gs....      if {
17200 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 66 6c  ![info exists fl
17210 61 67 73 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ags]} then {..  
17220 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75        return tru
17230 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  e..      }....  
17240 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
17250 6c 65 6e 67 74 68 20 24 66 6c 61 67 73 5d 20 3d  length $flags] =
17260 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
17270 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65       return true
17280 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
17290 20 20 20 69 66 20 7b 24 6e 6f 6e 65 20 26 26 20     if {$none && 
172a0 24 66 6c 61 67 73 20 65 71 20 22 4e 6f 6e 65 22  $flags eq "None"
172b0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
172c0 20 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20    return true.. 
172d0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
172e0 72 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20  return false..  
172f0 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
17300 20 67 65 74 43 6f 6e 6e 65 63 74 69 6f 6e 46 6c   getConnectionFl
17310 61 67 73 20 7b 20 66 69 6c 65 4e 61 6d 65 20 66  ags { fileName f
17320 6c 61 67 73 20 7b 71 75 69 65 74 20 66 61 6c 73  lags {quiet fals
17330 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  e} } {..      #.
17340 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46  .      # NOTE: F
17350 69 67 75 72 65 20 6f 75 74 20 77 68 69 63 68 20  igure out which 
17360 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61  database file na
17370 6d 65 20 6f 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  me or connection
17380 20 73 74 72 69 6e 67 20 74 68 65 73 65 0d 0a 20   string these.. 
17390 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e       #       con
173a0 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 77 69  nection flags wi
173b0 6c 6c 20 61 63 74 75 61 6c 6c 79 20 61 70 70 6c  ll actually appl
173c0 79 20 74 6f 2e 20 20 54 68 69 73 20 69 73 20 6e  y to.  This is n
173d0 6f 74 20 6e 65 63 65 73 73 61 72 79 0d 0a 20 20  ot necessary..  
173e0 20 20 20 20 23 20 20 20 20 20 20 20 69 6e 20 71      #       in q
173f0 75 69 65 74 20 6d 6f 64 65 20 62 65 63 61 75 73  uiet mode becaus
17400 65 20 74 68 69 73 20 69 6e 66 6f 72 6d 61 74 69  e this informati
17410 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  on is only used 
17420 66 6f 72 20 6c 6f 67 67 69 6e 67 0d 0a 20 20 20  for logging..   
17430 20 20 20 23 20 20 20 20 20 20 20 61 6e 64 20 72     #       and r
17440 65 70 6f 72 74 69 6e 67 20 70 75 72 70 6f 73 65  eporting purpose
17450 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  s...      #..   
17460 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
17470 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
17480 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
17490 74 68 20 24 66 69 6c 65 4e 61 6d 65 5d 20 3e 20  th $fileName] > 
174a0 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
174b0 20 20 20 20 20 73 65 74 20 64 61 74 61 62 61 73       set databas
174c0 65 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 66  e [appendArgs "f
174d0 69 6c 65 20 6e 61 6d 65 20 5c 22 22 20 24 66 69  ile name \"" $fi
174e0 6c 65 4e 61 6d 65 20 5c 22 5d 0d 0a 20 20 20 20  leName \"]..    
174f0 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69      } elseif {[i
17500 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 64 61 74  nfo exists ::dat
17510 61 53 6f 75 72 63 65 5d 20 26 26 20 5c 0d 0a 20  aSource] && \.. 
17520 20 20 20 20 20 20 20 20 20 20 20 21 5b 61 72 72             ![arr
17530 61 79 20 65 78 69 73 74 73 20 3a 3a 64 61 74 61  ay exists ::data
17540 53 6f 75 72 63 65 5d 7d 20 74 68 65 6e 20 7b 0d  Source]} then {.
17550 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20 64  .          set d
17560 61 74 61 62 61 73 65 20 5b 61 70 70 65 6e 64 41  atabase [appendA
17570 72 67 73 20 22 64 61 74 61 20 73 6f 75 72 63 65  rgs "data source
17580 20 5c 22 22 20 24 3a 3a 64 61 74 61 53 6f 75 72   \"" $::dataSour
17590 63 65 20 5c 22 5d 0d 0a 20 20 20 20 20 20 20 20  ce \"]..        
175a0 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
175b0 20 20 20 20 73 65 74 20 64 61 74 61 62 61 73 65      set database
175c0 20 3c 75 6e 6b 6e 6f 77 6e 3e 0d 0a 20 20 20 20   <unknown>..    
175d0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
175e0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
175f0 20 23 20 4e 4f 54 45 3a 20 45 76 65 6e 20 74 68   # NOTE: Even th
17600 6f 75 67 68 20 74 68 65 72 65 20 69 73 20 6f 6e  ough there is on
17610 6c 79 20 6f 6e 65 20 73 6f 75 72 63 65 20 6f 66  ly one source of
17620 20 66 6c 61 67 73 20 73 6f 20 66 61 72 2c 20 74   flags so far, t
17630 68 65 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20  hey..      #    
17640 20 20 20 6d 75 73 74 20 62 65 20 63 6f 6d 62 69     must be combi
17650 6e 65 64 20 75 73 69 6e 67 20 74 68 65 20 63 6f  ned using the co
17660 72 72 65 63 74 20 73 79 6e 74 61 78 20 66 6f 72  rrect syntax for
17670 20 65 6e 75 6d 65 72 61 74 65 64 0d 0a 20 20 20   enumerated..   
17680 20 20 20 23 20 20 20 20 20 20 20 66 6c 61 67 20     #       flag 
17690 76 61 6c 75 65 73 20 66 6f 72 20 74 68 65 20 2e  values for the .
176a0 4e 45 54 20 46 72 61 6d 65 77 6f 72 6b 2e 0d 0a  NET Framework...
176b0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73        #..      s
176c0 65 74 20 66 6c 61 67 73 20 5b 63 6f 6d 62 69 6e  et flags [combin
176d0 65 46 6c 61 67 73 20 24 66 6c 61 67 73 20 22 22  eFlags $flags ""
176e0 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ]....      #..  
176f0 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77      # NOTE: Show
17700 20 28 61 6e 64 20 6c 6f 67 29 20 74 68 65 20 6c   (and log) the l
17710 6f 63 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ocal connection 
17720 66 6c 61 67 73 20 61 6e 64 20 74 68 65 20 61 73  flags and the as
17730 73 6f 63 69 61 74 65 64 0d 0a 20 20 20 20 20 20  sociated..      
17740 23 20 20 20 20 20 20 20 64 61 74 61 20 73 6f 75  #       data sou
17750 72 63 65 20 6f 72 20 66 69 6c 65 20 6e 61 6d 65  rce or file name
17760 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
17770 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
17780 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69  hen {..        i
17790 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
177a0 20 3a 3a 6e 6f 28 65 6d 69 74 4c 6f 63 61 6c 46   ::no(emitLocalF
177b0 6c 61 67 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20  lags)] && \..   
177c0 20 20 20 20 20 20 20 20 20 28 21 5b 69 6e 66 6f           (![info
177d0 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 65 6d 69   exists ::no(emi
177e0 74 4c 6f 63 61 6c 46 6c 61 67 73 49 66 4e 6f 6e  tLocalFlagsIfNon
177f0 65 29 5d 20 7c 7c 20 5c 0d 0a 20 20 20 20 20 20  e)] || \..      
17800 20 20 20 20 20 20 20 21 5b 68 61 73 4e 6f 46 6c         ![hasNoFl
17810 61 67 73 20 66 6c 61 67 73 20 66 61 6c 73 65 5d  ags flags false]
17820 29 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  )} then {..     
17830 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
17840 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
17850 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
17860 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6c 6f          "---- lo
17870 63 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66  cal connection f
17880 6c 61 67 73 20 66 6f 72 20 22 20 24 64 61 74 61  lags for " $data
17890 62 61 73 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  base \..        
178a0 20 20 20 20 20 20 22 20 61 72 65 3a 20 22 20 5b        " are: " [
178b0 65 78 70 72 20 7b 21 5b 68 61 73 4e 6f 46 6c 61  expr {![hasNoFla
178c0 67 73 20 66 6c 61 67 73 20 66 61 6c 73 65 5d 20  gs flags false] 
178d0 3f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ? \..           
178e0 20 20 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c     [appendArgs \
178f0 22 20 24 66 6c 61 67 73 20 5c 22 5d 20 3a 20 22  " $flags \"] : "
17900 3c 6e 6f 6e 65 3e 22 7d 5d 20 5c 6e 5d 0d 0a 20  <none>"}] \n].. 
17910 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
17920 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
17930 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77      # NOTE: Show
17940 20 28 61 6e 64 20 6c 6f 67 29 20 74 68 65 20 73   (and log) the s
17950 68 61 72 65 64 20 63 6f 6e 6e 65 63 74 69 6f 6e  hared connection
17960 20 66 6c 61 67 73 2e 0d 0a 20 20 20 20 20 20 23   flags...      #
17970 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 24 71 75  ..      if {!$qu
17980 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
17990 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
179a0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a  {..          obj
179b0 65 63 74 20 69 6e 76 6f 6b 65 20 53 79 73 74 65  ect invoke Syste
179c0 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51  m.Data.SQLite.SQ
179d0 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 53  LiteConnection S
179e0 68 61 72 65 64 46 6c 61 67 73 0d 0a 20 20 20 20  haredFlags..    
179f0 20 20 20 20 7d 20 73 68 61 72 65 64 46 6c 61 67      } sharedFlag
17a00 73 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  s] == 0} then {.
17a10 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21  .          if {!
17a20 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
17a30 6f 28 65 6d 69 74 53 68 61 72 65 64 46 6c 61 67  o(emitSharedFlag
17a40 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  s)] && \..      
17a50 20 20 20 20 20 20 20 20 28 21 5b 69 6e 66 6f 20          (![info 
17a60 65 78 69 73 74 73 20 3a 3a 6e 6f 28 65 6d 69 74  exists ::no(emit
17a70 53 68 61 72 65 64 46 6c 61 67 73 49 66 4e 6f 6e  SharedFlagsIfNon
17a80 65 29 5d 20 7c 7c 20 5c 0d 0a 20 20 20 20 20 20  e)] || \..      
17a90 20 20 20 20 20 20 20 20 20 21 5b 68 61 73 4e 6f           ![hasNo
17aa0 46 6c 61 67 73 20 73 68 61 72 65 64 46 6c 61 67  Flags sharedFlag
17ab0 73 20 74 72 75 65 5d 29 7d 20 74 68 65 6e 20 7b  s true])} then {
17ac0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
17ad0 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
17ae0 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
17af0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
17b00 20 20 20 22 2d 2d 2d 2d 20 73 68 61 72 65 64 20     "---- shared 
17b10 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73  connection flags
17b20 20 66 6f 72 20 22 20 24 64 61 74 61 62 61 73 65   for " $database
17b30 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
17b40 20 20 20 20 22 20 61 72 65 3a 20 22 20 5b 65 78      " are: " [ex
17b50 70 72 20 7b 21 5b 68 61 73 4e 6f 46 6c 61 67 73  pr {![hasNoFlags
17b60 20 73 68 61 72 65 64 46 6c 61 67 73 20 74 72 75   sharedFlags tru
17b70 65 5d 20 3f 20 5c 0d 0a 20 20 20 20 20 20 20 20  e] ? \..        
17b80 20 20 20 20 20 20 20 20 5b 61 70 70 65 6e 64 41          [appendA
17b90 72 67 73 20 5c 22 20 24 73 68 61 72 65 64 46 6c  rgs \" $sharedFl
17ba0 61 67 73 20 5c 22 5d 20 3a 20 22 3c 6e 6f 6e 65  ags \"] : "<none
17bb0 3e 22 7d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  >"}] \n]..      
17bc0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
17bd0 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
17be0 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
17bf0 69 73 74 73 20 3a 3a 6e 6f 28 65 6d 69 74 53 68  ists ::no(emitSh
17c00 61 72 65 64 46 6c 61 67 73 29 5d 20 26 26 20 5c  aredFlags)] && \
17c10 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
17c20 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
17c30 6e 6f 28 65 6d 69 74 53 68 61 72 65 64 46 6c 61  no(emitSharedFla
17c40 67 73 49 66 55 6e 61 76 61 69 6c 61 62 6c 65 29  gsIfUnavailable)
17c50 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
17c60 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
17c70 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
17c80 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
17c90 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
17ca0 2d 20 73 68 61 72 65 64 20 63 6f 6e 6e 65 63 74  - shared connect
17cb0 69 6f 6e 20 66 6c 61 67 73 20 66 6f 72 20 22 20  ion flags for " 
17cc0 24 64 61 74 61 62 61 73 65 20 5c 0d 0a 20 20 20  $database \..   
17cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 61               " a
17ce0 72 65 3a 20 3c 75 6e 61 76 61 69 6c 61 62 6c 65  re: <unavailable
17cf0 3e 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20  >\n"]..         
17d00 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20   }..        }.. 
17d10 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
17d20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
17d30 20 53 68 6f 77 20 28 61 6e 64 20 6c 6f 67 29 20   Show (and log) 
17d40 74 68 65 20 64 65 74 65 63 74 65 64 20 67 6c 6f  the detected glo
17d50 62 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66  bal connection f
17d60 6c 61 67 73 2c 20 69 66 20 61 6e 79 2e 0d 0a 20  lags, if any... 
17d70 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
17d80 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
17d90 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21  {..        if {!
17da0 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
17db0 6f 28 65 6d 69 74 47 6c 6f 62 61 6c 46 6c 61 67  o(emitGlobalFlag
17dc0 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  s)] && \..      
17dd0 20 20 20 20 20 20 28 21 5b 69 6e 66 6f 20 65 78        (![info ex
17de0 69 73 74 73 20 3a 3a 6e 6f 28 65 6d 69 74 47 6c  ists ::no(emitGl
17df0 6f 62 61 6c 46 6c 61 67 73 49 66 4e 6f 6e 65 29  obalFlagsIfNone)
17e00 5d 20 7c 7c 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] || \..        
17e10 20 20 20 20 20 21 5b 68 61 73 4e 6f 46 6c 61 67       ![hasNoFlag
17e20 73 20 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e 5f 66  s ::connection_f
17e30 6c 61 67 73 20 66 61 6c 73 65 5d 29 7d 20 74 68  lags false])} th
17e40 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
17e50 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
17e60 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
17e70 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
17e80 20 20 20 22 2d 2d 2d 2d 20 67 6c 6f 62 61 6c 20     "---- global 
17e90 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73  connection flags
17ea0 20 61 72 65 3a 20 22 20 5c 0d 0a 20 20 20 20 20   are: " \..     
17eb0 20 20 20 20 20 20 20 20 20 5b 65 78 70 72 20 7b           [expr {
17ec0 21 5b 68 61 73 4e 6f 46 6c 61 67 73 20 3a 3a 63  ![hasNoFlags ::c
17ed0 6f 6e 6e 65 63 74 69 6f 6e 5f 66 6c 61 67 73 20  onnection_flags 
17ee0 66 61 6c 73 65 5d 20 3f 20 5c 0d 0a 20 20 20 20  false] ? \..    
17ef0 20 20 20 20 20 20 20 20 20 20 5b 61 70 70 65 6e            [appen
17f00 64 41 72 67 73 20 5c 22 20 24 3a 3a 63 6f 6e 6e  dArgs \" $::conn
17f10 65 63 74 69 6f 6e 5f 66 6c 61 67 73 20 5c 22 5d  ection_flags \"]
17f20 20 3a 20 22 3c 6e 6f 6e 65 3e 22 7d 5d 20 5c 6e   : "<none>"}] \n
17f30 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  ]..        }..  
17f40 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
17f50 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
17f60 49 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79  If there are any
17f70 20 67 6c 6f 62 61 6c 20 28 70 65 72 20 74 65 73   global (per tes
17f80 74 20 72 75 6e 29 20 63 6f 6e 6e 65 63 74 69 6f  t run) connectio
17f90 6e 20 66 6c 61 67 73 20 63 75 72 72 65 6e 74 6c  n flags currentl
17fa0 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  y..      #      
17fb0 20 73 65 74 2c 20 75 73 65 20 74 68 65 6d 20 6e   set, use them n
17fc0 6f 77 20 28 69 2e 65 2e 20 62 79 20 63 6f 6d 62  ow (i.e. by comb
17fd0 69 6e 69 6e 67 20 74 68 65 6d 20 77 69 74 68 20  ining them with 
17fe0 74 68 65 20 6f 6e 65 73 20 66 6f 72 20 74 68 69  the ones for thi
17ff0 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  s..      #      
18000 20 63 6f 6e 6e 65 63 74 69 6f 6e 29 2e 0d 0a 20   connection)... 
18010 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
18020 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
18030 3a 63 6f 6e 6e 65 63 74 69 6f 6e 5f 66 6c 61 67  :connection_flag
18040 73 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  s]} then {..    
18050 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
18060 20 4e 4f 54 45 3a 20 43 6f 6d 62 69 6e 65 20 61   NOTE: Combine a
18070 6e 64 2f 6f 72 20 72 65 70 6c 61 63 65 20 74 68  nd/or replace th
18080 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61  e connection fla
18090 67 73 20 61 6e 64 20 74 68 65 6e 20 73 68 6f 77  gs and then show
180a0 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20   the..        # 
180b0 20 20 20 20 20 20 6e 65 77 20 76 61 6c 75 65 2e        new value.
180c0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
180d0 20 20 20 20 20 73 65 74 20 66 6c 61 67 73 20 5b       set flags [
180e0 63 6f 6d 62 69 6e 65 46 6c 61 67 73 20 24 66 6c  combineFlags $fl
180f0 61 67 73 20 24 3a 3a 63 6f 6e 6e 65 63 74 69 6f  ags $::connectio
18100 6e 5f 66 6c 61 67 73 5d 0d 0a 0d 0a 20 20 20 20  n_flags]....    
18110 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
18120 20 4e 4f 54 45 3a 20 53 68 6f 77 20 28 61 6e 64   NOTE: Show (and
18130 20 6c 6f 67 29 20 74 68 65 20 6e 65 77 20 65 66   log) the new ef
18140 66 65 63 74 69 76 65 20 63 6f 6e 6e 65 63 74 69  fective connecti
18150 6f 6e 20 66 6c 61 67 73 2e 0d 0a 20 20 20 20 20  on flags...     
18160 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66     #..        if
18170 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
18180 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  {..          if 
18190 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
181a0 3a 6e 6f 28 65 6d 69 74 43 6f 6d 62 69 6e 65 64  :no(emitCombined
181b0 46 6c 61 67 73 29 5d 20 26 26 20 5c 0d 0a 20 20  Flags)] && \..  
181c0 20 20 20 20 20 20 20 20 20 20 20 20 28 21 5b 69              (![i
181d0 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
181e0 65 6d 69 74 43 6f 6d 62 69 6e 65 64 46 6c 61 67  emitCombinedFlag
181f0 73 49 66 4e 6f 6e 65 29 5d 20 7c 7c 20 5c 0d 0a  sIfNone)] || \..
18200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 21                 !
18210 5b 68 61 73 4e 6f 46 6c 61 67 73 20 66 6c 61 67  [hasNoFlags flag
18220 73 20 66 61 6c 73 65 5d 29 7d 20 74 68 65 6e 20  s false])} then 
18230 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
18240 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
18250 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
18260 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
18270 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 6d 62 69 6e      "---- combin
18280 65 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c  ed connection fl
18290 61 67 73 20 66 6f 72 20 22 20 24 64 61 74 61 62  ags for " $datab
182a0 61 73 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ase \..         
182b0 20 20 20 20 20 20 20 22 20 61 72 65 3a 20 22 20         " are: " 
182c0 5b 65 78 70 72 20 7b 21 5b 68 61 73 4e 6f 46 6c  [expr {![hasNoFl
182d0 61 67 73 20 66 6c 61 67 73 20 66 61 6c 73 65 5d  ags flags false]
182e0 20 3f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   ? \..          
182f0 20 20 20 20 20 20 5b 61 70 70 65 6e 64 41 72 67        [appendArg
18300 73 20 5c 22 20 24 66 6c 61 67 73 20 5c 22 5d 20  s \" $flags \"] 
18310 3a 20 22 3c 6e 6f 6e 65 3e 22 7d 5d 20 5c 6e 5d  : "<none>"}] \n]
18320 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
18330 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
18340 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72  }....      retur
18350 6e 20 24 66 6c 61 67 73 0d 0a 20 20 20 20 7d 0d  n $flags..    }.
18360 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74  ....    proc get
18370 46 6c 61 67 73 50 72 6f 70 65 72 74 79 20 7b 20  FlagsProperty { 
18380 7b 66 6c 61 67 73 20 22 22 7d 20 7b 71 75 69 65  {flags ""} {quie
18390 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20  t false} } {..  
183a0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
183b0 4f 54 45 3a 20 44 65 74 65 72 6d 69 6e 65 20 77  OTE: Determine w
183c0 68 61 74 20 74 68 65 20 63 6f 6d 62 69 6e 65 64  hat the combined
183d0 20 28 67 6c 6f 62 61 6c 20 61 6e 64 20 6c 6f 63   (global and loc
183e0 61 6c 29 20 63 6f 6e 6e 65 63 74 69 6f 6e 0d 0a  al) connection..
183f0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 66 6c        #       fl
18400 61 67 73 20 73 68 6f 75 6c 64 20 62 65 2c 20 70  ags should be, p
18410 6f 73 73 69 62 6c 79 20 71 75 69 65 74 6c 79 2e  ossibly quietly.
18420 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
18430 20 73 65 74 20 66 6c 61 67 73 20 5b 67 65 74 43   set flags [getC
18440 6f 6e 6e 65 63 74 69 6f 6e 46 6c 61 67 73 20 22  onnectionFlags "
18450 22 20 24 66 6c 61 67 73 20 24 71 75 69 65 74 5d  " $flags $quiet]
18460 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
18470 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 6e 6f     # NOTE: If no
18480 20 67 6c 6f 62 61 6c 20 6f 72 20 6c 6f 63 61 6c   global or local
18490 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67   connection flag
184a0 73 20 77 65 72 65 20 73 70 65 63 69 66 69 65 64  s were specified
184b0 2c 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20  , the..      #  
184c0 20 20 20 20 20 64 65 66 61 75 6c 74 20 63 6f 6e       default con
184d0 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 73 68  nection flags sh
184e0 6f 75 6c 64 20 62 65 20 75 73 65 64 3b 20 74 68  ould be used; th
184f0 65 72 65 66 6f 72 65 2c 20 72 65 74 75 72 6e 0d  erefore, return.
18500 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61  .      #       a
18510 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 20 69  n empty string i
18520 6e 20 74 68 61 74 20 63 61 73 65 2e 0d 0a 20 20  n that case...  
18530 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
18540 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
18550 24 66 6c 61 67 73 5d 20 3d 3d 20 30 7d 20 74 68  $flags] == 0} th
18560 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65  en {..        re
18570 74 75 72 6e 20 22 22 0d 0a 20 20 20 20 20 20 7d  turn ""..      }
18580 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
18590 20 20 20 23 20 4e 4f 54 45 3a 20 49 6e 20 6f 72     # NOTE: In or
185a0 64 65 72 20 74 6f 20 63 68 65 63 6b 20 69 66 20  der to check if 
185b0 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6e 6e  the default conn
185c0 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 61 72 65  ection flags are
185d0 20 62 65 69 6e 67 20 75 73 65 64 0d 0a 20 20 20   being used..   
185e0 20 20 20 23 20 20 20 20 20 20 20 69 74 20 69 73     #       it is
185f0 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 61 74   necessary to at
18600 74 65 6d 70 74 20 61 20 63 6f 6e 76 65 72 73 69  tempt a conversi
18610 6f 6e 20 74 6f 20 74 68 65 20 61 63 74 75 61 6c  on to the actual
18620 20 65 6e 75 6d 65 72 61 74 65 64 0d 0a 20 20 20   enumerated..   
18630 20 20 20 23 20 20 20 20 20 20 20 74 79 70 65 2e     #       type.
18640 20 20 46 61 69 6c 69 6e 67 20 74 68 61 74 2c 20    Failing that, 
18650 74 68 65 20 63 68 65 63 6b 20 61 67 61 69 6e 73  the check agains
18660 74 20 74 68 65 20 64 65 66 61 75 6c 74 20 76 61  t the default va
18670 6c 75 65 20 77 69 6c 6c 20 62 65 0d 0a 20 20 20  lue will be..   
18680 20 20 20 23 20 20 20 20 20 20 20 73 6b 69 70 70     #       skipp
18690 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ed...      #..  
186a0 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
186b0 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 65 72  ..        set er
186c0 72 6f 72 20 6e 75 6c 6c 3b 20 23 20 49 47 4e 4f  ror null; # IGNO
186d0 52 45 44 0d 0a 0d 0a 20 20 20 20 20 20 20 20 6f  RED....        o
186e0 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 55 74 69  bject invoke Uti
186f0 6c 69 74 79 20 54 72 79 50 61 72 73 65 46 6c 61  lity TryParseFla
18700 67 73 45 6e 75 6d 20 22 22 20 5c 0d 0a 20 20 20  gsEnum "" \..   
18710 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e           System.
18720 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69  Data.SQLite.SQLi
18730 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 46 6c 61 67  teConnectionFlag
18740 73 20 22 22 20 24 66 6c 61 67 73 20 6e 75 6c 6c  s "" $flags null
18750 20 74 72 75 65 20 5c 0d 0a 20 20 20 20 20 20 20   true \..       
18760 20 20 20 20 20 74 72 75 65 20 74 72 75 65 20 65       true true e
18770 72 72 6f 72 0d 0a 20 20 20 20 20 20 7d 20 76 61  rror..      } va
18780 6c 75 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  lue]} then {..  
18790 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
187a0 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74   # NOTE: Attempt
187b0 69 6e 67 20 74 6f 20 70 61 72 73 65 20 74 68 65  ing to parse the
187c0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67   connection flag
187d0 73 20 63 61 75 73 65 64 20 61 20 73 63 72 69 70  s caused a scrip
187e0 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  t..        #    
187f0 20 20 20 65 72 72 6f 72 2e 20 20 45 6d 69 74 20     error.  Emit 
18800 61 20 77 61 72 6e 69 6e 67 20 74 6f 20 74 68 65  a warning to the
18810 20 74 65 73 74 20 6c 6f 67 20 66 69 6c 65 20 61   test log file a
18820 6e 64 20 63 6f 6e 74 69 6e 75 65 0d 0a 20 20 20  nd continue..   
18830 20 20 20 20 20 23 20 20 20 20 20 20 20 75 73 69       #       usi
18840 6e 67 20 61 6e 20 65 6d 74 70 79 20 73 74 72 69  ng an emtpy stri
18850 6e 67 20 69 6e 73 74 65 61 64 2e 0d 0a 20 20 20  ng instead...   
18860 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
18870 74 6c 6f 67 20 5b 61 70 70 65 6e 64 41 72 67 73  tlog [appendArgs
18880 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
18890 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66  "==== WARNING: f
188a0 61 69 6c 65 64 20 74 6f 20 70 61 72 73 65 20 63  ailed to parse c
188b0 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 2c  onnection flags,
188c0 20 65 72 72 6f 72 3a 20 22 20 5c 0d 0a 20 20 20   error: " \..   
188d0 20 20 20 20 20 20 20 20 20 5c 6e 5c 74 20 24 76           \n\t $v
188e0 61 6c 75 65 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20  alue \n]....    
188f0 20 20 20 20 73 65 74 20 76 61 6c 75 65 20 22 22      set value ""
18900 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
18910 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
18920 54 45 3a 20 49 66 20 74 68 65 20 63 6f 6d 62 69  TE: If the combi
18930 6e 65 64 20 66 6c 61 67 73 20 73 74 72 69 6e 67  ned flags string
18940 20 63 6f 75 6c 64 20 6e 6f 74 20 61 63 74 75 61   could not actua
18950 6c 6c 79 20 62 65 20 63 6f 6e 76 65 72 74 65 64  lly be converted
18960 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
18970 74 6f 20 74 68 65 20 65 6e 75 6d 65 72 61 74 65  to the enumerate
18980 64 20 74 79 70 65 20 69 74 20 69 73 20 74 68 65  d type it is the
18990 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 2c 20   default value, 
189a0 74 68 65 6e 20 6a 75 73 74 20 75 73 65 0d 0a 20  then just use.. 
189b0 20 20 20 20 20 23 20 20 20 20 20 20 20 69 74 20       #       it 
189c0 76 65 72 62 61 74 69 6d 3b 20 6f 74 68 65 72 77  verbatim; otherw
189d0 69 73 65 2c 20 6a 75 73 74 20 72 65 74 75 72 6e  ise, just return
189e0 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67   an empty string
189f0 2e 20 20 49 6e 20 74 68 61 74 0d 0a 20 20 20 20  .  In that..    
18a00 20 20 23 20 20 20 20 20 20 20 63 61 73 65 2c 20    #       case, 
18a10 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6e 6e  the default conn
18a20 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 77 69 6c  ection flags wil
18a30 6c 20 62 65 20 75 73 65 64 2e 0d 0a 20 20 20 20  l be used...    
18a40 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
18a50 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76  string length $v
18a60 61 6c 75 65 5d 20 3d 3d 20 30 20 7c 7c 20 24 76  alue] == 0 || $v
18a70 61 6c 75 65 20 6e 65 20 22 44 65 66 61 75 6c 74  alue ne "Default
18a80 22 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  "} then {..     
18a90 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
18aa0 57 41 52 4e 49 4e 47 3a 20 54 68 69 73 20 72 65  WARNING: This re
18ab0 74 75 72 6e 73 20 74 68 65 20 73 74 72 69 6e 67  turns the string
18ac0 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 63 6f   value of the co
18ad0 6d 62 69 6e 65 64 20 66 6c 61 67 73 2c 20 6e 6f  mbined flags, no
18ae0 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  t..        #    
18af0 20 20 20 20 20 20 74 68 65 20 65 6e 75 6d 65 72        the enumer
18b00 61 74 65 64 20 76 61 6c 75 65 2e 20 20 54 68 69  ated value.  Thi
18b10 73 20 69 73 20 62 79 20 64 65 73 69 67 6e 20 61  s is by design a
18b20 6e 64 20 73 68 6f 75 6c 64 20 6e 6f 74 0d 0a 20  nd should not.. 
18b30 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20         #        
18b40 20 20 62 65 20 63 68 61 6e 67 65 64 20 77 69 74    be changed wit
18b50 68 6f 75 74 20 63 61 72 65 66 75 6c 20 63 6f 6e  hout careful con
18b60 73 69 64 65 72 61 74 69 6f 6e 20 28 65 2e 67 2e  sideration (e.g.
18b70 20 69 74 20 77 6f 75 6c 64 0d 0a 20 20 20 20 20   it would..     
18b80 20 20 20 23 20 20 20 20 20 20 20 20 20 20 70 72     #          pr
18b90 65 76 65 6e 74 20 74 68 65 20 53 51 4c 69 74 65  event the SQLite
18ba0 43 6f 6e 6e 65 63 74 69 6f 6e 20 63 6c 61 73 73  Connection class
18bb0 20 66 72 6f 6d 20 61 6c 6c 6f 77 69 6e 67 20 69   from allowing i
18bc0 6e 76 61 6c 69 64 0d 0a 20 20 20 20 20 20 20 20  nvalid..        
18bd0 23 20 20 20 20 20 20 20 20 20 20 5b 22 6d 61 67  #          ["mag
18be0 69 63 61 6c 22 5d 20 6d 65 74 61 2d 66 6c 61 67  ical"] meta-flag
18bf0 73 29 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  s)...        #..
18c00 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b          return [
18c10 61 70 70 65 6e 64 41 72 67 73 20 22 46 6c 61 67  appendArgs "Flag
18c20 73 3d 22 20 24 66 6c 61 67 73 20 5c 3b 5d 0d 0a  s=" $flags \;]..
18c30 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
18c40 20 72 65 74 75 72 6e 20 22 22 0d 0a 20 20 20 20   return ""..    
18c50 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67  }.....    proc g
18c60 65 74 54 65 73 74 50 72 6f 70 65 72 74 69 65 73  etTestProperties
18c70 20 7b 20 7b 66 6c 61 67 73 20 22 22 7d 20 7b 71   { {flags ""} {q
18c80 75 69 65 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d  uiet false} } {.
18c90 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
18ca0 23 20 4e 4f 54 45 3a 20 53 74 61 72 74 20 77 69  # NOTE: Start wi
18cb0 74 68 20 22 46 6c 61 67 73 22 20 70 72 6f 70 65  th "Flags" prope
18cc0 72 74 79 20 66 6f 72 20 74 68 65 20 6e 65 77 20  rty for the new 
18cd0 63 6f 6e 6e 65 63 74 69 6f 6e 2c 20 69 66 20 61  connection, if a
18ce0 6e 79 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ny...      #..  
18cf0 20 20 20 20 73 65 74 20 72 65 73 75 6c 74 20 5b      set result [
18d00 67 65 74 46 6c 61 67 73 50 72 6f 70 65 72 74 79  getFlagsProperty
18d10 20 24 66 6c 61 67 73 20 24 71 75 69 65 74 5d 0d   $flags $quiet].
18d20 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
18d30 20 20 23 20 4e 4f 54 45 3a 20 41 64 64 20 74 68    # NOTE: Add th
18d40 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 63 75  e name of the cu
18d50 72 72 65 6e 74 20 74 65 73 74 20 66 69 6c 65 2c  rrent test file,
18d60 20 69 66 20 61 76 61 69 6c 61 62 6c 65 2e 20 20   if available.  
18d70 54 68 69 73 20 69 73 0d 0a 20 20 20 20 20 20 23  This is..      #
18d80 20 20 20 20 20 20 20 6f 6e 6c 79 20 75 73 65 64         only used
18d90 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 2e 0d   for debugging..
18da0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
18db0 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
18dc0 20 3a 3a 74 65 73 74 5f 66 69 6c 65 5d 7d 20 74   ::test_file]} t
18dd0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 61  hen {..        a
18de0 70 70 65 6e 64 20 72 65 73 75 6c 74 20 54 65 73  ppend result Tes
18df0 74 46 69 6c 65 3d 20 24 3a 3a 74 65 73 74 5f 66  tFile= $::test_f
18e00 69 6c 65 20 5c 3b 0d 0a 20 20 20 20 20 20 7d 0d  ile \;..      }.
18e10 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
18e20 20 20 23 20 4e 4f 54 45 3a 20 41 64 64 20 74 68    # NOTE: Add th
18e30 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 63 75  e name of the cu
18e40 72 72 65 6e 74 20 74 65 73 74 2c 20 69 66 20 61  rrent test, if a
18e50 76 61 69 6c 61 62 6c 65 2e 20 20 54 68 69 73 20  vailable.  This 
18e60 69 73 20 6f 6e 6c 79 0d 0a 20 20 20 20 20 20 23  is only..      #
18e70 20 20 20 20 20 20 20 75 73 65 64 20 66 6f 72 20         used for 
18e80 64 65 62 75 67 67 69 6e 67 2e 0d 0a 20 20 20 20  debugging...    
18e90 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
18ea0 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 65 61  info exists ::ea
18eb0 67 6c 65 5f 74 65 73 74 73 28 43 75 72 72 65 6e  gle_tests(Curren
18ec0 74 4e 61 6d 65 29 5d 7d 20 74 68 65 6e 20 7b 0d  tName)]} then {.
18ed0 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 20  .        append 
18ee0 72 65 73 75 6c 74 20 54 65 73 74 4e 61 6d 65 3d  result TestName=
18ef0 20 24 3a 3a 65 61 67 6c 65 5f 74 65 73 74 73 28   $::eagle_tests(
18f00 43 75 72 72 65 6e 74 4e 61 6d 65 29 20 5c 3b 0d  CurrentName) \;.
18f10 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
18f20 20 20 72 65 74 75 72 6e 20 24 72 65 73 75 6c 74    return $result
18f30 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
18f40 70 72 6f 63 20 65 6e 61 62 6c 65 53 68 61 72 65  proc enableShare
18f50 64 43 61 63 68 65 20 7b 20 63 68 61 6e 6e 65 6c  dCache { channel
18f60 20 65 6e 61 62 6c 65 20 7b 71 75 69 65 74 20 66   enable {quiet f
18f70 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  alse} } {..     
18f80 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
18f90 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e         object in
18fa0 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e  voke -flags +Non
18fb0 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20  Public \..      
18fc0 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74        System.Dat
18fd0 61 2e 53 51 4c 69 74 65 2e 55 6e 73 61 66 65 4e  a.SQLite.UnsafeN
18fe0 61 74 69 76 65 4d 65 74 68 6f 64 73 20 5c 0d 0a  ativeMethods \..
18ff0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
19000 74 65 33 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65  te3_enable_share
19010 64 5f 63 61 63 68 65 20 5b 65 78 70 72 20 69 6e  d_cache [expr in
19020 74 28 24 65 6e 61 62 6c 65 29 5d 0d 0a 20 20 20  t($enable)]..   
19030 20 20 20 7d 20 72 65 73 75 6c 74 5d 20 3d 3d 20     } result] == 
19040 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
19050 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
19060 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
19070 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
19080 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
19090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
190a0 2d 2d 2d 20 63 61 6c 6c 20 73 71 6c 69 74 65 33  --- call sqlite3
190b0 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f 63  _enable_shared_c
190c0 61 63 68 65 28 22 20 24 65 6e 61 62 6c 65 20 5c  ache(" $enable \
190d0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
190e0 22 29 2e 2e 2e 20 6f 6b 3a 20 22 20 24 72 65 73  ")... ok: " $res
190f0 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ult \n]..       
19100 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65   }..      } else
19110 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   {..        if {
19120 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
19130 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
19140 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
19150 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
19160 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 61 6c         "---- cal
19170 6c 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65  l sqlite3_enable
19180 5f 73 68 61 72 65 64 5f 63 61 63 68 65 28 22 20  _shared_cache(" 
19190 24 65 6e 61 62 6c 65 20 5c 0d 0a 20 20 20 20 20  $enable \..     
191a0 20 20 20 20 20 20 20 20 20 22 29 2e 2e 2e 20 65           ")... e
191b0 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 72 65  rror: " \n\t $re
191c0 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  sult \n]..      
191d0 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20    }..      }..  
191e0 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
191f0 20 73 65 74 75 70 44 62 20 7b 0d 0a 20 20 20 20   setupDb {..    
19200 20 20 20 20 20 20 20 20 66 69 6c 65 4e 61 6d 65          fileName
19210 20 7b 6d 6f 64 65 20 22 22 7d 20 7b 64 61 74 65   {mode ""} {date
19220 54 69 6d 65 46 6f 72 6d 61 74 20 22 22 7d 20 7b  TimeFormat ""} {
19230 64 61 74 65 54 69 6d 65 4b 69 6e 64 20 22 22 7d  dateTimeKind ""}
19240 20 7b 66 6c 61 67 73 20 22 22 7d 0d 0a 20 20 20   {flags ""}..   
19250 20 20 20 20 20 20 20 20 20 7b 65 78 74 72 61 20           {extra 
19260 22 22 7d 20 7b 71 75 61 6c 69 66 79 20 74 72 75  ""} {qualify tru
19270 65 7d 20 7b 64 65 6c 65 74 65 20 74 72 75 65 7d  e} {delete true}
19280 20 7b 75 72 69 20 66 61 6c 73 65 7d 0d 0a 20 20   {uri false}..  
19290 20 20 20 20 20 20 20 20 20 20 7b 74 65 6d 70 6f            {tempo
192a0 72 61 72 79 20 74 72 75 65 7d 20 7b 76 61 72 4e  rary true} {varN
192b0 61 6d 65 20 64 62 7d 20 7b 71 75 69 65 74 20 66  ame db} {quiet f
192c0 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  alse} } {..     
192d0 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
192e0 3a 20 46 69 72 73 74 2c 20 73 65 65 20 69 66 20  : First, see if 
192f0 6f 75 72 20 63 61 6c 6c 65 72 20 68 61 73 20 72  our caller has r
19300 65 71 75 65 73 74 65 64 20 61 6e 20 69 6e 2d 6d  equested an in-m
19310 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0d  emory database..
19320 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
19330 73 65 74 20 69 73 4d 65 6d 6f 72 79 20 5b 69 73  set isMemory [is
19340 4d 65 6d 6f 72 79 44 62 20 24 66 69 6c 65 4e 61  MemoryDb $fileNa
19350 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a  me]....      #..
19360 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 6f        # NOTE: Fo
19370 72 20 6e 6f 77 2c 20 61 6c 6c 20 74 65 73 74 20  r now, all test 
19380 64 61 74 61 62 61 73 65 73 20 75 73 65 64 20 62  databases used b
19390 79 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65  y the test suite
193a0 20 61 72 65 20 70 6c 61 63 65 64 0d 0a 20 20 20   are placed..   
193b0 20 20 20 23 20 20 20 20 20 20 20 69 6e 74 6f 20     #       into 
193c0 74 68 65 20 64 61 74 61 62 61 73 65 20 64 69 72  the database dir
193d0 65 63 74 6f 72 79 2e 20 20 45 61 63 68 20 64 61  ectory.  Each da
193e0 74 61 62 61 73 65 20 61 6e 64 20 72 65 6c 61 74  tabase and relat
193f0 65 64 20 66 69 6c 65 73 0d 0a 20 20 20 20 20 20  ed files..      
19400 23 20 20 20 20 20 20 20 75 73 65 64 20 62 79 20  #       used by 
19410 61 20 74 65 73 74 20 73 68 6f 75 6c 64 20 62 65  a test should be
19420 20 63 6c 65 61 6e 65 64 20 75 70 20 62 79 20 74   cleaned up by t
19430 68 61 74 20 74 65 73 74 20 75 73 69 6e 67 20 74  hat test using t
19440 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  he..      #     
19450 20 20 22 63 6c 65 61 6e 75 70 44 62 22 20 70 72    "cleanupDb" pr
19460 6f 63 65 64 75 72 65 2c 20 62 65 6c 6f 77 2e 0d  ocedure, below..
19470 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
19480 69 66 20 7b 21 24 69 73 4d 65 6d 6f 72 79 20 26  if {!$isMemory &
19490 26 20 24 71 75 61 6c 69 66 79 7d 20 74 68 65 6e  & $qualify} then
194a0 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   {..        set 
194b0 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6a  fileName [file j
194c0 6f 69 6e 20 5b 67 65 74 44 61 74 61 62 61 73 65  oin [getDatabase
194d0 44 69 72 65 63 74 6f 72 79 5d 20 5b 66 69 6c 65  Directory] [file
194e0 20 74 61 69 6c 20 24 66 69 6c 65 4e 61 6d 65 5d   tail $fileName]
194f0 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  ]..      }....  
19500 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
19510 4f 54 45 3a 20 42 79 20 64 65 66 61 75 6c 74 2c  OTE: By default,
19520 20 64 65 6c 65 74 65 20 61 6e 79 20 70 72 65 2d   delete any pre-
19530 65 78 69 73 74 69 6e 67 20 64 61 74 61 62 61 73  existing databas
19540 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  e with the same 
19550 66 69 6c 65 0d 0a 20 20 20 20 20 20 23 20 20 20  file..      #   
19560 20 20 20 20 6e 61 6d 65 20 69 66 20 69 74 20 63      name if it c
19570 75 72 72 65 6e 74 6c 79 20 65 78 69 73 74 73 2e  urrently exists.
19580 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
19590 20 69 66 20 7b 21 24 69 73 4d 65 6d 6f 72 79 20   if {!$isMemory 
195a0 26 26 20 24 64 65 6c 65 74 65 20 26 26 20 5b 66  && $delete && [f
195b0 69 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c 65  ile exists $file
195c0 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  Name]} then {.. 
195d0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
195e0 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70    # NOTE: Attemp
195f0 74 20 74 6f 20 64 65 6c 65 74 65 20 61 6e 79 20  t to delete any 
19600 70 72 65 2d 65 78 69 73 74 69 6e 67 20 64 61 74  pre-existing dat
19610 61 62 61 73 65 20 77 69 74 68 20 74 68 65 20 73  abase with the s
19620 61 6d 65 20 66 69 6c 65 0d 0a 20 20 20 20 20 20  ame file..      
19630 20 20 23 20 20 20 20 20 20 20 6e 61 6d 65 2e 0d    #       name..
19640 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
19650 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
19660 66 69 6c 65 20 64 65 6c 65 74 65 20 24 66 69 6c  file delete $fil
19670 65 4e 61 6d 65 7d 20 65 72 72 6f 72 5d 7d 20 74  eName} error]} t
19680 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
19690 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
196a0 4e 4f 54 45 3a 20 57 65 20 73 6f 6d 65 68 6f 77  NOTE: We somehow
196b0 20 66 61 69 6c 65 64 20 74 6f 20 64 65 6c 65 74   failed to delet
196c0 65 20 74 68 65 20 66 69 6c 65 2c 20 72 65 70 6f  e the file, repo
196d0 72 74 20 77 68 79 2e 0d 0a 20 20 20 20 20 20 20  rt why...       
196e0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
196f0 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
19700 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
19710 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
19720 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
19730 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
19740 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e        "==== WARN
19750 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 64  ING: failed to d
19760 65 6c 65 74 65 20 64 61 74 61 62 61 73 65 20 66  elete database f
19770 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d  ile \"" $fileNam
19780 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
19790 20 20 20 20 20 22 5c 22 20 64 75 72 69 6e 67 20       "\" during 
197a0 73 65 74 75 70 2c 20 65 72 72 6f 72 3a 20 22 20  setup, error: " 
197b0 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d  \n\t $error \n].
197c0 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
197d0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
197e0 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
197f0 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 66 65 72     # NOTE: Refer
19800 20 74 6f 20 74 68 65 20 73 70 65 63 69 66 69 65   to the specifie
19810 64 20 76 61 72 69 61 62 6c 65 20 28 65 2e 67 2e  d variable (e.g.
19820 20 22 64 62 22 29 20 69 6e 20 74 68 65 20 63 6f   "db") in the co
19830 6e 74 65 78 74 20 6f 66 20 6f 75 72 0d 0a 20 20  ntext of our..  
19840 20 20 20 20 23 20 20 20 20 20 20 20 63 61 6c 6c      #       call
19850 65 72 2e 20 20 54 68 65 20 68 61 6e 64 6c 65 20  er.  The handle 
19860 74 6f 20 74 68 65 20 6f 70 65 6e 65 64 20 64 61  to the opened da
19870 74 61 62 61 73 65 20 77 69 6c 6c 20 62 65 20 73  tabase will be s
19880 74 6f 72 65 64 20 74 68 65 72 65 2e 0d 0a 20 20  tored there...  
19890 20 20 20 20 23 0d 0a 20 20 20 20 20 20 75 70 76      #..      upv
198a0 61 72 20 31 20 24 76 61 72 4e 61 6d 65 20 64 62  ar 1 $varName db
198b0 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
198c0 20 20 20 23 20 4e 4f 54 45 3a 20 53 74 61 72 74     # NOTE: Start
198d0 20 62 75 69 6c 64 69 6e 67 20 74 68 65 20 63 6f   building the co
198e0 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e 67 2e  nnection string.
198f0 20 20 54 68 65 20 6f 6e 6c 79 20 72 65 71 75 69    The only requi
19900 72 65 64 20 70 6f 72 74 69 6f 6e 0d 0a 20 20 20  red portion..   
19910 20 20 20 23 20 20 20 20 20 20 20 6f 66 20 74 68     #       of th
19920 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72  e connection str
19930 69 6e 67 20 69 73 20 74 68 65 20 64 61 74 61 20  ing is the data 
19940 73 6f 75 72 63 65 2c 20 77 68 69 63 68 20 63 6f  source, which co
19950 6e 74 61 69 6e 73 20 74 68 65 0d 0a 20 20 20 20  ntains the..    
19960 20 20 23 20 20 20 20 20 20 20 64 61 74 61 62 61    #       databa
19970 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 69 74 73  se file name its
19980 65 6c 66 2e 20 20 49 66 20 6f 75 72 20 63 61 6c  elf.  If our cal
19990 6c 65 72 20 77 61 6e 74 73 20 74 6f 20 75 73 65  ler wants to use
199a0 20 61 20 55 52 49 20 61 73 0d 0a 20 20 20 20 20   a URI as..     
199b0 20 23 20 20 20 20 20 20 20 74 68 65 20 64 61 74   #       the dat
199c0 61 20 73 6f 75 72 63 65 2c 20 75 73 65 20 74 68  a source, use th
199d0 65 20 46 75 6c 6c 55 72 69 20 63 6f 6e 6e 65 63  e FullUri connec
199e0 74 69 6f 6e 20 73 74 72 69 6e 67 20 70 72 6f 70  tion string prop
199f0 65 72 74 79 20 74 6f 0d 0a 20 20 20 20 20 20 23  erty to..      #
19a00 20 20 20 20 20 20 20 70 72 65 76 65 6e 74 20 74         prevent t
19a10 68 65 20 64 61 74 61 20 73 6f 75 72 63 65 20 73  he data source s
19a20 74 72 69 6e 67 20 66 72 6f 6d 20 62 65 69 6e 67  tring from being
19a30 20 6d 61 6e 67 6c 65 64 2e 0d 0a 20 20 20 20 20   mangled...     
19a40 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 75   #..      if {$u
19a50 72 69 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  ri} then {..    
19a60 20 20 20 20 73 65 74 20 63 6f 6e 6e 65 63 74 69      set connecti
19a70 6f 6e 20 7b 46 75 6c 6c 55 72 69 3d 24 7b 66 69  on {FullUri=${fi
19a80 6c 65 4e 61 6d 65 7d 7d 0d 0a 20 20 20 20 20 20  leName}}..      
19a90 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
19aa0 20 20 73 65 74 20 63 6f 6e 6e 65 63 74 69 6f 6e    set connection
19ab0 20 7b 44 61 74 61 20 53 6f 75 72 63 65 3d 24 7b   {Data Source=${
19ac0 66 69 6c 65 4e 61 6d 65 7d 7d 0d 0a 20 20 20 20  fileName}}..    
19ad0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
19ae0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 69        # NOTE: Si
19af0 6e 63 65 20 74 68 69 73 20 70 72 6f 63 65 64 75  nce this procedu
19b00 72 65 20 68 61 73 20 6e 6f 20 73 70 65 63 69 61  re has no specia
19b10 6c 20 6b 6e 6f 77 6c 65 64 67 65 20 6f 66 20 77  l knowledge of w
19b20 68 61 74 20 74 68 65 20 64 65 66 61 75 6c 74 0d  hat the default.
19b30 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73  .      #       s
19b40 65 74 74 69 6e 67 20 69 73 20 66 6f 72 20 74 68  etting is for th
19b50 65 20 54 6f 46 75 6c 6c 50 61 74 68 20 63 6f 6e  e ToFullPath con
19b60 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e 67 20 70  nection string p
19b70 72 6f 70 65 72 79 2c 20 61 6c 77 61 79 73 0d 0a  ropery, always..
19b80 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61 64        #       ad
19b90 64 20 74 68 65 20 76 61 6c 75 65 20 77 65 20 6b  d the value we k
19ba0 6e 6f 77 20 61 62 6f 75 74 20 74 6f 20 74 68 65  now about to the
19bb0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69   connection stri
19bc0 6e 67 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ng...      #..  
19bd0 20 20 20 20 61 70 70 65 6e 64 20 63 6f 6e 6e 65      append conne
19be0 63 74 69 6f 6e 20 7b 3b 54 6f 46 75 6c 6c 50 61  ction {;ToFullPa
19bf0 74 68 3d 24 7b 71 75 61 6c 69 66 79 7d 7d 0d 0a  th=${qualify}}..
19c00 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
19c10 20 23 20 4e 4f 54 45 3a 20 49 66 20 6f 75 72 20   # NOTE: If our 
19c20 63 61 6c 6c 65 72 20 73 70 65 63 69 66 69 65 64  caller specified
19c30 20 61 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2c   a journal mode,
19c40 20 61 64 64 20 74 68 65 20 6e 65 63 65 73 73 61   add the necessa
19c50 72 79 20 70 6f 72 74 69 6f 6e 0d 0a 20 20 20 20  ry portion..    
19c60 20 20 23 20 20 20 20 20 20 20 6f 66 20 74 68 65    #       of the
19c70 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69   connection stri
19c80 6e 67 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 23  ng now...      #
19c90 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72  ..      if {[str
19ca0 69 6e 67 20 6c 65 6e 67 74 68 20 24 6d 6f 64 65  ing length $mode
19cb0 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
19cc0 20 20 20 20 20 20 20 61 70 70 65 6e 64 20 63 6f         append co
19cd0 6e 6e 65 63 74 69 6f 6e 20 7b 3b 4a 6f 75 72 6e  nnection {;Journ
19ce0 61 6c 20 4d 6f 64 65 3d 24 7b 6d 6f 64 65 7d 7d  al Mode=${mode}}
19cf0 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
19d00 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
19d10 54 45 3a 20 49 66 20 6f 75 72 20 63 61 6c 6c 65  TE: If our calle
19d20 72 20 73 70 65 63 69 66 69 65 64 20 61 20 44 61  r specified a Da
19d30 74 65 54 69 6d 65 20 66 6f 72 6d 61 74 2c 20 61  teTime format, a
19d40 64 64 20 74 68 65 20 6e 65 63 65 73 73 61 72 79  dd the necessary
19d50 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
19d60 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 63  portion of the c
19d70 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e 67  onnection string
19d80 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 23 0d 0a   now...      #..
19d90 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
19da0 67 20 6c 65 6e 67 74 68 20 24 64 61 74 65 54 69  g length $dateTi
19db0 6d 65 46 6f 72 6d 61 74 5d 20 3e 20 30 7d 20 74  meFormat] > 0} t
19dc0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 61  hen {..        a
19dd0 70 70 65 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e  ppend connection
19de0 20 7b 3b 44 61 74 65 54 69 6d 65 46 6f 72 6d 61   {;DateTimeForma
19df0 74 3d 24 7b 64 61 74 65 54 69 6d 65 46 6f 72 6d  t=${dateTimeForm
19e00 61 74 7d 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  at}}..      }...
19e10 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
19e20 23 20 4e 4f 54 45 3a 20 49 66 20 6f 75 72 20 63  # NOTE: If our c
19e30 61 6c 6c 65 72 20 73 70 65 63 69 66 69 65 64 20  aller specified 
19e40 61 20 44 61 74 65 54 69 6d 65 4b 69 6e 64 2c 20  a DateTimeKind, 
19e50 61 64 64 20 74 68 65 20 6e 65 63 65 73 73 61 72  add the necessar
19e60 79 20 70 6f 72 74 69 6f 6e 0d 0a 20 20 20 20 20  y portion..     
19e70 20 23 20 20 20 20 20 20 20 6f 66 20 74 68 65 20   #       of the 
19e80 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e  connection strin
19e90 67 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 23 0d  g now...      #.
19ea0 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69  .      if {[stri
19eb0 6e 67 20 6c 65 6e 67 74 68 20 24 64 61 74 65 54  ng length $dateT
19ec0 69 6d 65 4b 69 6e 64 5d 20 3e 20 30 7d 20 74 68  imeKind] > 0} th
19ed0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 61 70  en {..        ap
19ee0 70 65 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  pend connection 
19ef0 7b 3b 44 61 74 65 54 69 6d 65 4b 69 6e 64 3d 24  {;DateTimeKind=$
19f00 7b 64 61 74 65 54 69 6d 65 4b 69 6e 64 7d 7d 0d  {dateTimeKind}}.
19f10 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
19f20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
19f30 45 3a 20 46 69 67 75 72 65 20 6f 75 74 20 77 68  E: Figure out wh
19f40 61 74 20 74 68 65 20 66 69 6e 61 6c 20 66 6c 61  at the final fla
19f50 67 73 20 66 6f 72 20 74 68 69 73 20 63 6f 6e 6e  gs for this conn
19f60 65 63 74 69 6f 6e 20 6e 65 65 64 20 74 6f 20 62  ection need to b
19f70 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  e...      #..   
19f80 20 20 20 73 65 74 20 66 6c 61 67 73 20 5b 67 65     set flags [ge
19f90 74 43 6f 6e 6e 65 63 74 69 6f 6e 46 6c 61 67 73  tConnectionFlags
19fa0 20 24 66 69 6c 65 4e 61 6d 65 20 24 66 6c 61 67   $fileName $flag
19fb0 73 20 24 71 75 69 65 74 5d 0d 0a 0d 0a 20 20 20  s $quiet]....   
19fc0 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
19fd0 54 45 3a 20 49 66 20 6f 75 72 20 63 61 6c 6c 65  TE: If our calle
19fe0 72 20 73 70 65 63 69 66 69 65 64 20 73 6f 6d 65  r specified some
19ff0 20 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f   SQLiteConnectio
1a000 6e 46 6c 61 67 73 2c 20 61 64 64 20 74 68 65 0d  nFlags, add the.
1a010 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6e  .      #       n
1a020 65 63 65 73 73 61 72 79 20 70 6f 72 74 69 6f 6e  ecessary portion
1a030 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   of the connecti
1a040 6f 6e 20 73 74 72 69 6e 67 20 6e 6f 77 2e 0d 0a  on string now...
1a050 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
1a060 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  f {[string lengt
1a070 68 20 24 66 6c 61 67 73 5d 20 3e 20 30 7d 20 74  h $flags] > 0} t
1a080 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 61  hen {..        a
1a090 70 70 65 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e  ppend connection
1a0a0 20 7b 3b 46 6c 61 67 73 3d 24 7b 66 6c 61 67 73   {;Flags=${flags
1a0b0 7d 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  }}..      }.... 
1a0c0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
1a0d0 4e 4f 54 45 3a 20 49 66 20 6f 75 72 20 63 61 6c  NOTE: If our cal
1a0e0 6c 65 72 20 73 70 65 63 69 66 69 65 64 20 61 6e  ler specified an
1a0f0 20 65 78 74 72 61 20 70 61 79 6c 6f 61 64 20 74   extra payload t
1a100 6f 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  o the connection
1a110 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
1a120 73 74 72 69 6e 67 2c 20 61 70 70 65 6e 64 20 69  string, append i
1a130 74 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 23 0d  t now...      #.
1a140 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69  .      if {[stri
1a150 6e 67 20 6c 65 6e 67 74 68 20 24 65 78 74 72 61  ng length $extra
1a160 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
1a170 20 20 20 20 20 20 20 61 70 70 65 6e 64 20 63 6f         append co
1a180 6e 6e 65 63 74 69 6f 6e 20 5c 3b 20 24 65 78 74  nnection \; $ext
1a190 72 61 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ra..      }.... 
1a1a0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
1a1b0 4e 4f 54 45 3a 20 41 64 64 20 74 68 65 20 6e 61  NOTE: Add the na
1a1c0 6d 65 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  me of the curren
1a1d0 74 20 74 65 73 74 20 66 69 6c 65 2c 20 69 66 20  t test file, if 
1a1e0 61 76 61 69 6c 61 62 6c 65 2e 20 20 54 68 69 73  available.  This
1a1f0 20 69 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20   is..      #    
1a200 20 20 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72     only used for
1a210 20 64 65 62 75 67 67 69 6e 67 2e 0d 0a 20 20 20   debugging...   
1a220 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
1a230 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74  [info exists ::t
1a240 65 73 74 5f 66 69 6c 65 5d 7d 20 74 68 65 6e 20  est_file]} then 
1a250 7b 0d 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e  {..        appen
1a260 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 3b 54  d connection {;T
1a270 65 73 74 46 69 6c 65 3d 24 7b 3a 3a 74 65 73 74  estFile=${::test
1a280 5f 66 69 6c 65 7d 7d 0d 0a 20 20 20 20 20 20 7d  _file}}..      }
1a290 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
1a2a0 20 20 20 23 20 4e 4f 54 45 3a 20 41 64 64 20 74     # NOTE: Add t
1a2b0 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 63  he name of the c
1a2c0 75 72 72 65 6e 74 20 74 65 73 74 2c 20 69 66 20  urrent test, if 
1a2d0 61 76 61 69 6c 61 62 6c 65 2e 20 20 54 68 69 73  available.  This
1a2e0 20 69 73 20 6f 6e 6c 79 0d 0a 20 20 20 20 20 20   is only..      
1a2f0 23 20 20 20 20 20 20 20 75 73 65 64 20 66 6f 72  #       used for
1a300 20 64 65 62 75 67 67 69 6e 67 2e 0d 0a 20 20 20   debugging...   
1a310 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
1a320 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 65  [info exists ::e
1a330 61 67 6c 65 5f 74 65 73 74 73 28 43 75 72 72 65  agle_tests(Curre
1a340 6e 74 4e 61 6d 65 29 5d 7d 20 74 68 65 6e 20 7b  ntName)]} then {
1a350 0d 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64  ..        append
1a360 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 3b 54 65   connection {;Te
1a370 73 74 4e 61 6d 65 3d 24 7b 3a 3a 65 61 67 6c 65  stName=${::eagle
1a380 5f 74 65 73 74 73 28 43 75 72 72 65 6e 74 4e 61  _tests(CurrentNa
1a390 6d 65 29 7d 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a  me)}}..      }..
1a3a0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
1a3b0 20 23 20 4e 4f 54 45 3a 20 46 6f 72 20 63 6c 61   # NOTE: For cla
1a3c0 72 69 74 79 2c 20 61 70 70 65 6e 64 20 61 20 66  rity, append a f
1a3d0 69 6e 61 6c 20 73 65 6d 69 63 6f 6c 6f 6e 20 74  inal semicolon t
1a3e0 6f 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  o the connection
1a3f0 20 73 74 72 69 6e 67 2e 0d 0a 20 20 20 20 20 20   string...      
1a400 23 0d 0a 20 20 20 20 20 20 61 70 70 65 6e 64 20  #..      append 
1a410 63 6f 6e 6e 65 63 74 69 6f 6e 20 5c 3b 0d 0a 0d  connection \;...
1a420 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
1a430 23 20 4e 4f 54 45 3a 20 4f 70 65 6e 20 74 68 65  # NOTE: Open the
1a440 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
1a450 74 69 6f 6e 20 6e 6f 77 2c 20 70 6c 61 63 69 6e  tion now, placin
1a460 67 20 74 68 65 20 6f 70 61 71 75 65 20 68 61 6e  g the opaque han
1a470 64 6c 65 20 76 61 6c 75 65 0d 0a 20 20 20 20 20  dle value..     
1a480 20 23 20 20 20 20 20 20 20 69 6e 74 6f 20 74 68   #       into th
1a490 65 20 76 61 72 69 61 62 6c 65 20 73 70 65 63 69  e variable speci
1a4a0 66 69 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c  fied by our call
1a4b0 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  er...      #..  
1a4c0 20 20 20 20 73 65 74 20 64 62 20 5b 73 71 6c 20      set db [sql 
1a4d0 6f 70 65 6e 20 2d 74 79 70 65 20 53 51 4c 69 74  open -type SQLit
1a4e0 65 20 5b 73 75 62 73 74 20 24 63 6f 6e 6e 65 63  e [subst $connec
1a4f0 74 69 6f 6e 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20  tion]]....      
1a500 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
1a510 20 43 6f 6e 66 69 67 75 72 65 20 74 68 65 20 74   Configure the t
1a520 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f  emporary directo
1a530 72 79 20 66 6f 72 20 74 68 65 20 6e 65 77 6c 79  ry for the newly
1a540 20 6f 70 65 6e 65 64 20 64 61 74 61 62 61 73 65   opened database
1a550 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
1a560 63 6f 6e 6e 65 63 74 69 6f 6e 20 6e 6f 77 20 75  connection now u
1a570 6e 6c 65 73 73 20 6f 75 72 20 63 61 6c 6c 65 72  nless our caller
1a580 20 66 6f 72 62 69 64 73 20 69 74 2e 0d 0a 20 20   forbids it...  
1a590 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
1a5a0 7b 24 74 65 6d 70 6f 72 61 72 79 20 26 26 20 21  {$temporary && !
1a5b0 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
1a5c0 6f 28 73 65 74 54 65 6d 70 6f 72 61 72 79 44 69  o(setTemporaryDi
1a5d0 72 65 63 74 6f 72 79 29 5d 7d 20 74 68 65 6e 20  rectory)]} then 
1a5e0 7b 0d 0a 20 20 20 20 20 20 20 20 73 71 6c 20 65  {..        sql e
1a5f0 78 65 63 75 74 65 20 24 64 62 20 5b 61 70 70 65  xecute $db [appe
1a600 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
1a610 20 20 20 20 20 20 22 50 52 41 47 4d 41 20 74 65        "PRAGMA te
1a620 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f  mp_store_directo
1a630 72 79 20 3d 20 5c 22 22 20 5b 67 65 74 54 65 6d  ry = \"" [getTem
1a640 70 6f 72 61 72 79 44 69 72 65 63 74 6f 72 79 5d  poraryDirectory]
1a650 20 5c 22 5c 3b 5d 0d 0a 20 20 20 20 20 20 7d 0d   \"\;]..      }.
1a660 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
1a670 20 20 23 20 4e 4f 54 45 3a 20 50 65 72 66 6f 72    # NOTE: Perfor
1a680 6d 20 61 6e 79 20 65 78 74 72 61 20 70 65 72 2d  m any extra per-
1a690 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 65 74 75 70  connection setup
1a6a0 20 66 6f 72 20 74 68 65 20 6e 65 77 6c 79 20 6f   for the newly o
1a6b0 70 65 6e 65 64 0d 0a 20 20 20 20 20 20 23 20 20  pened..      #  
1a6c0 20 20 20 20 20 64 61 74 61 62 61 73 65 20 6e 6f       database no
1a6d0 77 20 75 6e 6c 65 73 73 20 6f 75 72 20 63 61 6c  w unless our cal
1a6e0 6c 65 72 20 66 6f 72 62 69 64 73 20 69 74 2e 0d  ler forbids it..
1a6f0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
1a700 73 65 74 20 65 78 65 63 75 74 65 4f 6e 53 65 74  set executeOnSet
1a710 75 70 20 5b 67 65 74 45 78 65 63 75 74 65 4f 6e  up [getExecuteOn
1a720 53 65 74 75 70 5d 0d 0a 0d 0a 20 20 20 20 20 20  Setup]....      
1a730 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
1a740 74 68 20 24 65 78 65 63 75 74 65 4f 6e 53 65 74  th $executeOnSet
1a750 75 70 5d 20 3e 20 30 20 26 26 20 5c 0d 0a 20 20  up] > 0 && \..  
1a760 20 20 20 20 20 20 20 20 21 5b 69 6e 66 6f 20 65          ![info e
1a770 78 69 73 74 73 20 3a 3a 6e 6f 28 65 78 65 63 75  xists ::no(execu
1a780 74 65 4f 6e 53 65 74 75 70 29 5d 7d 20 74 68 65  teOnSetup)]} the
1a790 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
1a7a0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
1a7b0 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 6d 61 79  This command may
1a7c0 20 72 61 69 73 65 20 61 6e 20 65 72 72 6f 72 3b   raise an error;
1a7d0 20 69 66 20 73 6f 2c 20 74 68 61 74 20 69 73 20   if so, that is 
1a7e0 66 69 6e 65 2c 20 61 73 0d 0a 20 20 20 20 20 20  fine, as..      
1a7f0 20 20 23 20 20 20 20 20 20 20 74 68 65 20 65 6e    #       the en
1a800 63 6c 6f 73 69 6e 67 20 74 65 73 74 20 77 69 6c  closing test wil
1a810 6c 20 74 68 65 6e 20 66 61 69 6c 2e 20 20 54 68  l then fail.  Th
1a820 65 20 5b 73 75 62 73 74 5d 20 63 6f 6d 6d 61 6e  e [subst] comman
1a830 64 20 69 73 0d 0a 20 20 20 20 20 20 20 20 23 20  d is..        # 
1a840 20 20 20 20 20 20 75 73 65 64 20 6f 6e 20 74 68        used on th
1a850 65 20 53 51 4c 20 69 6e 20 63 61 73 65 20 69 74  e SQL in case it
1a860 20 6e 65 65 64 73 20 74 6f 20 72 65 66 65 72 20   needs to refer 
1a870 74 6f 20 73 74 61 74 65 20 69 6e 20 6f 75 72 0d  to state in our.
1a880 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
1a890 20 63 6f 6e 74 65 78 74 2e 0d 0a 20 20 20 20 20   context...     
1a8a0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73 71     #..        sq
1a8b0 6c 20 65 78 65 63 75 74 65 20 24 64 62 20 5b 73  l execute $db [s
1a8c0 75 62 73 74 20 24 65 78 65 63 75 74 65 4f 6e 53  ubst $executeOnS
1a8d0 65 74 75 70 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a  etup]..      }..
1a8e0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
1a8f0 20 23 20 4e 4f 54 45 3a 20 41 6c 77 61 79 73 20   # NOTE: Always 
1a900 72 65 74 75 72 6e 20 74 68 65 20 63 6f 6e 6e 65  return the conne
1a910 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20 75 70 6f  ction handle upo
1a920 6e 20 73 75 63 63 65 73 73 2e 0d 0a 20 20 20 20  n success...    
1a930 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75 72    #..      retur
1a940 6e 20 24 64 62 0d 0a 20 20 20 20 7d 0d 0a 0c 0d  n $db..    }....
1a950 0a 20 20 20 20 70 72 6f 63 20 67 65 74 44 62 43  .    proc getDbC
1a960 6f 6e 6e 65 63 74 69 6f 6e 20 7b 20 7b 76 61 72  onnection { {var
1a970 4e 61 6d 65 20 64 62 7d 20 7d 20 7b 0d 0a 20 20  Name db} } {..  
1a980 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
1a990 4f 54 45 3a 20 52 65 66 65 72 20 74 6f 20 74 68  OTE: Refer to th
1a9a0 65 20 73 70 65 63 69 66 69 65 64 20 76 61 72 69  e specified vari
1a9b0 61 62 6c 65 20 28 65 2e 67 2e 20 22 64 62 22 29  able (e.g. "db")
1a9c0 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 78 74 20   in the context 
1a9d0 6f 66 20 6f 75 72 0d 0a 20 20 20 20 20 20 23 20  of our..      # 
1a9e0 20 20 20 20 20 20 63 61 6c 6c 65 72 2e 20 20 54        caller.  T
1a9f0 68 65 20 68 61 6e 64 6c 65 20 74 6f 20 74 68 65  he handle to the
1aa00 20 64 61 74 61 62 61 73 65 20 70 72 65 76 69 6f   database previo
1aa10 75 73 6c 79 20 6f 70 65 6e 65 64 20 76 69 61 20  usly opened via 
1aa20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  the..      #    
1aa30 20 20 20 5b 73 65 74 75 70 44 62 5d 20 70 72 6f     [setupDb] pro
1aa40 63 65 64 75 72 65 20 73 68 6f 75 6c 64 20 62 65  cedure should be
1aa50 20 73 74 6f 72 65 64 20 74 68 65 72 65 2e 0d 0a   stored there...
1aa60 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 75        #..      u
1aa70 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65 20  pvar 1 $varName 
1aa80 64 62 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20  db....      #.. 
1aa90 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69       # NOTE: Thi
1aaa0 73 20 72 65 74 75 72 6e 73 20 74 68 65 20 41 44  s returns the AD
1aab0 4f 2e 4e 45 54 20 49 44 62 43 6f 6e 6e 65 63 74  O.NET IDbConnect
1aac0 69 6f 6e 20 6f 62 6a 65 63 74 20 69 6e 73 74 61  ion object insta
1aad0 6e 63 65 20 66 6f 72 20 74 68 65 0d 0a 20 20 20  nce for the..   
1aae0 20 20 20 23 20 20 20 20 20 20 20 73 70 65 63 69     #       speci
1aaf0 66 69 65 64 20 64 61 74 61 62 73 65 20 68 61 6e  fied databse han
1ab00 64 6c 65 2e 20 20 53 69 6e 63 65 20 67 65 74 74  dle.  Since gett
1ab10 69 6e 67 20 74 68 69 73 20 6f 62 6a 65 63 74 20  ing this object 
1ab20 72 65 6c 69 65 73 20 75 70 6f 6e 0d 0a 20 20 20  relies upon..   
1ab30 20 20 20 23 20 20 20 20 20 20 20 45 61 67 6c 65     #       Eagle
1ab40 20 69 6e 74 65 72 6e 61 6c 73 2c 20 67 72 65 61   internals, grea
1ab50 74 20 63 61 72 65 20 73 68 6f 75 6c 64 20 62 65  t care should be
1ab60 20 74 61 6b 65 6e 20 74 6f 20 61 76 6f 69 64 20   taken to avoid 
1ab70 64 69 73 70 6f 73 69 6e 67 20 6f 66 0d 0a 20 20  disposing of..  
1ab80 20 20 20 20 23 20 20 20 20 20 20 20 74 68 69 73      #       this
1ab90 20 6f 62 6a 65 63 74 20 6f 72 20 6f 74 68 65 72   object or other
1aba0 77 69 73 65 20 70 75 74 74 69 6e 67 20 69 74 20  wise putting it 
1abb0 69 6e 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64 20  into an invalid 
1abc0 73 74 61 74 65 2e 0d 0a 20 20 20 20 20 20 23 0d  state...      #.
1abd0 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f  .      if {[info
1abe0 20 65 78 69 73 74 73 20 64 62 5d 7d 20 74 68 65   exists db]} the
1abf0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20  n {..        if 
1ac00 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
1ac10 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f       object invo
1ac20 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75  ke -flags +NonPu
1ac30 62 6c 69 63 20 2d 6f 62 6a 65 63 74 66 6c 61 67  blic -objectflag
1ac40 73 20 2b 4e 6f 44 69 73 70 6f 73 65 20 2d 61 6c  s +NoDispose -al
1ac50 69 61 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ias \..         
1ac60 20 20 20 20 20 49 6e 74 65 72 70 72 65 74 65 72       Interpreter
1ac70 2e 47 65 74 41 63 74 69 76 65 2e 63 6f 6e 6e 65  .GetActive.conne
1ac80 63 74 69 6f 6e 73 20 49 74 65 6d 20 24 64 62 0d  ctions Item $db.
1ac90 0a 20 20 20 20 20 20 20 20 7d 20 72 65 73 75 6c  .        } resul
1aca0 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  t] == 0} then {.
1acb0 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
1acc0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
1acd0 53 75 63 63 65 73 73 2c 20 72 65 74 75 72 6e 20  Success, return 
1ace0 74 68 65 20 6f 70 61 71 75 65 20 6f 62 6a 65 63  the opaque objec
1acf0 74 20 68 61 6e 64 6c 65 2e 0d 0a 20 20 20 20 20  t handle...     
1ad00 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1ad10 20 20 72 65 74 75 72 6e 20 24 72 65 73 75 6c 74    return $result
1ad20 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65  ..        } else
1ad30 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d   {..          #.
1ad40 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
1ad50 45 3a 20 46 61 69 6c 75 72 65 2c 20 72 65 70 6f  E: Failure, repo
1ad60 72 74 20 77 68 79 2e 0d 0a 20 20 20 20 20 20 20  rt why...       
1ad70 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
1ad80 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
1ad90 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
1ada0 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
1adb0 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47     "==== WARNING
1adc0 3a 20 66 61 69 6c 65 64 20 74 6f 20 67 65 74 20  : failed to get 
1add0 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c  connection handl
1ade0 65 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 5c  e for database \
1adf0 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  "" \..          
1ae00 20 20 20 20 24 64 62 20 22 5c 22 2c 20 65 72 72      $db "\", err
1ae10 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 72 65 73 75  or: " \n\t $resu
1ae20 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  lt \n]..        
1ae30 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  }..      }....  
1ae40 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
1ae50 4f 54 45 3a 20 46 61 69 6c 75 72 65 2c 20 72 65  OTE: Failure, re
1ae60 74 75 72 6e 20 61 6e 20 6f 62 76 69 6f 75 73 6c  turn an obviousl
1ae70 79 20 69 6e 76 61 6c 69 64 20 6f 70 61 71 75 65  y invalid opaque
1ae80 20 6f 62 6a 65 63 74 20 68 61 6e 64 6c 65 2e 0d   object handle..
1ae90 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
1aea0 72 65 74 75 72 6e 20 22 22 0d 0a 20 20 20 20 7d  return ""..    }
1aeb0 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 66 72  .....    proc fr
1aec0 65 65 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 20 7b  eeDbConnection {
1aed0 20 7b 76 61 72 4e 61 6d 65 20 63 6f 6e 6e 65 63   {varName connec
1aee0 74 69 6f 6e 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  tion} } {..     
1aef0 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
1af00 3a 20 52 65 66 65 72 20 74 6f 20 74 68 65 20 73  : Refer to the s
1af10 70 65 63 69 66 69 65 64 20 76 61 72 69 61 62 6c  pecified variabl
1af20 65 20 28 65 2e 67 2e 20 22 63 6f 6e 6e 65 63 74  e (e.g. "connect
1af30 69 6f 6e 22 29 20 69 6e 20 74 68 65 0d 0a 20 20  ion") in the..  
1af40 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e 74      #       cont
1af50 65 78 74 20 6f 66 20 6f 75 72 20 63 61 6c 6c 65  ext of our calle
1af60 72 2e 20 20 54 68 65 20 6f 70 61 71 75 65 20 6f  r.  The opaque o
1af70 62 6a 65 63 74 20 68 61 6e 64 6c 65 20 66 6f 72  bject handle for
1af80 20 61 6e 20 41 44 4f 2e 4e 45 54 0d 0a 20 20 20   an ADO.NET..   
1af90 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e 6e 65     #       conne
1afa0 63 74 69 6f 6e 20 70 72 65 76 69 6f 75 73 6c 79  ction previously
1afb0 20 72 65 74 75 72 6e 65 64 20 62 79 20 5b 67 65   returned by [ge
1afc0 74 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 5d 20 73  tDbConnection] s
1afd0 68 6f 75 6c 64 20 62 65 0d 0a 20 20 20 20 20 20  hould be..      
1afe0 23 20 20 20 20 20 20 20 73 74 6f 72 65 64 20 74  #       stored t
1aff0 68 65 72 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  here...      #..
1b000 20 20 20 20 20 20 75 70 76 61 72 20 31 20 24 76        upvar 1 $v
1b010 61 72 4e 61 6d 65 20 63 6f 6e 6e 65 63 74 69 6f  arName connectio
1b020 6e 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  n....      #..  
1b030 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65      # NOTE: Atte
1b040 6d 70 74 20 74 6f 20 72 65 6d 6f 76 65 20 74 68  mpt to remove th
1b050 65 20 6f 70 61 71 75 65 20 6f 62 6a 65 63 74 20  e opaque object 
1b060 68 61 6e 64 6c 65 20 66 72 6f 6d 20 74 68 65 20  handle from the 
1b070 69 6e 74 65 72 70 72 65 74 65 72 0d 0a 20 20 20  interpreter..   
1b080 20 20 20 23 20 20 20 20 20 20 20 6e 6f 77 2e 20     #       now. 
1b090 20 54 68 69 73 20 5b 6f 62 6a 65 63 74 20 64 69   This [object di
1b0a0 73 70 6f 73 65 5d 20 63 61 6c 6c 20 77 69 6c 6c  spose] call will
1b0b0 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 64 69   not actually di
1b0c0 73 70 6f 73 65 20 6f 66 20 74 68 65 0d 0a 20 20  spose of the..  
1b0d0 20 20 20 20 23 20 20 20 20 20 20 20 75 6e 64 65      #       unde
1b0e0 72 6c 79 69 6e 67 20 6f 62 6a 65 63 74 20 62 65  rlying object be
1b0f0 63 61 75 73 65 20 74 68 65 20 2b 4e 6f 44 69 73  cause the +NoDis
1b100 70 6f 73 65 20 66 6c 61 67 20 77 61 73 20 73 65  pose flag was se
1b110 74 20 6f 6e 20 69 74 0d 0a 20 20 20 20 20 20 23  t on it..      #
1b120 20 20 20 20 20 20 20 64 75 72 69 6e 67 20 63 72         during cr
1b130 65 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6f 70  eation of the op
1b140 61 71 75 65 20 6f 62 6a 65 63 74 20 68 61 6e 64  aque object hand
1b150 6c 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  le...      #..  
1b160 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
1b170 69 73 74 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 5d  ists connection]
1b180 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
1b190 20 5b 63 61 74 63 68 20 7b 6f 62 6a 65 63 74 20   [catch {object 
1b1a0 64 69 73 70 6f 73 65 20 24 63 6f 6e 6e 65 63 74  dispose $connect
1b1b0 69 6f 6e 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65  ion} error]} the
1b1c0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
1b1d0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
1b1e0 57 65 20 73 6f 6d 65 68 6f 77 20 66 61 69 6c 65  We somehow faile
1b1f0 64 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20  d to remove the 
1b200 68 61 6e 64 6c 65 2c 20 72 65 70 6f 72 74 20 77  handle, report w
1b210 68 79 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  hy...        #..
1b220 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
1b230 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
1b240 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
1b250 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57           "==== W
1b260 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74  ARNING: failed t
1b270 6f 20 72 65 6d 6f 76 65 20 63 6f 6e 6e 65 63 74  o remove connect
1b280 69 6f 6e 20 68 61 6e 64 6c 65 20 5c 22 22 20 24  ion handle \"" $
1b290 63 6f 6e 6e 65 63 74 69 6f 6e 20 5c 0d 0a 20 20  connection \..  
1b2a0 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c 20 65            "\", e
1b2b0 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72  rror: " \n\t $er
1b2c0 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d  ror \n]..      }
1b2d0 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
1b2e0 70 72 6f 63 20 61 64 64 44 62 43 6f 6e 6e 65 63  proc addDbConnec
1b2f0 74 69 6f 6e 20 7b 20 63 6f 6e 6e 65 63 74 69 6f  tion { connectio
1b300 6e 20 7b 76 61 72 4e 61 6d 65 20 64 62 7d 20 7d  n {varName db} }
1b310 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
1b320 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 66 65 72     # NOTE: Refer
1b330 20 74 6f 20 74 68 65 20 73 70 65 63 69 66 69 65   to the specifie
1b340 64 20 76 61 72 69 61 62 6c 65 20 28 65 2e 67 2e  d variable (e.g.
1b350 20 22 64 62 22 29 20 69 6e 20 74 68 65 20 63 6f   "db") in the co
1b360 6e 74 65 78 74 20 6f 66 20 6f 75 72 0d 0a 20 20  ntext of our..  
1b370 20 20 20 20 23 20 20 20 20 20 20 20 63 61 6c 6c      #       call
1b380 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  er...      #..  
1b390 20 20 20 20 75 70 76 61 72 20 31 20 24 76 61 72      upvar 1 $var
1b3a0 4e 61 6d 65 20 64 62 0d 0a 0d 0a 20 20 20 20 20  Name db....     
1b3b0 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
1b3c0 3a 20 43 72 65 61 74 65 20 61 20 63 6f 72 72 65  : Create a corre
1b3d0 63 74 6c 79 20 66 6f 72 6d 61 74 74 65 64 20 6e  ctly formatted n
1b3e0 61 6d 65 20 66 6f 72 20 74 68 65 20 64 61 74 61  ame for the data
1b3f0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
1b400 74 6f 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  to..      #     
1b410 20 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68    be added to th
1b420 65 20 6c 69 73 74 20 6d 61 6e 61 67 65 64 20 62  e list managed b
1b430 79 20 74 68 65 20 45 61 67 6c 65 20 69 6e 74 65  y the Eagle inte
1b440 72 70 72 65 74 65 72 2e 0d 0a 20 20 20 20 20 20  rpreter...      
1b450 23 0d 0a 20 20 20 20 20 20 73 65 74 20 64 62 20  #..      set db 
1b460 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d  [object invoke -
1b470 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63  flags +NonPublic
1b480 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 45 61   \..          Ea
1b490 67 6c 65 2e 5f 43 6f 6d 70 6f 6e 65 6e 74 73 2e  gle._Components.
1b4a0 50 72 69 76 61 74 65 2e 46 6f 72 6d 61 74 4f 70  Private.FormatOp
1b4b0 73 20 44 61 74 61 62 61 73 65 4f 62 6a 65 63 74  s DatabaseObject
1b4c0 4e 61 6d 65 20 24 63 6f 6e 6e 65 63 74 69 6f 6e  Name $connection
1b4d0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 53 51   \..          SQ
1b4e0 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 5b  LiteConnection [
1b4f0 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 49 6e  object invoke In
1b500 74 65 72 70 72 65 74 65 72 2e 47 65 74 41 63 74  terpreter.GetAct
1b510 69 76 65 20 4e 65 78 74 49 64 5d 5d 0d 0a 0d 0a  ive NextId]]....
1b520 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
1b530 20 4e 4f 54 45 3a 20 41 64 64 20 74 68 65 20 64   NOTE: Add the d
1b540 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
1b550 6f 6e 20 70 72 6f 76 69 64 65 64 20 62 79 20 6f  on provided by o
1b560 75 72 20 63 61 6c 6c 65 72 20 74 6f 20 74 68 65  ur caller to the
1b570 20 6c 69 73 74 0d 0a 20 20 20 20 20 20 23 20 20   list..      #  
1b580 20 20 20 20 20 6f 66 20 74 68 6f 73 65 20 6b 6e       of those kn
1b590 6f 77 6e 20 74 6f 20 74 68 65 20 45 61 67 6c 65  own to the Eagle
1b5a0 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a 20   interpreter... 
1b5b0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 6f 62       #..      ob
1b5c0 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61  ject invoke -fla
1b5d0 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 49 6e  gs +NonPublic In
1b5e0 74 65 72 70 72 65 74 65 72 2e 47 65 74 41 63 74  terpreter.GetAct
1b5f0 69 76 65 2e 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ive.connections 
1b600 41 64 64 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  Add \..         
1b610 20 24 64 62 20 24 63 6f 6e 6e 65 63 74 69 6f 6e   $db $connection
1b620 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
1b630 70 72 6f 63 20 72 65 6d 6f 76 65 44 62 54 72 61  proc removeDbTra
1b640 6e 73 61 63 74 69 6f 6e 20 7b 20 74 72 61 6e 73  nsaction { trans
1b650 61 63 74 69 6f 6e 20 7d 20 7b 0d 0a 20 20 20 20  action } {..    
1b660 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
1b670 45 3a 20 52 65 6d 6f 76 65 20 74 68 65 20 64 61  E: Remove the da
1b680 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69  tabase transacti
1b690 6f 6e 20 70 72 6f 76 69 64 65 64 20 62 79 20 6f  on provided by o
1b6a0 75 72 20 63 61 6c 6c 65 72 20 66 72 6f 6d 20 74  ur caller from t
1b6b0 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  he..      #     
1b6c0 20 20 6c 69 73 74 20 6f 66 20 74 68 6f 73 65 20    list of those 
1b6d0 6b 6e 6f 77 6e 20 74 6f 20 74 68 65 20 45 61 67  known to the Eag
1b6e0 6c 65 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0d  le interpreter..
1b6f0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
1b700 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66  object invoke -f
1b710 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20  lags +NonPublic 
1b720 49 6e 74 65 72 70 72 65 74 65 72 2e 47 65 74 41  Interpreter.GetA
1b730 63 74 69 76 65 2e 74 72 61 6e 73 61 63 74 69 6f  ctive.transactio
1b740 6e 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ns \..          
1b750 52 65 6d 6f 76 65 20 24 74 72 61 6e 73 61 63 74  Remove $transact
1b760 69 6f 6e 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20  ion..    }..... 
1b770 20 20 20 70 72 6f 63 20 67 65 74 52 6f 77 73 46     proc getRowsF
1b780 72 6f 6d 44 61 74 61 54 61 62 6c 65 20 7b 20 64  romDataTable { d
1b790 61 74 61 54 61 62 6c 65 20 7b 76 61 6c 75 65 43  ataTable {valueC
1b7a0 61 6c 6c 62 61 63 6b 20 22 22 7d 20 7d 20 7b 0d  allback ""} } {.
1b7b0 0a 20 20 20 20 20 20 73 65 74 20 72 6f 77 73 20  .      set rows 
1b7c0 5b 6c 69 73 74 5d 0d 0a 20 20 20 20 20 20 73 65  [list]..      se
1b7d0 74 20 63 6f 75 6e 74 20 5b 24 64 61 74 61 54 61  t count [$dataTa
1b7e0 62 6c 65 20 43 6f 6c 75 6d 6e 73 2e 43 6f 75 6e  ble Columns.Coun
1b7f0 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 66 6f 72 20  t]....      for 
1b800 7b 73 65 74 20 69 6e 64 65 78 20 30 7d 20 7b 24  {set index 0} {$
1b810 69 6e 64 65 78 20 3c 20 24 63 6f 75 6e 74 7d 20  index < $count} 
1b820 7b 69 6e 63 72 20 69 6e 64 65 78 7d 20 7b 0d 0a  {incr index} {..
1b830 20 20 20 20 20 20 20 20 73 65 74 20 64 61 74 61          set data
1b840 43 6f 6c 75 6d 6e 20 5b 24 64 61 74 61 54 61 62  Column [$dataTab
1b850 6c 65 20 2d 61 6c 69 61 73 20 43 6f 6c 75 6d 6e  le -alias Column
1b860 73 2e 67 65 74 5f 49 74 65 6d 20 24 69 6e 64 65  s.get_Item $inde
1b870 78 5d 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20  x]..        set 
1b880 6e 61 6d 65 73 28 24 69 6e 64 65 78 29 20 5b 24  names($index) [$
1b890 64 61 74 61 43 6f 6c 75 6d 6e 20 43 6f 6c 75 6d  dataColumn Colum
1b8a0 6e 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20 7d 0d  nName]..      }.
1b8b0 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
1b8c0 20 20 23 20 4e 4f 54 45 3a 20 53 65 74 75 70 20    # NOTE: Setup 
1b8d0 73 6f 6d 65 20 54 63 6c 20 72 65 74 75 72 6e 20  some Tcl return 
1b8e0 63 6f 64 65 20 63 6f 6e 73 74 61 6e 74 73 2e 0d  code constants..
1b8f0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
1b900 73 65 74 20 4f 6b 20 30 3b 20 73 65 74 20 45 72  set Ok 0; set Er
1b910 72 6f 72 20 31 3b 20 73 65 74 20 52 65 74 75 72  ror 1; set Retur
1b920 6e 20 32 3b 20 73 65 74 20 42 72 65 61 6b 20 33  n 2; set Break 3
1b930 3b 20 73 65 74 20 43 6f 6e 74 69 6e 75 65 20 34  ; set Continue 4
1b940 0d 0a 0d 0a 20 20 20 20 20 20 6f 62 6a 65 63 74  ....      object
1b950 20 66 6f 72 65 61 63 68 20 2d 61 6c 69 61 73 20   foreach -alias 
1b960 64 61 74 61 52 6f 77 20 5b 73 65 74 20 64 61 74  dataRow [set dat
1b970 61 52 6f 77 73 20 5b 24 64 61 74 61 54 61 62 6c  aRows [$dataTabl
1b980 65 20 52 6f 77 73 5d 5d 20 7b 0d 0a 20 20 20 20  e Rows]] {..    
1b990 20 20 20 20 73 65 74 20 72 6f 77 20 5b 6c 69 73      set row [lis
1b9a0 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 66 6f  t]....        fo
1b9b0 72 20 7b 73 65 74 20 69 6e 64 65 78 20 30 7d 20  r {set index 0} 
1b9c0 7b 24 69 6e 64 65 78 20 3c 20 24 63 6f 75 6e 74  {$index < $count
1b9d0 7d 20 7b 69 6e 63 72 20 69 6e 64 65 78 7d 20 7b  } {incr index} {
1b9e0 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
1b9f0 76 61 6c 75 65 20 5b 24 64 61 74 61 52 6f 77 20  value [$dataRow 
1ba00 2d 63 72 65 61 74 65 20 2d 61 6c 69 61 73 20 67  -create -alias g
1ba10 65 74 5f 49 74 65 6d 20 24 69 6e 64 65 78 5d 0d  et_Item $index].
1ba20 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  ...          if 
1ba30 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
1ba40 24 76 61 6c 75 65 43 61 6c 6c 62 61 63 6b 5d 20  $valueCallback] 
1ba50 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
1ba60 20 20 20 20 20 20 20 20 20 73 65 74 20 63 6f 64           set cod
1ba70 65 20 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20  e [catch {..    
1ba80 20 20 20 20 20 20 20 20 20 20 24 76 61 6c 75 65            $value
1ba90 43 61 6c 6c 62 61 63 6b 20 24 64 61 74 61 54 61  Callback $dataTa
1baa0 62 6c 65 20 24 64 61 74 61 52 6f 77 20 24 69 6e  ble $dataRow $in
1bab0 64 65 78 20 24 76 61 6c 75 65 0d 0a 20 20 20 20  dex $value..    
1bac0 20 20 20 20 20 20 20 20 7d 20 6e 65 77 56 61 6c          } newVal
1bad0 75 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ue]....         
1bae0 20 20 20 69 66 20 7b 24 63 6f 64 65 20 3d 3d 20     if {$code == 
1baf0 24 4f 6b 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  $Ok} then {..   
1bb00 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
1bb10 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f              # NO
1bb20 54 45 3a 20 55 73 65 20 74 68 65 20 73 70 65 63  TE: Use the spec
1bb30 69 66 69 65 64 20 28 6e 65 77 3f 29 20 72 6f 77  ified (new?) row
1bb40 20 76 61 6c 75 65 2e 0d 0a 20 20 20 20 20 20 20   value...       
1bb50 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1bb60 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20          lappend 
1bb70 72 6f 77 20 5b 6c 69 73 74 20 24 6e 61 6d 65 73  row [list $names
1bb80 28 24 69 6e 64 65 78 29 20 24 6e 65 77 56 61 6c  ($index) $newVal
1bb90 75 65 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ue]..           
1bba0 20 7d 20 65 6c 73 65 69 66 20 7b 24 63 6f 64 65   } elseif {$code
1bbb0 20 3d 3d 20 24 45 72 72 6f 72 7d 20 74 68 65 6e   == $Error} then
1bbc0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1bbd0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
1bbe0 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20 74     # NOTE: Use t
1bbf0 68 65 20 28 6e 65 77 3f 29 20 4e 55 4c 4c 20 72  he (new?) NULL r
1bc00 6f 77 20 76 61 6c 75 65 2e 0d 0a 20 20 20 20 20  ow value...     
1bc10 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
1bc20 20 20 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e            lappen
1bc30 64 20 72 6f 77 20 5b 6c 69 73 74 20 24 6e 61 6d  d row [list $nam
1bc40 65 73 28 24 69 6e 64 65 78 29 5d 0d 0a 20 20 20  es($index)]..   
1bc50 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 69           } elsei
1bc60 66 20 7b 24 63 6f 64 65 20 3d 3d 20 24 52 65 74  f {$code == $Ret
1bc70 75 72 6e 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  urn} then {..   
1bc80 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
1bc90 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f              # NO
1bca0 54 45 3a 20 53 6b 69 70 20 72 65 6d 61 69 6e 69  TE: Skip remaini
1bcb0 6e 67 20 76 61 6c 75 65 73 20 66 6f 72 20 74 68  ng values for th
1bcc0 69 73 20 72 6f 77 2e 0d 0a 20 20 20 20 20 20 20  is row...       
1bcd0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1bce0 20 20 20 20 20 20 20 20 62 72 65 61 6b 0d 0a 20          break.. 
1bcf0 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73             } els
1bd00 65 69 66 20 7b 24 63 6f 64 65 20 3d 3d 20 24 42  eif {$code == $B
1bd10 72 65 61 6b 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  reak} then {..  
1bd20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
1bd30 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e               # N
1bd40 4f 54 45 3a 20 53 6b 69 70 20 70 72 6f 63 65 73  OTE: Skip proces
1bd50 73 69 6e 67 20 74 68 69 73 20 72 6f 77 20 76 61  sing this row va
1bd60 6c 75 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  lue...          
1bd70 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
1bd80 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 24 63 6f     } elseif {$co
1bd90 64 65 20 3d 3d 20 24 43 6f 6e 74 69 6e 75 65 7d  de == $Continue}
1bda0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1bdb0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1bdc0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
1bdd0 55 73 65 20 64 65 66 61 75 6c 74 20 72 6f 77 20  Use default row 
1bde0 76 61 6c 75 65 20 68 61 6e 64 6c 69 6e 67 2e 0d  value handling..
1bdf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
1be00 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
1be10 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73  .          } els
1be20 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e {..           
1be30 20 73 65 74 20 63 6f 64 65 20 24 43 6f 6e 74 69   set code $Conti
1be40 6e 75 65 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  nue..          }
1be50 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66  ....          if
1be60 20 7b 24 63 6f 64 65 20 3d 3d 20 24 43 6f 6e 74   {$code == $Cont
1be70 69 6e 75 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  inue} then {..  
1be80 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73            if {[s
1be90 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 61  tring length $va
1bea0 6c 75 65 5d 20 3e 20 30 20 26 26 20 5c 0d 0a 20  lue] > 0 && \.. 
1beb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 21                 !
1bec0 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 43  [object invoke C
1bed0 6f 6e 76 65 72 74 20 49 73 44 42 4e 75 6c 6c 20  onvert IsDBNull 
1bee0 24 76 61 6c 75 65 5d 7d 20 74 68 65 6e 20 7b 0d  $value]} then {.
1bef0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c  .              l
1bf00 61 70 70 65 6e 64 20 72 6f 77 20 5b 6c 69 73 74  append row [list
1bf10 20 24 6e 61 6d 65 73 28 24 69 6e 64 65 78 29 20   $names($index) 
1bf20 5b 24 76 61 6c 75 65 20 54 6f 53 74 72 69 6e 67  [$value ToString
1bf30 5d 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ]]..            
1bf40 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
1bf50 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20          lappend 
1bf60 72 6f 77 20 5b 6c 69 73 74 20 24 6e 61 6d 65 73  row [list $names
1bf70 28 24 69 6e 64 65 78 29 5d 0d 0a 20 20 20 20 20  ($index)]..     
1bf80 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1bf90 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
1bfa0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 6c 61 70 70  ....        lapp
1bfb0 65 6e 64 20 72 6f 77 73 20 24 72 6f 77 0d 0a 20  end rows $row.. 
1bfc0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
1bfd0 72 65 74 75 72 6e 20 24 72 6f 77 73 0d 0a 20 20  return $rows..  
1bfe0 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
1bff0 20 64 75 6d 70 52 6f 77 73 46 72 6f 6d 44 61 74   dumpRowsFromDat
1c000 61 54 61 62 6c 65 20 7b 20 63 68 61 6e 6e 65 6c  aTable { channel
1c010 20 72 6f 77 73 20 7d 20 7b 0d 0a 20 20 20 20 20   rows } {..     
1c020 20 73 65 74 20 73 65 71 75 65 6e 63 65 20 31 0d   set sequence 1.
1c030 0a 0d 0a 20 20 20 20 20 20 66 6f 72 65 61 63 68  ...      foreach
1c040 20 72 6f 77 20 24 72 6f 77 73 20 7b 0d 0a 20 20   row $rows {..  
1c050 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
1c060 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
1c070 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1c080 5b 65 78 70 72 20 7b 24 73 65 71 75 65 6e 63 65  [expr {$sequence
1c090 20 3e 20 31 20 3f 20 22 5c 6e 22 20 3a 20 22 22   > 1 ? "\n" : ""
1c0a0 7d 5d 20 22 2d 2d 2d 2d 20 52 4f 57 20 23 22 20  }] "---- ROW #" 
1c0b0 24 73 65 71 75 65 6e 63 65 20 3a 5c 6e 5d 0d 0a  $sequence :\n]..
1c0c0 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63  ..        foreac
1c0d0 68 20 70 61 69 72 20 24 72 6f 77 20 7b 0d 0a 20  h pair $row {.. 
1c0e0 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 6c 6c           if {[ll
1c0f0 65 6e 67 74 68 20 24 70 61 69 72 5d 20 3e 3d 20  ength $pair] >= 
1c100 32 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  2} then {..     
1c110 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
1c120 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
1c130 73 20 5c 74 20 5c 0d 0a 20 20 20 20 20 20 20 20  s \t \..        
1c140 20 20 20 20 20 20 20 20 5b 6c 69 73 74 20 5b 6c          [list [l
1c150 69 6e 64 65 78 20 24 70 61 69 72 20 30 5d 5d 20  index $pair 0]] 
1c160 22 3a 20 22 20 5b 6c 69 73 74 20 5b 6c 69 6e 64  ": " [list [lind
1c170 65 78 20 24 70 61 69 72 20 31 5d 5d 20 5c 6e 5d  ex $pair 1]] \n]
1c180 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c  ..          } el
1c190 73 65 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24  seif {[llength $
1c1a0 70 61 69 72 5d 20 3d 3d 20 31 7d 20 74 68 65 6e  pair] == 1} then
1c1b0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1c1c0 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
1c1d0 61 70 70 65 6e 64 41 72 67 73 20 5c 74 20 5c 0d  appendArgs \t \.
1c1e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1c1f0 20 5b 6c 69 73 74 20 5b 6c 69 6e 64 65 78 20 24   [list [lindex $
1c200 70 61 69 72 20 30 5d 5d 20 22 3a 20 3c 6e 75 6c  pair 0]] ": <nul
1c210 6c 3e 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20  l>\n"]..        
1c220 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
1c230 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
1c240 68 61 6e 6e 65 6c 20 5c 74 3c 65 6d 70 74 79 3e  hannel \t<empty>
1c250 5c 6e 3b 20 23 20 4e 4f 54 45 3a 20 4e 6f 20 64  \n; # NOTE: No d
1c260 61 74 61 3f 0d 0a 20 20 20 20 20 20 20 20 20 20  ata?..          
1c270 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  }..        }....
1c280 20 20 20 20 20 20 20 20 69 6e 63 72 20 73 65 71          incr seq
1c290 75 65 6e 63 65 0d 0a 20 20 20 20 20 20 7d 0d 0a  uence..      }..
1c2a0 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
1c2b0 6f 63 20 63 6c 65 61 6e 75 70 44 62 20 7b 20 66  oc cleanupDb { f
1c2c0 69 6c 65 4e 61 6d 65 20 7b 76 61 72 4e 61 6d 65  ileName {varName
1c2d0 20 64 62 7d 20 7b 63 6f 6c 6c 65 63 74 20 74 72   db} {collect tr
1c2e0 75 65 7d 20 7b 71 75 61 6c 69 66 79 20 74 72 75  ue} {qualify tru
1c2f0 65 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e}..            
1c300 20 20 20 20 20 20 20 20 20 7b 64 65 6c 65 74 65           {delete
1c310 20 74 72 75 65 7d 20 7d 20 7b 0d 0a 20 20 20 20   true} } {..    
1c320 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
1c330 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 66 6f  E: Attempt to fo
1c340 72 63 65 20 61 6c 6c 20 70 65 6e 64 69 6e 67 20  rce all pending 
1c350 22 67 61 72 62 61 67 65 22 20 6f 62 6a 65 63 74  "garbage" object
1c360 73 20 74 6f 20 62 65 20 63 6f 6c 6c 65 63 74 65  s to be collecte
1c370 64 2c 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  d,..      #     
1c380 20 20 69 6e 63 6c 75 64 69 6e 67 20 53 51 4c 69    including SQLi
1c390 74 65 20 73 74 61 74 65 6d 65 6e 74 73 20 61 6e  te statements an
1c3a0 64 20 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73  d backup objects
1c3b0 3b 20 74 68 69 73 20 73 68 6f 75 6c 64 20 61 6c  ; this should al
1c3c0 6c 6f 77 0d 0a 20 20 20 20 20 20 23 20 20 20 20  low..      #    
1c3d0 20 20 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e     the underlyin
1c3e0 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  g database file 
1c3f0 74 6f 20 62 65 20 64 65 6c 65 74 65 64 2e 0d 0a  to be deleted...
1c400 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
1c410 66 20 7b 24 63 6f 6c 6c 65 63 74 7d 20 74 68 65  f {$collect} the
1c420 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 63 6f 6c  n {..        col
1c430 6c 65 63 74 47 61 72 62 61 67 65 20 24 3a 3a 74  lectGarbage $::t
1c440 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 20 20 20  est_channel..   
1c450 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
1c460 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52  .      # NOTE: R
1c470 65 66 65 72 20 74 6f 20 74 68 65 20 73 70 65 63  efer to the spec
1c480 69 66 69 65 64 20 76 61 72 69 61 62 6c 65 20 28  ified variable (
1c490 65 2e 67 2e 20 22 64 62 22 29 20 69 6e 20 74 68  e.g. "db") in th
1c4a0 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72  e context of our
1c4b0 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
1c4c0 63 61 6c 6c 65 72 2e 20 20 54 68 65 20 68 61 6e  caller.  The han
1c4d0 64 6c 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  dle to the datab
1c4e0 61 73 65 20 70 72 65 76 69 6f 75 73 6c 79 20 6f  ase previously o
1c4f0 70 65 6e 65 64 20 76 69 61 20 74 68 65 0d 0a 20  pened via the.. 
1c500 20 20 20 20 20 23 20 20 20 20 20 20 20 5b 73 65       #       [se
1c510 74 75 70 44 62 5d 20 70 72 6f 63 65 64 75 72 65  tupDb] procedure
1c520 20 73 68 6f 75 6c 64 20 62 65 20 73 74 6f 72 65   should be store
1c530 64 20 74 68 65 72 65 2e 0d 0a 20 20 20 20 20 20  d there...      
1c540 23 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20 31  #..      upvar 1
1c550 20 24 76 61 72 4e 61 6d 65 20 64 62 0d 0a 0d 0a   $varName db....
1c560 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
1c570 20 4e 4f 54 45 3a 20 43 6c 6f 73 65 20 74 68 65   NOTE: Close the
1c580 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 74   connection to t
1c590 68 65 20 64 61 74 61 62 61 73 65 20 6e 6f 77 2e  he database now.
1c5a0 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20 61 6c    This should al
1c5b0 6c 6f 77 20 75 73 0d 0a 20 20 20 20 20 20 23 20  low us..      # 
1c5c0 20 20 20 20 20 20 74 6f 20 64 65 6c 65 74 65 20        to delete 
1c5d0 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64  the underlying d
1c5e0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0d 0a 20  atabase file... 
1c5f0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
1c600 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 64   {[info exists d
1c610 62 5d 20 26 26 20 5b 63 61 74 63 68 20 7b 73 71  b] && [catch {sq
1c620 6c 20 63 6c 6f 73 65 20 24 64 62 7d 20 65 72 72  l close $db} err
1c630 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  or]} then {..   
1c640 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1c650 23 20 4e 4f 54 45 3a 20 57 65 20 73 6f 6d 65 68  # NOTE: We someh
1c660 6f 77 20 66 61 69 6c 65 64 20 74 6f 20 63 6c 6f  ow failed to clo
1c670 73 65 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  se the database,
1c680 20 72 65 70 6f 72 74 20 77 68 79 2e 0d 0a 20 20   report why...  
1c690 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1c6a0 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
1c6b0 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
1c6c0 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
1c6d0 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a    "==== WARNING:
1c6e0 20 66 61 69 6c 65 64 20 74 6f 20 63 6c 6f 73 65   failed to close
1c6f0 20 64 61 74 61 62 61 73 65 20 5c 22 22 20 24 64   database \"" $d
1c700 62 20 22 5c 22 2c 20 65 72 72 6f 72 3a 20 22 20  b "\", error: " 
1c710 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5c  \..            \
1c720 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a  n\t $error \n]..
1c730 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
1c740 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
1c750 3a 20 46 69 72 73 74 2c 20 73 65 65 20 69 66 20  : First, see if 
1c760 6f 75 72 20 63 61 6c 6c 65 72 20 68 61 73 20 72  our caller has r
1c770 65 71 75 65 73 74 65 64 20 61 6e 20 69 6e 2d 6d  equested an in-m
1c780 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0d  emory database..
1c790 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
1c7a0 73 65 74 20 69 73 4d 65 6d 6f 72 79 20 5b 69 73  set isMemory [is
1c7b0 4d 65 6d 6f 72 79 44 62 20 24 66 69 6c 65 4e 61  MemoryDb $fileNa
1c7c0 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a  me]....      #..
1c7d0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75        # NOTE: Bu
1c7e0 69 6c 64 20 74 68 65 20 66 75 6c 6c 20 70 61 74  ild the full pat
1c7f0 68 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  h to the databas
1c800 65 20 66 69 6c 65 20 6e 61 6d 65 2e 20 20 46 6f  e file name.  Fo
1c810 72 20 6e 6f 77 2c 20 61 6c 6c 20 74 65 73 74 0d  r now, all test.
1c820 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64  .      #       d
1c830 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 61 72  atabase files ar
1c840 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  e stored in the 
1c850 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74  temporary direct
1c860 6f 72 79 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ory...      #.. 
1c870 20 20 20 20 20 69 66 20 7b 21 24 69 73 4d 65 6d       if {!$isMem
1c880 6f 72 79 20 26 26 20 24 71 75 61 6c 69 66 79 7d  ory && $qualify}
1c890 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1c8a0 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66   set fileName [f
1c8b0 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 44 61 74  ile join [getDat
1c8c0 61 62 61 73 65 44 69 72 65 63 74 6f 72 79 5d 20  abaseDirectory] 
1c8d0 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69 6c 65  [file tail $file
1c8e0 4e 61 6d 65 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d  Name]]..      }.
1c8f0 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
1c900 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20    # NOTE: Check 
1c910 69 66 20 74 68 65 20 66 69 6c 65 20 73 74 69 6c  if the file stil
1c920 6c 20 65 78 69 73 74 73 3b 20 69 6e 69 74 69 61  l exists; initia
1c930 6c 6c 79 2c 20 61 73 73 75 6d 65 20 61 6c 6c 20  lly, assume all 
1c940 66 69 6c 65 73 20 77 69 6c 6c 0d 0a 20 20 20 20  files will..    
1c950 20 20 23 20 20 20 20 20 20 20 62 65 20 64 65 6c    #       be del
1c960 65 74 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c  eted successfull
1c970 79 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  y, if necessary.
1c980 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
1c990 20 73 65 74 20 73 75 63 63 65 73 73 20 74 72 75   set success tru
1c9a0 65 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 21  e....      if {!
1c9b0 24 69 73 4d 65 6d 6f 72 79 20 26 26 20 24 64 65  $isMemory && $de
1c9c0 6c 65 74 65 20 26 26 20 5b 66 69 6c 65 20 65 78  lete && [file ex
1c9d0 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d  ists $fileName]}
1c9e0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1c9f0 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
1ca00 54 45 3a 20 53 6b 69 70 20 64 65 6c 65 74 69 6e  TE: Skip deletin
1ca10 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  g database files
1ca20 20 69 66 20 73 6f 6d 65 62 6f 64 79 20 73 65 74   if somebody set
1ca30 73 20 74 68 65 20 67 6c 6f 62 61 6c 0d 0a 20 20  s the global..  
1ca40 20 20 20 20 20 20 23 20 20 20 20 20 20 20 76 61        #       va
1ca50 72 69 61 62 6c 65 20 74 6f 20 70 72 65 76 65 6e  riable to preven
1ca60 74 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23  t it...        #
1ca70 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b  ..        if {![
1ca80 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
1ca90 28 63 6c 65 61 6e 75 70 44 62 46 69 6c 65 73 29  (cleanupDbFiles)
1caa0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
1cab0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1cac0 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70    # NOTE: Attemp
1cad0 74 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20  t to delete the 
1cae0 74 65 73 74 20 57 41 4c 20 66 69 6c 65 2c 20 69  test WAL file, i
1caf0 66 20 61 6e 79 2c 20 6e 6f 77 2e 0d 0a 20 20 20  f any, now...   
1cb00 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1cb10 20 20 20 20 73 65 74 20 77 61 6c 46 69 6c 65 4e      set walFileN
1cb20 61 6d 65 20 5b 61 70 70 65 6e 64 41 72 67 73 20  ame [appendArgs 
1cb30 24 66 69 6c 65 4e 61 6d 65 20 2d 77 61 6c 5d 0d  $fileName -wal].
1cb40 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  ...          if 
1cb50 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 77  {[file exists $w
1cb60 61 6c 46 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65  alFileName]} the
1cb70 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
1cb80 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
1cb90 23 20 4e 4f 54 45 3a 20 49 66 20 74 68 65 72 65  # NOTE: If there
1cba0 20 69 73 20 61 20 57 41 4c 20 66 69 6c 65 2c 20   is a WAL file, 
1cbb0 69 74 20 73 68 6f 75 6c 64 20 62 65 20 7a 65 72  it should be zer
1cbc0 6f 20 62 79 74 65 73 20 61 74 20 74 68 69 73 0d  o bytes at this.
1cbd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20  .            #  
1cbe0 20 20 20 20 20 70 6f 69 6e 74 2e 0d 0a 20 20 20       point...   
1cbf0 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
1cc00 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 65 74          if {[set
1cc10 20 73 69 7a 65 20 5b 66 69 6c 65 20 73 69 7a 65   size [file size
1cc20 20 24 77 61 6c 46 69 6c 65 4e 61 6d 65 5d 5d 20   $walFileName]] 
1cc30 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
1cc40 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
1cc50 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e               # N
1cc60 4f 54 45 3a 20 57 65 20 73 6f 6d 65 68 6f 77 20  OTE: We somehow 
1cc70 66 61 69 6c 65 64 20 74 6f 20 64 65 6c 65 74 65  failed to delete
1cc80 20 74 68 65 20 57 41 4c 20 66 69 6c 65 2c 20 72   the WAL file, r
1cc90 65 70 6f 72 74 20 77 68 79 2e 0d 0a 20 20 20 20  eport why...    
1cca0 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
1ccb0 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b             if {[
1ccc0 63 61 74 63 68 20 7b 66 69 6c 65 20 64 65 6c 65  catch {file dele
1ccd0 74 65 20 24 77 61 6c 46 69 6c 65 4e 61 6d 65 7d  te $walFileName}
1cce0 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d   error]} then {.
1ccf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1cd00 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
1cd10 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
1cd20 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
1cd30 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20            "==== 
1cd40 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20  WARNING: failed 
1cd50 74 6f 20 64 65 6c 65 74 65 20 57 41 4c 20 66 69  to delete WAL fi
1cd60 6c 65 20 5c 22 22 20 24 77 61 6c 46 69 6c 65 4e  le \"" $walFileN
1cd70 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ame \..         
1cd80 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 20 64             "\" d
1cd90 75 72 69 6e 67 20 63 6c 65 61 6e 75 70 2c 20 65  uring cleanup, e
1cda0 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72  rror: " \n\t $er
1cdb0 72 6f 72 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20  ror \n]....     
1cdc0 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 73             set s
1cdd0 75 63 63 65 73 73 20 66 61 6c 73 65 0d 0a 20 20  uccess false..  
1cde0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
1cdf0 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73             } els
1ce00 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e {..           
1ce10 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
1ce20 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
1ce30 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
1ce40 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20            "==== 
1ce50 57 41 52 4e 49 4e 47 3a 20 57 41 4c 20 66 69 6c  WARNING: WAL fil
1ce60 65 20 5c 22 22 20 24 77 61 6c 46 69 6c 65 4e 61  e \"" $walFileNa
1ce70 6d 65 20 22 5c 22 20 69 73 20 22 20 24 73 69 7a  me "\" is " $siz
1ce80 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
1ce90 20 20 20 20 20 20 20 22 20 62 79 74 65 73 20 69         " bytes i
1cea0 6e 20 73 69 7a 65 2c 20 73 6b 69 70 70 69 6e 67  n size, skipping
1ceb0 20 61 6c 6c 20 66 69 6c 65 20 64 65 6c 65 74 69   all file deleti
1cec0 6f 6e 73 2e 2e 2e 5c 6e 22 5d 0d 0a 0d 0a 20 20  ons...\n"]....  
1ced0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
1cee0 72 6e 20 31 3b 20 23 20 65 72 72 6f 72 0d 0a 20  rn 1; # error.. 
1cef0 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
1cf00 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
1cf10 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1cf20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65      # NOTE: Atte
1cf30 6d 70 74 20 74 6f 20 64 65 6c 65 74 65 20 74 68  mpt to delete th
1cf40 65 20 74 65 73 74 20 53 48 4d 20 66 69 6c 65 2c  e test SHM file,
1cf50 20 69 66 20 61 6e 79 2c 20 6e 6f 77 2e 0d 0a 20   if any, now... 
1cf60 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
1cf70 20 20 20 20 20 20 73 65 74 20 73 68 6d 46 69 6c        set shmFil
1cf80 65 4e 61 6d 65 20 5b 61 70 70 65 6e 64 41 72 67  eName [appendArg
1cf90 73 20 24 66 69 6c 65 4e 61 6d 65 20 2d 73 68 6d  s $fileName -shm
1cfa0 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69  ]....          i
1cfb0 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20  f {[file exists 
1cfc0 24 73 68 6d 46 69 6c 65 4e 61 6d 65 5d 20 26 26  $shmFileName] &&
1cfd0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1cfe0 20 20 5b 63 61 74 63 68 20 7b 66 69 6c 65 20 64    [catch {file d
1cff0 65 6c 65 74 65 20 24 73 68 6d 46 69 6c 65 4e 61  elete $shmFileNa
1d000 6d 65 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e  me} error]} then
1d010 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1d020 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  #..            #
1d030 20 4e 4f 54 45 3a 20 57 65 20 73 6f 6d 65 68 6f   NOTE: We someho
1d040 77 20 66 61 69 6c 65 64 20 74 6f 20 64 65 6c 65  w failed to dele
1d050 74 65 20 74 68 65 20 53 48 4d 20 66 69 6c 65 2c  te the SHM file,
1d060 20 72 65 70 6f 72 74 20 77 68 79 2e 0d 0a 20 20   report why...  
1d070 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
1d080 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
1d090 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
1d0a0 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
1d0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d                "=
1d0c0 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69  === WARNING: fai
1d0d0 6c 65 64 20 74 6f 20 64 65 6c 65 74 65 20 53 48  led to delete SH
1d0e0 4d 20 66 69 6c 65 20 5c 22 22 20 24 73 68 6d 46  M file \"" $shmF
1d0f0 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20  ileName \..     
1d100 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 20 64             "\" d
1d110 75 72 69 6e 67 20 63 6c 65 61 6e 75 70 2c 20 65  uring cleanup, e
1d120 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72  rror: " \n\t $er
1d130 72 6f 72 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20  ror \n]....     
1d140 20 20 20 20 20 20 20 73 65 74 20 73 75 63 63 65         set succe
1d150 73 73 20 66 61 6c 73 65 0d 0a 20 20 20 20 20 20  ss false..      
1d160 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
1d170 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
1d180 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20  # NOTE: Attempt 
1d190 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 74 65  to delete the te
1d1a0 73 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  st database file
1d1b0 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 20   now...         
1d1c0 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   #..          if
1d1d0 20 7b 5b 63 61 74 63 68 20 7b 66 69 6c 65 20 64   {[catch {file d
1d1e0 65 6c 65 74 65 20 24 66 69 6c 65 4e 61 6d 65 7d  elete $fileName}
1d1f0 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d   error]} then {.
1d200 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a  .            #..
1d210 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f              # NO
1d220 54 45 3a 20 57 65 20 73 6f 6d 65 68 6f 77 20 66  TE: We somehow f
1d230 61 69 6c 65 64 20 74 6f 20 64 65 6c 65 74 65 20  ailed to delete 
1d240 74 68 65 20 66 69 6c 65 2c 20 72 65 70 6f 72 74  the file, report
1d250 20 77 68 79 2e 0d 0a 20 20 20 20 20 20 20 20 20   why...         
1d260 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
1d270 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
1d280 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
1d290 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
1d2a0 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52         "==== WAR
1d2b0 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20  NING: failed to 
1d2c0 64 65 6c 65 74 65 20 64 61 74 61 62 61 73 65 20  delete database 
1d2d0 66 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e 61  file \"" $fileNa
1d2e0 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  me \..          
1d2f0 20 20 20 20 20 20 22 5c 22 20 64 75 72 69 6e 67        "\" during
1d300 20 63 6c 65 61 6e 75 70 2c 20 65 72 72 6f 72 3a   cleanup, error:
1d310 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c   " \n\t $error \
1d320 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  n]....          
1d330 20 20 73 65 74 20 73 75 63 63 65 73 73 20 66 61    set success fa
1d340 6c 73 65 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  lse..          }
1d350 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65  ..        } else
1d360 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d   {..          #.
1d370 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
1d380 45 3a 20 53 68 6f 77 20 74 68 61 74 20 77 65 20  E: Show that we 
1d390 73 6b 69 70 70 65 64 20 64 65 6c 65 74 69 6e 67  skipped deleting
1d3a0 20 74 68 65 20 66 69 6c 65 2e 0d 0a 20 20 20 20   the file...    
1d3b0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1d3c0 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
1d3d0 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
1d3e0 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
1d3f0 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e        "==== WARN
1d400 49 4e 47 3a 20 73 6b 69 70 70 65 64 20 64 65 6c  ING: skipped del
1d410 65 74 69 6e 67 20 64 61 74 61 62 61 73 65 20 66  eting database f
1d420 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d  ile \"" $fileNam
1d430 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
1d440 20 20 20 22 5c 22 20 64 75 72 69 6e 67 20 63 6c     "\" during cl
1d450 65 61 6e 75 70 5c 6e 22 5d 0d 0a 20 20 20 20 20  eanup\n"]..     
1d460 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d     }..      }...
1d470 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 65  .      return [e
1d480 78 70 72 20 7b 24 73 75 63 63 65 73 73 20 3f 20  xpr {$success ? 
1d490 30 20 3a 20 31 7d 5d 0d 0a 20 20 20 20 7d 0d 0a  0 : 1}]..    }..
1d4a0 0c 0d 0a 20 20 20 20 70 72 6f 63 20 73 61 76 65  ...    proc save
1d4b0 45 6e 76 69 72 6f 6e 6d 65 6e 74 56 61 72 69 61  EnvironmentVaria
1d4c0 62 6c 65 73 20 7b 20 6e 61 6d 65 73 20 7b 76 61  bles { names {va
1d4d0 72 4e 61 6d 65 20 22 22 7d 20 7d 20 7b 0d 0a 20  rName ""} } {.. 
1d4e0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
1d4f0 4e 4f 54 45 3a 20 46 6f 72 20 65 61 63 68 20 6e  NOTE: For each n
1d500 61 6d 65 2c 20 64 6f 65 73 20 74 68 65 20 6c 69  ame, does the li
1d510 76 65 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76  ve environment v
1d520 61 72 69 61 62 6c 65 20 65 78 69 73 74 3f 20 20  ariable exist?  
1d530 49 66 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  If..      #     
1d540 20 20 73 6f 2c 20 73 61 76 65 20 74 68 65 20 76    so, save the v
1d550 61 6c 75 65 20 66 6f 72 20 6c 61 74 65 72 3b 20  alue for later; 
1d560 6f 74 68 65 72 77 69 73 65 2c 20 6d 61 6b 65 20  otherwise, make 
1d570 73 75 72 65 20 74 68 65 20 73 61 76 65 64 0d 0a  sure the saved..
1d580 20 20 20 20 20 20 23 20 20 20 20 20 20 20 76 61        #       va
1d590 6c 75 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  lue does not exi
1d5a0 73 74 20 65 69 74 68 65 72 2e 20 20 54 68 65 20  st either.  The 
1d5b0 6c 69 76 65 20 65 6e 76 69 72 6f 6e 6d 65 6e 74  live environment
1d5c0 20 76 61 72 69 61 62 6c 65 73 0d 0a 20 20 20 20   variables..    
1d5d0 20 20 23 20 20 20 20 20 20 20 41 52 45 20 4e 4f    #       ARE NO
1d5e0 54 20 63 68 61 6e 67 65 64 20 62 79 20 74 68 69  T changed by thi
1d5f0 73 20 70 72 6f 63 65 64 75 72 65 2e 0d 0a 20 20  s procedure...  
1d600 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
1d610 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
1d620 24 76 61 72 4e 61 6d 65 5d 20 3d 3d 20 30 7d 20  $varName] == 0} 
1d630 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1d640 73 65 74 20 76 61 72 4e 61 6d 65 20 73 61 76 65  set varName save
1d650 64 45 6e 76 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  dEnv..      }...
1d660 0a 20 20 20 20 20 20 75 70 76 61 72 20 31 20 24  .      upvar 1 $
1d670 76 61 72 4e 61 6d 65 20 73 61 76 65 64 45 6e 76  varName savedEnv
1d680 0d 0a 0d 0a 20 20 20 20 20 20 66 6f 72 65 61 63  ....      foreac
1d690 68 20 6e 61 6d 65 20 24 6e 61 6d 65 73 20 7b 0d  h name $names {.
1d6a0 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69 6e  .        if {[in
1d6b0 66 6f 20 65 78 69 73 74 73 20 3a 3a 65 6e 76 28  fo exists ::env(
1d6c0 24 6e 61 6d 65 29 5d 7d 20 74 68 65 6e 20 7b 0d  $name)]} then {.
1d6d0 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20 73  .          set s
1d6e0 61 76 65 64 45 6e 76 28 24 6e 61 6d 65 29 20 24  avedEnv($name) $
1d6f0 3a 3a 65 6e 76 28 24 6e 61 6d 65 29 0d 0a 20 20  ::env($name)..  
1d700 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
1d710 20 20 20 20 20 20 20 20 20 20 75 6e 73 65 74 20            unset 
1d720 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 73 61 76 65  -nocomplain save
1d730 64 45 6e 76 28 24 6e 61 6d 65 29 0d 0a 20 20 20  dEnv($name)..   
1d740 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
1d750 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
1d760 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 69    # NOTE: This i
1d770 73 20 73 65 6c 66 2d 63 6c 65 61 6e 69 6e 67 2e  s self-cleaning.
1d780 20 20 49 66 20 6e 6f 20 73 61 76 65 64 20 65 6e    If no saved en
1d790 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62  vironment variab
1d7a0 6c 65 73 20 6e 6f 77 0d 0a 20 20 20 20 20 20 23  les now..      #
1d7b0 20 20 20 20 20 20 20 65 78 69 73 74 2c 20 72 65         exist, re
1d7c0 6d 6f 76 65 20 74 68 65 20 61 72 72 61 79 2e 0d  move the array..
1d7d0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
1d7e0 69 66 20 7b 5b 61 72 72 61 79 20 73 69 7a 65 20  if {[array size 
1d7f0 73 61 76 65 64 45 6e 76 5d 20 3d 3d 20 30 7d 20  savedEnv] == 0} 
1d800 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1d810 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69  unset -nocomplai
1d820 6e 20 73 61 76 65 64 45 6e 76 0d 0a 20 20 20 20  n savedEnv..    
1d830 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
1d840 20 20 20 70 72 6f 63 20 72 65 73 74 6f 72 65 45     proc restoreE
1d850 6e 76 69 72 6f 6e 6d 65 6e 74 56 61 72 69 61 62  nvironmentVariab
1d860 6c 65 73 20 7b 20 6e 61 6d 65 73 20 7b 76 61 72  les { names {var
1d870 4e 61 6d 65 20 22 22 7d 20 7d 20 7b 0d 0a 20 20  Name ""} } {..  
1d880 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
1d890 4f 54 45 3a 20 46 6f 72 20 65 61 63 68 20 6e 61  OTE: For each na
1d8a0 6d 65 2c 20 64 6f 65 73 20 74 68 65 20 73 61 76  me, does the sav
1d8b0 65 64 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76  ed environment v
1d8c0 61 72 69 61 62 6c 65 20 65 78 69 73 74 3f 20 20  ariable exist?  
1d8d0 49 66 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  If..      #     
1d8e0 20 20 73 6f 2c 20 72 65 73 74 6f 72 65 20 74 68    so, restore th
1d8f0 65 20 73 61 76 65 64 20 76 61 6c 75 65 20 61 6e  e saved value an
1d900 64 20 75 6e 73 65 74 20 69 74 3b 20 6f 74 68 65  d unset it; othe
1d910 72 77 69 73 65 2c 20 6d 61 6b 65 20 73 75 72 65  rwise, make sure
1d920 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
1d930 74 68 65 20 6c 69 76 65 20 65 6e 76 69 72 6f 6e  the live environ
1d940 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 20 64 6f  ment variable do
1d950 65 73 20 6e 6f 74 20 65 78 69 73 74 20 65 69 74  es not exist eit
1d960 68 65 72 20 28 69 2e 65 2e 20 69 74 0d 0a 20 20  her (i.e. it..  
1d970 20 20 20 20 23 20 20 20 20 20 20 20 77 61 73 20      #       was 
1d980 6e 6f 74 20 73 65 74 20 74 6f 20 62 65 67 69 6e  not set to begin
1d990 20 77 69 74 68 29 2e 20 20 42 6f 74 68 20 73 61   with).  Both sa
1d9a0 76 65 64 20 61 6e 64 20 6c 69 76 65 20 65 6e 76  ved and live env
1d9b0 69 72 6f 6e 6d 65 6e 74 0d 0a 20 20 20 20 20 20  ironment..      
1d9c0 23 20 20 20 20 20 20 20 76 61 72 69 61 62 6c 65  #       variable
1d9d0 73 20 41 52 45 20 63 68 61 6e 67 65 64 20 62 79  s ARE changed by
1d9e0 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 2e   this procedure.
1d9f0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
1da00 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
1da10 67 74 68 20 24 76 61 72 4e 61 6d 65 5d 20 3d 3d  gth $varName] ==
1da20 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
1da30 20 20 20 20 73 65 74 20 76 61 72 4e 61 6d 65 20      set varName 
1da40 73 61 76 65 64 45 6e 76 0d 0a 20 20 20 20 20 20  savedEnv..      
1da50 7d 0d 0a 0d 0a 20 20 20 20 20 20 75 70 76 61 72  }....      upvar
1da60 20 31 20 24 76 61 72 4e 61 6d 65 20 73 61 76 65   1 $varName save
1da70 64 45 6e 76 0d 0a 0d 0a 20 20 20 20 20 20 66 6f  dEnv....      fo
1da80 72 65 61 63 68 20 6e 61 6d 65 20 24 6e 61 6d 65  reach name $name
1da90 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20  s {..        if 
1daa0 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 73 61  {[info exists sa
1dab0 76 65 64 45 6e 76 28 24 6e 61 6d 65 29 5d 7d 20  vedEnv($name)]} 
1dac0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1dad0 20 20 73 65 74 20 3a 3a 65 6e 76 28 24 6e 61 6d    set ::env($nam
1dae0 65 29 20 24 73 61 76 65 64 45 6e 76 28 24 6e 61  e) $savedEnv($na
1daf0 6d 65 29 0d 0a 20 20 20 20 20 20 20 20 20 20 75  me)..          u
1db00 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e  nset -nocomplain
1db10 20 73 61 76 65 64 45 6e 76 28 24 6e 61 6d 65 29   savedEnv($name)
1db20 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65  ..        } else
1db30 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 75 6e   {..          un
1db40 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20  set -nocomplain 
1db50 3a 3a 65 6e 76 28 24 6e 61 6d 65 29 0d 0a 20 20  ::env($name)..  
1db60 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
1db70 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
1db80 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20     # NOTE: This 
1db90 69 73 20 73 65 6c 66 2d 63 6c 65 61 6e 69 6e 67  is self-cleaning
1dba0 2e 20 20 49 66 20 6e 6f 20 73 61 76 65 64 20 65  .  If no saved e
1dbb0 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61  nvironment varia
1dbc0 62 6c 65 73 20 6e 6f 77 0d 0a 20 20 20 20 20 20  bles now..      
1dbd0 23 20 20 20 20 20 20 20 65 78 69 73 74 2c 20 72  #       exist, r
1dbe0 65 6d 6f 76 65 20 74 68 65 20 61 72 72 61 79 2e  emove the array.
1dbf0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
1dc00 20 69 66 20 7b 5b 61 72 72 61 79 20 73 69 7a 65   if {[array size
1dc10 20 73 61 76 65 64 45 6e 76 5d 20 3d 3d 20 30 7d   savedEnv] == 0}
1dc20 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1dc30 20 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61   unset -nocompla
1dc40 69 6e 20 73 61 76 65 64 45 6e 76 0d 0a 20 20 20  in savedEnv..   
1dc50 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
1dc60 20 20 20 20 70 72 6f 63 20 73 61 76 65 45 61 67      proc saveEag
1dc70 6c 65 53 68 65 6c 6c 45 6e 76 69 72 6f 6e 6d 65  leShellEnvironme
1dc80 6e 74 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 75  nt {} {..      u
1dc90 70 76 61 72 20 31 20 73 61 76 65 64 45 6e 76 20  pvar 1 savedEnv 
1dca0 73 61 76 65 64 45 6e 76 0d 0a 0d 0a 20 20 20 20  savedEnv....    
1dcb0 20 20 73 61 76 65 45 6e 76 69 72 6f 6e 6d 65 6e    saveEnvironmen
1dcc0 74 56 61 72 69 61 62 6c 65 73 20 5b 6c 69 73 74  tVariables [list
1dcd0 20 4e 6f 4d 75 74 65 78 65 73 5d 20 73 61 76 65   NoMutexes] save
1dce0 64 45 6e 76 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  dEnv..    }.....
1dcf0 20 20 20 20 70 72 6f 63 20 72 65 73 74 6f 72 65      proc restore
1dd00 45 61 67 6c 65 53 68 65 6c 6c 45 6e 76 69 72 6f  EagleShellEnviro
1dd10 6e 6d 65 6e 74 20 7b 7d 20 7b 0d 0a 20 20 20 20  nment {} {..    
1dd20 20 20 75 70 76 61 72 20 31 20 73 61 76 65 64 45    upvar 1 savedE
1dd30 6e 76 20 73 61 76 65 64 45 6e 76 0d 0a 0d 0a 20  nv savedEnv.... 
1dd40 20 20 20 20 20 72 65 73 74 6f 72 65 45 6e 76 69       restoreEnvi
1dd50 72 6f 6e 6d 65 6e 74 56 61 72 69 61 62 6c 65 73  ronmentVariables
1dd60 20 5b 6c 69 73 74 20 4e 6f 4d 75 74 65 78 65 73   [list NoMutexes
1dd70 5d 20 73 61 76 65 64 45 6e 76 0d 0a 20 20 20 20  ] savedEnv..    
1dd80 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 73  }.....    proc s
1dd90 61 76 65 4d 64 61 43 6f 6e 66 69 67 45 6e 76 69  aveMdaConfigEnvi
1dda0 72 6f 6e 6d 65 6e 74 20 7b 7d 20 7b 0d 0a 20 20  ronment {} {..  
1ddb0 20 20 20 20 75 70 76 61 72 20 31 20 73 61 76 65      upvar 1 save
1ddc0 64 45 6e 76 20 73 61 76 65 64 45 6e 76 0d 0a 0d  dEnv savedEnv...
1ddd0 0a 20 20 20 20 20 20 73 61 76 65 45 6e 76 69 72  .      saveEnvir
1dde0 6f 6e 6d 65 6e 74 56 61 72 69 61 62 6c 65 73 20  onmentVariables 
1ddf0 5b 6c 69 73 74 20 43 4f 4d 50 4c 55 53 5f 4d 44  [list COMPLUS_MD
1de00 41 5d 20 73 61 76 65 64 45 6e 76 0d 0a 20 20 20  A] savedEnv..   
1de10 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
1de20 72 65 73 74 6f 72 65 4d 64 61 43 6f 6e 66 69 67  restoreMdaConfig
1de30 45 6e 76 69 72 6f 6e 6d 65 6e 74 20 7b 7d 20 7b  Environment {} {
1de40 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20 31 20  ..      upvar 1 
1de50 73 61 76 65 64 45 6e 76 20 73 61 76 65 64 45 6e  savedEnv savedEn
1de60 76 0d 0a 0d 0a 20 20 20 20 20 20 72 65 73 74 6f  v....      resto
1de70 72 65 45 6e 76 69 72 6f 6e 6d 65 6e 74 56 61 72  reEnvironmentVar
1de80 69 61 62 6c 65 73 20 5b 6c 69 73 74 20 43 4f 4d  iables [list COM
1de90 50 4c 55 53 5f 4d 44 41 5d 20 73 61 76 65 64 45  PLUS_MDA] savedE
1dea0 6e 76 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  nv..    }.....  
1deb0 20 20 70 72 6f 63 20 73 61 76 65 47 65 74 53 65    proc saveGetSe
1dec0 74 74 69 6e 67 56 61 6c 75 65 45 6e 76 69 72 6f  ttingValueEnviro
1ded0 6e 6d 65 6e 74 20 7b 7d 20 7b 0d 0a 20 20 20 20  nment {} {..    
1dee0 20 20 75 70 76 61 72 20 31 20 73 61 76 65 64 45    upvar 1 savedE
1def0 6e 76 20 73 61 76 65 64 45 6e 76 0d 0a 0d 0a 20  nv savedEnv.... 
1df00 20 20 20 20 20 73 61 76 65 45 6e 76 69 72 6f 6e       saveEnviron
1df10 6d 65 6e 74 56 61 72 69 61 62 6c 65 73 20 5b 6c  mentVariables [l
1df20 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ist \..         
1df30 20 4e 6f 5f 45 78 70 61 6e 64 20 4e 6f 5f 53 51   No_Expand No_SQ
1df40 4c 69 74 65 47 65 74 53 65 74 74 69 6e 67 56 61  LiteGetSettingVa
1df50 6c 75 65 20 4e 6f 5f 53 51 4c 69 74 65 58 6d 6c  lue No_SQLiteXml
1df60 43 6f 6e 66 69 67 46 69 6c 65 5d 20 5c 0d 0a 20  ConfigFile] \.. 
1df70 20 20 20 20 20 20 20 20 20 73 61 76 65 64 45 6e           savedEn
1df80 76 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  v..    }.....   
1df90 20 70 72 6f 63 20 72 65 73 74 6f 72 65 47 65 74   proc restoreGet
1dfa0 53 65 74 74 69 6e 67 56 61 6c 75 65 45 6e 76 69  SettingValueEnvi
1dfb0 72 6f 6e 6d 65 6e 74 20 7b 7d 20 7b 0d 0a 20 20  ronment {} {..  
1dfc0 20 20 20 20 75 70 76 61 72 20 31 20 73 61 76 65      upvar 1 save
1dfd0 64 45 6e 76 20 73 61 76 65 64 45 6e 76 0d 0a 0d  dEnv savedEnv...
1dfe0 0a 20 20 20 20 20 20 72 65 73 74 6f 72 65 45 6e  .      restoreEn
1dff0 76 69 72 6f 6e 6d 65 6e 74 56 61 72 69 61 62 6c  vironmentVariabl
1e000 65 73 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20  es [list \..    
1e010 20 20 20 20 20 20 4e 6f 5f 45 78 70 61 6e 64 20        No_Expand 
1e020 4e 6f 5f 53 51 4c 69 74 65 47 65 74 53 65 74 74  No_SQLiteGetSett
1e030 69 6e 67 56 61 6c 75 65 20 4e 6f 5f 53 51 4c 69  ingValue No_SQLi
1e040 74 65 58 6d 6c 43 6f 6e 66 69 67 46 69 6c 65 5d  teXmlConfigFile]
1e050 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 73 61   \..          sa
1e060 76 65 64 45 6e 76 0d 0a 20 20 20 20 7d 0d 0a 0c  vedEnv..    }...
1e070 0d 0a 20 20 20 20 70 72 6f 63 20 73 61 76 65 53  ..    proc saveS
1e080 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 45  QLiteConnectionE
1e090 6e 76 69 72 6f 6e 6d 65 6e 74 20 7b 7d 20 7b 0d  nvironment {} {.
1e0a0 0a 20 20 20 20 20 20 75 70 76 61 72 20 31 20 73  .      upvar 1 s
1e0b0 61 76 65 64 45 6e 76 20 73 61 76 65 64 45 6e 76  avedEnv savedEnv
1e0c0 0d 0a 0d 0a 20 20 20 20 20 20 73 61 76 65 45 6e  ....      saveEn
1e0d0 76 69 72 6f 6e 6d 65 6e 74 56 61 72 69 61 62 6c  vironmentVariabl
1e0e0 65 73 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20  es [list \..    
1e0f0 20 20 20 20 20 20 44 65 66 61 75 6c 74 46 6c 61        DefaultFla
1e100 67 73 5f 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74  gs_SQLiteConnect
1e110 69 6f 6e 20 4e 6f 5f 53 51 4c 69 74 65 43 6f 6e  ion No_SQLiteCon
1e120 6e 65 63 74 69 6f 6e 4e 65 77 50 61 72 73 65 72  nectionNewParser
1e130 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 73  ] \..          s
1e140 61 76 65 64 45 6e 76 0d 0a 0d 0a 20 20 20 20 20  avedEnv....     
1e150 20 75 70 76 61 72 20 31 20 73 61 76 65 64 43 6f   upvar 1 savedCo
1e160 6e 6e 65 63 74 69 6f 6e 46 6c 61 67 73 20 73 61  nnectionFlags sa
1e170 76 65 64 43 6f 6e 6e 65 63 74 69 6f 6e 46 6c 61  vedConnectionFla
1e180 67 73 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b  gs....      if {
1e190 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 63  [info exists ::c
1e1a0 6f 6e 6e 65 63 74 69 6f 6e 5f 66 6c 61 67 73 5d  onnection_flags]
1e1b0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1e1c0 20 20 73 65 74 20 73 61 76 65 64 43 6f 6e 6e 65    set savedConne
1e1d0 63 74 69 6f 6e 46 6c 61 67 73 20 24 3a 3a 63 6f  ctionFlags $::co
1e1e0 6e 6e 65 63 74 69 6f 6e 5f 66 6c 61 67 73 0d 0a  nnection_flags..
1e1f0 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
1e200 20 20 20 20 20 20 20 20 75 6e 73 65 74 20 2d 6e          unset -n
1e210 6f 63 6f 6d 70 6c 61 69 6e 20 73 61 76 65 64 43  ocomplain savedC
1e220 6f 6e 6e 65 63 74 69 6f 6e 46 6c 61 67 73 0d 0a  onnectionFlags..
1e230 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
1e240 0c 0d 0a 20 20 20 20 70 72 6f 63 20 72 65 73 74  ...    proc rest
1e250 6f 72 65 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74  oreSQLiteConnect
1e260 69 6f 6e 45 6e 76 69 72 6f 6e 6d 65 6e 74 20 7b  ionEnvironment {
1e270 7d 20 7b 0d 0a 20 20 20 20 20 20 75 70 76 61 72  } {..      upvar
1e280 20 31 20 73 61 76 65 64 45 6e 76 20 73 61 76 65   1 savedEnv save
1e290 64 45 6e 76 0d 0a 0d 0a 20 20 20 20 20 20 72 65  dEnv....      re
1e2a0 73 74 6f 72 65 45 6e 76 69 72 6f 6e 6d 65 6e 74  storeEnvironment
1e2b0 56 61 72 69 61 62 6c 65 73 20 5b 6c 69 73 74 20  Variables [list 
1e2c0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 44 65 66  \..          Def
1e2d0 61 75 6c 74 46 6c 61 67 73 5f 53 51 4c 69 74 65  aultFlags_SQLite
1e2e0 43 6f 6e 6e 65 63 74 69 6f 6e 20 4e 6f 5f 53 51  Connection No_SQ
1e2f0 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 4e 65  LiteConnectionNe
1e300 77 50 61 72 73 65 72 5d 20 5c 0d 0a 20 20 20 20  wParser] \..    
1e310 20 20 20 20 20 20 73 61 76 65 64 45 6e 76 0d 0a        savedEnv..
1e320 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20 31 20  ..      upvar 1 
1e330 73 61 76 65 64 43 6f 6e 6e 65 63 74 69 6f 6e 46  savedConnectionF
1e340 6c 61 67 73 20 73 61 76 65 64 43 6f 6e 6e 65 63  lags savedConnec
1e350 74 69 6f 6e 46 6c 61 67 73 0d 0a 0d 0a 20 20 20  tionFlags....   
1e360 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69     if {[info exi
1e370 73 74 73 20 73 61 76 65 64 43 6f 6e 6e 65 63 74  sts savedConnect
1e380 69 6f 6e 46 6c 61 67 73 5d 7d 20 74 68 65 6e 20  ionFlags]} then 
1e390 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 3a  {..        set :
1e3a0 3a 63 6f 6e 6e 65 63 74 69 6f 6e 5f 66 6c 61 67  :connection_flag
1e3b0 73 20 24 73 61 76 65 64 43 6f 6e 6e 65 63 74 69  s $savedConnecti
1e3c0 6f 6e 46 6c 61 67 73 0d 0a 20 20 20 20 20 20 20  onFlags..       
1e3d0 20 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61   unset -nocompla
1e3e0 69 6e 20 73 61 76 65 64 43 6f 6e 6e 65 63 74 69  in savedConnecti
1e3f0 6f 6e 46 6c 61 67 73 0d 0a 20 20 20 20 20 20 7d  onFlags..      }
1e400 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
1e410 20 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61   unset -nocompla
1e420 69 6e 20 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e 5f  in ::connection_
1e430 66 6c 61 67 73 0d 0a 20 20 20 20 20 20 7d 0d 0a  flags..      }..
1e440 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
1e450 6f 63 20 73 61 76 65 53 51 4c 69 74 65 43 6f 6e  oc saveSQLiteCon
1e460 76 65 72 74 45 6e 76 69 72 6f 6e 6d 65 6e 74 20  vertEnvironment 
1e470 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 75 70 76 61  {} {..      upva
1e480 72 20 31 20 73 61 76 65 64 45 6e 76 20 73 61 76  r 1 savedEnv sav
1e490 65 64 45 6e 76 0d 0a 0d 0a 20 20 20 20 20 20 73  edEnv....      s
1e4a0 61 76 65 45 6e 76 69 72 6f 6e 6d 65 6e 74 56 61  aveEnvironmentVa
1e4b0 72 69 61 62 6c 65 73 20 5b 6c 69 73 74 20 5c 0d  riables [list \.
1e4c0 0a 20 20 20 20 20 20 20 20 20 20 55 73 65 5f 53  .          Use_S
1e4d0 51 4c 69 74 65 43 6f 6e 76 65 72 74 5f 44 65 66  QLiteConvert_Def
1e4e0 61 75 6c 74 44 62 54 79 70 65 20 55 73 65 5f 53  aultDbType Use_S
1e4f0 51 4c 69 74 65 43 6f 6e 76 65 72 74 5f 44 65 66  QLiteConvert_Def
1e500 61 75 6c 74 54 79 70 65 4e 61 6d 65 5d 20 5c 0d  aultTypeName] \.
1e510 0a 20 20 20 20 20 20 20 20 20 20 73 61 76 65 64  .          saved
1e520 45 6e 76 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20  Env..    }..... 
1e530 20 20 20 70 72 6f 63 20 72 65 73 74 6f 72 65 53     proc restoreS
1e540 51 4c 69 74 65 43 6f 6e 76 65 72 74 45 6e 76 69  QLiteConvertEnvi
1e550 72 6f 6e 6d 65 6e 74 20 7b 7d 20 7b 0d 0a 20 20  ronment {} {..  
1e560 20 20 20 20 75 70 76 61 72 20 31 20 73 61 76 65      upvar 1 save
1e570 64 45 6e 76 20 73 61 76 65 64 45 6e 76 0d 0a 0d  dEnv savedEnv...
1e580 0a 20 20 20 20 20 20 72 65 73 74 6f 72 65 45 6e  .      restoreEn
1e590 76 69 72 6f 6e 6d 65 6e 74 56 61 72 69 61 62 6c  vironmentVariabl
1e5a0 65 73 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20  es [list \..    
1e5b0 20 20 20 20 20 20 55 73 65 5f 53 51 4c 69 74 65        Use_SQLite
1e5c0 43 6f 6e 76 65 72 74 5f 44 65 66 61 75 6c 74 44  Convert_DefaultD
1e5d0 62 54 79 70 65 20 55 73 65 5f 53 51 4c 69 74 65  bType Use_SQLite
1e5e0 43 6f 6e 76 65 72 74 5f 44 65 66 61 75 6c 74 54  Convert_DefaultT
1e5f0 79 70 65 4e 61 6d 65 5d 20 5c 0d 0a 20 20 20 20  ypeName] \..    
1e600 20 20 20 20 20 20 73 61 76 65 64 45 6e 76 0d 0a        savedEnv..
1e610 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
1e620 6f 63 20 73 65 74 75 70 44 62 49 6e 74 65 72 72  oc setupDbInterr
1e630 75 70 74 43 61 6c 6c 62 61 63 6b 20 7b 20 63 68  uptCallback { ch
1e640 61 6e 6e 65 6c 20 6c 6f 67 20 7d 20 7b 0d 0a 20  annel log } {.. 
1e650 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
1e660 6e 65 6c 20 22 2d 2d 2d 2d 20 73 65 74 74 69 6e  nel "---- settin
1e670 67 20 75 70 20 64 65 62 75 67 67 65 72 20 69 6e  g up debugger in
1e680 74 65 72 72 75 70 74 20 63 61 6c 6c 62 61 63 6b  terrupt callback
1e690 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 69  ... "....      i
1e6a0 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  f {[catch {..   
1e6b0 20 20 20 20 20 73 61 76 65 45 6e 76 69 72 6f 6e       saveEnviron
1e6c0 6d 65 6e 74 56 61 72 69 61 62 6c 65 73 20 5b 6c  mentVariables [l
1e6d0 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ist \..         
1e6e0 20 20 20 71 75 69 65 74 46 69 6e 64 49 6e 74 65     quietFindInte
1e6f0 72 70 72 65 74 65 72 54 65 73 74 50 61 74 68 20  rpreterTestPath 
1e700 71 75 69 65 74 53 65 74 75 70 49 6e 74 65 72 70  quietSetupInterp
1e710 72 65 74 65 72 54 65 73 74 50 61 74 68 5d 0d 0a  reterTestPath]..
1e720 0d 0a 20 20 20 20 20 20 20 20 74 72 79 20 7b 0d  ..        try {.
1e730 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
1e740 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
1e750 50 72 65 76 65 6e 74 20 74 68 65 20 76 65 6e 64  Prevent the vend
1e760 6f 72 20 73 63 72 69 70 74 20 66 72 6f 6d 20 62  or script from b
1e770 65 69 6e 67 20 6e 6f 69 73 79 20 77 68 65 6e 20  eing noisy when 
1e780 63 72 65 61 74 69 6e 67 0d 0a 20 20 20 20 20 20  creating..      
1e790 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20      #       the 
1e7a0 69 73 6f 6c 61 74 65 64 20 69 6e 74 65 72 70 72  isolated interpr
1e7b0 65 74 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 20  eter...         
1e7c0 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   #..          se
1e7d0 74 20 3a 3a 65 6e 76 28 71 75 69 65 74 46 69 6e  t ::env(quietFin
1e7e0 64 49 6e 74 65 72 70 72 65 74 65 72 54 65 73 74  dInterpreterTest
1e7f0 50 61 74 68 29 20 31 0d 0a 20 20 20 20 20 20 20  Path) 1..       
1e800 20 20 20 73 65 74 20 3a 3a 65 6e 76 28 71 75 69     set ::env(qui
1e810 65 74 53 65 74 75 70 49 6e 74 65 72 70 72 65 74  etSetupInterpret
1e820 65 72 54 65 73 74 50 61 74 68 29 20 31 0d 0a 0d  erTestPath) 1...
1e830 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
1e840 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
1e850 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 63  Make sure the sc
1e860 72 69 70 74 20 64 65 62 75 67 67 65 72 20 61 6e  ript debugger an
1e870 64 20 74 68 65 20 69 73 6f 6c 61 74 65 64 20 69  d the isolated i
1e880 6e 74 65 72 70 72 65 74 65 72 0d 0a 20 20 20 20  nterpreter..    
1e890 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61 72        #       ar
1e8a0 65 20 73 65 74 75 70 20 61 6e 64 20 72 65 61 64  e setup and read
1e8b0 79 20 66 6f 72 20 75 73 65 2e 0d 0a 20 20 20 20  y for use...    
1e8c0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1e8d0 20 20 20 64 65 62 75 67 20 73 65 74 75 70 20 74     debug setup t
1e8e0 72 75 65 20 74 72 75 65 0d 0a 0d 0a 20 20 20 20  rue true....    
1e8f0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1e900 20 20 20 23 20 4e 4f 54 45 3a 20 4c 6f 61 64 20     # NOTE: Load 
1e910 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 70 61  the necessary pa
1e920 63 6b 61 67 65 73 20 69 6e 74 6f 20 74 68 65 20  ckages into the 
1e930 69 73 6f 6c 61 74 65 64 20 69 6e 74 65 72 70 72  isolated interpr
1e940 65 74 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 20  eter...         
1e950 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 64 65   #..          de
1e960 62 75 67 20 65 76 61 6c 20 7b 0d 0a 20 20 20 20  bug eval {..    
1e970 20 20 20 20 20 20 20 20 70 61 63 6b 61 67 65 20          package 
1e980 72 65 71 75 69 72 65 20 45 61 67 6c 65 0d 0a 20  require Eagle.. 
1e990 20 20 20 20 20 20 20 20 20 20 20 70 61 63 6b 61             packa
1e9a0 67 65 20 72 65 71 75 69 72 65 20 45 61 67 6c 65  ge require Eagle
1e9b0 2e 4c 69 62 72 61 72 79 0d 0a 20 20 20 20 20 20  .Library..      
1e9c0 20 20 20 20 20 20 70 61 63 6b 61 67 65 20 72 65        package re
1e9d0 71 75 69 72 65 20 45 61 67 6c 65 2e 54 65 73 74  quire Eagle.Test
1e9e0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d  ..          }...
1e9f0 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
1ea00 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
1ea10 43 6f 70 79 20 74 68 65 20 6e 65 63 65 73 73 61  Copy the necessa
1ea20 72 79 20 76 61 72 69 61 62 6c 65 73 20 69 6e 74  ry variables int
1ea30 6f 20 74 68 65 20 69 73 6f 6c 61 74 65 64 20 69  o the isolated i
1ea40 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a 20 20 20  nterpreter...   
1ea50 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1ea60 20 20 20 20 64 65 62 75 67 20 69 6e 76 6f 6b 65      debug invoke
1ea70 20 30 20 73 65 74 20 3a 3a 74 65 73 74 5f 63 68   0 set ::test_ch
1ea80 61 6e 6e 65 6c 20 24 63 68 61 6e 6e 65 6c 3b 20  annel $channel; 
1ea90 23 20 4e 4f 54 45 3a 20 46 6f 72 20 5b 74 70 75  # NOTE: For [tpu
1eaa0 74 73 5d 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ts]...          
1eab0 64 65 62 75 67 20 69 6e 76 6f 6b 65 20 30 20 73  debug invoke 0 s
1eac0 65 74 20 3a 3a 74 65 73 74 5f 6c 6f 67 20 24 6c  et ::test_log $l
1ead0 6f 67 3b 20 23 20 4e 4f 54 45 3a 20 46 6f 72 20  og; # NOTE: For 
1eae0 5b 74 6c 6f 67 5d 2e 0d 0a 0d 0a 20 20 20 20 20  [tlog].....     
1eaf0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1eb00 20 20 23 20 4e 4f 54 45 3a 20 49 6e 73 74 61 6c    # NOTE: Instal
1eb10 6c 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 73  l the callback s
1eb20 63 72 69 70 74 20 74 6f 20 62 65 20 65 76 61 6c  cript to be eval
1eb30 75 61 74 65 64 20 69 6e 20 74 68 65 20 69 73 6f  uated in the iso
1eb40 6c 61 74 65 64 0d 0a 20 20 20 20 20 20 20 20 20  lated..         
1eb50 20 23 20 20 20 20 20 20 20 69 6e 74 65 72 70 72   #       interpr
1eb60 65 74 65 72 20 77 68 65 6e 20 74 68 69 73 20 69  eter when this i
1eb70 6e 74 65 72 70 72 65 74 65 72 20 69 73 20 69 6e  nterpreter is in
1eb80 74 65 72 72 75 70 74 65 64 20 62 79 20 73 63 72  terrupted by scr
1eb90 69 70 74 0d 0a 20 20 20 20 20 20 20 20 20 20 23  ipt..          #
1eba0 20 20 20 20 20 20 20 63 61 6e 63 65 6c 6c 61 74         cancellat
1ebb0 69 6f 6e 2c 20 65 74 63 2e 0d 0a 20 20 20 20 20  ion, etc...     
1ebc0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1ebd0 20 20 64 65 62 75 67 20 63 61 6c 6c 62 61 63 6b    debug callback
1ebe0 20 61 70 70 6c 79 20 7b 7b 73 65 6e 64 65 72 20   apply {{sender 
1ebf0 65 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  e} {..          
1ec00 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
1ec10 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69   # NOTE: Check i
1ec20 66 20 74 68 69 73 20 64 65 62 75 67 67 65 72 20  f this debugger 
1ec30 63 61 6c 6c 62 61 63 6b 20 69 73 20 6f 6e 65 20  callback is one 
1ec40 74 68 61 74 20 77 65 20 63 61 72 65 20 61 62 6f  that we care abo
1ec50 75 74 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ut...           
1ec60 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
1ec70 73 65 74 20 69 6e 74 65 72 72 75 70 74 54 79 70  set interruptTyp
1ec80 65 73 20 5b 73 70 6c 69 74 20 5b 24 65 20 49 6e  es [split [$e In
1ec90 74 65 72 72 75 70 74 54 79 70 65 5d 20 22 2c 20  terruptType] ", 
1eca0 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  "]....          
1ecb0 20 20 69 66 20 7b 22 43 61 6e 63 65 6c 65 64 22    if {"Canceled"
1ecc0 20 69 6e 20 24 69 6e 74 65 72 72 75 70 74 54 79   in $interruptTy
1ecd0 70 65 73 20 7c 7c 20 5c 0d 0a 20 20 20 20 20 20  pes || \..      
1ece0 20 20 20 20 20 20 20 20 20 20 22 55 6e 77 6f 75            "Unwou
1ecf0 6e 64 22 20 69 6e 20 24 69 6e 74 65 72 72 75 70  nd" in $interrup
1ed00 74 54 79 70 65 73 7d 20 74 68 65 6e 20 7b 0d 0a  tTypes} then {..
1ed10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
1ed20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
1ed30 20 4e 4f 54 45 3a 20 4d 61 6b 65 20 73 75 72 65   NOTE: Make sure
1ed40 20 74 68 65 20 5b 6f 62 6a 65 63 74 5d 20 63 6f   the [object] co
1ed50 6d 6d 61 6e 64 20 69 73 20 61 76 61 69 6c 61 62  mmand is availab
1ed60 6c 65 2e 20 20 53 69 6e 63 65 0d 0a 20 20 20 20  le.  Since..    
1ed70 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
1ed80 20 20 74 68 69 73 20 69 73 20 61 6e 20 69 73 6f    this is an iso
1ed90 6c 61 74 65 64 20 69 6e 74 65 72 70 72 65 74 65  lated interprete
1eda0 72 2c 20 63 68 65 63 6b 20 66 6f 72 20 69 74 20  r, check for it 
1edb0 74 68 65 20 68 61 72 64 0d 0a 20 20 20 20 20 20  the hard..      
1edc0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
1edd0 77 61 79 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  way...          
1ede0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
1edf0 20 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67 74       if {[llengt
1ee00 68 20 5b 69 6e 66 6f 20 63 6f 6d 6d 61 6e 64 73  h [info commands
1ee10 20 6f 62 6a 65 63 74 5d 5d 20 3e 20 30 7d 20 74   object]] > 0} t
1ee20 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1ee30 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1ee40 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
1ee50 3a 20 49 74 65 72 61 74 65 20 74 68 72 6f 75 67  : Iterate throug
1ee60 68 20 61 6c 6c 20 64 61 74 61 62 61 73 65 20 63  h all database c
1ee70 6f 6e 6e 65 63 74 69 6f 6e 73 20 6b 6e 6f 77 6e  onnections known
1ee80 20 74 6f 20 74 68 65 0d 0a 20 20 20 20 20 20 20   to the..       
1ee90 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
1eea0 20 70 61 72 65 6e 74 20 69 6e 74 65 72 70 72 65   parent interpre
1eeb0 74 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ter...          
1eec0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1eed0 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20           object 
1eee0 66 6f 72 65 61 63 68 20 2d 61 6c 69 61 73 20 70  foreach -alias p
1eef0 61 69 72 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f  air [object invo
1ef00 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75  ke -flags +NonPu
1ef10 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20  blic \..        
1ef20 20 20 20 20 20 20 20 20 20 20 20 20 24 65 20 49              $e I
1ef30 6e 74 65 72 70 72 65 74 65 72 2e 63 6f 6e 6e 65  nterpreter.conne
1ef40 63 74 69 6f 6e 73 5d 20 7b 0d 0a 20 20 20 20 20  ctions] {..     
1ef50 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a               #..
1ef60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef70 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70    # NOTE: Attemp
1ef80 74 20 74 6f 20 63 61 6e 63 65 6c 20 61 6e 79 20  t to cancel any 
1ef90 53 51 4c 20 71 75 65 72 69 65 73 20 69 6e 20 70  SQL queries in p
1efa0 72 6f 67 72 65 73 73 20 6f 6e 0d 0a 20 20 20 20  rogress on..    
1efb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
1efc0 20 20 20 20 20 20 74 68 69 73 20 64 61 74 61 62        this datab
1efd0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0d  ase connection..
1efe0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1eff0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
1f000 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
1f010 63 68 20 7b 24 70 61 69 72 20 56 61 6c 75 65 2e  ch {$pair Value.
1f020 43 61 6e 63 65 6c 7d 20 65 72 72 6f 72 5d 7d 20  Cancel} error]} 
1f030 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1f040 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
1f050 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
1f060 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 6e  l [appendArgs \n
1f070 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1f080 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d              "===
1f090 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65  = WARNING: faile
1f0a0 64 20 74 6f 20 63 61 6e 63 65 6c 20 71 75 65 72  d to cancel quer
1f0b0 79 20 66 6f 72 20 22 20 5c 0d 0a 20 20 20 20 20  y for " \..     
1f0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f0d0 20 20 20 22 63 6f 6e 6e 65 63 74 69 6f 6e 20 5c     "connection \
1f0e0 22 22 20 5b 24 70 61 69 72 20 4b 65 79 5d 20 22  "" [$pair Key] "
1f0f0 5c 22 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c  \", error: " \n\
1f100 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  t \..           
1f110 20 20 20 20 20 20 20 20 20 20 20 20 20 24 65 72               $er
1f120 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ror \n]..       
1f130 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
1f140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
1f150 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
1f160 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
1f170 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
1f180 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
1f190 61 70 70 65 6e 64 41 72 67 73 20 5c 6e 20 5c 0d  appendArgs \n \.
1f1a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f1b0 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49       "==== WARNI
1f1c0 4e 47 3a 20 63 61 6e 6e 6f 74 20 63 61 6e 63 65  NG: cannot cance
1f1d0 6c 20 61 6e 79 20 71 75 65 72 69 65 73 3a 20 22  l any queries: "
1f1e0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1f1f0 20 20 20 20 20 20 20 20 22 74 68 65 20 5c 22 6f          "the \"o
1f200 62 6a 65 63 74 5c 22 20 63 6f 6d 6d 61 6e 64 20  bject\" command 
1f210 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  is not available
1f220 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  \n"]..          
1f230 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
1f240 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
1f250 7d 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 66 69  }}..        } fi
1f260 6e 61 6c 6c 79 20 7b 0d 0a 20 20 20 20 20 20 20  nally {..       
1f270 20 20 20 72 65 73 74 6f 72 65 45 6e 76 69 72 6f     restoreEnviro
1f280 6e 6d 65 6e 74 56 61 72 69 61 62 6c 65 73 20 5b  nmentVariables [
1f290 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20  list \..        
1f2a0 20 20 20 20 20 20 71 75 69 65 74 46 69 6e 64 49        quietFindI
1f2b0 6e 74 65 72 70 72 65 74 65 72 54 65 73 74 50 61  nterpreterTestPa
1f2c0 74 68 20 71 75 69 65 74 53 65 74 75 70 49 6e 74  th quietSetupInt
1f2d0 65 72 70 72 65 74 65 72 54 65 73 74 50 61 74 68  erpreterTestPath
1f2e0 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  ]..        }..  
1f2f0 20 20 20 20 7d 20 65 72 72 6f 72 5d 20 3d 3d 20      } error] == 
1f300 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
1f310 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74     addConstraint
1f320 20 69 6e 74 65 72 72 75 70 74 43 61 6c 6c 62 61   interruptCallba
1f330 63 6b 2e 73 71 6c 69 74 65 33 0d 0a 0d 0a 20 20  ck.sqlite3....  
1f340 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
1f350 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20 20 20 20  nnel yes\n..    
1f360 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
1f370 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
1f380 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22  el [appendArgs "
1f390 6e 6f 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c  no, error: " \n\
1f3a0 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20  t $error \n]..  
1f3b0 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
1f3c0 0a 20 20 20 20 70 72 6f 63 20 63 6c 65 61 6e 75  .    proc cleanu
1f3d0 70 46 69 6c 65 20 7b 20 66 69 6c 65 4e 61 6d 65  pFile { fileName
1f3e0 20 7b 63 6f 6c 6c 65 63 74 20 74 72 75 65 7d 20   {collect true} 
1f3f0 7b 66 6f 72 63 65 20 66 61 6c 73 65 7d 20 7d 20  {force false} } 
1f400 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
1f410 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70    # NOTE: Attemp
1f420 74 20 74 6f 20 66 6f 72 63 65 20 61 6c 6c 20 70  t to force all p
1f430 65 6e 64 69 6e 67 20 22 67 61 72 62 61 67 65 22  ending "garbage"
1f440 20 6f 62 6a 65 63 74 73 20 74 6f 20 62 65 20 63   objects to be c
1f450 6f 6c 6c 65 63 74 65 64 2c 0d 0a 20 20 20 20 20  ollected,..     
1f460 20 23 20 20 20 20 20 20 20 69 6e 63 6c 75 64 69   #       includi
1f470 6e 67 20 53 51 4c 69 74 65 20 73 74 61 74 65 6d  ng SQLite statem
1f480 65 6e 74 73 20 61 6e 64 20 62 61 63 6b 75 70 20  ents and backup 
1f490 6f 62 6a 65 63 74 73 3b 20 74 68 69 73 20 73 68  objects; this sh
1f4a0 6f 75 6c 64 20 61 6c 6c 6f 77 0d 0a 20 20 20 20  ould allow..    
1f4b0 20 20 23 20 20 20 20 20 20 20 74 68 65 20 75 6e    #       the un
1f4c0 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73  derlying databas
1f4d0 65 20 66 69 6c 65 20 74 6f 20 62 65 20 64 65 6c  e file to be del
1f4e0 65 74 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  eted...      #..
1f4f0 20 20 20 20 20 20 69 66 20 7b 24 63 6f 6c 6c 65        if {$colle
1f500 63 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  ct} then {..    
1f510 20 20 20 20 63 6f 6c 6c 65 63 74 47 61 72 62 61      collectGarba
1f520 67 65 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ge $::test_chann
1f530 65 6c 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  el..      }.... 
1f540 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
1f550 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20 74  NOTE: Check if t
1f560 68 65 20 66 69 6c 65 20 73 74 69 6c 6c 20 65 78  he file still ex
1f570 69 73 74 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  ists...      #..
1f580 20 20 20 20 20 20 69 66 20 7b 5b 66 69 6c 65 20        if {[file 
1f590 65 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65  exists $fileName
1f5a0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
1f5b0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
1f5c0 4e 4f 54 45 3a 20 53 6b 69 70 20 64 65 6c 65 74  NOTE: Skip delet
1f5d0 69 6e 67 20 74 65 73 74 20 66 69 6c 65 73 20 69  ing test files i
1f5e0 66 20 73 6f 6d 65 62 6f 64 79 20 73 65 74 73 20  f somebody sets 
1f5f0 74 68 65 20 67 6c 6f 62 61 6c 20 76 61 72 69 61  the global varia
1f600 62 6c 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ble..        #  
1f610 20 20 20 20 20 74 6f 20 70 72 65 76 65 6e 74 20       to prevent 
1f620 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  it...        #..
1f630 20 20 20 20 20 20 20 20 69 66 20 7b 24 66 6f 72          if {$for
1f640 63 65 20 7c 7c 20 21 5b 69 6e 66 6f 20 65 78 69  ce || ![info exi
1f650 73 74 73 20 3a 3a 6e 6f 28 63 6c 65 61 6e 75 70  sts ::no(cleanup
1f660 46 69 6c 65 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  File)]} then {..
1f670 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
1f680 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41         # NOTE: A
1f690 74 74 65 6d 70 74 20 74 6f 20 64 65 6c 65 74 65  ttempt to delete
1f6a0 20 74 68 65 20 74 65 73 74 20 66 69 6c 65 20 6e   the test file n
1f6b0 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  ow...          #
1f6c0 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
1f6d0 5b 73 65 74 20 63 6f 64 65 20 5b 63 61 74 63 68  [set code [catch
1f6e0 20 7b 66 69 6c 65 20 64 65 6c 65 74 65 20 24 66   {file delete $f
1f6f0 69 6c 65 4e 61 6d 65 7d 20 65 72 72 6f 72 5d 5d  ileName} error]]
1f700 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1f710 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1f720 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 65 20       # NOTE: We 
1f730 73 6f 6d 65 68 6f 77 20 66 61 69 6c 65 64 20 74  somehow failed t
1f740 6f 20 64 65 6c 65 74 65 20 74 68 65 20 66 69 6c  o delete the fil
1f750 65 2c 20 72 65 70 6f 72 74 20 77 68 79 2e 0d 0a  e, report why...
1f760 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
1f770 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
1f780 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
1f790 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
1f7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f7b0 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66  "==== WARNING: f
1f7c0 61 69 6c 65 64 20 74 6f 20 64 65 6c 65 74 65 20  ailed to delete 
1f7d0 74 65 73 74 20 66 69 6c 65 20 5c 22 22 20 24 66  test file \"" $f
1f7e0 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20  ileName \..     
1f7f0 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 20 64             "\" d
1f800 75 72 69 6e 67 20 63 6c 65 61 6e 75 70 2c 20 65  uring cleanup, e
1f810 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72  rror: " \n\t $er
1f820 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ror \n]..       
1f830 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20     }..        } 
1f840 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
1f850 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23    #..          #
1f860 20 4e 4f 54 45 3a 20 53 68 6f 77 20 74 68 61 74   NOTE: Show that
1f870 20 77 65 20 73 6b 69 70 70 65 64 20 64 65 6c 65   we skipped dele
1f880 74 69 6e 67 20 74 68 65 20 66 69 6c 65 2e 0d 0a  ting the file...
1f890 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
1f8a0 20 20 20 20 20 20 20 73 65 74 20 63 6f 64 65 20         set code 
1f8b0 30 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 74  0....          t
1f8c0 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
1f8d0 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
1f8e0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1f8f0 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a    "==== WARNING:
1f900 20 73 6b 69 70 70 65 64 20 64 65 6c 65 74 69 6e   skipped deletin
1f910 67 20 74 65 73 74 20 66 69 6c 65 20 5c 22 22 20  g test file \"" 
1f920 24 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20  $fileName \..   
1f930 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 20 64             "\" d
1f940 75 72 69 6e 67 20 63 6c 65 61 6e 75 70 5c 6e 22  uring cleanup\n"
1f950 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  ]..        }..  
1f960 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
1f970 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1f980 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 66 69 6c   # NOTE: The fil
1f990 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  e does not exist
1f9a0 2c 20 73 75 63 63 65 73 73 21 0d 0a 20 20 20 20  , success!..    
1f9b0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73      #..        s
1f9c0 65 74 20 63 6f 64 65 20 30 0d 0a 20 20 20 20 20  et code 0..     
1f9d0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75   }....      retu
1f9e0 72 6e 20 24 63 6f 64 65 0d 0a 20 20 20 20 7d 0d  rn $code..    }.
1f9f0 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 6c 65  ....    proc cle
1fa00 61 6e 75 70 4d 65 6d 6f 72 79 20 7b 20 76 61 72  anupMemory { var
1fa10 4e 61 6d 65 20 7b 71 75 69 65 74 20 66 61 6c 73  Name {quiet fals
1fa20 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66  e} } {..      if
1fa30 20 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f 62 6a   {[haveSQLiteObj
1fa40 65 63 74 43 6f 6d 6d 61 6e 64 5d 20 26 26 20 5c  ectCommand] && \
1fa50 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72  ..          [str
1fa60 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 61 72 4e  ing length $varN
1fa70 61 6d 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ame] > 0} then {
1fa80 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1fa90 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 66       # NOTE: Ref
1faa0 65 72 20 74 6f 20 74 68 65 20 73 70 65 63 69 66  er to the specif
1fab0 69 65 64 20 76 61 72 69 61 62 6c 65 20 28 65 2e  ied variable (e.
1fac0 67 2e 20 22 63 6f 6e 6e 65 63 74 69 6f 6e 22 29  g. "connection")
1fad0 20 69 6e 20 74 68 65 0d 0a 20 20 20 20 20 20 20   in the..       
1fae0 20 23 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74   #       context
1faf0 20 6f 66 20 6f 75 72 20 63 61 6c 6c 65 72 2e 20   of our caller. 
1fb00 20 54 68 65 20 6f 70 61 71 75 65 20 6f 62 6a 65   The opaque obje
1fb10 63 74 20 68 61 6e 64 6c 65 20 66 6f 72 20 61 6e  ct handle for an
1fb20 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
1fb30 20 20 41 44 4f 2e 4e 45 54 20 63 6f 6e 6e 65 63    ADO.NET connec
1fb40 74 69 6f 6e 20 70 72 65 76 69 6f 75 73 6c 79 20  tion previously 
1fb50 72 65 74 75 72 6e 65 64 20 62 79 20 5b 67 65 74  returned by [get
1fb60 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 5d 0d 0a 20  DbConnection].. 
1fb70 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73         #       s
1fb80 68 6f 75 6c 64 20 62 65 20 73 74 6f 72 65 64 20  hould be stored 
1fb90 74 68 65 72 65 2e 0d 0a 20 20 20 20 20 20 20 20  there...        
1fba0 23 0d 0a 20 20 20 20 20 20 20 20 75 70 76 61 72  #..        upvar
1fbb0 20 31 20 24 76 61 72 4e 61 6d 65 20 63 6f 6e 6e   1 $varName conn
1fbc0 65 63 74 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20  ection....      
1fbd0 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
1fbe0 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74            object
1fbf0 20 69 6e 76 6f 6b 65 20 24 63 6f 6e 6e 65 63 74   invoke $connect
1fc00 69 6f 6e 20 52 65 6c 65 61 73 65 4d 65 6d 6f 72  ion ReleaseMemor
1fc10 79 0d 0a 20 20 20 20 20 20 20 20 7d 20 72 65 73  y..        } res
1fc20 75 6c 74 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ult]} then {..  
1fc30 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
1fc40 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
1fc50 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
1fc60 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
1fc70 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
1fc80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d                "=
1fc90 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69  === WARNING: fai
1fca0 6c 65 64 20 74 6f 20 72 65 6c 65 61 73 65 20 64  led to release d
1fcb0 61 74 61 62 61 73 65 20 6d 65 6d 6f 72 79 2c 20  atabase memory, 
1fcc0 65 72 72 6f 72 3a 20 22 20 5c 0d 0a 20 20 20 20  error: " \..    
1fcd0 20 20 20 20 20 20 20 20 20 20 20 20 5c 6e 5c 74              \n\t
1fce0 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20   $result \n]..  
1fcf0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
1fd00 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d     }..      }...
1fd10 0a 20 20 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e  .      if {[llen
1fd20 67 74 68 20 5b 69 6e 66 6f 20 63 6f 6d 6d 61 6e  gth [info comman
1fd30 64 73 20 64 65 62 75 67 5d 5d 20 3e 20 30 7d 20  ds debug]] > 0} 
1fd40 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1fd50 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20  if {[catch {..  
1fd60 20 20 20 20 20 20 20 20 75 70 6c 65 76 65 6c 20          uplevel 
1fd70 31 20 5b 6c 69 73 74 20 64 65 62 75 67 20 70 75  1 [list debug pu
1fd80 72 67 65 5d 0d 0a 20 20 20 20 20 20 20 20 7d 20  rge]..        } 
1fd90 72 65 73 75 6c 74 5d 7d 20 74 68 65 6e 20 7b 0d  result]} then {.
1fda0 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21  .          if {!
1fdb0 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
1fdc0 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
1fdd0 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
1fde0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
1fdf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1fe00 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20   "==== WARNING: 
1fe10 66 61 69 6c 65 64 20 74 6f 20 70 75 72 67 65 20  failed to purge 
1fe20 63 61 6c 6c 20 66 72 61 6d 65 2c 20 65 72 72 6f  call frame, erro
1fe30 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20  r: " \..        
1fe40 20 20 20 20 20 20 20 20 5c 6e 5c 74 20 24 72 65          \n\t $re
1fe50 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  sult \n]..      
1fe60 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
1fe70 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b  ....        if {
1fe80 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
1fe90 20 20 20 20 75 70 6c 65 76 65 6c 20 31 20 5b 6c      uplevel 1 [l
1fea0 69 73 74 20 64 65 62 75 67 20 63 6c 65 61 6e 75  ist debug cleanu
1feb0 70 5d 0d 0a 20 20 20 20 20 20 20 20 7d 20 72 65  p]..        } re
1fec0 73 75 6c 74 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  sult]} then {.. 
1fed0 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71           if {!$q
1fee0 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
1fef0 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
1ff00 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
1ff10 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
1ff20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1ff30 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61  ==== WARNING: fa
1ff40 69 6c 65 64 20 74 6f 20 63 6c 65 61 6e 75 70 20  iled to cleanup 
1ff50 69 6e 74 65 72 70 72 65 74 65 72 2c 20 65 72 72  interpreter, err
1ff60 6f 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20  or: " \..       
1ff70 20 20 20 20 20 20 20 20 20 5c 6e 5c 74 20 24 72           \n\t $r
1ff80 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20  esult \n]..     
1ff90 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
1ffa0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20  }....        if 
1ffb0 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
1ffc0 20 20 20 20 20 75 70 6c 65 76 65 6c 20 31 20 5b       uplevel 1 [
1ffd0 6c 69 73 74 20 64 65 62 75 67 20 63 6f 6c 6c 65  list debug colle
1ffe0 63 74 5d 0d 0a 20 20 20 20 20 20 20 20 7d 20 72  ct]..        } r
1fff0 65 73 75 6c 74 5d 7d 20 74 68 65 6e 20 7b 0d 0a  esult]} then {..
20000 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24            if {!$
20010 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
20020 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
20030 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
20040 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
20050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20060 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66  "==== WARNING: f
20070 61 69 6c 65 64 20 74 6f 20 63 6f 6c 6c 65 63 74  ailed to collect
20080 20 67 61 72 62 61 67 65 2c 20 65 72 72 6f 72 3a   garbage, error:
20090 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   " \..          
200a0 20 20 20 20 20 20 5c 6e 5c 74 20 24 72 65 73 75        \n\t $resu
200b0 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  lt \n]..        
200c0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
200d0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
200e0 0c 0d 0a 20 20 20 20 70 72 6f 63 20 73 65 74 75  ...    proc setu
200f0 70 4d 65 6d 6f 72 79 43 6f 75 6e 74 65 72 73 20  pMemoryCounters 
20100 7b 20 76 61 72 4e 61 6d 65 20 7d 20 7b 0d 0a 20  { varName } {.. 
20110 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65 53 51       if {[haveSQ
20120 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e  LiteObjectComman
20130 64 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  d]} then {..    
20140 20 20 20 20 75 70 76 61 72 20 31 20 24 76 61 72      upvar 1 $var
20150 4e 61 6d 65 20 63 6f 75 6e 74 65 72 0d 0a 0d 0a  Name counter....
20160 20 20 20 20 20 20 20 20 73 65 74 20 63 6f 75 6e          set coun
20170 74 65 72 28 31 29 20 5b 6f 62 6a 65 63 74 20 63  ter(1) [object c
20180 72 65 61 74 65 20 2d 61 6c 69 61 73 20 5c 0d 0a  reate -alias \..
20190 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74              Syst
201a0 65 6d 2e 44 69 61 67 6e 6f 73 74 69 63 73 2e 50  em.Diagnostics.P
201b0 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74 65  erformanceCounte
201c0 72 20 50 72 6f 63 65 73 73 20 5c 0d 0a 20 20 20  r Process \..   
201d0 20 20 20 20 20 20 20 20 20 22 57 6f 72 6b 69 6e           "Workin
201e0 67 20 53 65 74 22 20 5b 66 69 6c 65 20 72 6f 6f  g Set" [file roo
201f0 74 6e 61 6d 65 20 5b 66 69 6c 65 20 74 61 69 6c  tname [file tail
20200 20 24 3a 3a 62 69 6e 5f 66 69 6c 65 5d 5d 5d 0d   $::bin_file]]].
20210 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 63  ...        set c
20220 6f 75 6e 74 65 72 28 32 29 20 5b 6f 62 6a 65 63  ounter(2) [objec
20230 74 20 63 72 65 61 74 65 20 2d 61 6c 69 61 73 20  t create -alias 
20240 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 53  \..            S
20250 79 73 74 65 6d 2e 44 69 61 67 6e 6f 73 74 69 63  ystem.Diagnostic
20260 73 2e 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75  s.PerformanceCou
20270 6e 74 65 72 20 50 72 6f 63 65 73 73 20 5c 0d 0a  nter Process \..
20280 20 20 20 20 20 20 20 20 20 20 20 20 22 57 6f 72              "Wor
20290 6b 69 6e 67 20 53 65 74 20 50 65 61 6b 22 20 5b  king Set Peak" [
202a0 66 69 6c 65 20 72 6f 6f 74 6e 61 6d 65 20 5b 66  file rootname [f
202b0 69 6c 65 20 74 61 69 6c 20 24 3a 3a 62 69 6e 5f  ile tail $::bin_
202c0 66 69 6c 65 5d 5d 5d 0d 0a 0d 0a 20 20 20 20 20  file]]]....     
202d0 20 20 20 73 65 74 20 63 6f 75 6e 74 65 72 28 33     set counter(3
202e0 29 20 5b 6f 62 6a 65 63 74 20 63 72 65 61 74 65  ) [object create
202f0 20 2d 61 6c 69 61 73 20 5c 0d 0a 20 20 20 20 20   -alias \..     
20300 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 69         System.Di
20310 61 67 6e 6f 73 74 69 63 73 2e 50 65 72 66 6f 72  agnostics.Perfor
20320 6d 61 6e 63 65 43 6f 75 6e 74 65 72 20 50 72 6f  manceCounter Pro
20330 63 65 73 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  cess \..        
20340 20 20 20 20 22 50 72 69 76 61 74 65 20 42 79 74      "Private Byt
20350 65 73 22 20 5b 66 69 6c 65 20 72 6f 6f 74 6e 61  es" [file rootna
20360 6d 65 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 3a  me [file tail $:
20370 3a 62 69 6e 5f 66 69 6c 65 5d 5d 5d 0d 0a 20 20  :bin_file]]]..  
20380 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72      }....      r
20390 65 74 75 72 6e 20 22 22 0d 0a 20 20 20 20 7d 0d  eturn ""..    }.
203a0 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 72 65 70  ....    proc rep
203b0 6f 72 74 4d 65 6d 6f 72 79 43 6f 75 6e 74 65 72  ortMemoryCounter
203c0 73 20 7b 20 63 68 61 6e 6e 65 6c 20 76 61 72 4e  s { channel varN
203d0 61 6d 65 20 70 72 65 66 69 78 20 7d 20 7b 0d 0a  ame prefix } {..
203e0 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65 53        if {[haveS
203f0 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61  QLiteObjectComma
20400 6e 64 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  nd]} then {..   
20410 20 20 20 20 20 75 70 76 61 72 20 31 20 24 76 61       upvar 1 $va
20420 72 4e 61 6d 65 20 63 6f 75 6e 74 65 72 0d 0a 0d  rName counter...
20430 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
20440 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
20450 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
20460 20 20 20 22 2d 2d 2d 2d 20 22 20 24 70 72 65 66     "---- " $pref
20470 69 78 20 22 20 63 6f 75 6e 74 65 72 20 5c 22 22  ix " counter \""
20480 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
20490 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 24  [object invoke $
204a0 63 6f 75 6e 74 65 72 28 31 29 20 43 6f 75 6e 74  counter(1) Count
204b0 65 72 4e 61 6d 65 5d 20 22 5c 22 20 76 61 6c 75  erName] "\" valu
204c0 65 20 69 73 20 22 20 5c 0d 0a 20 20 20 20 20 20  e is " \..      
204d0 20 20 20 20 20 20 5b 6f 62 6a 65 63 74 20 69 6e        [object in
204e0 76 6f 6b 65 20 24 63 6f 75 6e 74 65 72 28 31 29  voke $counter(1)
204f0 20 52 61 77 56 61 6c 75 65 5d 20 5c 6e 5d 0d 0a   RawValue] \n]..
20500 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
20510 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
20520 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
20530 20 20 20 20 22 2d 2d 2d 2d 20 22 20 24 70 72 65      "---- " $pre
20540 66 69 78 20 22 20 63 6f 75 6e 74 65 72 20 5c 22  fix " counter \"
20550 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
20560 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20   [object invoke 
20570 24 63 6f 75 6e 74 65 72 28 32 29 20 43 6f 75 6e  $counter(2) Coun
20580 74 65 72 4e 61 6d 65 5d 20 22 5c 22 20 76 61 6c  terName] "\" val
20590 75 65 20 69 73 20 22 20 5c 0d 0a 20 20 20 20 20  ue is " \..     
205a0 20 20 20 20 20 20 20 5b 6f 62 6a 65 63 74 20 69         [object i
205b0 6e 76 6f 6b 65 20 24 63 6f 75 6e 74 65 72 28 32  nvoke $counter(2
205c0 29 20 52 61 77 56 61 6c 75 65 5d 20 5c 6e 5d 0d  ) RawValue] \n].
205d0 0a 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  ...        tputs
205e0 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
205f0 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
20600 20 20 20 20 20 22 2d 2d 2d 2d 20 22 20 24 70 72       "---- " $pr
20610 65 66 69 78 20 22 20 63 6f 75 6e 74 65 72 20 5c  efix " counter \
20620 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  "" \..          
20630 20 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65    [object invoke
20640 20 24 63 6f 75 6e 74 65 72 28 33 29 20 43 6f 75   $counter(3) Cou
20650 6e 74 65 72 4e 61 6d 65 5d 20 22 5c 22 20 76 61  nterName] "\" va
20660 6c 75 65 20 69 73 20 22 20 5c 0d 0a 20 20 20 20  lue is " \..    
20670 20 20 20 20 20 20 20 20 5b 6f 62 6a 65 63 74 20          [object 
20680 69 6e 76 6f 6b 65 20 24 63 6f 75 6e 74 65 72 28  invoke $counter(
20690 33 29 20 52 61 77 56 61 6c 75 65 5d 20 5c 6e 5d  3) RawValue] \n]
206a0 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
206b0 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 6f  .....    proc co
206c0 6c 6c 65 63 74 47 61 72 62 61 67 65 20 7b 20 63  llectGarbage { c
206d0 68 61 6e 6e 65 6c 20 7b 6d 69 6c 6c 69 73 65 63  hannel {millisec
206e0 6f 6e 64 73 20 31 30 30 30 7d 20 7b 71 75 69 65  onds 1000} {quie
206f0 74 20 74 72 75 65 7d 20 7d 20 7b 0d 0a 20 20 20  t true} } {..   
20700 20 20 20 69 66 20 7b 5b 68 61 76 65 53 51 4c 69     if {[haveSQLi
20710 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d  teObjectCommand]
20720 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
20730 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
20740 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74            object
20750 20 69 6e 76 6f 6b 65 20 47 43 20 47 65 74 54 6f   invoke GC GetTo
20760 74 61 6c 4d 65 6d 6f 72 79 20 66 61 6c 73 65 0d  talMemory false.
20770 0a 20 20 20 20 20 20 20 20 7d 20 72 65 73 75 6c  .        } resul
20780 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  t] == 0} then {.
20790 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21  .          if {!
207a0 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
207b0 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
207c0 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
207d0 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
207e0 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
207f0 6d 65 6d 6f 72 79 20 69 6e 20 75 73 65 20 62 79  memory in use by
20800 20 74 68 65 20 43 4c 52 20 62 65 66 6f 72 65 20   the CLR before 
20810 63 6f 6c 6c 65 63 74 69 6f 6e 2e 2e 2e 20 22 20  collection... " 
20820 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
20830 20 20 20 24 72 65 73 75 6c 74 20 22 20 62 79 74     $result " byt
20840 65 73 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20  es\n"]..        
20850 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65    }..        } e
20860 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
20870 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
20880 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
20890 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
208a0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
208b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
208c0 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66  "==== WARNING: f
208d0 61 69 6c 65 64 20 74 6f 20 67 65 74 20 43 4c 52  ailed to get CLR
208e0 20 6d 65 6d 6f 72 79 20 75 73 61 67 65 2c 20 65   memory usage, e
208f0 72 72 6f 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20  rror: " \..     
20900 20 20 20 20 20 20 20 20 20 20 20 5c 6e 5c 74 20             \n\t 
20910 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20  $result \n]..   
20920 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
20930 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a    }..      }....
20940 20 20 20 20 20 20 23 23 23 23 23 23 23 23 23 23        ##########
20950 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
20960 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
20970 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
20980 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d  ###############.
20990 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
209a0 20 20 23 20 4e 4f 54 45 3a 20 52 65 70 65 61 74    # NOTE: Repeat
209b0 65 64 6c 79 20 61 74 74 65 6d 70 74 20 74 6f 20  edly attempt to 
209c0 63 6f 6c 6c 65 63 74 20 67 61 72 62 61 67 65 20  collect garbage 
209d0 75 6e 74 69 6c 20 74 68 65 20 61 6c 6c 6f 74 74  until the allott
209e0 65 64 20 6e 75 6d 62 65 72 0d 0a 20 20 20 20 20  ed number..     
209f0 20 23 20 20 20 20 20 20 20 6f 66 20 6d 69 6c 6c   #       of mill
20a00 69 73 65 63 6f 6e 64 73 20 68 61 73 20 65 6c 61  iseconds has ela
20a10 70 73 65 64 2e 20 20 41 6c 77 61 79 73 20 61 74  psed.  Always at
20a20 74 65 6d 70 74 20 74 6f 20 63 6f 6c 6c 65 63 74  tempt to collect
20a30 20 67 61 72 62 61 67 65 0d 0a 20 20 20 20 20 20   garbage..      
20a40 23 20 20 20 20 20 20 20 61 74 20 6c 65 61 73 74  #       at least
20a50 20 6f 6e 63 65 2e 0d 0a 20 20 20 20 20 20 23 0d   once...      #.
20a60 0a 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65  .      if {[have
20a70 53 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d  SQLiteObjectComm
20a80 61 6e 64 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  and]} then {..  
20a90 20 20 20 20 20 20 73 65 74 20 73 74 61 72 74 20        set start 
20aa0 5b 63 6c 6f 63 6b 20 73 65 63 6f 6e 64 73 5d 0d  [clock seconds].
20ab0 0a 20 20 20 20 20 20 20 20 73 65 74 20 73 74 6f  .        set sto
20ac0 70 20 5b 65 78 70 72 20 7b 24 73 74 61 72 74 20  p [expr {$start 
20ad0 2b 20 28 24 6d 69 6c 6c 69 73 65 63 6f 6e 64 73  + ($milliseconds
20ae0 20 2f 20 31 30 30 30 29 7d 5d 0d 0a 0d 0a 20 20   / 1000)}]....  
20af0 20 20 20 20 20 20 64 6f 20 7b 0d 0a 20 20 20 20        do {..    
20b00 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
20b10 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d     # NOTE: Attem
20b20 70 74 20 74 6f 20 66 6f 72 63 65 20 61 20 66 75  pt to force a fu
20b30 6c 6c 20 67 61 72 62 61 67 65 20 63 6f 6c 6c 65  ll garbage colle
20b40 63 74 69 6f 6e 20 6e 6f 77 2e 20 20 52 65 70 6f  ction now.  Repo
20b50 72 74 20 61 6e 79 0d 0a 20 20 20 20 20 20 20 20  rt any..        
20b60 20 20 23 20 20 20 20 20 20 20 65 72 72 6f 72 20    #       error 
20b70 74 68 61 74 20 69 73 20 65 6e 63 6f 75 6e 74 65  that is encounte
20b80 72 65 64 20 69 66 20 77 65 20 66 61 69 6c 2e 0d  red if we fail..
20b90 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
20ba0 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
20bb0 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
20bc0 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20    object invoke 
20bd0 47 43 20 47 65 74 54 6f 74 61 6c 4d 65 6d 6f 72  GC GetTotalMemor
20be0 79 20 74 72 75 65 0d 0a 20 20 20 20 20 20 20 20  y true..        
20bf0 20 20 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e    } error]} then
20c00 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
20c10 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
20c20 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
20c30 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
20c40 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
20c50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20c60 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47     "==== WARNING
20c70 3a 20 66 61 69 6c 65 64 20 66 75 6c 6c 20 67 61  : failed full ga
20c80 72 62 61 67 65 20 63 6f 6c 6c 65 63 74 69 6f 6e  rbage collection
20c90 2c 20 65 72 72 6f 72 3a 20 22 20 5c 0d 0a 20 20  , error: " \..  
20ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20cb0 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d  \n\t $error \n].
20cc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
20cd0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
20ce0 20 20 20 20 20 20 20 20 20 73 65 74 20 6e 6f 77           set now
20cf0 20 5b 63 6c 6f 63 6b 20 73 65 63 6f 6e 64 73 5d   [clock seconds]
20d00 0d 0a 20 20 20 20 20 20 20 20 7d 20 77 68 69 6c  ..        } whil
20d10 65 20 7b 24 73 74 61 72 74 20 3c 3d 20 24 6e 6f  e {$start <= $no
20d20 77 20 26 26 20 24 6e 6f 77 20 3c 20 24 73 74 6f  w && $now < $sto
20d30 70 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  p}..      }.... 
20d40 20 20 20 20 20 23 23 23 23 23 23 23 23 23 23 23       ###########
20d50 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
20d60 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
20d70 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
20d80 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a  ##############..
20d90 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76  ..      if {[hav
20da0 65 53 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d  eSQLiteObjectCom
20db0 6d 61 6e 64 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  mand]} then {.. 
20dc0 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
20dd0 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6f  h {..          o
20de0 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 47 43 20  bject invoke GC 
20df0 47 65 74 54 6f 74 61 6c 4d 65 6d 6f 72 79 20 66  GetTotalMemory f
20e00 61 6c 73 65 0d 0a 20 20 20 20 20 20 20 20 7d 20  alse..        } 
20e10 72 65 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68  result] == 0} th
20e20 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
20e30 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
20e40 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
20e50 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
20e60 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
20e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
20e80 2d 2d 2d 2d 20 6d 65 6d 6f 72 79 20 69 6e 20 75  ---- memory in u
20e90 73 65 20 62 79 20 74 68 65 20 43 4c 52 20 61 66  se by the CLR af
20ea0 74 65 72 20 63 6f 6c 6c 65 63 74 69 6f 6e 2e 2e  ter collection..
20eb0 2e 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  . " \..         
20ec0 20 20 20 20 20 20 20 24 72 65 73 75 6c 74 20 22         $result "
20ed0 20 62 79 74 65 73 5c 6e 22 5d 0d 0a 20 20 20 20   bytes\n"]..    
20ee0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
20ef0 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
20f00 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
20f10 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
20f20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
20f30 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
20f40 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
20f50 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e      "==== WARNIN
20f60 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 67 65 74  G: failed to get
20f70 20 43 4c 52 20 6d 65 6d 6f 72 79 20 75 73 61 67   CLR memory usag
20f80 65 2c 20 65 72 72 6f 72 3a 20 22 20 5c 0d 0a 20  e, error: " \.. 
20f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
20fa0 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d  n\t $result \n].
20fb0 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
20fc0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
20fd0 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
20fe0 70 72 6f 63 20 67 65 74 53 51 4c 69 74 65 48 61  proc getSQLiteHa
20ff0 6e 64 6c 65 43 6f 75 6e 74 73 20 7b 20 63 68 61  ndleCounts { cha
21000 6e 6e 65 6c 20 7b 71 75 69 65 74 20 66 61 6c 73  nnel {quiet fals
21010 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65  e} } {..      se
21020 74 20 72 65 73 75 6c 74 20 5b 6c 69 73 74 5d 0d  t result [list].
21030 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 68 61  ...      if {[ha
21040 76 65 53 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f  veSQLiteObjectCo
21050 6d 6d 61 6e 64 5d 20 26 26 20 5c 0d 0a 20 20 20  mmand] && \..   
21060 20 20 20 20 20 20 20 5b 68 61 76 65 53 51 4c 69         [haveSQLi
21070 74 65 44 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74  teDefineConstant
21080 20 43 4f 55 4e 54 5f 48 41 4e 44 4c 45 5d 7d 20   COUNT_HANDLE]} 
21090 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
210a0 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
210b0 45 3a 20 41 64 64 20 65 61 63 68 20 63 72 69 74  E: Add each crit
210c0 69 63 61 6c 20 68 61 6e 64 6c 65 20 63 6f 75 6e  ical handle coun
210d0 74 20 74 6f 20 74 68 65 20 72 65 73 75 6c 74 69  t to the resulti
210e0 6e 67 20 6c 69 73 74 2e 0d 0a 20 20 20 20 20 20  ng list...      
210f0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 66 6f 72    #..        for
21100 65 61 63 68 20 6e 61 6d 65 20 5b 6c 69 73 74 20  each name [list 
21110 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  \..            c
21120 6f 6e 6e 65 63 74 69 6f 6e 43 6f 75 6e 74 20 73  onnectionCount s
21130 74 61 74 65 6d 65 6e 74 43 6f 75 6e 74 20 62 61  tatementCount ba
21140 63 6b 75 70 43 6f 75 6e 74 20 62 6c 6f 62 43 6f  ckupCount blobCo
21150 75 6e 74 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20  unt] {..        
21160 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
21170 20 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65              obje
21180 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73  ct invoke -flags
21190 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20   +NonPublic \.. 
211a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
211b0 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
211c0 65 2e 44 65 62 75 67 44 61 74 61 20 24 6e 61 6d  e.DebugData $nam
211d0 65 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 76  e..          } v
211e0 61 6c 75 65 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  alue] == 0} then
211f0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
21200 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
21210 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
21220 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
21230 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
21240 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21250 20 20 20 22 2d 2d 2d 2d 20 63 72 69 74 69 63 61     "---- critica
21260 6c 20 68 61 6e 64 6c 65 20 63 6f 75 6e 74 20 5c  l handle count \
21270 22 22 20 24 6e 61 6d 65 20 22 5c 22 20 69 73 20  "" $name "\" is 
21280 22 20 24 76 61 6c 75 65 20 5c 6e 5d 0d 0a 20 20  " $value \n]..  
21290 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
212a0 20 20 20 20 20 20 20 20 20 20 20 6c 61 70 70 65             lappe
212b0 6e 64 20 72 65 73 75 6c 74 20 24 76 61 6c 75 65  nd result $value
212c0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c  ..          } el
212d0 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
212e0 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
212f0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
21300 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
21310 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
21320 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
21330 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49       "==== WARNI
21340 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 67 65  NG: failed to ge
21350 74 20 63 72 69 74 69 63 61 6c 20 68 61 6e 64 6c  t critical handl
21360 65 20 63 6f 75 6e 74 20 5c 22 22 20 5c 0d 0a 20  e count \"" \.. 
21370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21380 20 24 6e 61 6d 65 20 22 5c 22 2c 20 65 72 72 6f   $name "\", erro
21390 72 3a 20 22 20 5c 6e 5c 74 20 24 76 61 6c 75 65  r: " \n\t $value
213a0 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \n]..          
213b0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d    }..          }
213c0 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
213d0 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 21 24 71     } elseif {!$q
213e0 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
213f0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
21400 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 61 63 74   # NOTE: The act
21410 75 61 6c 20 68 61 6e 64 6c 65 20 63 6f 75 6e 74  ual handle count
21420 73 20 61 72 65 20 6e 6f 74 20 61 76 61 69 6c 61  s are not availa
21430 62 6c 65 3b 20 74 68 65 72 65 66 6f 72 65 2c 20  ble; therefore, 
21440 6a 75 73 74 0d 0a 20 20 20 20 20 20 20 20 23 20  just..        # 
21450 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 6e 20        return an 
21460 65 6d 70 74 79 20 6c 69 73 74 2e 0d 0a 20 20 20  empty list...   
21470 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
21480 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22  tputs $channel "
21490 2d 2d 2d 2d 20 63 72 69 74 69 63 61 6c 20 68 61  ---- critical ha
214a0 6e 64 6c 65 20 63 6f 75 6e 74 73 20 75 6e 61 76  ndle counts unav
214b0 61 69 6c 61 62 6c 65 5c 6e 22 0d 0a 20 20 20 20  ailable\n"..    
214c0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74    }....      ret
214d0 75 72 6e 20 24 72 65 73 75 6c 74 0d 0a 20 20 20  urn $result..   
214e0 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
214f0 73 68 75 74 64 6f 77 6e 53 51 4c 69 74 65 20 7b  shutdownSQLite {
21500 20 63 68 61 6e 6e 65 6c 20 7b 66 6f 72 63 65 20   channel {force 
21510 66 61 6c 73 65 7d 20 7b 71 75 69 65 74 20 66 61  false} {quiet fa
21520 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20  lse} } {..      
21530 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
21540 20 4d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   Make sure that 
21550 53 51 4c 69 74 65 20 63 6f 72 65 20 6c 69 62 72  SQLite core libr
21560 61 72 79 20 69 73 20 63 6f 6d 70 6c 65 74 65 6c  ary is completel
21570 79 20 73 68 75 74 64 6f 77 6e 2e 20 20 54 68 69  y shutdown.  Thi
21580 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  s..      #      
21590 20 69 73 20 75 73 65 64 20 62 79 20 74 65 73 74   is used by test
215a0 73 20 74 68 61 74 20 63 68 61 6e 67 65 20 63 6f  s that change co
215b0 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 70 74 69  nfiguration opti
215c0 6f 6e 73 20 61 6e 64 2f 6f 72 20 74 68 6f 73 65  ons and/or those
215d0 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
215e0 74 68 61 74 20 6e 65 65 64 20 74 6f 20 6d 61 6b  that need to mak
215f0 65 20 73 75 72 65 20 6c 6f 67 67 69 6e 67 20 69  e sure logging i
21600 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 28 69  s initialized (i
21610 2e 65 2e 20 6a 75 73 74 20 69 6e 20 63 61 73 65  .e. just in case
21620 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
21630 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20  the SQLite core 
21640 6c 69 62 72 61 72 79 20 77 61 73 20 69 6e 69 74  library was init
21650 69 61 6c 69 7a 65 64 20 69 6e 20 74 68 65 20 70  ialized in the p
21660 72 6f 63 65 73 73 20 70 72 69 6f 72 20 74 6f 0d  rocess prior to.
21670 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74  .      #       t
21680 68 65 20 53 51 4c 69 74 65 4c 6f 67 20 63 6c 61  he SQLiteLog cla
21690 73 73 20 62 65 69 6e 67 20 61 62 6c 65 20 74 6f  ss being able to
216a0 20 73 65 74 75 70 20 69 74 73 20 6c 6f 67 67 69   setup its loggi
216b0 6e 67 20 63 61 6c 6c 62 61 63 6b 29 2e 0d 0a 20  ng callback)... 
216c0 20 20 20 20 20 23 20 20 20 20 20 20 20 4e 6f 72       #       Nor
216d0 6d 61 6c 6c 79 2c 20 74 68 69 73 20 73 68 6f 75  mally, this shou
216e0 6c 64 20 6f 6e 6c 79 20 62 65 20 70 65 72 66 6f  ld only be perfo
216f0 72 6d 65 64 20 69 66 20 53 51 4c 69 74 65 20 69  rmed if SQLite i
21700 73 20 6c 6f 61 64 65 64 20 61 6e 64 0d 0a 20 20  s loaded and..  
21710 20 20 20 20 23 20 20 20 20 20 20 20 72 65 61 64      #       read
21720 79 20 66 6f 72 20 75 73 65 20 62 79 20 74 68 65  y for use by the
21730 20 74 65 73 74 20 73 75 69 74 65 2e 0d 0a 20 20   test suite...  
21740 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
21750 7b 24 66 6f 72 63 65 20 7c 7c 20 5b 69 73 53 51  {$force || [isSQ
21760 4c 69 74 65 52 65 61 64 79 5d 7d 20 74 68 65 6e  LiteReady]} then
21770 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
21780 20 20 20 20 20 20 20 23 20 42 55 47 46 49 58 3a         # BUGFIX:
21790 20 4d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   Make sure that 
217a0 61 6e 79 20 22 6c 65 61 6b 65 64 22 20 74 72 61  any "leaked" tra
217b0 6e 73 61 63 74 69 6f 6e 73 20 61 6e 64 2f 6f 72  nsactions and/or
217c0 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0d 0a 20 20   connections..  
217d0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20        #         
217e0 61 72 65 20 63 6c 65 61 6e 65 64 20 75 70 20 62  are cleaned up b
217f0 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74 68  efore calling th
21800 65 20 6e 61 74 69 76 65 20 73 68 75 74 64 6f 77  e native shutdow
21810 6e 20 66 75 6e 63 74 69 6f 6e 2e 0d 0a 20 20 20  n function...   
21820 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
21830 66 6f 72 65 61 63 68 20 74 72 61 6e 73 61 63 74  foreach transact
21840 69 6f 6e 20 5b 69 6e 66 6f 20 74 72 61 6e 73 61  ion [info transa
21850 63 74 69 6f 6e 73 5d 20 7b 0d 0a 20 20 20 20 20  ctions] {..     
21860 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
21870 20 6d 61 74 63 68 20 5c 0d 0a 20 20 20 20 20 20   match \..      
21880 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 23 44          System#D
21890 61 74 61 23 53 51 4c 69 74 65 23 53 51 4c 69 74  ata#SQLite#SQLit
218a0 65 54 72 61 6e 73 61 63 74 69 6f 6e 23 2a 20 24  eTransaction#* $
218b0 74 72 61 6e 73 61 63 74 69 6f 6e 5d 7d 20 74 68  transaction]} th
218c0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
218d0 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
218e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
218f0 6c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f  l transaction ro
21900 6c 6c 62 61 63 6b 20 24 74 72 61 6e 73 61 63 74  llback $transact
21910 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ion..           
21920 20 7d 20 65 72 72 6f 72 5d 20 3d 3d 20 30 7d 20   } error] == 0} 
21930 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
21940 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
21950 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
21960 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
21970 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
21980 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
21990 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
219a0 2d 2d 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 6c  -- rolled back l
219b0 65 61 6b 65 64 20 74 72 61 6e 73 61 63 74 69 6f  eaked transactio
219c0 6e 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20  n \"" \..       
219d0 20 20 20 20 20 20 20 20 20 20 20 20 20 24 74 72               $tr
219e0 61 6e 73 61 63 74 69 6f 6e 20 5c 22 5c 6e 5d 0d  ansaction \"\n].
219f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
21a00 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20  ..            } 
21a10 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
21a20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
21a30 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
21a40 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
21a50 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
21a60 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
21a70 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d               "==
21a80 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c  == WARNING: fail
21a90 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 6c  ed to rollback l
21aa0 65 61 6b 65 64 20 74 72 61 6e 73 61 63 74 69 6f  eaked transactio
21ab0 6e 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20  n \"" \..       
21ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 24 74 72               $tr
21ad0 61 6e 73 61 63 74 69 6f 6e 20 22 5c 22 2c 20 65  ansaction "\", e
21ae0 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72  rror: " \n\t $er
21af0 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ror \n]..       
21b00 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
21b10 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
21b20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
21b30 0a 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61  ...        forea
21b40 63 68 20 64 62 20 5b 69 6e 66 6f 20 63 6f 6e 6e  ch db [info conn
21b50 65 63 74 69 6f 6e 73 5d 20 7b 0d 0a 20 20 20 20  ections] {..    
21b60 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
21b70 67 20 6d 61 74 63 68 20 5c 0d 0a 20 20 20 20 20  g match \..     
21b80 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 23           System#
21b90 44 61 74 61 23 53 51 4c 69 74 65 23 53 51 4c 69  Data#SQLite#SQLi
21ba0 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 23 2a 20 24  teConnection#* $
21bb0 64 62 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  db]} then {..   
21bc0 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61           if {[ca
21bd0 74 63 68 20 7b 73 71 6c 20 63 6c 6f 73 65 20 24  tch {sql close $
21be0 64 62 7d 20 65 72 72 6f 72 5d 20 3d 3d 20 30 7d  db} error] == 0}
21bf0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
21c00 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
21c10 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
21c20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
21c30 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
21c40 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
21c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
21c60 2d 2d 2d 20 63 6c 6f 73 65 64 20 6c 65 61 6b 65  --- closed leake
21c70 64 20 64 61 74 61 62 61 73 65 20 5c 22 22 20 24  d database \"" $
21c80 64 62 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20  db \"\n]..      
21c90 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
21ca0 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
21cb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
21cc0 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
21cd0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
21ce0 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
21cf0 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
21d00 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
21d10 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e        "==== WARN
21d20 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 63  ING: failed to c
21d30 6c 6f 73 65 20 6c 65 61 6b 65 64 20 64 61 74 61  lose leaked data
21d40 62 61 73 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20  base \"" \..    
21d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21d60 24 64 62 20 22 5c 22 2c 20 65 72 72 6f 72 3a 20  $db "\", error: 
21d70 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e  " \n\t $error \n
21d80 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ]..             
21d90 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
21da0 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  }..          }..
21db0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
21dc0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
21dd0 23 20 42 55 47 46 49 58 3a 20 42 65 66 6f 72 65  # BUGFIX: Before
21de0 20 63 61 6c 6c 69 6e 67 20 74 68 65 20 6e 61 74   calling the nat
21df0 69 76 65 20 73 68 75 74 64 6f 77 6e 20 66 75 6e  ive shutdown fun
21e00 63 74 69 6f 6e 2c 20 6d 61 6b 65 20 73 75 72 65  ction, make sure
21e10 20 62 6f 74 68 0d 0a 20 20 20 20 20 20 20 20 23   both..        #
21e20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20           of the 
21e30 50 52 41 47 4d 41 20 72 65 6c 61 74 65 64 20 64  PRAGMA related d
21e40 69 72 65 63 74 6f 72 79 20 6e 61 6d 65 73 20 61  irectory names a
21e50 72 65 20 66 72 65 65 64 2e 0d 0a 20 20 20 20 20  re freed...     
21e60 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 63 68     #..        ch
21e70 65 63 6b 46 6f 72 53 51 4c 69 74 65 44 69 72 65  eckForSQLiteDire
21e80 63 74 6f 72 69 65 73 20 24 63 68 61 6e 6e 65 6c  ctories $channel
21e90 20 74 72 75 65 0d 0a 0d 0a 20 20 20 20 20 20 20   true....       
21ea0 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
21eb0 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20           object 
21ec0 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e  invoke -flags +N
21ed0 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20  onPublic \..    
21ee0 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d            System
21ef0 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 55 6e 73  .Data.SQLite.Uns
21f00 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73  afeNativeMethods
21f10 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77   sqlite3_shutdow
21f20 6e 0d 0a 20 20 20 20 20 20 20 20 7d 20 72 65 73  n..        } res
21f30 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ult] == 0} then 
21f40 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  {..          if 
21f50 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
21f60 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
21f70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
21f80 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
21f90 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
21fa0 2d 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f 73  - call sqlite3_s
21fb0 68 75 74 64 6f 77 6e 28 29 2e 2e 2e 20 6f 6b 3a  hutdown()... ok:
21fc0 20 22 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a   " $result \n]..
21fd0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
21fe0 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
21ff0 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71           if {!$q
22000 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
22010 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
22020 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
22030 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
22040 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 61          "---- ca
22050 6c 6c 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64  ll sqlite3_shutd
22060 6f 77 6e 28 29 2e 2e 2e 20 65 72 72 6f 72 3a 20  own()... error: 
22070 22 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c  " \n\t $result \
22080 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  n]..          }.
22090 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
220a0 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
220b0 20 20 20 70 72 6f 63 20 67 65 74 53 65 74 74 69     proc getSetti
220c0 6e 67 52 65 61 64 43 6f 75 6e 74 20 7b 20 6e 61  ngReadCount { na
220d0 6d 65 20 7b 76 69 61 46 69 6c 65 20 66 61 6c 73  me {viaFile fals
220e0 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66  e} } {..      if
220f0 20 7b 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e   {[haveConstrain
22100 74 20 62 75 69 6c 64 43 6f 6e 66 69 67 75 72 61  t buildConfigura
22110 74 69 6f 6e 2e 44 65 62 75 67 5d 20 26 26 20 5b  tion.Debug] && [
22120 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
22130 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d   object invoke -
22140 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63  flags +NonPublic
22150 20 2d 61 6c 69 61 73 20 5c 0d 0a 20 20 20 20 20   -alias \..     
22160 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61         System.Da
22170 74 61 2e 53 51 4c 69 74 65 2e 44 65 62 75 67 44  ta.SQLite.DebugD
22180 61 74 61 20 47 65 74 53 65 74 74 69 6e 67 52 65  ata GetSettingRe
22190 61 64 43 6f 75 6e 74 73 20 24 76 69 61 46 69 6c  adCounts $viaFil
221a0 65 0d 0a 20 20 20 20 20 20 7d 20 73 65 74 74 69  e..      } setti
221b0 6e 67 52 65 61 64 43 6f 75 6e 74 73 5d 20 3d 3d  ngReadCounts] ==
221c0 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
221d0 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
221e0 6c 65 6e 67 74 68 20 24 6e 61 6d 65 5d 20 3e 20  length $name] > 
221f0 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
22200 20 20 20 20 20 69 66 20 7b 5b 24 73 65 74 74 69       if {[$setti
22210 6e 67 52 65 61 64 43 6f 75 6e 74 73 20 54 72 79  ngReadCounts Try
22220 47 65 74 56 61 6c 75 65 20 24 6e 61 6d 65 20 76  GetValue $name v
22230 61 6c 75 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  alue]} then {.. 
22240 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
22250 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
22260 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
22270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22280 22 2d 2d 2d 2d 20 73 65 74 74 69 6e 67 20 5c 22  "---- setting \"
22290 22 20 24 6e 61 6d 65 20 22 5c 22 20 77 61 73 20  " $name "\" was 
222a0 72 65 61 64 20 22 20 24 76 61 6c 75 65 20 22 20  read " $value " 
222b0 74 69 6d 65 73 22 20 5c 0d 0a 20 20 20 20 20 20  times" \..      
222c0 20 20 20 20 20 20 20 20 20 20 5b 65 78 70 72 20            [expr 
222d0 7b 24 76 69 61 46 69 6c 65 20 3f 20 22 20 66 72  {$viaFile ? " fr
222e0 6f 6d 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61  om the configura
222f0 74 69 6f 6e 20 66 69 6c 65 22 20 3a 20 22 22 7d  tion file" : ""}
22300 5d 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  ] \n]....       
22310 20 20 20 20 20 72 65 74 75 72 6e 20 24 76 61 6c       return $val
22320 75 65 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  ue..          }.
22330 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20  .        } else 
22340 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  {..          set
22350 20 6e 61 6d 65 43 6f 75 6e 74 20 5b 24 73 65 74   nameCount [$set
22360 74 69 6e 67 52 65 61 64 43 6f 75 6e 74 73 20 43  tingReadCounts C
22370 6f 75 6e 74 5d 0d 0a 20 20 20 20 20 20 20 20 20  ount]..         
22380 20 73 65 74 20 76 61 6c 75 65 43 6f 75 6e 74 20   set valueCount 
22390 30 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 6f  0....          o
223a0 62 6a 65 63 74 20 66 6f 72 65 61 63 68 20 2d 61  bject foreach -a
223b0 6c 69 61 73 20 70 61 69 72 20 24 73 65 74 74 69  lias pair $setti
223c0 6e 67 52 65 61 64 43 6f 75 6e 74 73 20 7b 0d 0a  ngReadCounts {..
223d0 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 63 72              incr
223e0 20 76 61 6c 75 65 43 6f 75 6e 74 20 5b 24 70 61   valueCount [$pa
223f0 69 72 20 56 61 6c 75 65 5d 0d 0a 0d 0a 20 20 20  ir Value]....   
22400 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
22410 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
22420 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
22430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
22440 2d 2d 2d 20 73 65 74 74 69 6e 67 20 5c 22 22 20  --- setting \"" 
22450 5b 24 70 61 69 72 20 4b 65 79 5d 20 22 5c 22 20  [$pair Key] "\" 
22460 77 61 73 20 72 65 61 64 20 22 20 5b 24 70 61 69  was read " [$pai
22470 72 20 56 61 6c 75 65 5d 20 5c 0d 0a 20 20 20 20  r Value] \..    
22480 20 20 20 20 20 20 20 20 20 20 20 20 22 20 74 69              " ti
22490 6d 65 73 22 20 5b 65 78 70 72 20 7b 24 76 69 61  mes" [expr {$via
224a0 46 69 6c 65 20 3f 20 22 20 66 72 6f 6d 20 74 68  File ? " from th
224b0 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  e configuration 
224c0 66 69 6c 65 22 20 3a 20 5c 0d 0a 20 20 20 20 20  file" : \..     
224d0 20 20 20 20 20 20 20 20 20 20 20 22 22 7d 5d 20             ""}] 
224e0 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  \n]..          }
224f0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65  ....          re
22500 74 75 72 6e 20 5b 6c 69 73 74 20 24 6e 61 6d 65  turn [list $name
22510 43 6f 75 6e 74 20 24 76 61 6c 75 65 43 6f 75 6e  Count $valueCoun
22520 74 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  t]..        }.. 
22530 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
22540 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
22550 74 68 20 24 6e 61 6d 65 5d 20 3e 20 30 7d 20 74  th $name] > 0} t
22560 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74  hen {..        t
22570 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
22580 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
22590 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
225a0 22 2d 2d 2d 2d 20 73 65 74 74 69 6e 67 20 5c 22  "---- setting \"
225b0 22 20 24 6e 61 6d 65 20 22 5c 22 20 77 61 73 20  " $name "\" was 
225c0 6e 6f 74 20 72 65 61 64 22 20 5b 65 78 70 72 20  not read" [expr 
225d0 7b 24 76 69 61 46 69 6c 65 20 3f 20 5c 0d 0a 20  {$viaFile ? \.. 
225e0 20 20 20 20 20 20 20 20 20 20 20 22 20 66 72 6f             " fro
225f0 6d 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74  m the configurat
22600 69 6f 6e 20 66 69 6c 65 22 20 3a 20 22 22 7d 5d  ion file" : ""}]
22610 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c   \n]..      } el
22620 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70  se {..        tp
22630 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
22640 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
22650 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  \..            "
22660 2d 2d 2d 2d 20 6e 6f 20 73 65 74 74 69 6e 67 73  ---- no settings
22670 20 77 65 72 65 20 72 65 61 64 22 20 5b 65 78 70   were read" [exp
22680 72 20 7b 24 76 69 61 46 69 6c 65 20 3f 20 5c 0d  r {$viaFile ? \.
22690 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 20 66  .            " f
226a0 72 6f 6d 20 74 68 65 20 63 6f 6e 66 69 67 75 72  rom the configur
226b0 61 74 69 6f 6e 20 66 69 6c 65 22 20 3a 20 22 22  ation file" : ""
226c0 7d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d  }] \n]..      }.
226d0 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ...      return 
226e0 2d 31 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  -1..    }.....  
226f0 20 20 70 72 6f 63 20 67 65 74 4f 74 68 65 72 43    proc getOtherC
22700 6f 75 6e 74 20 7b 20 6e 61 6d 65 20 7d 20 7b 0d  ount { name } {.
22710 0a 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65  .      if {[have
22720 43 6f 6e 73 74 72 61 69 6e 74 20 62 75 69 6c 64  Constraint build
22730 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 44 65  Configuration.De
22740 62 75 67 5d 20 26 26 20 5b 63 61 74 63 68 20 7b  bug] && [catch {
22750 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74  ..        object
22760 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b   invoke -flags +
22770 4e 6f 6e 50 75 62 6c 69 63 20 2d 61 6c 69 61 73  NonPublic -alias
22780 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
22790 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
227a0 74 65 2e 44 65 62 75 67 44 61 74 61 20 47 65 74  te.DebugData Get
227b0 4f 74 68 65 72 43 6f 75 6e 74 73 0d 0a 20 20 20  OtherCounts..   
227c0 20 20 20 7d 20 6f 74 68 65 72 43 6f 75 6e 74 73     } otherCounts
227d0 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
227e0 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72          if {[str
227f0 69 6e 67 20 6c 65 6e 67 74 68 20 24 6e 61 6d 65  ing length $name
22800 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
22810 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 24 6f           if {[$o
22820 74 68 65 72 43 6f 75 6e 74 73 20 54 72 79 47 65  therCounts TryGe
22830 74 56 61 6c 75 65 20 24 6e 61 6d 65 20 76 61 6c  tValue $name val
22840 75 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ue]} then {..   
22850 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
22860 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
22870 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
22880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
22890 2d 2d 2d 20 6f 74 68 65 72 20 63 6f 75 6e 74 65  --- other counte
228a0 72 20 5c 22 22 20 24 6e 61 6d 65 20 22 5c 22 20  r \"" $name "\" 
228b0 68 61 73 20 76 61 6c 75 65 20 22 20 24 76 61 6c  has value " $val
228c0 75 65 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20  ue \n]....      
228d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 76 61        return $va
228e0 6c 75 65 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  lue..          }
228f0 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65  ..        } else
22900 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   {..          se
22910 74 20 6e 61 6d 65 43 6f 75 6e 74 20 5b 24 6f 74  t nameCount [$ot
22920 68 65 72 43 6f 75 6e 74 73 20 43 6f 75 6e 74 5d  herCounts Count]
22930 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
22940 76 61 6c 75 65 43 6f 75 6e 74 20 30 0d 0a 0d 0a  valueCount 0....
22950 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74            object
22960 20 66 6f 72 65 61 63 68 20 2d 61 6c 69 61 73 20   foreach -alias 
22970 70 61 69 72 20 24 6f 74 68 65 72 43 6f 75 6e 74  pair $otherCount
22980 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s {..           
22990 20 69 6e 63 72 20 76 61 6c 75 65 43 6f 75 6e 74   incr valueCount
229a0 20 5b 24 70 61 69 72 20 56 61 6c 75 65 5d 0d 0a   [$pair Value]..
229b0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
229c0 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
229d0 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
229e0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
229f0 20 20 20 22 2d 2d 2d 2d 20 6f 74 68 65 72 20 63     "---- other c
22a00 6f 75 6e 74 65 72 20 5c 22 22 20 5b 24 70 61 69  ounter \"" [$pai
22a10 72 20 4b 65 79 5d 20 22 5c 22 20 68 61 73 20 76  r Key] "\" has v
22a20 61 6c 75 65 20 22 20 5c 0d 0a 20 20 20 20 20 20  alue " \..      
22a30 20 20 20 20 20 20 20 20 20 20 5b 24 70 61 69 72            [$pair
22a40 20 56 61 6c 75 65 5d 20 5c 6e 5d 0d 0a 20 20 20   Value] \n]..   
22a50 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
22a60 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6c 69        return [li
22a70 73 74 20 24 6e 61 6d 65 43 6f 75 6e 74 20 24 76  st $nameCount $v
22a80 61 6c 75 65 43 6f 75 6e 74 5d 0d 0a 20 20 20 20  alueCount]..    
22a90 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
22aa0 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72  ..      if {[str
22ab0 69 6e 67 20 6c 65 6e 67 74 68 20 24 6e 61 6d 65  ing length $name
22ac0 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
22ad0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
22ae0 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
22af0 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
22b00 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6f 74          "---- ot
22b10 68 65 72 20 63 6f 75 6e 74 65 72 20 5c 22 22 20  her counter \"" 
22b20 24 6e 61 6d 65 20 22 5c 22 20 68 61 73 20 6e 6f  $name "\" has no
22b30 20 76 61 6c 75 65 5c 6e 22 5d 0d 0a 20 20 20 20   value\n"]..    
22b40 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
22b50 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
22b60 74 5f 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20  t_channel "---- 
22b70 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 74 68  there are no oth
22b80 65 72 20 63 6f 75 6e 74 65 72 73 5c 6e 22 0d 0a  er counters\n"..
22b90 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
22ba0 20 72 65 74 75 72 6e 20 2d 31 0d 0a 20 20 20 20   return -1..    
22bb0 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 72  }.....    proc r
22bc0 65 70 6f 72 74 53 51 4c 69 74 65 52 65 73 6f 75  eportSQLiteResou
22bd0 72 63 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20  rces {..        
22be0 20 20 20 20 63 68 61 6e 6e 65 6c 20 7b 71 75 69      channel {qui
22bf0 65 74 20 66 61 6c 73 65 7d 20 7b 72 65 73 65 74  et false} {reset
22c00 20 74 72 75 65 7d 20 7b 63 6f 6c 6c 65 63 74 20   true} {collect 
22c10 74 72 75 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  true} } {..     
22c20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
22c30 3a 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 61  : If possible, a
22c40 6c 77 61 79 73 20 72 65 73 65 74 20 74 68 65 20  lways reset the 
22c50 63 61 63 68 65 64 20 61 73 73 65 6d 62 6c 79 20  cached assembly 
22c60 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20  directory..     
22c70 20 23 20 20 20 20 20 20 20 61 6e 64 20 74 68 65   #       and the
22c80 20 63 61 63 68 65 64 20 58 4d 4c 20 63 6f 6e 66   cached XML conf
22c90 69 67 75 72 61 74 69 6f 6e 20 66 69 6c 65 20 6e  iguration file n
22ca0 61 6d 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ame...      #.. 
22cb0 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65 53 51       if {[haveSQ
22cc0 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e  LiteObjectComman
22cd0 64 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  d]} then {..    
22ce0 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
22cf0 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65  ..          obje
22d00 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73  ct invoke -flags
22d10 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20   +NonPublic \.. 
22d20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73               Sys
22d30 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
22d40 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68  UnsafeNativeMeth
22d50 6f 64 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ods \..         
22d60 20 20 20 20 20 52 65 73 65 74 43 61 63 68 65 64       ResetCached
22d70 41 73 73 65 6d 62 6c 79 44 69 72 65 63 74 6f 72  AssemblyDirector
22d80 79 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 72 72  y..        } err
22d90 6f 72 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  or] == 0} then {
22da0 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
22db0 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
22dc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
22dd0 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d  ts $channel "---
22de0 2d 20 72 65 73 65 74 20 63 61 63 68 65 64 20 61  - reset cached a
22df0 73 73 65 6d 62 6c 79 20 64 69 72 65 63 74 6f 72  ssembly director
22e00 79 5c 6e 22 0d 0a 20 20 20 20 20 20 20 20 20 20  y\n"..          
22e10 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73  }..        } els
22e20 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69  e {..          i
22e30 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
22e40 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
22e50 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
22e60 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
22e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d                "=
22e80 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69  === WARNING: fai
22e90 6c 65 64 20 74 6f 20 72 65 73 65 74 20 63 61 63  led to reset cac
22ea0 68 65 64 20 61 73 73 65 6d 62 6c 79 20 64 69 72  hed assembly dir
22eb0 65 63 74 6f 72 79 2c 20 22 20 5c 0d 0a 20 20 20  ectory, " \..   
22ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 65 72               "er
22ed0 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72  ror: " \n\t $err
22ee0 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  or \n]..        
22ef0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
22f00 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63  ..        if {[c
22f10 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
22f20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20    object invoke 
22f30 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69  -flags +NonPubli
22f40 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  c \..           
22f50 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53     System.Data.S
22f60 51 4c 69 74 65 2e 55 6e 73 61 66 65 4e 61 74 69  QLite.UnsafeNati
22f70 76 65 4d 65 74 68 6f 64 73 20 5c 0d 0a 20 20 20  veMethods \..   
22f80 20 20 20 20 20 20 20 20 20 20 20 52 65 73 65 74             Reset
22f90 43 61 63 68 65 64 58 6d 6c 43 6f 6e 66 69 67 46  CachedXmlConfigF
22fa0 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20  ileName..       
22fb0 20 7d 20 65 72 72 6f 72 5d 20 3d 3d 20 30 7d 20   } error] == 0} 
22fc0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
22fd0 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
22fe0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
22ff0 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
23000 6c 20 22 2d 2d 2d 2d 20 72 65 73 65 74 20 63 61  l "---- reset ca
23010 63 68 65 64 20 58 4d 4c 20 63 6f 6e 66 69 67 75  ched XML configu
23020 72 61 74 69 6f 6e 20 66 69 6c 65 20 6e 61 6d 65  ration file name
23030 5c 6e 22 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  \n"..          }
23040 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65  ..        } else
23050 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   {..          if
23060 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
23070 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
23080 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
23090 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
230a0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d               "==
230b0 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c  == WARNING: fail
230c0 65 64 20 74 6f 20 72 65 73 65 74 20 63 61 63 68  ed to reset cach
230d0 65 64 20 58 4d 4c 20 63 6f 6e 66 69 67 75 72 61  ed XML configura
230e0 74 69 6f 6e 20 22 20 5c 0d 0a 20 20 20 20 20 20  tion " \..      
230f0 20 20 20 20 20 20 20 20 20 20 22 66 69 6c 65 20            "file 
23100 6e 61 6d 65 2c 20 65 72 72 6f 72 3a 20 22 20 5c  name, error: " \
23110 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a  n\t $error \n]..
23120 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
23130 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
23140 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
23150 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 61 76 61    # NOTE: If ava
23160 69 6c 61 62 6c 65 2c 20 72 65 70 6f 72 74 20 6f  ilable, report o
23170 6e 20 28 61 6e 64 20 70 6f 73 73 69 62 6c 79 20  n (and possibly 
23180 72 65 73 65 74 29 20 74 68 65 20 72 75 6e 74 69  reset) the runti
23190 6d 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  me..      #     
231a0 20 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20    configuration 
231b0 73 74 61 74 69 73 74 69 63 73 2e 0d 0a 20 20 20  statistics...   
231c0 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
231d0 5b 68 61 76 65 53 51 4c 69 74 65 4f 62 6a 65 63  [haveSQLiteObjec
231e0 74 43 6f 6d 6d 61 6e 64 5d 20 26 26 20 5c 0d 0a  tCommand] && \..
231f0 20 20 20 20 20 20 20 20 20 20 5b 68 61 76 65 43            [haveC
23200 6f 6e 73 74 72 61 69 6e 74 20 62 75 69 6c 64 43  onstraint buildC
23210 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 44 65 62  onfiguration.Deb
23220 75 67 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ug]} then {..   
23230 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
23240 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a  {..          obj
23250 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67  ect invoke -flag
23260 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 2d 61 6c  s +NonPublic -al
23270 69 61 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ias \..         
23280 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61       System.Data
23290 2e 53 51 4c 69 74 65 2e 44 65 62 75 67 44 61 74  .SQLite.DebugDat
232a0 61 20 47 65 74 53 65 74 74 69 6e 67 52 65 61 64  a GetSettingRead
232b0 43 6f 75 6e 74 73 20 66 61 6c 73 65 0d 0a 20 20  Counts false..  
232c0 20 20 20 20 20 20 7d 20 73 65 74 74 69 6e 67 52        } settingR
232d0 65 61 64 43 6f 75 6e 74 73 5d 20 3d 3d 20 30 7d  eadCounts] == 0}
232e0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
232f0 20 20 20 73 65 74 20 6e 61 6d 65 43 6f 75 6e 74     set nameCount
23300 20 5b 24 73 65 74 74 69 6e 67 52 65 61 64 43 6f   [$settingReadCo
23310 75 6e 74 73 20 43 6f 75 6e 74 5d 0d 0a 20 20 20  unts Count]..   
23320 20 20 20 20 20 20 20 73 65 74 20 76 61 6c 75 65         set value
23330 43 6f 75 6e 74 20 30 0d 0a 0d 0a 20 20 20 20 20  Count 0....     
23340 20 20 20 20 20 6f 62 6a 65 63 74 20 66 6f 72 65       object fore
23350 61 63 68 20 2d 61 6c 69 61 73 20 70 61 69 72 20  ach -alias pair 
23360 24 73 65 74 74 69 6e 67 52 65 61 64 43 6f 75 6e  $settingReadCoun
23370 74 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ts {..          
23380 20 20 69 6e 63 72 20 76 61 6c 75 65 43 6f 75 6e    incr valueCoun
23390 74 20 5b 24 70 61 69 72 20 56 61 6c 75 65 5d 0d  t [$pair Value].
233a0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ...            i
233b0 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
233c0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
233d0 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
233e0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
233f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23400 20 20 22 2d 2d 2d 2d 20 73 65 74 74 69 6e 67 20    "---- setting 
23410 5c 22 22 20 5b 24 70 61 69 72 20 4b 65 79 5d 20  \"" [$pair Key] 
23420 22 5c 22 20 77 61 73 20 72 65 61 64 20 22 20 5c  "\" was read " \
23430 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
23440 20 20 20 20 5b 24 70 61 69 72 20 56 61 6c 75 65      [$pair Value
23450 5d 20 22 20 74 69 6d 65 73 5c 6e 22 5d 0d 0a 20  ] " times\n"].. 
23460 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
23470 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
23480 20 20 20 20 20 20 20 69 66 20 7b 24 72 65 73 65         if {$rese
23490 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
234a0 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
234b0 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  h {..           
234c0 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65     object invoke
234d0 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c   -flags +NonPubl
234e0 69 63 20 2d 61 6c 69 61 73 20 5c 0d 0a 20 20 20  ic -alias \..   
234f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
23500 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
23510 65 2e 44 65 62 75 67 44 61 74 61 20 43 6c 65 61  e.DebugData Clea
23520 72 53 65 74 74 69 6e 67 52 65 61 64 43 6f 75 6e  rSettingReadCoun
23530 74 73 20 66 61 6c 73 65 0d 0a 20 20 20 20 20 20  ts false..      
23540 20 20 20 20 20 20 7d 20 65 72 72 6f 72 5d 20 3d        } error] =
23550 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
23560 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
23570 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
23580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23590 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
235a0 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
235b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
235c0 20 20 22 2d 2d 2d 2d 20 72 65 73 65 74 20 73 65    "---- reset se
235d0 74 74 69 6e 67 20 73 74 61 74 69 73 74 69 63 73  tting statistics
235e0 20 66 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75   for the previou
235f0 73 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  s " \..         
23600 20 20 20 20 20 20 20 20 20 20 20 24 6e 61 6d 65             $name
23610 43 6f 75 6e 74 20 22 20 6e 61 6d 65 73 20 61 6e  Count " names an
23620 64 20 22 20 24 76 61 6c 75 65 43 6f 75 6e 74 20  d " $valueCount 
23630 22 20 76 61 6c 75 65 73 20 72 65 61 64 5c 6e 22  " values read\n"
23640 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ]..             
23650 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
23660 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
23670 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
23680 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
23690 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
236a0 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
236b0 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
236c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
236d0 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61  ==== WARNING: fa
236e0 69 6c 65 64 20 74 6f 20 72 65 73 65 74 20 73 65  iled to reset se
236f0 74 74 69 6e 67 20 73 74 61 74 69 73 74 69 63 73  tting statistics
23700 20 66 6f 72 20 22 20 5c 0d 0a 20 20 20 20 20 20   for " \..      
23710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 74                "t
23720 68 65 20 70 72 65 76 69 6f 75 73 20 22 20 24 6e  he previous " $n
23730 61 6d 65 43 6f 75 6e 74 20 22 20 6e 61 6d 65 73  ameCount " names
23740 20 61 6e 64 20 22 20 24 76 61 6c 75 65 43 6f 75   and " $valueCou
23750 6e 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  nt \..          
23760 20 20 20 20 20 20 20 20 20 20 22 20 76 61 6c 75            " valu
23770 65 73 20 72 65 61 64 2c 20 65 72 72 6f 72 3a 20  es read, error: 
23780 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e  " \n\t $error \n
23790 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ]..             
237a0 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
237b0 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  }..          }..
237c0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
237d0 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
237e0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a  {..          obj
237f0 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67  ect invoke -flag
23800 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 2d 61 6c  s +NonPublic -al
23810 69 61 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ias \..         
23820 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61       System.Data
23830 2e 53 51 4c 69 74 65 2e 44 65 62 75 67 44 61 74  .SQLite.DebugDat
23840 61 20 47 65 74 53 65 74 74 69 6e 67 52 65 61 64  a GetSettingRead
23850 43 6f 75 6e 74 73 20 74 72 75 65 0d 0a 20 20 20  Counts true..   
23860 20 20 20 20 20 7d 20 73 65 74 74 69 6e 67 46 69       } settingFi
23870 6c 65 52 65 61 64 43 6f 75 6e 74 73 5d 20 3d 3d  leReadCounts] ==
23880 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
23890 20 20 20 20 20 20 73 65 74 20 6e 61 6d 65 43 6f        set nameCo
238a0 75 6e 74 20 5b 24 73 65 74 74 69 6e 67 46 69 6c  unt [$settingFil
238b0 65 52 65 61 64 43 6f 75 6e 74 73 20 43 6f 75 6e  eReadCounts Coun
238c0 74 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65  t]..          se
238d0 74 20 76 61 6c 75 65 43 6f 75 6e 74 20 30 0d 0a  t valueCount 0..
238e0 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65  ..          obje
238f0 63 74 20 66 6f 72 65 61 63 68 20 2d 61 6c 69 61  ct foreach -alia
23900 73 20 70 61 69 72 20 24 73 65 74 74 69 6e 67 46  s pair $settingF
23910 69 6c 65 52 65 61 64 43 6f 75 6e 74 73 20 7b 0d  ileReadCounts {.
23920 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 63  .            inc
23930 72 20 76 61 6c 75 65 43 6f 75 6e 74 20 5b 24 70  r valueCount [$p
23940 61 69 72 20 56 61 6c 75 65 5d 0d 0a 0d 0a 20 20  air Value]....  
23950 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24            if {!$
23960 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
23970 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
23980 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
23990 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
239a0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
239b0 2d 2d 20 73 65 74 74 69 6e 67 20 5c 22 22 20 5b  -- setting \"" [
239c0 24 70 61 69 72 20 4b 65 79 5d 20 22 5c 22 20 77  $pair Key] "\" w
239d0 61 73 20 72 65 61 64 20 22 20 5c 0d 0a 20 20 20  as read " \..   
239e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b                 [
239f0 24 70 61 69 72 20 56 61 6c 75 65 5d 20 22 20 74  $pair Value] " t
23a00 69 6d 65 73 20 66 72 6f 6d 20 74 68 65 20 63 6f  imes from the co
23a10 6e 66 69 67 75 72 61 74 69 6f 6e 20 66 69 6c 65  nfiguration file
23a20 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  \n"]..          
23a30 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d    }..          }
23a40 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66  ....          if
23a50 20 7b 24 72 65 73 65 74 7d 20 74 68 65 6e 20 7b   {$reset} then {
23a60 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
23a70 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
23a80 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74            object
23a90 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b   invoke -flags +
23aa0 4e 6f 6e 50 75 62 6c 69 63 20 2d 61 6c 69 61 73  NonPublic -alias
23ab0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
23ac0 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74        System.Dat
23ad0 61 2e 53 51 4c 69 74 65 2e 44 65 62 75 67 44 61  a.SQLite.DebugDa
23ae0 74 61 20 43 6c 65 61 72 53 65 74 74 69 6e 67 52  ta ClearSettingR
23af0 65 61 64 43 6f 75 6e 74 73 20 74 72 75 65 0d 0a  eadCounts true..
23b00 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 72              } er
23b10 72 6f 72 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ror] == 0} then 
23b20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
23b30 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
23b40 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
23b50 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
23b60 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
23b70 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
23b80 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 72 65          "---- re
23b90 73 65 74 20 73 65 74 74 69 6e 67 20 73 74 61 74  set setting stat
23ba0 69 73 74 69 63 73 20 66 6f 72 20 74 68 65 20 70  istics for the p
23bb0 72 65 76 69 6f 75 73 20 22 20 5c 0d 0a 20 20 20  revious " \..   
23bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23bd0 20 24 6e 61 6d 65 43 6f 75 6e 74 20 22 20 6e 61   $nameCount " na
23be0 6d 65 73 20 61 6e 64 20 22 20 24 76 61 6c 75 65  mes and " $value
23bf0 43 6f 75 6e 74 20 22 20 76 61 6c 75 65 73 20 72  Count " values r
23c00 65 61 64 20 22 20 5c 0d 0a 20 20 20 20 20 20 20  ead " \..       
23c10 20 20 20 20 20 20 20 20 20 20 20 20 20 22 66 72               "fr
23c20 6f 6d 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61  om the configura
23c30 74 69 6f 6e 20 66 69 6c 65 5c 6e 22 5d 0d 0a 20  tion file\n"].. 
23c40 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
23c50 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c              } el
23c60 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
23c70 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
23c80 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
23c90 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
23ca0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
23cb0 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
23cc0 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d             "====
23cd0 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64   WARNING: failed
23ce0 20 74 6f 20 72 65 73 65 74 20 73 65 74 74 69 6e   to reset settin
23cf0 67 20 73 74 61 74 69 73 74 69 63 73 20 66 6f 72  g statistics for
23d00 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   " \..          
23d10 20 20 20 20 20 20 20 20 20 20 22 74 68 65 20 70            "the p
23d20 72 65 76 69 6f 75 73 20 22 20 24 6e 61 6d 65 43  revious " $nameC
23d30 6f 75 6e 74 20 22 20 6e 61 6d 65 73 20 61 6e 64  ount " names and
23d40 20 22 20 24 76 61 6c 75 65 43 6f 75 6e 74 20 5c   " $valueCount \
23d50 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
23d60 20 20 20 20 20 20 22 20 76 61 6c 75 65 73 20 72        " values r
23d70 65 61 64 20 66 72 6f 6d 20 74 68 65 20 63 6f 6e  ead from the con
23d80 66 69 67 75 72 61 74 69 6f 6e 20 66 69 6c 65 2c  figuration file,
23d90 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 5c   error: " \n\t \
23da0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
23db0 20 20 20 20 20 20 24 65 72 72 6f 72 20 5c 6e 5d        $error \n]
23dc0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
23dd0 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  }..            }
23de0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
23df0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
23e00 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
23e10 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65  ..          obje
23e20 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73  ct invoke -flags
23e30 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 2d 61 6c 69   +NonPublic -ali
23e40 61 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  as \..          
23e50 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e      System.Data.
23e60 53 51 4c 69 74 65 2e 44 65 62 75 67 44 61 74 61  SQLite.DebugData
23e70 20 47 65 74 4f 74 68 65 72 43 6f 75 6e 74 73 0d   GetOtherCounts.
23e80 0a 20 20 20 20 20 20 20 20 7d 20 6f 74 68 65 72  .        } other
23e90 43 6f 75 6e 74 73 5d 20 3d 3d 20 30 7d 20 74 68  Counts] == 0} th
23ea0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
23eb0 73 65 74 20 6e 61 6d 65 43 6f 75 6e 74 20 5b 24  set nameCount [$
23ec0 6f 74 68 65 72 43 6f 75 6e 74 73 20 43 6f 75 6e  otherCounts Coun
23ed0 74 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65  t]..          se
23ee0 74 20 76 61 6c 75 65 43 6f 75 6e 74 20 30 0d 0a  t valueCount 0..
23ef0 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65  ..          obje
23f00 63 74 20 66 6f 72 65 61 63 68 20 2d 61 6c 69 61  ct foreach -alia
23f10 73 20 70 61 69 72 20 24 6f 74 68 65 72 43 6f 75  s pair $otherCou
23f20 6e 74 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  nts {..         
23f30 20 20 20 69 6e 63 72 20 76 61 6c 75 65 43 6f 75     incr valueCou
23f40 6e 74 20 5b 24 70 61 69 72 20 56 61 6c 75 65 5d  nt [$pair Value]
23f50 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
23f60 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
23f70 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
23f80 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
23f90 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
23fa0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23fb0 20 20 20 22 2d 2d 2d 2d 20 6f 74 68 65 72 20 63     "---- other c
23fc0 6f 75 6e 74 65 72 20 5c 22 22 20 5b 24 70 61 69  ounter \"" [$pai
23fd0 72 20 4b 65 79 5d 20 22 5c 22 20 68 61 73 20 76  r Key] "\" has v
23fe0 61 6c 75 65 20 22 20 5c 0d 0a 20 20 20 20 20 20  alue " \..      
23ff0 20 20 20 20 20 20 20 20 20 20 20 20 5b 24 70 61              [$pa
24000 69 72 20 56 61 6c 75 65 5d 20 5c 6e 5d 0d 0a 20  ir Value] \n].. 
24010 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
24020 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
24030 20 20 20 20 20 20 20 69 66 20 7b 24 72 65 73 65         if {$rese
24040 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
24050 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
24060 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  h {..           
24070 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65     object invoke
24080 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c   -flags +NonPubl
24090 69 63 20 2d 61 6c 69 61 73 20 5c 0d 0a 20 20 20  ic -alias \..   
240a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
240b0 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
240c0 65 2e 44 65 62 75 67 44 61 74 61 20 43 6c 65 61  e.DebugData Clea
240d0 72 4f 74 68 65 72 43 6f 75 6e 74 73 0d 0a 20 20  rOtherCounts..  
240e0 20 20 20 20 20 20 20 20 20 20 7d 20 65 72 72 6f            } erro
240f0 72 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  r] == 0} then {.
24100 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
24110 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
24120 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
24130 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
24140 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
24150 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
24160 20 20 20 20 20 20 22 2d 2d 2d 2d 20 72 65 73 65        "---- rese
24170 74 20 6f 74 68 65 72 20 63 6f 75 6e 74 65 72 73  t other counters
24180 20 66 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75   for the previou
24190 73 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  s " \..         
241a0 20 20 20 20 20 20 20 20 20 20 20 24 6e 61 6d 65             $name
241b0 43 6f 75 6e 74 20 22 20 6e 61 6d 65 73 20 61 6e  Count " names an
241c0 64 20 22 20 24 76 61 6c 75 65 43 6f 75 6e 74 20  d " $valueCount 
241d0 22 20 76 61 6c 75 65 73 5c 6e 22 5d 0d 0a 20 20  " values\n"]..  
241e0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
241f0 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73             } els
24200 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e {..           
24210 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
24220 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
24230 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
24240 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
24250 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
24260 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20            "==== 
24270 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20  WARNING: failed 
24280 74 6f 20 72 65 73 65 74 20 6f 74 68 65 72 20 63  to reset other c
24290 6f 75 6e 74 65 72 73 20 66 6f 72 20 22 20 5c 0d  ounters for " \.
242a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
242b0 20 20 20 20 20 22 74 68 65 20 70 72 65 76 69 6f       "the previo
242c0 75 73 20 22 20 24 6e 61 6d 65 43 6f 75 6e 74 20  us " $nameCount 
242d0 22 20 6e 61 6d 65 73 20 61 6e 64 20 22 20 24 76  " names and " $v
242e0 61 6c 75 65 43 6f 75 6e 74 20 5c 0d 0a 20 20 20  alueCount \..   
242f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24300 20 22 20 76 61 6c 75 65 73 2c 20 65 72 72 6f 72   " values, error
24310 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20  : " \n\t $error 
24320 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  \n]..           
24330 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
24340 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d    }..          }
24350 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
24360 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66     }....      if
24370 20 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f 62 6a   {[haveSQLiteObj
24380 65 63 74 43 6f 6d 6d 61 6e 64 5d 20 26 26 20 5c  ectCommand] && \
24390 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 68 61 76  ..          [hav
243a0 65 53 51 4c 69 74 65 44 65 66 69 6e 65 43 6f 6e  eSQLiteDefineCon
243b0 73 74 61 6e 74 20 49 4e 54 45 52 4f 50 5f 56 49  stant INTEROP_VI
243c0 52 54 55 41 4c 5f 54 41 42 4c 45 5d 20 26 26 20  RTUAL_TABLE] && 
243d0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 68 61  \..          [ha
243e0 76 65 53 51 4c 69 74 65 44 65 66 69 6e 65 43 6f  veSQLiteDefineCo
243f0 6e 73 74 61 6e 74 20 54 52 41 43 4b 5f 4d 45 4d  nstant TRACK_MEM
24400 4f 52 59 5f 42 59 54 45 53 5d 7d 20 74 68 65 6e  ORY_BYTES]} then
24410 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   {..        if {
24420 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
24430 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
24440 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20   $channel "---- 
24450 63 75 72 72 65 6e 74 20 6d 65 6d 6f 72 79 20 69  current memory i
24460 6e 20 75 73 65 20 62 79 20 53 51 4c 69 74 65 4d  n use by SQLiteM
24470 65 6d 6f 72 79 2e 2e 2e 20 22 0d 0a 20 20 20 20  emory... "..    
24480 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
24490 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
244a0 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20           object 
244b0 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e  invoke -flags +N
244c0 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20  onPublic \..    
244d0 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d            System
244e0 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c  .Data.SQLite.SQL
244f0 69 74 65 4d 65 6d 6f 72 79 20 62 79 74 65 73 41  iteMemory bytesA
24500 6c 6c 6f 63 61 74 65 64 0d 0a 20 20 20 20 20 20  llocated..      
24510 20 20 7d 20 6d 65 6d 6f 72 79 5d 20 3d 3d 20 30    } memory] == 0
24520 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
24530 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
24540 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
24550 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
24560 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
24570 24 6d 65 6d 6f 72 79 20 22 20 62 79 74 65 73 5c  $memory " bytes\
24580 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  n"]..          }
24590 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65  ..        } else
245a0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   {..          se
245b0 74 20 6d 65 6d 6f 72 79 20 75 6e 6b 6e 6f 77 6e  t memory unknown
245c0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66  ....          if
245d0 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
245e0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
245f0 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
24600 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72  ppendArgs $memor
24610 79 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  y \n]..         
24620 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d   }..        }...
24630 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71  .        if {!$q
24640 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
24650 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
24660 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 6d 61 78  hannel "---- max
24670 69 6d 75 6d 20 6d 65 6d 6f 72 79 20 69 6e 20 75  imum memory in u
24680 73 65 20 62 79 20 53 51 4c 69 74 65 4d 65 6d 6f  se by SQLiteMemo
24690 72 79 2e 2e 2e 20 22 0d 0a 20 20 20 20 20 20 20  ry... "..       
246a0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66   }....        if
246b0 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
246c0 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76        object inv
246d0 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50  oke -flags +NonP
246e0 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20  ublic \..       
246f0 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61         System.Da
24700 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65  ta.SQLite.SQLite
24710 4d 65 6d 6f 72 79 20 6d 61 78 69 6d 75 6d 42 79  Memory maximumBy
24720 74 65 73 41 6c 6c 6f 63 61 74 65 64 0d 0a 20 20  tesAllocated..  
24730 20 20 20 20 20 20 7d 20 6d 65 6d 6f 72 79 5d 20        } memory] 
24740 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
24750 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
24760 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
24770 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
24780 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
24790 72 67 73 20 24 6d 65 6d 6f 72 79 20 22 20 62 79  rgs $memory " by
247a0 74 65 73 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20  tes\n"]..       
247b0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20     }..        } 
247c0 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
247d0 20 20 73 65 74 20 6d 65 6d 6f 72 79 20 75 6e 6b    set memory unk
247e0 6e 6f 77 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20  nown....        
247f0 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
24800 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
24810 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
24820 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d  l [appendArgs $m
24830 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20 20 20  emory \n]..     
24840 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
24850 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  }..      }....  
24860 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
24870 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
24880 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
24890 22 2d 2d 2d 2d 20 63 75 72 72 65 6e 74 20 6d 65  "---- current me
248a0 6d 6f 72 79 20 69 6e 20 75 73 65 20 62 79 20 53  mory in use by S
248b0 51 4c 69 74 65 2e 2e 2e 20 22 0d 0a 20 20 20 20  QLite... "..    
248c0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20    }....      if 
248d0 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f 62 6a 65  {[haveSQLiteObje
248e0 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65 6e  ctCommand]} then
248f0 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   {..        if {
24900 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
24910 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b      object invok
24920 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62  e -flags +NonPub
24930 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  lic \..         
24940 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61       System.Data
24950 2e 53 51 4c 69 74 65 2e 55 6e 73 61 66 65 4e 61  .SQLite.UnsafeNa
24960 74 69 76 65 4d 65 74 68 6f 64 73 20 73 71 6c 69  tiveMethods sqli
24970 74 65 33 5f 6d 65 6d 6f 72 79 5f 75 73 65 64 0d  te3_memory_used.
24980 0a 20 20 20 20 20 20 20 20 7d 20 6d 65 6d 6f 72  .        } memor
24990 79 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  y] == 0} then {.
249a0 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21  .          if {!
249b0 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
249c0 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
249d0 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
249e0 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 22  ndArgs $memory "
249f0 20 62 79 74 65 73 5c 6e 22 5d 0d 0a 20 20 20 20   bytes\n"]..    
24a00 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
24a10 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
24a20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
24a30 20 20 23 20 4e 4f 54 45 3a 20 4d 61 79 62 65 20    # NOTE: Maybe 
24a40 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20  the SQLite core 
24a50 6c 69 62 72 61 72 79 20 69 73 20 75 6e 61 76 61  library is unava
24a60 69 6c 61 62 6c 65 3f 0d 0a 20 20 20 20 20 20 20  ilable?..       
24a70 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
24a80 73 65 74 20 6d 65 6d 6f 72 79 20 75 6e 6b 6e 6f  set memory unkno
24a90 77 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  wn....          
24aa0 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
24ab0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
24ac0 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
24ad0 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d  [appendArgs $mem
24ae0 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ory \n]..       
24af0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
24b00 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
24b10 0a 20 20 20 20 20 20 20 20 73 65 74 20 6d 65 6d  .        set mem
24b20 6f 72 79 20 75 6e 61 76 61 69 6c 61 62 6c 65 0d  ory unavailable.
24b30 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21  ...        if {!
24b40 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
24b50 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
24b60 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
24b70 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d  Args $memory \n]
24b80 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
24b90 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 73 65     }....      se
24ba0 74 20 72 65 73 75 6c 74 20 24 6d 65 6d 6f 72 79  t result $memory
24bb0 3b 20 23 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e  ; # NOTE: Return
24bc0 20 6d 65 6d 6f 72 79 20 69 6e 2d 75 73 65 20 74   memory in-use t
24bd0 6f 20 6f 75 72 20 63 61 6c 6c 65 72 2e 0d 0a 0d  o our caller....
24be0 0a 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69  .      if {!$qui
24bf0 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
24c00 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
24c10 65 6c 20 22 2d 2d 2d 2d 20 6d 61 78 69 6d 75 6d  el "---- maximum
24c20 20 6d 65 6d 6f 72 79 20 69 6e 20 75 73 65 20 62   memory in use b
24c30 79 20 53 51 4c 69 74 65 2e 2e 2e 20 22 0d 0a 20  y SQLite... ".. 
24c40 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
24c50 69 66 20 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f  if {[haveSQLiteO
24c60 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74  bjectCommand]} t
24c70 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69  hen {..        i
24c80 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  f {[catch {..   
24c90 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e         object in
24ca0 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e  voke -flags +Non
24cb0 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20  Public \..      
24cc0 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44          System.D
24cd0 61 74 61 2e 53 51 4c 69 74 65 2e 55 6e 73 61 66  ata.SQLite.Unsaf
24ce0 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 20 5c  eNativeMethods \
24cf0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
24d00 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 68  sqlite3_memory_h
24d10 69 67 68 77 61 74 65 72 20 30 0d 0a 20 20 20 20  ighwater 0..    
24d20 20 20 20 20 7d 20 6d 65 6d 6f 72 79 5d 20 3d 3d      } memory] ==
24d30 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
24d40 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
24d50 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
24d60 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
24d70 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
24d80 73 20 24 6d 65 6d 6f 72 79 20 22 20 62 79 74 65  s $memory " byte
24d90 73 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20  s\n"]..         
24da0 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c   }..        } el
24db0 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
24dc0 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e  #..          # N
24dd0 4f 54 45 3a 20 4d 61 79 62 65 20 74 68 65 20 53  OTE: Maybe the S
24de0 51 4c 69 74 65 20 63 6f 72 65 20 6c 69 62 72 61  QLite core libra
24df0 72 79 20 69 73 20 75 6e 61 76 61 69 6c 61 62 6c  ry is unavailabl
24e00 65 3f 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  e?..          #.
24e10 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20 6d  .          set m
24e20 65 6d 6f 72 79 20 75 6e 6b 6e 6f 77 6e 0d 0a 0d  emory unknown...
24e30 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21  .          if {!
24e40 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
24e50 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
24e60 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
24e70 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 5c  ndArgs $memory \
24e80 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  n]..          }.
24e90 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
24ea0 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
24eb0 20 20 20 20 73 65 74 20 6d 65 6d 6f 72 79 20 75      set memory u
24ec0 6e 61 76 61 69 6c 61 62 6c 65 0d 0a 0d 0a 20 20  navailable....  
24ed0 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
24ee0 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
24ef0 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
24f00 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
24f10 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20  $memory \n]..   
24f20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
24f30 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 63 6f  ...      if {$co
24f40 6c 6c 65 63 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  llect} then {.. 
24f50 20 20 20 20 20 20 20 63 6f 6c 6c 65 63 74 47 61         collectGa
24f60 72 62 61 67 65 20 24 63 68 61 6e 6e 65 6c 0d 0a  rbage $channel..
24f70 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
24f80 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
24f90 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70  en {..        tp
24fa0 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d  uts $channel "--
24fb0 2d 2d 20 63 75 72 72 65 6e 74 20 6d 65 6d 6f 72  -- current memor
24fc0 79 20 69 6e 20 75 73 65 20 62 79 20 74 68 65 20  y in use by the 
24fd0 43 4c 52 2e 2e 2e 20 22 0d 0a 20 20 20 20 20 20  CLR... "..      
24fe0 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  }....      if {[
24ff0 68 61 76 65 53 51 4c 69 74 65 4f 62 6a 65 63 74  haveSQLiteObject
25000 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65 6e 20 7b  Command]} then {
25010 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63  ..        if {[c
25020 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
25030 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20    object invoke 
25040 47 43 20 47 65 74 54 6f 74 61 6c 4d 65 6d 6f 72  GC GetTotalMemor
25050 79 20 66 61 6c 73 65 0d 0a 20 20 20 20 20 20 20  y false..       
25060 20 7d 20 6d 65 6d 6f 72 79 5d 20 3d 3d 20 30 7d   } memory] == 0}
25070 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
25080 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 69     if {[string i
25090 73 20 69 6e 74 65 67 65 72 20 2d 73 74 72 69 63  s integer -stric
250a0 74 20 24 6d 65 6d 6f 72 79 5d 7d 20 74 68 65 6e  t $memory]} then
250b0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
250c0 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
250d0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
250e0 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
250f0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d  l [appendArgs $m
25100 65 6d 6f 72 79 20 22 20 62 79 74 65 73 5c 6e 22  emory " bytes\n"
25110 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ]..            }
25120 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c  ..          } el
25130 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
25140 20 20 73 65 74 20 6d 65 6d 6f 72 79 20 69 6e 76    set memory inv
25150 61 6c 69 64 0d 0a 0d 0a 20 20 20 20 20 20 20 20  alid....        
25160 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
25170 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
25180 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
25190 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
251a0 73 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20  s $memory \n].. 
251b0 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
251c0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
251d0 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
251e0 20 20 20 20 20 20 20 73 65 74 20 6d 65 6d 6f 72         set memor
251f0 79 20 75 6e 6b 6e 6f 77 6e 0d 0a 0d 0a 20 20 20  y unknown....   
25200 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
25210 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
25220 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
25230 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
25240 67 73 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a  gs $memory \n]..
25250 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
25260 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20       }..      } 
25270 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
25280 73 65 74 20 6d 65 6d 6f 72 79 20 75 6e 61 76 61  set memory unava
25290 69 6c 61 62 6c 65 0d 0a 0d 0a 20 20 20 20 20 20  ilable....      
252a0 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
252b0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
252c0 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
252d0 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d  [appendArgs $mem
252e0 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ory \n]..       
252f0 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20   }..      }.... 
25300 20 20 20 20 20 72 65 74 75 72 6e 20 24 72 65 73       return $res
25310 75 6c 74 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20  ult..    }..... 
25320 20 20 20 70 72 6f 63 20 72 65 73 65 74 53 51 4c     proc resetSQL
25330 69 74 65 44 69 72 65 63 74 6f 72 69 65 73 20 7b  iteDirectories {
25340 20 63 68 61 6e 6e 65 6c 20 6e 61 74 69 76 65 20   channel native 
25350 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
25360 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65      # NOTE: Atte
25370 6d 70 74 20 74 6f 20 75 73 65 20 74 68 65 20 6e  mpt to use the n
25380 61 74 69 76 65 20 41 50 49 20 28 76 69 61 20 74  ative API (via t
25390 68 65 20 6d 61 6e 61 67 65 64 20 61 73 73 65 6d  he managed assem
253a0 62 6c 79 29 3f 0d 0a 20 20 20 20 20 20 23 0d 0a  bly)?..      #..
253b0 20 20 20 20 20 20 69 66 20 7b 24 6e 61 74 69 76        if {$nativ
253c0 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  e} then {..     
253d0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
253e0 4e 4f 54 45 3a 20 4e 6f 77 20 6d 61 6b 65 20 73  NOTE: Now make s
253f0 75 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ure the database
25400 20 61 6e 64 20 74 65 6d 70 6f 72 61 72 79 20 64   and temporary d
25410 69 72 65 63 74 6f 72 69 65 73 20 61 72 65 0d 0a  irectories are..
25420 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
25430 72 65 73 65 74 20 74 68 65 69 72 20 64 65 66 61  reset their defa
25440 75 6c 74 20 76 61 6c 75 65 73 2c 20 77 68 69 63  ult values, whic
25450 68 20 73 68 6f 75 6c 64 20 62 65 20 6e 75 6c 6c  h should be null
25460 20 66 6f 72 20 62 6f 74 68 2e 0d 0a 20 20 20 20   for both...    
25470 20 20 20 20 23 20 20 20 20 20 20 20 53 69 6e 63      #       Sinc
25480 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f 77 69  e the sqlite3_wi
25490 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72  n32_set_director
254a0 79 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 76  y function is av
254b0 61 69 6c 61 62 6c 65 2c 0d 0a 20 20 20 20 20 20  ailable,..      
254c0 20 20 23 20 20 20 20 20 20 20 75 73 65 20 69 74    #       use it
254d0 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
254e0 20 20 20 20 20 20 66 6f 72 20 7b 73 65 74 20 69        for {set i
254f0 6e 64 65 78 20 31 7d 20 7b 24 69 6e 64 65 78 20  ndex 1} {$index 
25500 3c 20 33 7d 20 7b 69 6e 63 72 20 69 6e 64 65 78  < 3} {incr index
25510 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69  } {..          i
25520 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  f {[catch {..   
25530 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20           object 
25540 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e  invoke -flags +N
25550 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20  onPublic \..    
25560 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74              Syst
25570 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 55  em.Data.SQLite.U
25580 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f  nsafeNativeMetho
25590 64 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ds \..          
255a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 77 69        sqlite3_wi
255b0 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72  n32_set_director
255c0 79 20 24 69 6e 64 65 78 20 6e 75 6c 6c 0d 0a 20  y $index null.. 
255d0 20 20 20 20 20 20 20 20 20 7d 20 72 65 73 75 6c           } resul
255e0 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  t] == 0} then {.
255f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
25600 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
25610 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
25620 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
25630 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f 77 69   call sqlite3_wi
25640 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72  n32_set_director
25650 79 28 22 20 24 69 6e 64 65 78 20 5c 0d 0a 20 20  y(" $index \..  
25660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2c                ",
25670 20 6e 75 6c 6c 29 2e 2e 2e 20 6f 6b 3a 20 22 20   null)... ok: " 
25680 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20  $result \n]..   
25690 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
256a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
256b0 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
256c0 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
256d0 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
256e0 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f 77 69   call sqlite3_wi
256f0 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72  n32_set_director
25700 79 28 22 20 24 69 6e 64 65 78 20 5c 0d 0a 20 20  y(" $index \..  
25710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2c                ",
25720 20 6e 75 6c 6c 29 2e 2e 2e 20 65 72 72 6f 72 3a   null)... error:
25730 20 22 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20   " \n\t $result 
25740 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  \n]..          }
25750 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
25760 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
25770 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
25780 23 20 4e 4f 54 45 3a 20 4e 6f 77 20 6d 61 6b 65  # NOTE: Now make
25790 20 73 75 72 65 20 74 68 65 20 64 61 74 61 62 61   sure the databa
257a0 73 65 20 61 6e 64 20 74 65 6d 70 6f 72 61 72 79  se and temporary
257b0 20 64 69 72 65 63 74 6f 72 69 65 73 20 61 72 65   directories are
257c0 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
257d0 20 20 72 65 73 65 74 20 74 68 65 69 72 20 64 65    reset their de
257e0 66 61 75 6c 74 20 76 61 6c 75 65 73 2c 20 77 68  fault values, wh
257f0 69 63 68 20 73 68 6f 75 6c 64 20 62 65 20 6e 75  ich should be nu
25800 6c 6c 20 66 6f 72 20 62 6f 74 68 2e 0d 0a 20 20  ll for both...  
25810 20 20 20 20 20 20 23 20 20 20 20 20 20 20 53 69        #       Si
25820 6e 63 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f  nce the sqlite3_
25830 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74  win32_set_direct
25840 6f 72 79 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  ory function doe
25850 73 20 6e 6f 74 0d 0a 20 20 20 20 20 20 20 20 23  s not..        #
25860 20 20 20 20 20 20 20 61 70 70 65 61 72 20 74 6f         appear to
25870 20 62 65 20 61 76 61 69 6c 61 62 6c 65 2c 20 75   be available, u
25880 73 65 20 74 68 65 20 61 73 73 6f 63 69 61 74 65  se the associate
25890 64 20 50 52 41 47 4d 41 20 63 6f 6d 6d 61 6e 64  d PRAGMA command
258a0 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  s..        #    
258b0 20 20 20 69 6e 73 74 65 61 64 2e 0d 0a 20 20 20     instead...   
258c0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
258d0 66 6f 72 65 61 63 68 20 64 69 72 65 63 74 6f 72  foreach director
258e0 79 20 5b 6c 69 73 74 20 64 61 74 61 5f 73 74 6f  y [list data_sto
258f0 72 65 5f 64 69 72 65 63 74 6f 72 79 20 74 65 6d  re_directory tem
25900 70 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72  p_store_director
25910 79 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  y] {..          
25920 73 65 74 20 73 71 6c 20 5b 61 70 70 65 6e 64 41  set sql [appendA
25930 72 67 73 20 22 50 52 41 47 4d 41 20 22 20 24 64  rgs "PRAGMA " $d
25940 69 72 65 63 74 6f 72 79 20 22 20 3d 20 5c 22 5c  irectory " = \"\
25950 22 3b 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ";"]....        
25960 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 65 78    if {[catch {ex
25970 65 63 75 74 65 53 71 6c 20 24 73 71 6c 7d 20 72  ecuteSql $sql} r
25980 65 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65  esult] == 0} the
25990 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
259a0 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
259b0 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
259c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
259d0 2d 2d 2d 2d 20 65 78 65 63 75 74 65 20 50 52 41  ---- execute PRA
259e0 47 4d 41 20 22 20 24 64 69 72 65 63 74 6f 72 79  GMA " $directory
259f0 20 22 2e 2e 2e 20 6f 6b 3a 20 5c 22 22 20 5c 0d   "... ok: \"" \.
25a00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25a10 20 24 72 65 73 75 6c 74 20 5c 22 5c 6e 5d 0d 0a   $result \"\n]..
25a20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
25a30 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
25a40 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
25a50 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
25a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
25a70 2d 2d 2d 20 65 78 65 63 75 74 65 20 50 52 41 47  --- execute PRAG
25a80 4d 41 20 22 20 24 64 69 72 65 63 74 6f 72 79 20  MA " $directory 
25a90 22 2e 2e 2e 20 65 72 72 6f 72 3a 20 22 20 5c 0d  "... error: " \.
25aa0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25ab0 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e   \n\t $result \n
25ac0 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ]..          }..
25ad0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
25ae0 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
25af0 20 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72 53    proc checkForS
25b00 51 4c 69 74 65 44 69 72 65 63 74 6f 72 69 65 73  QLiteDirectories
25b10 20 7b 20 63 68 61 6e 6e 65 6c 20 7b 72 65 73 65   { channel {rese
25b20 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20  t false} } {..  
25b30 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
25b40 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20 74 68  OTE: Check if th
25b50 65 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  e sqlite3_win32_
25b60 73 65 74 5f 64 69 72 65 63 74 6f 72 79 20 66 75  set_directory fu
25b70 6e 63 74 69 6f 6e 20 69 73 20 61 76 61 69 6c 61  nction is availa
25b80 62 6c 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ble...      #.. 
25b90 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
25ba0 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  nel \..         
25bb0 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20   "---- checking 
25bc0 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20 73 71 6c  for function sql
25bd0 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64  ite3_win32_set_d
25be0 69 72 65 63 74 6f 72 79 2e 2e 2e 20 22 0d 0a 0d  irectory... "...
25bf0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
25c00 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 63 61 6c  # NOTE: This cal
25c10 6c 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33  l to the sqlite3
25c20 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63  _win32_set_direc
25c30 74 6f 72 79 20 66 75 6e 63 74 69 6f 6e 20 75 73  tory function us
25c40 65 73 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20  es the..      # 
25c50 20 20 20 20 20 20 69 6e 76 61 6c 69 64 20 76 61        invalid va
25c60 6c 75 65 20 30 20 66 6f 72 20 74 68 65 20 66 69  lue 0 for the fi
25c70 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 20 54  rst argument.  T
25c80 68 69 73 20 63 6f 64 65 20 69 73 20 64 65 73 69  his code is desi
25c90 67 6e 65 64 0d 0a 20 20 20 20 20 20 23 20 20 20  gned..      #   
25ca0 20 20 20 20 74 6f 20 63 68 65 63 6b 20 69 66 20      to check if 
25cb0 63 61 6c 6c 69 6e 67 20 74 68 65 20 66 75 6e 63  calling the func
25cc0 74 69 6f 6e 20 77 69 6c 6c 20 72 61 69 73 65 20  tion will raise 
25cd0 61 6e 20 65 78 63 65 70 74 69 6f 6e 20 28 69 2e  an exception (i.
25ce0 65 2e 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  e...      #     
25cf0 20 20 74 68 65 20 61 63 74 75 61 6c 20 72 65 73    the actual res
25d00 75 6c 74 20 6f 66 20 74 68 65 20 66 75 6e 63 74  ult of the funct
25d10 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74  ion does not mat
25d20 74 65 72 20 61 73 20 6c 6f 6e 67 20 61 73 20 6e  ter as long as n
25d30 6f 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  o..      #      
25d40 20 64 69 72 65 63 74 6f 72 79 20 69 73 20 63 68   directory is ch
25d50 61 6e 67 65 64 29 2e 0d 0a 20 20 20 20 20 20 23  anged)...      #
25d60 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 73 57  ..      if {[isW
25d70 69 6e 64 6f 77 73 5d 20 26 26 20 5b 63 61 74 63  indows] && [catc
25d80 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a  h {..        obj
25d90 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67  ect invoke -flag
25da0 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a  s +NonPublic \..
25db0 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74              Syst
25dc0 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 55  em.Data.SQLite.U
25dd0 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f  nsafeNativeMetho
25de0 64 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ds \..          
25df0 20 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f    sqlite3_win32_
25e00 73 65 74 5f 64 69 72 65 63 74 6f 72 79 20 30 20  set_directory 0 
25e10 6e 75 6c 6c 0d 0a 20 20 20 20 20 20 7d 5d 20 3d  null..      }] =
25e20 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
25e30 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
25e40 23 20 4e 4f 54 45 3a 20 43 61 6c 6c 69 6e 67 20  # NOTE: Calling 
25e50 74 68 65 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  the sqlite3_win3
25e60 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79 20  2_set_directory 
25e70 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  function does no
25e80 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  t..        #    
25e90 20 20 20 63 61 75 73 65 20 61 6e 20 65 78 63 65     cause an exce
25ea0 70 74 69 6f 6e 3b 20 74 68 65 72 65 66 6f 72 65  ption; therefore
25eb0 2c 20 69 74 20 6d 75 73 74 20 62 65 20 61 76 61  , it must be ava
25ec0 69 6c 61 62 6c 65 20 28 69 2e 65 2e 0d 0a 20 20  ilable (i.e...  
25ed0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 65 76        #       ev
25ee0 65 6e 20 74 68 6f 75 67 68 20 69 74 20 73 68 6f  en though it sho
25ef0 75 6c 64 20 72 65 74 75 72 6e 20 61 20 66 61 69  uld return a fai
25f00 6c 75 72 65 20 72 65 74 75 72 6e 20 63 6f 64 65  lure return code
25f10 20 69 6e 20 74 68 69 73 0d 0a 20 20 20 20 20 20   in this..      
25f20 20 20 23 20 20 20 20 20 20 20 63 61 73 65 29 2e    #       case).
25f30 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
25f40 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
25f50 6e 74 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32  nt sqlite3_win32
25f60 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79 0d 0a  _set_directory..
25f70 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
25f80 24 63 68 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a  $channel yes\n..
25f90 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
25fa0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 44 6f 65       # NOTE: Doe
25fb0 73 20 6f 75 72 20 63 61 6c 6c 65 72 20 77 61 6e  s our caller wan
25fc0 74 20 74 6f 20 72 65 73 65 74 20 74 68 65 20 64  t to reset the d
25fd0 69 72 65 63 74 6f 72 69 65 73 3f 0d 0a 20 20 20  irectories?..   
25fe0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
25ff0 69 66 20 7b 24 72 65 73 65 74 7d 20 74 68 65 6e  if {$reset} then
26000 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65   {..          re
26010 73 65 74 53 51 4c 69 74 65 44 69 72 65 63 74 6f  setSQLiteDirecto
26020 72 69 65 73 20 24 63 68 61 6e 6e 65 6c 20 74 72  ries $channel tr
26030 75 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  ue..        }.. 
26040 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
26050 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
26060 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 0d 0a 20 20  annel no\n....  
26070 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
26080 20 23 20 4e 4f 54 45 3a 20 44 6f 65 73 20 6f 75   # NOTE: Does ou
26090 72 20 63 61 6c 6c 65 72 20 77 61 6e 74 20 74 6f  r caller want to
260a0 20 72 65 73 65 74 20 74 68 65 20 64 69 72 65 63   reset the direc
260b0 74 6f 72 69 65 73 3f 20 20 54 68 69 73 20 63 61  tories?  This ca
260c0 6e 20 6f 6e 6c 79 0d 0a 20 20 20 20 20 20 20 20  n only..        
260d0 23 20 20 20 20 20 20 20 62 65 20 70 65 72 66 6f  #       be perfo
260e0 72 6d 65 64 20 69 66 20 53 51 4c 69 74 65 20 69  rmed if SQLite i
260f0 73 20 6c 6f 61 64 65 64 20 61 6e 64 20 72 65 61  s loaded and rea
26100 64 79 20 66 6f 72 20 75 73 65 20 62 79 20 74 68  dy for use by th
26110 65 20 74 65 73 74 0d 0a 20 20 20 20 20 20 20 20  e test..        
26120 23 20 20 20 20 20 20 20 73 75 69 74 65 2e 0d 0a  #       suite...
26130 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
26140 20 20 20 69 66 20 7b 24 72 65 73 65 74 20 26 26     if {$reset &&
26150 20 5b 69 73 53 51 4c 69 74 65 52 65 61 64 79 5d   [isSQLiteReady]
26160 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
26170 20 20 20 20 72 65 73 65 74 53 51 4c 69 74 65 44      resetSQLiteD
26180 69 72 65 63 74 6f 72 69 65 73 20 24 63 68 61 6e  irectories $chan
26190 6e 65 6c 20 66 61 6c 73 65 0d 0a 20 20 20 20 20  nel false..     
261a0 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d     }..      }...
261b0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
261c0 23 20 4e 4f 54 45 3a 20 46 69 6e 61 6c 6c 79 2c  # NOTE: Finally,
261d0 20 73 68 6f 77 20 74 68 65 20 63 75 72 72 65 6e   show the curren
261e0 74 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 64  t value of the d
261f0 61 74 61 62 61 73 65 20 61 6e 64 20 74 65 6d 70  atabase and temp
26200 6f 72 61 72 79 0d 0a 20 20 20 20 20 20 23 20 20  orary..      #  
26210 20 20 20 20 20 64 69 72 65 63 74 6f 72 69 65 73       directories
26220 2e 20 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79  .  This can only
26230 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20 69 66   be performed if
26240 20 53 51 4c 69 74 65 20 69 73 20 6c 6f 61 64 65   SQLite is loade
26250 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  d..      #      
26260 20 61 6e 64 20 72 65 61 64 79 20 66 6f 72 20 75   and ready for u
26270 73 65 20 62 79 20 74 68 65 20 74 65 73 74 20 73  se by the test s
26280 75 69 74 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  uite...      #..
26290 20 20 20 20 20 20 69 66 20 7b 5b 69 73 53 51 4c        if {[isSQL
262a0 69 74 65 52 65 61 64 79 5d 7d 20 74 68 65 6e 20  iteReady]} then 
262b0 7b 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61  {..        forea
262c0 63 68 20 64 69 72 65 63 74 6f 72 79 20 5b 6c 69  ch directory [li
262d0 73 74 20 64 61 74 61 5f 73 74 6f 72 65 5f 64 69  st data_store_di
262e0 72 65 63 74 6f 72 79 20 74 65 6d 70 5f 73 74 6f  rectory temp_sto
262f0 72 65 5f 64 69 72 65 63 74 6f 72 79 5d 20 7b 0d  re_directory] {.
26300 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
26310 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
26320 64 41 72 67 73 20 22 2d 2d 2d 2d 20 63 68 65 63  dArgs "---- chec
26330 6b 69 6e 67 20 22 20 24 64 69 72 65 63 74 6f 72  king " $director
26340 79 20 22 2e 2e 2e 20 22 5d 0d 0a 0d 0a 20 20 20  y "... "]....   
26350 20 20 20 20 20 20 20 73 65 74 20 73 71 6c 20 5b         set sql [
26360 61 70 70 65 6e 64 41 72 67 73 20 22 50 52 41 47  appendArgs "PRAG
26370 4d 41 20 22 20 24 64 69 72 65 63 74 6f 72 79 20  MA " $directory 
26380 5c 3b 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  \;]....         
26390 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 65 78 65   if {[catch {exe
263a0 63 75 74 65 53 71 6c 20 24 73 71 6c 20 73 63 61  cuteSql $sql sca
263b0 6c 61 72 7d 20 72 65 73 75 6c 74 5d 20 3d 3d 20  lar} result] == 
263c0 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
263d0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
263e0 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
263f0 73 20 22 6f 6b 3a 20 5c 22 22 20 24 72 65 73 75  s "ok: \"" $resu
26400 6c 74 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20  lt \"\n]..      
26410 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
26420 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
26430 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
26440 41 72 67 73 20 22 65 72 72 6f 72 3a 20 22 20 5c  Args "error: " \
26450 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d  n\t $result \n].
26460 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
26470 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
26480 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
26490 70 72 6f 63 20 6c 6f 61 64 53 51 4c 69 74 65 54  proc loadSQLiteT
264a0 65 73 74 53 65 74 74 69 6e 67 73 20 7b 20 63 68  estSettings { ch
264b0 61 6e 6e 65 6c 20 7b 73 75 66 66 69 78 20 22 22  annel {suffix ""
264c0 7d 20 7b 71 75 69 65 74 20 66 61 6c 73 65 7d 20  } {quiet false} 
264d0 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
264e0 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70      # NOTE: Skip
264f0 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 73 65 74   loading the set
26500 74 69 6e 67 73 20 69 66 20 74 68 65 69 72 20 75  tings if their u
26510 73 61 67 65 20 68 61 73 20 62 65 65 6e 20 64 69  sage has been di
26520 73 61 62 6c 65 64 2e 0d 0a 20 20 20 20 20 20 23  sabled...      #
26530 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e  ..      if {![in
26540 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 73  fo exists ::no(s
26550 71 6c 69 74 65 54 65 73 74 53 65 74 74 69 6e 67  qliteTestSetting
26560 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  s)]} then {..   
26570 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
26580 23 20 4e 4f 54 45 3a 20 4c 6f 61 64 20 63 75 73  # NOTE: Load cus
26590 74 6f 6d 20 70 65 72 2d 75 73 65 72 20 61 6e 64  tom per-user and
265a0 2f 6f 72 20 70 65 72 2d 68 6f 73 74 20 74 65 73  /or per-host tes
265b0 74 20 73 65 74 74 69 6e 67 73 20 6e 6f 77 2e 0d  t settings now..
265c0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
265d0 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
265e0 69 73 74 73 20 3a 3a 74 63 6c 5f 70 6c 61 74 66  ists ::tcl_platf
265f0 6f 72 6d 28 75 73 65 72 29 5d 7d 20 74 68 65 6e  orm(user)]} then
26600 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   {..          se
26610 74 20 75 73 65 72 53 65 74 74 69 6e 67 73 46 69  t userSettingsFi
26620 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69  leName [file joi
26630 6e 20 5b 67 65 74 43 6f 6d 6d 6f 6e 44 69 72 65  n [getCommonDire
26640 63 74 6f 72 79 5d 20 5c 0d 0a 20 20 20 20 20 20  ctory] \..      
26650 20 20 20 20 20 20 20 20 5b 61 70 70 65 6e 64 41          [appendA
26660 72 67 73 20 73 65 74 74 69 6e 67 73 20 24 73 75  rgs settings $su
26670 66 66 69 78 20 2e 20 24 3a 3a 74 63 6c 5f 70 6c  ffix . $::tcl_pl
26680 61 74 66 6f 72 6d 28 75 73 65 72 29 20 2e 65 61  atform(user) .ea
26690 67 6c 65 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  gle]]....       
266a0 20 20 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69     if {[file exi
266b0 73 74 73 20 24 75 73 65 72 53 65 74 74 69 6e 67  sts $userSetting
266c0 73 46 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e  sFileName]} then
266d0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
266e0 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
266f0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
26700 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
26710 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
26720 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26730 20 20 20 22 2d 2d 2d 2d 20 6c 6f 61 64 69 6e 67     "---- loading
26740 20 70 65 72 2d 75 73 65 72 20 74 65 73 74 20 73   per-user test s
26750 65 74 74 69 6e 67 73 20 66 69 6c 65 20 5c 22 22  ettings file \""
26760 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
26770 20 20 20 20 20 20 24 75 73 65 72 53 65 74 74 69        $userSetti
26780 6e 67 73 46 69 6c 65 4e 61 6d 65 20 5c 22 2e 2e  ngsFileName \"..
26790 2e 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  .\n]..          
267a0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
267b0 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d     if {[catch {.
267c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 75  .              u
267d0 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74 20 73  plevel 1 [list s
267e0 6f 75 72 63 65 20 24 75 73 65 72 53 65 74 74 69  ource $userSetti
267f0 6e 67 73 46 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20  ngsFileName]..  
26800 20 20 20 20 20 20 20 20 20 20 7d 20 65 72 72 6f            } erro
26810 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  r]} then {..    
26820 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24            if {!$
26830 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
26840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
26850 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
26860 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
26870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26880 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20   "==== WARNING: 
26890 66 61 69 6c 65 64 20 74 6f 20 6c 6f 61 64 20 70  failed to load p
268a0 65 72 2d 75 73 65 72 20 73 65 74 74 69 6e 67 73  er-user settings
268b0 20 66 69 6c 65 20 5c 22 22 20 5c 0d 0a 20 20 20   file \"" \..   
268c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
268d0 20 24 75 73 65 72 53 65 74 74 69 6e 67 73 46 69   $userSettingsFi
268e0 6c 65 4e 61 6d 65 20 22 5c 22 2c 20 65 72 72 6f  leName "\", erro
268f0 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72  r: " \n\t $error
26900 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \n]..          
26910 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
26920 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
26930 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
26940 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
26950 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
26960 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
26970 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
26980 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
26990 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73           "---- s
269a0 6b 69 70 70 65 64 20 6c 6f 61 64 69 6e 67 20 70  kipped loading p
269b0 65 72 2d 75 73 65 72 20 74 65 73 74 20 73 65 74  er-user test set
269c0 74 69 6e 67 73 20 66 69 6c 65 20 5c 22 22 20 5c  tings file \"" \
269d0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
269e0 20 20 20 20 24 75 73 65 72 53 65 74 74 69 6e 67      $userSetting
269f0 73 46 69 6c 65 4e 61 6d 65 20 22 5c 22 2c 20 69  sFileName "\", i
26a00 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  t does not exist
26a10 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  \n"]..          
26a20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d    }..          }
26a30 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
26a40 20 20 20 20 20 20 20 23 23 23 23 23 23 23 23 23         #########
26a50 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
26a60 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
26a70 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
26a80 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a  ##############..
26a90 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69  ..        if {[i
26aa0 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 63 6c  nfo exists ::tcl
26ab0 5f 70 6c 61 74 66 6f 72 6d 28 68 6f 73 74 29 5d  _platform(host)]
26ac0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
26ad0 20 20 20 20 73 65 74 20 68 6f 73 74 53 65 74 74      set hostSett
26ae0 69 6e 67 73 46 69 6c 65 4e 61 6d 65 20 5b 66 69  ingsFileName [fi
26af0 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 43 6f 6d 6d  le join [getComm
26b00 6f 6e 44 69 72 65 63 74 6f 72 79 5d 20 5c 0d 0a  onDirectory] \..
26b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 61                [a
26b20 70 70 65 6e 64 41 72 67 73 20 73 65 74 74 69 6e  ppendArgs settin
26b30 67 73 20 24 73 75 66 66 69 78 20 2e 20 24 3a 3a  gs $suffix . $::
26b40 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 68 6f 73  tcl_platform(hos
26b50 74 29 20 2e 65 61 67 6c 65 5d 5d 0d 0a 0d 0a 20  t) .eagle]].... 
26b60 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 66 69           if {[fi
26b70 6c 65 20 65 78 69 73 74 73 20 24 68 6f 73 74 53  le exists $hostS
26b80 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 5d  ettingsFileName]
26b90 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
26ba0 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
26bb0 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
26bc0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
26bd0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
26be0 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
26bf0 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6c           "---- l
26c00 6f 61 64 69 6e 67 20 70 65 72 2d 68 6f 73 74 20  oading per-host 
26c10 74 65 73 74 20 73 65 74 74 69 6e 67 73 20 66 69  test settings fi
26c20 6c 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20  le \"" \..      
26c30 20 20 20 20 20 20 20 20 20 20 20 20 24 68 6f 73              $hos
26c40 74 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d  tSettingsFileNam
26c50 65 20 5c 22 2e 2e 2e 5c 6e 5d 0d 0a 20 20 20 20  e \"...\n]..    
26c60 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
26c70 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61           if {[ca
26c80 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
26c90 20 20 20 20 20 75 70 6c 65 76 65 6c 20 31 20 5b       uplevel 1 [
26ca0 6c 69 73 74 20 73 6f 75 72 63 65 20 24 68 6f 73  list source $hos
26cb0 74 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d  tSettingsFileNam
26cc0 65 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e]..            
26cd0 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b  } error]} then {
26ce0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
26cf0 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
26d00 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
26d10 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
26d20 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
26d30 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
26d40 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52         "==== WAR
26d50 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20  NING: failed to 
26d60 6c 6f 61 64 20 70 65 72 2d 68 6f 73 74 20 73 65  load per-host se
26d70 74 74 69 6e 67 73 20 66 69 6c 65 20 5c 22 22 20  ttings file \"" 
26d80 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
26d90 20 20 20 20 20 20 20 24 68 6f 73 74 53 65 74 74         $hostSett
26da0 69 6e 67 73 46 69 6c 65 4e 61 6d 65 20 22 5c 22  ingsFileName "\"
26db0 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20  , error: " \n\t 
26dc0 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20  $error \n]..    
26dd0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
26de0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
26df0 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
26e00 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
26e10 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
26e20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  .              t
26e30 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
26e40 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
26e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
26e60 2d 2d 2d 2d 20 73 6b 69 70 70 65 64 20 6c 6f 61  ---- skipped loa
26e70 64 69 6e 67 20 70 65 72 2d 68 6f 73 74 20 74 65  ding per-host te
26e80 73 74 20 73 65 74 74 69 6e 67 73 20 66 69 6c 65  st settings file
26e90 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20   \"" \..        
26ea0 20 20 20 20 20 20 20 20 20 20 24 68 6f 73 74 53            $hostS
26eb0 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 20  ettingsFileName 
26ec0 22 5c 22 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74  "\", it does not
26ed0 20 65 78 69 73 74 5c 6e 22 5d 0d 0a 20 20 20 20   exist\n"]..    
26ee0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
26ef0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
26f00 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  }..      }..    
26f10 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63  }.....    proc c
26f20 6f 70 79 53 61 6d 70 6c 65 44 61 74 61 62 61 73  opySampleDatabas
26f30 65 46 69 6c 65 73 20 7b 7d 20 7b 0d 0a 20 20 20  eFiles {} {..   
26f40 20 20 20 75 70 6c 65 76 65 6c 20 31 20 7b 0d 0a     uplevel 1 {..
26f50 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
26f60 20 20 20 23 20 4e 4f 54 45 3a 20 43 6f 70 79 20     # NOTE: Copy 
26f70 28 6f 72 20 72 65 2d 63 6f 70 79 29 20 74 68 65  (or re-copy) the
26f80 20 72 65 66 65 72 65 6e 63 65 20 64 61 74 61 62   reference datab
26f90 61 73 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f  ase file used fo
26fa0 72 20 74 68 69 73 0d 0a 20 20 20 20 20 20 20 20  r this..        
26fb0 23 20 20 20 20 20 20 20 75 6e 69 74 20 74 65 73  #       unit tes
26fc0 74 20 74 6f 20 74 68 65 20 62 75 69 6c 64 20 64  t to the build d
26fd0 69 72 65 63 74 6f 72 79 20 69 6e 20 63 61 73 65  irectory in case
26fe0 20 69 74 20 68 61 73 20 62 65 65 6e 20 63 68 61   it has been cha
26ff0 6e 67 65 64 0d 0a 20 20 20 20 20 20 20 20 23 20  nged..        # 
27000 20 20 20 20 20 20 62 79 20 61 20 70 72 65 76 69        by a previ
27010 6f 75 73 20 74 65 73 74 20 72 75 6e 2e 0d 0a 20  ous test run... 
27020 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
27030 20 20 66 69 6c 65 20 63 6f 70 79 20 2d 66 6f 72    file copy -for
27040 63 65 20 24 6e 6f 72 74 68 77 69 6e 64 45 66 44  ce $northwindEfD
27050 62 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20  bFile \..       
27060 20 20 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67     [file join [g
27070 65 74 42 75 69 6c 64 44 69 72 65 63 74 6f 72 79  etBuildDirectory
27080 20 74 72 75 65 5d 20 5b 66 69 6c 65 20 74 61 69   true] [file tai
27090 6c 20 24 6e 6f 72 74 68 77 69 6e 64 45 66 44 62  l $northwindEfDb
270a0 46 69 6c 65 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d  File]]..      }.
270b0 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
270c0 72 6f 63 20 6d 6f 76 65 54 65 73 74 4c 6f 67 46  roc moveTestLogF
270d0 69 6c 65 20 7b 20 70 61 74 68 20 7d 20 7b 0d 0a  ile { path } {..
270e0 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20        if {[info 
270f0 65 78 69 73 74 73 20 3a 3a 74 65 73 74 5f 6c 6f  exists ::test_lo
27100 67 5d 20 26 26 20 5b 66 69 6c 65 20 65 78 69 73  g] && [file exis
27110 74 73 20 24 3a 3a 74 65 73 74 5f 6c 6f 67 5d 7d  ts $::test_log]}
27120 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
27130 20 73 65 74 20 6f 6c 64 5f 74 65 73 74 5f 6c 6f   set old_test_lo
27140 67 20 24 3a 3a 74 65 73 74 5f 6c 6f 67 0d 0a 20  g $::test_log.. 
27150 20 20 20 20 20 20 20 73 65 74 20 6e 65 77 5f 74         set new_t
27160 65 73 74 5f 6c 6f 67 20 5b 66 69 6c 65 20 6a 6f  est_log [file jo
27170 69 6e 20 24 70 61 74 68 20 5b 66 69 6c 65 20 74  in $path [file t
27180 61 69 6c 20 24 6f 6c 64 5f 74 65 73 74 5f 6c 6f  ail $old_test_lo
27190 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 66  g]]....        f
271a0 69 6c 65 20 63 6f 70 79 20 24 6f 6c 64 5f 74 65  ile copy $old_te
271b0 73 74 5f 6c 6f 67 20 24 6e 65 77 5f 74 65 73 74  st_log $new_test
271c0 5f 6c 6f 67 3b 20 66 69 6c 65 20 64 65 6c 65 74  _log; file delet
271d0 65 20 24 6f 6c 64 5f 74 65 73 74 5f 6c 6f 67 0d  e $old_test_log.
271e0 0a 20 20 20 20 20 20 20 20 73 65 74 20 3a 3a 74  .        set ::t
271f0 65 73 74 5f 6c 6f 67 20 24 6e 65 77 5f 74 65 73  est_log $new_tes
27200 74 5f 6c 6f 67 0d 0a 0d 0a 20 20 20 20 20 20 20  t_log....       
27210 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
27220 73 20 3a 3a 74 65 73 74 5f 6c 6f 67 5f 70 61 74  s ::test_log_pat
27230 68 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  h]} then {..    
27240 20 20 20 20 20 20 73 65 74 20 3a 3a 74 65 73 74        set ::test
27250 5f 6c 6f 67 5f 70 61 74 68 20 24 70 61 74 68 0d  _log_path $path.
27260 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
27270 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
27280 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
27290 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
272a0 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6d 6f 76         "---- mov
272b0 65 64 20 74 65 73 74 20 6c 6f 67 20 66 72 6f 6d  ed test log from
272c0 20 5c 22 22 20 24 6f 6c 64 5f 74 65 73 74 5f 6c   \"" $old_test_l
272d0 6f 67 20 22 5c 22 20 74 6f 20 5c 22 22 20 5c 0d  og "\" to \"" \.
272e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 24 6e 65  .            $ne
272f0 77 5f 74 65 73 74 5f 6c 6f 67 20 5c 22 5c 6e 5d  w_test_log \"\n]
27300 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
27310 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 73 68  .....    proc sh
27320 6f 77 53 51 4c 69 74 65 42 75 69 6c 64 50 61 72  owSQLiteBuildPar
27330 61 6d 65 74 65 72 73 20 7b 20 63 68 61 6e 6e 65  ameters { channe
27340 6c 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a  l } {..      #..
27350 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68        # NOTE: Ch
27360 65 63 6b 20 69 66 20 74 68 65 20 6e 61 74 69 76  eck if the nativ
27370 65 20 62 75 69 6c 64 20 66 6c 61 67 20 68 61 73  e build flag has
27380 20 62 65 65 6e 20 66 6f 72 63 69 62 6c 79 20 73   been forcibly s
27390 65 74 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  et...      #..  
273a0 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
273b0 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  el \..          
273c0 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66  "---- checking f
273d0 6f 72 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  or System.Data.S
273e0 51 4c 69 74 65 20 62 75 69 6c 64 20 6e 61 74 69  QLite build nati
273f0 76 65 20 6f 76 65 72 72 69 64 65 2e 2e 2e 20 22  ve override... "
27400 0d 0a 0d 0a 20 20 20 20 20 20 73 65 74 20 6e 61  ....      set na
27410 74 69 76 65 20 5b 67 65 74 42 75 69 6c 64 4e 61  tive [getBuildNa
27420 74 69 76 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 69  tive]....      i
27430 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  f {[string lengt
27440 68 20 24 6e 61 74 69 76 65 5d 20 3e 20 30 7d 20  h $native] > 0} 
27450 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
27460 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61  addConstraint [a
27470 70 70 65 6e 64 41 72 67 73 20 62 75 69 6c 64 4e  ppendArgs buildN
27480 61 74 69 76 65 2e 20 24 6e 61 74 69 76 65 5d 0d  ative. $native].
27490 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
274a0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
274b0 72 67 73 20 5c 22 20 24 6e 61 74 69 76 65 20 5c  rgs \" $native \
274c0 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c  "\n]..      } el
274d0 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 61 64  se {..        ad
274e0 64 43 6f 6e 73 74 72 61 69 6e 74 20 62 75 69 6c  dConstraint buil
274f0 64 4e 61 74 69 76 65 2e 6e 6f 6e 65 0d 0a 20 20  dNative.none..  
27500 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
27510 6e 6e 65 6c 20 3c 6e 6f 6e 65 3e 5c 6e 0d 0a 20  nnel <none>\n.. 
27520 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
27530 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
27540 20 43 68 65 63 6b 20 74 68 65 20 63 75 72 72 65   Check the curre
27550 6e 74 20 62 75 69 6c 64 20 79 65 61 72 2e 20 20  nt build year.  
27560 42 61 73 69 63 61 6c 6c 79 2c 20 74 68 69 73 20  Basically, this 
27570 69 6e 64 69 63 61 74 65 73 0d 0a 20 20 20 20 20  indicates..     
27580 20 23 20 20 20 20 20 20 20 77 68 69 63 68 20 76   #       which v
27590 65 72 73 69 6f 6e 20 6f 66 20 4d 53 42 75 69 6c  ersion of MSBuil
275a0 64 20 61 6e 64 2f 6f 72 20 56 69 73 75 61 6c 20  d and/or Visual 
275b0 53 74 75 64 69 6f 20 77 61 73 20 75 73 65 64 20  Studio was used 
275c0 74 6f 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  to..      #     
275d0 20 20 63 6f 6d 70 69 6c 65 20 74 68 65 20 61 73    compile the as
275e0 73 65 6d 62 6c 79 20 62 69 6e 61 72 69 65 73 20  sembly binaries 
275f0 75 6e 64 65 72 20 74 65 73 74 2e 0d 0a 20 20 20  under test...   
27600 20 20 20 23 0d 0a 20 20 20 20 20 20 74 70 75 74     #..      tput
27610 73 20 24 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20  s $channel \..  
27620 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68          "---- ch
27630 65 63 6b 69 6e 67 20 66 6f 72 20 53 79 73 74 65  ecking for Syste
27640 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 62 75  m.Data.SQLite bu
27650 69 6c 64 20 79 65 61 72 2e 2e 2e 20 22 0d 0a 0d  ild year... "...
27660 0a 20 20 20 20 20 20 73 65 74 20 79 65 61 72 20  .      set year 
27670 5b 67 65 74 42 75 69 6c 64 59 65 61 72 5d 0d 0a  [getBuildYear]..
27680 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72  ..      if {[str
27690 69 6e 67 20 6c 65 6e 67 74 68 20 24 79 65 61 72  ing length $year
276a0 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
276b0 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72         addConstr
276c0 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
276d0 20 62 75 69 6c 64 59 65 61 72 2e 20 24 79 65 61   buildYear. $yea
276e0 72 5d 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74  r]..        tput
276f0 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
27700 6e 64 41 72 67 73 20 5c 22 20 24 79 65 61 72 20  ndArgs \" $year 
27710 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 20 65  \"\n]..      } e
27720 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 61  lse {..        a
27730 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 62 75 69  ddConstraint bui
27740 6c 64 59 65 61 72 2e 6e 6f 6e 65 0d 0a 20 20 20  ldYear.none..   
27750 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
27760 6e 65 6c 20 3c 6e 6f 6e 65 3e 5c 6e 0d 0a 20 20  nel <none>\n..  
27770 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 74      }....      t
27780 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5c 0d  puts $channel \.
27790 0a 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d  .          "----
277a0 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 53 79   checking for Sy
277b0 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
277c0 20 62 75 69 6c 64 20 6e 61 74 69 76 65 20 79 65   build native ye
277d0 61 72 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20  ar... "....     
277e0 20 73 65 74 20 79 65 61 72 20 5b 67 65 74 42 75   set year [getBu
277f0 69 6c 64 4e 61 74 69 76 65 59 65 61 72 5d 0d 0a  ildNativeYear]..
27800 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72  ..      if {[str
27810 69 6e 67 20 6c 65 6e 67 74 68 20 24 79 65 61 72  ing length $year
27820 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
27830 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72         addConstr
27840 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
27850 20 62 75 69 6c 64 4e 61 74 69 76 65 59 65 61 72   buildNativeYear
27860 2e 20 24 79 65 61 72 5d 0d 0a 20 20 20 20 20 20  . $year]..      
27870 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
27880 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 22 20   [appendArgs \" 
27890 24 79 65 61 72 20 5c 22 5c 6e 5d 0d 0a 20 20 20  $year \"\n]..   
278a0 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
278b0 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
278c0 6e 74 20 62 75 69 6c 64 4e 61 74 69 76 65 59 65  nt buildNativeYe
278d0 61 72 2e 6e 6f 6e 65 0d 0a 20 20 20 20 20 20 20  ar.none..       
278e0 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
278f0 3c 6e 6f 6e 65 3e 5c 6e 0d 0a 20 20 20 20 20 20  <none>\n..      
27900 7d 0d 0a 0d 0a 20 20 20 20 20 20 74 70 75 74 73  }....      tputs
27910 20 24 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20   $channel \..   
27920 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65         "---- che
27930 63 6b 69 6e 67 20 66 6f 72 20 53 79 73 74 65 6d  cking for System
27940 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 62 75 69  .Data.SQLite bui
27950 6c 64 20 70 6c 61 74 66 6f 72 6d 2e 2e 2e 20 22  ld platform... "
27960 0d 0a 0d 0a 20 20 20 20 20 20 73 65 74 20 70 6c  ....      set pl
27970 61 74 66 6f 72 6d 20 5b 67 65 74 42 75 69 6c 64  atform [getBuild
27980 50 6c 61 74 66 6f 72 6d 20 74 72 75 65 5d 0d 0a  Platform true]..
27990 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72  ..      if {[str
279a0 69 6e 67 20 6c 65 6e 67 74 68 20 24 70 6c 61 74  ing length $plat
279b0 66 6f 72 6d 5d 20 3e 20 30 7d 20 74 68 65 6e 20  form] > 0} then 
279c0 7b 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f  {..        addCo
279d0 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64  nstraint [append
279e0 41 72 67 73 20 62 75 69 6c 64 50 6c 61 74 66 6f  Args buildPlatfo
279f0 72 6d 2e 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a  rm. $platform]..
27a00 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
27a10 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
27a20 67 73 20 5c 22 20 24 70 6c 61 74 66 6f 72 6d 20  gs \" $platform 
27a30 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 20 65  \"\n]..      } e
27a40 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 61  lse {..        a
27a50 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 62 75 69  ddConstraint bui
27a60 6c 64 50 6c 61 74 66 6f 72 6d 2e 6e 6f 6e 65 0d  ldPlatform.none.
27a70 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
27a80 63 68 61 6e 6e 65 6c 20 3c 6e 6f 6e 65 3e 5c 6e  channel <none>\n
27a90 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
27aa0 20 20 20 73 65 74 20 61 72 63 68 69 74 65 63 74     set architect
27ab0 75 72 65 20 5b 61 72 63 68 69 74 65 63 74 75 72  ure [architectur
27ac0 65 46 6f 72 50 6c 61 74 66 6f 72 6d 20 24 70 6c  eForPlatform $pl
27ad0 61 74 66 6f 72 6d 5d 0d 0a 0d 0a 20 20 20 20 20  atform]....     
27ae0 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
27af0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 22 2d 2d  \..          "--
27b00 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20  -- checking for 
27b10 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
27b20 74 65 20 62 75 69 6c 64 20 61 72 63 68 69 74 65  te build archite
27b30 63 74 75 72 65 2e 2e 2e 20 22 0d 0a 0d 0a 20 20  cture... "....  
27b40 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
27b50 6c 65 6e 67 74 68 20 24 61 72 63 68 69 74 65 63  length $architec
27b60 74 75 72 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20  ture] > 0} then 
27b70 7b 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f  {..        addCo
27b80 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64  nstraint [append
27b90 41 72 67 73 20 62 75 69 6c 64 41 72 63 68 69 74  Args buildArchit
27ba0 65 63 74 75 72 65 2e 20 24 61 72 63 68 69 74 65  ecture. $archite
27bb0 63 74 75 72 65 5d 0d 0a 20 20 20 20 20 20 20 20  cture]..        
27bc0 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
27bd0 61 70 70 65 6e 64 41 72 67 73 20 5c 22 20 24 61  appendArgs \" $a
27be0 72 63 68 69 74 65 63 74 75 72 65 20 5c 22 5c 6e  rchitecture \"\n
27bf0 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  ]..      } else 
27c00 7b 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f  {..        addCo
27c10 6e 73 74 72 61 69 6e 74 20 62 75 69 6c 64 41 72  nstraint buildAr
27c20 63 68 69 74 65 63 74 75 72 65 2e 6e 6f 6e 65 0d  chitecture.none.
27c30 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
27c40 63 68 61 6e 6e 65 6c 20 3c 6e 6f 6e 65 3e 5c 6e  channel <none>\n
27c50 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
27c60 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
27c70 54 45 3a 20 43 68 65 63 6b 20 74 68 65 20 63 75  TE: Check the cu
27c80 72 72 65 6e 74 20 62 75 69 6c 64 20 2e 4e 45 54  rrent build .NET
27c90 20 46 72 61 6d 65 77 6f 72 6b 2e 20 20 42 61 73   Framework.  Bas
27ca0 69 63 61 6c 6c 79 2c 20 74 68 69 73 0d 0a 20 20  ically, this..  
27cb0 20 20 20 20 23 20 20 20 20 20 20 20 69 6e 64 69      #       indi
27cc0 63 61 74 65 73 20 77 68 69 63 68 20 76 65 72 73  cates which vers
27cd0 69 6f 6e 20 6f 66 20 74 68 65 20 2e 4e 45 54 20  ion of the .NET 
27ce0 46 72 61 6d 65 77 6f 72 6b 20 69 73 20 62 65 69  Framework is bei
27cf0 6e 67 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ng..      #     
27d00 20 20 75 73 65 64 20 62 79 20 74 68 65 20 61 73    used by the as
27d10 73 65 6d 62 6c 79 20 62 69 6e 61 72 69 65 73 20  sembly binaries 
27d20 75 6e 64 65 72 20 74 65 73 74 2e 0d 0a 20 20 20  under test...   
27d30 20 20 20 23 0d 0a 20 20 20 20 20 20 74 70 75 74     #..      tput
27d40 73 20 24 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20  s $channel \..  
27d50 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68          "---- ch
27d60 65 63 6b 69 6e 67 20 66 6f 72 20 53 79 73 74 65  ecking for Syste
27d70 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 62 75  m.Data.SQLite bu
27d80 69 6c 64 20 2e 4e 45 54 20 46 72 61 6d 65 77 6f  ild .NET Framewo
27d90 72 6b 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20  rk... "....     
27da0 20 73 65 74 20 6e 65 74 46 78 20 5b 67 65 74 42   set netFx [getB
27db0 75 69 6c 64 4e 65 74 46 78 5d 0d 0a 0d 0a 20 20  uildNetFx]....  
27dc0 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
27dd0 6c 65 6e 67 74 68 20 24 6e 65 74 46 78 5d 20 3e  length $netFx] >
27de0 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
27df0 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e      addConstrain
27e00 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 62 75  t [appendArgs bu
27e10 69 6c 64 46 72 61 6d 65 77 6f 72 6b 2e 20 24 6e  ildFramework. $n
27e20 65 74 46 78 5d 0d 0a 20 20 20 20 20 20 20 20 74  etFx]..        t
27e30 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
27e40 70 70 65 6e 64 41 72 67 73 20 5c 22 20 24 6e 65  ppendArgs \" $ne
27e50 74 46 78 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20  tFx \"\n]..     
27e60 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
27e70 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74     addConstraint
27e80 20 62 75 69 6c 64 46 72 61 6d 65 77 6f 72 6b 2e   buildFramework.
27e90 6e 6f 6e 65 0d 0a 20 20 20 20 20 20 20 20 74 70  none..        tp
27ea0 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 3c 6e 6f  uts $channel <no
27eb0 6e 65 3e 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a  ne>\n..      }..
27ec0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
27ed0 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 74   # NOTE: Check t
27ee0 68 65 20 63 75 72 72 65 6e 74 20 62 75 69 6c 64  he current build
27ef0 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 20   configuration. 
27f00 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f 72   This should nor
27f10 6d 61 6c 6c 79 0d 0a 20 20 20 20 20 20 23 20 20  mally..      #  
27f20 20 20 20 20 20 62 65 20 65 69 74 68 65 72 20 22       be either "
27f30 44 65 62 75 67 22 20 6f 72 20 22 52 65 6c 65 61  Debug" or "Relea
27f40 73 65 22 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  se"...      #.. 
27f50 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
27f60 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  nel \..         
27f70 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20   "---- checking 
27f80 66 6f 72 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  for System.Data.
27f90 53 51 4c 69 74 65 20 62 75 69 6c 64 20 63 6f 6e  SQLite build con
27fa0 66 69 67 75 72 61 74 69 6f 6e 2e 2e 2e 20 22 0d  figuration... ".
27fb0 0a 0d 0a 20 20 20 20 20 20 73 65 74 20 63 6f 6e  ...      set con
27fc0 66 69 67 75 72 61 74 69 6f 6e 20 5b 67 65 74 42  figuration [getB
27fd0 75 69 6c 64 43 6f 6e 66 69 67 75 72 61 74 69 6f  uildConfiguratio
27fe0 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b  n]....      if {
27ff0 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
28000 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 5d 20 3e  configuration] >
28010 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
28020 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e      addConstrain
28030 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 62 75  t [appendArgs bu
28040 69 6c 64 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e  ildConfiguration
28050 2e 20 24 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  . $configuration
28060 5d 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  ]..        tputs
28070 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
28080 64 41 72 67 73 20 5c 22 20 24 63 6f 6e 66 69 67  dArgs \" $config
28090 75 72 61 74 69 6f 6e 20 5c 22 5c 6e 5d 0d 0a 20  uration \"\n].. 
280a0 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
280b0 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72         addConstr
280c0 61 69 6e 74 20 62 75 69 6c 64 43 6f 6e 66 69 67  aint buildConfig
280d0 75 72 61 74 69 6f 6e 2e 6e 6f 6e 65 0d 0a 20 20  uration.none..  
280e0 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
280f0 6e 6e 65 6c 20 3c 6e 6f 6e 65 3e 5c 6e 0d 0a 20  nnel <none>\n.. 
28100 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
28110 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
28120 20 43 68 65 63 6b 20 74 68 65 20 63 75 72 72 65   Check the curre
28130 6e 74 20 62 75 69 6c 64 20 63 6f 6e 66 69 67 75  nt build configu
28140 72 61 74 69 6f 6e 20 73 75 66 66 69 78 2e 20 20  ration suffix.  
28150 54 68 69 73 20 77 69 6c 6c 0d 0a 20 20 20 20 20  This will..     
28160 20 23 20 20 20 20 20 20 20 6e 6f 72 6d 61 6c 6c   #       normall
28170 79 20 62 65 20 65 69 74 68 65 72 20 22 4e 65 74  y be either "Net
28180 53 74 61 6e 64 61 72 64 32 30 22 20 6f 72 20 22  Standard20" or "
28190 4e 65 74 53 74 61 6e 64 61 72 64 32 31 22 20 6f  NetStandard21" o
281a0 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  r..      #      
281b0 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67   an empty string
281c0 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
281d0 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
281e0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 22 2d   \..          "-
281f0 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72  --- checking for
28200 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
28210 69 74 65 20 62 75 69 6c 64 20 63 6f 6e 66 69 67  ite build config
28220 75 72 61 74 69 6f 6e 20 73 75 66 66 69 78 2e 2e  uration suffix..
28230 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 73 65 74  . "....      set
28240 20 73 75 66 66 69 78 20 5b 67 65 74 42 75 69 6c   suffix [getBuil
28250 64 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 53 75  dConfigurationSu
28260 66 66 69 78 5d 0d 0a 0d 0a 20 20 20 20 20 20 69  ffix]....      i
28270 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  f {[string lengt
28280 68 20 24 73 75 66 66 69 78 5d 20 3e 20 30 7d 20  h $suffix] > 0} 
28290 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
282a0 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61  addConstraint [a
282b0 70 70 65 6e 64 41 72 67 73 20 62 75 69 6c 64 43  ppendArgs buildC
282c0 6f 6e 66 69 67 75 72 61 74 69 6f 6e 53 75 66 66  onfigurationSuff
282d0 69 78 2e 20 24 73 75 66 66 69 78 5d 0d 0a 20 20  ix. $suffix]..  
282e0 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
282f0 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
28300 20 5c 22 20 24 73 75 66 66 69 78 20 5c 22 5c 6e   \" $suffix \"\n
28310 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  ]..      } else 
28320 7b 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f  {..        addCo
28330 6e 73 74 72 61 69 6e 74 20 62 75 69 6c 64 43 6f  nstraint buildCo
28340 6e 66 69 67 75 72 61 74 69 6f 6e 53 75 66 66 69  nfigurationSuffi
28350 78 2e 6e 6f 6e 65 0d 0a 20 20 20 20 20 20 20 20  x.none..        
28360 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 3c  tputs $channel <
28370 6e 6f 6e 65 3e 5c 6e 0d 0a 20 20 20 20 20 20 7d  none>\n..      }
28380 0d 0a 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20  ....      tputs 
28390 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
283a0 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
283b0 20 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67    "---- checking
283c0 20 66 6f 72 20 53 79 73 74 65 6d 2e 44 61 74 61   for System.Data
283d0 2e 53 51 4c 69 74 65 20 62 75 69 6c 64 20 6e 61  .SQLite build na
283e0 74 69 76 65 20 63 6f 6e 66 69 67 75 72 61 74 69  tive configurati
283f0 6f 6e 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20  on " \..        
28400 20 20 22 73 75 66 66 69 78 2e 2e 2e 20 22 5d 0d    "suffix... "].
28410 0a 0d 0a 20 20 20 20 20 20 73 65 74 20 73 75 66  ...      set suf
28420 66 69 78 20 5b 67 65 74 42 75 69 6c 64 4e 61 74  fix [getBuildNat
28430 69 76 65 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e  iveConfiguration
28440 53 75 66 66 69 78 5d 0d 0a 0d 0a 20 20 20 20 20  Suffix]....     
28450 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
28460 67 74 68 20 24 73 75 66 66 69 78 5d 20 3e 20 30  gth $suffix] > 0
28470 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
28480 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20    addConstraint 
28490 5b 61 70 70 65 6e 64 41 72 67 73 20 62 75 69 6c  [appendArgs buil
284a0 64 4e 61 74 69 76 65 43 6f 6e 66 69 67 75 72 61  dNativeConfigura
284b0 74 69 6f 6e 53 75 66 66 69 78 2e 20 24 73 75 66  tionSuffix. $suf
284c0 66 69 78 5d 0d 0a 20 20 20 20 20 20 20 20 74 70  fix]..        tp
284d0 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
284e0 70 65 6e 64 41 72 67 73 20 5c 22 20 24 73 75 66  pendArgs \" $suf
284f0 66 69 78 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20  fix \"\n]..     
28500 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
28510 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74     addConstraint
28520 20 62 75 69 6c 64 4e 61 74 69 76 65 43 6f 6e 66   buildNativeConf
28530 69 67 75 72 61 74 69 6f 6e 53 75 66 66 69 78 2e  igurationSuffix.
28540 6e 6f 6e 65 0d 0a 20 20 20 20 20 20 20 20 74 70  none..        tp
28550 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 3c 6e 6f  uts $channel <no
28560 6e 65 3e 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a  ne>\n..      }..
28570 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
28580 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 74   # NOTE: Check t
28590 68 65 20 63 75 72 72 65 6e 74 20 62 75 69 6c 64  he current build
285a0 20 65 78 74 72 61 20 64 69 72 65 63 74 6f 72 79   extra directory
285b0 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 6e 6f 72  .  This will nor
285c0 6d 61 6c 6c 79 0d 0a 20 20 20 20 20 20 23 20 20  mally..      #  
285d0 20 20 20 20 20 62 65 20 65 69 74 68 65 72 20 22       be either "
285e0 6e 65 74 73 74 61 6e 64 61 72 64 32 2e 30 22 20  netstandard2.0" 
285f0 6f 72 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69  or an empty stri
28600 6e 67 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ng...      #..  
28610 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
28620 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  el \..          
28630 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66  "---- checking f
28640 6f 72 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  or System.Data.S
28650 51 4c 69 74 65 20 62 75 69 6c 64 20 65 78 74 72  QLite build extr
28660 61 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20  a... "....      
28670 73 65 74 20 65 78 74 72 61 20 5b 67 65 74 42 75  set extra [getBu
28680 69 6c 64 45 78 74 72 61 5d 0d 0a 0d 0a 20 20 20  ildExtra]....   
28690 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
286a0 65 6e 67 74 68 20 24 65 78 74 72 61 5d 20 3e 20  ength $extra] > 
286b0 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
286c0 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74     addConstraint
286d0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 62 75 69   [appendArgs bui
286e0 6c 64 45 78 74 72 61 2e 20 24 65 78 74 72 61 5d  ldExtra. $extra]
286f0 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
28700 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
28710 41 72 67 73 20 5c 22 20 24 65 78 74 72 61 20 5c  Args \" $extra \
28720 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c  "\n]..      } el
28730 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 61 64  se {..        ad
28740 64 43 6f 6e 73 74 72 61 69 6e 74 20 62 75 69 6c  dConstraint buil
28750 64 45 78 74 72 61 2e 6e 6f 6e 65 0d 0a 20 20 20  dExtra.none..   
28760 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
28770 6e 65 6c 20 3c 6e 6f 6e 65 3e 5c 6e 0d 0a 20 20  nel <none>\n..  
28780 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
28790 0a 20 20 20 20 70 72 6f 63 20 72 75 6e 53 51 4c  .    proc runSQL
287a0 69 74 65 54 65 73 74 50 72 6f 6c 6f 67 75 65 20  iteTestPrologue 
287b0 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20  {} {..      #.. 
287c0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69       # NOTE: Ski
287d0 70 20 72 75 6e 6e 69 6e 67 20 6f 75 72 20 63 75  p running our cu
287e0 73 74 6f 6d 20 70 72 6f 6c 6f 67 75 65 20 69 66  stom prologue if
287f0 20 74 68 65 20 6d 61 69 6e 20 6f 6e 65 20 68 61   the main one ha
28800 73 20 62 65 65 6e 0d 0a 20 20 20 20 20 20 23 20  s been..      # 
28810 20 20 20 20 20 20 73 6b 69 70 70 65 64 2e 0d 0a        skipped...
28820 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
28830 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
28840 20 3a 3a 6e 6f 28 70 72 6f 6c 6f 67 75 65 2e 65   ::no(prologue.e
28850 61 67 6c 65 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  agle)]} then {..
28860 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
28870 20 20 20 23 20 4e 4f 54 45 3a 20 53 61 76 65 20     # NOTE: Save 
28880 74 68 65 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20  the environment 
28890 76 61 72 69 61 62 6c 65 73 20 74 68 61 74 20 77  variables that w
288a0 65 20 69 6e 74 65 6e 64 20 74 6f 20 63 68 61 6e  e intend to chan
288b0 67 65 20 66 6f 72 0d 0a 20 20 20 20 20 20 20 20  ge for..        
288c0 23 20 20 20 20 20 20 20 74 68 65 20 74 65 73 74  #       the test
288d0 20 73 75 69 74 65 2e 0d 0a 20 20 20 20 20 20 20   suite...       
288e0 20 23 0d 0a 20 20 20 20 20 20 20 20 73 61 76 65   #..        save
288f0 45 6e 76 69 72 6f 6e 6d 65 6e 74 56 61 72 69 61  EnvironmentVaria
28900 62 6c 65 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  bles \..        
28910 20 20 20 20 5b 6c 69 73 74 20 49 6e 69 74 69 61      [list Initia
28920 6c 69 7a 65 5f 53 51 4c 69 74 65 4c 6f 67 5d 20  lize_SQLiteLog] 
28930 3a 3a 74 65 73 74 53 75 69 74 65 53 61 76 65 64  ::testSuiteSaved
28940 45 6e 76 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23  Env....        #
28950 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
28960 3a 20 46 6f 72 63 65 20 74 68 65 20 6d 61 6e 61  : Force the mana
28970 67 65 64 20 6c 6f 67 67 69 6e 67 20 73 75 62 73  ged logging subs
28980 79 73 74 65 6d 20 74 6f 20 61 74 74 65 6d 70 74  ystem to attempt
28990 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 0d 0a   to initialize..
289a0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
289b0 69 74 73 65 6c 66 20 6d 6f 72 65 20 74 68 61 6e  itself more than
289c0 20 6f 6e 63 65 2e 0d 0a 20 20 20 20 20 20 20 20   once...        
289d0 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 3a  #..        set :
289e0 3a 65 6e 76 28 49 6e 69 74 69 61 6c 69 7a 65 5f  :env(Initialize_
289f0 53 51 4c 69 74 65 4c 6f 67 29 20 31 0d 0a 0d 0a  SQLiteLog) 1....
28a00 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
28a10 20 20 20 23 20 4e 4f 54 45 3a 20 4c 6f 61 64 20     # NOTE: Load 
28a20 74 68 65 20 22 62 65 66 6f 72 65 2d 63 6f 6e 73  the "before-cons
28a30 74 72 61 69 6e 74 73 22 20 63 75 73 74 6f 6d 20  traints" custom 
28a40 70 65 72 2d 75 73 65 72 20 61 6e 64 2f 6f 72 20  per-user and/or 
28a50 70 65 72 2d 68 6f 73 74 0d 0a 20 20 20 20 20 20  per-host..      
28a60 20 20 23 20 20 20 20 20 20 20 74 65 73 74 20 73    #       test s
28a70 65 74 74 69 6e 67 73 20 6e 6f 77 2e 0d 0a 20 20  ettings now...  
28a80 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
28a90 20 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74   uplevel 1 [list
28aa0 20 6c 6f 61 64 53 51 4c 69 74 65 54 65 73 74 53   loadSQLiteTestS
28ab0 65 74 74 69 6e 67 73 20 24 3a 3a 74 65 73 74 5f  ettings $::test_
28ac0 63 68 61 6e 6e 65 6c 20 2e 62 65 66 6f 72 65 5d  channel .before]
28ad0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
28ae0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53         # NOTE: S
28af0 68 6f 77 20 28 61 6e 64 20 6c 6f 67 29 20 74 68  how (and log) th
28b00 65 20 67 6c 6f 62 61 6c 20 70 61 72 61 6d 65 74  e global paramet
28b10 65 72 73 20 74 68 61 74 20 63 6f 6e 74 72 6f 6c  ers that control
28b20 20 77 68 65 72 65 20 74 68 65 0d 0a 20 20 20 20   where the..    
28b30 20 20 20 20 23 20 20 20 20 20 20 20 62 75 69 6c      #       buil
28b40 64 20 64 69 72 65 63 74 6f 72 79 20 73 68 6f 75  d directory shou
28b50 6c 64 20 62 65 2e 0d 0a 20 20 20 20 20 20 20 20  ld be...        
28b60 23 0d 0a 20 20 20 20 20 20 20 20 73 68 6f 77 53  #..        showS
28b70 51 4c 69 74 65 42 75 69 6c 64 50 61 72 61 6d 65  QLiteBuildParame
28b80 74 65 72 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  ters $::test_cha
28b90 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20 20 20 20  nnel....        
28ba0 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
28bb0 45 3a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20  E: Check if the 
28bc0 5b 6f 62 6a 65 63 74 5d 20 63 6f 6d 6d 61 6e 64  [object] command
28bd0 20 69 73 20 61 76 61 69 6c 61 62 6c 65 3b 20 69   is available; i
28be0 66 20 6e 6f 74 2c 20 61 64 64 20 73 6f 6d 65 0d  f not, add some.
28bf0 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
28c00 20 73 68 69 6d 73 20 74 6f 20 6d 61 6b 65 20 74   shims to make t
28c10 68 65 20 74 65 73 74 20 73 75 69 74 65 20 72 75  he test suite ru
28c20 6e 20 73 6d 6f 6f 74 68 65 72 2e 0d 0a 20 20 20  n smoother...   
28c30 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
28c40 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 4f 62  checkForSQLiteOb
28c50 6a 65 63 74 43 6f 6d 6d 61 6e 64 20 24 3a 3a 74  jectCommand $::t
28c60 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20  est_channel.... 
28c70 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
28c80 20 20 23 20 4e 4f 54 45 3a 20 44 65 74 65 72 6d    # NOTE: Determ
28c90 69 6e 65 20 74 68 65 20 6e 61 6d 65 73 20 6f 66  ine the names of
28ca0 20 74 68 65 20 6e 61 74 69 76 65 20 70 6c 61 74   the native plat
28cb0 66 6f 72 6d 20 61 6e 64 20 61 72 63 68 69 74 65  form and archite
28cc0 63 74 75 72 65 2e 0d 0a 20 20 20 20 20 20 20 20  cture...        
28cd0 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 70  #..        set p
28ce0 6c 61 74 66 6f 72 6d 20 5b 67 65 74 42 75 69 6c  latform [getBuil
28cf0 64 50 6c 61 74 66 6f 72 6d 20 74 72 75 65 5d 0d  dPlatform true].
28d00 0a 20 20 20 20 20 20 20 20 73 65 74 20 61 72 63  .        set arc
28d10 68 69 74 65 63 74 75 72 65 20 5b 61 72 63 68 69  hitecture [archi
28d20 74 65 63 74 75 72 65 46 6f 72 50 6c 61 74 66 6f  tectureForPlatfo
28d30 72 6d 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a 0d  rm $platform]...
28d40 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
28d50 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c      # NOTE: Buil
28d60 64 20 61 20 6c 69 73 74 20 6f 66 20 63 6f 6e 66  d a list of conf
28d70 69 67 75 72 61 74 69 6f 6e 20 66 69 6c 65 73 20  iguration files 
28d80 74 68 61 74 20 77 65 20 68 61 6e 64 6c 65 2e 0d  that we handle..
28d90 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
28da0 20 20 20 20 73 65 74 20 63 6f 6e 66 69 67 46 69      set configFi
28db0 6c 65 4e 61 6d 65 73 20 5b 6c 69 73 74 20 5c 0d  leNames [list \.
28dc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73  .            Sys
28dd0 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
28de0 64 6c 6c 2e 63 6f 6e 66 69 67 5d 0d 0a 0d 0a 20  dll.config].... 
28df0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
28e00 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20    # NOTE: Build 
28e10 61 20 6c 69 73 74 20 6f 66 20 61 75 78 69 6c 69  a list of auxili
28e20 61 72 79 20 4d 61 6e 61 67 65 64 20 44 65 62 75  ary Managed Debu
28e30 67 67 69 6e 67 20 41 73 73 69 73 74 61 6e 74 73  gging Assistants
28e40 20 28 4d 44 41 29 0d 0a 20 20 20 20 20 20 20 20   (MDA)..        
28e50 23 20 20 20 20 20 20 20 63 6f 6e 66 69 67 75 72  #       configur
28e60 61 74 69 6f 6e 20 66 69 6c 65 73 20 74 68 61 74  ation files that
28e70 20 77 65 20 68 61 6e 64 6c 65 2e 0d 0a 20 20 20   we handle...   
28e80 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
28e90 73 65 74 20 6d 64 61 43 6f 6e 66 69 67 46 69 6c  set mdaConfigFil
28ea0 65 4e 61 6d 65 73 20 5b 6c 69 73 74 20 5c 0d 0a  eNames [list \..
28eb0 20 20 20 20 20 20 20 20 20 20 20 20 45 61 67 6c              Eagl
28ec0 65 53 68 65 6c 6c 33 32 2e 65 78 65 2e 6d 64 61  eShell32.exe.mda
28ed0 2e 63 6f 6e 66 69 67 20 49 6e 73 74 61 6c 6c 65  .config Installe
28ee0 72 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e 66 69 67  r.exe.mda.config
28ef0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
28f00 74 65 73 74 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e  test.exe.mda.con
28f10 66 69 67 20 74 65 73 74 6c 69 6e 71 2e 65 78 65  fig testlinq.exe
28f20 2e 6d 64 61 2e 63 6f 6e 66 69 67 20 5c 0d 0a 20  .mda.config \.. 
28f30 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 65             teste
28f40 66 36 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e 66 69  f6.exe.mda.confi
28f50 67 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d  g]....        #.
28f60 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
28f70 20 42 75 69 6c 64 20 74 68 65 20 6c 69 73 74 20   Build the list 
28f80 6f 66 20 65 78 74 65 72 6e 61 6c 20 66 69 6c 65  of external file
28f90 73 20 74 68 61 74 20 77 65 20 68 61 6e 64 6c 65  s that we handle
28fa0 2e 20 20 53 6f 6d 65 20 6f 66 0d 0a 20 20 20 20  .  Some of..    
28fb0 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65 73      #       thes
28fc0 65 20 66 69 6c 65 73 20 6d 61 79 20 62 65 20 6e  e files may be n
28fd0 61 74 69 76 65 20 61 6e 64 2f 6f 72 20 6d 61 6e  ative and/or man
28fe0 61 67 65 64 20 61 73 73 65 6d 62 6c 69 65 73 20  aged assemblies 
28ff0 74 68 61 74 20 61 72 65 0d 0a 20 20 20 20 20 20  that are..      
29000 20 20 23 20 20 20 20 20 20 20 72 65 71 75 69 72    #       requir
29010 65 64 20 74 6f 20 70 65 72 66 6f 72 6d 20 76 61  ed to perform va
29020 72 69 6f 75 73 20 74 65 73 74 73 2e 0d 0a 20 20  rious tests...  
29030 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
29040 20 73 65 74 20 65 78 74 65 72 6e 61 6c 46 69 6c   set externalFil
29050 65 4e 61 6d 65 73 20 5b 6c 69 73 74 20 5c 0d 0a  eNames [list \..
29060 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c              [fil
29070 65 20 6a 6f 69 6e 20 45 6e 74 69 74 79 46 72 61  e join EntityFra
29080 6d 65 77 6f 72 6b 20 6c 69 62 20 5b 73 74 72 69  mework lib [stri
29090 6e 67 20 6d 61 70 20 5b 6c 69 73 74 20 46 78 20  ng map [list Fx 
290a0 22 22 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ""] \..         
290b0 20 20 20 5b 73 74 72 69 6e 67 20 6d 61 70 20 5b     [string map [
290c0 6c 69 73 74 20 6e 65 74 46 78 34 35 31 20 6e 65  list netFx451 ne
290d0 74 46 78 34 35 20 6e 65 74 46 78 34 35 32 20 6e  tFx45 netFx452 n
290e0 65 74 46 78 34 35 20 6e 65 74 46 78 34 36 20 5c  etFx45 netFx46 \
290f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 65  ..            ne
29100 74 46 78 34 35 20 6e 65 74 46 78 34 36 31 20 6e  tFx45 netFx461 n
29110 65 74 46 78 34 35 20 6e 65 74 46 78 34 36 32 20  etFx45 netFx462 
29120 6e 65 74 46 78 34 35 20 6e 65 74 46 78 34 37 20  netFx45 netFx47 
29130 6e 65 74 46 78 34 35 20 5c 0d 0a 20 20 20 20 20  netFx45 \..     
29140 20 20 20 20 20 20 20 6e 65 74 46 78 34 37 31 20         netFx471 
29150 6e 65 74 46 78 34 35 20 6e 65 74 46 78 34 37 32  netFx45 netFx472
29160 20 6e 65 74 46 78 34 35 20 6e 65 74 53 74 61 6e   netFx45 netStan
29170 64 61 72 64 32 30 20 6e 65 74 46 78 34 35 20 5c  dard20 netFx45 \
29180 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 65  ..            ne
29190 74 53 74 61 6e 64 61 72 64 32 31 20 6e 65 74 46  tStandard21 netF
291a0 78 34 35 5d 20 5b 67 65 74 42 75 69 6c 64 4e 65  x45] [getBuildNe
291b0 74 46 78 5d 5d 5d 20 45 6e 74 69 74 79 46 72 61  tFx]]] EntityFra
291c0 6d 65 77 6f 72 6b 2e 64 6c 6c 5d 5d 0d 0a 0d 0a  mework.dll]]....
291d0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
291e0 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64     # NOTE: Build
291f0 20 74 68 65 20 6c 69 73 74 20 6f 66 20 6e 61 74   the list of nat
29200 69 76 65 20 61 73 73 65 6d 62 6c 79 20 66 69 6c  ive assembly fil
29210 65 73 20 74 68 61 74 20 77 65 20 68 61 6e 64 6c  es that we handl
29220 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  e...        #.. 
29230 20 20 20 20 20 20 20 73 65 74 20 6e 61 74 69 76         set nativ
29240 65 46 69 6c 65 4e 61 6d 65 73 20 5b 6c 69 73 74  eFileNames [list
29250 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 65 76 61  ]....        eva
29260 6c 20 6c 61 70 70 65 6e 64 20 6e 61 74 69 76 65  l lappend native
29270 46 69 6c 65 4e 61 6d 65 73 20 5b 67 65 74 4e 61  FileNames [getNa
29280 74 69 76 65 4c 69 62 72 61 72 79 46 69 6c 65 4e  tiveLibraryFileN
29290 61 6d 65 73 4f 6e 6c 79 5d 0d 0a 20 20 20 20 20  amesOnly]..     
292a0 20 20 20 65 76 61 6c 20 6c 61 70 70 65 6e 64 20     eval lappend 
292b0 6e 61 74 69 76 65 46 69 6c 65 4e 61 6d 65 73 20  nativeFileNames 
292c0 5b 67 65 74 49 6e 74 65 72 6f 70 41 73 73 65 6d  [getInteropAssem
292d0 62 6c 79 46 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79  blyFileNamesOnly
292e0 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ]....        #..
292f0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
29300 42 75 69 6c 64 20 74 68 65 20 6c 69 73 74 20 6f  Build the list o
29310 66 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73  f mixed-mode ass
29320 65 6d 62 6c 79 20 66 69 6c 65 73 20 74 68 61 74  embly files that
29330 20 77 65 20 68 61 6e 64 6c 65 2e 0d 0a 20 20 20   we handle...   
29340 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
29350 73 65 74 20 6d 69 78 65 64 46 69 6c 65 4e 61 6d  set mixedFileNam
29360 65 73 20 5b 6c 69 73 74 5d 0d 0a 0d 0a 20 20 20  es [list]....   
29370 20 20 20 20 20 69 66 20 7b 5b 68 61 73 52 75 6e       if {[hasRun
29380 74 69 6d 65 4f 70 74 69 6f 6e 20 6e 61 74 69 76  timeOption nativ
29390 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  e]} then {..    
293a0 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 6d 69        lappend mi
293b0 78 65 64 46 69 6c 65 4e 61 6d 65 73 20 53 79 73  xedFileNames Sys
293c0 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
293d0 64 6c 6c 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  dll..        }..
293e0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
293f0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69       # NOTE: Bui
29400 6c 64 20 74 68 65 20 6c 69 73 74 20 6f 66 20 6d  ld the list of m
29410 61 6e 61 67 65 64 20 61 73 73 65 6d 62 6c 79 20  anaged assembly 
29420 66 69 6c 65 73 20 74 68 61 74 20 77 65 20 68 61  files that we ha
29430 6e 64 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 23  ndle...        #
29440 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 6d 61  ..        set ma
29450 6e 61 67 65 64 46 69 6c 65 4e 61 6d 65 73 20 5b  nagedFileNames [
29460 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20  list \..        
29470 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e      System.Data.
29480 53 51 4c 69 74 65 2e 4c 69 6e 71 2e 64 6c 6c 20  SQLite.Linq.dll 
29490 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
294a0 74 65 2e 45 46 36 2e 64 6c 6c 5d 0d 0a 0d 0a 20  te.EF6.dll].... 
294b0 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61 73         if {![has
294c0 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 6e 61  RuntimeOption na
294d0 74 69 76 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  tive]} then {.. 
294e0 20 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64           lappend
294f0 20 6d 61 6e 61 67 65 64 46 69 6c 65 4e 61 6d 65   managedFileName
29500 73 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  s System.Data.SQ
29510 4c 69 74 65 2e 64 6c 6c 0d 0a 20 20 20 20 20 20  Lite.dll..      
29520 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23    }....        #
29530 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
29540 3a 20 53 68 6f 77 20 74 68 65 20 76 61 72 69 6f  : Show the vario
29550 75 73 20 6c 69 73 74 73 20 6f 66 20 66 69 6c 65  us lists of file
29560 20 6e 61 6d 65 73 20 74 68 61 74 20 61 72 65 20   names that are 
29570 68 61 6e 64 6c 65 64 20 62 79 20 74 68 69 73 0d  handled by this.
29580 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
29590 20 70 72 6f 63 65 64 75 72 65 2e 0d 0a 20 20 20   procedure...   
295a0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
295b0 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
295c0 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
295d0 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
295e0 20 22 2d 2d 2d 2d 20 6c 69 73 74 20 6f 66 20 5c   "---- list of \
295f0 22 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 5c 22  "configuration\"
29600 20 66 69 6c 65 20 6e 61 6d 65 73 20 69 73 3a 20   file names is: 
29610 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
29620 20 5b 65 78 70 72 20 7b 5b 6c 6c 65 6e 67 74 68   [expr {[llength
29630 20 24 63 6f 6e 66 69 67 46 69 6c 65 4e 61 6d 65   $configFileName
29640 73 5d 20 3e 20 30 20 3f 20 24 63 6f 6e 66 69 67  s] > 0 ? $config
29650 46 69 6c 65 4e 61 6d 65 73 20 3a 20 5c 0d 0a 20  FileNames : \.. 
29660 20 20 20 20 20 20 20 20 20 20 20 22 3c 6e 6f 6e             "<non
29670 65 3e 22 7d 5d 20 5c 6e 5d 0d 0a 0d 0a 20 20 20  e>"}] \n]....   
29680 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
29690 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
296a0 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
296b0 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6c 69 73 74        "---- list
296c0 20 6f 66 20 5c 22 4d 44 41 20 63 6f 6e 66 69 67   of \"MDA config
296d0 75 72 61 74 69 6f 6e 5c 22 20 66 69 6c 65 20 6e  uration\" file n
296e0 61 6d 65 73 20 69 73 3a 20 22 20 5c 0d 0a 20 20  ames is: " \..  
296f0 20 20 20 20 20 20 20 20 20 20 5b 65 78 70 72 20            [expr 
29700 7b 5b 6c 6c 65 6e 67 74 68 20 24 6d 64 61 43 6f  {[llength $mdaCo
29710 6e 66 69 67 46 69 6c 65 4e 61 6d 65 73 5d 20 3e  nfigFileNames] >
29720 20 30 20 3f 20 24 6d 64 61 43 6f 6e 66 69 67 46   0 ? $mdaConfigF
29730 69 6c 65 4e 61 6d 65 73 20 3a 20 5c 0d 0a 20 20  ileNames : \..  
29740 20 20 20 20 20 20 20 20 20 20 22 3c 6e 6f 6e 65            "<none
29750 3e 22 7d 5d 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20  >"}] \n]....    
29760 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
29770 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
29780 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
29790 20 20 20 20 20 22 2d 2d 2d 2d 20 6c 69 73 74 20       "---- list 
297a0 6f 66 20 5c 22 65 78 74 65 72 6e 61 6c 5c 22 20  of \"external\" 
297b0 66 69 6c 65 20 6e 61 6d 65 73 20 69 73 3a 20 22  file names is: "
297c0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
297d0 5b 65 78 70 72 20 7b 5b 6c 6c 65 6e 67 74 68 20  [expr {[llength 
297e0 24 65 78 74 65 72 6e 61 6c 46 69 6c 65 4e 61 6d  $externalFileNam
297f0 65 73 5d 20 3e 20 30 20 3f 20 24 65 78 74 65 72  es] > 0 ? $exter
29800 6e 61 6c 46 69 6c 65 4e 61 6d 65 73 20 3a 20 5c  nalFileNames : \
29810 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 3c  ..            "<
29820 6e 6f 6e 65 3e 22 7d 5d 20 5c 6e 5d 0d 0a 0d 0a  none>"}] \n]....
29830 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
29840 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
29850 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
29860 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6c           "---- l
29870 69 73 74 20 6f 66 20 5c 22 6e 61 74 69 76 65 5c  ist of \"native\
29880 22 20 66 69 6c 65 20 6e 61 6d 65 73 20 69 73 3a  " file names is:
29890 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   " \..          
298a0 20 20 5b 65 78 70 72 20 7b 5b 6c 6c 65 6e 67 74    [expr {[llengt
298b0 68 20 24 6e 61 74 69 76 65 46 69 6c 65 4e 61 6d  h $nativeFileNam
298c0 65 73 5d 20 3e 20 30 20 3f 20 24 6e 61 74 69 76  es] > 0 ? $nativ
298d0 65 46 69 6c 65 4e 61 6d 65 73 20 3a 20 5c 0d 0a  eFileNames : \..
298e0 20 20 20 20 20 20 20 20 20 20 20 20 22 3c 6e 6f              "<no
298f0 6e 65 3e 22 7d 5d 20 5c 6e 5d 0d 0a 0d 0a 20 20  ne>"}] \n]....  
29900 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
29910 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
29920 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
29930 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6c 69 73         "---- lis
29940 74 20 6f 66 20 5c 22 6d 69 78 65 64 5c 22 20 66  t of \"mixed\" f
29950 69 6c 65 20 6e 61 6d 65 73 20 69 73 3a 20 22 20  ile names is: " 
29960 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
29970 65 78 70 72 20 7b 5b 6c 6c 65 6e 67 74 68 20 24  expr {[llength $
29980 6d 69 78 65 64 46 69 6c 65 4e 61 6d 65 73 5d 20  mixedFileNames] 
29990 3e 20 30 20 3f 20 24 6d 69 78 65 64 46 69 6c 65  > 0 ? $mixedFile
299a0 4e 61 6d 65 73 20 3a 20 5c 0d 0a 20 20 20 20 20  Names : \..     
299b0 20 20 20 20 20 20 20 22 3c 6e 6f 6e 65 3e 22 7d         "<none>"}
299c0 5d 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  ] \n]....       
299d0 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
299e0 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
299f0 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
29a00 20 20 22 2d 2d 2d 2d 20 6c 69 73 74 20 6f 66 20    "---- list of 
29a10 5c 22 6d 61 6e 61 67 65 64 5c 22 20 66 69 6c 65  \"managed\" file
29a20 20 6e 61 6d 65 73 20 69 73 3a 20 22 20 5c 0d 0a   names is: " \..
29a30 20 20 20 20 20 20 20 20 20 20 20 20 5b 65 78 70              [exp
29a40 72 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 6d 61 6e  r {[llength $man
29a50 61 67 65 64 46 69 6c 65 4e 61 6d 65 73 5d 20 3e  agedFileNames] >
29a60 20 30 20 3f 20 24 6d 61 6e 61 67 65 64 46 69 6c   0 ? $managedFil
29a70 65 4e 61 6d 65 73 20 3a 20 5c 0d 0a 20 20 20 20  eNames : \..    
29a80 20 20 20 20 20 20 20 20 22 3c 6e 6f 6e 65 3e 22          "<none>"
29a90 7d 5d 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20  }] \n]....      
29aa0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
29ab0 4f 54 45 3a 20 52 65 6d 6f 76 65 20 61 6e 79 20  OTE: Remove any 
29ac0 74 65 73 74 20 63 6f 6e 73 74 72 61 69 6e 74 73  test constraints
29ad0 20 74 68 61 74 20 72 65 66 65 72 20 74 6f 20 74   that refer to t
29ae0 68 65 20 6e 61 74 69 76 65 20 61 6e 64 2f 6f 72  he native and/or
29af0 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
29b00 20 20 6d 61 6e 61 67 65 64 20 61 73 73 65 6d 62    managed assemb
29b10 6c 79 20 66 69 6c 65 73 20 74 68 61 74 20 77 65  ly files that we
29b20 20 68 61 6e 64 6c 65 20 75 6e 6c 65 73 73 20 66   handle unless f
29b30 6f 72 62 69 64 64 65 6e 20 66 72 6f 6d 0d 0a 20  orbidden from.. 
29b40 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64         #       d
29b50 6f 69 6e 67 20 73 6f 2e 0d 0a 20 20 20 20 20 20  oing so...      
29b60 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20    #..        if 
29b70 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
29b80 3a 6e 6f 28 73 71 6c 69 74 65 52 65 6d 6f 76 65  :no(sqliteRemove
29b90 43 6f 6e 73 74 72 61 69 6e 74 73 29 5d 7d 20 74  Constraints)]} t
29ba0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
29bb0 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d   foreach fileNam
29bc0 65 20 24 63 6f 6e 66 69 67 46 69 6c 65 4e 61 6d  e $configFileNam
29bd0 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  es {..          
29be0 20 20 72 65 6d 6f 76 65 43 6f 6e 73 74 72 61 69    removeConstrai
29bf0 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66  nt [appendArgs f
29c00 69 6c 65 5f 20 24 66 69 6c 65 4e 61 6d 65 5d 0d  ile_ $fileName].
29c10 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  .          }....
29c20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63            foreac
29c30 68 20 66 69 6c 65 4e 61 6d 65 20 24 6d 64 61 43  h fileName $mdaC
29c40 6f 6e 66 69 67 46 69 6c 65 4e 61 6d 65 73 20 7b  onfigFileNames {
29c50 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ..            re
29c60 6d 6f 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b  moveConstraint [
29c70 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f  appendArgs file_
29c80 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20   $fileName]..   
29c90 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
29ca0 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69        foreach fi
29cb0 6c 65 4e 61 6d 65 20 24 65 78 74 65 72 6e 61 6c  leName $external
29cc0 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20  FileNames {..   
29cd0 20 20 20 20 20 20 20 20 20 72 65 6d 6f 76 65 43           removeC
29ce0 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e  onstraint [appen
29cf0 64 41 72 67 73 20 66 69 6c 65 5f 20 5b 66 69 6c  dArgs file_ [fil
29d00 65 20 74 61 69 6c 20 24 66 69 6c 65 4e 61 6d 65  e tail $fileName
29d10 5d 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  ]]..          }.
29d20 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  ...          for
29d30 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6e  each fileName $n
29d40 61 74 69 76 65 46 69 6c 65 4e 61 6d 65 73 20 7b  ativeFileNames {
29d50 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ..            re
29d60 6d 6f 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b  moveConstraint [
29d70 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f  appendArgs file_
29d80 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20   $fileName]..   
29d90 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
29da0 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69        foreach fi
29db0 6c 65 4e 61 6d 65 20 24 6d 69 78 65 64 46 69 6c  leName $mixedFil
29dc0 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20  eNames {..      
29dd0 20 20 20 20 20 20 72 65 6d 6f 76 65 43 6f 6e 73        removeCons
29de0 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
29df0 67 73 20 66 69 6c 65 5f 20 24 66 69 6c 65 4e 61  gs file_ $fileNa
29e00 6d 65 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  me]..          }
29e10 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 66 6f  ....          fo
29e20 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24  reach fileName $
29e30 6d 61 6e 61 67 65 64 46 69 6c 65 4e 61 6d 65 73  managedFileNames
29e40 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
29e50 72 65 6d 6f 76 65 43 6f 6e 73 74 72 61 69 6e 74  removeConstraint
29e60 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c   [appendArgs fil
29e70 65 5f 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20  e_ $fileName].. 
29e80 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
29e90 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
29ea0 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
29eb0 54 45 3a 20 43 68 65 63 6b 20 66 6f 72 20 74 68  TE: Check for th
29ec0 65 20 22 61 75 74 6f 53 65 6c 65 63 74 22 20 72  e "autoSelect" r
29ed0 75 6e 74 69 6d 65 20 6f 70 74 69 6f 6e 2e 20 20  untime option.  
29ee0 49 66 20 70 72 65 73 65 6e 74 2c 0d 0a 20 20 20  If present,..   
29ef0 20 20 20 20 20 23 20 20 20 20 20 20 20 61 74 74       #       att
29f00 65 6d 70 74 20 74 6f 20 61 75 74 6f 6d 61 74 69  empt to automati
29f10 63 61 6c 6c 79 20 73 65 6c 65 63 74 20 74 68 65  cally select the
29f20 20 66 69 72 73 74 20 61 76 61 69 6c 61 62 6c 65   first available
29f30 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
29f40 20 20 62 75 69 6c 64 20 28 6f 72 20 22 72 65 6c    build (or "rel
29f50 65 61 73 65 22 29 20 6f 66 20 53 51 4c 69 74 65  ease") of SQLite
29f60 20 61 6e 64 20 53 79 73 74 65 6d 2e 44 61 74 61   and System.Data
29f70 2e 53 51 4c 69 74 65 0d 0a 20 20 20 20 20 20 20  .SQLite..       
29f80 20 23 20 20 20 20 20 20 20 66 6f 72 20 75 73 65   #       for use
29f90 20 77 69 74 68 20 74 68 65 20 74 65 73 74 20 73   with the test s
29fa0 75 69 74 65 2e 0d 0a 20 20 20 20 20 20 20 20 23  uite...        #
29fb0 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 68  ..        if {[h
29fc0 61 73 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20  asRuntimeOption 
29fd0 61 75 74 6f 53 65 6c 65 63 74 5d 7d 20 74 68 65  autoSelect]} the
29fe0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69  n {..          i
29ff0 66 20 7b 21 5b 63 68 65 63 6b 46 6f 72 53 51 4c  f {![checkForSQL
2a000 69 74 65 42 75 69 6c 64 73 20 24 3a 3a 74 65 73  iteBuilds $::tes
2a010 74 5f 63 68 61 6e 6e 65 6c 20 74 72 75 65 5d 7d  t_channel true]}
2a020 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
2a030 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51 4c       checkForSQL
2a040 69 74 65 52 65 6c 65 61 73 65 73 20 24 3a 3a 74  iteReleases $::t
2a050 65 73 74 5f 63 68 61 6e 6e 65 6c 20 74 72 75 65  est_channel true
2a060 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d  ..          }...
2a070 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
2a080 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
2a090 53 68 6f 77 20 28 61 6e 64 20 6c 6f 67 29 20 74  Show (and log) t
2a0a0 68 65 20 67 6c 6f 62 61 6c 20 70 61 72 61 6d 65  he global parame
2a0b0 74 65 72 73 20 74 68 61 74 20 63 6f 6e 74 72 6f  ters that contro
2a0c0 6c 20 77 68 65 72 65 0d 0a 20 20 20 20 20 20 20  l where..       
2a0d0 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20 62     #       the b
2a0e0 75 69 6c 64 20 64 69 72 65 63 74 6f 72 79 20 73  uild directory s
2a0f0 68 6f 75 6c 64 20 62 65 2e 20 20 54 68 65 20 61  hould be.  The a
2a100 75 74 6f 2d 73 65 6c 65 63 74 69 6f 6e 20 6d 61  uto-selection ma
2a110 79 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20  y..          #  
2a120 20 20 20 20 20 68 61 76 65 20 6d 6f 64 69 66 69       have modifi
2a130 65 64 20 73 6f 6d 65 20 6f 66 20 74 68 65 73 65  ed some of these
2a140 20 70 61 72 61 6d 65 74 65 72 73 2e 0d 0a 20 20   parameters...  
2a150 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
2a160 20 20 20 20 20 73 68 6f 77 53 51 4c 69 74 65 42       showSQLiteB
2a170 75 69 6c 64 50 61 72 61 6d 65 74 65 72 73 20 24  uildParameters $
2a180 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a  ::test_channel..
2a190 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
2a1a0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
2a1b0 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20 61 6c 6c  # NOTE: Skip all
2a1c0 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
2a1d0 69 74 65 20 72 65 6c 61 74 65 64 20 66 69 6c 65  ite related file
2a1e0 20 68 61 6e 64 6c 69 6e 67 20 28 64 65 6c 65 74   handling (delet
2a1f0 69 6e 67 2c 0d 0a 20 20 20 20 20 20 20 20 23 20  ing,..        # 
2a200 20 20 20 20 20 20 63 6f 70 79 69 6e 67 2c 20 61        copying, a
2a210 6e 64 20 6c 6f 61 64 69 6e 67 29 20 69 66 20 69  nd loading) if i
2a220 6e 73 74 72 75 63 74 65 64 2e 0d 0a 20 20 20 20  nstructed...    
2a230 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69      #..        i
2a240 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
2a250 20 3a 3a 6e 6f 28 73 71 6c 69 74 65 46 69 6c 65   ::no(sqliteFile
2a260 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  s)]} then {..   
2a270 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
2a280 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70      # NOTE: Skip
2a290 20 74 72 79 69 6e 67 20 74 6f 20 64 65 6c 65 74   trying to delet
2a2a0 65 20 61 6e 79 20 66 69 6c 65 73 20 69 66 20 69  e any files if i
2a2b0 6e 73 74 72 75 63 74 65 64 2e 0d 0a 20 20 20 20  nstructed...    
2a2c0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
2a2d0 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
2a2e0 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74 65  ists ::no(delete
2a2f0 53 71 6c 69 74 65 46 69 6c 65 73 29 5d 7d 20 74  SqliteFiles)]} t
2a300 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
2a310 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
2a320 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74 65  ists ::no(delete
2a330 53 71 6c 69 74 65 43 6f 6e 66 69 67 46 69 6c 65  SqliteConfigFile
2a340 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  s)]} then {..   
2a350 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61             forea
2a360 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 63 6f 6e  ch fileName $con
2a370 66 69 67 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a  figFileNames {..
2a380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a390 74 72 79 44 65 6c 65 74 65 42 69 6e 61 72 79 46  tryDeleteBinaryF
2a3a0 69 6c 65 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20  ile $fileName.. 
2a3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
2a3c0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
2a3d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
2a3e0 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
2a3f0 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69 74 65  :no(deleteSqlite
2a400 45 78 74 65 72 6e 61 6c 46 69 6c 65 73 29 5d 7d  ExternalFiles)]}
2a410 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
2a420 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66         foreach f
2a430 69 6c 65 4e 61 6d 65 20 24 6d 64 61 43 6f 6e 66  ileName $mdaConf
2a440 69 67 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20  igFileNames {.. 
2a450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
2a460 72 79 44 65 6c 65 74 65 42 75 69 6c 64 46 69 6c  ryDeleteBuildFil
2a470 65 20 24 66 69 6c 65 4e 61 6d 65 20 74 72 75 65  e $fileName true
2a480 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2a490 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
2a4a0 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e     foreach fileN
2a4b0 61 6d 65 20 24 65 78 74 65 72 6e 61 6c 46 69 6c  ame $externalFil
2a4c0 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20  eNames {..      
2a4d0 20 20 20 20 20 20 20 20 20 20 74 72 79 44 65 6c            tryDel
2a4e0 65 74 65 42 69 6e 61 72 79 46 69 6c 65 20 24 66  eteBinaryFile $f
2a4f0 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20  ileName..       
2a500 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
2a510 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
2a520 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
2a530 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65  o exists ::no(de
2a540 6c 65 74 65 53 71 6c 69 74 65 4e 61 74 69 76 65  leteSqliteNative
2a550 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d  Files)]} then {.
2a560 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
2a570 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
2a580 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69   ::no(deleteSqli
2a590 74 65 49 6d 70 6c 69 63 69 74 4e 61 74 69 76 65  teImplicitNative
2a5a0 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d  Files)]} then {.
2a5b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2a5c0 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d   foreach fileNam
2a5d0 65 20 24 6e 61 74 69 76 65 46 69 6c 65 4e 61 6d  e $nativeFileNam
2a5e0 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  es {..          
2a5f0 20 20 20 20 20 20 20 20 74 72 79 44 65 6c 65 74          tryDelet
2a600 65 41 73 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e  eAssembly $fileN
2a610 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ame..           
2a620 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
2a630 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
2a640 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69           if {![i
2a650 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
2a660 64 65 6c 65 74 65 53 71 6c 69 74 65 4e 6f 6e 49  deleteSqliteNonI
2a670 6d 70 6c 69 63 69 74 46 69 6c 65 73 29 5d 7d 20  mplicitFiles)]} 
2a680 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
2a690 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
2a6a0 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64  fo exists ::no(d
2a6b0 65 6c 65 74 65 53 71 6c 69 74 65 50 6c 61 74 66  eleteSqlitePlatf
2a6c0 6f 72 6d 46 69 6c 65 73 29 5d 20 26 26 20 5c 0d  ormFiles)] && \.
2a6d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2a6e0 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
2a6f0 67 74 68 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3e  gth $platform] >
2a700 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
2a710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f                fo
2a720 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24  reach fileName $
2a730 6e 61 74 69 76 65 46 69 6c 65 4e 61 6d 65 73 20  nativeFileNames 
2a740 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
2a750 20 20 20 20 20 20 20 74 72 79 44 65 6c 65 74 65         tryDelete
2a760 41 73 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61  Assembly $fileNa
2a770 6d 65 20 24 70 6c 61 74 66 6f 72 6d 0d 0a 20 20  me $platform..  
2a780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a790 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  }..             
2a7a0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
2a7b0 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
2a7c0 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64  fo exists ::no(d
2a7d0 65 6c 65 74 65 53 71 6c 69 74 65 41 72 63 68 69  eleteSqliteArchi
2a7e0 74 65 63 74 75 72 65 46 69 6c 65 73 29 5d 20 26  tectureFiles)] &
2a7f0 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  & \..           
2a800 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67           [string
2a810 20 6c 65 6e 67 74 68 20 24 61 72 63 68 69 74 65   length $archite
2a820 63 74 75 72 65 5d 20 3e 20 30 7d 20 74 68 65 6e  cture] > 0} then
2a830 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
2a840 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69        foreach fi
2a850 6c 65 4e 61 6d 65 20 24 6e 61 74 69 76 65 46 69  leName $nativeFi
2a860 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20  leNames {..     
2a870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
2a880 72 79 44 65 6c 65 74 65 41 73 73 65 6d 62 6c 79  ryDeleteAssembly
2a890 20 24 66 69 6c 65 4e 61 6d 65 20 24 61 72 63 68   $fileName $arch
2a8a0 69 74 65 63 74 75 72 65 0d 0a 20 20 20 20 20 20  itecture..      
2a8b0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
2a8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
2a8d0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2a8e0 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  }..            }
2a8f0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
2a900 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
2a910 73 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c  s ::no(deleteSql
2a920 69 74 65 4d 69 78 65 64 46 69 6c 65 73 29 5d 7d  iteMixedFiles)]}
2a930 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
2a940 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
2a950 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
2a960 49 66 20 74 68 65 20 22 6e 61 74 69 76 65 22 20  If the "native" 
2a970 72 75 6e 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69  runtime option i
2a980 73 20 73 65 74 2c 20 64 65 6c 65 74 65 20 69 6d  s set, delete im
2a990 70 6c 69 63 69 74 0d 0a 20 20 20 20 20 20 20 20  plicit..        
2a9a0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6d 69        #       mi
2a9b0 78 65 64 2d 6d 6f 64 65 20 61 73 73 65 6d 62 6c  xed-mode assembl
2a9c0 79 20 66 69 6c 65 73 20 61 73 20 77 65 6c 6c 2e  y files as well.
2a9d0 20 20 54 68 69 73 20 72 75 6e 74 69 6d 65 20 6f    This runtime o
2a9e0 70 74 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20 20  ption..         
2a9f0 20 20 20 20 20 23 20 20 20 20 20 20 20 63 68 65       #       che
2aa00 63 6b 20 69 73 20 68 61 6e 64 6c 65 64 20 77 68  ck is handled wh
2aa10 65 6e 20 62 75 69 6c 64 69 6e 67 20 74 68 65 20  en building the 
2aa20 6c 69 73 74 20 6f 66 20 6d 69 78 65 64 2d 6d 6f  list of mixed-mo
2aa30 64 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  de..            
2aa40 20 20 23 20 20 20 20 20 20 20 61 73 73 65 6d 62    #       assemb
2aa50 6c 79 20 66 69 6c 65 20 6e 61 6d 65 73 2e 0d 0a  ly file names...
2aa60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
2aa70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
2aa80 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
2aa90 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69   ::no(deleteSqli
2aaa0 74 65 49 6d 70 6c 69 63 69 74 4d 69 78 65 64 46  teImplicitMixedF
2aab0 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  iles)]} then {..
2aac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aad0 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65  foreach fileName
2aae0 20 24 6d 69 78 65 64 46 69 6c 65 4e 61 6d 65 73   $mixedFileNames
2aaf0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
2ab00 20 20 20 20 20 20 74 72 79 44 65 6c 65 74 65 41        tryDeleteA
2ab10 73 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61 6d  ssembly $fileNam
2ab20 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e..             
2ab30 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
2ab40 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
2ab50 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
2ab60 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65  o exists ::no(de
2ab70 6c 65 74 65 53 71 6c 69 74 65 4e 6f 6e 49 6d 70  leteSqliteNonImp
2ab80 6c 69 63 69 74 46 69 6c 65 73 29 5d 7d 20 74 68  licitFiles)]} th
2ab90 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
2aba0 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
2abb0 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c   exists ::no(del
2abc0 65 74 65 53 71 6c 69 74 65 50 6c 61 74 66 6f 72  eteSqlitePlatfor
2abd0 6d 46 69 6c 65 73 29 5d 20 26 26 20 5c 0d 0a 20  mFiles)] && \.. 
2abe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2abf0 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74     [string lengt
2ac00 68 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3e 20 30  h $platform] > 0
2ac10 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
2ac20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65              fore
2ac30 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6d 69  ach fileName $mi
2ac40 78 65 64 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a  xedFileNames {..
2ac50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ac60 20 20 20 20 74 72 79 44 65 6c 65 74 65 41 73 73      tryDeleteAss
2ac70 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61 6d 65 20  embly $fileName 
2ac80 24 70 6c 61 74 66 6f 72 6d 0d 0a 20 20 20 20 20  $platform..     
2ac90 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
2aca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2acb0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
2acc0 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
2acd0 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65  exists ::no(dele
2ace0 74 65 53 71 6c 69 74 65 41 72 63 68 69 74 65 63  teSqliteArchitec
2acf0 74 75 72 65 46 69 6c 65 73 29 5d 20 26 26 20 5c  tureFiles)] && \
2ad00 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2ad10 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65        [string le
2ad20 6e 67 74 68 20 24 61 72 63 68 69 74 65 63 74 75  ngth $architectu
2ad30 72 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  re] > 0} then {.
2ad40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2ad50 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e     foreach fileN
2ad60 61 6d 65 20 24 6d 69 78 65 64 46 69 6c 65 4e 61  ame $mixedFileNa
2ad70 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  mes {..         
2ad80 20 20 20 20 20 20 20 20 20 20 20 74 72 79 44 65             tryDe
2ad90 6c 65 74 65 41 73 73 65 6d 62 6c 79 20 24 66 69  leteAssembly $fi
2ada0 6c 65 4e 61 6d 65 20 24 61 72 63 68 69 74 65 63  leName $architec
2adb0 74 75 72 65 0d 0a 20 20 20 20 20 20 20 20 20 20  ture..          
2adc0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
2add0 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
2ade0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
2adf0 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
2ae00 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
2ae10 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
2ae20 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69 74 65 4d  no(deleteSqliteM
2ae30 61 6e 61 67 65 64 46 69 6c 65 73 29 5d 7d 20 74  anagedFiles)]} t
2ae40 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
2ae50 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c       foreach fil
2ae60 65 4e 61 6d 65 20 24 6d 61 6e 61 67 65 64 46 69  eName $managedFi
2ae70 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20  leNames {..     
2ae80 20 20 20 20 20 20 20 20 20 20 20 74 72 79 44 65             tryDe
2ae90 6c 65 74 65 41 73 73 65 6d 62 6c 79 20 24 66 69  leteAssembly $fi
2aea0 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20  leName..        
2aeb0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
2aec0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
2aed0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
2aee0 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
2aef0 4e 4f 54 45 3a 20 53 68 6f 77 20 28 61 6e 64 20  NOTE: Show (and 
2af00 6c 6f 67 29 20 74 68 65 20 67 6c 6f 62 61 6c 20  log) the global 
2af10 70 61 72 61 6d 65 74 65 72 73 20 74 68 61 74 20  parameters that 
2af20 63 6f 6e 74 72 6f 6c 20 77 68 65 72 65 0d 0a 20  control where.. 
2af30 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
2af40 20 74 68 65 20 62 75 69 6c 64 20 64 69 72 65 63   the build direc
2af50 74 6f 72 79 20 73 68 6f 75 6c 64 20 62 65 2e 0d  tory should be..
2af60 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
2af70 20 20 20 20 20 20 20 20 73 68 6f 77 53 51 4c 69          showSQLi
2af80 74 65 42 75 69 6c 64 50 61 72 61 6d 65 74 65 72  teBuildParameter
2af90 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
2afa0 6c 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23  l....          #
2afb0 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
2afc0 54 45 3a 20 53 6b 69 70 20 74 72 79 69 6e 67 20  TE: Skip trying 
2afd0 74 6f 20 76 65 72 69 66 79 20 74 68 65 20 62 75  to verify the bu
2afe0 69 6c 64 20 64 69 72 65 63 74 6f 72 79 20 69 66  ild directory if
2aff0 20 69 6e 73 74 72 75 63 74 65 64 3b 0d 0a 20 20   instructed;..  
2b000 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
2b010 6f 74 68 65 72 77 69 73 65 2c 20 6d 61 6b 65 20  otherwise, make 
2b020 73 75 72 65 20 69 74 20 61 63 74 75 61 6c 6c 79  sure it actually
2b030 20 65 78 69 73 74 73 20 6f 72 20 68 61 6c 74 20   exists or halt 
2b040 74 68 65 20 65 6e 74 69 72 65 0d 0a 20 20 20 20  the entire..    
2b050 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 65        #       te
2b060 73 74 69 6e 67 20 70 72 6f 63 65 73 73 20 69 66  sting process if
2b070 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69   it does not exi
2b080 73 74 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  st...          #
2b090 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
2b0a0 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
2b0b0 6e 6f 28 76 65 72 69 66 79 42 75 69 6c 64 44 69  no(verifyBuildDi
2b0c0 72 65 63 74 6f 72 79 29 5d 7d 20 74 68 65 6e 20  rectory)]} then 
2b0d0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  {..            #
2b0e0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20  ..            # 
2b0f0 4e 4f 54 45 3a 20 41 74 20 74 68 69 73 20 70 6f  NOTE: At this po
2b100 69 6e 74 2c 20 74 68 65 20 62 75 69 6c 64 20 64  int, the build d
2b110 69 72 65 63 74 6f 72 69 65 73 20 4d 55 53 54 20  irectories MUST 
2b120 65 78 69 73 74 20 66 6f 72 0d 0a 20 20 20 20 20  exist for..     
2b130 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74         #       t
2b140 68 65 20 74 65 73 74 69 6e 67 20 70 72 6f 63 65  he testing proce
2b150 73 73 20 74 6f 20 63 6f 6e 74 69 6e 75 65 2e 0d  ss to continue..
2b160 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a  .            #..
2b170 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
2b180 64 69 72 65 63 74 6f 72 79 20 5b 67 65 74 42 75  directory [getBu
2b190 69 6c 64 44 69 72 65 63 74 6f 72 79 20 66 61 6c  ildDirectory fal
2b1a0 73 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  se]....         
2b1b0 20 20 20 69 66 20 7b 21 5b 66 69 6c 65 20 65 78     if {![file ex
2b1c0 69 73 74 73 20 24 64 69 72 65 63 74 6f 72 79 5d  ists $directory]
2b1d0 20 7c 7c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   || \..         
2b1e0 20 20 20 20 20 20 20 21 5b 66 69 6c 65 20 69 73         ![file is
2b1f0 64 69 72 65 63 74 6f 72 79 20 24 64 69 72 65 63  directory $direc
2b200 74 6f 72 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  tory]} then {.. 
2b210 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a               #..
2b220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
2b230 4e 4f 54 45 3a 20 4a 75 73 74 20 70 72 69 6f 72  NOTE: Just prior
2b240 20 74 6f 20 61 63 74 75 61 6c 6c 79 20 68 61 6c   to actually hal
2b250 74 69 6e 67 20 74 68 65 20 74 65 73 74 69 6e 67  ting the testing
2b260 20 70 72 6f 63 65 73 73 2c 0d 0a 20 20 20 20 20   process,..     
2b270 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
2b280 20 61 64 64 20 61 6e 20 65 72 72 6f 72 20 74 6f   add an error to
2b290 20 74 68 65 20 74 65 73 74 20 6c 6f 67 20 66 69   the test log fi
2b2a0 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  le...           
2b2b0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
2b2c0 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
2b2d0 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
2b2e0 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
2b2f0 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
2b300 20 63 6f 75 6c 64 20 6e 6f 74 20 76 65 72 69 66   could not verif
2b310 79 20 6e 61 74 69 76 65 20 62 75 69 6c 64 20 64  y native build d
2b320 69 72 65 63 74 6f 72 79 20 5c 22 22 20 5c 0d 0a  irectory \"" \..
2b330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b340 20 20 24 64 69 72 65 63 74 6f 72 79 20 22 5c 22    $directory "\"
2b350 2c 20 61 6c 6c 20 74 65 73 74 69 6e 67 20 68 61  , all testing ha
2b360 6c 74 65 64 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20  lted\n"]....    
2b370 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
2b380 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
2b390 45 3a 20 52 61 69 73 69 6e 67 20 61 20 73 63 72  E: Raising a scr
2b3a0 69 70 74 20 65 72 72 6f 72 20 66 72 6f 6d 20 74  ipt error from t
2b3b0 68 69 73 20 70 6f 69 6e 74 20 73 68 6f 75 6c 64  his point should
2b3c0 20 68 61 6c 74 0d 0a 20 20 20 20 20 20 20 20 20   halt..         
2b3d0 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
2b3e0 20 74 65 73 74 69 6e 67 20 70 72 6f 63 65 73 73   testing process
2b3f0 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
2b400 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
2b410 20 20 65 72 72 6f 72 20 5b 61 70 70 65 6e 64 41    error [appendA
2b420 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
2b430 20 20 20 20 20 20 20 20 20 22 63 6f 75 6c 64 20           "could 
2b440 6e 6f 74 20 76 65 72 69 66 79 20 6e 61 74 69 76  not verify nativ
2b450 65 20 62 75 69 6c 64 20 64 69 72 65 63 74 6f 72  e build director
2b460 79 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20  y \"" \..       
2b470 20 20 20 20 20 20 20 20 20 20 20 24 64 69 72 65             $dire
2b480 63 74 6f 72 79 20 22 5c 22 2c 20 61 6c 6c 20 74  ctory "\", all t
2b490 65 73 74 69 6e 67 20 68 61 6c 74 65 64 22 5d 0d  esting halted"].
2b4a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
2b4b0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65  ..            se
2b4c0 74 20 64 69 72 65 63 74 6f 72 79 20 5b 67 65 74  t directory [get
2b4d0 42 75 69 6c 64 44 69 72 65 63 74 6f 72 79 20 74  BuildDirectory t
2b4e0 72 75 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  rue]....        
2b4f0 20 20 20 20 69 66 20 7b 21 5b 66 69 6c 65 20 65      if {![file e
2b500 78 69 73 74 73 20 24 64 69 72 65 63 74 6f 72 79  xists $directory
2b510 5d 20 7c 7c 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] || \..        
2b520 20 20 20 20 20 20 20 20 21 5b 66 69 6c 65 20 69          ![file i
2b530 73 64 69 72 65 63 74 6f 72 79 20 24 64 69 72 65  sdirectory $dire
2b540 63 74 6f 72 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a  ctory]} then {..
2b550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
2b560 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
2b570 20 4e 4f 54 45 3a 20 4a 75 73 74 20 70 72 69 6f   NOTE: Just prio
2b580 72 20 74 6f 20 61 63 74 75 61 6c 6c 79 20 68 61  r to actually ha
2b590 6c 74 69 6e 67 20 74 68 65 20 74 65 73 74 69 6e  lting the testin
2b5a0 67 20 70 72 6f 63 65 73 73 2c 0d 0a 20 20 20 20  g process,..    
2b5b0 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
2b5c0 20 20 61 64 64 20 61 6e 20 65 72 72 6f 72 20 74    add an error t
2b5d0 6f 20 74 68 65 20 74 65 73 74 20 6c 6f 67 20 66  o the test log f
2b5e0 69 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ile...          
2b5f0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
2b600 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
2b610 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
2b620 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
2b630 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
2b640 2d 20 63 6f 75 6c 64 20 6e 6f 74 20 76 65 72 69  - could not veri
2b650 66 79 20 6d 61 6e 61 67 65 64 20 62 75 69 6c 64  fy managed build
2b660 20 64 69 72 65 63 74 6f 72 79 20 5c 22 22 20 5c   directory \"" \
2b670 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2b680 20 20 20 20 24 64 69 72 65 63 74 6f 72 79 20 22      $directory "
2b690 5c 22 2c 20 61 6c 6c 20 74 65 73 74 69 6e 67 20  \", all testing 
2b6a0 68 61 6c 74 65 64 5c 6e 22 5d 0d 0a 0d 0a 20 20  halted\n"]....  
2b6b0 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
2b6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e               # N
2b6d0 4f 54 45 3a 20 52 61 69 73 69 6e 67 20 61 20 73  OTE: Raising a s
2b6e0 63 72 69 70 74 20 65 72 72 6f 72 20 66 72 6f 6d  cript error from
2b6f0 20 74 68 69 73 20 70 6f 69 6e 74 20 73 68 6f 75   this point shou
2b700 6c 64 20 68 61 6c 74 0d 0a 20 20 20 20 20 20 20  ld halt..       
2b710 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74         #       t
2b720 68 65 20 74 65 73 74 69 6e 67 20 70 72 6f 63 65  he testing proce
2b730 73 73 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ss...           
2b740 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
2b750 20 20 20 20 65 72 72 6f 72 20 5b 61 70 70 65 6e      error [appen
2b760 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
2b770 20 20 20 20 20 20 20 20 20 20 20 22 63 6f 75 6c             "coul
2b780 64 20 6e 6f 74 20 76 65 72 69 66 79 20 6d 61 6e  d not verify man
2b790 61 67 65 64 20 62 75 69 6c 64 20 64 69 72 65 63  aged build direc
2b7a0 74 6f 72 79 20 5c 22 22 20 5c 0d 0a 20 20 20 20  tory \"" \..    
2b7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24 64                $d
2b7c0 69 72 65 63 74 6f 72 79 20 22 5c 22 2c 20 61 6c  irectory "\", al
2b7d0 6c 20 74 65 73 74 69 6e 67 20 68 61 6c 74 65 64  l testing halted
2b7e0 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  "]..            
2b7f0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
2b800 20 73 65 74 20 6c 6f 67 44 69 72 65 63 74 6f 72   set logDirector
2b810 79 20 24 64 69 72 65 63 74 6f 72 79 0d 0a 20 20  y $directory..  
2b820 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
2b830 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65  ..            se
2b840 74 20 6c 6f 67 44 69 72 65 63 74 6f 72 79 20 5b  t logDirectory [
2b850 67 65 74 42 75 69 6c 64 44 69 72 65 63 74 6f 72  getBuildDirector
2b860 79 20 74 72 75 65 5d 0d 0a 20 20 20 20 20 20 20  y true]..       
2b870 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
2b880 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23    #..          #
2b890 20 4e 4f 54 45 3a 20 57 65 27 72 65 20 67 6f 69   NOTE: We're goi
2b8a0 6e 67 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 74  ng to move the t
2b8b0 65 73 74 20 6c 6f 67 20 66 69 6c 65 20 74 6f 20  est log file to 
2b8c0 74 68 65 20 64 69 72 65 63 74 6f 72 79 0d 0a 20  the directory.. 
2b8d0 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
2b8e0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
2b8f0 6d 61 6e 61 67 65 64 20 61 73 73 65 6d 62 6c 69  managed assembli
2b900 65 73 20 62 65 69 6e 67 20 74 65 73 74 65 64 2e  es being tested.
2b910 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
2b920 20 20 20 20 20 20 20 20 20 6d 6f 76 65 54 65 73           moveTes
2b930 74 4c 6f 67 46 69 6c 65 20 24 6c 6f 67 44 69 72  tLogFile $logDir
2b940 65 63 74 6f 72 79 0d 0a 0d 0a 20 20 20 20 20 20  ectory....      
2b950 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
2b960 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20 74 72   # NOTE: Skip tr
2b970 79 69 6e 67 20 74 6f 20 63 6f 70 79 20 61 6e 79  ying to copy any
2b980 20 66 69 6c 65 73 20 69 66 20 69 6e 73 74 72 75   files if instru
2b990 63 74 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 20  cted...         
2b9a0 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   #..          if
2b9b0 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
2b9c0 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65 46  ::no(copySqliteF
2b9d0 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  iles)]} then {..
2b9e0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
2b9f0 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
2ba00 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65 43 6f 6e  no(copySqliteCon
2ba10 66 69 67 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e  figFiles)]} then
2ba20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
2ba30 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
2ba40 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20  channel \..     
2ba50 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
2ba60 2d 2d 20 63 6f 70 79 69 6e 67 20 5c 22 63 6f 6e  -- copying \"con
2ba70 66 69 67 75 72 61 74 69 6f 6e 5c 22 20 66 69 6c  figuration\" fil
2ba80 65 73 2e 2e 2e 5c 6e 22 0d 0a 0d 0a 20 20 20 20  es...\n"....    
2ba90 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63            foreac
2baa0 68 20 66 69 6c 65 4e 61 6d 65 20 24 63 6f 6e 66  h fileName $conf
2bab0 69 67 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20  igFileNames {.. 
2bac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
2bad0 72 79 43 6f 70 79 42 75 69 6c 64 46 69 6c 65 20  ryCopyBuildFile 
2bae0 24 66 69 6c 65 4e 61 6d 65 20 74 72 75 65 0d 0a  $fileName true..
2baf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
2bb00 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
2bb10 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
2bb20 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
2bb30 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65 45  ::no(copySqliteE
2bb40 78 74 65 72 6e 61 6c 46 69 6c 65 73 29 5d 7d 20  xternalFiles)]} 
2bb50 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
2bb60 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
2bb70 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43         # NOTE: C
2bb80 6f 70 79 20 74 68 65 20 4d 61 6e 61 67 65 64 20  opy the Managed 
2bb90 44 65 62 75 67 67 69 6e 67 20 41 73 73 69 73 74  Debugging Assist
2bba0 61 6e 74 73 20 28 4d 44 41 29 20 63 6f 6e 66 69  ants (MDA) confi
2bbb0 67 75 72 61 74 69 6f 6e 0d 0a 20 20 20 20 20 20  guration..      
2bbc0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
2bbd0 66 69 6c 65 20 66 6f 72 20 74 68 65 20 45 61 67  file for the Eag
2bbe0 6c 65 20 73 68 65 6c 6c 20 74 6f 20 74 68 65 20  le shell to the 
2bbf0 62 75 69 6c 64 20 6f 75 74 70 75 74 20 64 69 72  build output dir
2bc00 65 63 74 6f 72 79 2c 0d 0a 20 20 20 20 20 20 20  ectory,..       
2bc10 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 77         #       w
2bc20 68 69 6c 65 20 75 73 69 6e 67 20 65 61 63 68 20  hile using each 
2bc30 6f 66 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20  of the names of 
2bc40 74 68 65 20 76 61 72 69 6f 75 73 20 6c 65 67 61  the various lega
2bc50 63 79 20 74 65 73 74 0d 0a 20 20 20 20 20 20 20  cy test..       
2bc60 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 65         #       e
2bc70 78 65 63 75 74 61 62 6c 65 73 2e 20 20 54 68 69  xecutables.  Thi
2bc80 73 20 77 69 6c 6c 20 68 65 6c 70 20 74 6f 20 6d  s will help to m
2bc90 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 61 6c  ake sure that al
2bca0 6c 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 20  l the..         
2bcb0 20 20 20 20 20 23 20 20 20 20 20 20 20 6c 65 67       #       leg
2bcc0 61 63 79 20 74 65 73 74 73 20 72 75 6e 20 77 69  acy tests run wi
2bcd0 74 68 20 65 78 61 63 74 6c 79 20 74 68 65 20 73  th exactly the s
2bce0 61 6d 65 20 73 65 74 20 6f 66 20 4d 61 6e 61 67  ame set of Manag
2bcf0 65 64 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ed..            
2bd00 20 20 23 20 20 20 20 20 20 20 44 65 62 75 67 67    #       Debugg
2bd10 69 6e 67 20 41 73 73 69 73 74 61 6e 74 73 20 63  ing Assistants c
2bd20 6f 6e 66 69 67 75 72 65 64 2e 0d 0a 20 20 20 20  onfigured...    
2bd30 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
2bd40 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
2bd50 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
2bd60 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
2bd70 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 70 79        "---- copy
2bd80 69 6e 67 20 5c 22 4d 44 41 20 63 6f 6e 66 69 67  ing \"MDA config
2bd90 75 72 61 74 69 6f 6e 5c 22 20 66 69 6c 65 73 2e  uration\" files.
2bda0 2e 2e 5c 6e 22 0d 0a 0d 0a 20 20 20 20 20 20 20  ..\n"....       
2bdb0 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66         foreach f
2bdc0 69 6c 65 4e 61 6d 65 20 24 6d 64 61 43 6f 6e 66  ileName $mdaConf
2bdd0 69 67 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20  igFileNames {.. 
2bde0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
2bdf0 72 79 43 6f 70 79 42 69 6e 61 72 79 46 69 6c 65  ryCopyBinaryFile
2be00 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65 2e   EagleShell.exe.
2be10 6d 64 61 2e 63 6f 6e 66 69 67 20 74 72 75 65 20  mda.config true 
2be20 22 22 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20  "" $fileName..  
2be30 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
2be40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
2be50 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2be60 23 20 4e 4f 54 45 3a 20 43 6f 70 79 20 74 68 65  # NOTE: Copy the
2be70 20 65 78 74 65 72 6e 61 6c 20 62 69 6e 61 72 69   external binari
2be80 65 73 2c 20 69 66 20 61 6e 79 2c 20 74 6f 20 74  es, if any, to t
2be90 68 65 20 64 69 72 65 63 74 6f 72 79 20 74 68 61  he directory tha
2bea0 74 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t..             
2beb0 20 23 20 20 20 20 20 20 20 63 6f 6e 74 61 69 6e   #       contain
2bec0 73 20 74 68 65 20 45 61 67 6c 65 20 73 68 65 6c  s the Eagle shel
2bed0 6c 2e 20 20 54 68 69 73 20 69 73 20 74 79 70 69  l.  This is typi
2bee0 63 61 6c 6c 79 20 75 73 65 64 20 74 6f 20 6d 61  cally used to ma
2bef0 6b 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ke..            
2bf00 20 20 23 20 20 20 20 20 20 20 73 75 72 65 20 61    #       sure a
2bf10 73 73 65 6d 62 6c 69 65 73 20 72 65 66 65 72 65  ssemblies refere
2bf20 6e 63 65 64 20 62 79 20 74 68 65 20 6f 6e 65 73  nced by the ones
2bf30 20 62 65 69 6e 67 20 74 65 73 74 65 64 20 61 72   being tested ar
2bf40 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e..             
2bf50 20 23 20 20 20 20 20 20 20 61 76 61 69 6c 61 62   #       availab
2bf60 6c 65 20 64 75 72 69 6e 67 20 74 68 65 20 74 65  le during the te
2bf70 73 74 69 6e 67 20 70 72 6f 63 65 73 73 2e 0d 0a  sting process...
2bf80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
2bf90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  .              t
2bfa0 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
2bfb0 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 6f 70 79 69  nnel "---- copyi
2bfc0 6e 67 20 5c 22 65 78 74 65 72 6e 61 6c 5c 22 20  ng \"external\" 
2bfd0 66 69 6c 65 73 2e 2e 2e 5c 6e 22 0d 0a 0d 0a 20  files...\n".... 
2bfe0 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
2bff0 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 65  each fileName $e
2c000 78 74 65 72 6e 61 6c 46 69 6c 65 4e 61 6d 65 73  xternalFileNames
2c010 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
2c020 20 20 20 20 74 72 79 43 6f 70 79 45 78 74 65 72      tryCopyExter
2c030 6e 61 6c 46 69 6c 65 20 24 66 69 6c 65 4e 61 6d  nalFile $fileNam
2c040 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e..             
2c050 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
2c060 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
2c070 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
2c080 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69  ts ::no(copySqli
2c090 74 65 4e 61 74 69 76 65 46 69 6c 65 73 29 5d 7d  teNativeFiles)]}
2c0a0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
2c0b0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
2c0c0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
2c0d0 49 66 20 74 68 65 20 74 65 73 74 20 70 6c 61 74  If the test plat
2c0e0 66 6f 72 6d 20 69 73 20 6c 69 6b 65 6c 79 20 74  form is likely t
2c0f0 68 65 20 64 65 66 61 75 6c 74 20 66 6f 72 20 74  he default for t
2c100 68 69 73 0d 0a 20 20 20 20 20 20 20 20 20 20 20  his..           
2c110 20 20 20 23 20 20 20 20 20 20 20 6d 61 63 68 69     #       machi
2c120 6e 65 2c 20 61 6c 73 6f 20 74 72 79 20 74 6f 20  ne, also try to 
2c130 63 6f 70 79 20 74 68 65 20 6e 61 74 69 76 65 20  copy the native 
2c140 66 69 6c 65 73 20 74 6f 20 74 68 65 0d 0a 20 20  files to the..  
2c150 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20              #   
2c160 20 20 20 20 62 69 6e 61 72 79 20 6c 6f 63 61 74      binary locat
2c170 69 6f 6e 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ion...          
2c180 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
2c190 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
2c1a0 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79  exists ::no(copy
2c1b0 53 71 6c 69 74 65 49 6d 70 6c 69 63 69 74 4e 61  SqliteImplicitNa
2c1c0 74 69 76 65 46 69 6c 65 73 29 5d 20 26 26 20 5c  tiveFiles)] && \
2c1d0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2c1e0 20 20 20 20 5b 69 73 44 65 66 61 75 6c 74 42 75      [isDefaultBu
2c1f0 69 6c 64 50 6c 61 74 66 6f 72 6d 5d 7d 20 74 68  ildPlatform]} th
2c200 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
2c210 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
2c220 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20  est_channel \.. 
2c230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c240 20 20 20 22 2d 2d 2d 2d 20 63 6f 70 79 69 6e 67     "---- copying
2c250 20 69 6d 70 6c 69 63 69 74 20 5c 22 6e 61 74 69   implicit \"nati
2c260 76 65 5c 22 20 66 69 6c 65 73 2e 2e 2e 5c 6e 22  ve\" files...\n"
2c270 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
2c280 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65      foreach file
2c290 4e 61 6d 65 20 24 6e 61 74 69 76 65 46 69 6c 65  Name $nativeFile
2c2a0 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20  Names {..       
2c2b0 20 20 20 20 20 20 20 20 20 20 20 74 72 79 43 6f             tryCo
2c2c0 70 79 41 73 73 65 6d 62 6c 79 20 24 66 69 6c 65  pyAssembly $file
2c2d0 4e 61 6d 65 20 66 61 6c 73 65 0d 0a 20 20 20 20  Name false..    
2c2e0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
2c2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
2c300 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2c310 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
2c320 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74  s ::no(copySqlit
2c330 65 4e 6f 6e 49 6d 70 6c 69 63 69 74 46 69 6c 65  eNonImplicitFile
2c340 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  s)]} then {..   
2c350 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
2c360 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
2c370 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65 50 6c  :no(copySqlitePl
2c380 61 74 66 6f 72 6d 46 69 6c 65 73 29 5d 20 26 26  atformFiles)] &&
2c390 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
2c3a0 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20          [string 
2c3b0 6c 65 6e 67 74 68 20 24 70 6c 61 74 66 6f 72 6d  length $platform
2c3c0 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
2c3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c3e0 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
2c3f0 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
2c400 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
2c410 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
2c420 2d 20 63 6f 70 79 69 6e 67 20 5c 22 6e 61 74 69  - copying \"nati
2c430 76 65 5c 22 20 66 69 6c 65 73 20 66 6f 72 20 70  ve\" files for p
2c440 6c 61 74 66 6f 72 6d 20 5c 22 22 20 5c 0d 0a 20  latform \"" \.. 
2c450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c460 20 20 20 20 20 24 70 6c 61 74 66 6f 72 6d 20 5c       $platform \
2c470 22 2e 2e 2e 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20  "...\n]....     
2c480 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
2c490 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6e  each fileName $n
2c4a0 61 74 69 76 65 46 69 6c 65 4e 61 6d 65 73 20 7b  ativeFileNames {
2c4b0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2c4c0 20 20 20 20 20 20 74 72 79 43 6f 70 79 41 73 73        tryCopyAss
2c4d0 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61 6d 65 20  embly $fileName 
2c4e0 66 61 6c 73 65 20 24 70 6c 61 74 66 6f 72 6d 0d  false $platform.
2c4f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2c500 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
2c510 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
2c520 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
2c530 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
2c540 6f 28 63 6f 70 79 53 71 6c 69 74 65 41 72 63 68  o(copySqliteArch
2c550 69 74 65 63 74 75 72 65 46 69 6c 65 73 29 5d 20  itectureFiles)] 
2c560 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
2c570 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e            [strin
2c580 67 20 6c 65 6e 67 74 68 20 24 61 72 63 68 69 74  g length $archit
2c590 65 63 74 75 72 65 5d 20 3e 20 30 7d 20 74 68 65  ecture] > 0} the
2c5a0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
2c5b0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
2c5c0 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
2c5d0 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
2c5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c5f0 20 20 22 2d 2d 2d 2d 20 63 6f 70 79 69 6e 67 20    "---- copying 
2c600 5c 22 6e 61 74 69 76 65 5c 22 20 66 69 6c 65 73  \"native\" files
2c610 20 66 6f 72 20 61 72 63 68 69 74 65 63 74 75 72   for architectur
2c620 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20  e \"" \..       
2c630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24                 $
2c640 61 72 63 68 69 74 65 63 74 75 72 65 20 5c 22 2e  architecture \".
2c650 2e 2e 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  ..\n]....       
2c660 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61             forea
2c670 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6e 61 74  ch fileName $nat
2c680 69 76 65 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a  iveFileNames {..
2c690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c6a0 20 20 20 20 74 72 79 43 6f 70 79 41 73 73 65 6d      tryCopyAssem
2c6b0 62 6c 79 20 24 66 69 6c 65 4e 61 6d 65 20 66 61  bly $fileName fa
2c6c0 6c 73 65 20 24 61 72 63 68 69 74 65 63 74 75 72  lse $architectur
2c6d0 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e..             
2c6e0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
2c6f0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
2c700 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
2c710 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
2c720 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65 46 6f  :no(copySqliteFo
2c730 72 63 65 64 4e 61 74 69 76 65 46 69 6c 65 73 29  rcedNativeFiles)
2c740 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
2c750 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74              [get
2c760 42 75 69 6c 64 4e 61 74 69 76 65 5d 7d 20 74 68  BuildNative]} th
2c770 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
2c780 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
2c790 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d  :test_channel \.
2c7a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2c7b0 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 70         "---- cop
2c7c0 79 69 6e 67 20 66 6f 72 63 65 64 20 5c 22 6e 61  ying forced \"na
2c7d0 74 69 76 65 5c 22 20 66 69 6c 65 73 2e 2e 2e 5c  tive\" files...\
2c7e0 6e 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  n"....          
2c7f0 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
2c800 66 69 6c 65 4e 61 6d 65 20 24 6e 61 74 69 76 65  fileName $native
2c810 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20  FileNames {..   
2c820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c830 20 74 72 79 43 6f 70 79 41 73 73 65 6d 62 6c 79   tryCopyAssembly
2c840 20 24 66 69 6c 65 4e 61 6d 65 20 66 61 6c 73 65   $fileName false
2c850 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2c860 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
2c870 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
2c880 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
2c890 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
2c8a0 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
2c8b0 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63  fo exists ::no(c
2c8c0 6f 70 79 53 71 6c 69 74 65 4d 69 78 65 64 46 69  opySqliteMixedFi
2c8d0 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  les)]} then {.. 
2c8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a               #..
2c8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
2c900 4e 4f 54 45 3a 20 49 66 20 74 68 65 20 22 6e 61  NOTE: If the "na
2c910 74 69 76 65 22 20 72 75 6e 74 69 6d 65 20 6f 70  tive" runtime op
2c920 74 69 6f 6e 20 69 73 20 73 65 74 2c 20 63 6f 70  tion is set, cop
2c930 79 20 69 6d 70 6c 69 63 69 74 0d 0a 20 20 20 20  y implicit..    
2c940 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
2c950 20 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73    mixed-mode ass
2c960 65 6d 62 6c 79 20 66 69 6c 65 73 20 61 73 20 77  embly files as w
2c970 65 6c 6c 2e 20 20 54 68 65 20 72 75 6e 74 69 6d  ell.  The runtim
2c980 65 20 6f 70 74 69 6f 6e 0d 0a 20 20 20 20 20 20  e option..      
2c990 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
2c9a0 63 68 65 63 6b 20 69 73 20 68 61 6e 64 6c 65 64  check is handled
2c9b0 20 77 68 65 6e 20 62 75 69 6c 64 69 6e 67 20 74   when building t
2c9c0 68 65 20 6c 69 73 74 20 6f 66 20 6d 69 78 65 64  he list of mixed
2c9d0 2d 6d 6f 64 65 0d 0a 20 20 20 20 20 20 20 20 20  -mode..         
2c9e0 20 20 20 20 20 23 20 20 20 20 20 20 20 61 73 73       #       ass
2c9f0 65 6d 62 6c 79 20 66 69 6c 65 20 6e 61 6d 65 73  embly file names
2ca00 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
2ca10 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
2ca20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
2ca30 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c  sts ::no(copySql
2ca40 69 74 65 49 6d 70 6c 69 63 69 74 4d 69 78 65 64  iteImplicitMixed
2ca50 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d  Files)]} then {.
2ca60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2ca70 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
2ca80 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20  hannel \..      
2ca90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
2caa0 2d 2d 2d 20 63 6f 70 79 69 6e 67 20 69 6d 70 6c  --- copying impl
2cab0 69 63 69 74 20 5c 22 6d 69 78 65 64 5c 22 20 66  icit \"mixed\" f
2cac0 69 6c 65 73 2e 2e 2e 5c 6e 22 0d 0a 0d 0a 20 20  iles...\n"....  
2cad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f                fo
2cae0 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24  reach fileName $
2caf0 6d 69 78 65 64 46 69 6c 65 4e 61 6d 65 73 20 7b  mixedFileNames {
2cb00 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2cb10 20 20 20 20 74 72 79 43 6f 70 79 41 73 73 65 6d      tryCopyAssem
2cb20 62 6c 79 20 24 66 69 6c 65 4e 61 6d 65 20 66 61  bly $fileName fa
2cb30 6c 73 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  lse..           
2cb40 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
2cb50 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
2cb60 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69           if {![i
2cb70 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
2cb80 63 6f 70 79 53 71 6c 69 74 65 4e 6f 6e 49 6d 70  copySqliteNonImp
2cb90 6c 69 63 69 74 46 69 6c 65 73 29 5d 7d 20 74 68  licitFiles)]} th
2cba0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
2cbb0 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
2cbc0 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70   exists ::no(cop
2cbd0 79 53 71 6c 69 74 65 50 6c 61 74 66 6f 72 6d 46  ySqlitePlatformF
2cbe0 69 6c 65 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20  iles)] && \..   
2cbf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cc00 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20   [string length 
2cc10 24 70 6c 61 74 66 6f 72 6d 5d 20 3e 20 30 7d 20  $platform] > 0} 
2cc20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
2cc30 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
2cc40 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
2cc50 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
2cc60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cc70 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 70 79 69       "---- copyi
2cc80 6e 67 20 5c 22 6d 69 78 65 64 5c 22 20 66 69 6c  ng \"mixed\" fil
2cc90 65 73 20 66 6f 72 20 70 6c 61 74 66 6f 72 6d 20  es for platform 
2cca0 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  \"" \..         
2ccb0 20 20 20 20 20 20 20 20 20 20 20 20 20 24 70 6c               $pl
2ccc0 61 74 66 6f 72 6d 20 5c 22 2e 2e 2e 5c 6e 5d 0d  atform \"...\n].
2ccd0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
2cce0 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c       foreach fil
2ccf0 65 4e 61 6d 65 20 24 6d 69 78 65 64 46 69 6c 65  eName $mixedFile
2cd00 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20  Names {..       
2cd10 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79               try
2cd20 43 6f 70 79 41 73 73 65 6d 62 6c 79 20 24 66 69  CopyAssembly $fi
2cd30 6c 65 4e 61 6d 65 20 66 61 6c 73 65 20 24 70 6c  leName false $pl
2cd40 61 74 66 6f 72 6d 0d 0a 20 20 20 20 20 20 20 20  atform..        
2cd50 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
2cd60 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
2cd70 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2cd80 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
2cd90 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c  sts ::no(copySql
2cda0 69 74 65 41 72 63 68 69 74 65 63 74 75 72 65 46  iteArchitectureF
2cdb0 69 6c 65 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20  iles)] && \..   
2cdc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cdd0 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20   [string length 
2cde0 24 61 72 63 68 69 74 65 63 74 75 72 65 5d 20 3e  $architecture] >
2cdf0 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
2ce00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70                tp
2ce10 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
2ce20 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
2ce30 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
2ce40 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63           "---- c
2ce50 6f 70 79 69 6e 67 20 5c 22 6d 69 78 65 64 5c 22  opying \"mixed\"
2ce60 20 66 69 6c 65 73 20 66 6f 72 20 61 72 63 68 69   files for archi
2ce70 74 65 63 74 75 72 65 20 5c 22 22 20 5c 0d 0a 20  tecture \"" \.. 
2ce80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ce90 20 20 20 20 20 24 61 72 63 68 69 74 65 63 74 75       $architectu
2cea0 72 65 20 5c 22 2e 2e 2e 5c 6e 5d 0d 0a 0d 0a 20  re \"...\n].... 
2ceb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cec0 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d   foreach fileNam
2ced0 65 20 24 6d 69 78 65 64 46 69 6c 65 4e 61 6d 65  e $mixedFileName
2cee0 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s {..           
2cef0 20 20 20 20 20 20 20 20 20 74 72 79 43 6f 70 79           tryCopy
2cf00 41 73 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61  Assembly $fileNa
2cf10 6d 65 20 66 61 6c 73 65 20 24 61 72 63 68 69 74  me false $archit
2cf20 65 63 74 75 72 65 0d 0a 20 20 20 20 20 20 20 20  ecture..        
2cf30 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
2cf40 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
2cf50 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2cf60 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
2cf70 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c  sts ::no(copySql
2cf80 69 74 65 46 6f 72 63 65 64 4d 69 78 65 64 46 69  iteForcedMixedFi
2cf90 6c 65 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20  les)] && \..    
2cfa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cfb0 5b 67 65 74 42 75 69 6c 64 4e 61 74 69 76 65 5d  [getBuildNative]
2cfc0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
2cfd0 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
2cfe0 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
2cff0 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  l \..           
2d000 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
2d010 20 63 6f 70 79 69 6e 67 20 66 6f 72 63 65 64 20   copying forced 
2d020 5c 22 6d 69 78 65 64 5c 22 20 66 69 6c 65 73 2e  \"mixed\" files.
2d030 2e 2e 5c 6e 22 0d 0a 0d 0a 20 20 20 20 20 20 20  ..\n"....       
2d040 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61             forea
2d050 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6d 69 78  ch fileName $mix
2d060 65 64 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20  edFileNames {.. 
2d070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d080 20 20 20 74 72 79 43 6f 70 79 41 73 73 65 6d 62     tryCopyAssemb
2d090 6c 79 20 24 66 69 6c 65 4e 61 6d 65 20 66 61 6c  ly $fileName fal
2d0a0 73 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  se..            
2d0b0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
2d0c0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
2d0d0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
2d0e0 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
2d0f0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
2d100 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
2d110 28 63 6f 70 79 53 71 6c 69 74 65 4d 61 6e 61 67  (copySqliteManag
2d120 65 64 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20  edFiles)]} then 
2d130 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
2d140 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
2d150 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 6f 70  hannel "---- cop
2d160 79 69 6e 67 20 5c 22 6d 61 6e 61 67 65 64 5c 22  ying \"managed\"
2d170 20 66 69 6c 65 73 2e 2e 2e 5c 6e 22 0d 0a 0d 0a   files...\n"....
2d180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f                fo
2d190 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24  reach fileName $
2d1a0 6d 61 6e 61 67 65 64 46 69 6c 65 4e 61 6d 65 73  managedFileNames
2d1b0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
2d1c0 20 20 20 20 74 72 79 43 6f 70 79 41 73 73 65 6d      tryCopyAssem
2d1d0 62 6c 79 20 24 66 69 6c 65 4e 61 6d 65 20 74 72  bly $fileName tr
2d1e0 75 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue..            
2d1f0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
2d200 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d   }..          }.
2d210 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
2d220 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
2d230 3a 20 53 6b 69 70 20 74 72 79 69 6e 67 20 74 6f  : Skip trying to
2d240 20 6c 6f 61 64 20 61 6e 79 20 66 69 6c 65 73 20   load any files 
2d250 69 66 20 69 6e 73 74 72 75 63 74 65 64 2e 0d 0a  if instructed...
2d260 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
2d270 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
2d280 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 6c 6f  o exists ::no(lo
2d290 61 64 53 71 6c 69 74 65 46 69 6c 65 73 29 5d 7d  adSqliteFiles)]}
2d2a0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
2d2b0 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
2d2c0 65 78 69 73 74 73 20 3a 3a 6e 6f 28 6c 6f 61 64  exists ::no(load
2d2d0 53 71 6c 69 74 65 49 6d 70 6c 69 63 69 74 46 69  SqliteImplicitFi
2d2e0 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  les)]} then {.. 
2d2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79               try
2d300 4c 6f 61 64 41 73 73 65 6d 62 6c 79 20 53 79 73  LoadAssembly Sys
2d310 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
2d320 64 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  dll..           
2d330 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
2d340 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
2d350 73 74 73 20 3a 3a 6e 6f 28 6c 6f 61 64 53 71 6c  sts ::no(loadSql
2d360 69 74 65 4c 69 6e 71 46 69 6c 65 73 29 5d 7d 20  iteLinqFiles)]} 
2d370 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
2d380 20 20 20 20 20 20 74 72 79 4c 6f 61 64 41 73 73        tryLoadAss
2d390 65 6d 62 6c 79 20 53 79 73 74 65 6d 2e 44 61 74  embly System.Dat
2d3a0 61 2e 53 51 4c 69 74 65 2e 4c 69 6e 71 2e 64 6c  a.SQLite.Linq.dl
2d3b0 6c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  l..            }
2d3c0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
2d3d0 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
2d3e0 73 20 3a 3a 6e 6f 28 6c 6f 61 64 53 71 6c 69 74  s ::no(loadSqlit
2d3f0 65 45 66 36 46 69 6c 65 73 29 5d 7d 20 74 68 65  eEf6Files)]} the
2d400 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
2d410 20 20 20 74 72 79 4c 6f 61 64 41 73 73 65 6d 62     tryLoadAssemb
2d420 6c 79 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  ly System.Data.S
2d430 51 4c 69 74 65 2e 45 46 36 2e 64 6c 6c 0d 0a 20  QLite.EF6.dll.. 
2d440 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
2d450 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
2d460 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
2d470 6e 6f 28 6c 6f 61 64 53 71 6c 69 74 65 4e 6f 6e  no(loadSqliteNon
2d480 49 6d 70 6c 69 63 69 74 46 69 6c 65 73 29 5d 7d  ImplicitFiles)]}
2d490 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
2d4a0 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
2d4b0 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 6c 6f  o exists ::no(lo
2d4c0 61 64 53 71 6c 69 74 65 50 6c 61 74 66 6f 72 6d  adSqlitePlatform
2d4d0 46 69 6c 65 73 29 5d 20 26 26 20 5c 0d 0a 20 20  Files)] && \..  
2d4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d4f0 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
2d500 70 6c 61 74 66 6f 72 6d 5d 20 3e 20 30 7d 20 74  platform] > 0} t
2d510 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
2d520 20 20 20 20 20 20 20 74 72 79 4c 6f 61 64 41 73         tryLoadAs
2d530 73 65 6d 62 6c 79 20 53 79 73 74 65 6d 2e 44 61  sembly System.Da
2d540 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 20 24 70  ta.SQLite.dll $p
2d550 6c 61 74 66 6f 72 6d 0d 0a 20 20 20 20 20 20 20  latform..       
2d560 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
2d570 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
2d580 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
2d590 28 6c 6f 61 64 53 71 6c 69 74 65 41 72 63 68 69  (loadSqliteArchi
2d5a0 74 65 63 74 75 72 65 46 69 6c 65 73 29 5d 20 26  tectureFiles)] &
2d5b0 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  & \..           
2d5c0 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c         [string l
2d5d0 65 6e 67 74 68 20 24 61 72 63 68 69 74 65 63 74  ength $architect
2d5e0 75 72 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ure] > 0} then {
2d5f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2d600 20 20 74 72 79 4c 6f 61 64 41 73 73 65 6d 62 6c    tryLoadAssembl
2d610 79 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  y System.Data.SQ
2d620 4c 69 74 65 2e 64 6c 6c 20 24 61 72 63 68 69 74  Lite.dll $archit
2d630 65 63 74 75 72 65 0d 0a 20 20 20 20 20 20 20 20  ecture..        
2d640 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
2d650 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
2d660 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
2d670 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63  ..        foreac
2d680 68 20 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 24  h fileNameOnly $
2d690 6e 61 74 69 76 65 46 69 6c 65 4e 61 6d 65 73 20  nativeFileNames 
2d6a0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 61 74  {..          cat
2d6b0 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
2d6c0 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
2d6d0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
2d6e0 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
2d6f0 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c         "---- fil
2d700 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22 22  e version of \""
2d710 20 6e 61 74 69 76 65 2f 20 24 66 69 6c 65 4e 61   native/ $fileNa
2d720 6d 65 4f 6e 6c 79 20 5c 0d 0a 20 20 20 20 20 20  meOnly \..      
2d730 20 20 20 20 20 20 20 20 20 20 22 5c 22 2e 2e 2e            "\"...
2d740 20 5c 22 22 20 5b 66 69 6c 65 20 76 65 72 73 69   \"" [file versi
2d750 6f 6e 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c  on [getBinaryFil
2d760 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20  eName \..       
2d770 20 20 20 20 20 20 20 20 20 24 66 69 6c 65 4e 61           $fileNa
2d780 6d 65 4f 6e 6c 79 5d 5d 20 5c 22 5c 6e 5d 0d 0a  meOnly]] \"\n]..
2d790 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
2d7a0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
2d7b0 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61    foreach fileNa
2d7c0 6d 65 4f 6e 6c 79 20 24 6d 69 78 65 64 46 69 6c  meOnly $mixedFil
2d7d0 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20  eNames {..      
2d7e0 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20      catch {..   
2d7f0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
2d800 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
2d810 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
2d820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
2d830 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73 69 6f 6e  --- file version
2d840 20 6f 66 20 5c 22 22 20 6d 69 78 65 64 2f 20 24   of \"" mixed/ $
2d850 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 5c 0d 0a  fileNameOnly \..
2d860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d870 22 5c 22 2e 2e 2e 20 5c 22 22 20 5b 66 69 6c 65  "\"... \"" [file
2d880 20 76 65 72 73 69 6f 6e 20 5b 67 65 74 42 69 6e   version [getBin
2d890 61 72 79 46 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20  aryFileName \.. 
2d8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24                 $
2d8b0 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 5d 5d 20 5c  fileNameOnly]] \
2d8c0 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  "\n]..          
2d8d0 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  }..        }....
2d8e0 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
2d8f0 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 24 6d 61  fileNameOnly $ma
2d900 6e 61 67 65 64 46 69 6c 65 4e 61 6d 65 73 20 7b  nagedFileNames {
2d910 0d 0a 20 20 20 20 20 20 20 20 20 20 63 61 74 63  ..          catc
2d920 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  h {..           
2d930 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
2d940 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
2d950 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
2d960 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65        "---- file
2d970 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22 22 20   version of \"" 
2d980 6d 61 6e 61 67 65 64 2f 20 24 66 69 6c 65 4e 61  managed/ $fileNa
2d990 6d 65 4f 6e 6c 79 20 5c 0d 0a 20 20 20 20 20 20  meOnly \..      
2d9a0 20 20 20 20 20 20 20 20 20 20 22 5c 22 2e 2e 2e            "\"...
2d9b0 20 5c 22 22 20 5b 66 69 6c 65 20 76 65 72 73 69   \"" [file versi
2d9c0 6f 6e 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c  on [getBinaryFil
2d9d0 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20  eName \..       
2d9e0 20 20 20 20 20 20 20 20 20 24 66 69 6c 65 4e 61           $fileNa
2d9f0 6d 65 4f 6e 6c 79 5d 5d 20 5c 22 5c 6e 5d 0d 0a  meOnly]] \"\n]..
2da00 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
2da10 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
2da20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
2da30 6e 67 74 68 20 24 70 6c 61 74 66 6f 72 6d 5d 20  ngth $platform] 
2da40 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
2da50 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66         foreach f
2da60 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 24 6e 61 74  ileNameOnly $nat
2da70 69 76 65 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a  iveFileNames {..
2da80 20 20 20 20 20 20 20 20 20 20 20 20 63 61 74 63              catc
2da90 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  h {..           
2daa0 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
2dab0 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
2dac0 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
2dad0 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
2dae0 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66 20  file version of 
2daf0 5c 22 22 20 6e 61 74 69 76 65 2f 70 6c 61 74 66  \"" native/platf
2db00 6f 72 6d 2f 20 5c 0d 0a 20 20 20 20 20 20 20 20  orm/ \..        
2db10 20 20 20 20 20 20 20 20 20 20 24 70 6c 61 74 66            $platf
2db20 6f 72 6d 20 2f 20 24 66 69 6c 65 4e 61 6d 65 4f  orm / $fileNameO
2db30 6e 6c 79 20 22 5c 22 2e 2e 2e 20 5c 22 22 20 5b  nly "\"... \"" [
2db40 66 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  file \..        
2db50 20 20 20 20 20 20 20 20 20 20 76 65 72 73 69 6f            versio
2db60 6e 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65  n [getBinaryFile
2db70 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 4f 6e  Name $fileNameOn
2db80 6c 79 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ly \..          
2db90 20 20 20 20 20 20 20 20 24 70 6c 61 74 66 6f 72          $platfor
2dba0 6d 5d 5d 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20  m]] \"\n]..     
2dbb0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
2dbc0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
2dbd0 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e     foreach fileN
2dbe0 61 6d 65 4f 6e 6c 79 20 24 6d 69 78 65 64 46 69  ameOnly $mixedFi
2dbf0 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20  leNames {..     
2dc00 20 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a         catch {..
2dc10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70                tp
2dc20 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
2dc30 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
2dc40 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
2dc50 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20       "---- file 
2dc60 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22 22 20 6d  version of \"" m
2dc70 69 78 65 64 2f 70 6c 61 74 66 6f 72 6d 2f 20 5c  ixed/platform/ \
2dc80 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2dc90 20 20 20 20 24 70 6c 61 74 66 6f 72 6d 20 2f 20      $platform / 
2dca0 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 22 5c  $fileNameOnly "\
2dcb0 22 2e 2e 2e 20 5c 22 22 20 5b 66 69 6c 65 20 5c  "... \"" [file \
2dcc0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2dcd0 20 20 20 20 76 65 72 73 69 6f 6e 20 5b 67 65 74      version [get
2dce0 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 24  BinaryFileName $
2dcf0 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 5c 0d 0a  fileNameOnly \..
2dd00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dd10 20 20 24 70 6c 61 74 66 6f 72 6d 5d 5d 20 5c 22    $platform]] \"
2dd20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  \n]..           
2dd30 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d   }..          }.
2dd40 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
2dd50 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
2dd60 67 20 6c 65 6e 67 74 68 20 24 61 72 63 68 69 74  g length $archit
2dd70 65 63 74 75 72 65 5d 20 3e 20 30 7d 20 74 68 65  ecture] > 0} the
2dd80 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 66  n {..          f
2dd90 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 4f  oreach fileNameO
2dda0 6e 6c 79 20 24 6e 61 74 69 76 65 46 69 6c 65 4e  nly $nativeFileN
2ddb0 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20  ames {..        
2ddc0 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20      catch {..   
2ddd0 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
2dde0 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
2ddf0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
2de00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2de10 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72    "---- file ver
2de20 73 69 6f 6e 20 6f 66 20 5c 22 22 20 6e 61 74 69  sion of \"" nati
2de30 76 65 2f 61 72 63 68 69 74 65 63 74 75 72 65 2f  ve/architecture/
2de40 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
2de50 20 20 20 20 20 20 24 61 72 63 68 69 74 65 63 74        $architect
2de60 75 72 65 20 2f 20 24 66 69 6c 65 4e 61 6d 65 4f  ure / $fileNameO
2de70 6e 6c 79 20 22 5c 22 2e 2e 2e 20 5c 22 22 20 5b  nly "\"... \"" [
2de80 66 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  file \..        
2de90 20 20 20 20 20 20 20 20 20 20 76 65 72 73 69 6f            versio
2dea0 6e 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65  n [getBinaryFile
2deb0 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 4f 6e  Name $fileNameOn
2dec0 6c 79 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ly \..          
2ded0 20 20 20 20 20 20 20 20 24 61 72 63 68 69 74 65          $archite
2dee0 63 74 75 72 65 5d 5d 20 5c 22 5c 6e 5d 0d 0a 20  cture]] \"\n].. 
2def0 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
2df00 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
2df10 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66         foreach f
2df20 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 24 6d 69 78  ileNameOnly $mix
2df30 65 64 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20  edFileNames {.. 
2df40 20 20 20 20 20 20 20 20 20 20 20 63 61 74 63 68             catch
2df50 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
2df60 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
2df70 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
2df80 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
2df90 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66           "---- f
2dfa0 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c  ile version of \
2dfb0 22 22 20 6d 69 78 65 64 2f 61 72 63 68 69 74 65  "" mixed/archite
2dfc0 63 74 75 72 65 2f 20 5c 0d 0a 20 20 20 20 20 20  cture/ \..      
2dfd0 20 20 20 20 20 20 20 20 20 20 20 20 24 61 72 63              $arc
2dfe0 68 69 74 65 63 74 75 72 65 20 2f 20 24 66 69 6c  hitecture / $fil
2dff0 65 4e 61 6d 65 4f 6e 6c 79 20 22 5c 22 2e 2e 2e  eNameOnly "\"...
2e000 20 5c 22 22 20 5b 66 69 6c 65 20 5c 0d 0a 20 20   \"" [file \..  
2e010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e020 76 65 72 73 69 6f 6e 20 5b 67 65 74 42 69 6e 61  version [getBina
2e030 72 79 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65  ryFileName $file
2e040 4e 61 6d 65 4f 6e 6c 79 20 5c 0d 0a 20 20 20 20  NameOnly \..    
2e050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24 61                $a
2e060 72 63 68 69 74 65 63 74 75 72 65 5d 5d 20 5c 22  rchitecture]] \"
2e070 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  \n]..           
2e080 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d   }..          }.
2e090 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
2e0a0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
2e0b0 20 23 20 4e 4f 54 45 3a 20 47 72 61 62 20 74 68   # NOTE: Grab th
2e0c0 65 20 6c 69 73 74 20 6f 66 20 6d 61 6e 61 67 65  e list of manage
2e0d0 64 20 61 73 73 65 6d 62 6c 69 65 73 20 66 6f 72  d assemblies for
2e0e0 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 72 6f   the current pro
2e0f0 63 65 73 73 0d 0a 20 20 20 20 20 20 20 20 23 20  cess..        # 
2e100 20 20 20 20 20 20 61 6e 64 20 72 65 70 6f 72 74        and report
2e110 20 6f 6e 20 74 68 65 20 53 79 73 74 65 6d 2e 44   on the System.D
2e120 61 74 61 2e 53 51 4c 69 74 65 20 72 65 6c 61 74  ata.SQLite relat
2e130 65 64 20 6f 6e 65 73 2e 0d 0a 20 20 20 20 20 20  ed ones...      
2e140 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20    #..        if 
2e150 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f 62 6a 65  {[haveSQLiteObje
2e160 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65 6e  ctCommand]} then
2e170 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   {..          if
2e180 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
2e190 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69          object i
2e1a0 6e 76 6f 6b 65 20 55 74 69 6c 69 74 79 20 47 65  nvoke Utility Ge
2e1b0 74 41 73 73 65 6d 62 6c 69 65 73 0d 0a 20 20 20  tAssemblies..   
2e1c0 20 20 20 20 20 20 20 7d 20 61 73 73 65 6d 62 6c         } assembl
2e1d0 69 65 73 5d 20 3d 3d 20 30 20 7c 7c 20 5b 63 61  ies] == 0 || [ca
2e1e0 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
2e1f0 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65     object invoke
2e200 20 41 70 70 44 6f 6d 61 69 6e 2e 43 75 72 72 65   AppDomain.Curre
2e210 6e 74 44 6f 6d 61 69 6e 20 47 65 74 41 73 73 65  ntDomain GetAsse
2e220 6d 62 6c 69 65 73 0d 0a 20 20 20 20 20 20 20 20  mblies..        
2e230 20 20 7d 20 61 73 73 65 6d 62 6c 69 65 73 5d 20    } assemblies] 
2e240 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
2e250 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74            object
2e260 20 66 6f 72 65 61 63 68 20 61 73 73 65 6d 62 6c   foreach assembl
2e270 79 20 24 61 73 73 65 6d 62 6c 69 65 73 20 7b 0d  y $assemblies {.
2e280 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
2e290 66 20 7b 5b 73 74 72 69 6e 67 20 6d 61 74 63 68  f {[string match
2e2a0 20 5c 7b 53 79 73 74 65 6d 2e 44 61 74 61 2e 53   \{System.Data.S
2e2b0 51 4c 69 74 65 2a 20 24 61 73 73 65 6d 62 6c 79  QLite* $assembly
2e2c0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
2e2d0 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
2e2e0 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
2e2f0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
2e300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e310 20 20 20 20 22 2d 2d 2d 2d 20 66 6f 75 6e 64 20      "---- found 
2e320 6c 6f 61 64 65 64 20 61 73 73 65 6d 62 6c 79 3a  loaded assembly:
2e330 20 22 20 24 61 73 73 65 6d 62 6c 79 20 5c 6e 5d   " $assembly \n]
2e340 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2e350 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  }..            }
2e360 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
2e370 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
2e380 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20      catch {..   
2e390 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
2e3a0 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a  test_channel \..
2e3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
2e3c0 2d 2d 2d 20 64 65 66 69 6e 65 20 63 6f 6e 73 74  --- define const
2e3d0 61 6e 74 73 20 66 6f 72 20 5c 22 53 79 73 74 65  ants for \"Syste
2e3e0 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 5c 22 2e  m.Data.SQLite\".
2e3f0 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20  .. "....        
2e400 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
2e410 20 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65              obje
2e420 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73  ct invoke -flags
2e430 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20   +NonPublic \.. 
2e440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
2e450 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
2e460 65 2e 53 51 4c 69 74 65 33 20 44 65 66 69 6e 65  e.SQLite3 Define
2e470 43 6f 6e 73 74 61 6e 74 73 0d 0a 20 20 20 20 20  Constants..     
2e480 20 20 20 20 20 7d 20 64 65 66 69 6e 65 43 6f 6e       } defineCon
2e490 73 74 61 6e 74 73 5d 20 3d 3d 20 30 7d 20 74 68  stants] == 0} th
2e4a0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
2e4b0 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
2e4c0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
2e4d0 72 67 73 20 5b 66 6f 72 6d 61 74 4c 69 73 74 20  rgs [formatList 
2e4e0 5b 6c 73 6f 72 74 20 5c 0d 0a 20 20 20 20 20 20  [lsort \..      
2e4f0 20 20 20 20 20 20 20 20 20 20 24 64 65 66 69 6e            $defin
2e500 65 43 6f 6e 73 74 61 6e 74 73 5d 20 3c 6e 6f 6e  eConstants] <non
2e510 65 3e 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  e>] \n]..       
2e520 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
2e530 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
2e540 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 75  ::test_channel u
2e550 6e 6b 6e 6f 77 6e 5c 6e 0d 0a 20 20 20 20 20 20  nknown\n..      
2e560 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
2e570 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63 61 74 63  ....        catc
2e580 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74  h {..          t
2e590 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
2e5a0 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20  nnel \..        
2e5b0 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6f 75 72        "---- sour
2e5c0 63 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22  ce version of \"
2e5d0 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
2e5e0 74 65 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 0d 0a 0d  te.dll\"... "...
2e5f0 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b  .          if {[
2e600 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
2e610 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f       object invo
2e620 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75  ke -flags +NonPu
2e630 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20  blic \..        
2e640 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44          System.D
2e650 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74  ata.SQLite.SQLit
2e660 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 50 72 6f 76  eConnection Prov
2e670 69 64 65 72 56 65 72 73 69 6f 6e 0d 0a 20 20 20  iderVersion..   
2e680 20 20 20 20 20 20 20 7d 20 76 65 72 73 69 6f 6e         } version
2e690 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
2e6a0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
2e6b0 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
2e6c0 76 65 72 73 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74  version] == 0} t
2e6d0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
2e6e0 20 20 20 20 20 73 65 74 20 76 65 72 73 69 6f 6e       set version
2e6f0 20 6e 75 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20   null..         
2e700 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
2e710 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
2e720 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
2e730 72 67 73 20 24 76 65 72 73 69 6f 6e 20 5c 6e 5d  rgs $version \n]
2e740 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c  ..          } el
2e750 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
2e760 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
2e770 63 68 61 6e 6e 65 6c 20 75 6e 6b 6e 6f 77 6e 5c  channel unknown\
2e780 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  n..          }..
2e790 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
2e7a0 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20       catch {..  
2e7b0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
2e7c0 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d  :test_channel \.
2e7d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
2e7e0 2d 2d 2d 2d 20 73 6f 75 72 63 65 20 63 68 65 63  ---- source chec
2e7f0 6b 6f 75 74 20 6f 66 20 5c 22 53 79 73 74 65 6d  kout of \"System
2e800 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c  .Data.SQLite.dll
2e810 5c 22 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20  \"... "....     
2e820 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
2e830 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f  {..            o
2e840 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c  bject invoke -fl
2e850 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c  ags +NonPublic \
2e860 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2e870 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51    System.Data.SQ
2e880 4c 69 74 65 2e 53 51 4c 69 74 65 43 6f 6e 6e 65  Lite.SQLiteConne
2e890 63 74 69 6f 6e 20 50 72 6f 76 69 64 65 72 53 6f  ction ProviderSo
2e8a0 75 72 63 65 49 64 0d 0a 20 20 20 20 20 20 20 20  urceId..        
2e8b0 20 20 7d 20 73 6f 75 72 63 65 49 64 5d 20 3d 3d    } sourceId] ==
2e8c0 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
2e8d0 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72          if {[str
2e8e0 69 6e 67 20 6c 65 6e 67 74 68 20 24 73 6f 75 72  ing length $sour
2e8f0 63 65 49 64 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  ceId] == 0} then
2e900 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
2e910 20 20 73 65 74 20 73 6f 75 72 63 65 49 64 20 6e    set sourceId n
2e920 75 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ull..           
2e930 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
2e940 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
2e950 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
2e960 73 20 24 73 6f 75 72 63 65 49 64 20 5c 6e 5d 0d  s $sourceId \n].
2e970 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73  .          } els
2e980 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e {..           
2e990 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
2e9a0 68 61 6e 6e 65 6c 20 75 6e 6b 6e 6f 77 6e 5c 6e  hannel unknown\n
2e9b0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
2e9c0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
2e9d0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
2e9e0 20 4e 4f 54 45 3a 20 52 65 73 65 74 20 63 61 63   NOTE: Reset cac
2e9f0 68 65 64 20 22 62 72 65 61 6b 20 69 6e 74 6f 20  hed "break into 
2ea00 64 65 62 75 67 67 65 72 22 20 73 65 74 74 69 6e  debugger" settin
2ea10 67 20 73 6f 20 74 68 61 74 20 69 74 20 63 61 6e  g so that it can
2ea20 20 62 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20   be..        #  
2ea30 20 20 20 20 20 75 73 65 64 20 64 75 72 69 6e 67       used during
2ea40 20 74 68 65 20 74 65 73 74 20 66 69 6c 65 2c 20   the test file, 
2ea50 69 66 20 6e 65 65 64 65 64 2e 0d 0a 20 20 20 20  if needed...    
2ea60 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69      #..        i
2ea70 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
2ea80 20 3a 3a 6e 6f 28 72 65 73 65 74 42 72 65 61 6b   ::no(resetBreak
2ea90 49 6e 74 6f 44 65 62 75 67 67 65 72 29 5d 20 26  IntoDebugger)] &
2eaa0 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  & \..           
2eab0 20 5b 68 61 76 65 53 51 4c 69 74 65 4f 62 6a 65   [haveSQLiteObje
2eac0 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65 6e  ctCommand]} then
2ead0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   {..          if
2eae0 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
2eaf0 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69          object i
2eb00 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f  nvoke -flags +No
2eb10 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20  nPublic \..     
2eb20 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65             Syste
2eb30 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 48 65  m.Data.SQLite.He
2eb40 6c 70 65 72 4d 65 74 68 6f 64 73 20 52 65 73 65  lperMethods Rese
2eb50 74 42 72 65 61 6b 49 6e 74 6f 44 65 62 75 67 67  tBreakIntoDebugg
2eb60 65 72 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20  er..          } 
2eb70 72 65 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68  result] == 0} th
2eb80 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
2eb90 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
2eba0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
2ebb0 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
2ebc0 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 61 6c         "---- cal
2ebd0 6c 20 52 65 73 65 74 42 72 65 61 6b 49 6e 74 6f  l ResetBreakInto
2ebe0 44 65 62 75 67 67 65 72 28 29 2e 2e 2e 20 6f 6b  Debugger()... ok
2ebf0 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  \n"]..          
2ec00 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
2ec10 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
2ec20 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
2ec30 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
2ec40 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
2ec50 20 63 61 6c 6c 20 52 65 73 65 74 42 72 65 61 6b   call ResetBreak
2ec60 49 6e 74 6f 44 65 62 75 67 67 65 72 28 29 2e 2e  IntoDebugger()..
2ec70 2e 20 65 72 72 6f 72 3a 20 22 20 5c 0d 0a 20 20  . error: " \..  
2ec80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 6e                \n
2ec90 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a  \t $result \n]..
2eca0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
2ecb0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
2ecc0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
2ecd0 4f 54 45 3a 20 43 68 65 63 6b 20 74 68 65 20 61  OTE: Check the a
2ece0 76 61 69 6c 61 62 6c 65 20 62 75 69 6c 64 73 20  vailable builds 
2ecf0 28 61 6e 64 20 22 72 65 6c 65 61 73 65 73 22 29  (and "releases")
2ed00 20 6f 66 20 53 51 4c 69 74 65 20 61 6e 64 0d 0a   of SQLite and..
2ed10 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
2ed20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
2ed30 74 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  te...        #..
2ed40 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72          checkFor
2ed50 53 51 4c 69 74 65 42 75 69 6c 64 73 20 24 3a 3a  SQLiteBuilds $::
2ed60 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 20 20  test_channel..  
2ed70 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51        checkForSQ
2ed80 4c 69 74 65 52 65 6c 65 61 73 65 73 20 24 3a 3a  LiteReleases $::
2ed90 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a  test_channel....
2eda0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
2edb0 20 20 20 23 20 4e 4f 54 45 3a 20 4e 6f 77 2c 20     # NOTE: Now, 
2edc0 77 65 20 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20  we need to know 
2edd0 69 66 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f  if the SQLite co
2ede0 72 65 20 6c 69 62 72 61 72 79 20 69 73 20 61 76  re library is av
2edf0 61 69 6c 61 62 6c 65 0d 0a 20 20 20 20 20 20 20  ailable..       
2ee00 20 23 20 20 20 20 20 20 20 28 69 2e 65 2e 20 62   #       (i.e. b
2ee10 65 63 61 75 73 65 20 74 68 65 20 6d 61 6e 61 67  ecause the manag
2ee20 65 64 2d 6f 6e 6c 79 20 53 79 73 74 65 6d 2e 44  ed-only System.D
2ee30 61 74 61 2e 53 51 4c 69 74 65 20 61 73 73 65 6d  ata.SQLite assem
2ee40 62 6c 79 20 63 61 6e 0d 0a 20 20 20 20 20 20 20  bly can..       
2ee50 20 23 20 20 20 20 20 20 20 6c 6f 61 64 20 77 69   #       load wi
2ee60 74 68 6f 75 74 20 69 74 3b 20 68 6f 77 65 76 65  thout it; howeve
2ee70 72 2c 20 69 74 20 63 61 6e 6e 6f 74 20 64 6f 20  r, it cannot do 
2ee80 61 6e 79 74 68 69 6e 67 20 75 73 65 66 75 6c 20  anything useful 
2ee90 77 69 74 68 6f 75 74 0d 0a 20 20 20 20 20 20 20  without..       
2eea0 20 23 20 20 20 20 20 20 20 69 74 29 2e 20 20 49   #       it).  I
2eeb0 66 20 77 65 20 61 72 65 20 75 73 69 6e 67 20 74  f we are using t
2eec0 68 65 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73  he mixed-mode as
2eed0 73 65 6d 62 6c 79 20 61 6e 64 20 77 65 20 61 6c  sembly and we al
2eee0 72 65 61 64 79 0d 0a 20 20 20 20 20 20 20 20 23  ready..        #
2eef0 20 20 20 20 20 20 20 66 6f 75 6e 64 20 69 74 20         found it 
2ef00 28 61 62 6f 76 65 29 2c 20 74 68 69 73 20 73 68  (above), this sh
2ef10 6f 75 6c 64 20 61 6c 77 61 79 73 20 73 75 63 63  ould always succ
2ef20 65 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  eed...        #.
2ef30 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f  .        checkFo
2ef40 72 53 51 4c 69 74 65 4c 69 62 72 61 72 79 20 24  rSQLiteLibrary $
2ef50 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a  ::test_channel..
2ef60 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
2ef70 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65       # NOTE: Che
2ef80 63 6b 20 69 66 20 74 68 65 20 53 51 4c 69 74 65  ck if the SQLite
2ef90 20 69 6e 74 65 72 6f 70 20 61 73 73 65 6d 62 6c   interop assembl
2efa0 79 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0d  y is available..
2efb0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
2efc0 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51 4c 69      checkForSQLi
2efd0 74 65 49 6e 74 65 72 6f 70 20 24 3a 3a 74 65 73  teInterop $::tes
2efe0 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20  t_channel....   
2eff0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
2f000 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 74 68  # NOTE: Check th
2f010 65 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73  e SQLite databas
2f020 65 20 61 6e 64 20 74 65 6d 70 6f 72 61 72 79 20  e and temporary 
2f030 64 69 72 65 63 74 6f 72 69 65 73 2e 0d 0a 20 20  directories...  
2f040 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
2f050 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 44   checkForSQLiteD
2f060 69 72 65 63 74 6f 72 69 65 73 20 24 3a 3a 74 65  irectories $::te
2f070 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20  st_channel....  
2f080 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
2f090 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74   # NOTE: Attempt
2f0a0 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66   to determine if
2f0b0 20 76 61 72 69 6f 75 73 20 63 6f 6d 70 69 6c 65   various compile
2f0c0 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 73 20 6e 65  -time options ne
2f0d0 65 64 65 64 20 66 6f 72 0d 0a 20 20 20 20 20 20  eded for..      
2f0e0 20 20 23 20 20 20 20 20 20 20 74 65 73 74 20 63    #       test c
2f0f0 6f 6e 73 74 72 61 69 6e 74 73 20 77 65 72 65 20  onstraints were 
2f100 65 6e 61 62 6c 65 64 20 66 6f 72 20 74 68 65 20  enabled for the 
2f110 6d 61 6e 61 67 65 64 20 61 73 73 65 6d 62 6c 79  managed assembly
2f120 2e 20 20 54 68 65 72 65 0d 0a 20 20 20 20 20 20  .  There..      
2f130 20 20 23 20 20 20 20 20 20 20 61 72 65 20 73 6f    #       are so
2f140 6d 65 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  me compile-time 
2f150 6f 70 74 69 6f 6e 73 20 74 68 61 74 20 6d 75 73  options that mus
2f160 74 20 61 6c 73 6f 20 68 61 76 65 20 62 65 65 6e  t also have been
2f170 20 65 6e 61 62 6c 65 64 0d 0a 20 20 20 20 20 20   enabled..      
2f180 20 20 23 20 20 20 20 20 20 20 66 6f 72 20 74 68    #       for th
2f190 65 20 69 6e 74 65 72 6f 70 20 61 73 73 65 6d 62  e interop assemb
2f1a0 6c 79 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62  ly in order to b
2f1b0 65 20 65 66 66 65 63 74 69 76 65 2e 20 20 46 6f  e effective.  Fo
2f1c0 72 20 74 68 6f 73 65 0d 0a 20 20 20 20 20 20 20  r those..       
2f1d0 20 23 20 20 20 20 20 20 20 6f 70 74 69 6f 6e 73   #       options
2f1e0 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 61 73 73  , it will be ass
2f1f0 75 6d 65 64 20 74 68 61 74 20 69 74 20 77 61 73  umed that it was
2f200 20 65 6e 61 62 6c 65 64 20 66 6f 72 20 74 68 65   enabled for the
2f210 20 69 6e 74 65 72 6f 70 0d 0a 20 20 20 20 20 20   interop..      
2f220 20 20 23 20 20 20 20 20 20 20 61 73 73 65 6d 62    #       assemb
2f230 6c 79 20 69 66 20 69 74 20 77 61 73 20 65 6e 61  ly if it was ena
2f240 62 6c 65 64 20 66 6f 72 20 74 68 65 20 6d 61 6e  bled for the man
2f250 61 67 65 64 20 61 73 73 65 6d 62 6c 79 2e 0d 0a  aged assembly...
2f260 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
2f270 20 20 20 66 6f 72 65 61 63 68 20 64 65 66 69 6e     foreach defin
2f280 65 43 6f 6e 73 74 61 6e 74 20 5b 6c 69 73 74 20  eConstant [list 
2f290 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 43  \..            C
2f2a0 48 45 43 4b 5f 53 54 41 54 45 20 43 4f 55 4e 54  HECK_STATE COUNT
2f2b0 5f 48 41 4e 44 4c 45 20 44 45 42 55 47 20 49 4e  _HANDLE DEBUG IN
2f2c0 54 45 52 4f 50 5f 43 4f 44 45 43 20 49 4e 54 45  TEROP_CODEC INTE
2f2d0 52 4f 50 5f 44 45 42 55 47 20 5c 0d 0a 20 20 20  ROP_DEBUG \..   
2f2e0 20 20 20 20 20 20 20 20 20 49 4e 54 45 52 4f 50           INTEROP
2f2f0 5f 45 58 54 45 4e 53 49 4f 4e 5f 46 55 4e 43 54  _EXTENSION_FUNCT
2f300 49 4f 4e 53 20 49 4e 54 45 52 4f 50 5f 46 54 53  IONS INTEROP_FTS
2f310 35 5f 45 58 54 45 4e 53 49 4f 4e 20 5c 0d 0a 20  5_EXTENSION \.. 
2f320 20 20 20 20 20 20 20 20 20 20 20 49 4e 54 45 52             INTER
2f330 4f 50 5f 49 4e 43 4c 55 44 45 5f 43 45 52 4f 44  OP_INCLUDE_CEROD
2f340 20 49 4e 54 45 52 4f 50 5f 49 4e 43 4c 55 44 45   INTEROP_INCLUDE
2f350 5f 45 58 54 52 41 20 49 4e 54 45 52 4f 50 5f 49  _EXTRA INTEROP_I
2f360 4e 43 4c 55 44 45 5f 53 45 45 20 5c 0d 0a 20 20  NCLUDE_SEE \..  
2f370 20 20 20 20 20 20 20 20 20 20 49 4e 54 45 52 4f            INTERO
2f380 50 5f 49 4e 43 4c 55 44 45 5f 5a 49 50 56 46 53  P_INCLUDE_ZIPVFS
2f390 20 49 4e 54 45 52 4f 50 5f 4a 53 4f 4e 31 5f 45   INTEROP_JSON1_E
2f3a0 58 54 45 4e 53 49 4f 4e 20 5c 0d 0a 20 20 20 20  XTENSION \..    
2f3b0 20 20 20 20 20 20 20 20 49 4e 54 45 52 4f 50 5f          INTEROP_
2f3c0 4c 45 47 41 43 59 5f 43 4c 4f 53 45 20 49 4e 54  LEGACY_CLOSE INT
2f3d0 45 52 4f 50 5f 4c 4f 47 20 49 4e 54 45 52 4f 50  EROP_LOG INTEROP
2f3e0 5f 50 45 52 43 45 4e 54 49 4c 45 5f 45 58 54 45  _PERCENTILE_EXTE
2f3f0 4e 53 49 4f 4e 20 5c 0d 0a 20 20 20 20 20 20 20  NSION \..       
2f400 20 20 20 20 20 49 4e 54 45 52 4f 50 5f 52 45 47       INTEROP_REG
2f410 45 58 50 5f 45 58 54 45 4e 53 49 4f 4e 20 49 4e  EXP_EXTENSION IN
2f420 54 45 52 4f 50 5f 53 45 53 53 49 4f 4e 5f 45 58  TEROP_SESSION_EX
2f430 54 45 4e 53 49 4f 4e 20 5c 0d 0a 20 20 20 20 20  TENSION \..     
2f440 20 20 20 20 20 20 20 49 4e 54 45 52 4f 50 5f 53         INTEROP_S
2f450 48 41 31 5f 45 58 54 45 4e 53 49 4f 4e 20 49 4e  HA1_EXTENSION IN
2f460 54 45 52 4f 50 5f 54 45 53 54 5f 45 58 54 45 4e  TEROP_TEST_EXTEN
2f470 53 49 4f 4e 20 5c 0d 0a 20 20 20 20 20 20 20 20  SION \..        
2f480 20 20 20 20 49 4e 54 45 52 4f 50 5f 54 4f 54 59      INTEROP_TOTY
2f490 50 45 5f 45 58 54 45 4e 53 49 4f 4e 20 49 4e 54  PE_EXTENSION INT
2f4a0 45 52 4f 50 5f 56 49 52 54 55 41 4c 5f 54 41 42  EROP_VIRTUAL_TAB
2f4b0 4c 45 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  LE \..          
2f4c0 20 20 4e 45 54 5f 32 30 20 4e 45 54 5f 33 35 20    NET_20 NET_35 
2f4d0 4e 45 54 5f 34 30 20 4e 45 54 5f 34 35 20 4e 45  NET_40 NET_45 NE
2f4e0 54 5f 34 35 31 20 4e 45 54 5f 34 35 32 20 4e 45  T_451 NET_452 NE
2f4f0 54 5f 34 36 20 4e 45 54 5f 34 36 31 20 5c 0d 0a  T_46 NET_461 \..
2f500 20 20 20 20 20 20 20 20 20 20 20 20 4e 45 54 5f              NET_
2f510 34 36 32 20 4e 45 54 5f 34 37 20 4e 45 54 5f 34  462 NET_47 NET_4
2f520 37 31 20 4e 45 54 5f 34 37 32 20 4e 45 54 5f 43  71 NET_472 NET_C
2f530 4f 4d 50 41 43 54 5f 32 30 20 4e 45 54 5f 53 54  OMPACT_20 NET_ST
2f540 41 4e 44 41 52 44 5f 32 30 20 5c 0d 0a 20 20 20  ANDARD_20 \..   
2f550 20 20 20 20 20 20 20 20 20 4e 45 54 5f 53 54 41           NET_STA
2f560 4e 44 41 52 44 5f 32 31 20 50 4c 41 54 46 4f 52  NDARD_21 PLATFOR
2f570 4d 5f 43 4f 4d 50 41 43 54 46 52 41 4d 45 57 4f  M_COMPACTFRAMEWO
2f580 52 4b 20 50 52 45 4c 4f 41 44 5f 4e 41 54 49 56  RK PRELOAD_NATIV
2f590 45 5f 4c 49 42 52 41 52 59 20 5c 0d 0a 20 20 20  E_LIBRARY \..   
2f5a0 20 20 20 20 20 20 20 20 20 52 45 54 41 52 47 45           RETARGE
2f5b0 54 41 42 4c 45 20 53 51 4c 49 54 45 5f 53 54 41  TABLE SQLITE_STA
2f5c0 4e 44 41 52 44 20 54 48 52 4f 57 5f 4f 4e 5f 44  NDARD THROW_ON_D
2f5d0 49 53 50 4f 53 45 44 20 5c 0d 0a 20 20 20 20 20  ISPOSED \..     
2f5e0 20 20 20 20 20 20 20 54 52 41 43 45 20 54 52 41         TRACE TRA
2f5f0 43 45 5f 43 4f 4e 4e 45 43 54 49 4f 4e 20 54 52  CE_CONNECTION TR
2f600 41 43 45 5f 44 45 54 45 43 54 49 4f 4e 20 54 52  ACE_DETECTION TR
2f610 41 43 45 5f 48 41 4e 44 4c 45 20 54 52 41 43 45  ACE_HANDLE TRACE
2f620 5f 50 52 45 4c 4f 41 44 20 5c 0d 0a 20 20 20 20  _PRELOAD \..    
2f630 20 20 20 20 20 20 20 20 54 52 41 43 45 5f 53 48          TRACE_SH
2f640 41 52 45 44 20 54 52 41 43 45 5f 53 54 41 54 45  ARED TRACE_STATE
2f650 4d 45 4e 54 20 54 52 41 43 45 5f 57 41 52 4e 49  MENT TRACE_WARNI
2f660 4e 47 20 54 52 41 43 4b 5f 4d 45 4d 4f 52 59 5f  NG TRACK_MEMORY_
2f670 42 59 54 45 53 20 5c 0d 0a 20 20 20 20 20 20 20  BYTES \..       
2f680 20 20 20 20 20 55 53 45 5f 45 4e 54 49 54 59 5f       USE_ENTITY_
2f690 46 52 41 4d 45 57 4f 52 4b 5f 36 20 55 53 45 5f  FRAMEWORK_6 USE_
2f6a0 49 4e 54 45 52 4f 50 5f 44 4c 4c 20 55 53 45 5f  INTEROP_DLL USE_
2f6b0 50 52 45 50 41 52 45 5f 56 32 20 57 49 4e 44 4f  PREPARE_V2 WINDO
2f6c0 57 53 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  WS] {..         
2f6d0 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
2f6e0 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20 74  NOTE: Check if t
2f6f0 68 65 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  he compile-time 
2f700 6f 70 74 69 6f 6e 20 69 73 20 6c 69 73 74 65 64  option is listed
2f710 20 69 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 0d   in the list of.
2f720 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20  .          #    
2f730 20 20 20 22 64 65 66 69 6e 65 20 63 6f 6e 73 74     "define const
2f740 61 6e 74 73 22 20 6b 65 70 74 20 74 72 61 63 6b  ants" kept track
2f750 20 6f 66 20 62 79 20 74 68 65 20 6d 61 6e 61 67   of by the manag
2f760 65 64 20 61 73 73 65 6d 62 6c 79 2e 0d 0a 20 20  ed assembly...  
2f770 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
2f780 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51 4c       checkForSQL
2f790 69 74 65 44 65 66 69 6e 65 43 6f 6e 73 74 61 6e  iteDefineConstan
2f7a0 74 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  t $::test_channe
2f7b0 6c 20 24 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e  l $defineConstan
2f7c0 74 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  t..        }....
2f7d0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
2f7e0 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d     # NOTE: Attem
2f7f0 70 74 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  pt to determine 
2f800 69 66 20 76 61 72 69 6f 75 73 20 63 6f 6d 70 69  if various compi
2f810 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 73 20  le-time options 
2f820 6e 65 65 64 65 64 20 66 6f 72 0d 0a 20 20 20 20  needed for..    
2f830 20 20 20 20 23 20 20 20 20 20 20 20 74 65 73 74      #       test
2f840 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 77 65 72   constraints wer
2f850 65 20 65 6e 61 62 6c 65 64 20 66 6f 72 20 74 68  e enabled for th
2f860 65 20 69 6e 74 65 72 6f 70 20 61 73 73 65 6d 62  e interop assemb
2f870 6c 79 20 61 6e 64 2f 6f 72 0d 0a 20 20 20 20 20  ly and/or..     
2f880 20 20 20 23 20 20 20 20 20 20 20 66 6f 72 20 74     #       for t
2f890 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20 6c  he SQLite core l
2f8a0 69 62 72 61 72 79 2e 0d 0a 20 20 20 20 20 20 20  ibrary...       
2f8b0 20 23 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 65   #..        fore
2f8c0 61 63 68 20 63 6f 6d 70 69 6c 65 4f 70 74 69 6f  ach compileOptio
2f8d0 6e 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20  n [list \..     
2f8e0 20 20 20 20 20 20 20 43 4f 44 45 43 20 45 58 54         CODEC EXT
2f8f0 45 4e 53 49 4f 4e 5f 46 55 4e 43 54 49 4f 4e 53  ENSION_FUNCTIONS
2f900 20 48 41 53 5f 43 4f 44 45 43 20 49 4e 43 4c 55   HAS_CODEC INCLU
2f910 44 45 5f 43 45 52 4f 44 20 49 4e 43 4c 55 44 45  DE_CEROD INCLUDE
2f920 5f 45 58 54 52 41 20 5c 0d 0a 20 20 20 20 20 20  _EXTRA \..      
2f930 20 20 20 20 20 20 49 4e 43 4c 55 44 45 5f 53 45        INCLUDE_SE
2f940 45 20 49 4e 43 4c 55 44 45 5f 5a 49 50 56 46 53  E INCLUDE_ZIPVFS
2f950 20 4a 53 4f 4e 31 5f 45 58 54 45 4e 53 49 4f 4e   JSON1_EXTENSION
2f960 20 4c 45 47 41 43 59 5f 43 4c 4f 53 45 20 4c 4f   LEGACY_CLOSE LO
2f970 47 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  G \..           
2f980 20 50 45 52 43 45 4e 54 49 4c 45 5f 45 58 54 45   PERCENTILE_EXTE
2f990 4e 53 49 4f 4e 20 52 45 47 45 58 50 5f 45 58 54  NSION REGEXP_EXT
2f9a0 45 4e 53 49 4f 4e 20 53 45 53 53 49 4f 4e 5f 45  ENSION SESSION_E
2f9b0 58 54 45 4e 53 49 4f 4e 20 5c 0d 0a 20 20 20 20  XTENSION \..    
2f9c0 20 20 20 20 20 20 20 20 53 48 41 31 5f 45 58 54          SHA1_EXT
2f9d0 45 4e 53 49 4f 4e 20 54 45 53 54 5f 45 58 54 45  ENSION TEST_EXTE
2f9e0 4e 53 49 4f 4e 20 54 4f 54 59 50 45 5f 45 58 54  NSION TOTYPE_EXT
2f9f0 45 4e 53 49 4f 4e 20 56 49 52 54 55 41 4c 5f 54  ENSION VIRTUAL_T
2fa00 41 42 4c 45 5d 20 7b 0d 0a 20 20 20 20 20 20 20  ABLE] {..       
2fa10 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
2fa20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66  # NOTE: Check if
2fa30 20 74 68 65 20 63 6f 6d 70 69 6c 65 2d 74 69 6d   the compile-tim
2fa40 65 20 6f 70 74 69 6f 6e 20 69 73 20 6c 69 73 74  e option is list
2fa50 65 64 20 69 6e 20 74 68 65 20 6c 69 73 74 0d 0a  ed in the list..
2fa60 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
2fa70 20 20 6b 65 70 74 20 74 72 61 63 6b 20 6f 66 20    kept track of 
2fa80 62 79 20 74 68 65 20 69 6e 74 65 72 6f 70 20 61  by the interop a
2fa90 73 73 65 6d 62 6c 79 20 61 6e 64 2f 6f 72 20 74  ssembly and/or t
2faa0 68 65 20 53 51 4c 69 74 65 0d 0a 20 20 20 20 20  he SQLite..     
2fab0 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 72       #       cor
2fac0 65 20 6c 69 62 72 61 72 79 2e 0d 0a 20 20 20 20  e library...    
2fad0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
2fae0 20 20 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74     checkForSQLit
2faf0 65 43 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 20 24  eCompileOption $
2fb00 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24  ::test_channel $
2fb10 63 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 0d 0a 20  compileOption.. 
2fb20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
2fb30 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
2fb40 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20   NOTE: Check if 
2fb50 74 68 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  the System.Data.
2fb60 53 51 4c 69 74 65 20 70 72 6f 76 69 64 65 72 20  SQLite provider 
2fb70 77 61 73 20 63 6f 6d 70 69 6c 65 64 20 77 69 74  was compiled wit
2fb80 68 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  h..        #    
2fb90 20 20 20 73 75 70 70 6f 72 74 20 66 6f 72 20 61     support for a
2fba0 6e 79 20 65 6e 63 72 79 70 74 65 64 20 64 61 74  ny encrypted dat
2fbb0 61 62 61 73 65 73 2e 0d 0a 20 20 20 20 20 20 20  abases...       
2fbc0 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   #..        if {
2fbd0 5b 68 61 76 65 53 51 4c 69 74 65 44 65 66 69 6e  [haveSQLiteDefin
2fbe0 65 43 6f 6e 73 74 61 6e 74 20 49 4e 54 45 52 4f  eConstant INTERO
2fbf0 50 5f 43 4f 44 45 43 5d 20 7c 7c 20 5c 0d 0a 20  P_CODEC] || \.. 
2fc00 20 20 20 20 20 20 20 20 20 20 20 5b 68 61 76 65             [have
2fc10 53 51 4c 69 74 65 44 65 66 69 6e 65 43 6f 6e 73  SQLiteDefineCons
2fc20 74 61 6e 74 20 49 4e 54 45 52 4f 50 5f 49 4e 43  tant INTEROP_INC
2fc30 4c 55 44 45 5f 53 45 45 5d 7d 20 74 68 65 6e 20  LUDE_SEE]} then 
2fc40 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  {..          #..
2fc50 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
2fc60 3a 20 4e 6f 77 20 63 68 65 63 6b 20 69 66 20 74  : Now check if t
2fc70 68 65 20 69 6e 74 65 72 6f 70 20 61 73 73 65 6d  he interop assem
2fc80 62 6c 79 20 77 61 73 20 61 6c 73 6f 20 63 6f 6d  bly was also com
2fc90 70 69 6c 65 64 20 77 69 74 68 0d 0a 20 20 20 20  piled with..    
2fca0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73 75        #       su
2fcb0 70 70 6f 72 74 20 66 6f 72 20 65 6e 63 72 79 70  pport for encryp
2fcc0 74 65 64 20 64 61 74 61 62 61 73 65 73 2e 0d 0a  ted databases...
2fcd0 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
2fce0 20 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65         if {[have
2fcf0 53 51 4c 69 74 65 43 6f 6d 70 69 6c 65 4f 70 74  SQLiteCompileOpt
2fd00 69 6f 6e 20 43 4f 44 45 43 5d 20 7c 7c 20 5c 0d  ion CODEC] || \.
2fd10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b  .              [
2fd20 68 61 76 65 53 51 4c 69 74 65 43 6f 6d 70 69 6c  haveSQLiteCompil
2fd30 65 4f 70 74 69 6f 6e 20 49 4e 43 4c 55 44 45 5f  eOption INCLUDE_
2fd40 53 45 45 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  SEE]} then {..  
2fd50 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
2fd60 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
2fd70 20 46 69 6e 61 6c 6c 79 2c 20 63 68 65 63 6b 20   Finally, check 
2fd80 69 66 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f  if the SQLite co
2fd90 72 65 20 6c 69 62 72 61 72 79 20 77 61 73 20 63  re library was c
2fda0 6f 6d 70 69 6c 65 64 0d 0a 20 20 20 20 20 20 20  ompiled..       
2fdb0 20 20 20 20 20 23 20 20 20 20 20 20 20 77 69 74       #       wit
2fdc0 68 20 73 75 70 70 6f 72 74 20 66 6f 72 20 65 6e  h support for en
2fdd0 63 72 79 70 74 65 64 20 64 61 74 61 62 61 73 65  crypted database
2fde0 73 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  s...            
2fdf0 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  #..            i
2fe00 66 20 7b 5b 68 61 76 65 53 51 4c 69 74 65 43 6f  f {[haveSQLiteCo
2fe10 6d 70 69 6c 65 4f 70 74 69 6f 6e 20 48 41 53 5f  mpileOption HAS_
2fe20 43 4f 44 45 43 5d 7d 20 74 68 65 6e 20 7b 0d 0a  CODEC]} then {..
2fe30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
2fe40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
2fe50 20 4e 4f 54 45 3a 20 59 65 73 2c 20 61 64 64 20   NOTE: Yes, add 
2fe60 63 6f 6e 73 74 72 61 69 6e 74 20 66 6f 72 20 75  constraint for u
2fe70 73 65 20 62 79 20 74 68 65 20 74 65 73 74 20 73  se by the test s
2fe80 75 69 74 65 2e 0d 0a 20 20 20 20 20 20 20 20 20  uite...         
2fe90 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
2fea0 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61        addConstra
2feb0 69 6e 74 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  int System.Data.
2fec0 53 51 4c 69 74 65 2e 45 6e 63 72 79 70 74 69 6f  SQLite.Encryptio
2fed0 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  n..            }
2fee0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
2fef0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
2ff00 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
2ff10 20 4e 4f 54 45 3a 20 54 72 79 20 74 6f 20 73 65   NOTE: Try to se
2ff20 74 75 70 20 61 6e 20 69 6e 74 65 72 72 75 70 74  tup an interrupt
2ff30 20 63 61 6c 6c 62 61 63 6b 20 75 73 69 6e 67 20   callback using 
2ff40 74 68 65 20 73 63 72 69 70 74 20 64 65 62 75 67  the script debug
2ff50 67 65 72 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ger..        #  
2ff60 20 20 20 20 20 74 68 61 74 20 77 69 6c 6c 20 63       that will c
2ff70 61 6e 63 65 6c 20 61 6c 6c 20 53 51 4c 20 71 75  ancel all SQL qu
2ff80 65 72 69 65 73 20 69 6e 20 70 72 6f 67 72 65 73  eries in progres
2ff90 73 20 66 6f 72 20 61 6c 6c 20 64 61 74 61 62 61  s for all databa
2ffa0 73 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  se..        #   
2ffb0 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20      connections 
2ffc0 6b 6e 6f 77 6e 20 74 6f 20 74 68 69 73 20 69 6e  known to this in
2ffd0 74 65 72 70 72 65 74 65 72 2e 0d 0a 20 20 20 20  terpreter...    
2ffe0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69      #..        i
2fff0 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
30000 20 3a 3a 6e 6f 28 73 71 6c 69 74 65 49 6e 74 65   ::no(sqliteInte
30010 72 72 75 70 74 43 61 6c 6c 62 61 63 6b 29 5d 7d  rruptCallback)]}
30020 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
30030 20 20 20 73 65 74 75 70 44 62 49 6e 74 65 72 72     setupDbInterr
30040 75 70 74 43 61 6c 6c 62 61 63 6b 20 24 3a 3a 74  uptCallback $::t
30050 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 3a 3a 74  est_channel $::t
30060 65 73 74 5f 6c 6f 67 0d 0a 20 20 20 20 20 20 20  est_log..       
30070 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d   }....        #.
30080 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
30090 20 43 68 65 63 6b 20 66 6f 72 20 74 68 65 20 6e   Check for the n
300a0 61 74 69 76 65 20 72 75 6e 74 69 6d 65 20 6f 70  ative runtime op
300b0 74 69 6f 6e 2c 20 77 68 69 63 68 20 77 6f 75 6c  tion, which woul
300c0 64 20 6d 65 61 6e 20 77 65 20 61 72 65 0d 0a 20  d mean we are.. 
300d0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 75         #       u
300e0 73 69 6e 67 20 74 68 65 20 6d 69 78 65 64 2d 6d  sing the mixed-m
300f0 6f 64 65 20 61 73 73 65 6d 62 6c 79 2e 0d 0a 20  ode assembly... 
30100 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
30110 20 20 63 68 65 63 6b 46 6f 72 52 75 6e 74 69 6d    checkForRuntim
30120 65 4f 70 74 69 6f 6e 20 24 3a 3a 74 65 73 74 5f  eOption $::test_
30130 63 68 61 6e 6e 65 6c 20 6e 61 74 69 76 65 0d 0a  channel native..
30140 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
30150 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65       # NOTE: Che
30160 63 6b 20 69 66 20 74 68 65 20 74 65 73 74 20 73  ck if the test s
30170 75 69 74 65 20 73 68 6f 75 6c 64 20 63 6f 75 6e  uite should coun
30180 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
30190 63 6f 6e 6e 65 63 74 69 6f 6e 73 0d 0a 20 20 20  connections..   
301a0 20 20 20 20 20 23 20 20 20 20 20 20 20 22 6f 70       #       "op
301b0 65 6e 65 64 22 20 61 6e 64 20 22 63 6c 6f 73 65  ened" and "close
301c0 64 22 20 66 72 6f 6d 20 74 68 65 20 70 6f 6f 6c  d" from the pool
301d0 20 77 68 65 6e 20 64 65 74 65 72 6d 69 6e 69 6e   when determinin
301e0 67 20 69 66 20 61 20 74 65 73 74 0d 0a 20 20 20  g if a test..   
301f0 20 20 20 20 20 23 20 20 20 20 20 20 20 70 61 73       #       pas
30200 73 65 64 2e 20 20 44 69 73 61 62 6c 69 6e 67 20  sed.  Disabling 
30210 74 68 69 73 20 62 65 68 61 76 69 6f 72 20 69 73  this behavior is
30220 20 73 6f 6d 65 74 69 6d 65 73 20 6e 65 63 65 73   sometimes neces
30230 73 61 72 79 20 28 65 2e 67 2e 0d 0a 20 20 20 20  sary (e.g...    
30240 20 20 20 20 23 20 20 20 20 20 20 20 64 75 72 69      #       duri
30250 6e 67 20 74 68 65 20 72 65 6c 65 61 73 65 20 74  ng the release t
30260 65 73 74 69 6e 67 20 70 72 6f 63 65 73 73 29 20  esting process) 
30270 62 65 63 61 75 73 65 20 74 68 65 72 65 20 61 72  because there ar
30280 65 20 73 65 76 65 72 61 6c 0d 0a 20 20 20 20 20  e several..     
30290 20 20 20 23 20 20 20 20 20 20 20 74 65 73 74 73     #       tests
302a0 20 74 68 61 74 20 72 65 6c 79 20 6f 6e 20 74 68   that rely on th
302b0 65 20 22 6f 70 65 6e 65 64 20 66 72 6f 6d 20 70  e "opened from p
302c0 6f 6f 6c 22 20 63 6f 75 6e 74 20 62 65 69 6e 67  ool" count being
302d0 20 67 72 65 61 74 65 72 0d 0a 20 20 20 20 20 20   greater..      
302e0 20 20 23 20 20 20 20 20 20 20 74 68 61 6e 20 7a    #       than z
302f0 65 72 6f 2e 20 20 54 68 65 73 65 20 74 65 73 74  ero.  These test
30300 73 20 6d 61 79 20 66 61 69 6c 20 64 75 65 20 74  s may fail due t
30310 6f 20 74 68 65 20 6e 6f 6e 2d 64 65 74 65 72 6d  o the non-determ
30320 69 6e 69 73 74 69 63 0d 0a 20 20 20 20 20 20 20  inistic..       
30330 20 23 20 20 20 20 20 20 20 62 65 68 61 76 69 6f   #       behavio
30340 72 20 6f 66 20 74 68 65 20 43 4c 52 20 47 43 2c  r of the CLR GC,
30350 20 65 76 65 6e 20 77 68 65 6e 20 74 68 65 72 65   even when there
30360 20 69 73 20 6e 6f 20 62 75 67 20 69 6e 20 74 68   is no bug in th
30370 65 20 63 6f 64 65 0d 0a 20 20 20 20 20 20 20 20  e code..        
30380 23 20 20 20 20 20 20 20 62 65 69 6e 67 20 74 65  #       being te
30390 73 74 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 23  sted...        #
303a0 0d 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 46  ..        checkF
303b0 6f 72 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20  orRuntimeOption 
303c0 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
303d0 6e 6f 50 6f 6f 6c 43 6f 75 6e 74 73 0d 0a 0d 0a  noPoolCounts....
303e0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
303f0 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b     # NOTE: Check
30400 20 69 66 20 74 68 65 20 74 65 73 74 20 73 75 69   if the test sui
30410 74 65 20 73 68 6f 75 6c 64 20 75 73 65 20 73 68  te should use sh
30420 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 2e  ared-cache mode.
30430 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
30440 20 20 20 20 20 63 68 65 63 6b 46 6f 72 52 75 6e       checkForRun
30450 74 69 6d 65 4f 70 74 69 6f 6e 20 24 3a 3a 74 65  timeOption $::te
30460 73 74 5f 63 68 61 6e 6e 65 6c 20 73 68 61 72 65  st_channel share
30470 64 43 61 63 68 65 0d 0a 0d 0a 20 20 20 20 20 20  dCache....      
30480 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
30490 4f 54 45 3a 20 52 65 70 6f 72 74 20 74 68 65 20  OTE: Report the 
304a0 72 65 73 6f 75 72 63 65 20 75 73 61 67 65 20 70  resource usage p
304b0 72 69 6f 72 20 74 6f 20 72 75 6e 6e 69 6e 67 20  rior to running 
304c0 61 6e 79 20 74 65 73 74 73 2e 0d 0a 20 20 20 20  any tests...    
304d0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
304e0 65 70 6f 72 74 53 51 4c 69 74 65 52 65 73 6f 75  eportSQLiteResou
304f0 72 63 65 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  rces $::test_cha
30500 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20 20 20 20  nnel....        
30510 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
30520 45 3a 20 47 72 61 62 20 74 68 65 20 6c 69 73 74  E: Grab the list
30530 20 6f 66 20 6e 61 74 69 76 65 20 6d 6f 64 75 6c   of native modul
30540 65 73 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  es for the curre
30550 6e 74 20 70 72 6f 63 65 73 73 20 61 6e 64 0d 0a  nt process and..
30560 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
30570 72 65 70 6f 72 74 20 6f 6e 20 74 68 65 20 53 79  report on the Sy
30580 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
30590 20 72 65 6c 61 74 65 64 20 6f 6e 65 73 2e 0d 0a   related ones...
305a0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
305b0 20 20 20 69 66 20 7b 5b 68 61 76 65 53 51 4c 69     if {[haveSQLi
305c0 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d  teObjectCommand]
305d0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
305e0 20 20 20 20 73 65 74 20 6d 6f 64 75 6c 65 73 20      set modules 
305f0 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 5c  [object invoke \
30600 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
30610 53 79 73 74 65 6d 2e 44 69 61 67 6e 6f 73 74 69  System.Diagnosti
30620 63 73 2e 50 72 6f 63 65 73 73 2e 47 65 74 43 75  cs.Process.GetCu
30630 72 72 65 6e 74 50 72 6f 63 65 73 73 20 4d 6f 64  rrentProcess Mod
30640 75 6c 65 73 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  ules]....       
30650 20 20 20 6f 62 6a 65 63 74 20 66 6f 72 65 61 63     object foreac
30660 68 20 2d 61 6c 69 61 73 20 6d 6f 64 75 6c 65 20  h -alias module 
30670 24 6d 6f 64 75 6c 65 73 20 7b 0d 0a 20 20 20 20  $modules {..    
30680 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
30690 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54         # NOTE: T
306a0 68 65 20 6d 6f 64 75 6c 65 20 66 69 6c 65 20 6e  he module file n
306b0 61 6d 65 20 68 65 72 65 20 6d 75 73 74 20 62 65  ame here must be
306c0 20 6e 6f 72 6d 61 6c 69 7a 65 64 2e 0d 0a 20 20   normalized...  
306d0 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
306e0 20 20 20 20 20 20 20 20 20 73 65 74 20 66 69 6c           set fil
306f0 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6e 6f 72 6d  eName [file norm
30700 61 6c 69 7a 65 20 5b 24 6d 6f 64 75 6c 65 20 46  alize [$module F
30710 69 6c 65 4e 61 6d 65 5d 5d 0d 0a 20 20 20 20 20  ileName]]..     
30720 20 20 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e         set fileN
30730 61 6d 65 4f 6e 6c 79 20 5b 66 69 6c 65 20 74 61  ameOnly [file ta
30740 69 6c 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 0d  il $fileName]...
30750 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
30760 7b 5b 6c 73 65 61 72 63 68 20 2d 65 78 61 63 74  {[lsearch -exact
30770 20 2d 6e 6f 63 61 73 65 20 2d 2d 20 5c 0d 0a 20   -nocase -- \.. 
30780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b                 [
30790 67 65 74 4e 61 74 69 76 65 4c 69 62 72 61 72 79  getNativeLibrary
307a0 46 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79 5d 20 24  FileNamesOnly] $
307b0 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 5d 20 21 3d  fileNameOnly] !=
307c0 20 2d 31 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20   -1} then {..   
307d0 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
307e0 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
307f0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
30800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30810 20 20 22 2d 2d 2d 2d 20 66 6f 75 6e 64 20 6c 6f    "---- found lo
30820 61 64 65 64 20 53 51 4c 69 74 65 20 6e 61 74 69  aded SQLite nati
30830 76 65 20 6c 69 62 72 61 72 79 20 6d 6f 64 75 6c  ve library modul
30840 65 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20  e: " \..        
30850 20 20 20 20 20 20 20 20 20 20 24 66 69 6c 65 4e            $fileN
30860 61 6d 65 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ame \n]..       
30870 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b       } elseif {[
30880 6c 73 65 61 72 63 68 20 2d 65 78 61 63 74 20 2d  lsearch -exact -
30890 6e 6f 63 61 73 65 20 2d 2d 20 5c 0d 0a 20 20 20  nocase -- \..   
308a0 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65               [ge
308b0 74 49 6e 74 65 72 6f 70 41 73 73 65 6d 62 6c 79  tInteropAssembly
308c0 46 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79 5d 20 24  FileNamesOnly] $
308d0 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 5d 20 21 3d  fileNameOnly] !=
308e0 20 2d 31 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20   -1} then {..   
308f0 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
30900 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
30910 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
30920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30930 20 20 22 2d 2d 2d 2d 20 66 6f 75 6e 64 20 6c 6f    "---- found lo
30940 61 64 65 64 20 53 51 4c 69 74 65 20 69 6e 74 65  aded SQLite inte
30950 72 6f 70 20 61 73 73 65 6d 62 6c 79 20 6d 6f 64  rop assembly mod
30960 75 6c 65 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20  ule: " \..      
30970 20 20 20 20 20 20 20 20 20 20 20 20 24 66 69 6c              $fil
30980 65 4e 61 6d 65 20 5c 6e 5d 0d 0a 20 20 20 20 20  eName \n]..     
30990 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
309a0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
309b0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63 61 74 63  ....        catc
309c0 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74  h {..          t
309d0 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
309e0 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20  nnel \..        
309f0 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 6d 70        "---- comp
30a00 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 73  ile-time options
30a10 20 66 6f 72 20 53 51 4c 69 74 65 20 63 6f 72 65   for SQLite core
30a20 20 6c 69 62 72 61 72 79 2e 2e 2e 20 22 0d 0a 0d   library... "...
30a30 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b  .          if {[
30a40 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
30a50 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f       object invo
30a60 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75  ke -flags +NonPu
30a70 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20  blic \..        
30a80 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44          System.D
30a90 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74  ata.SQLite.SQLit
30aa0 65 33 20 53 51 4c 69 74 65 43 6f 6d 70 69 6c 65  e3 SQLiteCompile
30ab0 4f 70 74 69 6f 6e 73 0d 0a 20 20 20 20 20 20 20  Options..       
30ac0 20 20 20 7d 20 63 6f 6d 70 69 6c 65 4f 70 74 69     } compileOpti
30ad0 6f 6e 73 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ons] == 0} then 
30ae0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
30af0 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
30b00 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
30b10 20 5b 66 6f 72 6d 61 74 4c 69 73 74 20 5b 6c 73   [formatList [ls
30b20 6f 72 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ort \..         
30b30 20 20 20 20 20 20 20 24 63 6f 6d 70 69 6c 65 4f         $compileO
30b40 70 74 69 6f 6e 73 5d 20 3c 6e 6f 6e 65 3e 5d 20  ptions] <none>] 
30b50 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  \n]..          }
30b60 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
30b70 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
30b80 73 74 5f 63 68 61 6e 6e 65 6c 20 75 6e 6b 6e 6f  st_channel unkno
30b90 77 6e 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20 20  wn\n..          
30ba0 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  }..        }....
30bb0 20 20 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d          catch {.
30bc0 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
30bd0 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
30be0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
30bf0 20 20 22 2d 2d 2d 2d 20 63 6f 6d 70 69 6c 65 2d    "---- compile-
30c00 74 69 6d 65 20 6f 70 74 69 6f 6e 73 20 66 6f 72  time options for
30c10 20 53 51 4c 69 74 65 20 69 6e 74 65 72 6f 70 20   SQLite interop 
30c20 61 73 73 65 6d 62 6c 79 2e 2e 2e 20 22 0d 0a 0d  assembly... "...
30c30 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b  .          if {[
30c40 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
30c50 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f       object invo
30c60 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75  ke -flags +NonPu
30c70 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20  blic \..        
30c80 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44          System.D
30c90 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74  ata.SQLite.SQLit
30ca0 65 33 20 49 6e 74 65 72 6f 70 43 6f 6d 70 69 6c  e3 InteropCompil
30cb0 65 4f 70 74 69 6f 6e 73 0d 0a 20 20 20 20 20 20  eOptions..      
30cc0 20 20 20 20 7d 20 63 6f 6d 70 69 6c 65 4f 70 74      } compileOpt
30cd0 69 6f 6e 73 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  ions] == 0} then
30ce0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
30cf0 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
30d00 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
30d10 73 20 5b 66 6f 72 6d 61 74 4c 69 73 74 20 5b 6c  s [formatList [l
30d20 73 6f 72 74 20 5c 0d 0a 20 20 20 20 20 20 20 20  sort \..        
30d30 20 20 20 20 20 20 20 20 24 63 6f 6d 70 69 6c 65          $compile
30d40 4f 70 74 69 6f 6e 73 5d 20 3c 6e 6f 6e 65 3e 5d  Options] <none>]
30d50 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \n]..          
30d60 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
30d70 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
30d80 65 73 74 5f 63 68 61 6e 6e 65 6c 20 75 6e 6b 6e  est_channel unkn
30d90 6f 77 6e 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20  own\n..         
30da0 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d   }..        }...
30db0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
30dc0 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77      # NOTE: Show
30dd0 20 74 68 65 20 61 63 74 69 76 65 20 74 65 73 74   the active test
30de0 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0d 0a 20   constraints... 
30df0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
30e00 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
30e10 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
30e20 72 67 73 20 22 2d 2d 2d 2d 20 63 6f 6e 73 74 72  rgs "---- constr
30e30 61 69 6e 74 73 3a 20 22 20 5c 0d 0a 20 20 20 20  aints: " \..    
30e40 20 20 20 20 20 20 20 20 5b 66 6f 72 6d 61 74 4c          [formatL
30e50 69 73 74 20 5b 6c 73 6f 72 74 20 5b 67 65 74 43  ist [lsort [getC
30e60 6f 6e 73 74 72 61 69 6e 74 73 5d 5d 20 3c 6e 6f  onstraints]] <no
30e70 6e 65 3e 5d 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20  ne>] \n]....    
30e80 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
30e90 20 4e 4f 54 45 3a 20 53 61 76 65 20 74 68 65 20   NOTE: Save the 
30ea0 74 65 73 74 20 63 6f 6e 73 74 72 61 69 6e 74 73  test constraints
30eb0 20 66 6f 72 20 75 73 65 20 62 79 20 74 68 72 65   for use by thre
30ec0 61 64 73 20 63 72 65 61 74 65 64 20 69 6e 20 74  ads created in t
30ed0 68 69 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20  his..        #  
30ee0 20 20 20 20 20 61 70 70 6c 69 63 61 74 69 6f 6e       application
30ef0 20 64 6f 6d 61 69 6e 2e 20 20 54 68 69 73 20 69   domain.  This i
30f00 73 20 6e 65 63 65 73 73 61 72 79 20 62 65 63 61  s necessary beca
30f10 75 73 65 20 61 6c 6c 20 74 68 65 20 45 61 67 6c  use all the Eagl
30f20 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
30f30 20 20 20 22 74 65 73 74 20 63 6f 6e 74 65 78 74     "test context
30f40 22 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  " information is
30f50 20 70 65 72 2d 74 68 72 65 61 64 2e 0d 0a 20 20   per-thread...  
30f60 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
30f70 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
30f80 74 73 20 3a 3a 74 65 73 74 5f 63 6f 6e 73 74 72  ts ::test_constr
30f90 61 69 6e 74 73 5d 7d 20 74 68 65 6e 20 7b 0d 0a  aints]} then {..
30fa0 20 20 20 20 20 20 20 20 20 20 73 65 74 20 3a 3a            set ::
30fb0 74 65 73 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73  test_constraints
30fc0 20 24 3a 3a 65 61 67 6c 65 5f 74 65 73 74 73 28   $::eagle_tests(
30fd0 43 6f 6e 73 74 72 61 69 6e 74 73 29 0d 0a 20 20  Constraints)..  
30fe0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
30ff0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
31000 4e 4f 54 45 3a 20 4c 6f 61 64 20 74 68 65 20 22  NOTE: Load the "
31010 61 66 74 65 72 2d 63 6f 6e 73 74 72 61 69 6e 74  after-constraint
31020 73 22 20 63 75 73 74 6f 6d 20 70 65 72 2d 75 73  s" custom per-us
31030 65 72 20 61 6e 64 2f 6f 72 20 70 65 72 2d 68 6f  er and/or per-ho
31040 73 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  st..        #   
31050 20 20 20 20 74 65 73 74 20 73 65 74 74 69 6e 67      test setting
31060 73 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20  s now...        
31070 23 0d 0a 20 20 20 20 20 20 20 20 75 70 6c 65 76  #..        uplev
31080 65 6c 20 31 20 5b 6c 69 73 74 20 6c 6f 61 64 53  el 1 [list loadS
31090 51 4c 69 74 65 54 65 73 74 53 65 74 74 69 6e 67  QLiteTestSetting
310a0 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
310b0 6c 20 2e 61 66 74 65 72 5d 0d 0a 0d 0a 20 20 20  l .after]....   
310c0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
310d0 23 20 4e 4f 54 45 3a 20 49 66 20 6e 65 63 65 73  # NOTE: If neces
310e0 73 61 72 79 2c 20 65 6e 61 62 6c 65 20 73 68 61  sary, enable sha
310f0 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 20 6e  red-cache mode n
31100 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ow...        #..
31110 20 20 20 20 20 20 20 20 69 66 20 7b 5b 68 61 73          if {[has
31120 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 73 68  RuntimeOption sh
31130 61 72 65 64 43 61 63 68 65 5d 7d 20 74 68 65 6e  aredCache]} then
31140 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 65 6e   {..          en
31150 61 62 6c 65 53 68 61 72 65 64 43 61 63 68 65 20  ableSharedCache 
31160 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
31170 74 72 75 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d  true..        }.
31180 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
31190 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 68        # NOTE: Sh
311a0 6f 77 20 77 68 65 6e 20 6f 75 72 20 74 65 73 74  ow when our test
311b0 73 20 61 63 74 75 61 6c 6c 79 20 62 65 67 61 6e  s actually began
311c0 20 28 6e 6f 77 29 2e 0d 0a 20 20 20 20 20 20 20   (now)...       
311d0 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   #..        tput
311e0 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
311f0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
31200 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d  .            "--
31210 2d 2d 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  -- System.Data.S
31220 51 4c 69 74 65 20 74 65 73 74 73 20 62 65 67 61  QLite tests bega
31230 6e 20 61 74 20 22 20 5c 0d 0a 20 20 20 20 20 20  n at " \..      
31240 20 20 20 20 20 20 5b 63 6c 6f 63 6b 20 66 6f 72        [clock for
31250 6d 61 74 20 5b 63 6c 6f 63 6b 20 73 65 63 6f 6e  mat [clock secon
31260 64 73 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  ds]] \n]..      
31270 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
31280 20 70 72 6f 63 20 72 75 6e 53 51 4c 69 74 65 54   proc runSQLiteT
31290 65 73 74 46 69 6c 65 73 50 72 6f 6c 6f 67 75 65  estFilesPrologue
312a0 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a   {} {..      #..
312b0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b        # NOTE: Sk
312c0 69 70 20 72 75 6e 6e 69 6e 67 20 6f 75 72 20 63  ip running our c
312d0 75 73 74 6f 6d 20 66 69 6c 65 73 20 70 72 6f 6c  ustom files prol
312e0 6f 67 75 65 20 69 66 20 74 68 65 20 6d 61 69 6e  ogue if the main
312f0 20 6f 6e 65 20 68 61 73 20 62 65 65 6e 0d 0a 20   one has been.. 
31300 20 20 20 20 20 23 20 20 20 20 20 20 20 73 6b 69       #       ski
31310 70 70 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  pped...      #..
31320 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
31330 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 70 72 6f   exists ::no(pro
31340 6c 6f 67 75 65 2e 65 61 67 6c 65 29 5d 7d 20 74  logue.eagle)]} t
31350 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 75  hen {..        u
31360 70 6c 65 76 65 6c 20 31 20 7b 0d 0a 20 20 20 20  plevel 1 {..    
31370 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
31380 20 20 20 23 20 4e 4f 54 45 3a 20 53 65 74 75 70     # NOTE: Setup
31390 20 74 68 65 20 76 61 72 69 61 62 6c 65 73 20 74   the variables t
313a0 68 61 74 20 72 65 66 65 72 20 74 6f 20 74 68 65  hat refer to the
313b0 20 76 61 72 69 6f 75 73 20 6e 6f 6e 2d 64 61 74   various non-dat
313c0 61 20 66 69 6c 65 73 0d 0a 20 20 20 20 20 20 20  a files..       
313d0 20 20 20 23 20 20 20 20 20 20 20 72 65 71 75 69     #       requi
313e0 72 65 64 20 62 79 20 74 68 65 20 74 65 73 74 73  red by the tests
313f0 20 69 6e 20 74 68 69 73 20 66 69 6c 65 2e 0d 0a   in this file...
31400 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
31410 20 20 20 20 20 20 20 73 65 74 20 65 6e 74 69 74         set entit
31420 79 46 72 61 6d 65 77 6f 72 6b 44 6c 6c 46 69 6c  yFrameworkDllFil
31430 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
31440 20 20 20 5b 67 65 74 42 75 69 6c 64 46 69 6c 65     [getBuildFile
31450 4e 61 6d 65 20 45 6e 74 69 74 79 46 72 61 6d 65  Name EntityFrame
31460 77 6f 72 6b 2e 64 6c 6c 20 74 72 75 65 5d 0d 0a  work.dll true]..
31470 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
31480 69 6e 73 74 61 6c 6c 65 72 45 78 65 46 69 6c 65  installerExeFile
31490 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
314a0 20 20 5b 67 65 74 42 75 69 6c 64 46 69 6c 65 4e    [getBuildFileN
314b0 61 6d 65 20 49 6e 73 74 61 6c 6c 65 72 2e 65 78  ame Installer.ex
314c0 65 20 74 72 75 65 5d 0d 0a 0d 0a 20 20 20 20 20  e true]....     
314d0 20 20 20 20 20 73 65 74 20 73 71 6c 69 74 65 44       set sqliteD
314e0 65 73 69 67 6e 65 72 44 6c 6c 46 69 6c 65 20 5c  esignerDllFile \
314f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
31500 5b 67 65 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d  [getBuildFileNam
31510 65 20 53 51 4c 69 74 65 2e 44 65 73 69 67 6e 65  e SQLite.Designe
31520 72 2e 64 6c 6c 20 74 72 75 65 5d 0d 0a 0d 0a 20  r.dll true].... 
31530 20 20 20 20 20 20 20 20 20 73 65 74 20 73 79 73           set sys
31540 74 65 6d 44 61 74 61 53 51 4c 69 74 65 44 6c 6c  temDataSQLiteDll
31550 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  File \..        
31560 20 20 20 20 20 20 5b 67 65 74 42 75 69 6c 64 46        [getBuildF
31570 69 6c 65 4e 61 6d 65 20 53 79 73 74 65 6d 2e 44  ileName System.D
31580 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 20 74  ata.SQLite.dll t
31590 72 75 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  rue]....        
315a0 20 20 73 65 74 20 73 79 73 74 65 6d 44 61 74 61    set systemData
315b0 53 51 4c 69 74 65 4c 69 6e 71 44 6c 6c 46 69 6c  SQLiteLinqDllFil
315c0 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
315d0 20 20 20 5b 67 65 74 42 75 69 6c 64 46 69 6c 65     [getBuildFile
315e0 4e 61 6d 65 20 53 79 73 74 65 6d 2e 44 61 74 61  Name System.Data
315f0 2e 53 51 4c 69 74 65 2e 4c 69 6e 71 2e 64 6c 6c  .SQLite.Linq.dll
31600 20 74 72 75 65 5d 0d 0a 0d 0a 20 20 20 20 20 20   true]....      
31610 20 20 20 20 73 65 74 20 73 79 73 74 65 6d 44 61      set systemDa
31620 74 61 53 51 4c 69 74 65 45 66 36 44 6c 6c 46 69  taSQLiteEf6DllFi
31630 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  le \..          
31640 20 20 20 20 5b 67 65 74 42 75 69 6c 64 46 69 6c      [getBuildFil
31650 65 4e 61 6d 65 20 53 79 73 74 65 6d 2e 44 61 74  eName System.Dat
31660 61 2e 53 51 4c 69 74 65 2e 45 46 36 2e 64 6c 6c  a.SQLite.EF6.dll
31670 20 74 72 75 65 5d 0d 0a 0d 0a 20 20 20 20 20 20   true]....      
31680 20 20 20 20 73 65 74 20 74 65 73 74 45 78 65 46      set testExeF
31690 69 6c 65 20 5b 67 65 74 42 75 69 6c 64 46 69 6c  ile [getBuildFil
316a0 65 4e 61 6d 65 20 74 65 73 74 2e 65 78 65 20 74  eName test.exe t
316b0 72 75 65 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  rue]..          
316c0 73 65 74 20 74 65 73 74 4c 69 6e 71 45 78 65 46  set testLinqExeF
316d0 69 6c 65 20 5b 67 65 74 42 75 69 6c 64 46 69 6c  ile [getBuildFil
316e0 65 4e 61 6d 65 20 74 65 73 74 6c 69 6e 71 2e 65  eName testlinq.e
316f0 78 65 20 74 72 75 65 5d 0d 0a 20 20 20 20 20 20  xe true]..      
31700 20 20 20 20 73 65 74 20 74 65 73 74 45 66 36 45      set testEf6E
31710 78 65 46 69 6c 65 20 5b 67 65 74 42 75 69 6c 64  xeFile [getBuild
31720 46 69 6c 65 4e 61 6d 65 20 74 65 73 74 65 66 36  FileName testef6
31730 2e 65 78 65 20 74 72 75 65 5d 0d 0a 0d 0a 20 20  .exe true]....  
31740 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
31750 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 65 74       # NOTE: Set
31760 75 70 20 74 68 65 20 76 61 72 69 61 62 6c 65 73  up the variables
31770 20 74 68 61 74 20 72 65 66 65 72 20 74 6f 20 74   that refer to t
31780 68 65 20 76 61 72 69 6f 75 73 20 64 61 74 61 20  he various data 
31790 66 69 6c 65 73 0d 0a 20 20 20 20 20 20 20 20 20  files..         
317a0 20 23 20 20 20 20 20 20 20 72 65 71 75 69 72 65   #       require
317b0 64 20 62 79 20 74 68 65 20 74 65 73 74 73 20 69  d by the tests i
317c0 6e 20 74 68 69 73 20 66 69 6c 65 2e 0d 0a 20 20  n this file...  
317d0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
317e0 20 20 20 20 20 73 65 74 20 74 65 73 74 4c 69 6e       set testLin
317f0 71 4f 75 74 46 69 6c 65 20 5b 66 69 6c 65 20 6e  qOutFile [file n
31800 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20  ativename [file 
31810 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20  join \..        
31820 20 20 20 20 20 20 5b 67 65 74 53 51 4c 69 74 65        [getSQLite
31830 54 65 73 74 44 61 74 61 50 61 74 68 5d 20 74 65  TestDataPath] te
31840 73 74 6c 69 6e 71 2e 6f 75 74 5d 5d 0d 0a 0d 0a  stlinq.out]]....
31850 20 20 20 20 20 20 20 20 20 20 73 65 74 20 6e 6f            set no
31860 72 74 68 77 69 6e 64 45 66 44 62 46 69 6c 65 20  rthwindEfDbFile 
31870 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65  [file nativename
31880 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20   [file join \.. 
31890 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69               [fi
318a0 6c 65 20 64 69 72 6e 61 6d 65 20 5b 66 69 6c 65  le dirname [file
318b0 20 64 69 72 6e 61 6d 65 20 5b 67 65 74 53 51 4c   dirname [getSQL
318c0 69 74 65 54 65 73 74 44 61 74 61 50 61 74 68 5d  iteTestDataPath]
318d0 5d 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ]] \..          
318e0 20 20 20 20 74 65 73 74 6c 69 6e 71 20 6e 6f 72      testlinq nor
318f0 74 68 77 69 6e 64 45 46 2e 64 62 5d 5d 0d 0a 0d  thwindEF.db]]...
31900 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20 6e  .          set n
31910 6f 6e 57 61 6c 44 62 46 69 6c 65 20 5b 66 69 6c  onWalDbFile [fil
31920 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69  e nativename [fi
31930 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20  le join \..     
31940 20 20 20 20 20 20 20 20 20 5b 67 65 74 53 51 4c           [getSQL
31950 69 74 65 54 65 73 74 44 61 74 61 50 61 74 68 5d  iteTestDataPath]
31960 20 6e 6f 6e 57 61 6c 2e 64 62 5d 5d 0d 0a 0d 0a   nonWal.db]]....
31970 20 20 20 20 20 20 20 20 20 20 73 65 74 20 77 61            set wa
31980 6c 44 62 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61  lDbFile [file na
31990 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a  tivename [file j
319a0 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  oin \..         
319b0 20 20 20 20 20 5b 67 65 74 53 51 4c 69 74 65 54       [getSQLiteT
319c0 65 73 74 44 61 74 61 50 61 74 68 5d 20 77 61 6c  estDataPath] wal
319d0 2e 64 62 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  .db]]....       
319e0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
319f0 23 20 4e 4f 54 45 3a 20 54 68 65 20 76 61 72 69  # NOTE: The vari
31a00 6f 75 73 20 69 6e 73 74 61 6c 6c 2f 75 6e 69 6e  ous install/unin
31a10 73 74 61 6c 6c 20 6c 6f 67 20 66 69 6c 65 73 20  stall log files 
31a20 75 73 65 64 20 74 6f 20 74 65 73 74 20 74 68 65  used to test the
31a30 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20  ..          #   
31a40 20 20 20 20 64 65 73 69 67 6e 2d 74 69 6d 65 20      design-time 
31a50 63 6f 6d 70 6f 6e 65 6e 74 20 69 6e 73 74 61 6c  component instal
31a60 6c 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ler...          
31a70 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  #..          set
31a80 20 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30   testInstallVs20
31a90 30 35 4c 6f 67 46 69 6c 65 20 5b 66 69 6c 65 20  05LogFile [file 
31aa0 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65  nativename [file
31ab0 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20   join \..       
31ac0 20 20 20 20 20 20 20 5b 67 65 74 53 51 4c 69 74         [getSQLit
31ad0 65 54 65 73 74 44 61 74 61 50 61 74 68 5d 20 49  eTestDataPath] I
31ae0 6e 73 74 61 6c 6c 65 72 5f 54 65 73 74 5f 56 73  nstaller_Test_Vs
31af0 32 30 30 35 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20  2005.log]]....  
31b00 20 20 20 20 20 20 20 20 73 65 74 20 74 65 73 74          set test
31b10 49 6e 73 74 61 6c 6c 56 73 32 30 30 38 4c 6f 67  InstallVs2008Log
31b20 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69 76  File [file nativ
31b30 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e  ename [file join
31b40 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
31b50 20 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73 74    [getSQLiteTest
31b60 44 61 74 61 50 61 74 68 5d 20 49 6e 73 74 61 6c  DataPath] Instal
31b70 6c 65 72 5f 54 65 73 74 5f 56 73 32 30 30 38 2e  ler_Test_Vs2008.
31b80 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  log]]....       
31b90 20 20 20 73 65 74 20 74 65 73 74 49 6e 73 74 61     set testInsta
31ba0 6c 6c 56 73 32 30 31 30 4c 6f 67 46 69 6c 65 20  llVs2010LogFile 
31bb0 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65  [file nativename
31bc0 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20   [file join \.. 
31bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65               [ge
31be0 74 53 51 4c 69 74 65 54 65 73 74 44 61 74 61 50  tSQLiteTestDataP
31bf0 61 74 68 5d 20 49 6e 73 74 61 6c 6c 65 72 5f 54  ath] Installer_T
31c00 65 73 74 5f 56 73 32 30 31 30 2e 6c 6f 67 5d 5d  est_Vs2010.log]]
31c10 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65  ....          se
31c20 74 20 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32  t testInstallVs2
31c30 30 31 32 4c 6f 67 46 69 6c 65 20 5b 66 69 6c 65  012LogFile [file
31c40 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c   nativename [fil
31c50 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20  e join \..      
31c60 20 20 20 20 20 20 20 20 5b 67 65 74 53 51 4c 69          [getSQLi
31c70 74 65 54 65 73 74 44 61 74 61 50 61 74 68 5d 20  teTestDataPath] 
31c80 49 6e 73 74 61 6c 6c 65 72 5f 54 65 73 74 5f 56  Installer_Test_V
31c90 73 32 30 31 32 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20  s2012.log]].... 
31ca0 20 20 20 20 20 20 20 20 20 73 65 74 20 74 65 73           set tes
31cb0 74 49 6e 73 74 61 6c 6c 56 73 32 30 31 33 4c 6f  tInstallVs2013Lo
31cc0 67 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69  gFile [file nati
31cd0 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69  vename [file joi
31ce0 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n \..           
31cf0 20 20 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73     [getSQLiteTes
31d00 74 44 61 74 61 50 61 74 68 5d 20 49 6e 73 74 61  tDataPath] Insta
31d10 6c 6c 65 72 5f 54 65 73 74 5f 56 73 32 30 31 33  ller_Test_Vs2013
31d20 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20  .log]]....      
31d30 20 20 20 20 73 65 74 20 74 65 73 74 49 6e 73 74      set testInst
31d40 61 6c 6c 56 73 32 30 31 35 4c 6f 67 46 69 6c 65  allVs2015LogFile
31d50 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d   [file nativenam
31d60 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a  e [file join \..
31d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 67                [g
31d80 65 74 53 51 4c 69 74 65 54 65 73 74 44 61 74 61  etSQLiteTestData
31d90 50 61 74 68 5d 20 49 6e 73 74 61 6c 6c 65 72 5f  Path] Installer_
31da0 54 65 73 74 5f 56 73 32 30 31 35 2e 6c 6f 67 5d  Test_Vs2015.log]
31db0 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 73  ]....          s
31dc0 65 74 20 74 65 73 74 49 6e 73 74 61 6c 6c 56 73  et testInstallVs
31dd0 32 30 31 37 4c 6f 67 46 69 6c 65 20 5b 66 69 6c  2017LogFile [fil
31de0 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69  e nativename [fi
31df0 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20  le join \..     
31e00 20 20 20 20 20 20 20 20 20 5b 67 65 74 53 51 4c           [getSQL
31e10 69 74 65 54 65 73 74 44 61 74 61 50 61 74 68 5d  iteTestDataPath]
31e20 20 49 6e 73 74 61 6c 6c 65 72 5f 54 65 73 74 5f   Installer_Test_
31e30 56 73 32 30 31 37 2e 6c 6f 67 5d 5d 0d 0a 0d 0a  Vs2017.log]]....
31e40 20 20 20 20 20 20 20 20 20 20 73 65 74 20 74 65            set te
31e50 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 30  stUninstallVs200
31e60 35 4c 6f 67 46 69 6c 65 20 5b 66 69 6c 65 20 6e  5LogFile [file n
31e70 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20  ativename [file 
31e80 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20  join \..        
31e90 20 20 20 20 20 20 5b 67 65 74 53 51 4c 69 74 65        [getSQLite
31ea0 54 65 73 74 44 61 74 61 50 61 74 68 5d 20 55 6e  TestDataPath] Un
31eb0 69 6e 73 74 61 6c 6c 65 72 5f 54 65 73 74 5f 56  installer_Test_V
31ec0 73 32 30 30 35 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20  s2005.log]].... 
31ed0 20 20 20 20 20 20 20 20 20 73 65 74 20 74 65 73           set tes
31ee0 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 30 38  tUninstallVs2008
31ef0 4c 6f 67 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61  LogFile [file na
31f00 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a  tivename [file j
31f10 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  oin \..         
31f20 20 20 20 20 20 5b 67 65 74 53 51 4c 69 74 65 54       [getSQLiteT
31f30 65 73 74 44 61 74 61 50 61 74 68 5d 20 55 6e 69  estDataPath] Uni
31f40 6e 73 74 61 6c 6c 65 72 5f 54 65 73 74 5f 56 73  nstaller_Test_Vs
31f50 32 30 30 38 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20  2008.log]]....  
31f60 20 20 20 20 20 20 20 20 73 65 74 20 74 65 73 74          set test
31f70 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31 30 4c  UninstallVs2010L
31f80 6f 67 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74  ogFile [file nat
31f90 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f  ivename [file jo
31fa0 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  in \..          
31fb0 20 20 20 20 5b 67 65 74 53 51 4c 69 74 65 54 65      [getSQLiteTe
31fc0 73 74 44 61 74 61 50 61 74 68 5d 20 55 6e 69 6e  stDataPath] Unin
31fd0 73 74 61 6c 6c 65 72 5f 54 65 73 74 5f 56 73 32  staller_Test_Vs2
31fe0 30 31 30 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20  010.log]]....   
31ff0 20 20 20 20 20 20 20 73 65 74 20 74 65 73 74 55         set testU
32000 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31 32 4c 6f  ninstallVs2012Lo
32010 67 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69  gFile [file nati
32020 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69  vename [file joi
32030 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n \..           
32040 20 20 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73     [getSQLiteTes
32050 74 44 61 74 61 50 61 74 68 5d 20 55 6e 69 6e 73  tDataPath] Unins
32060 74 61 6c 6c 65 72 5f 54 65 73 74 5f 56 73 32 30  taller_Test_Vs20
32070 31 32 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20  12.log]]....    
32080 20 20 20 20 20 20 73 65 74 20 74 65 73 74 55 6e        set testUn
32090 69 6e 73 74 61 6c 6c 56 73 32 30 31 33 4c 6f 67  installVs2013Log
320a0 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69 76  File [file nativ
320b0 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e  ename [file join
320c0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
320d0 20 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73 74    [getSQLiteTest
320e0 44 61 74 61 50 61 74 68 5d 20 55 6e 69 6e 73 74  DataPath] Uninst
320f0 61 6c 6c 65 72 5f 54 65 73 74 5f 56 73 32 30 31  aller_Test_Vs201
32100 33 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20  3.log]]....     
32110 20 20 20 20 20 73 65 74 20 74 65 73 74 55 6e 69       set testUni
32120 6e 73 74 61 6c 6c 56 73 32 30 31 35 4c 6f 67 46  nstallVs2015LogF
32130 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65  ile [file native
32140 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20  name [file join 
32150 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
32160 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73 74 44   [getSQLiteTestD
32170 61 74 61 50 61 74 68 5d 20 55 6e 69 6e 73 74 61  ataPath] Uninsta
32180 6c 6c 65 72 5f 54 65 73 74 5f 56 73 32 30 31 35  ller_Test_Vs2015
32190 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20  .log]]....      
321a0 20 20 20 20 73 65 74 20 74 65 73 74 55 6e 69 6e      set testUnin
321b0 73 74 61 6c 6c 56 73 32 30 31 37 4c 6f 67 46 69  stallVs2017LogFi
321c0 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e  le [file nativen
321d0 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c  ame [file join \
321e0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
321f0 5b 67 65 74 53 51 4c 69 74 65 54 65 73 74 44 61  [getSQLiteTestDa
32200 74 61 50 61 74 68 5d 20 55 6e 69 6e 73 74 61 6c  taPath] Uninstal
32210 6c 65 72 5f 54 65 73 74 5f 56 73 32 30 31 37 2e  ler_Test_Vs2017.
32220 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  log]]....       
32230 20 20 20 23 23 23 23 23 23 23 23 23 23 23 23 23     #############
32240 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
32250 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
32260 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
32270 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20 20 20  ########....    
32280 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
32290 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 68 65   exists ::no(che
322a0 63 6b 46 6f 72 53 71 6c 69 74 65 46 69 6c 65 73  ckForSqliteFiles
322b0 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
322c0 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61          if {![ha
322d0 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70  veConstraint [ap
322e0 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c  pendArgs file_ \
322f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
32300 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 65 6e    [file tail $en
32310 74 69 74 79 46 72 61 6d 65 77 6f 72 6b 44 6c 6c  tityFrameworkDll
32320 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d  File]]]} then {.
32330 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  .              c
32340 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73  heckForFile $tes
32350 74 5f 63 68 61 6e 6e 65 6c 20 24 65 6e 74 69 74  t_channel $entit
32360 79 46 72 61 6d 65 77 6f 72 6b 44 6c 6c 46 69 6c  yFrameworkDllFil
32370 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e..            }
32380 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
32390 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72  if {![haveConstr
323a0 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
323b0 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20   file_ \..      
323c0 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20            [file 
323d0 74 61 69 6c 20 24 69 6e 73 74 61 6c 6c 65 72 45  tail $installerE
323e0 78 65 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20  xeFile]]]} then 
323f0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
32400 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74   checkForFile $t
32410 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 69 6e 73  est_channel $ins
32420 74 61 6c 6c 65 72 45 78 65 46 69 6c 65 20 49 6e  tallerExeFile In
32430 73 74 61 6c 6c 65 72 2e 65 78 65 0d 0a 20 20 20  staller.exe..   
32440 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
32450 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
32460 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b  haveConstraint [
32470 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f  appendArgs file_
32480 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
32490 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24      [file tail $
324a0 73 71 6c 69 74 65 44 65 73 69 67 6e 65 72 44 6c  sqliteDesignerDl
324b0 6c 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b  lFile]]]} then {
324c0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
324d0 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65  checkForFile $te
324e0 73 74 5f 63 68 61 6e 6e 65 6c 20 24 73 71 6c 69  st_channel $sqli
324f0 74 65 44 65 73 69 67 6e 65 72 44 6c 6c 46 69 6c  teDesignerDllFil
32500 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e..            }
32510 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
32520 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72  if {![haveConstr
32530 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
32540 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20   file_ \..      
32550 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20            [file 
32560 74 61 69 6c 20 24 73 79 73 74 65 6d 44 61 74 61  tail $systemData
32570 53 51 4c 69 74 65 44 6c 6c 46 69 6c 65 5d 5d 5d  SQLiteDllFile]]]
32580 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
32590 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72          checkFor
325a0 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e  File $test_chann
325b0 65 6c 20 24 73 79 73 74 65 6d 44 61 74 61 53 51  el $systemDataSQ
325c0 4c 69 74 65 44 6c 6c 46 69 6c 65 0d 0a 20 20 20  LiteDllFile..   
325d0 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
325e0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
325f0 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b  haveConstraint [
32600 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f  appendArgs file_
32610 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
32620 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24      [file tail $
32630 73 79 73 74 65 6d 44 61 74 61 53 51 4c 69 74 65  systemDataSQLite
32640 4c 69 6e 71 44 6c 6c 46 69 6c 65 5d 5d 5d 7d 20  LinqDllFile]]]} 
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 4c 69 6e 71 44 6c 6c 46 69 6c 65 0d 0a 20  teLinqDllFile.. 
326a0 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
326b0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
326c0 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74  ![haveConstraint
326d0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c   [appendArgs fil
326e0 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  e_ \..          
326f0 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c        [file tail
32700 20 24 73 79 73 74 65 6d 44 61 74 61 53 51 4c 69   $systemDataSQLi
32710 74 65 45 66 36 44 6c 6c 46 69 6c 65 5d 5d 5d 7d  teEf6DllFile]]]}
32720 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
32730 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46         checkForF
32740 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65  ile $test_channe
32750 6c 20 24 73 79 73 74 65 6d 44 61 74 61 53 51 4c  l $systemDataSQL
32760 69 74 65 45 66 36 44 6c 6c 46 69 6c 65 0d 0a 20  iteEf6DllFile.. 
32770 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
32780 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
32790 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74  ![haveConstraint
327a0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c   [appendArgs fil
327b0 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  e_ \..          
327c0 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c        [file tail
327d0 20 24 74 65 73 74 45 78 65 46 69 6c 65 5d 5d 5d   $testExeFile]]]
327e0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
327f0 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72          checkFor
32800 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e  File $test_chann
32810 65 6c 20 24 74 65 73 74 45 78 65 46 69 6c 65 20  el $testExeFile 
32820 74 65 73 74 2e 65 78 65 0d 0a 20 20 20 20 20 20  test.exe..      
32830 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
32840 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76         if {![hav
32850 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70  eConstraint [app
32860 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d  endArgs file_ \.
32870 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
32880 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 74 65 73   [file tail $tes
32890 74 4c 69 6e 71 45 78 65 46 69 6c 65 5d 5d 5d 7d  tLinqExeFile]]]}
328a0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
328b0 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46         checkForF
328c0 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65  ile $test_channe
328d0 6c 20 24 74 65 73 74 4c 69 6e 71 45 78 65 46 69  l $testLinqExeFi
328e0 6c 65 20 74 65 73 74 6c 69 6e 71 2e 65 78 65 0d  le testlinq.exe.
328f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
32900 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
32910 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69   {![haveConstrai
32920 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66  nt [appendArgs f
32930 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20  ile_ \..        
32940 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61          [file ta
32950 69 6c 20 24 74 65 73 74 45 66 36 45 78 65 46 69  il $testEf6ExeFi
32960 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  le]]]} then {.. 
32970 20 20 20 20 20 20 20 20 20 20 20 20 20 63 68 65               che
32980 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f  ckForFile $test_
32990 63 68 61 6e 6e 65 6c 20 24 74 65 73 74 45 66 36  channel $testEf6
329a0 45 78 65 46 69 6c 65 20 74 65 73 74 65 66 36 2e  ExeFile testef6.
329b0 65 78 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  exe..           
329c0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
329d0 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73    if {![haveCons
329e0 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
329f0 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20  gs file_ \..    
32a00 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c              [fil
32a10 65 20 74 61 69 6c 20 24 74 65 73 74 4c 69 6e 71  e tail $testLinq
32a20 4f 75 74 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e  OutFile]]]} then
32a30 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
32a40 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24    checkForFile $
32a50 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65  test_channel $te
32a60 73 74 4c 69 6e 71 4f 75 74 46 69 6c 65 0d 0a 20  stLinqOutFile.. 
32a70 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
32a80 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
32a90 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74  ![haveConstraint
32aa0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c   [appendArgs fil
32ab0 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  e_ \..          
32ac0 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c        [file tail
32ad0 20 24 6e 6f 72 74 68 77 69 6e 64 45 66 44 62 46   $northwindEfDbF
32ae0 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a  ile]]]} then {..
32af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 68                ch
32b00 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74  eckForFile $test
32b10 5f 63 68 61 6e 6e 65 6c 20 24 6e 6f 72 74 68 77  _channel $northw
32b20 69 6e 64 45 66 44 62 46 69 6c 65 0d 0a 20 20 20  indEfDbFile..   
32b30 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
32b40 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
32b50 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b  haveConstraint [
32b60 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f  appendArgs file_
32b70 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
32b80 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24      [file tail $
32b90 6e 6f 6e 57 61 6c 44 62 46 69 6c 65 5d 5d 5d 7d  nonWalDbFile]]]}
32ba0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
32bb0 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46         checkForF
32bc0 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65  ile $test_channe
32bd0 6c 20 24 6e 6f 6e 57 61 6c 44 62 46 69 6c 65 0d  l $nonWalDbFile.
32be0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
32bf0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
32c00 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69   {![haveConstrai
32c10 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66  nt [appendArgs f
32c20 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20  ile_ \..        
32c30 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61          [file ta
32c40 69 6c 20 24 77 61 6c 44 62 46 69 6c 65 5d 5d 5d  il $walDbFile]]]
32c50 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
32c60 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72          checkFor
32c70 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e  File $test_chann
32c80 65 6c 20 24 77 61 6c 44 62 46 69 6c 65 0d 0a 20  el $walDbFile.. 
32c90 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
32ca0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
32cb0 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74  ![haveConstraint
32cc0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c   [appendArgs fil
32cd0 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  e_ \..          
32ce0 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c        [file tail
32cf0 20 24 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32   $testInstallVs2
32d00 30 30 35 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74  005LogFile]]]} t
32d10 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
32d20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c       checkForFil
32d30 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  e $test_channel 
32d40 24 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30  $testInstallVs20
32d50 30 35 4c 6f 67 46 69 6c 65 0d 0a 20 20 20 20 20  05LogFile..     
32d60 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
32d70 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61          if {![ha
32d80 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70  veConstraint [ap
32d90 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c  pendArgs file_ \
32da0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
32db0 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 74 65    [file tail $te
32dc0 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 30 38 4c  stInstallVs2008L
32dd0 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20  ogFile]]]} then 
32de0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
32df0 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74   checkForFile $t
32e00 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73  est_channel $tes
32e10 74 49 6e 73 74 61 6c 6c 56 73 32 30 30 38 4c 6f  tInstallVs2008Lo
32e20 67 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 20  gFile..         
32e30 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
32e40 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f      if {![haveCo
32e50 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64  nstraint [append
32e60 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20  Args file_ \..  
32e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 66                [f
32e80 69 6c 65 20 74 61 69 6c 20 24 74 65 73 74 49 6e  ile tail $testIn
32e90 73 74 61 6c 6c 56 73 32 30 31 30 4c 6f 67 46 69  stallVs2010LogFi
32ea0 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  le]]]} then {.. 
32eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 63 68 65               che
32ec0 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f  ckForFile $test_
32ed0 63 68 61 6e 6e 65 6c 20 24 74 65 73 74 49 6e 73  channel $testIns
32ee0 74 61 6c 6c 56 73 32 30 31 30 4c 6f 67 46 69 6c  tallVs2010LogFil
32ef0 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e..            }
32f00 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
32f10 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72  if {![haveConstr
32f20 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
32f30 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20   file_ \..      
32f40 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20            [file 
32f50 74 61 69 6c 20 24 74 65 73 74 49 6e 73 74 61 6c  tail $testInstal
32f60 6c 56 73 32 30 31 32 4c 6f 67 46 69 6c 65 5d 5d  lVs2012LogFile]]
32f70 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
32f80 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f           checkFo
32f90 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e  rFile $test_chan
32fa0 6e 65 6c 20 24 74 65 73 74 49 6e 73 74 61 6c 6c  nel $testInstall
32fb0 56 73 32 30 31 32 4c 6f 67 46 69 6c 65 0d 0a 20  Vs2012LogFile.. 
32fc0 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
32fd0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
32fe0 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74  ![haveConstraint
32ff0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c   [appendArgs fil
33000 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  e_ \..          
33010 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c        [file tail
33020 20 24 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32   $testInstallVs2
33030 30 31 33 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74  013LogFile]]]} t
33040 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
33050 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c       checkForFil
33060 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  e $test_channel 
33070 24 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30  $testInstallVs20
33080 31 33 4c 6f 67 46 69 6c 65 0d 0a 20 20 20 20 20  13LogFile..     
33090 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
330a0 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61          if {![ha
330b0 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70  veConstraint [ap
330c0 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c  pendArgs file_ \
330d0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
330e0 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 74 65    [file tail $te
330f0 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 31 35 4c  stInstallVs2015L
33100 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20  ogFile]]]} then 
33110 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
33120 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74   checkForFile $t
33130 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73  est_channel $tes
33140 74 49 6e 73 74 61 6c 6c 56 73 32 30 31 35 4c 6f  tInstallVs2015Lo
33150 67 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 20  gFile..         
33160 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
33170 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f      if {![haveCo
33180 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64  nstraint [append
33190 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20  Args file_ \..  
331a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 66                [f
331b0 69 6c 65 20 74 61 69 6c 20 24 74 65 73 74 49 6e  ile tail $testIn
331c0 73 74 61 6c 6c 56 73 32 30 31 37 4c 6f 67 46 69  stallVs2017LogFi
331d0 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  le]]]} then {.. 
331e0 20 20 20 20 20 20 20 20 20 20 20 20 20 63 68 65               che
331f0 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f  ckForFile $test_
33200 63 68 61 6e 6e 65 6c 20 24 74 65 73 74 49 6e 73  channel $testIns
33210 74 61 6c 6c 56 73 32 30 31 37 4c 6f 67 46 69 6c  tallVs2017LogFil
33220 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e..            }
33230 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
33240 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72  if {![haveConstr
33250 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
33260 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20   file_ \..      
33270 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20            [file 
33280 74 61 69 6c 20 24 74 65 73 74 55 6e 69 6e 73 74  tail $testUninst
33290 61 6c 6c 56 73 32 30 30 35 4c 6f 67 46 69 6c 65  allVs2005LogFile
332a0 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ]]]} then {..   
332b0 20 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b             check
332c0 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68  ForFile $test_ch
332d0 61 6e 6e 65 6c 20 24 74 65 73 74 55 6e 69 6e 73  annel $testUnins
332e0 74 61 6c 6c 56 73 32 30 30 35 4c 6f 67 46 69 6c  tallVs2005LogFil
332f0 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e..            }
33300 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
33310 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72  if {![haveConstr
33320 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
33330 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20   file_ \..      
33340 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20            [file 
33350 74 61 69 6c 20 24 74 65 73 74 55 6e 69 6e 73 74  tail $testUninst
33360 61 6c 6c 56 73 32 30 30 38 4c 6f 67 46 69 6c 65  allVs2008LogFile
33370 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ]]]} then {..   
33380 20 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b             check
33390 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68  ForFile $test_ch
333a0 61 6e 6e 65 6c 20 24 74 65 73 74 55 6e 69 6e 73  annel $testUnins
333b0 74 61 6c 6c 56 73 32 30 30 38 4c 6f 67 46 69 6c  tallVs2008LogFil
333c0 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e..            }
333d0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
333e0 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72  if {![haveConstr
333f0 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
33400 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20   file_ \..      
33410 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20            [file 
33420 74 61 69 6c 20 24 74 65 73 74 55 6e 69 6e 73 74  tail $testUninst
33430 61 6c 6c 56 73 32 30 31 30 4c 6f 67 46 69 6c 65  allVs2010LogFile
33440 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ]]]} then {..   
33450 20 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b             check
33460 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68  ForFile $test_ch
33470 61 6e 6e 65 6c 20 24 74 65 73 74 55 6e 69 6e 73  annel $testUnins
33480 74 61 6c 6c 56 73 32 30 31 30 4c 6f 67 46 69 6c  tallVs2010LogFil
33490 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e..            }
334a0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
334b0 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72  if {![haveConstr
334c0 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
334d0 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20   file_ \..      
334e0 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20            [file 
334f0 74 61 69 6c 20 24 74 65 73 74 55 6e 69 6e 73 74  tail $testUninst
33500 61 6c 6c 56 73 32 30 31 32 4c 6f 67 46 69 6c 65  allVs2012LogFile
33510 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ]]]} then {..   
33520 20 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b             check
33530 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68  ForFile $test_ch
33540 61 6e 6e 65 6c 20 24 74 65 73 74 55 6e 69 6e 73  annel $testUnins
33550 74 61 6c 6c 56 73 32 30 31 32 4c 6f 67 46 69 6c  tallVs2012LogFil
33560 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e..            }
33570 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
33580 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72  if {![haveConstr
33590 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
335a0 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20   file_ \..      
335b0 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20            [file 
335c0 74 61 69 6c 20 24 74 65 73 74 55 6e 69 6e 73 74  tail $testUninst
335d0 61 6c 6c 56 73 32 30 31 33 4c 6f 67 46 69 6c 65  allVs2013LogFile
335e0 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ]]]} then {..   
335f0 20 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b             check
33600 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68  ForFile $test_ch
33610 61 6e 6e 65 6c 20 24 74 65 73 74 55 6e 69 6e 73  annel $testUnins
33620 74 61 6c 6c 56 73 32 30 31 33 4c 6f 67 46 69 6c  tallVs2013LogFil
33630 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e..            }
33640 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
33650 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72  if {![haveConstr
33660 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
33670 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20   file_ \..      
33680 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20            [file 
33690 74 61 69 6c 20 24 74 65 73 74 55 6e 69 6e 73 74  tail $testUninst
336a0 61 6c 6c 56 73 32 30 31 35 4c 6f 67 46 69 6c 65  allVs2015LogFile
336b0 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ]]]} then {..   
336c0 20 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b             check
336d0 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68  ForFile $test_ch
336e0 61 6e 6e 65 6c 20 24 74 65 73 74 55 6e 69 6e 73  annel $testUnins
336f0 74 61 6c 6c 56 73 32 30 31 35 4c 6f 67 46 69 6c  tallVs2015LogFil
33700 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e..            }
33710 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
33720 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72  if {![haveConstr
33730 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
33740 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20   file_ \..      
33750 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20            [file 
33760 74 61 69 6c 20 24 74 65 73 74 55 6e 69 6e 73 74  tail $testUninst
33770 61 6c 6c 56 73 32 30 31 37 4c 6f 67 46 69 6c 65  allVs2017LogFile
33780 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ]]]} then {..   
33790 20 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b             check
337a0 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68  ForFile $test_ch
337b0 61 6e 6e 65 6c 20 24 74 65 73 74 55 6e 69 6e 73  annel $testUnins
337c0 74 61 6c 6c 56 73 32 30 31 37 4c 6f 67 46 69 6c  tallVs2017LogFil
337d0 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e..            }
337e0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
337f0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
33800 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
33810 20 70 72 6f 63 20 72 75 6e 53 51 4c 69 74 65 54   proc runSQLiteT
33820 65 73 74 46 69 6c 65 73 45 70 69 6c 6f 67 75 65  estFilesEpilogue
33830 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a   {} {..      #..
33840 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b        # NOTE: Sk
33850 69 70 20 72 75 6e 6e 69 6e 67 20 6f 75 72 20 63  ip running our c
33860 75 73 74 6f 6d 20 66 69 6c 65 73 20 65 70 69 6c  ustom files epil
33870 6f 67 75 65 20 69 66 20 74 68 65 20 6d 61 69 6e  ogue if the main
33880 20 6f 6e 65 20 68 61 73 20 62 65 65 6e 0d 0a 20   one has been.. 
33890 20 20 20 20 20 23 20 20 20 20 20 20 20 73 6b 69       #       ski
338a0 70 70 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  pped...      #..
338b0 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
338c0 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 65 70 69   exists ::no(epi
338d0 6c 6f 67 75 65 2e 65 61 67 6c 65 29 5d 7d 20 74  logue.eagle)]} t
338e0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 75  hen {..        u
338f0 70 6c 65 76 65 6c 20 31 20 7b 0d 0a 20 20 20 20  plevel 1 {..    
33900 20 20 20 20 20 20 75 6e 73 65 74 20 2d 6e 6f 63        unset -noc
33910 6f 6d 70 6c 61 69 6e 20 5c 0d 0a 20 20 20 20 20  omplain \..     
33920 20 20 20 20 20 20 20 20 20 74 65 73 74 55 6e 69           testUni
33930 6e 73 74 61 6c 6c 56 73 32 30 31 37 4c 6f 67 46  nstallVs2017LogF
33940 69 6c 65 20 74 65 73 74 55 6e 69 6e 73 74 61 6c  ile testUninstal
33950 6c 56 73 32 30 31 35 4c 6f 67 46 69 6c 65 20 5c  lVs2015LogFile \
33960 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
33970 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32  testUninstallVs2
33980 30 31 33 4c 6f 67 46 69 6c 65 20 74 65 73 74 55  013LogFile testU
33990 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31 32 4c 6f  ninstallVs2012Lo
339a0 67 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20  gFile \..       
339b0 20 20 20 20 20 20 20 74 65 73 74 55 6e 69 6e 73         testUnins
339c0 74 61 6c 6c 56 73 32 30 31 30 4c 6f 67 46 69 6c  tallVs2010LogFil
339d0 65 20 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56  e testUninstallV
339e0 73 32 30 30 38 4c 6f 67 46 69 6c 65 20 5c 0d 0a  s2008LogFile \..
339f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65                te
33a00 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 30  stUninstallVs200
33a10 35 4c 6f 67 46 69 6c 65 20 74 65 73 74 49 6e 73  5LogFile testIns
33a20 74 61 6c 6c 56 73 32 30 31 37 4c 6f 67 46 69 6c  tallVs2017LogFil
33a30 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
33a40 20 20 20 74 65 73 74 49 6e 73 74 61 6c 6c 56 73     testInstallVs
33a50 32 30 31 35 4c 6f 67 46 69 6c 65 20 74 65 73 74  2015LogFile test
33a60 49 6e 73 74 61 6c 6c 56 73 32 30 31 33 4c 6f 67  InstallVs2013Log
33a70 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  File \..        
33a80 20 20 20 20 20 20 74 65 73 74 49 6e 73 74 61 6c        testInstal
33a90 6c 56 73 32 30 31 32 4c 6f 67 46 69 6c 65 20 74  lVs2012LogFile t
33aa0 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 31 30  estInstallVs2010
33ab0 4c 6f 67 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20  LogFile \..     
33ac0 20 20 20 20 20 20 20 20 20 74 65 73 74 49 6e 73           testIns
33ad0 74 61 6c 6c 56 73 32 30 30 38 4c 6f 67 46 69 6c  tallVs2008LogFil
33ae0 65 20 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32  e testInstallVs2
33af0 30 30 35 4c 6f 67 46 69 6c 65 0d 0a 0d 0a 20 20  005LogFile....  
33b00 20 20 20 20 20 20 20 20 75 6e 73 65 74 20 2d 6e          unset -n
33b10 6f 63 6f 6d 70 6c 61 69 6e 20 5c 0d 0a 20 20 20  ocomplain \..   
33b20 20 20 20 20 20 20 20 20 20 20 20 6e 6f 72 74 68             north
33b30 77 69 6e 64 45 66 44 62 46 69 6c 65 20 74 65 73  windEfDbFile tes
33b40 74 4c 69 6e 71 4f 75 74 46 69 6c 65 20 5c 0d 0a  tLinqOutFile \..
33b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 61                wa
33b60 6c 44 62 46 69 6c 65 20 6e 6f 6e 57 61 6c 44 62  lDbFile nonWalDb
33b70 46 69 6c 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20  File....        
33b80 20 20 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c    unset -nocompl
33b90 61 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ain \..         
33ba0 20 20 20 20 20 74 65 73 74 45 66 36 45 78 65 46       testEf6ExeF
33bb0 69 6c 65 20 74 65 73 74 4c 69 6e 71 45 78 65 46  ile testLinqExeF
33bc0 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ile \..         
33bd0 20 20 20 20 20 74 65 73 74 45 78 65 46 69 6c 65       testExeFile
33be0 20 73 79 73 74 65 6d 44 61 74 61 53 51 4c 69 74   systemDataSQLit
33bf0 65 45 66 36 44 6c 6c 46 69 6c 65 20 5c 0d 0a 20  eEf6DllFile \.. 
33c00 20 20 20 20 20 20 20 20 20 20 20 20 20 73 79 73               sys
33c10 74 65 6d 44 61 74 61 53 51 4c 69 74 65 4c 69 6e  temDataSQLiteLin
33c20 71 44 6c 6c 46 69 6c 65 20 73 79 73 74 65 6d 44  qDllFile systemD
33c30 61 74 61 53 51 4c 69 74 65 44 6c 6c 46 69 6c 65  ataSQLiteDllFile
33c40 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
33c50 20 20 73 71 6c 69 74 65 44 65 73 69 67 6e 65 72    sqliteDesigner
33c60 44 6c 6c 46 69 6c 65 20 69 6e 73 74 61 6c 6c 65  DllFile installe
33c70 72 45 78 65 46 69 6c 65 20 5c 0d 0a 20 20 20 20  rExeFile \..    
33c80 20 20 20 20 20 20 20 20 20 20 65 6e 74 69 74 79            entity
33c90 46 72 61 6d 65 77 6f 72 6b 44 6c 6c 46 69 6c 65  FrameworkDllFile
33ca0 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
33cb0 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
33cc0 20 20 20 20 70 72 6f 63 20 72 75 6e 53 51 4c 69      proc runSQLi
33cd0 74 65 54 65 73 74 45 70 69 6c 6f 67 75 65 20 7b  teTestEpilogue {
33ce0 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
33cf0 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70      # NOTE: Skip
33d00 20 72 75 6e 6e 69 6e 67 20 6f 75 72 20 63 75 73   running our cus
33d10 74 6f 6d 20 65 70 69 6c 6f 67 75 65 20 69 66 20  tom epilogue if 
33d20 74 68 65 20 6d 61 69 6e 20 6f 6e 65 20 68 61 73  the main one has
33d30 20 62 65 65 6e 0d 0a 20 20 20 20 20 20 23 20 20   been..      #  
33d40 20 20 20 20 20 73 6b 69 70 70 65 64 2e 0d 0a 20       skipped... 
33d50 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
33d60 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
33d70 3a 3a 6e 6f 28 65 70 69 6c 6f 67 75 65 2e 65 61  ::no(epilogue.ea
33d80 67 6c 65 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  gle)]} then {.. 
33d90 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
33da0 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20 77    # NOTE: Show w
33db0 68 65 6e 20 6f 75 72 20 74 65 73 74 73 20 61 63  hen our tests ac
33dc0 74 75 61 6c 6c 79 20 65 6e 64 65 64 20 28 6e 6f  tually ended (no
33dd0 77 29 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  w)...        #..
33de0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
33df0 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
33e00 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
33e10 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 53           "---- S
33e20 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
33e30 65 20 74 65 73 74 73 20 65 6e 64 65 64 20 61 74  e tests ended at
33e40 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   " \..          
33e50 20 20 5b 63 6c 6f 63 6b 20 66 6f 72 6d 61 74 20    [clock format 
33e60 5b 63 6c 6f 63 6b 20 73 65 63 6f 6e 64 73 5d 5d  [clock seconds]]
33e70 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20   \n]....        
33e80 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
33e90 45 3a 20 4c 6f 61 64 20 74 68 65 20 22 65 70 69  E: Load the "epi
33ea0 6c 6f 67 75 65 22 20 63 75 73 74 6f 6d 20 70 65  logue" custom pe
33eb0 72 2d 75 73 65 72 20 61 6e 64 2f 6f 72 20 70 65  r-user and/or pe
33ec0 72 2d 68 6f 73 74 20 74 65 73 74 0d 0a 20 20 20  r-host test..   
33ed0 20 20 20 20 20 23 20 20 20 20 20 20 20 73 65 74       #       set
33ee0 74 69 6e 67 73 20 6e 6f 77 2e 0d 0a 20 20 20 20  tings now...    
33ef0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 75      #..        u
33f00 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74 20 6c  plevel 1 [list l
33f10 6f 61 64 53 51 4c 69 74 65 54 65 73 74 53 65 74  oadSQLiteTestSet
33f20 74 69 6e 67 73 20 24 3a 3a 74 65 73 74 5f 63 68  tings $::test_ch
33f30 61 6e 6e 65 6c 20 2e 65 70 69 6c 6f 67 75 65 5d  annel .epilogue]
33f40 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
33f50 20 20 20 20 20 20 20 23 20 42 55 47 46 49 58 3a         # BUGFIX:
33f60 20 42 65 66 6f 72 65 20 63 68 65 63 6b 69 6e 67   Before checking
33f70 20 74 68 65 20 66 69 6e 61 6c 20 72 65 73 6f 75   the final resou
33f80 72 63 65 73 20 69 6e 20 75 73 65 20 62 79 20 53  rces in use by S
33f90 51 4c 69 74 65 2c 20 6d 61 6b 65 0d 0a 20 20 20  QLite, make..   
33fa0 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20 73       #         s
33fb0 75 72 65 20 62 6f 74 68 20 6f 66 20 74 68 65 20  ure both of the 
33fc0 50 52 41 47 4d 41 20 72 65 6c 61 74 65 64 20 64  PRAGMA related d
33fd0 69 72 65 63 74 6f 72 79 20 6e 61 6d 65 73 20 61  irectory names a
33fe0 72 65 20 66 72 65 65 64 2e 0d 0a 20 20 20 20 20  re freed...     
33ff0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 63 68     #..        ch
34000 65 63 6b 46 6f 72 53 51 4c 69 74 65 44 69 72 65  eckForSQLiteDire
34010 63 74 6f 72 69 65 73 20 24 3a 3a 74 65 73 74 5f  ctories $::test_
34020 63 68 61 6e 6e 65 6c 20 74 72 75 65 0d 0a 0d 0a  channel true....
34030 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
34040 20 20 20 23 20 4e 4f 54 45 3a 20 41 6c 73 6f 20     # NOTE: Also 
34050 72 65 70 6f 72 74 20 74 68 65 20 72 65 73 6f 75  report the resou
34060 72 63 65 20 75 73 61 67 65 20 61 66 74 65 72 20  rce usage after 
34070 72 75 6e 6e 69 6e 67 20 74 68 65 20 74 65 73 74  running the test
34080 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  s...        #.. 
34090 20 20 20 20 20 20 20 72 65 70 6f 72 74 53 51 4c         reportSQL
340a0 69 74 65 52 65 73 6f 75 72 63 65 73 20 24 3a 3a  iteResources $::
340b0 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a  test_channel....
340c0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
340d0 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 70 6f 72     # NOTE: Repor
340e0 74 20 74 68 65 20 63 72 69 74 69 63 61 6c 20 68  t the critical h
340f0 61 6e 64 6c 65 20 63 6f 75 6e 74 73 20 61 66 74  andle counts aft
34100 65 72 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 74  er running the t
34110 65 73 74 73 2e 0d 0a 20 20 20 20 20 20 20 20 23  ests...        #
34120 0d 0a 20 20 20 20 20 20 20 20 67 65 74 53 51 4c  ..        getSQL
34130 69 74 65 48 61 6e 64 6c 65 43 6f 75 6e 74 73 20  iteHandleCounts 
34140 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d  $::test_channel.
34150 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
34160 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66        # NOTE: If
34170 20 6e 65 63 65 73 73 61 72 79 2c 20 64 69 73 61   necessary, disa
34180 62 6c 65 20 73 68 61 72 65 64 2d 63 61 63 68 65  ble shared-cache
34190 20 6d 6f 64 65 20 6e 6f 77 2e 0d 0a 20 20 20 20   mode now...    
341a0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69      #..        i
341b0 66 20 7b 5b 68 61 73 52 75 6e 74 69 6d 65 4f 70  f {[hasRuntimeOp
341c0 74 69 6f 6e 20 73 68 61 72 65 64 43 61 63 68 65  tion sharedCache
341d0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
341e0 20 20 20 20 20 65 6e 61 62 6c 65 53 68 61 72 65       enableShare
341f0 64 43 61 63 68 65 20 24 3a 3a 74 65 73 74 5f 63  dCache $::test_c
34200 68 61 6e 6e 65 6c 20 66 61 6c 73 65 0d 0a 20 20  hannel false..  
34210 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
34220 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
34230 4e 4f 54 45 3a 20 52 65 73 74 6f 72 65 20 74 68  NOTE: Restore th
34240 65 20 70 72 65 76 69 6f 75 73 6c 79 20 73 61 76  e previously sav
34250 65 64 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76  ed environment v
34260 61 72 69 61 62 6c 65 73 20 74 68 61 74 20 77 65  ariables that we
34270 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
34280 20 20 63 68 61 6e 67 65 64 20 66 6f 72 20 74 68    changed for th
34290 65 20 74 65 73 74 20 73 75 69 74 65 2e 0d 0a 20  e test suite... 
342a0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
342b0 20 20 72 65 73 74 6f 72 65 45 6e 76 69 72 6f 6e    restoreEnviron
342c0 6d 65 6e 74 56 61 72 69 61 62 6c 65 73 20 5c 0d  mentVariables \.
342d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 6c 69  .            [li
342e0 73 74 20 49 6e 69 74 69 61 6c 69 7a 65 5f 53 51  st Initialize_SQ
342f0 4c 69 74 65 4c 6f 67 5d 20 3a 3a 74 65 73 74 53  LiteLog] ::testS
34300 75 69 74 65 53 61 76 65 64 45 6e 76 0d 0a 20 20  uiteSavedEnv..  
34310 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
34320 0a 20 20 20 20 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 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
34350 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
34360 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
34370 0d 0a 20 20 20 20 23 23 23 23 23 23 23 23 23 23  ..    ##########
34380 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
34390 23 23 23 20 45 4e 44 20 45 61 67 6c 65 20 4f 4e  ### END Eagle ON
343a0 4c 59 20 23 23 23 23 23 23 23 23 23 23 23 23 23  LY #############
343b0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
343c0 23 0d 0a 20 20 20 20 23 23 23 23 23 23 23 23 23  #..    #########
343d0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
343e0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
343f0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
34400 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
34410 23 23 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 23 0d 0a  ##..  }....  #..
34420 20 20 23 20 4e 4f 54 45 3a 20 53 61 76 65 20 74    # NOTE: Save t
34430 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  he name of the d
34440 69 72 65 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e  irectory contain
34450 69 6e 67 20 74 68 69 73 20 66 69 6c 65 2e 0d 0a  ing this file...
34460 20 20 23 0d 0a 20 20 69 66 20 7b 21 5b 69 6e 66    #..  if {![inf
34470 6f 20 65 78 69 73 74 73 20 63 6f 6d 6d 6f 6e 5f  o exists common_
34480 64 69 72 65 63 74 6f 72 79 5d 7d 20 74 68 65 6e  directory]} then
34490 20 7b 0d 0a 20 20 20 20 73 65 74 20 63 6f 6d 6d   {..    set comm
344a0 6f 6e 5f 64 69 72 65 63 74 6f 72 79 20 5b 66 69  on_directory [fi
344b0 6c 65 20 64 69 72 6e 61 6d 65 20 5b 69 6e 66 6f  le dirname [info
344c0 20 73 63 72 69 70 74 5d 5d 0d 0a 20 20 7d 0d 0a   script]]..  }..
344d0 0d 0a 20 20 23 0d 0a 20 20 23 20 4e 4f 54 45 3a  ..  #..  # NOTE:
344e0 20 50 72 6f 76 69 64 65 20 74 68 65 20 53 79 73   Provide the Sys
344f0 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20  tem.Data.SQLite 
34500 74 65 73 74 20 70 61 63 6b 61 67 65 20 74 6f 20  test package to 
34510 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 2e  the interpreter.
34520 0d 0a 20 20 23 0d 0a 20 20 70 61 63 6b 61 67 65  ..  #..  package
34530 20 70 72 6f 76 69 64 65 20 53 79 73 74 65 6d 2e   provide System.
34540 44 61 74 61 2e 53 51 4c 69 74 65 2e 54 65 73 74  Data.SQLite.Test
34550 20 31 2e 30 0d 0a 7d 0d 0a                        1.0..}..