System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact 4c534206454157580e9ba9eb373d6785d2a7999e:


0000: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0010: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0020: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0030: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0040: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d  ###############.
0050: 0a 23 0d 0a 23 20 63 6f 6d 6d 6f 6e 2e 65 61 67  .#..# common.eag
0060: 6c 65 20 2d 2d 0d 0a 23 0d 0a 23 20 57 72 69 74  le --..#..# Writ
0070: 74 65 6e 20 62 79 20 4a 6f 65 20 4d 69 73 74 61  ten by Joe Mista
0080: 63 68 6b 69 6e 2e 0d 0a 23 20 52 65 6c 65 61 73  chkin...# Releas
0090: 65 64 20 74 6f 20 74 68 65 20 70 75 62 6c 69 63  ed to the public
00a0: 20 64 6f 6d 61 69 6e 2c 20 75 73 65 20 61 74 20   domain, use at 
00b0: 79 6f 75 72 20 6f 77 6e 20 72 69 73 6b 21 0d 0a  your own risk!..
00c0: 23 0d 0a 23 23 23 23 23 23 23 23 23 23 23 23 23  #..#############
00d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
00e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
00f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0100: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0110: 23 23 0d 0a 0d 0a 23 0d 0a 23 20 4e 4f 54 45 3a  ##....#..# NOTE:
0120: 20 55 73 65 20 6f 75 72 20 6f 77 6e 20 6e 61 6d   Use our own nam
0130: 65 73 70 61 63 65 20 68 65 72 65 20 62 65 63 61  espace here beca
0140: 75 73 65 20 65 76 65 6e 20 74 68 6f 75 67 68 20  use even though 
0150: 77 65 20 64 6f 20 6e 6f 74 20 64 69 72 65 63 74  we do not direct
0160: 6c 79 0d 0a 23 20 20 20 20 20 20 20 73 75 70 70  ly..#       supp
0170: 6f 72 74 20 6e 61 6d 65 73 70 61 63 65 73 20 6f  ort namespaces o
0180: 75 72 73 65 6c 76 65 73 2c 20 77 65 20 64 6f 20  urselves, we do 
0190: 6e 6f 74 20 77 61 6e 74 20 74 6f 20 70 6f 6c 6c  not want to poll
01a0: 75 74 65 20 74 68 65 20 67 6c 6f 62 61 6c 0d 0a  ute the global..
01b0: 23 20 20 20 20 20 20 20 6e 61 6d 65 73 70 61 63  #       namespac
01c0: 65 20 69 66 20 74 68 69 73 20 73 63 72 69 70 74  e if this script
01d0: 20 61 63 74 75 61 6c 6c 79 20 65 6e 64 73 20 75   actually ends u
01e0: 70 20 62 65 69 6e 67 20 65 76 61 6c 75 61 74 65  p being evaluate
01f0: 64 20 69 6e 20 54 63 6c 2e 0d 0a 23 0d 0a 6e 61  d in Tcl...#..na
0200: 6d 65 73 70 61 63 65 20 65 76 61 6c 20 3a 3a 45  mespace eval ::E
0210: 61 67 6c 65 20 7b 0d 0a 20 20 69 66 20 7b 5b 69  agle {..  if {[i
0220: 73 45 61 67 6c 65 5d 7d 20 74 68 65 6e 20 7b 0d  sEagle]} then {.
0230: 0a 20 20 20 20 23 23 23 23 23 23 23 23 23 23 23  .    ###########
0240: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0250: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0260: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0270: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0280: 0d 0a 20 20 20 20 23 23 23 23 23 23 23 23 23 23  ..    ##########
0290: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
02a0: 23 23 20 42 45 47 49 4e 20 45 61 67 6c 65 20 4f  ## BEGIN Eagle O
02b0: 4e 4c 59 20 23 23 23 23 23 23 23 23 23 23 23 23  NLY ############
02c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
02d0: 23 0d 0a 20 20 20 20 23 23 23 23 23 23 23 23 23  #..    #########
02e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
02f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0300: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0310: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0320: 23 23 0d 0a 0d 0a 20 20 20 20 70 72 6f 63 20 67  ##....    proc g
0330: 65 74 53 51 4c 69 74 65 44 65 66 69 6e 65 43 6f  etSQLiteDefineCo
0340: 6e 73 74 61 6e 74 50 72 65 66 69 78 20 7b 7d 20  nstantPrefix {} 
0350: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
0360: 20 20 23 20 4e 4f 54 45 3a 20 53 65 65 20 69 66    # NOTE: See if
0370: 20 74 68 65 20 64 65 66 69 6e 65 20 63 6f 6e 73   the define cons
0380: 74 61 6e 74 20 70 72 65 66 69 78 20 73 65 74 74  tant prefix sett
0390: 69 6e 67 20 68 61 73 20 62 65 65 6e 20 6f 76 65  ing has been ove
03a0: 72 72 69 64 64 65 6e 0d 0a 20 20 20 20 20 20 23  rridden..      #
03b0: 20 20 20 20 20 20 20 62 79 20 74 68 65 20 75 73         by the us
03c0: 65 72 20 28 65 2e 67 2e 20 6f 6e 20 74 68 65 20  er (e.g. on the 
03d0: 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 29 2e 0d 0a  command line)...
03e0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
03f0: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
0400: 3a 3a 64 65 66 69 6e 65 5f 63 6f 6e 73 74 61 6e  ::define_constan
0410: 74 5f 70 72 65 66 69 78 5d 20 26 26 20 5c 0d 0a  t_prefix] && \..
0420: 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e            [strin
0430: 67 20 6c 65 6e 67 74 68 20 24 3a 3a 64 65 66 69  g length $::defi
0440: 6e 65 5f 63 6f 6e 73 74 61 6e 74 5f 70 72 65 66  ne_constant_pref
0450: 69 78 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  ix] > 0} then {.
0460: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
0470: 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20      # NOTE: Use 
0480: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 64 65  the specified de
0490: 66 69 6e 65 20 63 6f 6e 73 74 61 6e 74 20 70 72  fine constant pr
04a0: 65 66 69 78 2e 0d 0a 20 20 20 20 20 20 20 20 23  efix...        #
04b0: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
04c0: 20 24 3a 3a 64 65 66 69 6e 65 5f 63 6f 6e 73 74   $::define_const
04d0: 61 6e 74 5f 70 72 65 66 69 78 0d 0a 20 20 20 20  ant_prefix..    
04e0: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
04f0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
0500: 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20 64   NOTE: Use the d
0510: 65 66 61 75 6c 74 20 64 65 66 69 6e 65 20 63 6f  efault define co
0520: 6e 73 74 61 6e 74 20 70 72 65 66 69 78 2e 0d 0a  nstant prefix...
0530: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
0540: 20 20 20 72 65 74 75 72 6e 20 64 65 66 69 6e 65     return define
0550: 43 6f 6e 73 74 61 6e 74 2e 53 79 73 74 65 6d 2e  Constant.System.
0560: 44 61 74 61 2e 53 51 4c 69 74 65 2e 0d 0a 20 20  Data.SQLite...  
0570: 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
0580: 0a 20 20 20 20 70 72 6f 63 20 67 65 74 53 51 4c  .    proc getSQL
0590: 69 74 65 43 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e  iteCompileOption
05a0: 50 72 65 66 69 78 20 7b 7d 20 7b 0d 0a 20 20 20  Prefix {} {..   
05b0: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
05c0: 54 45 3a 20 53 65 65 20 69 66 20 74 68 65 20 63  TE: See if the c
05d0: 6f 6d 70 69 6c 65 20 6f 70 74 69 6f 6e 20 70 72  ompile option pr
05e0: 65 66 69 78 20 73 65 74 74 69 6e 67 20 68 61 73  efix setting has
05f0: 20 62 65 65 6e 20 6f 76 65 72 72 69 64 64 65 6e   been overridden
0600: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
0610: 62 79 20 74 68 65 20 75 73 65 72 20 28 65 2e 67  by the user (e.g
0620: 2e 20 6f 6e 20 74 68 65 20 63 6f 6d 6d 61 6e 64  . on the command
0630: 20 6c 69 6e 65 29 2e 0d 0a 20 20 20 20 20 20 23   line)...      #
0640: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66  ..      if {[inf
0650: 6f 20 65 78 69 73 74 73 20 3a 3a 63 6f 6d 70 69  o exists ::compi
0660: 6c 65 5f 6f 70 74 69 6f 6e 5f 70 72 65 66 69 78  le_option_prefix
0670: 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
0680: 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
0690: 20 24 3a 3a 63 6f 6d 70 69 6c 65 5f 6f 70 74 69   $::compile_opti
06a0: 6f 6e 5f 70 72 65 66 69 78 5d 20 3e 20 30 7d 20  on_prefix] > 0} 
06b0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
06c0: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
06d0: 45 3a 20 55 73 65 20 74 68 65 20 73 70 65 63 69  E: Use the speci
06e0: 66 69 65 64 20 63 6f 6d 70 69 6c 65 20 6f 70 74  fied compile opt
06f0: 69 6f 6e 20 70 72 65 66 69 78 2e 0d 0a 20 20 20  ion prefix...   
0700: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
0710: 72 65 74 75 72 6e 20 24 3a 3a 63 6f 6d 70 69 6c  return $::compil
0720: 65 5f 6f 70 74 69 6f 6e 5f 70 72 65 66 69 78 0d  e_option_prefix.
0730: 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
0740: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
0750: 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20      # NOTE: Use 
0760: 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6d 70  the default comp
0770: 69 6c 65 20 6f 70 74 69 6f 6e 20 70 72 65 66 69  ile option prefi
0780: 78 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  x...        #.. 
0790: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 63 6f         return co
07a0: 6d 70 69 6c 65 4f 70 74 69 6f 6e 2e 53 51 4c 69  mpileOption.SQLi
07b0: 74 65 2e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  te...      }..  
07c0: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
07d0: 20 68 61 76 65 53 51 4c 69 74 65 44 65 66 69 6e   haveSQLiteDefin
07e0: 65 43 6f 6e 73 74 61 6e 74 20 7b 20 6e 61 6d 65  eConstant { name
07f0: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 72 65 74 75   } {..      retu
0800: 72 6e 20 5b 68 61 76 65 43 6f 6e 73 74 72 61 69  rn [haveConstrai
0810: 6e 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  nt \..          
0820: 5b 61 70 70 65 6e 64 41 72 67 73 20 5b 67 65 74  [appendArgs [get
0830: 53 51 4c 69 74 65 44 65 66 69 6e 65 43 6f 6e 73  SQLiteDefineCons
0840: 74 61 6e 74 50 72 65 66 69 78 5d 20 24 6e 61 6d  tantPrefix] $nam
0850: 65 5d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20  e]]..    }..... 
0860: 20 20 20 70 72 6f 63 20 68 61 76 65 53 51 4c 69     proc haveSQLi
0870: 74 65 43 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 20  teCompileOption 
0880: 7b 20 6e 61 6d 65 20 7d 20 7b 0d 0a 20 20 20 20  { name } {..    
0890: 20 20 72 65 74 75 72 6e 20 5b 68 61 76 65 43 6f    return [haveCo
08a0: 6e 73 74 72 61 69 6e 74 20 5c 0d 0a 20 20 20 20  nstraint \..    
08b0: 20 20 20 20 20 20 5b 61 70 70 65 6e 64 41 72 67        [appendArg
08c0: 73 20 5b 67 65 74 53 51 4c 69 74 65 43 6f 6d 70  s [getSQLiteComp
08d0: 69 6c 65 4f 70 74 69 6f 6e 50 72 65 66 69 78 5d  ileOptionPrefix]
08e0: 20 24 6e 61 6d 65 5d 5d 0d 0a 20 20 20 20 7d 0d   $name]]..    }.
08f0: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74  ....    proc get
0900: 42 75 69 6c 64 59 65 61 72 20 7b 7d 20 7b 0d 0a  BuildYear {} {..
0910: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
0920: 20 4e 4f 54 45 3a 20 53 65 65 20 69 66 20 74 68   NOTE: See if th
0930: 65 20 22 79 65 61 72 22 20 73 65 74 74 69 6e 67  e "year" setting
0940: 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72 69   has been overri
0950: 64 64 65 6e 20 62 79 20 74 68 65 20 75 73 65 72  dden by the user
0960: 20 28 65 2e 67 2e 0d 0a 20 20 20 20 20 20 23 20   (e.g...      # 
0970: 20 20 20 20 20 20 6f 6e 20 74 68 65 20 63 6f 6d        on the com
0980: 6d 61 6e 64 20 6c 69 6e 65 29 2e 20 20 54 68 69  mand line).  Thi
0990: 73 20 68 65 6c 70 73 20 63 6f 6e 74 72 6f 6c 20  s helps control 
09a0: 65 78 61 63 74 6c 79 20 77 68 69 63 68 20 73 65  exactly which se
09b0: 74 20 6f 66 0d 0a 20 20 20 20 20 20 23 20 20 20  t of..      #   
09c0: 20 20 20 20 62 69 6e 61 72 69 65 73 20 77 65 20      binaries we 
09d0: 61 72 65 20 74 65 73 74 69 6e 67 2c 20 74 68 6f  are testing, tho
09e0: 73 65 20 70 72 6f 64 75 63 65 64 20 75 73 69 6e  se produced usin
09f0: 67 20 74 68 65 20 56 69 73 75 61 6c 20 53 74 75  g the Visual Stu
0a00: 64 69 6f 0d 0a 20 20 20 20 20 20 23 20 20 20 20  dio..      #    
0a10: 20 20 20 32 30 30 35 2c 20 32 30 30 38 2c 20 32     2005, 2008, 2
0a20: 30 31 30 2c 20 32 30 31 32 2c 20 32 30 31 33 2c  010, 2012, 2013,
0a30: 20 32 30 31 35 2c 20 6f 72 20 32 30 31 37 20 62   2015, or 2017 b
0a40: 75 69 6c 64 20 73 79 73 74 65 6d 73 2e 20 20 54  uild systems.  T
0a50: 6f 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  o..      #      
0a60: 20 6f 76 65 72 72 69 64 65 20 74 68 69 73 20 76   override this v
0a70: 61 6c 75 65 20 76 69 61 20 74 68 65 20 63 6f 6d  alue via the com
0a80: 6d 61 6e 64 20 6c 69 6e 65 2c 20 65 6e 74 65 72  mand line, enter
0a90: 20 61 20 63 6f 6d 6d 61 6e 64 20 73 69 6d 69 6c   a command simil
0aa0: 61 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ar..      #     
0ab0: 20 20 74 6f 20 6f 6e 65 20 6f 66 20 74 68 65 20    to one of the 
0ac0: 66 6f 6c 6c 6f 77 69 6e 67 20 28 61 6c 6c 20 6f  following (all o
0ad0: 6e 20 6f 6e 65 20 6c 69 6e 65 29 3a 0d 0a 20 20  n one line):..  
0ae0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 20      #..      #  
0af0: 20 20 20 20 20 45 61 67 6c 65 53 68 65 6c 6c 2e       EagleShell.
0b00: 65 78 65 20 2d 61 6e 79 49 6e 69 74 69 61 6c 69  exe -anyInitiali
0b10: 7a 65 20 22 73 65 74 20 74 65 73 74 5f 79 65 61  ze "set test_yea
0b20: 72 20 32 30 30 35 22 0d 0a 20 20 20 20 20 20 23  r 2005"..      #
0b30: 20 20 20 20 20 20 20 20 20 2d 66 69 6c 65 20 2e           -file .
0b40: 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67  \path\to\all.eag
0b50: 6c 65 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  le..      #..   
0b60: 20 20 20 23 20 20 20 20 20 20 20 45 61 67 6c 65     #       Eagle
0b70: 53 68 65 6c 6c 2e 65 78 65 20 2d 61 6e 79 49 6e  Shell.exe -anyIn
0b80: 69 74 69 61 6c 69 7a 65 20 22 73 65 74 20 74 65  itialize "set te
0b90: 73 74 5f 79 65 61 72 20 32 30 30 38 22 0d 0a 20  st_year 2008".. 
0ba0: 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20 2d       #         -
0bb0: 66 69 6c 65 20 2e 5c 70 61 74 68 5c 74 6f 5c 61  file .\path\to\a
0bc0: 6c 6c 2e 65 61 67 6c 65 0d 0a 20 20 20 20 20 20  ll.eagle..      
0bd0: 23 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  #..      #      
0be0: 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65 20   EagleShell.exe 
0bf0: 2d 61 6e 79 49 6e 69 74 69 61 6c 69 7a 65 20 22  -anyInitialize "
0c00: 73 65 74 20 74 65 73 74 5f 79 65 61 72 20 32 30  set test_year 20
0c10: 31 30 22 0d 0a 20 20 20 20 20 20 23 20 20 20 20  10"..      #    
0c20: 20 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70 61 74       -file .\pat
0c30: 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a  h\to\all.eagle..
0c40: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
0c50: 20 20 20 20 20 20 20 45 61 67 6c 65 53 68 65 6c         EagleShel
0c60: 6c 2e 65 78 65 20 2d 61 6e 79 49 6e 69 74 69 61  l.exe -anyInitia
0c70: 6c 69 7a 65 20 22 73 65 74 20 74 65 73 74 5f 79  lize "set test_y
0c80: 65 61 72 20 32 30 31 32 22 0d 0a 20 20 20 20 20  ear 2012"..     
0c90: 20 23 20 20 20 20 20 20 20 20 20 2d 66 69 6c 65   #         -file
0ca0: 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65   .\path\to\all.e
0cb0: 61 67 6c 65 0d 0a 20 20 20 20 20 20 23 0d 0a 20  agle..      #.. 
0cc0: 20 20 20 20 20 23 20 20 20 20 20 20 20 45 61 67       #       Eag
0cd0: 6c 65 53 68 65 6c 6c 2e 65 78 65 20 2d 61 6e 79  leShell.exe -any
0ce0: 49 6e 69 74 69 61 6c 69 7a 65 20 22 73 65 74 20  Initialize "set 
0cf0: 74 65 73 74 5f 79 65 61 72 20 32 30 31 33 22 0d  test_year 2013".
0d00: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20  .      #        
0d10: 20 2d 66 69 6c 65 20 2e 5c 70 61 74 68 5c 74 6f   -file .\path\to
0d20: 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a 20 20 20 20  \all.eagle..    
0d30: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 20 20 20    #..      #    
0d40: 20 20 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78     EagleShell.ex
0d50: 65 20 2d 61 6e 79 49 6e 69 74 69 61 6c 69 7a 65  e -anyInitialize
0d60: 20 22 73 65 74 20 74 65 73 74 5f 79 65 61 72 20   "set test_year 
0d70: 32 30 31 35 22 0d 0a 20 20 20 20 20 20 23 20 20  2015"..      #  
0d80: 20 20 20 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70         -file .\p
0d90: 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65  ath\to\all.eagle
0da0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
0db0: 20 23 20 20 20 20 20 20 20 45 61 67 6c 65 53 68   #       EagleSh
0dc0: 65 6c 6c 2e 65 78 65 20 2d 61 6e 79 49 6e 69 74  ell.exe -anyInit
0dd0: 69 61 6c 69 7a 65 20 22 73 65 74 20 74 65 73 74  ialize "set test
0de0: 5f 79 65 61 72 20 32 30 31 37 22 0d 0a 20 20 20  _year 2017"..   
0df0: 20 20 20 23 20 20 20 20 20 20 20 20 20 2d 66 69     #         -fi
0e00: 6c 65 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c  le .\path\to\all
0e10: 2e 65 61 67 6c 65 0d 0a 20 20 20 20 20 20 23 0d  .eagle..      #.
0e20: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 45  .      #       E
0e30: 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65 20 2d 61  agleShell.exe -a
0e40: 6e 79 49 6e 69 74 69 61 6c 69 7a 65 20 22 75 6e  nyInitialize "un
0e50: 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20  set -nocomplain 
0e60: 74 65 73 74 5f 79 65 61 72 22 0d 0a 20 20 20 20  test_year"..    
0e70: 20 20 23 20 20 20 20 20 20 20 20 20 2d 66 69 6c    #         -fil
0e80: 65 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e  e .\path\to\all.
0e90: 65 61 67 6c 65 0d 0a 20 20 20 20 20 20 23 0d 0a  eagle..      #..
0ea0: 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20        if {[info 
0eb0: 65 78 69 73 74 73 20 3a 3a 74 65 73 74 5f 79 65  exists ::test_ye
0ec0: 61 72 5d 20 26 26 20 5b 73 74 72 69 6e 67 20 6c  ar] && [string l
0ed0: 65 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f 79 65  ength $::test_ye
0ee0: 61 72 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  ar] > 0} then {.
0ef0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
0f00: 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20      # NOTE: Use 
0f10: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 74 65  the specified te
0f20: 73 74 20 79 65 61 72 2e 20 20 49 66 20 74 68 69  st year.  If thi
0f30: 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 6e 6f  s variable is no
0f40: 74 20 73 65 74 2c 20 74 68 65 0d 0a 20 20 20 20  t set, the..    
0f50: 20 20 20 20 23 20 20 20 20 20 20 20 64 65 66 61      #       defa
0f60: 75 6c 74 20 76 61 6c 75 65 20 77 69 6c 6c 20 62  ult value will b
0f70: 65 20 62 61 73 65 64 20 6f 6e 20 77 68 65 74 68  e based on wheth
0f80: 65 72 20 6f 72 20 6e 6f 74 20 45 61 67 6c 65 20  er or not Eagle 
0f90: 68 61 73 20 62 65 65 6e 0d 0a 20 20 20 20 20 20  has been..      
0fa0: 20 20 23 20 20 20 20 20 20 20 63 6f 6d 70 69 6c    #       compil
0fb0: 65 64 20 61 67 61 69 6e 73 74 20 74 68 65 20 43  ed against the C
0fc0: 4c 52 20 76 32 2e 30 20 6f 72 20 43 4c 52 20 76  LR v2.0 or CLR v
0fd0: 34 2e 30 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  4.0...        #.
0fe0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
0ff0: 24 3a 3a 74 65 73 74 5f 79 65 61 72 0d 0a 20 20  $::test_year..  
1000: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
1010: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1020: 20 23 20 4e 4f 54 45 3a 20 49 66 20 45 61 67 6c   # NOTE: If Eagl
1030: 65 20 68 61 73 20 62 65 65 6e 20 63 6f 6d 70 69  e has been compi
1040: 6c 65 64 20 61 67 61 69 6e 73 74 20 74 68 65 20  led against the 
1050: 43 4c 52 20 76 34 2e 30 2c 20 75 73 65 20 22 32  CLR v4.0, use "2
1060: 30 31 30 22 20 62 79 0d 0a 20 20 20 20 20 20 20  010" by..       
1070: 20 23 20 20 20 20 20 20 20 64 65 66 61 75 6c 74   #       default
1080: 20 28 77 65 20 63 6f 75 6c 64 20 75 73 65 20 22   (we could use "
1090: 32 30 31 32 22 2c 20 22 32 30 31 33 22 2c 20 22  2012", "2013", "
10a0: 32 30 31 35 22 2c 20 6f 72 20 22 32 30 31 37 22  2015", or "2017"
10b0: 20 69 6e 20 74 68 61 74 0d 0a 20 20 20 20 20 20   in that..      
10c0: 20 20 23 20 20 20 20 20 20 20 63 61 73 65 20 61    #       case a
10d0: 73 20 77 65 6c 6c 29 20 61 73 20 74 68 65 20 74  s well) as the t
10e0: 65 73 74 20 79 65 61 72 3b 20 6f 74 68 65 72 77  est year; otherw
10f0: 69 73 65 2c 20 75 73 65 20 22 32 30 30 38 22 20  ise, use "2008" 
1100: 62 79 20 64 65 66 61 75 6c 74 0d 0a 20 20 20 20  by default..    
1110: 20 20 20 20 23 20 20 20 20 20 20 20 28 77 65 20      #       (we 
1120: 63 6f 75 6c 64 20 75 73 65 20 22 32 30 30 35 22  could use "2005"
1130: 20 69 6e 20 74 68 61 74 20 63 61 73 65 20 61 73   in that case as
1140: 20 77 65 6c 6c 29 2e 20 20 49 66 20 61 6e 6f 74   well).  If anot
1150: 68 65 72 20 6d 61 6a 6f 72 0d 0a 20 20 20 20 20  her major..     
1160: 20 20 20 23 20 20 20 20 20 20 20 5b 69 6e 63 6f     #       [inco
1170: 6d 70 61 74 69 62 6c 65 5d 20 76 65 72 73 69 6f  mpatible] versio
1180: 6e 20 6f 66 20 74 68 65 20 43 4c 52 20 69 73 20  n of the CLR is 
1190: 72 65 6c 65 61 73 65 64 2c 20 74 68 69 73 20 63  released, this c
11a0: 68 65 63 6b 20 77 69 6c 6c 0d 0a 20 20 20 20 20  heck will..     
11b0: 20 20 20 23 20 20 20 20 20 20 20 68 61 76 65 20     #       have 
11c0: 74 6f 20 62 65 20 63 68 61 6e 67 65 64 2e 20 20  to be changed.  
11d0: 54 68 65 20 64 65 66 61 75 6c 74 20 74 65 73 74  The default test
11e0: 20 79 65 61 72 20 74 6f 20 75 73 65 20 66 6f 72   year to use for
11f0: 20 61 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20   a..        #   
1200: 20 20 20 20 70 61 72 74 69 63 75 6c 61 72 20 43      particular C
1210: 4c 52 20 76 65 72 73 69 6f 6e 20 6d 61 79 20 62  LR version may b
1220: 65 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20  e overridden by 
1230: 73 65 74 74 69 6e 67 20 74 68 65 20 67 6c 6f 62  setting the glob
1240: 61 6c 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  al..        #   
1250: 20 20 20 20 76 61 72 69 61 62 6c 65 20 22 74 65      variable "te
1260: 73 74 5f 79 65 61 72 5f 63 6c 72 5f 76 24 58 22  st_year_clr_v$X"
1270: 2c 20 77 68 65 72 65 20 22 24 58 22 20 6d 61 79  , where "$X" may
1280: 20 5b 63 75 72 72 65 6e 74 6c 79 5d 20 62 65 0d   [currently] be.
1290: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
12a0: 20 65 69 74 68 65 72 20 22 32 22 20 6f 72 20 22   either "2" or "
12b0: 34 22 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  4"...        #..
12c0: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76          if {[hav
12d0: 65 43 6f 6e 73 74 72 61 69 6e 74 20 69 6d 61 67  eConstraint imag
12e0: 65 52 75 6e 74 69 6d 65 34 30 5d 7d 20 74 68 65  eRuntime40]} the
12f0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69  n {..          i
1300: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
1310: 3a 3a 74 65 73 74 5f 79 65 61 72 5f 63 6c 72 5f  ::test_year_clr_
1320: 76 34 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  v4] && \..      
1330: 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20          [string 
1340: 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f 79  length $::test_y
1350: 65 61 72 5f 63 6c 72 5f 76 34 5d 20 3e 20 30 7d  ear_clr_v4] > 0}
1360: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1370: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1380: 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20      # NOTE: Use 
1390: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 74 65  the specified te
13a0: 73 74 20 79 65 61 72 20 66 6f 72 20 74 68 65 20  st year for the 
13b0: 43 4c 52 20 76 34 2e 30 2e 0d 0a 20 20 20 20 20  CLR v4.0...     
13c0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
13d0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a        return $::
13e0: 74 65 73 74 5f 79 65 61 72 5f 63 6c 72 5f 76 34  test_year_clr_v4
13f0: 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c  ..          } el
1400: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
1410: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
1420: 20 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65   # NOTE: Use the
1430: 20 64 65 66 61 75 6c 74 20 74 65 73 74 20 79 65   default test ye
1440: 61 72 20 66 6f 72 20 74 68 65 20 43 4c 52 20 76  ar for the CLR v
1450: 34 2e 30 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  4.0...          
1460: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
1470: 20 72 65 74 75 72 6e 20 32 30 31 30 3b 20 23 20   return 2010; # 
1480: 54 4f 44 4f 3a 20 47 6f 6f 64 20 22 66 61 6c 6c  TODO: Good "fall
1490: 62 61 63 6b 22 20 64 65 66 61 75 6c 74 3f 0d 0a  back" default?..
14a0: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
14b0: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
14c0: 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69 6e           if {[in
14d0: 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 73 74  fo exists ::test
14e0: 5f 79 65 61 72 5f 63 6c 72 5f 76 32 5d 20 26 26  _year_clr_v2] &&
14f0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1500: 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
1510: 20 24 3a 3a 74 65 73 74 5f 79 65 61 72 5f 63 6c   $::test_year_cl
1520: 72 5f 76 32 5d 20 3e 20 30 7d 20 74 68 65 6e 20  r_v2] > 0} then 
1530: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  {..            #
1540: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20  ..            # 
1550: 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20 73 70  NOTE: Use the sp
1560: 65 63 69 66 69 65 64 20 74 65 73 74 20 79 65 61  ecified test yea
1570: 72 20 66 6f 72 20 74 68 65 20 43 4c 52 20 76 32  r for the CLR v2
1580: 2e 30 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  .0...           
1590: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
15a0: 72 65 74 75 72 6e 20 24 3a 3a 74 65 73 74 5f 79  return $::test_y
15b0: 65 61 72 5f 63 6c 72 5f 76 32 0d 0a 20 20 20 20  ear_clr_v2..    
15c0: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
15d0: 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
15e0: 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
15f0: 45 3a 20 55 73 65 20 74 68 65 20 64 65 66 61 75  E: Use the defau
1600: 6c 74 20 74 65 73 74 20 79 65 61 72 20 66 6f 72  lt test year for
1610: 20 74 68 65 20 43 4c 52 20 76 32 2e 30 2e 0d 0a   the CLR v2.0...
1620: 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
1630: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
1640: 6e 20 32 30 30 38 3b 20 23 20 54 4f 44 4f 3a 20  n 2008; # TODO: 
1650: 47 6f 6f 64 20 22 66 61 6c 6c 62 61 63 6b 22 20  Good "fallback" 
1660: 64 65 66 61 75 6c 74 3f 0d 0a 20 20 20 20 20 20  default?..      
1670: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
1680: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
1690: 0d 0a 0c 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20  .....    #..    
16a0: 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 70 72 6f  # NOTE: This pro
16b0: 63 65 64 75 72 65 20 69 73 20 6f 6e 6c 79 20 75  cedure is only u
16c0: 73 65 64 20 77 68 65 6e 20 61 64 64 69 6e 67 20  sed when adding 
16d0: 73 68 69 6d 6d 65 64 20 74 65 73 74 20 63 6f 6e  shimmed test con
16e0: 73 74 72 61 69 6e 74 73 2e 0d 0a 20 20 20 20 23  straints...    #
16f0: 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 42 75  ..    proc getBu
1700: 69 6c 64 43 6c 72 56 65 72 73 69 6f 6e 20 7b 7d  ildClrVersion {}
1710: 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69   {..      if {[i
1720: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 73  nfo exists ::tes
1730: 74 5f 63 6c 72 5d 20 26 26 20 5b 73 74 72 69 6e  t_clr] && [strin
1740: 67 20 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73 74  g length $::test
1750: 5f 63 6c 72 5d 20 3e 20 30 7d 20 74 68 65 6e 20  _clr] > 0} then 
1760: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
1770: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73        # NOTE: Us
1780: 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  e the specified 
1790: 74 65 73 74 20 76 65 72 73 69 6f 6e 20 66 6f 72  test version for
17a0: 20 74 68 65 20 43 4c 52 2e 20 20 49 66 20 74 68   the CLR.  If th
17b0: 69 73 20 76 61 72 69 61 62 6c 65 0d 0a 20 20 20  is variable..   
17c0: 20 20 20 20 20 23 20 20 20 20 20 20 20 69 73 20       #       is 
17d0: 6e 6f 74 20 73 65 74 2c 20 74 68 65 20 64 65 66  not set, the def
17e0: 61 75 6c 74 20 76 61 6c 75 65 20 77 69 6c 6c 20  ault value will 
17f0: 62 65 20 62 61 73 65 64 20 6f 6e 20 77 68 65 74  be based on whet
1800: 68 65 72 20 6f 72 20 6e 6f 74 0d 0a 20 20 20 20  her or not..    
1810: 20 20 20 20 23 20 20 20 20 20 20 20 45 61 67 6c      #       Eagl
1820: 65 20 68 61 73 20 62 65 65 6e 20 63 6f 6d 70 69  e has been compi
1830: 6c 65 64 20 61 67 61 69 6e 73 74 20 74 68 65 20  led against the 
1840: 43 4c 52 20 76 32 2e 30 20 6f 72 20 43 4c 52 20  CLR v2.0 or CLR 
1850: 76 34 2e 30 2e 0d 0a 20 20 20 20 20 20 20 20 23  v4.0...        #
1860: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
1870: 20 24 3a 3a 74 65 73 74 5f 63 6c 72 0d 0a 20 20   $::test_clr..  
1880: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
1890: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
18a0: 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69   # NOTE: Check i
18b0: 66 20 45 61 67 6c 65 20 68 61 73 20 62 65 65 6e  f Eagle has been
18c0: 20 63 6f 6d 70 69 6c 65 64 20 61 67 61 69 6e 73   compiled agains
18d0: 74 20 74 68 65 20 43 4c 52 20 76 34 2e 30 2e 20  t the CLR v4.0. 
18e0: 20 49 66 20 73 6f 2c 0d 0a 20 20 20 20 20 20 20   If so,..       
18f0: 20 23 20 20 20 20 20 20 20 6a 75 73 74 20 75 73   #       just us
1900: 65 20 74 68 61 74 20 43 4c 52 20 76 65 72 73 69  e that CLR versi
1910: 6f 6e 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20  on.  Otherwise, 
1920: 75 73 65 20 74 68 65 20 76 65 72 73 69 6f 6e 20  use the version 
1930: 66 6f 72 20 74 68 65 0d 0a 20 20 20 20 20 20 20  for the..       
1940: 20 23 20 20 20 20 20 20 20 43 4c 52 20 76 32 2e   #       CLR v2.
1950: 30 2e 20 20 49 66 20 61 6e 6f 74 68 65 72 20 6d  0.  If another m
1960: 61 6a 6f 72 20 5b 69 6e 63 6f 6d 70 61 74 69 62  ajor [incompatib
1970: 6c 65 5d 20 76 65 72 73 69 6f 6e 20 6f 66 20 74  le] version of t
1980: 68 65 20 43 4c 52 0d 0a 20 20 20 20 20 20 20 20  he CLR..        
1990: 23 20 20 20 20 20 20 20 69 73 20 72 65 6c 65 61  #       is relea
19a0: 73 65 64 2c 20 74 68 69 73 20 63 68 65 63 6b 20  sed, this check 
19b0: 77 69 6c 6c 20 68 61 76 65 20 74 6f 20 62 65 20  will have to be 
19c0: 63 68 61 6e 67 65 64 2e 20 20 54 68 65 20 64 65  changed.  The de
19d0: 66 61 75 6c 74 0d 0a 20 20 20 20 20 20 20 20 23  fault..        #
19e0: 20 20 20 20 20 20 20 76 65 72 73 69 6f 6e 20 76         version v
19f0: 61 6c 75 65 20 66 6f 72 20 61 20 70 61 72 74 69  alue for a parti
1a00: 63 75 6c 61 72 20 43 4c 52 20 76 65 72 73 69 6f  cular CLR versio
1a10: 6e 20 6d 61 79 20 62 65 20 6f 76 65 72 72 69 64  n may be overrid
1a20: 64 65 6e 0d 0a 20 20 20 20 20 20 20 20 23 20 20  den..        #  
1a30: 20 20 20 20 20 62 79 20 73 65 74 74 69 6e 67 20       by setting 
1a40: 74 68 65 20 67 6c 6f 62 61 6c 20 76 61 72 69 61  the global varia
1a50: 62 6c 65 20 22 74 65 73 74 5f 63 6c 72 5f 76 24  ble "test_clr_v$
1a60: 58 22 2c 20 77 68 65 72 65 20 22 24 58 22 20 6d  X", where "$X" m
1a70: 61 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ay..        #   
1a80: 20 20 20 20 5b 63 75 72 72 65 6e 74 6c 79 5d 20      [currently] 
1a90: 62 65 20 65 69 74 68 65 72 20 22 32 22 20 6f 72  be either "2" or
1aa0: 20 22 34 22 2e 0d 0a 20 20 20 20 20 20 20 20 23   "4"...        #
1ab0: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 68  ..        if {[h
1ac0: 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 69 6d  aveConstraint im
1ad0: 61 67 65 52 75 6e 74 69 6d 65 34 30 5d 7d 20 74  ageRuntime40]} t
1ae0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1af0: 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
1b00: 73 20 3a 3a 74 65 73 74 5f 63 6c 72 5f 76 34 5d  s ::test_clr_v4]
1b10: 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
1b20: 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
1b30: 67 74 68 20 24 3a 3a 74 65 73 74 5f 63 6c 72 5f  gth $::test_clr_
1b40: 76 34 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  v4] > 0} then {.
1b50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a  .            #..
1b60: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f              # NO
1b70: 54 45 3a 20 55 73 65 20 74 68 65 20 73 70 65 63  TE: Use the spec
1b80: 69 66 69 65 64 20 74 65 73 74 20 76 65 72 73 69  ified test versi
1b90: 6f 6e 20 66 6f 72 20 74 68 65 20 43 4c 52 20 76  on for the CLR v
1ba0: 34 2e 30 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  4.0...          
1bb0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
1bc0: 20 72 65 74 75 72 6e 20 24 3a 3a 74 65 73 74 5f   return $::test_
1bd0: 63 6c 72 5f 76 34 0d 0a 20 20 20 20 20 20 20 20  clr_v4..        
1be0: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
1bf0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1c00: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55         # NOTE: U
1c10: 73 65 20 74 68 65 20 64 65 66 61 75 6c 74 20 74  se the default t
1c20: 65 73 74 20 76 65 72 73 69 6f 6e 20 66 6f 72 20  est version for 
1c30: 74 68 65 20 43 4c 52 20 76 34 2e 30 2e 0d 0a 20  the CLR v4.0... 
1c40: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
1c50: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1c60: 20 34 2e 30 2e 33 30 33 31 39 3b 20 23 20 54 4f   4.0.30319; # TO
1c70: 44 4f 3a 20 47 6f 6f 64 20 22 66 61 6c 6c 62 61  DO: Good "fallba
1c80: 63 6b 22 20 64 65 66 61 75 6c 74 3f 0d 0a 20 20  ck" default?..  
1c90: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
1ca0: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
1cb0: 20 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f         if {[info
1cc0: 20 65 78 69 73 74 73 20 3a 3a 74 65 73 74 5f 63   exists ::test_c
1cd0: 6c 72 5f 76 32 5d 20 26 26 20 5c 0d 0a 20 20 20  lr_v2] && \..   
1ce0: 20 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69             [stri
1cf0: 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73  ng length $::tes
1d00: 74 5f 63 6c 72 5f 76 32 5d 20 3e 20 30 7d 20 74  t_clr_v2] > 0} t
1d10: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1d20: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
1d30: 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68    # NOTE: Use th
1d40: 65 20 73 70 65 63 69 66 69 65 64 20 74 65 73 74  e specified test
1d50: 20 76 65 72 73 69 6f 6e 20 66 6f 72 20 74 68 65   version for the
1d60: 20 43 4c 52 20 76 32 2e 30 2e 0d 0a 20 20 20 20   CLR v2.0...    
1d70: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1d80: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a         return $:
1d90: 3a 74 65 73 74 5f 63 6c 72 5f 76 32 0d 0a 20 20  :test_clr_v2..  
1da0: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
1db0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d  ..            #.
1dc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e  .            # N
1dd0: 4f 54 45 3a 20 55 73 65 20 74 68 65 20 64 65 66  OTE: Use the def
1de0: 61 75 6c 74 20 74 65 73 74 20 76 65 72 73 69 6f  ault test versio
1df0: 6e 20 66 6f 72 20 74 68 65 20 43 4c 52 20 76 32  n for the CLR v2
1e00: 2e 30 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  .0...           
1e10: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
1e20: 72 65 74 75 72 6e 20 32 2e 30 2e 35 30 37 32 37  return 2.0.50727
1e30: 3b 20 23 20 54 4f 44 4f 3a 20 47 6f 6f 64 20 22  ; # TODO: Good "
1e40: 66 61 6c 6c 62 61 63 6b 22 20 64 65 66 61 75 6c  fallback" defaul
1e50: 74 3f 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  t?..          }.
1e60: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
1e70: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
1e80: 20 20 20 70 72 6f 63 20 67 65 74 42 75 69 6c 64     proc getBuild
1e90: 59 65 61 72 73 20 7b 7d 20 7b 0d 0a 20 20 20 20  Years {} {..    
1ea0: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
1eb0: 45 3a 20 53 65 65 20 69 66 20 74 68 65 20 6c 69  E: See if the li
1ec0: 73 74 20 6f 66 20 74 65 73 74 20 79 65 61 72 73  st of test years
1ed0: 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72 69   has been overri
1ee0: 64 64 65 6e 20 62 79 20 74 68 65 20 75 73 65 72  dden by the user
1ef0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
1f00: 28 65 2e 67 2e 20 6f 6e 20 74 68 65 20 63 6f 6d  (e.g. on the com
1f10: 6d 61 6e 64 20 6c 69 6e 65 29 2e 0d 0a 20 20 20  mand line)...   
1f20: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
1f30: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74  [info exists ::t
1f40: 65 73 74 5f 79 65 61 72 73 5d 20 26 26 20 5b 6c  est_years] && [l
1f50: 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f 79  length $::test_y
1f60: 65 61 72 73 5d 20 3e 20 30 7d 20 74 68 65 6e 20  ears] > 0} then 
1f70: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
1f80: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73        # NOTE: Us
1f90: 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  e the specified 
1fa0: 6c 69 73 74 20 6f 66 20 74 65 73 74 20 79 65 61  list of test yea
1fb0: 72 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  rs...        #..
1fc0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24          return $
1fd0: 3a 3a 74 65 73 74 5f 79 65 61 72 73 0d 0a 20 20  ::test_years..  
1fe0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
1ff0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
2000: 20 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65   # NOTE: Use the
2010: 20 64 65 66 61 75 6c 74 20 6c 69 73 74 20 6f 66   default list of
2020: 20 74 65 73 74 20 79 65 61 72 73 20 28 69 2e 65   test years (i.e
2030: 2e 20 61 6c 6c 29 2e 0d 0a 20 20 20 20 20 20 20  . all)...       
2040: 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   #..        retu
2050: 72 6e 20 5b 6c 69 73 74 20 32 30 30 35 20 32 30  rn [list 2005 20
2060: 30 38 20 32 30 31 30 20 32 30 31 32 20 32 30 31  08 2010 2012 201
2070: 33 20 32 30 31 35 20 32 30 31 37 5d 0d 0a 20 20  3 2015 2017]..  
2080: 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
2090: 0a 20 20 20 20 70 72 6f 63 20 67 65 74 42 75 69  .    proc getBui
20a0: 6c 64 4e 65 74 46 78 20 7b 7d 20 7b 0d 0a 20 20  ldNetFx {} {..  
20b0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
20c0: 4f 54 45 3a 20 53 65 65 20 69 66 20 74 68 65 20  OTE: See if the 
20d0: 74 65 73 74 20 2e 4e 45 54 20 46 72 61 6d 65 77  test .NET Framew
20e0: 6f 72 6b 20 73 65 74 74 69 6e 67 20 68 61 73 20  ork setting has 
20f0: 62 65 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 20  been overridden 
2100: 62 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  by..      #     
2110: 20 20 74 68 65 20 75 73 65 72 20 28 65 2e 67 2e    the user (e.g.
2120: 20 6f 6e 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20   on the command 
2130: 6c 69 6e 65 29 2e 0d 0a 20 20 20 20 20 20 23 0d  line)...      #.
2140: 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f  .      if {[info
2150: 20 65 78 69 73 74 73 20 3a 3a 74 65 73 74 5f 6e   exists ::test_n
2160: 65 74 5f 66 78 5d 20 26 26 20 5c 0d 0a 20 20 20  et_fx] && \..   
2170: 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c         [string l
2180: 65 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f 6e 65  ength $::test_ne
2190: 74 5f 66 78 5d 20 3e 20 30 7d 20 74 68 65 6e 20  t_fx] > 0} then 
21a0: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
21b0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73        # NOTE: Us
21c0: 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  e the specified 
21d0: 74 65 73 74 20 2e 4e 45 54 20 46 72 61 6d 65 77  test .NET Framew
21e0: 6f 72 6b 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ork...        #.
21f0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2200: 24 3a 3a 74 65 73 74 5f 6e 65 74 5f 66 78 0d 0a  $::test_net_fx..
2210: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
2220: 20 20 20 20 20 20 20 20 73 65 74 20 79 65 61 72          set year
2230: 20 5b 67 65 74 42 75 69 6c 64 59 65 61 72 5d 0d   [getBuildYear].
2240: 0a 20 20 20 20 20 20 20 20 73 65 74 20 79 65 61  .        set yea
2250: 72 56 61 72 4e 61 6d 65 20 5b 61 70 70 65 6e 64  rVarName [append
2260: 41 72 67 73 20 3a 3a 74 65 73 74 5f 6e 65 74 5f  Args ::test_net_
2270: 66 78 5f 20 24 79 65 61 72 5d 0d 0a 0d 0a 20 20  fx_ $year]....  
2280: 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20        if {[info 
2290: 65 78 69 73 74 73 20 24 79 65 61 72 56 61 72 4e  exists $yearVarN
22a0: 61 6d 65 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  ame] && \..     
22b0: 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c         [string l
22c0: 65 6e 67 74 68 20 5b 73 65 74 20 24 79 65 61 72  ength [set $year
22d0: 56 61 72 4e 61 6d 65 5d 5d 20 3e 20 30 7d 20 74  VarName]] > 0} t
22e0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
22f0: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
2300: 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20 73 70  NOTE: Use the sp
2310: 65 63 69 66 69 65 64 20 74 65 73 74 20 2e 4e 45  ecified test .NE
2320: 54 20 46 72 61 6d 65 77 6f 72 6b 2c 20 62 61 73  T Framework, bas
2330: 65 64 20 6f 6e 20 74 68 65 20 62 75 69 6c 64 0d  ed on the build.
2340: 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20  .          #    
2350: 20 20 20 79 65 61 72 2e 0d 0a 20 20 20 20 20 20     year...      
2360: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
2370: 20 72 65 74 75 72 6e 20 5b 73 65 74 20 24 79 65   return [set $ye
2380: 61 72 56 61 72 4e 61 6d 65 5d 0d 0a 20 20 20 20  arVarName]..    
2390: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
23a0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
23b0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 61 6c       # NOTE: Fal
23c0: 6c 62 61 63 6b 20 74 6f 20 74 68 65 20 22 77 65  lback to the "we
23d0: 6c 6c 20 6b 6e 6f 77 6e 22 20 2e 4e 45 54 20 46  ll known" .NET F
23e0: 72 61 6d 65 77 6f 72 6b 20 76 65 72 73 69 6f 6e  ramework version
23f0: 20 74 68 61 74 0d 0a 20 20 20 20 20 20 20 20 20   that..         
2400: 20 23 20 20 20 20 20 20 20 69 73 20 6d 6f 73 74   #       is most
2410: 20 63 6c 6f 73 65 6c 79 20 61 73 73 6f 63 69 61   closely associa
2420: 74 65 64 20 77 69 74 68 20 61 20 70 61 72 74 69  ted with a parti
2430: 63 75 6c 61 72 20 76 65 72 73 69 6f 6e 20 6f 66  cular version of
2440: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20  ..          #   
2450: 20 20 20 20 56 69 73 75 61 6c 20 53 74 75 64 69      Visual Studi
2460: 6f 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  o...          #.
2470: 0a 20 20 20 20 20 20 20 20 20 20 73 77 69 74 63  .          switc
2480: 68 20 2d 65 78 61 63 74 20 2d 2d 20 24 79 65 61  h -exact -- $yea
2490: 72 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  r {..           
24a0: 20 32 30 30 35 20 7b 0d 0a 20 20 20 20 20 20 20   2005 {..       
24b0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e 65         return ne
24c0: 74 46 78 32 30 0d 0a 20 20 20 20 20 20 20 20 20  tFx20..         
24d0: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
24e0: 20 20 32 30 30 38 20 7b 0d 0a 20 20 20 20 20 20    2008 {..      
24f0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e          return n
2500: 65 74 46 78 33 35 0d 0a 20 20 20 20 20 20 20 20  etFx35..        
2510: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
2520: 20 20 20 32 30 31 30 20 7b 0d 0a 20 20 20 20 20     2010 {..     
2530: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
2540: 6e 65 74 46 78 34 30 0d 0a 20 20 20 20 20 20 20  netFx40..       
2550: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
2560: 20 20 20 20 32 30 31 32 20 7b 0d 0a 20 20 20 20      2012 {..    
2570: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
2580: 20 6e 65 74 46 78 34 35 0d 0a 20 20 20 20 20 20   netFx45..      
2590: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
25a0: 20 20 20 20 20 32 30 31 33 20 7b 0d 0a 20 20 20       2013 {..   
25b0: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
25c0: 6e 20 6e 65 74 46 78 34 35 31 3b 20 23 20 54 4f  n netFx451; # TO
25d0: 44 4f 3a 20 4f 72 20 22 6e 65 74 46 78 34 35 32  DO: Or "netFx452
25e0: 22 3f 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  "?..            
25f0: 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 32  }..            2
2600: 30 31 35 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  015 {..         
2610: 20 20 20 20 20 72 65 74 75 72 6e 20 6e 65 74 46       return netF
2620: 78 34 36 3b 20 23 20 54 4f 44 4f 3a 20 4f 72 20  x46; # TODO: Or 
2630: 22 6e 65 74 46 78 34 36 31 22 20 2f 20 22 6e 65  "netFx461" / "ne
2640: 74 46 78 34 36 32 22 3f 0d 0a 20 20 20 20 20 20  tFx462"?..      
2650: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
2660: 20 20 20 20 20 32 30 31 37 20 7b 0d 0a 20 20 20       2017 {..   
2670: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
2680: 6e 20 6e 65 74 46 78 34 37 3b 20 23 20 54 4f 44  n netFx47; # TOD
2690: 4f 3a 20 4f 72 20 22 6e 65 74 46 78 34 37 31 22  O: Or "netFx471"
26a0: 3f 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ?..            }
26b0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 65  ..            de
26c0: 66 61 75 6c 74 20 7b 0d 0a 20 20 20 20 20 20 20  fault {..       
26d0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e 65         return ne
26e0: 74 46 78 33 35 3b 20 23 20 54 4f 44 4f 3a 20 47  tFx35; # TODO: G
26f0: 6f 6f 64 20 22 66 61 6c 6c 62 61 63 6b 22 20 64  ood "fallback" d
2700: 65 66 61 75 6c 74 3f 0d 0a 20 20 20 20 20 20 20  efault?..       
2710: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
2720: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
2730: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
2740: 0c 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 23 20  ...    #..    # 
2750: 4e 4f 54 45 3a 20 54 68 69 73 20 70 72 6f 63 65  NOTE: This proce
2760: 64 75 72 65 20 73 68 6f 75 6c 64 20 72 65 74 75  dure should retu
2770: 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74  rn non-zero if t
2780: 68 65 20 63 6f 6e 66 69 67 75 72 65 64 20 74 65  he configured te
2790: 73 74 0d 0a 20 20 20 20 23 20 20 20 20 20 20 20  st..    #       
27a0: 70 6c 61 74 66 6f 72 6d 20 69 73 20 6d 6f 73 74  platform is most
27b0: 20 6c 69 6b 65 6c 79 20 74 68 65 20 64 65 66 61   likely the defa
27c0: 75 6c 74 20 66 6f 72 20 74 68 69 73 20 6d 61 63  ult for this mac
27d0: 68 69 6e 65 2e 0d 0a 20 20 20 20 23 0d 0a 20 20  hine...    #..  
27e0: 20 20 70 72 6f 63 20 69 73 44 65 66 61 75 6c 74    proc isDefault
27f0: 42 75 69 6c 64 50 6c 61 74 66 6f 72 6d 20 7b 20  BuildPlatform { 
2800: 7b 76 65 72 62 6f 73 65 20 74 72 75 65 7d 20 7d  {verbose true} }
2810: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
2820: 20 20 20 23 20 4e 4f 54 45 3a 20 52 75 6e 6e 69     # NOTE: Runni
2830: 6e 67 20 6f 6e 20 57 6f 57 36 34 20 69 73 20 6e  ng on WoW64 is n
2840: 65 76 65 72 20 74 68 65 20 64 65 66 61 75 6c 74  ever the default
2850: 20 70 6c 61 74 66 6f 72 6d 2e 0d 0a 20 20 20 20   platform...    
2860: 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
2870: 69 73 52 75 6e 6e 69 6e 67 57 6f 57 36 34 5d 7d  isRunningWoW64]}
2880: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
2890: 20 69 66 20 7b 24 76 65 72 62 6f 73 65 7d 20 74   if {$verbose} t
28a0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
28b0: 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
28c0: 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20  hannel \..      
28d0: 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 64 65          "---- de
28e0: 74 65 63 74 65 64 20 6e 6f 6e 2d 64 65 66 61 75  tected non-defau
28f0: 6c 74 20 70 6c 61 74 66 6f 72 6d 20 28 57 6f 57  lt platform (WoW
2900: 36 34 29 5c 6e 22 0d 0a 20 20 20 20 20 20 20 20  64)\n"..        
2910: 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 72 65 74  }....        ret
2920: 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20 20  urn false..     
2930: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   }....      #.. 
2940: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69       # NOTE: Thi
2950: 73 20 68 61 73 20 61 20 67 6f 6f 64 20 63 68 61  s has a good cha
2960: 6e 63 65 20 6f 66 20 62 65 69 6e 67 20 74 68 65  nce of being the
2970: 20 64 65 66 61 75 6c 74 20 70 6c 61 74 66 6f 72   default platfor
2980: 6d 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  m...      #..   
2990: 20 20 20 69 66 20 7b 24 76 65 72 62 6f 73 65 7d     if {$verbose}
29a0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
29b0: 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
29c0: 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 64 65 74  hannel "---- det
29d0: 65 63 74 65 64 20 64 65 66 61 75 6c 74 20 70 6c  ected default pl
29e0: 61 74 66 6f 72 6d 5c 6e 22 0d 0a 20 20 20 20 20  atform\n"..     
29f0: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75   }....      retu
2a00: 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 7d 0d 0a  rn true..    }..
2a10: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 42  ...    proc getB
2a20: 75 69 6c 64 50 6c 61 74 66 6f 72 6d 20 7b 20 6e  uildPlatform { n
2a30: 61 74 69 76 65 20 7d 20 7b 0d 0a 20 20 20 20 20  ative } {..     
2a40: 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
2a50: 73 20 3a 3a 74 65 73 74 5f 70 6c 61 74 66 6f 72  s ::test_platfor
2a60: 6d 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  m] && \..       
2a70: 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74     [string lengt
2a80: 68 20 24 3a 3a 74 65 73 74 5f 70 6c 61 74 66 6f  h $::test_platfo
2a90: 72 6d 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  rm] > 0} then {.
2aa0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
2ab0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20      # NOTE: Use 
2ac0: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 74 65  the specified te
2ad0: 73 74 20 70 6c 61 74 66 6f 72 6d 2e 20 20 49 66  st platform.  If
2ae0: 20 74 68 69 73 20 76 61 72 69 61 62 6c 65 20 69   this variable i
2af0: 73 20 6e 6f 74 20 73 65 74 2c 0d 0a 20 20 20 20  s not set,..    
2b00: 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20      #       the 
2b10: 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 77 69  default value wi
2b20: 6c 6c 20 62 65 20 62 61 73 65 64 20 6f 6e 20 74  ll be based on t
2b30: 68 65 20 6d 61 63 68 69 6e 65 20 61 72 63 68 69  he machine archi
2b40: 74 65 63 74 75 72 65 2e 0d 0a 20 20 20 20 20 20  tecture...      
2b50: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
2b60: 75 72 6e 20 5b 65 78 70 72 20 7b 24 6e 61 74 69  urn [expr {$nati
2b70: 76 65 20 3f 20 24 3a 3a 74 65 73 74 5f 70 6c 61  ve ? $::test_pla
2b80: 74 66 6f 72 6d 20 3a 20 22 22 7d 5d 0d 0a 20 20  tform : ""}]..  
2b90: 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69      } elseif {[i
2ba0: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 73  nfo exists ::tes
2bb0: 74 5f 6d 61 63 68 69 6e 65 5d 20 26 26 20 5c 0d  t_machine] && \.
2bc0: 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69  .          [stri
2bd0: 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73  ng length $::tes
2be0: 74 5f 6d 61 63 68 69 6e 65 5d 20 3e 20 30 7d 20  t_machine] > 0} 
2bf0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
2c00: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
2c10: 45 3a 20 46 6f 72 20 6e 61 74 69 76 65 20 62 75  E: For native bu
2c20: 69 6c 64 73 2c 20 72 65 74 75 72 6e 20 74 68 65  ilds, return the
2c30: 20 70 6c 61 74 66 6f 72 6d 20 6e 61 6d 65 20 63   platform name c
2c40: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 0d  orresponding to.
2c50: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
2c60: 20 74 68 65 20 74 65 73 74 20 6d 61 63 68 69 6e   the test machin
2c70: 65 20 61 72 63 68 69 74 65 63 74 75 72 65 3b 20  e architecture; 
2c80: 6f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72  otherwise, retur
2c90: 6e 20 61 6e 20 65 6d 70 74 79 0d 0a 20 20 20 20  n an empty..    
2ca0: 20 20 20 20 23 20 20 20 20 20 20 20 73 74 72 69      #       stri
2cb0: 6e 67 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ng...        #..
2cc0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b          return [
2cd0: 65 78 70 72 20 7b 0d 0a 20 20 20 20 20 20 20 20  expr {..        
2ce0: 20 20 24 6e 61 74 69 76 65 20 3f 20 5b 6d 61 63    $native ? [mac
2cf0: 68 69 6e 65 54 6f 50 6c 61 74 66 6f 72 6d 20 24  hineToPlatform $
2d00: 3a 3a 74 65 73 74 5f 6d 61 63 68 69 6e 65 5d 20  ::test_machine] 
2d10: 3a 20 22 22 0d 0a 20 20 20 20 20 20 20 20 7d 5d  : ""..        }]
2d20: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66  ..      } elseif
2d30: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
2d40: 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 6d 61  :tcl_platform(ma
2d50: 63 68 69 6e 65 29 5d 7d 20 74 68 65 6e 20 7b 0d  chine)]} then {.
2d60: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
2d70: 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 6f 72 20      # NOTE: For 
2d80: 6e 61 74 69 76 65 20 62 75 69 6c 64 73 2c 20 72  native builds, r
2d90: 65 74 75 72 6e 20 74 68 65 20 70 6c 61 74 66 6f  eturn the platfo
2da0: 72 6d 20 6e 61 6d 65 20 63 6f 72 72 65 73 70 6f  rm name correspo
2db0: 6e 64 69 6e 67 20 74 6f 0d 0a 20 20 20 20 20 20  nding to..      
2dc0: 20 20 23 20 20 20 20 20 20 20 74 68 65 20 6d 61    #       the ma
2dd0: 63 68 69 6e 65 20 61 72 63 68 69 74 65 63 74 75  chine architectu
2de0: 72 65 3b 20 6f 74 68 65 72 77 69 73 65 2c 20 72  re; otherwise, r
2df0: 65 74 75 72 6e 20 61 6e 20 65 6d 70 74 79 20 73  eturn an empty s
2e00: 74 72 69 6e 67 2e 0d 0a 20 20 20 20 20 20 20 20  tring...        
2e10: 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  #..        retur
2e20: 6e 20 5b 65 78 70 72 20 7b 0d 0a 20 20 20 20 20  n [expr {..     
2e30: 20 20 20 20 20 24 6e 61 74 69 76 65 20 3f 20 5b       $native ? [
2e40: 6d 61 63 68 69 6e 65 54 6f 50 6c 61 74 66 6f 72  machineToPlatfor
2e50: 6d 20 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72  m $::tcl_platfor
2e60: 6d 28 6d 61 63 68 69 6e 65 29 5d 20 3a 20 22 22  m(machine)] : ""
2e70: 0d 0a 20 20 20 20 20 20 20 20 7d 5d 0d 0a 20 20  ..        }]..  
2e80: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
2e90: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
2ea0: 20 23 20 4e 4f 54 45 3a 20 4e 6f 20 6d 61 63 68   # NOTE: No mach
2eb0: 69 6e 65 20 61 72 63 68 69 74 65 63 74 75 72 65  ine architecture
2ec0: 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 72   is available, r
2ed0: 65 74 75 72 6e 20 61 6e 20 65 6d 70 74 79 20 73  eturn an empty s
2ee0: 74 72 69 6e 67 2e 0d 0a 20 20 20 20 20 20 20 20  tring...        
2ef0: 23 20 20 20 20 20 20 20 49 74 20 69 73 20 69 6d  #       It is im
2f00: 70 6f 72 74 61 6e 74 20 74 6f 20 72 65 74 75 72  portant to retur
2f10: 6e 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e  n an empty strin
2f20: 67 20 68 65 72 65 20 62 65 63 61 75 73 65 20 74  g here because t
2f30: 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  he..        #   
2f40: 20 20 20 20 72 65 73 75 6c 74 20 6f 66 20 74 68      result of th
2f50: 69 73 20 70 72 6f 63 65 64 75 72 65 20 6d 61 79  is procedure may
2f60: 20 62 65 20 75 73 65 64 20 77 69 74 68 20 5b 66   be used with [f
2f70: 69 6c 65 20 6a 6f 69 6e 5d 2e 0d 0a 20 20 20 20  ile join]...    
2f80: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
2f90: 65 74 75 72 6e 20 22 22 0d 0a 20 20 20 20 20 20  eturn ""..      
2fa0: 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
2fb0: 20 70 72 6f 63 20 67 65 74 42 75 69 6c 64 43 6f   proc getBuildCo
2fc0: 6e 66 69 67 75 72 61 74 69 6f 6e 20 7b 7d 20 7b  nfiguration {} {
2fd0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
2fe0: 20 23 20 4e 4f 54 45 3a 20 53 65 65 20 69 66 20   # NOTE: See if 
2ff0: 74 68 65 20 22 63 6f 6e 66 69 67 75 72 61 74 69  the "configurati
3000: 6f 6e 22 20 73 65 74 74 69 6e 67 20 68 61 73 20  on" setting has 
3010: 62 65 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 20  been overridden 
3020: 62 79 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20  by the..      # 
3030: 20 20 20 20 20 20 75 73 65 72 20 28 65 2e 67 2e        user (e.g.
3040: 20 6f 6e 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20   on the command 
3050: 6c 69 6e 65 29 2e 20 20 54 68 69 73 20 68 65 6c  line).  This hel
3060: 70 73 20 63 6f 6e 74 72 6f 6c 20 65 78 61 63 74  ps control exact
3070: 6c 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ly..      #     
3080: 20 20 77 68 69 63 68 20 73 65 74 20 6f 66 20 62    which set of b
3090: 69 6e 61 72 69 65 73 20 77 65 20 61 72 65 20 74  inaries we are t
30a0: 65 73 74 69 6e 67 20 28 69 2e 65 2e 20 74 68 6f  esting (i.e. tho
30b0: 73 65 20 62 75 69 6c 74 20 69 6e 20 74 68 65 0d  se built in the.
30c0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 22  .      #       "
30d0: 44 65 62 75 67 22 20 6f 72 20 22 52 65 6c 65 61  Debug" or "Relea
30e0: 73 65 22 20 62 75 69 6c 64 20 63 6f 6e 66 69 67  se" build config
30f0: 75 72 61 74 69 6f 6e 73 29 2e 20 20 54 6f 20 6f  urations).  To o
3100: 76 65 72 72 69 64 65 20 74 68 69 73 0d 0a 20 20  verride this..  
3110: 20 20 20 20 23 20 20 20 20 20 20 20 76 61 6c 75      #       valu
3120: 65 20 76 69 61 20 74 68 65 20 63 6f 6d 6d 61 6e  e via the comman
3130: 64 20 6c 69 6e 65 2c 20 65 6e 74 65 72 20 61 20  d line, enter a 
3140: 63 6f 6d 6d 61 6e 64 20 73 69 6d 69 6c 61 72 20  command similar 
3150: 74 6f 20 6f 6e 65 20 6f 66 0d 0a 20 20 20 20 20  to one of..     
3160: 20 23 20 20 20 20 20 20 20 74 68 65 20 66 6f 6c   #       the fol
3170: 6c 6f 77 69 6e 67 20 28 61 6c 6c 20 6f 6e 20 6f  lowing (all on o
3180: 6e 65 20 6c 69 6e 65 29 3a 0d 0a 20 20 20 20 20  ne line):..     
3190: 20 23 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20   #..      #     
31a0: 20 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65    EagleShell.exe
31b0: 20 2d 61 6e 79 49 6e 69 74 69 61 6c 69 7a 65 20   -anyInitialize 
31c0: 22 73 65 74 20 74 65 73 74 5f 63 6f 6e 66 69 67  "set test_config
31d0: 75 72 61 74 69 6f 6e 20 44 65 62 75 67 22 0d 0a  uration Debug"..
31e0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20        #         
31f0: 2d 66 69 6c 65 20 2e 5c 70 61 74 68 5c 74 6f 5c  -file .\path\to\
3200: 61 6c 6c 2e 65 61 67 6c 65 0d 0a 20 20 20 20 20  all.eagle..     
3210: 20 23 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20   #..      #     
3220: 20 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65    EagleShell.exe
3230: 20 2d 61 6e 79 49 6e 69 74 69 61 6c 69 7a 65 20   -anyInitialize 
3240: 22 73 65 74 20 74 65 73 74 5f 63 6f 6e 66 69 67  "set test_config
3250: 75 72 61 74 69 6f 6e 20 52 65 6c 65 61 73 65 22  uration Release"
3260: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
3270: 20 20 2d 66 69 6c 65 20 2e 5c 70 61 74 68 5c 74    -file .\path\t
3280: 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a 20 20 20  o\all.eagle..   
3290: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 20 20     #..      #   
32a0: 20 20 20 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65      EagleShell.e
32b0: 78 65 20 2d 66 69 6c 65 20 2e 5c 70 61 74 68 5c  xe -file .\path\
32c0: 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 20 2d 70 72  to\all.eagle -pr
32d0: 65 54 65 73 74 0d 0a 20 20 20 20 20 20 23 20 20  eTest..      #  
32e0: 20 20 20 20 20 20 20 22 75 6e 73 65 74 20 2d 6e         "unset -n
32f0: 6f 63 6f 6d 70 6c 61 69 6e 20 74 65 73 74 5f 63  ocomplain test_c
3300: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 22 0d 0a 20  onfiguration".. 
3310: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
3320: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
3330: 3a 74 65 73 74 5f 63 6f 6e 66 69 67 75 72 61 74  :test_configurat
3340: 69 6f 6e 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  ion] && \..     
3350: 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
3360: 67 74 68 20 24 3a 3a 74 65 73 74 5f 63 6f 6e 66  gth $::test_conf
3370: 69 67 75 72 61 74 69 6f 6e 5d 20 3e 20 30 7d 20  iguration] > 0} 
3380: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
3390: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
33a0: 45 3a 20 55 73 65 20 74 68 65 20 73 70 65 63 69  E: Use the speci
33b0: 66 69 65 64 20 74 65 73 74 20 63 6f 6e 66 69 67  fied test config
33c0: 75 72 61 74 69 6f 6e 2e 20 20 54 68 65 20 64 65  uration.  The de
33d0: 66 61 75 6c 74 20 76 61 6c 75 65 20 75 73 65 64  fault value used
33e0: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
33f0: 20 20 66 6f 72 20 74 68 69 73 20 76 61 72 69 61    for this varia
3400: 62 6c 65 20 69 73 20 74 79 70 69 63 61 6c 6c 79  ble is typically
3410: 20 22 52 65 6c 65 61 73 65 22 2c 20 61 73 20 73   "Release", as s
3420: 65 74 20 62 79 20 74 68 65 20 74 65 73 74 0d 0a  et by the test..
3430: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
3440: 73 75 69 74 65 20 69 74 73 65 6c 66 2e 0d 0a 20  suite itself... 
3450: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
3460: 20 20 72 65 74 75 72 6e 20 24 3a 3a 74 65 73 74    return $::test
3470: 5f 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 0d 0a  _configuration..
3480: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
3490: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
34a0: 20 20 20 23 20 4e 4f 54 45 3a 20 4e 6f 72 6d 61     # NOTE: Norma
34b0: 6c 6c 79 2c 20 77 65 20 77 69 6c 6c 20 6e 65 76  lly, we will nev
34c0: 65 72 20 68 69 74 20 74 68 69 73 20 63 61 73 65  er hit this case
34d0: 20 62 65 63 61 75 73 65 20 74 68 65 20 76 61 6c   because the val
34e0: 75 65 20 6f 66 20 74 68 65 0d 0a 20 20 20 20 20  ue of the..     
34f0: 20 20 20 23 20 20 20 20 20 20 20 74 65 73 74 20     #       test 
3500: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 76 61  configuration va
3510: 72 69 61 62 6c 65 20 69 73 20 61 6c 77 61 79 73  riable is always
3520: 20 73 65 74 20 62 79 20 74 68 65 20 74 65 73 74   set by the test
3530: 20 73 75 69 74 65 0d 0a 20 20 20 20 20 20 20 20   suite..        
3540: 23 20 20 20 20 20 20 20 69 74 73 65 6c 66 3b 20  #       itself; 
3550: 68 6f 77 65 76 65 72 2c 20 69 74 20 63 61 6e 20  however, it can 
3560: 62 65 20 6f 76 65 72 72 69 64 64 65 6e 20 75 73  be overridden us
3570: 69 6e 67 20 74 68 65 20 75 6e 73 65 74 20 63 6f  ing the unset co
3580: 6d 6d 61 6e 64 0d 0a 20 20 20 20 20 20 20 20 23  mmand..        #
3590: 20 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20         from the 
35a0: 2d 70 72 65 54 65 73 74 20 6f 70 74 69 6f 6e 20  -preTest option 
35b0: 74 6f 20 74 68 65 20 74 65 73 74 20 73 75 69 74  to the test suit
35c0: 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  e...        #.. 
35d0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a         return $:
35e0: 3a 65 61 67 6c 65 5f 70 6c 61 74 66 6f 72 6d 28  :eagle_platform(
35f0: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 29 0d 0a  configuration)..
3600: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
3610: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 42  ...    proc getB
3620: 75 69 6c 64 43 6f 6e 66 69 67 75 72 61 74 69 6f  uildConfiguratio
3630: 6e 73 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23  ns {} {..      #
3640: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
3650: 53 65 65 20 69 66 20 74 68 65 20 6c 69 73 74 20  See if the list 
3660: 6f 66 20 74 65 73 74 20 63 6f 6e 66 69 67 75 72  of test configur
3670: 61 74 69 6f 6e 73 20 68 61 73 20 62 65 65 6e 20  ations has been 
3680: 6f 76 65 72 72 69 64 64 65 6e 20 62 79 0d 0a 20  overridden by.. 
3690: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
36a0: 20 75 73 65 72 20 28 65 2e 67 2e 20 6f 6e 20 74   user (e.g. on t
36b0: 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 29  he command line)
36c0: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
36d0: 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73    if {[info exis
36e0: 74 73 20 3a 3a 74 65 73 74 5f 63 6f 6e 66 69 67  ts ::test_config
36f0: 75 72 61 74 69 6f 6e 73 5d 20 26 26 20 5c 0d 0a  urations] && \..
3700: 20 20 20 20 20 20 20 20 20 20 5b 6c 6c 65 6e 67            [lleng
3710: 74 68 20 24 3a 3a 74 65 73 74 5f 63 6f 6e 66 69  th $::test_confi
3720: 67 75 72 61 74 69 6f 6e 73 5d 20 3e 20 30 7d 20  gurations] > 0} 
3730: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
3740: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
3750: 45 3a 20 55 73 65 20 74 68 65 20 73 70 65 63 69  E: Use the speci
3760: 66 69 65 64 20 6c 69 73 74 20 6f 66 20 74 65 73  fied list of tes
3770: 74 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73  t configurations
3780: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
3790: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a        return $::
37a0: 74 65 73 74 5f 63 6f 6e 66 69 67 75 72 61 74 69  test_configurati
37b0: 6f 6e 73 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  ons..      } els
37c0: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  e {..        #..
37d0: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
37e0: 55 73 65 20 74 68 65 20 64 65 66 61 75 6c 74 20  Use the default 
37f0: 6c 69 73 74 20 6f 66 20 74 65 73 74 20 63 6f 6e  list of test con
3800: 66 69 67 75 72 61 74 69 6f 6e 73 2e 0d 0a 20 20  figurations...  
3810: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
3820: 20 72 65 74 75 72 6e 20 5b 6c 69 73 74 20 44 65   return [list De
3830: 62 75 67 20 52 65 6c 65 61 73 65 5d 0d 0a 20 20  bug Release]..  
3840: 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
3850: 0a 20 20 20 20 70 72 6f 63 20 67 65 74 42 75 69  .    proc getBui
3860: 6c 64 42 61 73 65 44 69 72 65 63 74 6f 72 79 20  ldBaseDirectory 
3870: 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20  {} {..      #.. 
3880: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69 67       # NOTE: Fig
3890: 75 72 65 20 6f 75 74 20 74 68 65 20 62 61 73 65  ure out the base
38a0: 20 64 69 72 65 63 74 6f 72 79 20 77 68 65 72 65   directory where
38b0: 20 61 6c 6c 20 74 68 65 20 62 75 69 6c 64 73 20   all the builds 
38c0: 73 68 6f 75 6c 64 20 62 65 0d 0a 20 20 20 20 20  should be..     
38d0: 20 23 20 20 20 20 20 20 20 6c 6f 63 61 74 65 64   #       located
38e0: 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 62 65 20  .  This will be 
38f0: 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 74 68  the directory th
3900: 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
3910: 61 63 74 75 61 6c 0d 0a 20 20 20 20 20 20 23 20  actual..      # 
3920: 20 20 20 20 20 20 62 75 69 6c 64 20 6f 75 74 70        build outp
3930: 75 74 20 64 69 72 65 63 74 6f 72 79 20 28 65 2e  ut directory (e.
3940: 67 2e 20 70 61 72 65 6e 74 20 6f 66 20 22 62 69  g. parent of "bi
3950: 6e 22 29 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  n")...      #.. 
3960: 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65       if {[info e
3970: 78 69 73 74 73 20 3a 3a 62 75 69 6c 64 5f 62 61  xists ::build_ba
3980: 73 65 5f 64 69 72 65 63 74 6f 72 79 5d 20 26 26  se_directory] &&
3990: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73   \..          [s
39a0: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a  tring length $::
39b0: 62 75 69 6c 64 5f 62 61 73 65 5f 64 69 72 65 63  build_base_direc
39c0: 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20  tory] > 0} then 
39d0: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
39e0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68        # NOTE: Th
39f0: 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68  e location of th
3a00: 65 20 62 75 69 6c 64 20 62 61 73 65 20 64 69 72  e build base dir
3a10: 65 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20  ectory has been 
3a20: 6f 76 65 72 72 69 64 64 65 6e 3b 0d 0a 20 20 20  overridden;..   
3a30: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
3a40: 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74 20 76  refore, use it v
3a50: 65 72 62 61 74 69 6d 2e 0d 0a 20 20 20 20 20 20  erbatim...      
3a60: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
3a70: 75 72 6e 20 24 3a 3a 62 75 69 6c 64 5f 62 61 73  urn $::build_bas
3a80: 65 5f 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20  e_directory..   
3a90: 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e     } elseif {[in
3aa0: 66 6f 20 65 78 69 73 74 73 20 3a 3a 63 6f 6d 6d  fo exists ::comm
3ab0: 6f 6e 5f 64 69 72 65 63 74 6f 72 79 5d 20 26 26  on_directory] &&
3ac0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73   \..          [s
3ad0: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a  tring length $::
3ae0: 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79  common_directory
3af0: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
3b00: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
3b10: 20 20 23 20 4e 4f 54 45 3a 20 4e 65 78 74 2c 20    # NOTE: Next, 
3b20: 66 61 6c 6c 62 61 63 6b 20 74 6f 20 74 68 65 20  fallback to the 
3b30: 67 72 61 6e 64 70 61 72 65 6e 74 20 64 69 72 65  grandparent dire
3b40: 63 74 6f 72 79 20 6f 66 20 74 68 65 20 6f 6e 65  ctory of the one
3b50: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
3b60: 20 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 69    containing thi
3b70: 73 20 66 69 6c 65 20 28 69 2e 65 2e 20 22 63 6f  s file (i.e. "co
3b80: 6d 6d 6f 6e 2e 65 61 67 6c 65 22 29 2c 20 69 66  mmon.eagle"), if
3b90: 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0a 20 20 20   available...   
3ba0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
3bb0: 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 64 69 72  return [file dir
3bc0: 6e 61 6d 65 20 5b 66 69 6c 65 20 64 69 72 6e 61  name [file dirna
3bd0: 6d 65 20 24 3a 3a 63 6f 6d 6d 6f 6e 5f 64 69 72  me $::common_dir
3be0: 65 63 74 6f 72 79 5d 5d 0d 0a 20 20 20 20 20 20  ectory]]..      
3bf0: 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20  } elseif {[info 
3c00: 65 78 69 73 74 73 20 3a 3a 70 61 74 68 5d 20 26  exists ::path] &
3c10: 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b  & \..          [
3c20: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a  string length $:
3c30: 3a 70 61 74 68 5d 20 3e 20 30 7d 20 74 68 65 6e  :path] > 0} then
3c40: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
3c50: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46         # NOTE: F
3c60: 69 6e 61 6c 6c 79 2c 20 66 61 6c 6c 62 61 63 6b  inally, fallback
3c70: 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 64   to the parent d
3c80: 69 72 65 63 74 6f 72 79 20 6f 66 20 74 68 65 20  irectory of the 
3c90: 45 61 67 6c 65 54 65 73 74 0d 0a 20 20 20 20 20  EagleTest..     
3ca0: 20 20 20 23 20 20 20 20 20 20 20 70 61 74 68 2e     #       path.
3cb0: 20 20 54 68 65 20 45 61 67 6c 65 54 65 73 74 20    The EagleTest 
3cc0: 70 61 63 6b 61 67 65 20 67 75 61 72 61 6e 74 65  package guarante
3cd0: 65 73 20 74 68 61 74 20 74 68 69 73 20 76 61 72  es that this var
3ce0: 69 61 62 6c 65 0d 0a 20 20 20 20 20 20 20 20 23  iable..        #
3cf0: 20 20 20 20 20 20 20 77 69 6c 6c 20 62 65 20 73         will be s
3d00: 65 74 20 74 6f 20 74 68 65 20 64 69 72 65 63 74  et to the direct
3d10: 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ory containing t
3d20: 68 65 20 66 69 72 73 74 20 66 69 6c 65 20 74 6f  he first file to
3d30: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
3d40: 20 20 65 78 65 63 75 74 65 20 74 68 65 20 5b 72    execute the [r
3d50: 75 6e 54 65 73 74 50 72 6f 6c 6f 67 75 65 5d 20  unTestPrologue] 
3d60: 73 63 72 69 70 74 20 6c 69 62 72 61 72 79 20 70  script library p
3d70: 72 6f 63 65 64 75 72 65 2e 0d 0a 20 20 20 20 20  rocedure...     
3d80: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65     #..        re
3d90: 74 75 72 6e 20 5b 66 69 6c 65 20 64 69 72 6e 61  turn [file dirna
3da0: 6d 65 20 24 3a 3a 70 61 74 68 5d 0d 0a 20 20 20  me $::path]..   
3db0: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
3dc0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
3dd0: 23 20 4e 4f 54 45 3a 20 4e 6f 20 70 61 74 68 20  # NOTE: No path 
3de0: 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 72 65  is available, re
3df0: 74 75 72 6e 20 61 6e 20 65 6d 70 74 79 20 73 74  turn an empty st
3e00: 72 69 6e 67 2e 20 20 54 68 69 73 20 70 6f 69 6e  ring.  This poin
3e10: 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  t..        #    
3e20: 20 20 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65     should not be
3e30: 20 72 65 61 63 68 65 64 2e 0d 0a 20 20 20 20 20   reached...     
3e40: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65     #..        re
3e50: 74 75 72 6e 20 22 22 0d 0a 20 20 20 20 20 20 7d  turn ""..      }
3e60: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
3e70: 70 72 6f 63 20 67 65 74 53 51 4c 69 74 65 54 65  proc getSQLiteTe
3e80: 73 74 44 61 74 61 50 61 74 68 20 7b 7d 20 7b 0d  stDataPath {} {.
3e90: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
3ea0: 23 20 4e 4f 54 45 3a 20 46 69 67 75 72 65 20 6f  # NOTE: Figure o
3eb0: 75 74 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  ut the directory
3ec0: 20 77 68 65 72 65 20 61 6c 6c 20 74 68 65 20 74   where all the t
3ed0: 65 73 74 20 64 61 74 61 20 66 69 6c 65 73 20 73  est data files s
3ee0: 68 6f 75 6c 64 0d 0a 20 20 20 20 20 20 23 20 20  hould..      #  
3ef0: 20 20 20 20 20 62 65 20 6c 6f 63 61 74 65 64 2e       be located.
3f00: 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65    This should be
3f10: 20 74 68 65 20 22 64 61 74 61 22 20 64 69 72 65   the "data" dire
3f20: 63 74 6f 72 79 20 62 65 6e 65 61 74 68 20 74 68  ctory beneath th
3f30: 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
3f40: 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 74 61   directory conta
3f50: 69 6e 69 6e 67 20 74 68 65 20 61 63 74 75 61 6c  ining the actual
3f60: 20 74 65 73 74 20 73 63 72 69 70 74 73 2e 0d 0a   test scripts...
3f70: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72        #..      r
3f80: 65 74 75 72 6e 20 5b 66 69 6c 65 20 6a 6f 69 6e  eturn [file join
3f90: 20 24 3a 3a 70 61 74 68 20 64 61 74 61 5d 0d 0a   $::path data]..
3fa0: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
3fb0: 6f 63 20 69 73 52 75 6e 6e 69 6e 67 57 6f 57 36  oc isRunningWoW6
3fc0: 34 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  4 {} {..      #.
3fd0: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46  .      # NOTE: F
3fe0: 6f 72 20 6e 6f 77 2c 20 6a 75 73 74 20 75 73 65  or now, just use
3ff0: 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 74 65   the existing te
4000: 73 74 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 6f  st constraint fo
4010: 72 20 64 65 74 65 63 74 69 6e 67 0d 0a 20 20 20  r detecting..   
4020: 20 20 20 23 20 20 20 20 20 20 20 61 20 57 6f 57     #       a WoW
4030: 36 34 20 70 72 6f 63 65 73 73 2e 0d 0a 20 20 20  64 process...   
4040: 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75     #..      retu
4050: 72 6e 20 5b 68 61 76 65 43 6f 6e 73 74 72 61 69  rn [haveConstrai
4060: 6e 74 20 77 6f 77 36 34 5d 0d 0a 20 20 20 20 7d  nt wow64]..    }
4070: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 69 73  .....    proc is
4080: 4d 69 78 65 64 4d 6f 64 65 41 73 73 65 6d 62 6c  MixedModeAssembl
4090: 79 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7b 76 61  y { fileName {va
40a0: 72 4e 61 6d 65 20 22 22 7d 20 7d 20 7b 0d 0a 20  rName ""} } {.. 
40b0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
40c0: 4e 4f 54 45 3a 20 46 69 72 73 74 2c 20 6d 61 6b  NOTE: First, mak
40d0: 65 20 73 75 72 65 20 74 68 65 20 74 65 73 74 20  e sure the test 
40e0: 73 75 69 74 65 20 69 6e 66 72 61 73 74 72 75 63  suite infrastruc
40f0: 74 75 72 65 20 69 73 20 61 6c 6c 6f 77 65 64 20  ture is allowed 
4100: 74 6f 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  to..      #     
4110: 20 20 75 73 65 20 74 68 65 20 5b 65 78 65 63 5d    use the [exec]
4120: 20 63 6f 6d 6d 61 6e 64 2e 0d 0a 20 20 20 20 20   command...     
4130: 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b   #..      if {![
4140: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
4150: 28 65 78 65 63 29 5d 20 26 26 20 21 5b 69 6e 66  (exec)] && ![inf
4160: 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f  o exists ::no(co
4170: 72 46 6c 61 67 73 29 5d 7d 20 74 68 65 6e 20 7b  rFlags)]} then {
4180: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
4190: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20       # NOTE: If 
41a0: 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20  the location of 
41b0: 43 6f 72 46 6c 61 67 73 20 69 73 20 70 72 65 73  CorFlags is pres
41c0: 65 6e 74 20 69 6e 20 74 68 65 20 65 6e 76 69 72  ent in the envir
41d0: 6f 6e 6d 65 6e 74 2c 0d 0a 20 20 20 20 20 20 20  onment,..       
41e0: 20 23 20 20 20 20 20 20 20 75 73 65 20 69 74 3b   #       use it;
41f0: 20 6f 74 68 65 72 77 69 73 65 20 61 73 73 75 6d   otherwise assum
4200: 65 20 69 74 20 69 73 20 69 6e 20 74 68 65 20 50  e it is in the P
4210: 41 54 48 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ATH...        #.
4220: 0a 20 20 20 20 20 20 20 20 73 65 74 20 63 6f 72  .        set cor
4230: 46 6c 61 67 73 20 5b 65 78 70 72 20 7b 0d 0a 20  Flags [expr {.. 
4240: 20 20 20 20 20 20 20 20 20 5b 69 6e 66 6f 20 65           [info e
4250: 78 69 73 74 73 20 3a 3a 65 6e 76 28 43 6f 72 46  xists ::env(CorF
4260: 6c 61 67 73 29 5d 20 3f 20 24 3a 3a 65 6e 76 28  lags)] ? $::env(
4270: 43 6f 72 46 6c 61 67 73 29 20 3a 20 22 43 6f 72  CorFlags) : "Cor
4280: 46 6c 61 67 73 22 0d 0a 20 20 20 20 20 20 20 20  Flags"..        
4290: 7d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d  }]....        #.
42a0: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
42b0: 20 41 74 74 65 6d 70 74 20 74 6f 20 65 78 65 63   Attempt to exec
42c0: 75 74 65 20 43 6f 72 46 6c 61 67 73 20 6f 6e 20  ute CorFlags on 
42d0: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66 69  the specified fi
42e0: 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  le...        #..
42f0: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
4300: 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
4310: 65 78 65 63 20 2d 2d 20 24 63 6f 72 46 6c 61 67  exec -- $corFlag
4320: 73 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61  s [file nativena
4330: 6d 65 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20  me $fileName].. 
4340: 20 20 20 20 20 20 20 7d 20 65 78 65 63 5d 20 3d         } exec] =
4350: 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
4360: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
4370: 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 72      # NOTE: If r
4380: 65 71 75 65 73 74 65 64 20 62 79 20 6f 75 72 20  equested by our 
4390: 63 61 6c 6c 65 72 2c 20 61 74 74 65 6d 70 74 20  caller, attempt 
43a0: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
43b0: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20  ..          #   
43c0: 20 20 20 20 70 6c 61 74 66 6f 72 6d 20 66 6f 72      platform for
43d0: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66   the specified f
43e0: 69 6c 65 20 61 73 20 77 65 6c 6c 2e 0d 0a 20 20  ile as well...  
43f0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
4400: 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
4410: 20 6c 65 6e 67 74 68 20 24 76 61 72 4e 61 6d 65   length $varName
4420: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
4430: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
4440: 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
4450: 3a 20 53 74 6f 72 65 20 74 68 65 20 70 6c 61 74  : Store the plat
4460: 66 6f 72 6d 20 69 6e 20 74 68 65 20 6e 61 6d 65  form in the name
4470: 64 20 76 61 72 69 61 62 6c 65 20 69 6e 20 74 68  d variable in th
4480: 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  e..            #
4490: 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74 20 6f         context o
44a0: 66 20 6f 75 72 20 63 61 6c 6c 65 72 2e 0d 0a 20  f our caller... 
44b0: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
44c0: 20 20 20 20 20 20 20 20 20 20 75 70 76 61 72 20            upvar 
44d0: 31 20 24 76 61 72 4e 61 6d 65 20 70 6c 61 74 66  1 $varName platf
44e0: 6f 72 6d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  orm....         
44f0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
4500: 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70    # NOTE: Attemp
4510: 74 20 74 6f 20 65 78 74 72 61 63 74 20 74 68 65  t to extract the
4520: 20 50 45 20 6c 69 6e 65 20 66 72 6f 6d 20 74 68   PE line from th
4530: 65 20 63 61 70 74 75 72 65 64 0d 0a 20 20 20 20  e captured..    
4540: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
4550: 6f 75 74 70 75 74 2e 20 20 49 66 20 74 68 69 73  output.  If this
4560: 20 76 61 6c 75 65 20 69 73 20 22 50 45 33 32 22   value is "PE32"
4570: 20 6f 72 20 22 50 45 33 32 2b 22 2c 20 74 68 65   or "PE32+", the
4580: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20  ..            # 
4590: 20 20 20 20 20 20 61 73 73 65 6d 62 6c 79 20 66        assembly f
45a0: 69 6c 65 20 69 73 20 33 32 2d 62 69 74 20 6f 72  ile is 32-bit or
45b0: 20 36 34 2d 62 69 74 2c 20 72 65 73 70 65 63 74   64-bit, respect
45c0: 69 76 65 6c 79 3b 0d 0a 20 20 20 20 20 20 20 20  ively;..        
45d0: 20 20 20 20 23 20 20 20 20 20 20 20 6f 74 68 65      #       othe
45e0: 72 77 69 73 65 2c 20 69 74 73 20 74 79 70 65 20  rwise, its type 
45f0: 69 73 20 75 6e 6b 6e 6f 77 6e 2e 0d 0a 20 20 20  is unknown...   
4600: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
4610: 20 20 20 20 20 20 20 20 73 65 74 20 70 61 74 74          set patt
4620: 65 72 6e 20 7b 5e 50 45 20 20 20 20 20 20 20 20  ern {^PE        
4630: 3a 20 28 50 45 33 32 7c 50 45 33 32 5c 2b 29 5c  : (PE32|PE32\+)\
4640: 73 2b 24 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  s+$}....        
4650: 20 20 20 20 69 66 20 7b 5b 72 65 67 65 78 70 20      if {[regexp 
4660: 2d 6c 69 6e 65 20 2d 2d 20 24 70 61 74 74 65 72  -line -- $patter
4670: 6e 20 24 65 78 65 63 20 64 75 6d 6d 79 20 70 65  n $exec dummy pe
4680: 33 32 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  32]} then {..   
4690: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
46a0: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 48 41              # HA
46b0: 43 4b 3a 20 54 68 69 73 20 5b 73 77 69 74 63 68  CK: This [switch
46c0: 5d 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 33  ] assumes that 3
46d0: 32 2d 62 69 74 20 65 78 65 63 75 74 61 62 6c 65  2-bit executable
46e0: 73 20 61 72 65 0d 0a 20 20 20 20 20 20 20 20 20  s are..         
46f0: 20 20 20 20 20 23 20 20 20 20 20 20 20 61 6c 77       #       alw
4700: 61 79 73 20 78 38 36 20 61 6e 64 20 74 68 61 74  ays x86 and that
4710: 20 36 34 2d 62 69 74 20 65 78 65 63 75 74 61 62   64-bit executab
4720: 6c 65 73 20 61 72 65 20 61 6c 77 61 79 73 0d 0a  les are always..
4730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
4740: 20 20 20 20 20 20 78 36 34 2e 0d 0a 20 20 20 20        x64...    
4750: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
4760: 20 20 20 20 20 20 20 20 20 20 20 73 77 69 74 63             switc
4770: 68 20 2d 65 78 61 63 74 20 2d 2d 20 24 70 65 33  h -exact -- $pe3
4780: 32 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  2 {..           
4790: 20 20 20 20 20 50 45 33 32 20 7b 0d 0a 20 20 20       PE32 {..   
47a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
47b0: 65 74 20 70 6c 61 74 66 6f 72 6d 20 57 69 6e 33  et platform Win3
47c0: 32 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  2..             
47d0: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
47e0: 20 20 20 20 20 20 50 45 33 32 2b 20 7b 0d 0a 20        PE32+ {.. 
47f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4800: 20 73 65 74 20 70 6c 61 74 66 6f 72 6d 20 78 36   set platform x6
4810: 34 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  4..             
4820: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
4830: 20 20 20 20 20 20 64 65 66 61 75 6c 74 20 7b 0d        default {.
4840: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4850: 20 20 20 73 65 74 20 70 6c 61 74 66 6f 72 6d 20     set platform 
4860: 22 22 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ""..            
4870: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
4880: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
4890: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
48a0: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
48b0: 70 6c 61 74 66 6f 72 6d 20 22 22 0d 0a 20 20 20  platform ""..   
48c0: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
48d0: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
48e0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
48f0: 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70    # NOTE: Attemp
4900: 74 20 74 6f 20 65 78 74 72 61 63 74 20 74 68 65  t to extract the
4910: 20 49 4c 4f 4e 4c 59 20 6c 69 6e 65 20 66 72 6f   ILONLY line fro
4920: 6d 20 74 68 65 20 63 61 70 74 75 72 65 64 0d 0a  m the captured..
4930: 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
4940: 20 20 6f 75 74 70 75 74 2e 20 20 49 66 20 74 68    output.  If th
4950: 69 73 20 76 61 6c 75 65 20 69 73 20 7a 65 72 6f  is value is zero
4960: 2c 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  , the specified 
4970: 66 69 6c 65 20 6d 75 73 74 0d 0a 20 20 20 20 20  file must..     
4980: 20 20 20 20 20 23 20 20 20 20 20 20 20 62 65 20       #       be 
4990: 61 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73  a mixed-mode ass
49a0: 65 6d 62 6c 79 3b 20 6f 74 68 65 72 77 69 73 65  embly; otherwise
49b0: 2c 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e  , it contains on
49c0: 6c 79 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20  ly..          # 
49d0: 20 20 20 20 20 20 6d 61 6e 61 67 65 64 20 63 6f        managed co
49e0: 6d 70 6f 6e 65 6e 74 73 2e 0d 0a 20 20 20 20 20  mponents...     
49f0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
4a00: 20 20 73 65 74 20 70 61 74 74 65 72 6e 20 7b 5e    set pattern {^
4a10: 49 4c 4f 4e 4c 59 20 20 20 20 3a 20 28 30 7c 31  ILONLY    : (0|1
4a20: 29 5c 73 2b 24 7d 0d 0a 0d 0a 20 20 20 20 20 20  )\s+$}....      
4a30: 20 20 20 20 69 66 20 7b 21 5b 72 65 67 65 78 70      if {![regexp
4a40: 20 2d 6c 69 6e 65 20 2d 2d 20 24 70 61 74 74 65   -line -- $patte
4a50: 72 6e 20 24 65 78 65 63 20 64 75 6d 6d 79 20 69  rn $exec dummy i
4a60: 6c 4f 6e 6c 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a  lOnly]} then {..
4a70: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
4a80: 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20 20 20  rn false..      
4a90: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
4aa0: 20 20 20 69 66 20 7b 21 24 69 6c 4f 6e 6c 79 7d     if {!$ilOnly}
4ab0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
4ac0: 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65       return true
4ad0: 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
4ae0: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
4af0: 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
4b00: 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 74      # NOTE: If t
4b10: 68 65 20 74 65 73 74 20 73 75 69 74 65 20 63 61  he test suite ca
4b20: 6e 6e 6f 74 20 75 73 65 20 5b 65 78 65 63 5d 20  nnot use [exec] 
4b30: 6f 72 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20  or execution of 
4b40: 43 6f 72 46 6c 61 67 73 0d 0a 20 20 20 20 20 20  CorFlags..      
4b50: 23 20 20 20 20 20 20 20 66 61 69 6c 65 64 2c 20  #       failed, 
4b60: 72 65 74 75 72 6e 20 66 61 6c 73 65 2e 0d 0a 20  return false... 
4b70: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65       #..      re
4b80: 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20  turn false..    
4b90: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67  }.....    proc g
4ba0: 65 74 4e 61 74 69 76 65 4c 69 62 72 61 72 79 46  etNativeLibraryF
4bb0: 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79 20 7b 7d 20  ileNamesOnly {} 
4bc0: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
4bd0: 20 20 23 20 4e 4f 54 45 3a 20 46 69 72 73 74 2c    # NOTE: First,
4be0: 20 63 68 65 63 6b 20 69 66 20 74 68 65 20 6c 69   check if the li
4bf0: 73 74 20 6f 66 20 6e 61 74 69 76 65 20 6c 69 62  st of native lib
4c00: 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 73 20  rary file names 
4c10: 68 61 73 20 62 65 65 6e 0d 0a 20 20 20 20 20 20  has been..      
4c20: 23 20 20 20 20 20 20 20 6d 61 6e 75 61 6c 6c 79  #       manually
4c30: 20 6f 76 65 72 72 69 64 64 65 6e 2e 0d 0a 20 20   overridden...  
4c40: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
4c50: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
4c60: 6e 61 74 69 76 65 5f 6c 69 62 72 61 72 79 5f 66  native_library_f
4c70: 69 6c 65 5f 6e 61 6d 65 73 5d 20 26 26 20 5c 0d  ile_names] && \.
4c80: 0a 20 20 20 20 20 20 20 20 20 20 5b 6c 6c 65 6e  .          [llen
4c90: 67 74 68 20 24 3a 3a 6e 61 74 69 76 65 5f 6c 69  gth $::native_li
4ca0: 62 72 61 72 79 5f 66 69 6c 65 5f 6e 61 6d 65 73  brary_file_names
4cb0: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
4cc0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
4cd0: 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c 69    # NOTE: The li
4ce0: 73 74 20 6f 66 20 6e 61 74 69 76 65 20 6c 69 62  st of native lib
4cf0: 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 73 20  rary file names 
4d00: 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72 69 64  has been overrid
4d10: 64 65 6e 3b 0d 0a 20 20 20 20 20 20 20 20 23 20  den;..        # 
4d20: 20 20 20 20 20 20 74 68 65 72 65 66 6f 72 65 2c        therefore,
4d30: 20 75 73 65 20 69 74 20 76 65 72 62 61 74 69 6d   use it verbatim
4d40: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
4d50: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a        return $::
4d60: 6e 61 74 69 76 65 5f 6c 69 62 72 61 72 79 5f 66  native_library_f
4d70: 69 6c 65 5f 6e 61 6d 65 73 0d 0a 20 20 20 20 20  ile_names..     
4d80: 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69 73 57 69   } elseif {[isWi
4d90: 6e 64 6f 77 73 5d 7d 20 74 68 65 6e 20 7b 0d 0a  ndows]} then {..
4da0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
4db0: 20 20 20 23 20 4e 4f 54 45 3a 20 4f 74 68 65 72     # NOTE: Other
4dc0: 77 69 73 65 2c 20 6f 6e 20 57 69 6e 64 6f 77 73  wise, on Windows
4dd0: 2c 20 61 6c 77 61 79 73 20 75 73 65 20 74 68 65  , always use the
4de0: 20 64 65 66 61 75 6c 74 20 66 69 6c 65 20 6e 61   default file na
4df0: 6d 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  me..        #   
4e00: 20 20 20 20 22 73 71 6c 69 74 65 33 2e 64 6c 6c      "sqlite3.dll
4e10: 22 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  "...        #.. 
4e20: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6c         return [l
4e30: 69 73 74 20 73 71 6c 69 74 65 33 2e 64 6c 6c 5d  ist sqlite3.dll]
4e40: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
4e50: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
4e60: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4f 74 68       # NOTE: Oth
4e70: 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 62  erwise, return b
4e80: 6f 74 68 20 74 68 65 20 67 65 6e 65 72 69 63 20  oth the generic 
4e90: 50 4f 53 49 58 20 66 69 6c 65 20 6e 61 6d 65 20  POSIX file name 
4ea0: 61 6e 64 20 74 68 65 0d 0a 20 20 20 20 20 20 20  and the..       
4eb0: 20 23 20 20 20 20 20 20 20 4d 61 63 20 4f 53 20   #       Mac OS 
4ec0: 58 20 66 69 6c 65 20 6e 61 6d 65 2c 20 73 69 6e  X file name, sin
4ed0: 63 65 20 77 65 20 64 6f 20 6e 6f 74 20 63 75 72  ce we do not cur
4ee0: 72 65 6e 74 6c 79 20 68 61 76 65 20 61 6e 20 65  rently have an e
4ef0: 61 73 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20  asy..        #  
4f00: 20 20 20 20 20 77 61 79 20 74 6f 20 64 65 74 65       way to dete
4f10: 63 74 20 77 68 69 63 68 20 6f 66 20 74 68 6f 73  ct which of thos
4f20: 65 20 70 6c 61 74 66 6f 72 6d 73 20 77 65 20 61  e platforms we a
4f30: 72 65 20 72 75 6e 6e 69 6e 67 20 6f 6e 2e 0d 0a  re running on...
4f40: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
4f50: 20 20 20 72 65 74 75 72 6e 20 5b 6c 69 73 74 20     return [list 
4f60: 6c 69 62 73 71 6c 69 74 65 33 2e 64 79 6c 69 62  libsqlite3.dylib
4f70: 20 6c 69 62 73 71 6c 69 74 65 33 2e 73 6f 5d 0d   libsqlite3.so].
4f80: 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
4f90: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74  ....    proc get
4fa0: 49 6e 74 65 72 6f 70 41 73 73 65 6d 62 6c 79 46  InteropAssemblyF
4fb0: 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79 20 7b 7d 20  ileNamesOnly {} 
4fc0: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
4fd0: 20 20 23 20 4e 4f 54 45 3a 20 46 69 72 73 74 2c    # NOTE: First,
4fe0: 20 63 68 65 63 6b 20 69 66 20 74 68 65 20 6c 69   check if the li
4ff0: 73 74 20 6f 66 20 69 6e 74 65 72 6f 70 20 61 73  st of interop as
5000: 73 65 6d 62 6c 79 20 66 69 6c 65 20 6e 61 6d 65  sembly file name
5010: 73 20 68 61 73 20 62 65 65 6e 0d 0a 20 20 20 20  s has been..    
5020: 20 20 23 20 20 20 20 20 20 20 6d 61 6e 75 61 6c    #       manual
5030: 6c 79 20 6f 76 65 72 72 69 64 64 65 6e 2e 0d 0a  ly overridden...
5040: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
5050: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
5060: 3a 3a 69 6e 74 65 72 6f 70 5f 61 73 73 65 6d 62  ::interop_assemb
5070: 6c 79 5f 66 69 6c 65 5f 6e 61 6d 65 73 5d 20 26  ly_file_names] &
5080: 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b  & \..          [
5090: 6c 6c 65 6e 67 74 68 20 24 3a 3a 69 6e 74 65 72  llength $::inter
50a0: 6f 70 5f 61 73 73 65 6d 62 6c 79 5f 66 69 6c 65  op_assembly_file
50b0: 5f 6e 61 6d 65 73 5d 20 3e 20 30 7d 20 74 68 65  _names] > 0} the
50c0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
50d0: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
50e0: 54 68 65 20 6c 69 73 74 20 6f 66 20 69 6e 74 65  The list of inte
50f0: 72 6f 70 20 61 73 73 65 6d 62 6c 79 20 66 69 6c  rop assembly fil
5100: 65 20 6e 61 6d 65 73 20 68 61 73 20 62 65 65 6e  e names has been
5110: 20 6f 76 65 72 72 69 64 64 65 6e 3b 0d 0a 20 20   overridden;..  
5120: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68        #       th
5130: 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74 20  erefore, use it 
5140: 76 65 72 62 61 74 69 6d 2e 0d 0a 20 20 20 20 20  verbatim...     
5150: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65     #..        re
5160: 74 75 72 6e 20 24 3a 3a 69 6e 74 65 72 6f 70 5f  turn $::interop_
5170: 61 73 73 65 6d 62 6c 79 5f 66 69 6c 65 5f 6e 61  assembly_file_na
5180: 6d 65 73 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  mes..      } els
5190: 65 69 66 20 7b 5b 69 73 57 69 6e 64 6f 77 73 5d  eif {[isWindows]
51a0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
51b0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
51c0: 4f 54 45 3a 20 4f 74 68 65 72 77 69 73 65 2c 20  OTE: Otherwise, 
51d0: 6f 6e 20 57 69 6e 64 6f 77 73 2c 20 61 6c 77 61  on Windows, alwa
51e0: 79 73 20 75 73 65 20 74 68 65 20 64 65 66 61 75  ys use the defau
51f0: 6c 74 20 66 69 6c 65 20 6e 61 6d 65 0d 0a 20 20  lt file name..  
5200: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 22 53        #       "S
5210: 51 4c 69 74 65 2e 49 6e 74 65 72 6f 70 2e 64 6c  QLite.Interop.dl
5220: 6c 22 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  l"...        #..
5230: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b          return [
5240: 6c 69 73 74 20 53 51 4c 69 74 65 2e 49 6e 74 65  list SQLite.Inte
5250: 72 6f 70 2e 64 6c 6c 5d 0d 0a 20 20 20 20 20 20  rop.dll]..      
5260: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
5270: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
5280: 4f 54 45 3a 20 4f 74 68 65 72 77 69 73 65 2c 20  OTE: Otherwise, 
5290: 72 65 74 75 72 6e 20 62 6f 74 68 20 74 68 65 20  return both the 
52a0: 67 65 6e 65 72 69 63 20 50 4f 53 49 58 20 66 69  generic POSIX fi
52b0: 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 0d  le name and the.
52c0: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
52d0: 20 4d 61 63 20 4f 53 20 58 20 66 69 6c 65 20 6e   Mac OS X file n
52e0: 61 6d 65 2c 20 73 69 6e 63 65 20 77 65 20 64 6f  ame, since we do
52f0: 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 68   not currently h
5300: 61 76 65 20 61 6e 20 65 61 73 79 0d 0a 20 20 20  ave an easy..   
5310: 20 20 20 20 20 23 20 20 20 20 20 20 20 77 61 79       #       way
5320: 20 74 6f 20 64 65 74 65 63 74 20 77 68 69 63 68   to detect which
5330: 20 6f 66 20 74 68 6f 73 65 20 70 6c 61 74 66 6f   of those platfo
5340: 72 6d 73 20 77 65 20 61 72 65 20 72 75 6e 6e 69  rms we are runni
5350: 6e 67 20 6f 6e 2e 0d 0a 20 20 20 20 20 20 20 20  ng on...        
5360: 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  #..        retur
5370: 6e 20 5b 6c 69 73 74 20 6c 69 62 53 51 4c 69 74  n [list libSQLit
5380: 65 2e 49 6e 74 65 72 6f 70 2e 64 79 6c 69 62 20  e.Interop.dylib 
5390: 6c 69 62 53 51 4c 69 74 65 2e 49 6e 74 65 72 6f  libSQLite.Intero
53a0: 70 2e 73 6f 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a  p.so]..      }..
53b0: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
53c0: 6f 63 20 67 65 74 43 6f 72 65 45 78 74 65 6e 73  oc getCoreExtens
53d0: 69 6f 6e 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d  ionBinaryFileNam
53e0: 65 20 7b 20 7b 64 65 66 61 75 6c 74 20 22 22 7d  e { {default ""}
53f0: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20   } {..      set 
5400: 66 69 6c 65 4e 61 6d 65 20 5b 67 65 74 43 6f 72  fileName [getCor
5410: 65 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 5d  eBinaryFileName]
5420: 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 66  ....      if {[f
5430: 69 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c 65  ile exists $file
5440: 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  Name]} then {.. 
5450: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 66         return $f
5460: 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 7d  ileName..      }
5470: 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ....      return
5480: 20 24 64 65 66 61 75 6c 74 0d 0a 20 20 20 20 7d   $default..    }
5490: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 69 73  .....    proc is
54a0: 42 75 69 6c 64 41 76 61 69 6c 61 62 6c 65 20 7b  BuildAvailable {
54b0: 20 6e 61 74 69 76 65 20 64 69 72 65 63 74 6f 72   native director
54c0: 79 20 7b 76 61 72 4e 61 6d 65 20 22 22 7d 20 7d  y {varName ""} }
54d0: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
54e0: 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64     # NOTE: Build
54f0: 20 74 68 65 20 66 75 6c 6c 79 20 71 75 61 6c 69   the fully quali
5500: 66 69 65 64 20 66 69 6c 65 20 6e 61 6d 65 20 66  fied file name f
5510: 6f 72 20 74 68 65 20 70 72 69 6d 61 72 79 20 61  or the primary a
5520: 73 73 65 6d 62 6c 79 0d 0a 20 20 20 20 20 20 23  ssembly..      #
5530: 20 20 20 20 20 20 20 63 6f 6e 74 61 69 6e 69 6e         containin
5540: 67 20 74 68 65 20 53 79 73 74 65 6d 2e 44 61 74  g the System.Dat
5550: 61 2e 53 51 4c 69 74 65 20 6d 61 6e 61 67 65 64  a.SQLite managed
5560: 20 63 6f 6d 70 6f 6e 65 6e 74 73 2e 20 20 49 74   components.  It
5570: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
5580: 73 68 6f 75 6c 64 20 62 65 20 6e 6f 74 65 64 20  should be noted 
5590: 74 68 61 74 20 74 68 69 73 20 61 73 73 65 6d 62  that this assemb
55a0: 6c 79 20 66 69 6c 65 20 6d 61 79 20 61 6c 73 6f  ly file may also
55b0: 20 63 6f 6e 74 61 69 6e 20 74 68 65 0d 0a 20 20   contain the..  
55c0: 20 20 20 20 23 20 20 20 20 20 20 20 6e 61 74 69      #       nati
55d0: 76 65 20 63 6f 6d 70 6f 6e 65 6e 74 73 2c 20 69  ve components, i
55e0: 66 20 61 20 6e 61 74 69 76 65 20 62 75 69 6c 64  f a native build
55f0: 20 69 73 20 69 6e 20 75 73 65 2e 0d 0a 20 20 20   is in use...   
5600: 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20     #..      set 
5610: 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6e  fileName [file n
5620: 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20  ativename [file 
5630: 6a 6f 69 6e 20 24 64 69 72 65 63 74 6f 72 79 20  join $directory 
5640: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 53 79 73  \..          Sys
5650: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
5660: 64 6c 6c 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 69  dll]]....      i
5670: 66 20 7b 21 5b 66 69 6c 65 20 65 78 69 73 74 73  f {![file exists
5680: 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65   $fileName]} the
5690: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74  n {..        ret
56a0: 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20 20  urn false..     
56b0: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   }....      #.. 
56c0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74       # NOTE: Att
56d0: 65 6d 70 74 20 74 6f 20 61 75 74 6f 6d 61 74 69  empt to automati
56e0: 63 61 6c 6c 79 20 64 65 74 65 63 74 20 69 66 20  cally detect if 
56f0: 74 68 65 20 70 72 69 6d 61 72 79 20 61 73 73 65  the primary asse
5700: 6d 62 6c 79 0d 0a 20 20 20 20 20 20 23 20 20 20  mbly..      #   
5710: 20 20 20 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79      contains any
5720: 20 6e 61 74 69 76 65 20 63 6f 6d 70 6f 6e 65 6e   native componen
5730: 74 73 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79  ts, if necessary
5740: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
5750: 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
5760: 6e 67 74 68 20 24 6e 61 74 69 76 65 5d 20 3d 3d  ngth $native] ==
5770: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
5780: 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
5790: 6c 65 6e 67 74 68 20 24 76 61 72 4e 61 6d 65 5d  length $varName]
57a0: 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
57b0: 20 20 20 20 20 20 20 20 75 70 76 61 72 20 31 20          upvar 1 
57c0: 24 76 61 72 4e 61 6d 65 20 24 76 61 72 4e 61 6d  $varName $varNam
57d0: 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  e..        }....
57e0: 20 20 20 20 20 20 20 20 73 65 74 20 6e 61 74 69          set nati
57f0: 76 65 20 5b 69 73 4d 69 78 65 64 4d 6f 64 65 41  ve [isMixedModeA
5800: 73 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61 6d  ssembly $fileNam
5810: 65 20 24 76 61 72 4e 61 6d 65 5d 0d 0a 20 20 20  e $varName]..   
5820: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
5830: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49  .      # NOTE: I
5840: 66 20 74 68 65 20 70 72 69 6d 61 72 79 20 61 73  f the primary as
5850: 73 65 6d 62 6c 79 20 61 6c 73 6f 20 63 6f 6e 74  sembly also cont
5860: 61 69 6e 73 20 74 68 65 20 6e 61 74 69 76 65 20  ains the native 
5870: 63 6f 6d 70 6f 6e 65 6e 74 73 2c 0d 0a 20 20 20  components,..   
5880: 20 20 20 23 20 20 20 20 20 20 20 77 65 20 68 61     #       we ha
5890: 76 65 20 65 76 65 72 79 74 68 69 6e 67 20 77 65  ve everything we
58a0: 20 6e 65 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d   need...      #.
58b0: 0a 20 20 20 20 20 20 69 66 20 7b 24 6e 61 74 69  .      if {$nati
58c0: 76 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  ve} then {..    
58d0: 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65 0d      return true.
58e0: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
58f0: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
5900: 45 3a 20 49 66 20 74 68 65 20 6d 61 63 68 69 6e  E: If the machin
5910: 65 20 6e 61 6d 65 20 69 73 20 75 6e 61 76 61 69  e name is unavai
5920: 6c 61 62 6c 65 2c 20 74 68 65 72 65 20 69 73 20  lable, there is 
5930: 6e 6f 74 68 69 67 6e 20 65 6c 73 65 20 77 65 0d  nothign else we.
5940: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63  .      #       c
5950: 61 6e 20 64 6f 2e 0d 0a 20 20 20 20 20 20 23 0d  an do...      #.
5960: 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66  .      if {![inf
5970: 6f 20 65 78 69 73 74 73 20 3a 3a 74 63 6c 5f 70  o exists ::tcl_p
5980: 6c 61 74 66 6f 72 6d 28 6d 61 63 68 69 6e 65 29  latform(machine)
5990: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
59a0: 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 0d     return false.
59b0: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
59c0: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
59d0: 45 3a 20 57 68 61 74 20 69 73 20 74 68 65 20 61  E: What is the a
59e0: 72 63 68 69 74 65 63 74 75 72 65 20 66 6f 72 20  rchitecture for 
59f0: 74 68 69 73 20 6d 61 63 68 69 6e 65 3f 0d 0a 20  this machine?.. 
5a00: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65       #..      se
5a10: 74 20 61 72 63 68 69 74 65 63 74 75 72 65 20 5b  t architecture [
5a20: 6d 61 63 68 69 6e 65 54 6f 50 6c 61 74 66 6f 72  machineToPlatfor
5a30: 6d 20 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72  m $::tcl_platfor
5a40: 6d 28 6d 61 63 68 69 6e 65 29 20 74 72 75 65 5d  m(machine) true]
5a50: 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
5a60: 20 20 20 23 20 4e 4f 54 45 3a 20 57 68 61 74 20     # NOTE: What 
5a70: 69 73 20 74 68 65 20 70 6c 61 74 66 6f 72 6d 20  is the platform 
5a80: 66 6f 72 20 74 68 69 73 20 6d 61 63 68 69 6e 65  for this machine
5a90: 3f 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ?..      #..    
5aa0: 20 20 73 65 74 20 70 6c 61 74 66 6f 72 6d 20 5b    set platform [
5ab0: 6d 61 63 68 69 6e 65 54 6f 50 6c 61 74 66 6f 72  machineToPlatfor
5ac0: 6d 20 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72  m $::tcl_platfor
5ad0: 6d 28 6d 61 63 68 69 6e 65 29 5d 0d 0a 0d 0a 20  m(machine)].... 
5ae0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
5af0: 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74 68 65 20  NOTE: Build the 
5b00: 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 20  fully qualified 
5b10: 66 69 6c 65 20 6e 61 6d 65 20 66 6f 72 20 74 68  file name for th
5b20: 65 20 69 6e 74 65 72 6f 70 20 61 73 73 65 6d 62  e interop assemb
5b30: 6c 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ly..      #     
5b40: 20 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65    containing the
5b50: 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
5b60: 69 74 65 20 6e 61 74 69 76 65 20 63 6f 6d 70 6f  ite native compo
5b70: 6e 65 6e 74 73 2e 20 20 49 66 20 74 68 69 73 0d  nents.  If this.
5b80: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 66  .      #       f
5b90: 69 6c 65 20 65 78 69 73 74 73 2c 20 77 65 20 73  ile exists, we s
5ba0: 68 6f 75 6c 64 20 68 61 76 65 20 65 76 65 72 79  hould have every
5bb0: 74 68 69 6e 67 20 77 65 20 6e 65 65 64 2e 0d 0a  thing we need...
5bc0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 66        #..      f
5bd0: 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 4f  oreach fileNameO
5be0: 6e 6c 79 20 5b 67 65 74 49 6e 74 65 72 6f 70 41  nly [getInteropA
5bf0: 73 73 65 6d 62 6c 79 46 69 6c 65 4e 61 6d 65 73  ssemblyFileNames
5c00: 4f 6e 6c 79 5d 20 7b 0d 0a 20 20 20 20 20 20 20  Only] {..       
5c10: 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66   set fileName [f
5c20: 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b  ile nativename [
5c30: 66 69 6c 65 20 6a 6f 69 6e 20 24 64 69 72 65 63  file join $direc
5c40: 74 6f 72 79 20 5c 0d 0a 20 20 20 20 20 20 20 20  tory \..        
5c50: 20 20 20 20 24 61 72 63 68 69 74 65 63 74 75 72      $architectur
5c60: 65 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 5d  e $fileNameOnly]
5c70: 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20  ]....        if 
5c80: 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 66  {[file exists $f
5c90: 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b  ileName]} then {
5ca0: 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ..          retu
5cb0: 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20 20  rn true..       
5cc0: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65   }....        se
5cd0: 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65  t fileName [file
5ce0: 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c   nativename [fil
5cf0: 65 20 6a 6f 69 6e 20 24 64 69 72 65 63 74 6f 72  e join $director
5d00: 79 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  y \..           
5d10: 20 24 70 6c 61 74 66 6f 72 6d 20 24 66 69 6c 65   $platform $file
5d20: 4e 61 6d 65 4f 6e 6c 79 5d 5d 0d 0a 0d 0a 20 20  NameOnly]]....  
5d30: 20 20 20 20 20 20 69 66 20 7b 5b 66 69 6c 65 20        if {[file 
5d40: 65 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65  exists $fileName
5d50: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
5d60: 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65       return true
5d70: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
5d80: 20 20 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e         set fileN
5d90: 61 6d 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65  ame [file native
5da0: 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20  name [file join 
5db0: 24 64 69 72 65 63 74 6f 72 79 20 5c 0d 0a 20 20  $directory \..  
5dc0: 20 20 20 20 20 20 20 20 20 20 24 66 69 6c 65 4e            $fileN
5dd0: 61 6d 65 4f 6e 6c 79 5d 5d 0d 0a 0d 0a 20 20 20  ameOnly]]....   
5de0: 20 20 20 20 20 69 66 20 7b 5b 66 69 6c 65 20 65       if {[file e
5df0: 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d  xists $fileName]
5e00: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
5e10: 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65 0d      return true.
5e20: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
5e30: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
5e40: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75        # NOTE: Bu
5e50: 69 6c 64 20 74 68 65 20 66 75 6c 6c 79 20 71 75  ild the fully qu
5e60: 61 6c 69 66 69 65 64 20 66 69 6c 65 20 6e 61 6d  alified file nam
5e70: 65 20 66 6f 72 20 74 68 65 20 53 51 4c 69 74 65  e for the SQLite
5e80: 20 63 6f 72 65 0d 0a 20 20 20 20 20 20 23 20 20   core..      #  
5e90: 20 20 20 20 20 6c 69 62 72 61 72 79 2e 20 20 49       library.  I
5ea0: 66 20 74 68 69 73 20 66 69 6c 65 20 65 78 69 73  f this file exis
5eb0: 74 73 2c 20 77 65 20 73 68 6f 75 6c 64 20 68 61  ts, we should ha
5ec0: 76 65 20 65 76 65 72 79 74 68 69 6e 67 20 77 65  ve everything we
5ed0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
5ee0: 6e 65 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  need...      #..
5ef0: 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69        foreach fi
5f00: 6c 65 4e 61 6d 65 4f 6e 6c 79 20 5b 67 65 74 4e  leNameOnly [getN
5f10: 61 74 69 76 65 4c 69 62 72 61 72 79 46 69 6c 65  ativeLibraryFile
5f20: 4e 61 6d 65 73 4f 6e 6c 79 5d 20 7b 0d 0a 20 20  NamesOnly] {..  
5f30: 20 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61        set fileNa
5f40: 6d 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e  me [file nativen
5f50: 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24  ame [file join $
5f60: 64 69 72 65 63 74 6f 72 79 20 5c 0d 0a 20 20 20  directory \..   
5f70: 20 20 20 20 20 20 20 20 20 24 61 72 63 68 69 74           $archit
5f80: 65 63 74 75 72 65 20 24 66 69 6c 65 4e 61 6d 65  ecture $fileName
5f90: 4f 6e 6c 79 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20  Only]]....      
5fa0: 20 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73    if {[file exis
5fb0: 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74  ts $fileName]} t
5fc0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
5fd0: 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20   return true..  
5fe0: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
5ff0: 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 20     set fileName 
6000: 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65  [file nativename
6010: 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 64 69 72   [file join $dir
6020: 65 63 74 6f 72 79 20 5c 0d 0a 20 20 20 20 20 20  ectory \..      
6030: 20 20 20 20 20 20 24 70 6c 61 74 66 6f 72 6d 20        $platform 
6040: 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 5d 5d 0d  $fileNameOnly]].
6050: 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  ...        if {[
6060: 66 69 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c  file exists $fil
6070: 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a  eName]} then {..
6080: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
6090: 20 74 72 75 65 0d 0a 20 20 20 20 20 20 20 20 7d   true..        }
60a0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20  ....        set 
60b0: 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6e  fileName [file n
60c0: 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20  ativename [file 
60d0: 6a 6f 69 6e 20 24 64 69 72 65 63 74 6f 72 79 20  join $directory 
60e0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 24  \..            $
60f0: 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 5d 5d 0d 0a  fileNameOnly]]..
6100: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 66  ..        if {[f
6110: 69 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c 65  ile exists $file
6120: 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  Name]} then {.. 
6130: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
6140: 74 72 75 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d  true..        }.
6150: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
6160: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
6170: 45 3a 20 4f 6e 65 20 6f 72 20 6d 6f 72 65 20 6e  E: One or more n
6180: 61 74 69 76 65 20 63 6f 6d 70 6f 6e 65 6e 74 73  ative components
6190: 20 6e 65 65 64 65 64 20 62 79 20 53 79 73 74 65   needed by Syste
61a0: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 0d 0a 20  m.Data.SQLite.. 
61b0: 20 20 20 20 20 23 20 20 20 20 20 20 20 61 72 65       #       are
61c0: 20 6d 69 73 73 69 6e 67 2e 0d 0a 20 20 20 20 20   missing...     
61d0: 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e   #..      return
61e0: 20 66 61 6c 73 65 0d 0a 20 20 20 20 7d 0d 0a 0c   false..    }...
61f0: 0d 0a 20 20 20 20 70 72 6f 63 20 69 73 52 65 6c  ..    proc isRel
6200: 65 61 73 65 41 76 61 69 6c 61 62 6c 65 20 7b 20  easeAvailable { 
6210: 64 69 72 65 63 74 6f 72 79 20 7b 76 61 72 4e 61  directory {varNa
6220: 6d 65 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20  me ""} } {..    
6230: 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
6240: 6e 67 74 68 20 24 76 61 72 4e 61 6d 65 5d 20 3e  ngth $varName] >
6250: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
6260: 20 20 20 20 75 70 76 61 72 20 31 20 24 76 61 72      upvar 1 $var
6270: 4e 61 6d 65 20 24 76 61 72 4e 61 6d 65 0d 0a 20  Name $varName.. 
6280: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
6290: 72 65 74 75 72 6e 20 5b 69 73 42 75 69 6c 64 41  return [isBuildA
62a0: 76 61 69 6c 61 62 6c 65 20 22 22 20 24 64 69 72  vailable "" $dir
62b0: 65 63 74 6f 72 79 20 24 76 61 72 4e 61 6d 65 5d  ectory $varName]
62c0: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
62d0: 70 72 6f 63 20 6a 6f 69 6e 42 75 69 6c 64 44 69  proc joinBuildDi
62e0: 72 65 63 74 6f 72 79 20 7b 20 6e 61 74 69 76 65  rectory { native
62f0: 20 70 61 74 68 20 79 65 61 72 20 70 6c 61 74 66   path year platf
6300: 6f 72 6d 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  orm configuratio
6310: 6e 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a  n } {..      #..
6320: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69        # NOTE: Fi
6330: 67 75 72 65 20 6f 75 74 20 61 6e 64 20 74 68 65  gure out and the
6340: 6e 20 72 65 74 75 72 6e 20 74 68 65 20 66 75 6c  n return the ful
6350: 6c 79 20 71 75 61 6c 69 66 69 65 64 20 70 61 74  ly qualified pat
6360: 68 20 74 6f 20 74 68 65 20 62 75 69 6c 64 0d 0a  h to the build..
6370: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64 69        #       di
6380: 72 65 63 74 6f 72 79 20 62 61 73 65 64 20 6f 6e  rectory based on
6390: 20 61 6c 6c 20 74 68 65 20 61 72 67 75 6d 65 6e   all the argumen
63a0: 74 73 20 70 72 6f 76 69 64 65 64 20 62 79 20 6f  ts provided by o
63b0: 75 72 20 63 61 6c 6c 65 72 2e 0d 0a 20 20 20 20  ur caller...    
63c0: 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 24    #..      if {$
63d0: 6e 61 74 69 76 65 7d 20 74 68 65 6e 20 7b 0d 0a  native} then {..
63e0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b          return [
63f0: 66 69 6c 65 20 6a 6f 69 6e 20 24 70 61 74 68 20  file join $path 
6400: 62 69 6e 20 24 79 65 61 72 20 24 70 6c 61 74 66  bin $year $platf
6410: 6f 72 6d 20 24 63 6f 6e 66 69 67 75 72 61 74 69  orm $configurati
6420: 6f 6e 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  on]..      } els
6430: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74  e {..        ret
6440: 75 72 6e 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24  urn [file join $
6450: 70 61 74 68 20 62 69 6e 20 24 79 65 61 72 20 24  path bin $year $
6460: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 62 69  configuration bi
6470: 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  n]..      }..   
6480: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
6490: 67 65 74 42 75 69 6c 64 44 69 72 65 63 74 6f 72  getBuildDirector
64a0: 79 20 7b 20 6d 61 6e 61 67 65 64 4f 6e 6c 79 20  y { managedOnly 
64b0: 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
64c0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 65 65 20      # NOTE: See 
64d0: 69 66 20 74 68 65 20 22 6e 61 74 69 76 65 22 20  if the "native" 
64e0: 72 75 6e 74 69 6d 65 20 6f 70 74 69 6f 6e 20 68  runtime option h
64f0: 61 73 20 62 65 65 6e 20 73 65 74 2e 20 20 49 66  as been set.  If
6500: 20 73 6f 2c 20 75 73 65 20 74 68 65 0d 0a 20 20   so, use the..  
6510: 20 20 20 20 23 20 20 20 20 20 20 20 64 69 72 65      #       dire
6520: 63 74 6f 72 79 20 66 6f 72 20 74 68 65 20 6d 69  ctory for the mi
6530: 78 65 64 2d 6d 6f 64 65 20 61 73 73 65 6d 62 6c  xed-mode assembl
6540: 79 20 28 61 2e 6b 2e 61 2e 20 74 68 65 20 6e 61  y (a.k.a. the na
6550: 74 69 76 65 20 69 6e 74 65 72 6f 70 0d 0a 20 20  tive interop..  
6560: 20 20 20 20 23 20 20 20 20 20 20 20 61 73 73 65      #       asse
6570: 6d 62 6c 79 29 2e 20 20 54 6f 20 65 6e 61 62 6c  mbly).  To enabl
6580: 65 20 74 68 69 73 20 6f 70 74 69 6f 6e 20 76 69  e this option vi
6590: 61 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69  a the command li
65a0: 6e 65 2c 20 65 6e 74 65 72 20 61 0d 0a 20 20 20  ne, enter a..   
65b0: 20 20 20 23 20 20 20 20 20 20 20 63 6f 6d 6d 61     #       comma
65c0: 6e 64 20 73 69 6d 69 6c 61 72 20 74 6f 20 6f 6e  nd similar to on
65d0: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
65e0: 6e 67 20 28 61 6c 6c 20 6f 6e 20 6f 6e 65 20 6c  ng (all on one l
65f0: 69 6e 65 29 3a 0d 0a 20 20 20 20 20 20 23 0d 0a  ine):..      #..
6600: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 45 61        #       Ea
6610: 67 6c 65 53 68 65 6c 6c 2e 65 78 65 20 2d 69 6e  gleShell.exe -in
6620: 69 74 69 61 6c 69 7a 65 20 2d 72 75 6e 74 69 6d  itialize -runtim
6630: 65 4f 70 74 69 6f 6e 20 6e 61 74 69 76 65 0d 0a  eOption native..
6640: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20        #         
6650: 2d 66 69 6c 65 20 2e 5c 70 61 74 68 5c 74 6f 5c  -file .\path\to\
6660: 61 6c 6c 2e 65 61 67 6c 65 0d 0a 20 20 20 20 20  all.eagle..     
6670: 20 23 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20   #..      #     
6680: 20 20 54 6f 20 65 6e 61 62 6c 65 20 74 68 69 73    To enable this
6690: 20 6f 70 74 69 6f 6e 20 76 69 61 20 74 68 65 20   option via the 
66a0: 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 70 72 69  command line pri
66b0: 6f 72 20 74 6f 20 74 68 65 20 22 62 65 74 61 20  or to the "beta 
66c0: 31 36 22 0d 0a 20 20 20 20 20 20 23 20 20 20 20  16"..      #    
66d0: 20 20 20 72 65 6c 65 61 73 65 20 6f 66 20 45 61     release of Ea
66e0: 67 6c 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  gle, the followi
66f0: 6e 67 20 63 6f 6d 6d 61 6e 64 20 6d 75 73 74 20  ng command must 
6700: 62 65 20 75 73 65 64 20 69 6e 73 74 65 61 64 0d  be used instead.
6710: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 28  .      #       (
6720: 61 6c 73 6f 20 61 6c 6c 20 6f 6e 20 6f 6e 65 20  also all on one 
6730: 6c 69 6e 65 29 3a 0d 0a 20 20 20 20 20 20 23 0d  line):..      #.
6740: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 45  .      #       E
6750: 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65 20 2d 69  agleShell.exe -i
6760: 6e 69 74 69 61 6c 69 7a 65 20 2d 70 6f 73 74 49  nitialize -postI
6770: 6e 69 74 69 61 6c 69 7a 65 0d 0a 20 20 20 20 20  nitialize..     
6780: 20 23 20 20 20 20 20 20 20 20 20 22 6f 62 6a 65   #         "obje
6790: 63 74 20 69 6e 76 6f 6b 65 20 49 6e 74 65 72 70  ct invoke Interp
67a0: 72 65 74 65 72 2e 47 65 74 41 63 74 69 76 65 20  reter.GetActive 
67b0: 41 64 64 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e  AddRuntimeOption
67c0: 20 6e 61 74 69 76 65 22 0d 0a 20 20 20 20 20 20   native"..      
67d0: 23 20 20 20 20 20 20 20 20 20 2d 66 69 6c 65 20  #         -file 
67e0: 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61  .\path\to\all.ea
67f0: 67 6c 65 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  gle..      #..  
6800: 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
6810: 69 73 74 73 20 3a 3a 62 75 69 6c 64 5f 64 69 72  ists ::build_dir
6820: 65 63 74 6f 72 79 5d 20 26 26 20 5c 0d 0a 20 20  ectory] && \..  
6830: 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20          [string 
6840: 6c 65 6e 67 74 68 20 24 3a 3a 62 75 69 6c 64 5f  length $::build_
6850: 64 69 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20  directory] > 0} 
6860: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
6870: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
6880: 45 3a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20  E: The location 
6890: 6f 66 20 74 68 65 20 62 75 69 6c 64 20 64 69 72  of the build dir
68a0: 65 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20  ectory has been 
68b0: 6f 76 65 72 72 69 64 64 65 6e 3b 0d 0a 20 20 20  overridden;..   
68c0: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
68d0: 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74 20 76  refore, use it v
68e0: 65 72 62 61 74 69 6d 2e 0d 0a 20 20 20 20 20 20  erbatim...      
68f0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
6900: 75 72 6e 20 24 3a 3a 62 75 69 6c 64 5f 64 69 72  urn $::build_dir
6910: 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20  ectory..      } 
6920: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
6930: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
6940: 45 3a 20 49 66 20 74 68 65 20 22 6e 61 74 69 76  E: If the "nativ
6950: 65 22 20 72 75 6e 74 69 6d 65 20 6f 70 74 69 6f  e" runtime optio
6960: 6e 20 69 73 20 73 65 74 2c 20 74 68 65 20 6d 69  n is set, the mi
6970: 78 65 64 2d 6d 6f 64 65 20 61 73 73 65 6d 62 6c  xed-mode assembl
6980: 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  y..        #    
6990: 20 20 20 69 73 20 62 65 69 6e 67 20 74 65 73 74     is being test
69a0: 65 64 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73  ed.  In that cas
69b0: 65 2c 20 74 68 65 20 70 61 74 68 20 74 6f 20 74  e, the path to t
69c0: 68 65 20 62 75 69 6c 64 20 64 69 72 65 63 74 6f  he build directo
69d0: 72 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ry..        #   
69e0: 20 20 20 20 77 69 6c 6c 20 63 6f 6e 74 61 69 6e      will contain
69f0: 20 74 68 65 20 70 6c 61 74 66 6f 72 6d 20 6e 61   the platform na
6a00: 6d 65 20 61 6e 64 20 61 6c 6c 20 74 68 65 20 62  me and all the b
6a10: 69 6e 61 72 69 65 73 20 75 6e 64 65 72 20 74 65  inaries under te
6a20: 73 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  st..        #   
6a30: 20 20 20 20 73 68 6f 75 6c 64 20 62 65 20 70 72      should be pr
6a40: 65 73 65 6e 74 20 69 6e 20 74 68 61 74 20 64 69  esent in that di
6a50: 72 65 63 74 6f 72 79 2e 20 20 49 66 20 74 68 65  rectory.  If the
6a60: 20 22 6e 61 74 69 76 65 22 20 72 75 6e 74 69 6d   "native" runtim
6a70: 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
6a80: 20 20 20 6f 70 74 69 6f 6e 20 69 73 20 6e 6f 74     option is not
6a90: 20 73 65 74 2c 20 74 68 65 20 62 75 69 6c 64 20   set, the build 
6aa0: 64 69 72 65 63 74 6f 72 79 20 77 69 6c 6c 20 62  directory will b
6ab0: 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20  e considered to 
6ac0: 62 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  be..        #   
6ad0: 20 20 20 20 22 70 6c 61 74 66 6f 72 6d 2d 6e 65      "platform-ne
6ae0: 75 74 72 61 6c 22 2c 20 77 69 74 68 20 74 68 65  utral", with the
6af0: 20 6e 6f 74 61 62 6c 65 20 65 78 63 65 70 74 69   notable excepti
6b00: 6f 6e 20 6f 66 20 61 6e 79 20 6e 61 74 69 76 65  on of any native
6b10: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
6b20: 20 20 61 73 73 65 6d 62 6c 79 20 28 65 2e 67 2e    assembly (e.g.
6b30: 20 22 53 51 4c 69 74 65 2e 49 6e 74 65 72 6f 70   "SQLite.Interop
6b40: 2e 64 6c 6c 22 29 20 63 6f 70 69 65 64 20 74 68  .dll") copied th
6b50: 65 72 65 20 64 75 72 69 6e 67 20 74 68 65 0d 0a  ere during the..
6b60: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
6b70: 62 75 69 6c 64 20 70 72 6f 63 65 73 73 20 69 74  build process it
6b80: 73 65 6c 66 2e 20 20 49 66 20 74 68 65 20 62 75  self.  If the bu
6b90: 69 6c 64 20 70 72 6f 63 65 73 73 20 73 6f 6d 65  ild process some
6ba0: 68 6f 77 20 64 6f 65 73 20 6e 6f 74 0d 0a 20 20  how does not..  
6bb0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f        #       co
6bc0: 70 79 20 74 68 65 20 6e 61 74 69 76 65 20 61 73  py the native as
6bd0: 73 65 6d 62 6c 79 20 66 6f 72 20 74 68 69 73 20  sembly for this 
6be0: 70 6c 61 74 66 6f 72 6d 2c 20 6d 6f 73 74 20 6f  platform, most o
6bf0: 66 20 74 68 65 20 74 65 73 74 73 0d 0a 20 20 20  f the tests..   
6c00: 20 20 20 20 20 23 20 20 20 20 20 20 20 69 6e 20       #       in 
6c10: 74 68 65 20 73 75 69 74 65 20 77 69 6c 6c 20 73  the suite will s
6c20: 69 6d 70 6c 79 20 62 65 20 73 6b 69 70 70 65 64  imply be skipped
6c30: 2e 20 20 47 65 6e 65 72 61 6c 6c 79 20 73 70 65  .  Generally spe
6c40: 61 6b 69 6e 67 2c 20 74 68 65 72 65 0d 0a 20 20  aking, there..  
6c50: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61 72        #       ar
6c60: 65 20 74 77 6f 20 77 61 79 73 20 74 6f 20 62 75  e two ways to bu
6c70: 69 6c 64 20 74 68 65 20 62 69 6e 61 72 69 65 73  ild the binaries
6c80: 20 77 68 65 6e 20 70 72 65 70 61 72 69 6e 67 20   when preparing 
6c90: 74 6f 20 72 75 6e 20 74 68 65 0d 0a 20 20 20 20  to run the..    
6ca0: 20 20 20 20 23 20 20 20 20 20 20 20 74 65 73 74      #       test
6cb0: 20 73 75 69 74 65 3a 0d 0a 20 20 20 20 20 20 20   suite:..       
6cc0: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20   #..        #   
6cd0: 20 20 20 20 31 2e 20 42 75 69 6c 64 20 74 68 65      1. Build the
6ce0: 20 73 65 70 61 72 61 74 65 20 6d 61 6e 61 67 65   separate manage
6cf0: 64 20 61 6e 64 20 6e 61 74 69 76 65 20 61 73 73  d and native ass
6d00: 65 6d 62 6c 69 65 73 20 75 73 69 6e 67 20 73 6f  emblies using so
6d10: 6d 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  me..        #   
6d20: 20 20 20 20 20 20 20 63 6f 6d 6d 61 6e 64 73 20         commands 
6d30: 73 69 6d 69 6c 61 72 20 74 6f 3a 0d 0a 20 20 20  similar to:..   
6d40: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
6d50: 23 20 20 20 20 20 20 20 20 20 20 62 75 69 6c 64  #          build
6d60: 2e 62 61 74 20 24 7b 43 6f 6e 66 69 67 75 72 61  .bat ${Configura
6d70: 74 69 6f 6e 7d 4d 61 6e 61 67 65 64 4f 6e 6c 79  tion}ManagedOnly
6d80: 20 24 7b 50 6c 61 74 66 6f 72 6d 7d 0d 0a 20 20   ${Platform}..  
6d90: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20        #         
6da0: 20 62 75 69 6c 64 2e 62 61 74 20 24 7b 43 6f 6e   build.bat ${Con
6db0: 66 69 67 75 72 61 74 69 6f 6e 7d 4e 61 74 69 76  figuration}Nativ
6dc0: 65 4f 6e 6c 79 20 24 7b 50 6c 61 74 66 6f 72 6d  eOnly ${Platform
6dd0: 7d 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  }..        #..  
6de0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20        #         
6df0: 20 57 68 65 72 65 20 24 7b 43 6f 6e 66 69 67 75   Where ${Configu
6e00: 72 61 74 69 6f 6e 7d 20 69 73 20 65 69 74 68 65  ration} is eithe
6e10: 72 20 22 44 65 62 75 67 22 20 6f 72 20 22 52 65  r "Debug" or "Re
6e20: 6c 65 61 73 65 22 20 61 6e 64 0d 0a 20 20 20 20  lease" and..    
6e30: 20 20 20 20 23 20 20 20 20 20 20 20 20 20 20 24      #          $
6e40: 7b 50 6c 61 74 66 6f 72 6d 7d 20 69 73 20 65 69  {Platform} is ei
6e50: 74 68 65 72 20 22 57 69 6e 33 32 22 20 6f 72 20  ther "Win32" or 
6e60: 22 78 36 34 22 2e 0d 0a 20 20 20 20 20 20 20 20  "x64"...        
6e70: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  #..        #    
6e80: 20 20 20 32 2e 20 42 75 69 6c 64 20 74 68 65 20     2. Build the 
6e90: 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73 65 6d  mixed-mode assem
6ea0: 62 6c 79 20 75 73 69 6e 67 20 61 20 63 6f 6d 6d  bly using a comm
6eb0: 61 6e 64 20 73 69 6d 69 6c 61 72 20 74 6f 3a 0d  and similar to:.
6ec0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
6ed0: 20 20 20 20 23 20 20 20 20 20 20 20 20 20 20 62      #          b
6ee0: 75 69 6c 64 2e 62 61 74 20 24 7b 43 6f 6e 66 69  uild.bat ${Confi
6ef0: 67 75 72 61 74 69 6f 6e 7d 20 24 7b 50 6c 61 74  guration} ${Plat
6f00: 66 6f 72 6d 7d 0d 0a 20 20 20 20 20 20 20 20 23  form}..        #
6f10: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
6f20: 20 20 20 20 20 57 68 65 72 65 20 24 7b 43 6f 6e       Where ${Con
6f30: 66 69 67 75 72 61 74 69 6f 6e 7d 20 69 73 20 65  figuration} is e
6f40: 69 74 68 65 72 20 22 44 65 62 75 67 22 20 6f 72  ither "Debug" or
6f50: 20 22 52 65 6c 65 61 73 65 22 20 61 6e 64 0d 0a   "Release" and..
6f60: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
6f70: 20 20 20 24 7b 50 6c 61 74 66 6f 72 6d 7d 20 69     ${Platform} i
6f80: 73 20 65 69 74 68 65 72 20 22 57 69 6e 33 32 22  s either "Win32"
6f90: 20 6f 72 20 22 78 36 34 22 2e 20 20 49 66 20 74   or "x64".  If t
6fa0: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 69 73 0d 0a  his command is..
6fb0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
6fc0: 20 20 20 75 73 65 64 2c 20 76 61 72 69 6f 75 73     used, various
6fd0: 20 74 65 73 74 73 20 74 68 61 74 20 72 65 71 75   tests that requ
6fe0: 69 72 65 20 73 75 70 70 6c 65 6d 65 6e 74 61 72  ire supplementar
6ff0: 79 20 6d 61 6e 61 67 65 64 0d 0a 20 20 20 20 20  y managed..     
7000: 20 20 20 23 20 20 20 20 20 20 20 20 20 20 61 73     #          as
7010: 73 65 6d 62 6c 69 65 73 20 28 65 2e 67 2e 20 4c  semblies (e.g. L
7020: 49 4e 51 29 20 6d 61 79 20 62 65 20 73 6b 69 70  INQ) may be skip
7030: 70 65 64 20 75 6e 6c 65 73 73 20 74 68 6f 73 65  ped unless those
7040: 20 62 69 6e 61 72 69 65 73 0d 0a 20 20 20 20 20   binaries..     
7050: 20 20 20 23 20 20 20 20 20 20 20 20 20 20 61 72     #          ar
7060: 65 20 73 75 62 73 65 71 75 65 6e 74 6c 79 20 63  e subsequently c
7070: 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65 20 63  opied into the c
7080: 6f 72 72 65 63 74 20 64 69 72 65 63 74 6f 72 79  orrect directory
7090: 20 28 69 2e 65 2e 20 62 79 0d 0a 20 20 20 20 20   (i.e. by..     
70a0: 20 20 20 23 20 20 20 20 20 20 20 20 20 20 22 74     #          "t
70b0: 65 73 74 5f 61 6c 6c 2e 62 61 74 22 29 2e 0d 0a  est_all.bat")...
70c0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
70d0: 20 20 20 23 20 20 20 20 20 20 20 4e 6f 74 65 20     #       Note 
70e0: 74 68 61 74 20 61 6c 6c 20 6f 66 20 74 68 65 20  that all of the 
70f0: 62 75 69 6c 64 20 63 6f 6d 6d 61 6e 64 73 20 61  build commands a
7100: 62 6f 76 65 20 77 69 6c 6c 20 64 65 66 61 75 6c  bove will defaul
7110: 74 20 74 6f 20 75 73 69 6e 67 0d 0a 20 20 20 20  t to using..    
7120: 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20      #       the 
7130: 6c 61 74 65 73 74 20 76 65 72 73 69 6f 6e 20 6f  latest version o
7140: 66 20 4d 53 42 75 69 6c 64 20 61 76 61 69 6c 61  f MSBuild availa
7150: 62 6c 65 20 61 6e 64 20 74 68 65 20 22 74 65 73  ble and the "tes
7160: 74 5f 79 65 61 72 22 20 6d 61 79 0d 0a 20 20 20  t_year" may..   
7170: 20 20 20 20 20 23 20 20 20 20 20 20 20 6e 65 65       #       nee
7180: 64 20 74 6f 20 62 65 20 61 64 6a 75 73 74 65 64  d to be adjusted
7190: 20 61 63 63 6f 72 64 69 6e 67 6c 79 20 74 6f 20   accordingly to 
71a0: 61 63 74 75 61 6c 6c 79 20 72 75 6e 20 74 68 65  actually run the
71b0: 20 74 65 73 74 20 73 75 69 74 65 2e 0d 0a 20 20   test suite...  
71c0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 52 65        #       Re
71d0: 66 65 72 20 74 6f 20 74 68 65 20 63 6f 6d 6d 65  fer to the comme
71e0: 6e 74 73 20 69 6e 20 5b 67 65 74 42 75 69 6c 64  nts in [getBuild
71f0: 59 65 61 72 5d 20 66 6f 72 20 6d 6f 72 65 20 69  Year] for more i
7200: 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 0d 0a 20  nformation on.. 
7210: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 68         #       h
7220: 6f 77 20 74 6f 20 73 65 74 20 74 68 69 73 20 76  ow to set this v
7230: 61 72 69 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20  ariable...      
7240: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74    #..        set
7250: 20 6e 61 74 69 76 65 20 5b 65 78 70 72 20 7b 21   native [expr {!
7260: 24 6d 61 6e 61 67 65 64 4f 6e 6c 79 20 26 26 20  $managedOnly && 
7270: 5b 68 61 73 52 75 6e 74 69 6d 65 4f 70 74 69 6f  [hasRuntimeOptio
7280: 6e 20 6e 61 74 69 76 65 5d 7d 5d 0d 0a 0d 0a 20  n native]}].... 
7290: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6a         return [j
72a0: 6f 69 6e 42 75 69 6c 64 44 69 72 65 63 74 6f 72  oinBuildDirector
72b0: 79 20 24 6e 61 74 69 76 65 20 5b 67 65 74 42 75  y $native [getBu
72c0: 69 6c 64 42 61 73 65 44 69 72 65 63 74 6f 72 79  ildBaseDirectory
72d0: 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ] \..           
72e0: 20 5b 67 65 74 42 75 69 6c 64 59 65 61 72 5d 20   [getBuildYear] 
72f0: 5b 67 65 74 42 75 69 6c 64 50 6c 61 74 66 6f 72  [getBuildPlatfor
7300: 6d 20 24 6e 61 74 69 76 65 5d 20 5b 67 65 74 42  m $native] [getB
7310: 75 69 6c 64 43 6f 6e 66 69 67 75 72 61 74 69 6f  uildConfiguratio
7320: 6e 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  n]]..      }..  
7330: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
7340: 20 67 65 74 52 65 6c 65 61 73 65 56 65 72 73 69   getReleaseVersi
7350: 6f 6e 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23  on {} {..      #
7360: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
7370: 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 72  Figure out the r
7380: 65 6c 65 61 73 65 20 76 65 72 73 69 6f 6e 20 66  elease version f
7390: 6f 72 20 75 73 65 20 77 69 74 68 20 74 68 65 20  or use with the 
73a0: 62 75 69 6c 64 20 64 69 72 65 63 74 6f 72 79 0d  build directory.
73b0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 77  .      #       w
73c0: 68 65 6e 20 63 68 65 63 6b 69 6e 67 20 66 6f 72  hen checking for
73d0: 20 61 76 61 69 6c 61 62 6c 65 20 72 65 6c 65 61   available relea
73e0: 73 65 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ses...      #.. 
73f0: 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65       if {[info e
7400: 78 69 73 74 73 20 3a 3a 72 65 6c 65 61 73 65 5f  xists ::release_
7410: 76 65 72 73 69 6f 6e 5d 20 26 26 20 5c 0d 0a 20  version] && \.. 
7420: 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67           [string
7430: 20 6c 65 6e 67 74 68 20 24 3a 3a 72 65 6c 65 61   length $::relea
7440: 73 65 5f 76 65 72 73 69 6f 6e 5d 20 3e 20 30 7d  se_version] > 0}
7450: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
7460: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
7470: 54 45 3a 20 54 68 65 20 72 65 6c 65 61 73 65 20  TE: The release 
7480: 76 65 72 73 69 6f 6e 20 68 61 73 20 62 65 65 6e  version has been
7490: 20 6f 76 65 72 72 69 64 64 65 6e 3b 20 74 68 65   overridden; the
74a0: 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74 0d 0a  refore, use it..
74b0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
74c0: 76 65 72 62 61 74 69 6d 2e 0d 0a 20 20 20 20 20  verbatim...     
74d0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65     #..        re
74e0: 74 75 72 6e 20 24 3a 3a 72 65 6c 65 61 73 65 5f  turn $::release_
74f0: 76 65 72 73 69 6f 6e 0d 0a 20 20 20 20 20 20 7d  version..      }
7500: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
7510: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
7520: 54 45 3a 20 4e 6f 20 72 65 6c 65 61 73 65 20 76  TE: No release v
7530: 65 72 73 69 6f 6e 20 69 73 20 61 76 61 69 6c 61  ersion is availa
7540: 62 6c 65 2c 20 72 65 74 75 72 6e 20 61 6e 20 65  ble, return an e
7550: 6d 70 74 79 20 73 74 72 69 6e 67 2e 0d 0a 20 20  mpty string...  
7560: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 49 74        #       It
7570: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f   is important to
7580: 20 72 65 74 75 72 6e 20 61 6e 20 65 6d 70 74 79   return an empty
7590: 20 73 74 72 69 6e 67 20 68 65 72 65 20 62 65 63   string here bec
75a0: 61 75 73 65 20 74 68 65 0d 0a 20 20 20 20 20 20  ause the..      
75b0: 20 20 23 20 20 20 20 20 20 20 72 65 73 75 6c 74    #       result
75c0: 20 6f 66 20 74 68 69 73 20 70 72 6f 63 65 64 75   of this procedu
75d0: 72 65 20 6d 61 79 20 62 65 20 75 73 65 64 20 77  re may be used w
75e0: 69 74 68 20 5b 66 69 6c 65 20 6a 6f 69 6e 5d 2e  ith [file join].
75f0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
7600: 20 20 20 20 20 72 65 74 75 72 6e 20 22 22 0d 0a       return ""..
7610: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
7620: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 42  ...    proc getB
7630: 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20 7b 20 66  uildFileName { f
7640: 69 6c 65 4e 61 6d 65 20 6d 61 6e 61 67 65 64 4f  ileName managedO
7650: 6e 6c 79 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22  nly {platform ""
7660: 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a  } } {..      #..
7670: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65        # NOTE: Re
7680: 74 75 72 6e 73 20 74 68 65 20 73 70 65 63 69 66  turns the specif
7690: 69 65 64 20 66 69 6c 65 20 6e 61 6d 65 20 61 73  ied file name as
76a0: 20 69 66 20 69 74 20 77 65 72 65 20 6c 6f 63 61   if it were loca
76b0: 74 65 64 20 69 6e 20 74 68 65 0d 0a 20 20 20 20  ted in the..    
76c0: 20 20 23 20 20 20 20 20 20 20 62 75 69 6c 64 20    #       build 
76d0: 64 69 72 65 63 74 6f 72 79 2c 20 64 69 73 63 61  directory, disca
76e0: 72 64 69 6e 67 20 61 6e 79 20 64 69 72 65 63 74  rding any direct
76f0: 6f 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ory information 
7700: 70 72 65 73 65 6e 74 0d 0a 20 20 20 20 20 20 23  present..      #
7710: 20 20 20 20 20 20 20 69 6e 20 74 68 65 20 66 69         in the fi
7720: 6c 65 20 6e 61 6d 65 20 61 73 20 70 72 6f 76 69  le name as provi
7730: 64 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65  ded by our calle
7740: 72 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  r...      #..   
7750: 20 20 20 73 65 74 20 72 65 73 75 6c 74 20 5b 66     set result [f
7760: 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5c  ile nativename \
7770: 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c  ..          [fil
7780: 65 20 6a 6f 69 6e 20 5b 67 65 74 42 75 69 6c 64  e join [getBuild
7790: 44 69 72 65 63 74 6f 72 79 20 24 6d 61 6e 61 67  Directory $manag
77a0: 65 64 4f 6e 6c 79 5d 20 24 70 6c 61 74 66 6f 72  edOnly] $platfor
77b0: 6d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b  m \..          [
77c0: 66 69 6c 65 20 74 61 69 6c 20 24 66 69 6c 65 4e  file tail $fileN
77d0: 61 6d 65 5d 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20  ame]]]....      
77e0: 23 0d 0a 20 20 20 20 20 20 23 20 48 41 43 4b 3a  #..      # HACK:
77f0: 20 57 68 65 6e 20 72 75 6e 6e 69 6e 67 20 6f 6e   When running on
7800: 20 57 6f 57 36 34 2c 20 61 73 73 75 6d 65 20 74   WoW64, assume t
7810: 68 65 20 74 65 73 74 20 65 78 65 63 75 74 61 62  he test executab
7820: 6c 65 73 20 61 72 65 20 70 72 65 73 65 6e 74 0d  les are present.
7830: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 77  .      #       w
7840: 69 74 68 20 74 68 65 20 22 33 32 22 20 73 75 66  ith the "32" suf
7850: 66 69 78 20 6f 6e 20 74 68 65 6d 2e 0d 0a 20 20  fix on them...  
7860: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
7870: 7b 5b 69 73 52 75 6e 6e 69 6e 67 57 6f 57 36 34  {[isRunningWoW64
7880: 5d 20 26 26 20 5b 66 69 6c 65 20 65 78 74 65 6e  ] && [file exten
7890: 73 69 6f 6e 20 24 72 65 73 75 6c 74 5d 20 65 71  sion $result] eq
78a0: 20 22 2e 65 78 65 22 7d 20 74 68 65 6e 20 7b 0d   ".exe"} then {.
78b0: 0a 20 20 20 20 20 20 20 20 73 65 74 20 72 65 73  .        set res
78c0: 75 6c 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20  ult [appendArgs 
78d0: 5b 66 69 6c 65 20 72 6f 6f 74 6e 61 6d 65 20 24  [file rootname $
78e0: 72 65 73 75 6c 74 5d 20 33 32 2e 65 78 65 5d 0d  result] 32.exe].
78f0: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
7900: 20 20 72 65 74 75 72 6e 20 24 72 65 73 75 6c 74    return $result
7910: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
7920: 70 72 6f 63 20 67 65 74 45 78 74 65 72 6e 61 6c  proc getExternal
7930: 44 69 72 65 63 74 6f 72 79 20 7b 7d 20 7b 0d 0a  Directory {} {..
7940: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
7950: 20 4e 4f 54 45 3a 20 54 68 69 73 20 70 72 6f 63   NOTE: This proc
7960: 65 64 75 72 65 20 72 65 74 75 72 6e 73 20 74 68  edure returns th
7970: 65 20 64 69 72 65 63 74 6f 72 79 20 77 68 65 72  e directory wher
7980: 65 20 74 68 65 20 65 78 74 65 72 6e 61 6c 20 62  e the external b
7990: 69 6e 61 72 79 0d 0a 20 20 20 20 20 20 23 20 20  inary..      #  
79a0: 20 20 20 20 20 66 69 6c 65 73 20 61 72 65 20 6c       files are l
79b0: 6f 63 61 74 65 64 2e 0d 0a 20 20 20 20 20 20 23  ocated...      #
79c0: 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b  ..      return [
79d0: 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20  file nativename 
79e0: 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20 5b 66  [file dirname [f
79f0: 69 6c 65 20 64 69 72 6e 61 6d 65 20 5b 69 6e 66  ile dirname [inf
7a00: 6f 20 62 69 6e 61 72 79 5d 5d 5d 5d 0d 0a 20 20  o binary]]]]..  
7a10: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
7a20: 20 67 65 74 42 69 6e 61 72 79 44 69 72 65 63 74   getBinaryDirect
7a30: 6f 72 79 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20  ory {} {..      
7a40: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
7a50: 20 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20   This procedure 
7a60: 72 65 74 75 72 6e 73 20 74 68 65 20 64 69 72 65  returns the dire
7a70: 63 74 6f 72 79 20 77 68 65 72 65 20 74 68 65 20  ctory where the 
7a80: 74 65 73 74 20 61 70 70 6c 69 63 61 74 69 6f 6e  test application
7a90: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
7aa0: 69 74 73 65 6c 66 20 28 69 2e 65 2e 20 74 68 65  itself (i.e. the
7ab0: 20 45 61 67 6c 65 20 73 68 65 6c 6c 29 20 69 73   Eagle shell) is
7ac0: 20 6c 6f 63 61 74 65 64 2e 20 20 54 68 69 73 20   located.  This 
7ad0: 77 69 6c 6c 20 62 65 20 75 73 65 64 20 61 73 0d  will be used as.
7ae0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74  .      #       t
7af0: 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 66  he destination f
7b00: 6f 72 20 74 68 65 20 63 6f 70 69 65 64 20 53 79  or the copied Sy
7b10: 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
7b20: 20 6e 61 74 69 76 65 20 61 6e 64 0d 0a 20 20 20   native and..   
7b30: 20 20 20 23 20 20 20 20 20 20 20 6d 61 6e 61 67     #       manag
7b40: 65 64 20 61 73 73 65 6d 62 6c 69 65 73 20 28 69  ed assemblies (i
7b50: 2e 65 2e 20 62 65 63 61 75 73 65 20 74 68 69 73  .e. because this
7b60: 20 69 73 20 6f 6e 65 20 6f 66 20 74 68 65 20 66   is one of the f
7b70: 65 77 20 70 6c 61 63 65 73 0d 0a 20 20 20 20 20  ew places..     
7b80: 20 23 20 20 20 20 20 20 20 77 68 65 72 65 20 74   #       where t
7b90: 68 65 20 43 4c 52 20 77 69 6c 6c 20 61 63 74 75  he CLR will actu
7ba0: 61 6c 6c 79 20 66 69 6e 64 20 61 6e 64 20 6c 6f  ally find and lo
7bb0: 61 64 20 74 68 65 6d 20 70 72 6f 70 65 72 6c 79  ad them properly
7bc0: 29 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  )...      #..   
7bd0: 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69     if {[info exi
7be0: 73 74 73 20 3a 3a 62 69 6e 61 72 79 5f 64 69 72  sts ::binary_dir
7bf0: 65 63 74 6f 72 79 5d 20 26 26 20 5c 0d 0a 20 20  ectory] && \..  
7c00: 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20          [string 
7c10: 6c 65 6e 67 74 68 20 24 3a 3a 62 69 6e 61 72 79  length $::binary
7c20: 5f 64 69 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d  _directory] > 0}
7c30: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
7c40: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
7c50: 54 45 3a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e  TE: The location
7c60: 20 6f 66 20 74 68 65 20 62 69 6e 61 72 79 20 64   of the binary d
7c70: 69 72 65 63 74 6f 72 79 20 68 61 73 20 62 65 65  irectory has bee
7c80: 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b 0d 0a 20  n overridden;.. 
7c90: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74         #       t
7ca0: 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74  herefore, use it
7cb0: 20 76 65 72 62 61 74 69 6d 2e 0d 0a 20 20 20 20   verbatim...    
7cc0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
7cd0: 65 74 75 72 6e 20 24 3a 3a 62 69 6e 61 72 79 5f  eturn $::binary_
7ce0: 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20  directory..     
7cf0: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
7d00: 20 20 20 72 65 74 75 72 6e 20 5b 69 6e 66 6f 20     return [info 
7d10: 62 69 6e 61 72 79 5d 0d 0a 20 20 20 20 20 20 7d  binary]..      }
7d20: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
7d30: 70 72 6f 63 20 67 65 74 45 78 74 65 72 6e 61 6c  proc getExternal
7d40: 46 69 6c 65 4e 61 6d 65 20 7b 20 66 69 6c 65 4e  FileName { fileN
7d50: 61 6d 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23  ame } {..      #
7d60: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
7d70: 52 65 74 75 72 6e 73 20 74 68 65 20 73 70 65 63  Returns the spec
7d80: 69 66 69 65 64 20 66 69 6c 65 20 6e 61 6d 65 20  ified file name 
7d90: 61 73 20 69 66 20 69 74 20 77 65 72 65 20 6c 6f  as if it were lo
7da0: 63 61 74 65 64 20 69 6e 20 74 68 65 0d 0a 20 20  cated in the..  
7db0: 20 20 20 20 23 20 20 20 20 20 20 20 64 69 72 65      #       dire
7dc0: 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67  ctory containing
7dd0: 20 74 68 65 20 65 78 74 65 72 6e 61 6c 20 62 69   the external bi
7de0: 6e 61 72 69 65 73 2e 0d 0a 20 20 20 20 20 20 23  naries...      #
7df0: 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b  ..      return [
7e00: 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20  file nativename 
7e10: 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 45  [file join [getE
7e20: 78 74 65 72 6e 61 6c 44 69 72 65 63 74 6f 72 79  xternalDirectory
7e30: 5d 20 24 66 69 6c 65 4e 61 6d 65 5d 5d 0d 0a 20  ] $fileName]].. 
7e40: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
7e50: 63 20 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e  c getBinaryFileN
7e60: 61 6d 65 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7b  ame { fileName {
7e70: 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20 7d 20 7b  platform ""} } {
7e80: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
7e90: 20 23 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e 73   # NOTE: Returns
7ea0: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66   the specified f
7eb0: 69 6c 65 20 6e 61 6d 65 20 61 73 20 69 66 20 69  ile name as if i
7ec0: 74 20 77 65 72 65 20 6c 6f 63 61 74 65 64 20 69  t were located i
7ed0: 6e 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20  n the..      #  
7ee0: 20 20 20 20 20 62 69 6e 61 72 79 20 64 69 72 65       binary dire
7ef0: 63 74 6f 72 79 2c 20 64 69 73 63 61 72 64 69 6e  ctory, discardin
7f00: 67 20 61 6e 79 20 64 69 72 65 63 74 6f 72 79 20  g any directory 
7f10: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 70 72 65 73  information pres
7f20: 65 6e 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ent..      #    
7f30: 20 20 20 69 6e 20 74 68 65 20 66 69 6c 65 20 6e     in the file n
7f40: 61 6d 65 20 61 73 20 70 72 6f 76 69 64 65 64 20  ame as provided 
7f50: 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 2e 0d 0a  by our caller...
7f60: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72        #..      r
7f70: 65 74 75 72 6e 20 5b 66 69 6c 65 20 6e 61 74 69  eturn [file nati
7f80: 76 65 6e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20  vename \..      
7f90: 20 20 20 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b      [file join [
7fa0: 67 65 74 42 69 6e 61 72 79 44 69 72 65 63 74 6f  getBinaryDirecto
7fb0: 72 79 5d 20 24 70 6c 61 74 66 6f 72 6d 20 5b 66  ry] $platform [f
7fc0: 69 6c 65 20 74 61 69 6c 20 24 66 69 6c 65 4e 61  ile tail $fileNa
7fd0: 6d 65 5d 5d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d  me]]]..    }....
7fe0: 0a 20 20 20 20 70 72 6f 63 20 67 65 74 43 6f 72  .    proc getCor
7ff0: 65 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20  eBinaryFileName 
8000: 7b 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20  { {platform ""} 
8010: 7b 73 74 61 6e 64 61 72 64 20 22 22 7d 20 7d 20  {standard ""} } 
8020: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
8030: 20 20 23 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e    # NOTE: Return
8040: 73 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 20  s the full path 
8050: 66 6f 72 20 74 68 65 20 66 69 6c 65 20 63 6f 6e  for the file con
8060: 74 61 69 6e 69 6e 67 20 74 68 65 20 53 51 4c 69  taining the SQLi
8070: 74 65 20 63 6f 72 65 0d 0a 20 20 20 20 20 20 23  te core..      #
8080: 20 20 20 20 20 20 20 6e 61 74 69 76 65 20 6c 69         native li
8090: 62 72 61 72 79 20 63 6f 64 65 20 66 6f 72 20 74  brary code for t
80a0: 68 69 73 20 70 6c 61 74 66 6f 72 6d 2e 20 20 46  his platform.  F
80b0: 69 72 73 74 2c 20 63 68 65 63 6b 20 61 6e 64 20  irst, check and 
80c0: 73 65 65 20 69 66 0d 0a 20 20 20 20 20 20 23 20  see if..      # 
80d0: 20 20 20 20 20 20 74 68 65 20 53 51 4c 69 74 65        the SQLite
80e0: 20 63 6f 72 65 20 6e 61 74 69 76 65 20 6c 69 62   core native lib
80f0: 72 61 72 79 20 68 61 73 20 61 6c 72 65 61 64 79  rary has already
8100: 20 62 65 65 6e 20 6c 6f 61 64 65 64 2e 20 20 4e   been loaded.  N
8110: 65 78 74 2c 0d 0a 20 20 20 20 20 20 23 20 20 20  ext,..      #   
8120: 20 20 20 20 66 61 6c 6c 62 61 63 6b 20 74 6f 20      fallback to 
8130: 77 68 61 74 20 74 68 65 20 66 75 6c 6c 20 70 61  what the full pa
8140: 74 68 20 73 68 6f 75 6c 64 20 62 65 2c 20 62 61  th should be, ba
8150: 73 65 64 20 6f 6e 20 77 68 65 74 68 65 72 20 74  sed on whether t
8160: 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  he..      #     
8170: 20 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73    mixed-mode ass
8180: 65 6d 62 6c 79 20 69 73 20 62 65 69 6e 67 20 75  embly is being u
8190: 73 65 64 20 61 6e 64 20 74 68 65 20 6e 61 6d 65  sed and the name
81a0: 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 0d   of the current.
81b0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 70  .      #       p
81c0: 6c 61 74 66 6f 72 6d 2e 0d 0a 20 20 20 20 20 20  latform...      
81d0: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61  #..      if {[ca
81e0: 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 6f  tch {..        o
81f0: 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c  bject invoke -fl
8200: 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c  ags +NonPublic \
8210: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 79  ..            Sy
8220: 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
8230: 2e 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74  .UnsafeNativeMet
8240: 68 6f 64 73 20 5f 53 51 4c 69 74 65 4e 61 74 69  hods _SQLiteNati
8250: 76 65 4d 6f 64 75 6c 65 46 69 6c 65 4e 61 6d 65  veModuleFileName
8260: 0d 0a 20 20 20 20 20 20 7d 20 66 69 6c 65 4e 61  ..      } fileNa
8270: 6d 65 5d 20 3d 3d 20 30 20 26 26 20 5b 73 74 72  me] == 0 && [str
8280: 69 6e 67 20 6c 65 6e 67 74 68 20 24 66 69 6c 65  ing length $file
8290: 4e 61 6d 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20  Name] > 0} then 
82a0: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
82b0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68        # NOTE: Th
82c0: 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20 6e 61  e SQLite core na
82d0: 74 69 76 65 20 6c 69 62 72 61 72 79 20 68 61 73  tive library has
82e0: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6c 6f   already been lo
82f0: 61 64 65 64 20 76 69 61 0d 0a 20 20 20 20 20 20  aded via..      
8300: 20 20 23 20 20 20 20 20 20 20 74 68 65 20 6e 61    #       the na
8310: 74 69 76 65 20 6c 69 62 72 61 72 79 20 70 72 65  tive library pre
8320: 2d 6c 6f 61 64 65 72 2e 20 20 52 65 74 75 72 6e  -loader.  Return
8330: 20 74 68 61 74 20 66 69 6c 65 20 6e 61 6d 65 20   that file name 
8340: 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  now...        #.
8350: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
8360: 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20  $fileName..     
8370: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   }....      #.. 
8380: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20       # NOTE: If 
8390: 74 68 65 20 22 6e 61 74 69 76 65 22 20 72 75 6e  the "native" run
83a0: 74 69 6d 65 20 6f 70 74 69 6f 6e 20 68 61 73 20  time option has 
83b0: 62 65 65 6e 20 73 65 74 2c 20 61 6c 77 61 79 73  been set, always
83c0: 20 72 65 74 75 72 6e 20 74 68 65 0d 0a 20 20 20   return the..   
83d0: 20 20 20 23 20 20 20 20 20 20 20 66 69 6c 65 20     #       file 
83e0: 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 6d 69 78  name for the mix
83f0: 65 64 2d 6d 6f 64 65 20 61 73 73 65 6d 62 6c 79  ed-mode assembly
8400: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
8410: 20 20 69 66 20 7b 5b 68 61 73 52 75 6e 74 69 6d    if {[hasRuntim
8420: 65 4f 70 74 69 6f 6e 20 6e 61 74 69 76 65 5d 7d  eOption native]}
8430: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
8440: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
8450: 54 45 3a 20 52 65 74 75 72 6e 20 74 68 65 20 6d  TE: Return the m
8460: 69 78 65 64 2d 6d 6f 64 65 20 61 73 73 65 6d 62  ixed-mode assemb
8470: 6c 79 20 66 69 6c 65 20 6e 61 6d 65 2e 0d 0a 20  ly file name... 
8480: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
8490: 20 20 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 6e    return [file n
84a0: 61 74 69 76 65 6e 61 6d 65 20 5c 0d 0a 20 20 20  ativename \..   
84b0: 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 6a           [file j
84c0: 6f 69 6e 20 5b 67 65 74 42 69 6e 61 72 79 44 69  oin [getBinaryDi
84d0: 72 65 63 74 6f 72 79 5d 20 24 70 6c 61 74 66 6f  rectory] $platfo
84e0: 72 6d 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  rm System.Data.S
84f0: 51 4c 69 74 65 2e 64 6c 6c 5d 5d 0d 0a 20 20 20  QLite.dll]]..   
8500: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
8510: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41  .      # NOTE: A
8520: 72 65 20 77 65 20 61 74 74 65 6d 70 74 69 6e 67  re we attempting
8530: 20 74 6f 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   to automaticall
8540: 79 20 64 65 74 65 63 74 20 77 68 65 74 68 65 72  y detect whether
8550: 20 6f 72 20 6e 6f 74 20 74 68 65 0d 0a 20 20 20   or not the..   
8560: 20 20 20 23 20 20 20 20 20 20 20 69 6e 74 65 72     #       inter
8570: 6f 70 20 61 73 73 65 6d 62 6c 79 20 73 68 6f 75  op assembly shou
8580: 6c 64 20 62 65 20 75 73 65 64 3f 0d 0a 20 20 20  ld be used?..   
8590: 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20     #..      set 
85a0: 61 75 74 6f 6d 61 74 69 63 20 5b 65 78 70 72 20  automatic [expr 
85b0: 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
85c0: 24 73 74 61 6e 64 61 72 64 5d 20 3d 3d 20 30 7d  $standard] == 0}
85d0: 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ]....      #..  
85e0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69 72 73      # NOTE: Firs
85f0: 74 2c 20 69 6e 20 65 69 74 68 65 72 20 22 61 75  t, in either "au
8600: 74 6f 6d 61 74 69 63 22 20 6f 72 20 22 6e 6f 6e  tomatic" or "non
8610: 2d 73 74 61 6e 64 61 72 64 22 20 6d 6f 64 65 73  -standard" modes
8620: 2c 20 61 74 74 65 6d 70 74 0d 0a 20 20 20 20 20  , attempt..     
8630: 20 23 20 20 20 20 20 20 20 74 6f 20 66 69 6e 64   #       to find
8640: 20 74 68 65 20 6e 61 74 69 76 65 2d 6f 6e 6c 79   the native-only
8650: 20 69 6e 74 65 72 6f 70 20 61 73 73 65 6d 62 6c   interop assembl
8660: 79 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  y...      #..   
8670: 20 20 20 69 66 20 7b 24 61 75 74 6f 6d 61 74 69     if {$automati
8680: 63 20 7c 7c 20 21 24 73 74 61 6e 64 61 72 64 7d  c || !$standard}
8690: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
86a0: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
86b0: 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 64  TE: Attempt to d
86c0: 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6e 61 74  etermine the nat
86d0: 69 76 65 2d 6f 6e 6c 79 20 69 6e 74 65 72 6f 70  ive-only interop
86e0: 20 61 73 73 65 6d 62 6c 79 20 66 69 6c 65 0d 0a   assembly file..
86f0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
8700: 6e 61 6d 65 20 66 6f 72 20 74 68 69 73 20 70 6c  name for this pl
8710: 61 74 66 6f 72 6d 20 61 6e 64 20 74 68 65 6e 20  atform and then 
8720: 72 65 74 75 72 6e 20 69 74 2e 0d 0a 20 20 20 20  return it...    
8730: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 66      #..        f
8740: 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 4f  oreach fileNameO
8750: 6e 6c 79 20 5b 67 65 74 49 6e 74 65 72 6f 70 41  nly [getInteropA
8760: 73 73 65 6d 62 6c 79 46 69 6c 65 4e 61 6d 65 73  ssemblyFileNames
8770: 4f 6e 6c 79 5d 20 7b 0d 0a 20 20 20 20 20 20 20  Only] {..       
8780: 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 20     set fileName 
8790: 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65  [file nativename
87a0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
87b0: 20 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65    [file join [ge
87c0: 74 42 69 6e 61 72 79 44 69 72 65 63 74 6f 72 79  tBinaryDirectory
87d0: 5d 20 24 70 6c 61 74 66 6f 72 6d 20 24 66 69 6c  ] $platform $fil
87e0: 65 4e 61 6d 65 4f 6e 6c 79 5d 5d 0d 0a 0d 0a 20  eNameOnly]].... 
87f0: 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 66 69           if {[fi
8800: 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c 65 4e  le exists $fileN
8810: 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ame]} then {..  
8820: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
8830: 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20   $fileName..    
8840: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
8850: 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20   }..      }.... 
8860: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
8870: 4e 4f 54 45 3a 20 54 68 65 6e 2c 20 69 6e 20 65  NOTE: Then, in e
8880: 69 74 68 65 72 20 22 61 75 74 6f 6d 61 74 69 63  ither "automatic
8890: 22 20 6f 72 20 22 73 74 61 6e 64 61 72 64 22 20  " or "standard" 
88a0: 6d 6f 64 65 73 2c 20 61 74 74 65 6d 70 74 20 74  modes, attempt t
88b0: 6f 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  o..      #      
88c0: 20 66 69 6e 64 20 74 68 65 20 73 74 61 6e 64 61   find the standa
88d0: 72 64 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72  rd SQLite librar
88e0: 79 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  y...      #..   
88f0: 20 20 20 69 66 20 7b 24 61 75 74 6f 6d 61 74 69     if {$automati
8900: 63 20 7c 7c 20 24 73 74 61 6e 64 61 72 64 7d 20  c || $standard} 
8910: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
8920: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
8930: 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 64 65  E: Attempt to de
8940: 74 65 72 6d 69 6e 65 20 74 68 65 20 6e 61 74 69  termine the nati
8950: 76 65 2d 6f 6e 6c 79 20 73 74 61 6e 64 61 72 64  ve-only standard
8960: 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79 0d   SQLite library.
8970: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
8980: 20 66 69 6c 65 20 6e 61 6d 65 20 66 6f 72 20 74   file name for t
8990: 68 69 73 20 70 6c 61 74 66 6f 72 6d 20 61 6e 64  his platform and
89a0: 20 74 68 65 6e 20 72 65 74 75 72 6e 20 69 74 2e   then return it.
89b0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
89c0: 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c       foreach fil
89d0: 65 4e 61 6d 65 4f 6e 6c 79 20 5b 67 65 74 4e 61  eNameOnly [getNa
89e0: 74 69 76 65 4c 69 62 72 61 72 79 46 69 6c 65 4e  tiveLibraryFileN
89f0: 61 6d 65 73 4f 6e 6c 79 5d 20 7b 0d 0a 20 20 20  amesOnly] {..   
8a00: 20 20 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e         set fileN
8a10: 61 6d 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65  ame [file native
8a20: 6e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  name \..        
8a30: 20 20 20 20 20 20 5b 66 69 6c 65 20 6a 6f 69 6e        [file join
8a40: 20 5b 67 65 74 42 69 6e 61 72 79 44 69 72 65 63   [getBinaryDirec
8a50: 74 6f 72 79 5d 20 24 70 6c 61 74 66 6f 72 6d 20  tory] $platform 
8a60: 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 5d 5d 0d  $fileNameOnly]].
8a70: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  ...          if 
8a80: 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 66  {[file exists $f
8a90: 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b  ileName]} then {
8aa0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ..            re
8ab0: 74 75 72 6e 20 24 66 69 6c 65 4e 61 6d 65 0d 0a  turn $fileName..
8ac0: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
8ad0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
8ae0: 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
8af0: 20 20 23 20 4e 4f 54 45 3a 20 57 61 73 20 74 68    # NOTE: Was th
8b00: 65 20 6d 61 6e 61 67 65 64 20 61 73 73 65 6d 62  e managed assemb
8b10: 6c 79 20 63 6f 6d 70 69 6c 65 64 20 65 78 70 65  ly compiled expe
8b20: 63 74 69 6e 67 20 74 6f 20 64 65 61 6c 20 77 69  cting to deal wi
8b30: 74 68 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20  th the..      # 
8b40: 20 20 20 20 20 20 73 74 61 6e 64 61 72 64 20 63        standard c
8b50: 6f 72 65 20 6c 69 62 72 61 72 79 3f 0d 0a 20 20  ore library?..  
8b60: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
8b70: 7b 5b 68 61 76 65 53 51 4c 69 74 65 44 65 66 69  {[haveSQLiteDefi
8b80: 6e 65 43 6f 6e 73 74 61 6e 74 20 53 51 4c 49 54  neConstant SQLIT
8b90: 45 5f 53 54 41 4e 44 41 52 44 5d 7d 20 74 68 65  E_STANDARD]} the
8ba0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
8bb0: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
8bc0: 46 61 6c 6c 62 61 63 6b 20 74 6f 20 72 65 74 75  Fallback to retu
8bd0: 72 6e 69 6e 67 20 74 68 65 20 6e 61 74 69 76 65  rning the native
8be0: 2d 6f 6e 6c 79 20 73 74 61 6e 64 61 72 64 20 53  -only standard S
8bf0: 51 4c 69 74 65 20 6c 69 62 72 61 72 79 0d 0a 20  QLite library.. 
8c00: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 66         #       f
8c10: 69 6c 65 20 6e 61 6d 65 20 66 6f 72 20 74 68 65  ile name for the
8c20: 20 70 6c 61 74 66 6f 72 6d 2e 0d 0a 20 20 20 20   platform...    
8c30: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73      #..        s
8c40: 65 74 20 66 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79  et fileNamesOnly
8c50: 20 5b 67 65 74 4e 61 74 69 76 65 4c 69 62 72 61   [getNativeLibra
8c60: 72 79 46 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79 5d  ryFileNamesOnly]
8c70: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b  ....        if {
8c80: 5b 6c 6c 65 6e 67 74 68 20 24 66 69 6c 65 4e 61  [llength $fileNa
8c90: 6d 65 73 4f 6e 6c 79 5d 20 3d 3d 20 30 7d 20 74  mesOnly] == 0} t
8ca0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
8cb0: 20 72 65 74 75 72 6e 20 22 22 0d 0a 20 20 20 20   return ""..    
8cc0: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
8cd0: 20 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 6e 61   return [file na
8ce0: 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a  tivename [file j
8cf0: 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  oin \..         
8d00: 20 20 20 5b 67 65 74 42 69 6e 61 72 79 44 69 72     [getBinaryDir
8d10: 65 63 74 6f 72 79 5d 20 24 70 6c 61 74 66 6f 72  ectory] $platfor
8d20: 6d 20 5b 6c 69 6e 64 65 78 20 24 66 69 6c 65 4e  m [lindex $fileN
8d30: 61 6d 65 73 4f 6e 6c 79 20 30 5d 5d 5d 0d 0a 20  amesOnly 0]]].. 
8d40: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
8d50: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
8d60: 20 20 23 20 4e 4f 54 45 3a 20 46 61 6c 6c 62 61    # NOTE: Fallba
8d70: 63 6b 20 74 6f 20 72 65 74 75 72 6e 69 6e 67 20  ck to returning 
8d80: 74 68 65 20 6e 61 74 69 76 65 2d 6f 6e 6c 79 20  the native-only 
8d90: 69 6e 74 65 72 6f 70 20 61 73 73 65 6d 62 6c 79  interop assembly
8da0: 20 66 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 23   file..        #
8db0: 20 20 20 20 20 20 20 6e 61 6d 65 20 66 6f 72 20         name for 
8dc0: 74 68 65 20 70 6c 61 74 66 6f 72 6d 2e 0d 0a 20  the platform... 
8dd0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
8de0: 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 73 4f    set fileNamesO
8df0: 6e 6c 79 20 5b 67 65 74 49 6e 74 65 72 6f 70 41  nly [getInteropA
8e00: 73 73 65 6d 62 6c 79 46 69 6c 65 4e 61 6d 65 73  ssemblyFileNames
8e10: 4f 6e 6c 79 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  Only]....       
8e20: 20 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 66   if {[llength $f
8e30: 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79 5d 20 3d 3d  ileNamesOnly] ==
8e40: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
8e50: 20 20 20 20 20 20 72 65 74 75 72 6e 20 22 22 0d        return "".
8e60: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
8e70: 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 66 69        return [fi
8e80: 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66  le nativename [f
8e90: 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20  ile join \..    
8ea0: 20 20 20 20 20 20 20 20 5b 67 65 74 42 69 6e 61          [getBina
8eb0: 72 79 44 69 72 65 63 74 6f 72 79 5d 20 24 70 6c  ryDirectory] $pl
8ec0: 61 74 66 6f 72 6d 20 5b 6c 69 6e 64 65 78 20 24  atform [lindex $
8ed0: 66 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79 20 30 5d  fileNamesOnly 0]
8ee0: 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  ]]..      }..   
8ef0: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
8f00: 67 65 74 43 6f 6d 6d 6f 6e 44 69 72 65 63 74 6f  getCommonDirecto
8f10: 72 79 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23  ry {} {..      #
8f20: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
8f30: 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 72  This procedure r
8f40: 65 74 75 72 6e 73 20 74 68 65 20 64 69 72 65 63  eturns the direc
8f50: 74 6f 72 79 20 77 68 65 72 65 20 74 68 65 20 74  tory where the t
8f60: 65 73 74 20 73 63 72 69 70 74 73 0d 0a 20 20 20  est scripts..   
8f70: 20 20 20 23 20 20 20 20 20 20 20 73 68 6f 75 6c     #       shoul
8f80: 64 20 62 65 20 6c 6f 63 61 74 65 64 2e 20 20 42  d be located.  B
8f90: 79 20 64 65 66 61 75 6c 74 2c 20 74 68 69 73 20  y default, this 
8fa0: 6a 75 73 74 20 72 65 74 75 72 6e 73 20 74 68 65  just returns the
8fb0: 20 45 61 67 6c 65 0d 0a 20 20 20 20 20 20 23 20   Eagle..      # 
8fc0: 20 20 20 20 20 20 62 69 6e 61 72 79 20 64 69 72        binary dir
8fd0: 65 63 74 6f 72 79 2e 0d 0a 20 20 20 20 20 20 23  ectory...      #
8fe0: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66  ..      if {[inf
8ff0: 6f 20 65 78 69 73 74 73 20 3a 3a 63 6f 6d 6d 6f  o exists ::commo
9000: 6e 5f 64 69 72 65 63 74 6f 72 79 5d 20 26 26 20  n_directory] && 
9010: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74  \..          [st
9020: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 63  ring length $::c
9030: 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79 5d  ommon_directory]
9040: 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
9050: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
9060: 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c 6f 63   # NOTE: The loc
9070: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6d  ation of the com
9080: 6d 6f 6e 20 64 69 72 65 63 74 6f 72 79 20 68 61  mon directory ha
9090: 73 20 62 65 65 6e 20 73 65 74 3b 0d 0a 20 20 20  s been set;..   
90a0: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
90b0: 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74 2e 0d  refore, use it..
90c0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
90d0: 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 63 6f      return $::co
90e0: 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79 0d 0a  mmon_directory..
90f0: 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b        } elseif {
9100: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 76  [info exists ::v
9110: 65 6e 64 6f 72 5f 64 69 72 65 63 74 6f 72 79 5d  endor_directory]
9120: 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
9130: 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20   [string length 
9140: 24 3a 3a 76 65 6e 64 6f 72 5f 64 69 72 65 63 74  $::vendor_direct
9150: 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ory] > 0} then {
9160: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
9170: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65       # NOTE: The
9180: 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65   location of the
9190: 20 76 65 6e 64 6f 72 20 64 69 72 65 63 74 6f 72   vendor director
91a0: 79 20 68 61 73 20 62 65 65 6e 20 73 65 74 3b 0d  y has been set;.
91b0: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
91c0: 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20   therefore, use 
91d0: 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  it...        #..
91e0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24          return $
91f0: 3a 3a 76 65 6e 64 6f 72 5f 64 69 72 65 63 74 6f  ::vendor_directo
9200: 72 79 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  ry..      } else
9210: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
9220: 20 3a 3a 74 63 6c 5f 6c 69 62 72 61 72 79 5d 20   ::tcl_library] 
9230: 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
9240: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
9250: 3a 3a 74 63 6c 5f 6c 69 62 72 61 72 79 5d 20 3e  ::tcl_library] >
9260: 20 30 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20   0 && \..       
9270: 20 20 20 5b 66 69 6c 65 20 69 73 64 69 72 65 63     [file isdirec
9280: 74 6f 72 79 20 24 3a 3a 74 63 6c 5f 6c 69 62 72  tory $::tcl_libr
9290: 61 72 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ary]} then {..  
92a0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
92b0: 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 76 61 72   # NOTE: The var
92c0: 69 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 6c  iable with the l
92d0: 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73  ocation of the s
92e0: 63 72 69 70 74 20 6c 69 62 72 61 72 79 20 69 73  cript library is
92f0: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
9300: 20 20 73 65 74 20 61 6e 64 20 61 70 70 65 61 72    set and appear
9310: 73 20 74 6f 20 62 65 20 61 20 72 65 61 6c 20 64  s to be a real d
9320: 69 72 65 63 74 6f 72 79 20 28 69 2e 65 2e 20 6e  irectory (i.e. n
9330: 6f 74 20 65 6d 62 65 64 64 65 64 0d 0a 20 20 20  ot embedded..   
9340: 20 20 20 20 20 23 20 20 20 20 20 20 20 77 69 74       #       wit
9350: 68 69 6e 20 61 20 66 69 6c 65 29 3b 20 74 68 65  hin a file); the
9360: 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74 2e 0d  refore, use it..
9370: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
9380: 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 74 63      return $::tc
9390: 6c 5f 6c 69 62 72 61 72 79 0d 0a 20 20 20 20 20  l_library..     
93a0: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
93b0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
93c0: 4e 4f 54 45 3a 20 46 61 6c 6c 62 61 63 6b 20 74  NOTE: Fallback t
93d0: 6f 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  o the directory 
93e0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 65  containing the e
93f0: 78 65 63 75 74 61 62 6c 65 2e 0d 0a 20 20 20 20  xecutable...    
9400: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
9410: 65 74 75 72 6e 20 5b 69 6e 66 6f 20 62 69 6e 61  eturn [info bina
9420: 72 79 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  ry]..      }..  
9430: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
9440: 20 67 65 74 44 61 74 61 62 61 73 65 44 69 72 65   getDatabaseDire
9450: 63 74 6f 72 79 20 7b 7d 20 7b 0d 0a 20 20 20 20  ctory {} {..    
9460: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
9470: 45 3a 20 54 68 69 73 20 70 72 6f 63 65 64 75 72  E: This procedur
9480: 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 64 69  e returns the di
9490: 72 65 63 74 6f 72 79 20 77 68 65 72 65 20 74 68  rectory where th
94a0: 65 20 74 65 73 74 20 64 61 74 61 62 61 73 65 73  e test databases
94b0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
94c0: 73 68 6f 75 6c 64 20 62 65 20 6c 6f 63 61 74 65  should be locate
94d0: 64 2e 20 20 42 79 20 64 65 66 61 75 6c 74 2c 20  d.  By default, 
94e0: 74 68 69 73 20 6a 75 73 74 20 75 73 65 73 20 74  this just uses t
94f0: 68 65 20 74 65 6d 70 6f 72 61 72 79 0d 0a 20 20  he temporary..  
9500: 20 20 20 20 23 20 20 20 20 20 20 20 64 69 72 65      #       dire
9510: 63 74 6f 72 79 20 63 6f 6e 66 69 67 75 72 65 64  ctory configured
9520: 20 66 6f 72 20 74 68 69 73 20 73 79 73 74 65 6d   for this system
9530: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
9540: 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73    if {[info exis
9550: 74 73 20 3a 3a 64 61 74 61 62 61 73 65 5f 64 69  ts ::database_di
9560: 72 65 63 74 6f 72 79 5d 20 26 26 20 5c 0d 0a 20  rectory] && \.. 
9570: 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67           [string
9580: 20 6c 65 6e 67 74 68 20 24 3a 3a 64 61 74 61 62   length $::datab
9590: 61 73 65 5f 64 69 72 65 63 74 6f 72 79 5d 20 3e  ase_directory] >
95a0: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
95b0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
95c0: 20 4e 4f 54 45 3a 20 54 68 65 20 6c 6f 63 61 74   NOTE: The locat
95d0: 69 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61 62  ion of the datab
95e0: 61 73 65 20 64 69 72 65 63 74 6f 72 79 20 68 61  ase directory ha
95f0: 73 20 62 65 65 6e 20 6f 76 65 72 72 69 64 64 65  s been overridde
9600: 6e 3b 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  n;..        #   
9610: 20 20 20 20 74 68 65 72 65 66 6f 72 65 2c 20 75      therefore, u
9620: 73 65 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20  se it...        
9630: 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  #..        retur
9640: 6e 20 24 3a 3a 64 61 74 61 62 61 73 65 5f 64 69  n $::database_di
9650: 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d  rectory..      }
9660: 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20 65   elseif {[info e
9670: 78 69 73 74 73 20 3a 3a 73 63 72 61 74 63 68 5f  xists ::scratch_
9680: 64 69 72 65 63 74 6f 72 79 5d 20 26 26 20 5c 0d  directory] && \.
9690: 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69  .          [stri
96a0: 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 73 63 72  ng length $::scr
96b0: 61 74 63 68 5f 64 69 72 65 63 74 6f 72 79 5d 20  atch_directory] 
96c0: 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
96d0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
96e0: 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c 6f 63 61  # NOTE: The loca
96f0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 63 72 61  tion of the scra
9700: 74 63 68 20 64 69 72 65 63 74 6f 72 79 20 68 61  tch directory ha
9710: 73 20 62 65 65 6e 20 6f 76 65 72 72 69 64 64 65  s been overridde
9720: 6e 3b 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  n;..        #   
9730: 20 20 20 20 74 68 65 72 65 66 6f 72 65 2c 20 75      therefore, u
9740: 73 65 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20  se it...        
9750: 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  #..        retur
9760: 6e 20 24 3a 3a 73 63 72 61 74 63 68 5f 64 69 72  n $::scratch_dir
9770: 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20  ectory..      } 
9780: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
9790: 72 65 74 75 72 6e 20 5b 67 65 74 54 65 6d 70 6f  return [getTempo
97a0: 72 61 72 79 50 61 74 68 5d 0d 0a 20 20 20 20 20  raryPath]..     
97b0: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
97c0: 20 20 70 72 6f 63 20 67 65 74 54 65 6d 70 6f 72    proc getTempor
97d0: 61 72 79 44 69 72 65 63 74 6f 72 79 20 7b 7d 20  aryDirectory {} 
97e0: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
97f0: 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 70    # NOTE: This p
9800: 72 6f 63 65 64 75 72 65 20 72 65 74 75 72 6e 73  rocedure returns
9810: 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 77   the directory w
9820: 68 65 72 65 20 74 68 65 20 74 65 6d 70 6f 72 61  here the tempora
9830: 72 79 20 66 69 6c 65 73 0d 0a 20 20 20 20 20 20  ry files..      
9840: 23 20 20 20 20 20 20 20 73 68 6f 75 6c 64 20 62  #       should b
9850: 65 20 6c 6f 63 61 74 65 64 2e 20 20 42 79 20 64  e located.  By d
9860: 65 66 61 75 6c 74 2c 20 74 68 69 73 20 6a 75 73  efault, this jus
9870: 74 20 75 73 65 73 20 74 68 65 20 74 65 6d 70 6f  t uses the tempo
9880: 72 61 72 79 0d 0a 20 20 20 20 20 20 23 20 20 20  rary..      #   
9890: 20 20 20 20 64 69 72 65 63 74 6f 72 79 20 63 6f      directory co
98a0: 6e 66 69 67 75 72 65 64 20 66 6f 72 20 74 68 69  nfigured for thi
98b0: 73 20 73 79 73 74 65 6d 2e 0d 0a 20 20 20 20 20  s system...     
98c0: 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69   #..      if {[i
98d0: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 6d  nfo exists ::tem
98e0: 70 6f 72 61 72 79 5f 64 69 72 65 63 74 6f 72 79  porary_directory
98f0: 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
9900: 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
9910: 20 24 3a 3a 74 65 6d 70 6f 72 61 72 79 5f 64 69   $::temporary_di
9920: 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68  rectory] > 0} th
9930: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
9940: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
9950: 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66   The location of
9960: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 64   the temporary d
9970: 69 72 65 63 74 6f 72 79 20 68 61 73 20 62 65 65  irectory has bee
9980: 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b 0d 0a 20  n overridden;.. 
9990: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74         #       t
99a0: 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74  herefore, use it
99b0: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
99c0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a        return $::
99d0: 74 65 6d 70 6f 72 61 72 79 5f 64 69 72 65 63 74  temporary_direct
99e0: 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  ory..      } els
99f0: 65 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74  eif {[info exist
9a00: 73 20 3a 3a 73 63 72 61 74 63 68 5f 64 69 72 65  s ::scratch_dire
9a10: 63 74 6f 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20  ctory] && \..   
9a20: 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c         [string l
9a30: 65 6e 67 74 68 20 24 3a 3a 73 63 72 61 74 63 68  ength $::scratch
9a40: 5f 64 69 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d  _directory] > 0}
9a50: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
9a60: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
9a70: 54 45 3a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e  TE: The location
9a80: 20 6f 66 20 74 68 65 20 73 63 72 61 74 63 68 20   of the scratch 
9a90: 64 69 72 65 63 74 6f 72 79 20 68 61 73 20 62 65  directory has be
9aa0: 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b 0d 0a  en overridden;..
9ab0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
9ac0: 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69  therefore, use i
9ad0: 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  t...        #.. 
9ae0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a         return $:
9af0: 3a 73 63 72 61 74 63 68 5f 64 69 72 65 63 74 6f  :scratch_directo
9b00: 72 79 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  ry..      } else
9b10: 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   {..        retu
9b20: 72 6e 20 5b 67 65 74 54 65 6d 70 6f 72 61 72 79  rn [getTemporary
9b30: 50 61 74 68 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a  Path]..      }..
9b40: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
9b50: 6f 63 20 67 65 74 45 78 65 63 75 74 65 4f 6e 53  oc getExecuteOnS
9b60: 65 74 75 70 20 7b 7d 20 7b 0d 0a 20 20 20 20 20  etup {} {..     
9b70: 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
9b80: 73 20 3a 3a 65 78 65 63 75 74 65 5f 6f 6e 5f 73  s ::execute_on_s
9b90: 65 74 75 70 5d 20 26 26 20 5c 0d 0a 20 20 20 20  etup] && \..    
9ba0: 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65        [string le
9bb0: 6e 67 74 68 20 24 3a 3a 65 78 65 63 75 74 65 5f  ngth $::execute_
9bc0: 6f 6e 5f 73 65 74 75 70 5d 20 3e 20 30 7d 20 74  on_setup] > 0} t
9bd0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
9be0: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
9bf0: 3a 20 52 65 74 75 72 6e 20 74 68 65 20 63 6f 6e  : Return the con
9c00: 66 69 67 75 72 65 64 20 53 51 4c 20 74 6f 20 65  figured SQL to e
9c10: 78 65 63 75 74 65 20 64 75 72 69 6e 67 20 74 68  xecute during th
9c20: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0d 0a 20 20  e connection..  
9c30: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73 65        #       se
9c40: 74 75 70 20 70 72 6f 63 65 64 75 72 65 20 28 69  tup procedure (i
9c50: 2e 65 2e 20 66 6f 72 20 65 76 65 72 79 20 74 65  .e. for every te
9c60: 73 74 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  st database conn
9c70: 65 63 74 69 6f 6e 29 2e 0d 0a 20 20 20 20 20 20  ection)...      
9c80: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
9c90: 75 72 6e 20 24 3a 3a 65 78 65 63 75 74 65 5f 6f  urn $::execute_o
9ca0: 6e 5f 73 65 74 75 70 0d 0a 20 20 20 20 20 20 7d  n_setup..      }
9cb0: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
9cc0: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
9cd0: 54 45 3a 20 42 79 20 64 65 66 61 75 6c 74 2c 20  TE: By default, 
9ce0: 74 68 65 72 65 20 69 73 20 6e 6f 20 53 51 4c 20  there is no SQL 
9cf0: 74 6f 20 65 78 65 63 75 74 65 20 64 75 72 69 6e  to execute durin
9d00: 67 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  g the connection
9d10: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
9d20: 20 20 73 65 74 75 70 20 70 72 6f 63 65 64 75 72    setup procedur
9d30: 65 20 28 69 2e 65 2e 20 66 6f 72 20 65 76 65 72  e (i.e. for ever
9d40: 79 20 74 65 73 74 20 64 61 74 61 62 61 73 65 20  y test database 
9d50: 63 6f 6e 6e 65 63 74 69 6f 6e 29 2e 0d 0a 20 20  connection)...  
9d60: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
9d70: 20 72 65 74 75 72 6e 20 22 22 0d 0a 20 20 20 20   return ""..    
9d80: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
9d90: 20 20 20 70 72 6f 63 20 67 65 74 53 74 72 69 6e     proc getStrin
9da0: 67 4d 61 70 46 6f 72 54 63 6c 45 73 63 61 70 65  gMapForTclEscape
9db0: 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 72 65 74   {} {..      ret
9dc0: 75 72 6e 20 5b 6c 69 73 74 20 5c 5c 20 5c 5c 5c  urn [list \\ \\\
9dd0: 5c 20 5c 5b 20 5c 5c 5c 5b 20 5c 5d 20 5c 5c 5c  \ \[ \\\[ \] \\\
9de0: 5d 20 5c 24 20 5c 5c 5c 24 5d 0d 0a 20 20 20 20  ] \$ \\\$]..    
9df0: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67  }.....    proc g
9e00: 65 74 54 65 73 74 4f 76 65 72 72 69 64 65 73 50  etTestOverridesP
9e10: 72 65 61 6d 62 6c 65 20 7b 20 7b 65 78 74 72 61  reamble { {extra
9e20: 56 61 72 4e 61 6d 65 73 20 22 22 7d 20 7d 20 7b  VarNames ""} } {
9e30: 0d 0a 20 20 20 20 20 20 73 65 74 20 76 61 72 4e  ..      set varN
9e40: 61 6d 65 73 20 5b 6c 69 73 74 5d 0d 0a 0d 0a 20  ames [list].... 
9e50: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
9e60: 4e 4f 54 45 3a 20 49 66 20 61 76 61 69 6c 61 62  NOTE: If availab
9e70: 6c 65 2c 20 73 74 61 72 74 20 77 69 74 68 20 74  le, start with t
9e80: 68 65 20 6d 61 73 74 65 72 20 6c 69 73 74 20 6f  he master list o
9e90: 66 20 74 65 73 74 20 6f 76 65 72 72 69 64 65 0d  f test override.
9ea0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 76  .      #       v
9eb0: 61 72 69 61 62 6c 65 73 2e 0d 0a 20 20 20 20 20  ariables...     
9ec0: 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69   #..      if {[i
9ed0: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 73  nfo exists ::tes
9ee0: 74 5f 6f 76 65 72 72 69 64 65 73 5d 20 26 26 20  t_overrides] && 
9ef0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 6c 6c  \..          [ll
9f00: 65 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f 6f 76  ength $::test_ov
9f10: 65 72 72 69 64 65 73 5d 20 3e 20 30 7d 20 74 68  errides] > 0} th
9f20: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 65 76  en {..        ev
9f30: 61 6c 20 6c 61 70 70 65 6e 64 20 76 61 72 4e 61  al lappend varNa
9f40: 6d 65 73 20 24 3a 3a 74 65 73 74 5f 6f 76 65 72  mes $::test_over
9f50: 72 69 64 65 73 0d 0a 20 20 20 20 20 20 7d 0d 0a  rides..      }..
9f60: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
9f70: 20 23 20 4e 4f 54 45 3a 20 49 66 20 72 65 71 75   # NOTE: If requ
9f80: 65 73 74 65 64 20 62 79 20 6f 75 72 20 63 61 6c  ested by our cal
9f90: 6c 65 72 2c 20 61 64 64 20 61 6e 79 20 61 64 64  ler, add any add
9fa0: 69 74 69 6f 6e 61 6c 20 76 61 72 69 61 62 6c 65  itional variable
9fb0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
9fc0: 6e 61 6d 65 73 20 74 6f 20 63 6f 70 79 20 6e 6f  names to copy no
9fd0: 77 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  w...      #..   
9fe0: 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20     if {[llength 
9ff0: 24 65 78 74 72 61 56 61 72 4e 61 6d 65 73 5d 20  $extraVarNames] 
a000: 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
a010: 20 20 20 20 20 65 76 61 6c 20 6c 61 70 70 65 6e       eval lappen
a020: 64 20 76 61 72 4e 61 6d 65 73 20 24 65 78 74 72  d varNames $extr
a030: 61 56 61 72 4e 61 6d 65 73 0d 0a 20 20 20 20 20  aVarNames..     
a040: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   }....      #.. 
a050: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69       # NOTE: Bui
a060: 6c 64 20 74 68 65 20 73 63 72 69 70 74 20 66 72  ld the script fr
a070: 61 67 6d 65 6e 74 20 74 6f 20 62 65 20 72 65 74  agment to be ret
a080: 75 72 6e 65 64 20 62 79 20 70 72 6f 63 65 73 73  urned by process
a090: 69 6e 67 20 65 61 63 68 0d 0a 20 20 20 20 20 20  ing each..      
a0a0: 23 20 20 20 20 20 20 20 76 61 72 69 61 62 6c 65  #       variable
a0b0: 20 6e 61 6d 65 20 61 6e 64 20 61 64 64 69 6e 67   name and adding
a0c0: 20 74 68 65 20 6e 65 63 65 63 65 73 73 61 72 79   the nececessary
a0d0: 20 73 63 72 69 70 74 20 66 72 61 67 6d 65 6e 74   script fragment
a0e0: 73 20 66 6f 72 0d 0a 20 20 20 20 20 20 23 20 20  s for..      #  
a0f0: 20 20 20 20 20 65 61 63 68 20 6f 6e 65 2e 0d 0a       each one...
a100: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73        #..      s
a110: 65 74 20 72 65 73 75 6c 74 20 22 22 0d 0a 0d 0a  et result ""....
a120: 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 76 61        foreach va
a130: 72 4e 61 6d 65 20 24 76 61 72 4e 61 6d 65 73 20  rName $varNames 
a140: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
a150: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75        # NOTE: Bu
a160: 69 6c 64 20 74 68 65 20 71 75 61 6c 69 66 69 65  ild the qualifie
a170: 64 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c  d global variabl
a180: 65 20 6e 61 6d 65 2e 0d 0a 20 20 20 20 20 20 20  e name...       
a190: 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   #..        set 
a1a0: 66 75 6c 6c 56 61 72 4e 61 6d 65 20 5b 61 70 70  fullVarName [app
a1b0: 65 6e 64 41 72 67 73 20 3a 3a 20 24 76 61 72 4e  endArgs :: $varN
a1c0: 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ame]....        
a1d0: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
a1e0: 45 3a 20 44 6f 65 73 20 74 68 65 20 76 61 72 69  E: Does the vari
a1f0: 61 62 6c 65 20 65 78 69 73 74 20 69 6e 20 74 68  able exist in th
a200: 69 73 20 69 6e 74 65 72 70 72 65 74 65 72 20 63  is interpreter c
a210: 6f 6e 74 65 78 74 3f 0d 0a 20 20 20 20 20 20 20  ontext?..       
a220: 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   #..        if {
a230: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 24 66 75  [info exists $fu
a240: 6c 6c 56 61 72 4e 61 6d 65 5d 7d 20 74 68 65 6e  llVarName]} then
a250: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d   {..          #.
a260: 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
a270: 45 3a 20 41 70 70 65 6e 64 20 61 20 73 63 72 69  E: Append a scri
a280: 70 74 20 66 72 61 67 6d 65 6e 74 20 74 6f 20 74  pt fragment to t
a290: 68 65 20 72 65 73 75 6c 74 20 74 68 61 74 20 77  he result that w
a2a0: 69 6c 6c 20 63 6f 72 72 65 63 74 6c 79 0d 0a 20  ill correctly.. 
a2b0: 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
a2c0: 20 63 6f 70 79 20 61 6e 79 20 63 6f 6e 74 61 69   copy any contai
a2d0: 6e 65 64 20 76 61 6c 75 65 20 74 6f 20 61 6e 6f  ned value to ano
a2e0: 74 68 65 72 20 69 6e 74 65 72 70 72 65 74 65 72  ther interpreter
a2f0: 20 63 6f 6e 74 65 78 74 2e 0d 0a 20 20 20 20 20   context...     
a300: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
a310: 20 20 61 70 70 65 6e 64 20 72 65 73 75 6c 74 20    append result 
a320: 5c 6e 20 22 73 65 74 20 22 20 24 66 75 6c 6c 56  \n "set " $fullV
a330: 61 72 4e 61 6d 65 20 22 20 5c 7b 22 20 5b 73 74  arName " \{" [st
a340: 72 69 6e 67 20 6d 61 70 20 5c 0d 0a 20 20 20 20  ring map \..    
a350: 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 53 74            [getSt
a360: 72 69 6e 67 4d 61 70 46 6f 72 54 63 6c 45 73 63  ringMapForTclEsc
a370: 61 70 65 5d 20 5b 73 65 74 20 24 66 75 6c 6c 56  ape] [set $fullV
a380: 61 72 4e 61 6d 65 5d 5d 20 5c 7d 0d 0a 20 20 20  arName]] \}..   
a390: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
a3a0: 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
a3b0: 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 74 68 65    # NOTE: If the
a3c0: 20 72 65 73 75 6c 74 20 63 6f 6e 74 61 69 6e 73   result contains
a3d0: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73 63 72   one or more scr
a3e0: 69 70 74 20 66 72 61 67 6d 65 6e 74 73 2c 20 61  ipt fragments, a
a3f0: 70 70 65 6e 64 20 61 0d 0a 20 20 20 20 20 20 23  ppend a..      #
a400: 20 20 20 20 20 20 20 6e 65 77 6c 69 6e 65 2e 0d         newline..
a410: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
a420: 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
a430: 74 68 20 24 72 65 73 75 6c 74 5d 20 3e 20 30 7d  th $result] > 0}
a440: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
a450: 20 61 70 70 65 6e 64 20 72 65 73 75 6c 74 20 5c   append result \
a460: 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  n..      }....  
a470: 20 20 20 20 72 65 74 75 72 6e 20 24 72 65 73 75      return $resu
a480: 6c 74 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  lt..    }.....  
a490: 20 20 70 72 6f 63 20 6d 6f 76 65 53 79 73 74 65    proc moveSyste
a4a0: 6d 44 61 74 61 53 51 4c 69 74 65 44 6c 6c 43 6f  mDataSQLiteDllCo
a4b0: 6e 66 69 67 20 7b 20 7b 72 65 73 74 6f 72 65 20  nfig { {restore 
a4c0: 66 61 6c 73 65 7d 20 7b 76 65 72 62 6f 73 65 20  false} {verbose 
a4d0: 74 72 75 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  true} } {..     
a4e0: 20 73 65 74 20 64 69 72 65 63 74 6f 72 79 20 5b   set directory [
a4f0: 67 65 74 42 69 6e 61 72 79 44 69 72 65 63 74 6f  getBinaryDirecto
a500: 72 79 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20  ry]....      if 
a510: 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
a520: 24 64 69 72 65 63 74 6f 72 79 5d 20 3d 3d 20 30  $directory] == 0
a530: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
a540: 20 20 69 66 20 7b 24 76 65 72 62 6f 73 65 7d 20    if {$verbose} 
a550: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
a560: 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
a570: 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
a580: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
a590: 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6b 69 70 70       "---- skipp
a5a0: 65 64 20 6d 6f 76 69 6e 67 20 5c 22 53 79 73 74  ed moving \"Syst
a5b0: 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64  em.Data.SQLite.d
a5c0: 6c 6c 2e 63 6f 6e 66 69 67 5c 22 2c 20 22 20 5c  ll.config\", " \
a5d0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
a5e0: 22 6e 6f 20 62 69 6e 61 72 79 20 64 69 72 65 63  "no binary direc
a5f0: 74 6f 72 79 5c 6e 22 5d 0d 0a 20 20 20 20 20 20  tory\n"]..      
a600: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 72    }....        r
a610: 65 74 75 72 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a  eturn..      }..
a620: 0d 0a 20 20 20 20 20 20 73 65 74 20 66 69 6c 65  ..      set file
a630: 4e 61 6d 65 28 31 29 20 5b 66 69 6c 65 20 6e 6f  Name(1) [file no
a640: 72 6d 61 6c 69 7a 65 20 5c 0d 0a 20 20 20 20 20  rmalize \..     
a650: 20 20 20 20 20 5b 66 69 6c 65 20 6a 6f 69 6e 20       [file join 
a660: 24 64 69 72 65 63 74 6f 72 79 20 53 79 73 74 65  $directory Syste
a670: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c  m.Data.SQLite.dl
a680: 6c 2e 63 6f 6e 66 69 67 5d 5d 0d 0a 0d 0a 20 20  l.config]]....  
a690: 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65      set fileName
a6a0: 28 32 29 20 5b 61 70 70 65 6e 64 41 72 67 73 20  (2) [appendArgs 
a6b0: 24 66 69 6c 65 4e 61 6d 65 28 31 29 20 2e 6d 6f  $fileName(1) .mo
a6c0: 76 65 64 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66  ved]....      if
a6d0: 20 7b 24 72 65 73 74 6f 72 65 7d 20 74 68 65 6e   {$restore} then
a6e0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   {..        if {
a6f0: 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 66 69  [file exists $fi
a700: 6c 65 4e 61 6d 65 28 32 29 5d 7d 20 74 68 65 6e  leName(2)]} then
a710: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 66 69   {..          fi
a720: 6c 65 20 72 65 6e 61 6d 65 20 24 66 69 6c 65 4e  le rename $fileN
a730: 61 6d 65 28 32 29 20 24 66 69 6c 65 4e 61 6d 65  ame(2) $fileName
a740: 28 31 29 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  (1)....         
a750: 20 69 66 20 7b 24 76 65 72 62 6f 73 65 7d 20 74   if {$verbose} t
a760: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
a770: 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
a780: 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
a790: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
a7a0: 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6d 6f          "---- mo
a7b0: 76 65 64 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d  ved \"" $fileNam
a7c0: 65 28 32 29 20 22 5c 22 20 74 6f 20 5c 22 22 20  e(2) "\" to \"" 
a7d0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
a7e0: 20 20 20 24 66 69 6c 65 4e 61 6d 65 28 31 29 20     $fileName(1) 
a7f0: 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  \"\n]..         
a800: 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c   }..        } el
a810: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
a820: 69 66 20 7b 24 76 65 72 62 6f 73 65 7d 20 74 68  if {$verbose} th
a830: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
a840: 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
a850: 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
a860: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
a870: 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6b 69         "---- ski
a880: 70 70 65 64 20 6d 6f 76 69 6e 67 20 5c 22 22 20  pped moving \"" 
a890: 24 66 69 6c 65 4e 61 6d 65 28 32 29 20 5c 0d 0a  $fileName(2) \..
a8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a8b0: 22 5c 22 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74  "\", it does not
a8c0: 20 65 78 69 73 74 5c 6e 22 5d 0d 0a 20 20 20 20   exist\n"]..    
a8d0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
a8e0: 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65   }..      } else
a8f0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   {..        if {
a900: 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 66 69  [file exists $fi
a910: 6c 65 4e 61 6d 65 28 31 29 5d 7d 20 74 68 65 6e  leName(1)]} then
a920: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 66 69   {..          fi
a930: 6c 65 20 72 65 6e 61 6d 65 20 24 66 69 6c 65 4e  le rename $fileN
a940: 61 6d 65 28 31 29 20 24 66 69 6c 65 4e 61 6d 65  ame(1) $fileName
a950: 28 32 29 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  (2)....         
a960: 20 69 66 20 7b 24 76 65 72 62 6f 73 65 7d 20 74   if {$verbose} t
a970: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
a980: 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
a990: 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
a9a0: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
a9b0: 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6d 6f          "---- mo
a9c0: 76 65 64 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d  ved \"" $fileNam
a9d0: 65 28 31 29 20 22 5c 22 20 74 6f 20 5c 22 22 20  e(1) "\" to \"" 
a9e0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
a9f0: 20 20 20 24 66 69 6c 65 4e 61 6d 65 28 32 29 20     $fileName(2) 
aa00: 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  \"\n]..         
aa10: 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c   }..        } el
aa20: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
aa30: 69 66 20 7b 24 76 65 72 62 6f 73 65 7d 20 74 68  if {$verbose} th
aa40: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
aa50: 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
aa60: 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
aa70: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
aa80: 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6b 69         "---- ski
aa90: 70 70 65 64 20 6d 6f 76 69 6e 67 20 5c 22 22 20  pped moving \"" 
aaa0: 24 66 69 6c 65 4e 61 6d 65 28 31 29 20 5c 0d 0a  $fileName(1) \..
aab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aac0: 22 5c 22 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74  "\", it does not
aad0: 20 65 78 69 73 74 5c 6e 22 5d 0d 0a 20 20 20 20   exist\n"]..    
aae0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
aaf0: 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20   }..      }..   
ab00: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
ab10: 77 72 69 74 65 53 79 73 74 65 6d 44 61 74 61 53  writeSystemDataS
ab20: 51 4c 69 74 65 44 6c 6c 43 6f 6e 66 69 67 20 7b  QLiteDllConfig {
ab30: 20 64 61 74 61 20 7b 76 65 72 62 6f 73 65 20 74   data {verbose t
ab40: 72 75 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20  rue} } {..      
ab50: 73 65 74 20 64 69 72 65 63 74 6f 72 79 20 5b 67  set directory [g
ab60: 65 74 42 69 6e 61 72 79 44 69 72 65 63 74 6f 72  etBinaryDirector
ab70: 79 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b  y]....      if {
ab80: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
ab90: 64 69 72 65 63 74 6f 72 79 5d 20 3d 3d 20 30 7d  directory] == 0}
aba0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
abb0: 20 69 66 20 7b 24 76 65 72 62 6f 73 65 7d 20 74   if {$verbose} t
abc0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
abd0: 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
abe0: 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
abf0: 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
ac00: 20 20 20 20 22 2d 2d 2d 2d 20 73 6b 69 70 70 65      "---- skippe
ac10: 64 20 6d 6f 76 69 6e 67 20 5c 22 53 79 73 74 65  d moving \"Syste
ac20: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c  m.Data.SQLite.dl
ac30: 6c 2e 63 6f 6e 66 69 67 5c 22 2c 20 22 20 5c 0d  l.config\", " \.
ac40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
ac50: 6e 6f 20 62 69 6e 61 72 79 20 64 69 72 65 63 74  no binary direct
ac60: 6f 72 79 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20  ory\n"]..       
ac70: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 72 65   }....        re
ac80: 74 75 72 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  turn..      }...
ac90: 0a 20 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e  .      set fileN
aca0: 61 6d 65 20 5b 66 69 6c 65 20 6e 6f 72 6d 61 6c  ame [file normal
acb0: 69 7a 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ize \..         
acc0: 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 64 69 72   [file join $dir
acd0: 65 63 74 6f 72 79 20 53 79 73 74 65 6d 2e 44 61  ectory System.Da
ace0: 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 2e 63 6f  ta.SQLite.dll.co
acf0: 6e 66 69 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20  nfig]]....      
ad00: 77 72 69 74 65 46 69 6c 65 20 24 66 69 6c 65 4e  writeFile $fileN
ad10: 61 6d 65 20 24 64 61 74 61 0d 0a 0d 0a 20 20 20  ame $data....   
ad20: 20 20 20 69 66 20 7b 24 76 65 72 62 6f 73 65 7d     if {$verbose}
ad30: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
ad40: 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
ad50: 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20  hannel \..      
ad60: 20 20 20 20 20 20 22 2d 2d 2d 2d 20 77 72 6f 74        "---- wrot
ad70: 65 20 5c 22 53 79 73 74 65 6d 2e 44 61 74 61 2e  e \"System.Data.
ad80: 53 51 4c 69 74 65 2e 64 6c 6c 2e 63 6f 6e 66 69  SQLite.dll.confi
ad90: 67 5c 22 5c 6e 22 0d 0a 20 20 20 20 20 20 7d 0d  g\"\n"..      }.
ada0: 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ...      return 
adb0: 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 7d  $fileName..    }
adc0: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 6d 6f  .....    proc mo
add0: 76 65 45 61 67 6c 65 53 68 65 6c 6c 4d 64 61 43  veEagleShellMdaC
ade0: 6f 6e 66 69 67 20 7b 20 7b 72 65 73 74 6f 72 65  onfig { {restore
adf0: 20 66 61 6c 73 65 7d 20 7b 76 65 72 62 6f 73 65   false} {verbose
ae00: 20 74 72 75 65 7d 20 7d 20 7b 0d 0a 20 20 20 20   true} } {..    
ae10: 20 20 73 65 74 20 64 69 72 65 63 74 6f 72 79 20    set directory 
ae20: 5b 67 65 74 42 69 6e 61 72 79 44 69 72 65 63 74  [getBinaryDirect
ae30: 6f 72 79 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66  ory]....      if
ae40: 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   {[string length
ae50: 20 24 64 69 72 65 63 74 6f 72 79 5d 20 3d 3d 20   $directory] == 
ae60: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
ae70: 20 20 20 69 66 20 7b 24 76 65 72 62 6f 73 65 7d     if {$verbose}
ae80: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
ae90: 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
aea0: 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
aeb0: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
aec0: 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6b 69 70        "---- skip
aed0: 70 65 64 20 6d 6f 76 69 6e 67 20 5c 22 45 61 67  ped moving \"Eag
aee0: 6c 65 53 68 65 6c 6c 2e 65 78 65 2e 6d 64 61 2e  leShell.exe.mda.
aef0: 63 6f 6e 66 69 67 5c 22 2c 20 22 20 5c 0d 0a 20  config\", " \.. 
af00: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 6e 6f               "no
af10: 20 62 69 6e 61 72 79 20 64 69 72 65 63 74 6f 72   binary director
af20: 79 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d  y\n"]..        }
af30: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75  ....        retu
af40: 72 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  rn..      }.... 
af50: 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d       set fileNam
af60: 65 28 31 29 20 5b 66 69 6c 65 20 6e 6f 72 6d 61  e(1) [file norma
af70: 6c 69 7a 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  lize \..        
af80: 20 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 64 69    [file join $di
af90: 72 65 63 74 6f 72 79 20 45 61 67 6c 65 53 68 65  rectory EagleShe
afa0: 6c 6c 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e 66 69  ll.exe.mda.confi
afb0: 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 73 65 74  g]]....      set
afc0: 20 66 69 6c 65 4e 61 6d 65 28 32 29 20 5b 61 70   fileName(2) [ap
afd0: 70 65 6e 64 41 72 67 73 20 24 66 69 6c 65 4e 61  pendArgs $fileNa
afe0: 6d 65 28 31 29 20 2e 6d 6f 76 65 64 5d 0d 0a 0d  me(1) .moved]...
aff0: 0a 20 20 20 20 20 20 69 66 20 7b 24 72 65 73 74  .      if {$rest
b000: 6f 72 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ore} then {..   
b010: 20 20 20 20 20 69 66 20 7b 5b 66 69 6c 65 20 65       if {[file e
b020: 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 28  xists $fileName(
b030: 32 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  2)]} then {..   
b040: 20 20 20 20 20 20 20 66 69 6c 65 20 72 65 6e 61         file rena
b050: 6d 65 20 24 66 69 6c 65 4e 61 6d 65 28 32 29 20  me $fileName(2) 
b060: 24 66 69 6c 65 4e 61 6d 65 28 31 29 0d 0a 0d 0a  $fileName(1)....
b070: 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 24 76            if {$v
b080: 65 72 62 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a  erbose} then {..
b090: 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
b0a0: 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
b0b0: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
b0c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b0d0: 20 22 2d 2d 2d 2d 20 6d 6f 76 65 64 20 5c 22 22   "---- moved \""
b0e0: 20 24 66 69 6c 65 4e 61 6d 65 28 32 29 20 22 5c   $fileName(2) "\
b0f0: 22 20 74 6f 20 5c 22 22 20 5c 0d 0a 20 20 20 20  " to \"" \..    
b100: 20 20 20 20 20 20 20 20 20 20 20 20 24 66 69 6c              $fil
b110: 65 4e 61 6d 65 28 31 29 20 5c 22 5c 6e 5d 0d 0a  eName(1) \"\n]..
b120: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
b130: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
b140: 20 20 20 20 20 20 20 20 20 69 66 20 7b 24 76 65           if {$ve
b150: 72 62 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20  rbose} then {.. 
b160: 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
b170: 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
b180: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
b190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b1a0: 22 2d 2d 2d 2d 20 73 6b 69 70 70 65 64 20 6d 6f  "---- skipped mo
b1b0: 76 69 6e 67 20 5c 22 22 20 24 66 69 6c 65 4e 61  ving \"" $fileNa
b1c0: 6d 65 28 32 29 20 5c 0d 0a 20 20 20 20 20 20 20  me(2) \..       
b1d0: 20 20 20 20 20 20 20 20 20 22 5c 22 2c 20 69 74           "\", it
b1e0: 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 5c   does not exist\
b1f0: 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  n"]..          }
b200: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
b210: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
b220: 20 20 20 20 20 69 66 20 7b 5b 66 69 6c 65 20 65       if {[file e
b230: 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 28  xists $fileName(
b240: 31 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  1)]} then {..   
b250: 20 20 20 20 20 20 20 66 69 6c 65 20 72 65 6e 61         file rena
b260: 6d 65 20 24 66 69 6c 65 4e 61 6d 65 28 31 29 20  me $fileName(1) 
b270: 24 66 69 6c 65 4e 61 6d 65 28 32 29 0d 0a 0d 0a  $fileName(2)....
b280: 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 24 76            if {$v
b290: 65 72 62 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a  erbose} then {..
b2a0: 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
b2b0: 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
b2c0: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
b2d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b2e0: 20 22 2d 2d 2d 2d 20 6d 6f 76 65 64 20 5c 22 22   "---- moved \""
b2f0: 20 24 66 69 6c 65 4e 61 6d 65 28 31 29 20 22 5c   $fileName(1) "\
b300: 22 20 74 6f 20 5c 22 22 20 5c 0d 0a 20 20 20 20  " to \"" \..    
b310: 20 20 20 20 20 20 20 20 20 20 20 20 24 66 69 6c              $fil
b320: 65 4e 61 6d 65 28 32 29 20 5c 22 5c 6e 5d 0d 0a  eName(2) \"\n]..
b330: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
b340: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
b350: 20 20 20 20 20 20 20 20 20 69 66 20 7b 24 76 65           if {$ve
b360: 72 62 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20  rbose} then {.. 
b370: 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
b380: 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
b390: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
b3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b3b0: 22 2d 2d 2d 2d 20 73 6b 69 70 70 65 64 20 6d 6f  "---- skipped mo
b3c0: 76 69 6e 67 20 5c 22 22 20 24 66 69 6c 65 4e 61  ving \"" $fileNa
b3d0: 6d 65 28 31 29 20 5c 0d 0a 20 20 20 20 20 20 20  me(1) \..       
b3e0: 20 20 20 20 20 20 20 20 20 22 5c 22 2c 20 69 74           "\", it
b3f0: 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 5c   does not exist\
b400: 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  n"]..          }
b410: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
b420: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
b430: 20 20 20 20 70 72 6f 63 20 77 72 69 74 65 45 61      proc writeEa
b440: 67 6c 65 53 68 65 6c 6c 4d 64 61 43 6f 6e 66 69  gleShellMdaConfi
b450: 67 20 7b 20 64 61 74 61 20 7b 76 65 72 62 6f 73  g { data {verbos
b460: 65 20 74 72 75 65 7d 20 7d 20 7b 0d 0a 20 20 20  e true} } {..   
b470: 20 20 20 73 65 74 20 64 69 72 65 63 74 6f 72 79     set directory
b480: 20 5b 67 65 74 42 69 6e 61 72 79 44 69 72 65 63   [getBinaryDirec
b490: 74 6f 72 79 5d 0d 0a 0d 0a 20 20 20 20 20 20 69  tory]....      i
b4a0: 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  f {[string lengt
b4b0: 68 20 24 64 69 72 65 63 74 6f 72 79 5d 20 3d 3d  h $directory] ==
b4c0: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
b4d0: 20 20 20 20 69 66 20 7b 24 76 65 72 62 6f 73 65      if {$verbose
b4e0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
b4f0: 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
b500: 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
b510: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
b520: 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6b 69         "---- ski
b530: 70 70 65 64 20 6d 6f 76 69 6e 67 20 5c 22 45 61  pped moving \"Ea
b540: 67 6c 65 53 68 65 6c 6c 2e 65 78 65 2e 6d 64 61  gleShell.exe.mda
b550: 2e 63 6f 6e 66 69 67 5c 22 2c 20 22 20 5c 0d 0a  .config\", " \..
b560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 6e                "n
b570: 6f 20 62 69 6e 61 72 79 20 64 69 72 65 63 74 6f  o binary directo
b580: 72 79 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20  ry\n"]..        
b590: 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 72 65 74  }....        ret
b5a0: 75 72 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  urn..      }....
b5b0: 20 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61        set fileNa
b5c0: 6d 65 20 5b 66 69 6c 65 20 6e 6f 72 6d 61 6c 69  me [file normali
b5d0: 7a 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ze \..          
b5e0: 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 64 69 72 65  [file join $dire
b5f0: 63 74 6f 72 79 20 45 61 67 6c 65 53 68 65 6c 6c  ctory EagleShell
b600: 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e 66 69 67 5d  .exe.mda.config]
b610: 5d 0d 0a 0d 0a 20 20 20 20 20 20 77 72 69 74 65  ]....      write
b620: 46 69 6c 65 20 24 66 69 6c 65 4e 61 6d 65 20 24  File $fileName $
b630: 64 61 74 61 0d 0a 0d 0a 20 20 20 20 20 20 69 66  data....      if
b640: 20 7b 24 76 65 72 62 6f 73 65 7d 20 74 68 65 6e   {$verbose} then
b650: 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   {..        tput
b660: 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
b670: 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  l \..           
b680: 20 22 2d 2d 2d 2d 20 77 72 6f 74 65 20 5c 22 45   "---- wrote \"E
b690: 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65 2e 6d 64  agleShell.exe.md
b6a0: 61 2e 63 6f 6e 66 69 67 5c 22 5c 6e 22 0d 0a 20  a.config\"\n".. 
b6b0: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
b6c0: 72 65 74 75 72 6e 20 24 66 69 6c 65 4e 61 6d 65  return $fileName
b6d0: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
b6e0: 70 72 6f 63 20 67 65 74 41 70 70 44 6f 6d 61 69  proc getAppDomai
b6f0: 6e 50 72 65 61 6d 62 6c 65 20 7b 20 7b 70 72 65  nPreamble { {pre
b700: 66 69 78 20 22 22 7d 20 7b 73 75 66 66 69 78 20  fix ""} {suffix 
b710: 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23  ""} } {..      #
b720: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
b730: 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 72  This procedure r
b740: 65 74 75 72 6e 73 20 61 20 74 65 73 74 20 73 65  eturns a test se
b750: 74 75 70 20 73 63 72 69 70 74 20 66 72 61 67 6d  tup script fragm
b760: 65 6e 74 20 73 75 69 74 61 62 6c 65 20 66 6f 72  ent suitable for
b770: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
b780: 65 76 61 6c 75 61 74 69 6f 6e 20 62 79 20 61 6e  evaluation by an
b790: 20 69 6e 74 65 72 70 72 65 74 65 72 20 63 72 65   interpreter cre
b7a0: 61 74 65 64 20 69 6e 20 61 6e 20 69 73 6f 6c 61  ated in an isola
b7b0: 74 65 64 20 61 70 70 6c 69 63 61 74 69 6f 6e 0d  ted application.
b7c0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64  .      #       d
b7d0: 6f 6d 61 69 6e 2e 20 20 54 68 65 20 73 63 72 69  omain.  The scri
b7e0: 70 74 20 66 72 61 67 6d 65 6e 74 20 62 65 69 6e  pt fragment bein
b7f0: 67 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20  g returned will 
b800: 62 65 20 73 75 72 72 6f 75 6e 64 65 64 20 62 79  be surrounded by
b810: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
b820: 74 68 65 20 70 72 65 66 69 78 20 61 6e 64 20 73  the prefix and s
b830: 75 66 66 69 78 20 22 73 63 72 69 70 74 20 66 72  uffix "script fr
b840: 61 67 6d 65 6e 74 73 22 20 73 70 65 63 69 66 69  agments" specifi
b850: 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72  ed by our caller
b860: 2c 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  ,..      #      
b870: 20 69 66 20 61 6e 79 2e 20 20 54 68 65 20 65 6e   if any.  The en
b880: 74 69 72 65 20 73 63 72 69 70 74 20 62 65 69 6e  tire script bein
b890: 67 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20  g returned will 
b8a0: 62 65 20 73 75 62 73 74 69 74 75 74 65 64 20 76  be substituted v
b8b0: 69 61 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ia..      #     
b8c0: 20 20 5b 73 75 62 73 74 5d 2c 20 69 6e 20 74 68    [subst], in th
b8d0: 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72  e context of our
b8e0: 20 63 61 6c 6c 65 72 2c 20 62 65 66 6f 72 65 20   caller, before 
b8f0: 62 65 69 6e 67 20 72 65 74 75 72 6e 65 64 2e 0d  being returned..
b900: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 54  .      #       T
b910: 68 69 73 20 73 74 65 70 20 69 73 20 6e 65 63 65  his step is nece
b920: 73 73 61 72 79 20 73 6f 20 74 68 61 74 20 73 6f  ssary so that so
b930: 6d 65 20 6c 69 6d 69 74 65 64 20 63 6f 6e 74 65  me limited conte
b940: 78 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2c 0d  xt information,.
b950: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 70  .      #       p
b960: 72 69 6d 61 72 69 6c 79 20 72 65 6c 61 74 65 64  rimarily related
b970: 20 74 6f 20 74 68 65 20 74 65 73 74 69 6e 67 20   to the testing 
b980: 64 69 72 65 63 74 6f 72 69 65 73 2c 20 63 61 6e  directories, can
b990: 20 62 65 20 74 72 61 6e 73 66 65 72 72 65 64 0d   be transferred.
b9a0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74  .      #       t
b9b0: 6f 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65  o the interprete
b9c0: 72 20 69 6e 20 74 68 65 20 69 73 6f 6c 61 74 65  r in the isolate
b9d0: 64 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 64 6f  d application do
b9e0: 6d 61 69 6e 2c 20 6d 61 6b 69 6e 67 20 69 74 0d  main, making it.
b9f0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61  .      #       a
ba00: 62 6c 65 20 74 6f 20 73 75 63 63 65 73 73 66 75  ble to successfu
ba10: 6c 6c 79 20 72 75 6e 20 74 65 73 74 73 20 74 68  lly run tests th
ba20: 61 74 20 72 65 71 75 69 72 65 20 6f 6e 65 20 6f  at require one o
ba30: 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 0d 0a 20  r more of the.. 
ba40: 20 20 20 20 20 23 20 20 20 20 20 20 20 66 69 6c       #       fil
ba50: 65 73 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65  es in one of the
ba60: 20 74 65 73 74 69 6e 67 20 64 69 72 65 63 74 6f   testing directo
ba70: 72 69 65 73 2e 20 20 43 61 6c 6c 65 72 73 20 73  ries.  Callers s
ba80: 68 6f 75 6c 64 20 6b 65 65 70 20 69 6e 0d 0a 20  hould keep in.. 
ba90: 20 20 20 20 20 23 20 20 20 20 20 20 20 6d 69 6e       #       min
baa0: 64 20 74 68 61 74 20 74 68 65 20 74 65 73 74 20  d that the test 
bab0: 73 63 72 69 70 74 20 66 72 61 67 6d 65 6e 74 20  script fragment 
bac0: 62 65 69 6e 67 20 72 65 74 75 72 6e 65 64 20 63  being returned c
bad0: 61 6e 6e 6f 74 20 72 65 6c 79 20 6f 6e 0d 0a 20  annot rely on.. 
bae0: 20 20 20 20 20 23 20 20 20 20 20 20 20 61 6e 79       #       any
baf0: 20 73 63 72 69 70 74 20 6c 69 62 72 61 72 79 20   script library 
bb00: 70 72 6f 63 65 64 75 72 65 73 20 74 68 61 74 20  procedures that 
bb10: 61 72 65 20 6e 6f 74 20 70 72 6f 76 69 64 65 64  are not provided
bb20: 20 62 79 20 74 68 65 20 45 61 67 6c 65 0d 0a 20   by the Eagle.. 
bb30: 20 20 20 20 20 23 20 20 20 20 20 20 20 6c 69 62       #       lib
bb40: 72 61 72 79 20 70 61 63 6b 61 67 65 20 28 69 2e  rary package (i.
bb50: 65 2e 20 22 69 6e 69 74 2e 65 61 67 6c 65 22 29  e. "init.eagle")
bb60: 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 6f 73  , including thos
bb70: 65 20 70 72 6f 76 69 64 65 64 20 62 79 0d 0a 20  e provided by.. 
bb80: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
bb90: 20 45 61 67 6c 65 20 74 65 73 74 20 70 61 63 6b   Eagle test pack
bba0: 61 67 65 2c 20 75 6e 6c 65 73 73 20 74 68 65 20  age, unless the 
bbb0: 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  file containing 
bbc0: 74 68 65 6d 20 69 73 20 6c 6f 61 64 65 64 0d 0a  them is loaded..
bbd0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6d 61        #       ma
bbe0: 6e 75 61 6c 6c 79 20 76 69 61 20 73 6f 6d 65 20  nually via some 
bbf0: 6f 74 68 65 72 20 6d 65 63 68 61 6e 69 73 6d 20  other mechanism 
bc00: 28 65 2e 67 2e 20 62 79 20 69 6e 63 6c 75 64 69  (e.g. by includi
bc10: 6e 67 20 61 70 70 72 6f 70 72 69 61 74 65 0d 0a  ng appropriate..
bc20: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 5b 70        #       [p
bc30: 61 63 6b 61 67 65 20 72 65 71 75 69 72 65 5d 20  ackage require] 
bc40: 6f 72 20 5b 73 6f 75 72 63 65 5d 20 63 6f 6d 6d  or [source] comm
bc50: 61 6e 64 73 20 69 6e 20 74 68 65 20 70 72 65 66  ands in the pref
bc60: 69 78 20 6f 72 20 73 75 66 66 69 78 0d 0a 20 20  ix or suffix..  
bc70: 20 20 20 20 23 20 20 20 20 20 20 20 73 63 72 69      #       scri
bc80: 70 74 20 66 72 61 67 6d 65 6e 74 73 29 2e 20 20  pt fragments).  
bc90: 41 6c 73 6f 2c 20 61 6c 6c 20 76 61 72 69 61 62  Also, all variab
bca0: 6c 65 20 72 65 66 65 72 65 6e 63 65 73 20 61 6e  le references an
bcb0: 64 20 61 6c 6c 20 6e 65 73 74 65 64 0d 0a 20 20  d all nested..  
bcc0: 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 6d 6d      #       comm
bcd0: 61 6e 64 73 20 28 69 2e 65 2e 20 74 68 6f 73 65  ands (i.e. those
bce0: 20 69 6e 20 73 71 75 61 72 65 20 62 72 61 63 6b   in square brack
bcf0: 65 74 73 29 20 63 6f 6e 74 61 69 6e 65 64 20 69  ets) contained i
bd00: 6e 20 74 68 65 20 66 69 6e 61 6c 0d 0a 20 20 20  n the final..   
bd10: 20 20 20 23 20 20 20 20 20 20 20 73 63 72 69 70     #       scrip
bd20: 74 20 66 72 61 67 6d 65 6e 74 20 77 69 6c 6c 20  t fragment will 
bd30: 65 6e 64 20 75 70 20 62 65 69 6e 67 20 65 76 61  end up being eva
bd40: 6c 75 61 74 65 64 20 69 6e 20 74 68 65 20 63 6f  luated in the co
bd50: 6e 74 65 78 74 20 6f 66 20 74 68 65 0d 0a 20 20  ntext of the..  
bd60: 20 20 20 20 23 20 20 20 20 20 20 20 63 61 6c 6c      #       call
bd70: 69 6e 67 20 69 6e 74 65 72 70 72 65 74 65 72 20  ing interpreter 
bd80: 61 6e 64 20 6e 6f 74 20 74 68 65 20 74 61 72 67  and not the targ
bd90: 65 74 20 69 6e 74 65 72 70 72 65 74 65 72 20 63  et interpreter c
bda0: 72 65 61 74 65 64 20 69 6e 20 74 68 65 0d 0a 20  reated in the.. 
bdb0: 20 20 20 20 20 23 20 20 20 20 20 20 20 69 73 6f       #       iso
bdc0: 6c 61 74 65 64 20 61 70 70 6c 69 63 61 74 69 6f  lated applicatio
bdd0: 6e 20 64 6f 6d 61 69 6e 20 75 6e 6c 65 73 73 20  n domain unless 
bde0: 74 68 65 20 64 6f 6c 6c 61 72 20 73 69 67 6e 73  the dollar signs
bdf0: 20 61 6e 64 2f 6f 72 20 73 71 75 61 72 65 0d 0a   and/or square..
be00: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62 72        #       br
be10: 61 63 6b 65 74 73 20 61 72 65 20 73 70 65 63 69  ackets are speci
be20: 61 6c 6c 79 20 71 75 6f 74 65 64 20 77 69 74 68  ally quoted with
be30: 20 62 61 63 6b 73 6c 61 73 68 65 73 2e 0d 0a 20   backslashes... 
be40: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65       #..      re
be50: 74 75 72 6e 20 5b 75 70 6c 65 76 65 6c 20 31 20  turn [uplevel 1 
be60: 5b 6c 69 73 74 20 73 75 62 73 74 20 5b 61 70 70  [list subst [app
be70: 65 6e 64 41 72 67 73 20 24 70 72 65 66 69 78 20  endArgs $prefix 
be80: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
be90: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68        # NOTE: Th
bea0: 65 20 5c 5b 6f 62 6a 65 63 74 5c 5d 20 63 6f 6d  e \[object\] com
beb0: 6d 61 6e 64 20 6d 61 79 20 62 65 20 6d 69 73 73  mand may be miss
bec0: 69 6e 67 20 69 6e 20 73 6f 6d 65 20 45 61 67 6c  ing in some Eagl
bed0: 65 20 63 6f 72 65 0d 0a 20 20 20 20 20 20 20 20  e core..        
bee0: 23 20 20 20 20 20 20 20 6c 69 62 72 61 72 79 20  #       library 
bef0: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 2e 20  configurations. 
bf00: 20 43 6c 6f 6e 69 6e 67 20 61 6e 64 20 75 73 69   Cloning and usi
bf10: 6e 67 20 74 68 65 20 70 72 6f 63 65 64 75 72 65  ng the procedure
bf20: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
bf30: 20 20 5c 5b 63 68 61 6e 67 65 4e 61 74 69 76 65    \[changeNative
bf40: 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 5c 5d 20  RuntimeOption\] 
bf50: 6d 61 79 20 68 65 6c 70 20 74 6f 20 6d 69 74 69  may help to miti
bf60: 67 61 74 65 20 74 68 69 73 2e 0d 0a 20 20 20 20  gate this...    
bf70: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 70      #..        p
bf80: 72 6f 63 20 63 68 61 6e 67 65 4e 61 74 69 76 65  roc changeNative
bf90: 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 5c 0d  RuntimeOption \.
bfa0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 5b 69  .            {[i
bfb0: 6e 66 6f 20 61 72 67 73 20 63 68 61 6e 67 65 4e  nfo args changeN
bfc0: 61 74 69 76 65 52 75 6e 74 69 6d 65 4f 70 74 69  ativeRuntimeOpti
bfd0: 6f 6e 5d 7d 20 5c 0d 0a 20 20 20 20 20 20 20 20  on]} \..        
bfe0: 20 20 20 20 7b 5b 69 6e 66 6f 20 62 6f 64 79 20      {[info body 
bff0: 63 68 61 6e 67 65 4e 61 74 69 76 65 52 75 6e 74  changeNativeRunt
c000: 69 6d 65 4f 70 74 69 6f 6e 5d 7d 0d 0a 0d 0a 20  imeOption]}.... 
c010: 20 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a         catch {..
c020: 20 20 20 20 20 20 20 20 20 20 63 68 61 6e 67 65            change
c030: 4e 61 74 69 76 65 52 75 6e 74 69 6d 65 4f 70 74  NativeRuntimeOpt
c040: 69 6f 6e 20 5b 68 61 73 52 75 6e 74 69 6d 65 4f  ion [hasRuntimeO
c050: 70 74 69 6f 6e 20 6e 61 74 69 76 65 5d 0d 0a 20  ption native].. 
c060: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
c070: 7d 20 5b 67 65 74 54 65 73 74 4f 76 65 72 72 69  } [getTestOverri
c080: 64 65 73 50 72 65 61 6d 62 6c 65 20 5b 6c 69 73  desPreamble [lis
c090: 74 20 70 61 74 68 20 74 65 73 74 5f 63 68 61 6e  t path test_chan
c0a0: 6e 65 6c 5d 5d 20 24 73 75 66 66 69 78 5d 5d 5d  nel]] $suffix]]]
c0b0: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
c0c0: 70 72 6f 63 20 74 72 79 43 6f 70 79 45 78 74 65  proc tryCopyExte
c0d0: 72 6e 61 6c 46 69 6c 65 20 7b 0d 0a 20 20 20 20  rnalFile {..    
c0e0: 20 20 20 20 20 20 20 20 66 69 6c 65 4e 61 6d 65          fileName
c0f0: 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20 7b   {platform ""} {
c100: 6e 65 77 46 69 6c 65 4e 61 6d 65 20 22 22 7d 20  newFileName ""} 
c110: 7b 76 65 72 62 6f 73 65 20 74 72 75 65 7d 20 7d  {verbose true} }
c120: 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 73 6f   {..      set so
c130: 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 5b 67 65  urceFileName [ge
c140: 74 45 78 74 65 72 6e 61 6c 46 69 6c 65 4e 61 6d  tExternalFileNam
c150: 65 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a  e $fileName]....
c160: 20 20 20 20 20 20 69 66 20 7b 21 5b 66 69 6c 65        if {![file
c170: 20 65 78 69 73 74 73 20 24 73 6f 75 72 63 65 46   exists $sourceF
c180: 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b  ileName]} then {
c190: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 24 76  ..        if {$v
c1a0: 65 72 62 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a  erbose} then {..
c1b0: 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
c1c0: 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
c1d0: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
c1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
c1f0: 2d 2d 20 73 6b 69 70 70 65 64 20 63 6f 70 79 69  -- skipped copyi
c200: 6e 67 20 65 78 74 65 72 6e 61 6c 20 66 69 6c 65  ng external file
c210: 20 5c 22 22 20 24 73 6f 75 72 63 65 46 69 6c 65   \"" $sourceFile
c220: 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  Name \..        
c230: 20 20 20 20 20 20 22 5c 22 2c 20 69 74 20 64 6f        "\", it do
c240: 65 73 20 6e 6f 74 20 65 78 69 73 74 5c 6e 22 5d  es not exist\n"]
c250: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
c260: 20 20 20 20 20 20 20 72 65 74 75 72 6e 0d 0a 20         return.. 
c270: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
c280: 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
c290: 74 68 20 24 6e 65 77 46 69 6c 65 4e 61 6d 65 5d  th $newFileName]
c2a0: 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
c2b0: 20 20 20 20 20 20 73 65 74 20 74 61 72 67 65 74        set target
c2c0: 46 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42 69 6e  FileName [getBin
c2d0: 61 72 79 46 69 6c 65 4e 61 6d 65 20 24 6e 65 77  aryFileName $new
c2e0: 46 69 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f  FileName $platfo
c2f0: 72 6d 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  rm]..      } els
c300: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74  e {..        set
c310: 20 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 20   targetFileName 
c320: 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61  [getBinaryFileNa
c330: 6d 65 20 24 66 69 6c 65 4e 61 6d 65 20 24 70 6c  me $fileName $pl
c340: 61 74 66 6f 72 6d 5d 0d 0a 20 20 20 20 20 20 7d  atform]..      }
c350: 0d 0a 0d 0a 20 20 20 20 20 20 73 65 74 20 74 61  ....      set ta
c360: 72 67 65 74 44 69 72 65 63 74 6f 72 79 20 5b 66  rgetDirectory [f
c370: 69 6c 65 20 64 69 72 6e 61 6d 65 20 24 74 61 72  ile dirname $tar
c380: 67 65 74 46 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a  getFileName]....
c390: 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
c3a0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   {..        if {
c3b0: 21 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 74  ![file exists $t
c3c0: 61 72 67 65 74 44 69 72 65 63 74 6f 72 79 5d 7d  argetDirectory]}
c3d0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
c3e0: 20 20 20 66 69 6c 65 20 6d 6b 64 69 72 20 24 74     file mkdir $t
c3f0: 61 72 67 65 74 44 69 72 65 63 74 6f 72 79 0d 0a  argetDirectory..
c400: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
c410: 20 20 20 20 20 66 69 6c 65 20 63 6f 70 79 20 2d       file copy -
c420: 66 6f 72 63 65 20 24 73 6f 75 72 63 65 46 69 6c  force $sourceFil
c430: 65 4e 61 6d 65 20 24 74 61 72 67 65 74 46 69 6c  eName $targetFil
c440: 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 7d 5d 20  eName..      }] 
c450: 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
c460: 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
c470: 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
c480: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
c490: 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 70         "---- cop
c4a0: 69 65 64 20 65 78 74 65 72 6e 61 6c 20 66 69 6c  ied external fil
c4b0: 65 20 66 72 6f 6d 20 5c 22 22 20 24 73 6f 75 72  e from \"" $sour
c4c0: 63 65 46 69 6c 65 4e 61 6d 65 20 22 5c 22 20 74  ceFileName "\" t
c4d0: 6f 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20  o \"" \..       
c4e0: 20 20 20 20 20 24 74 61 72 67 65 74 46 69 6c 65       $targetFile
c4f0: 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20  Name \"\n]..    
c500: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
c510: 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
c520: 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
c530: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
c540: 20 20 20 20 20 22 2d 2d 2d 2d 20 66 61 69 6c 65       "---- faile
c550: 64 20 74 6f 20 63 6f 70 79 20 65 78 74 65 72 6e  d to copy extern
c560: 61 6c 20 66 69 6c 65 20 66 72 6f 6d 20 5c 22 22  al file from \""
c570: 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65   $sourceFileName
c580: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
c590: 22 5c 22 20 74 6f 20 5c 22 22 20 24 74 61 72 67  "\" to \"" $targ
c5a0: 65 74 46 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d  etFileName \"\n]
c5b0: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
c5c0: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 74 72  .....    proc tr
c5d0: 79 43 6f 70 79 42 69 6e 61 72 79 46 69 6c 65 20  yCopyBinaryFile 
c5e0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  {..            f
c5f0: 69 6c 65 4e 61 6d 65 20 6d 61 6e 61 67 65 64 4f  ileName managedO
c600: 6e 6c 79 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22  nly {platform ""
c610: 7d 20 7b 6e 65 77 46 69 6c 65 4e 61 6d 65 20 22  } {newFileName "
c620: 22 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  "}..            
c630: 7b 76 65 72 62 6f 73 65 20 74 72 75 65 7d 20 7d  {verbose true} }
c640: 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 73 6f   {..      set so
c650: 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 5b 67 65  urceFileName [ge
c660: 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20  tBinaryFileName 
c670: 24 66 69 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66  $fileName $platf
c680: 6f 72 6d 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66  orm]....      if
c690: 20 7b 21 5b 66 69 6c 65 20 65 78 69 73 74 73 20   {![file exists 
c6a0: 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 5d  $sourceFileName]
c6b0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
c6c0: 20 20 69 66 20 7b 24 76 65 72 62 6f 73 65 7d 20    if {$verbose} 
c6d0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
c6e0: 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
c6f0: 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
c700: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
c710: 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6b 69 70 70       "---- skipp
c720: 65 64 20 63 6f 70 79 69 6e 67 20 62 69 6e 61 72  ed copying binar
c730: 79 20 66 69 6c 65 20 5c 22 22 20 24 73 6f 75 72  y file \"" $sour
c740: 63 65 46 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20  ceFileName \..  
c750: 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c              "\",
c760: 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69   it does not exi
c770: 73 74 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20  st\n"]..        
c780: 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 72 65 74  }....        ret
c790: 75 72 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  urn..      }....
c7a0: 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
c7b0: 67 20 6c 65 6e 67 74 68 20 24 6e 65 77 46 69 6c  g length $newFil
c7c0: 65 4e 61 6d 65 5d 20 3e 20 30 7d 20 74 68 65 6e  eName] > 0} then
c7d0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   {..        set 
c7e0: 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 20 5b  targetFileName [
c7f0: 67 65 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65  getBuildFileName
c800: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
c810: 24 6e 65 77 46 69 6c 65 4e 61 6d 65 20 24 6d 61  $newFileName $ma
c820: 6e 61 67 65 64 4f 6e 6c 79 20 24 70 6c 61 74 66  nagedOnly $platf
c830: 6f 72 6d 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c  orm]..      } el
c840: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65  se {..        se
c850: 74 20 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65  t targetFileName
c860: 20 5b 67 65 74 42 75 69 6c 64 46 69 6c 65 4e 61   [getBuildFileNa
c870: 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  me \..          
c880: 20 20 24 66 69 6c 65 4e 61 6d 65 20 24 6d 61 6e    $fileName $man
c890: 61 67 65 64 4f 6e 6c 79 20 24 70 6c 61 74 66 6f  agedOnly $platfo
c8a0: 72 6d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  rm]..      }....
c8b0: 20 20 20 20 20 20 73 65 74 20 74 61 72 67 65 74        set target
c8c0: 44 69 72 65 63 74 6f 72 79 20 5b 66 69 6c 65 20  Directory [file 
c8d0: 64 69 72 6e 61 6d 65 20 24 74 61 72 67 65 74 46  dirname $targetF
c8e0: 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20  ileName]....    
c8f0: 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
c900: 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 66 69          if {![fi
c910: 6c 65 20 65 78 69 73 74 73 20 24 74 61 72 67 65  le exists $targe
c920: 74 44 69 72 65 63 74 6f 72 79 5d 7d 20 74 68 65  tDirectory]} the
c930: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 66  n {..          f
c940: 69 6c 65 20 6d 6b 64 69 72 20 24 74 61 72 67 65  ile mkdir $targe
c950: 74 44 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20  tDirectory..    
c960: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
c970: 20 66 69 6c 65 20 63 6f 70 79 20 2d 66 6f 72 63   file copy -forc
c980: 65 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d  e $sourceFileNam
c990: 65 20 24 74 61 72 67 65 74 46 69 6c 65 4e 61 6d  e $targetFileNam
c9a0: 65 0d 0a 20 20 20 20 20 20 7d 5d 20 3d 3d 20 30  e..      }] == 0
c9b0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
c9c0: 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
c9d0: 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
c9e0: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
c9f0: 20 20 20 22 2d 2d 2d 2d 20 63 6f 70 69 65 64 20     "---- copied 
ca00: 62 69 6e 61 72 79 20 66 69 6c 65 20 66 72 6f 6d  binary file from
ca10: 20 5c 22 22 20 24 73 6f 75 72 63 65 46 69 6c 65   \"" $sourceFile
ca20: 4e 61 6d 65 20 22 5c 22 20 74 6f 20 5c 22 22 20  Name "\" to \"" 
ca30: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 24  \..            $
ca40: 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 20 5c  targetFileName \
ca50: 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c  "\n]..      } el
ca60: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70  se {..        tp
ca70: 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
ca80: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
ca90: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  \..            "
caa0: 2d 2d 2d 2d 20 66 61 69 6c 65 64 20 74 6f 20 63  ---- failed to c
cab0: 6f 70 79 20 62 69 6e 61 72 79 20 66 69 6c 65 20  opy binary file 
cac0: 66 72 6f 6d 20 5c 22 22 20 24 73 6f 75 72 63 65  from \"" $source
cad0: 46 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20  FileName \..    
cae0: 20 20 20 20 20 20 20 20 22 5c 22 20 74 6f 20 5c          "\" to \
caf0: 22 22 20 24 74 61 72 67 65 74 46 69 6c 65 4e 61  "" $targetFileNa
cb00: 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20  me \"\n]..      
cb10: 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
cb20: 20 70 72 6f 63 20 74 72 79 43 6f 70 79 42 75 69   proc tryCopyBui
cb30: 6c 64 46 69 6c 65 20 7b 0d 0a 20 20 20 20 20 20  ldFile {..      
cb40: 20 20 20 20 20 20 66 69 6c 65 4e 61 6d 65 20 6d        fileName m
cb50: 61 6e 61 67 65 64 4f 6e 6c 79 20 7b 70 6c 61 74  anagedOnly {plat
cb60: 66 6f 72 6d 20 22 22 7d 20 7b 6e 65 77 46 69 6c  form ""} {newFil
cb70: 65 4e 61 6d 65 20 22 22 7d 0d 0a 20 20 20 20 20  eName ""}..     
cb80: 20 20 20 20 20 20 20 7b 76 65 72 62 6f 73 65 20         {verbose 
cb90: 74 72 75 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  true} } {..     
cba0: 20 73 65 74 20 73 6f 75 72 63 65 46 69 6c 65 4e   set sourceFileN
cbb0: 61 6d 65 20 5b 67 65 74 42 75 69 6c 64 46 69 6c  ame [getBuildFil
cbc0: 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 20  eName $fileName 
cbd0: 24 6d 61 6e 61 67 65 64 4f 6e 6c 79 20 24 70 6c  $managedOnly $pl
cbe0: 61 74 66 6f 72 6d 5d 0d 0a 0d 0a 20 20 20 20 20  atform]....     
cbf0: 20 69 66 20 7b 21 5b 66 69 6c 65 20 65 78 69 73   if {![file exis
cc00: 74 73 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61  ts $sourceFileNa
cc10: 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  me]} then {..   
cc20: 20 20 20 20 20 69 66 20 7b 24 76 65 72 62 6f 73       if {$verbos
cc30: 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  e} then {..     
cc40: 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
cc50: 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
cc60: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
cc70: 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6b          "---- sk
cc80: 69 70 70 65 64 20 63 6f 70 79 69 6e 67 20 62 75  ipped copying bu
cc90: 69 6c 64 20 66 69 6c 65 20 5c 22 22 20 24 73 6f  ild file \"" $so
cca0: 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 5c 0d 0a  urceFileName \..
ccb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 5c                "\
ccc0: 22 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65  ", it does not e
ccd0: 78 69 73 74 5c 6e 22 5d 0d 0a 20 20 20 20 20 20  xist\n"]..      
cce0: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 72    }....        r
ccf0: 65 74 75 72 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a  eturn..      }..
cd00: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72  ..      if {[str
cd10: 69 6e 67 20 6c 65 6e 67 74 68 20 24 6e 65 77 46  ing length $newF
cd20: 69 6c 65 4e 61 6d 65 5d 20 3e 20 30 7d 20 74 68  ileName] > 0} th
cd30: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65  en {..        se
cd40: 74 20 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65  t targetFileName
cd50: 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e   [getBinaryFileN
cd60: 61 6d 65 20 24 6e 65 77 46 69 6c 65 4e 61 6d 65  ame $newFileName
cd70: 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a 20 20 20   $platform]..   
cd80: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
cd90: 20 20 20 20 20 73 65 74 20 74 61 72 67 65 74 46       set targetF
cda0: 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42 69 6e 61  ileName [getBina
cdb0: 72 79 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65  ryFileName $file
cdc0: 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 5d 0d  Name $platform].
cdd0: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
cde0: 20 20 73 65 74 20 74 61 72 67 65 74 44 69 72 65    set targetDire
cdf0: 63 74 6f 72 79 20 5b 66 69 6c 65 20 64 69 72 6e  ctory [file dirn
ce00: 61 6d 65 20 24 74 61 72 67 65 74 46 69 6c 65 4e  ame $targetFileN
ce10: 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66  ame]....      if
ce20: 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
ce30: 20 20 20 20 69 66 20 7b 21 5b 66 69 6c 65 20 65      if {![file e
ce40: 78 69 73 74 73 20 24 74 61 72 67 65 74 44 69 72  xists $targetDir
ce50: 65 63 74 6f 72 79 5d 7d 20 74 68 65 6e 20 7b 0d  ectory]} then {.
ce60: 0a 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20  .          file 
ce70: 6d 6b 64 69 72 20 24 74 61 72 67 65 74 44 69 72  mkdir $targetDir
ce80: 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 20 20  ectory..        
ce90: 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 66 69 6c  }....        fil
cea0: 65 20 63 6f 70 79 20 2d 66 6f 72 63 65 20 24 73  e copy -force $s
ceb0: 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 24 74  ourceFileName $t
cec0: 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 0d 0a 20  argetFileName.. 
ced0: 20 20 20 20 20 7d 5d 20 3d 3d 20 30 7d 20 74 68       }] == 0} th
cee0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70  en {..        tp
cef0: 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
cf00: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
cf10: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  \..            "
cf20: 2d 2d 2d 2d 20 63 6f 70 69 65 64 20 62 75 69 6c  ---- copied buil
cf30: 64 20 66 69 6c 65 20 66 72 6f 6d 20 5c 22 22 20  d file from \"" 
cf40: 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20  $sourceFileName 
cf50: 22 5c 22 20 74 6f 20 5c 22 22 20 5c 0d 0a 20 20  "\" to \"" \..  
cf60: 20 20 20 20 20 20 20 20 20 20 24 74 61 72 67 65            $targe
cf70: 74 46 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d  tFileName \"\n].
cf80: 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
cf90: 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
cfa0: 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
cfb0: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
cfc0: 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
cfd0: 66 61 69 6c 65 64 20 74 6f 20 63 6f 70 79 20 62  failed to copy b
cfe0: 75 69 6c 64 20 66 69 6c 65 20 66 72 6f 6d 20 5c  uild file from \
cff0: 22 22 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61  "" $sourceFileNa
d000: 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  me \..          
d010: 20 20 22 5c 22 20 74 6f 20 5c 22 22 20 24 74 61    "\" to \"" $ta
d020: 72 67 65 74 46 69 6c 65 4e 61 6d 65 20 5c 22 5c  rgetFileName \"\
d030: 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  n]..      }..   
d040: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
d050: 74 72 79 44 65 6c 65 74 65 42 69 6e 61 72 79 46  tryDeleteBinaryF
d060: 69 6c 65 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7b  ile { fileName {
d070: 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20 7b 76 65  platform ""} {ve
d080: 72 62 6f 73 65 20 74 72 75 65 7d 20 7d 20 7b 0d  rbose true} } {.
d090: 0a 20 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e  .      set fileN
d0a0: 61 6d 65 20 5b 67 65 74 42 69 6e 61 72 79 46 69  ame [getBinaryFi
d0b0: 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65  leName $fileName
d0c0: 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a 0d 0a 20   $platform].... 
d0d0: 20 20 20 20 20 69 66 20 7b 21 5b 66 69 6c 65 20       if {![file 
d0e0: 65 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65  exists $fileName
d0f0: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
d100: 20 20 20 69 66 20 7b 24 76 65 72 62 6f 73 65 7d     if {$verbose}
d110: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
d120: 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
d130: 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
d140: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
d150: 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6b 69 70        "---- skip
d160: 70 65 64 20 64 65 6c 65 74 69 6e 67 20 62 69 6e  ped deleting bin
d170: 61 72 79 20 66 69 6c 65 20 5c 22 22 20 24 66 69  ary file \"" $fi
d180: 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20  leName \..      
d190: 20 20 20 20 20 20 20 20 22 5c 22 2c 20 69 74 20          "\", it 
d1a0: 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 5c 6e  does not exist\n
d1b0: 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  "]..        }...
d1c0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 0d  .        return.
d1d0: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
d1e0: 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 66 69    if {[catch {fi
d1f0: 6c 65 20 64 65 6c 65 74 65 20 24 66 69 6c 65 4e  le delete $fileN
d200: 61 6d 65 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  ame}] == 0} then
d210: 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   {..        tput
d220: 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
d230: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
d240: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d  .            "--
d250: 2d 2d 20 64 65 6c 65 74 65 64 20 62 69 6e 61 72  -- deleted binar
d260: 79 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c 65  y file \"" $file
d270: 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20  Name \"\n]..    
d280: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
d290: 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
d2a0: 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
d2b0: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
d2c0: 20 20 20 20 20 22 2d 2d 2d 2d 20 66 61 69 6c 65       "---- faile
d2d0: 64 20 74 6f 20 64 65 6c 65 74 65 20 62 69 6e 61  d to delete bina
d2e0: 72 79 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c  ry file \"" $fil
d2f0: 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20  eName \"\n]..   
d300: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
d310: 20 20 20 20 70 72 6f 63 20 74 72 79 44 65 6c 65      proc tryDele
d320: 74 65 42 75 69 6c 64 46 69 6c 65 20 7b 0d 0a 20  teBuildFile {.. 
d330: 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 4e             fileN
d340: 61 6d 65 20 6d 61 6e 61 67 65 64 4f 6e 6c 79 20  ame managedOnly 
d350: 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20 7b 76  {platform ""} {v
d360: 65 72 62 6f 73 65 20 74 72 75 65 7d 20 7d 20 7b  erbose true} } {
d370: 0d 0a 20 20 20 20 20 20 73 65 74 20 66 69 6c 65  ..      set file
d380: 4e 61 6d 65 20 5b 67 65 74 42 75 69 6c 64 46 69  Name [getBuildFi
d390: 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65  leName $fileName
d3a0: 20 24 6d 61 6e 61 67 65 64 4f 6e 6c 79 20 24 70   $managedOnly $p
d3b0: 6c 61 74 66 6f 72 6d 5d 0d 0a 0d 0a 20 20 20 20  latform]....    
d3c0: 20 20 69 66 20 7b 21 5b 66 69 6c 65 20 65 78 69    if {![file exi
d3d0: 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20  sts $fileName]} 
d3e0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
d3f0: 69 66 20 7b 24 76 65 72 62 6f 73 65 7d 20 74 68  if {$verbose} th
d400: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
d410: 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
d420: 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
d430: 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
d440: 20 20 20 22 2d 2d 2d 2d 20 73 6b 69 70 70 65 64     "---- skipped
d450: 20 64 65 6c 65 74 69 6e 67 20 62 75 69 6c 64 20   deleting build 
d460: 66 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e 61  file \"" $fileNa
d470: 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  me \..          
d480: 20 20 20 20 22 5c 22 2c 20 69 74 20 64 6f 65 73      "\", it does
d490: 20 6e 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a   not exist\n"]..
d4a0: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
d4b0: 20 20 20 20 20 72 65 74 75 72 6e 0d 0a 20 20 20       return..   
d4c0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66     }....      if
d4d0: 20 7b 5b 63 61 74 63 68 20 7b 66 69 6c 65 20 64   {[catch {file d
d4e0: 65 6c 65 74 65 20 24 66 69 6c 65 4e 61 6d 65 7d  elete $fileName}
d4f0: 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
d500: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
d510: 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
d520: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
d530: 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 64           "---- d
d540: 65 6c 65 74 65 64 20 62 75 69 6c 64 20 66 69 6c  eleted build fil
d550: 65 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 20  e \"" $fileName 
d560: 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 20 65  \"\n]..      } e
d570: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74  lse {..        t
d580: 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
d590: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
d5a0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
d5b0: 22 2d 2d 2d 2d 20 66 61 69 6c 65 64 20 74 6f 20  "---- failed to 
d5c0: 64 65 6c 65 74 65 20 62 75 69 6c 64 20 66 69 6c  delete build fil
d5d0: 65 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 20  e \"" $fileName 
d5e0: 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a  \"\n]..      }..
d5f0: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
d600: 6f 63 20 74 72 79 43 6f 70 79 41 73 73 65 6d 62  oc tryCopyAssemb
d610: 6c 79 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ly {..          
d620: 20 20 66 69 6c 65 4e 61 6d 65 20 6d 61 6e 61 67    fileName manag
d630: 65 64 4f 6e 6c 79 20 7b 70 6c 61 74 66 6f 72 6d  edOnly {platform
d640: 20 22 22 7d 20 7b 70 64 62 20 74 72 75 65 7d 20   ""} {pdb true} 
d650: 7b 76 65 72 62 6f 73 65 20 74 72 75 65 7d 20 7d  {verbose true} }
d660: 20 7b 0d 0a 20 20 20 20 20 20 74 72 79 43 6f 70   {..      tryCop
d670: 79 42 75 69 6c 64 46 69 6c 65 20 24 66 69 6c 65  yBuildFile $file
d680: 4e 61 6d 65 20 24 6d 61 6e 61 67 65 64 4f 6e 6c  Name $managedOnl
d690: 79 20 24 70 6c 61 74 66 6f 72 6d 20 22 22 20 24  y $platform "" $
d6a0: 76 65 72 62 6f 73 65 0d 0a 0d 0a 20 20 20 20 20  verbose....     
d6b0: 20 69 66 20 7b 24 70 64 62 7d 20 74 68 65 6e 20   if {$pdb} then 
d6c0: 7b 0d 0a 20 20 20 20 20 20 20 20 74 72 79 43 6f  {..        tryCo
d6d0: 70 79 42 75 69 6c 64 46 69 6c 65 20 5b 61 70 70  pyBuildFile [app
d6e0: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
d6f0: 20 20 20 20 20 20 20 5b 66 69 6c 65 20 72 6f 6f         [file roo
d700: 74 6e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 5d  tname $fileName]
d710: 20 2e 70 64 62 5d 20 24 6d 61 6e 61 67 65 64 4f   .pdb] $managedO
d720: 6e 6c 79 20 24 70 6c 61 74 66 6f 72 6d 20 22 22  nly $platform ""
d730: 20 24 76 65 72 62 6f 73 65 0d 0a 20 20 20 20 20   $verbose..     
d740: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
d750: 20 20 70 72 6f 63 20 74 72 79 44 65 6c 65 74 65    proc tryDelete
d760: 41 73 73 65 6d 62 6c 79 20 7b 0d 0a 20 20 20 20  Assembly {..    
d770: 20 20 20 20 20 20 20 20 66 69 6c 65 4e 61 6d 65          fileName
d780: 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20 7b   {platform ""} {
d790: 70 64 62 20 74 72 75 65 7d 20 7b 76 65 72 62 6f  pdb true} {verbo
d7a0: 73 65 20 74 72 75 65 7d 20 7d 20 7b 0d 0a 20 20  se true} } {..  
d7b0: 20 20 20 20 74 72 79 44 65 6c 65 74 65 42 69 6e      tryDeleteBin
d7c0: 61 72 79 46 69 6c 65 20 24 66 69 6c 65 4e 61 6d  aryFile $fileNam
d7d0: 65 20 24 70 6c 61 74 66 6f 72 6d 20 24 76 65 72  e $platform $ver
d7e0: 62 6f 73 65 0d 0a 0d 0a 20 20 20 20 20 20 69 66  bose....      if
d7f0: 20 7b 24 70 64 62 7d 20 74 68 65 6e 20 7b 0d 0a   {$pdb} then {..
d800: 20 20 20 20 20 20 20 20 74 72 79 44 65 6c 65 74          tryDelet
d810: 65 42 69 6e 61 72 79 46 69 6c 65 20 5b 61 70 70  eBinaryFile [app
d820: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
d830: 20 20 20 20 20 20 20 5b 66 69 6c 65 20 72 6f 6f         [file roo
d840: 74 6e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 5d  tname $fileName]
d850: 20 2e 70 64 62 5d 20 24 70 6c 61 74 66 6f 72 6d   .pdb] $platform
d860: 20 24 76 65 72 62 6f 73 65 0d 0a 20 20 20 20 20   $verbose..     
d870: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
d880: 20 20 70 72 6f 63 20 74 72 79 4c 6f 61 64 41 73    proc tryLoadAs
d890: 73 65 6d 62 6c 79 20 7b 20 66 69 6c 65 4e 61 6d  sembly { fileNam
d8a0: 65 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20  e {platform ""} 
d8b0: 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 66  } {..      set f
d8c0: 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42 69 6e 61  ileName [getBina
d8d0: 72 79 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65  ryFileName $file
d8e0: 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 5d 0d  Name $platform].
d8f0: 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61  ...      if {[ca
d900: 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 73  tch {..        s
d910: 65 74 20 61 73 73 65 6d 62 6c 79 20 5b 6f 62 6a  et assembly [obj
d920: 65 63 74 20 6c 6f 61 64 20 2d 6c 6f 61 64 74 79  ect load -loadty
d930: 70 65 20 46 69 6c 65 20 2d 61 6c 69 61 73 20 24  pe File -alias $
d940: 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20 20 20  fileName]..     
d950: 20 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b   }] == 0} then {
d960: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
d970: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e 6f 77       # NOTE: Now
d980: 2c 20 61 64 64 20 74 68 65 20 6e 65 63 65 73 73  , add the necess
d990: 61 72 79 20 74 65 73 74 20 63 6f 6e 73 74 72 61  ary test constra
d9a0: 69 6e 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  int...        #.
d9b0: 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73  .        addCons
d9c0: 74 72 61 69 6e 74 20 5b 66 69 6c 65 20 72 6f 6f  traint [file roo
d9d0: 74 6e 61 6d 65 20 5b 66 69 6c 65 20 74 61 69 6c  tname [file tail
d9e0: 20 24 66 69 6c 65 4e 61 6d 65 5d 5d 0d 0a 0d 0a   $fileName]]....
d9f0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
da00: 20 20 20 23 20 4e 4f 54 45 3a 20 47 72 61 62 20     # NOTE: Grab 
da10: 74 68 65 20 69 6d 61 67 65 20 72 75 6e 74 69 6d  the image runtim
da20: 65 20 76 65 72 73 69 6f 6e 20 66 72 6f 6d 20 74  e version from t
da30: 68 65 20 61 73 73 65 6d 62 6c 79 20 62 65 63 61  he assembly beca
da40: 75 73 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  use..        #  
da50: 20 20 20 20 20 73 65 76 65 72 61 6c 20 74 65 73       several tes
da60: 74 73 20 72 65 6c 79 20 6f 6e 20 69 74 20 68 61  ts rely on it ha
da70: 76 69 6e 67 20 61 20 63 65 72 74 61 69 6e 20 76  ving a certain v
da80: 61 6c 75 65 2e 0d 0a 20 20 20 20 20 20 20 20 23  alue...        #
da90: 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e  ..        addCon
daa0: 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41  straint [appendA
dab0: 72 67 73 20 5b 66 69 6c 65 20 74 61 69 6c 20 24  rgs [file tail $
dac0: 66 69 6c 65 4e 61 6d 65 5d 20 5f 20 5c 0d 0a 20  fileName] _ \.. 
dad0: 20 20 20 20 20 20 20 20 20 20 20 5b 24 61 73 73             [$ass
dae0: 65 6d 62 6c 79 20 49 6d 61 67 65 52 75 6e 74 69  embly ImageRunti
daf0: 6d 65 56 65 72 73 69 6f 6e 5d 5d 0d 0a 0d 0a 20  meVersion]].... 
db00: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
db10: 20 20 23 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e    # NOTE: Return
db20: 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 20 6f   the full path o
db30: 66 20 74 68 65 20 6c 6f 61 64 65 64 20 66 69 6c  f the loaded fil
db40: 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  e...        #.. 
db50: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 66         return $f
db60: 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 7d  ileName..      }
db70: 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ....      return
db80: 20 22 22 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20   ""..    }..... 
db90: 20 20 20 70 72 6f 63 20 69 73 53 51 4c 69 74 65     proc isSQLite
dba0: 52 65 61 64 79 20 7b 7d 20 7b 0d 0a 20 20 20 20  Ready {} {..    
dbb0: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
dbc0: 45 3a 20 54 68 69 73 20 70 72 6f 63 65 64 75 72  E: This procedur
dbd0: 65 20 6d 75 73 74 20 72 65 74 75 72 6e 20 6e 6f  e must return no
dbe0: 6e 2d 7a 65 72 6f 20 6f 6e 6c 79 20 69 66 20 74  n-zero only if t
dbf0: 68 65 20 53 51 4c 69 74 65 20 6e 61 74 69 76 65  he SQLite native
dc00: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
dc10: 6c 69 62 72 61 72 79 20 61 6e 64 20 74 68 65 20  library and the 
dc20: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
dc30: 74 65 20 6d 61 6e 61 67 65 64 20 61 73 73 65 6d  te managed assem
dc40: 62 6c 79 20 61 72 65 20 6c 6f 61 64 65 64 0d 0a  bly are loaded..
dc50: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61 6e        #       an
dc60: 64 20 72 65 61 64 79 20 66 6f 72 20 75 73 65 20  d ready for use 
dc70: 62 79 20 74 68 65 20 74 65 73 74 20 73 75 69 74  by the test suit
dc80: 65 2e 20 20 43 75 72 72 65 6e 74 6c 79 2c 20 74  e.  Currently, t
dc90: 68 69 73 20 70 72 6f 63 65 64 75 72 65 0d 0a 20  his procedure.. 
dca0: 20 20 20 20 20 23 20 20 20 20 20 20 20 73 68 6f       #       sho
dcb0: 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e  uld be called on
dcc0: 6c 79 20 61 66 74 65 72 20 74 68 65 20 5b 74 72  ly after the [tr
dcd0: 79 4c 6f 61 64 41 73 73 65 6d 62 6c 79 5d 20 70  yLoadAssembly] p
dce0: 72 6f 63 65 64 75 72 65 20 68 61 73 0d 0a 20 20  rocedure has..  
dcf0: 20 20 20 20 23 20 20 20 20 20 20 20 62 65 65 6e      #       been
dd00: 20 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f 62 65   called to probe
dd10: 20 66 6f 72 20 74 68 65 20 53 79 73 74 65 6d 2e   for the System.
dd20: 44 61 74 61 2e 53 51 4c 69 74 65 20 6d 61 6e 61  Data.SQLite mana
dd30: 67 65 64 20 61 73 73 65 6d 62 6c 79 0d 0a 20 20  ged assembly..  
dd40: 20 20 20 20 23 20 20 20 20 20 20 20 61 6e 64 20      #       and 
dd50: 74 68 65 20 5b 63 68 65 63 6b 46 6f 72 53 51 4c  the [checkForSQL
dd60: 69 74 65 5d 20 70 72 6f 63 65 64 75 72 65 20 68  ite] procedure h
dd70: 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 74  as been called t
dd80: 6f 20 70 72 6f 62 65 20 66 6f 72 0d 0a 20 20 20  o probe for..   
dd90: 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20 53     #       the S
dda0: 51 4c 69 74 65 20 6e 61 74 69 76 65 20 6c 69 62  QLite native lib
ddb0: 72 61 72 79 3b 20 6f 74 68 65 72 77 69 73 65 2c  rary; otherwise,
ddc0: 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 20   this procedure 
ddd0: 77 69 6c 6c 20 73 69 6d 70 6c 79 0d 0a 20 20 20  will simply..   
dde0: 20 20 20 23 20 20 20 20 20 20 20 61 6c 77 61 79     #       alway
ddf0: 73 20 72 65 74 75 72 6e 20 7a 65 72 6f 2e 0d 0a  s return zero...
de00: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72        #..      r
de10: 65 74 75 72 6e 20 5b 65 78 70 72 20 7b 0d 0a 20  eturn [expr {.. 
de20: 20 20 20 20 20 20 20 5b 68 61 76 65 43 6f 6e 73         [haveCons
de30: 74 72 61 69 6e 74 20 53 79 73 74 65 6d 2e 44 61  traint System.Da
de40: 74 61 2e 53 51 4c 69 74 65 5d 20 26 26 20 5b 68  ta.SQLite] && [h
de50: 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 53 51  aveConstraint SQ
de60: 4c 69 74 65 5d 0d 0a 20 20 20 20 20 20 7d 5d 0d  Lite]..      }].
de70: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
de80: 72 6f 63 20 6d 61 74 63 68 50 6c 61 74 66 6f 72  roc matchPlatfor
de90: 6d 20 7b 20 70 6c 61 74 66 6f 72 6d 20 7d 20 7b  m { platform } {
dea0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
deb0: 20 23 20 4e 4f 54 45 3a 20 41 6e 20 65 6d 70 74   # NOTE: An empt
dec0: 79 20 73 74 72 69 6e 67 20 66 6f 72 20 74 68 65  y string for the
ded0: 20 70 6c 61 74 66 6f 72 6d 20 6d 65 61 6e 73 20   platform means 
dee0: 74 68 61 74 20 74 68 65 20 62 75 69 6c 64 20 69  that the build i
def0: 73 20 6e 6f 74 0d 0a 20 20 20 20 20 20 23 20 20  s not..      #  
df00: 20 20 20 20 20 5b 70 72 69 6d 61 72 69 6c 79 5d       [primarily]
df10: 20 61 20 6e 61 74 69 76 65 20 62 75 69 6c 64 3b   a native build;
df20: 20 74 68 65 72 65 66 6f 72 65 2c 20 69 74 20 61   therefore, it a
df30: 6c 77 61 79 73 20 6d 61 74 63 68 65 73 2e 0d 0a  lways matches...
df40: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
df50: 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  f {[string lengt
df60: 68 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3d 3d 20  h $platform] == 
df70: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
df80: 20 20 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a     return true..
df90: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
dfa0: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
dfb0: 3a 20 49 66 20 74 68 65 20 6d 61 63 68 69 6e 65  : If the machine
dfc0: 20 6e 61 6d 65 20 69 73 20 75 6e 61 76 61 69 6c   name is unavail
dfd0: 61 62 6c 65 2c 20 74 68 65 72 65 20 69 73 20 6e  able, there is n
dfe0: 6f 74 68 69 67 6e 20 65 6c 73 65 20 77 65 0d 0a  othign else we..
dff0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 61        #       ca
e000: 6e 20 64 6f 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  n do...      #..
e010: 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
e020: 20 65 78 69 73 74 73 20 3a 3a 74 63 6c 5f 70 6c   exists ::tcl_pl
e030: 61 74 66 6f 72 6d 28 6d 61 63 68 69 6e 65 29 5d  atform(machine)]
e040: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
e050: 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a    return false..
e060: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
e070: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
e080: 3a 20 44 6f 65 73 20 74 68 65 20 73 70 65 63 69  : Does the speci
e090: 66 69 65 64 20 70 6c 61 74 66 6f 72 6d 20 6d 61  fied platform ma
e0a0: 74 63 68 20 75 70 20 74 6f 20 74 68 65 20 63 75  tch up to the cu
e0b0: 72 72 65 6e 74 20 70 72 6f 63 65 73 73 3f 0d 0a  rrent process?..
e0c0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
e0d0: 66 20 7b 24 70 6c 61 74 66 6f 72 6d 20 65 71 20  f {$platform eq 
e0e0: 5b 6d 61 63 68 69 6e 65 54 6f 50 6c 61 74 66 6f  [machineToPlatfo
e0f0: 72 6d 20 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f  rm $::tcl_platfo
e100: 72 6d 28 6d 61 63 68 69 6e 65 29 5d 7d 20 74 68  rm(machine)]} th
e110: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65  en {..        re
e120: 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20  turn true..     
e130: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   }....      #.. 
e140: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65       # NOTE: The
e150: 20 73 70 65 63 69 66 69 65 64 20 70 6c 61 74 66   specified platf
e160: 6f 72 6d 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74  orm does not mat
e170: 63 68 20 75 70 20 77 69 74 68 20 74 68 65 20 70  ch up with the p
e180: 6c 61 74 66 6f 72 6d 0d 0a 20 20 20 20 20 20 23  latform..      #
e190: 20 20 20 20 20 20 20 66 6f 72 20 74 68 65 20 63         for the c
e1a0: 75 72 72 65 6e 74 20 70 72 6f 63 65 73 73 2e 0d  urrent process..
e1b0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
e1c0: 72 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20  return false..  
e1d0: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
e1e0: 20 68 61 76 65 53 51 4c 69 74 65 4f 62 6a 65 63   haveSQLiteObjec
e1f0: 74 43 6f 6d 6d 61 6e 64 20 7b 7d 20 7b 0d 0a 20  tCommand {} {.. 
e200: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
e210: 4e 4f 54 45 3a 20 49 73 20 74 68 65 20 5b 6f 62  NOTE: Is the [ob
e220: 6a 65 63 74 5d 20 63 6f 6d 6d 61 6e 64 20 63 75  ject] command cu
e230: 72 72 65 6e 74 6c 79 20 61 76 61 69 6c 61 62 6c  rrently availabl
e240: 65 3f 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  e?..      #..   
e250: 20 20 20 72 65 74 75 72 6e 20 5b 65 78 70 72 20     return [expr 
e260: 7b 5b 6c 6c 65 6e 67 74 68 20 5b 69 6e 66 6f 20  {[llength [info 
e270: 63 6f 6d 6d 61 6e 64 73 20 6f 62 6a 65 63 74 5d  commands object]
e280: 5d 20 3e 20 30 7d 5d 0d 0a 20 20 20 20 7d 0d 0a  ] > 0}]..    }..
e290: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 68 65 63  ...    proc chec
e2a0: 6b 46 6f 72 53 51 4c 69 74 65 4f 62 6a 65 63 74  kForSQLiteObject
e2b0: 43 6f 6d 6d 61 6e 64 20 7b 20 63 68 61 6e 6e 65  Command { channe
e2c0: 6c 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74 70 75  l } {..      tpu
e2d0: 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d  ts $channel "---
e2e0: 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 5c  - checking for \
e2f0: 22 6f 62 6a 65 63 74 5c 22 20 63 6f 6d 6d 61 6e  "object\" comman
e300: 64 20 75 73 61 67 65 2e 2e 2e 20 22 0d 0a 0d 0a  d usage... "....
e310: 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
e320: 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 73 71 6c   exists ::no(sql
e330: 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64  iteObjectCommand
e340: 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  )] && \..       
e350: 20 20 20 5b 68 61 76 65 53 51 4c 69 74 65 4f 62     [haveSQLiteOb
e360: 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68  jectCommand]} th
e370: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70  en {..        tp
e380: 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 79 65 73  uts $channel yes
e390: 5c 6e 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  \n..      } else
e3a0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
e3b0: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55         # NOTE: U
e3c0: 6e 6c 65 73 73 20 77 65 20 61 72 65 20 66 6f 72  nless we are for
e3d0: 62 69 64 64 65 6e 20 66 72 6f 6d 20 64 6f 69 6e  bidden from doin
e3e0: 67 20 73 6f 2c 20 61 64 64 20 73 6f 6d 65 20 63  g so, add some c
e3f0: 6f 6e 73 74 72 61 69 6e 74 73 0d 0a 20 20 20 20  onstraints..    
e400: 20 20 20 20 23 20 20 20 20 20 20 20 74 68 61 74      #       that
e410: 20 77 69 6c 6c 20 61 6c 6c 6f 77 20 6d 6f 73 74   will allow most
e420: 20 6f 66 20 74 68 65 20 74 65 73 74 20 73 75 69   of the test sui
e430: 74 65 20 74 6f 20 72 75 6e 20 28 69 2e 65 2e 20  te to run (i.e. 
e440: 74 68 6f 73 65 0d 0a 20 20 20 20 20 20 20 20 23  those..        #
e450: 20 20 20 20 20 20 20 74 65 73 74 73 20 74 68 61         tests tha
e460: 74 20 64 6f 20 6e 6f 74 20 64 69 72 65 63 74 6c  t do not directl
e470: 79 20 72 65 6c 79 20 75 70 6f 6e 20 74 68 65 20  y rely upon the 
e480: 5b 6f 62 6a 65 63 74 5d 20 63 6f 6d 6d 61 6e 64  [object] command
e490: 29 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  )...        #.. 
e4a0: 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
e4b0: 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 73 68  o exists ::no(sh
e4c0: 69 6d 53 51 4c 69 74 65 41 73 73 65 6d 62 6c 79  imSQLiteAssembly
e4d0: 43 6f 6e 73 74 72 61 69 6e 74 73 29 5d 7d 20 74  Constraints)]} t
e4e0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
e4f0: 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 53   addConstraint S
e500: 51 4c 69 74 65 0d 0a 20 20 20 20 20 20 20 20 20  QLite..         
e510: 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 53   addConstraint S
e520: 51 4c 69 74 65 49 6e 74 65 72 6f 70 0d 0a 20 20  QLiteInterop..  
e530: 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74          addConst
e540: 72 61 69 6e 74 20 53 79 73 74 65 6d 2e 44 61 74  raint System.Dat
e550: 61 2e 53 51 4c 69 74 65 0d 0a 20 20 20 20 20 20  a.SQLite..      
e560: 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e      addConstrain
e570: 74 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  t System.Data.SQ
e580: 4c 69 74 65 2e 45 6e 63 72 79 70 74 69 6f 6e 0d  Lite.Encryption.
e590: 0a 20 20 20 20 20 20 20 20 20 20 61 64 64 43 6f  .          addCo
e5a0: 6e 73 74 72 61 69 6e 74 20 53 79 73 74 65 6d 2e  nstraint System.
e5b0: 44 61 74 61 2e 53 51 4c 69 74 65 2e 4c 69 6e 71  Data.SQLite.Linq
e5c0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 61 64  ....          ad
e5d0: 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70  dConstraint [app
e5e0: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
e5f0: 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e           System.
e600: 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 5f  Data.SQLite.dll_
e610: 76 20 5b 67 65 74 42 75 69 6c 64 43 6c 72 56 65  v [getBuildClrVe
e620: 72 73 69 6f 6e 5d 5d 0d 0a 20 20 20 20 20 20 20  rsion]]..       
e630: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66   }....        if
e640: 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
e650: 3a 3a 6e 6f 28 73 68 69 6d 53 51 4c 69 74 65 44  ::no(shimSQLiteD
e660: 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 43 6f 6e  efineConstantCon
e670: 73 74 72 61 69 6e 74 73 29 5d 7d 20 74 68 65 6e  straints)]} then
e680: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 66 6f   {..          fo
e690: 72 65 61 63 68 20 64 65 66 69 6e 65 43 6f 6e 73  reach defineCons
e6a0: 74 61 6e 74 20 5b 6c 69 73 74 20 5c 0d 0a 20 20  tant [list \..  
e6b0: 20 20 20 20 20 20 20 20 20 20 20 20 49 4e 54 45              INTE
e6c0: 52 4f 50 5f 45 58 54 45 4e 53 49 4f 4e 5f 46 55  ROP_EXTENSION_FU
e6d0: 4e 43 54 49 4f 4e 53 20 49 4e 54 45 52 4f 50 5f  NCTIONS INTEROP_
e6e0: 46 54 53 35 5f 45 58 54 45 4e 53 49 4f 4e 20 5c  FTS5_EXTENSION \
e6f0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
e700: 49 4e 54 45 52 4f 50 5f 4a 53 4f 4e 31 5f 45 58  INTEROP_JSON1_EX
e710: 54 45 4e 53 49 4f 4e 20 49 4e 54 45 52 4f 50 5f  TENSION INTEROP_
e720: 50 45 52 43 45 4e 54 49 4c 45 5f 45 58 54 45 4e  PERCENTILE_EXTEN
e730: 53 49 4f 4e 20 5c 0d 0a 20 20 20 20 20 20 20 20  SION \..        
e740: 20 20 20 20 20 20 49 4e 54 45 52 4f 50 5f 52 45        INTEROP_RE
e750: 47 45 58 50 5f 45 58 54 45 4e 53 49 4f 4e 20 49  GEXP_EXTENSION I
e760: 4e 54 45 52 4f 50 5f 54 45 53 54 5f 45 58 54 45  NTEROP_TEST_EXTE
e770: 4e 53 49 4f 4e 20 5c 0d 0a 20 20 20 20 20 20 20  NSION \..       
e780: 20 20 20 20 20 20 20 49 4e 54 45 52 4f 50 5f 53         INTEROP_S
e790: 45 53 53 49 4f 4e 5f 45 58 54 45 4e 53 49 4f 4e  ESSION_EXTENSION
e7a0: 20 49 4e 54 45 52 4f 50 5f 53 48 41 31 5f 45 58   INTEROP_SHA1_EX
e7b0: 54 45 4e 53 49 4f 4e 20 5c 0d 0a 20 20 20 20 20  TENSION \..     
e7c0: 20 20 20 20 20 20 20 20 20 49 4e 54 45 52 4f 50           INTEROP
e7d0: 5f 54 4f 54 59 50 45 5f 45 58 54 45 4e 53 49 4f  _TOTYPE_EXTENSIO
e7e0: 4e 20 49 4e 54 45 52 4f 50 5f 56 49 52 54 55 41  N INTEROP_VIRTUA
e7f0: 4c 5f 54 41 42 4c 45 20 5c 0d 0a 20 20 20 20 20  L_TABLE \..     
e800: 20 20 20 20 20 20 20 20 20 55 53 45 5f 49 4e 54           USE_INT
e810: 45 52 4f 50 5f 44 4c 4c 5d 20 7b 0d 0a 20 20 20  EROP_DLL] {..   
e820: 20 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73           addCons
e830: 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
e840: 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
e850: 20 20 20 20 20 20 5b 67 65 74 53 51 4c 69 74 65        [getSQLite
e860: 44 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 50 72  DefineConstantPr
e870: 65 66 69 78 5d 20 24 64 65 66 69 6e 65 43 6f 6e  efix] $defineCon
e880: 73 74 61 6e 74 5d 0d 0a 20 20 20 20 20 20 20 20  stant]..        
e890: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
e8a0: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b  ..        if {![
e8b0: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
e8c0: 28 73 68 69 6d 53 51 4c 69 74 65 56 69 73 75 61  (shimSQLiteVisua
e8d0: 6c 53 74 75 64 69 6f 43 6f 6e 73 74 72 61 69 6e  lStudioConstrain
e8e0: 74 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ts)]} then {..  
e8f0: 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74          addConst
e900: 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67  raint [appendArg
e910: 73 20 76 69 73 75 61 6c 53 74 75 64 69 6f 20 5b  s visualStudio [
e920: 67 65 74 42 75 69 6c 64 59 65 61 72 5d 5d 0d 0a  getBuildYear]]..
e930: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
e940: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
e950: 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20  nel no\n..      
e960: 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
e970: 20 70 72 6f 63 20 63 68 61 6e 67 65 4e 61 74 69   proc changeNati
e980: 76 65 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20  veRuntimeOption 
e990: 7b 20 6e 61 74 69 76 65 20 7d 20 7b 0d 0a 20 20  { native } {..  
e9a0: 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67 74 68      if {[llength
e9b0: 20 5b 69 6e 66 6f 20 63 6f 6d 6d 61 6e 64 73 20   [info commands 
e9c0: 64 65 62 75 67 5d 5d 20 3e 20 30 20 26 26 20 5c  debug]] > 0 && \
e9d0: 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 6c 6c 65  ..          [lle
e9e0: 6e 67 74 68 20 5b 69 6e 66 6f 20 73 75 62 63 6f  ngth [info subco
e9f0: 6d 6d 61 6e 64 73 20 64 65 62 75 67 20 72 75 6e  mmands debug run
ea00: 74 69 6d 65 6f 70 74 69 6f 6e 5d 5d 20 3e 20 30  timeoption]] > 0
ea10: 20 26 26 20 5b 63 61 74 63 68 20 7b 0d 0a 20 20   && [catch {..  
ea20: 20 20 20 20 20 20 64 65 62 75 67 20 72 75 6e 74        debug runt
ea30: 69 6d 65 6f 70 74 69 6f 6e 20 5b 65 78 70 72 20  imeoption [expr 
ea40: 7b 24 6e 61 74 69 76 65 20 3f 20 22 61 64 64 22  {$native ? "add"
ea50: 20 3a 20 22 72 65 6d 6f 76 65 22 7d 5d 20 6e 61   : "remove"}] na
ea60: 74 69 76 65 0d 0a 20 20 20 20 20 20 7d 5d 20 3d  tive..      }] =
ea70: 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
ea80: 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65       return true
ea90: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
eaa0: 20 20 20 69 66 20 7b 5b 68 61 76 65 53 51 4c 69     if {[haveSQLi
eab0: 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d  teObjectCommand]
eac0: 20 26 26 20 5b 63 61 74 63 68 20 7b 0d 0a 20 20   && [catch {..  
ead0: 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76        object inv
eae0: 6f 6b 65 20 49 6e 74 65 72 70 72 65 74 65 72 2e  oke Interpreter.
eaf0: 47 65 74 41 63 74 69 76 65 20 5b 65 78 70 72 20  GetActive [expr 
eb00: 7b 24 6e 61 74 69 76 65 20 3f 20 5c 0d 0a 20 20  {$native ? \..  
eb10: 20 20 20 20 20 20 20 20 20 20 22 41 64 64 52 75            "AddRu
eb20: 6e 74 69 6d 65 4f 70 74 69 6f 6e 22 20 3a 20 22  ntimeOption" : "
eb30: 52 65 6d 6f 76 65 52 75 6e 74 69 6d 65 4f 70 74  RemoveRuntimeOpt
eb40: 69 6f 6e 22 7d 5d 20 6e 61 74 69 76 65 0d 0a 20  ion"}] native.. 
eb50: 20 20 20 20 20 7d 5d 20 3d 3d 20 30 7d 20 74 68       }] == 0} th
eb60: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65  en {..        re
eb70: 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20  turn true..     
eb80: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75   }....      retu
eb90: 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20 7d 0d  rn false..    }.
eba0: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 68 65  ....    proc che
ebb0: 63 6b 46 6f 72 53 51 4c 69 74 65 42 75 69 6c 64  ckForSQLiteBuild
ebc0: 73 20 7b 20 63 68 61 6e 6e 65 6c 20 7b 73 65 6c  s { channel {sel
ebd0: 65 63 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a  ect false} } {..
ebe0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
ebf0: 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 66 6f 72   NOTE: Check for
ec00: 20 65 76 65 72 79 20 70 6f 73 73 69 62 6c 65 20   every possible 
ec10: 76 61 6c 69 64 20 63 6f 6d 62 69 6e 61 74 69 6f  valid combinatio
ec20: 6e 20 6f 66 20 76 61 6c 75 65 73 20 75 73 65 64  n of values used
ec30: 20 77 68 65 6e 0d 0a 20 20 20 20 20 20 23 20 20   when..      #  
ec40: 20 20 20 20 20 6c 6f 63 61 74 69 6e 67 20 6f 75       locating ou
ec50: 74 20 74 68 65 20 62 75 69 6c 64 20 6f 75 74 70  t the build outp
ec60: 75 74 20 64 69 72 65 63 74 6f 72 79 2c 20 73 68  ut directory, sh
ec70: 6f 77 69 6e 67 20 65 61 63 68 20 61 76 61 69 6c  owing each avail
ec80: 61 62 6c 65 0d 0a 20 20 20 20 20 20 23 20 20 20  able..      #   
ec90: 20 20 20 20 62 75 69 6c 64 20 76 61 72 69 61 74      build variat
eca0: 69 6f 6e 20 61 6c 6f 6e 67 20 74 68 65 20 77 61  ion along the wa
ecb0: 79 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  y...      #..   
ecc0: 20 20 20 66 6f 72 65 61 63 68 20 6e 61 74 69 76     foreach nativ
ecd0: 65 20 5b 6c 69 73 74 20 66 61 6c 73 65 20 74 72  e [list false tr
ece0: 75 65 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 66  ue] {..        f
ecf0: 6f 72 65 61 63 68 20 79 65 61 72 20 5b 67 65 74  oreach year [get
ed00: 42 75 69 6c 64 59 65 61 72 73 5d 20 7b 0d 0a 20  BuildYears] {.. 
ed10: 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
ed20: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 5b   configuration [
ed30: 67 65 74 42 75 69 6c 64 43 6f 6e 66 69 67 75 72  getBuildConfigur
ed40: 61 74 69 6f 6e 73 5d 20 7b 0d 0a 20 20 20 20 20  ations] {..     
ed50: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
ed60: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69        # NOTE: Fi
ed70: 67 75 72 65 20 6f 75 74 20 74 68 65 20 65 66 66  gure out the eff
ed80: 65 63 74 69 76 65 20 62 75 69 6c 64 20 70 6c 61  ective build pla
ed90: 74 66 6f 72 6d 2e 20 20 54 68 69 73 20 69 73 0d  tform.  This is.
eda0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20  .            #  
edb0: 20 20 20 20 20 62 61 73 65 64 20 6f 6e 20 77 68       based on wh
edc0: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 5b  ether or not a [
edd0: 70 72 69 6d 61 72 69 6c 79 5d 20 6e 61 74 69 76  primarily] nativ
ede0: 65 20 62 75 69 6c 64 0d 0a 20 20 20 20 20 20 20  e build..       
edf0: 20 20 20 20 20 23 20 20 20 20 20 20 20 69 73 20       #       is 
ee00: 62 65 69 6e 67 20 75 73 65 64 2e 20 20 46 6f 72  being used.  For
ee10: 20 5b 70 72 69 6d 61 72 69 6c 79 5d 20 6e 6f 6e   [primarily] non
ee20: 2d 6e 61 74 69 76 65 20 62 75 69 6c 64 73 2c 0d  -native builds,.
ee30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20  .            #  
ee40: 20 20 20 20 20 74 68 69 73 20 77 69 6c 6c 20 62       this will b
ee50: 65 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e  e an empty strin
ee60: 67 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  g...            
ee70: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  #..            s
ee80: 65 74 20 70 6c 61 74 66 6f 72 6d 20 5b 67 65 74  et platform [get
ee90: 42 75 69 6c 64 50 6c 61 74 66 6f 72 6d 20 24 6e  BuildPlatform $n
eea0: 61 74 69 76 65 5d 0d 0a 0d 0a 20 20 20 20 20 20  ative]....      
eeb0: 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
eec0: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
eed0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
eee0: 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69      "---- checki
eef0: 6e 67 20 66 6f 72 20 53 79 73 74 65 6d 2e 44 61  ng for System.Da
ef00: 74 61 2e 53 51 4c 69 74 65 20 62 75 69 6c 64 20  ta.SQLite build 
ef10: 5c 22 22 20 5b 65 78 70 72 20 5c 0d 0a 20 20 20  \"" [expr \..   
ef20: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 24 6e               {$n
ef30: 61 74 69 76 65 20 3f 20 22 6e 61 74 69 76 65 2f  ative ? "native/
ef40: 22 20 3a 20 22 22 7d 5d 20 5b 65 78 70 72 20 7b  " : ""}] [expr {
ef50: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 5c  [string length \
ef60: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
ef70: 20 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3e 20 30    $platform] > 0
ef80: 20 3f 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24   ? [appendArgs $
ef90: 70 6c 61 74 66 6f 72 6d 20 2f 5d 20 3a 20 22 22  platform /] : ""
efa0: 7d 5d 20 24 79 65 61 72 20 5c 0d 0a 20 20 20 20  }] $year \..    
efb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 20 24 63              / $c
efc0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 22 5c 22  onfiguration "\"
efd0: 2e 2e 2e 20 22 5d 0d 0a 0d 0a 20 20 20 20 20 20  ... "]....      
efe0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
eff0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69       # NOTE: Bui
f000: 6c 64 20 74 68 65 20 66 75 6c 6c 79 20 71 75 61  ld the fully qua
f010: 6c 69 66 69 65 64 20 64 69 72 65 63 74 6f 72 79  lified directory
f020: 20 77 68 65 72 65 20 74 68 65 20 6e 65 63 65 73   where the neces
f030: 73 61 72 79 0d 0a 20 20 20 20 20 20 20 20 20 20  sary..          
f040: 20 20 23 20 20 20 20 20 20 20 63 6f 6d 70 6f 6e    #       compon
f050: 65 6e 74 73 20 66 6f 72 20 53 79 73 74 65 6d 2e  ents for System.
f060: 44 61 74 61 2e 53 51 4c 69 74 65 20 73 68 6f 75  Data.SQLite shou
f070: 6c 64 20 62 65 20 66 6f 75 6e 64 2e 0d 0a 20 20  ld be found...  
f080: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
f090: 20 20 20 20 20 20 20 20 20 73 65 74 20 64 69 72           set dir
f0a0: 65 63 74 6f 72 79 20 5b 6a 6f 69 6e 42 75 69 6c  ectory [joinBuil
f0b0: 64 44 69 72 65 63 74 6f 72 79 20 24 6e 61 74 69  dDirectory $nati
f0c0: 76 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ve \..          
f0d0: 20 20 20 20 20 20 5b 67 65 74 42 75 69 6c 64 42        [getBuildB
f0e0: 61 73 65 44 69 72 65 63 74 6f 72 79 5d 20 24 79  aseDirectory] $y
f0f0: 65 61 72 20 24 70 6c 61 74 66 6f 72 6d 20 24 63  ear $platform $c
f100: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 5d 0d 0a 0d  onfiguration]...
f110: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a  .            #..
f120: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f              # NO
f130: 54 45 3a 20 44 6f 20 74 68 65 20 6e 65 63 65 73  TE: Do the neces
f140: 73 61 72 79 20 66 69 6c 65 73 20 65 78 69 73 74  sary files exist
f150: 3f 20 20 43 75 72 72 65 6e 74 6c 79 2c 20 6e 6f  ?  Currently, no
f160: 20 6f 74 68 65 72 20 73 74 65 70 73 0d 0a 20 20   other steps..  
f170: 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
f180: 20 20 61 72 65 20 74 61 6b 65 6e 20 74 6f 20 76    are taken to v
f190: 65 72 69 66 79 20 74 68 69 73 20 62 75 69 6c 64  erify this build
f1a0: 20 69 73 20 61 63 74 75 61 6c 6c 79 20 76 69 61   is actually via
f1b0: 62 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ble...          
f1c0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
f1d0: 20 69 66 20 7b 5b 69 73 42 75 69 6c 64 41 76 61   if {[isBuildAva
f1e0: 69 6c 61 62 6c 65 20 24 6e 61 74 69 76 65 20 24  ilable $native $
f1f0: 64 69 72 65 63 74 6f 72 79 5d 7d 20 74 68 65 6e  directory]} then
f200: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
f210: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
f220: 20 20 20 23 20 4e 4f 54 45 3a 20 57 68 65 6e 20     # NOTE: When 
f230: 69 6e 20 22 73 65 6c 65 63 74 22 20 6d 6f 64 65  in "select" mode
f240: 2c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  , automatically 
f250: 73 65 6c 65 63 74 20 74 68 65 20 66 69 72 73 74  select the first
f260: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
f270: 23 20 20 20 20 20 20 20 61 76 61 69 6c 61 62 6c  #       availabl
f280: 65 20 62 75 69 6c 64 20 6f 66 20 53 79 73 74 65  e build of Syste
f290: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 61 6e  m.Data.SQLite an
f2a0: 64 20 74 68 65 6e 20 72 65 74 75 72 6e 0d 0a 20  d then return.. 
f2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20               #  
f2c0: 20 20 20 20 20 69 6d 6d 65 64 69 61 74 65 6c 79       immediately
f2d0: 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
f2e0: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
f2f0: 20 20 69 66 20 7b 24 73 65 6c 65 63 74 20 26 26    if {$select &&
f300: 20 5b 6d 61 74 63 68 50 6c 61 74 66 6f 72 6d 20   [matchPlatform 
f310: 24 70 6c 61 74 66 6f 72 6d 5d 7d 20 74 68 65 6e  $platform]} then
f320: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
f330: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
f340: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4d         # NOTE: M
f350: 61 6e 75 61 6c 6c 79 20 6f 76 65 72 72 69 64 65  anually override
f360: 20 61 6c 6c 20 74 68 65 20 62 75 69 6c 64 20 64   all the build d
f370: 69 72 65 63 74 6f 72 79 20 73 65 6c 65 63 74 69  irectory selecti
f380: 6f 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  on..            
f390: 20 20 20 20 23 20 20 20 20 20 20 20 72 65 6c 61      #       rela
f3a0: 74 65 64 20 74 65 73 74 20 73 65 74 74 69 6e 67  ted test setting
f3b0: 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 6f  s in order to fo
f3c0: 72 63 65 20 74 68 69 73 20 62 75 69 6c 64 0d 0a  rce this build..
f3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f3e0: 23 20 20 20 20 20 20 20 6f 66 20 53 79 73 74 65  #       of Syste
f3f0: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 74 6f  m.Data.SQLite to
f400: 20 62 65 20 75 73 65 64 2e 0d 0a 20 20 20 20 20   be used...     
f410: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
f420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
f430: 20 7b 21 5b 63 68 61 6e 67 65 4e 61 74 69 76 65   {![changeNative
f440: 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 24 6e  RuntimeOption $n
f450: 61 74 69 76 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a  ative]} then {..
f460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f470: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
f480: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
f490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f4a0: 20 20 20 20 20 20 22 6e 6f 2c 20 66 61 69 6c 65        "no, faile
f4b0: 64 20 74 6f 20 22 20 5b 65 78 70 72 20 7b 24 6e  d to " [expr {$n
f4c0: 61 74 69 76 65 20 3f 20 22 61 64 64 22 20 3a 20  ative ? "add" : 
f4d0: 22 72 65 6d 6f 76 65 22 7d 5d 20 5c 0d 0a 20 20  "remove"}] \..  
f4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f4f0: 20 20 20 20 22 20 74 68 65 20 5c 22 6e 61 74 69      " the \"nati
f500: 76 65 5c 22 20 72 75 6e 74 69 6d 65 20 6f 70 74  ve\" runtime opt
f510: 69 6f 6e 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20  ion\n"]....     
f520: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
f530: 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20 20  urn false..     
f540: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
f550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f560: 73 65 74 20 3a 3a 74 65 73 74 5f 79 65 61 72 20  set ::test_year 
f570: 24 79 65 61 72 0d 0a 20 20 20 20 20 20 20 20 20  $year..         
f580: 20 20 20 20 20 20 20 73 65 74 20 3a 3a 74 65 73         set ::tes
f590: 74 5f 70 6c 61 74 66 6f 72 6d 20 24 70 6c 61 74  t_platform $plat
f5a0: 66 6f 72 6d 0d 0a 20 20 20 20 20 20 20 20 20 20  form..          
f5b0: 20 20 20 20 20 20 73 65 74 20 3a 3a 74 65 73 74        set ::test
f5c0: 5f 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 24  _configuration $
f5d0: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 0d 0a 0d  configuration...
f5e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f5f0: 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
f600: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
f610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f620: 20 20 20 22 79 65 73 2c 20 73 65 6c 65 63 74 65     "yes, selecte
f630: 64 20 28 22 20 5b 65 78 70 72 20 7b 24 6e 61 74  d (" [expr {$nat
f640: 69 76 65 20 3f 20 22 6e 61 74 69 76 65 2f 22 20  ive ? "native/" 
f650: 3a 20 22 22 7d 5d 20 5c 0d 0a 20 20 20 20 20 20  : ""}] \..      
f660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 65                [e
f670: 78 70 72 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e  xpr {[string len
f680: 67 74 68 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3e  gth $platform] >
f690: 20 30 20 3f 20 5b 61 70 70 65 6e 64 41 72 67 73   0 ? [appendArgs
f6a0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
f6b0: 20 20 20 20 20 20 20 20 24 70 6c 61 74 66 6f 72          $platfor
f6c0: 6d 20 2f 5d 20 3a 20 22 22 7d 5d 20 24 79 65 61  m /] : ""}] $yea
f6d0: 72 20 2f 20 24 63 6f 6e 66 69 67 75 72 61 74 69  r / $configurati
f6e0: 6f 6e 20 22 29 5c 6e 22 5d 0d 0a 0d 0a 20 20 20  on ")\n"]....   
f6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
f700: 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20  urn true..      
f710: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
f720: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
f730: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
f740: 20 79 65 73 5c 6e 0d 0a 20 20 20 20 20 20 20 20   yes\n..        
f750: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
f760: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
f770: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
f780: 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e  ts $channel no\n
f790: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
f7a0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
f7b0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
f7c0: 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ....      return
f7d0: 20 66 61 6c 73 65 0d 0a 20 20 20 20 7d 0d 0a 0c   false..    }...
f7e0: 0d 0a 20 20 20 20 70 72 6f 63 20 63 68 65 63 6b  ..    proc check
f7f0: 46 6f 72 53 51 4c 69 74 65 52 65 6c 65 61 73 65  ForSQLiteRelease
f800: 73 20 7b 20 63 68 61 6e 6e 65 6c 20 7b 73 65 6c  s { channel {sel
f810: 65 63 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a  ect false} } {..
f820: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
f830: 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 66 6f 72   NOTE: Check for
f840: 20 70 61 73 74 20 72 65 6c 65 61 73 65 73 20 6f   past releases o
f850: 66 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  f System.Data.SQ
f860: 4c 69 74 65 20 69 6e 20 74 68 65 20 64 69 72 65  Lite in the dire
f870: 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 23 20 20  ctory..      #  
f880: 20 20 20 20 20 63 6f 6e 74 61 69 6e 65 64 20 69       contained i
f890: 6e 20 74 68 65 20 22 53 79 73 74 65 6d 2e 44 61  n the "System.Da
f8a0: 74 61 2e 53 51 4c 69 74 65 22 20 65 6e 76 69 72  ta.SQLite" envir
f8b0: 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 2c  onment variable,
f8c0: 20 69 66 0d 0a 20 20 20 20 20 20 23 20 20 20 20   if..      #    
f8d0: 20 20 20 70 72 65 73 65 6e 74 2e 0d 0a 20 20 20     present...   
f8e0: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
f8f0: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 65  [info exists ::e
f900: 6e 76 28 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  nv(System.Data.S
f910: 51 4c 69 74 65 29 5d 20 26 26 20 5c 0d 0a 20 20  QLite)] && \..  
f920: 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20          [string 
f930: 6c 65 6e 67 74 68 20 24 3a 3a 65 6e 76 28 53 79  length $::env(Sy
f940: 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
f950: 29 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  )] > 0} then {..
f960: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
f970: 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64     # NOTE: Build
f980: 20 74 68 65 20 66 75 6c 6c 79 20 71 75 61 6c 69   the fully quali
f990: 66 69 65 64 20 64 69 72 65 63 74 6f 72 79 20 77  fied directory w
f9a0: 68 65 72 65 20 74 68 65 20 6e 65 63 65 73 73 61  here the necessa
f9b0: 72 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ry..        #   
f9c0: 20 20 20 20 63 6f 6d 70 6f 6e 65 6e 74 73 20 66      components f
f9d0: 6f 72 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  or System.Data.S
f9e0: 51 4c 69 74 65 20 73 68 6f 75 6c 64 20 62 65 20  QLite should be 
f9f0: 66 6f 75 6e 64 2e 0d 0a 20 20 20 20 20 20 20 20  found...        
fa00: 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 64  #..        set d
fa10: 69 72 65 63 74 6f 72 79 20 5b 66 69 6c 65 20 6e  irectory [file n
fa20: 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20  ativename [file 
fa30: 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20  join \..        
fa40: 20 20 20 20 24 3a 3a 65 6e 76 28 53 79 73 74 65      $::env(Syste
fa50: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 29 20 5b  m.Data.SQLite) [
fa60: 67 65 74 52 65 6c 65 61 73 65 56 65 72 73 69 6f  getReleaseVersio
fa70: 6e 5d 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  n]]]....        
fa80: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
fa90: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
faa0: 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
fab0: 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 53 79 73  checking for Sys
fac0: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20  tem.Data.SQLite 
fad0: 72 65 6c 65 61 73 65 20 5c 22 22 20 5c 0d 0a 20  release \"" \.. 
fae0: 20 20 20 20 20 20 20 20 20 20 20 24 64 69 72 65             $dire
faf0: 63 74 6f 72 79 20 22 5c 22 2e 2e 2e 20 22 5d 0d  ctory "\"... "].
fb00: 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  ...        if {[
fb10: 69 73 52 65 6c 65 61 73 65 41 76 61 69 6c 61 62  isReleaseAvailab
fb20: 6c 65 20 24 64 69 72 65 63 74 6f 72 79 20 70 6c  le $directory pl
fb30: 61 74 66 6f 72 6d 5d 7d 20 74 68 65 6e 20 7b 0d  atform]} then {.
fb40: 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b  .          if {[
fb50: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 70  string length $p
fb60: 6c 61 74 66 6f 72 6d 5d 20 3d 3d 20 30 7d 20 74  latform] == 0} t
fb70: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
fb80: 20 20 20 73 65 74 20 70 6c 61 74 66 6f 72 6d 20     set platform 
fb90: 75 6e 6b 6e 6f 77 6e 0d 0a 20 20 20 20 20 20 20  unknown..       
fba0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
fbb0: 20 20 69 66 20 7b 24 73 65 6c 65 63 74 20 26 26    if {$select &&
fbc0: 20 5b 6d 61 74 63 68 50 6c 61 74 66 6f 72 6d 20   [matchPlatform 
fbd0: 24 70 6c 61 74 66 6f 72 6d 5d 7d 20 74 68 65 6e  $platform]} then
fbe0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
fbf0: 73 65 74 20 3a 3a 62 75 69 6c 64 5f 64 69 72 65  set ::build_dire
fc00: 63 74 6f 72 79 20 24 64 69 72 65 63 74 6f 72 79  ctory $directory
fc10: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
fc20: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
fc30: 61 70 70 65 6e 64 41 72 67 73 20 22 79 65 73 2c  appendArgs "yes,
fc40: 20 73 65 6c 65 63 74 65 64 20 28 22 20 24 70 6c   selected (" $pl
fc50: 61 74 66 6f 72 6d 20 22 29 5c 6e 22 5d 0d 0a 0d  atform ")\n"]...
fc60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
fc70: 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20  urn true..      
fc80: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
fc90: 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
fca0: 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
fcb0: 41 72 67 73 20 22 79 65 73 20 28 22 20 24 70 6c  Args "yes (" $pl
fcc0: 61 74 66 6f 72 6d 20 22 29 5c 6e 22 5d 0d 0a 20  atform ")\n"].. 
fcd0: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
fce0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
fcf0: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
fd00: 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 0d 0a 20  hannel no\n.... 
fd10: 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 66           if {![f
fd20: 69 6c 65 20 65 78 69 73 74 73 20 24 64 69 72 65  ile exists $dire
fd30: 63 74 6f 72 79 5d 20 7c 7c 20 5c 0d 0a 20 20 20  ctory] || \..   
fd40: 20 20 20 20 20 20 20 20 20 20 20 21 5b 66 69 6c             ![fil
fd50: 65 20 69 73 64 69 72 65 63 74 6f 72 79 20 24 64  e isdirectory $d
fd60: 69 72 65 63 74 6f 72 79 5d 7d 20 74 68 65 6e 20  irectory]} then 
fd70: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
fd80: 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
fd90: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
fda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
fdb0: 2d 2d 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76  -- environment v
fdc0: 61 72 69 61 62 6c 65 20 5c 22 53 79 73 74 65 6d  ariable \"System
fdd0: 2e 44 61 74 61 2e 53 51 4c 69 74 65 5c 22 20 69  .Data.SQLite\" i
fde0: 73 20 61 6e 20 22 20 5c 0d 0a 20 20 20 20 20 20  s an " \..      
fdf0: 20 20 20 20 20 20 20 20 20 20 22 69 6e 76 61 6c            "inval
fe00: 69 64 20 64 69 72 65 63 74 6f 72 79 2c 20 73 6b  id directory, sk
fe10: 69 70 70 69 6e 67 20 63 68 65 63 6b 20 66 6f 72  ipping check for
fe20: 20 72 65 6c 65 61 73 65 73 2e 2e 2e 5c 6e 22 5d   releases...\n"]
fe30: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
fe40: 72 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20  return false..  
fe50: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
fe60: 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 70         foreach p
fe70: 61 74 68 20 5b 6c 73 6f 72 74 20 2d 64 65 63 72  ath [lsort -decr
fe80: 65 61 73 69 6e 67 20 5b 66 69 6c 65 20 6c 69 73  easing [file lis
fe90: 74 20 24 64 69 72 65 63 74 6f 72 79 20 2a 5d 5d  t $directory *]]
fea0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
feb0: 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73  if {[file exists
fec0: 20 24 70 61 74 68 5d 20 26 26 20 5b 66 69 6c 65   $path] && [file
fed0: 20 69 73 64 69 72 65 63 74 6f 72 79 20 24 70 61   isdirectory $pa
fee0: 74 68 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  th]} then {..   
fef0: 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
ff00: 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
ff10: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
ff20: 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
ff30: 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 53 79   checking for Sy
ff40: 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
ff50: 20 72 65 6c 65 61 73 65 20 5c 22 22 20 5c 0d 0a   release \"" \..
ff60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff70: 20 20 24 70 61 74 68 20 22 5c 22 2e 2e 2e 20 22    $path "\"... "
ff80: 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ]....           
ff90: 20 20 20 69 66 20 7b 5b 69 73 52 65 6c 65 61 73     if {[isReleas
ffa0: 65 41 76 61 69 6c 61 62 6c 65 20 24 70 61 74 68  eAvailable $path
ffb0: 20 70 6c 61 74 66 6f 72 6d 5d 7d 20 74 68 65 6e   platform]} then
ffc0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
ffd0: 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
ffe0: 6c 65 6e 67 74 68 20 24 70 6c 61 74 66 6f 72 6d  length $platform
fff0: 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
10000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10010 20 20 73 65 74 20 70 6c 61 74 66 6f 72 6d 20 75    set platform u
10020 6e 6b 6e 6f 77 6e 0d 0a 20 20 20 20 20 20 20 20  nknown..        
10030 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
10040 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
10050 7b 24 73 65 6c 65 63 74 20 26 26 20 5b 6d 61 74  {$select && [mat
10060 63 68 50 6c 61 74 66 6f 72 6d 20 24 70 6c 61 74  chPlatform $plat
10070 66 6f 72 6d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  form]} then {.. 
10080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10090 20 73 65 74 20 3a 3a 62 75 69 6c 64 5f 64 69 72   set ::build_dir
100a0 65 63 74 6f 72 79 20 24 70 61 74 68 0d 0a 0d 0a  ectory $path....
100b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
100c0 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
100d0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 79 65   [appendArgs "ye
100e0 73 2c 20 73 65 6c 65 63 74 65 64 20 28 22 20 24  s, selected (" $
100f0 70 6c 61 74 66 6f 72 6d 20 22 29 5c 6e 22 5d 0d  platform ")\n"].
10100 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
10110 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65       return true
10120 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
10130 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
10140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70                tp
10150 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
10160 70 65 6e 64 41 72 67 73 20 22 79 65 73 20 28 22  pendArgs "yes ("
10170 20 24 70 6c 61 74 66 6f 72 6d 20 22 29 5c 6e 22   $platform ")\n"
10180 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ]..             
10190 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
101a0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
101b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70                tp
101c0 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c  uts $channel no\
101d0 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n..             
101e0 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
101f0 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  }..          }..
10200 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
10210 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
10220 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
10230 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
10240 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d  .            "--
10250 2d 2d 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76  -- environment v
10260 61 72 69 61 62 6c 65 20 5c 22 53 79 73 74 65 6d  ariable \"System
10270 2e 44 61 74 61 2e 53 51 4c 69 74 65 5c 22 20 69  .Data.SQLite\" i
10280 73 20 6e 6f 74 20 22 20 5c 0d 0a 20 20 20 20 20  s not " \..     
10290 20 20 20 20 20 20 20 22 73 65 74 2c 20 73 6b 69         "set, ski
102a0 70 70 69 6e 67 20 63 68 65 63 6b 20 66 6f 72 20  pping check for 
102b0 72 65 6c 65 61 73 65 73 2e 2e 2e 5c 6e 22 5d 0d  releases...\n"].
102c0 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
102d0 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a    return false..
102e0 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
102f0 6f 63 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74  oc checkForSQLit
10300 65 4c 69 62 72 61 72 79 20 7b 20 63 68 61 6e 6e  eLibrary { chann
10310 65 6c 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74 70  el } {..      tp
10320 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d  uts $channel "--
10330 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20  -- checking for 
10340 53 51 4c 69 74 65 20 63 6f 72 65 20 6c 69 62 72  SQLite core libr
10350 61 72 79 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20  ary... "....    
10360 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
10370 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69          object i
10380 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f  nvoke -flags +No
10390 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20  nPublic \..     
103a0 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61         System.Da
103b0 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65  ta.SQLite.SQLite
103c0 33 20 53 51 4c 69 74 65 56 65 72 73 69 6f 6e 0d  3 SQLiteVersion.
103d0 0a 20 20 20 20 20 20 7d 20 76 65 72 73 69 6f 6e  .      } version
103e0 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
103f0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
10400 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b     # NOTE: Check
10410 20 69 66 20 74 68 65 20 72 65 74 75 72 6e 65 64   if the returned
10420 20 76 65 72 73 69 6f 6e 20 77 61 73 20 6e 75 6c   version was nul
10430 6c 2e 20 20 49 66 20 73 6f 2c 20 6d 61 6b 65 20  l.  If so, make 
10440 69 74 20 65 61 73 79 0d 0a 20 20 20 20 20 20 20  it easy..       
10450 20 23 20 20 20 20 20 20 20 74 6f 20 73 70 6f 74   #       to spot
10460 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
10470 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
10480 67 20 6c 65 6e 67 74 68 20 24 76 65 72 73 69 6f  g length $versio
10490 6e 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  n] == 0} then {.
104a0 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20 76  .          set v
104b0 65 72 73 69 6f 6e 20 6e 75 6c 6c 0d 0a 20 20 20  ersion null..   
104c0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
104d0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
104e0 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20  OTE: Attempt to 
104f0 71 75 65 72 79 20 74 68 65 20 46 6f 73 73 69 6c  query the Fossil
10500 20 73 6f 75 72 63 65 20 69 64 65 6e 74 69 66 69   source identifi
10510 65 72 20 66 6f 72 20 74 68 65 20 53 51 4c 69 74  er for the SQLit
10520 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
10530 20 20 20 63 6f 72 65 20 6c 69 62 72 61 72 79 2e     core library.
10540 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
10550 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
10560 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a  {..          obj
10570 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67  ect invoke -flag
10580 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a  s +NonPublic \..
10590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79                Sy
105a0 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
105b0 2e 53 51 4c 69 74 65 33 20 53 51 4c 69 74 65 53  .SQLite3 SQLiteS
105c0 6f 75 72 63 65 49 64 0d 0a 20 20 20 20 20 20 20  ourceId..       
105d0 20 7d 20 73 6f 75 72 63 65 49 64 5d 7d 20 74 68   } sourceId]} th
105e0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
105f0 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e  #..          # N
10600 4f 54 45 3a 20 57 65 20 66 61 69 6c 65 64 20 74  OTE: We failed t
10610 6f 20 71 75 65 72 79 20 74 68 65 20 46 6f 73 73  o query the Foss
10620 69 6c 20 73 6f 75 72 63 65 20 69 64 65 6e 74 69  il source identi
10630 66 69 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 20  fier...         
10640 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   #..          se
10650 74 20 73 6f 75 72 63 65 49 64 20 75 6e 6b 6e 6f  t sourceId unkno
10660 77 6e 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  wn..        }...
10670 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
10680 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63      # NOTE: Chec
10690 6b 20 69 66 20 74 68 65 20 72 65 74 75 72 6e 65  k if the returne
106a0 64 20 46 6f 73 73 69 6c 20 73 6f 75 72 63 65 20  d Fossil source 
106b0 69 64 65 6e 74 69 66 69 65 72 20 77 61 73 20 6e  identifier was n
106c0 75 6c 6c 2e 20 20 49 66 0d 0a 20 20 20 20 20 20  ull.  If..      
106d0 20 20 23 20 20 20 20 20 20 20 73 6f 2c 20 6d 61    #       so, ma
106e0 6b 65 20 69 74 20 65 61 73 79 20 74 6f 20 73 70  ke it easy to sp
106f0 6f 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ot...        #..
10700 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72          if {[str
10710 69 6e 67 20 6c 65 6e 67 74 68 20 24 73 6f 75 72  ing length $sour
10720 63 65 49 64 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  ceId] == 0} then
10730 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   {..          se
10740 74 20 73 6f 75 72 63 65 49 64 20 6e 75 6c 6c 0d  t sourceId null.
10750 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
10760 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
10770 20 23 20 4e 4f 54 45 3a 20 59 65 73 2c 20 74 68   # NOTE: Yes, th
10780 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20 6c 69  e SQLite core li
10790 62 72 61 72 79 20 61 70 70 65 61 72 73 20 74 6f  brary appears to
107a0 20 62 65 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0a   be available...
107b0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
107c0 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74     addConstraint
107d0 20 53 51 4c 69 74 65 0d 0a 0d 0a 20 20 20 20 20   SQLite....     
107e0 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
107f0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 79  l [appendArgs "y
10800 65 73 20 28 22 20 24 76 65 72 73 69 6f 6e 20 22  es (" $version "
10810 20 22 20 24 73 6f 75 72 63 65 49 64 20 22 29 5c   " $sourceId ")\
10820 6e 22 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  n"]..      } els
10830 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75  e {..        tpu
10840 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e  ts $channel no\n
10850 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
10860 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 68  .....    proc ch
10870 65 63 6b 46 6f 72 53 51 4c 69 74 65 49 6e 74 65  eckForSQLiteInte
10880 72 6f 70 20 7b 20 63 68 61 6e 6e 65 6c 20 7d 20  rop { channel } 
10890 7b 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20 24  {..      tputs $
108a0 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 68  channel "---- ch
108b0 65 63 6b 69 6e 67 20 66 6f 72 20 53 51 4c 69 74  ecking for SQLit
108c0 65 20 69 6e 74 65 72 6f 70 20 61 73 73 65 6d 62  e interop assemb
108d0 6c 79 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20  ly... "....     
108e0 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
108f0 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e         object in
10900 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e  voke -flags +Non
10910 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20  Public \..      
10920 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74        System.Dat
10930 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 33  a.SQLite.SQLite3
10940 20 49 6e 74 65 72 6f 70 56 65 72 73 69 6f 6e 0d   InteropVersion.
10950 0a 20 20 20 20 20 20 7d 20 76 65 72 73 69 6f 6e  .      } version
10960 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
10970 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
10980 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b     # NOTE: Check
10990 20 69 66 20 74 68 65 20 72 65 74 75 72 6e 65 64   if the returned
109a0 20 76 65 72 73 69 6f 6e 20 77 61 73 20 6e 75 6c   version was nul
109b0 6c 2e 20 20 49 66 20 73 6f 2c 20 6d 61 6b 65 20  l.  If so, make 
109c0 69 74 20 65 61 73 79 0d 0a 20 20 20 20 20 20 20  it easy..       
109d0 20 23 20 20 20 20 20 20 20 74 6f 20 73 70 6f 74   #       to spot
109e0 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
109f0 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
10a00 67 20 6c 65 6e 67 74 68 20 24 76 65 72 73 69 6f  g length $versio
10a10 6e 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  n] == 0} then {.
10a20 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20 76  .          set v
10a30 65 72 73 69 6f 6e 20 6e 75 6c 6c 0d 0a 20 20 20  ersion null..   
10a40 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
10a50 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
10a60 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20  OTE: Attempt to 
10a70 71 75 65 72 79 20 74 68 65 20 46 6f 73 73 69 6c  query the Fossil
10a80 20 73 6f 75 72 63 65 20 69 64 65 6e 74 69 66 69   source identifi
10a90 65 72 20 66 6f 72 20 74 68 65 20 53 51 4c 69 74  er for the SQLit
10aa0 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
10ab0 20 20 20 63 6f 72 65 20 6c 69 62 72 61 72 79 2e     core library.
10ac0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
10ad0 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
10ae0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a  {..          obj
10af0 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67  ect invoke -flag
10b00 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a  s +NonPublic \..
10b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79                Sy
10b20 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
10b30 2e 53 51 4c 69 74 65 33 20 49 6e 74 65 72 6f 70  .SQLite3 Interop
10b40 53 6f 75 72 63 65 49 64 0d 0a 20 20 20 20 20 20  SourceId..      
10b50 20 20 7d 20 73 6f 75 72 63 65 49 64 5d 7d 20 74    } sourceId]} t
10b60 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
10b70 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
10b80 4e 4f 54 45 3a 20 57 65 20 66 61 69 6c 65 64 20  NOTE: We failed 
10b90 74 6f 20 71 75 65 72 79 20 74 68 65 20 46 6f 73  to query the Fos
10ba0 73 69 6c 20 73 6f 75 72 63 65 20 69 64 65 6e 74  sil source ident
10bb0 69 66 69 65 72 2e 0d 0a 20 20 20 20 20 20 20 20  ifier...        
10bc0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73    #..          s
10bd0 65 74 20 73 6f 75 72 63 65 49 64 20 75 6e 6b 6e  et sourceId unkn
10be0 6f 77 6e 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  own..        }..
10bf0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
10c00 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65       # NOTE: Che
10c10 63 6b 20 69 66 20 74 68 65 20 72 65 74 75 72 6e  ck if the return
10c20 65 64 20 46 6f 73 73 69 6c 20 73 6f 75 72 63 65  ed Fossil source
10c30 20 69 64 65 6e 74 69 66 69 65 72 20 77 61 73 20   identifier was 
10c40 6e 75 6c 6c 2e 20 20 49 66 0d 0a 20 20 20 20 20  null.  If..     
10c50 20 20 20 23 20 20 20 20 20 20 20 73 6f 2c 20 6d     #       so, m
10c60 61 6b 65 20 69 74 20 65 61 73 79 20 74 6f 20 73  ake it easy to s
10c70 70 6f 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  pot...        #.
10c80 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74  .        if {[st
10c90 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 73 6f 75  ring length $sou
10ca0 72 63 65 49 64 5d 20 3d 3d 20 30 7d 20 74 68 65  rceId] == 0} the
10cb0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73  n {..          s
10cc0 65 74 20 73 6f 75 72 63 65 49 64 20 6e 75 6c 6c  et sourceId null
10cd0 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
10ce0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
10cf0 20 20 23 20 4e 4f 54 45 3a 20 42 65 66 6f 72 65    # NOTE: Before
10d00 20 61 63 74 75 61 6c 6c 79 20 61 64 64 69 6e 67   actually adding
10d10 20 74 68 65 20 74 65 73 74 20 63 6f 6e 73 74 72   the test constr
10d20 61 69 6e 74 2c 20 6d 61 6b 65 20 73 75 72 65 20  aint, make sure 
10d30 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  the..        #  
10d40 20 20 20 20 20 76 65 72 73 69 6f 6e 20 69 73 20       version is 
10d50 76 61 6c 69 64 20 28 69 2e 65 2e 20 6e 6f 74 20  valid (i.e. not 
10d60 6a 75 73 74 20 74 68 61 74 20 77 65 20 63 6f 75  just that we cou
10d70 6c 64 20 71 75 65 72 79 20 69 74 29 2e 0d 0a 20  ld query it)... 
10d80 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
10d90 20 20 69 66 20 7b 24 76 65 72 73 69 6f 6e 20 6e    if {$version n
10da0 65 20 22 6e 75 6c 6c 22 7d 20 74 68 65 6e 20 7b  e "null"} then {
10db0 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
10dc0 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
10dd0 20 59 65 73 2c 20 74 68 65 20 53 51 4c 69 74 65   Yes, the SQLite
10de0 20 69 6e 74 65 72 6f 70 20 61 73 73 65 6d 62 6c   interop assembl
10df0 79 20 61 70 70 65 61 72 73 20 74 6f 20 62 65 20  y appears to be 
10e00 61 76 61 69 6c 61 62 6c 65 2e 0d 0a 20 20 20 20  available...    
10e10 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
10e20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74     addConstraint
10e30 20 53 51 4c 69 74 65 49 6e 74 65 72 6f 70 0d 0a   SQLiteInterop..
10e40 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
10e50 61 6e 73 77 65 72 20 79 65 73 0d 0a 20 20 20 20  answer yes..    
10e60 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
10e70 20 20 20 20 20 20 20 20 73 65 74 20 61 6e 73 77          set answ
10e80 65 72 20 6e 6f 0d 0a 20 20 20 20 20 20 20 20 7d  er no..        }
10e90 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74  ....        tput
10ea0 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
10eb0 6e 64 41 72 67 73 20 24 61 6e 73 77 65 72 20 22  ndArgs $answer "
10ec0 20 28 22 20 24 76 65 72 73 69 6f 6e 20 22 20 22   (" $version " "
10ed0 20 24 73 6f 75 72 63 65 49 64 20 22 29 5c 6e 22   $sourceId ")\n"
10ee0 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  ]..      } else 
10ef0 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  {..        tputs
10f00 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a   $channel no\n..
10f10 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
10f20 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 68 65 63  ...    proc chec
10f30 6b 46 6f 72 53 51 4c 69 74 65 44 65 66 69 6e 65  kForSQLiteDefine
10f40 43 6f 6e 73 74 61 6e 74 20 7b 20 63 68 61 6e 6e  Constant { chann
10f50 65 6c 20 6e 61 6d 65 20 7d 20 7b 0d 0a 20 20 20  el name } {..   
10f60 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
10f70 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
10f80 0a 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d  .          "----
10f90 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 53 79   checking for Sy
10fa0 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
10fb0 20 64 65 66 69 6e 65 20 63 6f 6e 73 74 61 6e 74   define constant
10fc0 20 5c 22 22 20 24 6e 61 6d 65 20 5c 0d 0a 20 20   \"" $name \..  
10fd0 20 20 20 20 20 20 20 20 22 5c 22 2e 2e 2e 20 22          "\"... "
10fe0 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  ]....      if {[
10ff0 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
11000 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d   object invoke -
11010 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63  flags +NonPublic
11020 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
11030 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
11040 74 65 2e 53 51 4c 69 74 65 33 20 44 65 66 69 6e  te.SQLite3 Defin
11050 65 43 6f 6e 73 74 61 6e 74 73 0d 0a 20 20 20 20  eConstants..    
11060 20 20 7d 20 64 65 66 69 6e 65 43 6f 6e 73 74 61    } defineConsta
11070 6e 74 73 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  nts] == 0} then 
11080 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  {..        if {[
11090 6c 73 65 61 72 63 68 20 2d 65 78 61 63 74 20 2d  lsearch -exact -
110a0 6e 6f 63 61 73 65 20 24 64 65 66 69 6e 65 43 6f  nocase $defineCo
110b0 6e 73 74 61 6e 74 73 20 24 6e 61 6d 65 5d 20 21  nstants $name] !
110c0 3d 20 2d 31 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  = -1} then {..  
110d0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
110e0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 59 65 73       # NOTE: Yes
110f0 2c 20 74 68 69 73 20 64 65 66 69 6e 65 20 63 6f  , this define co
11100 6e 73 74 61 6e 74 20 77 61 73 20 65 6e 61 62 6c  nstant was enabl
11110 65 64 20 77 68 65 6e 20 74 68 65 20 6d 61 6e 61  ed when the mana
11120 67 65 64 0d 0a 20 20 20 20 20 20 20 20 20 20 23  ged..          #
11130 20 20 20 20 20 20 20 61 73 73 65 6d 62 6c 79 20         assembly 
11140 77 61 73 20 63 6f 6d 70 69 6c 65 64 2e 0d 0a 20  was compiled... 
11150 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
11160 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61        addConstra
11170 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20  int [appendArgs 
11180 5b 67 65 74 53 51 4c 69 74 65 44 65 66 69 6e 65  [getSQLiteDefine
11190 43 6f 6e 73 74 61 6e 74 50 72 65 66 69 78 5d 20  ConstantPrefix] 
111a0 24 6e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20  $name]....      
111b0 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
111c0 65 6c 20 79 65 73 5c 6e 0d 0a 20 20 20 20 20 20  el yes\n..      
111d0 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
111e0 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
111f0 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20 20  nnel no\n..     
11200 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c     }..      } el
11210 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70  se {..        tp
11220 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 65 72 72  uts $channel err
11230 6f 72 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  or\n..      }.. 
11240 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
11250 63 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65  c checkForSQLite
11260 43 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 20 7b 20  CompileOption { 
11270 63 68 61 6e 6e 65 6c 20 6e 61 6d 65 20 7d 20 7b  channel name } {
11280 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20 24 63  ..      tputs $c
11290 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
112a0 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
112b0 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66  "---- checking f
112c0 6f 72 20 53 51 4c 69 74 65 20 69 6e 74 65 72 6f  or SQLite intero
112d0 70 20 61 73 73 65 6d 62 6c 79 20 63 6f 6d 70 69  p assembly compi
112e0 6c 65 20 6f 70 74 69 6f 6e 20 5c 22 22 20 5c 0d  le option \"" \.
112f0 0a 20 20 20 20 20 20 20 20 20 20 24 6e 61 6d 65  .          $name
11300 20 22 5c 22 2e 2e 2e 20 22 5d 0d 0a 0d 0a 20 20   "\"... "]....  
11310 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
11320 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74  ..        object
11330 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b   invoke -flags +
11340 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20  NonPublic \..   
11350 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e           System.
11360 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69  Data.SQLite.SQLi
11370 74 65 33 20 49 6e 74 65 72 6f 70 43 6f 6d 70 69  te3 InteropCompi
11380 6c 65 4f 70 74 69 6f 6e 73 0d 0a 20 20 20 20 20  leOptions..     
11390 20 7d 20 63 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e   } compileOption
113a0 73 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  s] == 0} then {.
113b0 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 6c 73  .        if {[ls
113c0 65 61 72 63 68 20 2d 65 78 61 63 74 20 2d 6e 6f  earch -exact -no
113d0 63 61 73 65 20 24 63 6f 6d 70 69 6c 65 4f 70 74  case $compileOpt
113e0 69 6f 6e 73 20 24 6e 61 6d 65 5d 20 21 3d 20 2d  ions $name] != -
113f0 31 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  1} then {..     
11400 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
11410 20 20 23 20 4e 4f 54 45 3a 20 59 65 73 2c 20 74    # NOTE: Yes, t
11420 68 69 73 20 63 6f 6d 70 69 6c 65 20 6f 70 74 69  his compile opti
11430 6f 6e 20 77 61 73 20 65 6e 61 62 6c 65 64 20 77  on was enabled w
11440 68 65 6e 20 74 68 65 20 69 6e 74 65 72 6f 70 0d  hen the interop.
11450 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20  .          #    
11460 20 20 20 61 73 73 65 6d 62 6c 79 20 77 61 73 20     assembly was 
11470 63 6f 6d 70 69 6c 65 64 2e 0d 0a 20 20 20 20 20  compiled...     
11480 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
11490 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20    addConstraint 
114a0 5b 61 70 70 65 6e 64 41 72 67 73 20 5b 67 65 74  [appendArgs [get
114b0 53 51 4c 69 74 65 43 6f 6d 70 69 6c 65 4f 70 74  SQLiteCompileOpt
114c0 69 6f 6e 50 72 65 66 69 78 5d 20 24 6e 61 6d 65  ionPrefix] $name
114d0 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 74  ]....          t
114e0 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 79 65  puts $channel ye
114f0 73 5c 6e 0d 0a 20 20 20 20 20 20 20 20 7d 20 65  s\n..        } e
11500 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
11510 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
11520 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20 20 20 7d 0d  no\n..        }.
11530 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
11540 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
11550 63 68 61 6e 6e 65 6c 20 65 72 72 6f 72 5c 6e 0d  channel error\n.
11560 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
11570 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
11580 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
11590 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
115a0 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 53 51 4c  checking for SQL
115b0 69 74 65 20 63 6f 72 65 20 6c 69 62 72 61 72 79  ite core library
115c0 20 63 6f 6d 70 69 6c 65 20 6f 70 74 69 6f 6e 20   compile option 
115d0 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  \"" \..         
115e0 20 24 6e 61 6d 65 20 22 5c 22 2e 2e 2e 20 22 5d   $name "\"... "]
115f0 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63  ....      if {[c
11600 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
11610 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66  object invoke -f
11620 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20  lags +NonPublic 
11630 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 53  \..            S
11640 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
11650 65 2e 53 51 4c 69 74 65 33 20 53 51 4c 69 74 65  e.SQLite3 SQLite
11660 43 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 73 0d 0a  CompileOptions..
11670 20 20 20 20 20 20 7d 20 63 6f 6d 70 69 6c 65 4f        } compileO
11680 70 74 69 6f 6e 73 5d 20 3d 3d 20 30 7d 20 74 68  ptions] == 0} th
11690 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66  en {..        if
116a0 20 7b 5b 6c 73 65 61 72 63 68 20 2d 65 78 61 63   {[lsearch -exac
116b0 74 20 2d 6e 6f 63 61 73 65 20 24 63 6f 6d 70 69  t -nocase $compi
116c0 6c 65 4f 70 74 69 6f 6e 73 20 24 6e 61 6d 65 5d  leOptions $name]
116d0 20 21 3d 20 2d 31 7d 20 74 68 65 6e 20 7b 0d 0a   != -1} then {..
116e0 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
116f0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 59         # NOTE: Y
11700 65 73 2c 20 74 68 69 73 20 63 6f 6d 70 69 6c 65  es, this compile
11710 20 6f 70 74 69 6f 6e 20 77 61 73 20 65 6e 61 62   option was enab
11720 6c 65 64 20 77 68 65 6e 20 74 68 65 20 53 51 4c  led when the SQL
11730 69 74 65 0d 0a 20 20 20 20 20 20 20 20 20 20 23  ite..          #
11740 20 20 20 20 20 20 20 63 6f 72 65 20 6c 69 62 72         core libr
11750 61 72 79 20 77 61 73 20 63 6f 6d 70 69 6c 65 64  ary was compiled
11760 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
11770 20 20 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e            addCon
11780 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41  straint [appendA
11790 72 67 73 20 5b 67 65 74 53 51 4c 69 74 65 43 6f  rgs [getSQLiteCo
117a0 6d 70 69 6c 65 4f 70 74 69 6f 6e 50 72 65 66 69  mpileOptionPrefi
117b0 78 5d 20 24 6e 61 6d 65 5d 0d 0a 0d 0a 20 20 20  x] $name]....   
117c0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
117d0 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20 20 20  annel yes\n..   
117e0 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
117f0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
11800 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20  channel no\n..  
11810 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
11820 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
11830 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
11840 65 72 72 6f 72 5c 6e 0d 0a 20 20 20 20 20 20 7d  error\n..      }
11850 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
11860 70 72 6f 63 20 67 65 74 44 61 74 65 54 69 6d 65  proc getDateTime
11870 46 6f 72 6d 61 74 20 7b 20 7b 74 69 6d 65 5a 6f  Format { {timeZo
11880 6e 65 20 74 72 75 65 7d 20 7d 20 7b 0d 0a 20 20  ne true} } {..  
11890 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
118a0 4f 54 45 3a 20 54 68 69 73 20 70 72 6f 63 65 64  OTE: This proced
118b0 75 72 65 20 73 69 6d 70 6c 79 20 72 65 74 75 72  ure simply retur
118c0 6e 73 20 74 68 65 20 22 64 65 66 61 75 6c 74 22  ns the "default"
118d0 20 44 61 74 65 54 69 6d 65 20 66 6f 72 6d 61 74   DateTime format
118e0 20 75 73 65 64 0d 0a 20 20 20 20 20 20 23 20 20   used..      #  
118f0 20 20 20 20 20 62 79 20 74 68 65 20 74 65 73 74       by the test
11900 20 73 75 69 74 65 2e 0d 0a 20 20 20 20 20 20 23   suite...      #
11910 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66  ..      if {[inf
11920 6f 20 65 78 69 73 74 73 20 3a 3a 64 61 74 65 74  o exists ::datet
11930 69 6d 65 5f 66 6f 72 6d 61 74 5d 20 26 26 20 5c  ime_format] && \
11940 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72  ..          [str
11950 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 64 61  ing length $::da
11960 74 65 74 69 6d 65 5f 66 6f 72 6d 61 74 5d 20 3e  tetime_format] >
11970 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
11980 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
11990 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e 20 74 68   NOTE: Return th
119a0 65 20 6d 61 6e 75 61 6c 6c 79 20 6f 76 65 72 72  e manually overr
119b0 69 64 64 65 6e 20 76 61 6c 75 65 20 66 6f 72 20  idden value for 
119c0 74 68 65 20 44 61 74 65 54 69 6d 65 20 66 6f 72  the DateTime for
119d0 6d 61 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  mat...        #.
119e0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
119f0 24 3a 3a 64 61 74 65 74 69 6d 65 5f 66 6f 72 6d  $::datetime_form
11a00 61 74 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  at..      } else
11a10 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
11a20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52         # NOTE: R
11a30 65 74 75 72 6e 20 61 6e 20 49 53 4f 38 36 30 31  eturn an ISO8601
11a40 20 44 61 74 65 54 69 6d 65 20 66 6f 72 6d 61 74   DateTime format
11a50 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68   compatible with
11a60 20 53 51 4c 69 74 65 2c 0d 0a 20 20 20 20 20 20   SQLite,..      
11a70 20 20 23 20 20 20 20 20 20 20 53 79 73 74 65 6d    #       System
11a80 2e 44 61 74 61 2e 53 51 4c 69 74 65 2c 20 61 6e  .Data.SQLite, an
11a90 64 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20 72  d suitable for r
11aa0 6f 75 6e 64 2d 74 72 69 70 70 69 6e 67 20 77 69  ound-tripping wi
11ab0 74 68 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20  th the..        
11ac0 23 20 20 20 20 20 20 20 44 61 74 65 54 69 6d 65  #       DateTime
11ad0 20 63 6c 61 73 73 20 6f 66 20 74 68 65 20 66 72   class of the fr
11ae0 61 6d 65 77 6f 72 6b 2e 20 20 49 66 20 74 68 69  amework.  If thi
11af0 73 20 76 61 6c 75 65 20 69 73 20 63 68 61 6e 67  s value is chang
11b00 65 64 2c 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ed,..        #  
11b10 20 20 20 20 20 76 61 72 69 6f 75 73 20 74 65 73       various tes
11b20 74 73 20 6d 61 79 20 66 61 69 6c 2e 0d 0a 20 20  ts may fail...  
11b30 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
11b40 20 72 65 74 75 72 6e 20 5b 61 70 70 65 6e 64 41   return [appendA
11b50 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
11b60 20 20 20 22 79 79 79 79 2d 4d 4d 2d 64 64 20 48     "yyyy-MM-dd H
11b70 48 3a 6d 6d 3a 73 73 2e 46 46 46 46 46 46 46 22  H:mm:ss.FFFFFFF"
11b80 20 5b 65 78 70 72 20 7b 24 74 69 6d 65 5a 6f 6e   [expr {$timeZon
11b90 65 20 3f 20 22 4b 22 20 3a 20 22 22 7d 5d 5d 0d  e ? "K" : ""}]].
11ba0 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
11bb0 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74  ....    proc get
11bc0 44 61 74 65 54 69 6d 65 54 69 63 6b 73 20 7b 20  DateTimeTicks { 
11bd0 76 61 6c 75 65 20 7b 6c 6f 63 61 6c 20 22 22 7d  value {local ""}
11be0 20 7b 64 65 66 61 75 6c 74 20 22 22 7d 20 7d 20   {default ""} } 
11bf0 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74  {..      if {[st
11c00 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 61 6c  ring length $val
11c10 75 65 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  ue] == 0} then {
11c20 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
11c30 20 24 64 65 66 61 75 6c 74 0d 0a 20 20 20 20 20   $default..     
11c40 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b   }....      if {
11c50 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
11c60 20 20 73 65 74 20 64 61 74 65 54 69 6d 65 20 5b    set dateTime [
11c70 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 63  object invoke -c
11c80 72 65 61 74 65 20 5c 0d 0a 20 20 20 20 20 20 20  reate \..       
11c90 20 20 20 20 20 2d 70 61 72 61 6d 65 74 65 72 74       -parametert
11ca0 79 70 65 73 20 5b 6c 69 73 74 20 53 74 72 69 6e  ypes [list Strin
11cb0 67 20 53 74 72 69 6e 67 20 49 46 6f 72 6d 61 74  g String IFormat
11cc0 50 72 6f 76 69 64 65 72 20 5c 0d 0a 20 20 20 20  Provider \..    
11cd0 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 47          System.G
11ce0 6c 6f 62 61 6c 69 7a 61 74 69 6f 6e 2e 44 61 74  lobalization.Dat
11cf0 65 54 69 6d 65 53 74 79 6c 65 73 5d 20 44 61 74  eTimeStyles] Dat
11d00 65 54 69 6d 65 20 50 61 72 73 65 45 78 61 63 74  eTime ParseExact
11d10 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
11d20 24 76 61 6c 75 65 20 5b 67 65 74 44 61 74 65 54  $value [getDateT
11d30 69 6d 65 46 6f 72 6d 61 74 5d 20 6e 75 6c 6c 20  imeFormat] null 
11d40 41 64 6a 75 73 74 54 6f 55 6e 69 76 65 72 73 61  AdjustToUniversa
11d50 6c 5d 0d 0a 20 20 20 20 20 20 7d 5d 7d 20 74 68  l]..      }]} th
11d60 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65  en {..        re
11d70 74 75 72 6e 20 24 64 65 66 61 75 6c 74 0d 0a 20  turn $default.. 
11d80 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
11d90 69 66 20 7b 5b 73 74 72 69 6e 67 20 69 73 20 62  if {[string is b
11da0 6f 6f 6c 65 61 6e 20 2d 73 74 72 69 63 74 20 24  oolean -strict $
11db0 6c 6f 63 61 6c 5d 7d 20 74 68 65 6e 20 7b 0d 0a  local]} then {..
11dc0 20 20 20 20 20 20 20 20 73 65 74 20 64 61 74 65          set date
11dd0 54 69 6d 65 20 5b 6f 62 6a 65 63 74 20 69 6e 76  Time [object inv
11de0 6f 6b 65 20 2d 63 72 65 61 74 65 20 44 61 74 65  oke -create Date
11df0 54 69 6d 65 20 53 70 65 63 69 66 79 4b 69 6e 64  Time SpecifyKind
11e00 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
11e10 24 64 61 74 65 54 69 6d 65 20 55 74 63 5d 0d 0a  $dateTime Utc]..
11e20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
11e30 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b          return [
11e40 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 24 64  object invoke $d
11e50 61 74 65 54 69 6d 65 20 54 69 63 6b 73 5d 0d 0a  ateTime Ticks]..
11e60 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
11e70 20 69 66 20 7b 24 6c 6f 63 61 6c 7d 20 74 68 65   if {$local} the
11e80 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74  n {..        ret
11e90 75 72 6e 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f  urn [object invo
11ea0 6b 65 20 24 64 61 74 65 54 69 6d 65 20 54 6f 4c  ke $dateTime ToL
11eb0 6f 63 61 6c 54 69 6d 65 2e 54 69 63 6b 73 5d 0d  ocalTime.Ticks].
11ec0 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
11ed0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
11ee0 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 24  [object invoke $
11ef0 64 61 74 65 54 69 6d 65 20 54 6f 55 6e 69 76 65  dateTime ToUnive
11f00 72 73 61 6c 54 69 6d 65 2e 54 69 63 6b 73 5d 0d  rsalTime.Ticks].
11f10 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
11f20 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74  ....    proc get
11f30 50 72 6f 70 65 72 74 69 65 73 20 7b 20 6f 62 6a  Properties { obj
11f40 65 63 74 20 76 61 72 4e 61 6d 65 20 7d 20 7b 0d  ect varName } {.
11f50 0a 20 20 20 20 20 20 75 70 76 61 72 20 31 20 24  .      upvar 1 $
11f60 76 61 72 4e 61 6d 65 20 70 72 6f 70 65 72 74 69  varName properti
11f70 65 73 0d 0a 0d 0a 20 20 20 20 20 20 73 65 74 20  es....      set 
11f80 63 6f 75 6e 74 20 30 0d 0a 20 20 20 20 20 20 73  count 0..      s
11f90 65 74 20 6e 61 6d 65 73 20 5b 6c 69 73 74 5d 0d  et names [list].
11fa0 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 73  ...      if {[is
11fb0 4f 62 6a 65 63 74 48 61 6e 64 6c 65 20 24 6f 62  ObjectHandle $ob
11fc0 6a 65 63 74 5d 20 26 26 20 24 6f 62 6a 65 63 74  ject] && $object
11fd0 20 6e 65 20 22 6e 75 6c 6c 22 7d 20 74 68 65 6e   ne "null"} then
11fe0 20 7b 0d 0a 20 20 20 20 20 20 20 20 65 76 61 6c   {..        eval
11ff0 20 6c 61 70 70 65 6e 64 20 6e 61 6d 65 73 20 5b   lappend names [
12000 6f 62 6a 65 63 74 20 6d 65 6d 62 65 72 73 20 5c  object members \
12010 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2d 6d  ..            -m
12020 65 6d 62 65 72 74 79 70 65 73 20 50 72 6f 70 65  embertypes Prope
12030 72 74 79 20 2d 6e 61 6d 65 6f 6e 6c 79 20 24 6f  rty -nameonly $o
12040 62 6a 65 63 74 5d 0d 0a 0d 0a 20 20 20 20 20 20  bject]....      
12050 20 20 65 76 61 6c 20 6c 61 70 70 65 6e 64 20 6e    eval lappend n
12060 61 6d 65 73 20 5b 6f 62 6a 65 63 74 20 6d 65 6d  ames [object mem
12070 62 65 72 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  bers \..        
12080 20 20 20 20 2d 6d 65 6d 62 65 72 74 79 70 65 73      -membertypes
12090 20 46 69 65 6c 64 20 2d 6e 61 6d 65 6f 6e 6c 79   Field -nameonly
120a0 20 24 6f 62 6a 65 63 74 5d 0d 0a 20 20 20 20 20   $object]..     
120b0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 66 6f 72 65   }....      fore
120c0 61 63 68 20 6e 61 6d 65 20 24 6e 61 6d 65 73 20  ach name $names 
120d0 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  {..        if {[
120e0 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
120f0 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65     object invoke
12100 20 2d 6f 62 6a 65 63 74 66 6c 61 67 73 20 2b 4e   -objectflags +N
12110 6f 44 69 73 70 6f 73 65 20 24 6f 62 6a 65 63 74  oDispose $object
12120 20 24 6e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20   $name..        
12130 7d 20 76 61 6c 75 65 5d 20 3d 3d 20 30 7d 20 74  } value] == 0} t
12140 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
12150 20 69 66 20 7b 5b 69 73 4f 62 6a 65 63 74 48 61   if {[isObjectHa
12160 6e 64 6c 65 20 24 76 61 6c 75 65 5d 20 26 26 20  ndle $value] && 
12170 24 76 61 6c 75 65 20 6e 65 20 22 6e 75 6c 6c 22  $value ne "null"
12180 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
12190 20 20 20 20 20 20 73 65 74 20 65 72 72 6f 72 20        set error 
121a0 6e 75 6c 6c 3b 20 6f 62 6a 65 63 74 20 69 6e 76  null; object inv
121b0 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50  oke -flags +NonP
121c0 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20  ublic \..       
121d0 20 20 20 20 20 20 20 20 20 2d 6d 61 72 73 68 61           -marsha
121e0 6c 66 6c 61 67 73 20 2b 4e 6f 48 61 6e 64 6c 65  lflags +NoHandle
121f0 20 49 6e 74 65 72 70 72 65 74 65 72 2e 47 65 74   Interpreter.Get
12200 41 63 74 69 76 65 20 5c 0d 0a 20 20 20 20 20 20  Active \..      
12210 20 20 20 20 20 20 20 20 20 20 41 64 64 4f 62 6a            AddObj
12220 65 63 74 52 65 66 65 72 65 6e 63 65 20 4f 6b 20  ectReference Ok 
12230 24 76 61 6c 75 65 20 65 72 72 6f 72 0d 0a 0d 0a  $value error....
12240 20 20 20 20 20 20 20 20 20 20 20 20 6c 61 70 70              lapp
12250 65 6e 64 20 70 72 6f 70 65 72 74 69 65 73 28 6f  end properties(o
12260 62 6a 65 63 74 73 29 20 5b 6c 69 73 74 20 24 6e  bjects) [list $n
12270 61 6d 65 20 24 76 61 6c 75 65 5d 0d 0a 20 20 20  ame $value]..   
12280 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
12290 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 61 70  .            lap
122a0 70 65 6e 64 20 70 72 6f 70 65 72 74 69 65 73 28  pend properties(
122b0 76 61 6c 75 65 73 29 20 5b 6c 69 73 74 20 24 6e  values) [list $n
122c0 61 6d 65 20 24 76 61 6c 75 65 5d 0d 0a 20 20 20  ame $value]..   
122d0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
122e0 20 20 20 20 20 20 69 6e 63 72 20 63 6f 75 6e 74        incr count
122f0 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65  ..        } else
12300 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6c 61   {..          la
12310 70 70 65 6e 64 20 70 72 6f 70 65 72 74 69 65 73  ppend properties
12320 28 65 72 72 6f 72 73 29 20 5b 6c 69 73 74 20 24  (errors) [list $
12330 6e 61 6d 65 20 24 3a 3a 65 72 72 6f 72 43 6f 64  name $::errorCod
12340 65 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  e]..        }.. 
12350 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
12360 72 65 74 75 72 6e 20 24 63 6f 75 6e 74 0d 0a 20  return $count.. 
12370 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
12380 63 20 67 65 74 41 6c 6c 50 72 6f 70 65 72 74 69  c getAllProperti
12390 65 73 20 7b 20 6f 62 6a 65 63 74 20 76 61 72 4e  es { object varN
123a0 61 6d 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20 75  ame } {..      u
123b0 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65 20  pvar 1 $varName 
123c0 70 72 6f 70 65 72 74 69 65 73 0d 0a 20 20 20 20  properties..    
123d0 20 20 73 65 74 20 76 61 6c 75 65 20 24 6f 62 6a    set value $obj
123e0 65 63 74 0d 0a 0d 0a 20 20 20 20 20 20 77 68 69  ect....      whi
123f0 6c 65 20 7b 74 72 75 65 7d 20 7b 0d 0a 20 20 20  le {true} {..   
12400 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
12410 65 78 69 73 74 73 20 70 72 6f 70 65 72 74 69 65  exists propertie
12420 73 28 73 65 65 6e 4f 62 6a 65 63 74 73 29 5d 20  s(seenObjects)] 
12430 7c 7c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  || \..          
12440 20 20 24 76 61 6c 75 65 20 6e 69 20 24 70 72 6f    $value ni $pro
12450 70 65 72 74 69 65 73 28 73 65 65 6e 4f 62 6a 65  perties(seenObje
12460 63 74 73 29 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  cts)} then {..  
12470 20 20 20 20 20 20 20 20 67 65 74 50 72 6f 70 65          getPrope
12480 72 74 69 65 73 20 24 76 61 6c 75 65 20 70 72 6f  rties $value pro
12490 70 65 72 74 69 65 73 0d 0a 20 20 20 20 20 20 20  perties..       
124a0 20 20 20 6c 61 70 70 65 6e 64 20 70 72 6f 70 65     lappend prope
124b0 72 74 69 65 73 28 73 65 65 6e 4f 62 6a 65 63 74  rties(seenObject
124c0 73 29 20 24 76 61 6c 75 65 0d 0a 20 20 20 20 20  s) $value..     
124d0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
124e0 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
124f0 73 20 70 72 6f 70 65 72 74 69 65 73 28 6f 62 6a  s properties(obj
12500 65 63 74 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  ects)]} then {..
12510 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 0d            break.
12520 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
12530 20 20 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67        if {[lleng
12540 74 68 20 24 70 72 6f 70 65 72 74 69 65 73 28 6f  th $properties(o
12550 62 6a 65 63 74 73 29 5d 20 3d 3d 20 30 7d 20 74  bjects)] == 0} t
12560 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
12570 20 75 6e 73 65 74 20 70 72 6f 70 65 72 74 69 65   unset propertie
12580 73 28 6f 62 6a 65 63 74 73 29 3b 20 62 72 65 61  s(objects); brea
12590 6b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  k..        }....
125a0 20 20 20 20 20 20 20 20 73 65 74 20 76 61 6c 75          set valu
125b0 65 20 5b 6c 69 6e 64 65 78 20 5b 6c 69 6e 64 65  e [lindex [linde
125c0 78 20 24 70 72 6f 70 65 72 74 69 65 73 28 6f 62  x $properties(ob
125d0 6a 65 63 74 73 29 20 30 5d 20 65 6e 64 5d 0d 0a  jects) 0] end]..
125e0 20 20 20 20 20 20 20 20 73 65 74 20 70 72 6f 70          set prop
125f0 65 72 74 69 65 73 28 6f 62 6a 65 63 74 73 29 20  erties(objects) 
12600 5b 6c 72 61 6e 67 65 20 24 70 72 6f 70 65 72 74  [lrange $propert
12610 69 65 73 28 6f 62 6a 65 63 74 73 29 20 31 20 65  ies(objects) 1 e
12620 6e 64 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  nd]..      }....
12630 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20        if {[info 
12640 65 78 69 73 74 73 20 70 72 6f 70 65 72 74 69 65  exists propertie
12650 73 28 73 65 65 6e 4f 62 6a 65 63 74 73 29 5d 7d  s(seenObjects)]}
12660 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
12670 20 66 6f 72 65 61 63 68 20 76 61 6c 75 65 20 24   foreach value $
12680 70 72 6f 70 65 72 74 69 65 73 28 73 65 65 6e 4f  properties(seenO
12690 62 6a 65 63 74 73 29 20 7b 0d 0a 20 20 20 20 20  bjects) {..     
126a0 20 20 20 20 20 69 66 20 7b 24 76 61 6c 75 65 20       if {$value 
126b0 65 71 20 24 6f 62 6a 65 63 74 7d 20 63 6f 6e 74  eq $object} cont
126c0 69 6e 75 65 0d 0a 20 20 20 20 20 20 20 20 20 20  inue..          
126d0 63 61 74 63 68 20 7b 6f 62 6a 65 63 74 20 64 69  catch {object di
126e0 73 70 6f 73 65 20 24 76 61 6c 75 65 7d 0d 0a 20  spose $value}.. 
126f0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
12700 20 20 20 20 75 6e 73 65 74 20 70 72 6f 70 65 72      unset proper
12710 74 69 65 73 28 73 65 65 6e 4f 62 6a 65 63 74 73  ties(seenObjects
12720 29 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  )..      }..    
12730 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67  }.....    proc g
12740 65 74 56 61 72 69 61 62 6c 65 73 20 7b 20 76 61  etVariables { va
12750 72 4e 61 6d 65 73 20 7b 6f 62 6a 65 63 74 73 20  rNames {objects 
12760 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20  false} } {..    
12770 20 20 73 65 74 20 72 65 73 75 6c 74 20 5b 6c 69    set result [li
12780 73 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 66 6f 72  st]....      for
12790 65 61 63 68 20 76 61 72 4e 61 6d 65 20 24 76 61  each varName $va
127a0 72 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20  rNames {..      
127b0 20 20 69 66 20 7b 5b 75 70 6c 65 76 65 6c 20 31    if {[uplevel 1
127c0 20 5b 6c 69 73 74 20 61 72 72 61 79 20 65 78 69   [list array exi
127d0 73 74 73 20 24 76 61 72 4e 61 6d 65 5d 5d 7d 20  sts $varName]]} 
127e0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
127f0 20 20 73 65 74 20 61 72 72 61 79 4e 61 6d 65 20    set arrayName 
12800 24 76 61 72 4e 61 6d 65 0d 0a 0d 0a 20 20 20 20  $varName....    
12810 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 65 6c        foreach el
12820 65 6d 65 6e 74 4e 61 6d 65 20 5b 75 70 6c 65 76  ementName [uplev
12830 65 6c 20 31 20 5b 6c 69 73 74 20 61 72 72 61 79  el 1 [list array
12840 20 6e 61 6d 65 73 20 24 61 72 72 61 79 4e 61 6d   names $arrayNam
12850 65 5d 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  e]] {..         
12860 20 20 20 73 65 74 20 6e 61 6d 65 20 5b 61 70 70     set name [app
12870 65 6e 64 41 72 67 73 20 24 61 72 72 61 79 4e 61  endArgs $arrayNa
12880 6d 65 20 28 20 24 65 6c 65 6d 65 6e 74 4e 61 6d  me ( $elementNam
12890 65 20 29 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  e )]..          
128a0 20 20 73 65 74 20 76 61 72 56 61 6c 75 65 20 5b    set varValue [
128b0 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74 20  uplevel 1 [list 
128c0 73 65 74 20 24 6e 61 6d 65 5d 5d 0d 0a 0d 0a 20  set $name]].... 
128d0 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 24             if {$
128e0 6f 62 6a 65 63 74 73 20 26 26 20 5b 69 73 4f 62  objects && [isOb
128f0 6a 65 63 74 48 61 6e 64 6c 65 20 24 76 61 72 56  jectHandle $varV
12900 61 6c 75 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  alue]} then {.. 
12910 20 20 20 20 20 20 20 20 20 20 20 20 20 75 6e 73               uns
12920 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 70  et -nocomplain p
12930 72 6f 70 65 72 74 69 65 73 0d 0a 20 20 20 20 20  roperties..     
12940 20 20 20 20 20 20 20 20 20 67 65 74 41 6c 6c 50           getAllP
12950 72 6f 70 65 72 74 69 65 73 20 24 76 61 72 56 61  roperties $varVa
12960 6c 75 65 20 70 72 6f 70 65 72 74 69 65 73 0d 0a  lue properties..
12970 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
12980 6c 61 70 70 65 6e 64 20 72 65 73 75 6c 74 20 5b  lappend result [
12990 6c 69 73 74 20 24 6e 61 6d 65 20 5b 61 72 72 61  list $name [arra
129a0 79 20 67 65 74 20 70 72 6f 70 65 72 74 69 65 73  y get properties
129b0 5d 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ]]..            
129c0 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
129d0 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20          lappend 
129e0 72 65 73 75 6c 74 20 5b 6c 69 73 74 20 24 6e 61  result [list $na
129f0 6d 65 20 24 76 61 72 56 61 6c 75 65 5d 0d 0a 20  me $varValue].. 
12a00 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
12a10 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
12a20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
12a30 20 20 20 20 20 20 20 73 65 74 20 76 61 72 56 61         set varVa
12a40 6c 75 65 20 5b 75 70 6c 65 76 65 6c 20 31 20 5b  lue [uplevel 1 [
12a50 6c 69 73 74 20 73 65 74 20 24 76 61 72 4e 61 6d  list set $varNam
12a60 65 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  e]]....         
12a70 20 69 66 20 7b 24 6f 62 6a 65 63 74 73 20 26 26   if {$objects &&
12a80 20 5b 69 73 4f 62 6a 65 63 74 48 61 6e 64 6c 65   [isObjectHandle
12a90 20 24 76 61 72 56 61 6c 75 65 5d 7d 20 74 68 65   $varValue]} the
12aa0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
12ab0 20 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61   unset -nocompla
12ac0 69 6e 20 70 72 6f 70 65 72 74 69 65 73 0d 0a 20  in properties.. 
12ad0 20 20 20 20 20 20 20 20 20 20 20 67 65 74 41 6c             getAl
12ae0 6c 50 72 6f 70 65 72 74 69 65 73 20 24 76 61 72  lProperties $var
12af0 56 61 6c 75 65 20 70 72 6f 70 65 72 74 69 65 73  Value properties
12b00 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
12b10 6c 61 70 70 65 6e 64 20 72 65 73 75 6c 74 20 5b  lappend result [
12b20 6c 69 73 74 20 24 76 61 72 4e 61 6d 65 20 5b 61  list $varName [a
12b30 72 72 61 79 20 67 65 74 20 70 72 6f 70 65 72 74  rray get propert
12b40 69 65 73 5d 5d 0d 0a 20 20 20 20 20 20 20 20 20  ies]]..         
12b50 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
12b60 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 72         lappend r
12b70 65 73 75 6c 74 20 5b 6c 69 73 74 20 24 76 61 72  esult [list $var
12b80 4e 61 6d 65 20 24 76 61 72 56 61 6c 75 65 5d 0d  Name $varValue].
12b90 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
12ba0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
12bb0 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ....      return
12bc0 20 24 72 65 73 75 6c 74 0d 0a 20 20 20 20 7d 0d   $result..    }.
12bd0 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 65 6e 75  ....    proc enu
12be0 6d 65 72 61 62 6c 65 54 6f 4c 69 73 74 20 7b 20  merableToList { 
12bf0 65 6e 75 6d 65 72 61 62 6c 65 20 7d 20 7b 0d 0a  enumerable } {..
12c00 20 20 20 20 20 20 73 65 74 20 72 65 73 75 6c 74        set result
12c10 20 5b 6c 69 73 74 5d 0d 0a 0d 0a 20 20 20 20 20   [list]....     
12c20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
12c30 67 74 68 20 24 65 6e 75 6d 65 72 61 62 6c 65 5d  gth $enumerable]
12c40 20 3d 3d 20 30 20 7c 7c 20 24 65 6e 75 6d 65 72   == 0 || $enumer
12c50 61 62 6c 65 20 65 71 20 22 6e 75 6c 6c 22 7d 20  able eq "null"} 
12c60 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
12c70 72 65 74 75 72 6e 20 24 72 65 73 75 6c 74 0d 0a  return $result..
12c80 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
12c90 20 6f 62 6a 65 63 74 20 66 6f 72 65 61 63 68 20   object foreach 
12ca0 2d 61 6c 69 61 73 20 69 74 65 6d 20 24 65 6e 75  -alias item $enu
12cb0 6d 65 72 61 62 6c 65 20 7b 0d 0a 20 20 20 20 20  merable {..     
12cc0 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
12cd0 65 6e 67 74 68 20 24 69 74 65 6d 5d 20 3e 20 30  ength $item] > 0
12ce0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
12cf0 20 20 20 20 6c 61 70 70 65 6e 64 20 72 65 73 75      lappend resu
12d00 6c 74 20 5b 24 69 74 65 6d 20 54 6f 53 74 72 69  lt [$item ToStri
12d10 6e 67 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  ng]..        }..
12d20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
12d30 20 72 65 74 75 72 6e 20 24 72 65 73 75 6c 74 0d   return $result.
12d40 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
12d50 72 6f 63 20 63 61 74 63 68 41 6e 64 52 65 74 75  roc catchAndRetu
12d60 72 6e 20 7b 20 73 63 72 69 70 74 20 7b 73 74 61  rn { script {sta
12d70 63 6b 54 72 61 63 65 20 66 61 6c 73 65 7d 20 7b  ckTrace false} {
12d80 73 74 72 69 63 74 20 74 72 75 65 7d 20 7d 20 7b  strict true} } {
12d90 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
12da0 20 23 20 4e 4f 54 45 3a 20 45 76 61 6c 75 61 74   # NOTE: Evaluat
12db0 65 20 74 68 65 20 73 63 72 69 70 74 20 70 72 6f  e the script pro
12dc0 76 69 64 65 64 20 62 79 20 6f 75 72 20 63 61 6c  vided by our cal
12dd0 6c 65 72 20 69 6e 20 74 68 65 69 72 20 63 6f 6e  ler in their con
12de0 74 65 78 74 2c 0d 0a 20 20 20 20 20 20 23 20 20  text,..      #  
12df0 20 20 20 20 20 63 61 70 74 75 72 69 6e 67 20 62       capturing b
12e00 6f 74 68 20 74 68 65 20 72 65 73 75 6c 74 20 61  oth the result a
12e10 6e 64 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f  nd the return co
12e20 64 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  de...      #..  
12e30 20 20 20 20 73 65 74 20 63 6f 64 65 20 5b 63 61      set code [ca
12e40 74 63 68 20 7b 75 70 6c 65 76 65 6c 20 31 20 24  tch {uplevel 1 $
12e50 73 63 72 69 70 74 7d 20 72 65 73 75 6c 74 5d 0d  script} result].
12e60 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
12e70 20 20 23 20 4e 4f 54 45 3a 20 44 69 64 20 74 68    # NOTE: Did th
12e80 65 20 73 63 72 69 70 74 20 70 72 6f 76 69 64 65  e script provide
12e90 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 20  d by our caller 
12ea0 4e 4f 54 20 72 61 69 73 65 20 61 6e 20 65 72 72  NOT raise an err
12eb0 6f 72 3f 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  or?..      #..  
12ec0 20 20 20 20 69 66 20 7b 24 73 74 72 69 63 74 20      if {$strict 
12ed0 26 26 20 24 63 6f 64 65 20 3d 3d 20 30 20 7c 7c  && $code == 0 ||
12ee0 20 21 24 73 74 72 69 63 74 20 26 26 20 24 63 6f   !$strict && $co
12ef0 64 65 20 21 3d 20 31 7d 20 74 68 65 6e 20 7b 0d  de != 1} then {.
12f00 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
12f10 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 75 63 63      # NOTE: Succ
12f20 65 73 73 2e 20 20 52 65 74 75 72 6e 20 61 20 6c  ess.  Return a l
12f30 69 73 74 20 77 69 74 68 20 74 68 65 20 72 65 74  ist with the ret
12f40 75 72 6e 20 63 6f 64 65 20 61 6e 64 20 74 68 65  urn code and the
12f50 20 72 65 73 75 6c 74 2e 0d 0a 20 20 20 20 20 20   result...      
12f60 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
12f70 75 72 6e 20 5b 6c 69 73 74 20 24 63 6f 64 65 20  urn [list $code 
12f80 24 72 65 73 75 6c 74 5d 0d 0a 20 20 20 20 20 20  $result]..      
12f90 7d 20 65 6c 73 65 69 66 20 7b 24 73 74 61 63 6b  } elseif {$stack
12fa0 54 72 61 63 65 7d 20 74 68 65 6e 20 7b 0d 0a 20  Trace} then {.. 
12fb0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
12fc0 20 20 23 20 4e 4f 54 45 3a 20 46 61 69 6c 75 72    # NOTE: Failur
12fd0 65 2e 20 20 4f 75 72 20 63 61 6c 6c 65 72 20 77  e.  Our caller w
12fe0 61 6e 74 73 20 61 20 66 75 6c 6c 20 73 74 61 63  ants a full stac
12ff0 6b 20 74 72 61 63 65 20 28 69 66 20 61 70 70 6c  k trace (if appl
13000 69 63 61 62 6c 65 29 2c 0d 0a 20 20 20 20 20 20  icable),..      
13010 20 20 23 20 20 20 20 20 20 20 72 65 74 75 72 6e    #       return
13020 20 61 20 6c 69 73 74 20 77 69 74 68 20 74 68 65   a list with the
13030 20 72 65 74 75 72 6e 20 63 6f 64 65 20 61 6e 64   return code and
13040 20 74 68 65 20 72 65 73 75 6c 74 20 76 65 72 62   the result verb
13050 61 74 69 6d 2e 0d 0a 20 20 20 20 20 20 20 20 23  atim...        #
13060 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
13070 20 5b 6c 69 73 74 20 24 63 6f 64 65 20 24 72 65   [list $code $re
13080 73 75 6c 74 5d 0d 0a 20 20 20 20 20 20 7d 20 65  sult]..      } e
13090 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  lse {..        #
130a0 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
130b0 3a 20 46 61 69 6c 75 72 65 2e 20 20 4f 75 72 20  : Failure.  Our 
130c0 63 61 6c 6c 65 72 20 64 6f 65 73 20 6e 6f 74 20  caller does not 
130d0 77 61 6e 74 20 61 20 66 75 6c 6c 20 73 74 61 63  want a full stac
130e0 6b 20 74 72 61 63 65 20 28 69 66 0d 0a 20 20 20  k trace (if..   
130f0 20 20 20 20 20 23 20 20 20 20 20 20 20 61 70 70       #       app
13100 6c 69 63 61 62 6c 65 29 2c 20 72 65 74 75 72 6e  licable), return
13110 20 61 20 6c 69 73 74 20 77 69 74 68 20 74 68 65   a list with the
13120 20 72 65 74 75 72 6e 20 63 6f 64 65 2c 20 74 68   return code, th
13130 65 20 65 72 72 6f 72 0d 0a 20 20 20 20 20 20 20  e error..       
13140 20 23 20 20 20 20 20 20 20 63 6f 64 65 20 66 6f   #       code fo
13150 72 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65  r the interprete
13160 72 2c 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72  r, and the error
13170 20 6d 65 73 73 61 67 65 20 75 70 20 74 6f 20 74   message up to t
13180 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  he..        #   
13190 20 20 20 20 70 6f 69 6e 74 20 77 68 65 72 65 20      point where 
131a0 74 68 65 20 73 74 61 63 6b 20 74 72 61 63 65 20  the stack trace 
131b0 73 68 6f 75 6c 64 20 73 74 61 72 74 2e 0d 0a 20  should start... 
131c0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
131d0 20 20 72 65 74 75 72 6e 20 5b 6c 69 73 74 20 24    return [list $
131e0 63 6f 64 65 20 24 3a 3a 65 72 72 6f 72 43 6f 64  code $::errorCod
131f0 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
13200 20 5b 65 78 74 72 61 63 74 53 79 73 74 65 6d 44   [extractSystemD
13210 61 74 61 53 51 4c 69 74 65 45 78 63 65 70 74 69  ataSQLiteExcepti
13220 6f 6e 4d 65 73 73 61 67 65 20 24 72 65 73 75 6c  onMessage $resul
13230 74 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  t]]..      }..  
13240 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
13250 20 72 65 73 65 74 45 78 63 65 70 74 69 6f 6e 20   resetException 
13260 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20  {} {..      #.. 
13270 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 73       # NOTE: Res
13280 65 74 20 65 78 63 65 70 74 69 6f 6e 20 61 73 73  et exception ass
13290 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 69  ociated with thi
132a0 73 20 69 6e 74 65 72 70 72 65 74 65 72 20 28 74  s interpreter (t
132b0 6f 20 6e 75 6c 6c 29 2e 0d 0a 20 20 20 20 20 20  o null)...      
132c0 23 20 20 20 20 20 20 20 54 68 69 73 20 28 70 72  #       This (pr
132d0 69 76 61 74 65 29 20 70 72 6f 70 65 72 74 79 20  ivate) property 
132e0 69 73 20 6d 61 69 6e 74 61 69 6e 65 64 20 6f 6e  is maintained on
132f0 20 61 20 70 65 72 2d 74 68 72 65 61 64 20 62 61   a per-thread ba
13300 73 69 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  sis...      #.. 
13310 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f       object invo
13320 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75  ke -flags +NonPu
13330 62 6c 69 63 20 49 6e 74 65 72 70 72 65 74 65 72  blic Interpreter
13340 2e 47 65 74 41 63 74 69 76 65 20 45 78 63 65 70  .GetActive Excep
13350 74 69 6f 6e 20 6e 75 6c 6c 0d 0a 20 20 20 20 20  tion null..     
13360 20 72 65 74 75 72 6e 20 22 22 0d 0a 20 20 20 20   return ""..    
13370 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63  }.....    proc c
13380 61 74 63 68 41 6e 64 53 65 74 45 78 63 65 70 74  atchAndSetExcept
13390 69 6f 6e 20 7b 20 73 63 72 69 70 74 20 7b 76 61  ion { script {va
133a0 72 4e 61 6d 65 20 22 22 7d 20 7d 20 7b 0d 0a 20  rName ""} } {.. 
133b0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
133c0 4e 4f 54 45 3a 20 45 76 61 6c 75 61 74 65 20 74  NOTE: Evaluate t
133d0 68 65 20 73 63 72 69 70 74 20 70 72 6f 76 69 64  he script provid
133e0 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72  ed by our caller
133f0 20 69 6e 20 74 68 65 69 72 20 63 6f 6e 74 65 78   in their contex
13400 74 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  t...      #..   
13410 20 20 20 63 61 74 63 68 20 7b 75 70 6c 65 76 65     catch {upleve
13420 6c 20 31 20 24 73 63 72 69 70 74 7d 0d 0a 0d 0a  l 1 $script}....
13430 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
13440 20 4e 4f 54 45 3a 20 47 72 61 62 20 74 68 65 20   NOTE: Grab the 
13450 28 70 72 69 76 61 74 65 29 20 65 78 63 65 70 74  (private) except
13460 69 6f 6e 20 70 72 6f 70 65 72 74 79 20 66 72 6f  ion property fro
13470 6d 20 74 68 69 73 20 69 6e 74 65 72 70 72 65 74  m this interpret
13480 65 72 2c 0d 0a 20 20 20 20 20 20 23 20 20 20 20  er,..      #    
13490 20 20 20 66 6f 72 20 74 68 69 73 20 74 68 72 65     for this thre
134a0 61 64 2c 20 61 6e 64 20 61 64 64 20 61 73 20 61  ad, and add as a
134b0 6e 20 6f 70 61 71 75 65 20 6f 62 6a 65 63 74 20  n opaque object 
134c0 68 61 6e 64 6c 65 20 69 6e 20 74 68 65 0d 0a 20  handle in the.. 
134d0 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e       #       con
134e0 74 65 78 74 20 6f 66 20 6f 75 72 20 63 61 6c 6c  text of our call
134f0 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  er...      #..  
13500 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
13510 6c 65 6e 67 74 68 20 24 76 61 72 4e 61 6d 65 5d  length $varName]
13520 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
13530 20 20 20 20 20 20 75 70 76 61 72 20 31 20 24 76        upvar 1 $v
13540 61 72 4e 61 6d 65 20 65 78 63 65 70 74 69 6f 6e  arName exception
13550 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
13560 20 20 20 73 65 74 20 65 78 63 65 70 74 69 6f 6e     set exception
13570 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20   [object invoke 
13580 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 2d 61 6c  \..          -al
13590 69 61 73 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50  ias -flags +NonP
135a0 75 62 6c 69 63 20 49 6e 74 65 72 70 72 65 74 65  ublic Interprete
135b0 72 2e 47 65 74 41 63 74 69 76 65 20 45 78 63 65  r.GetActive Exce
135c0 70 74 69 6f 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20  ption]....      
135d0 72 65 74 75 72 6e 20 22 22 0d 0a 20 20 20 20 7d  return ""..    }
135e0 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 6f  .....    proc co
135f0 6d 70 69 6c 65 43 53 68 61 72 70 57 69 74 68 20  mpileCSharpWith 
13600 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
13610 65 78 74 20 6d 65 6d 6f 72 79 20 73 79 6d 62 6f  ext memory symbo
13620 6c 73 20 73 74 72 69 63 74 20 72 65 73 75 6c 74  ls strict result
13630 73 56 61 72 4e 61 6d 65 20 65 72 72 6f 72 73 56  sVarName errorsV
13640 61 72 4e 61 6d 65 20 66 69 6c 65 4e 61 6d 65 73  arName fileNames
13650 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 72  ..            ar
13660 67 73 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  gs } {..      #.
13670 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53  .      # NOTE: S
13680 69 6e 63 65 20 77 65 20 61 72 65 20 67 6f 69 6e  ince we are goin
13690 67 20 74 6f 20 75 73 65 20 74 68 69 73 20 6d 65  g to use this me
136a0 74 68 6f 64 20 6e 61 6d 65 20 61 20 6c 6f 74 2c  thod name a lot,
136b0 20 61 73 73 69 67 6e 20 69 74 20 74 6f 20 61 0d   assign it to a.
136c0 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 76  .      #       v
136d0 61 72 69 61 62 6c 65 20 66 69 72 73 74 2e 0d 0a  ariable first...
136e0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73        #..      s
136f0 65 74 20 61 64 64 20 52 65 66 65 72 65 6e 63 65  et add Reference
13700 64 41 73 73 65 6d 62 6c 69 65 73 2e 41 64 64 0d  dAssemblies.Add.
13710 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
13720 20 20 23 20 4e 4f 54 45 3a 20 43 72 65 61 74 65    # NOTE: Create
13730 20 74 68 65 20 62 61 73 65 20 63 6f 6d 6d 61 6e   the base comman
13740 64 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6e  d to evaluate an
13750 64 20 61 64 64 20 74 68 65 20 70 72 6f 70 65 72  d add the proper
13760 74 79 20 73 65 74 74 69 6e 67 73 0d 0a 20 20 20  ty settings..   
13770 20 20 20 23 20 20 20 20 20 20 20 74 68 61 74 20     #       that 
13780 61 72 65 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79  are almost alway
13790 73 20 6e 65 65 64 65 64 20 62 79 20 6f 75 72 20  s needed by our 
137a0 75 6e 69 74 20 74 65 73 74 73 20 28 69 2e 65 2e  unit tests (i.e.
137b0 20 74 68 65 20 53 79 73 74 65 6d 0d 0a 20 20 20   the System..   
137c0 20 20 20 23 20 20 20 20 20 20 20 61 6e 64 20 53     #       and S
137d0 79 73 74 65 6d 2e 44 61 74 61 20 61 73 73 65 6d  ystem.Data assem
137e0 62 6c 79 20 72 65 66 65 72 65 6e 63 65 73 29 2e  bly references).
137f0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
13800 20 73 65 74 20 63 6f 6d 6d 61 6e 64 20 5b 6c 69   set command [li
13810 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  st \..          
13820 63 6f 6d 70 69 6c 65 43 53 68 61 72 70 20 24 74  compileCSharp $t
13830 65 78 74 20 24 6d 65 6d 6f 72 79 20 24 73 79 6d  ext $memory $sym
13840 62 6f 6c 73 20 24 73 74 72 69 63 74 20 72 65 73  bols $strict res
13850 75 6c 74 73 20 65 72 72 6f 72 73 20 5c 0d 0a 20  ults errors \.. 
13860 20 20 20 20 20 20 20 20 20 24 61 64 64 20 53 79           $add Sy
13870 73 74 65 6d 2e 64 6c 6c 20 24 61 64 64 20 53 79  stem.dll $add Sy
13880 73 74 65 6d 2e 44 61 74 61 2e 64 6c 6c 20 24 61  stem.Data.dll $a
13890 64 64 20 53 79 73 74 65 6d 2e 54 72 61 6e 73 61  dd System.Transa
138a0 63 74 69 6f 6e 73 2e 64 6c 6c 20 5c 0d 0a 20 20  ctions.dll \..  
138b0 20 20 20 20 20 20 20 20 24 61 64 64 20 53 79 73          $add Sys
138c0 74 65 6d 2e 58 6d 6c 2e 64 6c 6c 5d 0d 0a 0d 0a  tem.Xml.dll]....
138d0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
138e0 20 4e 4f 54 45 3a 20 41 64 64 20 61 6c 6c 20 74   NOTE: Add all t
138f0 68 65 20 70 72 6f 76 69 64 65 64 20 66 69 6c 65  he provided file
13900 20 6e 61 6d 65 73 20 61 73 20 61 73 73 65 6d 62   names as assemb
13910 6c 79 20 72 65 66 65 72 65 6e 63 65 73 2e 0d 0a  ly references...
13920 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 66        #..      f
13930 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20  oreach fileName 
13940 24 66 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20  $fileNames {..  
13950 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 63 6f        lappend co
13960 6d 6d 61 6e 64 20 24 61 64 64 20 5b 67 65 74 42  mmand $add [getB
13970 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 24 66  inaryFileName $f
13980 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20  ileName]..      
13990 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
139a0 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 64 64 20      # NOTE: Add 
139b0 74 68 65 20 65 78 74 72 61 20 61 72 67 75 6d 65  the extra argume
139c0 6e 74 73 2c 20 69 66 20 61 6e 79 2c 20 74 6f 20  nts, if any, to 
139d0 74 68 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65  the command to e
139e0 76 61 6c 75 61 74 65 2e 0d 0a 20 20 20 20 20 20  valuate...      
139f0 23 0d 0a 20 20 20 20 20 20 65 76 61 6c 20 6c 61  #..      eval la
13a00 70 70 65 6e 64 20 63 6f 6d 6d 61 6e 64 20 24 61  ppend command $a
13a10 72 67 73 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a  rgs....      #..
13a20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 6c        # NOTE: Al
13a30 69 61 73 20 74 68 65 20 63 6f 6d 70 69 6c 65 72  ias the compiler
13a40 20 6c 6f 63 61 6c 20 72 65 73 75 6c 74 73 20 61   local results a
13a50 6e 64 20 65 72 72 6f 72 73 20 76 61 72 69 61 62  nd errors variab
13a60 6c 65 73 20 74 6f 20 74 68 65 0d 0a 20 20 20 20  les to the..    
13a70 20 20 23 20 20 20 20 20 20 20 76 61 72 69 61 62    #       variab
13a80 6c 65 20 6e 61 6d 65 73 20 70 72 6f 76 69 64 65  le names provide
13a90 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 2e  d by our caller.
13aa0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
13ab0 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
13ac0 67 74 68 20 24 72 65 73 75 6c 74 73 56 61 72 4e  gth $resultsVarN
13ad0 61 6d 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ame] > 0} then {
13ae0 0d 0a 20 20 20 20 20 20 20 20 75 70 76 61 72 20  ..        upvar 
13af0 31 20 24 72 65 73 75 6c 74 73 56 61 72 4e 61 6d  1 $resultsVarNam
13b00 65 20 72 65 73 75 6c 74 73 0d 0a 20 20 20 20 20  e results..     
13b10 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b   }....      if {
13b20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
13b30 65 72 72 6f 72 73 56 61 72 4e 61 6d 65 5d 20 3e  errorsVarName] >
13b40 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
13b50 20 20 20 20 75 70 76 61 72 20 31 20 24 65 72 72      upvar 1 $err
13b60 6f 72 73 56 61 72 4e 61 6d 65 20 65 72 72 6f 72  orsVarName error
13b70 73 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  s..      }....  
13b80 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
13b90 4f 54 45 3a 20 45 76 61 6c 75 61 74 65 20 74 68  OTE: Evaluate th
13ba0 65 20 63 6f 6e 73 74 72 75 63 74 65 64 20 5b 63  e constructed [c
13bb0 6f 6d 70 69 6c 65 43 53 68 61 72 70 5d 20 63 6f  ompileCSharp] co
13bc0 6d 6d 61 6e 64 20 61 6e 64 20 72 65 74 75 72 6e  mmand and return
13bd0 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20   the..      #   
13be0 20 20 20 20 72 65 73 75 6c 74 2e 0d 0a 20 20 20      result...   
13bf0 20 20 20 23 0d 0a 20 20 20 20 20 20 65 76 61 6c     #..      eval
13c00 20 24 63 6f 6d 6d 61 6e 64 0d 0a 20 20 20 20 7d   $command..    }
13c10 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 69 73  .....    proc is
13c20 4d 65 6d 6f 72 79 44 62 20 7b 20 66 69 6c 65 4e  MemoryDb { fileN
13c30 61 6d 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23  ame } {..      #
13c40 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
13c50 49 73 20 74 68 65 20 73 70 65 63 69 66 69 65 64  Is the specified
13c60 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e   database file n
13c70 61 6d 65 20 72 65 61 6c 6c 79 20 61 6e 20 69 6e  ame really an in
13c80 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
13c90 3f 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ?..      #..    
13ca0 20 20 72 65 74 75 72 6e 20 5b 65 78 70 72 20 7b    return [expr {
13cb0 24 66 69 6c 65 4e 61 6d 65 20 65 71 20 22 3a 6d  $fileName eq ":m
13cc0 65 6d 6f 72 79 3a 22 20 7c 7c 20 5c 0d 0a 20 20  emory:" || \..  
13cd0 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20          [string 
13ce0 72 61 6e 67 65 20 24 66 69 6c 65 4e 61 6d 65 20  range $fileName 
13cf0 30 20 31 32 5d 20 65 71 20 22 66 69 6c 65 3a 3a  0 12] eq "file::
13d00 6d 65 6d 6f 72 79 3a 22 7d 5d 0d 0a 20 20 20 20  memory:"}]..    
13d10 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 69  }.....    proc i
13d20 73 54 61 62 6c 65 49 6e 44 62 20 7b 20 6e 61 6d  sTableInDb { nam
13d30 65 20 7b 76 61 72 4e 61 6d 65 20 64 62 7d 20 7d  e {varName db} }
13d40 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
13d50 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 66 65 72     # NOTE: Refer
13d60 20 74 6f 20 74 68 65 20 73 70 65 63 69 66 69 65   to the specifie
13d70 64 20 76 61 72 69 61 62 6c 65 20 28 65 2e 67 2e  d variable (e.g.
13d80 20 22 64 62 22 29 20 69 6e 20 74 68 65 20 63 6f   "db") in the co
13d90 6e 74 65 78 74 20 6f 66 20 6f 75 72 0d 0a 20 20  ntext of our..  
13da0 20 20 20 20 23 20 20 20 20 20 20 20 63 61 6c 6c      #       call
13db0 65 72 2e 20 20 49 74 20 63 6f 6e 74 61 69 6e 73  er.  It contains
13dc0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
13dd0 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20  nnection handle 
13de0 74 68 61 74 20 77 69 6c 6c 20 62 65 0d 0a 20 20  that will be..  
13df0 20 20 20 20 23 20 20 20 20 20 20 20 75 73 65 64      #       used
13e00 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65 20   to execute the 
13e10 71 75 65 72 79 20 75 73 65 64 20 74 6f 20 64 65  query used to de
13e20 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20 6e  termine if the n
13e30 61 6d 65 64 20 74 61 62 6c 65 20 69 73 0d 0a 20  amed table is.. 
13e40 20 20 20 20 20 23 20 20 20 20 20 20 20 70 72 65       #       pre
13e50 73 65 6e 74 20 69 6e 20 74 68 61 74 20 64 61 74  sent in that dat
13e60 61 62 61 73 65 2e 0d 0a 20 20 20 20 20 20 23 0d  abase...      #.
13e70 0a 20 20 20 20 20 20 75 70 76 61 72 20 31 20 24  .      upvar 1 $
13e80 76 61 72 4e 61 6d 65 20 64 62 0d 0a 0d 0a 20 20  varName db....  
13e90 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
13ea0 4f 54 45 3a 20 55 73 65 20 74 68 65 20 73 71 6c  OTE: Use the sql
13eb0 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
13ec0 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66   to determine if
13ed0 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65   the named table
13ee0 20 69 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20   is..      #    
13ef0 20 20 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68     present in th
13f00 65 20 64 61 74 61 62 61 73 65 2e 0d 0a 20 20 20  e database...   
13f10 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20     #..      set 
13f20 73 71 6c 20 7b 0d 0a 20 20 20 20 20 20 20 20 53  sql {..        S
13f30 45 4c 45 43 54 20 43 4f 55 4e 54 28 2a 29 20 46  ELECT COUNT(*) F
13f40 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
13f50 72 20 57 48 45 52 45 20 74 79 70 65 20 3d 20 27  r WHERE type = '
13f60 74 61 62 6c 65 27 20 41 4e 44 20 6e 61 6d 65 20  table' AND name 
13f70 3d 20 3f 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  = ?;..      }...
13f80 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
13f90 23 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e 20 6e  # NOTE: Return n
13fa0 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 6e  on-zero if the n
13fb0 61 6d 65 64 20 74 61 62 6c 65 20 69 73 20 70 72  amed table is pr
13fc0 65 73 65 6e 74 2e 0d 0a 20 20 20 20 20 20 23 0d  esent...      #.
13fd0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 65  .      return [e
13fe0 78 70 72 20 7b 0d 0a 20 20 20 20 20 20 20 20 5b  xpr {..        [
13ff0 73 71 6c 20 65 78 65 63 75 74 65 20 2d 65 78 65  sql execute -exe
14000 63 75 74 65 20 73 63 61 6c 61 72 20 24 64 62 20  cute scalar $db 
14010 24 73 71 6c 20 5b 6c 69 73 74 20 70 61 72 61 6d  $sql [list param
14020 31 20 53 74 72 69 6e 67 20 24 6e 61 6d 65 5d 5d  1 String $name]]
14030 20 3e 20 30 0d 0a 20 20 20 20 20 20 7d 5d 0d 0a   > 0..      }]..
14040 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
14050 6f 63 20 67 65 74 44 62 44 65 66 61 75 6c 74 50  oc getDbDefaultP
14060 61 67 65 53 69 7a 65 20 7b 7d 20 7b 0d 0a 20 20  ageSize {} {..  
14070 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
14080 65 78 65 63 75 74 65 53 71 6c 20 22 50 52 41 47  executeSql "PRAG
14090 4d 41 20 70 61 67 65 5f 73 69 7a 65 3b 22 20 73  MA page_size;" s
140a0 63 61 6c 61 72 7d 20 72 65 73 75 6c 74 5d 20 3d  calar} result] =
140b0 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
140c0 20 20 20 20 20 72 65 74 75 72 6e 20 24 72 65 73       return $res
140d0 75 6c 74 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  ult..      } els
140e0 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74  e {..        ret
140f0 75 72 6e 20 30 0d 0a 20 20 20 20 20 20 7d 0d 0a  urn 0..      }..
14100 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
14110 6f 63 20 67 65 74 44 62 44 65 66 61 75 6c 74 43  oc getDbDefaultC
14120 61 63 68 65 53 69 7a 65 20 7b 7d 20 7b 0d 0a 20  acheSize {} {.. 
14130 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
14140 7b 65 78 65 63 75 74 65 53 71 6c 20 22 50 52 41  {executeSql "PRA
14150 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 3b 22  GMA cache_size;"
14160 20 73 63 61 6c 61 72 7d 20 72 65 73 75 6c 74 5d   scalar} result]
14170 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
14180 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 72         return $r
14190 65 73 75 6c 74 0d 0a 20 20 20 20 20 20 7d 20 65  esult..      } e
141a0 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 72  lse {..        r
141b0 65 74 75 72 6e 20 30 0d 0a 20 20 20 20 20 20 7d  eturn 0..      }
141c0 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
141d0 70 72 6f 63 20 75 73 65 4c 65 67 61 63 79 44 62  proc useLegacyDb
141e0 50 61 67 65 41 6e 64 43 61 63 68 65 53 69 7a 65  PageAndCacheSize
141f0 73 20 7b 20 76 61 72 4e 61 6d 65 20 7d 20 7b 0d  s { varName } {.
14200 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
14210 23 20 4e 4f 54 45 3a 20 52 65 66 65 72 20 74 6f  # NOTE: Refer to
14220 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 76   the specified v
14230 61 72 69 61 62 6c 65 20 28 65 2e 67 2e 20 22 64  ariable (e.g. "d
14240 62 22 29 20 69 6e 20 74 68 65 20 63 6f 6e 74 65  b") in the conte
14250 78 74 20 6f 66 20 6f 75 72 0d 0a 20 20 20 20 20  xt of our..     
14260 20 23 20 20 20 20 20 20 20 63 61 6c 6c 65 72 2e   #       caller.
14270 20 20 49 74 20 63 6f 6e 74 61 69 6e 73 20 74 68    It contains th
14280 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
14290 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20 74 68 61  ction handle tha
142a0 74 20 77 69 6c 6c 20 62 65 0d 0a 20 20 20 20 20  t will be..     
142b0 20 23 20 20 20 20 20 20 20 75 73 65 64 20 74 6f   #       used to
142c0 20 65 78 65 63 75 74 65 20 71 75 65 72 69 65 73   execute queries
142d0 20 75 73 65 64 20 74 6f 20 73 65 74 20 74 68 65   used to set the
142e0 20 70 61 67 65 20 61 6e 64 20 63 61 63 68 65 20   page and cache 
142f0 73 69 7a 65 73 2e 0d 0a 20 20 20 20 20 20 23 0d  sizes...      #.
14300 0a 20 20 20 20 20 20 75 70 76 61 72 20 31 20 24  .      upvar 1 $
14310 76 61 72 4e 61 6d 65 20 64 62 0d 0a 0d 0a 20 20  varName db....  
14320 20 20 20 20 73 71 6c 20 65 78 65 63 75 74 65 20      sql execute 
14330 24 64 62 20 7b 0d 0a 20 20 20 20 20 20 20 20 50  $db {..        P
14340 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20  RAGMA page_size 
14350 3d 20 31 30 32 34 3b 0d 0a 20 20 20 20 20 20 20  = 1024;..       
14360 20 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69   PRAGMA cache_si
14370 7a 65 20 3d 20 32 30 30 30 3b 0d 0a 20 20 20 20  ze = 2000;..    
14380 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74    }....      ret
14390 75 72 6e 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20  urn [list \..   
143a0 20 20 20 20 20 20 20 5b 73 71 6c 20 65 78 65 63         [sql exec
143b0 75 74 65 20 2d 65 78 65 63 75 74 65 20 73 63 61  ute -execute sca
143c0 6c 61 72 20 24 64 62 20 22 50 52 41 47 4d 41 20  lar $db "PRAGMA 
143d0 70 61 67 65 5f 73 69 7a 65 3b 22 5d 20 5c 0d 0a  page_size;"] \..
143e0 20 20 20 20 20 20 20 20 20 20 5b 73 71 6c 20 65            [sql e
143f0 78 65 63 75 74 65 20 2d 65 78 65 63 75 74 65 20  xecute -execute 
14400 73 63 61 6c 61 72 20 24 64 62 20 22 50 52 41 47  scalar $db "PRAG
14410 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 3b 22 5d  MA cache_size;"]
14420 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  ]..    }.....   
14430 20 70 72 6f 63 20 6e 6f 72 6d 61 6c 69 7a 65 45   proc normalizeE
14440 78 63 65 70 74 69 6f 6e 4d 65 73 73 61 67 65 20  xceptionMessage 
14450 7b 20 76 61 6c 75 65 20 7d 20 7b 0d 0a 20 20 20  { value } {..   
14460 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
14470 65 6e 67 74 68 20 24 76 61 6c 75 65 5d 20 3d 3d  ength $value] ==
14480 20 30 7d 20 74 68 65 6e 20 7b 72 65 74 75 72 6e   0} then {return
14490 20 24 76 61 6c 75 65 7d 0d 0a 20 20 20 20 20 20   $value}..      
144a0 72 65 74 75 72 6e 20 5b 73 74 72 69 6e 67 20 6d  return [string m
144b0 61 70 20 5b 6c 69 73 74 20 5c 72 5c 6e 20 22 20  ap [list \r\n " 
144c0 3d 3d 3e 20 22 20 5c 6e 20 22 20 3d 3d 3e 20 22  ==> " \n " ==> "
144d0 5d 20 24 76 61 6c 75 65 5d 0d 0a 20 20 20 20 7d  ] $value]..    }
144e0 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 65 78  .....    proc ex
144f0 74 72 61 63 74 53 79 73 74 65 6d 44 61 74 61 53  tractSystemDataS
14500 51 4c 69 74 65 45 78 63 65 70 74 69 6f 6e 4d 65  QLiteExceptionMe
14510 73 73 61 67 65 20 7b 20 76 61 6c 75 65 20 7d 20  ssage { value } 
14520 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
14530 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 74 68 65    # NOTE: If the
14540 20 73 74 72 69 6e 67 20 63 6f 6e 66 6f 72 6d 73   string conforms
14550 20 74 6f 20 66 6f 72 6d 61 74 20 6f 66 20 74 68   to format of th
14560 65 20 6e 6f 72 6d 61 6c 20 65 78 63 65 70 74 69  e normal excepti
14570 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  on..      #     
14580 20 20 65 72 72 6f 72 20 73 74 72 69 6e 67 73 2c    error strings,
14590 20 65 78 74 72 61 63 74 20 61 6e 64 20 72 65 74   extract and ret
145a0 75 72 6e 20 6f 6e 6c 79 20 74 68 65 20 65 72 72  urn only the err
145b0 6f 72 20 6d 65 73 73 61 67 65 0d 0a 20 20 20 20  or message..    
145c0 20 20 23 20 20 20 20 20 20 20 70 6f 72 74 69 6f    #       portio
145d0 6e 20 69 74 73 65 6c 66 2e 0d 0a 20 20 20 20 20  n itself...     
145e0 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 70 61   #..      set pa
145f0 74 74 65 72 6e 73 20 5b 6c 69 73 74 20 5c 0d 0a  tterns [list \..
14600 20 20 20 20 20 20 7b 53 79 73 74 65 6d 5c 2e 44        {System\.D
14610 61 74 61 5c 2e 53 51 4c 69 74 65 5c 2e 53 51 4c  ata\.SQLite\.SQL
14620 69 74 65 45 78 63 65 70 74 69 6f 6e 20 5c 28 30  iteException \(0
14630 78 28 3f 3a 30 7c 38 29 5b 30 2d 39 41 2d 46 61  x(?:0|8)[0-9A-Fa
14640 2d 66 5d 7b 37 7d 5c 29 3a 5c 0d 0a 20 20 20 20  -f]{7}\):\..    
14650 20 20 20 20 20 20 28 2e 2b 3f 29 20 20 28 3f 3a        (.+?)  (?:
14660 20 29 3f 61 74 7d 20 5c 0d 0a 20 20 20 20 20 20   )?at} \..      
14670 7b 53 79 73 74 65 6d 5c 2e 44 61 74 61 5c 2e 53  {System\.Data\.S
14680 51 4c 69 74 65 5c 2e 53 51 4c 69 74 65 45 78 63  QLite\.SQLiteExc
14690 65 70 74 69 6f 6e 3a 20 28 2e 2b 3f 29 20 20 28  eption: (.+?)  (
146a0 3f 3a 20 29 3f 61 74 7d 20 5c 0d 0a 20 20 20 20  ?: )?at} \..    
146b0 20 20 7b 45 61 67 6c 65 5c 2e 5f 43 6f 6d 70 6f    {Eagle\._Compo
146c0 6e 65 6e 74 73 5c 2e 50 75 62 6c 69 63 5c 2e 53  nents\.Public\.S
146d0 63 72 69 70 74 45 78 63 65 70 74 69 6f 6e 3a 20  criptException: 
146e0 28 2e 2b 3f 29 20 20 28 3f 3a 20 29 3f 61 74 7d  (.+?)  (?: )?at}
146f0 5d 0d 0a 0d 0a 20 20 20 20 20 20 66 6f 72 65 61  ]....      forea
14700 63 68 20 70 61 74 74 65 72 6e 20 24 70 61 74 74  ch pattern $patt
14710 65 72 6e 73 20 7b 0d 0a 20 20 20 20 20 20 20 20  erns {..        
14720 69 66 20 7b 5b 72 65 67 65 78 70 20 2d 2d 20 24  if {[regexp -- $
14730 70 61 74 74 65 72 6e 20 24 76 61 6c 75 65 20 64  pattern $value d
14740 75 6d 6d 79 20 6d 65 73 73 61 67 65 5d 7d 20 74  ummy message]} t
14750 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
14760 20 73 65 74 20 6d 65 73 73 61 67 65 20 5b 73 74   set message [st
14770 72 69 6e 67 20 6d 61 70 20 5b 6c 69 73 74 20 5c  ring map [list \
14780 72 5c 6e 20 5c 6e 5d 20 5b 73 74 72 69 6e 67 20  r\n \n] [string 
14790 74 72 69 6d 20 24 6d 65 73 73 61 67 65 5d 5d 0d  trim $message]].
147a0 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20 6c  .          set l
147b0 69 6e 65 73 20 5b 73 70 6c 69 74 20 24 6d 65 73  ines [split $mes
147c0 73 61 67 65 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20  sage \n]....    
147d0 20 20 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67        if {[lleng
147e0 74 68 20 24 6c 69 6e 65 73 5d 20 3d 3d 20 32 7d  th $lines] == 2}
147f0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
14800 20 20 20 20 20 69 66 20 7b 5b 6c 69 6e 64 65 78       if {[lindex
14810 20 24 6c 69 6e 65 73 20 30 5d 20 65 71 20 5b 6c   $lines 0] eq [l
14820 69 6e 64 65 78 20 24 6c 69 6e 65 73 20 31 5d 7d  index $lines 1]}
14830 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
14840 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6c         return [l
14850 69 6e 64 65 78 20 24 6c 69 6e 65 73 20 30 5d 0d  index $lines 0].
14860 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
14870 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ..            re
14880 74 75 72 6e 20 5b 61 70 70 65 6e 64 41 72 67 73  turn [appendArgs
14890 20 5b 6c 69 6e 64 65 78 20 24 6c 69 6e 65 73 20   [lindex $lines 
148a0 30 5d 20 22 20 2d 2d 20 22 20 5b 6c 69 6e 64 65  0] " -- " [linde
148b0 78 20 24 6c 69 6e 65 73 20 31 5d 5d 0d 0a 20 20  x $lines 1]]..  
148c0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
148d0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 6d         return $m
148e0 65 73 73 61 67 65 0d 0a 20 20 20 20 20 20 20 20  essage..        
148f0 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  }..      }....  
14900 20 20 20 20 72 65 74 75 72 6e 20 24 76 61 6c 75      return $valu
14910 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  e..    }.....   
14920 20 70 72 6f 63 20 74 72 69 6d 53 71 6c 20 7b 20   proc trimSql { 
14930 73 71 6c 20 7d 20 7b 0d 0a 20 20 20 20 20 20 72  sql } {..      r
14940 65 74 75 72 6e 20 5b 72 65 67 73 75 62 20 2d 61  eturn [regsub -a
14950 6c 6c 20 2d 2d 20 7b 5c 73 2b 7d 20 5b 73 74 72  ll -- {\s+} [str
14960 69 6e 67 20 74 72 69 6d 20 24 73 71 6c 5d 20 22  ing trim $sql] "
14970 20 22 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20   "]..    }..... 
14980 20 20 20 70 72 6f 63 20 65 78 65 63 75 74 65 53     proc executeS
14990 71 6c 20 7b 20 73 71 6c 20 7b 65 78 65 63 75 74  ql { sql {execut
149a0 65 20 6e 6f 6e 65 7d 20 7b 66 6f 72 6d 61 74 20  e none} {format 
149b0 6e 6f 6e 65 7d 20 7b 66 69 6c 65 4e 61 6d 65 20  none} {fileName 
149c0 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 69  ""} } {..      i
149d0 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  f {[string lengt
149e0 68 20 24 66 69 6c 65 4e 61 6d 65 5d 20 3d 3d 20  h $fileName] == 
149f0 30 7d 20 74 68 65 6e 20 7b 73 65 74 20 66 69 6c  0} then {set fil
14a00 65 4e 61 6d 65 20 3a 6d 65 6d 6f 72 79 3a 7d 0d  eName :memory:}.
14a10 0a 20 20 20 20 20 20 73 65 74 75 70 44 62 20 24  .      setupDb $
14a20 66 69 6c 65 4e 61 6d 65 20 22 22 20 22 22 20 22  fileName "" "" "
14a30 22 20 22 22 20 22 22 20 66 61 6c 73 65 20 66 61  " "" "" false fa
14a40 6c 73 65 20 66 61 6c 73 65 20 66 61 6c 73 65 20  lse false false 
14a50 64 62 20 74 72 75 65 0d 0a 0d 0a 20 20 20 20 20  db true....     
14a60 20 74 72 79 20 7b 0d 0a 20 20 20 20 20 20 20 20   try {..        
14a70 72 65 74 75 72 6e 20 5b 75 70 6c 65 76 65 6c 20  return [uplevel 
14a80 31 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20  1 [list \..     
14a90 20 20 20 20 20 20 20 73 71 6c 20 65 78 65 63 75         sql execu
14aa0 74 65 20 2d 65 78 65 63 75 74 65 20 24 65 78 65  te -execute $exe
14ab0 63 75 74 65 20 2d 66 6f 72 6d 61 74 20 24 66 6f  cute -format $fo
14ac0 72 6d 61 74 20 24 64 62 20 24 73 71 6c 5d 5d 0d  rmat $db $sql]].
14ad0 0a 20 20 20 20 20 20 7d 20 66 69 6e 61 6c 6c 79  .      } finally
14ae0 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   {..        set 
14af0 63 6f 6e 6e 65 63 74 69 6f 6e 20 5b 67 65 74 44  connection [getD
14b00 62 43 6f 6e 6e 65 63 74 69 6f 6e 5d 0d 0a 0d 0a  bConnection]....
14b10 20 20 20 20 20 20 20 20 74 72 79 20 7b 0d 0a 20          try {.. 
14b20 20 20 20 20 20 20 20 20 20 63 6c 65 61 6e 75 70           cleanup
14b30 44 62 20 24 66 69 6c 65 4e 61 6d 65 20 64 62 20  Db $fileName db 
14b40 66 61 6c 73 65 20 66 61 6c 73 65 20 66 61 6c 73  false false fals
14b50 65 0d 0a 20 20 20 20 20 20 20 20 7d 20 66 69 6e  e..        } fin
14b60 61 6c 6c 79 20 7b 0d 0a 20 20 20 20 20 20 20 20  ally {..        
14b70 20 20 6f 62 6a 65 63 74 20 66 6c 61 67 73 20 24    object flags $
14b80 63 6f 6e 6e 65 63 74 69 6f 6e 20 2d 4e 6f 44 69  connection -NoDi
14b90 73 70 6f 73 65 3b 20 66 72 65 65 44 62 43 6f 6e  spose; freeDbCon
14ba0 6e 65 63 74 69 6f 6e 0d 0a 20 20 20 20 20 20 20  nection..       
14bb0 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20   }..      }..   
14bc0 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
14bd0 68 61 73 4e 6f 46 6c 61 67 73 20 7b 20 76 61 72  hasNoFlags { var
14be0 4e 61 6d 65 20 6e 6f 6e 65 20 7d 20 7b 0d 0a 20  Name none } {.. 
14bf0 20 20 20 20 20 75 70 76 61 72 20 31 20 24 76 61       upvar 1 $va
14c00 72 4e 61 6d 65 20 66 6c 61 67 73 0d 0a 0d 0a 20  rName flags.... 
14c10 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
14c20 65 78 69 73 74 73 20 66 6c 61 67 73 5d 7d 20 74  exists flags]} t
14c30 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72  hen {..        r
14c40 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20  eturn true..    
14c50 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20    }....      if 
14c60 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
14c70 24 66 6c 61 67 73 5d 20 3d 3d 20 30 7d 20 74 68  $flags] == 0} th
14c80 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65  en {..        re
14c90 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20  turn true..     
14ca0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b   }....      if {
14cb0 24 6e 6f 6e 65 20 26 26 20 24 66 6c 61 67 73 20  $none && $flags 
14cc0 65 71 20 22 4e 6f 6e 65 22 7d 20 74 68 65 6e 20  eq "None"} then 
14cd0 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  {..        retur
14ce0 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20 7d 0d  n true..      }.
14cf0 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ...      return 
14d00 66 61 6c 73 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d  false..    }....
14d10 0a 20 20 20 20 70 72 6f 63 20 67 65 74 43 6f 6e  .    proc getCon
14d20 6e 65 63 74 69 6f 6e 46 6c 61 67 73 20 7b 20 66  nectionFlags { f
14d30 69 6c 65 4e 61 6d 65 20 66 6c 61 67 73 20 7b 71  ileName flags {q
14d40 75 69 65 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d  uiet false} } {.
14d50 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
14d60 23 20 4e 4f 54 45 3a 20 46 69 67 75 72 65 20 6f  # NOTE: Figure o
14d70 75 74 20 77 68 69 63 68 20 64 61 74 61 62 61 73  ut which databas
14d80 65 20 66 69 6c 65 20 6e 61 6d 65 20 6f 72 20 63  e file name or c
14d90 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e 67  onnection string
14da0 20 74 68 65 73 65 0d 0a 20 20 20 20 20 20 23 20   these..      # 
14db0 20 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e        connection
14dc0 20 66 6c 61 67 73 20 77 69 6c 6c 20 61 63 74 75   flags will actu
14dd0 61 6c 6c 79 20 61 70 70 6c 79 20 74 6f 2e 20 20  ally apply to.  
14de0 54 68 69 73 20 69 73 20 6e 6f 74 20 6e 65 63 65  This is not nece
14df0 73 73 61 72 79 0d 0a 20 20 20 20 20 20 23 20 20  ssary..      #  
14e00 20 20 20 20 20 69 6e 20 71 75 69 65 74 20 6d 6f       in quiet mo
14e10 64 65 20 62 65 63 61 75 73 65 20 74 68 69 73 20  de because this 
14e20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6f  information is o
14e30 6e 6c 79 20 75 73 65 64 20 66 6f 72 20 6c 6f 67  nly used for log
14e40 67 69 6e 67 0d 0a 20 20 20 20 20 20 23 20 20 20  ging..      #   
14e50 20 20 20 20 61 6e 64 20 72 65 70 6f 72 74 69 6e      and reportin
14e60 67 20 70 75 72 70 6f 73 65 73 2e 0d 0a 20 20 20  g purposes...   
14e70 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
14e80 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
14e90 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74  .        if {[st
14ea0 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 66 69 6c  ring length $fil
14eb0 65 4e 61 6d 65 5d 20 3e 20 30 7d 20 74 68 65 6e  eName] > 0} then
14ec0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   {..          se
14ed0 74 20 64 61 74 61 62 61 73 65 20 5b 61 70 70 65  t database [appe
14ee0 6e 64 41 72 67 73 20 22 66 69 6c 65 20 6e 61 6d  ndArgs "file nam
14ef0 65 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 20  e \"" $fileName 
14f00 5c 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65  \"]..        } e
14f10 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69  lseif {[info exi
14f20 73 74 73 20 3a 3a 64 61 74 61 53 6f 75 72 63 65  sts ::dataSource
14f30 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
14f40 20 20 20 20 21 5b 61 72 72 61 79 20 65 78 69 73      ![array exis
14f50 74 73 20 3a 3a 64 61 74 61 53 6f 75 72 63 65 5d  ts ::dataSource]
14f60 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
14f70 20 20 20 20 73 65 74 20 64 61 74 61 62 61 73 65      set database
14f80 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 64 61   [appendArgs "da
14f90 74 61 20 73 6f 75 72 63 65 20 5c 22 22 20 24 3a  ta source \"" $:
14fa0 3a 64 61 74 61 53 6f 75 72 63 65 20 5c 22 5d 0d  :dataSource \"].
14fb0 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20  .        } else 
14fc0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  {..          set
14fd0 20 64 61 74 61 62 61 73 65 20 3c 75 6e 6b 6e 6f   database <unkno
14fe0 77 6e 3e 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  wn>..        }..
14ff0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
15000 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
15010 3a 20 45 76 65 6e 20 74 68 6f 75 67 68 20 74 68  : Even though th
15020 65 72 65 20 69 73 20 6f 6e 6c 79 20 6f 6e 65 20  ere is only one 
15030 73 6f 75 72 63 65 20 6f 66 20 66 6c 61 67 73 20  source of flags 
15040 73 6f 20 66 61 72 2c 20 74 68 65 79 0d 0a 20 20  so far, they..  
15050 20 20 20 20 23 20 20 20 20 20 20 20 6d 75 73 74      #       must
15060 20 62 65 20 63 6f 6d 62 69 6e 65 64 20 75 73 69   be combined usi
15070 6e 67 20 74 68 65 20 63 6f 72 72 65 63 74 20 73  ng the correct s
15080 79 6e 74 61 78 20 66 6f 72 20 65 6e 75 6d 65 72  yntax for enumer
15090 61 74 65 64 0d 0a 20 20 20 20 20 20 23 20 20 20  ated..      #   
150a0 20 20 20 20 66 6c 61 67 20 76 61 6c 75 65 73 20      flag values 
150b0 66 6f 72 20 74 68 65 20 2e 4e 45 54 20 46 72 61  for the .NET Fra
150c0 6d 65 77 6f 72 6b 2e 0d 0a 20 20 20 20 20 20 23  mework...      #
150d0 0d 0a 20 20 20 20 20 20 73 65 74 20 66 6c 61 67  ..      set flag
150e0 73 20 5b 63 6f 6d 62 69 6e 65 46 6c 61 67 73 20  s [combineFlags 
150f0 24 66 6c 61 67 73 20 22 22 5d 0d 0a 0d 0a 20 20  $flags ""]....  
15100 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
15110 4f 54 45 3a 20 53 68 6f 77 20 28 61 6e 64 20 6c  OTE: Show (and l
15120 6f 67 29 20 74 68 65 20 6c 6f 63 61 6c 20 63 6f  og) the local co
15130 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 61  nnection flags a
15140 6e 64 20 74 68 65 20 61 73 73 6f 63 69 61 74 65  nd the associate
15150 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  d..      #      
15160 20 64 61 74 61 20 73 6f 75 72 63 65 20 6f 72 20   data source or 
15170 66 69 6c 65 20 6e 61 6d 65 2e 0d 0a 20 20 20 20  file name...    
15180 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 21    #..      if {!
15190 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
151a0 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
151b0 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 65  fo exists ::no(e
151c0 6d 69 74 4c 6f 63 61 6c 46 6c 61 67 73 29 5d 20  mitLocalFlags)] 
151d0 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
151e0 20 20 28 21 5b 69 6e 66 6f 20 65 78 69 73 74 73    (![info exists
151f0 20 3a 3a 6e 6f 28 65 6d 69 74 4c 6f 63 61 6c 46   ::no(emitLocalF
15200 6c 61 67 73 49 66 4e 6f 6e 65 29 5d 20 7c 7c 20  lagsIfNone)] || 
15210 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
15220 21 5b 68 61 73 4e 6f 46 6c 61 67 73 20 66 6c 61  ![hasNoFlags fla
15230 67 73 20 66 61 6c 73 65 5d 29 7d 20 74 68 65 6e  gs false])} then
15240 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70   {..          tp
15250 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
15260 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
15270 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
15280 20 22 2d 2d 2d 2d 20 6c 6f 63 61 6c 20 63 6f 6e   "---- local con
15290 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 66 6f  nection flags fo
152a0 72 20 22 20 24 64 61 74 61 62 61 73 65 20 5c 0d  r " $database \.
152b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
152c0 20 61 72 65 3a 20 22 20 5b 65 78 70 72 20 7b 21   are: " [expr {!
152d0 5b 68 61 73 4e 6f 46 6c 61 67 73 20 66 6c 61 67  [hasNoFlags flag
152e0 73 20 66 61 6c 73 65 5d 20 3f 20 5c 0d 0a 20 20  s false] ? \..  
152f0 20 20 20 20 20 20 20 20 20 20 20 20 5b 61 70 70              [app
15300 65 6e 64 41 72 67 73 20 5c 22 20 24 66 6c 61 67  endArgs \" $flag
15310 73 20 5c 22 5d 20 3a 20 22 3c 6e 6f 6e 65 3e 22  s \"] : "<none>"
15320 7d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  }] \n]..        
15330 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  }..      }....  
15340 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
15350 4f 54 45 3a 20 53 68 6f 77 20 28 61 6e 64 20 6c  OTE: Show (and l
15360 6f 67 29 20 74 68 65 20 73 68 61 72 65 64 20 63  og) the shared c
15370 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 2e  onnection flags.
15380 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
15390 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
153a0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66  en {..        if
153b0 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
153c0 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76        object inv
153d0 6f 6b 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  oke System.Data.
153e0 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 43 6f 6e  SQLite.SQLiteCon
153f0 6e 65 63 74 69 6f 6e 20 53 68 61 72 65 64 46 6c  nection SharedFl
15400 61 67 73 0d 0a 20 20 20 20 20 20 20 20 7d 20 73  ags..        } s
15410 68 61 72 65 64 46 6c 61 67 73 5d 20 3d 3d 20 30  haredFlags] == 0
15420 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
15430 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
15440 78 69 73 74 73 20 3a 3a 6e 6f 28 65 6d 69 74 53  xists ::no(emitS
15450 68 61 72 65 64 46 6c 61 67 73 29 5d 20 26 26 20  haredFlags)] && 
15460 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
15470 20 28 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   (![info exists 
15480 3a 3a 6e 6f 28 65 6d 69 74 53 68 61 72 65 64 46  ::no(emitSharedF
15490 6c 61 67 73 49 66 4e 6f 6e 65 29 5d 20 7c 7c 20  lagsIfNone)] || 
154a0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
154b0 20 20 21 5b 68 61 73 4e 6f 46 6c 61 67 73 20 73    ![hasNoFlags s
154c0 68 61 72 65 64 46 6c 61 67 73 20 74 72 75 65 5d  haredFlags true]
154d0 29 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  )} then {..     
154e0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
154f0 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
15500 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
15510 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
15520 2d 20 73 68 61 72 65 64 20 63 6f 6e 6e 65 63 74  - shared connect
15530 69 6f 6e 20 66 6c 61 67 73 20 66 6f 72 20 22 20  ion flags for " 
15540 24 64 61 74 61 62 61 73 65 20 5c 0d 0a 20 20 20  $database \..   
15550 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 61               " a
15560 72 65 3a 20 22 20 5b 65 78 70 72 20 7b 21 5b 68  re: " [expr {![h
15570 61 73 4e 6f 46 6c 61 67 73 20 73 68 61 72 65 64  asNoFlags shared
15580 46 6c 61 67 73 20 74 72 75 65 5d 20 3f 20 5c 0d  Flags true] ? \.
15590 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
155a0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 22 20   [appendArgs \" 
155b0 24 73 68 61 72 65 64 46 6c 61 67 73 20 5c 22 5d  $sharedFlags \"]
155c0 20 3a 20 22 3c 6e 6f 6e 65 3e 22 7d 5d 20 5c 6e   : "<none>"}] \n
155d0 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ]..          }..
155e0 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
155f0 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
15600 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
15610 6e 6f 28 65 6d 69 74 53 68 61 72 65 64 46 6c 61  no(emitSharedFla
15620 67 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  gs)] && \..     
15630 20 20 20 20 20 20 20 20 20 21 5b 69 6e 66 6f 20           ![info 
15640 65 78 69 73 74 73 20 3a 3a 6e 6f 28 65 6d 69 74  exists ::no(emit
15650 53 68 61 72 65 64 46 6c 61 67 73 49 66 55 6e 61  SharedFlagsIfUna
15660 76 61 69 6c 61 62 6c 65 29 5d 7d 20 74 68 65 6e  vailable)]} then
15670 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
15680 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
15690 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
156a0 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
156b0 20 20 20 20 20 22 2d 2d 2d 2d 20 73 68 61 72 65       "---- share
156c0 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61  d connection fla
156d0 67 73 20 66 6f 72 20 22 20 24 64 61 74 61 62 61  gs for " $databa
156e0 73 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  se \..          
156f0 20 20 20 20 20 20 22 20 61 72 65 3a 20 3c 75 6e        " are: <un
15700 61 76 61 69 6c 61 62 6c 65 3e 5c 6e 22 5d 0d 0a  available>\n"]..
15710 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
15720 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
15730 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
15740 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20 28    # NOTE: Show (
15750 61 6e 64 20 6c 6f 67 29 20 74 68 65 20 64 65 74  and log) the det
15760 65 63 74 65 64 20 67 6c 6f 62 61 6c 20 63 6f 6e  ected global con
15770 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 2c 20 69  nection flags, i
15780 66 20 61 6e 79 2e 0d 0a 20 20 20 20 20 20 23 0d  f any...      #.
15790 0a 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69  .      if {!$qui
157a0 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
157b0 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
157c0 78 69 73 74 73 20 3a 3a 6e 6f 28 65 6d 69 74 47  xists ::no(emitG
157d0 6c 6f 62 61 6c 46 6c 61 67 73 29 5d 20 26 26 20  lobalFlags)] && 
157e0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 28  \..            (
157f0 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
15800 6e 6f 28 65 6d 69 74 47 6c 6f 62 61 6c 46 6c 61  no(emitGlobalFla
15810 67 73 49 66 4e 6f 6e 65 29 5d 20 7c 7c 20 5c 0d  gsIfNone)] || \.
15820 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 21 5b  .             ![
15830 68 61 73 4e 6f 46 6c 61 67 73 20 3a 3a 63 6f 6e  hasNoFlags ::con
15840 6e 65 63 74 69 6f 6e 5f 66 6c 61 67 73 20 66 61  nection_flags fa
15850 6c 73 65 5d 29 7d 20 74 68 65 6e 20 7b 0d 0a 20  lse])} then {.. 
15860 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
15870 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
15880 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
15890 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
158a0 2d 20 67 6c 6f 62 61 6c 20 63 6f 6e 6e 65 63 74  - global connect
158b0 69 6f 6e 20 66 6c 61 67 73 20 61 72 65 3a 20 22  ion flags are: "
158c0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
158d0 20 20 5b 65 78 70 72 20 7b 21 5b 68 61 73 4e 6f    [expr {![hasNo
158e0 46 6c 61 67 73 20 3a 3a 63 6f 6e 6e 65 63 74 69  Flags ::connecti
158f0 6f 6e 5f 66 6c 61 67 73 20 66 61 6c 73 65 5d 20  on_flags false] 
15900 3f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ? \..           
15910 20 20 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c     [appendArgs \
15920 22 20 24 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e 5f  " $::connection_
15930 66 6c 61 67 73 20 5c 22 5d 20 3a 20 22 3c 6e 6f  flags \"] : "<no
15940 6e 65 3e 22 7d 5d 20 5c 6e 5d 0d 0a 20 20 20 20  ne>"}] \n]..    
15950 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
15960 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
15970 20 23 20 4e 4f 54 45 3a 20 49 66 20 74 68 65 72   # NOTE: If ther
15980 65 20 61 72 65 20 61 6e 79 20 67 6c 6f 62 61 6c  e are any global
15990 20 28 70 65 72 20 74 65 73 74 20 72 75 6e 29 20   (per test run) 
159a0 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73  connection flags
159b0 20 63 75 72 72 65 6e 74 6c 79 0d 0a 20 20 20 20   currently..    
159c0 20 20 23 20 20 20 20 20 20 20 73 65 74 2c 20 75    #       set, u
159d0 73 65 20 74 68 65 6d 20 6e 6f 77 20 28 69 2e 65  se them now (i.e
159e0 2e 20 62 79 20 63 6f 6d 62 69 6e 69 6e 67 20 74  . by combining t
159f0 68 65 6d 20 77 69 74 68 20 74 68 65 20 6f 6e 65  hem with the one
15a00 73 20 66 6f 72 20 74 68 69 73 0d 0a 20 20 20 20  s for this..    
15a10 20 20 23 20 20 20 20 20 20 20 63 6f 6e 6e 65 63    #       connec
15a20 74 69 6f 6e 29 2e 0d 0a 20 20 20 20 20 20 23 0d  tion)...      #.
15a30 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f  .      if {[info
15a40 20 65 78 69 73 74 73 20 3a 3a 63 6f 6e 6e 65 63   exists ::connec
15a50 74 69 6f 6e 5f 66 6c 61 67 73 5d 7d 20 74 68 65  tion_flags]} the
15a60 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
15a70 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
15a80 43 6f 6d 62 69 6e 65 20 61 6e 64 2f 6f 72 20 72  Combine and/or r
15a90 65 70 6c 61 63 65 20 74 68 65 20 63 6f 6e 6e 65  eplace the conne
15aa0 63 74 69 6f 6e 20 66 6c 61 67 73 20 61 6e 64 20  ction flags and 
15ab0 74 68 65 6e 20 73 68 6f 77 20 74 68 65 0d 0a 20  then show the.. 
15ac0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6e         #       n
15ad0 65 77 20 76 61 6c 75 65 2e 0d 0a 20 20 20 20 20  ew value...     
15ae0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65     #..        se
15af0 74 20 66 6c 61 67 73 20 5b 63 6f 6d 62 69 6e 65  t flags [combine
15b00 46 6c 61 67 73 20 24 66 6c 61 67 73 20 24 3a 3a  Flags $flags $::
15b10 63 6f 6e 6e 65 63 74 69 6f 6e 5f 66 6c 61 67 73  connection_flags
15b20 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ]....        #..
15b30 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
15b40 53 68 6f 77 20 28 61 6e 64 20 6c 6f 67 29 20 74  Show (and log) t
15b50 68 65 20 6e 65 77 20 65 66 66 65 63 74 69 76 65  he new effective
15b60 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67   connection flag
15b70 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  s...        #.. 
15b80 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
15b90 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
15ba0 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
15bb0 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 65 6d 69   exists ::no(emi
15bc0 74 43 6f 6d 62 69 6e 65 64 46 6c 61 67 73 29 5d  tCombinedFlags)]
15bd0 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
15be0 20 20 20 20 20 28 21 5b 69 6e 66 6f 20 65 78 69       (![info exi
15bf0 73 74 73 20 3a 3a 6e 6f 28 65 6d 69 74 43 6f 6d  sts ::no(emitCom
15c00 62 69 6e 65 64 46 6c 61 67 73 49 66 4e 6f 6e 65  binedFlagsIfNone
15c10 29 5d 20 7c 7c 20 5c 0d 0a 20 20 20 20 20 20 20  )] || \..       
15c20 20 20 20 20 20 20 20 20 21 5b 68 61 73 4e 6f 46          ![hasNoF
15c30 6c 61 67 73 20 66 6c 61 67 73 20 66 61 6c 73 65  lags flags false
15c40 5d 29 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  ])} then {..    
15c50 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
15c60 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
15c70 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
15c80 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
15c90 2d 2d 20 63 6f 6d 62 69 6e 65 64 20 63 6f 6e 6e  -- combined conn
15ca0 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 66 6f 72  ection flags for
15cb0 20 22 20 24 64 61 74 61 62 61 73 65 20 5c 0d 0a   " $database \..
15cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15cd0 22 20 61 72 65 3a 20 22 20 5b 65 78 70 72 20 7b  " are: " [expr {
15ce0 21 5b 68 61 73 4e 6f 46 6c 61 67 73 20 66 6c 61  ![hasNoFlags fla
15cf0 67 73 20 66 61 6c 73 65 5d 20 3f 20 5c 0d 0a 20  gs false] ? \.. 
15d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b                 [
15d10 61 70 70 65 6e 64 41 72 67 73 20 5c 22 20 24 66  appendArgs \" $f
15d20 6c 61 67 73 20 5c 22 5d 20 3a 20 22 3c 6e 6f 6e  lags \"] : "<non
15d30 65 3e 22 7d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20  e>"}] \n]..     
15d40 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
15d50 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  }..      }....  
15d60 20 20 20 20 72 65 74 75 72 6e 20 24 66 6c 61 67      return $flag
15d70 73 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  s..    }.....   
15d80 20 70 72 6f 63 20 67 65 74 46 6c 61 67 73 50 72   proc getFlagsPr
15d90 6f 70 65 72 74 79 20 7b 20 7b 66 6c 61 67 73 20  operty { {flags 
15da0 22 22 7d 20 7b 71 75 69 65 74 20 66 61 6c 73 65  ""} {quiet false
15db0 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a  } } {..      #..
15dc0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 44 65        # NOTE: De
15dd0 74 65 72 6d 69 6e 65 20 77 68 61 74 20 74 68 65  termine what the
15de0 20 63 6f 6d 62 69 6e 65 64 20 28 67 6c 6f 62 61   combined (globa
15df0 6c 20 61 6e 64 20 6c 6f 63 61 6c 29 20 63 6f 6e  l and local) con
15e00 6e 65 63 74 69 6f 6e 0d 0a 20 20 20 20 20 20 23  nection..      #
15e10 20 20 20 20 20 20 20 66 6c 61 67 73 20 73 68 6f         flags sho
15e20 75 6c 64 20 62 65 2c 20 70 6f 73 73 69 62 6c 79  uld be, possibly
15e30 20 71 75 69 65 74 6c 79 2e 0d 0a 20 20 20 20 20   quietly...     
15e40 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 66 6c   #..      set fl
15e50 61 67 73 20 5b 67 65 74 43 6f 6e 6e 65 63 74 69  ags [getConnecti
15e60 6f 6e 46 6c 61 67 73 20 22 22 20 24 66 6c 61 67  onFlags "" $flag
15e70 73 20 24 71 75 69 65 74 5d 0d 0a 0d 0a 20 20 20  s $quiet]....   
15e80 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
15e90 54 45 3a 20 49 66 20 6e 6f 20 67 6c 6f 62 61 6c  TE: If no global
15ea0 20 6f 72 20 6c 6f 63 61 6c 20 63 6f 6e 6e 65 63   or local connec
15eb0 74 69 6f 6e 20 66 6c 61 67 73 20 77 65 72 65 20  tion flags were 
15ec0 73 70 65 63 69 66 69 65 64 2c 20 74 68 65 0d 0a  specified, the..
15ed0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64 65        #       de
15ee0 66 61 75 6c 74 20 63 6f 6e 6e 65 63 74 69 6f 6e  fault connection
15ef0 20 66 6c 61 67 73 20 73 68 6f 75 6c 64 20 62 65   flags should be
15f00 20 75 73 65 64 3b 20 74 68 65 72 65 66 6f 72 65   used; therefore
15f10 2c 20 72 65 74 75 72 6e 0d 0a 20 20 20 20 20 20  , return..      
15f20 23 20 20 20 20 20 20 20 61 6e 20 65 6d 70 74 79  #       an empty
15f30 20 73 74 72 69 6e 67 20 69 6e 20 74 68 61 74 20   string in that 
15f40 63 61 73 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  case...      #..
15f50 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
15f60 67 20 6c 65 6e 67 74 68 20 24 66 6c 61 67 73 5d  g length $flags]
15f70 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
15f80 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 22 22         return ""
15f90 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
15fa0 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
15fb0 54 45 3a 20 49 6e 20 6f 72 64 65 72 20 74 6f 20  TE: In order to 
15fc0 63 68 65 63 6b 20 69 66 20 74 68 65 20 64 65 66  check if the def
15fd0 61 75 6c 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ault connection 
15fe0 66 6c 61 67 73 20 61 72 65 20 62 65 69 6e 67 20  flags are being 
15ff0 75 73 65 64 0d 0a 20 20 20 20 20 20 23 20 20 20  used..      #   
16000 20 20 20 20 69 74 20 69 73 20 6e 65 63 65 73 73      it is necess
16010 61 72 79 20 74 6f 20 61 74 74 65 6d 70 74 20 61  ary to attempt a
16020 20 63 6f 6e 76 65 72 73 69 6f 6e 20 74 6f 20 74   conversion to t
16030 68 65 20 61 63 74 75 61 6c 20 65 6e 75 6d 65 72  he actual enumer
16040 61 74 65 64 0d 0a 20 20 20 20 20 20 23 20 20 20  ated..      #   
16050 20 20 20 20 74 79 70 65 2e 20 20 46 61 69 6c 69      type.  Faili
16060 6e 67 20 74 68 61 74 2c 20 74 68 65 20 63 68 65  ng that, the che
16070 63 6b 20 61 67 61 69 6e 73 74 20 74 68 65 20 64  ck against the d
16080 65 66 61 75 6c 74 20 76 61 6c 75 65 20 77 69 6c  efault value wil
16090 6c 20 62 65 0d 0a 20 20 20 20 20 20 23 20 20 20  l be..      #   
160a0 20 20 20 20 73 6b 69 70 70 65 64 2e 0d 0a 20 20      skipped...  
160b0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
160c0 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
160d0 20 20 20 73 65 74 20 65 72 72 6f 72 20 6e 75 6c     set error nul
160e0 6c 3b 20 23 20 49 47 4e 4f 52 45 44 0d 0a 0d 0a  l; # IGNORED....
160f0 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69          object i
16100 6e 76 6f 6b 65 20 55 74 69 6c 69 74 79 20 54 72  nvoke Utility Tr
16110 79 50 61 72 73 65 46 6c 61 67 73 45 6e 75 6d 20  yParseFlagsEnum 
16120 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  "" \..          
16130 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51    System.Data.SQ
16140 4c 69 74 65 2e 53 51 4c 69 74 65 43 6f 6e 6e 65  Lite.SQLiteConne
16150 63 74 69 6f 6e 46 6c 61 67 73 20 22 22 20 24 66  ctionFlags "" $f
16160 6c 61 67 73 20 6e 75 6c 6c 20 74 72 75 65 20 5c  lags null true \
16170 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 72  ..            tr
16180 75 65 20 74 72 75 65 20 65 72 72 6f 72 0d 0a 20  ue true error.. 
16190 20 20 20 20 20 7d 20 76 61 6c 75 65 5d 7d 20 74       } value]} t
161a0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
161b0 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
161c0 3a 20 41 74 74 65 6d 70 74 69 6e 67 20 74 6f 20  : Attempting to 
161d0 70 61 72 73 65 20 74 68 65 20 63 6f 6e 6e 65 63  parse the connec
161e0 74 69 6f 6e 20 66 6c 61 67 73 20 63 61 75 73 65  tion flags cause
161f0 64 20 61 20 73 63 72 69 70 74 0d 0a 20 20 20 20  d a script..    
16200 20 20 20 20 23 20 20 20 20 20 20 20 65 72 72 6f      #       erro
16210 72 2e 20 20 45 6d 69 74 20 61 20 77 61 72 6e 69  r.  Emit a warni
16220 6e 67 20 74 6f 20 74 68 65 20 74 65 73 74 20 6c  ng to the test l
16230 6f 67 20 66 69 6c 65 20 61 6e 64 20 63 6f 6e 74  og file and cont
16240 69 6e 75 65 0d 0a 20 20 20 20 20 20 20 20 23 20  inue..        # 
16250 20 20 20 20 20 20 75 73 69 6e 67 20 61 6e 20 65        using an e
16260 6d 74 70 79 20 73 74 72 69 6e 67 20 69 6e 73 74  mtpy string inst
16270 65 61 64 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ead...        #.
16280 0a 20 20 20 20 20 20 20 20 74 6c 6f 67 20 5b 61  .        tlog [a
16290 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
162a0 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57           "==== W
162b0 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74  ARNING: failed t
162c0 6f 20 70 61 72 73 65 20 63 6f 6e 6e 65 63 74 69  o parse connecti
162d0 6f 6e 20 66 6c 61 67 73 2c 20 65 72 72 6f 72 3a  on flags, error:
162e0 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   " \..          
162f0 20 20 5c 6e 5c 74 20 24 76 61 6c 75 65 20 5c 6e    \n\t $value \n
16300 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74  ]....        set
16310 20 76 61 6c 75 65 20 22 22 0d 0a 20 20 20 20 20   value ""..     
16320 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   }....      #.. 
16330 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20       # NOTE: If 
16340 74 68 65 20 63 6f 6d 62 69 6e 65 64 20 66 6c 61  the combined fla
16350 67 73 20 73 74 72 69 6e 67 20 63 6f 75 6c 64 20  gs string could 
16360 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 62 65 20  not actually be 
16370 63 6f 6e 76 65 72 74 65 64 0d 0a 20 20 20 20 20  converted..     
16380 20 23 20 20 20 20 20 20 20 74 6f 20 74 68 65 20   #       to the 
16390 65 6e 75 6d 65 72 61 74 65 64 20 74 79 70 65 20  enumerated type 
163a0 69 74 20 69 73 20 74 68 65 20 64 65 66 61 75 6c  it is the defaul
163b0 74 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 6a 75  t value, then ju
163c0 73 74 20 75 73 65 0d 0a 20 20 20 20 20 20 23 20  st use..      # 
163d0 20 20 20 20 20 20 69 74 20 76 65 72 62 61 74 69        it verbati
163e0 6d 3b 20 6f 74 68 65 72 77 69 73 65 2c 20 6a 75  m; otherwise, ju
163f0 73 74 20 72 65 74 75 72 6e 20 61 6e 20 65 6d 70  st return an emp
16400 74 79 20 73 74 72 69 6e 67 2e 20 20 49 6e 20 74  ty string.  In t
16410 68 61 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20  hat..      #    
16420 20 20 20 63 61 73 65 2c 20 74 68 65 20 64 65 66     case, the def
16430 61 75 6c 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ault connection 
16440 66 6c 61 67 73 20 77 69 6c 6c 20 62 65 20 75 73  flags will be us
16450 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ed...      #..  
16460 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
16470 6c 65 6e 67 74 68 20 24 76 61 6c 75 65 5d 20 3d  length $value] =
16480 3d 20 30 20 7c 7c 20 24 76 61 6c 75 65 20 6e 65  = 0 || $value ne
16490 20 22 44 65 66 61 75 6c 74 22 7d 20 74 68 65 6e   "Default"} then
164a0 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
164b0 20 20 20 20 20 20 20 23 20 57 41 52 4e 49 4e 47         # WARNING
164c0 3a 20 54 68 69 73 20 72 65 74 75 72 6e 73 20 74  : This returns t
164d0 68 65 20 73 74 72 69 6e 67 20 76 61 6c 75 65 20  he string value 
164e0 6f 66 20 74 68 65 20 63 6f 6d 62 69 6e 65 64 20  of the combined 
164f0 66 6c 61 67 73 2c 20 6e 6f 74 0d 0a 20 20 20 20  flags, not..    
16500 20 20 20 20 23 20 20 20 20 20 20 20 20 20 20 74      #          t
16510 68 65 20 65 6e 75 6d 65 72 61 74 65 64 20 76 61  he enumerated va
16520 6c 75 65 2e 20 20 54 68 69 73 20 69 73 20 62 79  lue.  This is by
16530 20 64 65 73 69 67 6e 20 61 6e 64 20 73 68 6f 75   design and shou
16540 6c 64 20 6e 6f 74 0d 0a 20 20 20 20 20 20 20 20  ld not..        
16550 23 20 20 20 20 20 20 20 20 20 20 62 65 20 63 68  #          be ch
16560 61 6e 67 65 64 20 77 69 74 68 6f 75 74 20 63 61  anged without ca
16570 72 65 66 75 6c 20 63 6f 6e 73 69 64 65 72 61 74  reful considerat
16580 69 6f 6e 20 28 65 2e 67 2e 20 69 74 20 77 6f 75  ion (e.g. it wou
16590 6c 64 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ld..        #   
165a0 20 20 20 20 20 20 20 70 72 65 76 65 6e 74 20 74         prevent t
165b0 68 65 20 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74  he SQLiteConnect
165c0 69 6f 6e 20 63 6c 61 73 73 20 66 72 6f 6d 20 61  ion class from a
165d0 6c 6c 6f 77 69 6e 67 20 69 6e 76 61 6c 69 64 0d  llowing invalid.
165e0 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
165f0 20 20 20 20 5b 22 6d 61 67 69 63 61 6c 22 5d 20      ["magical"] 
16600 6d 65 74 61 2d 66 6c 61 67 73 29 2e 0d 0a 20 20  meta-flags)...  
16610 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
16620 20 72 65 74 75 72 6e 20 5b 61 70 70 65 6e 64 41   return [appendA
16630 72 67 73 20 22 46 6c 61 67 73 3d 22 20 24 66 6c  rgs "Flags=" $fl
16640 61 67 73 20 5c 3b 5d 0d 0a 20 20 20 20 20 20 7d  ags \;]..      }
16650 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ....      return
16660 20 22 22 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20   ""..    }..... 
16670 20 20 20 70 72 6f 63 20 67 65 74 54 65 73 74 50     proc getTestP
16680 72 6f 70 65 72 74 69 65 73 20 7b 20 7b 66 6c 61  roperties { {fla
16690 67 73 20 22 22 7d 20 7b 71 75 69 65 74 20 66 61  gs ""} {quiet fa
166a0 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20  lse} } {..      
166b0 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
166c0 20 53 74 61 72 74 20 77 69 74 68 20 22 46 6c 61   Start with "Fla
166d0 67 73 22 20 70 72 6f 70 65 72 74 79 20 66 6f 72  gs" property for
166e0 20 74 68 65 20 6e 65 77 20 63 6f 6e 6e 65 63 74   the new connect
166f0 69 6f 6e 2c 20 69 66 20 61 6e 79 2e 0d 0a 20 20  ion, if any...  
16700 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74      #..      set
16710 20 72 65 73 75 6c 74 20 5b 67 65 74 46 6c 61 67   result [getFlag
16720 73 50 72 6f 70 65 72 74 79 20 24 66 6c 61 67 73  sProperty $flags
16730 20 24 71 75 69 65 74 5d 0d 0a 0d 0a 20 20 20 20   $quiet]....    
16740 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
16750 45 3a 20 41 64 64 20 74 68 65 20 6e 61 6d 65 20  E: Add the name 
16760 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  of the current t
16770 65 73 74 20 66 69 6c 65 2c 20 69 66 20 61 76 61  est file, if ava
16780 69 6c 61 62 6c 65 2e 20 20 54 68 69 73 20 69 73  ilable.  This is
16790 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
167a0 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 20 64 65  only used for de
167b0 62 75 67 67 69 6e 67 2e 0d 0a 20 20 20 20 20 20  bugging...      
167c0 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e  #..      if {[in
167d0 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 73 74  fo exists ::test
167e0 5f 66 69 6c 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a  _file]} then {..
167f0 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 20 72          append r
16800 65 73 75 6c 74 20 54 65 73 74 46 69 6c 65 3d 20  esult TestFile= 
16810 24 3a 3a 74 65 73 74 5f 66 69 6c 65 20 5c 3b 0d  $::test_file \;.
16820 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
16830 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
16840 45 3a 20 41 64 64 20 74 68 65 20 6e 61 6d 65 20  E: Add the name 
16850 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  of the current t
16860 65 73 74 2c 20 69 66 20 61 76 61 69 6c 61 62 6c  est, if availabl
16870 65 2e 20 20 54 68 69 73 20 69 73 20 6f 6e 6c 79  e.  This is only
16880 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
16890 75 73 65 64 20 66 6f 72 20 64 65 62 75 67 67 69  used for debuggi
168a0 6e 67 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ng...      #..  
168b0 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
168c0 69 73 74 73 20 3a 3a 65 61 67 6c 65 5f 74 65 73  ists ::eagle_tes
168d0 74 73 28 43 75 72 72 65 6e 74 4e 61 6d 65 29 5d  ts(CurrentName)]
168e0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
168f0 20 20 61 70 70 65 6e 64 20 72 65 73 75 6c 74 20    append result 
16900 54 65 73 74 4e 61 6d 65 3d 20 24 3a 3a 65 61 67  TestName= $::eag
16910 6c 65 5f 74 65 73 74 73 28 43 75 72 72 65 6e 74  le_tests(Current
16920 4e 61 6d 65 29 20 5c 3b 0d 0a 20 20 20 20 20 20  Name) \;..      
16930 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72  }....      retur
16940 6e 20 24 72 65 73 75 6c 74 0d 0a 20 20 20 20 7d  n $result..    }
16950 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 65 6e  .....    proc en
16960 61 62 6c 65 53 68 61 72 65 64 43 61 63 68 65 20  ableSharedCache 
16970 7b 20 63 68 61 6e 6e 65 6c 20 65 6e 61 62 6c 65  { channel enable
16980 20 7b 71 75 69 65 74 20 66 61 6c 73 65 7d 20 7d   {quiet false} }
16990 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63   {..      if {[c
169a0 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
169b0 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66  object invoke -f
169c0 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20  lags +NonPublic 
169d0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 53  \..            S
169e0 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
169f0 65 2e 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65  e.UnsafeNativeMe
16a00 74 68 6f 64 73 20 5c 0d 0a 20 20 20 20 20 20 20  thods \..       
16a10 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 6e 61       sqlite3_ena
16a20 62 6c 65 5f 73 68 61 72 65 64 5f 63 61 63 68 65  ble_shared_cache
16a30 20 5b 65 78 70 72 20 69 6e 74 28 24 65 6e 61 62   [expr int($enab
16a40 6c 65 29 5d 0d 0a 20 20 20 20 20 20 7d 20 72 65  le)]..      } re
16a50 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  sult] == 0} then
16a60 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   {..        if {
16a70 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
16a80 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
16a90 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
16aa0 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
16ab0 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 61 6c         "---- cal
16ac0 6c 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65  l sqlite3_enable
16ad0 5f 73 68 61 72 65 64 5f 63 61 63 68 65 28 22 20  _shared_cache(" 
16ae0 24 65 6e 61 62 6c 65 20 5c 0d 0a 20 20 20 20 20  $enable \..     
16af0 20 20 20 20 20 20 20 20 20 22 29 2e 2e 2e 20 6f           ")... o
16b00 6b 3a 20 22 20 24 72 65 73 75 6c 74 20 5c 6e 5d  k: " $result \n]
16b10 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
16b20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
16b30 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
16b40 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
16b50 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
16b60 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
16b70 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
16b80 22 2d 2d 2d 2d 20 63 61 6c 6c 20 73 71 6c 69 74  "---- call sqlit
16b90 65 33 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65 64  e3_enable_shared
16ba0 5f 63 61 63 68 65 28 22 20 24 65 6e 61 62 6c 65  _cache(" $enable
16bb0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
16bc0 20 20 22 29 2e 2e 2e 20 65 72 72 6f 72 3a 20 22    ")... error: "
16bd0 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e   \n\t $result \n
16be0 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  ]..        }..  
16bf0 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
16c00 0a 20 20 20 20 70 72 6f 63 20 73 65 74 75 70 44  .    proc setupD
16c10 62 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  b {..           
16c20 20 66 69 6c 65 4e 61 6d 65 20 7b 6d 6f 64 65 20   fileName {mode 
16c30 22 22 7d 20 7b 64 61 74 65 54 69 6d 65 46 6f 72  ""} {dateTimeFor
16c40 6d 61 74 20 22 22 7d 20 7b 64 61 74 65 54 69 6d  mat ""} {dateTim
16c50 65 4b 69 6e 64 20 22 22 7d 20 7b 66 6c 61 67 73  eKind ""} {flags
16c60 20 22 22 7d 0d 0a 20 20 20 20 20 20 20 20 20 20   ""}..          
16c70 20 20 7b 65 78 74 72 61 20 22 22 7d 20 7b 71 75    {extra ""} {qu
16c80 61 6c 69 66 79 20 74 72 75 65 7d 20 7b 64 65 6c  alify true} {del
16c90 65 74 65 20 74 72 75 65 7d 20 7b 75 72 69 20 66  ete true} {uri f
16ca0 61 6c 73 65 7d 0d 0a 20 20 20 20 20 20 20 20 20  alse}..         
16cb0 20 20 20 7b 74 65 6d 70 6f 72 61 72 79 20 74 72     {temporary tr
16cc0 75 65 7d 20 7b 76 61 72 4e 61 6d 65 20 64 62 7d  ue} {varName db}
16cd0 20 7b 71 75 69 65 74 20 66 61 6c 73 65 7d 20 7d   {quiet false} }
16ce0 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
16cf0 20 20 20 23 20 4e 4f 54 45 3a 20 46 69 72 73 74     # NOTE: First
16d00 2c 20 73 65 65 20 69 66 20 6f 75 72 20 63 61 6c  , see if our cal
16d10 6c 65 72 20 68 61 73 20 72 65 71 75 65 73 74 65  ler has requeste
16d20 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  d an in-memory d
16d30 61 74 61 62 61 73 65 2e 0d 0a 20 20 20 20 20 20  atabase...      
16d40 23 0d 0a 20 20 20 20 20 20 73 65 74 20 69 73 4d  #..      set isM
16d50 65 6d 6f 72 79 20 5b 69 73 4d 65 6d 6f 72 79 44  emory [isMemoryD
16d60 62 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a  b $fileName]....
16d70 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
16d80 20 4e 4f 54 45 3a 20 46 6f 72 20 6e 6f 77 2c 20   NOTE: For now, 
16d90 61 6c 6c 20 74 65 73 74 20 64 61 74 61 62 61 73  all test databas
16da0 65 73 20 75 73 65 64 20 62 79 20 74 68 65 20 74  es used by the t
16db0 65 73 74 20 73 75 69 74 65 20 61 72 65 20 70 6c  est suite are pl
16dc0 61 63 65 64 0d 0a 20 20 20 20 20 20 23 20 20 20  aced..      #   
16dd0 20 20 20 20 69 6e 74 6f 20 74 68 65 20 64 61 74      into the dat
16de0 61 62 61 73 65 20 64 69 72 65 63 74 6f 72 79 2e  abase directory.
16df0 20 20 45 61 63 68 20 64 61 74 61 62 61 73 65 20    Each database 
16e00 61 6e 64 20 72 65 6c 61 74 65 64 20 66 69 6c 65  and related file
16e10 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  s..      #      
16e20 20 75 73 65 64 20 62 79 20 61 20 74 65 73 74 20   used by a test 
16e30 73 68 6f 75 6c 64 20 62 65 20 63 6c 65 61 6e 65  should be cleane
16e40 64 20 75 70 20 62 79 20 74 68 61 74 20 74 65 73  d up by that tes
16e50 74 20 75 73 69 6e 67 20 74 68 65 0d 0a 20 20 20  t using the..   
16e60 20 20 20 23 20 20 20 20 20 20 20 22 63 6c 65 61     #       "clea
16e70 6e 75 70 44 62 22 20 70 72 6f 63 65 64 75 72 65  nupDb" procedure
16e80 2c 20 62 65 6c 6f 77 2e 0d 0a 20 20 20 20 20 20  , below...      
16e90 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 24 69  #..      if {!$i
16ea0 73 4d 65 6d 6f 72 79 20 26 26 20 24 71 75 61 6c  sMemory && $qual
16eb0 69 66 79 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ify} then {..   
16ec0 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d       set fileNam
16ed0 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65  e [file join [ge
16ee0 74 44 61 74 61 62 61 73 65 44 69 72 65 63 74 6f  tDatabaseDirecto
16ef0 72 79 5d 20 5b 66 69 6c 65 20 74 61 69 6c 20 24  ry] [file tail $
16f00 66 69 6c 65 4e 61 6d 65 5d 5d 0d 0a 20 20 20 20  fileName]]..    
16f10 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
16f20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 79        # NOTE: By
16f30 20 64 65 66 61 75 6c 74 2c 20 64 65 6c 65 74 65   default, delete
16f40 20 61 6e 79 20 70 72 65 2d 65 78 69 73 74 69 6e   any pre-existin
16f50 67 20 64 61 74 61 62 61 73 65 20 77 69 74 68 20  g database with 
16f60 74 68 65 20 73 61 6d 65 20 66 69 6c 65 0d 0a 20  the same file.. 
16f70 20 20 20 20 20 23 20 20 20 20 20 20 20 6e 61 6d       #       nam
16f80 65 20 69 66 20 69 74 20 63 75 72 72 65 6e 74 6c  e if it currentl
16f90 79 20 65 78 69 73 74 73 2e 0d 0a 20 20 20 20 20  y exists...     
16fa0 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 24   #..      if {!$
16fb0 69 73 4d 65 6d 6f 72 79 20 26 26 20 24 64 65 6c  isMemory && $del
16fc0 65 74 65 20 26 26 20 5b 66 69 6c 65 20 65 78 69  ete && [file exi
16fd0 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20  sts $fileName]} 
16fe0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
16ff0 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
17000 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 64 65  E: Attempt to de
17010 6c 65 74 65 20 61 6e 79 20 70 72 65 2d 65 78 69  lete any pre-exi
17020 73 74 69 6e 67 20 64 61 74 61 62 61 73 65 20 77  sting database w
17030 69 74 68 20 74 68 65 20 73 61 6d 65 20 66 69 6c  ith the same fil
17040 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
17050 20 20 20 6e 61 6d 65 2e 0d 0a 20 20 20 20 20 20     name...      
17060 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20    #..        if 
17070 7b 5b 63 61 74 63 68 20 7b 66 69 6c 65 20 64 65  {[catch {file de
17080 6c 65 74 65 20 24 66 69 6c 65 4e 61 6d 65 7d 20  lete $fileName} 
17090 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a  error]} then {..
170a0 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
170b0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57         # NOTE: W
170c0 65 20 73 6f 6d 65 68 6f 77 20 66 61 69 6c 65 64  e somehow failed
170d0 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 66   to delete the f
170e0 69 6c 65 2c 20 72 65 70 6f 72 74 20 77 68 79 2e  ile, report why.
170f0 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
17100 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71           if {!$q
17110 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
17120 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
17130 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
17140 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
17150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
17160 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61  ==== WARNING: fa
17170 69 6c 65 64 20 74 6f 20 64 65 6c 65 74 65 20 64  iled to delete d
17180 61 74 61 62 61 73 65 20 66 69 6c 65 20 5c 22 22  atabase file \""
17190 20 24 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20   $fileName \..  
171a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 5c                "\
171b0 22 20 64 75 72 69 6e 67 20 73 65 74 75 70 2c 20  " during setup, 
171c0 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65  error: " \n\t $e
171d0 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  rror \n]..      
171e0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
171f0 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
17200 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
17210 54 45 3a 20 52 65 66 65 72 20 74 6f 20 74 68 65  TE: Refer to the
17220 20 73 70 65 63 69 66 69 65 64 20 76 61 72 69 61   specified varia
17230 62 6c 65 20 28 65 2e 67 2e 20 22 64 62 22 29 20  ble (e.g. "db") 
17240 69 6e 20 74 68 65 20 63 6f 6e 74 65 78 74 20 6f  in the context o
17250 66 20 6f 75 72 0d 0a 20 20 20 20 20 20 23 20 20  f our..      #  
17260 20 20 20 20 20 63 61 6c 6c 65 72 2e 20 20 54 68       caller.  Th
17270 65 20 68 61 6e 64 6c 65 20 74 6f 20 74 68 65 20  e handle to the 
17280 6f 70 65 6e 65 64 20 64 61 74 61 62 61 73 65 20  opened database 
17290 77 69 6c 6c 20 62 65 20 73 74 6f 72 65 64 20 74  will be stored t
172a0 68 65 72 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  here...      #..
172b0 20 20 20 20 20 20 75 70 76 61 72 20 31 20 24 76        upvar 1 $v
172c0 61 72 4e 61 6d 65 20 64 62 0d 0a 0d 0a 20 20 20  arName db....   
172d0 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
172e0 54 45 3a 20 53 74 61 72 74 20 62 75 69 6c 64 69  TE: Start buildi
172f0 6e 67 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  ng the connectio
17300 6e 20 73 74 72 69 6e 67 2e 20 20 54 68 65 20 6f  n string.  The o
17310 6e 6c 79 20 72 65 71 75 69 72 65 64 20 70 6f 72  nly required por
17320 74 69 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20 20  tion..      #   
17330 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65      of the conne
17340 63 74 69 6f 6e 20 73 74 72 69 6e 67 20 69 73 20  ction string is 
17350 74 68 65 20 64 61 74 61 20 73 6f 75 72 63 65 2c  the data source,
17360 20 77 68 69 63 68 20 63 6f 6e 74 61 69 6e 73 20   which contains 
17370 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  the..      #    
17380 20 20 20 64 61 74 61 62 61 73 65 20 66 69 6c 65     database file
17390 20 6e 61 6d 65 20 69 74 73 65 6c 66 2e 20 20 49   name itself.  I
173a0 66 20 6f 75 72 20 63 61 6c 6c 65 72 20 77 61 6e  f our caller wan
173b0 74 73 20 74 6f 20 75 73 65 20 61 20 55 52 49 20  ts to use a URI 
173c0 61 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  as..      #     
173d0 20 20 74 68 65 20 64 61 74 61 20 73 6f 75 72 63    the data sourc
173e0 65 2c 20 75 73 65 20 74 68 65 20 46 75 6c 6c 55  e, use the FullU
173f0 72 69 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74  ri connection st
17400 72 69 6e 67 20 70 72 6f 70 65 72 74 79 20 74 6f  ring property to
17410 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
17420 70 72 65 76 65 6e 74 20 74 68 65 20 64 61 74 61  prevent the data
17430 20 73 6f 75 72 63 65 20 73 74 72 69 6e 67 20 66   source string f
17440 72 6f 6d 20 62 65 69 6e 67 20 6d 61 6e 67 6c 65  rom being mangle
17450 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  d...      #..   
17460 20 20 20 69 66 20 7b 24 75 72 69 7d 20 74 68 65     if {$uri} the
17470 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74  n {..        set
17480 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 46 75 6c   connection {Ful
17490 6c 55 72 69 3d 24 7b 66 69 6c 65 4e 61 6d 65 7d  lUri=${fileName}
174a0 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  }..      } else 
174b0 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 63  {..        set c
174c0 6f 6e 6e 65 63 74 69 6f 6e 20 7b 44 61 74 61 20  onnection {Data 
174d0 53 6f 75 72 63 65 3d 24 7b 66 69 6c 65 4e 61 6d  Source=${fileNam
174e0 65 7d 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  e}}..      }....
174f0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
17500 20 4e 4f 54 45 3a 20 53 69 6e 63 65 20 74 68 69   NOTE: Since thi
17510 73 20 70 72 6f 63 65 64 75 72 65 20 68 61 73 20  s procedure has 
17520 6e 6f 20 73 70 65 63 69 61 6c 20 6b 6e 6f 77 6c  no special knowl
17530 65 64 67 65 20 6f 66 20 77 68 61 74 20 74 68 65  edge of what the
17540 20 64 65 66 61 75 6c 74 0d 0a 20 20 20 20 20 20   default..      
17550 23 20 20 20 20 20 20 20 73 65 74 74 69 6e 67 20  #       setting 
17560 69 73 20 66 6f 72 20 74 68 65 20 54 6f 46 75 6c  is for the ToFul
17570 6c 50 61 74 68 20 63 6f 6e 6e 65 63 74 69 6f 6e  lPath connection
17580 20 73 74 72 69 6e 67 20 70 72 6f 70 65 72 79 2c   string propery,
17590 20 61 6c 77 61 79 73 0d 0a 20 20 20 20 20 20 23   always..      #
175a0 20 20 20 20 20 20 20 61 64 64 20 74 68 65 20 76         add the v
175b0 61 6c 75 65 20 77 65 20 6b 6e 6f 77 20 61 62 6f  alue we know abo
175c0 75 74 20 74 6f 20 74 68 65 20 63 6f 6e 6e 65 63  ut to the connec
175d0 74 69 6f 6e 20 73 74 72 69 6e 67 2e 0d 0a 20 20  tion string...  
175e0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 61 70 70      #..      app
175f0 65 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b  end connection {
17600 3b 54 6f 46 75 6c 6c 50 61 74 68 3d 24 7b 71 75  ;ToFullPath=${qu
17610 61 6c 69 66 79 7d 7d 0d 0a 0d 0a 20 20 20 20 20  alify}}....     
17620 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
17630 3a 20 49 66 20 6f 75 72 20 63 61 6c 6c 65 72 20  : If our caller 
17640 73 70 65 63 69 66 69 65 64 20 61 20 6a 6f 75 72  specified a jour
17650 6e 61 6c 20 6d 6f 64 65 2c 20 61 64 64 20 74 68  nal mode, add th
17660 65 20 6e 65 63 65 73 73 61 72 79 20 70 6f 72 74  e necessary port
17670 69 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ion..      #    
17680 20 20 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63     of the connec
17690 74 69 6f 6e 20 73 74 72 69 6e 67 20 6e 6f 77 2e  tion string now.
176a0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
176b0 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
176c0 67 74 68 20 24 6d 6f 64 65 5d 20 3e 20 30 7d 20  gth $mode] > 0} 
176d0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
176e0 61 70 70 65 6e 64 20 63 6f 6e 6e 65 63 74 69 6f  append connectio
176f0 6e 20 7b 3b 4a 6f 75 72 6e 61 6c 20 4d 6f 64 65  n {;Journal Mode
17700 3d 24 7b 6d 6f 64 65 7d 7d 0d 0a 20 20 20 20 20  =${mode}}..     
17710 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   }....      #.. 
17720 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20       # NOTE: If 
17730 6f 75 72 20 63 61 6c 6c 65 72 20 73 70 65 63 69  our caller speci
17740 66 69 65 64 20 61 20 44 61 74 65 54 69 6d 65 20  fied a DateTime 
17750 66 6f 72 6d 61 74 2c 20 61 64 64 20 74 68 65 20  format, add the 
17760 6e 65 63 65 73 73 61 72 79 0d 0a 20 20 20 20 20  necessary..     
17770 20 23 20 20 20 20 20 20 20 70 6f 72 74 69 6f 6e   #       portion
17780 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   of the connecti
17790 6f 6e 20 73 74 72 69 6e 67 20 6e 6f 77 2e 0d 0a  on string now...
177a0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
177b0 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  f {[string lengt
177c0 68 20 24 64 61 74 65 54 69 6d 65 46 6f 72 6d 61  h $dateTimeForma
177d0 74 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  t] > 0} then {..
177e0 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 20 63          append c
177f0 6f 6e 6e 65 63 74 69 6f 6e 20 7b 3b 44 61 74 65  onnection {;Date
17800 54 69 6d 65 46 6f 72 6d 61 74 3d 24 7b 64 61 74  TimeFormat=${dat
17810 65 54 69 6d 65 46 6f 72 6d 61 74 7d 7d 0d 0a 20  eTimeFormat}}.. 
17820 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
17830 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
17840 20 49 66 20 6f 75 72 20 63 61 6c 6c 65 72 20 73   If our caller s
17850 70 65 63 69 66 69 65 64 20 61 20 44 61 74 65 54  pecified a DateT
17860 69 6d 65 4b 69 6e 64 2c 20 61 64 64 20 74 68 65  imeKind, add the
17870 20 6e 65 63 65 73 73 61 72 79 20 70 6f 72 74 69   necessary porti
17880 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  on..      #     
17890 20 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74    of the connect
178a0 69 6f 6e 20 73 74 72 69 6e 67 20 6e 6f 77 2e 0d  ion string now..
178b0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
178c0 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
178d0 74 68 20 24 64 61 74 65 54 69 6d 65 4b 69 6e 64  th $dateTimeKind
178e0 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
178f0 20 20 20 20 20 20 20 61 70 70 65 6e 64 20 63 6f         append co
17900 6e 6e 65 63 74 69 6f 6e 20 7b 3b 44 61 74 65 54  nnection {;DateT
17910 69 6d 65 4b 69 6e 64 3d 24 7b 64 61 74 65 54 69  imeKind=${dateTi
17920 6d 65 4b 69 6e 64 7d 7d 0d 0a 20 20 20 20 20 20  meKind}}..      
17930 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
17940 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69 67 75      # NOTE: Figu
17950 72 65 20 6f 75 74 20 77 68 61 74 20 74 68 65 20  re out what the 
17960 66 69 6e 61 6c 20 66 6c 61 67 73 20 66 6f 72 20  final flags for 
17970 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  this connection 
17980 6e 65 65 64 20 74 6f 20 62 65 2e 0d 0a 20 20 20  need to be...   
17990 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20     #..      set 
179a0 66 6c 61 67 73 20 5b 67 65 74 43 6f 6e 6e 65 63  flags [getConnec
179b0 74 69 6f 6e 46 6c 61 67 73 20 24 66 69 6c 65 4e  tionFlags $fileN
179c0 61 6d 65 20 24 66 6c 61 67 73 20 24 71 75 69 65  ame $flags $quie
179d0 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20  t]....      #.. 
179e0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20       # NOTE: If 
179f0 6f 75 72 20 63 61 6c 6c 65 72 20 73 70 65 63 69  our caller speci
17a00 66 69 65 64 20 73 6f 6d 65 20 53 51 4c 69 74 65  fied some SQLite
17a10 43 6f 6e 6e 65 63 74 69 6f 6e 46 6c 61 67 73 2c  ConnectionFlags,
17a20 20 61 64 64 20 74 68 65 0d 0a 20 20 20 20 20 20   add the..      
17a30 23 20 20 20 20 20 20 20 6e 65 63 65 73 73 61 72  #       necessar
17a40 79 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65  y portion of the
17a50 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69   connection stri
17a60 6e 67 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 23  ng now...      #
17a70 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72  ..      if {[str
17a80 69 6e 67 20 6c 65 6e 67 74 68 20 24 66 6c 61 67  ing length $flag
17a90 73 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  s] > 0} then {..
17aa0 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 20 63          append c
17ab0 6f 6e 6e 65 63 74 69 6f 6e 20 7b 3b 46 6c 61 67  onnection {;Flag
17ac0 73 3d 24 7b 66 6c 61 67 73 7d 7d 0d 0a 20 20 20  s=${flags}}..   
17ad0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
17ae0 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49  .      # NOTE: I
17af0 66 20 6f 75 72 20 63 61 6c 6c 65 72 20 73 70 65  f our caller spe
17b00 63 69 66 69 65 64 20 61 6e 20 65 78 74 72 61 20  cified an extra 
17b10 70 61 79 6c 6f 61 64 20 74 6f 20 74 68 65 20 63  payload to the c
17b20 6f 6e 6e 65 63 74 69 6f 6e 0d 0a 20 20 20 20 20  onnection..     
17b30 20 23 20 20 20 20 20 20 20 73 74 72 69 6e 67 2c   #       string,
17b40 20 61 70 70 65 6e 64 20 69 74 20 6e 6f 77 2e 0d   append it now..
17b50 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
17b60 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
17b70 74 68 20 24 65 78 74 72 61 5d 20 3e 20 30 7d 20  th $extra] > 0} 
17b80 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
17b90 61 70 70 65 6e 64 20 63 6f 6e 6e 65 63 74 69 6f  append connectio
17ba0 6e 20 5c 3b 20 24 65 78 74 72 61 0d 0a 20 20 20  n \; $extra..   
17bb0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
17bc0 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41  .      # NOTE: A
17bd0 64 64 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  dd the name of t
17be0 68 65 20 63 75 72 72 65 6e 74 20 74 65 73 74 20  he current test 
17bf0 66 69 6c 65 2c 20 69 66 20 61 76 61 69 6c 61 62  file, if availab
17c00 6c 65 2e 20 20 54 68 69 73 20 69 73 0d 0a 20 20  le.  This is..  
17c10 20 20 20 20 23 20 20 20 20 20 20 20 6f 6e 6c 79      #       only
17c20 20 75 73 65 64 20 66 6f 72 20 64 65 62 75 67 67   used for debugg
17c30 69 6e 67 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ing...      #.. 
17c40 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65       if {[info e
17c50 78 69 73 74 73 20 3a 3a 74 65 73 74 5f 66 69 6c  xists ::test_fil
17c60 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  e]} then {..    
17c70 20 20 20 20 61 70 70 65 6e 64 20 63 6f 6e 6e 65      append conne
17c80 63 74 69 6f 6e 20 7b 3b 54 65 73 74 46 69 6c 65  ction {;TestFile
17c90 3d 24 7b 3a 3a 74 65 73 74 5f 66 69 6c 65 7d 7d  =${::test_file}}
17ca0 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
17cb0 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
17cc0 54 45 3a 20 41 64 64 20 74 68 65 20 6e 61 6d 65  TE: Add the name
17cd0 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
17ce0 74 65 73 74 2c 20 69 66 20 61 76 61 69 6c 61 62  test, if availab
17cf0 6c 65 2e 20 20 54 68 69 73 20 69 73 20 6f 6e 6c  le.  This is onl
17d00 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  y..      #      
17d10 20 75 73 65 64 20 66 6f 72 20 64 65 62 75 67 67   used for debugg
17d20 69 6e 67 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ing...      #.. 
17d30 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65       if {[info e
17d40 78 69 73 74 73 20 3a 3a 65 61 67 6c 65 5f 74 65  xists ::eagle_te
17d50 73 74 73 28 43 75 72 72 65 6e 74 4e 61 6d 65 29  sts(CurrentName)
17d60 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
17d70 20 20 20 61 70 70 65 6e 64 20 63 6f 6e 6e 65 63     append connec
17d80 74 69 6f 6e 20 7b 3b 54 65 73 74 4e 61 6d 65 3d  tion {;TestName=
17d90 24 7b 3a 3a 65 61 67 6c 65 5f 74 65 73 74 73 28  ${::eagle_tests(
17da0 43 75 72 72 65 6e 74 4e 61 6d 65 29 7d 7d 0d 0a  CurrentName)}}..
17db0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
17dc0 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
17dd0 3a 20 46 6f 72 20 63 6c 61 72 69 74 79 2c 20 61  : For clarity, a
17de0 70 70 65 6e 64 20 61 20 66 69 6e 61 6c 20 73 65  ppend a final se
17df0 6d 69 63 6f 6c 6f 6e 20 74 6f 20 74 68 65 20 63  micolon to the c
17e00 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e 67  onnection string
17e10 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
17e20 20 20 61 70 70 65 6e 64 20 63 6f 6e 6e 65 63 74    append connect
17e30 69 6f 6e 20 5c 3b 0d 0a 0d 0a 20 20 20 20 20 20  ion \;....      
17e40 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
17e50 20 4f 70 65 6e 20 74 68 65 20 64 61 74 61 62 61   Open the databa
17e60 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6e 6f  se connection no
17e70 77 2c 20 70 6c 61 63 69 6e 67 20 74 68 65 20 6f  w, placing the o
17e80 70 61 71 75 65 20 68 61 6e 64 6c 65 20 76 61 6c  paque handle val
17e90 75 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ue..      #     
17ea0 20 20 69 6e 74 6f 20 74 68 65 20 76 61 72 69 61    into the varia
17eb0 62 6c 65 20 73 70 65 63 69 66 69 65 64 20 62 79  ble specified by
17ec0 20 6f 75 72 20 63 61 6c 6c 65 72 2e 0d 0a 20 20   our caller...  
17ed0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74      #..      set
17ee0 20 64 62 20 5b 73 71 6c 20 6f 70 65 6e 20 2d 74   db [sql open -t
17ef0 79 70 65 20 53 51 4c 69 74 65 20 5b 73 75 62 73  ype SQLite [subs
17f00 74 20 24 63 6f 6e 6e 65 63 74 69 6f 6e 5d 5d 0d  t $connection]].
17f10 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
17f20 20 20 23 20 4e 4f 54 45 3a 20 43 6f 6e 66 69 67    # NOTE: Config
17f30 75 72 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72  ure the temporar
17f40 79 20 64 69 72 65 63 74 6f 72 79 20 66 6f 72 20  y directory for 
17f50 74 68 65 20 6e 65 77 6c 79 20 6f 70 65 6e 65 64  the newly opened
17f60 20 64 61 74 61 62 61 73 65 0d 0a 20 20 20 20 20   database..     
17f70 20 23 20 20 20 20 20 20 20 63 6f 6e 6e 65 63 74   #       connect
17f80 69 6f 6e 20 6e 6f 77 20 75 6e 6c 65 73 73 20 6f  ion now unless o
17f90 75 72 20 63 61 6c 6c 65 72 20 66 6f 72 62 69 64  ur caller forbid
17fa0 73 20 69 74 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  s it...      #..
17fb0 20 20 20 20 20 20 69 66 20 7b 24 74 65 6d 70 6f        if {$tempo
17fc0 72 61 72 79 20 26 26 20 21 5b 69 6e 66 6f 20 65  rary && ![info e
17fd0 78 69 73 74 73 20 3a 3a 6e 6f 28 73 65 74 54 65  xists ::no(setTe
17fe0 6d 70 6f 72 61 72 79 44 69 72 65 63 74 6f 72 79  mporaryDirectory
17ff0 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
18000 20 20 20 20 73 71 6c 20 65 78 65 63 75 74 65 20      sql execute 
18010 24 64 62 20 5b 61 70 70 65 6e 64 41 72 67 73 20  $db [appendArgs 
18020 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  \..            "
18030 50 52 41 47 4d 41 20 74 65 6d 70 5f 73 74 6f 72  PRAGMA temp_stor
18040 65 5f 64 69 72 65 63 74 6f 72 79 20 3d 20 5c 22  e_directory = \"
18050 22 20 5b 67 65 74 54 65 6d 70 6f 72 61 72 79 44  " [getTemporaryD
18060 69 72 65 63 74 6f 72 79 5d 20 5c 22 5c 3b 5d 0d  irectory] \"\;].
18070 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
18080 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
18090 45 3a 20 50 65 72 66 6f 72 6d 20 61 6e 79 20 65  E: Perform any e
180a0 78 74 72 61 20 70 65 72 2d 63 6f 6e 6e 65 63 74  xtra per-connect
180b0 69 6f 6e 20 73 65 74 75 70 20 66 6f 72 20 74 68  ion setup for th
180c0 65 20 6e 65 77 6c 79 20 6f 70 65 6e 65 64 0d 0a  e newly opened..
180d0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64 61        #       da
180e0 74 61 62 61 73 65 20 6e 6f 77 20 75 6e 6c 65 73  tabase now unles
180f0 73 20 6f 75 72 20 63 61 6c 6c 65 72 20 66 6f 72  s our caller for
18100 62 69 64 73 20 69 74 2e 0d 0a 20 20 20 20 20 20  bids it...      
18110 23 0d 0a 20 20 20 20 20 20 73 65 74 20 65 78 65  #..      set exe
18120 63 75 74 65 4f 6e 53 65 74 75 70 20 5b 67 65 74  cuteOnSetup [get
18130 45 78 65 63 75 74 65 4f 6e 53 65 74 75 70 5d 0d  ExecuteOnSetup].
18140 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74  ...      if {[st
18150 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 65 78 65  ring length $exe
18160 63 75 74 65 4f 6e 53 65 74 75 70 5d 20 3e 20 30  cuteOnSetup] > 0
18170 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
18180 20 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   ![info exists :
18190 3a 6e 6f 28 65 78 65 63 75 74 65 4f 6e 53 65 74  :no(executeOnSet
181a0 75 70 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  up)]} then {..  
181b0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
181c0 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 63 6f   # NOTE: This co
181d0 6d 6d 61 6e 64 20 6d 61 79 20 72 61 69 73 65 20  mmand may raise 
181e0 61 6e 20 65 72 72 6f 72 3b 20 69 66 20 73 6f 2c  an error; if so,
181f0 20 74 68 61 74 20 69 73 20 66 69 6e 65 2c 20 61   that is fine, a
18200 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  s..        #    
18210 20 20 20 74 68 65 20 65 6e 63 6c 6f 73 69 6e 67     the enclosing
18220 20 74 65 73 74 20 77 69 6c 6c 20 74 68 65 6e 20   test will then 
18230 66 61 69 6c 2e 20 20 54 68 65 20 5b 73 75 62 73  fail.  The [subs
18240 74 5d 20 63 6f 6d 6d 61 6e 64 20 69 73 0d 0a 20  t] command is.. 
18250 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 75         #       u
18260 73 65 64 20 6f 6e 20 74 68 65 20 53 51 4c 20 69  sed on the SQL i
18270 6e 20 63 61 73 65 20 69 74 20 6e 65 65 64 73 20  n case it needs 
18280 74 6f 20 72 65 66 65 72 20 74 6f 20 73 74 61 74  to refer to stat
18290 65 20 69 6e 20 6f 75 72 0d 0a 20 20 20 20 20 20  e in our..      
182a0 20 20 23 20 20 20 20 20 20 20 63 6f 6e 74 65 78    #       contex
182b0 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  t...        #.. 
182c0 20 20 20 20 20 20 20 73 71 6c 20 65 78 65 63 75         sql execu
182d0 74 65 20 24 64 62 20 5b 73 75 62 73 74 20 24 65  te $db [subst $e
182e0 78 65 63 75 74 65 4f 6e 53 65 74 75 70 5d 0d 0a  xecuteOnSetup]..
182f0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
18300 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
18310 3a 20 41 6c 77 61 79 73 20 72 65 74 75 72 6e 20  : Always return 
18320 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68  the connection h
18330 61 6e 64 6c 65 20 75 70 6f 6e 20 73 75 63 63 65  andle upon succe
18340 73 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ss...      #..  
18350 20 20 20 20 72 65 74 75 72 6e 20 24 64 62 0d 0a      return $db..
18360 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
18370 6f 63 20 67 65 74 44 62 43 6f 6e 6e 65 63 74 69  oc getDbConnecti
18380 6f 6e 20 7b 20 7b 76 61 72 4e 61 6d 65 20 64 62  on { {varName db
18390 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a  } } {..      #..
183a0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65        # NOTE: Re
183b0 66 65 72 20 74 6f 20 74 68 65 20 73 70 65 63 69  fer to the speci
183c0 66 69 65 64 20 76 61 72 69 61 62 6c 65 20 28 65  fied variable (e
183d0 2e 67 2e 20 22 64 62 22 29 20 69 6e 20 74 68 65  .g. "db") in the
183e0 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72 0d   context of our.
183f0 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63  .      #       c
18400 61 6c 6c 65 72 2e 20 20 54 68 65 20 68 61 6e 64  aller.  The hand
18410 6c 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  le to the databa
18420 73 65 20 70 72 65 76 69 6f 75 73 6c 79 20 6f 70  se previously op
18430 65 6e 65 64 20 76 69 61 20 74 68 65 0d 0a 20 20  ened via the..  
18440 20 20 20 20 23 20 20 20 20 20 20 20 5b 73 65 74      #       [set
18450 75 70 44 62 5d 20 70 72 6f 63 65 64 75 72 65 20  upDb] procedure 
18460 73 68 6f 75 6c 64 20 62 65 20 73 74 6f 72 65 64  should be stored
18470 20 74 68 65 72 65 2e 0d 0a 20 20 20 20 20 20 23   there...      #
18480 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20 31 20  ..      upvar 1 
18490 24 76 61 72 4e 61 6d 65 20 64 62 0d 0a 0d 0a 20  $varName db.... 
184a0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
184b0 4e 4f 54 45 3a 20 54 68 69 73 20 72 65 74 75 72  NOTE: This retur
184c0 6e 73 20 74 68 65 20 41 44 4f 2e 4e 45 54 20 49  ns the ADO.NET I
184d0 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 20 6f 62 6a  DbConnection obj
184e0 65 63 74 20 69 6e 73 74 61 6e 63 65 20 66 6f 72  ect instance for
184f0 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20   the..      #   
18500 20 20 20 20 73 70 65 63 69 66 69 65 64 20 64 61      specified da
18510 74 61 62 73 65 20 68 61 6e 64 6c 65 2e 20 20 53  tabse handle.  S
18520 69 6e 63 65 20 67 65 74 74 69 6e 67 20 74 68 69  ince getting thi
18530 73 20 6f 62 6a 65 63 74 20 72 65 6c 69 65 73 20  s object relies 
18540 75 70 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20 20  upon..      #   
18550 20 20 20 20 45 61 67 6c 65 20 69 6e 74 65 72 6e      Eagle intern
18560 61 6c 73 2c 20 67 72 65 61 74 20 63 61 72 65 20  als, great care 
18570 73 68 6f 75 6c 64 20 62 65 20 74 61 6b 65 6e 20  should be taken 
18580 74 6f 20 61 76 6f 69 64 20 64 69 73 70 6f 73 69  to avoid disposi
18590 6e 67 20 6f 66 0d 0a 20 20 20 20 20 20 23 20 20  ng of..      #  
185a0 20 20 20 20 20 74 68 69 73 20 6f 62 6a 65 63 74       this object
185b0 20 6f 72 20 6f 74 68 65 72 77 69 73 65 20 70 75   or otherwise pu
185c0 74 74 69 6e 67 20 69 74 20 69 6e 74 6f 20 61 6e  tting it into an
185d0 20 69 6e 76 61 6c 69 64 20 73 74 61 74 65 2e 0d   invalid state..
185e0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
185f0 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
18600 20 64 62 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   db]} then {..  
18610 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
18620 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62   {..          ob
18630 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61  ject invoke -fla
18640 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 2d 6f  gs +NonPublic -o
18650 62 6a 65 63 74 66 6c 61 67 73 20 2b 4e 6f 44 69  bjectflags +NoDi
18660 73 70 6f 73 65 20 2d 61 6c 69 61 73 20 5c 0d 0a  spose -alias \..
18670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 49 6e                In
18680 74 65 72 70 72 65 74 65 72 2e 47 65 74 41 63 74  terpreter.GetAct
18690 69 76 65 2e 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ive.connections 
186a0 49 74 65 6d 20 24 64 62 0d 0a 20 20 20 20 20 20  Item $db..      
186b0 20 20 7d 20 72 65 73 75 6c 74 5d 20 3d 3d 20 30    } result] == 0
186c0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
186d0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
186e0 20 23 20 4e 4f 54 45 3a 20 53 75 63 63 65 73 73   # NOTE: Success
186f0 2c 20 72 65 74 75 72 6e 20 74 68 65 20 6f 70 61  , return the opa
18700 71 75 65 20 6f 62 6a 65 63 74 20 68 61 6e 64 6c  que object handl
18710 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  e...          #.
18720 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
18730 6e 20 24 72 65 73 75 6c 74 0d 0a 20 20 20 20 20  n $result..     
18740 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
18750 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
18760 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 61 69 6c      # NOTE: Fail
18770 75 72 65 2c 20 72 65 70 6f 72 74 20 77 68 79 2e  ure, report why.
18780 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
18790 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
187a0 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
187b0 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
187c0 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d              "===
187d0 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65  = WARNING: faile
187e0 64 20 74 6f 20 67 65 74 20 63 6f 6e 6e 65 63 74  d to get connect
187f0 69 6f 6e 20 68 61 6e 64 6c 65 20 66 6f 72 20 64  ion handle for d
18800 61 74 61 62 61 73 65 20 5c 22 22 20 5c 0d 0a 20  atabase \"" \.. 
18810 20 20 20 20 20 20 20 20 20 20 20 20 20 24 64 62               $db
18820 20 22 5c 22 2c 20 65 72 72 6f 72 3a 20 22 20 5c   "\", error: " \
18830 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d  n\t $result \n].
18840 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
18850 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
18860 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 61        # NOTE: Fa
18870 69 6c 75 72 65 2c 20 72 65 74 75 72 6e 20 61 6e  ilure, return an
18880 20 6f 62 76 69 6f 75 73 6c 79 20 69 6e 76 61 6c   obviously inval
18890 69 64 20 6f 70 61 71 75 65 20 6f 62 6a 65 63 74  id opaque object
188a0 20 68 61 6e 64 6c 65 2e 0d 0a 20 20 20 20 20 20   handle...      
188b0 23 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  #..      return 
188c0 22 22 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  ""..    }.....  
188d0 20 20 70 72 6f 63 20 66 72 65 65 44 62 43 6f 6e    proc freeDbCon
188e0 6e 65 63 74 69 6f 6e 20 7b 20 7b 76 61 72 4e 61  nection { {varNa
188f0 6d 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 7d 20 7d  me connection} }
18900 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
18910 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 66 65 72     # NOTE: Refer
18920 20 74 6f 20 74 68 65 20 73 70 65 63 69 66 69 65   to the specifie
18930 64 20 76 61 72 69 61 62 6c 65 20 28 65 2e 67 2e  d variable (e.g.
18940 20 22 63 6f 6e 6e 65 63 74 69 6f 6e 22 29 20 69   "connection") i
18950 6e 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20  n the..      #  
18960 20 20 20 20 20 63 6f 6e 74 65 78 74 20 6f 66 20       context of 
18970 6f 75 72 20 63 61 6c 6c 65 72 2e 20 20 54 68 65  our caller.  The
18980 20 6f 70 61 71 75 65 20 6f 62 6a 65 63 74 20 68   opaque object h
18990 61 6e 64 6c 65 20 66 6f 72 20 61 6e 20 41 44 4f  andle for an ADO
189a0 2e 4e 45 54 0d 0a 20 20 20 20 20 20 23 20 20 20  .NET..      #   
189b0 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70      connection p
189c0 72 65 76 69 6f 75 73 6c 79 20 72 65 74 75 72 6e  reviously return
189d0 65 64 20 62 79 20 5b 67 65 74 44 62 43 6f 6e 6e  ed by [getDbConn
189e0 65 63 74 69 6f 6e 5d 20 73 68 6f 75 6c 64 20 62  ection] should b
189f0 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
18a00 20 73 74 6f 72 65 64 20 74 68 65 72 65 2e 0d 0a   stored there...
18a10 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 75        #..      u
18a20 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65 20  pvar 1 $varName 
18a30 63 6f 6e 6e 65 63 74 69 6f 6e 0d 0a 0d 0a 20 20  connection....  
18a40 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
18a50 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20  OTE: Attempt to 
18a60 72 65 6d 6f 76 65 20 74 68 65 20 6f 70 61 71 75  remove the opaqu
18a70 65 20 6f 62 6a 65 63 74 20 68 61 6e 64 6c 65 20  e object handle 
18a80 66 72 6f 6d 20 74 68 65 20 69 6e 74 65 72 70 72  from the interpr
18a90 65 74 65 72 0d 0a 20 20 20 20 20 20 23 20 20 20  eter..      #   
18aa0 20 20 20 20 6e 6f 77 2e 20 20 54 68 69 73 20 5b      now.  This [
18ab0 6f 62 6a 65 63 74 20 64 69 73 70 6f 73 65 5d 20  object dispose] 
18ac0 63 61 6c 6c 20 77 69 6c 6c 20 6e 6f 74 20 61 63  call will not ac
18ad0 74 75 61 6c 6c 79 20 64 69 73 70 6f 73 65 20 6f  tually dispose o
18ae0 66 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20  f the..      #  
18af0 20 20 20 20 20 75 6e 64 65 72 6c 79 69 6e 67 20       underlying 
18b00 6f 62 6a 65 63 74 20 62 65 63 61 75 73 65 20 74  object because t
18b10 68 65 20 2b 4e 6f 44 69 73 70 6f 73 65 20 66 6c  he +NoDispose fl
18b20 61 67 20 77 61 73 20 73 65 74 20 6f 6e 20 69 74  ag was set on it
18b30 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
18b40 64 75 72 69 6e 67 20 63 72 65 61 74 69 6f 6e 20  during creation 
18b50 6f 66 20 74 68 65 20 6f 70 61 71 75 65 20 6f 62  of the opaque ob
18b60 6a 65 63 74 20 68 61 6e 64 6c 65 2e 0d 0a 20 20  ject handle...  
18b70 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
18b80 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 63 6f  {[info exists co
18b90 6e 6e 65 63 74 69 6f 6e 5d 20 26 26 20 5c 0d 0a  nnection] && \..
18ba0 20 20 20 20 20 20 20 20 20 20 5b 63 61 74 63 68            [catch
18bb0 20 7b 6f 62 6a 65 63 74 20 64 69 73 70 6f 73 65   {object dispose
18bc0 20 24 63 6f 6e 6e 65 63 74 69 6f 6e 7d 20 65 72   $connection} er
18bd0 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ror]} then {..  
18be0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
18bf0 20 23 20 4e 4f 54 45 3a 20 57 65 20 73 6f 6d 65   # NOTE: We some
18c00 68 6f 77 20 66 61 69 6c 65 64 20 74 6f 20 72 65  how failed to re
18c10 6d 6f 76 65 20 74 68 65 20 68 61 6e 64 6c 65 2c  move the handle,
18c20 20 72 65 70 6f 72 74 20 77 68 79 2e 0d 0a 20 20   report why...  
18c30 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
18c40 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
18c50 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
18c60 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
18c70 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a    "==== WARNING:
18c80 20 66 61 69 6c 65 64 20 74 6f 20 72 65 6d 6f 76   failed to remov
18c90 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e  e connection han
18ca0 64 6c 65 20 5c 22 22 20 24 63 6f 6e 6e 65 63 74  dle \"" $connect
18cb0 69 6f 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ion \..         
18cc0 20 20 20 22 5c 22 2c 20 65 72 72 6f 72 3a 20 22     "\", error: "
18cd0 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d   \n\t $error \n]
18ce0 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
18cf0 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 61 64  .....    proc ad
18d00 64 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 20 7b 20  dDbConnection { 
18d10 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 76 61 72 4e  connection {varN
18d20 61 6d 65 20 64 62 7d 20 7d 20 7b 0d 0a 20 20 20  ame db} } {..   
18d30 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
18d40 54 45 3a 20 52 65 66 65 72 20 74 6f 20 74 68 65  TE: Refer to the
18d50 20 73 70 65 63 69 66 69 65 64 20 76 61 72 69 61   specified varia
18d60 62 6c 65 20 28 65 2e 67 2e 20 22 64 62 22 29 20  ble (e.g. "db") 
18d70 69 6e 20 74 68 65 20 63 6f 6e 74 65 78 74 20 6f  in the context o
18d80 66 20 6f 75 72 0d 0a 20 20 20 20 20 20 23 20 20  f our..      #  
18d90 20 20 20 20 20 63 61 6c 6c 65 72 2e 0d 0a 20 20       caller...  
18da0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 75 70 76      #..      upv
18db0 61 72 20 31 20 24 76 61 72 4e 61 6d 65 20 64 62  ar 1 $varName db
18dc0 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
18dd0 20 20 20 23 20 4e 4f 54 45 3a 20 43 72 65 61 74     # NOTE: Creat
18de0 65 20 61 20 63 6f 72 72 65 63 74 6c 79 20 66 6f  e a correctly fo
18df0 72 6d 61 74 74 65 64 20 6e 61 6d 65 20 66 6f 72  rmatted name for
18e00 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
18e10 6e 6e 65 63 74 69 6f 6e 20 74 6f 0d 0a 20 20 20  nnection to..   
18e20 20 20 20 23 20 20 20 20 20 20 20 62 65 20 61 64     #       be ad
18e30 64 65 64 20 74 6f 20 74 68 65 20 6c 69 73 74 20  ded to the list 
18e40 6d 61 6e 61 67 65 64 20 62 79 20 74 68 65 20 45  managed by the E
18e50 61 67 6c 65 20 69 6e 74 65 72 70 72 65 74 65 72  agle interpreter
18e60 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
18e70 20 20 73 65 74 20 64 62 20 5b 6f 62 6a 65 63 74    set db [object
18e80 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b   invoke -flags +
18e90 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20  NonPublic \..   
18ea0 20 20 20 20 20 20 20 45 61 67 6c 65 2e 5f 43 6f         Eagle._Co
18eb0 6d 70 6f 6e 65 6e 74 73 2e 50 72 69 76 61 74 65  mponents.Private
18ec0 2e 46 6f 72 6d 61 74 4f 70 73 20 44 61 74 61 62  .FormatOps Datab
18ed0 61 73 65 4f 62 6a 65 63 74 4e 61 6d 65 20 24 63  aseObjectName $c
18ee0 6f 6e 6e 65 63 74 69 6f 6e 20 5c 0d 0a 20 20 20  onnection \..   
18ef0 20 20 20 20 20 20 20 53 51 4c 69 74 65 43 6f 6e         SQLiteCon
18f00 6e 65 63 74 69 6f 6e 20 5b 6f 62 6a 65 63 74 20  nection [object 
18f10 69 6e 76 6f 6b 65 20 49 6e 74 65 72 70 72 65 74  invoke Interpret
18f20 65 72 2e 47 65 74 41 63 74 69 76 65 20 4e 65 78  er.GetActive Nex
18f30 74 49 64 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 23  tId]]....      #
18f40 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
18f50 41 64 64 20 74 68 65 20 64 61 74 61 62 61 73 65  Add the database
18f60 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 72 6f 76   connection prov
18f70 69 64 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c  ided by our call
18f80 65 72 20 74 6f 20 74 68 65 20 6c 69 73 74 0d 0a  er to the list..
18f90 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6f 66        #       of
18fa0 20 74 68 6f 73 65 20 6b 6e 6f 77 6e 20 74 6f 20   those known to 
18fb0 74 68 65 20 45 61 67 6c 65 20 69 6e 74 65 72 70  the Eagle interp
18fc0 72 65 74 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d  reter...      #.
18fd0 0a 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e  .      object in
18fe0 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e  voke -flags +Non
18ff0 50 75 62 6c 69 63 20 49 6e 74 65 72 70 72 65 74  Public Interpret
19000 65 72 2e 47 65 74 41 63 74 69 76 65 2e 63 6f 6e  er.GetActive.con
19010 6e 65 63 74 69 6f 6e 73 20 41 64 64 20 5c 0d 0a  nections Add \..
19020 20 20 20 20 20 20 20 20 20 20 24 64 62 20 24 63            $db $c
19030 6f 6e 6e 65 63 74 69 6f 6e 0d 0a 20 20 20 20 7d  onnection..    }
19040 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 72 65  .....    proc re
19050 6d 6f 76 65 44 62 54 72 61 6e 73 61 63 74 69 6f  moveDbTransactio
19060 6e 20 7b 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  n { transaction 
19070 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
19080 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 6d 6f      # NOTE: Remo
19090 76 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ve the database 
190a0 74 72 61 6e 73 61 63 74 69 6f 6e 20 70 72 6f 76  transaction prov
190b0 69 64 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c  ided by our call
190c0 65 72 20 66 72 6f 6d 20 74 68 65 0d 0a 20 20 20  er from the..   
190d0 20 20 20 23 20 20 20 20 20 20 20 6c 69 73 74 20     #       list 
190e0 6f 66 20 74 68 6f 73 65 20 6b 6e 6f 77 6e 20 74  of those known t
190f0 6f 20 74 68 65 20 45 61 67 6c 65 20 69 6e 74 65  o the Eagle inte
19100 72 70 72 65 74 65 72 2e 0d 0a 20 20 20 20 20 20  rpreter...      
19110 23 0d 0a 20 20 20 20 20 20 6f 62 6a 65 63 74 20  #..      object 
19120 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e  invoke -flags +N
19130 6f 6e 50 75 62 6c 69 63 20 49 6e 74 65 72 70 72  onPublic Interpr
19140 65 74 65 72 2e 47 65 74 41 63 74 69 76 65 2e 74  eter.GetActive.t
19150 72 61 6e 73 61 63 74 69 6f 6e 73 20 5c 0d 0a 20  ransactions \.. 
19160 20 20 20 20 20 20 20 20 20 52 65 6d 6f 76 65 20           Remove 
19170 24 74 72 61 6e 73 61 63 74 69 6f 6e 0d 0a 20 20  $transaction..  
19180 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
19190 20 67 65 74 52 6f 77 73 46 72 6f 6d 44 61 74 61   getRowsFromData
191a0 54 61 62 6c 65 20 7b 20 64 61 74 61 54 61 62 6c  Table { dataTabl
191b0 65 20 7b 76 61 6c 75 65 43 61 6c 6c 62 61 63 6b  e {valueCallback
191c0 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20   ""} } {..      
191d0 73 65 74 20 72 6f 77 73 20 5b 6c 69 73 74 5d 0d  set rows [list].
191e0 0a 20 20 20 20 20 20 73 65 74 20 63 6f 75 6e 74  .      set count
191f0 20 5b 24 64 61 74 61 54 61 62 6c 65 20 43 6f 6c   [$dataTable Col
19200 75 6d 6e 73 2e 43 6f 75 6e 74 5d 0d 0a 0d 0a 20  umns.Count].... 
19210 20 20 20 20 20 66 6f 72 20 7b 73 65 74 20 69 6e       for {set in
19220 64 65 78 20 30 7d 20 7b 24 69 6e 64 65 78 20 3c  dex 0} {$index <
19230 20 24 63 6f 75 6e 74 7d 20 7b 69 6e 63 72 20 69   $count} {incr i
19240 6e 64 65 78 7d 20 7b 0d 0a 20 20 20 20 20 20 20  ndex} {..       
19250 20 73 65 74 20 64 61 74 61 43 6f 6c 75 6d 6e 20   set dataColumn 
19260 5b 24 64 61 74 61 54 61 62 6c 65 20 2d 61 6c 69  [$dataTable -ali
19270 61 73 20 43 6f 6c 75 6d 6e 73 2e 67 65 74 5f 49  as Columns.get_I
19280 74 65 6d 20 24 69 6e 64 65 78 5d 0d 0a 20 20 20  tem $index]..   
19290 20 20 20 20 20 73 65 74 20 6e 61 6d 65 73 28 24       set names($
192a0 69 6e 64 65 78 29 20 5b 24 64 61 74 61 43 6f 6c  index) [$dataCol
192b0 75 6d 6e 20 43 6f 6c 75 6d 6e 4e 61 6d 65 5d 0d  umn ColumnName].
192c0 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
192d0 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
192e0 45 3a 20 53 65 74 75 70 20 73 6f 6d 65 20 54 63  E: Setup some Tc
192f0 6c 20 72 65 74 75 72 6e 20 63 6f 64 65 20 63 6f  l return code co
19300 6e 73 74 61 6e 74 73 2e 0d 0a 20 20 20 20 20 20  nstants...      
19310 23 0d 0a 20 20 20 20 20 20 73 65 74 20 4f 6b 20  #..      set Ok 
19320 30 3b 20 73 65 74 20 45 72 72 6f 72 20 31 3b 20  0; set Error 1; 
19330 73 65 74 20 52 65 74 75 72 6e 20 32 3b 20 73 65  set Return 2; se
19340 74 20 42 72 65 61 6b 20 33 3b 20 73 65 74 20 43  t Break 3; set C
19350 6f 6e 74 69 6e 75 65 20 34 0d 0a 0d 0a 20 20 20  ontinue 4....   
19360 20 20 20 6f 62 6a 65 63 74 20 66 6f 72 65 61 63     object foreac
19370 68 20 2d 61 6c 69 61 73 20 64 61 74 61 52 6f 77  h -alias dataRow
19380 20 5b 73 65 74 20 64 61 74 61 52 6f 77 73 20 5b   [set dataRows [
19390 24 64 61 74 61 54 61 62 6c 65 20 52 6f 77 73 5d  $dataTable Rows]
193a0 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74  ] {..        set
193b0 20 72 6f 77 20 5b 6c 69 73 74 5d 0d 0a 0d 0a 20   row [list].... 
193c0 20 20 20 20 20 20 20 66 6f 72 20 7b 73 65 74 20         for {set 
193d0 69 6e 64 65 78 20 30 7d 20 7b 24 69 6e 64 65 78  index 0} {$index
193e0 20 3c 20 24 63 6f 75 6e 74 7d 20 7b 69 6e 63 72   < $count} {incr
193f0 20 69 6e 64 65 78 7d 20 7b 0d 0a 20 20 20 20 20   index} {..     
19400 20 20 20 20 20 73 65 74 20 76 61 6c 75 65 20 5b       set value [
19410 24 64 61 74 61 52 6f 77 20 2d 63 72 65 61 74 65  $dataRow -create
19420 20 2d 61 6c 69 61 73 20 67 65 74 5f 49 74 65 6d   -alias get_Item
19430 20 24 69 6e 64 65 78 5d 0d 0a 0d 0a 20 20 20 20   $index]....    
19440 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
19450 67 20 6c 65 6e 67 74 68 20 24 76 61 6c 75 65 43  g length $valueC
19460 61 6c 6c 62 61 63 6b 5d 20 3e 20 30 7d 20 74 68  allback] > 0} th
19470 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
19480 20 20 73 65 74 20 63 6f 64 65 20 5b 63 61 74 63    set code [catc
19490 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  h {..           
194a0 20 20 20 24 76 61 6c 75 65 43 61 6c 6c 62 61 63     $valueCallbac
194b0 6b 20 24 64 61 74 61 54 61 62 6c 65 20 24 64 61  k $dataTable $da
194c0 74 61 52 6f 77 20 24 69 6e 64 65 78 20 24 76 61  taRow $index $va
194d0 6c 75 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  lue..           
194e0 20 7d 20 6e 65 77 56 61 6c 75 65 5d 0d 0a 0d 0a   } newValue]....
194f0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
19500 24 63 6f 64 65 20 3d 3d 20 24 4f 6b 7d 20 74 68  $code == $Ok} th
19510 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
19520 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
19530 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65       # NOTE: Use
19540 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 28   the specified (
19550 6e 65 77 3f 29 20 72 6f 77 20 76 61 6c 75 65 2e  new?) row value.
19560 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
19570 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  #..             
19580 20 6c 61 70 70 65 6e 64 20 72 6f 77 20 5b 6c 69   lappend row [li
19590 73 74 20 24 6e 61 6d 65 73 28 24 69 6e 64 65 78  st $names($index
195a0 29 20 24 6e 65 77 56 61 6c 75 65 5d 0d 0a 20 20  ) $newValue]..  
195b0 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
195c0 69 66 20 7b 24 63 6f 64 65 20 3d 3d 20 24 45 72  if {$code == $Er
195d0 72 6f 72 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ror} then {..   
195e0 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
195f0 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f              # NO
19600 54 45 3a 20 55 73 65 20 74 68 65 20 28 6e 65 77  TE: Use the (new
19610 3f 29 20 4e 55 4c 4c 20 72 6f 77 20 76 61 6c 75  ?) NULL row valu
19620 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e...            
19630 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
19640 20 20 20 6c 61 70 70 65 6e 64 20 72 6f 77 20 5b     lappend row [
19650 6c 69 73 74 20 24 6e 61 6d 65 73 28 24 69 6e 64  list $names($ind
19660 65 78 29 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  ex)]..          
19670 20 20 7d 20 65 6c 73 65 69 66 20 7b 24 63 6f 64    } elseif {$cod
19680 65 20 3d 3d 20 24 52 65 74 75 72 6e 7d 20 74 68  e == $Return} th
19690 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
196a0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
196b0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69       # NOTE: Ski
196c0 70 20 72 65 6d 61 69 6e 69 6e 67 20 76 61 6c 75  p remaining valu
196d0 65 73 20 66 6f 72 20 74 68 69 73 20 72 6f 77 2e  es for this row.
196e0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
196f0 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  #..             
19700 20 62 72 65 61 6b 0d 0a 20 20 20 20 20 20 20 20   break..        
19710 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 24 63      } elseif {$c
19720 6f 64 65 20 3d 3d 20 24 42 72 65 61 6b 7d 20 74  ode == $Break} t
19730 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
19740 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
19750 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b        # NOTE: Sk
19760 69 70 20 70 72 6f 63 65 73 73 69 6e 67 20 74 68  ip processing th
19770 69 73 20 72 6f 77 20 76 61 6c 75 65 2e 0d 0a 20  is row value... 
19780 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a               #..
19790 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c              } el
197a0 73 65 69 66 20 7b 24 63 6f 64 65 20 3d 3d 20 24  seif {$code == $
197b0 43 6f 6e 74 69 6e 75 65 7d 20 74 68 65 6e 20 7b  Continue} then {
197c0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
197d0 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  #..             
197e0 20 23 20 4e 4f 54 45 3a 20 55 73 65 20 64 65 66   # NOTE: Use def
197f0 61 75 6c 74 20 72 6f 77 20 76 61 6c 75 65 20 68  ault row value h
19800 61 6e 64 6c 69 6e 67 2e 0d 0a 20 20 20 20 20 20  andling...      
19810 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
19820 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
19830 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
19840 20 20 20 20 20 20 20 20 20 20 73 65 74 20 63 6f            set co
19850 64 65 20 24 43 6f 6e 74 69 6e 75 65 0d 0a 20 20  de $Continue..  
19860 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
19870 20 20 20 20 20 20 20 69 66 20 7b 24 63 6f 64 65         if {$code
19880 20 3d 3d 20 24 43 6f 6e 74 69 6e 75 65 7d 20 74   == $Continue} t
19890 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
198a0 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
198b0 65 6e 67 74 68 20 24 76 61 6c 75 65 5d 20 3e 20  ength $value] > 
198c0 30 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  0 && \..        
198d0 20 20 20 20 20 20 20 20 21 5b 6f 62 6a 65 63 74          ![object
198e0 20 69 6e 76 6f 6b 65 20 43 6f 6e 76 65 72 74 20   invoke Convert 
198f0 49 73 44 42 4e 75 6c 6c 20 24 76 61 6c 75 65 5d  IsDBNull $value]
19900 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
19910 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20          lappend 
19920 72 6f 77 20 5b 6c 69 73 74 20 24 6e 61 6d 65 73  row [list $names
19930 28 24 69 6e 64 65 78 29 20 5b 24 76 61 6c 75 65  ($index) [$value
19940 20 54 6f 53 74 72 69 6e 67 5d 5d 0d 0a 20 20 20   ToString]]..   
19950 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20           } else 
19960 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
19970 20 6c 61 70 70 65 6e 64 20 72 6f 77 20 5b 6c 69   lappend row [li
19980 73 74 20 24 6e 61 6d 65 73 28 24 69 6e 64 65 78  st $names($index
19990 29 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  )]..            
199a0 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  }..          }..
199b0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
199c0 20 20 20 20 20 6c 61 70 70 65 6e 64 20 72 6f 77       lappend row
199d0 73 20 24 72 6f 77 0d 0a 20 20 20 20 20 20 7d 0d  s $row..      }.
199e0 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ...      return 
199f0 24 72 6f 77 73 0d 0a 20 20 20 20 7d 0d 0a 0c 0d  $rows..    }....
19a00 0a 20 20 20 20 70 72 6f 63 20 64 75 6d 70 52 6f  .    proc dumpRo
19a10 77 73 46 72 6f 6d 44 61 74 61 54 61 62 6c 65 20  wsFromDataTable 
19a20 7b 20 63 68 61 6e 6e 65 6c 20 72 6f 77 73 20 7d  { channel rows }
19a30 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 73 65   {..      set se
19a40 71 75 65 6e 63 65 20 31 0d 0a 0d 0a 20 20 20 20  quence 1....    
19a50 20 20 66 6f 72 65 61 63 68 20 72 6f 77 20 24 72    foreach row $r
19a60 6f 77 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 74  ows {..        t
19a70 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
19a80 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
19a90 20 20 20 20 20 20 20 20 20 5b 65 78 70 72 20 7b           [expr {
19aa0 24 73 65 71 75 65 6e 63 65 20 3e 20 31 20 3f 20  $sequence > 1 ? 
19ab0 22 5c 6e 22 20 3a 20 22 22 7d 5d 20 22 2d 2d 2d  "\n" : ""}] "---
19ac0 2d 20 52 4f 57 20 23 22 20 24 73 65 71 75 65 6e  - ROW #" $sequen
19ad0 63 65 20 3a 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20  ce :\n]....     
19ae0 20 20 20 66 6f 72 65 61 63 68 20 70 61 69 72 20     foreach pair 
19af0 24 72 6f 77 20 7b 0d 0a 20 20 20 20 20 20 20 20  $row {..        
19b00 20 20 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24    if {[llength $
19b10 70 61 69 72 5d 20 3e 3d 20 32 7d 20 74 68 65 6e  pair] >= 2} then
19b20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
19b30 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
19b40 61 70 70 65 6e 64 41 72 67 73 20 5c 74 20 5c 0d  appendArgs \t \.
19b50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19b60 20 5b 6c 69 73 74 20 5b 6c 69 6e 64 65 78 20 24   [list [lindex $
19b70 70 61 69 72 20 30 5d 5d 20 22 3a 20 22 20 5b 6c  pair 0]] ": " [l
19b80 69 73 74 20 5b 6c 69 6e 64 65 78 20 24 70 61 69  ist [lindex $pai
19b90 72 20 31 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20  r 1]] \n]..     
19ba0 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b       } elseif {[
19bb0 6c 6c 65 6e 67 74 68 20 24 70 61 69 72 5d 20 3d  llength $pair] =
19bc0 3d 20 31 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 1} then {..   
19bd0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
19be0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
19bf0 72 67 73 20 5c 74 20 5c 0d 0a 20 20 20 20 20 20  rgs \t \..      
19c00 20 20 20 20 20 20 20 20 20 20 5b 6c 69 73 74 20            [list 
19c10 5b 6c 69 6e 64 65 78 20 24 70 61 69 72 20 30 5d  [lindex $pair 0]
19c20 5d 20 22 3a 20 3c 6e 75 6c 6c 3e 5c 6e 22 5d 0d  ] ": <null>\n"].
19c30 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73  .          } els
19c40 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e {..           
19c50 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
19c60 5c 74 3c 65 6d 70 74 79 3e 5c 6e 3b 20 23 20 4e  \t<empty>\n; # N
19c70 4f 54 45 3a 20 4e 6f 20 64 61 74 61 3f 0d 0a 20  OTE: No data?.. 
19c80 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
19c90 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
19ca0 20 69 6e 63 72 20 73 65 71 75 65 6e 63 65 0d 0a   incr sequence..
19cb0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
19cc0 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 6c 65 61  ...    proc clea
19cd0 6e 75 70 44 62 20 7b 20 66 69 6c 65 4e 61 6d 65  nupDb { fileName
19ce0 20 7b 76 61 72 4e 61 6d 65 20 64 62 7d 20 7b 63   {varName db} {c
19cf0 6f 6c 6c 65 63 74 20 74 72 75 65 7d 20 7b 71 75  ollect true} {qu
19d00 61 6c 69 66 79 20 74 72 75 65 7d 0d 0a 20 20 20  alify true}..   
19d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d20 20 20 7b 64 65 6c 65 74 65 20 74 72 75 65 7d 20    {delete true} 
19d30 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
19d40 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65      # NOTE: Atte
19d50 6d 70 74 20 74 6f 20 66 6f 72 63 65 20 61 6c 6c  mpt to force all
19d60 20 70 65 6e 64 69 6e 67 20 22 67 61 72 62 61 67   pending "garbag
19d70 65 22 20 6f 62 6a 65 63 74 73 20 74 6f 20 62 65  e" objects to be
19d80 20 63 6f 6c 6c 65 63 74 65 64 2c 0d 0a 20 20 20   collected,..   
19d90 20 20 20 23 20 20 20 20 20 20 20 69 6e 63 6c 75     #       inclu
19da0 64 69 6e 67 20 53 51 4c 69 74 65 20 73 74 61 74  ding SQLite stat
19db0 65 6d 65 6e 74 73 20 61 6e 64 20 62 61 63 6b 75  ements and backu
19dc0 70 20 6f 62 6a 65 63 74 73 3b 20 74 68 69 73 20  p objects; this 
19dd0 73 68 6f 75 6c 64 20 61 6c 6c 6f 77 0d 0a 20 20  should allow..  
19de0 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20      #       the 
19df0 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62  underlying datab
19e00 61 73 65 20 66 69 6c 65 20 74 6f 20 62 65 20 64  ase file to be d
19e10 65 6c 65 74 65 64 2e 0d 0a 20 20 20 20 20 20 23  eleted...      #
19e20 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 63 6f 6c  ..      if {$col
19e30 6c 65 63 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  lect} then {..  
19e40 20 20 20 20 20 20 63 6f 6c 6c 65 63 74 47 61 72        collectGar
19e50 62 61 67 65 20 24 3a 3a 74 65 73 74 5f 63 68 61  bage $::test_cha
19e60 6e 6e 65 6c 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  nnel..      }...
19e70 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
19e80 23 20 4e 4f 54 45 3a 20 52 65 66 65 72 20 74 6f  # NOTE: Refer to
19e90 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 76   the specified v
19ea0 61 72 69 61 62 6c 65 20 28 65 2e 67 2e 20 22 64  ariable (e.g. "d
19eb0 62 22 29 20 69 6e 20 74 68 65 20 63 6f 6e 74 65  b") in the conte
19ec0 78 74 20 6f 66 20 6f 75 72 0d 0a 20 20 20 20 20  xt of our..     
19ed0 20 23 20 20 20 20 20 20 20 63 61 6c 6c 65 72 2e   #       caller.
19ee0 20 20 54 68 65 20 68 61 6e 64 6c 65 20 74 6f 20    The handle to 
19ef0 74 68 65 20 64 61 74 61 62 61 73 65 20 70 72 65  the database pre
19f00 76 69 6f 75 73 6c 79 20 6f 70 65 6e 65 64 20 76  viously opened v
19f10 69 61 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20  ia the..      # 
19f20 20 20 20 20 20 20 5b 73 65 74 75 70 44 62 5d 20        [setupDb] 
19f30 70 72 6f 63 65 64 75 72 65 20 73 68 6f 75 6c 64  procedure should
19f40 20 62 65 20 73 74 6f 72 65 64 20 74 68 65 72 65   be stored there
19f50 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
19f60 20 20 75 70 76 61 72 20 31 20 24 76 61 72 4e 61    upvar 1 $varNa
19f70 6d 65 20 64 62 0d 0a 0d 0a 20 20 20 20 20 20 23  me db....      #
19f80 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
19f90 43 6c 6f 73 65 20 74 68 65 20 63 6f 6e 6e 65 63  Close the connec
19fa0 74 69 6f 6e 20 74 6f 20 74 68 65 20 64 61 74 61  tion to the data
19fb0 62 61 73 65 20 6e 6f 77 2e 20 20 54 68 69 73 20  base now.  This 
19fc0 73 68 6f 75 6c 64 20 61 6c 6c 6f 77 20 75 73 0d  should allow us.
19fd0 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74  .      #       t
19fe0 6f 20 64 65 6c 65 74 65 20 74 68 65 20 75 6e 64  o delete the und
19ff0 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65  erlying database
1a000 20 66 69 6c 65 2e 0d 0a 20 20 20 20 20 20 23 0d   file...      #.
1a010 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f  .      if {[info
1a020 20 65 78 69 73 74 73 20 64 62 5d 20 26 26 20 5b   exists db] && [
1a030 63 61 74 63 68 20 7b 73 71 6c 20 63 6c 6f 73 65  catch {sql close
1a040 20 24 64 62 7d 20 65 72 72 6f 72 5d 7d 20 74 68   $db} error]} th
1a050 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
1a060 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
1a070 20 57 65 20 73 6f 6d 65 68 6f 77 20 66 61 69 6c   We somehow fail
1a080 65 64 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 20  ed to close the 
1a090 64 61 74 61 62 61 73 65 2c 20 72 65 70 6f 72 74  database, report
1a0a0 20 77 68 79 2e 0d 0a 20 20 20 20 20 20 20 20 23   why...        #
1a0b0 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
1a0c0 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
1a0d0 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
1a0e0 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d             "====
1a0f0 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64   WARNING: failed
1a100 20 74 6f 20 63 6c 6f 73 65 20 64 61 74 61 62 61   to close databa
1a110 73 65 20 5c 22 22 20 24 64 62 20 22 5c 22 2c 20  se \"" $db "\", 
1a120 65 72 72 6f 72 3a 20 22 20 5c 0d 0a 20 20 20 20  error: " \..    
1a130 20 20 20 20 20 20 20 20 5c 6e 5c 74 20 24 65 72          \n\t $er
1a140 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d  ror \n]..      }
1a150 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
1a160 20 20 20 23 20 4e 4f 54 45 3a 20 46 69 72 73 74     # NOTE: First
1a170 2c 20 73 65 65 20 69 66 20 6f 75 72 20 63 61 6c  , see if our cal
1a180 6c 65 72 20 68 61 73 20 72 65 71 75 65 73 74 65  ler has requeste
1a190 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  d an in-memory d
1a1a0 61 74 61 62 61 73 65 2e 0d 0a 20 20 20 20 20 20  atabase...      
1a1b0 23 0d 0a 20 20 20 20 20 20 73 65 74 20 69 73 4d  #..      set isM
1a1c0 65 6d 6f 72 79 20 5b 69 73 4d 65 6d 6f 72 79 44  emory [isMemoryD
1a1d0 62 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a  b $fileName]....
1a1e0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
1a1f0 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74 68 65   NOTE: Build the
1a200 20 66 75 6c 6c 20 70 61 74 68 20 74 6f 20 74 68   full path to th
1a210 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1a220 6e 61 6d 65 2e 20 20 46 6f 72 20 6e 6f 77 2c 20  name.  For now, 
1a230 61 6c 6c 20 74 65 73 74 0d 0a 20 20 20 20 20 20  all test..      
1a240 23 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65  #       database
1a250 20 66 69 6c 65 73 20 61 72 65 20 73 74 6f 72 65   files are store
1a260 64 20 69 6e 20 74 68 65 20 74 65 6d 70 6f 72 61  d in the tempora
1a270 72 79 20 64 69 72 65 63 74 6f 72 79 2e 0d 0a 20  ry directory... 
1a280 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
1a290 20 7b 21 24 69 73 4d 65 6d 6f 72 79 20 26 26 20   {!$isMemory && 
1a2a0 24 71 75 61 6c 69 66 79 7d 20 74 68 65 6e 20 7b  $qualify} then {
1a2b0 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 66 69  ..        set fi
1a2c0 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69  leName [file joi
1a2d0 6e 20 5b 67 65 74 44 61 74 61 62 61 73 65 44 69  n [getDatabaseDi
1a2e0 72 65 63 74 6f 72 79 5d 20 5b 66 69 6c 65 20 74  rectory] [file t
1a2f0 61 69 6c 20 24 66 69 6c 65 4e 61 6d 65 5d 5d 0d  ail $fileName]].
1a300 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
1a310 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
1a320 45 3a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20  E: Check if the 
1a330 66 69 6c 65 20 73 74 69 6c 6c 20 65 78 69 73 74  file still exist
1a340 73 3b 20 69 6e 69 74 69 61 6c 6c 79 2c 20 61 73  s; initially, as
1a350 73 75 6d 65 20 61 6c 6c 20 66 69 6c 65 73 20 77  sume all files w
1a360 69 6c 6c 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ill..      #    
1a370 20 20 20 62 65 20 64 65 6c 65 74 65 64 20 73 75     be deleted su
1a380 63 63 65 73 73 66 75 6c 6c 79 2c 20 69 66 20 6e  ccessfully, if n
1a390 65 63 65 73 73 61 72 79 2e 0d 0a 20 20 20 20 20  ecessary...     
1a3a0 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 73 75   #..      set su
1a3b0 63 63 65 73 73 20 74 72 75 65 0d 0a 0d 0a 20 20  ccess true....  
1a3c0 20 20 20 20 69 66 20 7b 21 24 69 73 4d 65 6d 6f      if {!$isMemo
1a3d0 72 79 20 26 26 20 24 64 65 6c 65 74 65 20 26 26  ry && $delete &&
1a3e0 20 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 66   [file exists $f
1a3f0 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b  ileName]} then {
1a400 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1a410 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69       # NOTE: Ski
1a420 70 20 64 65 6c 65 74 69 6e 67 20 64 61 74 61 62  p deleting datab
1a430 61 73 65 20 66 69 6c 65 73 20 69 66 20 73 6f 6d  ase files if som
1a440 65 62 6f 64 79 20 73 65 74 73 20 74 68 65 20 67  ebody sets the g
1a450 6c 6f 62 61 6c 0d 0a 20 20 20 20 20 20 20 20 23  lobal..        #
1a460 20 20 20 20 20 20 20 76 61 72 69 61 62 6c 65 20         variable 
1a470 74 6f 20 70 72 65 76 65 6e 74 20 69 74 2e 0d 0a  to prevent it...
1a480 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1a490 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
1a4a0 69 73 74 73 20 3a 3a 6e 6f 28 63 6c 65 61 6e 75  ists ::no(cleanu
1a4b0 70 44 62 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e  pDbFiles)]} then
1a4c0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d   {..          #.
1a4d0 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
1a4e0 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 64 65  E: Attempt to de
1a4f0 6c 65 74 65 20 74 68 65 20 74 65 73 74 20 57 41  lete the test WA
1a500 4c 20 66 69 6c 65 2c 20 69 66 20 61 6e 79 2c 20  L file, if any, 
1a510 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  now...          
1a520 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  #..          set
1a530 20 77 61 6c 46 69 6c 65 4e 61 6d 65 20 5b 61 70   walFileName [ap
1a540 70 65 6e 64 41 72 67 73 20 24 66 69 6c 65 4e 61  pendArgs $fileNa
1a550 6d 65 20 2d 77 61 6c 5d 0d 0a 0d 0a 20 20 20 20  me -wal]....    
1a560 20 20 20 20 20 20 69 66 20 7b 5b 66 69 6c 65 20        if {[file 
1a570 65 78 69 73 74 73 20 24 77 61 6c 46 69 6c 65 4e  exists $walFileN
1a580 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ame]} then {..  
1a590 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
1a5a0 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
1a5b0 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20 57   If there is a W
1a5c0 41 4c 20 66 69 6c 65 2c 20 69 74 20 73 68 6f 75  AL file, it shou
1a5d0 6c 64 20 62 65 20 7a 65 72 6f 20 62 79 74 65 73  ld be zero bytes
1a5e0 20 61 74 20 74 68 69 73 0d 0a 20 20 20 20 20 20   at this..      
1a5f0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 70 6f        #       po
1a600 69 6e 74 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  int...          
1a610 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
1a620 20 69 66 20 7b 5b 73 65 74 20 73 69 7a 65 20 5b   if {[set size [
1a630 66 69 6c 65 20 73 69 7a 65 20 24 77 61 6c 46 69  file size $walFi
1a640 6c 65 4e 61 6d 65 5d 5d 20 3d 3d 20 30 7d 20 74  leName]] == 0} t
1a650 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1a660 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1a670 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 65        # NOTE: We
1a680 20 73 6f 6d 65 68 6f 77 20 66 61 69 6c 65 64 20   somehow failed 
1a690 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 57 41  to delete the WA
1a6a0 4c 20 66 69 6c 65 2c 20 72 65 70 6f 72 74 20 77  L file, report w
1a6b0 68 79 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  hy...           
1a6c0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
1a6d0 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
1a6e0 66 69 6c 65 20 64 65 6c 65 74 65 20 24 77 61 6c  file delete $wal
1a6f0 46 69 6c 65 4e 61 6d 65 7d 20 65 72 72 6f 72 5d  FileName} error]
1a700 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1a710 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
1a720 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
1a730 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
1a740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a750 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47     "==== WARNING
1a760 3a 20 66 61 69 6c 65 64 20 74 6f 20 64 65 6c 65  : failed to dele
1a770 74 65 20 57 41 4c 20 66 69 6c 65 20 5c 22 22 20  te WAL file \"" 
1a780 24 77 61 6c 46 69 6c 65 4e 61 6d 65 20 5c 0d 0a  $walFileName \..
1a790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a7a0 20 20 20 20 22 5c 22 20 64 75 72 69 6e 67 20 63      "\" during c
1a7b0 6c 65 61 6e 75 70 2c 20 65 72 72 6f 72 3a 20 22  leanup, error: "
1a7c0 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d   \n\t $error \n]
1a7d0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
1a7e0 20 20 20 20 73 65 74 20 73 75 63 63 65 73 73 20      set success 
1a7f0 66 61 6c 73 65 0d 0a 20 20 20 20 20 20 20 20 20  false..         
1a800 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
1a810 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
1a820 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
1a830 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
1a840 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
1a850 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a860 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47     "==== WARNING
1a870 3a 20 57 41 4c 20 66 69 6c 65 20 5c 22 22 20 24  : WAL file \"" $
1a880 77 61 6c 46 69 6c 65 4e 61 6d 65 20 22 5c 22 20  walFileName "\" 
1a890 69 73 20 22 20 24 73 69 7a 65 20 5c 0d 0a 20 20  is " $size \..  
1a8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a8b0 22 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c  " bytes in size,
1a8c0 20 73 6b 69 70 70 69 6e 67 20 61 6c 6c 20 66 69   skipping all fi
1a8d0 6c 65 20 64 65 6c 65 74 69 6f 6e 73 2e 2e 2e 5c  le deletions...\
1a8e0 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  n"]....         
1a8f0 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 20 23       return 1; #
1a900 20 65 72 72 6f 72 0d 0a 20 20 20 20 20 20 20 20   error..        
1a910 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
1a920 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
1a930 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e  #..          # N
1a940 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20  OTE: Attempt to 
1a950 64 65 6c 65 74 65 20 74 68 65 20 74 65 73 74 20  delete the test 
1a960 53 48 4d 20 66 69 6c 65 2c 20 69 66 20 61 6e 79  SHM file, if any
1a970 2c 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20  , now...        
1a980 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73    #..          s
1a990 65 74 20 73 68 6d 46 69 6c 65 4e 61 6d 65 20 5b  et shmFileName [
1a9a0 61 70 70 65 6e 64 41 72 67 73 20 24 66 69 6c 65  appendArgs $file
1a9b0 4e 61 6d 65 20 2d 73 68 6d 5d 0d 0a 0d 0a 20 20  Name -shm]....  
1a9c0 20 20 20 20 20 20 20 20 69 66 20 7b 5b 66 69 6c          if {[fil
1a9d0 65 20 65 78 69 73 74 73 20 24 73 68 6d 46 69 6c  e exists $shmFil
1a9e0 65 4e 61 6d 65 5d 20 26 26 20 5c 0d 0a 20 20 20  eName] && \..   
1a9f0 20 20 20 20 20 20 20 20 20 20 20 5b 63 61 74 63             [catc
1aa00 68 20 7b 66 69 6c 65 20 64 65 6c 65 74 65 20 24  h {file delete $
1aa10 73 68 6d 46 69 6c 65 4e 61 6d 65 7d 20 65 72 72  shmFileName} err
1aa20 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  or]} then {..   
1aa30 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
1aa40 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
1aa50 57 65 20 73 6f 6d 65 68 6f 77 20 66 61 69 6c 65  We somehow faile
1aa60 64 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20  d to delete the 
1aa70 53 48 4d 20 66 69 6c 65 2c 20 72 65 70 6f 72 74  SHM file, report
1aa80 20 77 68 79 2e 0d 0a 20 20 20 20 20 20 20 20 20   why...         
1aa90 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
1aaa0 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
1aab0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
1aac0 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
1aad0 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52         "==== WAR
1aae0 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20  NING: failed to 
1aaf0 64 65 6c 65 74 65 20 53 48 4d 20 66 69 6c 65 20  delete SHM file 
1ab00 5c 22 22 20 24 73 68 6d 46 69 6c 65 4e 61 6d 65  \"" $shmFileName
1ab10 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1ab20 20 20 20 20 22 5c 22 20 64 75 72 69 6e 67 20 63      "\" during c
1ab30 6c 65 61 6e 75 70 2c 20 65 72 72 6f 72 3a 20 22  leanup, error: "
1ab40 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d   \n\t $error \n]
1ab50 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
1ab60 73 65 74 20 73 75 63 63 65 73 73 20 66 61 6c 73  set success fals
1ab70 65 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  e..          }..
1ab80 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
1ab90 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
1aba0 20 41 74 74 65 6d 70 74 20 74 6f 20 64 65 6c 65   Attempt to dele
1abb0 74 65 20 74 68 65 20 74 65 73 74 20 64 61 74 61  te the test data
1abc0 62 61 73 65 20 66 69 6c 65 20 6e 6f 77 2e 0d 0a  base file now...
1abd0 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
1abe0 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
1abf0 68 20 7b 66 69 6c 65 20 64 65 6c 65 74 65 20 24  h {file delete $
1ac00 66 69 6c 65 4e 61 6d 65 7d 20 65 72 72 6f 72 5d  fileName} error]
1ac10 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1ac20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1ac30 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 65 20       # NOTE: We 
1ac40 73 6f 6d 65 68 6f 77 20 66 61 69 6c 65 64 20 74  somehow failed t
1ac50 6f 20 64 65 6c 65 74 65 20 74 68 65 20 66 69 6c  o delete the fil
1ac60 65 2c 20 72 65 70 6f 72 74 20 77 68 79 2e 0d 0a  e, report why...
1ac70 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
1ac80 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
1ac90 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
1aca0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
1acb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1acc0 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66  "==== WARNING: f
1acd0 61 69 6c 65 64 20 74 6f 20 64 65 6c 65 74 65 20  ailed to delete 
1ace0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 5c 22  database file \"
1acf0 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20  " $fileName \.. 
1ad00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1ad10 5c 22 20 64 75 72 69 6e 67 20 63 6c 65 61 6e 75  \" during cleanu
1ad20 70 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74  p, error: " \n\t
1ad30 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 0d 0a 20   $error \n].... 
1ad40 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 73             set s
1ad50 75 63 63 65 73 73 20 66 61 6c 73 65 0d 0a 20 20  uccess false..  
1ad60 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
1ad70 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
1ad80 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1ad90 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77      # NOTE: Show
1ada0 20 74 68 61 74 20 77 65 20 73 6b 69 70 70 65 64   that we skipped
1adb0 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 66 69   deleting the fi
1adc0 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  le...          #
1add0 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74  ..          tput
1ade0 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
1adf0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
1ae00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
1ae10 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 73 6b  ==== WARNING: sk
1ae20 69 70 70 65 64 20 64 65 6c 65 74 69 6e 67 20 64  ipped deleting d
1ae30 61 74 61 62 61 73 65 20 66 69 6c 65 20 5c 22 22  atabase file \""
1ae40 20 24 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20   $fileName \..  
1ae50 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 20              "\" 
1ae60 64 75 72 69 6e 67 20 63 6c 65 61 6e 75 70 5c 6e  during cleanup\n
1ae70 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  "]..        }.. 
1ae80 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
1ae90 72 65 74 75 72 6e 20 5b 65 78 70 72 20 7b 24 73  return [expr {$s
1aea0 75 63 63 65 73 73 20 3f 20 30 20 3a 20 31 7d 5d  uccess ? 0 : 1}]
1aeb0 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
1aec0 70 72 6f 63 20 73 61 76 65 45 6e 76 69 72 6f 6e  proc saveEnviron
1aed0 6d 65 6e 74 56 61 72 69 61 62 6c 65 73 20 7b 20  mentVariables { 
1aee0 6e 61 6d 65 73 20 7b 76 61 72 4e 61 6d 65 20 22  names {varName "
1aef0 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  "} } {..      #.
1af00 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46  .      # NOTE: F
1af10 6f 72 20 65 61 63 68 20 6e 61 6d 65 2c 20 64 6f  or each name, do
1af20 65 73 20 74 68 65 20 6c 69 76 65 20 65 6e 76 69  es the live envi
1af30 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65  ronment variable
1af40 20 65 78 69 73 74 3f 20 20 49 66 0d 0a 20 20 20   exist?  If..   
1af50 20 20 20 23 20 20 20 20 20 20 20 73 6f 2c 20 73     #       so, s
1af60 61 76 65 20 74 68 65 20 76 61 6c 75 65 20 66 6f  ave the value fo
1af70 72 20 6c 61 74 65 72 3b 20 6f 74 68 65 72 77 69  r later; otherwi
1af80 73 65 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68  se, make sure th
1af90 65 20 73 61 76 65 64 0d 0a 20 20 20 20 20 20 23  e saved..      #
1afa0 20 20 20 20 20 20 20 76 61 6c 75 65 20 64 6f 65         value doe
1afb0 73 20 6e 6f 74 20 65 78 69 73 74 20 65 69 74 68  s not exist eith
1afc0 65 72 2e 20 20 54 68 65 20 6c 69 76 65 20 65 6e  er.  The live en
1afd0 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62  vironment variab
1afe0 6c 65 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20  les..      #    
1aff0 20 20 20 41 52 45 20 4e 4f 54 20 63 68 61 6e 67     ARE NOT chang
1b000 65 64 20 62 79 20 74 68 69 73 20 70 72 6f 63 65  ed by this proce
1b010 64 75 72 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  dure...      #..
1b020 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
1b030 67 20 6c 65 6e 67 74 68 20 24 76 61 72 4e 61 6d  g length $varNam
1b040 65 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  e] == 0} then {.
1b050 0a 20 20 20 20 20 20 20 20 73 65 74 20 76 61 72  .        set var
1b060 4e 61 6d 65 20 73 61 76 65 64 45 6e 76 0d 0a 20  Name savedEnv.. 
1b070 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
1b080 75 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65  upvar 1 $varName
1b090 20 73 61 76 65 64 45 6e 76 0d 0a 0d 0a 20 20 20   savedEnv....   
1b0a0 20 20 20 66 6f 72 65 61 63 68 20 6e 61 6d 65 20     foreach name 
1b0b0 24 6e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20  $names {..      
1b0c0 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73    if {[info exis
1b0d0 74 73 20 3a 3a 65 6e 76 28 24 6e 61 6d 65 29 5d  ts ::env($name)]
1b0e0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1b0f0 20 20 20 20 73 65 74 20 73 61 76 65 64 45 6e 76      set savedEnv
1b100 28 24 6e 61 6d 65 29 20 24 3a 3a 65 6e 76 28 24  ($name) $::env($
1b110 6e 61 6d 65 29 0d 0a 20 20 20 20 20 20 20 20 7d  name)..        }
1b120 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
1b130 20 20 20 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70     unset -nocomp
1b140 6c 61 69 6e 20 73 61 76 65 64 45 6e 76 28 24 6e  lain savedEnv($n
1b150 61 6d 65 29 0d 0a 20 20 20 20 20 20 20 20 7d 0d  ame)..        }.
1b160 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
1b170 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
1b180 45 3a 20 54 68 69 73 20 69 73 20 73 65 6c 66 2d  E: This is self-
1b190 63 6c 65 61 6e 69 6e 67 2e 20 20 49 66 20 6e 6f  cleaning.  If no
1b1a0 20 73 61 76 65 64 20 65 6e 76 69 72 6f 6e 6d 65   saved environme
1b1b0 6e 74 20 76 61 72 69 61 62 6c 65 73 20 6e 6f 77  nt variables now
1b1c0 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
1b1d0 65 78 69 73 74 2c 20 72 65 6d 6f 76 65 20 74 68  exist, remove th
1b1e0 65 20 61 72 72 61 79 2e 0d 0a 20 20 20 20 20 20  e array...      
1b1f0 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 61 72  #..      if {[ar
1b200 72 61 79 20 73 69 7a 65 20 73 61 76 65 64 45 6e  ray size savedEn
1b210 76 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  v] == 0} then {.
1b220 0a 20 20 20 20 20 20 20 20 75 6e 73 65 74 20 2d  .        unset -
1b230 6e 6f 63 6f 6d 70 6c 61 69 6e 20 73 61 76 65 64  nocomplain saved
1b240 45 6e 76 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  Env..      }..  
1b250 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
1b260 20 72 65 73 74 6f 72 65 45 6e 76 69 72 6f 6e 6d   restoreEnvironm
1b270 65 6e 74 56 61 72 69 61 62 6c 65 73 20 7b 20 6e  entVariables { n
1b280 61 6d 65 73 20 7b 76 61 72 4e 61 6d 65 20 22 22  ames {varName ""
1b290 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a  } } {..      #..
1b2a0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 6f        # NOTE: Fo
1b2b0 72 20 65 61 63 68 20 6e 61 6d 65 2c 20 64 6f 65  r each name, doe
1b2c0 73 20 74 68 65 20 73 61 76 65 64 20 65 6e 76 69  s the saved envi
1b2d0 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65  ronment variable
1b2e0 20 65 78 69 73 74 3f 20 20 49 66 0d 0a 20 20 20   exist?  If..   
1b2f0 20 20 20 23 20 20 20 20 20 20 20 73 6f 2c 20 72     #       so, r
1b300 65 73 74 6f 72 65 20 74 68 65 20 73 61 76 65 64  estore the saved
1b310 20 76 61 6c 75 65 20 61 6e 64 20 75 6e 73 65 74   value and unset
1b320 20 69 74 3b 20 6f 74 68 65 72 77 69 73 65 2c 20   it; otherwise, 
1b330 6d 61 6b 65 20 73 75 72 65 0d 0a 20 20 20 20 20  make sure..     
1b340 20 23 20 20 20 20 20 20 20 74 68 65 20 6c 69 76   #       the liv
1b350 65 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61  e environment va
1b360 72 69 61 62 6c 65 20 64 6f 65 73 20 6e 6f 74 20  riable does not 
1b370 65 78 69 73 74 20 65 69 74 68 65 72 20 28 69 2e  exist either (i.
1b380 65 2e 20 69 74 0d 0a 20 20 20 20 20 20 23 20 20  e. it..      #  
1b390 20 20 20 20 20 77 61 73 20 6e 6f 74 20 73 65 74       was not set
1b3a0 20 74 6f 20 62 65 67 69 6e 20 77 69 74 68 29 2e   to begin with).
1b3b0 20 20 42 6f 74 68 20 73 61 76 65 64 20 61 6e 64    Both saved and
1b3c0 20 6c 69 76 65 20 65 6e 76 69 72 6f 6e 6d 65 6e   live environmen
1b3d0 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  t..      #      
1b3e0 20 76 61 72 69 61 62 6c 65 73 20 41 52 45 20 63   variables ARE c
1b3f0 68 61 6e 67 65 64 20 62 79 20 74 68 69 73 20 70  hanged by this p
1b400 72 6f 63 65 64 75 72 65 2e 0d 0a 20 20 20 20 20  rocedure...     
1b410 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73   #..      if {[s
1b420 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 61  tring length $va
1b430 72 4e 61 6d 65 5d 20 3d 3d 20 30 7d 20 74 68 65  rName] == 0} the
1b440 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74  n {..        set
1b450 20 76 61 72 4e 61 6d 65 20 73 61 76 65 64 45 6e   varName savedEn
1b460 76 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  v..      }....  
1b470 20 20 20 20 75 70 76 61 72 20 31 20 24 76 61 72      upvar 1 $var
1b480 4e 61 6d 65 20 73 61 76 65 64 45 6e 76 0d 0a 0d  Name savedEnv...
1b490 0a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 6e  .      foreach n
1b4a0 61 6d 65 20 24 6e 61 6d 65 73 20 7b 0d 0a 20 20  ame $names {..  
1b4b0 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20        if {[info 
1b4c0 65 78 69 73 74 73 20 73 61 76 65 64 45 6e 76 28  exists savedEnv(
1b4d0 24 6e 61 6d 65 29 5d 7d 20 74 68 65 6e 20 7b 0d  $name)]} then {.
1b4e0 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20 3a  .          set :
1b4f0 3a 65 6e 76 28 24 6e 61 6d 65 29 20 24 73 61 76  :env($name) $sav
1b500 65 64 45 6e 76 28 24 6e 61 6d 65 29 0d 0a 20 20  edEnv($name)..  
1b510 20 20 20 20 20 20 20 20 75 6e 73 65 74 20 2d 6e          unset -n
1b520 6f 63 6f 6d 70 6c 61 69 6e 20 73 61 76 65 64 45  ocomplain savedE
1b530 6e 76 28 24 6e 61 6d 65 29 0d 0a 20 20 20 20 20  nv($name)..     
1b540 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
1b550 20 20 20 20 20 20 20 75 6e 73 65 74 20 2d 6e 6f         unset -no
1b560 63 6f 6d 70 6c 61 69 6e 20 3a 3a 65 6e 76 28 24  complain ::env($
1b570 6e 61 6d 65 29 0d 0a 20 20 20 20 20 20 20 20 7d  name)..        }
1b580 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
1b590 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
1b5a0 54 45 3a 20 54 68 69 73 20 69 73 20 73 65 6c 66  TE: This is self
1b5b0 2d 63 6c 65 61 6e 69 6e 67 2e 20 20 49 66 20 6e  -cleaning.  If n
1b5c0 6f 20 73 61 76 65 64 20 65 6e 76 69 72 6f 6e 6d  o saved environm
1b5d0 65 6e 74 20 76 61 72 69 61 62 6c 65 73 20 6e 6f  ent variables no
1b5e0 77 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  w..      #      
1b5f0 20 65 78 69 73 74 2c 20 72 65 6d 6f 76 65 20 74   exist, remove t
1b600 68 65 20 61 72 72 61 79 2e 0d 0a 20 20 20 20 20  he array...     
1b610 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 61   #..      if {[a
1b620 72 72 61 79 20 73 69 7a 65 20 73 61 76 65 64 45  rray size savedE
1b630 6e 76 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  nv] == 0} then {
1b640 0d 0a 20 20 20 20 20 20 20 20 75 6e 73 65 74 20  ..        unset 
1b650 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 73 61 76 65  -nocomplain save
1b660 64 45 6e 76 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  dEnv..      }.. 
1b670 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
1b680 63 20 73 61 76 65 45 61 67 6c 65 53 68 65 6c 6c  c saveEagleShell
1b690 45 6e 76 69 72 6f 6e 6d 65 6e 74 20 7b 7d 20 7b  Environment {} {
1b6a0 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20 31 20  ..      upvar 1 
1b6b0 73 61 76 65 64 45 6e 76 20 73 61 76 65 64 45 6e  savedEnv savedEn
1b6c0 76 0d 0a 0d 0a 20 20 20 20 20 20 73 61 76 65 45  v....      saveE
1b6d0 6e 76 69 72 6f 6e 6d 65 6e 74 56 61 72 69 61 62  nvironmentVariab
1b6e0 6c 65 73 20 5b 6c 69 73 74 20 4e 6f 4d 75 74 65  les [list NoMute
1b6f0 78 65 73 5d 20 73 61 76 65 64 45 6e 76 0d 0a 20  xes] savedEnv.. 
1b700 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
1b710 63 20 72 65 73 74 6f 72 65 45 61 67 6c 65 53 68  c restoreEagleSh
1b720 65 6c 6c 45 6e 76 69 72 6f 6e 6d 65 6e 74 20 7b  ellEnvironment {
1b730 7d 20 7b 0d 0a 20 20 20 20 20 20 75 70 76 61 72  } {..      upvar
1b740 20 31 20 73 61 76 65 64 45 6e 76 20 73 61 76 65   1 savedEnv save
1b750 64 45 6e 76 0d 0a 0d 0a 20 20 20 20 20 20 72 65  dEnv....      re
1b760 73 74 6f 72 65 45 6e 76 69 72 6f 6e 6d 65 6e 74  storeEnvironment
1b770 56 61 72 69 61 62 6c 65 73 20 5b 6c 69 73 74 20  Variables [list 
1b780 4e 6f 4d 75 74 65 78 65 73 5d 20 73 61 76 65 64  NoMutexes] saved
1b790 45 6e 76 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20  Env..    }..... 
1b7a0 20 20 20 70 72 6f 63 20 73 61 76 65 4d 64 61 43     proc saveMdaC
1b7b0 6f 6e 66 69 67 45 6e 76 69 72 6f 6e 6d 65 6e 74  onfigEnvironment
1b7c0 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 75 70 76   {} {..      upv
1b7d0 61 72 20 31 20 73 61 76 65 64 45 6e 76 20 73 61  ar 1 savedEnv sa
1b7e0 76 65 64 45 6e 76 0d 0a 0d 0a 20 20 20 20 20 20  vedEnv....      
1b7f0 73 61 76 65 45 6e 76 69 72 6f 6e 6d 65 6e 74 56  saveEnvironmentV
1b800 61 72 69 61 62 6c 65 73 20 5b 6c 69 73 74 20 43  ariables [list C
1b810 4f 4d 50 4c 55 53 5f 4d 44 41 5d 20 73 61 76 65  OMPLUS_MDA] save
1b820 64 45 6e 76 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  dEnv..    }.....
1b830 20 20 20 20 70 72 6f 63 20 72 65 73 74 6f 72 65      proc restore
1b840 4d 64 61 43 6f 6e 66 69 67 45 6e 76 69 72 6f 6e  MdaConfigEnviron
1b850 6d 65 6e 74 20 7b 7d 20 7b 0d 0a 20 20 20 20 20  ment {} {..     
1b860 20 75 70 76 61 72 20 31 20 73 61 76 65 64 45 6e   upvar 1 savedEn
1b870 76 20 73 61 76 65 64 45 6e 76 0d 0a 0d 0a 20 20  v savedEnv....  
1b880 20 20 20 20 72 65 73 74 6f 72 65 45 6e 76 69 72      restoreEnvir
1b890 6f 6e 6d 65 6e 74 56 61 72 69 61 62 6c 65 73 20  onmentVariables 
1b8a0 5b 6c 69 73 74 20 43 4f 4d 50 4c 55 53 5f 4d 44  [list COMPLUS_MD
1b8b0 41 5d 20 73 61 76 65 64 45 6e 76 0d 0a 20 20 20  A] savedEnv..   
1b8c0 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
1b8d0 73 61 76 65 47 65 74 53 65 74 74 69 6e 67 56 61  saveGetSettingVa
1b8e0 6c 75 65 45 6e 76 69 72 6f 6e 6d 65 6e 74 20 7b  lueEnvironment {
1b8f0 7d 20 7b 0d 0a 20 20 20 20 20 20 75 70 76 61 72  } {..      upvar
1b900 20 31 20 73 61 76 65 64 45 6e 76 20 73 61 76 65   1 savedEnv save
1b910 64 45 6e 76 0d 0a 0d 0a 20 20 20 20 20 20 73 61  dEnv....      sa
1b920 76 65 45 6e 76 69 72 6f 6e 6d 65 6e 74 56 61 72  veEnvironmentVar
1b930 69 61 62 6c 65 73 20 5b 6c 69 73 74 20 5c 0d 0a  iables [list \..
1b940 20 20 20 20 20 20 20 20 20 20 4e 6f 5f 45 78 70            No_Exp
1b950 61 6e 64 20 4e 6f 5f 53 51 4c 69 74 65 47 65 74  and No_SQLiteGet
1b960 53 65 74 74 69 6e 67 56 61 6c 75 65 20 4e 6f 5f  SettingValue No_
1b970 53 51 4c 69 74 65 58 6d 6c 43 6f 6e 66 69 67 46  SQLiteXmlConfigF
1b980 69 6c 65 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20  ile] \..        
1b990 20 20 73 61 76 65 64 45 6e 76 0d 0a 20 20 20 20    savedEnv..    
1b9a0 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 72  }.....    proc r
1b9b0 65 73 74 6f 72 65 47 65 74 53 65 74 74 69 6e 67  estoreGetSetting
1b9c0 56 61 6c 75 65 45 6e 76 69 72 6f 6e 6d 65 6e 74  ValueEnvironment
1b9d0 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 75 70 76   {} {..      upv
1b9e0 61 72 20 31 20 73 61 76 65 64 45 6e 76 20 73 61  ar 1 savedEnv sa
1b9f0 76 65 64 45 6e 76 0d 0a 0d 0a 20 20 20 20 20 20  vedEnv....      
1ba00 72 65 73 74 6f 72 65 45 6e 76 69 72 6f 6e 6d 65  restoreEnvironme
1ba10 6e 74 56 61 72 69 61 62 6c 65 73 20 5b 6c 69 73  ntVariables [lis
1ba20 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 4e  t \..          N
1ba30 6f 5f 45 78 70 61 6e 64 20 4e 6f 5f 53 51 4c 69  o_Expand No_SQLi
1ba40 74 65 47 65 74 53 65 74 74 69 6e 67 56 61 6c 75  teGetSettingValu
1ba50 65 20 4e 6f 5f 53 51 4c 69 74 65 58 6d 6c 43 6f  e No_SQLiteXmlCo
1ba60 6e 66 69 67 46 69 6c 65 5d 20 5c 0d 0a 20 20 20  nfigFile] \..   
1ba70 20 20 20 20 20 20 20 73 61 76 65 64 45 6e 76 0d         savedEnv.
1ba80 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
1ba90 72 6f 63 20 73 61 76 65 53 51 4c 69 74 65 43 6f  roc saveSQLiteCo
1baa0 6e 6e 65 63 74 69 6f 6e 45 6e 76 69 72 6f 6e 6d  nnectionEnvironm
1bab0 65 6e 74 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20  ent {} {..      
1bac0 75 70 76 61 72 20 31 20 73 61 76 65 64 45 6e 76  upvar 1 savedEnv
1bad0 20 73 61 76 65 64 45 6e 76 0d 0a 0d 0a 20 20 20   savedEnv....   
1bae0 20 20 20 73 61 76 65 45 6e 76 69 72 6f 6e 6d 65     saveEnvironme
1baf0 6e 74 56 61 72 69 61 62 6c 65 73 20 5b 6c 69 73  ntVariables [lis
1bb00 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 44  t \..          D
1bb10 65 66 61 75 6c 74 46 6c 61 67 73 5f 53 51 4c 69  efaultFlags_SQLi
1bb20 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 4e 6f 5f  teConnection No_
1bb30 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e  SQLiteConnection
1bb40 4e 65 77 50 61 72 73 65 72 5d 20 5c 0d 0a 20 20  NewParser] \..  
1bb50 20 20 20 20 20 20 20 20 73 61 76 65 64 45 6e 76          savedEnv
1bb60 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
1bb70 70 72 6f 63 20 72 65 73 74 6f 72 65 53 51 4c 69  proc restoreSQLi
1bb80 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 45 6e 76 69  teConnectionEnvi
1bb90 72 6f 6e 6d 65 6e 74 20 7b 7d 20 7b 0d 0a 20 20  ronment {} {..  
1bba0 20 20 20 20 75 70 76 61 72 20 31 20 73 61 76 65      upvar 1 save
1bbb0 64 45 6e 76 20 73 61 76 65 64 45 6e 76 0d 0a 0d  dEnv savedEnv...
1bbc0 0a 20 20 20 20 20 20 72 65 73 74 6f 72 65 45 6e  .      restoreEn
1bbd0 76 69 72 6f 6e 6d 65 6e 74 56 61 72 69 61 62 6c  vironmentVariabl
1bbe0 65 73 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20  es [list \..    
1bbf0 20 20 20 20 20 20 44 65 66 61 75 6c 74 46 6c 61        DefaultFla
1bc00 67 73 5f 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74  gs_SQLiteConnect
1bc10 69 6f 6e 20 4e 6f 5f 53 51 4c 69 74 65 43 6f 6e  ion No_SQLiteCon
1bc20 6e 65 63 74 69 6f 6e 4e 65 77 50 61 72 73 65 72  nectionNewParser
1bc30 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 73  ] \..          s
1bc40 61 76 65 64 45 6e 76 0d 0a 20 20 20 20 7d 0d 0a  avedEnv..    }..
1bc50 0c 0d 0a 20 20 20 20 70 72 6f 63 20 73 61 76 65  ...    proc save
1bc60 53 51 4c 69 74 65 43 6f 6e 76 65 72 74 45 6e 76  SQLiteConvertEnv
1bc70 69 72 6f 6e 6d 65 6e 74 20 7b 7d 20 7b 0d 0a 20  ironment {} {.. 
1bc80 20 20 20 20 20 75 70 76 61 72 20 31 20 73 61 76       upvar 1 sav
1bc90 65 64 45 6e 76 20 73 61 76 65 64 45 6e 76 0d 0a  edEnv savedEnv..
1bca0 0d 0a 20 20 20 20 20 20 73 61 76 65 45 6e 76 69  ..      saveEnvi
1bcb0 72 6f 6e 6d 65 6e 74 56 61 72 69 61 62 6c 65 73  ronmentVariables
1bcc0 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20   [list \..      
1bcd0 20 20 20 20 55 73 65 5f 53 51 4c 69 74 65 43 6f      Use_SQLiteCo
1bce0 6e 76 65 72 74 5f 44 65 66 61 75 6c 74 44 62 54  nvert_DefaultDbT
1bcf0 79 70 65 20 55 73 65 5f 53 51 4c 69 74 65 43 6f  ype Use_SQLiteCo
1bd00 6e 76 65 72 74 5f 44 65 66 61 75 6c 74 54 79 70  nvert_DefaultTyp
1bd10 65 4e 61 6d 65 5d 20 5c 0d 0a 20 20 20 20 20 20  eName] \..      
1bd20 20 20 20 20 73 61 76 65 64 45 6e 76 0d 0a 20 20      savedEnv..  
1bd30 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
1bd40 20 72 65 73 74 6f 72 65 53 51 4c 69 74 65 43 6f   restoreSQLiteCo
1bd50 6e 76 65 72 74 45 6e 76 69 72 6f 6e 6d 65 6e 74  nvertEnvironment
1bd60 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 75 70 76   {} {..      upv
1bd70 61 72 20 31 20 73 61 76 65 64 45 6e 76 20 73 61  ar 1 savedEnv sa
1bd80 76 65 64 45 6e 76 0d 0a 0d 0a 20 20 20 20 20 20  vedEnv....      
1bd90 72 65 73 74 6f 72 65 45 6e 76 69 72 6f 6e 6d 65  restoreEnvironme
1bda0 6e 74 56 61 72 69 61 62 6c 65 73 20 5b 6c 69 73  ntVariables [lis
1bdb0 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 55  t \..          U
1bdc0 73 65 5f 53 51 4c 69 74 65 43 6f 6e 76 65 72 74  se_SQLiteConvert
1bdd0 5f 44 65 66 61 75 6c 74 44 62 54 79 70 65 20 55  _DefaultDbType U
1bde0 73 65 5f 53 51 4c 69 74 65 43 6f 6e 76 65 72 74  se_SQLiteConvert
1bdf0 5f 44 65 66 61 75 6c 74 54 79 70 65 4e 61 6d 65  _DefaultTypeName
1be00 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 73  ] \..          s
1be10 61 76 65 64 45 6e 76 0d 0a 20 20 20 20 7d 0d 0a  avedEnv..    }..
1be20 0c 0d 0a 20 20 20 20 70 72 6f 63 20 73 65 74 75  ...    proc setu
1be30 70 44 62 49 6e 74 65 72 72 75 70 74 43 61 6c 6c  pDbInterruptCall
1be40 62 61 63 6b 20 7b 20 63 68 61 6e 6e 65 6c 20 6c  back { channel l
1be50 6f 67 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74 70  og } {..      tp
1be60 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d  uts $channel "--
1be70 2d 2d 20 73 65 74 74 69 6e 67 20 75 70 20 64 65  -- setting up de
1be80 62 75 67 67 65 72 20 69 6e 74 65 72 72 75 70 74  bugger interrupt
1be90 20 63 61 6c 6c 62 61 63 6b 2e 2e 2e 20 22 0d 0a   callback... "..
1bea0 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74  ..      if {[cat
1beb0 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 61  ch {..        sa
1bec0 76 65 45 6e 76 69 72 6f 6e 6d 65 6e 74 56 61 72  veEnvironmentVar
1bed0 69 61 62 6c 65 73 20 5b 6c 69 73 74 20 5c 0d 0a  iables [list \..
1bee0 20 20 20 20 20 20 20 20 20 20 20 20 71 75 69 65              quie
1bef0 74 46 69 6e 64 49 6e 74 65 72 70 72 65 74 65 72  tFindInterpreter
1bf00 54 65 73 74 50 61 74 68 20 71 75 69 65 74 53 65  TestPath quietSe
1bf10 74 75 70 49 6e 74 65 72 70 72 65 74 65 72 54 65  tupInterpreterTe
1bf20 73 74 50 61 74 68 5d 0d 0a 0d 0a 20 20 20 20 20  stPath]....     
1bf30 20 20 20 74 72 79 20 7b 0d 0a 20 20 20 20 20 20     try {..      
1bf40 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
1bf50 20 23 20 4e 4f 54 45 3a 20 50 72 65 76 65 6e 74   # NOTE: Prevent
1bf60 20 74 68 65 20 76 65 6e 64 6f 72 20 73 63 72 69   the vendor scri
1bf70 70 74 20 66 72 6f 6d 20 62 65 69 6e 67 20 6e 6f  pt from being no
1bf80 69 73 79 20 77 68 65 6e 20 63 72 65 61 74 69 6e  isy when creatin
1bf90 67 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20  g..          #  
1bfa0 20 20 20 20 20 74 68 65 20 69 73 6f 6c 61 74 65       the isolate
1bfb0 64 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a  d interpreter...
1bfc0 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
1bfd0 20 20 20 20 20 20 20 73 65 74 20 3a 3a 65 6e 76         set ::env
1bfe0 28 71 75 69 65 74 46 69 6e 64 49 6e 74 65 72 70  (quietFindInterp
1bff0 72 65 74 65 72 54 65 73 74 50 61 74 68 29 20 31  reterTestPath) 1
1c000 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
1c010 3a 3a 65 6e 76 28 71 75 69 65 74 53 65 74 75 70  ::env(quietSetup
1c020 49 6e 74 65 72 70 72 65 74 65 72 54 65 73 74 50  InterpreterTestP
1c030 61 74 68 29 20 31 0d 0a 0d 0a 20 20 20 20 20 20  ath) 1....      
1c040 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
1c050 20 23 20 4e 4f 54 45 3a 20 4d 61 6b 65 20 73 75   # NOTE: Make su
1c060 72 65 20 74 68 65 20 73 63 72 69 70 74 20 64 65  re the script de
1c070 62 75 67 67 65 72 20 61 6e 64 20 74 68 65 20 69  bugger and the i
1c080 73 6f 6c 61 74 65 64 20 69 6e 74 65 72 70 72 65  solated interpre
1c090 74 65 72 0d 0a 20 20 20 20 20 20 20 20 20 20 23  ter..          #
1c0a0 20 20 20 20 20 20 20 61 72 65 20 73 65 74 75 70         are setup
1c0b0 20 61 6e 64 20 72 65 61 64 79 20 66 6f 72 20 75   and ready for u
1c0c0 73 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  se...          #
1c0d0 0d 0a 20 20 20 20 20 20 20 20 20 20 64 65 62 75  ..          debu
1c0e0 67 20 73 65 74 75 70 20 74 72 75 65 20 74 72 75  g setup true tru
1c0f0 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23  e....          #
1c100 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
1c110 54 45 3a 20 4c 6f 61 64 20 74 68 65 20 6e 65 63  TE: Load the nec
1c120 65 73 73 61 72 79 20 70 61 63 6b 61 67 65 73 20  essary packages 
1c130 69 6e 74 6f 20 74 68 65 20 69 73 6f 6c 61 74 65  into the isolate
1c140 64 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a  d interpreter...
1c150 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
1c160 20 20 20 20 20 20 20 64 65 62 75 67 20 65 76 61         debug eva
1c170 6c 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  l {..           
1c180 20 70 61 63 6b 61 67 65 20 72 65 71 75 69 72 65   package require
1c190 20 45 61 67 6c 65 0d 0a 20 20 20 20 20 20 20 20   Eagle..        
1c1a0 20 20 20 20 70 61 63 6b 61 67 65 20 72 65 71 75      package requ
1c1b0 69 72 65 20 45 61 67 6c 65 2e 4c 69 62 72 61 72  ire Eagle.Librar
1c1c0 79 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  y..            p
1c1d0 61 63 6b 61 67 65 20 72 65 71 75 69 72 65 20 45  ackage require E
1c1e0 61 67 6c 65 2e 54 65 73 74 0d 0a 20 20 20 20 20  agle.Test..     
1c1f0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
1c200 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
1c210 20 23 20 4e 4f 54 45 3a 20 43 6f 70 79 20 74 68   # NOTE: Copy th
1c220 65 20 6e 65 63 65 73 73 61 72 79 20 76 61 72 69  e necessary vari
1c230 61 62 6c 65 73 20 69 6e 74 6f 20 74 68 65 20 69  ables into the i
1c240 73 6f 6c 61 74 65 64 20 69 6e 74 65 72 70 72 65  solated interpre
1c250 74 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ter...          
1c260 23 0d 0a 20 20 20 20 20 20 20 20 20 20 64 65 62  #..          deb
1c270 75 67 20 69 6e 76 6f 6b 65 20 30 20 73 65 74 20  ug invoke 0 set 
1c280 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24  ::test_channel $
1c290 63 68 61 6e 6e 65 6c 3b 20 23 20 4e 4f 54 45 3a  channel; # NOTE:
1c2a0 20 46 6f 72 20 5b 74 70 75 74 73 5d 2e 0d 0a 20   For [tputs]... 
1c2b0 20 20 20 20 20 20 20 20 20 64 65 62 75 67 20 69           debug i
1c2c0 6e 76 6f 6b 65 20 30 20 73 65 74 20 3a 3a 74 65  nvoke 0 set ::te
1c2d0 73 74 5f 6c 6f 67 20 24 6c 6f 67 3b 20 23 20 4e  st_log $log; # N
1c2e0 4f 54 45 3a 20 46 6f 72 20 5b 74 6c 6f 67 5d 2e  OTE: For [tlog].
1c2f0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  ....          #.
1c300 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
1c310 45 3a 20 49 6e 73 74 61 6c 6c 20 74 68 65 20 63  E: Install the c
1c320 61 6c 6c 62 61 63 6b 20 73 63 72 69 70 74 20 74  allback script t
1c330 6f 20 62 65 20 65 76 61 6c 75 61 74 65 64 20 69  o be evaluated i
1c340 6e 20 74 68 65 20 69 73 6f 6c 61 74 65 64 0d 0a  n the isolated..
1c350 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
1c360 20 20 69 6e 74 65 72 70 72 65 74 65 72 20 77 68    interpreter wh
1c370 65 6e 20 74 68 69 73 20 69 6e 74 65 72 70 72 65  en this interpre
1c380 74 65 72 20 69 73 20 69 6e 74 65 72 72 75 70 74  ter is interrupt
1c390 65 64 20 62 79 20 73 63 72 69 70 74 0d 0a 20 20  ed by script..  
1c3a0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
1c3b0 63 61 6e 63 65 6c 6c 61 74 69 6f 6e 2c 20 65 74  cancellation, et
1c3c0 63 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  c...          #.
1c3d0 0a 20 20 20 20 20 20 20 20 20 20 64 65 62 75 67  .          debug
1c3e0 20 63 61 6c 6c 62 61 63 6b 20 61 70 70 6c 79 20   callback apply 
1c3f0 7b 7b 73 65 6e 64 65 72 20 65 7d 20 7b 0d 0a 20  {{sender e} {.. 
1c400 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
1c410 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
1c420 3a 20 43 68 65 63 6b 20 69 66 20 74 68 69 73 20  : Check if this 
1c430 64 65 62 75 67 67 65 72 20 63 61 6c 6c 62 61 63  debugger callbac
1c440 6b 20 69 73 20 6f 6e 65 20 74 68 61 74 20 77 65  k is one that we
1c450 20 63 61 72 65 20 61 62 6f 75 74 2e 0d 0a 20 20   care about...  
1c460 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
1c470 20 20 20 20 20 20 20 20 20 73 65 74 20 69 6e 74           set int
1c480 65 72 72 75 70 74 54 79 70 65 73 20 5b 73 70 6c  erruptTypes [spl
1c490 69 74 20 5b 24 65 20 49 6e 74 65 72 72 75 70 74  it [$e Interrupt
1c4a0 54 79 70 65 5d 20 22 2c 20 22 5d 0d 0a 0d 0a 20  Type] ", "].... 
1c4b0 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 22             if {"
1c4c0 43 61 6e 63 65 6c 65 64 22 20 69 6e 20 24 69 6e  Canceled" in $in
1c4d0 74 65 72 72 75 70 74 54 79 70 65 73 20 7c 7c 20  terruptTypes || 
1c4e0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1c4f0 20 20 20 22 55 6e 77 6f 75 6e 64 22 20 69 6e 20     "Unwound" in 
1c500 24 69 6e 74 65 72 72 75 70 74 54 79 70 65 73 7d  $interruptTypes}
1c510 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1c520 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1c530 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
1c540 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 5b 6f  Make sure the [o
1c550 62 6a 65 63 74 5d 20 63 6f 6d 6d 61 6e 64 20 69  bject] command i
1c560 73 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 53 69  s available.  Si
1c570 6e 63 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  nce..           
1c580 20 20 20 23 20 20 20 20 20 20 20 74 68 69 73 20     #       this 
1c590 69 73 20 61 6e 20 69 73 6f 6c 61 74 65 64 20 69  is an isolated i
1c5a0 6e 74 65 72 70 72 65 74 65 72 2c 20 63 68 65 63  nterpreter, chec
1c5b0 6b 20 66 6f 72 20 69 74 20 74 68 65 20 68 61 72  k for it the har
1c5c0 64 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d..             
1c5d0 20 23 20 20 20 20 20 20 20 77 61 79 2e 0d 0a 20   #       way... 
1c5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a               #..
1c5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
1c600 20 7b 5b 6c 6c 65 6e 67 74 68 20 5b 69 6e 66 6f   {[llength [info
1c610 20 63 6f 6d 6d 61 6e 64 73 20 6f 62 6a 65 63 74   commands object
1c620 5d 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ]] > 0} then {..
1c630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c640 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  #..             
1c650 20 20 20 23 20 4e 4f 54 45 3a 20 49 74 65 72 61     # NOTE: Itera
1c660 74 65 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 64  te through all d
1c670 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
1c680 6f 6e 73 20 6b 6e 6f 77 6e 20 74 6f 20 74 68 65  ons known to the
1c690 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1c6a0 20 20 23 20 20 20 20 20 20 20 70 61 72 65 6e 74    #       parent
1c6b0 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a 20   interpreter... 
1c6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
1c6d0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1c6e0 20 20 6f 62 6a 65 63 74 20 66 6f 72 65 61 63 68    object foreach
1c6f0 20 2d 61 6c 69 61 73 20 70 61 69 72 20 5b 6f 62   -alias pair [ob
1c700 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61  ject invoke -fla
1c710 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d  gs +NonPublic \.
1c720 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1c730 20 20 20 20 20 24 65 20 49 6e 74 65 72 70 72 65       $e Interpre
1c740 74 65 72 2e 63 6f 6e 6e 65 63 74 69 6f 6e 73 5d  ter.connections]
1c750 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1c760 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1c770 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
1c780 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 63 61  E: Attempt to ca
1c790 6e 63 65 6c 20 61 6e 79 20 53 51 4c 20 71 75 65  ncel any SQL que
1c7a0 72 69 65 73 20 69 6e 20 70 72 6f 67 72 65 73 73  ries in progress
1c7b0 20 6f 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 20   on..           
1c7c0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74         #       t
1c7d0 68 69 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e  his database con
1c7e0 6e 65 63 74 69 6f 6e 2e 0d 0a 20 20 20 20 20 20  nection...      
1c7f0 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
1c800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c810 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 24 70 61   if {[catch {$pa
1c820 69 72 20 56 61 6c 75 65 2e 43 61 6e 63 65 6c 7d  ir Value.Cancel}
1c830 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d   error]} then {.
1c840 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1c850 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
1c860 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
1c870 6e 64 41 72 67 73 20 5c 6e 20 5c 0d 0a 20 20 20  ndArgs \n \..   
1c880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c890 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49       "==== WARNI
1c8a0 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 63 61  NG: failed to ca
1c8b0 6e 63 65 6c 20 71 75 65 72 79 20 66 6f 72 20 22  ncel query for "
1c8c0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1c8d0 20 20 20 20 20 20 20 20 20 20 20 20 22 63 6f 6e              "con
1c8e0 6e 65 63 74 69 6f 6e 20 5c 22 22 20 5b 24 70 61  nection \"" [$pa
1c8f0 69 72 20 4b 65 79 5d 20 22 5c 22 2c 20 65 72 72  ir Key] "\", err
1c900 6f 72 3a 20 22 20 5c 6e 5c 74 20 5c 0d 0a 20 20  or: " \n\t \..  
1c910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c920 20 20 20 20 20 20 24 65 72 72 6f 72 20 5c 6e 5d        $error \n]
1c930 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1c940 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
1c950 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1c960 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
1c970 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1c980 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
1c990 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
1c9a0 72 67 73 20 5c 6e 20 5c 0d 0a 20 20 20 20 20 20  rgs \n \..      
1c9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d                "=
1c9c0 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 63 61 6e  === WARNING: can
1c9d0 6e 6f 74 20 63 61 6e 63 65 6c 20 61 6e 79 20 71  not cancel any q
1c9e0 75 65 72 69 65 73 3a 20 22 20 5c 0d 0a 20 20 20  ueries: " \..   
1c9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca00 20 22 74 68 65 20 5c 22 6f 62 6a 65 63 74 5c 22   "the \"object\"
1ca10 20 63 6f 6d 6d 61 6e 64 20 69 73 20 6e 6f 74 20   command is not 
1ca20 61 76 61 69 6c 61 62 6c 65 5c 6e 22 5d 0d 0a 20  available\n"].. 
1ca30 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
1ca40 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
1ca50 20 20 20 20 20 20 20 20 20 7d 7d 0d 0a 20 20 20           }}..   
1ca60 20 20 20 20 20 7d 20 66 69 6e 61 6c 6c 79 20 7b       } finally {
1ca70 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65 73 74  ..          rest
1ca80 6f 72 65 45 6e 76 69 72 6f 6e 6d 65 6e 74 56 61  oreEnvironmentVa
1ca90 72 69 61 62 6c 65 73 20 5b 6c 69 73 74 20 5c 0d  riables [list \.
1caa0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 71  .              q
1cab0 75 69 65 74 46 69 6e 64 49 6e 74 65 72 70 72 65  uietFindInterpre
1cac0 74 65 72 54 65 73 74 50 61 74 68 20 71 75 69 65  terTestPath quie
1cad0 74 53 65 74 75 70 49 6e 74 65 72 70 72 65 74 65  tSetupInterprete
1cae0 72 54 65 73 74 50 61 74 68 5d 0d 0a 20 20 20 20  rTestPath]..    
1caf0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65      }..      } e
1cb00 72 72 6f 72 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  rror] == 0} then
1cb10 20 7b 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43   {..        addC
1cb20 6f 6e 73 74 72 61 69 6e 74 20 69 6e 74 65 72 72  onstraint interr
1cb30 75 70 74 43 61 6c 6c 62 61 63 6b 2e 73 71 6c 69  uptCallback.sqli
1cb40 74 65 33 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74  te3....        t
1cb50 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 79 65  puts $channel ye
1cb60 73 5c 6e 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  s\n..      } els
1cb70 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75  e {..        tpu
1cb80 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
1cb90 65 6e 64 41 72 67 73 20 22 6e 6f 2c 20 65 72 72  endArgs "no, err
1cba0 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f  or: " \n\t $erro
1cbb0 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a  r \n]..      }..
1cbc0 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
1cbd0 6f 63 20 63 6c 65 61 6e 75 70 46 69 6c 65 20 7b  oc cleanupFile {
1cbe0 20 66 69 6c 65 4e 61 6d 65 20 7b 63 6f 6c 6c 65   fileName {colle
1cbf0 63 74 20 74 72 75 65 7d 20 7b 66 6f 72 63 65 20  ct true} {force 
1cc00 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20  false} } {..    
1cc10 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
1cc20 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 66 6f  E: Attempt to fo
1cc30 72 63 65 20 61 6c 6c 20 70 65 6e 64 69 6e 67 20  rce all pending 
1cc40 22 67 61 72 62 61 67 65 22 20 6f 62 6a 65 63 74  "garbage" object
1cc50 73 20 74 6f 20 62 65 20 63 6f 6c 6c 65 63 74 65  s to be collecte
1cc60 64 2c 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  d,..      #     
1cc70 20 20 69 6e 63 6c 75 64 69 6e 67 20 53 51 4c 69    including SQLi
1cc80 74 65 20 73 74 61 74 65 6d 65 6e 74 73 20 61 6e  te statements an
1cc90 64 20 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73  d backup objects
1cca0 3b 20 74 68 69 73 20 73 68 6f 75 6c 64 20 61 6c  ; this should al
1ccb0 6c 6f 77 0d 0a 20 20 20 20 20 20 23 20 20 20 20  low..      #    
1ccc0 20 20 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e     the underlyin
1ccd0 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  g database file 
1cce0 74 6f 20 62 65 20 64 65 6c 65 74 65 64 2e 0d 0a  to be deleted...
1ccf0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
1cd00 66 20 7b 24 63 6f 6c 6c 65 63 74 7d 20 74 68 65  f {$collect} the
1cd10 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 63 6f 6c  n {..        col
1cd20 6c 65 63 74 47 61 72 62 61 67 65 20 24 3a 3a 74  lectGarbage $::t
1cd30 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 20 20 20  est_channel..   
1cd40 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
1cd50 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43  .      # NOTE: C
1cd60 68 65 63 6b 20 69 66 20 74 68 65 20 66 69 6c 65  heck if the file
1cd70 20 73 74 69 6c 6c 20 65 78 69 73 74 73 2e 0d 0a   still exists...
1cd80 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
1cd90 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20  f {[file exists 
1cda0 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e  $fileName]} then
1cdb0 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
1cdc0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53         # NOTE: S
1cdd0 6b 69 70 20 64 65 6c 65 74 69 6e 67 20 74 65 73  kip deleting tes
1cde0 74 20 66 69 6c 65 73 20 69 66 20 73 6f 6d 65 62  t files if someb
1cdf0 6f 64 79 20 73 65 74 73 20 74 68 65 20 67 6c 6f  ody sets the glo
1ce00 62 61 6c 20 76 61 72 69 61 62 6c 65 0d 0a 20 20  bal variable..  
1ce10 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 6f        #       to
1ce20 20 70 72 65 76 65 6e 74 20 69 74 2e 0d 0a 20 20   prevent it...  
1ce30 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1ce40 20 69 66 20 7b 24 66 6f 72 63 65 20 7c 7c 20 21   if {$force || !
1ce50 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
1ce60 6f 28 63 6c 65 61 6e 75 70 46 69 6c 65 29 5d 7d  o(cleanupFile)]}
1ce70 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1ce80 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
1ce90 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20  # NOTE: Attempt 
1cea0 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 74 65  to delete the te
1ceb0 73 74 20 66 69 6c 65 20 6e 6f 77 2e 0d 0a 20 20  st file now...  
1cec0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1ced0 20 20 20 20 20 69 66 20 7b 5b 73 65 74 20 63 6f       if {[set co
1cee0 64 65 20 5b 63 61 74 63 68 20 7b 66 69 6c 65 20  de [catch {file 
1cef0 64 65 6c 65 74 65 20 24 66 69 6c 65 4e 61 6d 65  delete $fileName
1cf00 7d 20 65 72 72 6f 72 5d 5d 7d 20 74 68 65 6e 20  } error]]} then 
1cf10 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  {..            #
1cf20 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20  ..            # 
1cf30 4e 4f 54 45 3a 20 57 65 20 73 6f 6d 65 68 6f 77  NOTE: We somehow
1cf40 20 66 61 69 6c 65 64 20 74 6f 20 64 65 6c 65 74   failed to delet
1cf50 65 20 74 68 65 20 66 69 6c 65 2c 20 72 65 70 6f  e the file, repo
1cf60 72 74 20 77 68 79 2e 0d 0a 20 20 20 20 20 20 20  rt why...       
1cf70 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1cf80 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
1cf90 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
1cfa0 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
1cfb0 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57           "==== W
1cfc0 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74  ARNING: failed t
1cfd0 6f 20 64 65 6c 65 74 65 20 74 65 73 74 20 66 69  o delete test fi
1cfe0 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65  le \"" $fileName
1cff0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1d000 20 20 20 20 22 5c 22 20 64 75 72 69 6e 67 20 63      "\" during c
1d010 6c 65 61 6e 75 70 2c 20 65 72 72 6f 72 3a 20 22  leanup, error: "
1d020 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d   \n\t $error \n]
1d030 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
1d040 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
1d050 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
1d060 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
1d070 53 68 6f 77 20 74 68 61 74 20 77 65 20 73 6b 69  Show that we ski
1d080 70 70 65 64 20 64 65 6c 65 74 69 6e 67 20 74 68  pped deleting th
1d090 65 20 66 69 6c 65 2e 0d 0a 20 20 20 20 20 20 20  e file...       
1d0a0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
1d0b0 73 65 74 20 63 6f 64 65 20 30 0d 0a 0d 0a 20 20  set code 0....  
1d0c0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
1d0d0 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
1d0e0 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
1d0f0 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d             "====
1d100 20 57 41 52 4e 49 4e 47 3a 20 73 6b 69 70 70 65   WARNING: skippe
1d110 64 20 64 65 6c 65 74 69 6e 67 20 74 65 73 74 20  d deleting test 
1d120 66 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e 61  file \"" $fileNa
1d130 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  me \..          
1d140 20 20 20 20 22 5c 22 20 64 75 72 69 6e 67 20 63      "\" during c
1d150 6c 65 61 6e 75 70 5c 6e 22 5d 0d 0a 20 20 20 20  leanup\n"]..    
1d160 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65      }..      } e
1d170 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  lse {..        #
1d180 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
1d190 3a 20 54 68 65 20 66 69 6c 65 20 64 6f 65 73 20  : The file does 
1d1a0 6e 6f 74 20 65 78 69 73 74 2c 20 73 75 63 63 65  not exist, succe
1d1b0 73 73 21 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ss!..        #..
1d1c0 20 20 20 20 20 20 20 20 73 65 74 20 63 6f 64 65          set code
1d1d0 20 30 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20   0..      }.... 
1d1e0 20 20 20 20 20 72 65 74 75 72 6e 20 24 63 6f 64       return $cod
1d1f0 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  e..    }.....   
1d200 20 70 72 6f 63 20 63 6c 65 61 6e 75 70 4d 65 6d   proc cleanupMem
1d210 6f 72 79 20 7b 20 76 61 72 4e 61 6d 65 20 7b 71  ory { varName {q
1d220 75 69 65 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d  uiet false} } {.
1d230 0a 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65  .      if {[have
1d240 53 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d  SQLiteObjectComm
1d250 61 6e 64 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  and] && \..     
1d260 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
1d270 67 74 68 20 24 76 61 72 4e 61 6d 65 5d 20 3e 20  gth $varName] > 
1d280 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
1d290 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
1d2a0 4e 4f 54 45 3a 20 52 65 66 65 72 20 74 6f 20 74  NOTE: Refer to t
1d2b0 68 65 20 73 70 65 63 69 66 69 65 64 20 76 61 72  he specified var
1d2c0 69 61 62 6c 65 20 28 65 2e 67 2e 20 22 63 6f 6e  iable (e.g. "con
1d2d0 6e 65 63 74 69 6f 6e 22 29 20 69 6e 20 74 68 65  nection") in the
1d2e0 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
1d2f0 20 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72    context of our
1d300 20 63 61 6c 6c 65 72 2e 20 20 54 68 65 20 6f 70   caller.  The op
1d310 61 71 75 65 20 6f 62 6a 65 63 74 20 68 61 6e 64  aque object hand
1d320 6c 65 20 66 6f 72 20 61 6e 0d 0a 20 20 20 20 20  le for an..     
1d330 20 20 20 23 20 20 20 20 20 20 20 41 44 4f 2e 4e     #       ADO.N
1d340 45 54 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 72  ET connection pr
1d350 65 76 69 6f 75 73 6c 79 20 72 65 74 75 72 6e 65  eviously returne
1d360 64 20 62 79 20 5b 67 65 74 44 62 43 6f 6e 6e 65  d by [getDbConne
1d370 63 74 69 6f 6e 5d 0d 0a 20 20 20 20 20 20 20 20  ction]..        
1d380 23 20 20 20 20 20 20 20 73 68 6f 75 6c 64 20 62  #       should b
1d390 65 20 73 74 6f 72 65 64 20 74 68 65 72 65 2e 0d  e stored there..
1d3a0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
1d3b0 20 20 20 20 75 70 76 61 72 20 31 20 24 76 61 72      upvar 1 $var
1d3c0 4e 61 6d 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0d  Name connection.
1d3d0 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  ...        if {[
1d3e0 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
1d3f0 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65     object invoke
1d400 20 24 63 6f 6e 6e 65 63 74 69 6f 6e 20 52 65 6c   $connection Rel
1d410 65 61 73 65 4d 65 6d 6f 72 79 0d 0a 20 20 20 20  easeMemory..    
1d420 20 20 20 20 7d 20 72 65 73 75 6c 74 5d 7d 20 74      } result]} t
1d430 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1d440 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
1d450 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
1d460 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
1d470 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
1d480 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
1d490 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52         "==== WAR
1d4a0 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20  NING: failed to 
1d4b0 72 65 6c 65 61 73 65 20 64 61 74 61 62 61 73 65  release database
1d4c0 20 6d 65 6d 6f 72 79 2c 20 65 72 72 6f 72 3a 20   memory, error: 
1d4d0 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
1d4e0 20 20 20 20 20 5c 6e 5c 74 20 24 72 65 73 75 6c       \n\t $resul
1d4f0 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  t \n]..         
1d500 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20   }..        }.. 
1d510 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
1d520 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 5b 69 6e  if {[llength [in
1d530 66 6f 20 63 6f 6d 6d 61 6e 64 73 20 64 65 62 75  fo commands debu
1d540 67 5d 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  g]] > 0} then {.
1d550 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61  .        if {[ca
1d560 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
1d570 20 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74   uplevel 1 [list
1d580 20 64 65 62 75 67 20 70 75 72 67 65 5d 0d 0a 20   debug purge].. 
1d590 20 20 20 20 20 20 20 7d 20 72 65 73 75 6c 74 5d         } result]
1d5a0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1d5b0 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
1d5c0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1d5d0 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
1d5e0 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
1d5f0 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
1d600 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20            "==== 
1d610 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20  WARNING: failed 
1d620 74 6f 20 70 75 72 67 65 20 63 61 6c 6c 20 66 72  to purge call fr
1d630 61 6d 65 2c 20 65 72 72 6f 72 3a 20 22 20 5c 0d  ame, error: " \.
1d640 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1d650 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e   \n\t $result \n
1d660 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ]..          }..
1d670 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
1d680 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
1d690 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 75 70 6c  {..          upl
1d6a0 65 76 65 6c 20 31 20 5b 6c 69 73 74 20 64 65 62  evel 1 [list deb
1d6b0 75 67 20 63 6c 65 61 6e 75 70 5d 0d 0a 20 20 20  ug cleanup]..   
1d6c0 20 20 20 20 20 7d 20 72 65 73 75 6c 74 5d 7d 20       } result]} 
1d6d0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1d6e0 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
1d6f0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1d700 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
1d710 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
1d720 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
1d730 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41          "==== WA
1d740 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f  RNING: failed to
1d750 20 63 6c 65 61 6e 75 70 20 69 6e 74 65 72 70 72   cleanup interpr
1d760 65 74 65 72 2c 20 65 72 72 6f 72 3a 20 22 20 5c  eter, error: " \
1d770 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1d780 20 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c    \n\t $result \
1d790 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  n]..          }.
1d7a0 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
1d7b0 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
1d7c0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 75 70   {..          up
1d7d0 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74 20 64 65  level 1 [list de
1d7e0 62 75 67 20 63 6f 6c 6c 65 63 74 5d 0d 0a 20 20  bug collect]..  
1d7f0 20 20 20 20 20 20 7d 20 72 65 73 75 6c 74 5d 7d        } result]}
1d800 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1d810 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
1d820 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1d830 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
1d840 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
1d850 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
1d860 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57           "==== W
1d870 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74  ARNING: failed t
1d880 6f 20 63 6f 6c 6c 65 63 74 20 67 61 72 62 61 67  o collect garbag
1d890 65 2c 20 65 72 72 6f 72 3a 20 22 20 5c 0d 0a 20  e, error: " \.. 
1d8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
1d8b0 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d  n\t $result \n].
1d8c0 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
1d8d0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
1d8e0 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
1d8f0 70 72 6f 63 20 73 65 74 75 70 4d 65 6d 6f 72 79  proc setupMemory
1d900 43 6f 75 6e 74 65 72 73 20 7b 20 76 61 72 4e 61  Counters { varNa
1d910 6d 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66  me } {..      if
1d920 20 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f 62 6a   {[haveSQLiteObj
1d930 65 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65  ectCommand]} the
1d940 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 75 70 76  n {..        upv
1d950 61 72 20 31 20 24 76 61 72 4e 61 6d 65 20 63 6f  ar 1 $varName co
1d960 75 6e 74 65 72 0d 0a 0d 0a 20 20 20 20 20 20 20  unter....       
1d970 20 73 65 74 20 63 6f 75 6e 74 65 72 28 31 29 20   set counter(1) 
1d980 5b 6f 62 6a 65 63 74 20 63 72 65 61 74 65 20 2d  [object create -
1d990 61 6c 69 61 73 20 5c 0d 0a 20 20 20 20 20 20 20  alias \..       
1d9a0 20 20 20 20 20 53 79 73 74 65 6d 2e 44 69 61 67       System.Diag
1d9b0 6e 6f 73 74 69 63 73 2e 50 65 72 66 6f 72 6d 61  nostics.Performa
1d9c0 6e 63 65 43 6f 75 6e 74 65 72 20 50 72 6f 63 65  nceCounter Proce
1d9d0 73 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ss \..          
1d9e0 20 20 22 57 6f 72 6b 69 6e 67 20 53 65 74 22 20    "Working Set" 
1d9f0 5b 66 69 6c 65 20 72 6f 6f 74 6e 61 6d 65 20 5b  [file rootname [
1da00 66 69 6c 65 20 74 61 69 6c 20 24 3a 3a 62 69 6e  file tail $::bin
1da10 5f 66 69 6c 65 5d 5d 5d 0d 0a 0d 0a 20 20 20 20  _file]]]....    
1da20 20 20 20 20 73 65 74 20 63 6f 75 6e 74 65 72 28      set counter(
1da30 32 29 20 5b 6f 62 6a 65 63 74 20 63 72 65 61 74  2) [object creat
1da40 65 20 2d 61 6c 69 61 73 20 5c 0d 0a 20 20 20 20  e -alias \..    
1da50 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44          System.D
1da60 69 61 67 6e 6f 73 74 69 63 73 2e 50 65 72 66 6f  iagnostics.Perfo
1da70 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72 20 50 72  rmanceCounter Pr
1da80 6f 63 65 73 73 20 5c 0d 0a 20 20 20 20 20 20 20  ocess \..       
1da90 20 20 20 20 20 22 57 6f 72 6b 69 6e 67 20 53 65       "Working Se
1daa0 74 20 50 65 61 6b 22 20 5b 66 69 6c 65 20 72 6f  t Peak" [file ro
1dab0 6f 74 6e 61 6d 65 20 5b 66 69 6c 65 20 74 61 69  otname [file tai
1dac0 6c 20 24 3a 3a 62 69 6e 5f 66 69 6c 65 5d 5d 5d  l $::bin_file]]]
1dad0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20  ....        set 
1dae0 63 6f 75 6e 74 65 72 28 33 29 20 5b 6f 62 6a 65  counter(3) [obje
1daf0 63 74 20 63 72 65 61 74 65 20 2d 61 6c 69 61 73  ct create -alias
1db00 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1db10 53 79 73 74 65 6d 2e 44 69 61 67 6e 6f 73 74 69  System.Diagnosti
1db20 63 73 2e 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f  cs.PerformanceCo
1db30 75 6e 74 65 72 20 50 72 6f 63 65 73 73 20 5c 0d  unter Process \.
1db40 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 50 72  .            "Pr
1db50 69 76 61 74 65 20 42 79 74 65 73 22 20 5b 66 69  ivate Bytes" [fi
1db60 6c 65 20 72 6f 6f 74 6e 61 6d 65 20 5b 66 69 6c  le rootname [fil
1db70 65 20 74 61 69 6c 20 24 3a 3a 62 69 6e 5f 66 69  e tail $::bin_fi
1db80 6c 65 5d 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a  le]]]..      }..
1db90 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 22  ..      return "
1dba0 22 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  "..    }.....   
1dbb0 20 70 72 6f 63 20 72 65 70 6f 72 74 4d 65 6d 6f   proc reportMemo
1dbc0 72 79 43 6f 75 6e 74 65 72 73 20 7b 20 63 68 61  ryCounters { cha
1dbd0 6e 6e 65 6c 20 76 61 72 4e 61 6d 65 20 70 72 65  nnel varName pre
1dbe0 66 69 78 20 7d 20 7b 0d 0a 20 20 20 20 20 20 69  fix } {..      i
1dbf0 66 20 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f 62  f {[haveSQLiteOb
1dc00 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68  jectCommand]} th
1dc10 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 75 70  en {..        up
1dc20 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65 20 63  var 1 $varName c
1dc30 6f 75 6e 74 65 72 0d 0a 0d 0a 20 20 20 20 20 20  ounter....      
1dc40 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
1dc50 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
1dc60 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
1dc70 2d 20 22 20 24 70 72 65 66 69 78 20 22 20 63 6f  - " $prefix " co
1dc80 75 6e 74 65 72 20 5c 22 22 20 5c 0d 0a 20 20 20  unter \"" \..   
1dc90 20 20 20 20 20 20 20 20 20 5b 6f 62 6a 65 63 74           [object
1dca0 20 69 6e 76 6f 6b 65 20 24 63 6f 75 6e 74 65 72   invoke $counter
1dcb0 28 31 29 20 43 6f 75 6e 74 65 72 4e 61 6d 65 5d  (1) CounterName]
1dcc0 20 22 5c 22 20 76 61 6c 75 65 20 69 73 20 22 20   "\" value is " 
1dcd0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
1dce0 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 24 63  object invoke $c
1dcf0 6f 75 6e 74 65 72 28 31 29 20 52 61 77 56 61 6c  ounter(1) RawVal
1dd00 75 65 5d 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20  ue] \n]....     
1dd10 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
1dd20 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
1dd30 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d  .            "--
1dd40 2d 2d 20 22 20 24 70 72 65 66 69 78 20 22 20 63  -- " $prefix " c
1dd50 6f 75 6e 74 65 72 20 5c 22 22 20 5c 0d 0a 20 20  ounter \"" \..  
1dd60 20 20 20 20 20 20 20 20 20 20 5b 6f 62 6a 65 63            [objec
1dd70 74 20 69 6e 76 6f 6b 65 20 24 63 6f 75 6e 74 65  t invoke $counte
1dd80 72 28 32 29 20 43 6f 75 6e 74 65 72 4e 61 6d 65  r(2) CounterName
1dd90 5d 20 22 5c 22 20 76 61 6c 75 65 20 69 73 20 22  ] "\" value is "
1dda0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1ddb0 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 24  [object invoke $
1ddc0 63 6f 75 6e 74 65 72 28 32 29 20 52 61 77 56 61  counter(2) RawVa
1ddd0 6c 75 65 5d 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20  lue] \n]....    
1dde0 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
1ddf0 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
1de00 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d  ..            "-
1de10 2d 2d 2d 20 22 20 24 70 72 65 66 69 78 20 22 20  --- " $prefix " 
1de20 63 6f 75 6e 74 65 72 20 5c 22 22 20 5c 0d 0a 20  counter \"" \.. 
1de30 20 20 20 20 20 20 20 20 20 20 20 5b 6f 62 6a 65             [obje
1de40 63 74 20 69 6e 76 6f 6b 65 20 24 63 6f 75 6e 74  ct invoke $count
1de50 65 72 28 33 29 20 43 6f 75 6e 74 65 72 4e 61 6d  er(3) CounterNam
1de60 65 5d 20 22 5c 22 20 76 61 6c 75 65 20 69 73 20  e] "\" value is 
1de70 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
1de80 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20   [object invoke 
1de90 24 63 6f 75 6e 74 65 72 28 33 29 20 52 61 77 56  $counter(3) RawV
1dea0 61 6c 75 65 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20  alue] \n]..     
1deb0 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
1dec0 20 20 70 72 6f 63 20 63 6f 6c 6c 65 63 74 47 61    proc collectGa
1ded0 72 62 61 67 65 20 7b 20 63 68 61 6e 6e 65 6c 20  rbage { channel 
1dee0 7b 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 31 30  {milliseconds 10
1def0 30 30 7d 20 7b 71 75 69 65 74 20 74 72 75 65 7d  00} {quiet true}
1df00 20 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b   } {..      if {
1df10 5b 68 61 76 65 53 51 4c 69 74 65 4f 62 6a 65 63  [haveSQLiteObjec
1df20 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65 6e 20  tCommand]} then 
1df30 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  {..        if {[
1df40 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
1df50 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65     object invoke
1df60 20 47 43 20 47 65 74 54 6f 74 61 6c 4d 65 6d 6f   GC GetTotalMemo
1df70 72 79 20 66 61 6c 73 65 0d 0a 20 20 20 20 20 20  ry false..      
1df80 20 20 7d 20 72 65 73 75 6c 74 5d 20 3d 3d 20 30    } result] == 0
1df90 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1dfa0 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
1dfb0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1dfc0 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
1dfd0 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
1dfe0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1dff0 20 20 20 22 2d 2d 2d 2d 20 6d 65 6d 6f 72 79 20     "---- memory 
1e000 69 6e 20 75 73 65 20 62 79 20 74 68 65 20 43 4c  in use by the CL
1e010 52 20 62 65 66 6f 72 65 20 63 6f 6c 6c 65 63 74  R before collect
1e020 69 6f 6e 2e 2e 2e 20 22 20 5c 0d 0a 20 20 20 20  ion... " \..    
1e030 20 20 20 20 20 20 20 20 20 20 20 20 24 72 65 73              $res
1e040 75 6c 74 20 22 20 62 79 74 65 73 5c 6e 22 5d 0d  ult " bytes\n"].
1e050 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
1e060 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
1e070 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24            if {!$
1e080 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
1e090 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
1e0a0 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
1e0b0 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
1e0c0 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57           "==== W
1e0d0 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74  ARNING: failed t
1e0e0 6f 20 67 65 74 20 43 4c 52 20 6d 65 6d 6f 72 79  o get CLR memory
1e0f0 20 75 73 61 67 65 2c 20 65 72 72 6f 72 3a 20 22   usage, error: "
1e100 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1e110 20 20 20 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74      \n\t $result
1e120 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \n]..          
1e130 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  }..        }..  
1e140 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
1e150 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1e160 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1e170 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1e180 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1e190 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20 20 20  ########....    
1e1a0 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
1e1b0 45 3a 20 52 65 70 65 61 74 65 64 6c 79 20 61 74  E: Repeatedly at
1e1c0 74 65 6d 70 74 20 74 6f 20 63 6f 6c 6c 65 63 74  tempt to collect
1e1d0 20 67 61 72 62 61 67 65 20 75 6e 74 69 6c 20 74   garbage until t
1e1e0 68 65 20 61 6c 6c 6f 74 74 65 64 20 6e 75 6d 62  he allotted numb
1e1f0 65 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  er..      #     
1e200 20 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64    of millisecond
1e210 73 20 68 61 73 20 65 6c 61 70 73 65 64 2e 20 20  s has elapsed.  
1e220 41 6c 77 61 79 73 20 61 74 74 65 6d 70 74 20 74  Always attempt t
1e230 6f 20 63 6f 6c 6c 65 63 74 20 67 61 72 62 61 67  o collect garbag
1e240 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
1e250 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 2e 0d   at least once..
1e260 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
1e270 69 66 20 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f  if {[haveSQLiteO
1e280 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74  bjectCommand]} t
1e290 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 73  hen {..        s
1e2a0 65 74 20 73 74 61 72 74 20 5b 63 6c 6f 63 6b 20  et start [clock 
1e2b0 73 65 63 6f 6e 64 73 5d 0d 0a 20 20 20 20 20 20  seconds]..      
1e2c0 20 20 73 65 74 20 73 74 6f 70 20 5b 65 78 70 72    set stop [expr
1e2d0 20 7b 24 73 74 61 72 74 20 2b 20 28 24 6d 69 6c   {$start + ($mil
1e2e0 6c 69 73 65 63 6f 6e 64 73 20 2f 20 31 30 30 30  liseconds / 1000
1e2f0 29 7d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 64  )}]....        d
1e300 6f 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23  o {..          #
1e310 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
1e320 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 66  TE: Attempt to f
1e330 6f 72 63 65 20 61 20 66 75 6c 6c 20 67 61 72 62  orce a full garb
1e340 61 67 65 20 63 6f 6c 6c 65 63 74 69 6f 6e 20 6e  age collection n
1e350 6f 77 2e 20 20 52 65 70 6f 72 74 20 61 6e 79 0d  ow.  Report any.
1e360 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20  .          #    
1e370 20 20 20 65 72 72 6f 72 20 74 68 61 74 20 69 73     error that is
1e380 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 66 20   encountered if 
1e390 77 65 20 66 61 69 6c 2e 0d 0a 20 20 20 20 20 20  we fail...      
1e3a0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
1e3b0 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
1e3c0 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63             objec
1e3d0 74 20 69 6e 76 6f 6b 65 20 47 43 20 47 65 74 54  t invoke GC GetT
1e3e0 6f 74 61 6c 4d 65 6d 6f 72 79 20 74 72 75 65 0d  otalMemory true.
1e3f0 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 72 72  .          } err
1e400 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  or]} then {..   
1e410 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71           if {!$q
1e420 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
1e430 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
1e440 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
1e450 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
1e460 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d              "===
1e470 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65  = WARNING: faile
1e480 64 20 66 75 6c 6c 20 67 61 72 62 61 67 65 20 63  d full garbage c
1e490 6f 6c 6c 65 63 74 69 6f 6e 2c 20 65 72 72 6f 72  ollection, error
1e4a0 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  : " \..         
1e4b0 20 20 20 20 20 20 20 20 20 5c 6e 5c 74 20 24 65           \n\t $e
1e4c0 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  rror \n]..      
1e4d0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
1e4e0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
1e4f0 20 20 73 65 74 20 6e 6f 77 20 5b 63 6c 6f 63 6b    set now [clock
1e500 20 73 65 63 6f 6e 64 73 5d 0d 0a 20 20 20 20 20   seconds]..     
1e510 20 20 20 7d 20 77 68 69 6c 65 20 7b 24 73 74 61     } while {$sta
1e520 72 74 20 3c 3d 20 24 6e 6f 77 20 26 26 20 24 6e  rt <= $now && $n
1e530 6f 77 20 3c 20 24 73 74 6f 70 7d 0d 0a 20 20 20  ow < $stop}..   
1e540 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 23     }....      ##
1e550 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1e560 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1e570 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1e580 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1e590 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20 20 20 20  #######....     
1e5a0 20 69 66 20 7b 5b 68 61 76 65 53 51 4c 69 74 65   if {[haveSQLite
1e5b0 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20  ObjectCommand]} 
1e5c0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1e5d0 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20  if {[catch {..  
1e5e0 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69          object i
1e5f0 6e 76 6f 6b 65 20 47 43 20 47 65 74 54 6f 74 61  nvoke GC GetTota
1e600 6c 4d 65 6d 6f 72 79 20 66 61 6c 73 65 0d 0a 20  lMemory false.. 
1e610 20 20 20 20 20 20 20 7d 20 72 65 73 75 6c 74 5d         } result]
1e620 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
1e630 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71           if {!$q
1e640 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
1e650 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
1e660 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
1e670 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
1e680 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6d 65          "---- me
1e690 6d 6f 72 79 20 69 6e 20 75 73 65 20 62 79 20 74  mory in use by t
1e6a0 68 65 20 43 4c 52 20 61 66 74 65 72 20 63 6f 6c  he CLR after col
1e6b0 6c 65 63 74 69 6f 6e 2e 2e 2e 20 22 20 5c 0d 0a  lection... " \..
1e6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e6d0 24 72 65 73 75 6c 74 20 22 20 62 79 74 65 73 5c  $result " bytes\
1e6e0 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  n"]..          }
1e6f0 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65  ..        } else
1e700 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   {..          if
1e710 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
1e720 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
1e730 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
1e740 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
1e750 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d               "==
1e760 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c  == WARNING: fail
1e770 65 64 20 74 6f 20 67 65 74 20 43 4c 52 20 6d 65  ed to get CLR me
1e780 6d 6f 72 79 20 75 73 61 67 65 2c 20 65 72 72 6f  mory usage, erro
1e790 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20  r: " \..        
1e7a0 20 20 20 20 20 20 20 20 5c 6e 5c 74 20 24 72 65          \n\t $re
1e7b0 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  sult \n]..      
1e7c0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
1e7d0 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
1e7e0 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65  .....    proc ge
1e7f0 74 53 51 4c 69 74 65 48 61 6e 64 6c 65 43 6f 75  tSQLiteHandleCou
1e800 6e 74 73 20 7b 20 63 68 61 6e 6e 65 6c 20 7b 71  nts { channel {q
1e810 75 69 65 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d  uiet false} } {.
1e820 0a 20 20 20 20 20 20 73 65 74 20 72 65 73 75 6c  .      set resul
1e830 74 20 5b 6c 69 73 74 5d 0d 0a 0d 0a 20 20 20 20  t [list]....    
1e840 20 20 69 66 20 7b 5b 68 61 76 65 53 51 4c 69 74    if {[haveSQLit
1e850 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d 20  eObjectCommand] 
1e860 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
1e870 5b 68 61 76 65 53 51 4c 69 74 65 44 65 66 69 6e  [haveSQLiteDefin
1e880 65 43 6f 6e 73 74 61 6e 74 20 43 4f 55 4e 54 5f  eConstant COUNT_
1e890 48 41 4e 44 4c 45 5d 7d 20 74 68 65 6e 20 7b 0d  HANDLE]} then {.
1e8a0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
1e8b0 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 64 64 20      # NOTE: Add 
1e8c0 65 61 63 68 20 63 72 69 74 69 63 61 6c 20 68 61  each critical ha
1e8d0 6e 64 6c 65 20 63 6f 75 6e 74 20 74 6f 20 74 68  ndle count to th
1e8e0 65 20 72 65 73 75 6c 74 69 6e 67 20 6c 69 73 74  e resulting list
1e8f0 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
1e900 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 6e 61        foreach na
1e910 6d 65 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20  me [list \..    
1e920 20 20 20 20 20 20 20 20 63 6f 6e 6e 65 63 74 69          connecti
1e930 6f 6e 43 6f 75 6e 74 20 73 74 61 74 65 6d 65 6e  onCount statemen
1e940 74 43 6f 75 6e 74 20 62 61 63 6b 75 70 43 6f 75  tCount backupCou
1e950 6e 74 20 62 6c 6f 62 43 6f 75 6e 74 5d 20 7b 0d  nt blobCount] {.
1e960 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b  .          if {[
1e970 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
1e980 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f       object invo
1e990 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75  ke -flags +NonPu
1e9a0 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20  blic \..        
1e9b0 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44          System.D
1e9c0 61 74 61 2e 53 51 4c 69 74 65 2e 44 65 62 75 67  ata.SQLite.Debug
1e9d0 44 61 74 61 20 24 6e 61 6d 65 0d 0a 20 20 20 20  Data $name..    
1e9e0 20 20 20 20 20 20 7d 20 76 61 6c 75 65 5d 20 3d        } value] =
1e9f0 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
1ea00 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71           if {!$q
1ea10 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
1ea20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
1ea30 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
1ea40 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
1ea50 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
1ea60 2d 20 63 72 69 74 69 63 61 6c 20 68 61 6e 64 6c  - critical handl
1ea70 65 20 63 6f 75 6e 74 20 5c 22 22 20 24 6e 61 6d  e count \"" $nam
1ea80 65 20 22 5c 22 20 69 73 20 22 20 24 76 61 6c 75  e "\" is " $valu
1ea90 65 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  e \n]..         
1eaa0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
1eab0 20 20 20 20 6c 61 70 70 65 6e 64 20 72 65 73 75      lappend resu
1eac0 6c 74 20 24 76 61 6c 75 65 0d 0a 20 20 20 20 20  lt $value..     
1ead0 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
1eae0 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
1eaf0 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
1eb00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70                tp
1eb10 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
1eb20 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
1eb30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d                "=
1eb40 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69  === WARNING: fai
1eb50 6c 65 64 20 74 6f 20 67 65 74 20 63 72 69 74 69  led to get criti
1eb60 63 61 6c 20 68 61 6e 64 6c 65 20 63 6f 75 6e 74  cal handle count
1eb70 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20   \"" \..        
1eb80 20 20 20 20 20 20 20 20 20 20 24 6e 61 6d 65 20            $name 
1eb90 22 5c 22 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e  "\", error: " \n
1eba0 5c 74 20 24 76 61 6c 75 65 20 5c 6e 5d 0d 0a 20  \t $value \n].. 
1ebb0 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
1ebc0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
1ebd0 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c     }..      } el
1ebe0 73 65 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74  seif {!$quiet} t
1ebf0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
1ec00 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
1ec10 3a 20 54 68 65 20 61 63 74 75 61 6c 20 68 61 6e  : The actual han
1ec20 64 6c 65 20 63 6f 75 6e 74 73 20 61 72 65 20 6e  dle counts are n
1ec30 6f 74 20 61 76 61 69 6c 61 62 6c 65 3b 20 74 68  ot available; th
1ec40 65 72 65 66 6f 72 65 2c 20 6a 75 73 74 0d 0a 20  erefore, just.. 
1ec50 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 72         #       r
1ec60 65 74 75 72 6e 20 61 6e 20 65 6d 70 74 79 20 6c  eturn an empty l
1ec70 69 73 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ist...        #.
1ec80 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
1ec90 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 72  channel "---- cr
1eca0 69 74 69 63 61 6c 20 68 61 6e 64 6c 65 20 63 6f  itical handle co
1ecb0 75 6e 74 73 20 75 6e 61 76 61 69 6c 61 62 6c 65  unts unavailable
1ecc0 5c 6e 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  \n"..      }....
1ecd0 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 72 65        return $re
1ece0 73 75 6c 74 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  sult..    }.....
1ecf0 20 20 20 20 70 72 6f 63 20 73 68 75 74 64 6f 77      proc shutdow
1ed00 6e 53 51 4c 69 74 65 20 7b 20 63 68 61 6e 6e 65  nSQLite { channe
1ed10 6c 20 7b 66 6f 72 63 65 20 66 61 6c 73 65 7d 20  l {force false} 
1ed20 7b 71 75 69 65 74 20 66 61 6c 73 65 7d 20 7d 20  {quiet false} } 
1ed30 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
1ed40 20 20 23 20 4e 4f 54 45 3a 20 4d 61 6b 65 20 73    # NOTE: Make s
1ed50 75 72 65 20 74 68 61 74 20 53 51 4c 69 74 65 20  ure that SQLite 
1ed60 63 6f 72 65 20 6c 69 62 72 61 72 79 20 69 73 20  core library is 
1ed70 63 6f 6d 70 6c 65 74 65 6c 79 20 73 68 75 74 64  completely shutd
1ed80 6f 77 6e 2e 20 20 54 68 69 73 0d 0a 20 20 20 20  own.  This..    
1ed90 20 20 23 20 20 20 20 20 20 20 69 73 20 75 73 65    #       is use
1eda0 64 20 62 79 20 74 65 73 74 73 20 74 68 61 74 20  d by tests that 
1edb0 63 68 61 6e 67 65 20 63 6f 6e 66 69 67 75 72 61  change configura
1edc0 74 69 6f 6e 20 6f 70 74 69 6f 6e 73 20 61 6e 64  tion options and
1edd0 2f 6f 72 20 74 68 6f 73 65 0d 0a 20 20 20 20 20  /or those..     
1ede0 20 23 20 20 20 20 20 20 20 74 68 61 74 20 6e 65   #       that ne
1edf0 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ed to make sure 
1ee00 6c 6f 67 67 69 6e 67 20 69 73 20 69 6e 69 74 69  logging is initi
1ee10 61 6c 69 7a 65 64 20 28 69 2e 65 2e 20 6a 75 73  alized (i.e. jus
1ee20 74 20 69 6e 20 63 61 73 65 0d 0a 20 20 20 20 20  t in case..     
1ee30 20 23 20 20 20 20 20 20 20 74 68 65 20 53 51 4c   #       the SQL
1ee40 69 74 65 20 63 6f 72 65 20 6c 69 62 72 61 72 79  ite core library
1ee50 20 77 61 73 20 69 6e 69 74 69 61 6c 69 7a 65 64   was initialized
1ee60 20 69 6e 20 74 68 65 20 70 72 6f 63 65 73 73 20   in the process 
1ee70 70 72 69 6f 72 20 74 6f 0d 0a 20 20 20 20 20 20  prior to..      
1ee80 23 20 20 20 20 20 20 20 74 68 65 20 53 51 4c 69  #       the SQLi
1ee90 74 65 4c 6f 67 20 63 6c 61 73 73 20 62 65 69 6e  teLog class bein
1eea0 67 20 61 62 6c 65 20 74 6f 20 73 65 74 75 70 20  g able to setup 
1eeb0 69 74 73 20 6c 6f 67 67 69 6e 67 20 63 61 6c 6c  its logging call
1eec0 62 61 63 6b 29 2e 0d 0a 20 20 20 20 20 20 23 20  back)...      # 
1eed0 20 20 20 20 20 20 4e 6f 72 6d 61 6c 6c 79 2c 20        Normally, 
1eee0 74 68 69 73 20 73 68 6f 75 6c 64 20 6f 6e 6c 79  this should only
1eef0 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20 69 66   be performed if
1ef00 20 53 51 4c 69 74 65 20 69 73 20 6c 6f 61 64 65   SQLite is loade
1ef10 64 20 61 6e 64 0d 0a 20 20 20 20 20 20 23 20 20  d and..      #  
1ef20 20 20 20 20 20 72 65 61 64 79 20 66 6f 72 20 75       ready for u
1ef30 73 65 20 62 79 20 74 68 65 20 74 65 73 74 20 73  se by the test s
1ef40 75 69 74 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  uite...      #..
1ef50 20 20 20 20 20 20 69 66 20 7b 24 66 6f 72 63 65        if {$force
1ef60 20 7c 7c 20 5b 69 73 53 51 4c 69 74 65 52 65 61   || [isSQLiteRea
1ef70 64 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  dy]} then {..   
1ef80 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1ef90 23 20 42 55 47 46 49 58 3a 20 4d 61 6b 65 20 73  # BUGFIX: Make s
1efa0 75 72 65 20 74 68 61 74 20 61 6e 79 20 22 6c 65  ure that any "le
1efb0 61 6b 65 64 22 20 74 72 61 6e 73 61 63 74 69 6f  aked" transactio
1efc0 6e 73 20 61 6e 64 2f 6f 72 20 63 6f 6e 6e 65 63  ns and/or connec
1efd0 74 69 6f 6e 73 0d 0a 20 20 20 20 20 20 20 20 23  tions..        #
1efe0 20 20 20 20 20 20 20 20 20 61 72 65 20 63 6c 65           are cle
1eff0 61 6e 65 64 20 75 70 20 62 65 66 6f 72 65 20 63  aned up before c
1f000 61 6c 6c 69 6e 67 20 74 68 65 20 6e 61 74 69 76  alling the nativ
1f010 65 20 73 68 75 74 64 6f 77 6e 20 66 75 6e 63 74  e shutdown funct
1f020 69 6f 6e 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ion...        #.
1f030 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68  .        foreach
1f040 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 5b 69 6e   transaction [in
1f050 66 6f 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 5d  fo transactions]
1f060 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   {..          if
1f070 20 7b 5b 73 74 72 69 6e 67 20 6d 61 74 63 68 20   {[string match 
1f080 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1f090 20 53 79 73 74 65 6d 23 44 61 74 61 23 53 51 4c   System#Data#SQL
1f0a0 69 74 65 23 53 51 4c 69 74 65 54 72 61 6e 73 61  ite#SQLiteTransa
1f0b0 63 74 69 6f 6e 23 2a 20 24 74 72 61 6e 73 61 63  ction#* $transac
1f0c0 74 69 6f 6e 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  tion]} then {.. 
1f0d0 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b             if {[
1f0e0 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
1f0f0 20 20 20 20 20 20 20 73 71 6c 20 74 72 61 6e 73         sql trans
1f100 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 20  action rollback 
1f110 24 74 72 61 6e 73 61 63 74 69 6f 6e 0d 0a 20 20  $transaction..  
1f120 20 20 20 20 20 20 20 20 20 20 7d 20 65 72 72 6f            } erro
1f130 72 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  r] == 0} then {.
1f140 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
1f150 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
1f160 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1f170 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
1f180 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
1f190 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1f1a0 20 20 20 20 20 20 22 2d 2d 2d 2d 20 72 6f 6c 6c        "---- roll
1f1b0 65 64 20 62 61 63 6b 20 6c 65 61 6b 65 64 20 74  ed back leaked t
1f1c0 72 61 6e 73 61 63 74 69 6f 6e 20 5c 22 22 20 5c  ransaction \"" \
1f1d0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1f1e0 20 20 20 20 20 20 24 74 72 61 6e 73 61 63 74 69        $transacti
1f1f0 6f 6e 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20  on \"\n]..      
1f200 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
1f210 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
1f220 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
1f230 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
1f240 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1f250 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
1f260 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
1f270 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1f280 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e        "==== WARN
1f290 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 72  ING: failed to r
1f2a0 6f 6c 6c 62 61 63 6b 20 6c 65 61 6b 65 64 20 74  ollback leaked t
1f2b0 72 61 6e 73 61 63 74 69 6f 6e 20 5c 22 22 20 5c  ransaction \"" \
1f2c0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1f2d0 20 20 20 20 20 20 24 74 72 61 6e 73 61 63 74 69        $transacti
1f2e0 6f 6e 20 22 5c 22 2c 20 65 72 72 6f 72 3a 20 22  on "\", error: "
1f2f0 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d   \n\t $error \n]
1f300 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1f310 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  }..            }
1f320 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
1f330 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
1f340 20 20 20 20 66 6f 72 65 61 63 68 20 64 62 20 5b      foreach db [
1f350 69 6e 66 6f 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  info connections
1f360 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69  ] {..          i
1f370 66 20 7b 5b 73 74 72 69 6e 67 20 6d 61 74 63 68  f {[string match
1f380 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1f390 20 20 53 79 73 74 65 6d 23 44 61 74 61 23 53 51    System#Data#SQ
1f3a0 4c 69 74 65 23 53 51 4c 69 74 65 43 6f 6e 6e 65  Lite#SQLiteConne
1f3b0 63 74 69 6f 6e 23 2a 20 24 64 62 5d 7d 20 74 68  ction#* $db]} th
1f3c0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
1f3d0 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 73 71    if {[catch {sq
1f3e0 6c 20 63 6c 6f 73 65 20 24 64 62 7d 20 65 72 72  l close $db} err
1f3f0 6f 72 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  or] == 0} then {
1f400 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1f410 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
1f420 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
1f430 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
1f440 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
1f450 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1f460 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6c 6f         "---- clo
1f470 73 65 64 20 6c 65 61 6b 65 64 20 64 61 74 61 62  sed leaked datab
1f480 61 73 65 20 5c 22 22 20 24 64 62 20 5c 22 5c 6e  ase \"" $db \"\n
1f490 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ]..             
1f4a0 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
1f4b0 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
1f4c0 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
1f4d0 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
1f4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
1f4f0 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
1f500 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
1f510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1f520 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61  ==== WARNING: fa
1f530 69 6c 65 64 20 74 6f 20 63 6c 6f 73 65 20 6c 65  iled to close le
1f540 61 6b 65 64 20 64 61 74 61 62 61 73 65 20 5c 22  aked database \"
1f550 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
1f560 20 20 20 20 20 20 20 20 20 24 64 62 20 22 5c 22           $db "\"
1f570 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20  , error: " \n\t 
1f580 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20  $error \n]..    
1f590 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
1f5a0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
1f5b0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
1f5c0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d   }....        #.
1f5d0 0a 20 20 20 20 20 20 20 20 23 20 42 55 47 46 49  .        # BUGFI
1f5e0 58 3a 20 42 65 66 6f 72 65 20 63 61 6c 6c 69 6e  X: Before callin
1f5f0 67 20 74 68 65 20 6e 61 74 69 76 65 20 73 68 75  g the native shu
1f600 74 64 6f 77 6e 20 66 75 6e 63 74 69 6f 6e 2c 20  tdown function, 
1f610 6d 61 6b 65 20 73 75 72 65 20 62 6f 74 68 0d 0a  make sure both..
1f620 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
1f630 20 20 6f 66 20 74 68 65 20 50 52 41 47 4d 41 20    of the PRAGMA 
1f640 72 65 6c 61 74 65 64 20 64 69 72 65 63 74 6f 72  related director
1f650 79 20 6e 61 6d 65 73 20 61 72 65 20 66 72 65 65  y names are free
1f660 64 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  d...        #.. 
1f670 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53         checkForS
1f680 51 4c 69 74 65 44 69 72 65 63 74 6f 72 69 65 73  QLiteDirectories
1f690 20 24 63 68 61 6e 6e 65 6c 20 74 72 75 65 0d 0a   $channel true..
1f6a0 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63  ..        if {[c
1f6b0 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
1f6c0 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20    object invoke 
1f6d0 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69  -flags +NonPubli
1f6e0 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  c \..           
1f6f0 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53     System.Data.S
1f700 51 4c 69 74 65 2e 55 6e 73 61 66 65 4e 61 74 69  QLite.UnsafeNati
1f710 76 65 4d 65 74 68 6f 64 73 20 73 71 6c 69 74 65  veMethods sqlite
1f720 33 5f 73 68 75 74 64 6f 77 6e 0d 0a 20 20 20 20  3_shutdown..    
1f730 20 20 20 20 7d 20 72 65 73 75 6c 74 5d 20 3d 3d      } result] ==
1f740 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
1f750 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
1f760 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
1f770 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
1f780 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
1f790 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
1f7a0 20 20 20 20 20 22 2d 2d 2d 2d 20 63 61 6c 6c 20       "---- call 
1f7b0 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e  sqlite3_shutdown
1f7c0 28 29 2e 2e 2e 20 6f 6b 3a 20 22 20 24 72 65 73  ()... ok: " $res
1f7d0 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ult \n]..       
1f7e0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20     }..        } 
1f7f0 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
1f800 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
1f810 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1f820 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
1f830 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
1f840 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f850 20 22 2d 2d 2d 2d 20 63 61 6c 6c 20 73 71 6c 69   "---- call sqli
1f860 74 65 33 5f 73 68 75 74 64 6f 77 6e 28 29 2e 2e  te3_shutdown()..
1f870 2e 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20  . error: " \n\t 
1f880 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20  $result \n]..   
1f890 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1f8a0 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20    }..      }..  
1f8b0 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
1f8c0 20 67 65 74 53 65 74 74 69 6e 67 52 65 61 64 43   getSettingReadC
1f8d0 6f 75 6e 74 20 7b 20 6e 61 6d 65 20 7b 76 69 61  ount { name {via
1f8e0 46 69 6c 65 20 66 61 6c 73 65 7d 20 7d 20 7b 0d  File false} } {.
1f8f0 0a 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65  .      if {[have
1f900 43 6f 6e 73 74 72 61 69 6e 74 20 62 75 69 6c 64  Constraint build
1f910 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 44 65  Configuration.De
1f920 62 75 67 5d 20 26 26 20 5b 63 61 74 63 68 20 7b  bug] && [catch {
1f930 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74  ..        object
1f940 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b   invoke -flags +
1f950 4e 6f 6e 50 75 62 6c 69 63 20 2d 61 6c 69 61 73  NonPublic -alias
1f960 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1f970 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
1f980 74 65 2e 44 65 62 75 67 44 61 74 61 20 47 65 74  te.DebugData Get
1f990 53 65 74 74 69 6e 67 52 65 61 64 43 6f 75 6e 74  SettingReadCount
1f9a0 73 20 24 76 69 61 46 69 6c 65 0d 0a 20 20 20 20  s $viaFile..    
1f9b0 20 20 7d 20 73 65 74 74 69 6e 67 52 65 61 64 43    } settingReadC
1f9c0 6f 75 6e 74 73 5d 20 3d 3d 20 30 7d 20 74 68 65  ounts] == 0} the
1f9d0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20  n {..        if 
1f9e0 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
1f9f0 24 6e 61 6d 65 5d 20 3e 20 30 7d 20 74 68 65 6e  $name] > 0} then
1fa00 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   {..          if
1fa10 20 7b 5b 24 73 65 74 74 69 6e 67 52 65 61 64 43   {[$settingReadC
1fa20 6f 75 6e 74 73 20 54 72 79 47 65 74 56 61 6c 75  ounts TryGetValu
1fa30 65 20 24 6e 61 6d 65 20 76 61 6c 75 65 5d 7d 20  e $name value]} 
1fa40 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1fa50 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
1fa60 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
1fa70 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
1fa80 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73           "---- s
1fa90 65 74 74 69 6e 67 20 5c 22 22 20 24 6e 61 6d 65  etting \"" $name
1faa0 20 22 5c 22 20 77 61 73 20 72 65 61 64 20 22 20   "\" was read " 
1fab0 24 76 61 6c 75 65 20 22 20 74 69 6d 65 73 22 20  $value " times" 
1fac0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1fad0 20 20 20 5b 65 78 70 72 20 7b 24 76 69 61 46 69     [expr {$viaFi
1fae0 6c 65 20 3f 20 22 20 66 72 6f 6d 20 74 68 65 20  le ? " from the 
1faf0 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 66 69  configuration fi
1fb00 6c 65 22 20 3a 20 22 22 7d 5d 20 5c 6e 5d 0d 0a  le" : ""}] \n]..
1fb10 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ..            re
1fb20 74 75 72 6e 20 24 76 61 6c 75 65 0d 0a 20 20 20  turn $value..   
1fb30 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1fb40 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
1fb50 20 20 20 20 20 20 73 65 74 20 6e 61 6d 65 43 6f        set nameCo
1fb60 75 6e 74 20 5b 24 73 65 74 74 69 6e 67 52 65 61  unt [$settingRea
1fb70 64 43 6f 75 6e 74 73 20 43 6f 75 6e 74 5d 0d 0a  dCounts Count]..
1fb80 20 20 20 20 20 20 20 20 20 20 73 65 74 20 76 61            set va
1fb90 6c 75 65 43 6f 75 6e 74 20 30 0d 0a 0d 0a 20 20  lueCount 0....  
1fba0 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 66          object f
1fbb0 6f 72 65 61 63 68 20 2d 61 6c 69 61 73 20 70 61  oreach -alias pa
1fbc0 69 72 20 24 73 65 74 74 69 6e 67 52 65 61 64 43  ir $settingReadC
1fbd0 6f 75 6e 74 73 20 7b 0d 0a 20 20 20 20 20 20 20  ounts {..       
1fbe0 20 20 20 20 20 69 6e 63 72 20 76 61 6c 75 65 43       incr valueC
1fbf0 6f 75 6e 74 20 5b 24 70 61 69 72 20 56 61 6c 75  ount [$pair Valu
1fc00 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  e]....          
1fc10 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
1fc20 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
1fc30 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
1fc40 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 65 74         "---- set
1fc50 74 69 6e 67 20 5c 22 22 20 5b 24 70 61 69 72 20  ting \"" [$pair 
1fc60 4b 65 79 5d 20 22 5c 22 20 77 61 73 20 72 65 61  Key] "\" was rea
1fc70 64 20 22 20 5b 24 70 61 69 72 20 56 61 6c 75 65  d " [$pair Value
1fc80 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ] \..           
1fc90 20 20 20 20 20 22 20 74 69 6d 65 73 22 20 5b 65       " times" [e
1fca0 78 70 72 20 7b 24 76 69 61 46 69 6c 65 20 3f 20  xpr {$viaFile ? 
1fcb0 22 20 66 72 6f 6d 20 74 68 65 20 63 6f 6e 66 69  " from the confi
1fcc0 67 75 72 61 74 69 6f 6e 20 66 69 6c 65 22 20 3a  guration file" :
1fcd0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1fce0 20 20 20 20 22 22 7d 5d 20 5c 6e 5d 0d 0a 20 20      ""}] \n]..  
1fcf0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
1fd00 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6c         return [l
1fd10 69 73 74 20 24 6e 61 6d 65 43 6f 75 6e 74 20 24  ist $nameCount $
1fd20 76 61 6c 75 65 43 6f 75 6e 74 5d 0d 0a 20 20 20  valueCount]..   
1fd30 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
1fd40 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74  ...      if {[st
1fd50 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 6e 61 6d  ring length $nam
1fd60 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  e] > 0} then {..
1fd70 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
1fd80 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
1fd90 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
1fda0 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73           "---- s
1fdb0 65 74 74 69 6e 67 20 5c 22 22 20 24 6e 61 6d 65  etting \"" $name
1fdc0 20 22 5c 22 20 77 61 73 20 6e 6f 74 20 72 65 61   "\" was not rea
1fdd0 64 22 20 5b 65 78 70 72 20 7b 24 76 69 61 46 69  d" [expr {$viaFi
1fde0 6c 65 20 3f 20 5c 0d 0a 20 20 20 20 20 20 20 20  le ? \..        
1fdf0 20 20 20 20 22 20 66 72 6f 6d 20 74 68 65 20 63      " from the c
1fe00 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 66 69 6c  onfiguration fil
1fe10 65 22 20 3a 20 22 22 7d 5d 20 5c 6e 5d 0d 0a 20  e" : ""}] \n].. 
1fe20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
1fe30 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
1fe40 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
1fe50 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
1fe60 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6e 6f          "---- no
1fe70 20 73 65 74 74 69 6e 67 73 20 77 65 72 65 20 72   settings were r
1fe80 65 61 64 22 20 5b 65 78 70 72 20 7b 24 76 69 61  ead" [expr {$via
1fe90 46 69 6c 65 20 3f 20 5c 0d 0a 20 20 20 20 20 20  File ? \..      
1fea0 20 20 20 20 20 20 22 20 66 72 6f 6d 20 74 68 65        " from the
1feb0 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 66   configuration f
1fec0 69 6c 65 22 20 3a 20 22 22 7d 5d 20 5c 6e 5d 0d  ile" : ""}] \n].
1fed0 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
1fee0 20 20 72 65 74 75 72 6e 20 2d 31 0d 0a 20 20 20    return -1..   
1fef0 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
1ff00 67 65 74 4f 74 68 65 72 43 6f 75 6e 74 20 7b 20  getOtherCount { 
1ff10 6e 61 6d 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20  name } {..      
1ff20 69 66 20 7b 5b 68 61 76 65 43 6f 6e 73 74 72 61  if {[haveConstra
1ff30 69 6e 74 20 62 75 69 6c 64 43 6f 6e 66 69 67 75  int buildConfigu
1ff40 72 61 74 69 6f 6e 2e 44 65 62 75 67 5d 20 26 26  ration.Debug] &&
1ff50 20 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20   [catch {..     
1ff60 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65     object invoke
1ff70 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c   -flags +NonPubl
1ff80 69 63 20 2d 61 6c 69 61 73 20 5c 0d 0a 20 20 20  ic -alias \..   
1ff90 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e           System.
1ffa0 44 61 74 61 2e 53 51 4c 69 74 65 2e 44 65 62 75  Data.SQLite.Debu
1ffb0 67 44 61 74 61 20 47 65 74 4f 74 68 65 72 43 6f  gData GetOtherCo
1ffc0 75 6e 74 73 0d 0a 20 20 20 20 20 20 7d 20 6f 74  unts..      } ot
1ffd0 68 65 72 43 6f 75 6e 74 73 5d 20 3d 3d 20 30 7d  herCounts] == 0}
1ffe0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1fff0 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
20000 67 74 68 20 24 6e 61 6d 65 5d 20 3e 20 30 7d 20  gth $name] > 0} 
20010 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
20020 20 20 69 66 20 7b 5b 24 6f 74 68 65 72 43 6f 75    if {[$otherCou
20030 6e 74 73 20 54 72 79 47 65 74 56 61 6c 75 65 20  nts TryGetValue 
20040 24 6e 61 6d 65 20 76 61 6c 75 65 5d 7d 20 74 68  $name value]} th
20050 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
20060 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
20070 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
20080 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
20090 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6f 74 68         "---- oth
200a0 65 72 20 63 6f 75 6e 74 65 72 20 5c 22 22 20 24  er counter \"" $
200b0 6e 61 6d 65 20 22 5c 22 20 68 61 73 20 76 61 6c  name "\" has val
200c0 75 65 20 22 20 24 76 61 6c 75 65 20 5c 6e 5d 0d  ue " $value \n].
200d0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ...            r
200e0 65 74 75 72 6e 20 24 76 61 6c 75 65 0d 0a 20 20  eturn $value..  
200f0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
20100 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
20110 20 20 20 20 20 20 20 73 65 74 20 6e 61 6d 65 43         set nameC
20120 6f 75 6e 74 20 5b 24 6f 74 68 65 72 43 6f 75 6e  ount [$otherCoun
20130 74 73 20 43 6f 75 6e 74 5d 0d 0a 20 20 20 20 20  ts Count]..     
20140 20 20 20 20 20 73 65 74 20 76 61 6c 75 65 43 6f       set valueCo
20150 75 6e 74 20 30 0d 0a 0d 0a 20 20 20 20 20 20 20  unt 0....       
20160 20 20 20 6f 62 6a 65 63 74 20 66 6f 72 65 61 63     object foreac
20170 68 20 2d 61 6c 69 61 73 20 70 61 69 72 20 24 6f  h -alias pair $o
20180 74 68 65 72 43 6f 75 6e 74 73 20 7b 0d 0a 20 20  therCounts {..  
20190 20 20 20 20 20 20 20 20 20 20 69 6e 63 72 20 76            incr v
201a0 61 6c 75 65 43 6f 75 6e 74 20 5b 24 70 61 69 72  alueCount [$pair
201b0 20 56 61 6c 75 65 5d 0d 0a 0d 0a 20 20 20 20 20   Value]....     
201c0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
201d0 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
201e0 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
201f0 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
20200 2d 20 6f 74 68 65 72 20 63 6f 75 6e 74 65 72 20  - other counter 
20210 5c 22 22 20 5b 24 70 61 69 72 20 4b 65 79 5d 20  \"" [$pair Key] 
20220 22 5c 22 20 68 61 73 20 76 61 6c 75 65 20 22 20  "\" has value " 
20230 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
20240 20 20 20 5b 24 70 61 69 72 20 56 61 6c 75 65 5d     [$pair Value]
20250 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \n]..          
20260 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 72  }....          r
20270 65 74 75 72 6e 20 5b 6c 69 73 74 20 24 6e 61 6d  eturn [list $nam
20280 65 43 6f 75 6e 74 20 24 76 61 6c 75 65 43 6f 75  eCount $valueCou
20290 6e 74 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  nt]..        }..
202a0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
202b0 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
202c0 67 74 68 20 24 6e 61 6d 65 5d 20 3e 20 30 7d 20  gth $name] > 0} 
202d0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
202e0 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
202f0 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
20300 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
20310 20 22 2d 2d 2d 2d 20 6f 74 68 65 72 20 63 6f 75   "---- other cou
20320 6e 74 65 72 20 5c 22 22 20 24 6e 61 6d 65 20 22  nter \"" $name "
20330 5c 22 20 68 61 73 20 6e 6f 20 76 61 6c 75 65 5c  \" has no value\
20340 6e 22 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  n"]..      } els
20350 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75  e {..        tpu
20360 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
20370 65 6c 20 22 2d 2d 2d 2d 20 74 68 65 72 65 20 61  el "---- there a
20380 72 65 20 6e 6f 20 6f 74 68 65 72 20 63 6f 75 6e  re no other coun
20390 74 65 72 73 5c 6e 22 0d 0a 20 20 20 20 20 20 7d  ters\n"..      }
203a0 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ....      return
203b0 20 2d 31 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20   -1..    }..... 
203c0 20 20 20 70 72 6f 63 20 72 65 70 6f 72 74 53 51     proc reportSQ
203d0 4c 69 74 65 52 65 73 6f 75 72 63 65 73 20 7b 0d  LiteResources {.
203e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61  .            cha
203f0 6e 6e 65 6c 20 7b 71 75 69 65 74 20 66 61 6c 73  nnel {quiet fals
20400 65 7d 20 7b 72 65 73 65 74 20 74 72 75 65 7d 20  e} {reset true} 
20410 7b 63 6f 6c 6c 65 63 74 20 74 72 75 65 7d 20 7d  {collect true} }
20420 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
20430 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 70 6f     # NOTE: If po
20440 73 73 69 62 6c 65 2c 20 61 6c 77 61 79 73 20 72  ssible, always r
20450 65 73 65 74 20 74 68 65 20 63 61 63 68 65 64 20  eset the cached 
20460 61 73 73 65 6d 62 6c 79 20 64 69 72 65 63 74 6f  assembly directo
20470 72 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ry..      #     
20480 20 20 61 6e 64 20 74 68 65 20 63 61 63 68 65 64    and the cached
20490 20 58 4d 4c 20 63 6f 6e 66 69 67 75 72 61 74 69   XML configurati
204a0 6f 6e 20 66 69 6c 65 20 6e 61 6d 65 2e 0d 0a 20  on file name... 
204b0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
204c0 20 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f 62 6a   {[haveSQLiteObj
204d0 65 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65  ectCommand]} the
204e0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20  n {..        if 
204f0 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
20500 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f       object invo
20510 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75  ke -flags +NonPu
20520 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20  blic \..        
20530 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74        System.Dat
20540 61 2e 53 51 4c 69 74 65 2e 55 6e 73 61 66 65 4e  a.SQLite.UnsafeN
20550 61 74 69 76 65 4d 65 74 68 6f 64 73 20 5c 0d 0a  ativeMethods \..
20560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 52 65                Re
20570 73 65 74 43 61 63 68 65 64 41 73 73 65 6d 62 6c  setCachedAssembl
20580 79 44 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20  yDirectory..    
20590 20 20 20 20 7d 20 65 72 72 6f 72 5d 20 3d 3d 20      } error] == 
205a0 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
205b0 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
205c0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
205d0 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
205e0 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 72 65 73 65 74  nnel "---- reset
205f0 20 63 61 63 68 65 64 20 61 73 73 65 6d 62 6c 79   cached assembly
20600 20 64 69 72 65 63 74 6f 72 79 5c 6e 22 0d 0a 20   directory\n".. 
20610 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
20620 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
20630 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
20640 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
20650 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
20660 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
20670 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
20680 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52         "==== WAR
20690 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20  NING: failed to 
206a0 72 65 73 65 74 20 63 61 63 68 65 64 20 61 73 73  reset cached ass
206b0 65 6d 62 6c 79 20 64 69 72 65 63 74 6f 72 79 2c  embly directory,
206c0 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   " \..          
206d0 20 20 20 20 20 20 22 65 72 72 6f 72 3a 20 22 20        "error: " 
206e0 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d  \n\t $error \n].
206f0 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
20700 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
20710 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d     if {[catch {.
20720 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63  .          objec
20730 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20  t invoke -flags 
20740 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20  +NonPublic \..  
20750 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74              Syst
20760 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 55  em.Data.SQLite.U
20770 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f  nsafeNativeMetho
20780 64 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ds \..          
20790 20 20 20 20 52 65 73 65 74 43 61 63 68 65 64 58      ResetCachedX
207a0 6d 6c 43 6f 6e 66 69 67 46 69 6c 65 4e 61 6d 65  mlConfigFileName
207b0 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 72 72 6f  ..        } erro
207c0 72 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  r] == 0} then {.
207d0 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21  .          if {!
207e0 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
207f0 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
20800 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d  s $channel "----
20810 20 72 65 73 65 74 20 63 61 63 68 65 64 20 58 4d   reset cached XM
20820 4c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  L configuration 
20830 66 69 6c 65 20 6e 61 6d 65 5c 6e 22 0d 0a 20 20  file name\n"..  
20840 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
20850 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
20860 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
20870 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
20880 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
20890 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
208a0 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
208b0 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e        "==== WARN
208c0 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 72  ING: failed to r
208d0 65 73 65 74 20 63 61 63 68 65 64 20 58 4d 4c 20  eset cached XML 
208e0 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 22 20  configuration " 
208f0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
20900 20 20 20 22 66 69 6c 65 20 6e 61 6d 65 2c 20 65     "file name, e
20910 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72  rror: " \n\t $er
20920 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ror \n]..       
20930 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
20940 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
20950 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
20960 45 3a 20 49 66 20 61 76 61 69 6c 61 62 6c 65 2c  E: If available,
20970 20 72 65 70 6f 72 74 20 6f 6e 20 28 61 6e 64 20   report on (and 
20980 70 6f 73 73 69 62 6c 79 20 72 65 73 65 74 29 20  possibly reset) 
20990 74 68 65 20 72 75 6e 74 69 6d 65 0d 0a 20 20 20  the runtime..   
209a0 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e 66 69     #       confi
209b0 67 75 72 61 74 69 6f 6e 20 73 74 61 74 69 73 74  guration statist
209c0 69 63 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ics...      #.. 
209d0 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65 53 51       if {[haveSQ
209e0 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e  LiteObjectComman
209f0 64 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  d] && \..       
20a00 20 20 20 5b 68 61 76 65 43 6f 6e 73 74 72 61 69     [haveConstrai
20a10 6e 74 20 62 75 69 6c 64 43 6f 6e 66 69 67 75 72  nt buildConfigur
20a20 61 74 69 6f 6e 2e 44 65 62 75 67 5d 7d 20 74 68  ation.Debug]} th
20a30 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66  en {..        if
20a40 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
20a50 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76        object inv
20a60 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50  oke -flags +NonP
20a70 75 62 6c 69 63 20 2d 61 6c 69 61 73 20 5c 0d 0a  ublic -alias \..
20a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79                Sy
20a90 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
20aa0 2e 44 65 62 75 67 44 61 74 61 20 47 65 74 53 65  .DebugData GetSe
20ab0 74 74 69 6e 67 52 65 61 64 43 6f 75 6e 74 73 20  ttingReadCounts 
20ac0 66 61 6c 73 65 0d 0a 20 20 20 20 20 20 20 20 7d  false..        }
20ad0 20 73 65 74 74 69 6e 67 52 65 61 64 43 6f 75 6e   settingReadCoun
20ae0 74 73 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  ts] == 0} then {
20af0 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
20b00 6e 61 6d 65 43 6f 75 6e 74 20 5b 24 73 65 74 74  nameCount [$sett
20b10 69 6e 67 52 65 61 64 43 6f 75 6e 74 73 20 43 6f  ingReadCounts Co
20b20 75 6e 74 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  unt]..          
20b30 73 65 74 20 76 61 6c 75 65 43 6f 75 6e 74 20 30  set valueCount 0
20b40 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62  ....          ob
20b50 6a 65 63 74 20 66 6f 72 65 61 63 68 20 2d 61 6c  ject foreach -al
20b60 69 61 73 20 70 61 69 72 20 24 73 65 74 74 69 6e  ias pair $settin
20b70 67 52 65 61 64 43 6f 75 6e 74 73 20 7b 0d 0a 20  gReadCounts {.. 
20b80 20 20 20 20 20 20 20 20 20 20 20 69 6e 63 72 20             incr 
20b90 76 61 6c 75 65 43 6f 75 6e 74 20 5b 24 70 61 69  valueCount [$pai
20ba0 72 20 56 61 6c 75 65 5d 0d 0a 0d 0a 20 20 20 20  r Value]....    
20bb0 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
20bc0 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
20bd0 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
20be0 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
20bf0 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
20c00 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
20c10 20 73 65 74 74 69 6e 67 20 5c 22 22 20 5b 24 70   setting \"" [$p
20c20 61 69 72 20 4b 65 79 5d 20 22 5c 22 20 77 61 73  air Key] "\" was
20c30 20 72 65 61 64 20 22 20 5c 0d 0a 20 20 20 20 20   read " \..     
20c40 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 24 70               [$p
20c50 61 69 72 20 56 61 6c 75 65 5d 20 22 20 74 69 6d  air Value] " tim
20c60 65 73 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20  es\n"]..        
20c70 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
20c80 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
20c90 69 66 20 7b 24 72 65 73 65 74 7d 20 74 68 65 6e  if {$reset} then
20ca0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
20cb0 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20  if {[catch {..  
20cc0 20 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65              obje
20cd0 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73  ct invoke -flags
20ce0 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 2d 61 6c 69   +NonPublic -ali
20cf0 61 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  as \..          
20d00 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44          System.D
20d10 61 74 61 2e 53 51 4c 69 74 65 2e 44 65 62 75 67  ata.SQLite.Debug
20d20 44 61 74 61 20 43 6c 65 61 72 53 65 74 74 69 6e  Data ClearSettin
20d30 67 52 65 61 64 43 6f 75 6e 74 73 20 66 61 6c 73  gReadCounts fals
20d40 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e..            }
20d50 20 65 72 72 6f 72 5d 20 3d 3d 20 30 7d 20 74 68   error] == 0} th
20d60 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
20d70 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
20d80 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
20d90 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
20da0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
20db0 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
20dc0 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
20dd0 20 72 65 73 65 74 20 73 65 74 74 69 6e 67 20 73   reset setting s
20de0 74 61 74 69 73 74 69 63 73 20 66 6f 72 20 74 68  tatistics for th
20df0 65 20 70 72 65 76 69 6f 75 73 20 22 20 5c 0d 0a  e previous " \..
20e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e10 20 20 20 20 24 6e 61 6d 65 43 6f 75 6e 74 20 22      $nameCount "
20e20 20 6e 61 6d 65 73 20 61 6e 64 20 22 20 24 76 61   names and " $va
20e30 6c 75 65 43 6f 75 6e 74 20 22 20 76 61 6c 75 65  lueCount " value
20e40 73 20 72 65 61 64 5c 6e 22 5d 0d 0a 20 20 20 20  s read\n"]..    
20e50 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
20e60 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20           } else 
20e70 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
20e80 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
20e90 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
20ea0 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
20eb0 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
20ec0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
20ed0 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41          "==== WA
20ee0 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f  RNING: failed to
20ef0 20 72 65 73 65 74 20 73 65 74 74 69 6e 67 20 73   reset setting s
20f00 74 61 74 69 73 74 69 63 73 20 66 6f 72 20 22 20  tatistics for " 
20f10 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
20f20 20 20 20 20 20 20 20 22 74 68 65 20 70 72 65 76         "the prev
20f30 69 6f 75 73 20 22 20 24 6e 61 6d 65 43 6f 75 6e  ious " $nameCoun
20f40 74 20 22 20 6e 61 6d 65 73 20 61 6e 64 20 22 20  t " names and " 
20f50 24 76 61 6c 75 65 43 6f 75 6e 74 20 5c 0d 0a 20  $valueCount \.. 
20f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f70 20 20 20 22 20 76 61 6c 75 65 73 20 72 65 61 64     " values read
20f80 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20  , error: " \n\t 
20f90 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20  $error \n]..    
20fa0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
20fb0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
20fc0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
20fd0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66   }....        if
20fe0 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
20ff0 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76        object inv
21000 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50  oke -flags +NonP
21010 75 62 6c 69 63 20 2d 61 6c 69 61 73 20 5c 0d 0a  ublic -alias \..
21020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79                Sy
21030 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
21040 2e 44 65 62 75 67 44 61 74 61 20 47 65 74 53 65  .DebugData GetSe
21050 74 74 69 6e 67 52 65 61 64 43 6f 75 6e 74 73 20  ttingReadCounts 
21060 74 72 75 65 0d 0a 20 20 20 20 20 20 20 20 7d 20  true..        } 
21070 73 65 74 74 69 6e 67 46 69 6c 65 52 65 61 64 43  settingFileReadC
21080 6f 75 6e 74 73 5d 20 3d 3d 20 30 7d 20 74 68 65  ounts] == 0} the
21090 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73  n {..          s
210a0 65 74 20 6e 61 6d 65 43 6f 75 6e 74 20 5b 24 73  et nameCount [$s
210b0 65 74 74 69 6e 67 46 69 6c 65 52 65 61 64 43 6f  ettingFileReadCo
210c0 75 6e 74 73 20 43 6f 75 6e 74 5d 0d 0a 20 20 20  unts Count]..   
210d0 20 20 20 20 20 20 20 73 65 74 20 76 61 6c 75 65         set value
210e0 43 6f 75 6e 74 20 30 0d 0a 0d 0a 20 20 20 20 20  Count 0....     
210f0 20 20 20 20 20 6f 62 6a 65 63 74 20 66 6f 72 65       object fore
21100 61 63 68 20 2d 61 6c 69 61 73 20 70 61 69 72 20  ach -alias pair 
21110 24 73 65 74 74 69 6e 67 46 69 6c 65 52 65 61 64  $settingFileRead
21120 43 6f 75 6e 74 73 20 7b 0d 0a 20 20 20 20 20 20  Counts {..      
21130 20 20 20 20 20 20 69 6e 63 72 20 76 61 6c 75 65        incr value
21140 43 6f 75 6e 74 20 5b 24 70 61 69 72 20 56 61 6c  Count [$pair Val
21150 75 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ue]....         
21160 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
21170 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
21180 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
21190 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
211a0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
211b0 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 65 74 74        "---- sett
211c0 69 6e 67 20 5c 22 22 20 5b 24 70 61 69 72 20 4b  ing \"" [$pair K
211d0 65 79 5d 20 22 5c 22 20 77 61 73 20 72 65 61 64  ey] "\" was read
211e0 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   " \..          
211f0 20 20 20 20 20 20 20 20 5b 24 70 61 69 72 20 56          [$pair V
21200 61 6c 75 65 5d 20 22 20 74 69 6d 65 73 20 66 72  alue] " times fr
21210 6f 6d 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61  om the configura
21220 74 69 6f 6e 20 66 69 6c 65 5c 6e 22 5d 0d 0a 20  tion file\n"].. 
21230 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
21240 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
21250 20 20 20 20 20 20 20 69 66 20 7b 24 72 65 73 65         if {$rese
21260 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
21270 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
21280 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  h {..           
21290 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65     object invoke
212a0 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c   -flags +NonPubl
212b0 69 63 20 2d 61 6c 69 61 73 20 5c 0d 0a 20 20 20  ic -alias \..   
212c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
212d0 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
212e0 65 2e 44 65 62 75 67 44 61 74 61 20 43 6c 65 61  e.DebugData Clea
212f0 72 53 65 74 74 69 6e 67 52 65 61 64 43 6f 75 6e  rSettingReadCoun
21300 74 73 20 74 72 75 65 0d 0a 20 20 20 20 20 20 20  ts true..       
21310 20 20 20 20 20 7d 20 65 72 72 6f 72 5d 20 3d 3d       } error] ==
21320 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
21330 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24            if {!$
21340 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
21350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
21360 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
21370 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
21380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21390 20 22 2d 2d 2d 2d 20 72 65 73 65 74 20 73 65 74   "---- reset set
213a0 74 69 6e 67 20 73 74 61 74 69 73 74 69 63 73 20  ting statistics 
213b0 66 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75 73  for the previous
213c0 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   " \..          
213d0 20 20 20 20 20 20 20 20 20 20 24 6e 61 6d 65 43            $nameC
213e0 6f 75 6e 74 20 22 20 6e 61 6d 65 73 20 61 6e 64  ount " names and
213f0 20 22 20 24 76 61 6c 75 65 43 6f 75 6e 74 20 22   " $valueCount "
21400 20 76 61 6c 75 65 73 20 72 65 61 64 20 22 20 5c   values read " \
21410 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
21420 20 20 20 20 20 20 22 66 72 6f 6d 20 74 68 65 20        "from the 
21430 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 66 69  configuration fi
21440 6c 65 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20  le\n"]..        
21450 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
21460 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
21470 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
21480 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
21490 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
214a0 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
214b0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
214c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
214d0 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e      "==== WARNIN
214e0 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 72 65 73  G: failed to res
214f0 65 74 20 73 65 74 74 69 6e 67 20 73 74 61 74 69  et setting stati
21500 73 74 69 63 73 20 66 6f 72 20 22 20 5c 0d 0a 20  stics for " \.. 
21510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21520 20 20 20 22 74 68 65 20 70 72 65 76 69 6f 75 73     "the previous
21530 20 22 20 24 6e 61 6d 65 43 6f 75 6e 74 20 22 20   " $nameCount " 
21540 6e 61 6d 65 73 20 61 6e 64 20 22 20 24 76 61 6c  names and " $val
21550 75 65 43 6f 75 6e 74 20 5c 0d 0a 20 20 20 20 20  ueCount \..     
21560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
21570 20 76 61 6c 75 65 73 20 72 65 61 64 20 66 72 6f   values read fro
21580 6d 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74  m the configurat
21590 69 6f 6e 20 66 69 6c 65 2c 20 65 72 72 6f 72 3a  ion file, error:
215a0 20 22 20 5c 6e 5c 74 20 5c 0d 0a 20 20 20 20 20   " \n\t \..     
215b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24                 $
215c0 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20  error \n]..     
215d0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
215e0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
215f0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
21600 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20  }....        if 
21610 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
21620 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f       object invo
21630 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75  ke -flags +NonPu
21640 62 6c 69 63 20 2d 61 6c 69 61 73 20 5c 0d 0a 20  blic -alias \.. 
21650 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73               Sys
21660 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
21670 44 65 62 75 67 44 61 74 61 20 47 65 74 4f 74 68  DebugData GetOth
21680 65 72 43 6f 75 6e 74 73 0d 0a 20 20 20 20 20 20  erCounts..      
21690 20 20 7d 20 6f 74 68 65 72 43 6f 75 6e 74 73 5d    } otherCounts]
216a0 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
216b0 20 20 20 20 20 20 20 20 20 73 65 74 20 6e 61 6d           set nam
216c0 65 43 6f 75 6e 74 20 5b 24 6f 74 68 65 72 43 6f  eCount [$otherCo
216d0 75 6e 74 73 20 43 6f 75 6e 74 5d 0d 0a 20 20 20  unts Count]..   
216e0 20 20 20 20 20 20 20 73 65 74 20 76 61 6c 75 65         set value
216f0 43 6f 75 6e 74 20 30 0d 0a 0d 0a 20 20 20 20 20  Count 0....     
21700 20 20 20 20 20 6f 62 6a 65 63 74 20 66 6f 72 65       object fore
21710 61 63 68 20 2d 61 6c 69 61 73 20 70 61 69 72 20  ach -alias pair 
21720 24 6f 74 68 65 72 43 6f 75 6e 74 73 20 7b 0d 0a  $otherCounts {..
21730 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 63 72              incr
21740 20 76 61 6c 75 65 43 6f 75 6e 74 20 5b 24 70 61   valueCount [$pa
21750 69 72 20 56 61 6c 75 65 5d 0d 0a 0d 0a 20 20 20  ir Value]....   
21760 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71           if {!$q
21770 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
21780 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
21790 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
217a0 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
217b0 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
217c0 2d 20 6f 74 68 65 72 20 63 6f 75 6e 74 65 72 20  - other counter 
217d0 5c 22 22 20 5b 24 70 61 69 72 20 4b 65 79 5d 20  \"" [$pair Key] 
217e0 22 5c 22 20 68 61 73 20 76 61 6c 75 65 20 22 20  "\" has value " 
217f0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
21800 20 20 20 20 20 5b 24 70 61 69 72 20 56 61 6c 75       [$pair Valu
21810 65 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  e] \n]..        
21820 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
21830 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
21840 69 66 20 7b 24 72 65 73 65 74 7d 20 74 68 65 6e  if {$reset} then
21850 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
21860 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20  if {[catch {..  
21870 20 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65              obje
21880 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73  ct invoke -flags
21890 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 2d 61 6c 69   +NonPublic -ali
218a0 61 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  as \..          
218b0 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44          System.D
218c0 61 74 61 2e 53 51 4c 69 74 65 2e 44 65 62 75 67  ata.SQLite.Debug
218d0 44 61 74 61 20 43 6c 65 61 72 4f 74 68 65 72 43  Data ClearOtherC
218e0 6f 75 6e 74 73 0d 0a 20 20 20 20 20 20 20 20 20  ounts..         
218f0 20 20 20 7d 20 65 72 72 6f 72 5d 20 3d 3d 20 30     } error] == 0
21900 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
21910 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
21920 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
21930 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
21940 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
21950 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
21960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
21970 2d 2d 2d 2d 20 72 65 73 65 74 20 6f 74 68 65 72  ---- reset other
21980 20 63 6f 75 6e 74 65 72 73 20 66 6f 72 20 74 68   counters for th
21990 65 20 70 72 65 76 69 6f 75 73 20 22 20 5c 0d 0a  e previous " \..
219a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
219b0 20 20 20 20 24 6e 61 6d 65 43 6f 75 6e 74 20 22      $nameCount "
219c0 20 6e 61 6d 65 73 20 61 6e 64 20 22 20 24 76 61   names and " $va
219d0 6c 75 65 43 6f 75 6e 74 20 22 20 76 61 6c 75 65  lueCount " value
219e0 73 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20  s\n"]..         
219f0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
21a00 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
21a10 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
21a20 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
21a30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21a40 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
21a50 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
21a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a70 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47     "==== WARNING
21a80 3a 20 66 61 69 6c 65 64 20 74 6f 20 72 65 73 65  : failed to rese
21a90 74 20 6f 74 68 65 72 20 63 6f 75 6e 74 65 72 73  t other counters
21aa0 20 66 6f 72 20 22 20 5c 0d 0a 20 20 20 20 20 20   for " \..      
21ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 74                "t
21ac0 68 65 20 70 72 65 76 69 6f 75 73 20 22 20 24 6e  he previous " $n
21ad0 61 6d 65 43 6f 75 6e 74 20 22 20 6e 61 6d 65 73  ameCount " names
21ae0 20 61 6e 64 20 22 20 24 76 61 6c 75 65 43 6f 75   and " $valueCou
21af0 6e 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  nt \..          
21b00 20 20 20 20 20 20 20 20 20 20 22 20 76 61 6c 75            " valu
21b10 65 73 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c  es, error: " \n\
21b20 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20  t $error \n]..  
21b30 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
21b40 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
21b50 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
21b60 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d     }..      }...
21b70 0a 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65  .      if {[have
21b80 53 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d  SQLiteObjectComm
21b90 61 6e 64 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  and] && \..     
21ba0 20 20 20 20 20 5b 68 61 76 65 53 51 4c 69 74 65       [haveSQLite
21bb0 44 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 20 49  DefineConstant I
21bc0 4e 54 45 52 4f 50 5f 56 49 52 54 55 41 4c 5f 54  NTEROP_VIRTUAL_T
21bd0 41 42 4c 45 5d 20 26 26 20 5c 0d 0a 20 20 20 20  ABLE] && \..    
21be0 20 20 20 20 20 20 5b 68 61 76 65 53 51 4c 69 74        [haveSQLit
21bf0 65 44 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 20  eDefineConstant 
21c00 54 52 41 43 4b 5f 4d 45 4d 4f 52 59 5f 42 59 54  TRACK_MEMORY_BYT
21c10 45 53 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ES]} then {..   
21c20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
21c30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
21c40 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
21c50 65 6c 20 22 2d 2d 2d 2d 20 63 75 72 72 65 6e 74  el "---- current
21c60 20 6d 65 6d 6f 72 79 20 69 6e 20 75 73 65 20 62   memory in use b
21c70 79 20 53 51 4c 69 74 65 4d 65 6d 6f 72 79 2e 2e  y SQLiteMemory..
21c80 2e 20 22 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  . "..        }..
21c90 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63  ..        if {[c
21ca0 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
21cb0 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20    object invoke 
21cc0 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69  -flags +NonPubli
21cd0 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  c \..           
21ce0 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53     System.Data.S
21cf0 51 4c 69 74 65 2e 53 51 4c 69 74 65 4d 65 6d 6f  QLite.SQLiteMemo
21d00 72 79 20 62 79 74 65 73 41 6c 6c 6f 63 61 74 65  ry bytesAllocate
21d10 64 0d 0a 20 20 20 20 20 20 20 20 7d 20 6d 65 6d  d..        } mem
21d20 6f 72 79 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ory] == 0} then 
21d30 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  {..          if 
21d40 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
21d50 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
21d60 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
21d70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79  pendArgs $memory
21d80 20 22 20 62 79 74 65 73 5c 6e 22 5d 0d 0a 20 20   " bytes\n"]..  
21d90 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
21da0 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
21db0 20 20 20 20 20 20 20 73 65 74 20 6d 65 6d 6f 72         set memor
21dc0 79 20 75 6e 6b 6e 6f 77 6e 0d 0a 0d 0a 20 20 20  y unknown....   
21dd0 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
21de0 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
21df0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
21e00 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
21e10 67 73 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a  gs $memory \n]..
21e20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
21e30 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
21e40 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
21e50 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
21e60 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
21e70 22 2d 2d 2d 2d 20 6d 61 78 69 6d 75 6d 20 6d 65  "---- maximum me
21e80 6d 6f 72 79 20 69 6e 20 75 73 65 20 62 79 20 53  mory in use by S
21e90 51 4c 69 74 65 4d 65 6d 6f 72 79 2e 2e 2e 20 22  QLiteMemory... "
21ea0 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
21eb0 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
21ec0 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6f  h {..          o
21ed0 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c  bject invoke -fl
21ee0 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c  ags +NonPublic \
21ef0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
21f00 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
21f10 74 65 2e 53 51 4c 69 74 65 4d 65 6d 6f 72 79 20  te.SQLiteMemory 
21f20 6d 61 78 69 6d 75 6d 42 79 74 65 73 41 6c 6c 6f  maximumBytesAllo
21f30 63 61 74 65 64 0d 0a 20 20 20 20 20 20 20 20 7d  cated..        }
21f40 20 6d 65 6d 6f 72 79 5d 20 3d 3d 20 30 7d 20 74   memory] == 0} t
21f50 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
21f60 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
21f70 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
21f80 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
21f90 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65   [appendArgs $me
21fa0 6d 6f 72 79 20 22 20 62 79 74 65 73 5c 6e 22 5d  mory " bytes\n"]
21fb0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
21fc0 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
21fd0 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20 6d  .          set m
21fe0 65 6d 6f 72 79 20 75 6e 6b 6e 6f 77 6e 0d 0a 0d  emory unknown...
21ff0 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21  .          if {!
22000 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
22010 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
22020 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
22030 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 5c  ndArgs $memory \
22040 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  n]..          }.
22050 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
22060 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20    }....      if 
22070 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
22080 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
22090 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63  $channel "---- c
220a0 75 72 72 65 6e 74 20 6d 65 6d 6f 72 79 20 69 6e  urrent memory in
220b0 20 75 73 65 20 62 79 20 53 51 4c 69 74 65 2e 2e   use by SQLite..
220c0 2e 20 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  . "..      }....
220d0 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65 53        if {[haveS
220e0 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61  QLiteObjectComma
220f0 6e 64 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  nd]} then {..   
22100 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
22110 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a  {..          obj
22120 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67  ect invoke -flag
22130 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a  s +NonPublic \..
22140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79                Sy
22150 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
22160 2e 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74  .UnsafeNativeMet
22170 68 6f 64 73 20 73 71 6c 69 74 65 33 5f 6d 65 6d  hods sqlite3_mem
22180 6f 72 79 5f 75 73 65 64 0d 0a 20 20 20 20 20 20  ory_used..      
22190 20 20 7d 20 6d 65 6d 6f 72 79 5d 20 3d 3d 20 30    } memory] == 0
221a0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
221b0 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
221c0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
221d0 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
221e0 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
221f0 24 6d 65 6d 6f 72 79 20 22 20 62 79 74 65 73 5c  $memory " bytes\
22200 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  n"]..          }
22210 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65  ..        } else
22220 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d   {..          #.
22230 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
22240 45 3a 20 4d 61 79 62 65 20 74 68 65 20 53 51 4c  E: Maybe the SQL
22250 69 74 65 20 63 6f 72 65 20 6c 69 62 72 61 72 79  ite core library
22260 20 69 73 20 75 6e 61 76 61 69 6c 61 62 6c 65 3f   is unavailable?
22270 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
22280 20 20 20 20 20 20 20 20 20 73 65 74 20 6d 65 6d           set mem
22290 6f 72 79 20 75 6e 6b 6e 6f 77 6e 0d 0a 0d 0a 20  ory unknown.... 
222a0 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71           if {!$q
222b0 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
222c0 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
222d0 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
222e0 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d  Args $memory \n]
222f0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
22300 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
22310 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
22320 20 20 73 65 74 20 6d 65 6d 6f 72 79 20 75 6e 61    set memory una
22330 76 61 69 6c 61 62 6c 65 0d 0a 0d 0a 20 20 20 20  vailable....    
22340 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
22350 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
22360 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
22370 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d  l [appendArgs $m
22380 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20 20 20  emory \n]..     
22390 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d     }..      }...
223a0 0a 20 20 20 20 20 20 73 65 74 20 72 65 73 75 6c  .      set resul
223b0 74 20 24 6d 65 6d 6f 72 79 3b 20 23 20 4e 4f 54  t $memory; # NOT
223c0 45 3a 20 52 65 74 75 72 6e 20 6d 65 6d 6f 72 79  E: Return memory
223d0 20 69 6e 2d 75 73 65 20 74 6f 20 6f 75 72 20 63   in-use to our c
223e0 61 6c 6c 65 72 2e 0d 0a 0d 0a 20 20 20 20 20 20  aller.....      
223f0 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
22400 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75  n {..        tpu
22410 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d  ts $channel "---
22420 2d 20 6d 61 78 69 6d 75 6d 20 6d 65 6d 6f 72 79  - maximum memory
22430 20 69 6e 20 75 73 65 20 62 79 20 53 51 4c 69 74   in use by SQLit
22440 65 2e 2e 2e 20 22 0d 0a 20 20 20 20 20 20 7d 0d  e... "..      }.
22450 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 68 61  ...      if {[ha
22460 76 65 53 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f  veSQLiteObjectCo
22470 6d 6d 61 6e 64 5d 7d 20 74 68 65 6e 20 7b 0d 0a  mmand]} then {..
22480 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
22490 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
224a0 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66  object invoke -f
224b0 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20  lags +NonPublic 
224c0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
224d0 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
224e0 69 74 65 2e 55 6e 73 61 66 65 4e 61 74 69 76 65  ite.UnsafeNative
224f0 4d 65 74 68 6f 64 73 20 5c 0d 0a 20 20 20 20 20  Methods \..     
22500 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
22510 5f 6d 65 6d 6f 72 79 5f 68 69 67 68 77 61 74 65  _memory_highwate
22520 72 20 30 0d 0a 20 20 20 20 20 20 20 20 7d 20 6d  r 0..        } m
22530 65 6d 6f 72 79 5d 20 3d 3d 20 30 7d 20 74 68 65  emory] == 0} the
22540 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69  n {..          i
22550 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
22560 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
22570 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
22580 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f  appendArgs $memo
22590 72 79 20 22 20 62 79 74 65 73 5c 6e 22 5d 0d 0a  ry " bytes\n"]..
225a0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
225b0 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
225c0 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
225d0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4d 61        # NOTE: Ma
225e0 79 62 65 20 74 68 65 20 53 51 4c 69 74 65 20 63  ybe the SQLite c
225f0 6f 72 65 20 6c 69 62 72 61 72 79 20 69 73 20 75  ore library is u
22600 6e 61 76 61 69 6c 61 62 6c 65 3f 0d 0a 20 20 20  navailable?..   
22610 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
22620 20 20 20 20 73 65 74 20 6d 65 6d 6f 72 79 20 75      set memory u
22630 6e 6b 6e 6f 77 6e 0d 0a 0d 0a 20 20 20 20 20 20  nknown....      
22640 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
22650 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
22660 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
22670 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
22680 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20  $memory \n]..   
22690 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
226a0 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73    }..      } els
226b0 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74  e {..        set
226c0 20 6d 65 6d 6f 72 79 20 75 6e 61 76 61 69 6c 61   memory unavaila
226d0 62 6c 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69  ble....        i
226e0 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
226f0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70   {..          tp
22700 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
22710 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79  pendArgs $memory
22720 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d   \n]..        }.
22730 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
22740 20 20 69 66 20 7b 24 63 6f 6c 6c 65 63 74 7d 20    if {$collect} 
22750 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
22760 63 6f 6c 6c 65 63 74 47 61 72 62 61 67 65 20 24  collectGarbage $
22770 63 68 61 6e 6e 65 6c 0d 0a 20 20 20 20 20 20 7d  channel..      }
22780 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 24  ....      if {!$
22790 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
227a0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
227b0 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 75 72 72  annel "---- curr
227c0 65 6e 74 20 6d 65 6d 6f 72 79 20 69 6e 20 75 73  ent memory in us
227d0 65 20 62 79 20 74 68 65 20 43 4c 52 2e 2e 2e 20  e by the CLR... 
227e0 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  "..      }....  
227f0 20 20 20 20 69 66 20 7b 5b 68 61 76 65 53 51 4c      if {[haveSQL
22800 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64  iteObjectCommand
22810 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
22820 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d     if {[catch {.
22830 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63  .          objec
22840 74 20 69 6e 76 6f 6b 65 20 47 43 20 47 65 74 54  t invoke GC GetT
22850 6f 74 61 6c 4d 65 6d 6f 72 79 20 66 61 6c 73 65  otalMemory false
22860 0d 0a 20 20 20 20 20 20 20 20 7d 20 6d 65 6d 6f  ..        } memo
22870 72 79 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  ry] == 0} then {
22880 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
22890 5b 73 74 72 69 6e 67 20 69 73 20 69 6e 74 65 67  [string is integ
228a0 65 72 20 2d 73 74 72 69 63 74 20 24 6d 65 6d 6f  er -strict $memo
228b0 72 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ry]} then {..   
228c0 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71           if {!$q
228d0 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
228e0 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
228f0 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
22900 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 22  ndArgs $memory "
22910 20 62 79 74 65 73 5c 6e 22 5d 0d 0a 20 20 20 20   bytes\n"]..    
22920 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
22930 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
22940 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 6d             set m
22950 65 6d 6f 72 79 20 69 6e 76 61 6c 69 64 0d 0a 0d  emory invalid...
22960 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
22970 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
22980 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
22990 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
229a0 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f  appendArgs $memo
229b0 72 79 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  ry \n]..        
229c0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
229d0 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c   }..        } el
229e0 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
229f0 73 65 74 20 6d 65 6d 6f 72 79 20 75 6e 6b 6e 6f  set memory unkno
22a00 77 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  wn....          
22a10 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
22a20 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
22a30 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
22a40 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d  [appendArgs $mem
22a50 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ory \n]..       
22a60 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
22a70 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
22a80 0a 20 20 20 20 20 20 20 20 73 65 74 20 6d 65 6d  .        set mem
22a90 6f 72 79 20 75 6e 61 76 61 69 6c 61 62 6c 65 0d  ory unavailable.
22aa0 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21  ...        if {!
22ab0 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
22ac0 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
22ad0 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
22ae0 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d  Args $memory \n]
22af0 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
22b00 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65     }....      re
22b10 74 75 72 6e 20 24 72 65 73 75 6c 74 0d 0a 20 20  turn $result..  
22b20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
22b30 20 72 65 73 65 74 53 51 4c 69 74 65 44 69 72 65   resetSQLiteDire
22b40 63 74 6f 72 69 65 73 20 7b 20 63 68 61 6e 6e 65  ctories { channe
22b50 6c 20 6e 61 74 69 76 65 20 7d 20 7b 0d 0a 20 20  l native } {..  
22b60 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
22b70 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20  OTE: Attempt to 
22b80 75 73 65 20 74 68 65 20 6e 61 74 69 76 65 20 41  use the native A
22b90 50 49 20 28 76 69 61 20 74 68 65 20 6d 61 6e 61  PI (via the mana
22ba0 67 65 64 20 61 73 73 65 6d 62 6c 79 29 3f 0d 0a  ged assembly)?..
22bb0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
22bc0 66 20 7b 24 6e 61 74 69 76 65 7d 20 74 68 65 6e  f {$native} then
22bd0 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
22be0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e         # NOTE: N
22bf0 6f 77 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  ow make sure the
22c00 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 74 65   database and te
22c10 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72  mporary director
22c20 69 65 73 20 61 72 65 0d 0a 20 20 20 20 20 20 20  ies are..       
22c30 20 23 20 20 20 20 20 20 20 72 65 73 65 74 20 74   #       reset t
22c40 68 65 69 72 20 64 65 66 61 75 6c 74 20 76 61 6c  heir default val
22c50 75 65 73 2c 20 77 68 69 63 68 20 73 68 6f 75 6c  ues, which shoul
22c60 64 20 62 65 20 6e 75 6c 6c 20 66 6f 72 20 62 6f  d be null for bo
22c70 74 68 2e 0d 0a 20 20 20 20 20 20 20 20 23 20 20  th...        #  
22c80 20 20 20 20 20 53 69 6e 63 65 20 74 68 65 20 73       Since the s
22c90 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74  qlite3_win32_set
22ca0 5f 64 69 72 65 63 74 6f 72 79 20 66 75 6e 63 74  _directory funct
22cb0 69 6f 6e 20 69 73 20 61 76 61 69 6c 61 62 6c 65  ion is available
22cc0 2c 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  ,..        #    
22cd0 20 20 20 75 73 65 20 69 74 2e 0d 0a 20 20 20 20     use it...    
22ce0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 66      #..        f
22cf0 6f 72 20 7b 73 65 74 20 69 6e 64 65 78 20 31 7d  or {set index 1}
22d00 20 7b 24 69 6e 64 65 78 20 3c 20 33 7d 20 7b 69   {$index < 3} {i
22d10 6e 63 72 20 69 6e 64 65 78 7d 20 7b 0d 0a 20 20  ncr index} {..  
22d20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
22d30 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
22d40 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20    object invoke 
22d50 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69  -flags +NonPubli
22d60 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  c \..           
22d70 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61       System.Data
22d80 2e 53 51 4c 69 74 65 2e 55 6e 73 61 66 65 4e 61  .SQLite.UnsafeNa
22d90 74 69 76 65 4d 65 74 68 6f 64 73 20 5c 0d 0a 20  tiveMethods \.. 
22da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
22db0 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74  qlite3_win32_set
22dc0 5f 64 69 72 65 63 74 6f 72 79 20 24 69 6e 64 65  _directory $inde
22dd0 78 20 6e 75 6c 6c 0d 0a 20 20 20 20 20 20 20 20  x null..        
22de0 20 20 7d 20 72 65 73 75 6c 74 5d 20 3d 3d 20 30    } result] == 0
22df0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
22e00 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
22e10 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
22e20 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
22e30 20 20 20 20 22 2d 2d 2d 2d 20 63 61 6c 6c 20 73      "---- call s
22e40 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74  qlite3_win32_set
22e50 5f 64 69 72 65 63 74 6f 72 79 28 22 20 24 69 6e  _directory(" $in
22e60 64 65 78 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  dex \..         
22e70 20 20 20 20 20 20 20 22 2c 20 6e 75 6c 6c 29 2e         ", null).
22e80 2e 2e 20 6f 6b 3a 20 22 20 24 72 65 73 75 6c 74  .. ok: " $result
22e90 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \n]..          
22ea0 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
22eb0 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
22ec0 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
22ed0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
22ee0 20 20 20 20 22 2d 2d 2d 2d 20 63 61 6c 6c 20 73      "---- call s
22ef0 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74  qlite3_win32_set
22f00 5f 64 69 72 65 63 74 6f 72 79 28 22 20 24 69 6e  _directory(" $in
22f10 64 65 78 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  dex \..         
22f20 20 20 20 20 20 20 20 22 2c 20 6e 75 6c 6c 29 2e         ", null).
22f30 2e 2e 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74  .. error: " \n\t
22f40 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20   $result \n]..  
22f50 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
22f60 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c     }..      } el
22f70 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  se {..        #.
22f80 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
22f90 20 4e 6f 77 20 6d 61 6b 65 20 73 75 72 65 20 74   Now make sure t
22fa0 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  he database and 
22fb0 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74  temporary direct
22fc0 6f 72 69 65 73 20 61 72 65 0d 0a 20 20 20 20 20  ories are..     
22fd0 20 20 20 23 20 20 20 20 20 20 20 72 65 73 65 74     #       reset
22fe0 20 74 68 65 69 72 20 64 65 66 61 75 6c 74 20 76   their default v
22ff0 61 6c 75 65 73 2c 20 77 68 69 63 68 20 73 68 6f  alues, which sho
23000 75 6c 64 20 62 65 20 6e 75 6c 6c 20 66 6f 72 20  uld be null for 
23010 62 6f 74 68 2e 0d 0a 20 20 20 20 20 20 20 20 23  both...        #
23020 20 20 20 20 20 20 20 53 69 6e 63 65 20 74 68 65         Since the
23030 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73   sqlite3_win32_s
23040 65 74 5f 64 69 72 65 63 74 6f 72 79 20 66 75 6e  et_directory fun
23050 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 0d 0a  ction does not..
23060 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
23070 61 70 70 65 61 72 20 74 6f 20 62 65 20 61 76 61  appear to be ava
23080 69 6c 61 62 6c 65 2c 20 75 73 65 20 74 68 65 20  ilable, use the 
23090 61 73 73 6f 63 69 61 74 65 64 20 50 52 41 47 4d  associated PRAGM
230a0 41 20 63 6f 6d 6d 61 6e 64 73 0d 0a 20 20 20 20  A commands..    
230b0 20 20 20 20 23 20 20 20 20 20 20 20 69 6e 73 74      #       inst
230c0 65 61 64 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ead...        #.
230d0 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68  .        foreach
230e0 20 64 69 72 65 63 74 6f 72 79 20 5b 6c 69 73 74   directory [list
230f0 20 64 61 74 61 5f 73 74 6f 72 65 5f 64 69 72 65   data_store_dire
23100 63 74 6f 72 79 20 74 65 6d 70 5f 73 74 6f 72 65  ctory temp_store
23110 5f 64 69 72 65 63 74 6f 72 79 5d 20 7b 0d 0a 20  _directory] {.. 
23120 20 20 20 20 20 20 20 20 20 73 65 74 20 73 71 6c           set sql
23130 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 50 52   [appendArgs "PR
23140 41 47 4d 41 20 22 20 24 64 69 72 65 63 74 6f 72  AGMA " $director
23150 79 20 22 20 3d 20 5c 22 5c 22 3b 22 5d 0d 0a 0d  y " = \"\";"]...
23160 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b  .          if {[
23170 63 61 74 63 68 20 7b 65 78 65 63 75 74 65 53 71  catch {executeSq
23180 6c 20 24 73 71 6c 7d 20 72 65 73 75 6c 74 5d 20  l $sql} result] 
23190 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
231a0 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
231b0 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
231c0 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
231d0 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 65 78          "---- ex
231e0 65 63 75 74 65 20 50 52 41 47 4d 41 20 22 20 24  ecute PRAGMA " $
231f0 64 69 72 65 63 74 6f 72 79 20 22 2e 2e 2e 20 6f  directory "... o
23200 6b 3a 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20  k: \"" \..      
23210 20 20 20 20 20 20 20 20 20 20 24 72 65 73 75 6c            $resul
23220 74 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  t \"\n]..       
23230 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
23240 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
23250 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
23260 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
23270 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 65 78 65         "---- exe
23280 63 75 74 65 20 50 52 41 47 4d 41 20 22 20 24 64  cute PRAGMA " $d
23290 69 72 65 63 74 6f 72 79 20 22 2e 2e 2e 20 65 72  irectory "... er
232a0 72 6f 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20  ror: " \..      
232b0 20 20 20 20 20 20 20 20 20 20 5c 6e 5c 74 20 24            \n\t $
232c0 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20  result \n]..    
232d0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
232e0 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20   }..      }..   
232f0 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
23300 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 44 69  checkForSQLiteDi
23310 72 65 63 74 6f 72 69 65 73 20 7b 20 63 68 61 6e  rectories { chan
23320 6e 65 6c 20 7b 72 65 73 65 74 20 66 61 6c 73 65  nel {reset false
23330 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a  } } {..      #..
23340 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68        # NOTE: Ch
23350 65 63 6b 20 69 66 20 74 68 65 20 73 71 6c 69 74  eck if the sqlit
23360 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72  e3_win32_set_dir
23370 65 63 74 6f 72 79 20 66 75 6e 63 74 69 6f 6e 20  ectory function 
23380 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0a 20  is available... 
23390 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 74 70       #..      tp
233a0 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5c 0d 0a  uts $channel \..
233b0 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
233c0 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 66 75 6e  checking for fun
233d0 63 74 69 6f 6e 20 73 71 6c 69 74 65 33 5f 77 69  ction sqlite3_wi
233e0 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72  n32_set_director
233f0 79 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20  y... "....      
23400 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
23410 20 54 68 69 73 20 63 61 6c 6c 20 74 6f 20 74 68   This call to th
23420 65 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  e sqlite3_win32_
23430 73 65 74 5f 64 69 72 65 63 74 6f 72 79 20 66 75  set_directory fu
23440 6e 63 74 69 6f 6e 20 75 73 65 73 20 74 68 65 0d  nction uses the.
23450 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69  .      #       i
23460 6e 76 61 6c 69 64 20 76 61 6c 75 65 20 30 20 66  nvalid value 0 f
23470 6f 72 20 74 68 65 20 66 69 72 73 74 20 61 72 67  or the first arg
23480 75 6d 65 6e 74 2e 20 20 54 68 69 73 20 63 6f 64  ument.  This cod
23490 65 20 69 73 20 64 65 73 69 67 6e 65 64 0d 0a 20  e is designed.. 
234a0 20 20 20 20 20 23 20 20 20 20 20 20 20 74 6f 20       #       to 
234b0 63 68 65 63 6b 20 69 66 20 63 61 6c 6c 69 6e 67  check if calling
234c0 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 77 69   the function wi
234d0 6c 6c 20 72 61 69 73 65 20 61 6e 20 65 78 63 65  ll raise an exce
234e0 70 74 69 6f 6e 20 28 69 2e 65 2e 0d 0a 20 20 20  ption (i.e...   
234f0 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20 61     #       the a
23500 63 74 75 61 6c 20 72 65 73 75 6c 74 20 6f 66 20  ctual result of 
23510 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  the function doe
23520 73 20 6e 6f 74 20 6d 61 74 74 65 72 20 61 73 20  s not matter as 
23530 6c 6f 6e 67 20 61 73 20 6e 6f 0d 0a 20 20 20 20  long as no..    
23540 20 20 23 20 20 20 20 20 20 20 64 69 72 65 63 74    #       direct
23550 6f 72 79 20 69 73 20 63 68 61 6e 67 65 64 29 2e  ory is changed).
23560 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
23570 20 69 66 20 7b 5b 69 73 57 69 6e 64 6f 77 73 5d   if {[isWindows]
23580 20 26 26 20 5b 63 61 74 63 68 20 7b 0d 0a 20 20   && [catch {..  
23590 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76        object inv
235a0 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50  oke -flags +NonP
235b0 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20  ublic \..       
235c0 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61       System.Data
235d0 2e 53 51 4c 69 74 65 2e 55 6e 73 61 66 65 4e 61  .SQLite.UnsafeNa
235e0 74 69 76 65 4d 65 74 68 6f 64 73 20 5c 0d 0a 20  tiveMethods \.. 
235f0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
23600 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72  e3_win32_set_dir
23610 65 63 74 6f 72 79 20 30 20 6e 75 6c 6c 0d 0a 20  ectory 0 null.. 
23620 20 20 20 20 20 7d 5d 20 3d 3d 20 30 7d 20 74 68       }] == 0} th
23630 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
23640 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
23650 20 43 61 6c 6c 69 6e 67 20 74 68 65 20 73 71 6c   Calling the sql
23660 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64  ite3_win32_set_d
23670 69 72 65 63 74 6f 72 79 20 66 75 6e 63 74 69 6f  irectory functio
23680 6e 20 64 6f 65 73 20 6e 6f 74 0d 0a 20 20 20 20  n does not..    
23690 20 20 20 20 23 20 20 20 20 20 20 20 63 61 75 73      #       caus
236a0 65 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 3b 20  e an exception; 
236b0 74 68 65 72 65 66 6f 72 65 2c 20 69 74 20 6d 75  therefore, it mu
236c0 73 74 20 62 65 20 61 76 61 69 6c 61 62 6c 65 20  st be available 
236d0 28 69 2e 65 2e 0d 0a 20 20 20 20 20 20 20 20 23  (i.e...        #
236e0 20 20 20 20 20 20 20 65 76 65 6e 20 74 68 6f 75         even thou
236f0 67 68 20 69 74 20 73 68 6f 75 6c 64 20 72 65 74  gh it should ret
23700 75 72 6e 20 61 20 66 61 69 6c 75 72 65 20 72 65  urn a failure re
23710 74 75 72 6e 20 63 6f 64 65 20 69 6e 20 74 68 69  turn code in thi
23720 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  s..        #    
23730 20 20 20 63 61 73 65 29 2e 0d 0a 20 20 20 20 20     case)...     
23740 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 61 64     #..        ad
23750 64 43 6f 6e 73 74 72 61 69 6e 74 20 73 71 6c 69  dConstraint sqli
23760 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69  te3_win32_set_di
23770 72 65 63 74 6f 72 79 0d 0a 0d 0a 20 20 20 20 20  rectory....     
23780 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
23790 6c 20 79 65 73 5c 6e 0d 0a 0d 0a 20 20 20 20 20  l yes\n....     
237a0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
237b0 4e 4f 54 45 3a 20 44 6f 65 73 20 6f 75 72 20 63  NOTE: Does our c
237c0 61 6c 6c 65 72 20 77 61 6e 74 20 74 6f 20 72 65  aller want to re
237d0 73 65 74 20 74 68 65 20 64 69 72 65 63 74 6f 72  set the director
237e0 69 65 73 3f 0d 0a 20 20 20 20 20 20 20 20 23 0d  ies?..        #.
237f0 0a 20 20 20 20 20 20 20 20 69 66 20 7b 24 72 65  .        if {$re
23800 73 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  set} then {..   
23810 20 20 20 20 20 20 20 72 65 73 65 74 53 51 4c 69         resetSQLi
23820 74 65 44 69 72 65 63 74 6f 72 69 65 73 20 24 63  teDirectories $c
23830 68 61 6e 6e 65 6c 20 74 72 75 65 0d 0a 20 20 20  hannel true..   
23840 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20       }..      } 
23850 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
23860 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e  tputs $channel n
23870 6f 5c 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23  o\n....        #
23880 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
23890 3a 20 44 6f 65 73 20 6f 75 72 20 63 61 6c 6c 65  : Does our calle
238a0 72 20 77 61 6e 74 20 74 6f 20 72 65 73 65 74 20  r want to reset 
238b0 74 68 65 20 64 69 72 65 63 74 6f 72 69 65 73 3f  the directories?
238c0 20 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 0d    This can only.
238d0 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
238e0 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20 69 66   be performed if
238f0 20 53 51 4c 69 74 65 20 69 73 20 6c 6f 61 64 65   SQLite is loade
23900 64 20 61 6e 64 20 72 65 61 64 79 20 66 6f 72 20  d and ready for 
23910 75 73 65 20 62 79 20 74 68 65 20 74 65 73 74 0d  use by the test.
23920 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
23930 20 73 75 69 74 65 2e 0d 0a 20 20 20 20 20 20 20   suite...       
23940 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   #..        if {
23950 24 72 65 73 65 74 20 26 26 20 5b 69 73 53 51 4c  $reset && [isSQL
23960 69 74 65 52 65 61 64 79 5d 7d 20 74 68 65 6e 20  iteReady]} then 
23970 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65 73  {..          res
23980 65 74 53 51 4c 69 74 65 44 69 72 65 63 74 6f 72  etSQLiteDirector
23990 69 65 73 20 24 63 68 61 6e 6e 65 6c 20 66 61 6c  ies $channel fal
239a0 73 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  se..        }.. 
239b0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
239c0 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
239d0 20 46 69 6e 61 6c 6c 79 2c 20 73 68 6f 77 20 74   Finally, show t
239e0 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
239f0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
23a00 20 61 6e 64 20 74 65 6d 70 6f 72 61 72 79 0d 0a   and temporary..
23a10 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64 69        #       di
23a20 72 65 63 74 6f 72 69 65 73 2e 20 20 54 68 69 73  rectories.  This
23a30 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 70 65 72   can only be per
23a40 66 6f 72 6d 65 64 20 69 66 20 53 51 4c 69 74 65  formed if SQLite
23a50 20 69 73 20 6c 6f 61 64 65 64 0d 0a 20 20 20 20   is loaded..    
23a60 20 20 23 20 20 20 20 20 20 20 61 6e 64 20 72 65    #       and re
23a70 61 64 79 20 66 6f 72 20 75 73 65 20 62 79 20 74  ady for use by t
23a80 68 65 20 74 65 73 74 20 73 75 69 74 65 2e 0d 0a  he test suite...
23a90 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
23aa0 66 20 7b 5b 69 73 53 51 4c 69 74 65 52 65 61 64  f {[isSQLiteRead
23ab0 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  y]} then {..    
23ac0 20 20 20 20 66 6f 72 65 61 63 68 20 64 69 72 65      foreach dire
23ad0 63 74 6f 72 79 20 5b 6c 69 73 74 20 64 61 74 61  ctory [list data
23ae0 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79  _store_directory
23af0 20 74 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65   temp_store_dire
23b00 63 74 6f 72 79 5d 20 7b 0d 0a 20 20 20 20 20 20  ctory] {..      
23b10 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
23b20 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22  el [appendArgs "
23b30 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 22 20  ---- checking " 
23b40 24 64 69 72 65 63 74 6f 72 79 20 22 2e 2e 2e 20  $directory "... 
23b50 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  "]....          
23b60 73 65 74 20 73 71 6c 20 5b 61 70 70 65 6e 64 41  set sql [appendA
23b70 72 67 73 20 22 50 52 41 47 4d 41 20 22 20 24 64  rgs "PRAGMA " $d
23b80 69 72 65 63 74 6f 72 79 20 5c 3b 5d 0d 0a 0d 0a  irectory \;]....
23b90 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63            if {[c
23ba0 61 74 63 68 20 7b 65 78 65 63 75 74 65 53 71 6c  atch {executeSql
23bb0 20 24 73 71 6c 20 73 63 61 6c 61 72 7d 20 72 65   $sql scalar} re
23bc0 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  sult] == 0} then
23bd0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
23be0 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
23bf0 61 70 70 65 6e 64 41 72 67 73 20 22 6f 6b 3a 20  appendArgs "ok: 
23c00 5c 22 22 20 24 72 65 73 75 6c 74 20 5c 22 5c 6e  \"" $result \"\n
23c10 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65  ]..          } e
23c20 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
23c30 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
23c40 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 65  l [appendArgs "e
23c50 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 72 65  rror: " \n\t $re
23c60 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  sult \n]..      
23c70 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
23c80 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
23c90 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 6c 6f  .....    proc lo
23ca0 61 64 53 51 4c 69 74 65 54 65 73 74 53 65 74 74  adSQLiteTestSett
23cb0 69 6e 67 73 20 7b 20 63 68 61 6e 6e 65 6c 20 7b  ings { channel {
23cc0 73 75 66 66 69 78 20 22 22 7d 20 7b 71 75 69 65  suffix ""} {quie
23cd0 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20  t false} } {..  
23ce0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
23cf0 4f 54 45 3a 20 53 6b 69 70 20 6c 6f 61 64 69 6e  OTE: Skip loadin
23d00 67 20 74 68 65 20 73 65 74 74 69 6e 67 73 20 69  g the settings i
23d10 66 20 74 68 65 69 72 20 75 73 61 67 65 20 68 61  f their usage ha
23d20 73 20 62 65 65 6e 20 64 69 73 61 62 6c 65 64 2e  s been disabled.
23d30 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
23d40 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
23d50 74 73 20 3a 3a 6e 6f 28 73 71 6c 69 74 65 54 65  ts ::no(sqliteTe
23d60 73 74 53 65 74 74 69 6e 67 73 29 5d 7d 20 74 68  stSettings)]} th
23d70 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
23d80 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
23d90 20 4c 6f 61 64 20 63 75 73 74 6f 6d 20 70 65 72   Load custom per
23da0 2d 75 73 65 72 20 61 6e 64 2f 6f 72 20 70 65 72  -user and/or per
23db0 2d 68 6f 73 74 20 74 65 73 74 20 73 65 74 74 69  -host test setti
23dc0 6e 67 73 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20  ngs now...      
23dd0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20    #..        if 
23de0 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
23df0 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 75 73 65  tcl_platform(use
23e00 72 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  r)]} then {..   
23e10 20 20 20 20 20 20 20 73 65 74 20 75 73 65 72 53         set userS
23e20 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 20  ettingsFileName 
23e30 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 43  [file join [getC
23e40 6f 6d 6d 6f 6e 44 69 72 65 63 74 6f 72 79 5d 20  ommonDirectory] 
23e50 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
23e60 20 5b 61 70 70 65 6e 64 41 72 67 73 20 73 65 74   [appendArgs set
23e70 74 69 6e 67 73 20 24 73 75 66 66 69 78 20 2e 20  tings $suffix . 
23e80 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28  $::tcl_platform(
23e90 75 73 65 72 29 20 2e 65 61 67 6c 65 5d 5d 0d 0a  user) .eagle]]..
23ea0 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
23eb0 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 75 73  [file exists $us
23ec0 65 72 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61  erSettingsFileNa
23ed0 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  me]} then {..   
23ee0 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71           if {!$q
23ef0 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
23f00 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
23f10 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
23f20 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
23f30 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
23f40 2d 20 6c 6f 61 64 69 6e 67 20 70 65 72 2d 75 73  - loading per-us
23f50 65 72 20 74 65 73 74 20 73 65 74 74 69 6e 67 73  er test settings
23f60 20 66 69 6c 65 20 5c 22 22 20 5c 0d 0a 20 20 20   file \"" \..   
23f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24                 $
23f80 75 73 65 72 53 65 74 74 69 6e 67 73 46 69 6c 65  userSettingsFile
23f90 4e 61 6d 65 20 5c 22 2e 2e 2e 5c 6e 5d 0d 0a 20  Name \"...\n].. 
23fa0 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
23fb0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
23fc0 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
23fd0 20 20 20 20 20 20 20 20 75 70 6c 65 76 65 6c 20          uplevel 
23fe0 31 20 5b 6c 69 73 74 20 73 6f 75 72 63 65 20 24  1 [list source $
23ff0 75 73 65 72 53 65 74 74 69 6e 67 73 46 69 6c 65  userSettingsFile
24000 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20 20 20 20  Name]..         
24010 20 20 20 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65     } error]} the
24020 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
24030 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
24040 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
24050 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
24060 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
24070 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
24080 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20            "==== 
24090 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20  WARNING: failed 
240a0 74 6f 20 6c 6f 61 64 20 70 65 72 2d 75 73 65 72  to load per-user
240b0 20 73 65 74 74 69 6e 67 73 20 66 69 6c 65 20 5c   settings file \
240c0 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  "" \..          
240d0 20 20 20 20 20 20 20 20 20 20 24 75 73 65 72 53            $userS
240e0 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 20  ettingsFileName 
240f0 22 5c 22 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e  "\", error: " \n
24100 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20  \t $error \n].. 
24110 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
24120 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
24130 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20           } else 
24140 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  {..            i
24150 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
24160 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
24170 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
24180 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
24190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
241a0 20 20 22 2d 2d 2d 2d 20 73 6b 69 70 70 65 64 20    "---- skipped 
241b0 6c 6f 61 64 69 6e 67 20 70 65 72 2d 75 73 65 72  loading per-user
241c0 20 74 65 73 74 20 73 65 74 74 69 6e 67 73 20 66   test settings f
241d0 69 6c 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20  ile \"" \..     
241e0 20 20 20 20 20 20 20 20 20 20 20 20 20 24 75 73               $us
241f0 65 72 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61  erSettingsFileNa
24200 6d 65 20 22 5c 22 2c 20 69 74 20 64 6f 65 73 20  me "\", it does 
24210 6e 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a 20  not exist\n"].. 
24220 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
24230 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
24240 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
24250 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
24260 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
24270 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
24280 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
24290 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20 20 20 20  #######....     
242a0 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69     if {[info exi
242b0 73 74 73 20 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f  sts ::tcl_platfo
242c0 72 6d 28 68 6f 73 74 29 5d 7d 20 74 68 65 6e 20  rm(host)]} then 
242d0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  {..          set
242e0 20 68 6f 73 74 53 65 74 74 69 6e 67 73 46 69 6c   hostSettingsFil
242f0 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e  eName [file join
24300 20 5b 67 65 74 43 6f 6d 6d 6f 6e 44 69 72 65 63   [getCommonDirec
24310 74 6f 72 79 5d 20 5c 0d 0a 20 20 20 20 20 20 20  tory] \..       
24320 20 20 20 20 20 20 20 5b 61 70 70 65 6e 64 41 72         [appendAr
24330 67 73 20 73 65 74 74 69 6e 67 73 20 24 73 75 66  gs settings $suf
24340 66 69 78 20 2e 20 24 3a 3a 74 63 6c 5f 70 6c 61  fix . $::tcl_pla
24350 74 66 6f 72 6d 28 68 6f 73 74 29 20 2e 65 61 67  tform(host) .eag
24360 6c 65 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  le]]....        
24370 20 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73    if {[file exis
24380 74 73 20 24 68 6f 73 74 53 65 74 74 69 6e 67 73  ts $hostSettings
24390 46 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20  FileName]} then 
243a0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  {..            i
243b0 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
243c0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
243d0 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
243e0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
243f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24400 20 20 22 2d 2d 2d 2d 20 6c 6f 61 64 69 6e 67 20    "---- loading 
24410 70 65 72 2d 68 6f 73 74 20 74 65 73 74 20 73 65  per-host test se
24420 74 74 69 6e 67 73 20 66 69 6c 65 20 5c 22 22 20  ttings file \"" 
24430 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
24440 20 20 20 20 20 24 68 6f 73 74 53 65 74 74 69 6e       $hostSettin
24450 67 73 46 69 6c 65 4e 61 6d 65 20 5c 22 2e 2e 2e  gsFileName \"...
24460 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  \n]..           
24470 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
24480 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
24490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 75 70                up
244a0 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74 20 73 6f  level 1 [list so
244b0 75 72 63 65 20 24 68 6f 73 74 53 65 74 74 69 6e  urce $hostSettin
244c0 67 73 46 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20  gsFileName]..   
244d0 20 20 20 20 20 20 20 20 20 7d 20 65 72 72 6f 72           } error
244e0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
244f0 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71           if {!$q
24500 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
24510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70                tp
24520 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
24530 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
24540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24550 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66  "==== WARNING: f
24560 61 69 6c 65 64 20 74 6f 20 6c 6f 61 64 20 70 65  ailed to load pe
24570 72 2d 68 6f 73 74 20 73 65 74 74 69 6e 67 73 20  r-host settings 
24580 66 69 6c 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20  file \"" \..    
24590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
245a0 24 68 6f 73 74 53 65 74 74 69 6e 67 73 46 69 6c  $hostSettingsFil
245b0 65 4e 61 6d 65 20 22 5c 22 2c 20 65 72 72 6f 72  eName "\", error
245c0 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20  : " \n\t $error 
245d0 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  \n]..           
245e0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
245f0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d    }..          }
24600 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
24610 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
24620 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
24630 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
24640 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
24650 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
24660 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6b          "---- sk
24670 69 70 70 65 64 20 6c 6f 61 64 69 6e 67 20 70 65  ipped loading pe
24680 72 2d 68 6f 73 74 20 74 65 73 74 20 73 65 74 74  r-host test sett
24690 69 6e 67 73 20 66 69 6c 65 20 5c 22 22 20 5c 0d  ings file \"" \.
246a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
246b0 20 20 20 24 68 6f 73 74 53 65 74 74 69 6e 67 73     $hostSettings
246c0 46 69 6c 65 4e 61 6d 65 20 22 5c 22 2c 20 69 74  FileName "\", it
246d0 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 5c   does not exist\
246e0 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n"]..           
246f0 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d   }..          }.
24700 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
24710 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
24720 20 20 20 70 72 6f 63 20 63 6f 70 79 53 61 6d 70     proc copySamp
24730 6c 65 44 61 74 61 62 61 73 65 46 69 6c 65 73 20  leDatabaseFiles 
24740 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 75 70 6c 65  {} {..      uple
24750 76 65 6c 20 31 20 7b 0d 0a 20 20 20 20 20 20 20  vel 1 {..       
24760 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
24770 54 45 3a 20 43 6f 70 79 20 28 6f 72 20 72 65 2d  TE: Copy (or re-
24780 63 6f 70 79 29 20 74 68 65 20 72 65 66 65 72 65  copy) the refere
24790 6e 63 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  nce database fil
247a0 65 20 75 73 65 64 20 66 6f 72 20 74 68 69 73 0d  e used for this.
247b0 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
247c0 20 75 6e 69 74 20 74 65 73 74 20 74 6f 20 74 68   unit test to th
247d0 65 20 62 75 69 6c 64 20 64 69 72 65 63 74 6f 72  e build director
247e0 79 20 69 6e 20 63 61 73 65 20 69 74 20 68 61 73  y in case it has
247f0 20 62 65 65 6e 20 63 68 61 6e 67 65 64 0d 0a 20   been changed.. 
24800 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62         #       b
24810 79 20 61 20 70 72 65 76 69 6f 75 73 20 74 65 73  y a previous tes
24820 74 20 72 75 6e 2e 0d 0a 20 20 20 20 20 20 20 20  t run...        
24830 23 0d 0a 20 20 20 20 20 20 20 20 66 69 6c 65 20  #..        file 
24840 63 6f 70 79 20 2d 66 6f 72 63 65 20 24 6e 6f 72  copy -force $nor
24850 74 68 77 69 6e 64 45 66 44 62 46 69 6c 65 20 5c  thwindEfDbFile \
24860 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c  ..          [fil
24870 65 20 6a 6f 69 6e 20 5b 67 65 74 42 75 69 6c 64  e join [getBuild
24880 44 69 72 65 63 74 6f 72 79 20 66 61 6c 73 65 5d  Directory false]
24890 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 6e 6f 72   [file tail $nor
248a0 74 68 77 69 6e 64 45 66 44 62 46 69 6c 65 5d 5d  thwindEfDbFile]]
248b0 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
248c0 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 72 75  .....    proc ru
248d0 6e 53 51 4c 69 74 65 54 65 73 74 50 72 6f 6c 6f  nSQLiteTestProlo
248e0 67 75 65 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20  gue {} {..      
248f0 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
24900 20 53 6b 69 70 20 72 75 6e 6e 69 6e 67 20 6f 75   Skip running ou
24910 72 20 63 75 73 74 6f 6d 20 70 72 6f 6c 6f 67 75  r custom prologu
24920 65 20 69 66 20 74 68 65 20 6d 61 69 6e 20 6f 6e  e if the main on
24930 65 20 68 61 73 20 62 65 65 6e 0d 0a 20 20 20 20  e has been..    
24940 20 20 23 20 20 20 20 20 20 20 73 6b 69 70 70 65    #       skippe
24950 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  d...      #..   
24960 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
24970 69 73 74 73 20 3a 3a 6e 6f 28 70 72 6f 6c 6f 67  ists ::no(prolog
24980 75 65 2e 65 61 67 6c 65 29 5d 7d 20 74 68 65 6e  ue.eagle)]} then
24990 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
249a0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4c         # NOTE: L
249b0 6f 61 64 20 74 68 65 20 22 62 65 66 6f 72 65 2d  oad the "before-
249c0 63 6f 6e 73 74 72 61 69 6e 74 73 22 20 63 75 73  constraints" cus
249d0 74 6f 6d 20 70 65 72 2d 75 73 65 72 20 61 6e 64  tom per-user and
249e0 2f 6f 72 20 70 65 72 2d 68 6f 73 74 0d 0a 20 20  /or per-host..  
249f0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 65        #       te
24a00 73 74 20 73 65 74 74 69 6e 67 73 20 6e 6f 77 2e  st settings now.
24a10 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
24a20 20 20 20 20 20 75 70 6c 65 76 65 6c 20 31 20 5b       uplevel 1 [
24a30 6c 69 73 74 20 6c 6f 61 64 53 51 4c 69 74 65 54  list loadSQLiteT
24a40 65 73 74 53 65 74 74 69 6e 67 73 20 24 3a 3a 74  estSettings $::t
24a50 65 73 74 5f 63 68 61 6e 6e 65 6c 20 2e 62 65 66  est_channel .bef
24a60 6f 72 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ore]....        
24a70 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
24a80 45 3a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20  E: Check if the 
24a90 5b 6f 62 6a 65 63 74 5d 20 63 6f 6d 6d 61 6e 64  [object] command
24aa0 20 69 73 20 61 76 61 69 6c 61 62 6c 65 3b 20 69   is available; i
24ab0 66 20 6e 6f 74 2c 20 61 64 64 20 73 6f 6d 65 0d  f not, add some.
24ac0 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
24ad0 20 73 68 69 6d 73 20 74 6f 20 6d 61 6b 65 20 74   shims to make t
24ae0 68 65 20 74 65 73 74 20 73 75 69 74 65 20 72 75  he test suite ru
24af0 6e 20 73 6d 6f 6f 74 68 65 72 2e 0d 0a 20 20 20  n smoother...   
24b00 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
24b10 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 4f 62  checkForSQLiteOb
24b20 6a 65 63 74 43 6f 6d 6d 61 6e 64 20 24 3a 3a 74  jectCommand $::t
24b30 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20  est_channel.... 
24b40 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
24b50 20 20 23 20 4e 4f 54 45 3a 20 44 65 74 65 72 6d    # NOTE: Determ
24b60 69 6e 65 20 74 68 65 20 6e 61 6d 65 73 20 6f 66  ine the names of
24b70 20 74 68 65 20 6e 61 74 69 76 65 20 70 6c 61 74   the native plat
24b80 66 6f 72 6d 20 61 6e 64 20 61 72 63 68 69 74 65  form and archite
24b90 63 74 75 72 65 2e 0d 0a 20 20 20 20 20 20 20 20  cture...        
24ba0 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 70  #..        set p
24bb0 6c 61 74 66 6f 72 6d 20 5b 67 65 74 42 75 69 6c  latform [getBuil
24bc0 64 50 6c 61 74 66 6f 72 6d 20 74 72 75 65 5d 0d  dPlatform true].
24bd0 0a 20 20 20 20 20 20 20 20 73 65 74 20 61 72 63  .        set arc
24be0 68 69 74 65 63 74 75 72 65 20 5b 61 72 63 68 69  hitecture [archi
24bf0 74 65 63 74 75 72 65 46 6f 72 50 6c 61 74 66 6f  tectureForPlatfo
24c00 72 6d 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a 0d  rm $platform]...
24c10 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
24c20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77      # NOTE: Show
24c30 20 74 68 65 20 70 6c 61 74 66 6f 72 6d 20 61 6e   the platform an
24c40 64 20 61 72 63 68 69 74 65 63 74 75 72 65 20 75  d architecture u
24c50 73 65 64 20 74 6f 20 68 65 6c 70 20 6c 6f 63 61  sed to help loca
24c60 74 65 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20  te the..        
24c70 23 20 20 20 20 20 20 20 6e 61 74 69 76 65 20 62  #       native b
24c80 75 69 6c 64 20 66 69 6c 65 73 2e 0d 0a 20 20 20  uild files...   
24c90 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
24ca0 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
24cb0 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
24cc0 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
24cd0 20 22 2d 2d 2d 2d 20 70 6c 61 74 66 6f 72 6d 20   "---- platform 
24ce0 66 6f 72 20 6c 6f 63 61 74 69 6e 67 20 6e 61 74  for locating nat
24cf0 69 76 65 20 62 75 69 6c 64 20 66 69 6c 65 73 20  ive build files 
24d00 69 73 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20  is \"" \..      
24d10 20 20 20 20 20 20 24 70 6c 61 74 66 6f 72 6d 20        $platform 
24d20 5c 22 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  \"\n]....       
24d30 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
24d40 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
24d50 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
24d60 20 20 22 2d 2d 2d 2d 20 61 72 63 68 69 74 65 63    "---- architec
24d70 74 75 72 65 20 66 6f 72 20 6c 6f 63 61 74 69 6e  ture for locatin
24d80 67 20 6e 61 74 69 76 65 20 62 75 69 6c 64 20 66  g native build f
24d90 69 6c 65 73 20 69 73 20 5c 22 22 20 5c 0d 0a 20  iles is \"" \.. 
24da0 20 20 20 20 20 20 20 20 20 20 20 24 61 72 63 68             $arch
24db0 69 74 65 63 74 75 72 65 20 5c 22 5c 6e 5d 0d 0a  itecture \"\n]..
24dc0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
24dd0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69       # NOTE: Bui
24de0 6c 64 20 61 20 6c 69 73 74 20 6f 66 20 63 6f 6e  ld a list of con
24df0 66 69 67 75 72 61 74 69 6f 6e 20 66 69 6c 65 73  figuration files
24e00 20 74 68 61 74 20 77 65 20 68 61 6e 64 6c 65 2e   that we handle.
24e10 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
24e20 20 20 20 20 20 73 65 74 20 63 6f 6e 66 69 67 46       set configF
24e30 69 6c 65 4e 61 6d 65 73 20 5b 6c 69 73 74 20 5c  ileNames [list \
24e40 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 79  ..            Sy
24e50 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
24e60 2e 64 6c 6c 2e 63 6f 6e 66 69 67 5d 0d 0a 0d 0a  .dll.config]....
24e70 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
24e80 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64     # NOTE: Build
24e90 20 61 20 6c 69 73 74 20 6f 66 20 61 75 78 69 6c   a list of auxil
24ea0 69 61 72 79 20 4d 61 6e 61 67 65 64 20 44 65 62  iary Managed Deb
24eb0 75 67 67 69 6e 67 20 41 73 73 69 73 74 61 6e 74  ugging Assistant
24ec0 73 20 28 4d 44 41 29 0d 0a 20 20 20 20 20 20 20  s (MDA)..       
24ed0 20 23 20 20 20 20 20 20 20 63 6f 6e 66 69 67 75   #       configu
24ee0 72 61 74 69 6f 6e 20 66 69 6c 65 73 20 74 68 61  ration files tha
24ef0 74 20 77 65 20 68 61 6e 64 6c 65 2e 0d 0a 20 20  t we handle...  
24f00 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
24f10 20 73 65 74 20 6d 64 61 43 6f 6e 66 69 67 46 69   set mdaConfigFi
24f20 6c 65 4e 61 6d 65 73 20 5b 6c 69 73 74 20 5c 0d  leNames [list \.
24f30 0a 20 20 20 20 20 20 20 20 20 20 20 20 45 61 67  .            Eag
24f40 6c 65 53 68 65 6c 6c 33 32 2e 65 78 65 2e 6d 64  leShell32.exe.md
24f50 61 2e 63 6f 6e 66 69 67 20 49 6e 73 74 61 6c 6c  a.config Install
24f60 65 72 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e 66 69  er.exe.mda.confi
24f70 67 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  g \..           
24f80 20 74 65 73 74 2e 65 78 65 2e 6d 64 61 2e 63 6f   test.exe.mda.co
24f90 6e 66 69 67 20 74 65 73 74 6c 69 6e 71 2e 65 78  nfig testlinq.ex
24fa0 65 2e 6d 64 61 2e 63 6f 6e 66 69 67 20 5c 0d 0a  e.mda.config \..
24fb0 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
24fc0 65 66 36 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e 66  ef6.exe.mda.conf
24fd0 69 67 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23  ig]....        #
24fe0 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
24ff0 3a 20 42 75 69 6c 64 20 74 68 65 20 6c 69 73 74  : Build the list
25000 20 6f 66 20 65 78 74 65 72 6e 61 6c 20 66 69 6c   of external fil
25010 65 73 20 74 68 61 74 20 77 65 20 68 61 6e 64 6c  es that we handl
25020 65 2e 20 20 53 6f 6d 65 20 6f 66 0d 0a 20 20 20  e.  Some of..   
25030 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
25040 73 65 20 66 69 6c 65 73 20 6d 61 79 20 62 65 20  se files may be 
25050 6e 61 74 69 76 65 20 61 6e 64 2f 6f 72 20 6d 61  native and/or ma
25060 6e 61 67 65 64 20 61 73 73 65 6d 62 6c 69 65 73  naged assemblies
25070 20 74 68 61 74 20 61 72 65 0d 0a 20 20 20 20 20   that are..     
25080 20 20 20 23 20 20 20 20 20 20 20 72 65 71 75 69     #       requi
25090 72 65 64 20 74 6f 20 70 65 72 66 6f 72 6d 20 76  red to perform v
250a0 61 72 69 6f 75 73 20 74 65 73 74 73 2e 0d 0a 20  arious tests... 
250b0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
250c0 20 20 73 65 74 20 65 78 74 65 72 6e 61 6c 46 69    set externalFi
250d0 6c 65 4e 61 6d 65 73 20 5b 6c 69 73 74 20 5c 0d  leNames [list \.
250e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69  .            [fi
250f0 6c 65 20 6a 6f 69 6e 20 45 6e 74 69 74 79 46 72  le join EntityFr
25100 61 6d 65 77 6f 72 6b 20 6c 69 62 20 5b 73 74 72  amework lib [str
25110 69 6e 67 20 6d 61 70 20 5b 6c 69 73 74 20 46 78  ing map [list Fx
25120 20 22 22 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20   ""] \..        
25130 20 20 20 20 5b 73 74 72 69 6e 67 20 6d 61 70 20      [string map 
25140 5b 6c 69 73 74 20 6e 65 74 46 78 34 35 31 20 6e  [list netFx451 n
25150 65 74 46 78 34 35 20 6e 65 74 46 78 34 35 32 20  etFx45 netFx452 
25160 6e 65 74 46 78 34 35 20 6e 65 74 46 78 34 36 20  netFx45 netFx46 
25170 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e  \..            n
25180 65 74 46 78 34 35 20 6e 65 74 46 78 34 36 31 20  etFx45 netFx461 
25190 6e 65 74 46 78 34 35 20 6e 65 74 46 78 34 36 32  netFx45 netFx462
251a0 20 6e 65 74 46 78 34 35 20 6e 65 74 46 78 34 37   netFx45 netFx47
251b0 20 6e 65 74 46 78 34 35 20 5c 0d 0a 20 20 20 20   netFx45 \..    
251c0 20 20 20 20 20 20 20 20 6e 65 74 46 78 34 37 31          netFx471
251d0 20 6e 65 74 46 78 34 35 5d 20 5b 67 65 74 42 75   netFx45] [getBu
251e0 69 6c 64 4e 65 74 46 78 5d 5d 5d 20 45 6e 74 69  ildNetFx]]] Enti
251f0 74 79 46 72 61 6d 65 77 6f 72 6b 2e 64 6c 6c 5d  tyFramework.dll]
25200 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ]....        #..
25210 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
25220 42 75 69 6c 64 20 74 68 65 20 6c 69 73 74 20 6f  Build the list o
25230 66 20 6e 61 74 69 76 65 20 61 73 73 65 6d 62 6c  f native assembl
25240 79 20 66 69 6c 65 73 20 74 68 61 74 20 77 65 20  y files that we 
25250 68 61 6e 64 6c 65 2e 0d 0a 20 20 20 20 20 20 20  handle...       
25260 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   #..        set 
25270 6e 61 74 69 76 65 46 69 6c 65 4e 61 6d 65 73 20  nativeFileNames 
25280 5b 6c 69 73 74 5d 0d 0a 0d 0a 20 20 20 20 20 20  [list]....      
25290 20 20 65 76 61 6c 20 6c 61 70 70 65 6e 64 20 6e    eval lappend n
252a0 61 74 69 76 65 46 69 6c 65 4e 61 6d 65 73 20 5b  ativeFileNames [
252b0 67 65 74 4e 61 74 69 76 65 4c 69 62 72 61 72 79  getNativeLibrary
252c0 46 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79 5d 0d 0a  FileNamesOnly]..
252d0 20 20 20 20 20 20 20 20 65 76 61 6c 20 6c 61 70          eval lap
252e0 70 65 6e 64 20 6e 61 74 69 76 65 46 69 6c 65 4e  pend nativeFileN
252f0 61 6d 65 73 20 5b 67 65 74 49 6e 74 65 72 6f 70  ames [getInterop
25300 41 73 73 65 6d 62 6c 79 46 69 6c 65 4e 61 6d 65  AssemblyFileName
25310 73 4f 6e 6c 79 5d 0d 0a 0d 0a 20 20 20 20 20 20  sOnly]....      
25320 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
25330 4f 54 45 3a 20 42 75 69 6c 64 20 74 68 65 20 6c  OTE: Build the l
25340 69 73 74 20 6f 66 20 6d 69 78 65 64 2d 6d 6f 64  ist of mixed-mod
25350 65 20 61 73 73 65 6d 62 6c 79 20 66 69 6c 65 73  e assembly files
25360 20 74 68 61 74 20 77 65 20 68 61 6e 64 6c 65 2e   that we handle.
25370 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
25380 20 20 20 20 20 73 65 74 20 6d 69 78 65 64 46 69       set mixedFi
25390 6c 65 4e 61 6d 65 73 20 5b 6c 69 73 74 5d 0d 0a  leNames [list]..
253a0 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 68  ..        if {[h
253b0 61 73 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20  asRuntimeOption 
253c0 6e 61 74 69 76 65 5d 7d 20 74 68 65 6e 20 7b 0d  native]} then {.
253d0 0a 20 20 20 20 20 20 20 20 20 20 6c 61 70 70 65  .          lappe
253e0 6e 64 20 6d 69 78 65 64 46 69 6c 65 4e 61 6d 65  nd mixedFileName
253f0 73 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  s System.Data.SQ
25400 4c 69 74 65 2e 64 6c 6c 0d 0a 20 20 20 20 20 20  Lite.dll..      
25410 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23    }....        #
25420 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
25430 3a 20 42 75 69 6c 64 20 74 68 65 20 6c 69 73 74  : Build the list
25440 20 6f 66 20 6d 61 6e 61 67 65 64 20 61 73 73 65   of managed asse
25450 6d 62 6c 79 20 66 69 6c 65 73 20 74 68 61 74 20  mbly files that 
25460 77 65 20 68 61 6e 64 6c 65 2e 0d 0a 20 20 20 20  we handle...    
25470 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73      #..        s
25480 65 74 20 6d 61 6e 61 67 65 64 46 69 6c 65 4e 61  et managedFileNa
25490 6d 65 73 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20  mes [list \..   
254a0 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e           System.
254b0 44 61 74 61 2e 53 51 4c 69 74 65 2e 4c 69 6e 71  Data.SQLite.Linq
254c0 2e 64 6c 6c 20 53 79 73 74 65 6d 2e 44 61 74 61  .dll System.Data
254d0 2e 53 51 4c 69 74 65 2e 45 46 36 2e 64 6c 6c 5d  .SQLite.EF6.dll]
254e0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b  ....        if {
254f0 21 5b 68 61 73 52 75 6e 74 69 6d 65 4f 70 74 69  ![hasRuntimeOpti
25500 6f 6e 20 6e 61 74 69 76 65 5d 7d 20 74 68 65 6e  on native]} then
25510 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6c 61   {..          la
25520 70 70 65 6e 64 20 6d 61 6e 61 67 65 64 46 69 6c  ppend managedFil
25530 65 4e 61 6d 65 73 20 53 79 73 74 65 6d 2e 44 61  eNames System.Da
25540 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 0d 0a 20  ta.SQLite.dll.. 
25550 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
25560 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
25570 20 4e 4f 54 45 3a 20 53 68 6f 77 20 74 68 65 20   NOTE: Show the 
25580 76 61 72 69 6f 75 73 20 6c 69 73 74 73 20 6f 66  various lists of
25590 20 66 69 6c 65 20 6e 61 6d 65 73 20 74 68 61 74   file names that
255a0 20 61 72 65 20 68 61 6e 64 6c 65 64 20 62 79 20   are handled by 
255b0 74 68 69 73 0d 0a 20 20 20 20 20 20 20 20 23 20  this..        # 
255c0 20 20 20 20 20 20 70 72 6f 63 65 64 75 72 65 2e        procedure.
255d0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
255e0 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
255f0 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
25600 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
25610 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6c 69 73 74        "---- list
25620 20 6f 66 20 5c 22 63 6f 6e 66 69 67 75 72 61 74   of \"configurat
25630 69 6f 6e 5c 22 20 66 69 6c 65 20 6e 61 6d 65 73  ion\" file names
25640 20 69 73 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20   is: " \..      
25650 20 20 20 20 20 20 24 63 6f 6e 66 69 67 46 69 6c        $configFil
25660 65 4e 61 6d 65 73 20 5c 6e 5d 0d 0a 0d 0a 20 20  eNames \n]....  
25670 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
25680 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
25690 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
256a0 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6c 69 73         "---- lis
256b0 74 20 6f 66 20 5c 22 4d 44 41 20 63 6f 6e 66 69  t of \"MDA confi
256c0 67 75 72 61 74 69 6f 6e 5c 22 20 66 69 6c 65 20  guration\" file 
256d0 6e 61 6d 65 73 20 69 73 3a 20 22 20 5c 0d 0a 20  names is: " \.. 
256e0 20 20 20 20 20 20 20 20 20 20 20 24 6d 64 61 43             $mdaC
256f0 6f 6e 66 69 67 46 69 6c 65 4e 61 6d 65 73 20 5c  onfigFileNames \
25700 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 70  n]....        tp
25710 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
25720 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
25730 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  \..            "
25740 2d 2d 2d 2d 20 6c 69 73 74 20 6f 66 20 5c 22 65  ---- list of \"e
25750 78 74 65 72 6e 61 6c 5c 22 20 66 69 6c 65 20 6e  xternal\" file n
25760 61 6d 65 73 20 69 73 3a 20 22 20 24 65 78 74 65  ames is: " $exte
25770 72 6e 61 6c 46 69 6c 65 4e 61 6d 65 73 20 5c 6e  rnalFileNames \n
25780 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 70 75  ]....        tpu
25790 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
257a0 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
257b0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d  ..            "-
257c0 2d 2d 2d 20 6c 69 73 74 20 6f 66 20 5c 22 6e 61  --- list of \"na
257d0 74 69 76 65 5c 22 20 66 69 6c 65 20 6e 61 6d 65  tive\" file name
257e0 73 20 69 73 3a 20 22 20 24 6e 61 74 69 76 65 46  s is: " $nativeF
257f0 69 6c 65 4e 61 6d 65 73 20 5c 6e 5d 0d 0a 0d 0a  ileNames \n]....
25800 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
25810 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
25820 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
25830 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6c           "---- l
25840 69 73 74 20 6f 66 20 5c 22 6d 69 78 65 64 5c 22  ist of \"mixed\"
25850 20 66 69 6c 65 20 6e 61 6d 65 73 20 69 73 3a 20   file names is: 
25860 22 20 24 6d 69 78 65 64 46 69 6c 65 4e 61 6d 65  " $mixedFileName
25870 73 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  s \n]....       
25880 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
25890 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
258a0 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
258b0 20 20 22 2d 2d 2d 2d 20 6c 69 73 74 20 6f 66 20    "---- list of 
258c0 5c 22 6d 61 6e 61 67 65 64 5c 22 20 66 69 6c 65  \"managed\" file
258d0 20 6e 61 6d 65 73 20 69 73 3a 20 22 20 24 6d 61   names is: " $ma
258e0 6e 61 67 65 64 46 69 6c 65 4e 61 6d 65 73 20 5c  nagedFileNames \
258f0 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d  n]....        #.
25900 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
25910 20 52 65 6d 6f 76 65 20 61 6e 79 20 74 65 73 74   Remove any test
25920 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 68 61   constraints tha
25930 74 20 72 65 66 65 72 20 74 6f 20 74 68 65 20 6e  t refer to the n
25940 61 74 69 76 65 20 61 6e 64 2f 6f 72 0d 0a 20 20  ative and/or..  
25950 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6d 61        #       ma
25960 6e 61 67 65 64 20 61 73 73 65 6d 62 6c 79 20 66  naged assembly f
25970 69 6c 65 73 20 74 68 61 74 20 77 65 20 68 61 6e  iles that we han
25980 64 6c 65 20 75 6e 6c 65 73 73 20 66 6f 72 62 69  dle unless forbi
25990 64 64 65 6e 20 66 72 6f 6d 0d 0a 20 20 20 20 20  dden from..     
259a0 20 20 20 23 20 20 20 20 20 20 20 64 6f 69 6e 67     #       doing
259b0 20 73 6f 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d   so...        #.
259c0 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69  .        if {![i
259d0 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
259e0 73 71 6c 69 74 65 52 65 6d 6f 76 65 43 6f 6e 73  sqliteRemoveCons
259f0 74 72 61 69 6e 74 73 29 5d 7d 20 74 68 65 6e 20  traints)]} then 
25a00 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  {..          for
25a10 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 63  each fileName $c
25a20 6f 6e 66 69 67 46 69 6c 65 4e 61 6d 65 73 20 7b  onfigFileNames {
25a30 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ..            re
25a40 6d 6f 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b  moveConstraint [
25a50 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f  appendArgs file_
25a60 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20   $fileName]..   
25a70 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
25a80 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69        foreach fi
25a90 6c 65 4e 61 6d 65 20 24 6d 64 61 43 6f 6e 66 69  leName $mdaConfi
25aa0 67 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20  gFileNames {..  
25ab0 20 20 20 20 20 20 20 20 20 20 72 65 6d 6f 76 65            remove
25ac0 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65  Constraint [appe
25ad0 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 24 66 69  ndArgs file_ $fi
25ae0 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20 20  leName]..       
25af0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
25b00 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61    foreach fileNa
25b10 6d 65 20 24 65 78 74 65 72 6e 61 6c 46 69 6c 65  me $externalFile
25b20 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20  Names {..       
25b30 20 20 20 20 20 72 65 6d 6f 76 65 43 6f 6e 73 74       removeConst
25b40 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67  raint [appendArg
25b50 73 20 66 69 6c 65 5f 20 5b 66 69 6c 65 20 74 61  s file_ [file ta
25b60 69 6c 20 24 66 69 6c 65 4e 61 6d 65 5d 5d 0d 0a  il $fileName]]..
25b70 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
25b80 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
25b90 20 66 69 6c 65 4e 61 6d 65 20 24 6e 61 74 69 76   fileName $nativ
25ba0 65 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20  eFileNames {..  
25bb0 20 20 20 20 20 20 20 20 20 20 72 65 6d 6f 76 65            remove
25bc0 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65  Constraint [appe
25bd0 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 24 66 69  ndArgs file_ $fi
25be0 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20 20  leName]..       
25bf0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
25c00 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61    foreach fileNa
25c10 6d 65 20 24 6d 69 78 65 64 46 69 6c 65 4e 61 6d  me $mixedFileNam
25c20 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  es {..          
25c30 20 20 72 65 6d 6f 76 65 43 6f 6e 73 74 72 61 69    removeConstrai
25c40 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66  nt [appendArgs f
25c50 69 6c 65 5f 20 24 66 69 6c 65 4e 61 6d 65 5d 0d  ile_ $fileName].
25c60 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  .          }....
25c70 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63            foreac
25c80 68 20 66 69 6c 65 4e 61 6d 65 20 24 6d 61 6e 61  h fileName $mana
25c90 67 65 64 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a  gedFileNames {..
25ca0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6d 6f              remo
25cb0 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70  veConstraint [ap
25cc0 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 24  pendArgs file_ $
25cd0 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20 20 20  fileName]..     
25ce0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
25cf0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  }....        #..
25d00 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
25d10 53 6b 69 70 20 61 6c 6c 20 53 79 73 74 65 6d 2e  Skip all System.
25d20 44 61 74 61 2e 53 51 4c 69 74 65 20 72 65 6c 61  Data.SQLite rela
25d30 74 65 64 20 66 69 6c 65 20 68 61 6e 64 6c 69 6e  ted file handlin
25d40 67 20 28 64 65 6c 65 74 69 6e 67 2c 0d 0a 20 20  g (deleting,..  
25d50 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f        #       co
25d60 70 79 69 6e 67 2c 20 61 6e 64 20 6c 6f 61 64 69  pying, and loadi
25d70 6e 67 29 20 69 66 20 69 6e 73 74 72 75 63 74 65  ng) if instructe
25d80 64 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  d...        #.. 
25d90 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
25da0 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 73 71  o exists ::no(sq
25db0 6c 69 74 65 46 69 6c 65 73 29 5d 7d 20 74 68 65  liteFiles)]} the
25dc0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23  n {..          #
25dd0 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
25de0 54 45 3a 20 53 6b 69 70 20 74 72 79 69 6e 67 20  TE: Skip trying 
25df0 74 6f 20 64 65 6c 65 74 65 20 61 6e 79 20 66 69  to delete any fi
25e00 6c 65 73 20 69 66 20 69 6e 73 74 72 75 63 74 65  les if instructe
25e10 64 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  d...          #.
25e20 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21  .          if {!
25e30 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
25e40 6f 28 64 65 6c 65 74 65 53 71 6c 69 74 65 46 69  o(deleteSqliteFi
25e50 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  les)]} then {.. 
25e60 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
25e70 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
25e80 6f 28 64 65 6c 65 74 65 53 71 6c 69 74 65 43 6f  o(deleteSqliteCo
25e90 6e 66 69 67 46 69 6c 65 73 29 5d 7d 20 74 68 65  nfigFiles)]} the
25ea0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
25eb0 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e     foreach fileN
25ec0 61 6d 65 20 24 63 6f 6e 66 69 67 46 69 6c 65 4e  ame $configFileN
25ed0 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20  ames {..        
25ee0 20 20 20 20 20 20 20 20 74 72 79 44 65 6c 65 74          tryDelet
25ef0 65 42 69 6e 61 72 79 46 69 6c 65 20 24 66 69 6c  eBinaryFile $fil
25f00 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 20  eName..         
25f10 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
25f20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
25f30 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
25f40 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65  exists ::no(dele
25f50 74 65 53 71 6c 69 74 65 45 78 74 65 72 6e 61 6c  teSqliteExternal
25f60 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d  Files)]} then {.
25f70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66  .              f
25f80 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20  oreach fileName 
25f90 24 6d 64 61 43 6f 6e 66 69 67 46 69 6c 65 4e 61  $mdaConfigFileNa
25fa0 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  mes {..         
25fb0 20 20 20 20 20 20 20 74 72 79 44 65 6c 65 74 65         tryDelete
25fc0 42 75 69 6c 64 46 69 6c 65 20 24 66 69 6c 65 4e  BuildFile $fileN
25fd0 61 6d 65 20 66 61 6c 73 65 0d 0a 20 20 20 20 20  ame false..     
25fe0 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
25ff0 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65              fore
26000 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 65 78  ach fileName $ex
26010 74 65 72 6e 61 6c 46 69 6c 65 4e 61 6d 65 73 20  ternalFileNames 
26020 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
26030 20 20 20 74 72 79 44 65 6c 65 74 65 42 69 6e 61     tryDeleteBina
26040 72 79 46 69 6c 65 20 24 66 69 6c 65 4e 61 6d 65  ryFile $fileName
26050 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
26060 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  }..            }
26070 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
26080 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
26090 73 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c  s ::no(deleteSql
260a0 69 74 65 4e 61 74 69 76 65 46 69 6c 65 73 29 5d  iteNativeFiles)]
260b0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
260c0 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
260d0 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64  fo exists ::no(d
260e0 65 6c 65 74 65 53 71 6c 69 74 65 49 6d 70 6c 69  eleteSqliteImpli
260f0 63 69 74 4e 61 74 69 76 65 46 69 6c 65 73 29 5d  citNativeFiles)]
26100 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
26110 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63            foreac
26120 68 20 66 69 6c 65 4e 61 6d 65 20 24 6e 61 74 69  h fileName $nati
26130 76 65 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20  veFileNames {.. 
26140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26150 20 74 72 79 44 65 6c 65 74 65 41 73 73 65 6d 62   tryDeleteAssemb
26160 6c 79 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20  ly $fileName..  
26170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
26180 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
26190 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
261a0 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
261b0 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53  sts ::no(deleteS
261c0 71 6c 69 74 65 4e 6f 6e 49 6d 70 6c 69 63 69 74  qliteNonImplicit
261d0 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d  Files)]} then {.
261e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
261f0 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
26200 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71  ts ::no(deleteSq
26210 6c 69 74 65 50 6c 61 74 66 6f 72 6d 46 69 6c 65  litePlatformFile
26220 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  s)] && \..      
26230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 73                [s
26240 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 70 6c  tring length $pl
26250 61 74 66 6f 72 6d 5d 20 3e 20 30 7d 20 74 68 65  atform] > 0} the
26260 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
26270 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66         foreach f
26280 69 6c 65 4e 61 6d 65 20 24 6e 61 74 69 76 65 46  ileName $nativeF
26290 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20  ileNames {..    
262a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
262b0 74 72 79 44 65 6c 65 74 65 41 73 73 65 6d 62 6c  tryDeleteAssembl
262c0 79 20 24 66 69 6c 65 4e 61 6d 65 20 24 70 6c 61  y $fileName $pla
262d0 74 66 6f 72 6d 0d 0a 20 20 20 20 20 20 20 20 20  tform..         
262e0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
262f0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
26300 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26310 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
26320 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71  ts ::no(deleteSq
26330 6c 69 74 65 41 72 63 68 69 74 65 63 74 75 72 65  liteArchitecture
26340 46 69 6c 65 73 29 5d 20 26 26 20 5c 0d 0a 20 20  Files)] && \..  
26350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26360 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
26370 20 24 61 72 63 68 69 74 65 63 74 75 72 65 5d 20   $architecture] 
26380 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
26390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
263a0 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20  oreach fileName 
263b0 24 6e 61 74 69 76 65 46 69 6c 65 4e 61 6d 65 73  $nativeFileNames
263c0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
263d0 20 20 20 20 20 20 20 20 74 72 79 44 65 6c 65 74          tryDelet
263e0 65 41 73 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e  eAssembly $fileN
263f0 61 6d 65 20 24 61 72 63 68 69 74 65 63 74 75 72  ame $architectur
26400 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e..             
26410 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
26420 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
26430 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
26440 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
26450 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69           if {![i
26460 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
26470 64 65 6c 65 74 65 53 71 6c 69 74 65 4d 69 78 65  deleteSqliteMixe
26480 64 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b  dFiles)]} then {
26490 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
264a0 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  #..             
264b0 20 23 20 4e 4f 54 45 3a 20 49 66 20 74 68 65 20   # NOTE: If the 
264c0 22 6e 61 74 69 76 65 22 20 72 75 6e 74 69 6d 65  "native" runtime
264d0 20 6f 70 74 69 6f 6e 20 69 73 20 73 65 74 2c 20   option is set, 
264e0 64 65 6c 65 74 65 20 69 6d 70 6c 69 63 69 74 0d  delete implicit.
264f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
26500 20 20 20 20 20 20 20 6d 69 78 65 64 2d 6d 6f 64         mixed-mod
26510 65 20 61 73 73 65 6d 62 6c 79 20 66 69 6c 65 73  e assembly files
26520 20 61 73 20 77 65 6c 6c 2e 20 20 54 68 69 73 20   as well.  This 
26530 72 75 6e 74 69 6d 65 20 6f 70 74 69 6f 6e 0d 0a  runtime option..
26540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
26550 20 20 20 20 20 20 63 68 65 63 6b 20 69 73 20 68        check is h
26560 61 6e 64 6c 65 64 20 77 68 65 6e 20 62 75 69 6c  andled when buil
26570 64 69 6e 67 20 74 68 65 20 6c 69 73 74 20 6f 66  ding the list of
26580 20 6d 69 78 65 64 2d 6d 6f 64 65 0d 0a 20 20 20   mixed-mode..   
26590 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20             #    
265a0 20 20 20 61 73 73 65 6d 62 6c 79 20 66 69 6c 65     assembly file
265b0 20 6e 61 6d 65 73 2e 0d 0a 20 20 20 20 20 20 20   names...       
265c0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
265d0 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
265e0 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64  fo exists ::no(d
265f0 65 6c 65 74 65 53 71 6c 69 74 65 49 6d 70 6c 69  eleteSqliteImpli
26600 63 69 74 4d 69 78 65 64 46 69 6c 65 73 29 5d 7d  citMixedFiles)]}
26610 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
26620 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
26630 20 66 69 6c 65 4e 61 6d 65 20 24 6d 69 78 65 64   fileName $mixed
26640 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20  FileNames {..   
26650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
26660 72 79 44 65 6c 65 74 65 41 73 73 65 6d 62 6c 79  ryDeleteAssembly
26670 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20   $fileName..    
26680 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
26690 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
266a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
266b0 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
266c0 73 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c  s ::no(deleteSql
266d0 69 74 65 4e 6f 6e 49 6d 70 6c 69 63 69 74 46 69  iteNonImplicitFi
266e0 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  les)]} then {.. 
266f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
26700 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
26710 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69   ::no(deleteSqli
26720 74 65 50 6c 61 74 66 6f 72 6d 46 69 6c 65 73 29  tePlatformFiles)
26730 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
26740 20 20 20 20 20 20 20 20 20 20 20 20 5b 73 74 72              [str
26750 69 6e 67 20 6c 65 6e 67 74 68 20 24 70 6c 61 74  ing length $plat
26760 66 6f 72 6d 5d 20 3e 20 30 7d 20 74 68 65 6e 20  form] > 0} then 
26770 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
26780 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c       foreach fil
26790 65 4e 61 6d 65 20 24 6d 69 78 65 64 46 69 6c 65  eName $mixedFile
267a0 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20  Names {..       
267b0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79               try
267c0 44 65 6c 65 74 65 41 73 73 65 6d 62 6c 79 20 24  DeleteAssembly $
267d0 66 69 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f  fileName $platfo
267e0 72 6d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  rm..            
267f0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
26800 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
26810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
26820 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
26830 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69 74  ::no(deleteSqlit
26840 65 41 72 63 68 69 74 65 63 74 75 72 65 46 69 6c  eArchitectureFil
26850 65 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  es)] && \..     
26860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b                 [
26870 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 61  string length $a
26880 72 63 68 69 74 65 63 74 75 72 65 5d 20 3e 20 30  rchitecture] > 0
26890 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
268a0 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65              fore
268b0 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6d 69  ach fileName $mi
268c0 78 65 64 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a  xedFileNames {..
268d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
268e0 20 20 20 20 74 72 79 44 65 6c 65 74 65 41 73 73      tryDeleteAss
268f0 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61 6d 65 20  embly $fileName 
26900 24 61 72 63 68 69 74 65 63 74 75 72 65 0d 0a 20  $architecture.. 
26910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26920 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
26930 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
26940 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
26950 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
26960 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
26970 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65  exists ::no(dele
26980 74 65 53 71 6c 69 74 65 4d 61 6e 61 67 65 64 46  teSqliteManagedF
26990 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  iles)]} then {..
269a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f                fo
269b0 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24  reach fileName $
269c0 6d 61 6e 61 67 65 64 46 69 6c 65 4e 61 6d 65 73  managedFileNames
269d0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
269e0 20 20 20 20 74 72 79 44 65 6c 65 74 65 41 73 73      tryDeleteAss
269f0 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61 6d 65 0d  embly $fileName.
26a00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
26a10 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
26a20 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  .          }....
26a30 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
26a40 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43         # NOTE: C
26a50 68 65 63 6b 20 66 6f 72 20 74 68 65 20 22 61 75  heck for the "au
26a60 74 6f 53 65 6c 65 63 74 22 20 72 75 6e 74 69 6d  toSelect" runtim
26a70 65 20 6f 70 74 69 6f 6e 2e 20 20 49 66 20 70 72  e option.  If pr
26a80 65 73 65 6e 74 2c 0d 0a 20 20 20 20 20 20 20 20  esent,..        
26a90 20 20 23 20 20 20 20 20 20 20 61 74 74 65 6d 70    #       attemp
26aa0 74 20 74 6f 20 61 75 74 6f 6d 61 74 69 63 61 6c  t to automatical
26ab0 6c 79 20 73 65 6c 65 63 74 20 74 68 65 20 66 69  ly select the fi
26ac0 72 73 74 20 61 76 61 69 6c 61 62 6c 65 0d 0a 20  rst available.. 
26ad0 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
26ae0 20 62 75 69 6c 64 20 28 6f 72 20 22 72 65 6c 65   build (or "rele
26af0 61 73 65 22 29 20 6f 66 20 53 51 4c 69 74 65 20  ase") of SQLite 
26b00 61 6e 64 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  and System.Data.
26b10 53 51 4c 69 74 65 0d 0a 20 20 20 20 20 20 20 20  SQLite..        
26b20 20 20 23 20 20 20 20 20 20 20 66 6f 72 20 75 73    #       for us
26b30 65 20 77 69 74 68 20 74 68 65 20 74 65 73 74 20  e with the test 
26b40 73 75 69 74 65 2e 0d 0a 20 20 20 20 20 20 20 20  suite...        
26b50 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69    #..          i
26b60 66 20 7b 5b 68 61 73 52 75 6e 74 69 6d 65 4f 70  f {[hasRuntimeOp
26b70 74 69 6f 6e 20 61 75 74 6f 53 65 6c 65 63 74 5d  tion autoSelect]
26b80 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
26b90 20 20 20 20 20 20 69 66 20 7b 21 5b 63 68 65 63        if {![chec
26ba0 6b 46 6f 72 53 51 4c 69 74 65 42 75 69 6c 64 73  kForSQLiteBuilds
26bb0 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
26bc0 20 74 72 75 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a   true]} then {..
26bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 68                ch
26be0 65 63 6b 46 6f 72 53 51 4c 69 74 65 52 65 6c 65  eckForSQLiteRele
26bf0 61 73 65 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  ases $::test_cha
26c00 6e 6e 65 6c 20 74 72 75 65 0d 0a 20 20 20 20 20  nnel true..     
26c10 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
26c20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
26c30 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
26c40 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20 74 72 79  # NOTE: Skip try
26c50 69 6e 67 20 74 6f 20 76 65 72 69 66 79 20 74 68  ing to verify th
26c60 65 20 62 75 69 6c 64 20 64 69 72 65 63 74 6f 72  e build director
26c70 79 20 69 66 20 69 6e 73 74 72 75 63 74 65 64 3b  y if instructed;
26c80 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20  ..          #   
26c90 20 20 20 20 6f 74 68 65 72 77 69 73 65 2c 20 6d      otherwise, m
26ca0 61 6b 65 20 73 75 72 65 20 69 74 20 61 63 74 75  ake sure it actu
26cb0 61 6c 6c 79 20 65 78 69 73 74 73 20 6f 72 20 68  ally exists or h
26cc0 61 6c 74 20 74 68 65 20 65 6e 74 69 72 65 0d 0a  alt the entire..
26cd0 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
26ce0 20 20 74 65 73 74 69 6e 67 20 70 72 6f 63 65 73    testing proces
26cf0 73 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74  s if it does not
26d00 20 65 78 69 73 74 2e 0d 0a 20 20 20 20 20 20 20   exist...       
26d10 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
26d20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
26d30 73 20 3a 3a 6e 6f 28 76 65 72 69 66 79 42 75 69  s ::no(verifyBui
26d40 6c 64 44 69 72 65 63 74 6f 72 79 29 5d 7d 20 74  ldDirectory)]} t
26d50 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
26d60 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
26d70 20 20 23 20 4e 4f 54 45 3a 20 41 74 20 74 68 69    # NOTE: At thi
26d80 73 20 70 6f 69 6e 74 2c 20 74 68 65 20 62 75 69  s point, the bui
26d90 6c 64 20 64 69 72 65 63 74 6f 72 79 20 4d 55 53  ld directory MUS
26da0 54 20 65 78 69 73 74 20 61 73 20 61 0d 0a 20 20  T exist as a..  
26db0 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
26dc0 20 20 76 61 6c 69 64 20 64 69 72 65 63 74 6f 72    valid director
26dd0 79 20 66 6f 72 20 74 68 65 20 74 65 73 74 69 6e  y for the testin
26de0 67 20 70 72 6f 63 65 73 73 20 74 6f 20 63 6f 6e  g process to con
26df0 74 69 6e 75 65 2e 0d 0a 20 20 20 20 20 20 20 20  tinue...        
26e00 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
26e10 20 20 20 73 65 74 20 64 69 72 65 63 74 6f 72 79     set directory
26e20 20 5b 67 65 74 42 75 69 6c 64 44 69 72 65 63 74   [getBuildDirect
26e30 6f 72 79 20 66 61 6c 73 65 5d 0d 0a 0d 0a 20 20  ory false]....  
26e40 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
26e50 66 69 6c 65 20 65 78 69 73 74 73 20 24 64 69 72  file exists $dir
26e60 65 63 74 6f 72 79 5d 20 7c 7c 20 5c 0d 0a 20 20  ectory] || \..  
26e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 21 5b                ![
26e80 66 69 6c 65 20 69 73 64 69 72 65 63 74 6f 72 79  file isdirectory
26e90 20 24 64 69 72 65 63 74 6f 72 79 5d 7d 20 74 68   $directory]} th
26ea0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
26eb0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
26ec0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4a 75 73       # NOTE: Jus
26ed0 74 20 70 72 69 6f 72 20 74 6f 20 61 63 74 75 61  t prior to actua
26ee0 6c 6c 79 20 68 61 6c 74 69 6e 67 20 74 68 65 20  lly halting the 
26ef0 74 65 73 74 69 6e 67 20 70 72 6f 63 65 73 73 2c  testing process,
26f00 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
26f10 23 20 20 20 20 20 20 20 61 64 64 20 61 6e 20 65  #       add an e
26f20 72 72 6f 72 20 74 6f 20 74 68 65 20 74 65 73 74  rror to the test
26f30 20 6c 6f 67 20 66 69 6c 65 2e 0d 0a 20 20 20 20   log file...    
26f40 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
26f50 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
26f60 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
26f70 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
26f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26f90 20 20 22 2d 2d 2d 2d 20 63 6f 75 6c 64 20 6e 6f    "---- could no
26fa0 74 20 76 65 72 69 66 79 20 62 75 69 6c 64 20 64  t verify build d
26fb0 69 72 65 63 74 6f 72 79 20 5c 22 22 20 24 64 69  irectory \"" $di
26fc0 72 65 63 74 6f 72 79 20 5c 0d 0a 20 20 20 20 20  rectory \..     
26fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22               "\"
26fe0 2c 20 61 6c 6c 20 74 65 73 74 69 6e 67 20 68 61  , all testing ha
26ff0 6c 74 65 64 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20  lted\n"]....    
27000 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
27010 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
27020 45 3a 20 52 61 69 73 69 6e 67 20 61 20 73 63 72  E: Raising a scr
27030 69 70 74 20 65 72 72 6f 72 20 66 72 6f 6d 20 74  ipt error from t
27040 68 69 73 20 70 6f 69 6e 74 20 73 68 6f 75 6c 64  his point should
27050 20 68 61 6c 74 0d 0a 20 20 20 20 20 20 20 20 20   halt..         
27060 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
27070 20 74 65 73 74 69 6e 67 20 70 72 6f 63 65 73 73   testing process
27080 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
27090 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
270a0 20 20 65 72 72 6f 72 20 5b 61 70 70 65 6e 64 41    error [appendA
270b0 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
270c0 20 20 20 20 20 20 20 20 20 22 63 6f 75 6c 64 20           "could 
270d0 6e 6f 74 20 76 65 72 69 66 79 20 62 75 69 6c 64  not verify build
270e0 20 64 69 72 65 63 74 6f 72 79 20 5c 22 22 20 24   directory \"" $
270f0 64 69 72 65 63 74 6f 72 79 20 5c 0d 0a 20 20 20  directory \..   
27100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
27110 5c 22 2c 20 61 6c 6c 20 74 65 73 74 69 6e 67 20  \", all testing 
27120 68 61 6c 74 65 64 22 5d 0d 0a 20 20 20 20 20 20  halted"]..      
27130 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
27140 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
27150 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23    #..          #
27160 20 4e 4f 54 45 3a 20 53 6b 69 70 20 74 72 79 69   NOTE: Skip tryi
27170 6e 67 20 74 6f 20 63 6f 70 79 20 61 6e 79 20 66  ng to copy any f
27180 69 6c 65 73 20 69 66 20 69 6e 73 74 72 75 63 74  iles if instruct
27190 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  ed...          #
271a0 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
271b0 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
271c0 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65 46 69 6c  no(copySqliteFil
271d0 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  es)]} then {..  
271e0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
271f0 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
27200 28 63 6f 70 79 53 71 6c 69 74 65 43 6f 6e 66 69  (copySqliteConfi
27210 67 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b  gFiles)]} then {
27220 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
27230 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
27240 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20  annel \..       
27250 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
27260 20 63 6f 70 79 69 6e 67 20 5c 22 63 6f 6e 66 69   copying \"confi
27270 67 75 72 61 74 69 6f 6e 5c 22 20 66 69 6c 65 73  guration\" files
27280 2e 2e 2e 5c 6e 22 0d 0a 0d 0a 20 20 20 20 20 20  ...\n"....      
27290 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
272a0 66 69 6c 65 4e 61 6d 65 20 24 63 6f 6e 66 69 67  fileName $config
272b0 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20  FileNames {..   
272c0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79               try
272d0 43 6f 70 79 42 75 69 6c 64 46 69 6c 65 20 24 66  CopyBuildFile $f
272e0 69 6c 65 4e 61 6d 65 20 66 61 6c 73 65 0d 0a 20  ileName false.. 
272f0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
27300 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
27310 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
27320 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
27330 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65 45 78  :no(copySqliteEx
27340 74 65 72 6e 61 6c 46 69 6c 65 73 29 5d 7d 20 74  ternalFiles)]} t
27350 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
27360 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
27370 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 6f        # NOTE: Co
27380 70 79 20 74 68 65 20 4d 61 6e 61 67 65 64 20 44  py the Managed D
27390 65 62 75 67 67 69 6e 67 20 41 73 73 69 73 74 61  ebugging Assista
273a0 6e 74 73 20 28 4d 44 41 29 20 63 6f 6e 66 69 67  nts (MDA) config
273b0 75 72 61 74 69 6f 6e 0d 0a 20 20 20 20 20 20 20  uration..       
273c0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 66         #       f
273d0 69 6c 65 20 66 6f 72 20 74 68 65 20 45 61 67 6c  ile for the Eagl
273e0 65 20 73 68 65 6c 6c 20 74 6f 20 74 68 65 20 62  e shell to the b
273f0 75 69 6c 64 20 6f 75 74 70 75 74 20 64 69 72 65  uild output dire
27400 63 74 6f 72 79 2c 0d 0a 20 20 20 20 20 20 20 20  ctory,..        
27410 20 20 20 20 20 20 23 20 20 20 20 20 20 20 77 68        #       wh
27420 69 6c 65 20 75 73 69 6e 67 20 65 61 63 68 20 6f  ile using each o
27430 66 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 74  f the names of t
27440 68 65 20 76 61 72 69 6f 75 73 20 6c 65 67 61 63  he various legac
27450 79 20 74 65 73 74 0d 0a 20 20 20 20 20 20 20 20  y test..        
27460 20 20 20 20 20 20 23 20 20 20 20 20 20 20 65 78        #       ex
27470 65 63 75 74 61 62 6c 65 73 2e 20 20 54 68 69 73  ecutables.  This
27480 20 77 69 6c 6c 20 68 65 6c 70 20 74 6f 20 6d 61   will help to ma
27490 6b 65 20 73 75 72 65 20 74 68 61 74 20 61 6c 6c  ke sure that all
274a0 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 20 20   the..          
274b0 20 20 20 20 23 20 20 20 20 20 20 20 6c 65 67 61      #       lega
274c0 63 79 20 74 65 73 74 73 20 72 75 6e 20 77 69 74  cy tests run wit
274d0 68 20 65 78 61 63 74 6c 79 20 74 68 65 20 73 61  h exactly the sa
274e0 6d 65 20 73 65 74 20 6f 66 20 4d 61 6e 61 67 65  me set of Manage
274f0 64 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d..             
27500 20 23 20 20 20 20 20 20 20 44 65 62 75 67 67 69   #       Debuggi
27510 6e 67 20 41 73 73 69 73 74 61 6e 74 73 20 63 6f  ng Assistants co
27520 6e 66 69 67 75 72 65 64 2e 0d 0a 20 20 20 20 20  nfigured...     
27530 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
27540 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
27550 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
27560 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
27570 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 70 79 69       "---- copyi
27580 6e 67 20 5c 22 4d 44 41 20 63 6f 6e 66 69 67 75  ng \"MDA configu
27590 72 61 74 69 6f 6e 5c 22 20 66 69 6c 65 73 2e 2e  ration\" files..
275a0 2e 5c 6e 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20  .\n"....        
275b0 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69        foreach fi
275c0 6c 65 4e 61 6d 65 20 24 6d 64 61 43 6f 6e 66 69  leName $mdaConfi
275d0 67 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20  gFileNames {..  
275e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72                tr
275f0 79 43 6f 70 79 42 69 6e 61 72 79 46 69 6c 65 20  yCopyBinaryFile 
27600 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65 2e 6d  EagleShell.exe.m
27610 64 61 2e 63 6f 6e 66 69 67 20 74 72 75 65 20 22  da.config true "
27620 22 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20  " $fileName..   
27630 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
27640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
27650 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
27660 20 4e 4f 54 45 3a 20 43 6f 70 79 20 74 68 65 20   NOTE: Copy the 
27670 65 78 74 65 72 6e 61 6c 20 62 69 6e 61 72 69 65  external binarie
27680 73 2c 20 69 66 20 61 6e 79 2c 20 74 6f 20 74 68  s, if any, to th
27690 65 20 64 69 72 65 63 74 6f 72 79 20 74 68 61 74  e directory that
276a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
276b0 23 20 20 20 20 20 20 20 63 6f 6e 74 61 69 6e 73  #       contains
276c0 20 74 68 65 20 45 61 67 6c 65 20 73 68 65 6c 6c   the Eagle shell
276d0 2e 20 20 54 68 69 73 20 69 73 20 74 79 70 69 63  .  This is typic
276e0 61 6c 6c 79 20 75 73 65 64 20 74 6f 20 6d 61 6b  ally used to mak
276f0 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e..             
27700 20 23 20 20 20 20 20 20 20 73 75 72 65 20 61 73   #       sure as
27710 73 65 6d 62 6c 69 65 73 20 72 65 66 65 72 65 6e  semblies referen
27720 63 65 64 20 62 79 20 74 68 65 20 6f 6e 65 73 20  ced by the ones 
27730 62 65 69 6e 67 20 74 65 73 74 65 64 20 61 72 65  being tested are
27740 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
27750 23 20 20 20 20 20 20 20 61 76 61 69 6c 61 62 6c  #       availabl
27760 65 20 64 75 72 69 6e 67 20 74 68 65 20 74 65 73  e during the tes
27770 74 69 6e 67 20 70 72 6f 63 65 73 73 2e 0d 0a 20  ting process... 
27780 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a               #..
27790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70                tp
277a0 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
277b0 6e 65 6c 20 22 2d 2d 2d 2d 20 63 6f 70 79 69 6e  nel "---- copyin
277c0 67 20 5c 22 65 78 74 65 72 6e 61 6c 5c 22 20 66  g \"external\" f
277d0 69 6c 65 73 2e 2e 2e 5c 6e 22 0d 0a 0d 0a 20 20  iles...\n"....  
277e0 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65              fore
277f0 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 65 78  ach fileName $ex
27800 74 65 72 6e 61 6c 46 69 6c 65 4e 61 6d 65 73 20  ternalFileNames 
27810 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
27820 20 20 20 74 72 79 43 6f 70 79 45 78 74 65 72 6e     tryCopyExtern
27830 61 6c 46 69 6c 65 20 24 66 69 6c 65 4e 61 6d 65  alFile $fileName
27840 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
27850 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  }..            }
27860 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
27870 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
27880 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74  s ::no(copySqlit
27890 65 4e 61 74 69 76 65 46 69 6c 65 73 29 5d 7d 20  eNativeFiles)]} 
278a0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
278b0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
278c0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49         # NOTE: I
278d0 66 20 74 68 65 20 74 65 73 74 20 70 6c 61 74 66  f the test platf
278e0 6f 72 6d 20 69 73 20 6c 69 6b 65 6c 79 20 74 68  orm is likely th
278f0 65 20 64 65 66 61 75 6c 74 20 66 6f 72 20 74 68  e default for th
27900 69 73 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  is..            
27910 20 20 23 20 20 20 20 20 20 20 6d 61 63 68 69 6e    #       machin
27920 65 2c 20 61 6c 73 6f 20 74 72 79 20 74 6f 20 63  e, also try to c
27930 6f 70 79 20 74 68 65 20 6e 61 74 69 76 65 20 66  opy the native f
27940 69 6c 65 73 20 74 6f 20 74 68 65 0d 0a 20 20 20  iles to the..   
27950 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20             #    
27960 20 20 20 62 69 6e 61 72 79 20 6c 6f 63 61 74 69     binary locati
27970 6f 6e 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  on...           
27980 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
27990 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
279a0 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53  xists ::no(copyS
279b0 71 6c 69 74 65 49 6d 70 6c 69 63 69 74 4e 61 74  qliteImplicitNat
279c0 69 76 65 46 69 6c 65 73 29 5d 20 26 26 20 5c 0d  iveFiles)] && \.
279d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
279e0 20 20 20 5b 69 73 44 65 66 61 75 6c 74 42 75 69     [isDefaultBui
279f0 6c 64 50 6c 61 74 66 6f 72 6d 5d 7d 20 74 68 65  ldPlatform]} the
27a00 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
27a10 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
27a20 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20  st_channel \..  
27a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27a40 20 20 22 2d 2d 2d 2d 20 63 6f 70 79 69 6e 67 20    "---- copying 
27a50 69 6d 70 6c 69 63 69 74 20 5c 22 6e 61 74 69 76  implicit \"nativ
27a60 65 5c 22 20 66 69 6c 65 73 2e 2e 2e 5c 6e 22 0d  e\" files...\n".
27a70 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
27a80 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e     foreach fileN
27a90 61 6d 65 20 24 6e 61 74 69 76 65 46 69 6c 65 4e  ame $nativeFileN
27aa0 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20  ames {..        
27ab0 20 20 20 20 20 20 20 20 20 20 74 72 79 43 6f 70            tryCop
27ac0 79 41 73 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e  yAssembly $fileN
27ad0 61 6d 65 20 66 61 6c 73 65 0d 0a 20 20 20 20 20  ame false..     
27ae0 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
27af0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
27b00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
27b10 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
27b20 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65   ::no(copySqlite
27b30 4e 6f 6e 49 6d 70 6c 69 63 69 74 46 69 6c 65 73  NonImplicitFiles
27b40 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
27b50 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
27b60 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
27b70 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65 50 6c 61  no(copySqlitePla
27b80 74 66 6f 72 6d 46 69 6c 65 73 29 5d 20 26 26 20  tformFiles)] && 
27b90 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
27ba0 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c         [string l
27bb0 65 6e 67 74 68 20 24 70 6c 61 74 66 6f 72 6d 5d  ength $platform]
27bc0 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
27bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27be0 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
27bf0 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
27c00 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
27c10 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
27c20 20 63 6f 70 79 69 6e 67 20 5c 22 6e 61 74 69 76   copying \"nativ
27c30 65 5c 22 20 66 69 6c 65 73 20 66 6f 72 20 70 6c  e\" files for pl
27c40 61 74 66 6f 72 6d 20 5c 22 22 20 5c 0d 0a 20 20  atform \"" \..  
27c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27c60 20 20 20 20 24 70 6c 61 74 66 6f 72 6d 20 5c 22      $platform \"
27c70 2e 2e 2e 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20  ...\n]....      
27c80 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65              fore
27c90 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6e 61  ach fileName $na
27ca0 74 69 76 65 46 69 6c 65 4e 61 6d 65 73 20 7b 0d  tiveFileNames {.
27cb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
27cc0 20 20 20 20 20 74 72 79 43 6f 70 79 41 73 73 65       tryCopyAsse
27cd0 6d 62 6c 79 20 24 66 69 6c 65 4e 61 6d 65 20 66  mbly $fileName f
27ce0 61 6c 73 65 20 24 70 6c 61 74 66 6f 72 6d 0d 0a  alse $platform..
27cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27d00 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
27d10 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
27d20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
27d30 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
27d40 28 63 6f 70 79 53 71 6c 69 74 65 41 72 63 68 69  (copySqliteArchi
27d50 74 65 63 74 75 72 65 46 69 6c 65 73 29 5d 20 26  tectureFiles)] &
27d60 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  & \..           
27d70 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67           [string
27d80 20 6c 65 6e 67 74 68 20 24 61 72 63 68 69 74 65   length $archite
27d90 63 74 75 72 65 5d 20 3e 20 30 7d 20 74 68 65 6e  cture] > 0} then
27da0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
27db0 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
27dc0 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
27dd0 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
27de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27df0 20 22 2d 2d 2d 2d 20 63 6f 70 79 69 6e 67 20 5c   "---- copying \
27e00 22 6e 61 74 69 76 65 5c 22 20 66 69 6c 65 73 20  "native\" files 
27e10 66 6f 72 20 61 72 63 68 69 74 65 63 74 75 72 65  for architecture
27e20 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20   \"" \..        
27e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24 61                $a
27e40 72 63 68 69 74 65 63 74 75 72 65 20 5c 22 2e 2e  rchitecture \"..
27e50 2e 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  .\n]....        
27e60 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63            foreac
27e70 68 20 66 69 6c 65 4e 61 6d 65 20 24 6e 61 74 69  h fileName $nati
27e80 76 65 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20  veFileNames {.. 
27e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27ea0 20 20 20 74 72 79 43 6f 70 79 41 73 73 65 6d 62     tryCopyAssemb
27eb0 6c 79 20 24 66 69 6c 65 4e 61 6d 65 20 66 61 6c  ly $fileName fal
27ec0 73 65 20 24 61 72 63 68 69 74 65 63 74 75 72 65  se $architecture
27ed0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
27ee0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
27ef0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
27f00 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
27f10 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
27f20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
27f30 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63  fo exists ::no(c
27f40 6f 70 79 53 71 6c 69 74 65 4d 69 78 65 64 46 69  opySqliteMixedFi
27f50 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  les)]} then {.. 
27f60 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a               #..
27f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
27f80 4e 4f 54 45 3a 20 49 66 20 74 68 65 20 22 6e 61  NOTE: If the "na
27f90 74 69 76 65 22 20 72 75 6e 74 69 6d 65 20 6f 70  tive" runtime op
27fa0 74 69 6f 6e 20 69 73 20 73 65 74 2c 20 63 6f 70  tion is set, cop
27fb0 79 20 69 6d 70 6c 69 63 69 74 0d 0a 20 20 20 20  y implicit..    
27fc0 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
27fd0 20 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73    mixed-mode ass
27fe0 65 6d 62 6c 79 20 66 69 6c 65 73 20 61 73 20 77  embly files as w
27ff0 65 6c 6c 2e 20 20 54 68 65 20 72 75 6e 74 69 6d  ell.  The runtim
28000 65 20 6f 70 74 69 6f 6e 0d 0a 20 20 20 20 20 20  e option..      
28010 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
28020 63 68 65 63 6b 20 69 73 20 68 61 6e 64 6c 65 64  check is handled
28030 20 77 68 65 6e 20 62 75 69 6c 64 69 6e 67 20 74   when building t
28040 68 65 20 6c 69 73 74 20 6f 66 20 6d 69 78 65 64  he list of mixed
28050 2d 6d 6f 64 65 0d 0a 20 20 20 20 20 20 20 20 20  -mode..         
28060 20 20 20 20 20 23 20 20 20 20 20 20 20 61 73 73       #       ass
28070 65 6d 62 6c 79 20 66 69 6c 65 20 6e 61 6d 65 73  embly file names
28080 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
28090 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
280a0 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
280b0 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c  sts ::no(copySql
280c0 69 74 65 49 6d 70 6c 69 63 69 74 4d 69 78 65 64  iteImplicitMixed
280d0 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d  Files)]} then {.
280e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
280f0 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
28100 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20  hannel \..      
28110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
28120 2d 2d 2d 20 63 6f 70 79 69 6e 67 20 69 6d 70 6c  --- copying impl
28130 69 63 69 74 20 5c 22 6d 69 78 65 64 5c 22 20 66  icit \"mixed\" f
28140 69 6c 65 73 2e 2e 2e 5c 6e 22 0d 0a 0d 0a 20 20  iles...\n"....  
28150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f                fo
28160 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24  reach fileName $
28170 6d 69 78 65 64 46 69 6c 65 4e 61 6d 65 73 20 7b  mixedFileNames {
28180 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
28190 20 20 20 20 74 72 79 43 6f 70 79 41 73 73 65 6d      tryCopyAssem
281a0 62 6c 79 20 24 66 69 6c 65 4e 61 6d 65 20 66 61  bly $fileName fa
281b0 6c 73 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  lse..           
281c0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
281d0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
281e0 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69           if {![i
281f0 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
28200 63 6f 70 79 53 71 6c 69 74 65 4e 6f 6e 49 6d 70  copySqliteNonImp
28210 6c 69 63 69 74 46 69 6c 65 73 29 5d 7d 20 74 68  licitFiles)]} th
28220 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
28230 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
28240 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70   exists ::no(cop
28250 79 53 71 6c 69 74 65 50 6c 61 74 66 6f 72 6d 46  ySqlitePlatformF
28260 69 6c 65 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20  iles)] && \..   
28270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28280 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20   [string length 
28290 24 70 6c 61 74 66 6f 72 6d 5d 20 3e 20 30 7d 20  $platform] > 0} 
282a0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
282b0 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
282c0 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
282d0 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
282e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
282f0 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 70 79 69       "---- copyi
28300 6e 67 20 5c 22 6d 69 78 65 64 5c 22 20 66 69 6c  ng \"mixed\" fil
28310 65 73 20 66 6f 72 20 70 6c 61 74 66 6f 72 6d 20  es for platform 
28320 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  \"" \..         
28330 20 20 20 20 20 20 20 20 20 20 20 20 20 24 70 6c               $pl
28340 61 74 66 6f 72 6d 20 5c 22 2e 2e 2e 5c 6e 5d 0d  atform \"...\n].
28350 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
28360 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c       foreach fil
28370 65 4e 61 6d 65 20 24 6d 69 78 65 64 46 69 6c 65  eName $mixedFile
28380 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20  Names {..       
28390 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79               try
283a0 43 6f 70 79 41 73 73 65 6d 62 6c 79 20 24 66 69  CopyAssembly $fi
283b0 6c 65 4e 61 6d 65 20 66 61 6c 73 65 20 24 70 6c  leName false $pl
283c0 61 74 66 6f 72 6d 0d 0a 20 20 20 20 20 20 20 20  atform..        
283d0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
283e0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
283f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
28400 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
28410 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c  sts ::no(copySql
28420 69 74 65 41 72 63 68 69 74 65 63 74 75 72 65 46  iteArchitectureF
28430 69 6c 65 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20  iles)] && \..   
28440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28450 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20   [string length 
28460 24 61 72 63 68 69 74 65 63 74 75 72 65 5d 20 3e  $architecture] >
28470 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
28480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70                tp
28490 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
284a0 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
284b0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
284c0 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63           "---- c
284d0 6f 70 79 69 6e 67 20 5c 22 6d 69 78 65 64 5c 22  opying \"mixed\"
284e0 20 66 69 6c 65 73 20 66 6f 72 20 61 72 63 68 69   files for archi
284f0 74 65 63 74 75 72 65 20 5c 22 22 20 5c 0d 0a 20  tecture \"" \.. 
28500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28510 20 20 20 20 20 24 61 72 63 68 69 74 65 63 74 75       $architectu
28520 72 65 20 5c 22 2e 2e 2e 5c 6e 5d 0d 0a 0d 0a 20  re \"...\n].... 
28530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28540 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d   foreach fileNam
28550 65 20 24 6d 69 78 65 64 46 69 6c 65 4e 61 6d 65  e $mixedFileName
28560 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s {..           
28570 20 20 20 20 20 20 20 20 20 74 72 79 43 6f 70 79           tryCopy
28580 41 73 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61  Assembly $fileNa
28590 6d 65 20 66 61 6c 73 65 20 24 61 72 63 68 69 74  me false $archit
285a0 65 63 74 75 72 65 0d 0a 20 20 20 20 20 20 20 20  ecture..        
285b0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
285c0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
285d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
285e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
285f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
28600 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
28610 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65 4d  ::no(copySqliteM
28620 61 6e 61 67 65 64 46 69 6c 65 73 29 5d 7d 20 74  anagedFiles)]} t
28630 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
28640 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
28650 73 74 5f 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d  st_channel "----
28660 20 63 6f 70 79 69 6e 67 20 5c 22 6d 61 6e 61 67   copying \"manag
28670 65 64 5c 22 20 66 69 6c 65 73 2e 2e 2e 5c 6e 22  ed\" files...\n"
28680 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
28690 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61    foreach fileNa
286a0 6d 65 20 24 6d 61 6e 61 67 65 64 46 69 6c 65 4e  me $managedFileN
286b0 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20  ames {..        
286c0 20 20 20 20 20 20 20 20 74 72 79 43 6f 70 79 41          tryCopyA
286d0 73 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61 6d  ssembly $fileNam
286e0 65 20 74 72 75 65 0d 0a 20 20 20 20 20 20 20 20  e true..        
286f0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
28700 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
28710 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
28720 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
28730 4e 4f 54 45 3a 20 53 6b 69 70 20 74 72 79 69 6e  NOTE: Skip tryin
28740 67 20 74 6f 20 6c 6f 61 64 20 61 6e 79 20 66 69  g to load any fi
28750 6c 65 73 20 69 66 20 69 6e 73 74 72 75 63 74 65  les if instructe
28760 64 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  d...          #.
28770 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21  .          if {!
28780 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
28790 6f 28 6c 6f 61 64 53 71 6c 69 74 65 46 69 6c 65  o(loadSqliteFile
287a0 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  s)]} then {..   
287b0 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69           if {![i
287c0 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
287d0 6c 6f 61 64 53 71 6c 69 74 65 49 6d 70 6c 69 63  loadSqliteImplic
287e0 69 74 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20  itFiles)]} then 
287f0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
28800 20 74 72 79 4c 6f 61 64 41 73 73 65 6d 62 6c 79   tryLoadAssembly
28810 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
28820 69 74 65 2e 64 6c 6c 0d 0a 20 20 20 20 20 20 20  ite.dll..       
28830 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
28840 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
28850 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 6c 6f 61   exists ::no(loa
28860 64 53 71 6c 69 74 65 4c 69 6e 71 46 69 6c 65 73  dSqliteLinqFiles
28870 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
28880 20 20 20 20 20 20 20 20 20 20 74 72 79 4c 6f 61            tryLoa
28890 64 41 73 73 65 6d 62 6c 79 20 53 79 73 74 65 6d  dAssembly System
288a0 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 4c 69 6e  .Data.SQLite.Lin
288b0 71 2e 64 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20  q.dll..         
288c0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
288d0 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
288e0 78 69 73 74 73 20 3a 3a 6e 6f 28 6c 6f 61 64 53  xists ::no(loadS
288f0 71 6c 69 74 65 45 66 36 46 69 6c 65 73 29 5d 7d  qliteEf6Files)]}
28900 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
28910 20 20 20 20 20 20 20 74 72 79 4c 6f 61 64 41 73         tryLoadAs
28920 73 65 6d 62 6c 79 20 53 79 73 74 65 6d 2e 44 61  sembly System.Da
28930 74 61 2e 53 51 4c 69 74 65 2e 45 46 36 2e 64 6c  ta.SQLite.EF6.dl
28940 6c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  l..            }
28950 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
28960 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
28970 73 20 3a 3a 6e 6f 28 6c 6f 61 64 53 71 6c 69 74  s ::no(loadSqlit
28980 65 4e 6f 6e 49 6d 70 6c 69 63 69 74 46 69 6c 65  eNonImplicitFile
28990 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  s)]} then {..   
289a0 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
289b0 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
289c0 6f 28 6c 6f 61 64 53 71 6c 69 74 65 50 6c 61 74  o(loadSqlitePlat
289d0 66 6f 72 6d 46 69 6c 65 73 29 5d 20 26 26 20 5c  formFiles)] && \
289e0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
289f0 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67      [string leng
28a00 74 68 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3e 20  th $platform] > 
28a10 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
28a20 20 20 20 20 20 20 20 20 20 20 20 74 72 79 4c 6f             tryLo
28a30 61 64 41 73 73 65 6d 62 6c 79 20 53 79 73 74 65  adAssembly Syste
28a40 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c  m.Data.SQLite.dl
28a50 6c 20 24 70 6c 61 74 66 6f 72 6d 0d 0a 20 20 20  l $platform..   
28a60 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
28a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
28a80 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
28a90 3a 3a 6e 6f 28 6c 6f 61 64 53 71 6c 69 74 65 41  ::no(loadSqliteA
28aa0 72 63 68 69 74 65 63 74 75 72 65 46 69 6c 65 73  rchitectureFiles
28ab0 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  )] && \..       
28ac0 20 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69             [stri
28ad0 6e 67 20 6c 65 6e 67 74 68 20 24 61 72 63 68 69  ng length $archi
28ae0 74 65 63 74 75 72 65 5d 20 3e 20 30 7d 20 74 68  tecture] > 0} th
28af0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
28b00 20 20 20 20 20 20 74 72 79 4c 6f 61 64 41 73 73        tryLoadAss
28b10 65 6d 62 6c 79 20 53 79 73 74 65 6d 2e 44 61 74  embly System.Dat
28b20 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 20 24 61 72  a.SQLite.dll $ar
28b30 63 68 69 74 65 63 74 75 72 65 0d 0a 20 20 20 20  chitecture..    
28b40 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
28b50 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
28b60 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
28b70 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 66 6f   }....        fo
28b80 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 4f 6e  reach fileNameOn
28b90 6c 79 20 24 6e 61 74 69 76 65 46 69 6c 65 4e 61  ly $nativeFileNa
28ba0 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  mes {..         
28bb0 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20   catch {..      
28bc0 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
28bd0 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
28be0 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
28bf0 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
28c00 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66   file version of
28c10 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 4f 6e   \"" $fileNameOn
28c20 6c 79 20 22 5c 22 2e 2e 2e 20 5c 22 22 20 5c 0d  ly "\"... \"" \.
28c30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
28c40 20 5b 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 5b   [file version [
28c50 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d  getBinaryFileNam
28c60 65 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 5d  e $fileNameOnly]
28c70 5d 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ] \"\n]..       
28c80 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
28c90 0a 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61  ...        forea
28ca0 63 68 20 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20  ch fileNameOnly 
28cb0 24 6d 69 78 65 64 46 69 6c 65 4e 61 6d 65 73 20  $mixedFileNames 
28cc0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 61 74  {..          cat
28cd0 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
28ce0 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
28cf0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
28d00 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
28d10 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c         "---- fil
28d20 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22 22  e version of \""
28d30 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 22   $fileNameOnly "
28d40 5c 22 2e 2e 2e 20 5c 22 22 20 5c 0d 0a 20 20 20  \"... \"" \..   
28d50 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69               [fi
28d60 6c 65 20 76 65 72 73 69 6f 6e 20 5b 67 65 74 42  le version [getB
28d70 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 24 66  inaryFileName $f
28d80 69 6c 65 4e 61 6d 65 4f 6e 6c 79 5d 5d 20 5c 22  ileNameOnly]] \"
28d90 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  \n]..          }
28da0 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
28db0 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66         foreach f
28dc0 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 24 6d 61 6e  ileNameOnly $man
28dd0 61 67 65 64 46 69 6c 65 4e 61 6d 65 73 20 7b 0d  agedFileNames {.
28de0 0a 20 20 20 20 20 20 20 20 20 20 63 61 74 63 68  .          catch
28df0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
28e00 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
28e10 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
28e20 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
28e30 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20       "---- file 
28e40 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22 22 20 24  version of \"" $
28e50 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 22 5c 22  fileNameOnly "\"
28e60 2e 2e 2e 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20  ... \"" \..     
28e70 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65             [file
28e80 20 76 65 72 73 69 6f 6e 20 5b 67 65 74 42 69 6e   version [getBin
28e90 61 72 79 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c  aryFileName $fil
28ea0 65 4e 61 6d 65 4f 6e 6c 79 5d 5d 20 5c 22 5c 6e  eNameOnly]] \"\n
28eb0 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ]..          }..
28ec0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
28ed0 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
28ee0 20 6c 65 6e 67 74 68 20 24 70 6c 61 74 66 6f 72   length $platfor
28ef0 6d 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  m] > 0} then {..
28f00 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63            foreac
28f10 68 20 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 24  h fileNameOnly $
28f20 6e 61 74 69 76 65 46 69 6c 65 4e 61 6d 65 73 20  nativeFileNames 
28f30 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  {..            c
28f40 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
28f50 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
28f60 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
28f70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
28f80 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
28f90 2d 2d 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 20  -- file version 
28fa0 6f 66 20 5c 22 22 20 24 70 6c 61 74 66 6f 72 6d  of \"" $platform
28fb0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
28fc0 20 20 20 20 20 20 2f 20 24 66 69 6c 65 4e 61 6d        / $fileNam
28fd0 65 4f 6e 6c 79 20 22 5c 22 2e 2e 2e 20 5c 22 22  eOnly "\"... \""
28fe0 20 5b 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 5c   [file version \
28ff0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
29000 20 20 20 20 5b 67 65 74 42 69 6e 61 72 79 46 69      [getBinaryFi
29010 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65  leName $fileName
29020 4f 6e 6c 79 20 24 70 6c 61 74 66 6f 72 6d 5d 5d  Only $platform]]
29030 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20   \"\n]..        
29040 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
29050 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
29060 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65  foreach fileName
29070 4f 6e 6c 79 20 24 6d 69 78 65 64 46 69 6c 65 4e  Only $mixedFileN
29080 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20  ames {..        
29090 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20      catch {..   
290a0 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
290b0 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
290c0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
290d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
290e0 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72    "---- file ver
290f0 73 69 6f 6e 20 6f 66 20 5c 22 22 20 24 70 6c 61  sion of \"" $pla
29100 74 66 6f 72 6d 20 5c 0d 0a 20 20 20 20 20 20 20  tform \..       
29110 20 20 20 20 20 20 20 20 20 20 20 2f 20 24 66 69             / $fi
29120 6c 65 4e 61 6d 65 4f 6e 6c 79 20 22 5c 22 2e 2e  leNameOnly "\"..
29130 2e 20 5c 22 22 20 5b 66 69 6c 65 20 76 65 72 73  . \"" [file vers
29140 69 6f 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ion \..         
29150 20 20 20 20 20 20 20 20 20 5b 67 65 74 42 69 6e           [getBin
29160 61 72 79 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c  aryFileName $fil
29170 65 4e 61 6d 65 4f 6e 6c 79 20 24 70 6c 61 74 66  eNameOnly $platf
29180 6f 72 6d 5d 5d 20 5c 22 5c 6e 5d 0d 0a 20 20 20  orm]] \"\n]..   
29190 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
291a0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
291b0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66   }....        if
291c0 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   {[string length
291d0 20 24 61 72 63 68 69 74 65 63 74 75 72 65 5d 20   $architecture] 
291e0 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
291f0 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66         foreach f
29200 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 24 6e 61 74  ileNameOnly $nat
29210 69 76 65 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a  iveFileNames {..
29220 20 20 20 20 20 20 20 20 20 20 20 20 63 61 74 63              catc
29230 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  h {..           
29240 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
29250 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
29260 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
29270 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
29280 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66 20  file version of 
29290 5c 22 22 20 24 61 72 63 68 69 74 65 63 74 75 72  \"" $architectur
292a0 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
292b0 20 20 20 20 20 20 20 2f 20 24 66 69 6c 65 4e 61         / $fileNa
292c0 6d 65 4f 6e 6c 79 20 22 5c 22 2e 2e 2e 20 5c 22  meOnly "\"... \"
292d0 22 20 5b 66 69 6c 65 20 76 65 72 73 69 6f 6e 20  " [file version 
292e0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
292f0 20 20 20 20 20 5b 67 65 74 42 69 6e 61 72 79 46       [getBinaryF
29300 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d  ileName $fileNam
29310 65 4f 6e 6c 79 20 24 61 72 63 68 69 74 65 63 74  eOnly $architect
29320 75 72 65 5d 5d 20 5c 22 5c 6e 5d 0d 0a 20 20 20  ure]] \"\n]..   
29330 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
29340 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
29350 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c       foreach fil
29360 65 4e 61 6d 65 4f 6e 6c 79 20 24 6d 69 78 65 64  eNameOnly $mixed
29370 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20  FileNames {..   
29380 20 20 20 20 20 20 20 20 20 63 61 74 63 68 20 7b           catch {
29390 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
293a0 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
293b0 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
293c0 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
293d0 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c         "---- fil
293e0 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22 22  e version of \""
293f0 20 24 61 72 63 68 69 74 65 63 74 75 72 65 20 5c   $architecture \
29400 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
29410 20 20 20 20 2f 20 24 66 69 6c 65 4e 61 6d 65 4f      / $fileNameO
29420 6e 6c 79 20 22 5c 22 2e 2e 2e 20 5c 22 22 20 5b  nly "\"... \"" [
29430 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 5c 0d 0a  file version \..
29440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29450 20 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65    [getBinaryFile
29460 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 4f 6e  Name $fileNameOn
29470 6c 79 20 24 61 72 63 68 69 74 65 63 74 75 72 65  ly $architecture
29480 5d 5d 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20  ]] \"\n]..      
29490 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
294a0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
294b0 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
294c0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 47 72        # NOTE: Gr
294d0 61 62 20 74 68 65 20 6c 69 73 74 20 6f 66 20 6d  ab the list of m
294e0 61 6e 61 67 65 64 20 61 73 73 65 6d 62 6c 69 65  anaged assemblie
294f0 73 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e  s for the curren
29500 74 20 70 72 6f 63 65 73 73 0d 0a 20 20 20 20 20  t process..     
29510 20 20 20 23 20 20 20 20 20 20 20 61 6e 64 20 72     #       and r
29520 65 70 6f 72 74 20 6f 6e 20 74 68 65 20 53 79 73  eport on the Sys
29530 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20  tem.Data.SQLite 
29540 72 65 6c 61 74 65 64 20 6f 6e 65 73 2e 0d 0a 20  related ones... 
29550 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
29560 20 20 69 66 20 7b 5b 68 61 76 65 53 51 4c 69 74    if {[haveSQLit
29570 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d 7d  eObjectCommand]}
29580 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
29590 20 20 20 73 65 74 20 61 73 73 65 6d 62 6c 69 65     set assemblie
295a0 73 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65  s [object invoke
295b0 20 41 70 70 44 6f 6d 61 69 6e 2e 43 75 72 72 65   AppDomain.Curre
295c0 6e 74 44 6f 6d 61 69 6e 20 47 65 74 41 73 73 65  ntDomain GetAsse
295d0 6d 62 6c 69 65 73 5d 0d 0a 0d 0a 20 20 20 20 20  mblies]....     
295e0 20 20 20 20 20 6f 62 6a 65 63 74 20 66 6f 72 65       object fore
295f0 61 63 68 20 61 73 73 65 6d 62 6c 79 20 24 61 73  ach assembly $as
29600 73 65 6d 62 6c 69 65 73 20 7b 0d 0a 20 20 20 20  semblies {..    
29610 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72          if {[str
29620 69 6e 67 20 6d 61 74 63 68 20 5c 7b 53 79 73 74  ing match \{Syst
29630 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2a 20  em.Data.SQLite* 
29640 24 61 73 73 65 6d 62 6c 79 5d 7d 20 74 68 65 6e  $assembly]} then
29650 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
29660 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
29670 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
29680 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
29690 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66           "---- f
296a0 6f 75 6e 64 20 6c 6f 61 64 65 64 20 61 73 73 65  ound loaded asse
296b0 6d 62 6c 79 3a 20 22 20 24 61 73 73 65 6d 62 6c  mbly: " $assembl
296c0 79 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  y \n]..         
296d0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
296e0 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  }..        }....
296f0 20 20 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d          catch {.
29700 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
29710 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
29720 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
29730 20 20 22 2d 2d 2d 2d 20 64 65 66 69 6e 65 20 63    "---- define c
29740 6f 6e 73 74 61 6e 74 73 20 66 6f 72 20 5c 22 53  onstants for \"S
29750 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
29760 65 5c 22 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20  e\"... "....    
29770 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
29780 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
29790 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66  object invoke -f
297a0 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20  lags +NonPublic 
297b0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
297c0 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53     System.Data.S
297d0 51 4c 69 74 65 2e 53 51 4c 69 74 65 33 20 44 65  QLite.SQLite3 De
297e0 66 69 6e 65 43 6f 6e 73 74 61 6e 74 73 0d 0a 20  fineConstants.. 
297f0 20 20 20 20 20 20 20 20 20 7d 20 64 65 66 69 6e           } defin
29800 65 43 6f 6e 73 74 61 6e 74 73 5d 20 3d 3d 20 30  eConstants] == 0
29810 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
29820 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
29830 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
29840 65 6e 64 41 72 67 73 20 5b 66 6f 72 6d 61 74 4c  endArgs [formatL
29850 69 73 74 20 5b 6c 73 6f 72 74 20 5c 0d 0a 20 20  ist [lsort \..  
29860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24 64                $d
29870 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 73 5d 20  efineConstants] 
29880 3c 6e 6f 6e 65 3e 5d 20 5c 6e 5d 0d 0a 20 20 20  <none>] \n]..   
29890 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
298a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
298b0 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
298c0 65 6c 20 75 6e 6b 6e 6f 77 6e 5c 6e 0d 0a 20 20  el unknown\n..  
298d0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
298e0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
298f0 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
29900 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
29910 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20  _channel \..    
29920 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
29930 73 6f 75 72 63 65 20 76 65 72 73 69 6f 6e 20 6f  source version o
29940 66 20 5c 22 53 79 73 74 65 6d 2e 44 61 74 61 2e  f \"System.Data.
29950 53 51 4c 69 74 65 2e 64 6c 6c 5c 22 2e 2e 2e 20  SQLite.dll\"... 
29960 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69  "....          i
29970 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  f {[catch {..   
29980 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20           object 
29990 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e  invoke -flags +N
299a0 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20  onPublic \..    
299b0 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74              Syst
299c0 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53  em.Data.SQLite.S
299d0 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 20  QLiteConnection 
299e0 50 72 6f 76 69 64 65 72 56 65 72 73 69 6f 6e 0d  ProviderVersion.
299f0 0a 20 20 20 20 20 20 20 20 20 20 7d 20 76 65 72  .          } ver
29a00 73 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  sion] == 0} then
29a10 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
29a20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
29a30 74 68 20 24 76 65 72 73 69 6f 6e 5d 20 3d 3d 20  th $version] == 
29a40 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
29a50 20 20 20 20 20 20 20 20 20 73 65 74 20 76 65 72           set ver
29a60 73 69 6f 6e 20 6e 75 6c 6c 0d 0a 20 20 20 20 20  sion null..     
29a70 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
29a80 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
29a90 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
29aa0 65 6e 64 41 72 67 73 20 24 76 65 72 73 69 6f 6e  endArgs $version
29ab0 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \n]..          
29ac0 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
29ad0 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
29ae0 65 73 74 5f 63 68 61 6e 6e 65 6c 20 75 6e 6b 6e  est_channel unkn
29af0 6f 77 6e 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20  own\n..         
29b00 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d   }..        }...
29b10 0a 20 20 20 20 20 20 20 20 63 61 74 63 68 20 7b  .        catch {
29b20 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74  ..          tput
29b30 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
29b40 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  l \..           
29b50 20 20 20 22 2d 2d 2d 2d 20 73 6f 75 72 63 65 20     "---- source 
29b60 63 68 65 63 6b 6f 75 74 20 6f 66 20 5c 22 53 79  checkout of \"Sy
29b70 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
29b80 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 0d 0a 0d 0a 20  .dll\"... ".... 
29b90 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61           if {[ca
29ba0 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
29bb0 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65     object invoke
29bc0 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c   -flags +NonPubl
29bd0 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ic \..          
29be0 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74        System.Dat
29bf0 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 43  a.SQLite.SQLiteC
29c00 6f 6e 6e 65 63 74 69 6f 6e 20 50 72 6f 76 69 64  onnection Provid
29c10 65 72 53 6f 75 72 63 65 49 64 0d 0a 20 20 20 20  erSourceId..    
29c20 20 20 20 20 20 20 7d 20 73 6f 75 72 63 65 49 64        } sourceId
29c30 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
29c40 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
29c50 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
29c60 73 6f 75 72 63 65 49 64 5d 20 3d 3d 20 30 7d 20  sourceId] == 0} 
29c70 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
29c80 20 20 20 20 20 20 73 65 74 20 73 6f 75 72 63 65        set source
29c90 49 64 20 6e 75 6c 6c 0d 0a 20 20 20 20 20 20 20  Id null..       
29ca0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
29cb0 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
29cc0 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
29cd0 64 41 72 67 73 20 24 73 6f 75 72 63 65 49 64 20  dArgs $sourceId 
29ce0 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  \n]..          }
29cf0 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
29d00 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
29d10 73 74 5f 63 68 61 6e 6e 65 6c 20 75 6e 6b 6e 6f  st_channel unkno
29d20 77 6e 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20 20  wn\n..          
29d30 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  }..        }....
29d40 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
29d50 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 73 65 74     # NOTE: Reset
29d60 20 63 61 63 68 65 64 20 22 62 72 65 61 6b 20 69   cached "break i
29d70 6e 74 6f 20 64 65 62 75 67 67 65 72 22 20 73 65  nto debugger" se
29d80 74 74 69 6e 67 20 73 6f 20 74 68 61 74 20 69 74  tting so that it
29d90 20 63 61 6e 20 62 65 0d 0a 20 20 20 20 20 20 20   can be..       
29da0 20 23 20 20 20 20 20 20 20 75 73 65 64 20 64 75   #       used du
29db0 72 69 6e 67 20 74 68 65 20 74 65 73 74 20 66 69  ring the test fi
29dc0 6c 65 2c 20 69 66 20 6e 65 65 64 65 64 2e 0d 0a  le, if needed...
29dd0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
29de0 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
29df0 69 73 74 73 20 3a 3a 6e 6f 28 72 65 73 65 74 42  ists ::no(resetB
29e00 72 65 61 6b 49 6e 74 6f 44 65 62 75 67 67 65 72  reakIntoDebugger
29e10 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  )] && \..       
29e20 20 20 20 20 20 5b 68 61 76 65 53 51 4c 69 74 65       [haveSQLite
29e30 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20  ObjectCommand]} 
29e40 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
29e50 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
29e60 20 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65              obje
29e70 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73  ct invoke -flags
29e80 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20   +NonPublic \.. 
29e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
29ea0 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
29eb0 65 2e 48 65 6c 70 65 72 4d 65 74 68 6f 64 73 20  e.HelperMethods 
29ec0 52 65 73 65 74 42 72 65 61 6b 49 6e 74 6f 44 65  ResetBreakIntoDe
29ed0 62 75 67 67 65 72 0d 0a 20 20 20 20 20 20 20 20  bugger..        
29ee0 20 20 7d 20 72 65 73 75 6c 74 5d 20 3d 3d 20 30    } result] == 0
29ef0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
29f00 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
29f10 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
29f20 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
29f30 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
29f40 20 63 61 6c 6c 20 52 65 73 65 74 42 72 65 61 6b   call ResetBreak
29f50 49 6e 74 6f 44 65 62 75 67 67 65 72 28 29 2e 2e  IntoDebugger()..
29f60 2e 20 6f 6b 5c 6e 22 5d 0d 0a 20 20 20 20 20 20  . ok\n"]..      
29f70 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
29f80 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
29f90 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
29fa0 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
29fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
29fc0 2d 2d 2d 2d 20 63 61 6c 6c 20 52 65 73 65 74 42  ---- call ResetB
29fd0 72 65 61 6b 49 6e 74 6f 44 65 62 75 67 67 65 72  reakIntoDebugger
29fe0 28 29 2e 2e 2e 20 65 72 72 6f 72 3a 20 22 20 5c  ()... error: " \
29ff0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2a000 20 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c    \n\t $result \
2a010 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  n]..          }.
2a020 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
2a030 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
2a040 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 74   # NOTE: Check t
2a050 68 65 20 61 76 61 69 6c 61 62 6c 65 20 62 75 69  he available bui
2a060 6c 64 73 20 28 61 6e 64 20 22 72 65 6c 65 61 73  lds (and "releas
2a070 65 73 22 29 20 6f 66 20 53 51 4c 69 74 65 20 61  es") of SQLite a
2a080 6e 64 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  nd..        #   
2a090 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e      System.Data.
2a0a0 53 51 4c 69 74 65 2e 0d 0a 20 20 20 20 20 20 20  SQLite...       
2a0b0 20 23 0d 0a 20 20 20 20 20 20 20 20 63 68 65 63   #..        chec
2a0c0 6b 46 6f 72 53 51 4c 69 74 65 42 75 69 6c 64 73  kForSQLiteBuilds
2a0d0 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
2a0e0 0d 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 46  ..        checkF
2a0f0 6f 72 53 51 4c 69 74 65 52 65 6c 65 61 73 65 73  orSQLiteReleases
2a100 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
2a110 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
2a120 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e         # NOTE: N
2a130 6f 77 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 6b  ow, we need to k
2a140 6e 6f 77 20 69 66 20 74 68 65 20 53 51 4c 69 74  now if the SQLit
2a150 65 20 63 6f 72 65 20 6c 69 62 72 61 72 79 20 69  e core library i
2a160 73 20 61 76 61 69 6c 61 62 6c 65 0d 0a 20 20 20  s available..   
2a170 20 20 20 20 20 23 20 20 20 20 20 20 20 28 69 2e       #       (i.
2a180 65 2e 20 62 65 63 61 75 73 65 20 74 68 65 20 6d  e. because the m
2a190 61 6e 61 67 65 64 2d 6f 6e 6c 79 20 53 79 73 74  anaged-only Syst
2a1a0 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 61  em.Data.SQLite a
2a1b0 73 73 65 6d 62 6c 79 20 63 61 6e 0d 0a 20 20 20  ssembly can..   
2a1c0 20 20 20 20 20 23 20 20 20 20 20 20 20 6c 6f 61       #       loa
2a1d0 64 20 77 69 74 68 6f 75 74 20 69 74 3b 20 68 6f  d without it; ho
2a1e0 77 65 76 65 72 2c 20 69 74 20 63 61 6e 6e 6f 74  wever, it cannot
2a1f0 20 64 6f 20 61 6e 79 74 68 69 6e 67 20 75 73 65   do anything use
2a200 66 75 6c 20 77 69 74 68 6f 75 74 0d 0a 20 20 20  ful without..   
2a210 20 20 20 20 20 23 20 20 20 20 20 20 20 69 74 29       #       it)
2a220 2e 20 20 49 66 20 77 65 20 61 72 65 20 75 73 69  .  If we are usi
2a230 6e 67 20 74 68 65 20 6d 69 78 65 64 2d 6d 6f 64  ng the mixed-mod
2a240 65 20 61 73 73 65 6d 62 6c 79 20 61 6e 64 20 77  e assembly and w
2a250 65 20 61 6c 72 65 61 64 79 0d 0a 20 20 20 20 20  e already..     
2a260 20 20 20 23 20 20 20 20 20 20 20 66 6f 75 6e 64     #       found
2a270 20 69 74 20 28 61 62 6f 76 65 29 2c 20 74 68 69   it (above), thi
2a280 73 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20  s should always 
2a290 73 75 63 63 65 65 64 2e 0d 0a 20 20 20 20 20 20  succeed...      
2a2a0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 63 68 65    #..        che
2a2b0 63 6b 46 6f 72 53 51 4c 69 74 65 4c 69 62 72 61  ckForSQLiteLibra
2a2c0 72 79 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ry $::test_chann
2a2d0 65 6c 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d  el....        #.
2a2e0 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
2a2f0 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 53 51   Check if the SQ
2a300 4c 69 74 65 20 69 6e 74 65 72 6f 70 20 61 73 73  Lite interop ass
2a310 65 6d 62 6c 79 20 69 73 20 61 76 61 69 6c 61 62  embly is availab
2a320 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  le...        #..
2a330 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72          checkFor
2a340 53 51 4c 69 74 65 49 6e 74 65 72 6f 70 20 24 3a  SQLiteInterop $:
2a350 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d  :test_channel...
2a360 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
2a370 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63      # NOTE: Chec
2a380 6b 20 74 68 65 20 53 51 4c 69 74 65 20 64 61 74  k the SQLite dat
2a390 61 62 61 73 65 20 61 6e 64 20 74 65 6d 70 6f 72  abase and tempor
2a3a0 61 72 79 20 64 69 72 65 63 74 6f 72 69 65 73 2e  ary directories.
2a3b0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
2a3c0 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51 4c       checkForSQL
2a3d0 69 74 65 44 69 72 65 63 74 6f 72 69 65 73 20 24  iteDirectories $
2a3e0 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a  ::test_channel..
2a3f0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
2a400 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74       # NOTE: Att
2a410 65 6d 70 74 20 74 6f 20 64 65 74 65 72 6d 69 6e  empt to determin
2a420 65 20 69 66 20 76 61 72 69 6f 75 73 20 63 6f 6d  e if various com
2a430 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e  pile-time option
2a440 73 20 6e 65 65 64 65 64 20 66 6f 72 0d 0a 20 20  s needed for..  
2a450 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 65        #       te
2a460 73 74 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 77  st constraints w
2a470 65 72 65 20 65 6e 61 62 6c 65 64 20 66 6f 72 20  ere enabled for 
2a480 74 68 65 20 6d 61 6e 61 67 65 64 20 61 73 73 65  the managed asse
2a490 6d 62 6c 79 2e 20 20 54 68 65 72 65 0d 0a 20 20  mbly.  There..  
2a4a0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61 72        #       ar
2a4b0 65 20 73 6f 6d 65 20 63 6f 6d 70 69 6c 65 2d 74  e some compile-t
2a4c0 69 6d 65 20 6f 70 74 69 6f 6e 73 20 74 68 61 74  ime options that
2a4d0 20 6d 75 73 74 20 61 6c 73 6f 20 68 61 76 65 20   must also have 
2a4e0 62 65 65 6e 20 65 6e 61 62 6c 65 64 0d 0a 20 20  been enabled..  
2a4f0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 66 6f        #       fo
2a500 72 20 74 68 65 20 69 6e 74 65 72 6f 70 20 61 73  r the interop as
2a510 73 65 6d 62 6c 79 20 69 6e 20 6f 72 64 65 72 20  sembly in order 
2a520 74 6f 20 62 65 20 65 66 66 65 63 74 69 76 65 2e  to be effective.
2a530 20 20 46 6f 72 20 74 68 6f 73 65 0d 0a 20 20 20    For those..   
2a540 20 20 20 20 20 23 20 20 20 20 20 20 20 6f 70 74       #       opt
2a550 69 6f 6e 73 2c 20 69 74 20 77 69 6c 6c 20 62 65  ions, it will be
2a560 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 69 74   assumed that it
2a570 20 77 61 73 20 65 6e 61 62 6c 65 64 20 66 6f 72   was enabled for
2a580 20 74 68 65 20 69 6e 74 65 72 6f 70 0d 0a 20 20   the interop..  
2a590 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61 73        #       as
2a5a0 73 65 6d 62 6c 79 20 69 66 20 69 74 20 77 61 73  sembly if it was
2a5b0 20 65 6e 61 62 6c 65 64 20 66 6f 72 20 74 68 65   enabled for the
2a5c0 20 6d 61 6e 61 67 65 64 20 61 73 73 65 6d 62 6c   managed assembl
2a5d0 79 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  y...        #.. 
2a5e0 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 64         foreach d
2a5f0 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 20 5b 6c  efineConstant [l
2a600 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ist \..         
2a610 20 20 20 43 48 45 43 4b 5f 53 54 41 54 45 20 43     CHECK_STATE C
2a620 4f 55 4e 54 5f 48 41 4e 44 4c 45 20 44 45 42 55  OUNT_HANDLE DEBU
2a630 47 20 49 4e 54 45 52 4f 50 5f 43 4f 44 45 43 20  G INTEROP_CODEC 
2a640 49 4e 54 45 52 4f 50 5f 44 45 42 55 47 20 5c 0d  INTEROP_DEBUG \.
2a650 0a 20 20 20 20 20 20 20 20 20 20 20 20 49 4e 54  .            INT
2a660 45 52 4f 50 5f 45 58 54 45 4e 53 49 4f 4e 5f 46  EROP_EXTENSION_F
2a670 55 4e 43 54 49 4f 4e 53 20 49 4e 54 45 52 4f 50  UNCTIONS INTEROP
2a680 5f 46 54 53 35 5f 45 58 54 45 4e 53 49 4f 4e 20  _FTS5_EXTENSION 
2a690 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 49  \..            I
2a6a0 4e 54 45 52 4f 50 5f 49 4e 43 4c 55 44 45 5f 43  NTEROP_INCLUDE_C
2a6b0 45 52 4f 44 20 49 4e 54 45 52 4f 50 5f 49 4e 43  EROD INTEROP_INC
2a6c0 4c 55 44 45 5f 45 58 54 52 41 20 49 4e 54 45 52  LUDE_EXTRA INTER
2a6d0 4f 50 5f 49 4e 43 4c 55 44 45 5f 53 45 45 20 5c  OP_INCLUDE_SEE \
2a6e0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 49 4e  ..            IN
2a6f0 54 45 52 4f 50 5f 49 4e 43 4c 55 44 45 5f 5a 49  TEROP_INCLUDE_ZI
2a700 50 56 46 53 20 49 4e 54 45 52 4f 50 5f 4a 53 4f  PVFS INTEROP_JSO
2a710 4e 31 5f 45 58 54 45 4e 53 49 4f 4e 20 5c 0d 0a  N1_EXTENSION \..
2a720 20 20 20 20 20 20 20 20 20 20 20 20 49 4e 54 45              INTE
2a730 52 4f 50 5f 4c 45 47 41 43 59 5f 43 4c 4f 53 45  ROP_LEGACY_CLOSE
2a740 20 49 4e 54 45 52 4f 50 5f 4c 4f 47 20 49 4e 54   INTEROP_LOG INT
2a750 45 52 4f 50 5f 50 45 52 43 45 4e 54 49 4c 45 5f  EROP_PERCENTILE_
2a760 45 58 54 45 4e 53 49 4f 4e 20 5c 0d 0a 20 20 20  EXTENSION \..   
2a770 20 20 20 20 20 20 20 20 20 49 4e 54 45 52 4f 50           INTEROP
2a780 5f 52 45 47 45 58 50 5f 45 58 54 45 4e 53 49 4f  _REGEXP_EXTENSIO
2a790 4e 20 49 4e 54 45 52 4f 50 5f 53 45 53 53 49 4f  N INTEROP_SESSIO
2a7a0 4e 5f 45 58 54 45 4e 53 49 4f 4e 20 5c 0d 0a 20  N_EXTENSION \.. 
2a7b0 20 20 20 20 20 20 20 20 20 20 20 49 4e 54 45 52             INTER
2a7c0 4f 50 5f 53 48 41 31 5f 45 58 54 45 4e 53 49 4f  OP_SHA1_EXTENSIO
2a7d0 4e 20 49 4e 54 45 52 4f 50 5f 54 45 53 54 5f 45  N INTEROP_TEST_E
2a7e0 58 54 45 4e 53 49 4f 4e 20 5c 0d 0a 20 20 20 20  XTENSION \..    
2a7f0 20 20 20 20 20 20 20 20 49 4e 54 45 52 4f 50 5f          INTEROP_
2a800 54 4f 54 59 50 45 5f 45 58 54 45 4e 53 49 4f 4e  TOTYPE_EXTENSION
2a810 20 49 4e 54 45 52 4f 50 5f 56 49 52 54 55 41 4c   INTEROP_VIRTUAL
2a820 5f 54 41 42 4c 45 20 5c 0d 0a 20 20 20 20 20 20  _TABLE \..      
2a830 20 20 20 20 20 20 4e 45 54 5f 32 30 20 4e 45 54        NET_20 NET
2a840 5f 33 35 20 4e 45 54 5f 34 30 20 4e 45 54 5f 34  _35 NET_40 NET_4
2a850 35 20 4e 45 54 5f 34 35 31 20 4e 45 54 5f 34 35  5 NET_451 NET_45
2a860 32 20 4e 45 54 5f 34 36 20 4e 45 54 5f 34 36 31  2 NET_46 NET_461
2a870 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
2a880 4e 45 54 5f 34 36 32 20 4e 45 54 5f 34 37 20 4e  NET_462 NET_47 N
2a890 45 54 5f 34 37 31 20 4e 45 54 5f 43 4f 4d 50 41  ET_471 NET_COMPA
2a8a0 43 54 5f 32 30 20 50 4c 41 54 46 4f 52 4d 5f 43  CT_20 PLATFORM_C
2a8b0 4f 4d 50 41 43 54 46 52 41 4d 45 57 4f 52 4b 20  OMPACTFRAMEWORK 
2a8c0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 50  \..            P
2a8d0 52 45 4c 4f 41 44 5f 4e 41 54 49 56 45 5f 4c 49  RELOAD_NATIVE_LI
2a8e0 42 52 41 52 59 20 52 45 54 41 52 47 45 54 41 42  BRARY RETARGETAB
2a8f0 4c 45 20 53 51 4c 49 54 45 5f 53 54 41 4e 44 41  LE SQLITE_STANDA
2a900 52 44 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  RD \..          
2a910 20 20 54 48 52 4f 57 5f 4f 4e 5f 44 49 53 50 4f    THROW_ON_DISPO
2a920 53 45 44 20 54 52 41 43 45 20 54 52 41 43 45 5f  SED TRACE TRACE_
2a930 43 4f 4e 4e 45 43 54 49 4f 4e 20 54 52 41 43 45  CONNECTION TRACE
2a940 5f 44 45 54 45 43 54 49 4f 4e 20 5c 0d 0a 20 20  _DETECTION \..  
2a950 20 20 20 20 20 20 20 20 20 20 54 52 41 43 45 5f            TRACE_
2a960 48 41 4e 44 4c 45 20 54 52 41 43 45 5f 50 52 45  HANDLE TRACE_PRE
2a970 4c 4f 41 44 20 54 52 41 43 45 5f 53 48 41 52 45  LOAD TRACE_SHARE
2a980 44 20 54 52 41 43 45 5f 53 54 41 54 45 4d 45 4e  D TRACE_STATEMEN
2a990 54 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  T \..           
2a9a0 20 54 52 41 43 45 5f 57 41 52 4e 49 4e 47 20 54   TRACE_WARNING T
2a9b0 52 41 43 4b 5f 4d 45 4d 4f 52 59 5f 42 59 54 45  RACK_MEMORY_BYTE
2a9c0 53 20 55 53 45 5f 45 4e 54 49 54 59 5f 46 52 41  S USE_ENTITY_FRA
2a9d0 4d 45 57 4f 52 4b 5f 36 20 5c 0d 0a 20 20 20 20  MEWORK_6 \..    
2a9e0 20 20 20 20 20 20 20 20 55 53 45 5f 49 4e 54 45          USE_INTE
2a9f0 52 4f 50 5f 44 4c 4c 20 55 53 45 5f 50 52 45 50  ROP_DLL USE_PREP
2aa00 41 52 45 5f 56 32 20 57 49 4e 44 4f 57 53 5d 20  ARE_V2 WINDOWS] 
2aa10 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  {..          #..
2aa20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
2aa30 3a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 63  : Check if the c
2aa40 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69  ompile-time opti
2aa50 6f 6e 20 69 73 20 6c 69 73 74 65 64 20 69 6e 20  on is listed in 
2aa60 74 68 65 20 6c 69 73 74 20 6f 66 0d 0a 20 20 20  the list of..   
2aa70 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 22         #       "
2aa80 64 65 66 69 6e 65 20 63 6f 6e 73 74 61 6e 74 73  define constants
2aa90 22 20 6b 65 70 74 20 74 72 61 63 6b 20 6f 66 20  " kept track of 
2aaa0 62 79 20 74 68 65 20 6d 61 6e 61 67 65 64 20 61  by the managed a
2aab0 73 73 65 6d 62 6c 79 2e 0d 0a 20 20 20 20 20 20  ssembly...      
2aac0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
2aad0 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 44   checkForSQLiteD
2aae0 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 20 24 3a  efineConstant $:
2aaf0 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 64  :test_channel $d
2ab00 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 0d 0a 20  efineConstant.. 
2ab10 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
2ab20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
2ab30 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74   NOTE: Attempt t
2ab40 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 76  o determine if v
2ab50 61 72 69 6f 75 73 20 63 6f 6d 70 69 6c 65 2d 74  arious compile-t
2ab60 69 6d 65 20 6f 70 74 69 6f 6e 73 20 6e 65 65 64  ime options need
2ab70 65 64 20 66 6f 72 0d 0a 20 20 20 20 20 20 20 20  ed for..        
2ab80 23 20 20 20 20 20 20 20 74 65 73 74 20 63 6f 6e  #       test con
2ab90 73 74 72 61 69 6e 74 73 20 77 65 72 65 20 65 6e  straints were en
2aba0 61 62 6c 65 64 20 66 6f 72 20 74 68 65 20 69 6e  abled for the in
2abb0 74 65 72 6f 70 20 61 73 73 65 6d 62 6c 79 20 61  terop assembly a
2abc0 6e 64 2f 6f 72 0d 0a 20 20 20 20 20 20 20 20 23  nd/or..        #
2abd0 20 20 20 20 20 20 20 66 6f 72 20 74 68 65 20 53         for the S
2abe0 51 4c 69 74 65 20 63 6f 72 65 20 6c 69 62 72 61  QLite core libra
2abf0 72 79 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ry...        #..
2ac00 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
2ac10 63 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 20 5b 6c  compileOption [l
2ac20 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ist \..         
2ac30 20 20 20 43 4f 44 45 43 20 45 58 54 45 4e 53 49     CODEC EXTENSI
2ac40 4f 4e 5f 46 55 4e 43 54 49 4f 4e 53 20 48 41 53  ON_FUNCTIONS HAS
2ac50 5f 43 4f 44 45 43 20 49 4e 43 4c 55 44 45 5f 43  _CODEC INCLUDE_C
2ac60 45 52 4f 44 20 49 4e 43 4c 55 44 45 5f 45 58 54  EROD INCLUDE_EXT
2ac70 52 41 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  RA \..          
2ac80 20 20 49 4e 43 4c 55 44 45 5f 53 45 45 20 49 4e    INCLUDE_SEE IN
2ac90 43 4c 55 44 45 5f 5a 49 50 56 46 53 20 4a 53 4f  CLUDE_ZIPVFS JSO
2aca0 4e 31 5f 45 58 54 45 4e 53 49 4f 4e 20 4c 45 47  N1_EXTENSION LEG
2acb0 41 43 59 5f 43 4c 4f 53 45 20 4c 4f 47 20 5c 0d  ACY_CLOSE LOG \.
2acc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 50 45 52  .            PER
2acd0 43 45 4e 54 49 4c 45 5f 45 58 54 45 4e 53 49 4f  CENTILE_EXTENSIO
2ace0 4e 20 52 45 47 45 58 50 5f 45 58 54 45 4e 53 49  N REGEXP_EXTENSI
2acf0 4f 4e 20 53 45 53 53 49 4f 4e 5f 45 58 54 45 4e  ON SESSION_EXTEN
2ad00 53 49 4f 4e 20 5c 0d 0a 20 20 20 20 20 20 20 20  SION \..        
2ad10 20 20 20 20 53 48 41 31 5f 45 58 54 45 4e 53 49      SHA1_EXTENSI
2ad20 4f 4e 20 54 45 53 54 5f 45 58 54 45 4e 53 49 4f  ON TEST_EXTENSIO
2ad30 4e 20 54 4f 54 59 50 45 5f 45 58 54 45 4e 53 49  N TOTYPE_EXTENSI
2ad40 4f 4e 20 56 49 52 54 55 41 4c 5f 54 41 42 4c 45  ON VIRTUAL_TABLE
2ad50 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23  ] {..          #
2ad60 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
2ad70 54 45 3a 20 43 68 65 63 6b 20 69 66 20 74 68 65  TE: Check if the
2ad80 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70   compile-time op
2ad90 74 69 6f 6e 20 69 73 20 6c 69 73 74 65 64 20 69  tion is listed i
2ada0 6e 20 74 68 65 20 6c 69 73 74 0d 0a 20 20 20 20  n the list..    
2adb0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6b 65        #       ke
2adc0 70 74 20 74 72 61 63 6b 20 6f 66 20 62 79 20 74  pt track of by t
2add0 68 65 20 69 6e 74 65 72 6f 70 20 61 73 73 65 6d  he interop assem
2ade0 62 6c 79 20 61 6e 64 2f 6f 72 20 74 68 65 20 53  bly and/or the S
2adf0 51 4c 69 74 65 0d 0a 20 20 20 20 20 20 20 20 20  QLite..         
2ae00 20 23 20 20 20 20 20 20 20 63 6f 72 65 20 6c 69   #       core li
2ae10 62 72 61 72 79 2e 0d 0a 20 20 20 20 20 20 20 20  brary...        
2ae20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 63    #..          c
2ae30 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 43 6f 6d  heckForSQLiteCom
2ae40 70 69 6c 65 4f 70 74 69 6f 6e 20 24 3a 3a 74 65  pileOption $::te
2ae50 73 74 5f 63 68 61 6e 6e 65 6c 20 24 63 6f 6d 70  st_channel $comp
2ae60 69 6c 65 4f 70 74 69 6f 6e 0d 0a 20 20 20 20 20  ileOption..     
2ae70 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
2ae80 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
2ae90 45 3a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20  E: Check if the 
2aea0 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
2aeb0 74 65 20 70 72 6f 76 69 64 65 72 20 77 61 73 20  te provider was 
2aec0 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 0d 0a 20  compiled with.. 
2aed0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73         #       s
2aee0 75 70 70 6f 72 74 20 66 6f 72 20 61 6e 79 20 65  upport for any e
2aef0 6e 63 72 79 70 74 65 64 20 64 61 74 61 62 61 73  ncrypted databas
2af00 65 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  es...        #..
2af10 20 20 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76          if {[hav
2af20 65 53 51 4c 69 74 65 44 65 66 69 6e 65 43 6f 6e  eSQLiteDefineCon
2af30 73 74 61 6e 74 20 49 4e 54 45 52 4f 50 5f 43 4f  stant INTEROP_CO
2af40 44 45 43 5d 20 7c 7c 20 5c 0d 0a 20 20 20 20 20  DEC] || \..     
2af50 20 20 20 20 20 20 20 5b 68 61 76 65 53 51 4c 69         [haveSQLi
2af60 74 65 44 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74  teDefineConstant
2af70 20 49 4e 54 45 52 4f 50 5f 49 4e 43 4c 55 44 45   INTEROP_INCLUDE
2af80 5f 53 45 45 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  _SEE]} then {.. 
2af90 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
2afa0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e 6f        # NOTE: No
2afb0 77 20 63 68 65 63 6b 20 69 66 20 74 68 65 20 69  w check if the i
2afc0 6e 74 65 72 6f 70 20 61 73 73 65 6d 62 6c 79 20  nterop assembly 
2afd0 77 61 73 20 61 6c 73 6f 20 63 6f 6d 70 69 6c 65  was also compile
2afe0 64 20 77 69 74 68 0d 0a 20 20 20 20 20 20 20 20  d with..        
2aff0 20 20 23 20 20 20 20 20 20 20 73 75 70 70 6f 72    #       suppor
2b000 74 20 66 6f 72 20 65 6e 63 72 79 70 74 65 64 20  t for encrypted 
2b010 64 61 74 61 62 61 73 65 73 2e 0d 0a 20 20 20 20  databases...    
2b020 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
2b030 20 20 20 69 66 20 7b 5b 68 61 76 65 53 51 4c 69     if {[haveSQLi
2b040 74 65 43 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 20  teCompileOption 
2b050 43 4f 44 45 43 5d 20 7c 7c 20 5c 0d 0a 20 20 20  CODEC] || \..   
2b060 20 20 20 20 20 20 20 20 20 20 20 5b 68 61 76 65             [have
2b070 53 51 4c 69 74 65 43 6f 6d 70 69 6c 65 4f 70 74  SQLiteCompileOpt
2b080 69 6f 6e 20 49 4e 43 4c 55 44 45 5f 53 45 45 5d  ion INCLUDE_SEE]
2b090 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
2b0a0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
2b0b0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69 6e       # NOTE: Fin
2b0c0 61 6c 6c 79 2c 20 63 68 65 63 6b 20 69 66 20 74  ally, check if t
2b0d0 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20 6c  he SQLite core l
2b0e0 69 62 72 61 72 79 20 77 61 73 20 63 6f 6d 70 69  ibrary was compi
2b0f0 6c 65 64 0d 0a 20 20 20 20 20 20 20 20 20 20 20  led..           
2b100 20 23 20 20 20 20 20 20 20 77 69 74 68 20 73 75   #       with su
2b110 70 70 6f 72 74 20 66 6f 72 20 65 6e 63 72 79 70  pport for encryp
2b120 74 65 64 20 64 61 74 61 62 61 73 65 73 2e 0d 0a  ted databases...
2b130 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
2b140 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b             if {[
2b150 68 61 76 65 53 51 4c 69 74 65 43 6f 6d 70 69 6c  haveSQLiteCompil
2b160 65 4f 70 74 69 6f 6e 20 48 41 53 5f 43 4f 44 45  eOption HAS_CODE
2b170 43 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  C]} then {..    
2b180 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
2b190 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
2b1a0 45 3a 20 59 65 73 2c 20 61 64 64 20 63 6f 6e 73  E: Yes, add cons
2b1b0 74 72 61 69 6e 74 20 66 6f 72 20 75 73 65 20 62  traint for use b
2b1c0 79 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65  y the test suite
2b1d0 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
2b1e0 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
2b1f0 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20    addConstraint 
2b200 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
2b210 74 65 2e 45 6e 63 72 79 70 74 69 6f 6e 0d 0a 20  te.Encryption.. 
2b220 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
2b230 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
2b240 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
2b250 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
2b260 45 3a 20 43 68 65 63 6b 20 74 68 65 20 63 75 72  E: Check the cur
2b270 72 65 6e 74 20 62 75 69 6c 64 20 79 65 61 72 2e  rent build year.
2b280 20 20 42 61 73 69 63 61 6c 6c 79 2c 20 74 68 69    Basically, thi
2b290 73 20 69 6e 64 69 63 61 74 65 73 0d 0a 20 20 20  s indicates..   
2b2a0 20 20 20 20 20 23 20 20 20 20 20 20 20 77 68 69       #       whi
2b2b0 63 68 20 76 65 72 73 69 6f 6e 20 6f 66 20 4d 53  ch version of MS
2b2c0 42 75 69 6c 64 20 61 6e 64 2f 6f 72 20 56 69 73  Build and/or Vis
2b2d0 75 61 6c 20 53 74 75 64 69 6f 20 77 61 73 20 75  ual Studio was u
2b2e0 73 65 64 20 74 6f 0d 0a 20 20 20 20 20 20 20 20  sed to..        
2b2f0 23 20 20 20 20 20 20 20 63 6f 6d 70 69 6c 65 20  #       compile 
2b300 74 68 65 20 61 73 73 65 6d 62 6c 79 20 62 69 6e  the assembly bin
2b310 61 72 69 65 73 20 75 6e 64 65 72 20 74 65 73 74  aries under test
2b320 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
2b330 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
2b340 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20  est_channel \.. 
2b350 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
2b360 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 53 79   checking for Sy
2b370 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
2b380 20 62 75 69 6c 64 20 79 65 61 72 2e 2e 2e 20 22   build year... "
2b390 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20  ....        set 
2b3a0 79 65 61 72 20 5b 67 65 74 42 75 69 6c 64 59 65  year [getBuildYe
2b3b0 61 72 5d 0d 0a 20 20 20 20 20 20 20 20 61 64 64  ar]..        add
2b3c0 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65  Constraint [appe
2b3d0 6e 64 41 72 67 73 20 62 75 69 6c 64 59 65 61 72  ndArgs buildYear
2b3e0 2e 20 24 79 65 61 72 5d 0d 0a 20 20 20 20 20 20  . $year]..      
2b3f0 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
2b400 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
2b410 72 67 73 20 5c 22 20 24 79 65 61 72 20 5c 22 5c  rgs \" $year \"\
2b420 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d  n]....        #.
2b430 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
2b440 20 43 68 65 63 6b 20 74 68 65 20 63 75 72 72 65   Check the curre
2b450 6e 74 20 62 75 69 6c 64 20 2e 4e 45 54 20 46 72  nt build .NET Fr
2b460 61 6d 65 77 6f 72 6b 2e 20 20 42 61 73 69 63 61  amework.  Basica
2b470 6c 6c 79 2c 20 74 68 69 73 0d 0a 20 20 20 20 20  lly, this..     
2b480 20 20 20 23 20 20 20 20 20 20 20 69 6e 64 69 63     #       indic
2b490 61 74 65 73 20 77 68 69 63 68 20 76 65 72 73 69  ates which versi
2b4a0 6f 6e 20 6f 66 20 74 68 65 20 2e 4e 45 54 20 46  on of the .NET F
2b4b0 72 61 6d 65 77 6f 72 6b 20 69 73 20 62 65 69 6e  ramework is bein
2b4c0 67 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  g..        #    
2b4d0 20 20 20 75 73 65 64 20 62 79 20 74 68 65 20 61     used by the a
2b4e0 73 73 65 6d 62 6c 79 20 62 69 6e 61 72 69 65 73  ssembly binaries
2b4f0 20 75 6e 64 65 72 20 74 65 73 74 2e 0d 0a 20 20   under test...  
2b500 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
2b510 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
2b520 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20  hannel \..      
2b530 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65 63        "---- chec
2b540 6b 69 6e 67 20 66 6f 72 20 53 79 73 74 65 6d 2e  king for System.
2b550 44 61 74 61 2e 53 51 4c 69 74 65 20 62 75 69 6c  Data.SQLite buil
2b560 64 20 2e 4e 45 54 20 46 72 61 6d 65 77 6f 72 6b  d .NET Framework
2b570 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 20  ... "....       
2b580 20 73 65 74 20 6e 65 74 46 78 20 5b 67 65 74 42   set netFx [getB
2b590 75 69 6c 64 4e 65 74 46 78 5d 0d 0a 20 20 20 20  uildNetFx]..    
2b5a0 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e      addConstrain
2b5b0 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 62 75  t [appendArgs bu
2b5c0 69 6c 64 46 72 61 6d 65 77 6f 72 6b 2e 20 24 6e  ildFramework. $n
2b5d0 65 74 46 78 5d 0d 0a 20 20 20 20 20 20 20 20 74  etFx]..        t
2b5e0 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
2b5f0 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
2b600 20 5c 22 20 24 6e 65 74 46 78 20 5c 22 5c 6e 5d   \" $netFx \"\n]
2b610 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
2b620 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43         # NOTE: C
2b630 68 65 63 6b 20 74 68 65 20 63 75 72 72 65 6e 74  heck the current
2b640 20 62 75 69 6c 64 20 63 6f 6e 66 69 67 75 72 61   build configura
2b650 74 69 6f 6e 2e 20 20 54 68 69 73 20 73 68 6f 75  tion.  This shou
2b660 6c 64 20 6e 6f 72 6d 61 6c 6c 79 0d 0a 20 20 20  ld normally..   
2b670 20 20 20 20 20 23 20 20 20 20 20 20 20 62 65 20       #       be 
2b680 65 69 74 68 65 72 20 22 44 65 62 75 67 22 20 6f  either "Debug" o
2b690 72 20 22 52 65 6c 65 61 73 65 22 2e 0d 0a 20 20  r "Release"...  
2b6a0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
2b6b0 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
2b6c0 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20  hannel \..      
2b6d0 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65 63        "---- chec
2b6e0 6b 69 6e 67 20 66 6f 72 20 53 79 73 74 65 6d 2e  king for System.
2b6f0 44 61 74 61 2e 53 51 4c 69 74 65 20 62 75 69 6c  Data.SQLite buil
2b700 64 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e  d configuration.
2b710 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20  .. "....        
2b720 73 65 74 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  set configuratio
2b730 6e 20 5b 67 65 74 42 75 69 6c 64 43 6f 6e 66 69  n [getBuildConfi
2b740 67 75 72 61 74 69 6f 6e 5d 0d 0a 20 20 20 20 20  guration]..     
2b750 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74     addConstraint
2b760 20 5b 61 70 70 65 6e 64 41 72 67 73 20 62 75 69   [appendArgs bui
2b770 6c 64 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e  ldConfiguration.
2b780 20 24 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 5d   $configuration]
2b790 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
2b7a0 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
2b7b0 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 22 20 24  [appendArgs \" $
2b7c0 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 5c 22  configuration \"
2b7d0 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23  \n]....        #
2b7e0 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
2b7f0 3a 20 54 72 79 20 74 6f 20 73 65 74 75 70 20 61  : Try to setup a
2b800 6e 20 69 6e 74 65 72 72 75 70 74 20 63 61 6c 6c  n interrupt call
2b810 62 61 63 6b 20 75 73 69 6e 67 20 74 68 65 20 73  back using the s
2b820 63 72 69 70 74 20 64 65 62 75 67 67 65 72 0d 0a  cript debugger..
2b830 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
2b840 74 68 61 74 20 77 69 6c 6c 20 63 61 6e 63 65 6c  that will cancel
2b850 20 61 6c 6c 20 53 51 4c 20 71 75 65 72 69 65 73   all SQL queries
2b860 20 69 6e 20 70 72 6f 67 72 65 73 73 20 66 6f 72   in progress for
2b870 20 61 6c 6c 20 64 61 74 61 62 61 73 65 0d 0a 20   all database.. 
2b880 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63         #       c
2b890 6f 6e 6e 65 63 74 69 6f 6e 73 20 6b 6e 6f 77 6e  onnections known
2b8a0 20 74 6f 20 74 68 69 73 20 69 6e 74 65 72 70 72   to this interpr
2b8b0 65 74 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 23  eter...        #
2b8c0 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b  ..        if {![
2b8d0 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
2b8e0 28 73 71 6c 69 74 65 49 6e 74 65 72 72 75 70 74  (sqliteInterrupt
2b8f0 43 61 6c 6c 62 61 63 6b 29 5d 7d 20 74 68 65 6e  Callback)]} then
2b900 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   {..          se
2b910 74 75 70 44 62 49 6e 74 65 72 72 75 70 74 43 61  tupDbInterruptCa
2b920 6c 6c 62 61 63 6b 20 24 3a 3a 74 65 73 74 5f 63  llback $::test_c
2b930 68 61 6e 6e 65 6c 20 24 3a 3a 74 65 73 74 5f 6c  hannel $::test_l
2b940 6f 67 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  og..        }...
2b950 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
2b960 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63      # NOTE: Chec
2b970 6b 20 66 6f 72 20 74 68 65 20 6e 61 74 69 76 65  k for the native
2b980 20 72 75 6e 74 69 6d 65 20 6f 70 74 69 6f 6e 2c   runtime option,
2b990 20 77 68 69 63 68 20 77 6f 75 6c 64 20 6d 65 61   which would mea
2b9a0 6e 20 77 65 20 61 72 65 0d 0a 20 20 20 20 20 20  n we are..      
2b9b0 20 20 23 20 20 20 20 20 20 20 75 73 69 6e 67 20    #       using 
2b9c0 74 68 65 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61  the mixed-mode a
2b9d0 73 73 65 6d 62 6c 79 2e 0d 0a 20 20 20 20 20 20  ssembly...      
2b9e0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 63 68 65    #..        che
2b9f0 63 6b 46 6f 72 52 75 6e 74 69 6d 65 4f 70 74 69  ckForRuntimeOpti
2ba00 6f 6e 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  on $::test_chann
2ba10 65 6c 20 6e 61 74 69 76 65 0d 0a 0d 0a 20 20 20  el native....   
2ba20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
2ba30 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66  # NOTE: Check if
2ba40 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65 20   the test suite 
2ba50 73 68 6f 75 6c 64 20 63 6f 75 6e 74 20 74 68 65  should count the
2ba60 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6e 6e 65   number of conne
2ba70 63 74 69 6f 6e 73 0d 0a 20 20 20 20 20 20 20 20  ctions..        
2ba80 23 20 20 20 20 20 20 20 22 6f 70 65 6e 65 64 22  #       "opened"
2ba90 20 61 6e 64 20 22 63 6c 6f 73 65 64 22 20 66 72   and "closed" fr
2baa0 6f 6d 20 74 68 65 20 70 6f 6f 6c 20 77 68 65 6e  om the pool when
2bab0 20 64 65 74 65 72 6d 69 6e 69 6e 67 20 69 66 20   determining if 
2bac0 61 20 74 65 73 74 0d 0a 20 20 20 20 20 20 20 20  a test..        
2bad0 23 20 20 20 20 20 20 20 70 61 73 73 65 64 2e 20  #       passed. 
2bae0 20 44 69 73 61 62 6c 69 6e 67 20 74 68 69 73 20   Disabling this 
2baf0 62 65 68 61 76 69 6f 72 20 69 73 20 73 6f 6d 65  behavior is some
2bb00 74 69 6d 65 73 20 6e 65 63 65 73 73 61 72 79 20  times necessary 
2bb10 28 65 2e 67 2e 0d 0a 20 20 20 20 20 20 20 20 23  (e.g...        #
2bb20 20 20 20 20 20 20 20 64 75 72 69 6e 67 20 74 68         during th
2bb30 65 20 72 65 6c 65 61 73 65 20 74 65 73 74 69 6e  e release testin
2bb40 67 20 70 72 6f 63 65 73 73 29 20 62 65 63 61 75  g process) becau
2bb50 73 65 20 74 68 65 72 65 20 61 72 65 20 73 65 76  se there are sev
2bb60 65 72 61 6c 0d 0a 20 20 20 20 20 20 20 20 23 20  eral..        # 
2bb70 20 20 20 20 20 20 74 65 73 74 73 20 74 68 61 74        tests that
2bb80 20 72 65 6c 79 20 6f 6e 20 74 68 65 20 22 6f 70   rely on the "op
2bb90 65 6e 65 64 20 66 72 6f 6d 20 70 6f 6f 6c 22 20  ened from pool" 
2bba0 63 6f 75 6e 74 20 62 65 69 6e 67 20 67 72 65 61  count being grea
2bbb0 74 65 72 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ter..        #  
2bbc0 20 20 20 20 20 74 68 61 6e 20 7a 65 72 6f 2e 20       than zero. 
2bbd0 20 54 68 65 73 65 20 74 65 73 74 73 20 6d 61 79   These tests may
2bbe0 20 66 61 69 6c 20 64 75 65 20 74 6f 20 74 68 65   fail due to the
2bbf0 20 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e 69 73 74   non-determinist
2bc00 69 63 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ic..        #   
2bc10 20 20 20 20 62 65 68 61 76 69 6f 72 20 6f 66 20      behavior of 
2bc20 74 68 65 20 43 4c 52 20 47 43 2c 20 65 76 65 6e  the CLR GC, even
2bc30 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e   when there is n
2bc40 6f 20 62 75 67 20 69 6e 20 74 68 65 20 63 6f 64  o bug in the cod
2bc50 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
2bc60 20 20 20 62 65 69 6e 67 20 74 65 73 74 65 64 2e     being tested.
2bc70 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
2bc80 20 20 20 20 20 63 68 65 63 6b 46 6f 72 52 75 6e       checkForRun
2bc90 74 69 6d 65 4f 70 74 69 6f 6e 20 24 3a 3a 74 65  timeOption $::te
2bca0 73 74 5f 63 68 61 6e 6e 65 6c 20 6e 6f 50 6f 6f  st_channel noPoo
2bcb0 6c 43 6f 75 6e 74 73 0d 0a 0d 0a 20 20 20 20 20  lCounts....     
2bcc0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
2bcd0 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20 74  NOTE: Check if t
2bce0 68 65 20 74 65 73 74 20 73 75 69 74 65 20 73 68  he test suite sh
2bcf0 6f 75 6c 64 20 75 73 65 20 73 68 61 72 65 64 2d  ould use shared-
2bd00 63 61 63 68 65 20 6d 6f 64 65 2e 0d 0a 20 20 20  cache mode...   
2bd10 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
2bd20 63 68 65 63 6b 46 6f 72 52 75 6e 74 69 6d 65 4f  checkForRuntimeO
2bd30 70 74 69 6f 6e 20 24 3a 3a 74 65 73 74 5f 63 68  ption $::test_ch
2bd40 61 6e 6e 65 6c 20 73 68 61 72 65 64 43 61 63 68  annel sharedCach
2bd50 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  e....        #..
2bd60 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
2bd70 52 65 70 6f 72 74 20 74 68 65 20 72 65 73 6f 75  Report the resou
2bd80 72 63 65 20 75 73 61 67 65 20 70 72 69 6f 72 20  rce usage prior 
2bd90 74 6f 20 72 75 6e 6e 69 6e 67 20 61 6e 79 20 74  to running any t
2bda0 65 73 74 73 2e 0d 0a 20 20 20 20 20 20 20 20 23  ests...        #
2bdb0 0d 0a 20 20 20 20 20 20 20 20 72 65 70 6f 72 74  ..        report
2bdc0 53 51 4c 69 74 65 52 65 73 6f 75 72 63 65 73 20  SQLiteResources 
2bdd0 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d  $::test_channel.
2bde0 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
2bdf0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 47 72        # NOTE: Gr
2be00 61 62 20 74 68 65 20 6c 69 73 74 20 6f 66 20 6e  ab the list of n
2be10 61 74 69 76 65 20 6d 6f 64 75 6c 65 73 20 66 6f  ative modules fo
2be20 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 72  r the current pr
2be30 6f 63 65 73 73 20 61 6e 64 0d 0a 20 20 20 20 20  ocess and..     
2be40 20 20 20 23 20 20 20 20 20 20 20 72 65 70 6f 72     #       repor
2be50 74 20 6f 6e 20 74 68 65 20 53 79 73 74 65 6d 2e  t on the System.
2be60 44 61 74 61 2e 53 51 4c 69 74 65 20 72 65 6c 61  Data.SQLite rela
2be70 74 65 64 20 6f 6e 65 73 2e 0d 0a 20 20 20 20 20  ted ones...     
2be80 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66     #..        if
2be90 20 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f 62 6a   {[haveSQLiteObj
2bea0 65 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65  ectCommand]} the
2beb0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73  n {..          s
2bec0 65 74 20 6d 6f 64 75 6c 65 73 20 5b 6f 62 6a 65  et modules [obje
2bed0 63 74 20 69 6e 76 6f 6b 65 20 5c 0d 0a 20 20 20  ct invoke \..   
2bee0 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65             Syste
2bef0 6d 2e 44 69 61 67 6e 6f 73 74 69 63 73 2e 50 72  m.Diagnostics.Pr
2bf00 6f 63 65 73 73 2e 47 65 74 43 75 72 72 65 6e 74  ocess.GetCurrent
2bf10 50 72 6f 63 65 73 73 20 4d 6f 64 75 6c 65 73 5d  Process Modules]
2bf20 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62  ....          ob
2bf30 6a 65 63 74 20 66 6f 72 65 61 63 68 20 2d 61 6c  ject foreach -al
2bf40 69 61 73 20 6d 6f 64 75 6c 65 20 24 6d 6f 64 75  ias module $modu
2bf50 6c 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  les {..         
2bf60 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
2bf70 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 6d 6f    # NOTE: The mo
2bf80 64 75 6c 65 20 66 69 6c 65 20 6e 61 6d 65 20 68  dule file name h
2bf90 65 72 65 20 6d 75 73 74 20 62 65 20 6e 6f 72 6d  ere must be norm
2bfa0 61 6c 69 7a 65 64 2e 0d 0a 20 20 20 20 20 20 20  alized...       
2bfb0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
2bfc0 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65      set fileName
2bfd0 20 5b 66 69 6c 65 20 6e 6f 72 6d 61 6c 69 7a 65   [file normalize
2bfe0 20 5b 24 6d 6f 64 75 6c 65 20 46 69 6c 65 4e 61   [$module FileNa
2bff0 6d 65 5d 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  me]]..          
2c000 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 4f 6e    set fileNameOn
2c010 6c 79 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66  ly [file tail $f
2c020 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20  ileName]....    
2c030 20 20 20 20 20 20 20 20 69 66 20 7b 5b 6c 73 65          if {[lse
2c040 61 72 63 68 20 2d 65 78 61 63 74 20 2d 6e 6f 63  arch -exact -noc
2c050 61 73 65 20 2d 2d 20 5c 0d 0a 20 20 20 20 20 20  ase -- \..      
2c060 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 4e 61            [getNa
2c070 74 69 76 65 4c 69 62 72 61 72 79 46 69 6c 65 4e  tiveLibraryFileN
2c080 61 6d 65 73 4f 6e 6c 79 5d 20 24 66 69 6c 65 4e  amesOnly] $fileN
2c090 61 6d 65 4f 6e 6c 79 5d 20 21 3d 20 2d 31 7d 20  ameOnly] != -1} 
2c0a0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
2c0b0 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
2c0c0 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
2c0d0 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
2c0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
2c0f0 2d 2d 20 66 6f 75 6e 64 20 6c 6f 61 64 65 64 20  -- found loaded 
2c100 53 51 4c 69 74 65 20 6e 61 74 69 76 65 20 6c 69  SQLite native li
2c110 62 72 61 72 79 20 6d 6f 64 75 6c 65 3a 20 22 20  brary module: " 
2c120 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
2c130 20 20 20 20 20 24 66 69 6c 65 4e 61 6d 65 20 5c       $fileName \
2c140 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  n]..            
2c150 7d 20 65 6c 73 65 69 66 20 7b 5b 6c 73 65 61 72  } elseif {[lsear
2c160 63 68 20 2d 65 78 61 63 74 20 2d 6e 6f 63 61 73  ch -exact -nocas
2c170 65 20 2d 2d 20 5c 0d 0a 20 20 20 20 20 20 20 20  e -- \..        
2c180 20 20 20 20 20 20 20 20 5b 67 65 74 49 6e 74 65          [getInte
2c190 72 6f 70 41 73 73 65 6d 62 6c 79 46 69 6c 65 4e  ropAssemblyFileN
2c1a0 61 6d 65 73 4f 6e 6c 79 5d 20 24 66 69 6c 65 4e  amesOnly] $fileN
2c1b0 61 6d 65 4f 6e 6c 79 5d 20 21 3d 20 2d 31 7d 20  ameOnly] != -1} 
2c1c0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
2c1d0 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
2c1e0 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
2c1f0 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
2c200 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
2c210 2d 2d 20 66 6f 75 6e 64 20 6c 6f 61 64 65 64 20  -- found loaded 
2c220 53 51 4c 69 74 65 20 69 6e 74 65 72 6f 70 20 61  SQLite interop a
2c230 73 73 65 6d 62 6c 79 20 6d 6f 64 75 6c 65 3a 20  ssembly module: 
2c240 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
2c250 20 20 20 20 20 20 20 24 66 69 6c 65 4e 61 6d 65         $fileName
2c260 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \n]..          
2c270 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d    }..          }
2c280 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
2c290 20 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a         catch {..
2c2a0 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
2c2b0 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
2c2c0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
2c2d0 20 22 2d 2d 2d 2d 20 63 6f 6d 70 69 6c 65 2d 74   "---- compile-t
2c2e0 69 6d 65 20 6f 70 74 69 6f 6e 73 20 66 6f 72 20  ime options for 
2c2f0 53 51 4c 69 74 65 20 63 6f 72 65 20 6c 69 62 72  SQLite core libr
2c300 61 72 79 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20  ary... "....    
2c310 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
2c320 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
2c330 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66  object invoke -f
2c340 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20  lags +NonPublic 
2c350 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
2c360 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53     System.Data.S
2c370 51 4c 69 74 65 2e 53 51 4c 69 74 65 33 20 53 51  QLite.SQLite3 SQ
2c380 4c 69 74 65 43 6f 6d 70 69 6c 65 4f 70 74 69 6f  LiteCompileOptio
2c390 6e 73 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20  ns..          } 
2c3a0 63 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 73 5d 20  compileOptions] 
2c3b0 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
2c3c0 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
2c3d0 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
2c3e0 5b 61 70 70 65 6e 64 41 72 67 73 20 5b 66 6f 72  [appendArgs [for
2c3f0 6d 61 74 4c 69 73 74 20 5b 6c 73 6f 72 74 20 5c  matList [lsort \
2c400 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2c410 20 20 24 63 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e    $compileOption
2c420 73 5d 20 3c 6e 6f 6e 65 3e 5d 20 5c 6e 5d 0d 0a  s] <none>] \n]..
2c430 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
2c440 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
2c450 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
2c460 61 6e 6e 65 6c 20 75 6e 6b 6e 6f 77 6e 5c 6e 0d  annel unknown\n.
2c470 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
2c480 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
2c490 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20     catch {..    
2c4a0 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
2c4b0 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20  est_channel \.. 
2c4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
2c4d0 2d 2d 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  -- compile-time 
2c4e0 6f 70 74 69 6f 6e 73 20 66 6f 72 20 53 51 4c 69  options for SQLi
2c4f0 74 65 20 69 6e 74 65 72 6f 70 20 61 73 73 65 6d  te interop assem
2c500 62 6c 79 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20  bly... "....    
2c510 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
2c520 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
2c530 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66  object invoke -f
2c540 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20  lags +NonPublic 
2c550 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
2c560 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53     System.Data.S
2c570 51 4c 69 74 65 2e 53 51 4c 69 74 65 33 20 49 6e  QLite.SQLite3 In
2c580 74 65 72 6f 70 43 6f 6d 70 69 6c 65 4f 70 74 69  teropCompileOpti
2c590 6f 6e 73 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  ons..          }
2c5a0 20 63 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 73 5d   compileOptions]
2c5b0 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
2c5c0 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
2c5d0 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
2c5e0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5b 66 6f   [appendArgs [fo
2c5f0 72 6d 61 74 4c 69 73 74 20 5b 6c 73 6f 72 74 20  rmatList [lsort 
2c600 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
2c610 20 20 20 24 63 6f 6d 70 69 6c 65 4f 70 74 69 6f     $compileOptio
2c620 6e 73 5d 20 3c 6e 6f 6e 65 3e 5d 20 5c 6e 5d 0d  ns] <none>] \n].
2c630 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73  .          } els
2c640 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e {..           
2c650 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
2c660 68 61 6e 6e 65 6c 20 75 6e 6b 6e 6f 77 6e 5c 6e  hannel unknown\n
2c670 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
2c680 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
2c690 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
2c6a0 20 4e 4f 54 45 3a 20 53 68 6f 77 20 74 68 65 20   NOTE: Show the 
2c6b0 61 63 74 69 76 65 20 74 65 73 74 20 63 6f 6e 73  active test cons
2c6c0 74 72 61 69 6e 74 73 2e 0d 0a 20 20 20 20 20 20  traints...      
2c6d0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75    #..        tpu
2c6e0 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
2c6f0 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22  el [appendArgs "
2c700 2d 2d 2d 2d 20 63 6f 6e 73 74 72 61 69 6e 74 73  ---- constraints
2c710 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  : " \..         
2c720 20 20 20 5b 66 6f 72 6d 61 74 4c 69 73 74 20 5b     [formatList [
2c730 6c 73 6f 72 74 20 5b 67 65 74 43 6f 6e 73 74 72  lsort [getConstr
2c740 61 69 6e 74 73 5d 5d 20 3c 6e 6f 6e 65 3e 5d 20  aints]] <none>] 
2c750 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23  \n]....        #
2c760 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
2c770 3a 20 53 61 76 65 20 74 68 65 20 74 65 73 74 20  : Save the test 
2c780 63 6f 6e 73 74 72 61 69 6e 74 73 20 66 6f 72 20  constraints for 
2c790 75 73 65 20 62 79 20 74 68 72 65 61 64 73 20 63  use by threads c
2c7a0 72 65 61 74 65 64 20 69 6e 20 74 68 69 73 0d 0a  reated in this..
2c7b0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
2c7c0 61 70 70 6c 69 63 61 74 69 6f 6e 20 64 6f 6d 61  application doma
2c7d0 69 6e 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63  in.  This is nec
2c7e0 65 73 73 61 72 79 20 62 65 63 61 75 73 65 20 61  essary because a
2c7f0 6c 6c 20 74 68 65 20 45 61 67 6c 65 0d 0a 20 20  ll the Eagle..  
2c800 20 20 20 20 20 20 23 20 20 20 20 20 20 20 22 74        #       "t
2c810 65 73 74 20 63 6f 6e 74 65 78 74 22 20 69 6e 66  est context" inf
2c820 6f 72 6d 61 74 69 6f 6e 20 69 73 20 70 65 72 2d  ormation is per-
2c830 74 68 72 65 61 64 2e 0d 0a 20 20 20 20 20 20 20  thread...       
2c840 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   #..        if {
2c850 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
2c860 74 65 73 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73  test_constraints
2c870 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
2c880 20 20 20 20 20 73 65 74 20 3a 3a 74 65 73 74 5f       set ::test_
2c890 63 6f 6e 73 74 72 61 69 6e 74 73 20 24 3a 3a 65  constraints $::e
2c8a0 61 67 6c 65 5f 74 65 73 74 73 28 43 6f 6e 73 74  agle_tests(Const
2c8b0 72 61 69 6e 74 73 29 0d 0a 20 20 20 20 20 20 20  raints)..       
2c8c0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d   }....        #.
2c8d0 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
2c8e0 20 4c 6f 61 64 20 74 68 65 20 22 61 66 74 65 72   Load the "after
2c8f0 2d 63 6f 6e 73 74 72 61 69 6e 74 73 22 20 63 75  -constraints" cu
2c900 73 74 6f 6d 20 70 65 72 2d 75 73 65 72 20 61 6e  stom per-user an
2c910 64 2f 6f 72 20 70 65 72 2d 68 6f 73 74 0d 0a 20  d/or per-host.. 
2c920 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74         #       t
2c930 65 73 74 20 73 65 74 74 69 6e 67 73 20 6e 6f 77  est settings now
2c940 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
2c950 20 20 20 20 20 20 75 70 6c 65 76 65 6c 20 31 20        uplevel 1 
2c960 5b 6c 69 73 74 20 6c 6f 61 64 53 51 4c 69 74 65  [list loadSQLite
2c970 54 65 73 74 53 65 74 74 69 6e 67 73 20 24 3a 3a  TestSettings $::
2c980 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 2e 61 66  test_channel .af
2c990 74 65 72 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ter]....        
2c9a0 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
2c9b0 45 3a 20 49 66 20 6e 65 63 65 73 73 61 72 79 2c  E: If necessary,
2c9c0 20 65 6e 61 62 6c 65 20 73 68 61 72 65 64 2d 63   enable shared-c
2c9d0 61 63 68 65 20 6d 6f 64 65 20 6e 6f 77 2e 0d 0a  ache mode now...
2c9e0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
2c9f0 20 20 20 69 66 20 7b 5b 68 61 73 52 75 6e 74 69     if {[hasRunti
2ca00 6d 65 4f 70 74 69 6f 6e 20 73 68 61 72 65 64 43  meOption sharedC
2ca10 61 63 68 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  ache]} then {.. 
2ca20 20 20 20 20 20 20 20 20 20 65 6e 61 62 6c 65 53           enableS
2ca30 68 61 72 65 64 43 61 63 68 65 20 24 3a 3a 74 65  haredCache $::te
2ca40 73 74 5f 63 68 61 6e 6e 65 6c 20 74 72 75 65 0d  st_channel true.
2ca50 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
2ca60 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
2ca70 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20 77 68   # NOTE: Show wh
2ca80 65 6e 20 6f 75 72 20 74 65 73 74 73 20 61 63 74  en our tests act
2ca90 75 61 6c 6c 79 20 62 65 67 61 6e 20 28 6e 6f 77  ually began (now
2caa0 29 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  )...        #.. 
2cab0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
2cac0 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
2cad0 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
2cae0 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 53 79          "---- Sy
2caf0 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
2cb00 20 74 65 73 74 73 20 62 65 67 61 6e 20 61 74 20   tests began at 
2cb10 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
2cb20 20 5b 63 6c 6f 63 6b 20 66 6f 72 6d 61 74 20 5b   [clock format [
2cb30 63 6c 6f 63 6b 20 73 65 63 6f 6e 64 73 5d 5d 20  clock seconds]] 
2cb40 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  \n]..      }..  
2cb50 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
2cb60 20 72 75 6e 53 51 4c 69 74 65 54 65 73 74 46 69   runSQLiteTestFi
2cb70 6c 65 73 50 72 6f 6c 6f 67 75 65 20 7b 7d 20 7b  lesPrologue {} {
2cb80 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
2cb90 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20 72 75   # NOTE: Skip ru
2cba0 6e 6e 69 6e 67 20 6f 75 72 20 63 75 73 74 6f 6d  nning our custom
2cbb0 20 66 69 6c 65 73 20 70 72 6f 6c 6f 67 75 65 20   files prologue 
2cbc0 69 66 20 74 68 65 20 6d 61 69 6e 20 6f 6e 65 20  if the main one 
2cbd0 68 61 73 20 62 65 65 6e 0d 0a 20 20 20 20 20 20  has been..      
2cbe0 23 20 20 20 20 20 20 20 73 6b 69 70 70 65 64 2e  #       skipped.
2cbf0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
2cc00 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
2cc10 74 73 20 3a 3a 6e 6f 28 70 72 6f 6c 6f 67 75 65  ts ::no(prologue
2cc20 2e 65 61 67 6c 65 29 5d 7d 20 74 68 65 6e 20 7b  .eagle)]} then {
2cc30 0d 0a 20 20 20 20 20 20 20 20 75 70 6c 65 76 65  ..        upleve
2cc40 6c 20 31 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  l 1 {..         
2cc50 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
2cc60 4e 4f 54 45 3a 20 53 65 74 75 70 20 74 68 65 20  NOTE: Setup the 
2cc70 76 61 72 69 61 62 6c 65 73 20 74 68 61 74 20 72  variables that r
2cc80 65 66 65 72 20 74 6f 20 74 68 65 20 76 61 72 69  efer to the vari
2cc90 6f 75 73 20 6e 6f 6e 2d 64 61 74 61 20 66 69 6c  ous non-data fil
2cca0 65 73 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20  es..          # 
2ccb0 20 20 20 20 20 20 72 65 71 75 69 72 65 64 20 62        required b
2ccc0 79 20 74 68 65 20 74 65 73 74 73 20 69 6e 20 74  y the tests in t
2ccd0 68 69 73 20 66 69 6c 65 2e 0d 0a 20 20 20 20 20  his file...     
2cce0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
2ccf0 20 20 73 65 74 20 65 6e 74 69 74 79 46 72 61 6d    set entityFram
2cd00 65 77 6f 72 6b 44 6c 6c 46 69 6c 65 20 5c 0d 0a  eworkDllFile \..
2cd10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 67                [g
2cd20 65 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20  etBuildFileName 
2cd30 45 6e 74 69 74 79 46 72 61 6d 65 77 6f 72 6b 2e  EntityFramework.
2cd40 64 6c 6c 20 66 61 6c 73 65 5d 0d 0a 0d 0a 20 20  dll false]....  
2cd50 20 20 20 20 20 20 20 20 73 65 74 20 69 6e 73 74          set inst
2cd60 61 6c 6c 65 72 45 78 65 46 69 6c 65 20 5c 0d 0a  allerExeFile \..
2cd70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 67                [g
2cd80 65 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20  etBuildFileName 
2cd90 49 6e 73 74 61 6c 6c 65 72 2e 65 78 65 20 66 61  Installer.exe fa
2cda0 6c 73 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  lse]....        
2cdb0 20 20 73 65 74 20 73 71 6c 69 74 65 44 65 73 69    set sqliteDesi
2cdc0 67 6e 65 72 44 6c 6c 46 69 6c 65 20 5c 0d 0a 20  gnerDllFile \.. 
2cdd0 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65               [ge
2cde0 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20 53  tBuildFileName S
2cdf0 51 4c 69 74 65 2e 44 65 73 69 67 6e 65 72 2e 64  QLite.Designer.d
2ce00 6c 6c 20 66 61 6c 73 65 5d 0d 0a 0d 0a 20 20 20  ll false]....   
2ce10 20 20 20 20 20 20 20 73 65 74 20 73 79 73 74 65         set syste
2ce20 6d 44 61 74 61 53 51 4c 69 74 65 44 6c 6c 46 69  mDataSQLiteDllFi
2ce30 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  le \..          
2ce40 20 20 20 20 5b 67 65 74 42 75 69 6c 64 46 69 6c      [getBuildFil
2ce50 65 4e 61 6d 65 20 53 79 73 74 65 6d 2e 44 61 74  eName System.Dat
2ce60 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 20 66 61 6c  a.SQLite.dll fal
2ce70 73 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  se]....         
2ce80 20 73 65 74 20 73 79 73 74 65 6d 44 61 74 61 53   set systemDataS
2ce90 51 4c 69 74 65 4c 69 6e 71 44 6c 6c 46 69 6c 65  QLiteLinqDllFile
2cea0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
2ceb0 20 20 5b 67 65 74 42 75 69 6c 64 46 69 6c 65 4e    [getBuildFileN
2cec0 61 6d 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  ame System.Data.
2ced0 53 51 4c 69 74 65 2e 4c 69 6e 71 2e 64 6c 6c 20  SQLite.Linq.dll 
2cee0 66 61 6c 73 65 5d 0d 0a 0d 0a 20 20 20 20 20 20  false]....      
2cef0 20 20 20 20 73 65 74 20 73 79 73 74 65 6d 44 61      set systemDa
2cf00 74 61 53 51 4c 69 74 65 45 66 36 44 6c 6c 46 69  taSQLiteEf6DllFi
2cf10 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  le \..          
2cf20 20 20 20 20 5b 67 65 74 42 75 69 6c 64 46 69 6c      [getBuildFil
2cf30 65 4e 61 6d 65 20 53 79 73 74 65 6d 2e 44 61 74  eName System.Dat
2cf40 61 2e 53 51 4c 69 74 65 2e 45 46 36 2e 64 6c 6c  a.SQLite.EF6.dll
2cf50 20 66 61 6c 73 65 5d 0d 0a 0d 0a 20 20 20 20 20   false]....     
2cf60 20 20 20 20 20 73 65 74 20 74 65 73 74 45 78 65       set testExe
2cf70 46 69 6c 65 20 5b 67 65 74 42 75 69 6c 64 46 69  File [getBuildFi
2cf80 6c 65 4e 61 6d 65 20 74 65 73 74 2e 65 78 65 20  leName test.exe 
2cf90 66 61 6c 73 65 5d 0d 0a 20 20 20 20 20 20 20 20  false]..        
2cfa0 20 20 73 65 74 20 74 65 73 74 4c 69 6e 71 45 78    set testLinqEx
2cfb0 65 46 69 6c 65 20 5b 67 65 74 42 75 69 6c 64 46  eFile [getBuildF
2cfc0 69 6c 65 4e 61 6d 65 20 74 65 73 74 6c 69 6e 71  ileName testlinq
2cfd0 2e 65 78 65 20 66 61 6c 73 65 5d 0d 0a 20 20 20  .exe false]..   
2cfe0 20 20 20 20 20 20 20 73 65 74 20 74 65 73 74 45         set testE
2cff0 66 36 45 78 65 46 69 6c 65 20 5b 67 65 74 42 75  f6ExeFile [getBu
2d000 69 6c 64 46 69 6c 65 4e 61 6d 65 20 74 65 73 74  ildFileName test
2d010 65 66 36 2e 65 78 65 20 66 61 6c 73 65 5d 0d 0a  ef6.exe false]..
2d020 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
2d030 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
2d040 20 53 65 74 75 70 20 74 68 65 20 76 61 72 69 61   Setup the varia
2d050 62 6c 65 73 20 74 68 61 74 20 72 65 66 65 72 20  bles that refer 
2d060 74 6f 20 74 68 65 20 76 61 72 69 6f 75 73 20 64  to the various d
2d070 61 74 61 20 66 69 6c 65 73 0d 0a 20 20 20 20 20  ata files..     
2d080 20 20 20 20 20 23 20 20 20 20 20 20 20 72 65 71       #       req
2d090 75 69 72 65 64 20 62 79 20 74 68 65 20 74 65 73  uired by the tes
2d0a0 74 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 2e  ts in this file.
2d0b0 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
2d0c0 20 20 20 20 20 20 20 20 20 73 65 74 20 74 65 73           set tes
2d0d0 74 4c 69 6e 71 4f 75 74 46 69 6c 65 20 5b 66 69  tLinqOutFile [fi
2d0e0 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66  le nativename [f
2d0f0 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20  ile join \..    
2d100 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 53 51            [getSQ
2d110 4c 69 74 65 54 65 73 74 44 61 74 61 50 61 74 68  LiteTestDataPath
2d120 5d 20 74 65 73 74 6c 69 6e 71 2e 6f 75 74 5d 5d  ] testlinq.out]]
2d130 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65  ....          se
2d140 74 20 6e 6f 72 74 68 77 69 6e 64 45 66 44 62 46  t northwindEfDbF
2d150 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65  ile [file native
2d160 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20  name [file join 
2d170 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
2d180 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20 5b   [file dirname [
2d190 66 69 6c 65 20 64 69 72 6e 61 6d 65 20 5b 67 65  file dirname [ge
2d1a0 74 53 51 4c 69 74 65 54 65 73 74 44 61 74 61 50  tSQLiteTestDataP
2d1b0 61 74 68 5d 5d 5d 20 5c 0d 0a 20 20 20 20 20 20  ath]]] \..      
2d1c0 20 20 20 20 20 20 20 20 74 65 73 74 6c 69 6e 71          testlinq
2d1d0 20 6e 6f 72 74 68 77 69 6e 64 45 46 2e 64 62 5d   northwindEF.db]
2d1e0 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 73  ]....          s
2d1f0 65 74 20 6e 6f 6e 57 61 6c 44 62 46 69 6c 65 20  et nonWalDbFile 
2d200 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65  [file nativename
2d210 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20   [file join \.. 
2d220 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65               [ge
2d230 74 53 51 4c 69 74 65 54 65 73 74 44 61 74 61 50  tSQLiteTestDataP
2d240 61 74 68 5d 20 6e 6f 6e 57 61 6c 2e 64 62 5d 5d  ath] nonWal.db]]
2d250 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65  ....          se
2d260 74 20 77 61 6c 44 62 46 69 6c 65 20 5b 66 69 6c  t walDbFile [fil
2d270 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69  e nativename [fi
2d280 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20  le join \..     
2d290 20 20 20 20 20 20 20 20 20 5b 67 65 74 53 51 4c           [getSQL
2d2a0 69 74 65 54 65 73 74 44 61 74 61 50 61 74 68 5d  iteTestDataPath]
2d2b0 20 77 61 6c 2e 64 62 5d 5d 0d 0a 0d 0a 20 20 20   wal.db]]....   
2d2c0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
2d2d0 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20      # NOTE: The 
2d2e0 76 61 72 69 6f 75 73 20 69 6e 73 74 61 6c 6c 2f  various install/
2d2f0 75 6e 69 6e 73 74 61 6c 6c 20 6c 6f 67 20 66 69  uninstall log fi
2d300 6c 65 73 20 75 73 65 64 20 74 6f 20 74 65 73 74  les used to test
2d310 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 20 20   the..          
2d320 23 20 20 20 20 20 20 20 64 65 73 69 67 6e 2d 74  #       design-t
2d330 69 6d 65 20 63 6f 6d 70 6f 6e 65 6e 74 20 69 6e  ime component in
2d340 73 74 61 6c 6c 65 72 2e 0d 0a 20 20 20 20 20 20  staller...      
2d350 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
2d360 20 73 65 74 20 74 65 73 74 49 6e 73 74 61 6c 6c   set testInstall
2d370 56 73 32 30 30 35 4c 6f 67 46 69 6c 65 20 5b 66  Vs2005LogFile [f
2d380 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b  ile nativename [
2d390 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20  file join \..   
2d3a0 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 53             [getS
2d3b0 51 4c 69 74 65 54 65 73 74 44 61 74 61 50 61 74  QLiteTestDataPat
2d3c0 68 5d 20 49 6e 73 74 61 6c 6c 65 72 5f 54 65 73  h] Installer_Tes
2d3d0 74 5f 56 73 32 30 30 35 2e 6c 6f 67 5d 5d 0d 0a  t_Vs2005.log]]..
2d3e0 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
2d3f0 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 30  testInstallVs200
2d400 38 4c 6f 67 46 69 6c 65 20 5b 66 69 6c 65 20 6e  8LogFile [file n
2d410 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20  ativename [file 
2d420 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20  join \..        
2d430 20 20 20 20 20 20 5b 67 65 74 53 51 4c 69 74 65        [getSQLite
2d440 54 65 73 74 44 61 74 61 50 61 74 68 5d 20 49 6e  TestDataPath] In
2d450 73 74 61 6c 6c 65 72 5f 54 65 73 74 5f 56 73 32  staller_Test_Vs2
2d460 30 30 38 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20  008.log]]....   
2d470 20 20 20 20 20 20 20 73 65 74 20 74 65 73 74 49         set testI
2d480 6e 73 74 61 6c 6c 56 73 32 30 31 30 4c 6f 67 46  nstallVs2010LogF
2d490 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65  ile [file native
2d4a0 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20  name [file join 
2d4b0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
2d4c0 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73 74 44   [getSQLiteTestD
2d4d0 61 74 61 50 61 74 68 5d 20 49 6e 73 74 61 6c 6c  ataPath] Install
2d4e0 65 72 5f 54 65 73 74 5f 56 73 32 30 31 30 2e 6c  er_Test_Vs2010.l
2d4f0 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  og]]....        
2d500 20 20 73 65 74 20 74 65 73 74 49 6e 73 74 61 6c    set testInstal
2d510 6c 56 73 32 30 31 32 4c 6f 67 46 69 6c 65 20 5b  lVs2012LogFile [
2d520 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20  file nativename 
2d530 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20  [file join \..  
2d540 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74              [get
2d550 53 51 4c 69 74 65 54 65 73 74 44 61 74 61 50 61  SQLiteTestDataPa
2d560 74 68 5d 20 49 6e 73 74 61 6c 6c 65 72 5f 54 65  th] Installer_Te
2d570 73 74 5f 56 73 32 30 31 32 2e 6c 6f 67 5d 5d 0d  st_Vs2012.log]].
2d580 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  ...          set
2d590 20 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30   testInstallVs20
2d5a0 31 33 4c 6f 67 46 69 6c 65 20 5b 66 69 6c 65 20  13LogFile [file 
2d5b0 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65  nativename [file
2d5c0 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20   join \..       
2d5d0 20 20 20 20 20 20 20 5b 67 65 74 53 51 4c 69 74         [getSQLit
2d5e0 65 54 65 73 74 44 61 74 61 50 61 74 68 5d 20 49  eTestDataPath] I
2d5f0 6e 73 74 61 6c 6c 65 72 5f 54 65 73 74 5f 56 73  nstaller_Test_Vs
2d600 32 30 31 33 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20  2013.log]]....  
2d610 20 20 20 20 20 20 20 20 73 65 74 20 74 65 73 74          set test
2d620 49 6e 73 74 61 6c 6c 56 73 32 30 31 35 4c 6f 67  InstallVs2015Log
2d630 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69 76  File [file nativ
2d640 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e  ename [file join
2d650 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
2d660 20 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73 74    [getSQLiteTest
2d670 44 61 74 61 50 61 74 68 5d 20 49 6e 73 74 61 6c  DataPath] Instal
2d680 6c 65 72 5f 54 65 73 74 5f 56 73 32 30 31 35 2e  ler_Test_Vs2015.
2d690 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  log]]....       
2d6a0 20 20 20 73 65 74 20 74 65 73 74 49 6e 73 74 61     set testInsta
2d6b0 6c 6c 56 73 32 30 31 37 4c 6f 67 46 69 6c 65 20  llVs2017LogFile 
2d6c0 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65  [file nativename
2d6d0 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20   [file join \.. 
2d6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65               [ge
2d6f0 74 53 51 4c 69 74 65 54 65 73 74 44 61 74 61 50  tSQLiteTestDataP
2d700 61 74 68 5d 20 49 6e 73 74 61 6c 6c 65 72 5f 54  ath] Installer_T
2d710 65 73 74 5f 56 73 32 30 31 37 2e 6c 6f 67 5d 5d  est_Vs2017.log]]
2d720 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65  ....          se
2d730 74 20 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56  t testUninstallV
2d740 73 32 30 30 35 4c 6f 67 46 69 6c 65 20 5b 66 69  s2005LogFile [fi
2d750 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66  le nativename [f
2d760 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20  ile join \..    
2d770 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 53 51            [getSQ
2d780 4c 69 74 65 54 65 73 74 44 61 74 61 50 61 74 68  LiteTestDataPath
2d790 5d 20 55 6e 69 6e 73 74 61 6c 6c 65 72 5f 54 65  ] Uninstaller_Te
2d7a0 73 74 5f 56 73 32 30 30 35 2e 6c 6f 67 5d 5d 0d  st_Vs2005.log]].
2d7b0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  ...          set
2d7c0 20 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73   testUninstallVs
2d7d0 32 30 30 38 4c 6f 67 46 69 6c 65 20 5b 66 69 6c  2008LogFile [fil
2d7e0 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69  e nativename [fi
2d7f0 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20  le join \..     
2d800 20 20 20 20 20 20 20 20 20 5b 67 65 74 53 51 4c           [getSQL
2d810 69 74 65 54 65 73 74 44 61 74 61 50 61 74 68 5d  iteTestDataPath]
2d820 20 55 6e 69 6e 73 74 61 6c 6c 65 72 5f 54 65 73   Uninstaller_Tes
2d830 74 5f 56 73 32 30 30 38 2e 6c 6f 67 5d 5d 0d 0a  t_Vs2008.log]]..
2d840 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
2d850 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32  testUninstallVs2
2d860 30 31 30 4c 6f 67 46 69 6c 65 20 5b 66 69 6c 65  010LogFile [file
2d870 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c   nativename [fil
2d880 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20  e join \..      
2d890 20 20 20 20 20 20 20 20 5b 67 65 74 53 51 4c 69          [getSQLi
2d8a0 74 65 54 65 73 74 44 61 74 61 50 61 74 68 5d 20  teTestDataPath] 
2d8b0 55 6e 69 6e 73 74 61 6c 6c 65 72 5f 54 65 73 74  Uninstaller_Test
2d8c0 5f 56 73 32 30 31 30 2e 6c 6f 67 5d 5d 0d 0a 0d  _Vs2010.log]]...
2d8d0 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20 74  .          set t
2d8e0 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30  estUninstallVs20
2d8f0 31 32 4c 6f 67 46 69 6c 65 20 5b 66 69 6c 65 20  12LogFile [file 
2d900 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65  nativename [file
2d910 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20   join \..       
2d920 20 20 20 20 20 20 20 5b 67 65 74 53 51 4c 69 74         [getSQLit
2d930 65 54 65 73 74 44 61 74 61 50 61 74 68 5d 20 55  eTestDataPath] U
2d940 6e 69 6e 73 74 61 6c 6c 65 72 5f 54 65 73 74 5f  ninstaller_Test_
2d950 56 73 32 30 31 32 2e 6c 6f 67 5d 5d 0d 0a 0d 0a  Vs2012.log]]....
2d960 20 20 20 20 20 20 20 20 20 20 73 65 74 20 74 65            set te
2d970 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31  stUninstallVs201
2d980 33 4c 6f 67 46 69 6c 65 20 5b 66 69 6c 65 20 6e  3LogFile [file n
2d990 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20  ativename [file 
2d9a0 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20  join \..        
2d9b0 20 20 20 20 20 20 5b 67 65 74 53 51 4c 69 74 65        [getSQLite
2d9c0 54 65 73 74 44 61 74 61 50 61 74 68 5d 20 55 6e  TestDataPath] Un
2d9d0 69 6e 73 74 61 6c 6c 65 72 5f 54 65 73 74 5f 56  installer_Test_V
2d9e0 73 32 30 31 33 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20  s2013.log]].... 
2d9f0 20 20 20 20 20 20 20 20 20 73 65 74 20 74 65 73           set tes
2da00 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31 35  tUninstallVs2015
2da10 4c 6f 67 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61  LogFile [file na
2da20 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a  tivename [file j
2da30 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  oin \..         
2da40 20 20 20 20 20 5b 67 65 74 53 51 4c 69 74 65 54       [getSQLiteT
2da50 65 73 74 44 61 74 61 50 61 74 68 5d 20 55 6e 69  estDataPath] Uni
2da60 6e 73 74 61 6c 6c 65 72 5f 54 65 73 74 5f 56 73  nstaller_Test_Vs
2da70 32 30 31 35 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20  2015.log]]....  
2da80 20 20 20 20 20 20 20 20 73 65 74 20 74 65 73 74          set test
2da90 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31 37 4c  UninstallVs2017L
2daa0 6f 67 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74  ogFile [file nat
2dab0 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f  ivename [file jo
2dac0 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  in \..          
2dad0 20 20 20 20 5b 67 65 74 53 51 4c 69 74 65 54 65      [getSQLiteTe
2dae0 73 74 44 61 74 61 50 61 74 68 5d 20 55 6e 69 6e  stDataPath] Unin
2daf0 73 74 61 6c 6c 65 72 5f 54 65 73 74 5f 56 73 32  staller_Test_Vs2
2db00 30 31 37 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20  017.log]]....   
2db10 20 20 20 20 20 20 20 23 23 23 23 23 23 23 23 23         #########
2db20 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2db30 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2db40 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2db50 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a  ############....
2db60 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
2db70 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
2db80 28 63 68 65 63 6b 46 6f 72 53 71 6c 69 74 65 46  (checkForSqliteF
2db90 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  iles)]} then {..
2dba0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
2dbb0 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74  ![haveConstraint
2dbc0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c   [appendArgs fil
2dbd0 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  e_ \..          
2dbe0 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c        [file tail
2dbf0 20 24 65 6e 74 69 74 79 46 72 61 6d 65 77 6f 72   $entityFramewor
2dc00 6b 44 6c 6c 46 69 6c 65 5d 5d 5d 7d 20 74 68 65  kDllFile]]]} the
2dc10 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
2dc20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20     checkForFile 
2dc30 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 65  $test_channel $e
2dc40 6e 74 69 74 79 46 72 61 6d 65 77 6f 72 6b 44 6c  ntityFrameworkDl
2dc50 6c 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 20  lFile..         
2dc60 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
2dc70 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f      if {![haveCo
2dc80 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64  nstraint [append
2dc90 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20  Args file_ \..  
2dca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 66                [f
2dcb0 69 6c 65 20 74 61 69 6c 20 24 69 6e 73 74 61 6c  ile tail $instal
2dcc0 6c 65 72 45 78 65 46 69 6c 65 5d 5d 5d 7d 20 74  lerExeFile]]]} t
2dcd0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
2dce0 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c       checkForFil
2dcf0 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  e $test_channel 
2dd00 24 69 6e 73 74 61 6c 6c 65 72 45 78 65 46 69 6c  $installerExeFil
2dd10 65 20 49 6e 73 74 61 6c 6c 65 72 2e 65 78 65 0d  e Installer.exe.
2dd20 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
2dd30 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
2dd40 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69   {![haveConstrai
2dd50 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66  nt [appendArgs f
2dd60 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20  ile_ \..        
2dd70 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61          [file ta
2dd80 69 6c 20 24 73 71 6c 69 74 65 44 65 73 69 67 6e  il $sqliteDesign
2dd90 65 72 44 6c 6c 46 69 6c 65 5d 5d 5d 7d 20 74 68  erDllFile]]]} th
2dda0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
2ddb0 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65      checkForFile
2ddc0 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24   $test_channel $
2ddd0 73 71 6c 69 74 65 44 65 73 69 67 6e 65 72 44 6c  sqliteDesignerDl
2dde0 6c 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 20  lFile..         
2ddf0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
2de00 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f      if {![haveCo
2de10 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64  nstraint [append
2de20 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20  Args file_ \..  
2de30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 66                [f
2de40 69 6c 65 20 74 61 69 6c 20 24 73 79 73 74 65 6d  ile tail $system
2de50 44 61 74 61 53 51 4c 69 74 65 44 6c 6c 46 69 6c  DataSQLiteDllFil
2de60 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  e]]]} then {..  
2de70 20 20 20 20 20 20 20 20 20 20 20 20 63 68 65 63              chec
2de80 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63  kForFile $test_c
2de90 68 61 6e 6e 65 6c 20 24 73 79 73 74 65 6d 44 61  hannel $systemDa
2dea0 74 61 53 51 4c 69 74 65 44 6c 6c 46 69 6c 65 0d  taSQLiteDllFile.
2deb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
2dec0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
2ded0 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69   {![haveConstrai
2dee0 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66  nt [appendArgs f
2def0 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20  ile_ \..        
2df00 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61          [file ta
2df10 69 6c 20 24 73 79 73 74 65 6d 44 61 74 61 53 51  il $systemDataSQ
2df20 4c 69 74 65 4c 69 6e 71 44 6c 6c 46 69 6c 65 5d  LiteLinqDllFile]
2df30 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  ]]} then {..    
2df40 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 46            checkF
2df50 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61  orFile $test_cha
2df60 6e 6e 65 6c 20 24 73 79 73 74 65 6d 44 61 74 61  nnel $systemData
2df70 53 51 4c 69 74 65 4c 69 6e 71 44 6c 6c 46 69 6c  SQLiteLinqDllFil
2df80 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e..            }
2df90 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
2dfa0 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72  if {![haveConstr
2dfb0 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
2dfc0 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20   file_ \..      
2dfd0 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20            [file 
2dfe0 74 61 69 6c 20 24 73 79 73 74 65 6d 44 61 74 61  tail $systemData
2dff0 53 51 4c 69 74 65 45 66 36 44 6c 6c 46 69 6c 65  SQLiteEf6DllFile
2e000 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ]]]} then {..   
2e010 20 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b             check
2e020 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68  ForFile $test_ch
2e030 61 6e 6e 65 6c 20 24 73 79 73 74 65 6d 44 61 74  annel $systemDat
2e040 61 53 51 4c 69 74 65 45 66 36 44 6c 6c 46 69 6c  aSQLiteEf6DllFil
2e050 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e..            }
2e060 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
2e070 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72  if {![haveConstr
2e080 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
2e090 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20   file_ \..      
2e0a0 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20            [file 
2e0b0 74 61 69 6c 20 24 74 65 73 74 45 78 65 46 69 6c  tail $testExeFil
2e0c0 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  e]]]} then {..  
2e0d0 20 20 20 20 20 20 20 20 20 20 20 20 63 68 65 63              chec
2e0e0 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63  kForFile $test_c
2e0f0 68 61 6e 6e 65 6c 20 24 74 65 73 74 45 78 65 46  hannel $testExeF
2e100 69 6c 65 20 74 65 73 74 2e 65 78 65 0d 0a 20 20  ile test.exe..  
2e110 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
2e120 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
2e130 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20  [haveConstraint 
2e140 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65  [appendArgs file
2e150 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  _ \..           
2e160 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20       [file tail 
2e170 24 74 65 73 74 4c 69 6e 71 45 78 65 46 69 6c 65  $testLinqExeFile
2e180 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ]]]} then {..   
2e190 20 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b             check
2e1a0 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68  ForFile $test_ch
2e1b0 61 6e 6e 65 6c 20 24 74 65 73 74 4c 69 6e 71 45  annel $testLinqE
2e1c0 78 65 46 69 6c 65 20 74 65 73 74 6c 69 6e 71 2e  xeFile testlinq.
2e1d0 65 78 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  exe..           
2e1e0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
2e1f0 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73    if {![haveCons
2e200 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
2e210 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20  gs file_ \..    
2e220 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c              [fil
2e230 65 20 74 61 69 6c 20 24 74 65 73 74 45 66 36 45  e tail $testEf6E
2e240 78 65 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20  xeFile]]]} then 
2e250 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
2e260 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74   checkForFile $t
2e270 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73  est_channel $tes
2e280 74 45 66 36 45 78 65 46 69 6c 65 20 74 65 73 74  tEf6ExeFile test
2e290 65 66 36 2e 65 78 65 0d 0a 20 20 20 20 20 20 20  ef6.exe..       
2e2a0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
2e2b0 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65        if {![have
2e2c0 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65  Constraint [appe
2e2d0 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a  ndArgs file_ \..
2e2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e2f0 5b 66 69 6c 65 20 74 61 69 6c 20 24 74 65 73 74  [file tail $test
2e300 4c 69 6e 71 4f 75 74 46 69 6c 65 5d 5d 5d 7d 20  LinqOutFile]]]} 
2e310 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
2e320 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69        checkForFi
2e330 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c  le $test_channel
2e340 20 24 74 65 73 74 4c 69 6e 71 4f 75 74 46 69 6c   $testLinqOutFil
2e350 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e..            }
2e360 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
2e370 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72  if {![haveConstr
2e380 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
2e390 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20   file_ \..      
2e3a0 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20            [file 
2e3b0 74 61 69 6c 20 24 6e 6f 72 74 68 77 69 6e 64 45  tail $northwindE
2e3c0 66 44 62 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e  fDbFile]]]} then
2e3d0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
2e3e0 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24    checkForFile $
2e3f0 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 6e 6f  test_channel $no
2e400 72 74 68 77 69 6e 64 45 66 44 62 46 69 6c 65 0d  rthwindEfDbFile.
2e410 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
2e420 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
2e430 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69   {![haveConstrai
2e440 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66  nt [appendArgs f
2e450 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20  ile_ \..        
2e460 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61          [file ta
2e470 69 6c 20 24 6e 6f 6e 57 61 6c 44 62 46 69 6c 65  il $nonWalDbFile
2e480 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ]]]} then {..   
2e490 20 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b             check
2e4a0 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68  ForFile $test_ch
2e4b0 61 6e 6e 65 6c 20 24 6e 6f 6e 57 61 6c 44 62 46  annel $nonWalDbF
2e4c0 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ile..           
2e4d0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
2e4e0 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73    if {![haveCons
2e4f0 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
2e500 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20  gs file_ \..    
2e510 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c              [fil
2e520 65 20 74 61 69 6c 20 24 77 61 6c 44 62 46 69 6c  e tail $walDbFil
2e530 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  e]]]} then {..  
2e540 20 20 20 20 20 20 20 20 20 20 20 20 63 68 65 63              chec
2e550 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63  kForFile $test_c
2e560 68 61 6e 6e 65 6c 20 24 77 61 6c 44 62 46 69 6c  hannel $walDbFil
2e570 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e..            }
2e580 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
2e590 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72  if {![haveConstr
2e5a0 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
2e5b0 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20   file_ \..      
2e5c0 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20            [file 
2e5d0 74 61 69 6c 20 24 74 65 73 74 49 6e 73 74 61 6c  tail $testInstal
2e5e0 6c 56 73 32 30 30 35 4c 6f 67 46 69 6c 65 5d 5d  lVs2005LogFile]]
2e5f0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
2e600 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f           checkFo
2e610 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e  rFile $test_chan
2e620 6e 65 6c 20 24 74 65 73 74 49 6e 73 74 61 6c 6c  nel $testInstall
2e630 56 73 32 30 30 35 4c 6f 67 46 69 6c 65 0d 0a 20  Vs2005LogFile.. 
2e640 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
2e650 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
2e660 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74  ![haveConstraint
2e670 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c   [appendArgs fil
2e680 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  e_ \..          
2e690 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c        [file tail
2e6a0 20 24 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32   $testInstallVs2
2e6b0 30 30 38 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74  008LogFile]]]} t
2e6c0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
2e6d0 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c       checkForFil
2e6e0 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  e $test_channel 
2e6f0 24 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30  $testInstallVs20
2e700 30 38 4c 6f 67 46 69 6c 65 0d 0a 20 20 20 20 20  08LogFile..     
2e710 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
2e720 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61          if {![ha
2e730 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70  veConstraint [ap
2e740 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c  pendArgs file_ \
2e750 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2e760 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 74 65    [file tail $te
2e770 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 31 30 4c  stInstallVs2010L
2e780 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20  ogFile]]]} then 
2e790 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
2e7a0 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74   checkForFile $t
2e7b0 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73  est_channel $tes
2e7c0 74 49 6e 73 74 61 6c 6c 56 73 32 30 31 30 4c 6f  tInstallVs2010Lo
2e7d0 67 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 20  gFile..         
2e7e0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
2e7f0 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f      if {![haveCo
2e800 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64  nstraint [append
2e810 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20  Args file_ \..  
2e820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 66                [f
2e830 69 6c 65 20 74 61 69 6c 20 24 74 65 73 74 49 6e  ile tail $testIn
2e840 73 74 61 6c 6c 56 73 32 30 31 32 4c 6f 67 46 69  stallVs2012LogFi
2e850 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  le]]]} then {.. 
2e860 20 20 20 20 20 20 20 20 20 20 20 20 20 63 68 65               che
2e870 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f  ckForFile $test_
2e880 63 68 61 6e 6e 65 6c 20 24 74 65 73 74 49 6e 73  channel $testIns
2e890 74 61 6c 6c 56 73 32 30 31 32 4c 6f 67 46 69 6c  tallVs2012LogFil
2e8a0 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e..            }
2e8b0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
2e8c0 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72  if {![haveConstr
2e8d0 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
2e8e0 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20   file_ \..      
2e8f0 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20            [file 
2e900 74 61 69 6c 20 24 74 65 73 74 49 6e 73 74 61 6c  tail $testInstal
2e910 6c 56 73 32 30 31 33 4c 6f 67 46 69 6c 65 5d 5d  lVs2013LogFile]]
2e920 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
2e930 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f           checkFo
2e940 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e  rFile $test_chan
2e950 6e 65 6c 20 24 74 65 73 74 49 6e 73 74 61 6c 6c  nel $testInstall
2e960 56 73 32 30 31 33 4c 6f 67 46 69 6c 65 0d 0a 20  Vs2013LogFile.. 
2e970 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
2e980 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
2e990 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74  ![haveConstraint
2e9a0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c   [appendArgs fil
2e9b0 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  e_ \..          
2e9c0 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c        [file tail
2e9d0 20 24 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32   $testInstallVs2
2e9e0 30 31 35 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74  015LogFile]]]} t
2e9f0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
2ea00 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c       checkForFil
2ea10 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  e $test_channel 
2ea20 24 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30  $testInstallVs20
2ea30 31 35 4c 6f 67 46 69 6c 65 0d 0a 20 20 20 20 20  15LogFile..     
2ea40 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
2ea50 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61          if {![ha
2ea60 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70  veConstraint [ap
2ea70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c  pendArgs file_ \
2ea80 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2ea90 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 74 65    [file tail $te
2eaa0 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 31 37 4c  stInstallVs2017L
2eab0 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20  ogFile]]]} then 
2eac0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
2ead0 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74   checkForFile $t
2eae0 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73  est_channel $tes
2eaf0 74 49 6e 73 74 61 6c 6c 56 73 32 30 31 37 4c 6f  tInstallVs2017Lo
2eb00 67 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 20  gFile..         
2eb10 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
2eb20 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f      if {![haveCo
2eb30 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64  nstraint [append
2eb40 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20  Args file_ \..  
2eb50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 66                [f
2eb60 69 6c 65 20 74 61 69 6c 20 24 74 65 73 74 55 6e  ile tail $testUn
2eb70 69 6e 73 74 61 6c 6c 56 73 32 30 30 35 4c 6f 67  installVs2005Log
2eb80 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d  File]]]} then {.
2eb90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  .              c
2eba0 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73  heckForFile $tes
2ebb0 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73 74 55  t_channel $testU
2ebc0 6e 69 6e 73 74 61 6c 6c 56 73 32 30 30 35 4c 6f  ninstallVs2005Lo
2ebd0 67 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 20  gFile..         
2ebe0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
2ebf0 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f      if {![haveCo
2ec00 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64  nstraint [append
2ec10 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20  Args file_ \..  
2ec20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 66                [f
2ec30 69 6c 65 20 74 61 69 6c 20 24 74 65 73 74 55 6e  ile tail $testUn
2ec40 69 6e 73 74 61 6c 6c 56 73 32 30 30 38 4c 6f 67  installVs2008Log
2ec50 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d  File]]]} then {.
2ec60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  .              c
2ec70 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73  heckForFile $tes
2ec80 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73 74 55  t_channel $testU
2ec90 6e 69 6e 73 74 61 6c 6c 56 73 32 30 30 38 4c 6f  ninstallVs2008Lo
2eca0 67 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 20  gFile..         
2ecb0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
2ecc0 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f      if {![haveCo
2ecd0 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64  nstraint [append
2ece0 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20  Args file_ \..  
2ecf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 66                [f
2ed00 69 6c 65 20 74 61 69 6c 20 24 74 65 73 74 55 6e  ile tail $testUn
2ed10 69 6e 73 74 61 6c 6c 56 73 32 30 31 30 4c 6f 67  installVs2010Log
2ed20 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d  File]]]} then {.
2ed30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  .              c
2ed40 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73  heckForFile $tes
2ed50 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73 74 55  t_channel $testU
2ed60 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31 30 4c 6f  ninstallVs2010Lo
2ed70 67 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 20  gFile..         
2ed80 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
2ed90 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f      if {![haveCo
2eda0 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64  nstraint [append
2edb0 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20  Args file_ \..  
2edc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 66                [f
2edd0 69 6c 65 20 74 61 69 6c 20 24 74 65 73 74 55 6e  ile tail $testUn
2ede0 69 6e 73 74 61 6c 6c 56 73 32 30 31 32 4c 6f 67  installVs2012Log
2edf0 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d  File]]]} then {.
2ee00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  .              c
2ee10 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73  heckForFile $tes
2ee20 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73 74 55  t_channel $testU
2ee30 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31 32 4c 6f  ninstallVs2012Lo
2ee40 67 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 20  gFile..         
2ee50 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
2ee60 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f      if {![haveCo
2ee70 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64  nstraint [append
2ee80 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20  Args file_ \..  
2ee90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 66                [f
2eea0 69 6c 65 20 74 61 69 6c 20 24 74 65 73 74 55 6e  ile tail $testUn
2eeb0 69 6e 73 74 61 6c 6c 56 73 32 30 31 33 4c 6f 67  installVs2013Log
2eec0 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d  File]]]} then {.
2eed0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  .              c
2eee0 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73  heckForFile $tes
2eef0 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73 74 55  t_channel $testU
2ef00 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31 33 4c 6f  ninstallVs2013Lo
2ef10 67 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 20  gFile..         
2ef20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
2ef30 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f      if {![haveCo
2ef40 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64  nstraint [append
2ef50 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20  Args file_ \..  
2ef60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 66                [f
2ef70 69 6c 65 20 74 61 69 6c 20 24 74 65 73 74 55 6e  ile tail $testUn
2ef80 69 6e 73 74 61 6c 6c 56 73 32 30 31 35 4c 6f 67  installVs2015Log
2ef90 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d  File]]]} then {.
2efa0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  .              c
2efb0 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73  heckForFile $tes
2efc0 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73 74 55  t_channel $testU
2efd0 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31 35 4c 6f  ninstallVs2015Lo
2efe0 67 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 20  gFile..         
2eff0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
2f000 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f      if {![haveCo
2f010 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64  nstraint [append
2f020 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20  Args file_ \..  
2f030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 66                [f
2f040 69 6c 65 20 74 61 69 6c 20 24 74 65 73 74 55 6e  ile tail $testUn
2f050 69 6e 73 74 61 6c 6c 56 73 32 30 31 37 4c 6f 67  installVs2017Log
2f060 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d  File]]]} then {.
2f070 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  .              c
2f080 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73  heckForFile $tes
2f090 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73 74 55  t_channel $testU
2f0a0 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31 37 4c 6f  ninstallVs2017Lo
2f0b0 67 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 20  gFile..         
2f0c0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
2f0d0 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  }..        }..  
2f0e0 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
2f0f0 0a 20 20 20 20 70 72 6f 63 20 72 75 6e 53 51 4c  .    proc runSQL
2f100 69 74 65 54 65 73 74 46 69 6c 65 73 45 70 69 6c  iteTestFilesEpil
2f110 6f 67 75 65 20 7b 7d 20 7b 0d 0a 20 20 20 20 20  ogue {} {..     
2f120 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
2f130 3a 20 53 6b 69 70 20 72 75 6e 6e 69 6e 67 20 6f  : Skip running o
2f140 75 72 20 63 75 73 74 6f 6d 20 66 69 6c 65 73 20  ur custom files 
2f150 65 70 69 6c 6f 67 75 65 20 69 66 20 74 68 65 20  epilogue if the 
2f160 6d 61 69 6e 20 6f 6e 65 20 68 61 73 20 62 65 65  main one has bee
2f170 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  n..      #      
2f180 20 73 6b 69 70 70 65 64 2e 0d 0a 20 20 20 20 20   skipped...     
2f190 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b   #..      if {![
2f1a0 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
2f1b0 28 65 70 69 6c 6f 67 75 65 2e 65 61 67 6c 65 29  (epilogue.eagle)
2f1c0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
2f1d0 20 20 20 75 70 6c 65 76 65 6c 20 31 20 7b 0d 0a     uplevel 1 {..
2f1e0 20 20 20 20 20 20 20 20 20 20 75 6e 73 65 74 20            unset 
2f1f0 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 5c 0d 0a 20  -nocomplain \.. 
2f200 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73               tes
2f210 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31 37  tUninstallVs2017
2f220 4c 6f 67 46 69 6c 65 20 74 65 73 74 55 6e 69 6e  LogFile testUnin
2f230 73 74 61 6c 6c 56 73 32 30 31 35 4c 6f 67 46 69  stallVs2015LogFi
2f240 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  le \..          
2f250 20 20 20 20 74 65 73 74 55 6e 69 6e 73 74 61 6c      testUninstal
2f260 6c 56 73 32 30 31 33 4c 6f 67 46 69 6c 65 20 74  lVs2013LogFile t
2f270 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30  estUninstallVs20
2f280 31 32 4c 6f 67 46 69 6c 65 20 5c 0d 0a 20 20 20  12LogFile \..   
2f290 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 55             testU
2f2a0 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31 30 4c 6f  ninstallVs2010Lo
2f2b0 67 46 69 6c 65 20 74 65 73 74 55 6e 69 6e 73 74  gFile testUninst
2f2c0 61 6c 6c 56 73 32 30 30 38 4c 6f 67 46 69 6c 65  allVs2008LogFile
2f2d0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
2f2e0 20 20 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56    testUninstallV
2f2f0 73 32 30 30 35 4c 6f 67 46 69 6c 65 20 74 65 73  s2005LogFile tes
2f300 74 49 6e 73 74 61 6c 6c 56 73 32 30 31 37 4c 6f  tInstallVs2017Lo
2f310 67 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20  gFile \..       
2f320 20 20 20 20 20 20 20 74 65 73 74 49 6e 73 74 61         testInsta
2f330 6c 6c 56 73 32 30 31 35 4c 6f 67 46 69 6c 65 20  llVs2015LogFile 
2f340 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 31  testInstallVs201
2f350 33 4c 6f 67 46 69 6c 65 20 5c 0d 0a 20 20 20 20  3LogFile \..    
2f360 20 20 20 20 20 20 20 20 20 20 74 65 73 74 49 6e            testIn
2f370 73 74 61 6c 6c 56 73 32 30 31 32 4c 6f 67 46 69  stallVs2012LogFi
2f380 6c 65 20 74 65 73 74 49 6e 73 74 61 6c 6c 56 73  le testInstallVs
2f390 32 30 31 30 4c 6f 67 46 69 6c 65 20 5c 0d 0a 20  2010LogFile \.. 
2f3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73               tes
2f3b0 74 49 6e 73 74 61 6c 6c 56 73 32 30 30 38 4c 6f  tInstallVs2008Lo
2f3c0 67 46 69 6c 65 20 74 65 73 74 49 6e 73 74 61 6c  gFile testInstal
2f3d0 6c 56 73 32 30 30 35 4c 6f 67 46 69 6c 65 0d 0a  lVs2005LogFile..
2f3e0 0d 0a 20 20 20 20 20 20 20 20 20 20 75 6e 73 65  ..          unse
2f3f0 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 5c 0d  t -nocomplain \.
2f400 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e  .              n
2f410 6f 72 74 68 77 69 6e 64 45 66 44 62 46 69 6c 65  orthwindEfDbFile
2f420 20 74 65 73 74 4c 69 6e 71 4f 75 74 46 69 6c 65   testLinqOutFile
2f430 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
2f440 20 20 77 61 6c 44 62 46 69 6c 65 20 6e 6f 6e 57    walDbFile nonW
2f450 61 6c 44 62 46 69 6c 65 0d 0a 0d 0a 20 20 20 20  alDbFile....    
2f460 20 20 20 20 20 20 75 6e 73 65 74 20 2d 6e 6f 63        unset -noc
2f470 6f 6d 70 6c 61 69 6e 20 5c 0d 0a 20 20 20 20 20  omplain \..     
2f480 20 20 20 20 20 20 20 20 20 74 65 73 74 45 66 36           testEf6
2f490 45 78 65 46 69 6c 65 20 74 65 73 74 4c 69 6e 71  ExeFile testLinq
2f4a0 45 78 65 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20  ExeFile \..     
2f4b0 20 20 20 20 20 20 20 20 20 74 65 73 74 45 78 65           testExe
2f4c0 46 69 6c 65 20 73 79 73 74 65 6d 44 61 74 61 53  File systemDataS
2f4d0 51 4c 69 74 65 45 66 36 44 6c 6c 46 69 6c 65 20  QLiteEf6DllFile 
2f4e0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
2f4f0 20 73 79 73 74 65 6d 44 61 74 61 53 51 4c 69 74   systemDataSQLit
2f500 65 4c 69 6e 71 44 6c 6c 46 69 6c 65 20 73 79 73  eLinqDllFile sys
2f510 74 65 6d 44 61 74 61 53 51 4c 69 74 65 44 6c 6c  temDataSQLiteDll
2f520 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  File \..        
2f530 20 20 20 20 20 20 73 71 6c 69 74 65 44 65 73 69        sqliteDesi
2f540 67 6e 65 72 44 6c 6c 46 69 6c 65 20 69 6e 73 74  gnerDllFile inst
2f550 61 6c 6c 65 72 45 78 65 46 69 6c 65 20 5c 0d 0a  allerExeFile \..
2f560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 6e                en
2f570 74 69 74 79 46 72 61 6d 65 77 6f 72 6b 44 6c 6c  tityFrameworkDll
2f580 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d  File..        }.
2f590 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
2f5a0 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 72 75 6e  ....    proc run
2f5b0 53 51 4c 69 74 65 54 65 73 74 45 70 69 6c 6f 67  SQLiteTestEpilog
2f5c0 75 65 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23  ue {} {..      #
2f5d0 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
2f5e0 53 6b 69 70 20 72 75 6e 6e 69 6e 67 20 6f 75 72  Skip running our
2f5f0 20 63 75 73 74 6f 6d 20 65 70 69 6c 6f 67 75 65   custom epilogue
2f600 20 69 66 20 74 68 65 20 6d 61 69 6e 20 6f 6e 65   if the main one
2f610 20 68 61 73 20 62 65 65 6e 0d 0a 20 20 20 20 20   has been..     
2f620 20 23 20 20 20 20 20 20 20 73 6b 69 70 70 65 64   #       skipped
2f630 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
2f640 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
2f650 73 74 73 20 3a 3a 6e 6f 28 65 70 69 6c 6f 67 75  sts ::no(epilogu
2f660 65 2e 65 61 67 6c 65 29 5d 7d 20 74 68 65 6e 20  e.eagle)]} then 
2f670 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
2f680 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 68        # NOTE: Sh
2f690 6f 77 20 77 68 65 6e 20 6f 75 72 20 74 65 73 74  ow when our test
2f6a0 73 20 61 63 74 75 61 6c 6c 79 20 65 6e 64 65 64  s actually ended
2f6b0 20 28 6e 6f 77 29 2e 0d 0a 20 20 20 20 20 20 20   (now)...       
2f6c0 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   #..        tput
2f6d0 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
2f6e0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
2f6f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d  .            "--
2f700 2d 2d 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  -- System.Data.S
2f710 51 4c 69 74 65 20 74 65 73 74 73 20 65 6e 64 65  QLite tests ende
2f720 64 20 61 74 20 22 20 5c 0d 0a 20 20 20 20 20 20  d at " \..      
2f730 20 20 20 20 20 20 5b 63 6c 6f 63 6b 20 66 6f 72        [clock for
2f740 6d 61 74 20 5b 63 6c 6f 63 6b 20 73 65 63 6f 6e  mat [clock secon
2f750 64 73 5d 5d 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20  ds]] \n]....    
2f760 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
2f770 20 4e 4f 54 45 3a 20 4c 6f 61 64 20 74 68 65 20   NOTE: Load the 
2f780 22 65 70 69 6c 6f 67 75 65 22 20 63 75 73 74 6f  "epilogue" custo
2f790 6d 20 70 65 72 2d 75 73 65 72 20 61 6e 64 2f 6f  m per-user and/o
2f7a0 72 20 70 65 72 2d 68 6f 73 74 20 74 65 73 74 0d  r per-host test.
2f7b0 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
2f7c0 20 73 65 74 74 69 6e 67 73 20 6e 6f 77 2e 0d 0a   settings now...
2f7d0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
2f7e0 20 20 20 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69     uplevel 1 [li
2f7f0 73 74 20 6c 6f 61 64 53 51 4c 69 74 65 54 65 73  st loadSQLiteTes
2f800 74 53 65 74 74 69 6e 67 73 20 24 3a 3a 74 65 73  tSettings $::tes
2f810 74 5f 63 68 61 6e 6e 65 6c 20 2e 65 70 69 6c 6f  t_channel .epilo
2f820 67 75 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  gue]....        
2f830 23 0d 0a 20 20 20 20 20 20 20 20 23 20 42 55 47  #..        # BUG
2f840 46 49 58 3a 20 42 65 66 6f 72 65 20 63 68 65 63  FIX: Before chec
2f850 6b 69 6e 67 20 74 68 65 20 66 69 6e 61 6c 20 72  king the final r
2f860 65 73 6f 75 72 63 65 73 20 69 6e 20 75 73 65 20  esources in use 
2f870 62 79 20 53 51 4c 69 74 65 2c 20 6d 61 6b 65 0d  by SQLite, make.
2f880 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
2f890 20 20 20 73 75 72 65 20 62 6f 74 68 20 6f 66 20     sure both of 
2f8a0 74 68 65 20 50 52 41 47 4d 41 20 72 65 6c 61 74  the PRAGMA relat
2f8b0 65 64 20 64 69 72 65 63 74 6f 72 79 20 6e 61 6d  ed directory nam
2f8c0 65 73 20 61 72 65 20 66 72 65 65 64 2e 0d 0a 20  es are freed... 
2f8d0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
2f8e0 20 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65    checkForSQLite
2f8f0 44 69 72 65 63 74 6f 72 69 65 73 20 24 3a 3a 74  Directories $::t
2f900 65 73 74 5f 63 68 61 6e 6e 65 6c 20 74 72 75 65  est_channel true
2f910 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
2f920 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41         # NOTE: A
2f930 6c 73 6f 20 72 65 70 6f 72 74 20 74 68 65 20 72  lso report the r
2f940 65 73 6f 75 72 63 65 20 75 73 61 67 65 20 61 66  esource usage af
2f950 74 65 72 20 72 75 6e 6e 69 6e 67 20 74 68 65 20  ter running the 
2f960 74 65 73 74 73 2e 0d 0a 20 20 20 20 20 20 20 20  tests...        
2f970 23 0d 0a 20 20 20 20 20 20 20 20 72 65 70 6f 72  #..        repor
2f980 74 53 51 4c 69 74 65 52 65 73 6f 75 72 63 65 73  tSQLiteResources
2f990 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
2f9a0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
2f9b0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52         # NOTE: R
2f9c0 65 70 6f 72 74 20 74 68 65 20 63 72 69 74 69 63  eport the critic
2f9d0 61 6c 20 68 61 6e 64 6c 65 20 63 6f 75 6e 74 73  al handle counts
2f9e0 20 61 66 74 65 72 20 72 75 6e 6e 69 6e 67 20 74   after running t
2f9f0 68 65 20 74 65 73 74 73 2e 0d 0a 20 20 20 20 20  he tests...     
2fa00 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 67 65     #..        ge
2fa10 74 53 51 4c 69 74 65 48 61 6e 64 6c 65 43 6f 75  tSQLiteHandleCou
2fa20 6e 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  nts $::test_chan
2fa30 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23  nel....        #
2fa40 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
2fa50 3a 20 49 66 20 6e 65 63 65 73 73 61 72 79 2c 20  : If necessary, 
2fa60 64 69 73 61 62 6c 65 20 73 68 61 72 65 64 2d 63  disable shared-c
2fa70 61 63 68 65 20 6d 6f 64 65 20 6e 6f 77 2e 0d 0a  ache mode now...
2fa80 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
2fa90 20 20 20 69 66 20 7b 5b 68 61 73 52 75 6e 74 69     if {[hasRunti
2faa0 6d 65 4f 70 74 69 6f 6e 20 73 68 61 72 65 64 43  meOption sharedC
2fab0 61 63 68 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  ache]} then {.. 
2fac0 20 20 20 20 20 20 20 20 20 65 6e 61 62 6c 65 53           enableS
2fad0 68 61 72 65 64 43 61 63 68 65 20 24 3a 3a 74 65  haredCache $::te
2fae0 73 74 5f 63 68 61 6e 6e 65 6c 20 66 61 6c 73 65  st_channel false
2faf0 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
2fb00 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
2fb10 20 20 20 20 23 23 23 23 23 23 23 23 23 23 23 23      ############
2fb20 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2fb30 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2fb40 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2fb50 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d  ###############.
2fb60 0a 20 20 20 20 23 23 23 23 23 23 23 23 23 23 23  .    ###########
2fb70 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2fb80 23 23 20 45 4e 44 20 45 61 67 6c 65 20 4f 4e 4c  ## END Eagle ONL
2fb90 59 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23  Y ##############
2fba0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2fbb0 0d 0a 20 20 20 20 23 23 23 23 23 23 23 23 23 23  ..    ##########
2fbc0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2fbd0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2fbe0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2fbf0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2fc00 23 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 23 0d 0a 20  #..  }....  #.. 
2fc10 20 23 20 4e 4f 54 45 3a 20 53 61 76 65 20 74 68   # NOTE: Save th
2fc20 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 69  e name of the di
2fc30 72 65 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69  rectory containi
2fc40 6e 67 20 74 68 69 73 20 66 69 6c 65 2e 0d 0a 20  ng this file... 
2fc50 20 23 0d 0a 20 20 69 66 20 7b 21 5b 69 6e 66 6f   #..  if {![info
2fc60 20 65 78 69 73 74 73 20 63 6f 6d 6d 6f 6e 5f 64   exists common_d
2fc70 69 72 65 63 74 6f 72 79 5d 7d 20 74 68 65 6e 20  irectory]} then 
2fc80 7b 0d 0a 20 20 20 20 73 65 74 20 63 6f 6d 6d 6f  {..    set commo
2fc90 6e 5f 64 69 72 65 63 74 6f 72 79 20 5b 66 69 6c  n_directory [fil
2fca0 65 20 64 69 72 6e 61 6d 65 20 5b 69 6e 66 6f 20  e dirname [info 
2fcb0 73 63 72 69 70 74 5d 5d 0d 0a 20 20 7d 0d 0a 0d  script]]..  }...
2fcc0 0a 20 20 23 0d 0a 20 20 23 20 4e 4f 54 45 3a 20  .  #..  # NOTE: 
2fcd0 50 72 6f 76 69 64 65 20 74 68 65 20 53 79 73 74  Provide the Syst
2fce0 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 74  em.Data.SQLite t
2fcf0 65 73 74 20 70 61 63 6b 61 67 65 20 74 6f 20 74  est package to t
2fd00 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0d  he interpreter..
2fd10 0a 20 20 23 0d 0a 20 20 70 61 63 6b 61 67 65 20  .  #..  package 
2fd20 70 72 6f 76 69 64 65 20 53 79 73 74 65 6d 2e 44  provide System.D
2fd30 61 74 61 2e 53 51 4c 69 74 65 2e 54 65 73 74 20  ata.SQLite.Test 
2fd40 31 2e 30 0d 0a 7d 0d 0a                          1.0..}..