System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact 7981f9a75dd3323078b46b8ee0181d2791eca61d:


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 68 61 76 65 53 51  .    proc haveSQ
0590: 4c 69 74 65 44 65 66 69 6e 65 43 6f 6e 73 74 61  LiteDefineConsta
05a0: 6e 74 20 7b 20 6e 61 6d 65 20 7d 20 7b 0d 0a 20  nt { name } {.. 
05b0: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 68 61 76       return [hav
05c0: 65 43 6f 6e 73 74 72 61 69 6e 74 20 5c 0d 0a 20  eConstraint \.. 
05d0: 20 20 20 20 20 20 20 20 20 5b 61 70 70 65 6e 64           [append
05e0: 41 72 67 73 20 5b 67 65 74 53 51 4c 69 74 65 44  Args [getSQLiteD
05f0: 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 50 72 65  efineConstantPre
0600: 66 69 78 5d 20 24 6e 61 6d 65 5d 5d 0d 0a 20 20  fix] $name]]..  
0610: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
0620: 20 67 65 74 42 75 69 6c 64 59 65 61 72 20 7b 7d   getBuildYear {}
0630: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
0640: 20 20 20 23 20 4e 4f 54 45 3a 20 53 65 65 20 69     # NOTE: See i
0650: 66 20 74 68 65 20 22 79 65 61 72 22 20 73 65 74  f the "year" set
0660: 74 69 6e 67 20 68 61 73 20 62 65 65 6e 20 6f 76  ting has been ov
0670: 65 72 72 69 64 64 65 6e 20 62 79 20 74 68 65 20  erridden by the 
0680: 75 73 65 72 20 28 65 2e 67 2e 0d 0a 20 20 20 20  user (e.g...    
0690: 20 20 23 20 20 20 20 20 20 20 6f 6e 20 74 68 65    #       on the
06a0: 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 29 2e 20   command line). 
06b0: 20 54 68 69 73 20 68 65 6c 70 73 20 63 6f 6e 74   This helps cont
06c0: 72 6f 6c 20 65 78 61 63 74 6c 79 20 77 68 69 63  rol exactly whic
06d0: 68 20 73 65 74 20 6f 66 0d 0a 20 20 20 20 20 20  h set of..      
06e0: 23 20 20 20 20 20 20 20 62 69 6e 61 72 69 65 73  #       binaries
06f0: 20 77 65 20 61 72 65 20 74 65 73 74 69 6e 67 2c   we are testing,
0700: 20 74 68 6f 73 65 20 70 72 6f 64 75 63 65 64 20   those produced 
0710: 75 73 69 6e 67 20 74 68 65 20 56 69 73 75 61 6c  using the Visual
0720: 20 53 74 75 64 69 6f 0d 0a 20 20 20 20 20 20 23   Studio..      #
0730: 20 20 20 20 20 20 20 32 30 30 35 2c 20 32 30 30         2005, 200
0740: 38 2c 20 32 30 31 30 2c 20 32 30 31 32 2c 20 32  8, 2010, 2012, 2
0750: 30 31 33 2c 20 32 30 31 35 2c 20 6f 72 20 32 30  013, 2015, or 20
0760: 31 37 20 62 75 69 6c 64 20 73 79 73 74 65 6d 73  17 build systems
0770: 2e 20 20 54 6f 0d 0a 20 20 20 20 20 20 23 20 20  .  To..      #  
0780: 20 20 20 20 20 6f 76 65 72 72 69 64 65 20 74 68       override th
0790: 69 73 20 76 61 6c 75 65 20 76 69 61 20 74 68 65  is value via the
07a0: 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 2c 20 65   command line, e
07b0: 6e 74 65 72 20 61 20 63 6f 6d 6d 61 6e 64 20 73  nter a command s
07c0: 69 6d 69 6c 61 72 0d 0a 20 20 20 20 20 20 23 20  imilar..      # 
07d0: 20 20 20 20 20 20 74 6f 20 6f 6e 65 20 6f 66 20        to one of 
07e0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 28 61  the following (a
07f0: 6c 6c 20 6f 6e 20 6f 6e 65 20 6c 69 6e 65 29 3a  ll on one line):
0800: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
0810: 20 23 20 20 20 20 20 20 20 45 61 67 6c 65 53 68   #       EagleSh
0820: 65 6c 6c 2e 65 78 65 20 2d 61 6e 79 49 6e 69 74  ell.exe -anyInit
0830: 69 61 6c 69 7a 65 20 22 73 65 74 20 74 65 73 74  ialize "set test
0840: 5f 79 65 61 72 20 32 30 30 35 22 0d 0a 20 20 20  _year 2005"..   
0850: 20 20 20 23 20 20 20 20 20 20 20 20 20 2d 66 69     #         -fi
0860: 6c 65 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c  le .\path\to\all
0870: 2e 65 61 67 6c 65 0d 0a 20 20 20 20 20 20 23 0d  .eagle..      #.
0880: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 45  .      #       E
0890: 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65 20 2d 61  agleShell.exe -a
08a0: 6e 79 49 6e 69 74 69 61 6c 69 7a 65 20 22 73 65  nyInitialize "se
08b0: 74 20 74 65 73 74 5f 79 65 61 72 20 32 30 30 38  t test_year 2008
08c0: 22 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  "..      #      
08d0: 20 20 20 2d 66 69 6c 65 20 2e 5c 70 61 74 68 5c     -file .\path\
08e0: 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a 20 20  to\all.eagle..  
08f0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 20      #..      #  
0900: 20 20 20 20 20 45 61 67 6c 65 53 68 65 6c 6c 2e       EagleShell.
0910: 65 78 65 20 2d 61 6e 79 49 6e 69 74 69 61 6c 69  exe -anyInitiali
0920: 7a 65 20 22 73 65 74 20 74 65 73 74 5f 79 65 61  ze "set test_yea
0930: 72 20 32 30 31 30 22 0d 0a 20 20 20 20 20 20 23  r 2010"..      #
0940: 20 20 20 20 20 20 20 20 20 2d 66 69 6c 65 20 2e           -file .
0950: 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67  \path\to\all.eag
0960: 6c 65 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  le..      #..   
0970: 20 20 20 23 20 20 20 20 20 20 20 45 61 67 6c 65     #       Eagle
0980: 53 68 65 6c 6c 2e 65 78 65 20 2d 61 6e 79 49 6e  Shell.exe -anyIn
0990: 69 74 69 61 6c 69 7a 65 20 22 73 65 74 20 74 65  itialize "set te
09a0: 73 74 5f 79 65 61 72 20 32 30 31 32 22 0d 0a 20  st_year 2012".. 
09b0: 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20 2d       #         -
09c0: 66 69 6c 65 20 2e 5c 70 61 74 68 5c 74 6f 5c 61  file .\path\to\a
09d0: 6c 6c 2e 65 61 67 6c 65 0d 0a 20 20 20 20 20 20  ll.eagle..      
09e0: 23 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  #..      #      
09f0: 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65 20   EagleShell.exe 
0a00: 2d 61 6e 79 49 6e 69 74 69 61 6c 69 7a 65 20 22  -anyInitialize "
0a10: 73 65 74 20 74 65 73 74 5f 79 65 61 72 20 32 30  set test_year 20
0a20: 31 33 22 0d 0a 20 20 20 20 20 20 23 20 20 20 20  13"..      #    
0a30: 20 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70 61 74       -file .\pat
0a40: 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a  h\to\all.eagle..
0a50: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
0a60: 20 20 20 20 20 20 20 45 61 67 6c 65 53 68 65 6c         EagleShel
0a70: 6c 2e 65 78 65 20 2d 61 6e 79 49 6e 69 74 69 61  l.exe -anyInitia
0a80: 6c 69 7a 65 20 22 73 65 74 20 74 65 73 74 5f 79  lize "set test_y
0a90: 65 61 72 20 32 30 31 35 22 0d 0a 20 20 20 20 20  ear 2015"..     
0aa0: 20 23 20 20 20 20 20 20 20 20 20 2d 66 69 6c 65   #         -file
0ab0: 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65   .\path\to\all.e
0ac0: 61 67 6c 65 0d 0a 20 20 20 20 20 20 23 0d 0a 20  agle..      #.. 
0ad0: 20 20 20 20 20 23 20 20 20 20 20 20 20 45 61 67       #       Eag
0ae0: 6c 65 53 68 65 6c 6c 2e 65 78 65 20 2d 61 6e 79  leShell.exe -any
0af0: 49 6e 69 74 69 61 6c 69 7a 65 20 22 73 65 74 20  Initialize "set 
0b00: 74 65 73 74 5f 79 65 61 72 20 32 30 31 37 22 0d  test_year 2017".
0b10: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20  .      #        
0b20: 20 2d 66 69 6c 65 20 2e 5c 70 61 74 68 5c 74 6f   -file .\path\to
0b30: 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a 20 20 20 20  \all.eagle..    
0b40: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 20 20 20    #..      #    
0b50: 20 20 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78     EagleShell.ex
0b60: 65 20 2d 61 6e 79 49 6e 69 74 69 61 6c 69 7a 65  e -anyInitialize
0b70: 20 22 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c   "unset -nocompl
0b80: 61 69 6e 20 74 65 73 74 5f 79 65 61 72 22 0d 0a  ain test_year"..
0b90: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20        #         
0ba0: 2d 66 69 6c 65 20 2e 5c 70 61 74 68 5c 74 6f 5c  -file .\path\to\
0bb0: 61 6c 6c 2e 65 61 67 6c 65 0d 0a 20 20 20 20 20  all.eagle..     
0bc0: 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69   #..      if {[i
0bd0: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 73  nfo exists ::tes
0be0: 74 5f 79 65 61 72 5d 20 26 26 20 5b 73 74 72 69  t_year] && [stri
0bf0: 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73  ng length $::tes
0c00: 74 5f 79 65 61 72 5d 20 3e 20 30 7d 20 74 68 65  t_year] > 0} the
0c10: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
0c20: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
0c30: 55 73 65 20 74 68 65 20 73 70 65 63 69 66 69 65  Use the specifie
0c40: 64 20 74 65 73 74 20 79 65 61 72 2e 20 20 49 66  d test year.  If
0c50: 20 74 68 69 73 20 76 61 72 69 61 62 6c 65 20 69   this variable i
0c60: 73 20 6e 6f 74 20 73 65 74 2c 20 74 68 65 0d 0a  s not set, the..
0c70: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
0c80: 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 77 69  default value wi
0c90: 6c 6c 20 62 65 20 62 61 73 65 64 20 6f 6e 20 77  ll be based on w
0ca0: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 45 61  hether or not Ea
0cb0: 67 6c 65 20 68 61 73 20 62 65 65 6e 0d 0a 20 20  gle has been..  
0cc0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f        #       co
0cd0: 6d 70 69 6c 65 64 20 61 67 61 69 6e 73 74 20 74  mpiled against t
0ce0: 68 65 20 43 4c 52 20 76 32 2e 30 20 6f 72 20 43  he CLR v2.0 or C
0cf0: 4c 52 20 76 34 2e 30 2e 0d 0a 20 20 20 20 20 20  LR v4.0...      
0d00: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
0d10: 75 72 6e 20 24 3a 3a 74 65 73 74 5f 79 65 61 72  urn $::test_year
0d20: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
0d30: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
0d40: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20       # NOTE: If 
0d50: 45 61 67 6c 65 20 68 61 73 20 62 65 65 6e 20 63  Eagle has been c
0d60: 6f 6d 70 69 6c 65 64 20 61 67 61 69 6e 73 74 20  ompiled against 
0d70: 74 68 65 20 43 4c 52 20 76 34 2e 30 2c 20 75 73  the CLR v4.0, us
0d80: 65 20 22 32 30 31 30 22 20 62 79 0d 0a 20 20 20  e "2010" by..   
0d90: 20 20 20 20 20 23 20 20 20 20 20 20 20 64 65 66       #       def
0da0: 61 75 6c 74 20 28 77 65 20 63 6f 75 6c 64 20 75  ault (we could u
0db0: 73 65 20 22 32 30 31 32 22 2c 20 22 32 30 31 33  se "2012", "2013
0dc0: 22 2c 20 22 32 30 31 35 22 2c 20 6f 72 20 22 32  ", "2015", or "2
0dd0: 30 31 37 22 20 69 6e 20 74 68 61 74 0d 0a 20 20  017" in that..  
0de0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 61        #       ca
0df0: 73 65 20 61 73 20 77 65 6c 6c 29 20 61 73 20 74  se as well) as t
0e00: 68 65 20 74 65 73 74 20 79 65 61 72 3b 20 6f 74  he test year; ot
0e10: 68 65 72 77 69 73 65 2c 20 75 73 65 20 22 32 30  herwise, use "20
0e20: 30 38 22 20 62 79 20 64 65 66 61 75 6c 74 0d 0a  08" by default..
0e30: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
0e40: 28 77 65 20 63 6f 75 6c 64 20 75 73 65 20 22 32  (we could use "2
0e50: 30 30 35 22 20 69 6e 20 74 68 61 74 20 63 61 73  005" in that cas
0e60: 65 20 61 73 20 77 65 6c 6c 29 2e 20 20 49 66 20  e as well).  If 
0e70: 61 6e 6f 74 68 65 72 20 6d 61 6a 6f 72 0d 0a 20  another major.. 
0e80: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 5b         #       [
0e90: 69 6e 63 6f 6d 70 61 74 69 62 6c 65 5d 20 76 65  incompatible] ve
0ea0: 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 43 4c 52  rsion of the CLR
0eb0: 20 69 73 20 72 65 6c 65 61 73 65 64 2c 20 74 68   is released, th
0ec0: 69 73 20 63 68 65 63 6b 20 77 69 6c 6c 0d 0a 20  is check will.. 
0ed0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 68         #       h
0ee0: 61 76 65 20 74 6f 20 62 65 20 63 68 61 6e 67 65  ave to be change
0ef0: 64 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74 20  d.  The default 
0f00: 74 65 73 74 20 79 65 61 72 20 74 6f 20 75 73 65  test year to use
0f10: 20 66 6f 72 20 61 0d 0a 20 20 20 20 20 20 20 20   for a..        
0f20: 23 20 20 20 20 20 20 20 70 61 72 74 69 63 75 6c  #       particul
0f30: 61 72 20 43 4c 52 20 76 65 72 73 69 6f 6e 20 6d  ar CLR version m
0f40: 61 79 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e  ay be overridden
0f50: 20 62 79 20 73 65 74 74 69 6e 67 20 74 68 65 20   by setting the 
0f60: 67 6c 6f 62 61 6c 0d 0a 20 20 20 20 20 20 20 20  global..        
0f70: 23 20 20 20 20 20 20 20 76 61 72 69 61 62 6c 65  #       variable
0f80: 20 22 74 65 73 74 5f 79 65 61 72 5f 63 6c 72 5f   "test_year_clr_
0f90: 76 24 58 22 2c 20 77 68 65 72 65 20 22 24 58 22  v$X", where "$X"
0fa0: 20 6d 61 79 20 5b 63 75 72 72 65 6e 74 6c 79 5d   may [currently]
0fb0: 20 62 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20   be..        #  
0fc0: 20 20 20 20 20 65 69 74 68 65 72 20 22 32 22 20       either "2" 
0fd0: 6f 72 20 22 34 22 2e 0d 0a 20 20 20 20 20 20 20  or "4"...       
0fe0: 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   #..        if {
0ff0: 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20  [haveConstraint 
1000: 69 6d 61 67 65 52 75 6e 74 69 6d 65 34 30 5d 7d  imageRuntime40]}
1010: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1020: 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69     if {[info exi
1030: 73 74 73 20 3a 3a 74 65 73 74 5f 79 65 61 72 5f  sts ::test_year_
1040: 63 6c 72 5f 76 34 5d 20 26 26 20 5c 0d 0a 20 20  clr_v4] && \..  
1050: 20 20 20 20 20 20 20 20 20 20 20 20 5b 73 74 72              [str
1060: 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 74 65  ing length $::te
1070: 73 74 5f 79 65 61 72 5f 63 6c 72 5f 76 34 5d 20  st_year_clr_v4] 
1080: 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
1090: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
10a0: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
10b0: 55 73 65 20 74 68 65 20 73 70 65 63 69 66 69 65  Use the specifie
10c0: 64 20 74 65 73 74 20 79 65 61 72 20 66 6f 72 20  d test year for 
10d0: 74 68 65 20 43 4c 52 20 76 34 2e 30 2e 0d 0a 20  the CLR v4.0... 
10e0: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
10f0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1100: 20 24 3a 3a 74 65 73 74 5f 79 65 61 72 5f 63 6c   $::test_year_cl
1110: 72 5f 76 34 0d 0a 20 20 20 20 20 20 20 20 20 20  r_v4..          
1120: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
1130: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1140: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65       # NOTE: Use
1150: 20 74 68 65 20 64 65 66 61 75 6c 74 20 74 65 73   the default tes
1160: 74 20 79 65 61 72 20 66 6f 72 20 74 68 65 20 43  t year for the C
1170: 4c 52 20 76 34 2e 30 2e 0d 0a 20 20 20 20 20 20  LR v4.0...      
1180: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1190: 20 20 20 20 20 72 65 74 75 72 6e 20 32 30 31 30       return 2010
11a0: 3b 20 23 20 54 4f 44 4f 3a 20 47 6f 6f 64 20 22  ; # TODO: Good "
11b0: 66 61 6c 6c 62 61 63 6b 22 20 64 65 66 61 75 6c  fallback" defaul
11c0: 74 3f 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  t?..          }.
11d0: 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20  .        } else 
11e0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  {..          if 
11f0: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
1200: 74 65 73 74 5f 79 65 61 72 5f 63 6c 72 5f 76 32  test_year_clr_v2
1210: 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
1220: 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65        [string le
1230: 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f 79 65 61  ngth $::test_yea
1240: 72 5f 63 6c 72 5f 76 32 5d 20 3e 20 30 7d 20 74  r_clr_v2] > 0} t
1250: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1260: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
1270: 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68    # NOTE: Use th
1280: 65 20 73 70 65 63 69 66 69 65 64 20 74 65 73 74  e specified test
1290: 20 79 65 61 72 20 66 6f 72 20 74 68 65 20 43 4c   year for the CL
12a0: 52 20 76 32 2e 30 2e 0d 0a 20 20 20 20 20 20 20  R v2.0...       
12b0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
12c0: 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 74 65      return $::te
12d0: 73 74 5f 79 65 61 72 5f 63 6c 72 5f 76 32 0d 0a  st_year_clr_v2..
12e0: 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
12f0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1300: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  #..            #
1310: 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20 64   NOTE: Use the d
1320: 65 66 61 75 6c 74 20 74 65 73 74 20 79 65 61 72  efault test year
1330: 20 66 6f 72 20 74 68 65 20 43 4c 52 20 76 32 2e   for the CLR v2.
1340: 30 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  0...            
1350: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  #..            r
1360: 65 74 75 72 6e 20 32 30 30 38 3b 20 23 20 54 4f  eturn 2008; # TO
1370: 44 4f 3a 20 47 6f 6f 64 20 22 66 61 6c 6c 62 61  DO: Good "fallba
1380: 63 6b 22 20 64 65 66 61 75 6c 74 3f 0d 0a 20 20  ck" default?..  
1390: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
13a0: 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20     }..      }.. 
13b0: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 23 0d 0a     }.....    #..
13c0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73      # NOTE: This
13d0: 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 6f 6e   procedure is on
13e0: 6c 79 20 75 73 65 64 20 77 68 65 6e 20 61 64 64  ly used when add
13f0: 69 6e 67 20 73 68 69 6d 6d 65 64 20 74 65 73 74  ing shimmed test
1400: 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0d 0a 20   constraints... 
1410: 20 20 20 23 0d 0a 20 20 20 20 70 72 6f 63 20 67     #..    proc g
1420: 65 74 42 75 69 6c 64 43 6c 72 56 65 72 73 69 6f  etBuildClrVersio
1430: 6e 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66  n {} {..      if
1440: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
1450: 3a 74 65 73 74 5f 63 6c 72 5d 20 26 26 20 5b 73  :test_clr] && [s
1460: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a  tring length $::
1470: 74 65 73 74 5f 63 6c 72 5d 20 3e 20 30 7d 20 74  test_clr] > 0} t
1480: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
1490: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
14a0: 3a 20 55 73 65 20 74 68 65 20 73 70 65 63 69 66  : Use the specif
14b0: 69 65 64 20 74 65 73 74 20 76 65 72 73 69 6f 6e  ied test version
14c0: 20 66 6f 72 20 74 68 65 20 43 4c 52 2e 20 20 49   for the CLR.  I
14d0: 66 20 74 68 69 73 20 76 61 72 69 61 62 6c 65 0d  f this variable.
14e0: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
14f0: 20 69 73 20 6e 6f 74 20 73 65 74 2c 20 74 68 65   is not set, the
1500: 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 77   default value w
1510: 69 6c 6c 20 62 65 20 62 61 73 65 64 20 6f 6e 20  ill be based on 
1520: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0d 0a  whether or not..
1530: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
1540: 45 61 67 6c 65 20 68 61 73 20 62 65 65 6e 20 63  Eagle has been c
1550: 6f 6d 70 69 6c 65 64 20 61 67 61 69 6e 73 74 20  ompiled against 
1560: 74 68 65 20 43 4c 52 20 76 32 2e 30 20 6f 72 20  the CLR v2.0 or 
1570: 43 4c 52 20 76 34 2e 30 2e 0d 0a 20 20 20 20 20  CLR v4.0...     
1580: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65     #..        re
1590: 74 75 72 6e 20 24 3a 3a 74 65 73 74 5f 63 6c 72  turn $::test_clr
15a0: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
15b0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
15c0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65       # NOTE: Che
15d0: 63 6b 20 69 66 20 45 61 67 6c 65 20 68 61 73 20  ck if Eagle has 
15e0: 62 65 65 6e 20 63 6f 6d 70 69 6c 65 64 20 61 67  been compiled ag
15f0: 61 69 6e 73 74 20 74 68 65 20 43 4c 52 20 76 34  ainst the CLR v4
1600: 2e 30 2e 20 20 49 66 20 73 6f 2c 0d 0a 20 20 20  .0.  If so,..   
1610: 20 20 20 20 20 23 20 20 20 20 20 20 20 6a 75 73       #       jus
1620: 74 20 75 73 65 20 74 68 61 74 20 43 4c 52 20 76  t use that CLR v
1630: 65 72 73 69 6f 6e 2e 20 20 4f 74 68 65 72 77 69  ersion.  Otherwi
1640: 73 65 2c 20 75 73 65 20 74 68 65 20 76 65 72 73  se, use the vers
1650: 69 6f 6e 20 66 6f 72 20 74 68 65 0d 0a 20 20 20  ion for the..   
1660: 20 20 20 20 20 23 20 20 20 20 20 20 20 43 4c 52       #       CLR
1670: 20 76 32 2e 30 2e 20 20 49 66 20 61 6e 6f 74 68   v2.0.  If anoth
1680: 65 72 20 6d 61 6a 6f 72 20 5b 69 6e 63 6f 6d 70  er major [incomp
1690: 61 74 69 62 6c 65 5d 20 76 65 72 73 69 6f 6e 20  atible] version 
16a0: 6f 66 20 74 68 65 20 43 4c 52 0d 0a 20 20 20 20  of the CLR..    
16b0: 20 20 20 20 23 20 20 20 20 20 20 20 69 73 20 72      #       is r
16c0: 65 6c 65 61 73 65 64 2c 20 74 68 69 73 20 63 68  eleased, this ch
16d0: 65 63 6b 20 77 69 6c 6c 20 68 61 76 65 20 74 6f  eck will have to
16e0: 20 62 65 20 63 68 61 6e 67 65 64 2e 20 20 54 68   be changed.  Th
16f0: 65 20 64 65 66 61 75 6c 74 0d 0a 20 20 20 20 20  e default..     
1700: 20 20 20 23 20 20 20 20 20 20 20 76 65 72 73 69     #       versi
1710: 6f 6e 20 76 61 6c 75 65 20 66 6f 72 20 61 20 70  on value for a p
1720: 61 72 74 69 63 75 6c 61 72 20 43 4c 52 20 76 65  articular CLR ve
1730: 72 73 69 6f 6e 20 6d 61 79 20 62 65 20 6f 76 65  rsion may be ove
1740: 72 72 69 64 64 65 6e 0d 0a 20 20 20 20 20 20 20  rridden..       
1750: 20 23 20 20 20 20 20 20 20 62 79 20 73 65 74 74   #       by sett
1760: 69 6e 67 20 74 68 65 20 67 6c 6f 62 61 6c 20 76  ing the global v
1770: 61 72 69 61 62 6c 65 20 22 74 65 73 74 5f 63 6c  ariable "test_cl
1780: 72 5f 76 24 58 22 2c 20 77 68 65 72 65 20 22 24  r_v$X", where "$
1790: 58 22 20 6d 61 79 0d 0a 20 20 20 20 20 20 20 20  X" may..        
17a0: 23 20 20 20 20 20 20 20 5b 63 75 72 72 65 6e 74  #       [current
17b0: 6c 79 5d 20 62 65 20 65 69 74 68 65 72 20 22 32  ly] be either "2
17c0: 22 20 6f 72 20 22 34 22 2e 0d 0a 20 20 20 20 20  " or "4"...     
17d0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66     #..        if
17e0: 20 7b 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e   {[haveConstrain
17f0: 74 20 69 6d 61 67 65 52 75 6e 74 69 6d 65 34 30  t imageRuntime40
1800: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
1810: 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65       if {[info e
1820: 78 69 73 74 73 20 3a 3a 74 65 73 74 5f 63 6c 72  xists ::test_clr
1830: 5f 76 34 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  _v4] && \..     
1840: 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67           [string
1850: 20 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f   length $::test_
1860: 63 6c 72 5f 76 34 5d 20 3e 20 30 7d 20 74 68 65  clr_v4] > 0} the
1870: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
1880: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
1890: 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20  # NOTE: Use the 
18a0: 73 70 65 63 69 66 69 65 64 20 74 65 73 74 20 76  specified test v
18b0: 65 72 73 69 6f 6e 20 66 6f 72 20 74 68 65 20 43  ersion for the C
18c0: 4c 52 20 76 34 2e 30 2e 0d 0a 20 20 20 20 20 20  LR v4.0...      
18d0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
18e0: 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 74       return $::t
18f0: 65 73 74 5f 63 6c 72 5f 76 34 0d 0a 20 20 20 20  est_clr_v4..    
1900: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
1910: 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
1920: 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
1930: 45 3a 20 55 73 65 20 74 68 65 20 64 65 66 61 75  E: Use the defau
1940: 6c 74 20 74 65 73 74 20 76 65 72 73 69 6f 6e 20  lt test version 
1950: 66 6f 72 20 74 68 65 20 43 4c 52 20 76 34 2e 30  for the CLR v4.0
1960: 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  ...            #
1970: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ..            re
1980: 74 75 72 6e 20 34 2e 30 2e 33 30 33 31 39 3b 20  turn 4.0.30319; 
1990: 23 20 54 4f 44 4f 3a 20 47 6f 6f 64 20 22 66 61  # TODO: Good "fa
19a0: 6c 6c 62 61 63 6b 22 20 64 65 66 61 75 6c 74 3f  llback" default?
19b0: 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
19c0: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
19d0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b  .          if {[
19e0: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65  info exists ::te
19f0: 73 74 5f 63 6c 72 5f 76 32 5d 20 26 26 20 5c 0d  st_clr_v2] && \.
1a00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b  .              [
1a10: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a  string length $:
1a20: 3a 74 65 73 74 5f 63 6c 72 5f 76 32 5d 20 3e 20  :test_clr_v2] > 
1a30: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
1a40: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1a50: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73        # NOTE: Us
1a60: 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  e the specified 
1a70: 74 65 73 74 20 76 65 72 73 69 6f 6e 20 66 6f 72  test version for
1a80: 20 74 68 65 20 43 4c 52 20 76 32 2e 30 2e 0d 0a   the CLR v2.0...
1a90: 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
1aa0: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
1ab0: 6e 20 24 3a 3a 74 65 73 74 5f 63 6c 72 5f 76 32  n $::test_clr_v2
1ac0: 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c  ..          } el
1ad0: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
1ae0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
1af0: 20 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65   # NOTE: Use the
1b00: 20 64 65 66 61 75 6c 74 20 74 65 73 74 20 76 65   default test ve
1b10: 72 73 69 6f 6e 20 66 6f 72 20 74 68 65 20 43 4c  rsion for the CL
1b20: 52 20 76 32 2e 30 2e 0d 0a 20 20 20 20 20 20 20  R v2.0...       
1b30: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1b40: 20 20 20 20 72 65 74 75 72 6e 20 32 2e 30 2e 35      return 2.0.5
1b50: 30 37 32 37 3b 20 23 20 54 4f 44 4f 3a 20 47 6f  0727; # TODO: Go
1b60: 6f 64 20 22 66 61 6c 6c 62 61 63 6b 22 20 64 65  od "fallback" de
1b70: 66 61 75 6c 74 3f 0d 0a 20 20 20 20 20 20 20 20  fault?..        
1b80: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
1b90: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
1ba0: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 42  ...    proc getB
1bb0: 75 69 6c 64 59 65 61 72 73 20 7b 7d 20 7b 0d 0a  uildYears {} {..
1bc0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
1bd0: 20 4e 4f 54 45 3a 20 53 65 65 20 69 66 20 74 68   NOTE: See if th
1be0: 65 20 6c 69 73 74 20 6f 66 20 74 65 73 74 20 79  e list of test y
1bf0: 65 61 72 73 20 68 61 73 20 62 65 65 6e 20 6f 76  ears has been ov
1c00: 65 72 72 69 64 64 65 6e 20 62 79 20 74 68 65 20  erridden by the 
1c10: 75 73 65 72 0d 0a 20 20 20 20 20 20 23 20 20 20  user..      #   
1c20: 20 20 20 20 28 65 2e 67 2e 20 6f 6e 20 74 68 65      (e.g. on the
1c30: 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 29 2e 0d   command line)..
1c40: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
1c50: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
1c60: 20 3a 3a 74 65 73 74 5f 79 65 61 72 73 5d 20 26   ::test_years] &
1c70: 26 20 5b 6c 6c 65 6e 67 74 68 20 24 3a 3a 74 65  & [llength $::te
1c80: 73 74 5f 79 65 61 72 73 5d 20 3e 20 30 7d 20 74  st_years] > 0} t
1c90: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
1ca0: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
1cb0: 3a 20 55 73 65 20 74 68 65 20 73 70 65 63 69 66  : Use the specif
1cc0: 69 65 64 20 6c 69 73 74 20 6f 66 20 74 65 73 74  ied list of test
1cd0: 20 79 65 61 72 73 2e 0d 0a 20 20 20 20 20 20 20   years...       
1ce0: 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   #..        retu
1cf0: 72 6e 20 24 3a 3a 74 65 73 74 5f 79 65 61 72 73  rn $::test_years
1d00: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
1d10: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1d20: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65       # NOTE: Use
1d30: 20 74 68 65 20 64 65 66 61 75 6c 74 20 6c 69 73   the default lis
1d40: 74 20 6f 66 20 74 65 73 74 20 79 65 61 72 73 20  t of test years 
1d50: 28 69 2e 65 2e 20 61 6c 6c 29 2e 0d 0a 20 20 20  (i.e. all)...   
1d60: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1d70: 72 65 74 75 72 6e 20 5b 6c 69 73 74 20 32 30 30  return [list 200
1d80: 35 20 32 30 30 38 20 32 30 31 30 20 32 30 31 32  5 2008 2010 2012
1d90: 20 32 30 31 33 20 32 30 31 35 20 32 30 31 37 5d   2013 2015 2017]
1da0: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
1db0: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65  .....    proc ge
1dc0: 74 42 75 69 6c 64 4e 65 74 46 78 20 7b 7d 20 7b  tBuildNetFx {} {
1dd0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
1de0: 20 23 20 4e 4f 54 45 3a 20 53 65 65 20 69 66 20   # NOTE: See if 
1df0: 74 68 65 20 74 65 73 74 20 2e 4e 45 54 20 46 72  the test .NET Fr
1e00: 61 6d 65 77 6f 72 6b 20 73 65 74 74 69 6e 67 20  amework setting 
1e10: 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72 69 64  has been overrid
1e20: 64 65 6e 20 62 79 0d 0a 20 20 20 20 20 20 23 20  den by..      # 
1e30: 20 20 20 20 20 20 74 68 65 20 75 73 65 72 20 28        the user (
1e40: 65 2e 67 2e 20 6f 6e 20 74 68 65 20 63 6f 6d 6d  e.g. on the comm
1e50: 61 6e 64 20 6c 69 6e 65 29 2e 0d 0a 20 20 20 20  and line)...    
1e60: 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
1e70: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65  info exists ::te
1e80: 73 74 5f 6e 65 74 5f 66 78 5d 20 26 26 20 5c 0d  st_net_fx] && \.
1e90: 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69  .          [stri
1ea0: 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73  ng length $::tes
1eb0: 74 5f 6e 65 74 5f 66 78 5d 20 3e 20 30 7d 20 74  t_net_fx] > 0} t
1ec0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
1ed0: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
1ee0: 3a 20 55 73 65 20 74 68 65 20 73 70 65 63 69 66  : Use the specif
1ef0: 69 65 64 20 74 65 73 74 20 2e 4e 45 54 20 46 72  ied test .NET Fr
1f00: 61 6d 65 77 6f 72 6b 2e 0d 0a 20 20 20 20 20 20  amework...      
1f10: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
1f20: 75 72 6e 20 24 3a 3a 74 65 73 74 5f 6e 65 74 5f  urn $::test_net_
1f30: 66 78 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  fx..      } else
1f40: 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   {..        set 
1f50: 79 65 61 72 20 5b 67 65 74 42 75 69 6c 64 59 65  year [getBuildYe
1f60: 61 72 5d 0d 0a 20 20 20 20 20 20 20 20 73 65 74  ar]..        set
1f70: 20 79 65 61 72 56 61 72 4e 61 6d 65 20 5b 61 70   yearVarName [ap
1f80: 70 65 6e 64 41 72 67 73 20 3a 3a 74 65 73 74 5f  pendArgs ::test_
1f90: 6e 65 74 5f 66 78 5f 20 24 79 65 61 72 5d 0d 0a  net_fx_ $year]..
1fa0: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69  ..        if {[i
1fb0: 6e 66 6f 20 65 78 69 73 74 73 20 24 79 65 61 72  nfo exists $year
1fc0: 56 61 72 4e 61 6d 65 5d 20 26 26 20 5c 0d 0a 20  VarName] && \.. 
1fd0: 20 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69             [stri
1fe0: 6e 67 20 6c 65 6e 67 74 68 20 5b 73 65 74 20 24  ng length [set $
1ff0: 79 65 61 72 56 61 72 4e 61 6d 65 5d 5d 20 3e 20  yearVarName]] > 
2000: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
2010: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
2020: 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68    # NOTE: Use th
2030: 65 20 73 70 65 63 69 66 69 65 64 20 74 65 73 74  e specified test
2040: 20 2e 4e 45 54 20 46 72 61 6d 65 77 6f 72 6b 2c   .NET Framework,
2050: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 62 75   based on the bu
2060: 69 6c 64 0d 0a 20 20 20 20 20 20 20 20 20 20 23  ild..          #
2070: 20 20 20 20 20 20 20 79 65 61 72 2e 0d 0a 20 20         year...  
2080: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
2090: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 73 65 74       return [set
20a0: 20 24 79 65 61 72 56 61 72 4e 61 6d 65 5d 0d 0a   $yearVarName]..
20b0: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
20c0: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
20d0: 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
20e0: 20 46 61 6c 6c 62 61 63 6b 20 74 6f 20 74 68 65   Fallback to the
20f0: 20 22 77 65 6c 6c 20 6b 6e 6f 77 6e 22 20 2e 4e   "well known" .N
2100: 45 54 20 46 72 61 6d 65 77 6f 72 6b 20 76 65 72  ET Framework ver
2110: 73 69 6f 6e 20 74 68 61 74 0d 0a 20 20 20 20 20  sion that..     
2120: 20 20 20 20 20 23 20 20 20 20 20 20 20 69 73 20       #       is 
2130: 6d 6f 73 74 20 63 6c 6f 73 65 6c 79 20 61 73 73  most closely ass
2140: 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20 70  ociated with a p
2150: 61 72 74 69 63 75 6c 61 72 20 76 65 72 73 69 6f  articular versio
2160: 6e 20 6f 66 0d 0a 20 20 20 20 20 20 20 20 20 20  n of..          
2170: 23 20 20 20 20 20 20 20 56 69 73 75 61 6c 20 53  #       Visual S
2180: 74 75 64 69 6f 2e 0d 0a 20 20 20 20 20 20 20 20  tudio...        
2190: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73    #..          s
21a0: 77 69 74 63 68 20 2d 65 78 61 63 74 20 2d 2d 20  witch -exact -- 
21b0: 24 79 65 61 72 20 7b 0d 0a 20 20 20 20 20 20 20  $year {..       
21c0: 20 20 20 20 20 32 30 30 35 20 7b 0d 0a 20 20 20       2005 {..   
21d0: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
21e0: 6e 20 6e 65 74 46 78 32 30 0d 0a 20 20 20 20 20  n netFx20..     
21f0: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
2200: 20 20 20 20 20 20 32 30 30 38 20 7b 0d 0a 20 20        2008 {..  
2210: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
2220: 72 6e 20 6e 65 74 46 78 33 35 0d 0a 20 20 20 20  rn netFx35..    
2230: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
2240: 20 20 20 20 20 20 20 32 30 31 30 20 7b 0d 0a 20         2010 {.. 
2250: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
2260: 75 72 6e 20 6e 65 74 46 78 34 30 0d 0a 20 20 20  urn netFx40..   
2270: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
2280: 20 20 20 20 20 20 20 20 32 30 31 32 20 7b 0d 0a          2012 {..
2290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
22a0: 74 75 72 6e 20 6e 65 74 46 78 34 35 0d 0a 20 20  turn netFx45..  
22b0: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
22c0: 20 20 20 20 20 20 20 20 20 32 30 31 33 20 7b 0d           2013 {.
22d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
22e0: 65 74 75 72 6e 20 6e 65 74 46 78 34 35 31 3b 20  eturn netFx451; 
22f0: 23 20 54 4f 44 4f 3a 20 4f 72 20 22 6e 65 74 46  # TODO: Or "netF
2300: 78 34 35 32 22 3f 0d 0a 20 20 20 20 20 20 20 20  x452"?..        
2310: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
2320: 20 20 20 32 30 31 35 20 7b 0d 0a 20 20 20 20 20     2015 {..     
2330: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
2340: 6e 65 74 46 78 34 36 3b 20 23 20 54 4f 44 4f 3a  netFx46; # TODO:
2350: 20 4f 72 20 22 6e 65 74 46 78 34 36 31 22 20 2f   Or "netFx461" /
2360: 20 22 6e 65 74 46 78 34 36 32 22 3f 0d 0a 20 20   "netFx462"?..  
2370: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
2380: 20 20 20 20 20 20 20 20 20 32 30 31 37 20 7b 0d           2017 {.
2390: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
23a0: 65 74 75 72 6e 20 6e 65 74 46 78 34 37 3b 20 23  eturn netFx47; #
23b0: 20 54 4f 44 4f 3a 20 4f 72 20 22 6e 65 74 46 78   TODO: Or "netFx
23c0: 34 37 31 22 3f 0d 0a 20 20 20 20 20 20 20 20 20  471"?..         
23d0: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
23e0: 20 20 64 65 66 61 75 6c 74 20 7b 0d 0a 20 20 20    default {..   
23f0: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
2400: 6e 20 6e 65 74 46 78 33 35 3b 20 23 20 54 4f 44  n netFx35; # TOD
2410: 4f 3a 20 47 6f 6f 64 20 22 66 61 6c 6c 62 61 63  O: Good "fallbac
2420: 6b 22 20 64 65 66 61 75 6c 74 3f 0d 0a 20 20 20  k" default?..   
2430: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
2440: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
2450: 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20   }..      }..   
2460: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 23 0d 0a 20 20   }.....    #..  
2470: 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 70    # NOTE: This p
2480: 72 6f 63 65 64 75 72 65 20 73 68 6f 75 6c 64 20  rocedure should 
2490: 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20  return non-zero 
24a0: 69 66 20 74 68 65 20 63 6f 6e 66 69 67 75 72 65  if the configure
24b0: 64 20 74 65 73 74 0d 0a 20 20 20 20 23 20 20 20  d test..    #   
24c0: 20 20 20 20 70 6c 61 74 66 6f 72 6d 20 69 73 20      platform is 
24d0: 6d 6f 73 74 20 6c 69 6b 65 6c 79 20 74 68 65 20  most likely the 
24e0: 64 65 66 61 75 6c 74 20 66 6f 72 20 74 68 69 73  default for this
24f0: 20 6d 61 63 68 69 6e 65 2e 0d 0a 20 20 20 20 23   machine...    #
2500: 0d 0a 20 20 20 20 70 72 6f 63 20 69 73 44 65 66  ..    proc isDef
2510: 61 75 6c 74 42 75 69 6c 64 50 6c 61 74 66 6f 72  aultBuildPlatfor
2520: 6d 20 7b 20 7b 76 65 72 62 6f 73 65 20 74 72 75  m { {verbose tru
2530: 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  e} } {..      #.
2540: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52  .      # NOTE: R
2550: 75 6e 6e 69 6e 67 20 6f 6e 20 57 6f 57 36 34 20  unning on WoW64 
2560: 69 73 20 6e 65 76 65 72 20 74 68 65 20 64 65 66  is never the def
2570: 61 75 6c 74 20 70 6c 61 74 66 6f 72 6d 2e 0d 0a  ault platform...
2580: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
2590: 66 20 7b 5b 69 73 52 75 6e 6e 69 6e 67 57 6f 57  f {[isRunningWoW
25a0: 36 34 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  64]} then {..   
25b0: 20 20 20 20 20 69 66 20 7b 24 76 65 72 62 6f 73       if {$verbos
25c0: 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  e} then {..     
25d0: 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
25e0: 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20  st_channel \..  
25f0: 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
2600: 2d 20 64 65 74 65 63 74 65 64 20 6e 6f 6e 2d 64  - detected non-d
2610: 65 66 61 75 6c 74 20 70 6c 61 74 66 6f 72 6d 20  efault platform 
2620: 28 57 6f 57 36 34 29 5c 6e 22 0d 0a 20 20 20 20  (WoW64)\n"..    
2630: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
2640: 20 72 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20   return false.. 
2650: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
2660: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
2670: 20 54 68 69 73 20 68 61 73 20 61 20 67 6f 6f 64   This has a good
2680: 20 63 68 61 6e 63 65 20 6f 66 20 62 65 69 6e 67   chance of being
2690: 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 6c 61   the default pla
26a0: 74 66 6f 72 6d 2e 0d 0a 20 20 20 20 20 20 23 0d  tform...      #.
26b0: 0a 20 20 20 20 20 20 69 66 20 7b 24 76 65 72 62  .      if {$verb
26c0: 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ose} then {..   
26d0: 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
26e0: 73 74 5f 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d  st_channel "----
26f0: 20 64 65 74 65 63 74 65 64 20 64 65 66 61 75 6c   detected defaul
2700: 74 20 70 6c 61 74 66 6f 72 6d 5c 6e 22 0d 0a 20  t platform\n".. 
2710: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
2720: 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20  return true..   
2730: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
2740: 67 65 74 42 75 69 6c 64 50 6c 61 74 66 6f 72 6d  getBuildPlatform
2750: 20 7b 20 6e 61 74 69 76 65 20 7d 20 7b 0d 0a 20   { native } {.. 
2760: 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65       if {[info e
2770: 78 69 73 74 73 20 3a 3a 74 65 73 74 5f 70 6c 61  xists ::test_pla
2780: 74 66 6f 72 6d 5d 20 26 26 20 5c 0d 0a 20 20 20  tform] && \..   
2790: 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c         [string l
27a0: 65 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f 70 6c  ength $::test_pl
27b0: 61 74 66 6f 72 6d 5d 20 3e 20 30 7d 20 74 68 65  atform] > 0} the
27c0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
27d0: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
27e0: 55 73 65 20 74 68 65 20 73 70 65 63 69 66 69 65  Use the specifie
27f0: 64 20 74 65 73 74 20 70 6c 61 74 66 6f 72 6d 2e  d test platform.
2800: 20 20 49 66 20 74 68 69 73 20 76 61 72 69 61 62    If this variab
2810: 6c 65 20 69 73 20 6e 6f 74 20 73 65 74 2c 0d 0a  le is not set,..
2820: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
2830: 74 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75  the default valu
2840: 65 20 77 69 6c 6c 20 62 65 20 62 61 73 65 64 20  e will be based 
2850: 6f 6e 20 74 68 65 20 6d 61 63 68 69 6e 65 20 61  on the machine a
2860: 72 63 68 69 74 65 63 74 75 72 65 2e 0d 0a 20 20  rchitecture...  
2870: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
2880: 20 72 65 74 75 72 6e 20 5b 65 78 70 72 20 7b 24   return [expr {$
2890: 6e 61 74 69 76 65 20 3f 20 24 3a 3a 74 65 73 74  native ? $::test
28a0: 5f 70 6c 61 74 66 6f 72 6d 20 3a 20 22 22 7d 5d  _platform : ""}]
28b0: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66  ..      } elseif
28c0: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
28d0: 3a 74 65 73 74 5f 6d 61 63 68 69 6e 65 5d 20 26  :test_machine] &
28e0: 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b  & \..          [
28f0: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a  string length $:
2900: 3a 74 65 73 74 5f 6d 61 63 68 69 6e 65 5d 20 3e  :test_machine] >
2910: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
2920: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
2930: 20 4e 4f 54 45 3a 20 46 6f 72 20 6e 61 74 69 76   NOTE: For nativ
2940: 65 20 62 75 69 6c 64 73 2c 20 72 65 74 75 72 6e  e builds, return
2950: 20 74 68 65 20 70 6c 61 74 66 6f 72 6d 20 6e 61   the platform na
2960: 6d 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  me corresponding
2970: 20 74 6f 0d 0a 20 20 20 20 20 20 20 20 23 20 20   to..        #  
2980: 20 20 20 20 20 74 68 65 20 74 65 73 74 20 6d 61       the test ma
2990: 63 68 69 6e 65 20 61 72 63 68 69 74 65 63 74 75  chine architectu
29a0: 72 65 3b 20 6f 74 68 65 72 77 69 73 65 2c 20 72  re; otherwise, r
29b0: 65 74 75 72 6e 20 61 6e 20 65 6d 70 74 79 0d 0a  eturn an empty..
29c0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
29d0: 73 74 72 69 6e 67 2e 0d 0a 20 20 20 20 20 20 20  string...       
29e0: 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   #..        retu
29f0: 72 6e 20 5b 65 78 70 72 20 7b 0d 0a 20 20 20 20  rn [expr {..    
2a00: 20 20 20 20 20 20 24 6e 61 74 69 76 65 20 3f 20        $native ? 
2a10: 5b 6d 61 63 68 69 6e 65 54 6f 50 6c 61 74 66 6f  [machineToPlatfo
2a20: 72 6d 20 24 3a 3a 74 65 73 74 5f 6d 61 63 68 69  rm $::test_machi
2a30: 6e 65 5d 20 3a 20 22 22 0d 0a 20 20 20 20 20 20  ne] : ""..      
2a40: 20 20 7d 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c    }]..      } el
2a50: 73 65 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73  seif {[info exis
2a60: 74 73 20 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72  ts ::tcl_platfor
2a70: 6d 28 6d 61 63 68 69 6e 65 29 5d 7d 20 74 68 65  m(machine)]} the
2a80: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
2a90: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
2aa0: 46 6f 72 20 6e 61 74 69 76 65 20 62 75 69 6c 64  For native build
2ab0: 73 2c 20 72 65 74 75 72 6e 20 74 68 65 20 70 6c  s, return the pl
2ac0: 61 74 66 6f 72 6d 20 6e 61 6d 65 20 63 6f 72 72  atform name corr
2ad0: 65 73 70 6f 6e 64 69 6e 67 20 74 6f 0d 0a 20 20  esponding to..  
2ae0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68        #       th
2af0: 65 20 6d 61 63 68 69 6e 65 20 61 72 63 68 69 74  e machine archit
2b00: 65 63 74 75 72 65 3b 20 6f 74 68 65 72 77 69 73  ecture; otherwis
2b10: 65 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 6d 70  e, return an emp
2b20: 74 79 20 73 74 72 69 6e 67 2e 0d 0a 20 20 20 20  ty string...    
2b30: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
2b40: 65 74 75 72 6e 20 5b 65 78 70 72 20 7b 0d 0a 20  eturn [expr {.. 
2b50: 20 20 20 20 20 20 20 20 20 24 6e 61 74 69 76 65           $native
2b60: 20 3f 20 5b 6d 61 63 68 69 6e 65 54 6f 50 6c 61   ? [machineToPla
2b70: 74 66 6f 72 6d 20 24 3a 3a 74 63 6c 5f 70 6c 61  tform $::tcl_pla
2b80: 74 66 6f 72 6d 28 6d 61 63 68 69 6e 65 29 5d 20  tform(machine)] 
2b90: 3a 20 22 22 0d 0a 20 20 20 20 20 20 20 20 7d 5d  : ""..        }]
2ba0: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
2bb0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
2bc0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e 6f 20       # NOTE: No 
2bd0: 6d 61 63 68 69 6e 65 20 61 72 63 68 69 74 65 63  machine architec
2be0: 74 75 72 65 20 69 73 20 61 76 61 69 6c 61 62 6c  ture is availabl
2bf0: 65 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 6d 70  e, return an emp
2c00: 74 79 20 73 74 72 69 6e 67 2e 0d 0a 20 20 20 20  ty string...    
2c10: 20 20 20 20 23 20 20 20 20 20 20 20 49 74 20 69      #       It i
2c20: 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 72  s important to r
2c30: 65 74 75 72 6e 20 61 6e 20 65 6d 70 74 79 20 73  eturn an empty s
2c40: 74 72 69 6e 67 20 68 65 72 65 20 62 65 63 61 75  tring here becau
2c50: 73 65 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20  se the..        
2c60: 23 20 20 20 20 20 20 20 72 65 73 75 6c 74 20 6f  #       result o
2c70: 66 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65  f this procedure
2c80: 20 6d 61 79 20 62 65 20 75 73 65 64 20 77 69 74   may be used wit
2c90: 68 20 5b 66 69 6c 65 20 6a 6f 69 6e 5d 2e 0d 0a  h [file join]...
2ca0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
2cb0: 20 20 20 72 65 74 75 72 6e 20 22 22 0d 0a 20 20     return ""..  
2cc0: 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
2cd0: 0a 20 20 20 20 70 72 6f 63 20 67 65 74 42 75 69  .    proc getBui
2ce0: 6c 64 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  ldConfiguration 
2cf0: 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20  {} {..      #.. 
2d00: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 65 65       # NOTE: See
2d10: 20 69 66 20 74 68 65 20 22 63 6f 6e 66 69 67 75   if the "configu
2d20: 72 61 74 69 6f 6e 22 20 73 65 74 74 69 6e 67 20  ration" setting 
2d30: 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72 69 64  has been overrid
2d40: 64 65 6e 20 62 79 20 74 68 65 0d 0a 20 20 20 20  den by the..    
2d50: 20 20 23 20 20 20 20 20 20 20 75 73 65 72 20 28    #       user (
2d60: 65 2e 67 2e 20 6f 6e 20 74 68 65 20 63 6f 6d 6d  e.g. on the comm
2d70: 61 6e 64 20 6c 69 6e 65 29 2e 20 20 54 68 69 73  and line).  This
2d80: 20 68 65 6c 70 73 20 63 6f 6e 74 72 6f 6c 20 65   helps control e
2d90: 78 61 63 74 6c 79 0d 0a 20 20 20 20 20 20 23 20  xactly..      # 
2da0: 20 20 20 20 20 20 77 68 69 63 68 20 73 65 74 20        which set 
2db0: 6f 66 20 62 69 6e 61 72 69 65 73 20 77 65 20 61  of binaries we a
2dc0: 72 65 20 74 65 73 74 69 6e 67 20 28 69 2e 65 2e  re testing (i.e.
2dd0: 20 74 68 6f 73 65 20 62 75 69 6c 74 20 69 6e 20   those built in 
2de0: 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  the..      #    
2df0: 20 20 20 22 44 65 62 75 67 22 20 6f 72 20 22 52     "Debug" or "R
2e00: 65 6c 65 61 73 65 22 20 62 75 69 6c 64 20 63 6f  elease" build co
2e10: 6e 66 69 67 75 72 61 74 69 6f 6e 73 29 2e 20 20  nfigurations).  
2e20: 54 6f 20 6f 76 65 72 72 69 64 65 20 74 68 69 73  To override this
2e30: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
2e40: 76 61 6c 75 65 20 76 69 61 20 74 68 65 20 63 6f  value via the co
2e50: 6d 6d 61 6e 64 20 6c 69 6e 65 2c 20 65 6e 74 65  mmand line, ente
2e60: 72 20 61 20 63 6f 6d 6d 61 6e 64 20 73 69 6d 69  r a command simi
2e70: 6c 61 72 20 74 6f 20 6f 6e 65 20 6f 66 0d 0a 20  lar to one of.. 
2e80: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
2e90: 20 66 6f 6c 6c 6f 77 69 6e 67 20 28 61 6c 6c 20   following (all 
2ea0: 6f 6e 20 6f 6e 65 20 6c 69 6e 65 29 3a 0d 0a 20  on one line):.. 
2eb0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
2ec0: 20 20 20 20 20 20 45 61 67 6c 65 53 68 65 6c 6c        EagleShell
2ed0: 2e 65 78 65 20 2d 61 6e 79 49 6e 69 74 69 61 6c  .exe -anyInitial
2ee0: 69 7a 65 20 22 73 65 74 20 74 65 73 74 5f 63 6f  ize "set test_co
2ef0: 6e 66 69 67 75 72 61 74 69 6f 6e 20 44 65 62 75  nfiguration Debu
2f00: 67 22 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  g"..      #     
2f10: 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70 61 74 68      -file .\path
2f20: 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a 20  \to\all.eagle.. 
2f30: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
2f40: 20 20 20 20 20 20 45 61 67 6c 65 53 68 65 6c 6c        EagleShell
2f50: 2e 65 78 65 20 2d 61 6e 79 49 6e 69 74 69 61 6c  .exe -anyInitial
2f60: 69 7a 65 20 22 73 65 74 20 74 65 73 74 5f 63 6f  ize "set test_co
2f70: 6e 66 69 67 75 72 61 74 69 6f 6e 20 52 65 6c 65  nfiguration Rele
2f80: 61 73 65 22 0d 0a 20 20 20 20 20 20 23 20 20 20  ase"..      #   
2f90: 20 20 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70 61        -file .\pa
2fa0: 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d  th\to\all.eagle.
2fb0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
2fc0: 23 20 20 20 20 20 20 20 45 61 67 6c 65 53 68 65  #       EagleShe
2fd0: 6c 6c 2e 65 78 65 20 2d 66 69 6c 65 20 2e 5c 70  ll.exe -file .\p
2fe0: 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65  ath\to\all.eagle
2ff0: 20 2d 70 72 65 54 65 73 74 0d 0a 20 20 20 20 20   -preTest..     
3000: 20 23 20 20 20 20 20 20 20 20 20 22 75 6e 73 65   #         "unse
3010: 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 74 65  t -nocomplain te
3020: 73 74 5f 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  st_configuration
3030: 22 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  "..      #..    
3040: 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73    if {[info exis
3050: 74 73 20 3a 3a 74 65 73 74 5f 63 6f 6e 66 69 67  ts ::test_config
3060: 75 72 61 74 69 6f 6e 5d 20 26 26 20 5c 0d 0a 20  uration] && \.. 
3070: 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67           [string
3080: 20 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f   length $::test_
3090: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 5d 20 3e  configuration] >
30a0: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
30b0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
30c0: 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20 73   NOTE: Use the s
30d0: 70 65 63 69 66 69 65 64 20 74 65 73 74 20 63 6f  pecified test co
30e0: 6e 66 69 67 75 72 61 74 69 6f 6e 2e 20 20 54 68  nfiguration.  Th
30f0: 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20  e default value 
3100: 75 73 65 64 0d 0a 20 20 20 20 20 20 20 20 23 20  used..        # 
3110: 20 20 20 20 20 20 66 6f 72 20 74 68 69 73 20 76        for this v
3120: 61 72 69 61 62 6c 65 20 69 73 20 74 79 70 69 63  ariable is typic
3130: 61 6c 6c 79 20 22 52 65 6c 65 61 73 65 22 2c 20  ally "Release", 
3140: 61 73 20 73 65 74 20 62 79 20 74 68 65 20 74 65  as set by the te
3150: 73 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  st..        #   
3160: 20 20 20 20 73 75 69 74 65 20 69 74 73 65 6c 66      suite itself
3170: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
3180: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a        return $::
3190: 74 65 73 74 5f 63 6f 6e 66 69 67 75 72 61 74 69  test_configurati
31a0: 6f 6e 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  on..      } else
31b0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
31c0: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e         # NOTE: N
31d0: 6f 72 6d 61 6c 6c 79 2c 20 77 65 20 77 69 6c 6c  ormally, we will
31e0: 20 6e 65 76 65 72 20 68 69 74 20 74 68 69 73 20   never hit this 
31f0: 63 61 73 65 20 62 65 63 61 75 73 65 20 74 68 65  case because the
3200: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 0d 0a 20   value of the.. 
3210: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74         #       t
3220: 65 73 74 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  est configuratio
3230: 6e 20 76 61 72 69 61 62 6c 65 20 69 73 20 61 6c  n variable is al
3240: 77 61 79 73 20 73 65 74 20 62 79 20 74 68 65 20  ways set by the 
3250: 74 65 73 74 20 73 75 69 74 65 0d 0a 20 20 20 20  test suite..    
3260: 20 20 20 20 23 20 20 20 20 20 20 20 69 74 73 65      #       itse
3270: 6c 66 3b 20 68 6f 77 65 76 65 72 2c 20 69 74 20  lf; however, it 
3280: 63 61 6e 20 62 65 20 6f 76 65 72 72 69 64 64 65  can be overridde
3290: 6e 20 75 73 69 6e 67 20 74 68 65 20 75 6e 73 65  n using the unse
32a0: 74 20 63 6f 6d 6d 61 6e 64 0d 0a 20 20 20 20 20  t command..     
32b0: 20 20 20 23 20 20 20 20 20 20 20 66 72 6f 6d 20     #       from 
32c0: 74 68 65 20 2d 70 72 65 54 65 73 74 20 6f 70 74  the -preTest opt
32d0: 69 6f 6e 20 74 6f 20 74 68 65 20 74 65 73 74 20  ion to the test 
32e0: 73 75 69 74 65 2e 0d 0a 20 20 20 20 20 20 20 20  suite...        
32f0: 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  #..        retur
3300: 6e 20 24 3a 3a 65 61 67 6c 65 5f 70 6c 61 74 66  n $::eagle_platf
3310: 6f 72 6d 28 63 6f 6e 66 69 67 75 72 61 74 69 6f  orm(configuratio
3320: 6e 29 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  n)..      }..   
3330: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
3340: 67 65 74 42 75 69 6c 64 43 6f 6e 66 69 67 75 72  getBuildConfigur
3350: 61 74 69 6f 6e 73 20 7b 7d 20 7b 0d 0a 20 20 20  ations {} {..   
3360: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
3370: 54 45 3a 20 53 65 65 20 69 66 20 74 68 65 20 6c  TE: See if the l
3380: 69 73 74 20 6f 66 20 74 65 73 74 20 63 6f 6e 66  ist of test conf
3390: 69 67 75 72 61 74 69 6f 6e 73 20 68 61 73 20 62  igurations has b
33a0: 65 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 20 62  een overridden b
33b0: 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  y..      #      
33c0: 20 74 68 65 20 75 73 65 72 20 28 65 2e 67 2e 20   the user (e.g. 
33d0: 6f 6e 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c  on the command l
33e0: 69 6e 65 29 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  ine)...      #..
33f0: 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20        if {[info 
3400: 65 78 69 73 74 73 20 3a 3a 74 65 73 74 5f 63 6f  exists ::test_co
3410: 6e 66 69 67 75 72 61 74 69 6f 6e 73 5d 20 26 26  nfigurations] &&
3420: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 6c   \..          [l
3430: 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f 63  length $::test_c
3440: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 5d 20 3e  onfigurations] >
3450: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
3460: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
3470: 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20 73   NOTE: Use the s
3480: 70 65 63 69 66 69 65 64 20 6c 69 73 74 20 6f 66  pecified list of
3490: 20 74 65 73 74 20 63 6f 6e 66 69 67 75 72 61 74   test configurat
34a0: 69 6f 6e 73 2e 0d 0a 20 20 20 20 20 20 20 20 23  ions...        #
34b0: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
34c0: 20 24 3a 3a 74 65 73 74 5f 63 6f 6e 66 69 67 75   $::test_configu
34d0: 72 61 74 69 6f 6e 73 0d 0a 20 20 20 20 20 20 7d  rations..      }
34e0: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
34f0: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
3500: 54 45 3a 20 55 73 65 20 74 68 65 20 64 65 66 61  TE: Use the defa
3510: 75 6c 74 20 6c 69 73 74 20 6f 66 20 74 65 73 74  ult list of test
3520: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 2e   configurations.
3530: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
3540: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6c 69 73       return [lis
3550: 74 20 44 65 62 75 67 20 52 65 6c 65 61 73 65 5d  t Debug Release]
3560: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
3570: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65  .....    proc ge
3580: 74 42 75 69 6c 64 42 61 73 65 44 69 72 65 63 74  tBuildBaseDirect
3590: 6f 72 79 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20  ory {} {..      
35a0: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
35b0: 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20   Figure out the 
35c0: 62 61 73 65 20 64 69 72 65 63 74 6f 72 79 20 77  base directory w
35d0: 68 65 72 65 20 61 6c 6c 20 74 68 65 20 62 75 69  here all the bui
35e0: 6c 64 73 20 73 68 6f 75 6c 64 20 62 65 0d 0a 20  lds should be.. 
35f0: 20 20 20 20 20 23 20 20 20 20 20 20 20 6c 6f 63       #       loc
3600: 61 74 65 64 2e 20 20 54 68 69 73 20 77 69 6c 6c  ated.  This will
3610: 20 62 65 20 74 68 65 20 64 69 72 65 63 74 6f 72   be the director
3620: 79 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  y that contains 
3630: 74 68 65 20 61 63 74 75 61 6c 0d 0a 20 20 20 20  the actual..    
3640: 20 20 23 20 20 20 20 20 20 20 62 75 69 6c 64 20    #       build 
3650: 6f 75 74 70 75 74 20 64 69 72 65 63 74 6f 72 79  output directory
3660: 20 28 65 2e 67 2e 20 70 61 72 65 6e 74 20 6f 66   (e.g. parent of
3670: 20 22 62 69 6e 22 29 2e 0d 0a 20 20 20 20 20 20   "bin")...      
3680: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e  #..      if {[in
3690: 66 6f 20 65 78 69 73 74 73 20 3a 3a 62 75 69 6c  fo exists ::buil
36a0: 64 5f 62 61 73 65 5f 64 69 72 65 63 74 6f 72 79  d_base_directory
36b0: 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
36c0: 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
36d0: 20 24 3a 3a 62 75 69 6c 64 5f 62 61 73 65 5f 64   $::build_base_d
36e0: 69 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74  irectory] > 0} t
36f0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
3700: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
3710: 3a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f  : The location o
3720: 66 20 74 68 65 20 62 75 69 6c 64 20 62 61 73 65  f the build base
3730: 20 64 69 72 65 63 74 6f 72 79 20 68 61 73 20 62   directory has b
3740: 65 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b 0d  een overridden;.
3750: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
3760: 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20   therefore, use 
3770: 69 74 20 76 65 72 62 61 74 69 6d 2e 0d 0a 20 20  it verbatim...  
3780: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
3790: 20 72 65 74 75 72 6e 20 24 3a 3a 62 75 69 6c 64   return $::build
37a0: 5f 62 61 73 65 5f 64 69 72 65 63 74 6f 72 79 0d  _base_directory.
37b0: 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20  .      } elseif 
37c0: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
37d0: 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79  common_directory
37e0: 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
37f0: 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
3800: 20 24 3a 3a 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63   $::common_direc
3810: 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20  tory] > 0} then 
3820: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
3830: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e 65        # NOTE: Ne
3840: 78 74 2c 20 66 61 6c 6c 62 61 63 6b 20 74 6f 20  xt, fallback to 
3850: 74 68 65 20 67 72 61 6e 64 70 61 72 65 6e 74 20  the grandparent 
3860: 64 69 72 65 63 74 6f 72 79 20 6f 66 20 74 68 65  directory of the
3870: 20 6f 6e 65 0d 0a 20 20 20 20 20 20 20 20 23 20   one..        # 
3880: 20 20 20 20 20 20 63 6f 6e 74 61 69 6e 69 6e 67        containing
3890: 20 74 68 69 73 20 66 69 6c 65 20 28 69 2e 65 2e   this file (i.e.
38a0: 20 22 63 6f 6d 6d 6f 6e 2e 65 61 67 6c 65 22 29   "common.eagle")
38b0: 2c 20 69 66 20 61 76 61 69 6c 61 62 6c 65 2e 0d  , if available..
38c0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
38d0: 20 20 20 20 72 65 74 75 72 6e 20 5b 66 69 6c 65      return [file
38e0: 20 64 69 72 6e 61 6d 65 20 5b 66 69 6c 65 20 64   dirname [file d
38f0: 69 72 6e 61 6d 65 20 24 3a 3a 63 6f 6d 6d 6f 6e  irname $::common
3900: 5f 64 69 72 65 63 74 6f 72 79 5d 5d 0d 0a 20 20  _directory]]..  
3910: 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69      } elseif {[i
3920: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 70 61 74  nfo exists ::pat
3930: 68 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  h] && \..       
3940: 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74     [string lengt
3950: 68 20 24 3a 3a 70 61 74 68 5d 20 3e 20 30 7d 20  h $::path] > 0} 
3960: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
3970: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
3980: 45 3a 20 46 69 6e 61 6c 6c 79 2c 20 66 61 6c 6c  E: Finally, fall
3990: 62 61 63 6b 20 74 6f 20 74 68 65 20 70 61 72 65  back to the pare
39a0: 6e 74 20 64 69 72 65 63 74 6f 72 79 20 6f 66 20  nt directory of 
39b0: 74 68 65 20 45 61 67 6c 65 54 65 73 74 0d 0a 20  the EagleTest.. 
39c0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 70         #       p
39d0: 61 74 68 2e 20 20 54 68 65 20 45 61 67 6c 65 54  ath.  The EagleT
39e0: 65 73 74 20 70 61 63 6b 61 67 65 20 67 75 61 72  est package guar
39f0: 61 6e 74 65 65 73 20 74 68 61 74 20 74 68 69 73  antees that this
3a00: 20 76 61 72 69 61 62 6c 65 0d 0a 20 20 20 20 20   variable..     
3a10: 20 20 20 23 20 20 20 20 20 20 20 77 69 6c 6c 20     #       will 
3a20: 62 65 20 73 65 74 20 74 6f 20 74 68 65 20 64 69  be set to the di
3a30: 72 65 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69  rectory containi
3a40: 6e 67 20 74 68 65 20 66 69 72 73 74 20 66 69 6c  ng the first fil
3a50: 65 20 74 6f 0d 0a 20 20 20 20 20 20 20 20 23 20  e to..        # 
3a60: 20 20 20 20 20 20 65 78 65 63 75 74 65 20 74 68        execute th
3a70: 65 20 5b 72 75 6e 54 65 73 74 50 72 6f 6c 6f 67  e [runTestProlog
3a80: 75 65 5d 20 73 63 72 69 70 74 20 6c 69 62 72 61  ue] script libra
3a90: 72 79 20 70 72 6f 63 65 64 75 72 65 2e 0d 0a 20  ry procedure... 
3aa0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
3ab0: 20 20 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 64    return [file d
3ac0: 69 72 6e 61 6d 65 20 24 3a 3a 70 61 74 68 5d 0d  irname $::path].
3ad0: 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
3ae0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
3af0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e 6f 20 70      # NOTE: No p
3b00: 61 74 68 20 69 73 20 61 76 61 69 6c 61 62 6c 65  ath is available
3b10: 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 6d 70 74  , return an empt
3b20: 79 20 73 74 72 69 6e 67 2e 20 20 54 68 69 73 20  y string.  This 
3b30: 70 6f 69 6e 74 0d 0a 20 20 20 20 20 20 20 20 23  point..        #
3b40: 20 20 20 20 20 20 20 73 68 6f 75 6c 64 20 6e 6f         should no
3b50: 74 20 62 65 20 72 65 61 63 68 65 64 2e 0d 0a 20  t be reached... 
3b60: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
3b70: 20 20 72 65 74 75 72 6e 20 22 22 0d 0a 20 20 20    return ""..   
3b80: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
3b90: 20 20 20 20 70 72 6f 63 20 67 65 74 53 51 4c 69      proc getSQLi
3ba0: 74 65 54 65 73 74 44 61 74 61 50 61 74 68 20 7b  teTestDataPath {
3bb0: 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
3bc0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69 67 75      # NOTE: Figu
3bd0: 72 65 20 6f 75 74 20 74 68 65 20 64 69 72 65 63  re out the direc
3be0: 74 6f 72 79 20 77 68 65 72 65 20 61 6c 6c 20 74  tory where all t
3bf0: 68 65 20 74 65 73 74 20 64 61 74 61 20 66 69 6c  he test data fil
3c00: 65 73 20 73 68 6f 75 6c 64 0d 0a 20 20 20 20 20  es should..     
3c10: 20 23 20 20 20 20 20 20 20 62 65 20 6c 6f 63 61   #       be loca
3c20: 74 65 64 2e 20 20 54 68 69 73 20 73 68 6f 75 6c  ted.  This shoul
3c30: 64 20 62 65 20 74 68 65 20 22 64 61 74 61 22 20  d be the "data" 
3c40: 64 69 72 65 63 74 6f 72 79 20 62 65 6e 65 61 74  directory beneat
3c50: 68 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20  h the..      #  
3c60: 20 20 20 20 20 64 69 72 65 63 74 6f 72 79 20 63       directory c
3c70: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 61 63  ontaining the ac
3c80: 74 75 61 6c 20 74 65 73 74 20 73 63 72 69 70 74  tual test script
3c90: 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  s...      #..   
3ca0: 20 20 20 72 65 74 75 72 6e 20 5b 66 69 6c 65 20     return [file 
3cb0: 6a 6f 69 6e 20 24 3a 3a 70 61 74 68 20 64 61 74  join $::path dat
3cc0: 61 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  a]..    }.....  
3cd0: 20 20 70 72 6f 63 20 69 73 52 75 6e 6e 69 6e 67    proc isRunning
3ce0: 57 6f 57 36 34 20 7b 7d 20 7b 0d 0a 20 20 20 20  WoW64 {} {..    
3cf0: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
3d00: 45 3a 20 46 6f 72 20 6e 6f 77 2c 20 6a 75 73 74  E: For now, just
3d10: 20 75 73 65 20 74 68 65 20 65 78 69 73 74 69 6e   use the existin
3d20: 67 20 74 65 73 74 20 63 6f 6e 73 74 72 61 69 6e  g test constrain
3d30: 74 20 66 6f 72 20 64 65 74 65 63 74 69 6e 67 0d  t for detecting.
3d40: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61  .      #       a
3d50: 20 57 6f 57 36 34 20 70 72 6f 63 65 73 73 2e 0d   WoW64 process..
3d60: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
3d70: 72 65 74 75 72 6e 20 5b 68 61 76 65 43 6f 6e 73  return [haveCons
3d80: 74 72 61 69 6e 74 20 77 6f 77 36 34 5d 0d 0a 20  traint wow64].. 
3d90: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
3da0: 63 20 69 73 4d 69 78 65 64 4d 6f 64 65 41 73 73  c isMixedModeAss
3db0: 65 6d 62 6c 79 20 7b 20 66 69 6c 65 4e 61 6d 65  embly { fileName
3dc0: 20 7b 76 61 72 4e 61 6d 65 20 22 22 7d 20 7d 20   {varName ""} } 
3dd0: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
3de0: 20 20 23 20 4e 4f 54 45 3a 20 46 69 72 73 74 2c    # NOTE: First,
3df0: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 74   make sure the t
3e00: 65 73 74 20 73 75 69 74 65 20 69 6e 66 72 61 73  est suite infras
3e10: 74 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f  tructure is allo
3e20: 77 65 64 20 74 6f 0d 0a 20 20 20 20 20 20 23 20  wed to..      # 
3e30: 20 20 20 20 20 20 75 73 65 20 74 68 65 20 5b 65        use the [e
3e40: 78 65 63 5d 20 63 6f 6d 6d 61 6e 64 2e 0d 0a 20  xec] command... 
3e50: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
3e60: 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
3e70: 3a 3a 6e 6f 28 65 78 65 63 29 5d 20 26 26 20 21  ::no(exec)] && !
3e80: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
3e90: 6f 28 63 6f 72 46 6c 61 67 73 29 5d 7d 20 74 68  o(corFlags)]} th
3ea0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
3eb0: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
3ec0: 20 49 66 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e   If the location
3ed0: 20 6f 66 20 43 6f 72 46 6c 61 67 73 20 69 73 20   of CorFlags is 
3ee0: 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 65  present in the e
3ef0: 6e 76 69 72 6f 6e 6d 65 6e 74 2c 0d 0a 20 20 20  nvironment,..   
3f00: 20 20 20 20 20 23 20 20 20 20 20 20 20 75 73 65       #       use
3f10: 20 69 74 3b 20 6f 74 68 65 72 77 69 73 65 20 61   it; otherwise a
3f20: 73 73 75 6d 65 20 69 74 20 69 73 20 69 6e 20 74  ssume it is in t
3f30: 68 65 20 50 41 54 48 2e 0d 0a 20 20 20 20 20 20  he PATH...      
3f40: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74    #..        set
3f50: 20 63 6f 72 46 6c 61 67 73 20 5b 65 78 70 72 20   corFlags [expr 
3f60: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 69 6e  {..          [in
3f70: 66 6f 20 65 78 69 73 74 73 20 3a 3a 65 6e 76 28  fo exists ::env(
3f80: 43 6f 72 46 6c 61 67 73 29 5d 20 3f 20 24 3a 3a  CorFlags)] ? $::
3f90: 65 6e 76 28 43 6f 72 46 6c 61 67 73 29 20 3a 20  env(CorFlags) : 
3fa0: 22 43 6f 72 46 6c 61 67 73 22 0d 0a 20 20 20 20  "CorFlags"..    
3fb0: 20 20 20 20 7d 5d 0d 0a 0d 0a 20 20 20 20 20 20      }]....      
3fc0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
3fd0: 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20  OTE: Attempt to 
3fe0: 65 78 65 63 75 74 65 20 43 6f 72 46 6c 61 67 73  execute CorFlags
3ff0: 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65   on the specifie
4000: 64 20 66 69 6c 65 2e 0d 0a 20 20 20 20 20 20 20  d file...       
4010: 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   #..        if {
4020: 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
4030: 20 20 20 20 65 78 65 63 20 2d 2d 20 24 63 6f 72      exec -- $cor
4040: 46 6c 61 67 73 20 5b 66 69 6c 65 20 6e 61 74 69  Flags [file nati
4050: 76 65 6e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65  vename $fileName
4060: 5d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 78 65  ]..        } exe
4070: 63 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  c] == 0} then {.
4080: 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
4090: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
40a0: 49 66 20 72 65 71 75 65 73 74 65 64 20 62 79 20  If requested by 
40b0: 6f 75 72 20 63 61 6c 6c 65 72 2c 20 61 74 74 65  our caller, atte
40c0: 6d 70 74 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  mpt to determine
40d0: 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 20 20   the..          
40e0: 23 20 20 20 20 20 20 20 70 6c 61 74 66 6f 72 6d  #       platform
40f0: 20 66 6f 72 20 74 68 65 20 73 70 65 63 69 66 69   for the specifi
4100: 65 64 20 66 69 6c 65 20 61 73 20 77 65 6c 6c 2e  ed file as well.
4110: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
4120: 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74           if {[st
4130: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 61 72  ring length $var
4140: 4e 61 6d 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20  Name] > 0} then 
4150: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  {..            #
4160: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20  ..            # 
4170: 4e 4f 54 45 3a 20 53 74 6f 72 65 20 74 68 65 20  NOTE: Store the 
4180: 70 6c 61 74 66 6f 72 6d 20 69 6e 20 74 68 65 20  platform in the 
4190: 6e 61 6d 65 64 20 76 61 72 69 61 62 6c 65 20 69  named variable i
41a0: 6e 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 20  n the..         
41b0: 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e 74 65     #       conte
41c0: 78 74 20 6f 66 20 6f 75 72 20 63 61 6c 6c 65 72  xt of our caller
41d0: 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  ...            #
41e0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 70  ..            up
41f0: 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65 20 70  var 1 $varName p
4200: 6c 61 74 66 6f 72 6d 0d 0a 0d 0a 20 20 20 20 20  latform....     
4210: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
4220: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74        # NOTE: At
4230: 74 65 6d 70 74 20 74 6f 20 65 78 74 72 61 63 74  tempt to extract
4240: 20 74 68 65 20 50 45 20 6c 69 6e 65 20 66 72 6f   the PE line fro
4250: 6d 20 74 68 65 20 63 61 70 74 75 72 65 64 0d 0a  m the captured..
4260: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20              #   
4270: 20 20 20 20 6f 75 74 70 75 74 2e 20 20 49 66 20      output.  If 
4280: 74 68 69 73 20 76 61 6c 75 65 20 69 73 20 22 50  this value is "P
4290: 45 33 32 22 20 6f 72 20 22 50 45 33 32 2b 22 2c  E32" or "PE32+",
42a0: 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 20 20   the..          
42b0: 20 20 23 20 20 20 20 20 20 20 61 73 73 65 6d 62    #       assemb
42c0: 6c 79 20 66 69 6c 65 20 69 73 20 33 32 2d 62 69  ly file is 32-bi
42d0: 74 20 6f 72 20 36 34 2d 62 69 74 2c 20 72 65 73  t or 64-bit, res
42e0: 70 65 63 74 69 76 65 6c 79 3b 0d 0a 20 20 20 20  pectively;..    
42f0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
4300: 6f 74 68 65 72 77 69 73 65 2c 20 69 74 73 20 74  otherwise, its t
4310: 79 70 65 20 69 73 20 75 6e 6b 6e 6f 77 6e 2e 0d  ype is unknown..
4320: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a  .            #..
4330: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
4340: 70 61 74 74 65 72 6e 20 7b 5e 50 45 20 20 20 20  pattern {^PE    
4350: 20 20 20 20 3a 20 28 50 45 33 32 7c 50 45 33 32      : (PE32|PE32
4360: 5c 2b 29 5c 73 2b 24 7d 0d 0a 0d 0a 20 20 20 20  \+)\s+$}....    
4370: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 72 65 67          if {[reg
4380: 65 78 70 20 2d 6c 69 6e 65 20 2d 2d 20 24 70 61  exp -line -- $pa
4390: 74 74 65 72 6e 20 24 65 78 65 63 20 64 75 6d 6d  ttern $exec dumm
43a0: 79 20 70 65 33 32 5d 7d 20 74 68 65 6e 20 7b 0d  y pe32]} then {.
43b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
43c0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
43d0: 23 20 48 41 43 4b 3a 20 54 68 69 73 20 5b 73 77  # HACK: This [sw
43e0: 69 74 63 68 5d 20 61 73 73 75 6d 65 73 20 74 68  itch] assumes th
43f0: 61 74 20 33 32 2d 62 69 74 20 65 78 65 63 75 74  at 32-bit execut
4400: 61 62 6c 65 73 20 61 72 65 0d 0a 20 20 20 20 20  ables are..     
4410: 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
4420: 20 61 6c 77 61 79 73 20 78 38 36 20 61 6e 64 20   always x86 and 
4430: 74 68 61 74 20 36 34 2d 62 69 74 20 65 78 65 63  that 64-bit exec
4440: 75 74 61 62 6c 65 73 20 61 72 65 20 61 6c 77 61  utables are alwa
4450: 79 73 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ys..            
4460: 20 20 23 20 20 20 20 20 20 20 78 36 34 2e 0d 0a    #       x64...
4470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
4480: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
4490: 77 69 74 63 68 20 2d 65 78 61 63 74 20 2d 2d 20  witch -exact -- 
44a0: 24 70 65 33 32 20 7b 0d 0a 20 20 20 20 20 20 20  $pe32 {..       
44b0: 20 20 20 20 20 20 20 20 20 50 45 33 32 20 7b 0d           PE32 {.
44c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
44d0: 20 20 20 73 65 74 20 70 6c 61 74 66 6f 72 6d 20     set platform 
44e0: 57 69 6e 33 32 0d 0a 20 20 20 20 20 20 20 20 20  Win32..         
44f0: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
4500: 20 20 20 20 20 20 20 20 20 20 50 45 33 32 2b 20            PE32+ 
4510: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
4520: 20 20 20 20 20 73 65 74 20 70 6c 61 74 66 6f 72       set platfor
4530: 6d 20 78 36 34 0d 0a 20 20 20 20 20 20 20 20 20  m x64..         
4540: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
4550: 20 20 20 20 20 20 20 20 20 20 64 65 66 61 75 6c            defaul
4560: 74 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  t {..           
4570: 20 20 20 20 20 20 20 73 65 74 20 70 6c 61 74 66         set platf
4580: 6f 72 6d 20 22 22 0d 0a 20 20 20 20 20 20 20 20  orm ""..        
4590: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
45a0: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
45b0: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
45c0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
45d0: 73 65 74 20 70 6c 61 74 66 6f 72 6d 20 22 22 0d  set platform "".
45e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
45f0: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
4600: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
4610: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74        # NOTE: At
4620: 74 65 6d 70 74 20 74 6f 20 65 78 74 72 61 63 74  tempt to extract
4630: 20 74 68 65 20 49 4c 4f 4e 4c 59 20 6c 69 6e 65   the ILONLY line
4640: 20 66 72 6f 6d 20 74 68 65 20 63 61 70 74 75 72   from the captur
4650: 65 64 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20  ed..          # 
4660: 20 20 20 20 20 20 6f 75 74 70 75 74 2e 20 20 49        output.  I
4670: 66 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 20  f this value is 
4680: 7a 65 72 6f 2c 20 74 68 65 20 73 70 65 63 69 66  zero, the specif
4690: 69 65 64 20 66 69 6c 65 20 6d 75 73 74 0d 0a 20  ied file must.. 
46a0: 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
46b0: 20 62 65 20 61 20 6d 69 78 65 64 2d 6d 6f 64 65   be a mixed-mode
46c0: 20 61 73 73 65 6d 62 6c 79 3b 20 6f 74 68 65 72   assembly; other
46d0: 77 69 73 65 2c 20 69 74 20 63 6f 6e 74 61 69 6e  wise, it contain
46e0: 73 20 6f 6e 6c 79 0d 0a 20 20 20 20 20 20 20 20  s only..        
46f0: 20 20 23 20 20 20 20 20 20 20 6d 61 6e 61 67 65    #       manage
4700: 64 20 63 6f 6d 70 6f 6e 65 6e 74 73 2e 0d 0a 20  d components... 
4710: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
4720: 20 20 20 20 20 20 73 65 74 20 70 61 74 74 65 72        set patter
4730: 6e 20 7b 5e 49 4c 4f 4e 4c 59 20 20 20 20 3a 20  n {^ILONLY    : 
4740: 28 30 7c 31 29 5c 73 2b 24 7d 0d 0a 0d 0a 20 20  (0|1)\s+$}....  
4750: 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 72 65          if {![re
4760: 67 65 78 70 20 2d 6c 69 6e 65 20 2d 2d 20 24 70  gexp -line -- $p
4770: 61 74 74 65 72 6e 20 24 65 78 65 63 20 64 75 6d  attern $exec dum
4780: 6d 79 20 69 6c 4f 6e 6c 79 5d 7d 20 74 68 65 6e  my ilOnly]} then
4790: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
47a0: 72 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20  return false..  
47b0: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
47c0: 20 20 20 20 20 20 20 69 66 20 7b 21 24 69 6c 4f         if {!$ilO
47d0: 6e 6c 79 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  nly} then {..   
47e0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
47f0: 74 72 75 65 0d 0a 20 20 20 20 20 20 20 20 20 20  true..          
4800: 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  }..        }..  
4810: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
4820: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
4830: 49 66 20 74 68 65 20 74 65 73 74 20 73 75 69 74  If the test suit
4840: 65 20 63 61 6e 6e 6f 74 20 75 73 65 20 5b 65 78  e cannot use [ex
4850: 65 63 5d 20 6f 72 20 65 78 65 63 75 74 69 6f 6e  ec] or execution
4860: 20 6f 66 20 43 6f 72 46 6c 61 67 73 0d 0a 20 20   of CorFlags..  
4870: 20 20 20 20 23 20 20 20 20 20 20 20 66 61 69 6c      #       fail
4880: 65 64 2c 20 72 65 74 75 72 6e 20 66 61 6c 73 65  ed, return false
4890: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
48a0: 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a    return false..
48b0: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
48c0: 6f 63 20 67 65 74 4e 61 74 69 76 65 4c 69 62 72  oc getNativeLibr
48d0: 61 72 79 46 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79  aryFileNamesOnly
48e0: 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a   {} {..      #..
48f0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69        # NOTE: Fi
4900: 72 73 74 2c 20 63 68 65 63 6b 20 69 66 20 74 68  rst, check if th
4910: 65 20 6c 69 73 74 20 6f 66 20 6e 61 74 69 76 65  e list of native
4920: 20 6c 69 62 72 61 72 79 20 66 69 6c 65 20 6e 61   library file na
4930: 6d 65 73 20 68 61 73 20 62 65 65 6e 0d 0a 20 20  mes has been..  
4940: 20 20 20 20 23 20 20 20 20 20 20 20 6d 61 6e 75      #       manu
4950: 61 6c 6c 79 20 6f 76 65 72 72 69 64 64 65 6e 2e  ally overridden.
4960: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
4970: 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
4980: 73 20 3a 3a 6e 61 74 69 76 65 5f 6c 69 62 72 61  s ::native_libra
4990: 72 79 5f 66 69 6c 65 5f 6e 61 6d 65 73 5d 20 26  ry_file_names] &
49a0: 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b  & \..          [
49b0: 6c 6c 65 6e 67 74 68 20 24 3a 3a 6e 61 74 69 76  llength $::nativ
49c0: 65 5f 6c 69 62 72 61 72 79 5f 66 69 6c 65 5f 6e  e_library_file_n
49d0: 61 6d 65 73 5d 20 3e 20 30 7d 20 74 68 65 6e 20  ames] > 0} then 
49e0: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
49f0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68        # NOTE: Th
4a00: 65 20 6c 69 73 74 20 6f 66 20 6e 61 74 69 76 65  e list of native
4a10: 20 6c 69 62 72 61 72 79 20 66 69 6c 65 20 6e 61   library file na
4a20: 6d 65 73 20 68 61 73 20 62 65 65 6e 20 6f 76 65  mes has been ove
4a30: 72 72 69 64 64 65 6e 3b 0d 0a 20 20 20 20 20 20  rridden;..      
4a40: 20 20 23 20 20 20 20 20 20 20 74 68 65 72 65 66    #       theref
4a50: 6f 72 65 2c 20 75 73 65 20 69 74 20 76 65 72 62  ore, use it verb
4a60: 61 74 69 6d 2e 0d 0a 20 20 20 20 20 20 20 20 23  atim...        #
4a70: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
4a80: 20 24 3a 3a 6e 61 74 69 76 65 5f 6c 69 62 72 61   $::native_libra
4a90: 72 79 5f 66 69 6c 65 5f 6e 61 6d 65 73 0d 0a 20  ry_file_names.. 
4aa0: 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b       } elseif {[
4ab0: 69 73 57 69 6e 64 6f 77 73 5d 7d 20 74 68 65 6e  isWindows]} then
4ac0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
4ad0: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4f         # NOTE: O
4ae0: 74 68 65 72 77 69 73 65 2c 20 6f 6e 20 57 69 6e  therwise, on Win
4af0: 64 6f 77 73 2c 20 61 6c 77 61 79 73 20 75 73 65  dows, always use
4b00: 20 74 68 65 20 64 65 66 61 75 6c 74 20 66 69 6c   the default fil
4b10: 65 20 6e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20  e name..        
4b20: 23 20 20 20 20 20 20 20 22 73 71 6c 69 74 65 33  #       "sqlite3
4b30: 2e 64 6c 6c 22 2e 0d 0a 20 20 20 20 20 20 20 20  .dll"...        
4b40: 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  #..        retur
4b50: 6e 20 5b 6c 69 73 74 20 73 71 6c 69 74 65 33 2e  n [list sqlite3.
4b60: 64 6c 6c 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c  dll]..      } el
4b70: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  se {..        #.
4b80: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
4b90: 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75   Otherwise, retu
4ba0: 72 6e 20 62 6f 74 68 20 74 68 65 20 67 65 6e 65  rn both the gene
4bb0: 72 69 63 20 50 4f 53 49 58 20 66 69 6c 65 20 6e  ric POSIX file n
4bc0: 61 6d 65 20 61 6e 64 20 74 68 65 0d 0a 20 20 20  ame and the..   
4bd0: 20 20 20 20 20 23 20 20 20 20 20 20 20 4d 61 63       #       Mac
4be0: 20 4f 53 20 58 20 66 69 6c 65 20 6e 61 6d 65 2c   OS X file name,
4bf0: 20 73 69 6e 63 65 20 77 65 20 64 6f 20 6e 6f 74   since we do not
4c00: 20 63 75 72 72 65 6e 74 6c 79 20 68 61 76 65 20   currently have 
4c10: 61 6e 20 65 61 73 79 0d 0a 20 20 20 20 20 20 20  an easy..       
4c20: 20 23 20 20 20 20 20 20 20 77 61 79 20 74 6f 20   #       way to 
4c30: 64 65 74 65 63 74 20 77 68 69 63 68 20 6f 66 20  detect which of 
4c40: 74 68 6f 73 65 20 70 6c 61 74 66 6f 72 6d 73 20  those platforms 
4c50: 77 65 20 61 72 65 20 72 75 6e 6e 69 6e 67 20 6f  we are running o
4c60: 6e 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  n...        #.. 
4c70: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6c         return [l
4c80: 69 73 74 20 6c 69 62 73 71 6c 69 74 65 33 2e 64  ist libsqlite3.d
4c90: 79 6c 69 62 20 6c 69 62 73 71 6c 69 74 65 33 2e  ylib libsqlite3.
4ca0: 73 6f 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  so]..      }..  
4cb0: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
4cc0: 20 67 65 74 49 6e 74 65 72 6f 70 41 73 73 65 6d   getInteropAssem
4cd0: 62 6c 79 46 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79  blyFileNamesOnly
4ce0: 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a   {} {..      #..
4cf0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69        # NOTE: Fi
4d00: 72 73 74 2c 20 63 68 65 63 6b 20 69 66 20 74 68  rst, check if th
4d10: 65 20 6c 69 73 74 20 6f 66 20 69 6e 74 65 72 6f  e list of intero
4d20: 70 20 61 73 73 65 6d 62 6c 79 20 66 69 6c 65 20  p assembly file 
4d30: 6e 61 6d 65 73 20 68 61 73 20 62 65 65 6e 0d 0a  names has been..
4d40: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6d 61        #       ma
4d50: 6e 75 61 6c 6c 79 20 6f 76 65 72 72 69 64 64 65  nually overridde
4d60: 6e 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  n...      #..   
4d70: 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69     if {[info exi
4d80: 73 74 73 20 3a 3a 69 6e 74 65 72 6f 70 5f 61 73  sts ::interop_as
4d90: 73 65 6d 62 6c 79 5f 66 69 6c 65 5f 6e 61 6d 65  sembly_file_name
4da0: 73 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  s] && \..       
4db0: 20 20 20 5b 6c 6c 65 6e 67 74 68 20 24 3a 3a 69     [llength $::i
4dc0: 6e 74 65 72 6f 70 5f 61 73 73 65 6d 62 6c 79 5f  nterop_assembly_
4dd0: 66 69 6c 65 5f 6e 61 6d 65 73 5d 20 3e 20 30 7d  file_names] > 0}
4de0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
4df0: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
4e00: 54 45 3a 20 54 68 65 20 6c 69 73 74 20 6f 66 20  TE: The list of 
4e10: 69 6e 74 65 72 6f 70 20 61 73 73 65 6d 62 6c 79  interop assembly
4e20: 20 66 69 6c 65 20 6e 61 6d 65 73 20 68 61 73 20   file names has 
4e30: 62 65 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b  been overridden;
4e40: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
4e50: 20 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65    therefore, use
4e60: 20 69 74 20 76 65 72 62 61 74 69 6d 2e 0d 0a 20   it verbatim... 
4e70: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
4e80: 20 20 72 65 74 75 72 6e 20 24 3a 3a 69 6e 74 65    return $::inte
4e90: 72 6f 70 5f 61 73 73 65 6d 62 6c 79 5f 66 69 6c  rop_assembly_fil
4ea0: 65 5f 6e 61 6d 65 73 0d 0a 20 20 20 20 20 20 7d  e_names..      }
4eb0: 20 65 6c 73 65 69 66 20 7b 5b 69 73 57 69 6e 64   elseif {[isWind
4ec0: 6f 77 73 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ows]} then {..  
4ed0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
4ee0: 20 23 20 4e 4f 54 45 3a 20 4f 74 68 65 72 77 69   # NOTE: Otherwi
4ef0: 73 65 2c 20 6f 6e 20 57 69 6e 64 6f 77 73 2c 20  se, on Windows, 
4f00: 61 6c 77 61 79 73 20 75 73 65 20 74 68 65 20 64  always use the d
4f10: 65 66 61 75 6c 74 20 66 69 6c 65 20 6e 61 6d 65  efault file name
4f20: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
4f30: 20 20 22 53 51 4c 69 74 65 2e 49 6e 74 65 72 6f    "SQLite.Intero
4f40: 70 2e 64 6c 6c 22 2e 0d 0a 20 20 20 20 20 20 20  p.dll"...       
4f50: 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   #..        retu
4f60: 72 6e 20 5b 6c 69 73 74 20 53 51 4c 69 74 65 2e  rn [list SQLite.
4f70: 49 6e 74 65 72 6f 70 2e 64 6c 6c 5d 0d 0a 20 20  Interop.dll]..  
4f80: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
4f90: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
4fa0: 20 23 20 4e 4f 54 45 3a 20 4f 74 68 65 72 77 69   # NOTE: Otherwi
4fb0: 73 65 2c 20 72 65 74 75 72 6e 20 62 6f 74 68 20  se, return both 
4fc0: 74 68 65 20 67 65 6e 65 72 69 63 20 50 4f 53 49  the generic POSI
4fd0: 58 20 66 69 6c 65 20 6e 61 6d 65 20 61 6e 64 20  X file name and 
4fe0: 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  the..        #  
4ff0: 20 20 20 20 20 4d 61 63 20 4f 53 20 58 20 66 69       Mac OS X fi
5000: 6c 65 20 6e 61 6d 65 2c 20 73 69 6e 63 65 20 77  le name, since w
5010: 65 20 64 6f 20 6e 6f 74 20 63 75 72 72 65 6e 74  e do not current
5020: 6c 79 20 68 61 76 65 20 61 6e 20 65 61 73 79 0d  ly have an easy.
5030: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
5040: 20 77 61 79 20 74 6f 20 64 65 74 65 63 74 20 77   way to detect w
5050: 68 69 63 68 20 6f 66 20 74 68 6f 73 65 20 70 6c  hich of those pl
5060: 61 74 66 6f 72 6d 73 20 77 65 20 61 72 65 20 72  atforms we are r
5070: 75 6e 6e 69 6e 67 20 6f 6e 2e 0d 0a 20 20 20 20  unning on...    
5080: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
5090: 65 74 75 72 6e 20 5b 6c 69 73 74 20 6c 69 62 53  eturn [list libS
50a0: 51 4c 69 74 65 2e 49 6e 74 65 72 6f 70 2e 64 79  QLite.Interop.dy
50b0: 6c 69 62 20 6c 69 62 53 51 4c 69 74 65 2e 49 6e  lib libSQLite.In
50c0: 74 65 72 6f 70 2e 73 6f 5d 0d 0a 20 20 20 20 20  terop.so]..     
50d0: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
50e0: 20 20 70 72 6f 63 20 67 65 74 43 6f 72 65 45 78    proc getCoreEx
50f0: 74 65 6e 73 69 6f 6e 42 69 6e 61 72 79 46 69 6c  tensionBinaryFil
5100: 65 4e 61 6d 65 20 7b 20 7b 64 65 66 61 75 6c 74  eName { {default
5110: 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20   ""} } {..      
5120: 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 67 65  set fileName [ge
5130: 74 43 6f 72 65 42 69 6e 61 72 79 46 69 6c 65 4e  tCoreBinaryFileN
5140: 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66  ame]....      if
5150: 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24   {[file exists $
5160: 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20  fileName]} then 
5170: 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  {..        retur
5180: 6e 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20  n $fileName..   
5190: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65     }....      re
51a0: 74 75 72 6e 20 24 64 65 66 61 75 6c 74 0d 0a 20  turn $default.. 
51b0: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
51c0: 63 20 69 73 42 75 69 6c 64 41 76 61 69 6c 61 62  c isBuildAvailab
51d0: 6c 65 20 7b 20 6e 61 74 69 76 65 20 64 69 72 65  le { native dire
51e0: 63 74 6f 72 79 20 7b 76 61 72 4e 61 6d 65 20 22  ctory {varName "
51f0: 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  "} } {..      #.
5200: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42  .      # NOTE: B
5210: 75 69 6c 64 20 74 68 65 20 66 75 6c 6c 79 20 71  uild the fully q
5220: 75 61 6c 69 66 69 65 64 20 66 69 6c 65 20 6e 61  ualified file na
5230: 6d 65 20 66 6f 72 20 74 68 65 20 70 72 69 6d 61  me for the prima
5240: 72 79 20 61 73 73 65 6d 62 6c 79 0d 0a 20 20 20  ry assembly..   
5250: 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e 74 61     #       conta
5260: 69 6e 69 6e 67 20 74 68 65 20 53 79 73 74 65 6d  ining the System
5270: 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 6d 61 6e  .Data.SQLite man
5280: 61 67 65 64 20 63 6f 6d 70 6f 6e 65 6e 74 73 2e  aged components.
5290: 20 20 49 74 0d 0a 20 20 20 20 20 20 23 20 20 20    It..      #   
52a0: 20 20 20 20 73 68 6f 75 6c 64 20 62 65 20 6e 6f      should be no
52b0: 74 65 64 20 74 68 61 74 20 74 68 69 73 20 61 73  ted that this as
52c0: 73 65 6d 62 6c 79 20 66 69 6c 65 20 6d 61 79 20  sembly file may 
52d0: 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65  also contain the
52e0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
52f0: 6e 61 74 69 76 65 20 63 6f 6d 70 6f 6e 65 6e 74  native component
5300: 73 2c 20 69 66 20 61 20 6e 61 74 69 76 65 20 62  s, if a native b
5310: 75 69 6c 64 20 69 73 20 69 6e 20 75 73 65 2e 0d  uild is in use..
5320: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
5330: 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69  set fileName [fi
5340: 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66  le nativename [f
5350: 69 6c 65 20 6a 6f 69 6e 20 24 64 69 72 65 63 74  ile join $direct
5360: 6f 72 79 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ory \..         
5370: 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
5380: 69 74 65 2e 64 6c 6c 5d 5d 0d 0a 0d 0a 20 20 20  ite.dll]]....   
5390: 20 20 20 69 66 20 7b 21 5b 66 69 6c 65 20 65 78     if {![file ex
53a0: 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d  ists $fileName]}
53b0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
53c0: 20 72 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20   return false.. 
53d0: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
53e0: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
53f0: 20 41 74 74 65 6d 70 74 20 74 6f 20 61 75 74 6f   Attempt to auto
5400: 6d 61 74 69 63 61 6c 6c 79 20 64 65 74 65 63 74  matically detect
5410: 20 69 66 20 74 68 65 20 70 72 69 6d 61 72 79 20   if the primary 
5420: 61 73 73 65 6d 62 6c 79 0d 0a 20 20 20 20 20 20  assembly..      
5430: 23 20 20 20 20 20 20 20 63 6f 6e 74 61 69 6e 73  #       contains
5440: 20 61 6e 79 20 6e 61 74 69 76 65 20 63 6f 6d 70   any native comp
5450: 6f 6e 65 6e 74 73 2c 20 69 66 20 6e 65 63 65 73  onents, if neces
5460: 73 61 72 79 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  sary...      #..
5470: 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
5480: 67 20 6c 65 6e 67 74 68 20 24 6e 61 74 69 76 65  g length $native
5490: 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
54a0: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72          if {[str
54b0: 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 61 72 4e  ing length $varN
54c0: 61 6d 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ame] > 0} then {
54d0: 0d 0a 20 20 20 20 20 20 20 20 20 20 75 70 76 61  ..          upva
54e0: 72 20 31 20 24 76 61 72 4e 61 6d 65 20 24 76 61  r 1 $varName $va
54f0: 72 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 7d  rName..        }
5500: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20  ....        set 
5510: 6e 61 74 69 76 65 20 5b 69 73 4d 69 78 65 64 4d  native [isMixedM
5520: 6f 64 65 41 73 73 65 6d 62 6c 79 20 24 66 69 6c  odeAssembly $fil
5530: 65 4e 61 6d 65 20 24 76 61 72 4e 61 6d 65 5d 0d  eName $varName].
5540: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
5550: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
5560: 45 3a 20 49 66 20 74 68 65 20 70 72 69 6d 61 72  E: If the primar
5570: 79 20 61 73 73 65 6d 62 6c 79 20 61 6c 73 6f 20  y assembly also 
5580: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 61 74  contains the nat
5590: 69 76 65 20 63 6f 6d 70 6f 6e 65 6e 74 73 2c 0d  ive components,.
55a0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 77  .      #       w
55b0: 65 20 68 61 76 65 20 65 76 65 72 79 74 68 69 6e  e have everythin
55c0: 67 20 77 65 20 6e 65 65 64 2e 0d 0a 20 20 20 20  g we need...    
55d0: 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 24    #..      if {$
55e0: 6e 61 74 69 76 65 7d 20 74 68 65 6e 20 7b 0d 0a  native} then {..
55f0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74          return t
5600: 72 75 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  rue..      }....
5610: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
5620: 20 4e 4f 54 45 3a 20 49 66 20 74 68 65 20 6d 61   NOTE: If the ma
5630: 63 68 69 6e 65 20 6e 61 6d 65 20 69 73 20 75 6e  chine name is un
5640: 61 76 61 69 6c 61 62 6c 65 2c 20 74 68 65 72 65  available, there
5650: 20 69 73 20 6e 6f 74 68 69 67 6e 20 65 6c 73 65   is nothign else
5660: 20 77 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20   we..      #    
5670: 20 20 20 63 61 6e 20 64 6f 2e 0d 0a 20 20 20 20     can do...    
5680: 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 21    #..      if {!
5690: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74  [info exists ::t
56a0: 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 6d 61 63 68  cl_platform(mach
56b0: 69 6e 65 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  ine)]} then {.. 
56c0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61         return fa
56d0: 6c 73 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  lse..      }....
56e0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
56f0: 20 4e 4f 54 45 3a 20 57 68 61 74 20 69 73 20 74   NOTE: What is t
5700: 68 65 20 61 72 63 68 69 74 65 63 74 75 72 65 20  he architecture 
5710: 66 6f 72 20 74 68 69 73 20 6d 61 63 68 69 6e 65  for this machine
5720: 3f 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ?..      #..    
5730: 20 20 73 65 74 20 61 72 63 68 69 74 65 63 74 75    set architectu
5740: 72 65 20 5b 6d 61 63 68 69 6e 65 54 6f 50 6c 61  re [machineToPla
5750: 74 66 6f 72 6d 20 24 3a 3a 74 63 6c 5f 70 6c 61  tform $::tcl_pla
5760: 74 66 6f 72 6d 28 6d 61 63 68 69 6e 65 29 20 74  tform(machine) t
5770: 72 75 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d  rue]....      #.
5780: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57  .      # NOTE: W
5790: 68 61 74 20 69 73 20 74 68 65 20 70 6c 61 74 66  hat is the platf
57a0: 6f 72 6d 20 66 6f 72 20 74 68 69 73 20 6d 61 63  orm for this mac
57b0: 68 69 6e 65 3f 0d 0a 20 20 20 20 20 20 23 0d 0a  hine?..      #..
57c0: 20 20 20 20 20 20 73 65 74 20 70 6c 61 74 66 6f        set platfo
57d0: 72 6d 20 5b 6d 61 63 68 69 6e 65 54 6f 50 6c 61  rm [machineToPla
57e0: 74 66 6f 72 6d 20 24 3a 3a 74 63 6c 5f 70 6c 61  tform $::tcl_pla
57f0: 74 66 6f 72 6d 28 6d 61 63 68 69 6e 65 29 5d 0d  tform(machine)].
5800: 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
5810: 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20    # NOTE: Build 
5820: 74 68 65 20 66 75 6c 6c 79 20 71 75 61 6c 69 66  the fully qualif
5830: 69 65 64 20 66 69 6c 65 20 6e 61 6d 65 20 66 6f  ied file name fo
5840: 72 20 74 68 65 20 69 6e 74 65 72 6f 70 20 61 73  r the interop as
5850: 73 65 6d 62 6c 79 0d 0a 20 20 20 20 20 20 23 20  sembly..      # 
5860: 20 20 20 20 20 20 63 6f 6e 74 61 69 6e 69 6e 67        containing
5870: 20 74 68 65 20 53 79 73 74 65 6d 2e 44 61 74 61   the System.Data
5880: 2e 53 51 4c 69 74 65 20 6e 61 74 69 76 65 20 63  .SQLite native c
5890: 6f 6d 70 6f 6e 65 6e 74 73 2e 20 20 49 66 20 74  omponents.  If t
58a0: 68 69 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20  his..      #    
58b0: 20 20 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20     file exists, 
58c0: 77 65 20 73 68 6f 75 6c 64 20 68 61 76 65 20 65  we should have e
58d0: 76 65 72 79 74 68 69 6e 67 20 77 65 20 6e 65 65  verything we nee
58e0: 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  d...      #..   
58f0: 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e     foreach fileN
5900: 61 6d 65 4f 6e 6c 79 20 5b 67 65 74 49 6e 74 65  ameOnly [getInte
5910: 72 6f 70 41 73 73 65 6d 62 6c 79 46 69 6c 65 4e  ropAssemblyFileN
5920: 61 6d 65 73 4f 6e 6c 79 5d 20 7b 0d 0a 20 20 20  amesOnly] {..   
5930: 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d       set fileNam
5940: 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61  e [file nativena
5950: 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 64  me [file join $d
5960: 69 72 65 63 74 6f 72 79 20 5c 0d 0a 20 20 20 20  irectory \..    
5970: 20 20 20 20 20 20 20 20 24 61 72 63 68 69 74 65          $archite
5980: 63 74 75 72 65 20 24 66 69 6c 65 4e 61 6d 65 4f  cture $fileNameO
5990: 6e 6c 79 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  nly]]....       
59a0: 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74   if {[file exist
59b0: 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68  s $fileName]} th
59c0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
59d0: 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20  return true..   
59e0: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
59f0: 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b    set fileName [
5a00: 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20  file nativename 
5a10: 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 64 69 72 65  [file join $dire
5a20: 63 74 6f 72 79 20 5c 0d 0a 20 20 20 20 20 20 20  ctory \..       
5a30: 20 20 20 20 20 24 70 6c 61 74 66 6f 72 6d 20 24       $platform $
5a40: 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 5d 5d 0d 0a  fileNameOnly]]..
5a50: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 66  ..        if {[f
5a60: 69 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c 65  ile exists $file
5a70: 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  Name]} then {.. 
5a80: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
5a90: 74 72 75 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d  true..        }.
5aa0: 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 66  ...        set f
5ab0: 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6e 61  ileName [file na
5ac0: 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a  tivename [file j
5ad0: 6f 69 6e 20 24 64 69 72 65 63 74 6f 72 79 20 5c  oin $directory \
5ae0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 24 66  ..            $f
5af0: 69 6c 65 4e 61 6d 65 4f 6e 6c 79 5d 5d 0d 0a 0d  ileNameOnly]]...
5b00: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 66 69  .        if {[fi
5b10: 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c 65 4e  le exists $fileN
5b20: 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ame]} then {..  
5b30: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74          return t
5b40: 72 75 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  rue..        }..
5b50: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
5b60: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
5b70: 3a 20 42 75 69 6c 64 20 74 68 65 20 66 75 6c 6c  : Build the full
5b80: 79 20 71 75 61 6c 69 66 69 65 64 20 66 69 6c 65  y qualified file
5b90: 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 53 51   name for the SQ
5ba0: 4c 69 74 65 20 63 6f 72 65 0d 0a 20 20 20 20 20  Lite core..     
5bb0: 20 23 20 20 20 20 20 20 20 6c 69 62 72 61 72 79   #       library
5bc0: 2e 20 20 49 66 20 74 68 69 73 20 66 69 6c 65 20  .  If this file 
5bd0: 65 78 69 73 74 73 2c 20 77 65 20 73 68 6f 75 6c  exists, we shoul
5be0: 64 20 68 61 76 65 20 65 76 65 72 79 74 68 69 6e  d have everythin
5bf0: 67 20 77 65 0d 0a 20 20 20 20 20 20 23 20 20 20  g we..      #   
5c00: 20 20 20 20 6e 65 65 64 2e 0d 0a 20 20 20 20 20      need...     
5c10: 20 23 0d 0a 20 20 20 20 20 20 66 6f 72 65 61 63   #..      foreac
5c20: 68 20 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 5b  h fileNameOnly [
5c30: 67 65 74 4e 61 74 69 76 65 4c 69 62 72 61 72 79  getNativeLibrary
5c40: 46 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79 5d 20 7b  FileNamesOnly] {
5c50: 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 66 69  ..        set fi
5c60: 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6e 61 74  leName [file nat
5c70: 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f  ivename [file jo
5c80: 69 6e 20 24 64 69 72 65 63 74 6f 72 79 20 5c 0d  in $directory \.
5c90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 24 61 72  .            $ar
5ca0: 63 68 69 74 65 63 74 75 72 65 20 24 66 69 6c 65  chitecture $file
5cb0: 4e 61 6d 65 4f 6e 6c 79 5d 5d 0d 0a 0d 0a 20 20  NameOnly]]....  
5cc0: 20 20 20 20 20 20 69 66 20 7b 5b 66 69 6c 65 20        if {[file 
5cd0: 65 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65  exists $fileName
5ce0: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
5cf0: 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65       return true
5d00: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
5d10: 20 20 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e         set fileN
5d20: 61 6d 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65  ame [file native
5d30: 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20  name [file join 
5d40: 24 64 69 72 65 63 74 6f 72 79 20 5c 0d 0a 20 20  $directory \..  
5d50: 20 20 20 20 20 20 20 20 20 20 24 70 6c 61 74 66            $platf
5d60: 6f 72 6d 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c  orm $fileNameOnl
5d70: 79 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69  y]]....        i
5d80: 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20  f {[file exists 
5d90: 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e  $fileName]} then
5da0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65   {..          re
5db0: 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20  turn true..     
5dc0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
5dd0: 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69  set fileName [fi
5de0: 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66  le nativename [f
5df0: 69 6c 65 20 6a 6f 69 6e 20 24 64 69 72 65 63 74  ile join $direct
5e00: 6f 72 79 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ory \..         
5e10: 20 20 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79     $fileNameOnly
5e20: 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66  ]]....        if
5e30: 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24   {[file exists $
5e40: 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20  fileName]} then 
5e50: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  {..          ret
5e60: 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20  urn true..      
5e70: 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a    }..      }....
5e80: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
5e90: 20 4e 4f 54 45 3a 20 4f 6e 65 20 6f 72 20 6d 6f   NOTE: One or mo
5ea0: 72 65 20 6e 61 74 69 76 65 20 63 6f 6d 70 6f 6e  re native compon
5eb0: 65 6e 74 73 20 6e 65 65 64 65 64 20 62 79 20 53  ents needed by S
5ec0: 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
5ed0: 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
5ee0: 20 61 72 65 20 6d 69 73 73 69 6e 67 2e 0d 0a 20   are missing... 
5ef0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65       #..      re
5f00: 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20  turn false..    
5f10: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 69  }.....    proc i
5f20: 73 52 65 6c 65 61 73 65 41 76 61 69 6c 61 62 6c  sReleaseAvailabl
5f30: 65 20 7b 20 64 69 72 65 63 74 6f 72 79 20 7b 76  e { directory {v
5f40: 61 72 4e 61 6d 65 20 22 22 7d 20 7d 20 7b 0d 0a  arName ""} } {..
5f50: 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
5f60: 67 20 6c 65 6e 67 74 68 20 24 76 61 72 4e 61 6d  g length $varNam
5f70: 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  e] > 0} then {..
5f80: 20 20 20 20 20 20 20 20 75 70 76 61 72 20 31 20          upvar 1 
5f90: 24 76 61 72 4e 61 6d 65 20 24 76 61 72 4e 61 6d  $varName $varNam
5fa0: 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  e..      }....  
5fb0: 20 20 20 20 72 65 74 75 72 6e 20 5b 69 73 42 75      return [isBu
5fc0: 69 6c 64 41 76 61 69 6c 61 62 6c 65 20 22 22 20  ildAvailable "" 
5fd0: 24 64 69 72 65 63 74 6f 72 79 20 24 76 61 72 4e  $directory $varN
5fe0: 61 6d 65 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  ame]..    }.....
5ff0: 20 20 20 20 70 72 6f 63 20 6a 6f 69 6e 42 75 69      proc joinBui
6000: 6c 64 44 69 72 65 63 74 6f 72 79 20 7b 20 6e 61  ldDirectory { na
6010: 74 69 76 65 20 70 61 74 68 20 79 65 61 72 20 70  tive path year p
6020: 6c 61 74 66 6f 72 6d 20 63 6f 6e 66 69 67 75 72  latform configur
6030: 61 74 69 6f 6e 20 7d 20 7b 0d 0a 20 20 20 20 20  ation } {..     
6040: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
6050: 3a 20 46 69 67 75 72 65 20 6f 75 74 20 61 6e 64  : Figure out and
6060: 20 74 68 65 6e 20 72 65 74 75 72 6e 20 74 68 65   then return the
6070: 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64   fully qualified
6080: 20 70 61 74 68 20 74 6f 20 74 68 65 20 62 75 69   path to the bui
6090: 6c 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ld..      #     
60a0: 20 20 64 69 72 65 63 74 6f 72 79 20 62 61 73 65    directory base
60b0: 64 20 6f 6e 20 61 6c 6c 20 74 68 65 20 61 72 67  d on all the arg
60c0: 75 6d 65 6e 74 73 20 70 72 6f 76 69 64 65 64 20  uments provided 
60d0: 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 2e 0d 0a  by our caller...
60e0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
60f0: 66 20 7b 24 6e 61 74 69 76 65 7d 20 74 68 65 6e  f {$native} then
6100: 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   {..        retu
6110: 72 6e 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 70  rn [file join $p
6120: 61 74 68 20 62 69 6e 20 24 79 65 61 72 20 24 70  ath bin $year $p
6130: 6c 61 74 66 6f 72 6d 20 24 63 6f 6e 66 69 67 75  latform $configu
6140: 72 61 74 69 6f 6e 5d 0d 0a 20 20 20 20 20 20 7d  ration]..      }
6150: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
6160: 20 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 6a 6f   return [file jo
6170: 69 6e 20 24 70 61 74 68 20 62 69 6e 20 24 79 65  in $path bin $ye
6180: 61 72 20 24 63 6f 6e 66 69 67 75 72 61 74 69 6f  ar $configuratio
6190: 6e 20 62 69 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d  n bin]..      }.
61a0: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
61b0: 72 6f 63 20 67 65 74 42 75 69 6c 64 44 69 72 65  roc getBuildDire
61c0: 63 74 6f 72 79 20 7b 20 6d 61 6e 61 67 65 64 4f  ctory { managedO
61d0: 6e 6c 79 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23  nly } {..      #
61e0: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
61f0: 53 65 65 20 69 66 20 74 68 65 20 22 6e 61 74 69  See if the "nati
6200: 76 65 22 20 72 75 6e 74 69 6d 65 20 6f 70 74 69  ve" runtime opti
6210: 6f 6e 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e  on has been set.
6220: 20 20 49 66 20 73 6f 2c 20 75 73 65 20 74 68 65    If so, use the
6230: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
6240: 64 69 72 65 63 74 6f 72 79 20 66 6f 72 20 74 68  directory for th
6250: 65 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73  e mixed-mode ass
6260: 65 6d 62 6c 79 20 28 61 2e 6b 2e 61 2e 20 74 68  embly (a.k.a. th
6270: 65 20 6e 61 74 69 76 65 20 69 6e 74 65 72 6f 70  e native interop
6280: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
6290: 61 73 73 65 6d 62 6c 79 29 2e 20 20 54 6f 20 65  assembly).  To e
62a0: 6e 61 62 6c 65 20 74 68 69 73 20 6f 70 74 69 6f  nable this optio
62b0: 6e 20 76 69 61 20 74 68 65 20 63 6f 6d 6d 61 6e  n via the comman
62c0: 64 20 6c 69 6e 65 2c 20 65 6e 74 65 72 20 61 0d  d line, enter a.
62d0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63  .      #       c
62e0: 6f 6d 6d 61 6e 64 20 73 69 6d 69 6c 61 72 20 74  ommand similar t
62f0: 6f 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c  o one of the fol
6300: 6c 6f 77 69 6e 67 20 28 61 6c 6c 20 6f 6e 20 6f  lowing (all on o
6310: 6e 65 20 6c 69 6e 65 29 3a 0d 0a 20 20 20 20 20  ne line):..     
6320: 20 23 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20   #..      #     
6330: 20 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65    EagleShell.exe
6340: 20 2d 69 6e 69 74 69 61 6c 69 7a 65 20 2d 72 75   -initialize -ru
6350: 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 6e 61 74 69  ntimeOption nati
6360: 76 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ve..      #     
6370: 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70 61 74 68      -file .\path
6380: 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a 20  \to\all.eagle.. 
6390: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
63a0: 20 20 20 20 20 20 54 6f 20 65 6e 61 62 6c 65 20        To enable 
63b0: 74 68 69 73 20 6f 70 74 69 6f 6e 20 76 69 61 20  this option via 
63c0: 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65  the command line
63d0: 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 22 62   prior to the "b
63e0: 65 74 61 20 31 36 22 0d 0a 20 20 20 20 20 20 23  eta 16"..      #
63f0: 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 20 6f         release o
6400: 66 20 45 61 67 6c 65 2c 20 74 68 65 20 66 6f 6c  f Eagle, the fol
6410: 6c 6f 77 69 6e 67 20 63 6f 6d 6d 61 6e 64 20 6d  lowing command m
6420: 75 73 74 20 62 65 20 75 73 65 64 20 69 6e 73 74  ust be used inst
6430: 65 61 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ead..      #    
6440: 20 20 20 28 61 6c 73 6f 20 61 6c 6c 20 6f 6e 20     (also all on 
6450: 6f 6e 65 20 6c 69 6e 65 29 3a 0d 0a 20 20 20 20  one line):..    
6460: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 20 20 20    #..      #    
6470: 20 20 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78     EagleShell.ex
6480: 65 20 2d 69 6e 69 74 69 61 6c 69 7a 65 20 2d 70  e -initialize -p
6490: 6f 73 74 49 6e 69 74 69 61 6c 69 7a 65 0d 0a 20  ostInitialize.. 
64a0: 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20 22       #         "
64b0: 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 49 6e  object invoke In
64c0: 74 65 72 70 72 65 74 65 72 2e 47 65 74 41 63 74  terpreter.GetAct
64d0: 69 76 65 20 41 64 64 52 75 6e 74 69 6d 65 4f 70  ive AddRuntimeOp
64e0: 74 69 6f 6e 20 6e 61 74 69 76 65 22 0d 0a 20 20  tion native"..  
64f0: 20 20 20 20 23 20 20 20 20 20 20 20 20 20 2d 66      #         -f
6500: 69 6c 65 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c  ile .\path\to\al
6510: 6c 2e 65 61 67 6c 65 0d 0a 20 20 20 20 20 20 23  l.eagle..      #
6520: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66  ..      if {[inf
6530: 6f 20 65 78 69 73 74 73 20 3a 3a 62 75 69 6c 64  o exists ::build
6540: 5f 64 69 72 65 63 74 6f 72 79 5d 20 26 26 20 5c  _directory] && \
6550: 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72  ..          [str
6560: 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 62 75  ing length $::bu
6570: 69 6c 64 5f 64 69 72 65 63 74 6f 72 79 5d 20 3e  ild_directory] >
6580: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
6590: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
65a0: 20 4e 4f 54 45 3a 20 54 68 65 20 6c 6f 63 61 74   NOTE: The locat
65b0: 69 6f 6e 20 6f 66 20 74 68 65 20 62 75 69 6c 64  ion of the build
65c0: 20 64 69 72 65 63 74 6f 72 79 20 68 61 73 20 62   directory has b
65d0: 65 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b 0d  een overridden;.
65e0: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
65f0: 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20   therefore, use 
6600: 69 74 20 76 65 72 62 61 74 69 6d 2e 0d 0a 20 20  it verbatim...  
6610: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
6620: 20 72 65 74 75 72 6e 20 24 3a 3a 62 75 69 6c 64   return $::build
6630: 5f 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20  _directory..    
6640: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
6650: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
6660: 20 4e 4f 54 45 3a 20 49 66 20 74 68 65 20 22 6e   NOTE: If the "n
6670: 61 74 69 76 65 22 20 72 75 6e 74 69 6d 65 20 6f  ative" runtime o
6680: 70 74 69 6f 6e 20 69 73 20 73 65 74 2c 20 74 68  ption is set, th
6690: 65 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73  e mixed-mode ass
66a0: 65 6d 62 6c 79 0d 0a 20 20 20 20 20 20 20 20 23  embly..        #
66b0: 20 20 20 20 20 20 20 69 73 20 62 65 69 6e 67 20         is being 
66c0: 74 65 73 74 65 64 2e 20 20 49 6e 20 74 68 61 74  tested.  In that
66d0: 20 63 61 73 65 2c 20 74 68 65 20 70 61 74 68 20   case, the path 
66e0: 74 6f 20 74 68 65 20 62 75 69 6c 64 20 64 69 72  to the build dir
66f0: 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 20 20  ectory..        
6700: 23 20 20 20 20 20 20 20 77 69 6c 6c 20 63 6f 6e  #       will con
6710: 74 61 69 6e 20 74 68 65 20 70 6c 61 74 66 6f 72  tain the platfor
6720: 6d 20 6e 61 6d 65 20 61 6e 64 20 61 6c 6c 20 74  m name and all t
6730: 68 65 20 62 69 6e 61 72 69 65 73 20 75 6e 64 65  he binaries unde
6740: 72 20 74 65 73 74 0d 0a 20 20 20 20 20 20 20 20  r test..        
6750: 23 20 20 20 20 20 20 20 73 68 6f 75 6c 64 20 62  #       should b
6760: 65 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 61  e present in tha
6770: 74 20 64 69 72 65 63 74 6f 72 79 2e 20 20 49 66  t directory.  If
6780: 20 74 68 65 20 22 6e 61 74 69 76 65 22 20 72 75   the "native" ru
6790: 6e 74 69 6d 65 0d 0a 20 20 20 20 20 20 20 20 23  ntime..        #
67a0: 20 20 20 20 20 20 20 6f 70 74 69 6f 6e 20 69 73         option is
67b0: 20 6e 6f 74 20 73 65 74 2c 20 74 68 65 20 62 75   not set, the bu
67c0: 69 6c 64 20 64 69 72 65 63 74 6f 72 79 20 77 69  ild directory wi
67d0: 6c 6c 20 62 65 20 63 6f 6e 73 69 64 65 72 65 64  ll be considered
67e0: 20 74 6f 20 62 65 0d 0a 20 20 20 20 20 20 20 20   to be..        
67f0: 23 20 20 20 20 20 20 20 22 70 6c 61 74 66 6f 72  #       "platfor
6800: 6d 2d 6e 65 75 74 72 61 6c 22 2c 20 77 69 74 68  m-neutral", with
6810: 20 74 68 65 20 6e 6f 74 61 62 6c 65 20 65 78 63   the notable exc
6820: 65 70 74 69 6f 6e 20 6f 66 20 61 6e 79 20 6e 61  eption of any na
6830: 74 69 76 65 0d 0a 20 20 20 20 20 20 20 20 23 20  tive..        # 
6840: 20 20 20 20 20 20 61 73 73 65 6d 62 6c 79 20 28        assembly (
6850: 65 2e 67 2e 20 22 53 51 4c 69 74 65 2e 49 6e 74  e.g. "SQLite.Int
6860: 65 72 6f 70 2e 64 6c 6c 22 29 20 63 6f 70 69 65  erop.dll") copie
6870: 64 20 74 68 65 72 65 20 64 75 72 69 6e 67 20 74  d there during t
6880: 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  he..        #   
6890: 20 20 20 20 62 75 69 6c 64 20 70 72 6f 63 65 73      build proces
68a0: 73 20 69 74 73 65 6c 66 2e 20 20 49 66 20 74 68  s itself.  If th
68b0: 65 20 62 75 69 6c 64 20 70 72 6f 63 65 73 73 20  e build process 
68c0: 73 6f 6d 65 68 6f 77 20 64 6f 65 73 20 6e 6f 74  somehow does not
68d0: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
68e0: 20 20 63 6f 70 79 20 74 68 65 20 6e 61 74 69 76    copy the nativ
68f0: 65 20 61 73 73 65 6d 62 6c 79 20 66 6f 72 20 74  e assembly for t
6900: 68 69 73 20 70 6c 61 74 66 6f 72 6d 2c 20 6d 6f  his platform, mo
6910: 73 74 20 6f 66 20 74 68 65 20 74 65 73 74 73 0d  st of the tests.
6920: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
6930: 20 69 6e 20 74 68 65 20 73 75 69 74 65 20 77 69   in the suite wi
6940: 6c 6c 20 73 69 6d 70 6c 79 20 62 65 20 73 6b 69  ll simply be ski
6950: 70 70 65 64 2e 20 20 47 65 6e 65 72 61 6c 6c 79  pped.  Generally
6960: 20 73 70 65 61 6b 69 6e 67 2c 20 74 68 65 72 65   speaking, there
6970: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
6980: 20 20 61 72 65 20 74 77 6f 20 77 61 79 73 20 74    are two ways t
6990: 6f 20 62 75 69 6c 64 20 74 68 65 20 62 69 6e 61  o build the bina
69a0: 72 69 65 73 20 77 68 65 6e 20 70 72 65 70 61 72  ries when prepar
69b0: 69 6e 67 20 74 6f 20 72 75 6e 20 74 68 65 0d 0a  ing to run the..
69c0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
69d0: 74 65 73 74 20 73 75 69 74 65 3a 0d 0a 20 20 20  test suite:..   
69e0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
69f0: 23 20 20 20 20 20 20 20 31 2e 20 42 75 69 6c 64  #       1. Build
6a00: 20 74 68 65 20 73 65 70 61 72 61 74 65 20 6d 61   the separate ma
6a10: 6e 61 67 65 64 20 61 6e 64 20 6e 61 74 69 76 65  naged and native
6a20: 20 61 73 73 65 6d 62 6c 69 65 73 20 75 73 69 6e   assemblies usin
6a30: 67 20 73 6f 6d 65 0d 0a 20 20 20 20 20 20 20 20  g some..        
6a40: 23 20 20 20 20 20 20 20 20 20 20 63 6f 6d 6d 61  #          comma
6a50: 6e 64 73 20 73 69 6d 69 6c 61 72 20 74 6f 3a 0d  nds similar to:.
6a60: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
6a70: 20 20 20 20 23 20 20 20 20 20 20 20 20 20 20 62      #          b
6a80: 75 69 6c 64 2e 62 61 74 20 24 7b 43 6f 6e 66 69  uild.bat ${Confi
6a90: 67 75 72 61 74 69 6f 6e 7d 4d 61 6e 61 67 65 64  guration}Managed
6aa0: 4f 6e 6c 79 20 24 7b 50 6c 61 74 66 6f 72 6d 7d  Only ${Platform}
6ab0: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
6ac0: 20 20 20 20 20 62 75 69 6c 64 2e 62 61 74 20 24       build.bat $
6ad0: 7b 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 7d 4e  {Configuration}N
6ae0: 61 74 69 76 65 4f 6e 6c 79 20 24 7b 50 6c 61 74  ativeOnly ${Plat
6af0: 66 6f 72 6d 7d 0d 0a 20 20 20 20 20 20 20 20 23  form}..        #
6b00: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
6b10: 20 20 20 20 20 57 68 65 72 65 20 24 7b 43 6f 6e       Where ${Con
6b20: 66 69 67 75 72 61 74 69 6f 6e 7d 20 69 73 20 65  figuration} is e
6b30: 69 74 68 65 72 20 22 44 65 62 75 67 22 20 6f 72  ither "Debug" or
6b40: 20 22 52 65 6c 65 61 73 65 22 20 61 6e 64 0d 0a   "Release" and..
6b50: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
6b60: 20 20 20 24 7b 50 6c 61 74 66 6f 72 6d 7d 20 69     ${Platform} i
6b70: 73 20 65 69 74 68 65 72 20 22 57 69 6e 33 32 22  s either "Win32"
6b80: 20 6f 72 20 22 78 36 34 22 2e 0d 0a 20 20 20 20   or "x64"...    
6b90: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
6ba0: 20 20 20 20 20 20 20 32 2e 20 42 75 69 6c 64 20         2. Build 
6bb0: 74 68 65 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61  the mixed-mode a
6bc0: 73 73 65 6d 62 6c 79 20 75 73 69 6e 67 20 61 20  ssembly using a 
6bd0: 63 6f 6d 6d 61 6e 64 20 73 69 6d 69 6c 61 72 20  command similar 
6be0: 74 6f 3a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  to:..        #..
6bf0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
6c00: 20 20 20 62 75 69 6c 64 2e 62 61 74 20 24 7b 43     build.bat ${C
6c10: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 7d 20 24 7b  onfiguration} ${
6c20: 50 6c 61 74 66 6f 72 6d 7d 0d 0a 20 20 20 20 20  Platform}..     
6c30: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
6c40: 20 20 20 20 20 20 20 20 20 57 68 65 72 65 20 24           Where $
6c50: 7b 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 7d 20  {Configuration} 
6c60: 69 73 20 65 69 74 68 65 72 20 22 44 65 62 75 67  is either "Debug
6c70: 22 20 6f 72 20 22 52 65 6c 65 61 73 65 22 20 61  " or "Release" a
6c80: 6e 64 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  nd..        #   
6c90: 20 20 20 20 20 20 20 24 7b 50 6c 61 74 66 6f 72         ${Platfor
6ca0: 6d 7d 20 69 73 20 65 69 74 68 65 72 20 22 57 69  m} is either "Wi
6cb0: 6e 33 32 22 20 6f 72 20 22 78 36 34 22 2e 20 20  n32" or "x64".  
6cc0: 49 66 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  If this command 
6cd0: 69 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  is..        #   
6ce0: 20 20 20 20 20 20 20 75 73 65 64 2c 20 76 61 72         used, var
6cf0: 69 6f 75 73 20 74 65 73 74 73 20 74 68 61 74 20  ious tests that 
6d00: 72 65 71 75 69 72 65 20 73 75 70 70 6c 65 6d 65  require suppleme
6d10: 6e 74 61 72 79 20 6d 61 6e 61 67 65 64 0d 0a 20  ntary managed.. 
6d20: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20         #        
6d30: 20 20 61 73 73 65 6d 62 6c 69 65 73 20 28 65 2e    assemblies (e.
6d40: 67 2e 20 4c 49 4e 51 29 20 6d 61 79 20 62 65 20  g. LINQ) may be 
6d50: 73 6b 69 70 70 65 64 20 75 6e 6c 65 73 73 20 74  skipped unless t
6d60: 68 6f 73 65 20 62 69 6e 61 72 69 65 73 0d 0a 20  hose binaries.. 
6d70: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20         #        
6d80: 20 20 61 72 65 20 73 75 62 73 65 71 75 65 6e 74    are subsequent
6d90: 6c 79 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 74  ly copied into t
6da0: 68 65 20 63 6f 72 72 65 63 74 20 64 69 72 65 63  he correct direc
6db0: 74 6f 72 79 20 28 69 2e 65 2e 20 62 79 0d 0a 20  tory (i.e. by.. 
6dc0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20         #        
6dd0: 20 20 22 74 65 73 74 5f 61 6c 6c 2e 62 61 74 22    "test_all.bat"
6de0: 29 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  )...        #.. 
6df0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 4e         #       N
6e00: 6f 74 65 20 74 68 61 74 20 61 6c 6c 20 6f 66 20  ote that all of 
6e10: 74 68 65 20 62 75 69 6c 64 20 63 6f 6d 6d 61 6e  the build comman
6e20: 64 73 20 61 62 6f 76 65 20 77 69 6c 6c 20 64 65  ds above will de
6e30: 66 61 75 6c 74 20 74 6f 20 75 73 69 6e 67 0d 0a  fault to using..
6e40: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
6e50: 74 68 65 20 6c 61 74 65 73 74 20 76 65 72 73 69  the latest versi
6e60: 6f 6e 20 6f 66 20 4d 53 42 75 69 6c 64 20 61 76  on of MSBuild av
6e70: 61 69 6c 61 62 6c 65 20 61 6e 64 20 74 68 65 20  ailable and the 
6e80: 22 74 65 73 74 5f 79 65 61 72 22 20 6d 61 79 0d  "test_year" may.
6e90: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
6ea0: 20 6e 65 65 64 20 74 6f 20 62 65 20 61 64 6a 75   need to be adju
6eb0: 73 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79  sted accordingly
6ec0: 20 74 6f 20 61 63 74 75 61 6c 6c 79 20 72 75 6e   to actually run
6ed0: 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65 2e   the test suite.
6ee0: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
6ef0: 20 20 52 65 66 65 72 20 74 6f 20 74 68 65 20 63    Refer to the c
6f00: 6f 6d 6d 65 6e 74 73 20 69 6e 20 5b 67 65 74 42  omments in [getB
6f10: 75 69 6c 64 59 65 61 72 5d 20 66 6f 72 20 6d 6f  uildYear] for mo
6f20: 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f  re information o
6f30: 6e 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  n..        #    
6f40: 20 20 20 68 6f 77 20 74 6f 20 73 65 74 20 74 68     how to set th
6f50: 69 73 20 76 61 72 69 61 62 6c 65 2e 0d 0a 20 20  is variable...  
6f60: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
6f70: 20 73 65 74 20 6e 61 74 69 76 65 20 5b 65 78 70   set native [exp
6f80: 72 20 7b 21 24 6d 61 6e 61 67 65 64 4f 6e 6c 79  r {!$managedOnly
6f90: 20 26 26 20 5b 68 61 73 52 75 6e 74 69 6d 65 4f   && [hasRuntimeO
6fa0: 70 74 69 6f 6e 20 6e 61 74 69 76 65 5d 7d 5d 0d  ption native]}].
6fb0: 0a 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ...        retur
6fc0: 6e 20 5b 6a 6f 69 6e 42 75 69 6c 64 44 69 72 65  n [joinBuildDire
6fd0: 63 74 6f 72 79 20 24 6e 61 74 69 76 65 20 5b 67  ctory $native [g
6fe0: 65 74 42 75 69 6c 64 42 61 73 65 44 69 72 65 63  etBuildBaseDirec
6ff0: 74 6f 72 79 5d 20 5c 0d 0a 20 20 20 20 20 20 20  tory] \..       
7000: 20 20 20 20 20 5b 67 65 74 42 75 69 6c 64 59 65       [getBuildYe
7010: 61 72 5d 20 5b 67 65 74 42 75 69 6c 64 50 6c 61  ar] [getBuildPla
7020: 74 66 6f 72 6d 20 24 6e 61 74 69 76 65 5d 20 5b  tform $native] [
7030: 67 65 74 42 75 69 6c 64 43 6f 6e 66 69 67 75 72  getBuildConfigur
7040: 61 74 69 6f 6e 5d 5d 0d 0a 20 20 20 20 20 20 7d  ation]]..      }
7050: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
7060: 70 72 6f 63 20 67 65 74 52 65 6c 65 61 73 65 56  proc getReleaseV
7070: 65 72 73 69 6f 6e 20 7b 7d 20 7b 0d 0a 20 20 20  ersion {} {..   
7080: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
7090: 54 45 3a 20 46 69 67 75 72 65 20 6f 75 74 20 74  TE: Figure out t
70a0: 68 65 20 72 65 6c 65 61 73 65 20 76 65 72 73 69  he release versi
70b0: 6f 6e 20 66 6f 72 20 75 73 65 20 77 69 74 68 20  on for use with 
70c0: 74 68 65 20 62 75 69 6c 64 20 64 69 72 65 63 74  the build direct
70d0: 6f 72 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ory..      #    
70e0: 20 20 20 77 68 65 6e 20 63 68 65 63 6b 69 6e 67     when checking
70f0: 20 66 6f 72 20 61 76 61 69 6c 61 62 6c 65 20 72   for available r
7100: 65 6c 65 61 73 65 73 2e 0d 0a 20 20 20 20 20 20  eleases...      
7110: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e  #..      if {[in
7120: 66 6f 20 65 78 69 73 74 73 20 3a 3a 72 65 6c 65  fo exists ::rele
7130: 61 73 65 5f 76 65 72 73 69 6f 6e 5d 20 26 26 20  ase_version] && 
7140: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74  \..          [st
7150: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 72  ring length $::r
7160: 65 6c 65 61 73 65 5f 76 65 72 73 69 6f 6e 5d 20  elease_version] 
7170: 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
7180: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
7190: 23 20 4e 4f 54 45 3a 20 54 68 65 20 72 65 6c 65  # NOTE: The rele
71a0: 61 73 65 20 76 65 72 73 69 6f 6e 20 68 61 73 20  ase version has 
71b0: 62 65 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b  been overridden;
71c0: 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20   therefore, use 
71d0: 69 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  it..        #   
71e0: 20 20 20 20 76 65 72 62 61 74 69 6d 2e 0d 0a 20      verbatim... 
71f0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
7200: 20 20 72 65 74 75 72 6e 20 24 3a 3a 72 65 6c 65    return $::rele
7210: 61 73 65 5f 76 65 72 73 69 6f 6e 0d 0a 20 20 20  ase_version..   
7220: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
7230: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
7240: 23 20 4e 4f 54 45 3a 20 4e 6f 20 72 65 6c 65 61  # NOTE: No relea
7250: 73 65 20 76 65 72 73 69 6f 6e 20 69 73 20 61 76  se version is av
7260: 61 69 6c 61 62 6c 65 2c 20 72 65 74 75 72 6e 20  ailable, return 
7270: 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e  an empty string.
7280: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
7290: 20 20 49 74 20 69 73 20 69 6d 70 6f 72 74 61 6e    It is importan
72a0: 74 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 65  t to return an e
72b0: 6d 70 74 79 20 73 74 72 69 6e 67 20 68 65 72 65  mpty string here
72c0: 20 62 65 63 61 75 73 65 20 74 68 65 0d 0a 20 20   because the..  
72d0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 72 65        #       re
72e0: 73 75 6c 74 20 6f 66 20 74 68 69 73 20 70 72 6f  sult of this pro
72f0: 63 65 64 75 72 65 20 6d 61 79 20 62 65 20 75 73  cedure may be us
7300: 65 64 20 77 69 74 68 20 5b 66 69 6c 65 20 6a 6f  ed with [file jo
7310: 69 6e 5d 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  in]...        #.
7320: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
7330: 22 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  ""..      }..   
7340: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
7350: 67 65 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65  getBuildFileName
7360: 20 7b 20 66 69 6c 65 4e 61 6d 65 20 6d 61 6e 61   { fileName mana
7370: 67 65 64 4f 6e 6c 79 20 7b 70 6c 61 74 66 6f 72  gedOnly {platfor
7380: 6d 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  m ""} } {..     
7390: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
73a0: 3a 20 52 65 74 75 72 6e 73 20 74 68 65 20 73 70  : Returns the sp
73b0: 65 63 69 66 69 65 64 20 66 69 6c 65 20 6e 61 6d  ecified file nam
73c0: 65 20 61 73 20 69 66 20 69 74 20 77 65 72 65 20  e as if it were 
73d0: 6c 6f 63 61 74 65 64 20 69 6e 20 74 68 65 0d 0a  located in the..
73e0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62 75        #       bu
73f0: 69 6c 64 20 64 69 72 65 63 74 6f 72 79 2c 20 64  ild directory, d
7400: 69 73 63 61 72 64 69 6e 67 20 61 6e 79 20 64 69  iscarding any di
7410: 72 65 63 74 6f 72 79 20 69 6e 66 6f 72 6d 61 74  rectory informat
7420: 69 6f 6e 20 70 72 65 73 65 6e 74 0d 0a 20 20 20  ion present..   
7430: 20 20 20 23 20 20 20 20 20 20 20 69 6e 20 74 68     #       in th
7440: 65 20 66 69 6c 65 20 6e 61 6d 65 20 61 73 20 70  e file name as p
7450: 72 6f 76 69 64 65 64 20 62 79 20 6f 75 72 20 63  rovided by our c
7460: 61 6c 6c 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d  aller...      #.
7470: 0a 20 20 20 20 20 20 73 65 74 20 72 65 73 75 6c  .      set resul
7480: 74 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61  t [file nativena
7490: 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  me \..          
74a0: 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 42  [file join [getB
74b0: 75 69 6c 64 44 69 72 65 63 74 6f 72 79 20 24 6d  uildDirectory $m
74c0: 61 6e 61 67 65 64 4f 6e 6c 79 5d 20 24 70 6c 61  anagedOnly] $pla
74d0: 74 66 6f 72 6d 20 5c 0d 0a 20 20 20 20 20 20 20  tform \..       
74e0: 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66     [file tail $f
74f0: 69 6c 65 4e 61 6d 65 5d 5d 5d 0d 0a 0d 0a 20 20  ileName]]]....  
7500: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 48      #..      # H
7510: 41 43 4b 3a 20 57 68 65 6e 20 72 75 6e 6e 69 6e  ACK: When runnin
7520: 67 20 6f 6e 20 57 6f 57 36 34 2c 20 61 73 73 75  g on WoW64, assu
7530: 6d 65 20 74 68 65 20 74 65 73 74 20 65 78 65 63  me the test exec
7540: 75 74 61 62 6c 65 73 20 61 72 65 20 70 72 65 73  utables are pres
7550: 65 6e 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ent..      #    
7560: 20 20 20 77 69 74 68 20 74 68 65 20 22 33 32 22     with the "32"
7570: 20 73 75 66 66 69 78 20 6f 6e 20 74 68 65 6d 2e   suffix on them.
7580: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
7590: 20 69 66 20 7b 5b 69 73 52 75 6e 6e 69 6e 67 57   if {[isRunningW
75a0: 6f 57 36 34 5d 20 26 26 20 5b 66 69 6c 65 20 65  oW64] && [file e
75b0: 78 74 65 6e 73 69 6f 6e 20 24 72 65 73 75 6c 74  xtension $result
75c0: 5d 20 65 71 20 22 2e 65 78 65 22 7d 20 74 68 65  ] eq ".exe"} the
75d0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74  n {..        set
75e0: 20 72 65 73 75 6c 74 20 5b 61 70 70 65 6e 64 41   result [appendA
75f0: 72 67 73 20 5b 66 69 6c 65 20 72 6f 6f 74 6e 61  rgs [file rootna
7600: 6d 65 20 24 72 65 73 75 6c 74 5d 20 33 32 2e 65  me $result] 32.e
7610: 78 65 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  xe]..      }....
7620: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 72 65        return $re
7630: 73 75 6c 74 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  sult..    }.....
7640: 20 20 20 20 70 72 6f 63 20 67 65 74 45 78 74 65      proc getExte
7650: 72 6e 61 6c 44 69 72 65 63 74 6f 72 79 20 7b 7d  rnalDirectory {}
7660: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
7670: 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20     # NOTE: This 
7680: 70 72 6f 63 65 64 75 72 65 20 72 65 74 75 72 6e  procedure return
7690: 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  s the directory 
76a0: 77 68 65 72 65 20 74 68 65 20 65 78 74 65 72 6e  where the extern
76b0: 61 6c 20 62 69 6e 61 72 79 0d 0a 20 20 20 20 20  al binary..     
76c0: 20 23 20 20 20 20 20 20 20 66 69 6c 65 73 20 61   #       files a
76d0: 72 65 20 6c 6f 63 61 74 65 64 2e 0d 0a 20 20 20  re located...   
76e0: 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75     #..      retu
76f0: 72 6e 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e  rn [file nativen
7700: 61 6d 65 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d  ame [file dirnam
7710: 65 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20  e [file dirname 
7720: 5b 69 6e 66 6f 20 62 69 6e 61 72 79 5d 5d 5d 5d  [info binary]]]]
7730: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
7740: 70 72 6f 63 20 67 65 74 42 69 6e 61 72 79 44 69  proc getBinaryDi
7750: 72 65 63 74 6f 72 79 20 7b 7d 20 7b 0d 0a 20 20  rectory {} {..  
7760: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
7770: 4f 54 45 3a 20 54 68 69 73 20 70 72 6f 63 65 64  OTE: This proced
7780: 75 72 65 20 72 65 74 75 72 6e 73 20 74 68 65 20  ure returns the 
7790: 64 69 72 65 63 74 6f 72 79 20 77 68 65 72 65 20  directory where 
77a0: 74 68 65 20 74 65 73 74 20 61 70 70 6c 69 63 61  the test applica
77b0: 74 69 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20 20  tion..      #   
77c0: 20 20 20 20 69 74 73 65 6c 66 20 28 69 2e 65 2e      itself (i.e.
77d0: 20 74 68 65 20 45 61 67 6c 65 20 73 68 65 6c 6c   the Eagle shell
77e0: 29 20 69 73 20 6c 6f 63 61 74 65 64 2e 20 20 54  ) is located.  T
77f0: 68 69 73 20 77 69 6c 6c 20 62 65 20 75 73 65 64  his will be used
7800: 20 61 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20   as..      #    
7810: 20 20 20 74 68 65 20 64 65 73 74 69 6e 61 74 69     the destinati
7820: 6f 6e 20 66 6f 72 20 74 68 65 20 63 6f 70 69 65  on for the copie
7830: 64 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  d System.Data.SQ
7840: 4c 69 74 65 20 6e 61 74 69 76 65 20 61 6e 64 0d  Lite native and.
7850: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6d  .      #       m
7860: 61 6e 61 67 65 64 20 61 73 73 65 6d 62 6c 69 65  anaged assemblie
7870: 73 20 28 69 2e 65 2e 20 62 65 63 61 75 73 65 20  s (i.e. because 
7880: 74 68 69 73 20 69 73 20 6f 6e 65 20 6f 66 20 74  this is one of t
7890: 68 65 20 66 65 77 20 70 6c 61 63 65 73 0d 0a 20  he few places.. 
78a0: 20 20 20 20 20 23 20 20 20 20 20 20 20 77 68 65       #       whe
78b0: 72 65 20 74 68 65 20 43 4c 52 20 77 69 6c 6c 20  re the CLR will 
78c0: 61 63 74 75 61 6c 6c 79 20 66 69 6e 64 20 61 6e  actually find an
78d0: 64 20 6c 6f 61 64 20 74 68 65 6d 20 70 72 6f 70  d load them prop
78e0: 65 72 6c 79 29 2e 0d 0a 20 20 20 20 20 20 23 0d  erly)...      #.
78f0: 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f  .      if {[info
7900: 20 65 78 69 73 74 73 20 3a 3a 62 69 6e 61 72 79   exists ::binary
7910: 5f 64 69 72 65 63 74 6f 72 79 5d 20 26 26 20 5c  _directory] && \
7920: 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72  ..          [str
7930: 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 62 69  ing length $::bi
7940: 6e 61 72 79 5f 64 69 72 65 63 74 6f 72 79 5d 20  nary_directory] 
7950: 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
7960: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
7970: 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c 6f 63 61  # NOTE: The loca
7980: 74 69 6f 6e 20 6f 66 20 74 68 65 20 62 69 6e 61  tion of the bina
7990: 72 79 20 64 69 72 65 63 74 6f 72 79 20 68 61 73  ry directory has
79a0: 20 62 65 65 6e 20 6f 76 65 72 72 69 64 64 65 6e   been overridden
79b0: 3b 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  ;..        #    
79c0: 20 20 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73     therefore, us
79d0: 65 20 69 74 20 76 65 72 62 61 74 69 6d 2e 0d 0a  e it verbatim...
79e0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
79f0: 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 62 69 6e     return $::bin
7a00: 61 72 79 5f 64 69 72 65 63 74 6f 72 79 0d 0a 20  ary_directory.. 
7a10: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
7a20: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 69         return [i
7a30: 6e 66 6f 20 62 69 6e 61 72 79 5d 0d 0a 20 20 20  nfo binary]..   
7a40: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
7a50: 20 20 20 20 70 72 6f 63 20 67 65 74 45 78 74 65      proc getExte
7a60: 72 6e 61 6c 46 69 6c 65 4e 61 6d 65 20 7b 20 66  rnalFileName { f
7a70: 69 6c 65 4e 61 6d 65 20 7d 20 7b 0d 0a 20 20 20  ileName } {..   
7a80: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
7a90: 54 45 3a 20 52 65 74 75 72 6e 73 20 74 68 65 20  TE: Returns the 
7aa0: 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 20 6e  specified file n
7ab0: 61 6d 65 20 61 73 20 69 66 20 69 74 20 77 65 72  ame as if it wer
7ac0: 65 20 6c 6f 63 61 74 65 64 20 69 6e 20 74 68 65  e located in the
7ad0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
7ae0: 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 74 61 69  directory contai
7af0: 6e 69 6e 67 20 74 68 65 20 65 78 74 65 72 6e 61  ning the externa
7b00: 6c 20 62 69 6e 61 72 69 65 73 2e 0d 0a 20 20 20  l binaries...   
7b10: 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75     #..      retu
7b20: 72 6e 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e  rn [file nativen
7b30: 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b  ame [file join [
7b40: 67 65 74 45 78 74 65 72 6e 61 6c 44 69 72 65 63  getExternalDirec
7b50: 74 6f 72 79 5d 20 24 66 69 6c 65 4e 61 6d 65 5d  tory] $fileName]
7b60: 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  ]..    }.....   
7b70: 20 70 72 6f 63 20 67 65 74 42 69 6e 61 72 79 46   proc getBinaryF
7b80: 69 6c 65 4e 61 6d 65 20 7b 20 66 69 6c 65 4e 61  ileName { fileNa
7b90: 6d 65 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d  me {platform ""}
7ba0: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20   } {..      #.. 
7bb0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 74       # NOTE: Ret
7bc0: 75 72 6e 73 20 74 68 65 20 73 70 65 63 69 66 69  urns the specifi
7bd0: 65 64 20 66 69 6c 65 20 6e 61 6d 65 20 61 73 20  ed file name as 
7be0: 69 66 20 69 74 20 77 65 72 65 20 6c 6f 63 61 74  if it were locat
7bf0: 65 64 20 69 6e 20 74 68 65 0d 0a 20 20 20 20 20  ed in the..     
7c00: 20 23 20 20 20 20 20 20 20 62 69 6e 61 72 79 20   #       binary 
7c10: 64 69 72 65 63 74 6f 72 79 2c 20 64 69 73 63 61  directory, disca
7c20: 72 64 69 6e 67 20 61 6e 79 20 64 69 72 65 63 74  rding any direct
7c30: 6f 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ory information 
7c40: 70 72 65 73 65 6e 74 0d 0a 20 20 20 20 20 20 23  present..      #
7c50: 20 20 20 20 20 20 20 69 6e 20 74 68 65 20 66 69         in the fi
7c60: 6c 65 20 6e 61 6d 65 20 61 73 20 70 72 6f 76 69  le name as provi
7c70: 64 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65  ded by our calle
7c80: 72 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  r...      #..   
7c90: 20 20 20 72 65 74 75 72 6e 20 5b 66 69 6c 65 20     return [file 
7ca0: 6e 61 74 69 76 65 6e 61 6d 65 20 5c 0d 0a 20 20  nativename \..  
7cb0: 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 6a 6f          [file jo
7cc0: 69 6e 20 5b 67 65 74 42 69 6e 61 72 79 44 69 72  in [getBinaryDir
7cd0: 65 63 74 6f 72 79 5d 20 24 70 6c 61 74 66 6f 72  ectory] $platfor
7ce0: 6d 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69  m [file tail $fi
7cf0: 6c 65 4e 61 6d 65 5d 5d 5d 0d 0a 20 20 20 20 7d  leName]]]..    }
7d00: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65  .....    proc ge
7d10: 74 43 6f 72 65 42 69 6e 61 72 79 46 69 6c 65 4e  tCoreBinaryFileN
7d20: 61 6d 65 20 7b 20 7b 70 6c 61 74 66 6f 72 6d 20  ame { {platform 
7d30: 22 22 7d 20 7b 73 74 61 6e 64 61 72 64 20 22 22  ""} {standard ""
7d40: 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a  } } {..      #..
7d50: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65        # NOTE: Re
7d60: 74 75 72 6e 73 20 74 68 65 20 66 75 6c 6c 20 70  turns the full p
7d70: 61 74 68 20 66 6f 72 20 74 68 65 20 66 69 6c 65  ath for the file
7d80: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
7d90: 53 51 4c 69 74 65 20 63 6f 72 65 0d 0a 20 20 20  SQLite core..   
7da0: 20 20 20 23 20 20 20 20 20 20 20 6e 61 74 69 76     #       nativ
7db0: 65 20 6c 69 62 72 61 72 79 20 63 6f 64 65 20 66  e library code f
7dc0: 6f 72 20 74 68 69 73 20 70 6c 61 74 66 6f 72 6d  or this platform
7dd0: 2e 20 20 46 69 72 73 74 2c 20 63 68 65 63 6b 20  .  First, check 
7de0: 61 6e 64 20 73 65 65 20 69 66 0d 0a 20 20 20 20  and see if..    
7df0: 20 20 23 20 20 20 20 20 20 20 74 68 65 20 53 51    #       the SQ
7e00: 4c 69 74 65 20 63 6f 72 65 20 6e 61 74 69 76 65  Lite core native
7e10: 20 6c 69 62 72 61 72 79 20 68 61 73 20 61 6c 72   library has alr
7e20: 65 61 64 79 20 62 65 65 6e 20 6c 6f 61 64 65 64  eady been loaded
7e30: 2e 20 20 4e 65 78 74 2c 0d 0a 20 20 20 20 20 20  .  Next,..      
7e40: 23 20 20 20 20 20 20 20 66 61 6c 6c 62 61 63 6b  #       fallback
7e50: 20 74 6f 20 77 68 61 74 20 74 68 65 20 66 75 6c   to what the ful
7e60: 6c 20 70 61 74 68 20 73 68 6f 75 6c 64 20 62 65  l path should be
7e70: 2c 20 62 61 73 65 64 20 6f 6e 20 77 68 65 74 68  , based on wheth
7e80: 65 72 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20  er the..      # 
7e90: 20 20 20 20 20 20 6d 69 78 65 64 2d 6d 6f 64 65        mixed-mode
7ea0: 20 61 73 73 65 6d 62 6c 79 20 69 73 20 62 65 69   assembly is bei
7eb0: 6e 67 20 75 73 65 64 20 61 6e 64 20 74 68 65 20  ng used and the 
7ec0: 6e 61 6d 65 20 6f 66 20 74 68 65 20 63 75 72 72  name of the curr
7ed0: 65 6e 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ent..      #    
7ee0: 20 20 20 70 6c 61 74 66 6f 72 6d 2e 0d 0a 20 20     platform...  
7ef0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
7f00: 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
7f10: 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65     object invoke
7f20: 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c   -flags +NonPubl
7f30: 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ic \..          
7f40: 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51    System.Data.SQ
7f50: 4c 69 74 65 2e 55 6e 73 61 66 65 4e 61 74 69 76  Lite.UnsafeNativ
7f60: 65 4d 65 74 68 6f 64 73 20 5f 53 51 4c 69 74 65  eMethods _SQLite
7f70: 4e 61 74 69 76 65 4d 6f 64 75 6c 65 46 69 6c 65  NativeModuleFile
7f80: 4e 61 6d 65 0d 0a 20 20 20 20 20 20 7d 20 66 69  Name..      } fi
7f90: 6c 65 4e 61 6d 65 5d 20 3d 3d 20 30 20 26 26 20  leName] == 0 && 
7fa0: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
7fb0: 66 69 6c 65 4e 61 6d 65 5d 20 3e 20 30 7d 20 74  fileName] > 0} t
7fc0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
7fd0: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
7fe0: 3a 20 54 68 65 20 53 51 4c 69 74 65 20 63 6f 72  : The SQLite cor
7ff0: 65 20 6e 61 74 69 76 65 20 6c 69 62 72 61 72 79  e native library
8000: 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
8010: 6e 20 6c 6f 61 64 65 64 20 76 69 61 0d 0a 20 20  n loaded via..  
8020: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68        #       th
8030: 65 20 6e 61 74 69 76 65 20 6c 69 62 72 61 72 79  e native library
8040: 20 70 72 65 2d 6c 6f 61 64 65 72 2e 20 20 52 65   pre-loader.  Re
8050: 74 75 72 6e 20 74 68 61 74 20 66 69 6c 65 20 6e  turn that file n
8060: 61 6d 65 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20  ame now...      
8070: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
8080: 75 72 6e 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20  urn $fileName.. 
8090: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
80a0: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
80b0: 20 49 66 20 74 68 65 20 22 6e 61 74 69 76 65 22   If the "native"
80c0: 20 72 75 6e 74 69 6d 65 20 6f 70 74 69 6f 6e 20   runtime option 
80d0: 68 61 73 20 62 65 65 6e 20 73 65 74 2c 20 61 6c  has been set, al
80e0: 77 61 79 73 20 72 65 74 75 72 6e 20 74 68 65 0d  ways return the.
80f0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 66  .      #       f
8100: 69 6c 65 20 6e 61 6d 65 20 66 6f 72 20 74 68 65  ile name for the
8110: 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73 65   mixed-mode asse
8120: 6d 62 6c 79 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  mbly...      #..
8130: 20 20 20 20 20 20 69 66 20 7b 5b 68 61 73 52 75        if {[hasRu
8140: 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 6e 61 74 69  ntimeOption nati
8150: 76 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ve]} then {..   
8160: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
8170: 23 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e 20 74  # NOTE: Return t
8180: 68 65 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73  he mixed-mode as
8190: 73 65 6d 62 6c 79 20 66 69 6c 65 20 6e 61 6d 65  sembly file name
81a0: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
81b0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 66 69        return [fi
81c0: 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5c 0d  le nativename \.
81d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69  .            [fi
81e0: 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 42 69 6e 61  le join [getBina
81f0: 72 79 44 69 72 65 63 74 6f 72 79 5d 20 24 70 6c  ryDirectory] $pl
8200: 61 74 66 6f 72 6d 20 53 79 73 74 65 6d 2e 44 61  atform System.Da
8210: 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 5d 5d 0d  ta.SQLite.dll]].
8220: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
8230: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
8240: 45 3a 20 41 72 65 20 77 65 20 61 74 74 65 6d 70  E: Are we attemp
8250: 74 69 6e 67 20 74 6f 20 61 75 74 6f 6d 61 74 69  ting to automati
8260: 63 61 6c 6c 79 20 64 65 74 65 63 74 20 77 68 65  cally detect whe
8270: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 0d  ther or not the.
8280: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69  .      #       i
8290: 6e 74 65 72 6f 70 20 61 73 73 65 6d 62 6c 79 20  nterop assembly 
82a0: 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 3f 0d  should be used?.
82b0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
82c0: 73 65 74 20 61 75 74 6f 6d 61 74 69 63 20 5b 65  set automatic [e
82d0: 78 70 72 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e  xpr {[string len
82e0: 67 74 68 20 24 73 74 61 6e 64 61 72 64 5d 20 3d  gth $standard] =
82f0: 3d 20 30 7d 5d 0d 0a 0d 0a 20 20 20 20 20 20 23  = 0}]....      #
8300: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
8310: 46 69 72 73 74 2c 20 69 6e 20 65 69 74 68 65 72  First, in either
8320: 20 22 61 75 74 6f 6d 61 74 69 63 22 20 6f 72 20   "automatic" or 
8330: 22 6e 6f 6e 2d 73 74 61 6e 64 61 72 64 22 20 6d  "non-standard" m
8340: 6f 64 65 73 2c 20 61 74 74 65 6d 70 74 0d 0a 20  odes, attempt.. 
8350: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 6f 20       #       to 
8360: 66 69 6e 64 20 74 68 65 20 6e 61 74 69 76 65 2d  find the native-
8370: 6f 6e 6c 79 20 69 6e 74 65 72 6f 70 20 61 73 73  only interop ass
8380: 65 6d 62 6c 79 2e 0d 0a 20 20 20 20 20 20 23 0d  embly...      #.
8390: 0a 20 20 20 20 20 20 69 66 20 7b 24 61 75 74 6f  .      if {$auto
83a0: 6d 61 74 69 63 20 7c 7c 20 21 24 73 74 61 6e 64  matic || !$stand
83b0: 61 72 64 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ard} then {..   
83c0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
83d0: 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20  # NOTE: Attempt 
83e0: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
83f0: 20 6e 61 74 69 76 65 2d 6f 6e 6c 79 20 69 6e 74   native-only int
8400: 65 72 6f 70 20 61 73 73 65 6d 62 6c 79 20 66 69  erop assembly fi
8410: 6c 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  le..        #   
8420: 20 20 20 20 6e 61 6d 65 20 66 6f 72 20 74 68 69      name for thi
8430: 73 20 70 6c 61 74 66 6f 72 6d 20 61 6e 64 20 74  s platform and t
8440: 68 65 6e 20 72 65 74 75 72 6e 20 69 74 2e 0d 0a  hen return it...
8450: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
8460: 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e     foreach fileN
8470: 61 6d 65 4f 6e 6c 79 20 5b 67 65 74 49 6e 74 65  ameOnly [getInte
8480: 72 6f 70 41 73 73 65 6d 62 6c 79 46 69 6c 65 4e  ropAssemblyFileN
8490: 61 6d 65 73 4f 6e 6c 79 5d 20 7b 0d 0a 20 20 20  amesOnly] {..   
84a0: 20 20 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e         set fileN
84b0: 61 6d 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65  ame [file native
84c0: 6e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  name \..        
84d0: 20 20 20 20 20 20 5b 66 69 6c 65 20 6a 6f 69 6e        [file join
84e0: 20 5b 67 65 74 42 69 6e 61 72 79 44 69 72 65 63   [getBinaryDirec
84f0: 74 6f 72 79 5d 20 24 70 6c 61 74 66 6f 72 6d 20  tory] $platform 
8500: 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 5d 5d 0d  $fileNameOnly]].
8510: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  ...          if 
8520: 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 66  {[file exists $f
8530: 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b  ileName]} then {
8540: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ..            re
8550: 74 75 72 6e 20 24 66 69 6c 65 4e 61 6d 65 0d 0a  turn $fileName..
8560: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
8570: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
8580: 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
8590: 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 6e 2c 20    # NOTE: Then, 
85a0: 69 6e 20 65 69 74 68 65 72 20 22 61 75 74 6f 6d  in either "autom
85b0: 61 74 69 63 22 20 6f 72 20 22 73 74 61 6e 64 61  atic" or "standa
85c0: 72 64 22 20 6d 6f 64 65 73 2c 20 61 74 74 65 6d  rd" modes, attem
85d0: 70 74 20 74 6f 0d 0a 20 20 20 20 20 20 23 20 20  pt to..      #  
85e0: 20 20 20 20 20 66 69 6e 64 20 74 68 65 20 73 74       find the st
85f0: 61 6e 64 61 72 64 20 53 51 4c 69 74 65 20 6c 69  andard SQLite li
8600: 62 72 61 72 79 2e 0d 0a 20 20 20 20 20 20 23 0d  brary...      #.
8610: 0a 20 20 20 20 20 20 69 66 20 7b 24 61 75 74 6f  .      if {$auto
8620: 6d 61 74 69 63 20 7c 7c 20 24 73 74 61 6e 64 61  matic || $standa
8630: 72 64 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  rd} then {..    
8640: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
8650: 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74   NOTE: Attempt t
8660: 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
8670: 6e 61 74 69 76 65 2d 6f 6e 6c 79 20 73 74 61 6e  native-only stan
8680: 64 61 72 64 20 53 51 4c 69 74 65 20 6c 69 62 72  dard SQLite libr
8690: 61 72 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ary..        #  
86a0: 20 20 20 20 20 66 69 6c 65 20 6e 61 6d 65 20 66       file name f
86b0: 6f 72 20 74 68 69 73 20 70 6c 61 74 66 6f 72 6d  or this platform
86c0: 20 61 6e 64 20 74 68 65 6e 20 72 65 74 75 72 6e   and then return
86d0: 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d   it...        #.
86e0: 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68  .        foreach
86f0: 20 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 5b 67   fileNameOnly [g
8700: 65 74 4e 61 74 69 76 65 4c 69 62 72 61 72 79 46  etNativeLibraryF
8710: 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79 5d 20 7b 0d  ileNamesOnly] {.
8720: 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20 66  .          set f
8730: 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6e 61  ileName [file na
8740: 74 69 76 65 6e 61 6d 65 20 5c 0d 0a 20 20 20 20  tivename \..    
8750: 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20            [file 
8760: 6a 6f 69 6e 20 5b 67 65 74 42 69 6e 61 72 79 44  join [getBinaryD
8770: 69 72 65 63 74 6f 72 79 5d 20 24 70 6c 61 74 66  irectory] $platf
8780: 6f 72 6d 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c  orm $fileNameOnl
8790: 79 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  y]]....         
87a0: 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74   if {[file exist
87b0: 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68  s $fileName]} th
87c0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
87d0: 20 20 72 65 74 75 72 6e 20 24 66 69 6c 65 4e 61    return $fileNa
87e0: 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  me..          }.
87f0: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
8800: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
8810: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 61        # NOTE: Wa
8820: 73 20 74 68 65 20 6d 61 6e 61 67 65 64 20 61 73  s the managed as
8830: 73 65 6d 62 6c 79 20 63 6f 6d 70 69 6c 65 64 20  sembly compiled 
8840: 65 78 70 65 63 74 69 6e 67 20 74 6f 20 64 65 61  expecting to dea
8850: 6c 20 77 69 74 68 20 74 68 65 0d 0a 20 20 20 20  l with the..    
8860: 20 20 23 20 20 20 20 20 20 20 73 74 61 6e 64 61    #       standa
8870: 72 64 20 63 6f 72 65 20 6c 69 62 72 61 72 79 3f  rd core library?
8880: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
8890: 20 69 66 20 7b 5b 68 61 76 65 53 51 4c 69 74 65   if {[haveSQLite
88a0: 44 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 20 53  DefineConstant S
88b0: 51 4c 49 54 45 5f 53 54 41 4e 44 41 52 44 5d 7d  QLITE_STANDARD]}
88c0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
88d0: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
88e0: 54 45 3a 20 46 61 6c 6c 62 61 63 6b 20 74 6f 20  TE: Fallback to 
88f0: 72 65 74 75 72 6e 69 6e 67 20 74 68 65 20 6e 61  returning the na
8900: 74 69 76 65 2d 6f 6e 6c 79 20 73 74 61 6e 64 61  tive-only standa
8910: 72 64 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72  rd SQLite librar
8920: 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  y..        #    
8930: 20 20 20 66 69 6c 65 20 6e 61 6d 65 20 66 6f 72     file name for
8940: 20 74 68 65 20 70 6c 61 74 66 6f 72 6d 2e 0d 0a   the platform...
8950: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
8960: 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 73     set fileNames
8970: 4f 6e 6c 79 20 5b 67 65 74 4e 61 74 69 76 65 4c  Only [getNativeL
8980: 69 62 72 61 72 79 46 69 6c 65 4e 61 6d 65 73 4f  ibraryFileNamesO
8990: 6e 6c 79 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  nly]....        
89a0: 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 66 69  if {[llength $fi
89b0: 6c 65 4e 61 6d 65 73 4f 6e 6c 79 5d 20 3d 3d 20  leNamesOnly] == 
89c0: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
89d0: 20 20 20 20 20 72 65 74 75 72 6e 20 22 22 0d 0a       return ""..
89e0: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
89f0: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 66 69 6c       return [fil
8a00: 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69  e nativename [fi
8a10: 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20  le join \..     
8a20: 20 20 20 20 20 20 20 5b 67 65 74 42 69 6e 61 72         [getBinar
8a30: 79 44 69 72 65 63 74 6f 72 79 5d 20 24 70 6c 61  yDirectory] $pla
8a40: 74 66 6f 72 6d 20 5b 6c 69 6e 64 65 78 20 24 66  tform [lindex $f
8a50: 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79 20 30 5d 5d  ileNamesOnly 0]]
8a60: 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  ]..      } else 
8a70: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
8a80: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 61        # NOTE: Fa
8a90: 6c 6c 62 61 63 6b 20 74 6f 20 72 65 74 75 72 6e  llback to return
8aa0: 69 6e 67 20 74 68 65 20 6e 61 74 69 76 65 2d 6f  ing the native-o
8ab0: 6e 6c 79 20 69 6e 74 65 72 6f 70 20 61 73 73 65  nly interop asse
8ac0: 6d 62 6c 79 20 66 69 6c 65 0d 0a 20 20 20 20 20  mbly file..     
8ad0: 20 20 20 23 20 20 20 20 20 20 20 6e 61 6d 65 20     #       name 
8ae0: 66 6f 72 20 74 68 65 20 70 6c 61 74 66 6f 72 6d  for the platform
8af0: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
8b00: 20 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61        set fileNa
8b10: 6d 65 73 4f 6e 6c 79 20 5b 67 65 74 49 6e 74 65  mesOnly [getInte
8b20: 72 6f 70 41 73 73 65 6d 62 6c 79 46 69 6c 65 4e  ropAssemblyFileN
8b30: 61 6d 65 73 4f 6e 6c 79 5d 0d 0a 0d 0a 20 20 20  amesOnly]....   
8b40: 20 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67 74       if {[llengt
8b50: 68 20 24 66 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79  h $fileNamesOnly
8b60: 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
8b70: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
8b80: 20 22 22 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a   ""..        }..
8b90: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
8ba0: 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d   [file nativenam
8bb0: 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a  e [file join \..
8bc0: 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74              [get
8bd0: 42 69 6e 61 72 79 44 69 72 65 63 74 6f 72 79 5d  BinaryDirectory]
8be0: 20 24 70 6c 61 74 66 6f 72 6d 20 5b 6c 69 6e 64   $platform [lind
8bf0: 65 78 20 24 66 69 6c 65 4e 61 6d 65 73 4f 6e 6c  ex $fileNamesOnl
8c00: 79 20 30 5d 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d  y 0]]]..      }.
8c10: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
8c20: 72 6f 63 20 67 65 74 43 6f 6d 6d 6f 6e 44 69 72  roc getCommonDir
8c30: 65 63 74 6f 72 79 20 7b 7d 20 7b 0d 0a 20 20 20  ectory {} {..   
8c40: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
8c50: 54 45 3a 20 54 68 69 73 20 70 72 6f 63 65 64 75  TE: This procedu
8c60: 72 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 64  re returns the d
8c70: 69 72 65 63 74 6f 72 79 20 77 68 65 72 65 20 74  irectory where t
8c80: 68 65 20 74 65 73 74 20 73 63 72 69 70 74 73 0d  he test scripts.
8c90: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73  .      #       s
8ca0: 68 6f 75 6c 64 20 62 65 20 6c 6f 63 61 74 65 64  hould be located
8cb0: 2e 20 20 42 79 20 64 65 66 61 75 6c 74 2c 20 74  .  By default, t
8cc0: 68 69 73 20 6a 75 73 74 20 72 65 74 75 72 6e 73  his just returns
8cd0: 20 74 68 65 20 45 61 67 6c 65 0d 0a 20 20 20 20   the Eagle..    
8ce0: 20 20 23 20 20 20 20 20 20 20 62 69 6e 61 72 79    #       binary
8cf0: 20 64 69 72 65 63 74 6f 72 79 2e 0d 0a 20 20 20   directory...   
8d00: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
8d10: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 63  [info exists ::c
8d20: 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79 5d  ommon_directory]
8d30: 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
8d40: 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20   [string length 
8d50: 24 3a 3a 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74  $::common_direct
8d60: 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ory] > 0} then {
8d70: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
8d80: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65       # NOTE: The
8d90: 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65   location of the
8da0: 20 63 6f 6d 6d 6f 6e 20 64 69 72 65 63 74 6f 72   common director
8db0: 79 20 68 61 73 20 62 65 65 6e 20 73 65 74 3b 0d  y has been set;.
8dc0: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
8dd0: 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20   therefore, use 
8de0: 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  it...        #..
8df0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24          return $
8e00: 3a 3a 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f  ::common_directo
8e10: 72 79 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  ry..      } else
8e20: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
8e30: 20 3a 3a 76 65 6e 64 6f 72 5f 64 69 72 65 63 74   ::vendor_direct
8e40: 6f 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  ory] && \..     
8e50: 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
8e60: 67 74 68 20 24 3a 3a 76 65 6e 64 6f 72 5f 64 69  gth $::vendor_di
8e70: 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68  rectory] > 0} th
8e80: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
8e90: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
8ea0: 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66   The location of
8eb0: 20 74 68 65 20 76 65 6e 64 6f 72 20 64 69 72 65   the vendor dire
8ec0: 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 73  ctory has been s
8ed0: 65 74 3b 0d 0a 20 20 20 20 20 20 20 20 23 20 20  et;..        #  
8ee0: 20 20 20 20 20 74 68 65 72 65 66 6f 72 65 2c 20       therefore, 
8ef0: 75 73 65 20 69 74 2e 0d 0a 20 20 20 20 20 20 20  use it...       
8f00: 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   #..        retu
8f10: 72 6e 20 24 3a 3a 76 65 6e 64 6f 72 5f 64 69 72  rn $::vendor_dir
8f20: 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20  ectory..      } 
8f30: 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20 65 78  elseif {[info ex
8f40: 69 73 74 73 20 3a 3a 74 63 6c 5f 6c 69 62 72 61  ists ::tcl_libra
8f50: 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  ry] && \..      
8f60: 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67      [string leng
8f70: 74 68 20 24 3a 3a 74 63 6c 5f 6c 69 62 72 61 72  th $::tcl_librar
8f80: 79 5d 20 3e 20 30 20 26 26 20 5c 0d 0a 20 20 20  y] > 0 && \..   
8f90: 20 20 20 20 20 20 20 5b 66 69 6c 65 20 69 73 64         [file isd
8fa0: 69 72 65 63 74 6f 72 79 20 24 3a 3a 74 63 6c 5f  irectory $::tcl_
8fb0: 6c 69 62 72 61 72 79 5d 7d 20 74 68 65 6e 20 7b  library]} then {
8fc0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
8fd0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65       # NOTE: The
8fe0: 20 76 61 72 69 61 62 6c 65 20 77 69 74 68 20 74   variable with t
8ff0: 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74  he location of t
9000: 68 65 20 73 63 72 69 70 74 20 6c 69 62 72 61 72  he script librar
9010: 79 20 69 73 0d 0a 20 20 20 20 20 20 20 20 23 20  y is..        # 
9020: 20 20 20 20 20 20 73 65 74 20 61 6e 64 20 61 70        set and ap
9030: 70 65 61 72 73 20 74 6f 20 62 65 20 61 20 72 65  pears to be a re
9040: 61 6c 20 64 69 72 65 63 74 6f 72 79 20 28 69 2e  al directory (i.
9050: 65 2e 20 6e 6f 74 20 65 6d 62 65 64 64 65 64 0d  e. not embedded.
9060: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
9070: 20 77 69 74 68 69 6e 20 61 20 66 69 6c 65 29 3b   within a file);
9080: 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20   therefore, use 
9090: 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  it...        #..
90a0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24          return $
90b0: 3a 3a 74 63 6c 5f 6c 69 62 72 61 72 79 0d 0a 20  ::tcl_library.. 
90c0: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
90d0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
90e0: 20 20 23 20 4e 4f 54 45 3a 20 46 61 6c 6c 62 61    # NOTE: Fallba
90f0: 63 6b 20 74 6f 20 74 68 65 20 64 69 72 65 63 74  ck to the direct
9100: 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ory containing t
9110: 68 65 20 65 78 65 63 75 74 61 62 6c 65 2e 0d 0a  he executable...
9120: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
9130: 20 20 20 72 65 74 75 72 6e 20 5b 69 6e 66 6f 20     return [info 
9140: 62 69 6e 61 72 79 5d 0d 0a 20 20 20 20 20 20 7d  binary]..      }
9150: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
9160: 70 72 6f 63 20 67 65 74 44 61 74 61 62 61 73 65  proc getDatabase
9170: 44 69 72 65 63 74 6f 72 79 20 7b 7d 20 7b 0d 0a  Directory {} {..
9180: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
9190: 20 4e 4f 54 45 3a 20 54 68 69 73 20 70 72 6f 63   NOTE: This proc
91a0: 65 64 75 72 65 20 72 65 74 75 72 6e 73 20 74 68  edure returns th
91b0: 65 20 64 69 72 65 63 74 6f 72 79 20 77 68 65 72  e directory wher
91c0: 65 20 74 68 65 20 74 65 73 74 20 64 61 74 61 62  e the test datab
91d0: 61 73 65 73 0d 0a 20 20 20 20 20 20 23 20 20 20  ases..      #   
91e0: 20 20 20 20 73 68 6f 75 6c 64 20 62 65 20 6c 6f      should be lo
91f0: 63 61 74 65 64 2e 20 20 42 79 20 64 65 66 61 75  cated.  By defau
9200: 6c 74 2c 20 74 68 69 73 20 6a 75 73 74 20 75 73  lt, this just us
9210: 65 73 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  es the temporary
9220: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
9230: 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 66 69 67  directory config
9240: 75 72 65 64 20 66 6f 72 20 74 68 69 73 20 73 79  ured for this sy
9250: 73 74 65 6d 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  stem...      #..
9260: 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20        if {[info 
9270: 65 78 69 73 74 73 20 3a 3a 64 61 74 61 62 61 73  exists ::databas
9280: 65 5f 64 69 72 65 63 74 6f 72 79 5d 20 26 26 20  e_directory] && 
9290: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74  \..          [st
92a0: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 64  ring length $::d
92b0: 61 74 61 62 61 73 65 5f 64 69 72 65 63 74 6f 72  atabase_director
92c0: 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  y] > 0} then {..
92d0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
92e0: 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c     # NOTE: The l
92f0: 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64  ocation of the d
9300: 61 74 61 62 61 73 65 20 64 69 72 65 63 74 6f 72  atabase director
9310: 79 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72  y has been overr
9320: 69 64 64 65 6e 3b 0d 0a 20 20 20 20 20 20 20 20  idden;..        
9330: 23 20 20 20 20 20 20 20 74 68 65 72 65 66 6f 72  #       therefor
9340: 65 2c 20 75 73 65 20 69 74 2e 0d 0a 20 20 20 20  e, use it...    
9350: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
9360: 65 74 75 72 6e 20 24 3a 3a 64 61 74 61 62 61 73  eturn $::databas
9370: 65 5f 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20  e_directory..   
9380: 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e     } elseif {[in
9390: 66 6f 20 65 78 69 73 74 73 20 3a 3a 73 63 72 61  fo exists ::scra
93a0: 74 63 68 5f 64 69 72 65 63 74 6f 72 79 5d 20 26  tch_directory] &
93b0: 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b  & \..          [
93c0: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a  string length $:
93d0: 3a 73 63 72 61 74 63 68 5f 64 69 72 65 63 74 6f  :scratch_directo
93e0: 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  ry] > 0} then {.
93f0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
9400: 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20      # NOTE: The 
9410: 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  location of the 
9420: 73 63 72 61 74 63 68 20 64 69 72 65 63 74 6f 72  scratch director
9430: 79 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72  y has been overr
9440: 69 64 64 65 6e 3b 0d 0a 20 20 20 20 20 20 20 20  idden;..        
9450: 23 20 20 20 20 20 20 20 74 68 65 72 65 66 6f 72  #       therefor
9460: 65 2c 20 75 73 65 20 69 74 2e 0d 0a 20 20 20 20  e, use it...    
9470: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
9480: 65 74 75 72 6e 20 24 3a 3a 73 63 72 61 74 63 68  eturn $::scratch
9490: 5f 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20  _directory..    
94a0: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
94b0: 20 20 20 20 72 65 74 75 72 6e 20 5b 67 65 74 54      return [getT
94c0: 65 6d 70 6f 72 61 72 79 50 61 74 68 5d 0d 0a 20  emporaryPath].. 
94d0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
94e0: 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 54 65  ..    proc getTe
94f0: 6d 70 6f 72 61 72 79 44 69 72 65 63 74 6f 72 79  mporaryDirectory
9500: 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a   {} {..      #..
9510: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68        # NOTE: Th
9520: 69 73 20 70 72 6f 63 65 64 75 72 65 20 72 65 74  is procedure ret
9530: 75 72 6e 73 20 74 68 65 20 64 69 72 65 63 74 6f  urns the directo
9540: 72 79 20 77 68 65 72 65 20 74 68 65 20 74 65 6d  ry where the tem
9550: 70 6f 72 61 72 79 20 66 69 6c 65 73 0d 0a 20 20  porary files..  
9560: 20 20 20 20 23 20 20 20 20 20 20 20 73 68 6f 75      #       shou
9570: 6c 64 20 62 65 20 6c 6f 63 61 74 65 64 2e 20 20  ld be located.  
9580: 42 79 20 64 65 66 61 75 6c 74 2c 20 74 68 69 73  By default, this
9590: 20 6a 75 73 74 20 75 73 65 73 20 74 68 65 20 74   just uses the t
95a0: 65 6d 70 6f 72 61 72 79 0d 0a 20 20 20 20 20 20  emporary..      
95b0: 23 20 20 20 20 20 20 20 64 69 72 65 63 74 6f 72  #       director
95c0: 79 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72  y configured for
95d0: 20 74 68 69 73 20 73 79 73 74 65 6d 2e 0d 0a 20   this system... 
95e0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
95f0: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
9600: 3a 74 65 6d 70 6f 72 61 72 79 5f 64 69 72 65 63  :temporary_direc
9610: 74 6f 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20  tory] && \..    
9620: 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65        [string le
9630: 6e 67 74 68 20 24 3a 3a 74 65 6d 70 6f 72 61 72  ngth $::temporar
9640: 79 5f 64 69 72 65 63 74 6f 72 79 5d 20 3e 20 30  y_directory] > 0
9650: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
9660: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
9670: 4f 54 45 3a 20 54 68 65 20 6c 6f 63 61 74 69 6f  OTE: The locatio
9680: 6e 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61  n of the tempora
9690: 72 79 20 64 69 72 65 63 74 6f 72 79 20 68 61 73  ry directory has
96a0: 20 62 65 65 6e 20 6f 76 65 72 72 69 64 64 65 6e   been overridden
96b0: 3b 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  ;..        #    
96c0: 20 20 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73     therefore, us
96d0: 65 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23  e it...        #
96e0: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
96f0: 20 24 3a 3a 74 65 6d 70 6f 72 61 72 79 5f 64 69   $::temporary_di
9700: 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d  rectory..      }
9710: 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20 65   elseif {[info e
9720: 78 69 73 74 73 20 3a 3a 73 63 72 61 74 63 68 5f  xists ::scratch_
9730: 64 69 72 65 63 74 6f 72 79 5d 20 26 26 20 5c 0d  directory] && \.
9740: 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69  .          [stri
9750: 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 73 63 72  ng length $::scr
9760: 61 74 63 68 5f 64 69 72 65 63 74 6f 72 79 5d 20  atch_directory] 
9770: 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
9780: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
9790: 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c 6f 63 61  # NOTE: The loca
97a0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 63 72 61  tion of the scra
97b0: 74 63 68 20 64 69 72 65 63 74 6f 72 79 20 68 61  tch directory ha
97c0: 73 20 62 65 65 6e 20 6f 76 65 72 72 69 64 64 65  s been overridde
97d0: 6e 3b 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  n;..        #   
97e0: 20 20 20 20 74 68 65 72 65 66 6f 72 65 2c 20 75      therefore, u
97f0: 73 65 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20  se it...        
9800: 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  #..        retur
9810: 6e 20 24 3a 3a 73 63 72 61 74 63 68 5f 64 69 72  n $::scratch_dir
9820: 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20  ectory..      } 
9830: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
9840: 72 65 74 75 72 6e 20 5b 67 65 74 54 65 6d 70 6f  return [getTempo
9850: 72 61 72 79 50 61 74 68 5d 0d 0a 20 20 20 20 20  raryPath]..     
9860: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
9870: 20 20 70 72 6f 63 20 67 65 74 45 78 65 63 75 74    proc getExecut
9880: 65 4f 6e 53 65 74 75 70 20 7b 7d 20 7b 0d 0a 20  eOnSetup {} {.. 
9890: 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65       if {[info e
98a0: 78 69 73 74 73 20 3a 3a 65 78 65 63 75 74 65 5f  xists ::execute_
98b0: 6f 6e 5f 73 65 74 75 70 5d 20 26 26 20 5c 0d 0a  on_setup] && \..
98c0: 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e            [strin
98d0: 67 20 6c 65 6e 67 74 68 20 24 3a 3a 65 78 65 63  g length $::exec
98e0: 75 74 65 5f 6f 6e 5f 73 65 74 75 70 5d 20 3e 20  ute_on_setup] > 
98f0: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
9900: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
9910: 4e 4f 54 45 3a 20 52 65 74 75 72 6e 20 74 68 65  NOTE: Return the
9920: 20 63 6f 6e 66 69 67 75 72 65 64 20 53 51 4c 20   configured SQL 
9930: 74 6f 20 65 78 65 63 75 74 65 20 64 75 72 69 6e  to execute durin
9940: 67 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  g the connection
9950: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
9960: 20 20 73 65 74 75 70 20 70 72 6f 63 65 64 75 72    setup procedur
9970: 65 20 28 69 2e 65 2e 20 66 6f 72 20 65 76 65 72  e (i.e. for ever
9980: 79 20 74 65 73 74 20 64 61 74 61 62 61 73 65 20  y test database 
9990: 63 6f 6e 6e 65 63 74 69 6f 6e 29 2e 0d 0a 20 20  connection)...  
99a0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
99b0: 20 72 65 74 75 72 6e 20 24 3a 3a 65 78 65 63 75   return $::execu
99c0: 74 65 5f 6f 6e 5f 73 65 74 75 70 0d 0a 20 20 20  te_on_setup..   
99d0: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
99e0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
99f0: 23 20 4e 4f 54 45 3a 20 42 79 20 64 65 66 61 75  # NOTE: By defau
9a00: 6c 74 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20  lt, there is no 
9a10: 53 51 4c 20 74 6f 20 65 78 65 63 75 74 65 20 64  SQL to execute d
9a20: 75 72 69 6e 67 20 74 68 65 20 63 6f 6e 6e 65 63  uring the connec
9a30: 74 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20 23 20  tion..        # 
9a40: 20 20 20 20 20 20 73 65 74 75 70 20 70 72 6f 63        setup proc
9a50: 65 64 75 72 65 20 28 69 2e 65 2e 20 66 6f 72 20  edure (i.e. for 
9a60: 65 76 65 72 79 20 74 65 73 74 20 64 61 74 61 62  every test datab
9a70: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 29 2e  ase connection).
9a80: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
9a90: 20 20 20 20 20 72 65 74 75 72 6e 20 22 22 0d 0a       return ""..
9aa0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
9ab0: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 53  ...    proc getS
9ac0: 74 72 69 6e 67 4d 61 70 46 6f 72 54 63 6c 45 73  tringMapForTclEs
9ad0: 63 61 70 65 20 7b 7d 20 7b 0d 0a 20 20 20 20 20  cape {} {..     
9ae0: 20 72 65 74 75 72 6e 20 5b 6c 69 73 74 20 5c 5c   return [list \\
9af0: 20 5c 5c 5c 5c 20 5c 5b 20 5c 5c 5c 5b 20 5c 5d   \\\\ \[ \\\[ \]
9b00: 20 5c 5c 5c 5d 20 5c 24 20 5c 5c 5c 24 5d 0d 0a   \\\] \$ \\\$]..
9b10: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
9b20: 6f 63 20 67 65 74 54 65 73 74 4f 76 65 72 72 69  oc getTestOverri
9b30: 64 65 73 50 72 65 61 6d 62 6c 65 20 7b 20 7b 65  desPreamble { {e
9b40: 78 74 72 61 56 61 72 4e 61 6d 65 73 20 22 22 7d  xtraVarNames ""}
9b50: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20   } {..      set 
9b60: 76 61 72 4e 61 6d 65 73 20 5b 6c 69 73 74 5d 0d  varNames [list].
9b70: 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
9b80: 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 61 76 61    # NOTE: If ava
9b90: 69 6c 61 62 6c 65 2c 20 73 74 61 72 74 20 77 69  ilable, start wi
9ba0: 74 68 20 74 68 65 20 6d 61 73 74 65 72 20 6c 69  th the master li
9bb0: 73 74 20 6f 66 20 74 65 73 74 20 6f 76 65 72 72  st of test overr
9bc0: 69 64 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ide..      #    
9bd0: 20 20 20 76 61 72 69 61 62 6c 65 73 2e 0d 0a 20     variables... 
9be0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
9bf0: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
9c00: 3a 74 65 73 74 5f 6f 76 65 72 72 69 64 65 73 5d  :test_overrides]
9c10: 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
9c20: 20 5b 6c 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73   [llength $::tes
9c30: 74 5f 6f 76 65 72 72 69 64 65 73 5d 20 3e 20 30  t_overrides] > 0
9c40: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
9c50: 20 20 65 76 61 6c 20 6c 61 70 70 65 6e 64 20 76    eval lappend v
9c60: 61 72 4e 61 6d 65 73 20 24 3a 3a 74 65 73 74 5f  arNames $::test_
9c70: 6f 76 65 72 72 69 64 65 73 0d 0a 20 20 20 20 20  overrides..     
9c80: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   }....      #.. 
9c90: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20       # NOTE: If 
9ca0: 72 65 71 75 65 73 74 65 64 20 62 79 20 6f 75 72  requested by our
9cb0: 20 63 61 6c 6c 65 72 2c 20 61 64 64 20 61 6e 79   caller, add any
9cc0: 20 61 64 64 69 74 69 6f 6e 61 6c 20 76 61 72 69   additional vari
9cd0: 61 62 6c 65 0d 0a 20 20 20 20 20 20 23 20 20 20  able..      #   
9ce0: 20 20 20 20 6e 61 6d 65 73 20 74 6f 20 63 6f 70      names to cop
9cf0: 79 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 23 0d  y now...      #.
9d00: 0a 20 20 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e  .      if {[llen
9d10: 67 74 68 20 24 65 78 74 72 61 56 61 72 4e 61 6d  gth $extraVarNam
9d20: 65 73 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  es] > 0} then {.
9d30: 0a 20 20 20 20 20 20 20 20 65 76 61 6c 20 6c 61  .        eval la
9d40: 70 70 65 6e 64 20 76 61 72 4e 61 6d 65 73 20 24  ppend varNames $
9d50: 65 78 74 72 61 56 61 72 4e 61 6d 65 73 0d 0a 20  extraVarNames.. 
9d60: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
9d70: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
9d80: 20 42 75 69 6c 64 20 74 68 65 20 73 63 72 69 70   Build the scrip
9d90: 74 20 66 72 61 67 6d 65 6e 74 20 74 6f 20 62 65  t fragment to be
9da0: 20 72 65 74 75 72 6e 65 64 20 62 79 20 70 72 6f   returned by pro
9db0: 63 65 73 73 69 6e 67 20 65 61 63 68 0d 0a 20 20  cessing each..  
9dc0: 20 20 20 20 23 20 20 20 20 20 20 20 76 61 72 69      #       vari
9dd0: 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 61 64  able name and ad
9de0: 64 69 6e 67 20 74 68 65 20 6e 65 63 65 63 65 73  ding the nececes
9df0: 73 61 72 79 20 73 63 72 69 70 74 20 66 72 61 67  sary script frag
9e00: 6d 65 6e 74 73 20 66 6f 72 0d 0a 20 20 20 20 20  ments for..     
9e10: 20 23 20 20 20 20 20 20 20 65 61 63 68 20 6f 6e   #       each on
9e20: 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  e...      #..   
9e30: 20 20 20 73 65 74 20 72 65 73 75 6c 74 20 22 22     set result ""
9e40: 0d 0a 0d 0a 20 20 20 20 20 20 66 6f 72 65 61 63  ....      foreac
9e50: 68 20 76 61 72 4e 61 6d 65 20 24 76 61 72 4e 61  h varName $varNa
9e60: 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  mes {..        #
9e70: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
9e80: 3a 20 42 75 69 6c 64 20 74 68 65 20 71 75 61 6c  : Build the qual
9e90: 69 66 69 65 64 20 67 6c 6f 62 61 6c 20 76 61 72  ified global var
9ea0: 69 61 62 6c 65 20 6e 61 6d 65 2e 0d 0a 20 20 20  iable name...   
9eb0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
9ec0: 73 65 74 20 66 75 6c 6c 56 61 72 4e 61 6d 65 20  set fullVarName 
9ed0: 5b 61 70 70 65 6e 64 41 72 67 73 20 3a 3a 20 24  [appendArgs :: $
9ee0: 76 61 72 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20  varName]....    
9ef0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
9f00: 20 4e 4f 54 45 3a 20 44 6f 65 73 20 74 68 65 20   NOTE: Does the 
9f10: 76 61 72 69 61 62 6c 65 20 65 78 69 73 74 20 69  variable exist i
9f20: 6e 20 74 68 69 73 20 69 6e 74 65 72 70 72 65 74  n this interpret
9f30: 65 72 20 63 6f 6e 74 65 78 74 3f 0d 0a 20 20 20  er context?..   
9f40: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
9f50: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
9f60: 20 24 66 75 6c 6c 56 61 72 4e 61 6d 65 5d 7d 20   $fullVarName]} 
9f70: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
9f80: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23    #..          #
9f90: 20 4e 4f 54 45 3a 20 41 70 70 65 6e 64 20 61 20   NOTE: Append a 
9fa0: 73 63 72 69 70 74 20 66 72 61 67 6d 65 6e 74 20  script fragment 
9fb0: 74 6f 20 74 68 65 20 72 65 73 75 6c 74 20 74 68  to the result th
9fc0: 61 74 20 77 69 6c 6c 20 63 6f 72 72 65 63 74 6c  at will correctl
9fd0: 79 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20  y..          #  
9fe0: 20 20 20 20 20 63 6f 70 79 20 61 6e 79 20 63 6f       copy any co
9ff0: 6e 74 61 69 6e 65 64 20 76 61 6c 75 65 20 74 6f  ntained value to
a000: 20 61 6e 6f 74 68 65 72 20 69 6e 74 65 72 70 72   another interpr
a010: 65 74 65 72 20 63 6f 6e 74 65 78 74 2e 0d 0a 20  eter context... 
a020: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
a030: 20 20 20 20 20 20 61 70 70 65 6e 64 20 72 65 73        append res
a040: 75 6c 74 20 5c 6e 20 22 73 65 74 20 22 20 24 66  ult \n "set " $f
a050: 75 6c 6c 56 61 72 4e 61 6d 65 20 22 20 5c 7b 22  ullVarName " \{"
a060: 20 5b 73 74 72 69 6e 67 20 6d 61 70 20 5c 0d 0a   [string map \..
a070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 67                [g
a080: 65 74 53 74 72 69 6e 67 4d 61 70 46 6f 72 54 63  etStringMapForTc
a090: 6c 45 73 63 61 70 65 5d 20 5b 73 65 74 20 24 66  lEscape] [set $f
a0a0: 75 6c 6c 56 61 72 4e 61 6d 65 5d 5d 20 5c 7d 0d  ullVarName]] \}.
a0b0: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
a0c0: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
a0d0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66        # NOTE: If
a0e0: 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 6e 74   the result cont
a0f0: 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  ains one or more
a100: 20 73 63 72 69 70 74 20 66 72 61 67 6d 65 6e 74   script fragment
a110: 73 2c 20 61 70 70 65 6e 64 20 61 0d 0a 20 20 20  s, append a..   
a120: 20 20 20 23 20 20 20 20 20 20 20 6e 65 77 6c 69     #       newli
a130: 6e 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ne...      #..  
a140: 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
a150: 6c 65 6e 67 74 68 20 24 72 65 73 75 6c 74 5d 20  length $result] 
a160: 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
a170: 20 20 20 20 20 61 70 70 65 6e 64 20 72 65 73 75       append resu
a180: 6c 74 20 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a  lt \n..      }..
a190: 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 24  ..      return $
a1a0: 72 65 73 75 6c 74 0d 0a 20 20 20 20 7d 0d 0a 0c  result..    }...
a1b0: 0d 0a 20 20 20 20 70 72 6f 63 20 6d 6f 76 65 53  ..    proc moveS
a1c0: 79 73 74 65 6d 44 61 74 61 53 51 4c 69 74 65 44  ystemDataSQLiteD
a1d0: 6c 6c 43 6f 6e 66 69 67 20 7b 20 7b 72 65 73 74  llConfig { {rest
a1e0: 6f 72 65 20 66 61 6c 73 65 7d 20 7b 76 65 72 62  ore false} {verb
a1f0: 6f 73 65 20 74 72 75 65 7d 20 7d 20 7b 0d 0a 20  ose true} } {.. 
a200: 20 20 20 20 20 73 65 74 20 64 69 72 65 63 74 6f       set directo
a210: 72 79 20 5b 67 65 74 42 69 6e 61 72 79 44 69 72  ry [getBinaryDir
a220: 65 63 74 6f 72 79 5d 0d 0a 0d 0a 20 20 20 20 20  ectory]....     
a230: 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
a240: 67 74 68 20 24 64 69 72 65 63 74 6f 72 79 5d 20  gth $directory] 
a250: 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
a260: 20 20 20 20 20 20 69 66 20 7b 24 76 65 72 62 6f        if {$verbo
a270: 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  se} then {..    
a280: 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
a290: 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
a2a0: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
a2b0: 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73           "---- s
a2c0: 6b 69 70 70 65 64 20 6d 6f 76 69 6e 67 20 5c 22  kipped moving \"
a2d0: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
a2e0: 74 65 2e 64 6c 6c 2e 63 6f 6e 66 69 67 5c 22 2c  te.dll.config\",
a2f0: 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   " \..          
a300: 20 20 20 20 22 6e 6f 20 62 69 6e 61 72 79 20 64      "no binary d
a310: 69 72 65 63 74 6f 72 79 5c 6e 22 5d 0d 0a 20 20  irectory\n"]..  
a320: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
a330: 20 20 20 72 65 74 75 72 6e 0d 0a 20 20 20 20 20     return..     
a340: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 73 65 74 20   }....      set 
a350: 66 69 6c 65 4e 61 6d 65 28 31 29 20 5b 66 69 6c  fileName(1) [fil
a360: 65 20 6e 6f 72 6d 61 6c 69 7a 65 20 5c 0d 0a 20  e normalize \.. 
a370: 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 6a           [file j
a380: 6f 69 6e 20 24 64 69 72 65 63 74 6f 72 79 20 53  oin $directory S
a390: 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
a3a0: 65 2e 64 6c 6c 2e 63 6f 6e 66 69 67 5d 5d 0d 0a  e.dll.config]]..
a3b0: 0d 0a 20 20 20 20 20 20 73 65 74 20 66 69 6c 65  ..      set file
a3c0: 4e 61 6d 65 28 32 29 20 5b 61 70 70 65 6e 64 41  Name(2) [appendA
a3d0: 72 67 73 20 24 66 69 6c 65 4e 61 6d 65 28 31 29  rgs $fileName(1)
a3e0: 20 2e 6d 6f 76 65 64 5d 0d 0a 0d 0a 20 20 20 20   .moved]....    
a3f0: 20 20 69 66 20 7b 24 72 65 73 74 6f 72 65 7d 20    if {$restore} 
a400: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
a410: 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73  if {[file exists
a420: 20 24 66 69 6c 65 4e 61 6d 65 28 32 29 5d 7d 20   $fileName(2)]} 
a430: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
a440: 20 20 66 69 6c 65 20 72 65 6e 61 6d 65 20 24 66    file rename $f
a450: 69 6c 65 4e 61 6d 65 28 32 29 20 24 66 69 6c 65  ileName(2) $file
a460: 4e 61 6d 65 28 31 29 0d 0a 0d 0a 20 20 20 20 20  Name(1)....     
a470: 20 20 20 20 20 69 66 20 7b 24 76 65 72 62 6f 73       if {$verbos
a480: 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  e} then {..     
a490: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
a4a0: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
a4b0: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
a4c0: 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
a4d0: 2d 20 6d 6f 76 65 64 20 5c 22 22 20 24 66 69 6c  - moved \"" $fil
a4e0: 65 4e 61 6d 65 28 32 29 20 22 5c 22 20 74 6f 20  eName(2) "\" to 
a4f0: 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  \"" \..         
a500: 20 20 20 20 20 20 20 24 66 69 6c 65 4e 61 6d 65         $fileName
a510: 28 31 29 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20  (1) \"\n]..     
a520: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
a530: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
a540: 20 20 20 20 69 66 20 7b 24 76 65 72 62 6f 73 65      if {$verbose
a550: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
a560: 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
a570: 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
a580: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
a590: 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
a5a0: 20 73 6b 69 70 70 65 64 20 6d 6f 76 69 6e 67 20   skipped moving 
a5b0: 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 28 32 29  \"" $fileName(2)
a5c0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
a5d0: 20 20 20 20 22 5c 22 2c 20 69 74 20 64 6f 65 73      "\", it does
a5e0: 20 6e 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a   not exist\n"]..
a5f0: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
a600: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20       }..      } 
a610: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
a620: 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73  if {[file exists
a630: 20 24 66 69 6c 65 4e 61 6d 65 28 31 29 5d 7d 20   $fileName(1)]} 
a640: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
a650: 20 20 66 69 6c 65 20 72 65 6e 61 6d 65 20 24 66    file rename $f
a660: 69 6c 65 4e 61 6d 65 28 31 29 20 24 66 69 6c 65  ileName(1) $file
a670: 4e 61 6d 65 28 32 29 0d 0a 0d 0a 20 20 20 20 20  Name(2)....     
a680: 20 20 20 20 20 69 66 20 7b 24 76 65 72 62 6f 73       if {$verbos
a690: 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  e} then {..     
a6a0: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
a6b0: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
a6c0: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
a6d0: 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
a6e0: 2d 20 6d 6f 76 65 64 20 5c 22 22 20 24 66 69 6c  - moved \"" $fil
a6f0: 65 4e 61 6d 65 28 31 29 20 22 5c 22 20 74 6f 20  eName(1) "\" to 
a700: 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  \"" \..         
a710: 20 20 20 20 20 20 20 24 66 69 6c 65 4e 61 6d 65         $fileName
a720: 28 32 29 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20  (2) \"\n]..     
a730: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
a740: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
a750: 20 20 20 20 69 66 20 7b 24 76 65 72 62 6f 73 65      if {$verbose
a760: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
a770: 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
a780: 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
a790: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
a7a0: 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
a7b0: 20 73 6b 69 70 70 65 64 20 6d 6f 76 69 6e 67 20   skipped moving 
a7c0: 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 28 31 29  \"" $fileName(1)
a7d0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
a7e0: 20 20 20 20 22 5c 22 2c 20 69 74 20 64 6f 65 73      "\", it does
a7f0: 20 6e 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a   not exist\n"]..
a800: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
a810: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
a820: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
a830: 72 6f 63 20 77 72 69 74 65 53 79 73 74 65 6d 44  roc writeSystemD
a840: 61 74 61 53 51 4c 69 74 65 44 6c 6c 43 6f 6e 66  ataSQLiteDllConf
a850: 69 67 20 7b 20 64 61 74 61 20 7b 76 65 72 62 6f  ig { data {verbo
a860: 73 65 20 74 72 75 65 7d 20 7d 20 7b 0d 0a 20 20  se true} } {..  
a870: 20 20 20 20 73 65 74 20 64 69 72 65 63 74 6f 72      set director
a880: 79 20 5b 67 65 74 42 69 6e 61 72 79 44 69 72 65  y [getBinaryDire
a890: 63 74 6f 72 79 5d 0d 0a 0d 0a 20 20 20 20 20 20  ctory]....      
a8a0: 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
a8b0: 74 68 20 24 64 69 72 65 63 74 6f 72 79 5d 20 3d  th $directory] =
a8c0: 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
a8d0: 20 20 20 20 20 69 66 20 7b 24 76 65 72 62 6f 73       if {$verbos
a8e0: 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  e} then {..     
a8f0: 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
a900: 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
a910: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
a920: 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6b          "---- sk
a930: 69 70 70 65 64 20 6d 6f 76 69 6e 67 20 5c 22 53  ipped moving \"S
a940: 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
a950: 65 2e 64 6c 6c 2e 63 6f 6e 66 69 67 5c 22 2c 20  e.dll.config\", 
a960: 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
a970: 20 20 20 22 6e 6f 20 62 69 6e 61 72 79 20 64 69     "no binary di
a980: 72 65 63 74 6f 72 79 5c 6e 22 5d 0d 0a 20 20 20  rectory\n"]..   
a990: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
a9a0: 20 20 72 65 74 75 72 6e 0d 0a 20 20 20 20 20 20    return..      
a9b0: 7d 0d 0a 0d 0a 20 20 20 20 20 20 73 65 74 20 66  }....      set f
a9c0: 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6e 6f  ileName [file no
a9d0: 72 6d 61 6c 69 7a 65 20 5c 0d 0a 20 20 20 20 20  rmalize \..     
a9e0: 20 20 20 20 20 5b 66 69 6c 65 20 6a 6f 69 6e 20       [file join 
a9f0: 24 64 69 72 65 63 74 6f 72 79 20 53 79 73 74 65  $directory Syste
aa00: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c  m.Data.SQLite.dl
aa10: 6c 2e 63 6f 6e 66 69 67 5d 5d 0d 0a 0d 0a 20 20  l.config]]....  
aa20: 20 20 20 20 77 72 69 74 65 46 69 6c 65 20 24 66      writeFile $f
aa30: 69 6c 65 4e 61 6d 65 20 24 64 61 74 61 0d 0a 0d  ileName $data...
aa40: 0a 20 20 20 20 20 20 69 66 20 7b 24 76 65 72 62  .      if {$verb
aa50: 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ose} then {..   
aa60: 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
aa70: 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20  st_channel \..  
aa80: 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
aa90: 77 72 6f 74 65 20 5c 22 53 79 73 74 65 6d 2e 44  wrote \"System.D
aaa0: 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 2e 63  ata.SQLite.dll.c
aab0: 6f 6e 66 69 67 5c 22 5c 6e 22 0d 0a 20 20 20 20  onfig\"\n"..    
aac0: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74    }....      ret
aad0: 75 72 6e 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20  urn $fileName.. 
aae0: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
aaf0: 63 20 6d 6f 76 65 45 61 67 6c 65 53 68 65 6c 6c  c moveEagleShell
ab00: 4d 64 61 43 6f 6e 66 69 67 20 7b 20 7b 72 65 73  MdaConfig { {res
ab10: 74 6f 72 65 20 66 61 6c 73 65 7d 20 7b 76 65 72  tore false} {ver
ab20: 62 6f 73 65 20 74 72 75 65 7d 20 7d 20 7b 0d 0a  bose true} } {..
ab30: 20 20 20 20 20 20 73 65 74 20 64 69 72 65 63 74        set direct
ab40: 6f 72 79 20 5b 67 65 74 42 69 6e 61 72 79 44 69  ory [getBinaryDi
ab50: 72 65 63 74 6f 72 79 5d 0d 0a 0d 0a 20 20 20 20  rectory]....    
ab60: 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
ab70: 6e 67 74 68 20 24 64 69 72 65 63 74 6f 72 79 5d  ngth $directory]
ab80: 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
ab90: 20 20 20 20 20 20 20 69 66 20 7b 24 76 65 72 62         if {$verb
aba0: 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ose} then {..   
abb0: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
abc0: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
abd0: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
abe0: 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
abf0: 73 6b 69 70 70 65 64 20 6d 6f 76 69 6e 67 20 5c  skipped moving \
ac00: 22 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65 2e  "EagleShell.exe.
ac10: 6d 64 61 2e 63 6f 6e 66 69 67 5c 22 2c 20 22 20  mda.config\", " 
ac20: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
ac30: 20 22 6e 6f 20 62 69 6e 61 72 79 20 64 69 72 65   "no binary dire
ac40: 63 74 6f 72 79 5c 6e 22 5d 0d 0a 20 20 20 20 20  ctory\n"]..     
ac50: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
ac60: 72 65 74 75 72 6e 0d 0a 20 20 20 20 20 20 7d 0d  return..      }.
ac70: 0a 0d 0a 20 20 20 20 20 20 73 65 74 20 66 69 6c  ...      set fil
ac80: 65 4e 61 6d 65 28 31 29 20 5b 66 69 6c 65 20 6e  eName(1) [file n
ac90: 6f 72 6d 61 6c 69 7a 65 20 5c 0d 0a 20 20 20 20  ormalize \..    
aca0: 20 20 20 20 20 20 5b 66 69 6c 65 20 6a 6f 69 6e        [file join
acb0: 20 24 64 69 72 65 63 74 6f 72 79 20 45 61 67 6c   $directory Eagl
acc0: 65 53 68 65 6c 6c 2e 65 78 65 2e 6d 64 61 2e 63  eShell.exe.mda.c
acd0: 6f 6e 66 69 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20  onfig]]....     
ace0: 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 28 32 29   set fileName(2)
acf0: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 66 69   [appendArgs $fi
ad00: 6c 65 4e 61 6d 65 28 31 29 20 2e 6d 6f 76 65 64  leName(1) .moved
ad10: 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 24  ]....      if {$
ad20: 72 65 73 74 6f 72 65 7d 20 74 68 65 6e 20 7b 0d  restore} then {.
ad30: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 66 69  .        if {[fi
ad40: 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c 65 4e  le exists $fileN
ad50: 61 6d 65 28 32 29 5d 7d 20 74 68 65 6e 20 7b 0d  ame(2)]} then {.
ad60: 0a 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20  .          file 
ad70: 72 65 6e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65  rename $fileName
ad80: 28 32 29 20 24 66 69 6c 65 4e 61 6d 65 28 31 29  (2) $fileName(1)
ad90: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66  ....          if
ada0: 20 7b 24 76 65 72 62 6f 73 65 7d 20 74 68 65 6e   {$verbose} then
adb0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
adc0: 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
add0: 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
ade0: 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
adf0: 20 20 20 20 20 22 2d 2d 2d 2d 20 6d 6f 76 65 64       "---- moved
ae00: 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 28 32   \"" $fileName(2
ae10: 29 20 22 5c 22 20 74 6f 20 5c 22 22 20 5c 0d 0a  ) "\" to \"" \..
ae20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae30: 24 66 69 6c 65 4e 61 6d 65 28 31 29 20 5c 22 5c  $fileName(1) \"\
ae40: 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  n]..          }.
ae50: 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20  .        } else 
ae60: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  {..          if 
ae70: 7b 24 76 65 72 62 6f 73 65 7d 20 74 68 65 6e 20  {$verbose} then 
ae80: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
ae90: 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
aea0: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
aeb0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
aec0: 20 20 20 20 22 2d 2d 2d 2d 20 73 6b 69 70 70 65      "---- skippe
aed0: 64 20 6d 6f 76 69 6e 67 20 5c 22 22 20 24 66 69  d moving \"" $fi
aee0: 6c 65 4e 61 6d 65 28 32 29 20 5c 0d 0a 20 20 20  leName(2) \..   
aef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22               "\"
af00: 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78  , it does not ex
af10: 69 73 74 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20  ist\n"]..       
af20: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
af30: 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
af40: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 66 69  .        if {[fi
af50: 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c 65 4e  le exists $fileN
af60: 61 6d 65 28 31 29 5d 7d 20 74 68 65 6e 20 7b 0d  ame(1)]} then {.
af70: 0a 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20  .          file 
af80: 72 65 6e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65  rename $fileName
af90: 28 31 29 20 24 66 69 6c 65 4e 61 6d 65 28 32 29  (1) $fileName(2)
afa0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66  ....          if
afb0: 20 7b 24 76 65 72 62 6f 73 65 7d 20 74 68 65 6e   {$verbose} then
afc0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
afd0: 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
afe0: 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
aff0: 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
b000: 20 20 20 20 20 22 2d 2d 2d 2d 20 6d 6f 76 65 64       "---- moved
b010: 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 28 31   \"" $fileName(1
b020: 29 20 22 5c 22 20 74 6f 20 5c 22 22 20 5c 0d 0a  ) "\" to \"" \..
b030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b040: 24 66 69 6c 65 4e 61 6d 65 28 32 29 20 5c 22 5c  $fileName(2) \"\
b050: 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  n]..          }.
b060: 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20  .        } else 
b070: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  {..          if 
b080: 7b 24 76 65 72 62 6f 73 65 7d 20 74 68 65 6e 20  {$verbose} then 
b090: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
b0a0: 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
b0b0: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
b0c0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
b0d0: 20 20 20 20 22 2d 2d 2d 2d 20 73 6b 69 70 70 65      "---- skippe
b0e0: 64 20 6d 6f 76 69 6e 67 20 5c 22 22 20 24 66 69  d moving \"" $fi
b0f0: 6c 65 4e 61 6d 65 28 31 29 20 5c 0d 0a 20 20 20  leName(1) \..   
b100: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22               "\"
b110: 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78  , it does not ex
b120: 69 73 74 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20  ist\n"]..       
b130: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
b140: 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
b150: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 77 72 69  ....    proc wri
b160: 74 65 45 61 67 6c 65 53 68 65 6c 6c 4d 64 61 43  teEagleShellMdaC
b170: 6f 6e 66 69 67 20 7b 20 64 61 74 61 20 7b 76 65  onfig { data {ve
b180: 72 62 6f 73 65 20 74 72 75 65 7d 20 7d 20 7b 0d  rbose true} } {.
b190: 0a 20 20 20 20 20 20 73 65 74 20 64 69 72 65 63  .      set direc
b1a0: 74 6f 72 79 20 5b 67 65 74 42 69 6e 61 72 79 44  tory [getBinaryD
b1b0: 69 72 65 63 74 6f 72 79 5d 0d 0a 0d 0a 20 20 20  irectory]....   
b1c0: 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
b1d0: 65 6e 67 74 68 20 24 64 69 72 65 63 74 6f 72 79  ength $directory
b1e0: 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
b1f0: 20 20 20 20 20 20 20 20 69 66 20 7b 24 76 65 72          if {$ver
b200: 62 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  bose} then {..  
b210: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
b220: 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
b230: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
b240: 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
b250: 20 73 6b 69 70 70 65 64 20 6d 6f 76 69 6e 67 20   skipped moving 
b260: 5c 22 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65  \"EagleShell.exe
b270: 2e 6d 64 61 2e 63 6f 6e 66 69 67 5c 22 2c 20 22  .mda.config\", "
b280: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
b290: 20 20 22 6e 6f 20 62 69 6e 61 72 79 20 64 69 72    "no binary dir
b2a0: 65 63 74 6f 72 79 5c 6e 22 5d 0d 0a 20 20 20 20  ectory\n"]..    
b2b0: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
b2c0: 20 72 65 74 75 72 6e 0d 0a 20 20 20 20 20 20 7d   return..      }
b2d0: 0d 0a 0d 0a 20 20 20 20 20 20 73 65 74 20 66 69  ....      set fi
b2e0: 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6e 6f 72  leName [file nor
b2f0: 6d 61 6c 69 7a 65 20 5c 0d 0a 20 20 20 20 20 20  malize \..      
b300: 20 20 20 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24      [file join $
b310: 64 69 72 65 63 74 6f 72 79 20 45 61 67 6c 65 53  directory EagleS
b320: 68 65 6c 6c 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e  hell.exe.mda.con
b330: 66 69 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 77  fig]]....      w
b340: 72 69 74 65 46 69 6c 65 20 24 66 69 6c 65 4e 61  riteFile $fileNa
b350: 6d 65 20 24 64 61 74 61 0d 0a 0d 0a 20 20 20 20  me $data....    
b360: 20 20 69 66 20 7b 24 76 65 72 62 6f 73 65 7d 20    if {$verbose} 
b370: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
b380: 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
b390: 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20  annel \..       
b3a0: 20 20 20 20 20 22 2d 2d 2d 2d 20 77 72 6f 74 65       "---- wrote
b3b0: 20 5c 22 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78   \"EagleShell.ex
b3c0: 65 2e 6d 64 61 2e 63 6f 6e 66 69 67 5c 22 5c 6e  e.mda.config\"\n
b3d0: 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  "..      }....  
b3e0: 20 20 20 20 72 65 74 75 72 6e 20 24 66 69 6c 65      return $file
b3f0: 4e 61 6d 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  Name..    }.....
b400: 20 20 20 20 70 72 6f 63 20 67 65 74 41 70 70 44      proc getAppD
b410: 6f 6d 61 69 6e 50 72 65 61 6d 62 6c 65 20 7b 20  omainPreamble { 
b420: 7b 70 72 65 66 69 78 20 22 22 7d 20 7b 73 75 66  {prefix ""} {suf
b430: 66 69 78 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20  fix ""} } {..   
b440: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
b450: 54 45 3a 20 54 68 69 73 20 70 72 6f 63 65 64 75  TE: This procedu
b460: 72 65 20 72 65 74 75 72 6e 73 20 61 20 74 65 73  re returns a tes
b470: 74 20 73 65 74 75 70 20 73 63 72 69 70 74 20 66  t setup script f
b480: 72 61 67 6d 65 6e 74 20 73 75 69 74 61 62 6c 65  ragment suitable
b490: 20 66 6f 72 0d 0a 20 20 20 20 20 20 23 20 20 20   for..      #   
b4a0: 20 20 20 20 65 76 61 6c 75 61 74 69 6f 6e 20 62      evaluation b
b4b0: 79 20 61 6e 20 69 6e 74 65 72 70 72 65 74 65 72  y an interpreter
b4c0: 20 63 72 65 61 74 65 64 20 69 6e 20 61 6e 20 69   created in an i
b4d0: 73 6f 6c 61 74 65 64 20 61 70 70 6c 69 63 61 74  solated applicat
b4e0: 69 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ion..      #    
b4f0: 20 20 20 64 6f 6d 61 69 6e 2e 20 20 54 68 65 20     domain.  The 
b500: 73 63 72 69 70 74 20 66 72 61 67 6d 65 6e 74 20  script fragment 
b510: 62 65 69 6e 67 20 72 65 74 75 72 6e 65 64 20 77  being returned w
b520: 69 6c 6c 20 62 65 20 73 75 72 72 6f 75 6e 64 65  ill be surrounde
b530: 64 20 62 79 0d 0a 20 20 20 20 20 20 23 20 20 20  d by..      #   
b540: 20 20 20 20 74 68 65 20 70 72 65 66 69 78 20 61      the prefix a
b550: 6e 64 20 73 75 66 66 69 78 20 22 73 63 72 69 70  nd suffix "scrip
b560: 74 20 66 72 61 67 6d 65 6e 74 73 22 20 73 70 65  t fragments" spe
b570: 63 69 66 69 65 64 20 62 79 20 6f 75 72 20 63 61  cified by our ca
b580: 6c 6c 65 72 2c 0d 0a 20 20 20 20 20 20 23 20 20  ller,..      #  
b590: 20 20 20 20 20 69 66 20 61 6e 79 2e 20 20 54 68       if any.  Th
b5a0: 65 20 65 6e 74 69 72 65 20 73 63 72 69 70 74 20  e entire script 
b5b0: 62 65 69 6e 67 20 72 65 74 75 72 6e 65 64 20 77  being returned w
b5c0: 69 6c 6c 20 62 65 20 73 75 62 73 74 69 74 75 74  ill be substitut
b5d0: 65 64 20 76 69 61 0d 0a 20 20 20 20 20 20 23 20  ed via..      # 
b5e0: 20 20 20 20 20 20 5b 73 75 62 73 74 5d 2c 20 69        [subst], i
b5f0: 6e 20 74 68 65 20 63 6f 6e 74 65 78 74 20 6f 66  n the context of
b600: 20 6f 75 72 20 63 61 6c 6c 65 72 2c 20 62 65 66   our caller, bef
b610: 6f 72 65 20 62 65 69 6e 67 20 72 65 74 75 72 6e  ore being return
b620: 65 64 2e 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ed...      #    
b630: 20 20 20 54 68 69 73 20 73 74 65 70 20 69 73 20     This step is 
b640: 6e 65 63 65 73 73 61 72 79 20 73 6f 20 74 68 61  necessary so tha
b650: 74 20 73 6f 6d 65 20 6c 69 6d 69 74 65 64 20 63  t some limited c
b660: 6f 6e 74 65 78 74 20 69 6e 66 6f 72 6d 61 74 69  ontext informati
b670: 6f 6e 2c 0d 0a 20 20 20 20 20 20 23 20 20 20 20  on,..      #    
b680: 20 20 20 70 72 69 6d 61 72 69 6c 79 20 72 65 6c     primarily rel
b690: 61 74 65 64 20 74 6f 20 74 68 65 20 74 65 73 74  ated to the test
b6a0: 69 6e 67 20 64 69 72 65 63 74 6f 72 69 65 73 2c  ing directories,
b6b0: 20 63 61 6e 20 62 65 20 74 72 61 6e 73 66 65 72   can be transfer
b6c0: 72 65 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20  red..      #    
b6d0: 20 20 20 74 6f 20 74 68 65 20 69 6e 74 65 72 70     to the interp
b6e0: 72 65 74 65 72 20 69 6e 20 74 68 65 20 69 73 6f  reter in the iso
b6f0: 6c 61 74 65 64 20 61 70 70 6c 69 63 61 74 69 6f  lated applicatio
b700: 6e 20 64 6f 6d 61 69 6e 2c 20 6d 61 6b 69 6e 67  n domain, making
b710: 20 69 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20   it..      #    
b720: 20 20 20 61 62 6c 65 20 74 6f 20 73 75 63 63 65     able to succe
b730: 73 73 66 75 6c 6c 79 20 72 75 6e 20 74 65 73 74  ssfully run test
b740: 73 20 74 68 61 74 20 72 65 71 75 69 72 65 20 6f  s that require o
b750: 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68  ne or more of th
b760: 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
b770: 20 66 69 6c 65 73 20 69 6e 20 6f 6e 65 20 6f 66   files in one of
b780: 20 74 68 65 20 74 65 73 74 69 6e 67 20 64 69 72   the testing dir
b790: 65 63 74 6f 72 69 65 73 2e 20 20 43 61 6c 6c 65  ectories.  Calle
b7a0: 72 73 20 73 68 6f 75 6c 64 20 6b 65 65 70 20 69  rs should keep i
b7b0: 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  n..      #      
b7c0: 20 6d 69 6e 64 20 74 68 61 74 20 74 68 65 20 74   mind that the t
b7d0: 65 73 74 20 73 63 72 69 70 74 20 66 72 61 67 6d  est script fragm
b7e0: 65 6e 74 20 62 65 69 6e 67 20 72 65 74 75 72 6e  ent being return
b7f0: 65 64 20 63 61 6e 6e 6f 74 20 72 65 6c 79 20 6f  ed cannot rely o
b800: 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  n..      #      
b810: 20 61 6e 79 20 73 63 72 69 70 74 20 6c 69 62 72   any script libr
b820: 61 72 79 20 70 72 6f 63 65 64 75 72 65 73 20 74  ary procedures t
b830: 68 61 74 20 61 72 65 20 6e 6f 74 20 70 72 6f 76  hat are not prov
b840: 69 64 65 64 20 62 79 20 74 68 65 20 45 61 67 6c  ided by the Eagl
b850: 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
b860: 20 6c 69 62 72 61 72 79 20 70 61 63 6b 61 67 65   library package
b870: 20 28 69 2e 65 2e 20 22 69 6e 69 74 2e 65 61 67   (i.e. "init.eag
b880: 6c 65 22 29 2c 20 69 6e 63 6c 75 64 69 6e 67 20  le"), including 
b890: 74 68 6f 73 65 20 70 72 6f 76 69 64 65 64 20 62  those provided b
b8a0: 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  y..      #      
b8b0: 20 74 68 65 20 45 61 67 6c 65 20 74 65 73 74 20   the Eagle test 
b8c0: 70 61 63 6b 61 67 65 2c 20 75 6e 6c 65 73 73 20  package, unless 
b8d0: 74 68 65 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e  the file contain
b8e0: 69 6e 67 20 74 68 65 6d 20 69 73 20 6c 6f 61 64  ing them is load
b8f0: 65 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ed..      #     
b900: 20 20 6d 61 6e 75 61 6c 6c 79 20 76 69 61 20 73    manually via s
b910: 6f 6d 65 20 6f 74 68 65 72 20 6d 65 63 68 61 6e  ome other mechan
b920: 69 73 6d 20 28 65 2e 67 2e 20 62 79 20 69 6e 63  ism (e.g. by inc
b930: 6c 75 64 69 6e 67 20 61 70 70 72 6f 70 72 69 61  luding appropria
b940: 74 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  te..      #     
b950: 20 20 5b 70 61 63 6b 61 67 65 20 72 65 71 75 69    [package requi
b960: 72 65 5d 20 6f 72 20 5b 73 6f 75 72 63 65 5d 20  re] or [source] 
b970: 63 6f 6d 6d 61 6e 64 73 20 69 6e 20 74 68 65 20  commands in the 
b980: 70 72 65 66 69 78 20 6f 72 20 73 75 66 66 69 78  prefix or suffix
b990: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
b9a0: 73 63 72 69 70 74 20 66 72 61 67 6d 65 6e 74 73  script fragments
b9b0: 29 2e 20 20 41 6c 73 6f 2c 20 61 6c 6c 20 76 61  ).  Also, all va
b9c0: 72 69 61 62 6c 65 20 72 65 66 65 72 65 6e 63 65  riable reference
b9d0: 73 20 61 6e 64 20 61 6c 6c 20 6e 65 73 74 65 64  s and all nested
b9e0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
b9f0: 63 6f 6d 6d 61 6e 64 73 20 28 69 2e 65 2e 20 74  commands (i.e. t
ba00: 68 6f 73 65 20 69 6e 20 73 71 75 61 72 65 20 62  hose in square b
ba10: 72 61 63 6b 65 74 73 29 20 63 6f 6e 74 61 69 6e  rackets) contain
ba20: 65 64 20 69 6e 20 74 68 65 20 66 69 6e 61 6c 0d  ed in the final.
ba30: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73  .      #       s
ba40: 63 72 69 70 74 20 66 72 61 67 6d 65 6e 74 20 77  cript fragment w
ba50: 69 6c 6c 20 65 6e 64 20 75 70 20 62 65 69 6e 67  ill end up being
ba60: 20 65 76 61 6c 75 61 74 65 64 20 69 6e 20 74 68   evaluated in th
ba70: 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 74 68 65  e context of the
ba80: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
ba90: 63 61 6c 6c 69 6e 67 20 69 6e 74 65 72 70 72 65  calling interpre
baa0: 74 65 72 20 61 6e 64 20 6e 6f 74 20 74 68 65 20  ter and not the 
bab0: 74 61 72 67 65 74 20 69 6e 74 65 72 70 72 65 74  target interpret
bac0: 65 72 20 63 72 65 61 74 65 64 20 69 6e 20 74 68  er created in th
bad0: 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
bae0: 20 69 73 6f 6c 61 74 65 64 20 61 70 70 6c 69 63   isolated applic
baf0: 61 74 69 6f 6e 20 64 6f 6d 61 69 6e 20 75 6e 6c  ation domain unl
bb00: 65 73 73 20 74 68 65 20 64 6f 6c 6c 61 72 20 73  ess the dollar s
bb10: 69 67 6e 73 20 61 6e 64 2f 6f 72 20 73 71 75 61  igns and/or squa
bb20: 72 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  re..      #     
bb30: 20 20 62 72 61 63 6b 65 74 73 20 61 72 65 20 73    brackets are s
bb40: 70 65 63 69 61 6c 6c 79 20 71 75 6f 74 65 64 20  pecially quoted 
bb50: 77 69 74 68 20 62 61 63 6b 73 6c 61 73 68 65 73  with backslashes
bb60: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
bb70: 20 20 72 65 74 75 72 6e 20 5b 75 70 6c 65 76 65    return [upleve
bb80: 6c 20 31 20 5b 6c 69 73 74 20 73 75 62 73 74 20  l 1 [list subst 
bb90: 5b 61 70 70 65 6e 64 41 72 67 73 20 24 70 72 65  [appendArgs $pre
bba0: 66 69 78 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  fix {..        #
bbb0: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
bbc0: 3a 20 54 68 65 20 5c 5b 6f 62 6a 65 63 74 5c 5d  : The \[object\]
bbd0: 20 63 6f 6d 6d 61 6e 64 20 6d 61 79 20 62 65 20   command may be 
bbe0: 6d 69 73 73 69 6e 67 20 69 6e 20 73 6f 6d 65 20  missing in some 
bbf0: 45 61 67 6c 65 20 63 6f 72 65 0d 0a 20 20 20 20  Eagle core..    
bc00: 20 20 20 20 23 20 20 20 20 20 20 20 6c 69 62 72      #       libr
bc10: 61 72 79 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  ary configuratio
bc20: 6e 73 2e 20 20 43 6c 6f 6e 69 6e 67 20 61 6e 64  ns.  Cloning and
bc30: 20 75 73 69 6e 67 20 74 68 65 20 70 72 6f 63 65   using the proce
bc40: 64 75 72 65 0d 0a 20 20 20 20 20 20 20 20 23 20  dure..        # 
bc50: 20 20 20 20 20 20 5c 5b 63 68 61 6e 67 65 4e 61        \[changeNa
bc60: 74 69 76 65 52 75 6e 74 69 6d 65 4f 70 74 69 6f  tiveRuntimeOptio
bc70: 6e 5c 5d 20 6d 61 79 20 68 65 6c 70 20 74 6f 20  n\] may help to 
bc80: 6d 69 74 69 67 61 74 65 20 74 68 69 73 2e 0d 0a  mitigate this...
bc90: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
bca0: 20 20 20 70 72 6f 63 20 63 68 61 6e 67 65 4e 61     proc changeNa
bcb0: 74 69 76 65 52 75 6e 74 69 6d 65 4f 70 74 69 6f  tiveRuntimeOptio
bcc0: 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n \..           
bcd0: 20 7b 5b 69 6e 66 6f 20 61 72 67 73 20 63 68 61   {[info args cha
bce0: 6e 67 65 4e 61 74 69 76 65 52 75 6e 74 69 6d 65  ngeNativeRuntime
bcf0: 4f 70 74 69 6f 6e 5d 7d 20 5c 0d 0a 20 20 20 20  Option]} \..    
bd00: 20 20 20 20 20 20 20 20 7b 5b 69 6e 66 6f 20 62          {[info b
bd10: 6f 64 79 20 63 68 61 6e 67 65 4e 61 74 69 76 65  ody changeNative
bd20: 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 5d 7d 0d  RuntimeOption]}.
bd30: 0a 0d 0a 20 20 20 20 20 20 20 20 63 61 74 63 68  ...        catch
bd40: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68   {..          ch
bd50: 61 6e 67 65 4e 61 74 69 76 65 52 75 6e 74 69 6d  angeNativeRuntim
bd60: 65 4f 70 74 69 6f 6e 20 5b 68 61 73 52 75 6e 74  eOption [hasRunt
bd70: 69 6d 65 4f 70 74 69 6f 6e 20 6e 61 74 69 76 65  imeOption native
bd80: 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  ]..        }..  
bd90: 20 20 20 20 7d 20 5b 67 65 74 54 65 73 74 4f 76      } [getTestOv
bda0: 65 72 72 69 64 65 73 50 72 65 61 6d 62 6c 65 20  erridesPreamble 
bdb0: 5b 6c 69 73 74 20 70 61 74 68 20 74 65 73 74 5f  [list path test_
bdc0: 63 68 61 6e 6e 65 6c 5d 5d 20 24 73 75 66 66 69  channel]] $suffi
bdd0: 78 5d 5d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  x]]]..    }.....
bde0: 20 20 20 20 70 72 6f 63 20 74 72 79 43 6f 70 79      proc tryCopy
bdf0: 45 78 74 65 72 6e 61 6c 46 69 6c 65 20 7b 0d 0a  ExternalFile {..
be00: 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65              file
be10: 4e 61 6d 65 20 7b 70 6c 61 74 66 6f 72 6d 20 22  Name {platform "
be20: 22 7d 20 7b 6e 65 77 46 69 6c 65 4e 61 6d 65 20  "} {newFileName 
be30: 22 22 7d 20 7b 76 65 72 62 6f 73 65 20 74 72 75  ""} {verbose tru
be40: 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65  e} } {..      se
be50: 74 20 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65  t sourceFileName
be60: 20 5b 67 65 74 45 78 74 65 72 6e 61 6c 46 69 6c   [getExternalFil
be70: 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 5d  eName $fileName]
be80: 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b  ....      if {![
be90: 66 69 6c 65 20 65 78 69 73 74 73 20 24 73 6f 75  file exists $sou
bea0: 72 63 65 46 69 6c 65 4e 61 6d 65 5d 7d 20 74 68  rceFileName]} th
beb0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66  en {..        if
bec0: 20 7b 24 76 65 72 62 6f 73 65 7d 20 74 68 65 6e   {$verbose} then
bed0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70   {..          tp
bee0: 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
bef0: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
bf00: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
bf10: 20 22 2d 2d 2d 2d 20 73 6b 69 70 70 65 64 20 63   "---- skipped c
bf20: 6f 70 79 69 6e 67 20 65 78 74 65 72 6e 61 6c 20  opying external 
bf30: 66 69 6c 65 20 5c 22 22 20 24 73 6f 75 72 63 65  file \"" $source
bf40: 46 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20  FileName \..    
bf50: 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c 20 69            "\", i
bf60: 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  t does not exist
bf70: 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d  \n"]..        }.
bf80: 0a 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ...        retur
bf90: 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  n..      }....  
bfa0: 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
bfb0: 6c 65 6e 67 74 68 20 24 6e 65 77 46 69 6c 65 4e  length $newFileN
bfc0: 61 6d 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ame] > 0} then {
bfd0: 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 74 61  ..        set ta
bfe0: 72 67 65 74 46 69 6c 65 4e 61 6d 65 20 5b 67 65  rgetFileName [ge
bff0: 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20  tBinaryFileName 
c000: 24 6e 65 77 46 69 6c 65 4e 61 6d 65 20 24 70 6c  $newFileName $pl
c010: 61 74 66 6f 72 6d 5d 0d 0a 20 20 20 20 20 20 7d  atform]..      }
c020: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
c030: 20 73 65 74 20 74 61 72 67 65 74 46 69 6c 65 4e   set targetFileN
c040: 61 6d 65 20 5b 67 65 74 42 69 6e 61 72 79 46 69  ame [getBinaryFi
c050: 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65  leName $fileName
c060: 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a 20 20 20   $platform]..   
c070: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 73 65     }....      se
c080: 74 20 74 61 72 67 65 74 44 69 72 65 63 74 6f 72  t targetDirector
c090: 79 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20  y [file dirname 
c0a0: 24 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 5d  $targetFileName]
c0b0: 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63  ....      if {[c
c0c0: 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
c0d0: 69 66 20 7b 21 5b 66 69 6c 65 20 65 78 69 73 74  if {![file exist
c0e0: 73 20 24 74 61 72 67 65 74 44 69 72 65 63 74 6f  s $targetDirecto
c0f0: 72 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ry]} then {..   
c100: 20 20 20 20 20 20 20 66 69 6c 65 20 6d 6b 64 69         file mkdi
c110: 72 20 24 74 61 72 67 65 74 44 69 72 65 63 74 6f  r $targetDirecto
c120: 72 79 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  ry..        }...
c130: 0a 20 20 20 20 20 20 20 20 66 69 6c 65 20 63 6f  .        file co
c140: 70 79 20 2d 66 6f 72 63 65 20 24 73 6f 75 72 63  py -force $sourc
c150: 65 46 69 6c 65 4e 61 6d 65 20 24 74 61 72 67 65  eFileName $targe
c160: 74 46 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20  tFileName..     
c170: 20 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b   }] == 0} then {
c180: 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
c190: 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
c1a0: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
c1b0: 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
c1c0: 20 63 6f 70 69 65 64 20 65 78 74 65 72 6e 61 6c   copied external
c1d0: 20 66 69 6c 65 20 66 72 6f 6d 20 5c 22 22 20 24   file from \"" $
c1e0: 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 22  sourceFileName "
c1f0: 5c 22 20 74 6f 20 5c 22 22 20 5c 0d 0a 20 20 20  \" to \"" \..   
c200: 20 20 20 20 20 20 20 20 20 24 74 61 72 67 65 74           $target
c210: 46 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a  FileName \"\n]..
c220: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
c230: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
c240: 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
c250: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
c260: 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66           "---- f
c270: 61 69 6c 65 64 20 74 6f 20 63 6f 70 79 20 65 78  ailed to copy ex
c280: 74 65 72 6e 61 6c 20 66 69 6c 65 20 66 72 6f 6d  ternal file from
c290: 20 5c 22 22 20 24 73 6f 75 72 63 65 46 69 6c 65   \"" $sourceFile
c2a0: 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  Name \..        
c2b0: 20 20 20 20 22 5c 22 20 74 6f 20 5c 22 22 20 24      "\" to \"" $
c2c0: 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 20 5c  targetFileName \
c2d0: 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  "\n]..      }.. 
c2e0: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
c2f0: 63 20 74 72 79 43 6f 70 79 42 69 6e 61 72 79 46  c tryCopyBinaryF
c300: 69 6c 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  ile {..         
c310: 20 20 20 66 69 6c 65 4e 61 6d 65 20 6d 61 6e 61     fileName mana
c320: 67 65 64 4f 6e 6c 79 20 7b 70 6c 61 74 66 6f 72  gedOnly {platfor
c330: 6d 20 22 22 7d 20 7b 6e 65 77 46 69 6c 65 4e 61  m ""} {newFileNa
c340: 6d 65 20 22 22 7d 0d 0a 20 20 20 20 20 20 20 20  me ""}..        
c350: 20 20 20 20 7b 76 65 72 62 6f 73 65 20 74 72 75      {verbose tru
c360: 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65  e} } {..      se
c370: 74 20 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65  t sourceFileName
c380: 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e   [getBinaryFileN
c390: 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 20 24 70  ame $fileName $p
c3a0: 6c 61 74 66 6f 72 6d 5d 0d 0a 0d 0a 20 20 20 20  latform]....    
c3b0: 20 20 69 66 20 7b 21 5b 66 69 6c 65 20 65 78 69    if {![file exi
c3c0: 73 74 73 20 24 73 6f 75 72 63 65 46 69 6c 65 4e  sts $sourceFileN
c3d0: 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ame]} then {..  
c3e0: 20 20 20 20 20 20 69 66 20 7b 24 76 65 72 62 6f        if {$verbo
c3f0: 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  se} then {..    
c400: 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
c410: 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
c420: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
c430: 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73           "---- s
c440: 6b 69 70 70 65 64 20 63 6f 70 79 69 6e 67 20 62  kipped copying b
c450: 69 6e 61 72 79 20 66 69 6c 65 20 5c 22 22 20 24  inary file \"" $
c460: 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 5c  sourceFileName \
c470: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
c480: 22 5c 22 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74  "\", it does not
c490: 20 65 78 69 73 74 5c 6e 22 5d 0d 0a 20 20 20 20   exist\n"]..    
c4a0: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
c4b0: 20 72 65 74 75 72 6e 0d 0a 20 20 20 20 20 20 7d   return..      }
c4c0: 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73  ....      if {[s
c4d0: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 6e 65  tring length $ne
c4e0: 77 46 69 6c 65 4e 61 6d 65 5d 20 3e 20 30 7d 20  wFileName] > 0} 
c4f0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
c500: 73 65 74 20 74 61 72 67 65 74 46 69 6c 65 4e 61  set targetFileNa
c510: 6d 65 20 5b 67 65 74 42 75 69 6c 64 46 69 6c 65  me [getBuildFile
c520: 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  Name \..        
c530: 20 20 20 20 24 6e 65 77 46 69 6c 65 4e 61 6d 65      $newFileName
c540: 20 24 6d 61 6e 61 67 65 64 4f 6e 6c 79 20 24 70   $managedOnly $p
c550: 6c 61 74 66 6f 72 6d 5d 0d 0a 20 20 20 20 20 20  latform]..      
c560: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
c570: 20 20 73 65 74 20 74 61 72 67 65 74 46 69 6c 65    set targetFile
c580: 4e 61 6d 65 20 5b 67 65 74 42 75 69 6c 64 46 69  Name [getBuildFi
c590: 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20  leName \..      
c5a0: 20 20 20 20 20 20 24 66 69 6c 65 4e 61 6d 65 20        $fileName 
c5b0: 24 6d 61 6e 61 67 65 64 4f 6e 6c 79 20 24 70 6c  $managedOnly $pl
c5c0: 61 74 66 6f 72 6d 5d 0d 0a 20 20 20 20 20 20 7d  atform]..      }
c5d0: 0d 0a 0d 0a 20 20 20 20 20 20 73 65 74 20 74 61  ....      set ta
c5e0: 72 67 65 74 44 69 72 65 63 74 6f 72 79 20 5b 66  rgetDirectory [f
c5f0: 69 6c 65 20 64 69 72 6e 61 6d 65 20 24 74 61 72  ile dirname $tar
c600: 67 65 74 46 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a  getFileName]....
c610: 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
c620: 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   {..        if {
c630: 21 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 74  ![file exists $t
c640: 61 72 67 65 74 44 69 72 65 63 74 6f 72 79 5d 7d  argetDirectory]}
c650: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
c660: 20 20 20 66 69 6c 65 20 6d 6b 64 69 72 20 24 74     file mkdir $t
c670: 61 72 67 65 74 44 69 72 65 63 74 6f 72 79 0d 0a  argetDirectory..
c680: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
c690: 20 20 20 20 20 66 69 6c 65 20 63 6f 70 79 20 2d       file copy -
c6a0: 66 6f 72 63 65 20 24 73 6f 75 72 63 65 46 69 6c  force $sourceFil
c6b0: 65 4e 61 6d 65 20 24 74 61 72 67 65 74 46 69 6c  eName $targetFil
c6c0: 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 7d 5d 20  eName..      }] 
c6d0: 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
c6e0: 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
c6f0: 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
c700: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
c710: 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 70         "---- cop
c720: 69 65 64 20 62 69 6e 61 72 79 20 66 69 6c 65 20  ied binary file 
c730: 66 72 6f 6d 20 5c 22 22 20 24 73 6f 75 72 63 65  from \"" $source
c740: 46 69 6c 65 4e 61 6d 65 20 22 5c 22 20 74 6f 20  FileName "\" to 
c750: 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  \"" \..         
c760: 20 20 20 24 74 61 72 67 65 74 46 69 6c 65 4e 61     $targetFileNa
c770: 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20  me \"\n]..      
c780: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
c790: 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
c7a0: 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
c7b0: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
c7c0: 20 20 20 22 2d 2d 2d 2d 20 66 61 69 6c 65 64 20     "---- failed 
c7d0: 74 6f 20 63 6f 70 79 20 62 69 6e 61 72 79 20 66  to copy binary f
c7e0: 69 6c 65 20 66 72 6f 6d 20 5c 22 22 20 24 73 6f  ile from \"" $so
c7f0: 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 5c 0d 0a  urceFileName \..
c800: 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 20              "\" 
c810: 74 6f 20 5c 22 22 20 24 74 61 72 67 65 74 46 69  to \"" $targetFi
c820: 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20  leName \"\n]..  
c830: 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
c840: 0a 20 20 20 20 70 72 6f 63 20 74 72 79 43 6f 70  .    proc tryCop
c850: 79 42 75 69 6c 64 46 69 6c 65 20 7b 0d 0a 20 20  yBuildFile {..  
c860: 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 4e 61            fileNa
c870: 6d 65 20 6d 61 6e 61 67 65 64 4f 6e 6c 79 20 7b  me managedOnly {
c880: 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20 7b 6e 65  platform ""} {ne
c890: 77 46 69 6c 65 4e 61 6d 65 20 22 22 7d 0d 0a 20  wFileName ""}.. 
c8a0: 20 20 20 20 20 20 20 20 20 20 20 7b 76 65 72 62             {verb
c8b0: 6f 73 65 20 74 72 75 65 7d 20 7d 20 7b 0d 0a 20  ose true} } {.. 
c8c0: 20 20 20 20 20 73 65 74 20 73 6f 75 72 63 65 46       set sourceF
c8d0: 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42 75 69 6c  ileName [getBuil
c8e0: 64 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e  dFileName $fileN
c8f0: 61 6d 65 20 24 6d 61 6e 61 67 65 64 4f 6e 6c 79  ame $managedOnly
c900: 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a 0d 0a 20   $platform].... 
c910: 20 20 20 20 20 69 66 20 7b 21 5b 66 69 6c 65 20       if {![file 
c920: 65 78 69 73 74 73 20 24 73 6f 75 72 63 65 46 69  exists $sourceFi
c930: 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d  leName]} then {.
c940: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 24 76 65  .        if {$ve
c950: 72 62 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20  rbose} then {.. 
c960: 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
c970: 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
c980: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
c990: 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
c9a0: 2d 20 73 6b 69 70 70 65 64 20 63 6f 70 79 69 6e  - skipped copyin
c9b0: 67 20 62 75 69 6c 64 20 66 69 6c 65 20 5c 22 22  g build file \""
c9c0: 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65   $sourceFileName
c9d0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
c9e0: 20 20 22 5c 22 2c 20 69 74 20 64 6f 65 73 20 6e    "\", it does n
c9f0: 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a 20 20  ot exist\n"]..  
ca00: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
ca10: 20 20 20 72 65 74 75 72 6e 0d 0a 20 20 20 20 20     return..     
ca20: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b   }....      if {
ca30: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
ca40: 6e 65 77 46 69 6c 65 4e 61 6d 65 5d 20 3e 20 30  newFileName] > 0
ca50: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
ca60: 20 20 73 65 74 20 74 61 72 67 65 74 46 69 6c 65    set targetFile
ca70: 4e 61 6d 65 20 5b 67 65 74 42 69 6e 61 72 79 46  Name [getBinaryF
ca80: 69 6c 65 4e 61 6d 65 20 24 6e 65 77 46 69 6c 65  ileName $newFile
ca90: 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 5d 0d  Name $platform].
caa0: 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
cab0: 0a 20 20 20 20 20 20 20 20 73 65 74 20 74 61 72  .        set tar
cac0: 67 65 74 46 69 6c 65 4e 61 6d 65 20 5b 67 65 74  getFileName [get
cad0: 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 24  BinaryFileName $
cae0: 66 69 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f  fileName $platfo
caf0: 72 6d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  rm]..      }....
cb00: 20 20 20 20 20 20 73 65 74 20 74 61 72 67 65 74        set target
cb10: 44 69 72 65 63 74 6f 72 79 20 5b 66 69 6c 65 20  Directory [file 
cb20: 64 69 72 6e 61 6d 65 20 24 74 61 72 67 65 74 46  dirname $targetF
cb30: 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20  ileName]....    
cb40: 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
cb50: 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 66 69          if {![fi
cb60: 6c 65 20 65 78 69 73 74 73 20 24 74 61 72 67 65  le exists $targe
cb70: 74 44 69 72 65 63 74 6f 72 79 5d 7d 20 74 68 65  tDirectory]} the
cb80: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 66  n {..          f
cb90: 69 6c 65 20 6d 6b 64 69 72 20 24 74 61 72 67 65  ile mkdir $targe
cba0: 74 44 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20  tDirectory..    
cbb0: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
cbc0: 20 66 69 6c 65 20 63 6f 70 79 20 2d 66 6f 72 63   file copy -forc
cbd0: 65 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d  e $sourceFileNam
cbe0: 65 20 24 74 61 72 67 65 74 46 69 6c 65 4e 61 6d  e $targetFileNam
cbf0: 65 0d 0a 20 20 20 20 20 20 7d 5d 20 3d 3d 20 30  e..      }] == 0
cc00: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
cc10: 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
cc20: 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
cc30: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
cc40: 20 20 20 22 2d 2d 2d 2d 20 63 6f 70 69 65 64 20     "---- copied 
cc50: 62 75 69 6c 64 20 66 69 6c 65 20 66 72 6f 6d 20  build file from 
cc60: 5c 22 22 20 24 73 6f 75 72 63 65 46 69 6c 65 4e  \"" $sourceFileN
cc70: 61 6d 65 20 22 5c 22 20 74 6f 20 5c 22 22 20 5c  ame "\" to \"" \
cc80: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 24 74  ..            $t
cc90: 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 20 5c 22  argetFileName \"
cca0: 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  \n]..      } els
ccb0: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75  e {..        tpu
ccc0: 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
ccd0: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
cce0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d  ..            "-
ccf0: 2d 2d 2d 20 66 61 69 6c 65 64 20 74 6f 20 63 6f  --- failed to co
cd00: 70 79 20 62 75 69 6c 64 20 66 69 6c 65 20 66 72  py build file fr
cd10: 6f 6d 20 5c 22 22 20 24 73 6f 75 72 63 65 46 69  om \"" $sourceFi
cd20: 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20  leName \..      
cd30: 20 20 20 20 20 20 22 5c 22 20 74 6f 20 5c 22 22        "\" to \""
cd40: 20 24 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65   $targetFileName
cd50: 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d   \"\n]..      }.
cd60: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
cd70: 72 6f 63 20 74 72 79 44 65 6c 65 74 65 42 69 6e  roc tryDeleteBin
cd80: 61 72 79 46 69 6c 65 20 7b 20 66 69 6c 65 4e 61  aryFile { fileNa
cd90: 6d 65 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d  me {platform ""}
cda0: 20 7b 76 65 72 62 6f 73 65 20 74 72 75 65 7d 20   {verbose true} 
cdb0: 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 66  } {..      set f
cdc0: 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42 69 6e 61  ileName [getBina
cdd0: 72 79 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65  ryFileName $file
cde0: 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 5d 0d  Name $platform].
cdf0: 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 66  ...      if {![f
ce00: 69 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c 65  ile exists $file
ce10: 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  Name]} then {.. 
ce20: 20 20 20 20 20 20 20 69 66 20 7b 24 76 65 72 62         if {$verb
ce30: 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ose} then {..   
ce40: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
ce50: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
ce60: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
ce70: 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
ce80: 73 6b 69 70 70 65 64 20 64 65 6c 65 74 69 6e 67  skipped deleting
ce90: 20 62 69 6e 61 72 79 20 66 69 6c 65 20 5c 22 22   binary file \""
cea0: 20 24 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20   $fileName \..  
ceb0: 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c              "\",
cec0: 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69   it does not exi
ced0: 73 74 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20  st\n"]..        
cee0: 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 72 65 74  }....        ret
cef0: 75 72 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  urn..      }....
cf00: 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
cf10: 20 7b 66 69 6c 65 20 64 65 6c 65 74 65 20 24 66   {file delete $f
cf20: 69 6c 65 4e 61 6d 65 7d 5d 20 3d 3d 20 30 7d 20  ileName}] == 0} 
cf30: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
cf40: 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
cf50: 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
cf60: 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
cf70: 20 22 2d 2d 2d 2d 20 64 65 6c 65 74 65 64 20 62   "---- deleted b
cf80: 69 6e 61 72 79 20 66 69 6c 65 20 5c 22 22 20 24  inary file \"" $
cf90: 66 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a  fileName \"\n]..
cfa0: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
cfb0: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
cfc0: 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
cfd0: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
cfe0: 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66           "---- f
cff0: 61 69 6c 65 64 20 74 6f 20 64 65 6c 65 74 65 20  ailed to delete 
d000: 62 69 6e 61 72 79 20 66 69 6c 65 20 5c 22 22 20  binary file \"" 
d010: 24 66 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d  $fileName \"\n].
d020: 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
d030: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 74 72 79  ....    proc try
d040: 44 65 6c 65 74 65 42 75 69 6c 64 46 69 6c 65 20  DeleteBuildFile 
d050: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  {..            f
d060: 69 6c 65 4e 61 6d 65 20 6d 61 6e 61 67 65 64 4f  ileName managedO
d070: 6e 6c 79 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22  nly {platform ""
d080: 7d 20 7b 76 65 72 62 6f 73 65 20 74 72 75 65 7d  } {verbose true}
d090: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20   } {..      set 
d0a0: 66 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42 75 69  fileName [getBui
d0b0: 6c 64 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65  ldFileName $file
d0c0: 4e 61 6d 65 20 24 6d 61 6e 61 67 65 64 4f 6e 6c  Name $managedOnl
d0d0: 79 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a 0d 0a  y $platform]....
d0e0: 20 20 20 20 20 20 69 66 20 7b 21 5b 66 69 6c 65        if {![file
d0f0: 20 65 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d   exists $fileNam
d100: 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  e]} then {..    
d110: 20 20 20 20 69 66 20 7b 24 76 65 72 62 6f 73 65      if {$verbose
d120: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
d130: 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
d140: 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
d150: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
d160: 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6b 69         "---- ski
d170: 70 70 65 64 20 64 65 6c 65 74 69 6e 67 20 62 75  pped deleting bu
d180: 69 6c 64 20 66 69 6c 65 20 5c 22 22 20 24 66 69  ild file \"" $fi
d190: 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20  leName \..      
d1a0: 20 20 20 20 20 20 20 20 22 5c 22 2c 20 69 74 20          "\", it 
d1b0: 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 5c 6e  does not exist\n
d1c0: 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  "]..        }...
d1d0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 0d  .        return.
d1e0: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
d1f0: 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 66 69    if {[catch {fi
d200: 6c 65 20 64 65 6c 65 74 65 20 24 66 69 6c 65 4e  le delete $fileN
d210: 61 6d 65 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  ame}] == 0} then
d220: 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   {..        tput
d230: 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
d240: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
d250: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d  .            "--
d260: 2d 2d 20 64 65 6c 65 74 65 64 20 62 75 69 6c 64  -- deleted build
d270: 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e   file \"" $fileN
d280: 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20  ame \"\n]..     
d290: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
d2a0: 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
d2b0: 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
d2c0: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
d2d0: 20 20 20 20 22 2d 2d 2d 2d 20 66 61 69 6c 65 64      "---- failed
d2e0: 20 74 6f 20 64 65 6c 65 74 65 20 62 75 69 6c 64   to delete build
d2f0: 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e   file \"" $fileN
d300: 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20  ame \"\n]..     
d310: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
d320: 20 20 70 72 6f 63 20 74 72 79 43 6f 70 79 41 73    proc tryCopyAs
d330: 73 65 6d 62 6c 79 20 7b 0d 0a 20 20 20 20 20 20  sembly {..      
d340: 20 20 20 20 20 20 66 69 6c 65 4e 61 6d 65 20 6d        fileName m
d350: 61 6e 61 67 65 64 4f 6e 6c 79 20 7b 70 6c 61 74  anagedOnly {plat
d360: 66 6f 72 6d 20 22 22 7d 20 7b 70 64 62 20 74 72  form ""} {pdb tr
d370: 75 65 7d 20 7b 76 65 72 62 6f 73 65 20 74 72 75  ue} {verbose tru
d380: 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74 72  e} } {..      tr
d390: 79 43 6f 70 79 42 75 69 6c 64 46 69 6c 65 20 24  yCopyBuildFile $
d3a0: 66 69 6c 65 4e 61 6d 65 20 24 6d 61 6e 61 67 65  fileName $manage
d3b0: 64 4f 6e 6c 79 20 24 70 6c 61 74 66 6f 72 6d 20  dOnly $platform 
d3c0: 22 22 20 24 76 65 72 62 6f 73 65 0d 0a 0d 0a 20  "" $verbose.... 
d3d0: 20 20 20 20 20 69 66 20 7b 24 70 64 62 7d 20 74       if {$pdb} t
d3e0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74  hen {..        t
d3f0: 72 79 43 6f 70 79 42 75 69 6c 64 46 69 6c 65 20  ryCopyBuildFile 
d400: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
d410: 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65             [file
d420: 20 72 6f 6f 74 6e 61 6d 65 20 24 66 69 6c 65 4e   rootname $fileN
d430: 61 6d 65 5d 20 2e 70 64 62 5d 20 24 6d 61 6e 61  ame] .pdb] $mana
d440: 67 65 64 4f 6e 6c 79 20 24 70 6c 61 74 66 6f 72  gedOnly $platfor
d450: 6d 20 22 22 20 24 76 65 72 62 6f 73 65 0d 0a 20  m "" $verbose.. 
d460: 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
d470: 0d 0a 20 20 20 20 70 72 6f 63 20 74 72 79 44 65  ..    proc tryDe
d480: 6c 65 74 65 41 73 73 65 6d 62 6c 79 20 7b 0d 0a  leteAssembly {..
d490: 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65              file
d4a0: 4e 61 6d 65 20 7b 70 6c 61 74 66 6f 72 6d 20 22  Name {platform "
d4b0: 22 7d 20 7b 70 64 62 20 74 72 75 65 7d 20 7b 76  "} {pdb true} {v
d4c0: 65 72 62 6f 73 65 20 74 72 75 65 7d 20 7d 20 7b  erbose true} } {
d4d0: 0d 0a 20 20 20 20 20 20 74 72 79 44 65 6c 65 74  ..      tryDelet
d4e0: 65 42 69 6e 61 72 79 46 69 6c 65 20 24 66 69 6c  eBinaryFile $fil
d4f0: 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 20  eName $platform 
d500: 24 76 65 72 62 6f 73 65 0d 0a 0d 0a 20 20 20 20  $verbose....    
d510: 20 20 69 66 20 7b 24 70 64 62 7d 20 74 68 65 6e    if {$pdb} then
d520: 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 72 79 44   {..        tryD
d530: 65 6c 65 74 65 42 69 6e 61 72 79 46 69 6c 65 20  eleteBinaryFile 
d540: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
d550: 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65             [file
d560: 20 72 6f 6f 74 6e 61 6d 65 20 24 66 69 6c 65 4e   rootname $fileN
d570: 61 6d 65 5d 20 2e 70 64 62 5d 20 24 70 6c 61 74  ame] .pdb] $plat
d580: 66 6f 72 6d 20 24 76 65 72 62 6f 73 65 0d 0a 20  form $verbose.. 
d590: 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
d5a0: 0d 0a 20 20 20 20 70 72 6f 63 20 74 72 79 4c 6f  ..    proc tryLo
d5b0: 61 64 41 73 73 65 6d 62 6c 79 20 7b 20 66 69 6c  adAssembly { fil
d5c0: 65 4e 61 6d 65 20 7b 70 6c 61 74 66 6f 72 6d 20  eName {platform 
d5d0: 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73  ""} } {..      s
d5e0: 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 67 65 74  et fileName [get
d5f0: 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 24  BinaryFileName $
d600: 66 69 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f  fileName $platfo
d610: 72 6d 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20  rm]....      if 
d620: 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
d630: 20 20 20 73 65 74 20 61 73 73 65 6d 62 6c 79 20     set assembly 
d640: 5b 6f 62 6a 65 63 74 20 6c 6f 61 64 20 2d 6c 6f  [object load -lo
d650: 61 64 74 79 70 65 20 46 69 6c 65 20 2d 61 6c 69  adtype File -ali
d660: 61 73 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20  as $fileName].. 
d670: 20 20 20 20 20 7d 5d 20 3d 3d 20 30 7d 20 74 68       }] == 0} th
d680: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
d690: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
d6a0: 20 4e 6f 77 2c 20 61 64 64 20 74 68 65 20 6e 65   Now, add the ne
d6b0: 63 65 73 73 61 72 79 20 74 65 73 74 20 63 6f 6e  cessary test con
d6c0: 73 74 72 61 69 6e 74 2e 0d 0a 20 20 20 20 20 20  straint...      
d6d0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 61 64 64    #..        add
d6e0: 43 6f 6e 73 74 72 61 69 6e 74 20 5b 66 69 6c 65  Constraint [file
d6f0: 20 72 6f 6f 74 6e 61 6d 65 20 5b 66 69 6c 65 20   rootname [file 
d700: 74 61 69 6c 20 24 66 69 6c 65 4e 61 6d 65 5d 5d  tail $fileName]]
d710: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
d720: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 47         # NOTE: G
d730: 72 61 62 20 74 68 65 20 69 6d 61 67 65 20 72 75  rab the image ru
d740: 6e 74 69 6d 65 20 76 65 72 73 69 6f 6e 20 66 72  ntime version fr
d750: 6f 6d 20 74 68 65 20 61 73 73 65 6d 62 6c 79 20  om the assembly 
d760: 62 65 63 61 75 73 65 0d 0a 20 20 20 20 20 20 20  because..       
d770: 20 23 20 20 20 20 20 20 20 73 65 76 65 72 61 6c   #       several
d780: 20 74 65 73 74 73 20 72 65 6c 79 20 6f 6e 20 69   tests rely on i
d790: 74 20 68 61 76 69 6e 67 20 61 20 63 65 72 74 61  t having a certa
d7a0: 69 6e 20 76 61 6c 75 65 2e 0d 0a 20 20 20 20 20  in value...     
d7b0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 61 64     #..        ad
d7c0: 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70  dConstraint [app
d7d0: 65 6e 64 41 72 67 73 20 5b 66 69 6c 65 20 74 61  endArgs [file ta
d7e0: 69 6c 20 24 66 69 6c 65 4e 61 6d 65 5d 20 5f 20  il $fileName] _ 
d7f0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
d800: 24 61 73 73 65 6d 62 6c 79 20 49 6d 61 67 65 52  $assembly ImageR
d810: 75 6e 74 69 6d 65 56 65 72 73 69 6f 6e 5d 5d 0d  untimeVersion]].
d820: 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
d830: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65        # NOTE: Re
d840: 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61  turn the full pa
d850: 74 68 20 6f 66 20 74 68 65 20 6c 6f 61 64 65 64  th of the loaded
d860: 20 66 69 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20   file...        
d870: 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  #..        retur
d880: 6e 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20  n $fileName..   
d890: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65     }....      re
d8a0: 74 75 72 6e 20 22 22 0d 0a 20 20 20 20 7d 0d 0a  turn ""..    }..
d8b0: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 69 73 53 51  ...    proc isSQ
d8c0: 4c 69 74 65 52 65 61 64 79 20 7b 7d 20 7b 0d 0a  LiteReady {} {..
d8d0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
d8e0: 20 4e 4f 54 45 3a 20 54 68 69 73 20 70 72 6f 63   NOTE: This proc
d8f0: 65 64 75 72 65 20 6d 75 73 74 20 72 65 74 75 72  edure must retur
d900: 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 6e 6c 79 20  n non-zero only 
d910: 69 66 20 74 68 65 20 53 51 4c 69 74 65 20 6e 61  if the SQLite na
d920: 74 69 76 65 0d 0a 20 20 20 20 20 20 23 20 20 20  tive..      #   
d930: 20 20 20 20 6c 69 62 72 61 72 79 20 61 6e 64 20      library and 
d940: 74 68 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  the System.Data.
d950: 53 51 4c 69 74 65 20 6d 61 6e 61 67 65 64 20 61  SQLite managed a
d960: 73 73 65 6d 62 6c 79 20 61 72 65 20 6c 6f 61 64  ssembly are load
d970: 65 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ed..      #     
d980: 20 20 61 6e 64 20 72 65 61 64 79 20 66 6f 72 20    and ready for 
d990: 75 73 65 20 62 79 20 74 68 65 20 74 65 73 74 20  use by the test 
d9a0: 73 75 69 74 65 2e 20 20 43 75 72 72 65 6e 74 6c  suite.  Currentl
d9b0: 79 2c 20 74 68 69 73 20 70 72 6f 63 65 64 75 72  y, this procedur
d9c0: 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
d9d0: 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65   should be calle
d9e0: 64 20 6f 6e 6c 79 20 61 66 74 65 72 20 74 68 65  d only after the
d9f0: 20 5b 74 72 79 4c 6f 61 64 41 73 73 65 6d 62 6c   [tryLoadAssembl
da00: 79 5d 20 70 72 6f 63 65 64 75 72 65 20 68 61 73  y] procedure has
da10: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
da20: 62 65 65 6e 20 63 61 6c 6c 65 64 20 74 6f 20 70  been called to p
da30: 72 6f 62 65 20 66 6f 72 20 74 68 65 20 53 79 73  robe for the Sys
da40: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20  tem.Data.SQLite 
da50: 6d 61 6e 61 67 65 64 20 61 73 73 65 6d 62 6c 79  managed assembly
da60: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
da70: 61 6e 64 20 74 68 65 20 5b 63 68 65 63 6b 46 6f  and the [checkFo
da80: 72 53 51 4c 69 74 65 5d 20 70 72 6f 63 65 64 75  rSQLite] procedu
da90: 72 65 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c  re has been call
daa0: 65 64 20 74 6f 20 70 72 6f 62 65 20 66 6f 72 0d  ed to probe for.
dab0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74  .      #       t
dac0: 68 65 20 53 51 4c 69 74 65 20 6e 61 74 69 76 65  he SQLite native
dad0: 20 6c 69 62 72 61 72 79 3b 20 6f 74 68 65 72 77   library; otherw
dae0: 69 73 65 2c 20 74 68 69 73 20 70 72 6f 63 65 64  ise, this proced
daf0: 75 72 65 20 77 69 6c 6c 20 73 69 6d 70 6c 79 0d  ure will simply.
db00: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61  .      #       a
db10: 6c 77 61 79 73 20 72 65 74 75 72 6e 20 7a 65 72  lways return zer
db20: 6f 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  o...      #..   
db30: 20 20 20 72 65 74 75 72 6e 20 5b 65 78 70 72 20     return [expr 
db40: 7b 0d 0a 20 20 20 20 20 20 20 20 5b 68 61 76 65  {..        [have
db50: 43 6f 6e 73 74 72 61 69 6e 74 20 53 79 73 74 65  Constraint Syste
db60: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 5d 20 26  m.Data.SQLite] &
db70: 26 20 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e  & [haveConstrain
db80: 74 20 53 51 4c 69 74 65 5d 0d 0a 20 20 20 20 20  t SQLite]..     
db90: 20 7d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20   }]..    }..... 
dba0: 20 20 20 70 72 6f 63 20 6d 61 74 63 68 50 6c 61     proc matchPla
dbb0: 74 66 6f 72 6d 20 7b 20 70 6c 61 74 66 6f 72 6d  tform { platform
dbc0: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20   } {..      #.. 
dbd0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 6e 20       # NOTE: An 
dbe0: 65 6d 70 74 79 20 73 74 72 69 6e 67 20 66 6f 72  empty string for
dbf0: 20 74 68 65 20 70 6c 61 74 66 6f 72 6d 20 6d 65   the platform me
dc00: 61 6e 73 20 74 68 61 74 20 74 68 65 20 62 75 69  ans that the bui
dc10: 6c 64 20 69 73 20 6e 6f 74 0d 0a 20 20 20 20 20  ld is not..     
dc20: 20 23 20 20 20 20 20 20 20 5b 70 72 69 6d 61 72   #       [primar
dc30: 69 6c 79 5d 20 61 20 6e 61 74 69 76 65 20 62 75  ily] a native bu
dc40: 69 6c 64 3b 20 74 68 65 72 65 66 6f 72 65 2c 20  ild; therefore, 
dc50: 69 74 20 61 6c 77 61 79 73 20 6d 61 74 63 68 65  it always matche
dc60: 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  s...      #..   
dc70: 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
dc80: 65 6e 67 74 68 20 24 70 6c 61 74 66 6f 72 6d 5d  ength $platform]
dc90: 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
dca0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72         return tr
dcb0: 75 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ue..      }.... 
dcc0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
dcd0: 4e 4f 54 45 3a 20 49 66 20 74 68 65 20 6d 61 63  NOTE: If the mac
dce0: 68 69 6e 65 20 6e 61 6d 65 20 69 73 20 75 6e 61  hine name is una
dcf0: 76 61 69 6c 61 62 6c 65 2c 20 74 68 65 72 65 20  vailable, there 
dd00: 69 73 20 6e 6f 74 68 69 67 6e 20 65 6c 73 65 20  is nothign else 
dd10: 77 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  we..      #     
dd20: 20 20 63 61 6e 20 64 6f 2e 0d 0a 20 20 20 20 20    can do...     
dd30: 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b   #..      if {![
dd40: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 63  info exists ::tc
dd50: 6c 5f 70 6c 61 74 66 6f 72 6d 28 6d 61 63 68 69  l_platform(machi
dd60: 6e 65 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ne)]} then {..  
dd70: 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c        return fal
dd80: 73 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  se..      }.... 
dd90: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
dda0: 4e 4f 54 45 3a 20 44 6f 65 73 20 74 68 65 20 73  NOTE: Does the s
ddb0: 70 65 63 69 66 69 65 64 20 70 6c 61 74 66 6f 72  pecified platfor
ddc0: 6d 20 6d 61 74 63 68 20 75 70 20 74 6f 20 74 68  m match up to th
ddd0: 65 20 63 75 72 72 65 6e 74 20 70 72 6f 63 65 73  e current proces
dde0: 73 3f 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  s?..      #..   
ddf0: 20 20 20 69 66 20 7b 24 70 6c 61 74 66 6f 72 6d     if {$platform
de00: 20 65 71 20 5b 6d 61 63 68 69 6e 65 54 6f 50 6c   eq [machineToPl
de10: 61 74 66 6f 72 6d 20 24 3a 3a 74 63 6c 5f 70 6c  atform $::tcl_pl
de20: 61 74 66 6f 72 6d 28 6d 61 63 68 69 6e 65 29 5d  atform(machine)]
de30: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
de40: 20 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20    return true.. 
de50: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
de60: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
de70: 20 54 68 65 20 73 70 65 63 69 66 69 65 64 20 70   The specified p
de80: 6c 61 74 66 6f 72 6d 20 64 6f 65 73 20 6e 6f 74  latform does not
de90: 20 6d 61 74 63 68 20 75 70 20 77 69 74 68 20 74   match up with t
dea0: 68 65 20 70 6c 61 74 66 6f 72 6d 0d 0a 20 20 20  he platform..   
deb0: 20 20 20 23 20 20 20 20 20 20 20 66 6f 72 20 74     #       for t
dec0: 68 65 20 63 75 72 72 65 6e 74 20 70 72 6f 63 65  he current proce
ded0: 73 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ss...      #..  
dee0: 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65      return false
def0: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
df00: 70 72 6f 63 20 68 61 76 65 53 51 4c 69 74 65 4f  proc haveSQLiteO
df10: 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 20 7b 7d 20  bjectCommand {} 
df20: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
df30: 20 20 23 20 4e 4f 54 45 3a 20 49 73 20 74 68 65    # NOTE: Is the
df40: 20 5b 6f 62 6a 65 63 74 5d 20 63 6f 6d 6d 61 6e   [object] comman
df50: 64 20 63 75 72 72 65 6e 74 6c 79 20 61 76 61 69  d currently avai
df60: 6c 61 62 6c 65 3f 0d 0a 20 20 20 20 20 20 23 0d  lable?..      #.
df70: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 65  .      return [e
df80: 78 70 72 20 7b 5b 6c 6c 65 6e 67 74 68 20 5b 69  xpr {[llength [i
df90: 6e 66 6f 20 63 6f 6d 6d 61 6e 64 73 20 6f 62 6a  nfo commands obj
dfa0: 65 63 74 5d 5d 20 3e 20 30 7d 5d 0d 0a 20 20 20  ect]] > 0}]..   
dfb0: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
dfc0: 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 4f 62  checkForSQLiteOb
dfd0: 6a 65 63 74 43 6f 6d 6d 61 6e 64 20 7b 20 63 68  jectCommand { ch
dfe0: 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20 20 20  annel } {..     
dff0: 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
e000: 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66  "---- checking f
e010: 6f 72 20 5c 22 6f 62 6a 65 63 74 5c 22 20 63 6f  or \"object\" co
e020: 6d 6d 61 6e 64 20 75 73 61 67 65 2e 2e 2e 20 22  mmand usage... "
e030: 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b  ....      if {![
e040: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
e050: 28 73 71 6c 69 74 65 4f 62 6a 65 63 74 43 6f 6d  (sqliteObjectCom
e060: 6d 61 6e 64 29 5d 20 26 26 20 5c 0d 0a 20 20 20  mand)] && \..   
e070: 20 20 20 20 20 20 20 5b 68 61 76 65 53 51 4c 69         [haveSQLi
e080: 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d  teObjectCommand]
e090: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
e0a0: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
e0b0: 20 79 65 73 5c 6e 0d 0a 20 20 20 20 20 20 7d 20   yes\n..      } 
e0c0: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
e0d0: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
e0e0: 45 3a 20 55 6e 6c 65 73 73 20 77 65 20 61 72 65  E: Unless we are
e0f0: 20 66 6f 72 62 69 64 64 65 6e 20 66 72 6f 6d 20   forbidden from 
e100: 64 6f 69 6e 67 20 73 6f 2c 20 61 64 64 20 73 6f  doing so, add so
e110: 6d 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 0d 0a  me constraints..
e120: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
e130: 74 68 61 74 20 77 69 6c 6c 20 61 6c 6c 6f 77 20  that will allow 
e140: 6d 6f 73 74 20 6f 66 20 74 68 65 20 74 65 73 74  most of the test
e150: 20 73 75 69 74 65 20 74 6f 20 72 75 6e 20 28 69   suite to run (i
e160: 2e 65 2e 20 74 68 6f 73 65 0d 0a 20 20 20 20 20  .e. those..     
e170: 20 20 20 23 20 20 20 20 20 20 20 74 65 73 74 73     #       tests
e180: 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 64 69 72   that do not dir
e190: 65 63 74 6c 79 20 72 65 6c 79 20 75 70 6f 6e 20  ectly rely upon 
e1a0: 74 68 65 20 5b 6f 62 6a 65 63 74 5d 20 63 6f 6d  the [object] com
e1b0: 6d 61 6e 64 29 2e 0d 0a 20 20 20 20 20 20 20 20  mand)...        
e1c0: 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21  #..        if {!
e1d0: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
e1e0: 6f 28 73 68 69 6d 53 51 4c 69 74 65 41 73 73 65  o(shimSQLiteAsse
e1f0: 6d 62 6c 79 43 6f 6e 73 74 72 61 69 6e 74 73 29  mblyConstraints)
e200: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
e210: 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
e220: 6e 74 20 53 51 4c 69 74 65 0d 0a 20 20 20 20 20  nt SQLite..     
e230: 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
e240: 6e 74 20 53 51 4c 69 74 65 49 6e 74 65 72 6f 70  nt SQLiteInterop
e250: 0d 0a 20 20 20 20 20 20 20 20 20 20 61 64 64 43  ..          addC
e260: 6f 6e 73 74 72 61 69 6e 74 20 53 79 73 74 65 6d  onstraint System
e270: 2e 44 61 74 61 2e 53 51 4c 69 74 65 0d 0a 20 20  .Data.SQLite..  
e280: 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74          addConst
e290: 72 61 69 6e 74 20 53 79 73 74 65 6d 2e 44 61 74  raint System.Dat
e2a0: 61 2e 53 51 4c 69 74 65 2e 45 6e 63 72 79 70 74  a.SQLite.Encrypt
e2b0: 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 61  ion..          a
e2c0: 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 53 79 73  ddConstraint Sys
e2d0: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
e2e0: 4c 69 6e 71 0d 0a 0d 0a 20 20 20 20 20 20 20 20  Linq....        
e2f0: 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20    addConstraint 
e300: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
e310: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73               Sys
e320: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
e330: 64 6c 6c 5f 76 20 5b 67 65 74 42 75 69 6c 64 43  dll_v [getBuildC
e340: 6c 72 56 65 72 73 69 6f 6e 5d 5d 0d 0a 20 20 20  lrVersion]]..   
e350: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
e360: 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
e370: 73 74 73 20 3a 3a 6e 6f 28 73 68 69 6d 53 51 4c  sts ::no(shimSQL
e380: 69 74 65 44 65 66 69 6e 65 43 6f 6e 73 74 61 6e  iteDefineConstan
e390: 74 43 6f 6e 73 74 72 61 69 6e 74 73 29 5d 7d 20  tConstraints)]} 
e3a0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
e3b0: 20 20 66 6f 72 65 61 63 68 20 64 65 66 69 6e 65    foreach define
e3c0: 43 6f 6e 73 74 61 6e 74 20 5b 6c 69 73 74 20 5c  Constant [list \
e3d0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
e3e0: 49 4e 54 45 52 4f 50 5f 45 58 54 45 4e 53 49 4f  INTEROP_EXTENSIO
e3f0: 4e 5f 46 55 4e 43 54 49 4f 4e 53 20 49 4e 54 45  N_FUNCTIONS INTE
e400: 52 4f 50 5f 46 54 53 35 5f 45 58 54 45 4e 53 49  ROP_FTS5_EXTENSI
e410: 4f 4e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ON \..          
e420: 20 20 20 20 49 4e 54 45 52 4f 50 5f 4a 53 4f 4e      INTEROP_JSON
e430: 31 5f 45 58 54 45 4e 53 49 4f 4e 20 49 4e 54 45  1_EXTENSION INTE
e440: 52 4f 50 5f 50 45 52 43 45 4e 54 49 4c 45 5f 45  ROP_PERCENTILE_E
e450: 58 54 45 4e 53 49 4f 4e 20 5c 0d 0a 20 20 20 20  XTENSION \..    
e460: 20 20 20 20 20 20 20 20 20 20 49 4e 54 45 52 4f            INTERO
e470: 50 5f 52 45 47 45 58 50 5f 45 58 54 45 4e 53 49  P_REGEXP_EXTENSI
e480: 4f 4e 20 49 4e 54 45 52 4f 50 5f 54 45 53 54 5f  ON INTEROP_TEST_
e490: 45 58 54 45 4e 53 49 4f 4e 20 5c 0d 0a 20 20 20  EXTENSION \..   
e4a0: 20 20 20 20 20 20 20 20 20 20 20 49 4e 54 45 52             INTER
e4b0: 4f 50 5f 53 45 53 53 49 4f 4e 5f 45 58 54 45 4e  OP_SESSION_EXTEN
e4c0: 53 49 4f 4e 20 49 4e 54 45 52 4f 50 5f 53 48 41  SION INTEROP_SHA
e4d0: 31 5f 45 58 54 45 4e 53 49 4f 4e 20 5c 0d 0a 20  1_EXTENSION \.. 
e4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 49 4e 54               INT
e4f0: 45 52 4f 50 5f 54 4f 54 59 50 45 5f 45 58 54 45  EROP_TOTYPE_EXTE
e500: 4e 53 49 4f 4e 20 49 4e 54 45 52 4f 50 5f 56 49  NSION INTEROP_VI
e510: 52 54 55 41 4c 5f 54 41 42 4c 45 20 5c 0d 0a 20  RTUAL_TABLE \.. 
e520: 20 20 20 20 20 20 20 20 20 20 20 20 20 55 53 45               USE
e530: 5f 49 4e 54 45 52 4f 50 5f 44 4c 4c 5d 20 7b 0d  _INTEROP_DLL] {.
e540: 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 64 64  .            add
e550: 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65  Constraint [appe
e560: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
e570: 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 53 51            [getSQ
e580: 4c 69 74 65 44 65 66 69 6e 65 43 6f 6e 73 74 61  LiteDefineConsta
e590: 6e 74 50 72 65 66 69 78 5d 20 24 64 65 66 69 6e  ntPrefix] $defin
e5a0: 65 43 6f 6e 73 74 61 6e 74 5d 0d 0a 20 20 20 20  eConstant]..    
e5b0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
e5c0: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66   }....        if
e5d0: 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
e5e0: 3a 3a 6e 6f 28 73 68 69 6d 53 51 4c 69 74 65 56  ::no(shimSQLiteV
e5f0: 69 73 75 61 6c 53 74 75 64 69 6f 43 6f 6e 73 74  isualStudioConst
e600: 72 61 69 6e 74 73 29 5d 7d 20 74 68 65 6e 20 7b  raints)]} then {
e610: 0d 0a 20 20 20 20 20 20 20 20 20 20 61 64 64 43  ..          addC
e620: 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e  onstraint [appen
e630: 64 41 72 67 73 20 76 69 73 75 61 6c 53 74 75 64  dArgs visualStud
e640: 69 6f 20 5b 67 65 74 42 75 69 6c 64 59 65 61 72  io [getBuildYear
e650: 5d 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  ]]..        }...
e660: 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
e670: 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20  channel no\n..  
e680: 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
e690: 0a 20 20 20 20 70 72 6f 63 20 63 68 61 6e 67 65  .    proc change
e6a0: 4e 61 74 69 76 65 52 75 6e 74 69 6d 65 4f 70 74  NativeRuntimeOpt
e6b0: 69 6f 6e 20 7b 20 6e 61 74 69 76 65 20 7d 20 7b  ion { native } {
e6c0: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 6c 6c 65  ..      if {[lle
e6d0: 6e 67 74 68 20 5b 69 6e 66 6f 20 63 6f 6d 6d 61  ngth [info comma
e6e0: 6e 64 73 20 64 65 62 75 67 5d 5d 20 3e 20 30 20  nds debug]] > 0 
e6f0: 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
e700: 5b 6c 6c 65 6e 67 74 68 20 5b 69 6e 66 6f 20 73  [llength [info s
e710: 75 62 63 6f 6d 6d 61 6e 64 73 20 64 65 62 75 67  ubcommands debug
e720: 20 72 75 6e 74 69 6d 65 6f 70 74 69 6f 6e 5d 5d   runtimeoption]]
e730: 20 3e 20 30 20 26 26 20 5b 63 61 74 63 68 20 7b   > 0 && [catch {
e740: 0d 0a 20 20 20 20 20 20 20 20 64 65 62 75 67 20  ..        debug 
e750: 72 75 6e 74 69 6d 65 6f 70 74 69 6f 6e 20 5b 65  runtimeoption [e
e760: 78 70 72 20 7b 24 6e 61 74 69 76 65 20 3f 20 22  xpr {$native ? "
e770: 61 64 64 22 20 3a 20 22 72 65 6d 6f 76 65 22 7d  add" : "remove"}
e780: 5d 20 6e 61 74 69 76 65 0d 0a 20 20 20 20 20 20  ] native..      
e790: 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  }] == 0} then {.
e7a0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
e7b0: 74 72 75 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  true..      }...
e7c0: 0a 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65  .      if {[have
e7d0: 53 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d  SQLiteObjectComm
e7e0: 61 6e 64 5d 20 26 26 20 5b 63 61 74 63 68 20 7b  and] && [catch {
e7f0: 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74  ..        object
e800: 20 69 6e 76 6f 6b 65 20 49 6e 74 65 72 70 72 65   invoke Interpre
e810: 74 65 72 2e 47 65 74 41 63 74 69 76 65 20 5b 65  ter.GetActive [e
e820: 78 70 72 20 7b 24 6e 61 74 69 76 65 20 3f 20 5c  xpr {$native ? \
e830: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 41  ..            "A
e840: 64 64 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 22  ddRuntimeOption"
e850: 20 3a 20 22 52 65 6d 6f 76 65 52 75 6e 74 69 6d   : "RemoveRuntim
e860: 65 4f 70 74 69 6f 6e 22 7d 5d 20 6e 61 74 69 76  eOption"}] nativ
e870: 65 0d 0a 20 20 20 20 20 20 7d 5d 20 3d 3d 20 30  e..      }] == 0
e880: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
e890: 20 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20    return true.. 
e8a0: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
e8b0: 72 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20  return false..  
e8c0: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
e8d0: 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 42   checkForSQLiteB
e8e0: 75 69 6c 64 73 20 7b 20 63 68 61 6e 6e 65 6c 20  uilds { channel 
e8f0: 7b 73 65 6c 65 63 74 20 66 61 6c 73 65 7d 20 7d  {select false} }
e900: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
e910: 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b     # NOTE: Check
e920: 20 66 6f 72 20 65 76 65 72 79 20 70 6f 73 73 69   for every possi
e930: 62 6c 65 20 76 61 6c 69 64 20 63 6f 6d 62 69 6e  ble valid combin
e940: 61 74 69 6f 6e 20 6f 66 20 76 61 6c 75 65 73 20  ation of values 
e950: 75 73 65 64 20 77 68 65 6e 0d 0a 20 20 20 20 20  used when..     
e960: 20 23 20 20 20 20 20 20 20 6c 6f 63 61 74 69 6e   #       locatin
e970: 67 20 6f 75 74 20 74 68 65 20 62 75 69 6c 64 20  g out the build 
e980: 6f 75 74 70 75 74 20 64 69 72 65 63 74 6f 72 79  output directory
e990: 2c 20 73 68 6f 77 69 6e 67 20 65 61 63 68 20 61  , showing each a
e9a0: 76 61 69 6c 61 62 6c 65 0d 0a 20 20 20 20 20 20  vailable..      
e9b0: 23 20 20 20 20 20 20 20 62 75 69 6c 64 20 76 61  #       build va
e9c0: 72 69 61 74 69 6f 6e 20 61 6c 6f 6e 67 20 74 68  riation along th
e9d0: 65 20 77 61 79 2e 0d 0a 20 20 20 20 20 20 23 0d  e way...      #.
e9e0: 0a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 6e  .      foreach n
e9f0: 61 74 69 76 65 20 5b 6c 69 73 74 20 66 61 6c 73  ative [list fals
ea00: 65 20 74 72 75 65 5d 20 7b 0d 0a 20 20 20 20 20  e true] {..     
ea10: 20 20 20 66 6f 72 65 61 63 68 20 79 65 61 72 20     foreach year 
ea20: 5b 67 65 74 42 75 69 6c 64 59 65 61 72 73 5d 20  [getBuildYears] 
ea30: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  {..          for
ea40: 65 61 63 68 20 63 6f 6e 66 69 67 75 72 61 74 69  each configurati
ea50: 6f 6e 20 5b 67 65 74 42 75 69 6c 64 43 6f 6e 66  on [getBuildConf
ea60: 69 67 75 72 61 74 69 6f 6e 73 5d 20 7b 0d 0a 20  igurations] {.. 
ea70: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
ea80: 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
ea90: 3a 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65  : Figure out the
eaa0: 20 65 66 66 65 63 74 69 76 65 20 62 75 69 6c 64   effective build
eab0: 20 70 6c 61 74 66 6f 72 6d 2e 20 20 54 68 69 73   platform.  This
eac0: 20 69 73 0d 0a 20 20 20 20 20 20 20 20 20 20 20   is..           
ead0: 20 23 20 20 20 20 20 20 20 62 61 73 65 64 20 6f   #       based o
eae0: 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  n whether or not
eaf0: 20 61 20 5b 70 72 69 6d 61 72 69 6c 79 5d 20 6e   a [primarily] n
eb00: 61 74 69 76 65 20 62 75 69 6c 64 0d 0a 20 20 20  ative build..   
eb10: 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
eb20: 20 69 73 20 62 65 69 6e 67 20 75 73 65 64 2e 20   is being used. 
eb30: 20 46 6f 72 20 5b 70 72 69 6d 61 72 69 6c 79 5d   For [primarily]
eb40: 20 6e 6f 6e 2d 6e 61 74 69 76 65 20 62 75 69 6c   non-native buil
eb50: 64 73 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ds,..           
eb60: 20 23 20 20 20 20 20 20 20 74 68 69 73 20 77 69   #       this wi
eb70: 6c 6c 20 62 65 20 61 6e 20 65 6d 70 74 79 20 73  ll be an empty s
eb80: 74 72 69 6e 67 2e 0d 0a 20 20 20 20 20 20 20 20  tring...        
eb90: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
eba0: 20 20 20 73 65 74 20 70 6c 61 74 66 6f 72 6d 20     set platform 
ebb0: 5b 67 65 74 42 75 69 6c 64 50 6c 61 74 66 6f 72  [getBuildPlatfor
ebc0: 6d 20 24 6e 61 74 69 76 65 5d 0d 0a 0d 0a 20 20  m $native]....  
ebd0: 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
ebe0: 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
ebf0: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
ec00: 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68          "---- ch
ec10: 65 63 6b 69 6e 67 20 66 6f 72 20 53 79 73 74 65  ecking for Syste
ec20: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 62 75  m.Data.SQLite bu
ec30: 69 6c 64 20 5c 22 22 20 5b 65 78 70 72 20 5c 0d  ild \"" [expr \.
ec40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ec50: 20 7b 24 6e 61 74 69 76 65 20 3f 20 22 6e 61 74   {$native ? "nat
ec60: 69 76 65 2f 22 20 3a 20 22 22 7d 5d 20 5b 65 78  ive/" : ""}] [ex
ec70: 70 72 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  pr {[string leng
ec80: 74 68 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  th \..          
ec90: 20 20 20 20 20 20 24 70 6c 61 74 66 6f 72 6d 5d        $platform]
eca0: 20 3e 20 30 20 3f 20 5b 61 70 70 65 6e 64 41 72   > 0 ? [appendAr
ecb0: 67 73 20 24 70 6c 61 74 66 6f 72 6d 20 2f 5d 20  gs $platform /] 
ecc0: 3a 20 22 22 7d 5d 20 24 79 65 61 72 20 5c 0d 0a  : ""}] $year \..
ecd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ece0: 2f 20 24 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  / $configuration
ecf0: 20 22 5c 22 2e 2e 2e 20 22 5d 0d 0a 0d 0a 20 20   "\"... "]....  
ed00: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
ed10: 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
ed20: 20 42 75 69 6c 64 20 74 68 65 20 66 75 6c 6c 79   Build the fully
ed30: 20 71 75 61 6c 69 66 69 65 64 20 64 69 72 65 63   qualified direc
ed40: 74 6f 72 79 20 77 68 65 72 65 20 74 68 65 20 6e  tory where the n
ed50: 65 63 65 73 73 61 72 79 0d 0a 20 20 20 20 20 20  ecessary..      
ed60: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f        #       co
ed70: 6d 70 6f 6e 65 6e 74 73 20 66 6f 72 20 53 79 73  mponents for Sys
ed80: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20  tem.Data.SQLite 
ed90: 73 68 6f 75 6c 64 20 62 65 20 66 6f 75 6e 64 2e  should be found.
eda0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d  ..            #.
edb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74  .            set
edc0: 20 64 69 72 65 63 74 6f 72 79 20 5b 6a 6f 69 6e   directory [join
edd0: 42 75 69 6c 64 44 69 72 65 63 74 6f 72 79 20 24  BuildDirectory $
ede0: 6e 61 74 69 76 65 20 5c 0d 0a 20 20 20 20 20 20  native \..      
edf0: 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 42 75            [getBu
ee00: 69 6c 64 42 61 73 65 44 69 72 65 63 74 6f 72 79  ildBaseDirectory
ee10: 5d 20 24 79 65 61 72 20 24 70 6c 61 74 66 6f 72  ] $year $platfor
ee20: 6d 20 24 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  m $configuration
ee30: 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ]....           
ee40: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
ee50: 23 20 4e 4f 54 45 3a 20 44 6f 20 74 68 65 20 6e  # NOTE: Do the n
ee60: 65 63 65 73 73 61 72 79 20 66 69 6c 65 73 20 65  ecessary files e
ee70: 78 69 73 74 3f 20 20 43 75 72 72 65 6e 74 6c 79  xist?  Currently
ee80: 2c 20 6e 6f 20 6f 74 68 65 72 20 73 74 65 70 73  , no other steps
ee90: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20  ..            # 
eea0: 20 20 20 20 20 20 61 72 65 20 74 61 6b 65 6e 20        are taken 
eeb0: 74 6f 20 76 65 72 69 66 79 20 74 68 69 73 20 62  to verify this b
eec0: 75 69 6c 64 20 69 73 20 61 63 74 75 61 6c 6c 79  uild is actually
eed0: 20 76 69 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20   viable...      
eee0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
eef0: 20 20 20 20 20 69 66 20 7b 5b 69 73 42 75 69 6c       if {[isBuil
ef00: 64 41 76 61 69 6c 61 62 6c 65 20 24 6e 61 74 69  dAvailable $nati
ef10: 76 65 20 24 64 69 72 65 63 74 6f 72 79 5d 7d 20  ve $directory]} 
ef20: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
ef30: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
ef40: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57         # NOTE: W
ef50: 68 65 6e 20 69 6e 20 22 73 65 6c 65 63 74 22 20  hen in "select" 
ef60: 6d 6f 64 65 2c 20 61 75 74 6f 6d 61 74 69 63 61  mode, automatica
ef70: 6c 6c 79 20 73 65 6c 65 63 74 20 74 68 65 20 66  lly select the f
ef80: 69 72 73 74 0d 0a 20 20 20 20 20 20 20 20 20 20  irst..          
ef90: 20 20 20 20 23 20 20 20 20 20 20 20 61 76 61 69      #       avai
efa0: 6c 61 62 6c 65 20 62 75 69 6c 64 20 6f 66 20 53  lable build of S
efb0: 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
efc0: 65 20 61 6e 64 20 74 68 65 6e 20 72 65 74 75 72  e and then retur
efd0: 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n..             
efe0: 20 23 20 20 20 20 20 20 20 69 6d 6d 65 64 69 61   #       immedia
eff0: 74 65 6c 79 2e 0d 0a 20 20 20 20 20 20 20 20 20  tely...         
f000: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
f010: 20 20 20 20 20 20 69 66 20 7b 24 73 65 6c 65 63        if {$selec
f020: 74 20 26 26 20 5b 6d 61 74 63 68 50 6c 61 74 66  t && [matchPlatf
f030: 6f 72 6d 20 24 70 6c 61 74 66 6f 72 6d 5d 7d 20  orm $platform]} 
f040: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
f050: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
f060: 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
f070: 45 3a 20 4d 61 6e 75 61 6c 6c 79 20 6f 76 65 72  E: Manually over
f080: 72 69 64 65 20 61 6c 6c 20 74 68 65 20 62 75 69  ride all the bui
f090: 6c 64 20 64 69 72 65 63 74 6f 72 79 20 73 65 6c  ld directory sel
f0a0: 65 63 74 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20  ection..        
f0b0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
f0c0: 72 65 6c 61 74 65 64 20 74 65 73 74 20 73 65 74  related test set
f0d0: 74 69 6e 67 73 20 69 6e 20 6f 72 64 65 72 20 74  tings in order t
f0e0: 6f 20 66 6f 72 63 65 20 74 68 69 73 20 62 75 69  o force this bui
f0f0: 6c 64 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ld..            
f100: 20 20 20 20 23 20 20 20 20 20 20 20 6f 66 20 53      #       of S
f110: 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
f120: 65 20 74 6f 20 62 65 20 75 73 65 64 2e 0d 0a 20  e to be used... 
f130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
f140: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
f150: 20 20 69 66 20 7b 21 5b 63 68 61 6e 67 65 4e 61    if {![changeNa
f160: 74 69 76 65 52 75 6e 74 69 6d 65 4f 70 74 69 6f  tiveRuntimeOptio
f170: 6e 20 24 6e 61 74 69 76 65 5d 7d 20 74 68 65 6e  n $native]} then
f180: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
f190: 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
f1a0: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
f1b0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
f1c0: 20 20 20 20 20 20 20 20 20 20 22 6e 6f 2c 20 66            "no, f
f1d0: 61 69 6c 65 64 20 74 6f 20 22 20 5b 65 78 70 72  ailed to " [expr
f1e0: 20 7b 24 6e 61 74 69 76 65 20 3f 20 22 61 64 64   {$native ? "add
f1f0: 22 20 3a 20 22 72 65 6d 6f 76 65 22 7d 5d 20 5c  " : "remove"}] \
f200: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
f210: 20 20 20 20 20 20 20 20 22 20 74 68 65 20 5c 22          " the \"
f220: 6e 61 74 69 76 65 5c 22 20 72 75 6e 74 69 6d 65  native\" runtime
f230: 20 6f 70 74 69 6f 6e 5c 6e 22 5d 0d 0a 0d 0a 20   option\n"].... 
f240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f250: 20 72 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20   return false.. 
f260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
f270: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
f280: 20 20 20 20 73 65 74 20 3a 3a 74 65 73 74 5f 79      set ::test_y
f290: 65 61 72 20 24 79 65 61 72 0d 0a 20 20 20 20 20  ear $year..     
f2a0: 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 3a             set :
f2b0: 3a 74 65 73 74 5f 70 6c 61 74 66 6f 72 6d 20 24  :test_platform $
f2c0: 70 6c 61 74 66 6f 72 6d 0d 0a 20 20 20 20 20 20  platform..      
f2d0: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 3a 3a            set ::
f2e0: 74 65 73 74 5f 63 6f 6e 66 69 67 75 72 61 74 69  test_configurati
f2f0: 6f 6e 20 24 63 6f 6e 66 69 67 75 72 61 74 69 6f  on $configuratio
f300: 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n....           
f310: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
f320: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
f330: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
f340: 20 20 20 20 20 20 20 22 79 65 73 2c 20 73 65 6c         "yes, sel
f350: 65 63 74 65 64 20 28 22 20 5b 65 78 70 72 20 7b  ected (" [expr {
f360: 24 6e 61 74 69 76 65 20 3f 20 22 6e 61 74 69 76  $native ? "nativ
f370: 65 2f 22 20 3a 20 22 22 7d 5d 20 5c 0d 0a 20 20  e/" : ""}] \..  
f380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f390: 20 20 5b 65 78 70 72 20 7b 5b 73 74 72 69 6e 67    [expr {[string
f3a0: 20 6c 65 6e 67 74 68 20 24 70 6c 61 74 66 6f 72   length $platfor
f3b0: 6d 5d 20 3e 20 30 20 3f 20 5b 61 70 70 65 6e 64  m] > 0 ? [append
f3c0: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
f3d0: 20 20 20 20 20 20 20 20 20 20 20 20 24 70 6c 61              $pla
f3e0: 74 66 6f 72 6d 20 2f 5d 20 3a 20 22 22 7d 5d 20  tform /] : ""}] 
f3f0: 24 79 65 61 72 20 2f 20 24 63 6f 6e 66 69 67 75  $year / $configu
f400: 72 61 74 69 6f 6e 20 22 29 5c 6e 22 5d 0d 0a 0d  ration ")\n"]...
f410: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f420: 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20   return true..  
f430: 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c              } el
f440: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
f450: 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
f460: 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20 20 20 20  nnel yes\n..    
f470: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
f480: 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20           } else 
f490: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
f4a0: 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
f4b0: 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20 20  no\n..          
f4c0: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d    }..          }
f4d0: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
f4e0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65     }....      re
f4f0: 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20  turn false..    
f500: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63  }.....    proc c
f510: 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 52 65 6c  heckForSQLiteRel
f520: 65 61 73 65 73 20 7b 20 63 68 61 6e 6e 65 6c 20  eases { channel 
f530: 7b 73 65 6c 65 63 74 20 66 61 6c 73 65 7d 20 7d  {select false} }
f540: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
f550: 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b     # NOTE: Check
f560: 20 66 6f 72 20 70 61 73 74 20 72 65 6c 65 61 73   for past releas
f570: 65 73 20 6f 66 20 53 79 73 74 65 6d 2e 44 61 74  es of System.Dat
f580: 61 2e 53 51 4c 69 74 65 20 69 6e 20 74 68 65 20  a.SQLite in the 
f590: 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20  directory..     
f5a0: 20 23 20 20 20 20 20 20 20 63 6f 6e 74 61 69 6e   #       contain
f5b0: 65 64 20 69 6e 20 74 68 65 20 22 53 79 73 74 65  ed in the "Syste
f5c0: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 22 20 65  m.Data.SQLite" e
f5d0: 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61  nvironment varia
f5e0: 62 6c 65 2c 20 69 66 0d 0a 20 20 20 20 20 20 23  ble, if..      #
f5f0: 20 20 20 20 20 20 20 70 72 65 73 65 6e 74 2e 0d         present..
f600: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
f610: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
f620: 20 3a 3a 65 6e 76 28 53 79 73 74 65 6d 2e 44 61   ::env(System.Da
f630: 74 61 2e 53 51 4c 69 74 65 29 5d 20 26 26 20 5c  ta.SQLite)] && \
f640: 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72  ..          [str
f650: 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 65 6e  ing length $::en
f660: 76 28 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  v(System.Data.SQ
f670: 4c 69 74 65 29 5d 20 3e 20 30 7d 20 74 68 65 6e  Lite)] > 0} then
f680: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
f690: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42         # NOTE: B
f6a0: 75 69 6c 64 20 74 68 65 20 66 75 6c 6c 79 20 71  uild the fully q
f6b0: 75 61 6c 69 66 69 65 64 20 64 69 72 65 63 74 6f  ualified directo
f6c0: 72 79 20 77 68 65 72 65 20 74 68 65 20 6e 65 63  ry where the nec
f6d0: 65 73 73 61 72 79 0d 0a 20 20 20 20 20 20 20 20  essary..        
f6e0: 23 20 20 20 20 20 20 20 63 6f 6d 70 6f 6e 65 6e  #       componen
f6f0: 74 73 20 66 6f 72 20 53 79 73 74 65 6d 2e 44 61  ts for System.Da
f700: 74 61 2e 53 51 4c 69 74 65 20 73 68 6f 75 6c 64  ta.SQLite should
f710: 20 62 65 20 66 6f 75 6e 64 2e 0d 0a 20 20 20 20   be found...    
f720: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73      #..        s
f730: 65 74 20 64 69 72 65 63 74 6f 72 79 20 5b 66 69  et directory [fi
f740: 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66  le nativename [f
f750: 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20  ile join \..    
f760: 20 20 20 20 20 20 20 20 24 3a 3a 65 6e 76 28 53          $::env(S
f770: 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
f780: 65 29 20 5b 67 65 74 52 65 6c 65 61 73 65 56 65  e) [getReleaseVe
f790: 72 73 69 6f 6e 5d 5d 5d 0d 0a 0d 0a 20 20 20 20  rsion]]]....    
f7a0: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
f7b0: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
f7c0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d  ..            "-
f7d0: 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72  --- checking for
f7e0: 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
f7f0: 69 74 65 20 72 65 6c 65 61 73 65 20 5c 22 22 20  ite release \"" 
f800: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 24  \..            $
f810: 64 69 72 65 63 74 6f 72 79 20 22 5c 22 2e 2e 2e  directory "\"...
f820: 20 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69   "]....        i
f830: 66 20 7b 5b 69 73 52 65 6c 65 61 73 65 41 76 61  f {[isReleaseAva
f840: 69 6c 61 62 6c 65 20 24 64 69 72 65 63 74 6f 72  ilable $director
f850: 79 20 70 6c 61 74 66 6f 72 6d 5d 7d 20 74 68 65  y platform]} the
f860: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69  n {..          i
f870: 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  f {[string lengt
f880: 68 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3d 3d 20  h $platform] == 
f890: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
f8a0: 20 20 20 20 20 20 20 73 65 74 20 70 6c 61 74 66         set platf
f8b0: 6f 72 6d 20 75 6e 6b 6e 6f 77 6e 0d 0a 20 20 20  orm unknown..   
f8c0: 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
f8d0: 20 20 20 20 20 20 69 66 20 7b 24 73 65 6c 65 63        if {$selec
f8e0: 74 20 26 26 20 5b 6d 61 74 63 68 50 6c 61 74 66  t && [matchPlatf
f8f0: 6f 72 6d 20 24 70 6c 61 74 66 6f 72 6d 5d 7d 20  orm $platform]} 
f900: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
f910: 20 20 20 20 73 65 74 20 3a 3a 62 75 69 6c 64 5f      set ::build_
f920: 64 69 72 65 63 74 6f 72 79 20 24 64 69 72 65 63  directory $direc
f930: 74 6f 72 79 0d 0a 0d 0a 20 20 20 20 20 20 20 20  tory....        
f940: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
f950: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22  el [appendArgs "
f960: 79 65 73 2c 20 73 65 6c 65 63 74 65 64 20 28 22  yes, selected ("
f970: 20 24 70 6c 61 74 66 6f 72 6d 20 22 29 5c 6e 22   $platform ")\n"
f980: 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ]....           
f990: 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20   return true..  
f9a0: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
f9b0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
f9c0: 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
f9d0: 70 65 6e 64 41 72 67 73 20 22 79 65 73 20 28 22  pendArgs "yes ("
f9e0: 20 24 70 6c 61 74 66 6f 72 6d 20 22 29 5c 6e 22   $platform ")\n"
f9f0: 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ]..          }..
fa00: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
fa10: 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74  ..          tput
fa20: 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d  s $channel no\n.
fa30: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  ...          if 
fa40: 7b 21 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24  {![file exists $
fa50: 64 69 72 65 63 74 6f 72 79 5d 20 7c 7c 20 5c 0d  directory] || \.
fa60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 21  .              !
fa70: 5b 66 69 6c 65 20 69 73 64 69 72 65 63 74 6f 72  [file isdirector
fa80: 79 20 24 64 69 72 65 63 74 6f 72 79 5d 7d 20 74  y $directory]} t
fa90: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
faa0: 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
fab0: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
fac0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
fad0: 20 22 2d 2d 2d 2d 20 65 6e 76 69 72 6f 6e 6d 65   "---- environme
fae0: 6e 74 20 76 61 72 69 61 62 6c 65 20 5c 22 53 79  nt variable \"Sy
faf0: 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
fb00: 5c 22 20 69 73 20 61 6e 20 22 20 5c 0d 0a 20 20  \" is an " \..  
fb10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 69                "i
fb20: 6e 76 61 6c 69 64 20 64 69 72 65 63 74 6f 72 79  nvalid directory
fb30: 2c 20 73 6b 69 70 70 69 6e 67 20 63 68 65 63 6b  , skipping check
fb40: 20 66 6f 72 20 72 65 6c 65 61 73 65 73 2e 2e 2e   for releases...
fb50: 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  \n"]....        
fb60: 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65      return false
fb70: 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d  ..          }...
fb80: 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61  .          forea
fb90: 63 68 20 70 61 74 68 20 5b 6c 73 6f 72 74 20 2d  ch path [lsort -
fba0: 64 65 63 72 65 61 73 69 6e 67 20 5b 66 69 6c 65  decreasing [file
fbb0: 20 6c 69 73 74 20 24 64 69 72 65 63 74 6f 72 79   list $directory
fbc0: 20 2a 5d 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20   *]] {..        
fbd0: 20 20 20 20 69 66 20 7b 5b 66 69 6c 65 20 65 78      if {[file ex
fbe0: 69 73 74 73 20 24 70 61 74 68 5d 20 26 26 20 5b  ists $path] && [
fbf0: 66 69 6c 65 20 69 73 64 69 72 65 63 74 6f 72 79  file isdirectory
fc00: 20 24 70 61 74 68 5d 7d 20 74 68 65 6e 20 7b 0d   $path]} then {.
fc10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  .              t
fc20: 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
fc30: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
fc40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
fc50: 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f  ---- checking fo
fc60: 72 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  r System.Data.SQ
fc70: 4c 69 74 65 20 72 65 6c 65 61 73 65 20 5c 22 22  Lite release \""
fc80: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
fc90: 20 20 20 20 20 20 24 70 61 74 68 20 22 5c 22 2e        $path "\".
fca0: 2e 2e 20 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  .. "]....       
fcb0: 20 20 20 20 20 20 20 69 66 20 7b 5b 69 73 52 65         if {[isRe
fcc0: 6c 65 61 73 65 41 76 61 69 6c 61 62 6c 65 20 24  leaseAvailable $
fcd0: 70 61 74 68 20 70 6c 61 74 66 6f 72 6d 5d 7d 20  path platform]} 
fce0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
fcf0: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72          if {[str
fd00: 69 6e 67 20 6c 65 6e 67 74 68 20 24 70 6c 61 74  ing length $plat
fd10: 66 6f 72 6d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  form] == 0} then
fd20: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
fd30: 20 20 20 20 20 20 73 65 74 20 70 6c 61 74 66 6f        set platfo
fd40: 72 6d 20 75 6e 6b 6e 6f 77 6e 0d 0a 20 20 20 20  rm unknown..    
fd50: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
fd60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
fd70: 20 69 66 20 7b 24 73 65 6c 65 63 74 20 26 26 20   if {$select && 
fd80: 5b 6d 61 74 63 68 50 6c 61 74 66 6f 72 6d 20 24  [matchPlatform $
fd90: 70 6c 61 74 66 6f 72 6d 5d 7d 20 74 68 65 6e 20  platform]} then 
fda0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
fdb0: 20 20 20 20 20 73 65 74 20 3a 3a 62 75 69 6c 64       set ::build
fdc0: 5f 64 69 72 65 63 74 6f 72 79 20 24 70 61 74 68  _directory $path
fdd0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
fde0: 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
fdf0: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
fe00: 20 22 79 65 73 2c 20 73 65 6c 65 63 74 65 64 20   "yes, selected 
fe10: 28 22 20 24 70 6c 61 74 66 6f 72 6d 20 22 29 5c  (" $platform ")\
fe20: 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  n"]....         
fe30: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
fe40: 74 72 75 65 0d 0a 20 20 20 20 20 20 20 20 20 20  true..          
fe50: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
fe60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fe70: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
fe80: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 79 65   [appendArgs "ye
fe90: 73 20 28 22 20 24 70 6c 61 74 66 6f 72 6d 20 22  s (" $platform "
fea0: 29 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20  )\n"]..         
feb0: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
fec0: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
fed0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
fee0: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
fef0: 20 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20   no\n..         
ff00: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
ff10: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
ff20: 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20   }..        }.. 
ff30: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
ff40: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
ff50: 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
ff60: 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
ff70: 20 22 2d 2d 2d 2d 20 65 6e 76 69 72 6f 6e 6d 65   "---- environme
ff80: 6e 74 20 76 61 72 69 61 62 6c 65 20 5c 22 53 79  nt variable \"Sy
ff90: 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
ffa0: 5c 22 20 69 73 20 6e 6f 74 20 22 20 5c 0d 0a 20  \" is not " \.. 
ffb0: 20 20 20 20 20 20 20 20 20 20 20 22 73 65 74 2c             "set,
ffc0: 20 73 6b 69 70 70 69 6e 67 20 63 68 65 63 6b 20   skipping check 
ffd0: 66 6f 72 20 72 65 6c 65 61 73 65 73 2e 2e 2e 5c  for releases...\
ffe0: 6e 22 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  n"]..      }....
fff0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c        return fal
10000 73 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  se..    }.....  
10010 20 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72 53    proc checkForS
10020 51 4c 69 74 65 4c 69 62 72 61 72 79 20 7b 20 63  QLiteLibrary { c
10030 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20 20  hannel } {..    
10040 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
10050 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20   "---- checking 
10060 66 6f 72 20 53 51 4c 69 74 65 20 63 6f 72 65 20  for SQLite core 
10070 6c 69 62 72 61 72 79 2e 2e 2e 20 22 0d 0a 0d 0a  library... "....
10080 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
10090 20 7b 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a 65   {..        obje
100a0 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73  ct invoke -flags
100b0 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20   +NonPublic \.. 
100c0 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65             Syste
100d0 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51  m.Data.SQLite.SQ
100e0 4c 69 74 65 33 20 53 51 4c 69 74 65 56 65 72 73  Lite3 SQLiteVers
100f0 69 6f 6e 0d 0a 20 20 20 20 20 20 7d 20 76 65 72  ion..      } ver
10100 73 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  sion] == 0} then
10110 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
10120 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43         # NOTE: C
10130 68 65 63 6b 20 69 66 20 74 68 65 20 72 65 74 75  heck if the retu
10140 72 6e 65 64 20 76 65 72 73 69 6f 6e 20 77 61 73  rned version was
10150 20 6e 75 6c 6c 2e 20 20 49 66 20 73 6f 2c 20 6d   null.  If so, m
10160 61 6b 65 20 69 74 20 65 61 73 79 0d 0a 20 20 20  ake it easy..   
10170 20 20 20 20 20 23 20 20 20 20 20 20 20 74 6f 20       #       to 
10180 73 70 6f 74 2e 0d 0a 20 20 20 20 20 20 20 20 23  spot...        #
10190 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73  ..        if {[s
101a0 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 65  tring length $ve
101b0 72 73 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65  rsion] == 0} the
101c0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73  n {..          s
101d0 65 74 20 76 65 72 73 69 6f 6e 20 6e 75 6c 6c 0d  et version null.
101e0 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
101f0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
10200 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74   # NOTE: Attempt
10210 20 74 6f 20 71 75 65 72 79 20 74 68 65 20 46 6f   to query the Fo
10220 73 73 69 6c 20 73 6f 75 72 63 65 20 69 64 65 6e  ssil source iden
10230 74 69 66 69 65 72 20 66 6f 72 20 74 68 65 20 53  tifier for the S
10240 51 4c 69 74 65 0d 0a 20 20 20 20 20 20 20 20 23  QLite..        #
10250 20 20 20 20 20 20 20 63 6f 72 65 20 6c 69 62 72         core libr
10260 61 72 79 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ary...        #.
10270 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61  .        if {[ca
10280 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
10290 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d   object invoke -
102a0 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63  flags +NonPublic
102b0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
102c0 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51    System.Data.SQ
102d0 4c 69 74 65 2e 53 51 4c 69 74 65 33 20 53 51 4c  Lite.SQLite3 SQL
102e0 69 74 65 53 6f 75 72 63 65 49 64 0d 0a 20 20 20  iteSourceId..   
102f0 20 20 20 20 20 7d 20 73 6f 75 72 63 65 49 64 5d       } sourceId]
10300 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
10310 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
10320 20 23 20 4e 4f 54 45 3a 20 57 65 20 66 61 69 6c   # NOTE: We fail
10330 65 64 20 74 6f 20 71 75 65 72 79 20 74 68 65 20  ed to query the 
10340 46 6f 73 73 69 6c 20 73 6f 75 72 63 65 20 69 64  Fossil source id
10350 65 6e 74 69 66 69 65 72 2e 0d 0a 20 20 20 20 20  entifier...     
10360 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
10370 20 20 73 65 74 20 73 6f 75 72 63 65 49 64 20 75    set sourceId u
10380 6e 6b 6e 6f 77 6e 0d 0a 20 20 20 20 20 20 20 20  nknown..        
10390 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  }....        #..
103a0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
103b0 43 68 65 63 6b 20 69 66 20 74 68 65 20 72 65 74  Check if the ret
103c0 75 72 6e 65 64 20 46 6f 73 73 69 6c 20 73 6f 75  urned Fossil sou
103d0 72 63 65 20 69 64 65 6e 74 69 66 69 65 72 20 77  rce identifier w
103e0 61 73 20 6e 75 6c 6c 2e 20 20 49 66 0d 0a 20 20  as null.  If..  
103f0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73 6f        #       so
10400 2c 20 6d 61 6b 65 20 69 74 20 65 61 73 79 20 74  , make it easy t
10410 6f 20 73 70 6f 74 2e 0d 0a 20 20 20 20 20 20 20  o spot...       
10420 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   #..        if {
10430 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
10440 73 6f 75 72 63 65 49 64 5d 20 3d 3d 20 30 7d 20  sourceId] == 0} 
10450 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
10460 20 20 73 65 74 20 73 6f 75 72 63 65 49 64 20 6e    set sourceId n
10470 75 6c 6c 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  ull..        }..
10480 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
10490 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 59 65 73       # NOTE: Yes
104a0 2c 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72  , the SQLite cor
104b0 65 20 6c 69 62 72 61 72 79 20 61 70 70 65 61 72  e library appear
104c0 73 20 74 6f 20 62 65 20 61 76 61 69 6c 61 62 6c  s to be availabl
104d0 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  e...        #.. 
104e0 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72         addConstr
104f0 61 69 6e 74 20 53 51 4c 69 74 65 0d 0a 0d 0a 20  aint SQLite.... 
10500 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
10510 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
10520 73 20 22 79 65 73 20 28 22 20 24 76 65 72 73 69  s "yes (" $versi
10530 6f 6e 20 22 20 22 20 24 73 6f 75 72 63 65 49 64  on " " $sourceId
10540 20 22 29 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 7d   ")\n"]..      }
10550 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
10560 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
10570 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  no\n..      }.. 
10580 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
10590 63 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65  c checkForSQLite
105a0 49 6e 74 65 72 6f 70 20 7b 20 63 68 61 6e 6e 65  Interop { channe
105b0 6c 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74 70 75  l } {..      tpu
105c0 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d  ts $channel "---
105d0 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 53  - checking for S
105e0 51 4c 69 74 65 20 69 6e 74 65 72 6f 70 20 61 73  QLite interop as
105f0 73 65 6d 62 6c 79 2e 2e 2e 20 22 0d 0a 0d 0a 20  sembly... ".... 
10600 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
10610 7b 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a 65 63  {..        objec
10620 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20  t invoke -flags 
10630 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20  +NonPublic \..  
10640 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d            System
10650 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c  .Data.SQLite.SQL
10660 69 74 65 33 20 49 6e 74 65 72 6f 70 56 65 72 73  ite3 InteropVers
10670 69 6f 6e 0d 0a 20 20 20 20 20 20 7d 20 76 65 72  ion..      } ver
10680 73 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  sion] == 0} then
10690 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
106a0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43         # NOTE: C
106b0 68 65 63 6b 20 69 66 20 74 68 65 20 72 65 74 75  heck if the retu
106c0 72 6e 65 64 20 76 65 72 73 69 6f 6e 20 77 61 73  rned version was
106d0 20 6e 75 6c 6c 2e 20 20 49 66 20 73 6f 2c 20 6d   null.  If so, m
106e0 61 6b 65 20 69 74 20 65 61 73 79 0d 0a 20 20 20  ake it easy..   
106f0 20 20 20 20 20 23 20 20 20 20 20 20 20 74 6f 20       #       to 
10700 73 70 6f 74 2e 0d 0a 20 20 20 20 20 20 20 20 23  spot...        #
10710 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73  ..        if {[s
10720 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 65  tring length $ve
10730 72 73 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65  rsion] == 0} the
10740 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73  n {..          s
10750 65 74 20 76 65 72 73 69 6f 6e 20 6e 75 6c 6c 0d  et version null.
10760 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
10770 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
10780 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74   # NOTE: Attempt
10790 20 74 6f 20 71 75 65 72 79 20 74 68 65 20 46 6f   to query the Fo
107a0 73 73 69 6c 20 73 6f 75 72 63 65 20 69 64 65 6e  ssil source iden
107b0 74 69 66 69 65 72 20 66 6f 72 20 74 68 65 20 53  tifier for the S
107c0 51 4c 69 74 65 0d 0a 20 20 20 20 20 20 20 20 23  QLite..        #
107d0 20 20 20 20 20 20 20 63 6f 72 65 20 6c 69 62 72         core libr
107e0 61 72 79 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ary...        #.
107f0 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61  .        if {[ca
10800 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
10810 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d   object invoke -
10820 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63  flags +NonPublic
10830 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
10840 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51    System.Data.SQ
10850 4c 69 74 65 2e 53 51 4c 69 74 65 33 20 49 6e 74  Lite.SQLite3 Int
10860 65 72 6f 70 53 6f 75 72 63 65 49 64 0d 0a 20 20  eropSourceId..  
10870 20 20 20 20 20 20 7d 20 73 6f 75 72 63 65 49 64        } sourceId
10880 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
10890 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
108a0 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 66 61 69    # NOTE: We fai
108b0 6c 65 64 20 74 6f 20 71 75 65 72 79 20 74 68 65  led to query the
108c0 20 46 6f 73 73 69 6c 20 73 6f 75 72 63 65 20 69   Fossil source i
108d0 64 65 6e 74 69 66 69 65 72 2e 0d 0a 20 20 20 20  dentifier...    
108e0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
108f0 20 20 20 73 65 74 20 73 6f 75 72 63 65 49 64 20     set sourceId 
10900 75 6e 6b 6e 6f 77 6e 0d 0a 20 20 20 20 20 20 20  unknown..       
10910 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d   }....        #.
10920 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
10930 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 72 65   Check if the re
10940 74 75 72 6e 65 64 20 46 6f 73 73 69 6c 20 73 6f  turned Fossil so
10950 75 72 63 65 20 69 64 65 6e 74 69 66 69 65 72 20  urce identifier 
10960 77 61 73 20 6e 75 6c 6c 2e 20 20 49 66 0d 0a 20  was null.  If.. 
10970 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73         #       s
10980 6f 2c 20 6d 61 6b 65 20 69 74 20 65 61 73 79 20  o, make it easy 
10990 74 6f 20 73 70 6f 74 2e 0d 0a 20 20 20 20 20 20  to spot...      
109a0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20    #..        if 
109b0 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
109c0 24 73 6f 75 72 63 65 49 64 5d 20 3d 3d 20 30 7d  $sourceId] == 0}
109d0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
109e0 20 20 20 73 65 74 20 73 6f 75 72 63 65 49 64 20     set sourceId 
109f0 6e 75 6c 6c 0d 0a 20 20 20 20 20 20 20 20 7d 0d  null..        }.
10a00 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
10a10 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 65        # NOTE: Be
10a20 66 6f 72 65 20 61 63 74 75 61 6c 6c 79 20 61 64  fore actually ad
10a30 64 69 6e 67 20 74 68 65 20 74 65 73 74 20 63 6f  ding the test co
10a40 6e 73 74 72 61 69 6e 74 2c 20 6d 61 6b 65 20 73  nstraint, make s
10a50 75 72 65 20 74 68 65 0d 0a 20 20 20 20 20 20 20  ure the..       
10a60 20 23 20 20 20 20 20 20 20 76 65 72 73 69 6f 6e   #       version
10a70 20 69 73 20 76 61 6c 69 64 20 28 69 2e 65 2e 20   is valid (i.e. 
10a80 6e 6f 74 20 6a 75 73 74 20 74 68 61 74 20 77 65  not just that we
10a90 20 63 6f 75 6c 64 20 71 75 65 72 79 20 69 74 29   could query it)
10aa0 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
10ab0 20 20 20 20 20 20 69 66 20 7b 24 76 65 72 73 69        if {$versi
10ac0 6f 6e 20 6e 65 20 22 6e 75 6c 6c 22 7d 20 74 68  on ne "null"} th
10ad0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
10ae0 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e  #..          # N
10af0 4f 54 45 3a 20 59 65 73 2c 20 74 68 65 20 53 51  OTE: Yes, the SQ
10b00 4c 69 74 65 20 69 6e 74 65 72 6f 70 20 61 73 73  Lite interop ass
10b10 65 6d 62 6c 79 20 61 70 70 65 61 72 73 20 74 6f  embly appears to
10b20 20 62 65 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0a   be available...
10b30 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
10b40 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72         addConstr
10b50 61 69 6e 74 20 53 51 4c 69 74 65 49 6e 74 65 72  aint SQLiteInter
10b60 6f 70 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  op....          
10b70 73 65 74 20 61 6e 73 77 65 72 20 79 65 73 0d 0a  set answer yes..
10b80 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
10b90 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
10ba0 61 6e 73 77 65 72 20 6e 6f 0d 0a 20 20 20 20 20  answer no..     
10bb0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
10bc0 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
10bd0 61 70 70 65 6e 64 41 72 67 73 20 24 61 6e 73 77  appendArgs $answ
10be0 65 72 20 22 20 28 22 20 24 76 65 72 73 69 6f 6e  er " (" $version
10bf0 20 22 20 22 20 24 73 6f 75 72 63 65 49 64 20 22   " " $sourceId "
10c00 29 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 7d 20 65  )\n"]..      } e
10c10 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74  lse {..        t
10c20 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f  puts $channel no
10c30 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  \n..      }..   
10c40 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
10c50 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 44 65  checkForSQLiteDe
10c60 66 69 6e 65 43 6f 6e 73 74 61 6e 74 20 7b 20 63  fineConstant { c
10c70 68 61 6e 6e 65 6c 20 6e 61 6d 65 20 7d 20 7b 0d  hannel name } {.
10c80 0a 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68  .      tputs $ch
10c90 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
10ca0 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 22  s \..          "
10cb0 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f  ---- checking fo
10cc0 72 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  r System.Data.SQ
10cd0 4c 69 74 65 20 64 65 66 69 6e 65 20 63 6f 6e 73  Lite define cons
10ce0 74 61 6e 74 20 5c 22 22 20 24 6e 61 6d 65 20 5c  tant \"" $name \
10cf0 0d 0a 20 20 20 20 20 20 20 20 20 20 22 5c 22 2e  ..          "\".
10d00 2e 2e 20 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 69  .. "]....      i
10d10 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  f {[catch {..   
10d20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f       object invo
10d30 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75  ke -flags +NonPu
10d40 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20  blic \..        
10d50 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e      System.Data.
10d60 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 33 20 44  SQLite.SQLite3 D
10d70 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 73 0d 0a  efineConstants..
10d80 20 20 20 20 20 20 7d 20 64 65 66 69 6e 65 43 6f        } defineCo
10d90 6e 73 74 61 6e 74 73 5d 20 3d 3d 20 30 7d 20 74  nstants] == 0} t
10da0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69  hen {..        i
10db0 66 20 7b 5b 6c 73 65 61 72 63 68 20 2d 65 78 61  f {[lsearch -exa
10dc0 63 74 20 2d 6e 6f 63 61 73 65 20 24 64 65 66 69  ct -nocase $defi
10dd0 6e 65 43 6f 6e 73 74 61 6e 74 73 20 24 6e 61 6d  neConstants $nam
10de0 65 5d 20 21 3d 20 2d 31 7d 20 74 68 65 6e 20 7b  e] != -1} then {
10df0 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
10e00 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
10e10 20 59 65 73 2c 20 74 68 69 73 20 64 65 66 69 6e   Yes, this defin
10e20 65 20 63 6f 6e 73 74 61 6e 74 20 77 61 73 20 65  e constant was e
10e30 6e 61 62 6c 65 64 20 77 68 65 6e 20 74 68 65 20  nabled when the 
10e40 6d 61 6e 61 67 65 64 0d 0a 20 20 20 20 20 20 20  managed..       
10e50 20 20 20 23 20 20 20 20 20 20 20 61 73 73 65 6d     #       assem
10e60 62 6c 79 20 77 61 73 20 63 6f 6d 70 69 6c 65 64  bly was compiled
10e70 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
10e80 20 20 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e            addCon
10e90 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41  straint [appendA
10ea0 72 67 73 20 5b 67 65 74 53 51 4c 69 74 65 44 65  rgs [getSQLiteDe
10eb0 66 69 6e 65 43 6f 6e 73 74 61 6e 74 50 72 65 66  fineConstantPref
10ec0 69 78 5d 20 24 6e 61 6d 65 5d 0d 0a 0d 0a 20 20  ix] $name]....  
10ed0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
10ee0 68 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20 20  hannel yes\n..  
10ef0 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
10f00 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
10f10 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20  $channel no\n.. 
10f20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
10f30 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
10f40 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
10f50 20 65 72 72 6f 72 5c 6e 0d 0a 20 20 20 20 20 20   error\n..      
10f60 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
10f70 20 70 72 6f 63 20 67 65 74 44 61 74 65 54 69 6d   proc getDateTim
10f80 65 46 6f 72 6d 61 74 20 7b 20 7b 74 69 6d 65 5a  eFormat { {timeZ
10f90 6f 6e 65 20 74 72 75 65 7d 20 7d 20 7b 0d 0a 20  one true} } {.. 
10fa0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
10fb0 4e 4f 54 45 3a 20 54 68 69 73 20 70 72 6f 63 65  NOTE: This proce
10fc0 64 75 72 65 20 73 69 6d 70 6c 79 20 72 65 74 75  dure simply retu
10fd0 72 6e 73 20 74 68 65 20 22 64 65 66 61 75 6c 74  rns the "default
10fe0 22 20 44 61 74 65 54 69 6d 65 20 66 6f 72 6d 61  " DateTime forma
10ff0 74 20 75 73 65 64 0d 0a 20 20 20 20 20 20 23 20  t used..      # 
11000 20 20 20 20 20 20 62 79 20 74 68 65 20 74 65 73        by the tes
11010 74 20 73 75 69 74 65 2e 0d 0a 20 20 20 20 20 20  t suite...      
11020 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e  #..      if {[in
11030 66 6f 20 65 78 69 73 74 73 20 3a 3a 64 61 74 65  fo exists ::date
11040 74 69 6d 65 5f 66 6f 72 6d 61 74 5d 20 26 26 20  time_format] && 
11050 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74  \..          [st
11060 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 64  ring length $::d
11070 61 74 65 74 69 6d 65 5f 66 6f 72 6d 61 74 5d 20  atetime_format] 
11080 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
11090 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
110a0 23 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e 20 74  # NOTE: Return t
110b0 68 65 20 6d 61 6e 75 61 6c 6c 79 20 6f 76 65 72  he manually over
110c0 72 69 64 64 65 6e 20 76 61 6c 75 65 20 66 6f 72  ridden value for
110d0 20 74 68 65 20 44 61 74 65 54 69 6d 65 20 66 6f   the DateTime fo
110e0 72 6d 61 74 2e 0d 0a 20 20 20 20 20 20 20 20 23  rmat...        #
110f0 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
11100 20 24 3a 3a 64 61 74 65 74 69 6d 65 5f 66 6f 72   $::datetime_for
11110 6d 61 74 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  mat..      } els
11120 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  e {..        #..
11130 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
11140 52 65 74 75 72 6e 20 61 6e 20 49 53 4f 38 36 30  Return an ISO860
11150 31 20 44 61 74 65 54 69 6d 65 20 66 6f 72 6d 61  1 DateTime forma
11160 74 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74  t compatible wit
11170 68 20 53 51 4c 69 74 65 2c 0d 0a 20 20 20 20 20  h SQLite,..     
11180 20 20 20 23 20 20 20 20 20 20 20 53 79 73 74 65     #       Syste
11190 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2c 20 61  m.Data.SQLite, a
111a0 6e 64 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20  nd suitable for 
111b0 72 6f 75 6e 64 2d 74 72 69 70 70 69 6e 67 20 77  round-tripping w
111c0 69 74 68 20 74 68 65 0d 0a 20 20 20 20 20 20 20  ith the..       
111d0 20 23 20 20 20 20 20 20 20 44 61 74 65 54 69 6d   #       DateTim
111e0 65 20 63 6c 61 73 73 20 6f 66 20 74 68 65 20 66  e class of the f
111f0 72 61 6d 65 77 6f 72 6b 2e 20 20 49 66 20 74 68  ramework.  If th
11200 69 73 20 76 61 6c 75 65 20 69 73 20 63 68 61 6e  is value is chan
11210 67 65 64 2c 0d 0a 20 20 20 20 20 20 20 20 23 20  ged,..        # 
11220 20 20 20 20 20 20 76 61 72 69 6f 75 73 20 74 65        various te
11230 73 74 73 20 6d 61 79 20 66 61 69 6c 2e 0d 0a 20  sts may fail... 
11240 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
11250 20 20 72 65 74 75 72 6e 20 5b 61 70 70 65 6e 64    return [append
11260 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
11270 20 20 20 20 22 79 79 79 79 2d 4d 4d 2d 64 64 20      "yyyy-MM-dd 
11280 48 48 3a 6d 6d 3a 73 73 2e 46 46 46 46 46 46 46  HH:mm:ss.FFFFFFF
11290 22 20 5b 65 78 70 72 20 7b 24 74 69 6d 65 5a 6f  " [expr {$timeZo
112a0 6e 65 20 3f 20 22 4b 22 20 3a 20 22 22 7d 5d 5d  ne ? "K" : ""}]]
112b0 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
112c0 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65  .....    proc ge
112d0 74 44 61 74 65 54 69 6d 65 54 69 63 6b 73 20 7b  tDateTimeTicks {
112e0 20 76 61 6c 75 65 20 7b 6c 6f 63 61 6c 20 22 22   value {local ""
112f0 7d 20 7b 64 65 66 61 75 6c 74 20 22 22 7d 20 7d  } {default ""} }
11300 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73   {..      if {[s
11310 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 61  tring length $va
11320 6c 75 65 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  lue] == 0} then 
11330 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  {..        retur
11340 6e 20 24 64 65 66 61 75 6c 74 0d 0a 20 20 20 20  n $default..    
11350 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20    }....      if 
11360 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
11370 20 20 20 73 65 74 20 64 61 74 65 54 69 6d 65 20     set dateTime 
11380 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d  [object invoke -
11390 63 72 65 61 74 65 20 5c 0d 0a 20 20 20 20 20 20  create \..      
113a0 20 20 20 20 20 20 2d 70 61 72 61 6d 65 74 65 72        -parameter
113b0 74 79 70 65 73 20 5b 6c 69 73 74 20 53 74 72 69  types [list Stri
113c0 6e 67 20 53 74 72 69 6e 67 20 49 46 6f 72 6d 61  ng String IForma
113d0 74 50 72 6f 76 69 64 65 72 20 5c 0d 0a 20 20 20  tProvider \..   
113e0 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e           System.
113f0 47 6c 6f 62 61 6c 69 7a 61 74 69 6f 6e 2e 44 61  Globalization.Da
11400 74 65 54 69 6d 65 53 74 79 6c 65 73 5d 20 44 61  teTimeStyles] Da
11410 74 65 54 69 6d 65 20 50 61 72 73 65 45 78 61 63  teTime ParseExac
11420 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  t \..           
11430 20 24 76 61 6c 75 65 20 5b 67 65 74 44 61 74 65   $value [getDate
11440 54 69 6d 65 46 6f 72 6d 61 74 5d 20 6e 75 6c 6c  TimeFormat] null
11450 20 41 64 6a 75 73 74 54 6f 55 6e 69 76 65 72 73   AdjustToUnivers
11460 61 6c 5d 0d 0a 20 20 20 20 20 20 7d 5d 7d 20 74  al]..      }]} t
11470 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72  hen {..        r
11480 65 74 75 72 6e 20 24 64 65 66 61 75 6c 74 0d 0a  eturn $default..
11490 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
114a0 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 69 73 20   if {[string is 
114b0 62 6f 6f 6c 65 61 6e 20 2d 73 74 72 69 63 74 20  boolean -strict 
114c0 24 6c 6f 63 61 6c 5d 7d 20 74 68 65 6e 20 7b 0d  $local]} then {.
114d0 0a 20 20 20 20 20 20 20 20 73 65 74 20 64 61 74  .        set dat
114e0 65 54 69 6d 65 20 5b 6f 62 6a 65 63 74 20 69 6e  eTime [object in
114f0 76 6f 6b 65 20 2d 63 72 65 61 74 65 20 44 61 74  voke -create Dat
11500 65 54 69 6d 65 20 53 70 65 63 69 66 79 4b 69 6e  eTime SpecifyKin
11510 64 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  d \..           
11520 20 24 64 61 74 65 54 69 6d 65 20 55 74 63 5d 0d   $dateTime Utc].
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 72 65 74 75 72 6e 20  .        return 
11550 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 24  [object invoke $
11560 64 61 74 65 54 69 6d 65 20 54 69 63 6b 73 5d 0d  dateTime Ticks].
11570 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
11580 20 20 69 66 20 7b 24 6c 6f 63 61 6c 7d 20 74 68    if {$local} th
11590 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65  en {..        re
115a0 74 75 72 6e 20 5b 6f 62 6a 65 63 74 20 69 6e 76  turn [object inv
115b0 6f 6b 65 20 24 64 61 74 65 54 69 6d 65 20 54 6f  oke $dateTime To
115c0 4c 6f 63 61 6c 54 69 6d 65 2e 54 69 63 6b 73 5d  LocalTime.Ticks]
115d0 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
115e0 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
115f0 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20   [object invoke 
11600 24 64 61 74 65 54 69 6d 65 20 54 6f 55 6e 69 76  $dateTime ToUniv
11610 65 72 73 61 6c 54 69 6d 65 2e 54 69 63 6b 73 5d  ersalTime.Ticks]
11620 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
11630 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65  .....    proc ge
11640 74 50 72 6f 70 65 72 74 69 65 73 20 7b 20 6f 62  tProperties { ob
11650 6a 65 63 74 20 76 61 72 4e 61 6d 65 20 7d 20 7b  ject varName } {
11660 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20 31 20  ..      upvar 1 
11670 24 76 61 72 4e 61 6d 65 20 70 72 6f 70 65 72 74  $varName propert
11680 69 65 73 0d 0a 0d 0a 20 20 20 20 20 20 73 65 74  ies....      set
11690 20 63 6f 75 6e 74 20 30 0d 0a 20 20 20 20 20 20   count 0..      
116a0 73 65 74 20 6e 61 6d 65 73 20 5b 6c 69 73 74 5d  set names [list]
116b0 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69  ....      if {[i
116c0 73 4f 62 6a 65 63 74 48 61 6e 64 6c 65 20 24 6f  sObjectHandle $o
116d0 62 6a 65 63 74 5d 20 26 26 20 24 6f 62 6a 65 63  bject] && $objec
116e0 74 20 6e 65 20 22 6e 75 6c 6c 22 7d 20 74 68 65  t ne "null"} the
116f0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 65 76 61  n {..        eva
11700 6c 20 6c 61 70 70 65 6e 64 20 6e 61 6d 65 73 20  l lappend names 
11710 5b 6f 62 6a 65 63 74 20 6d 65 6d 62 65 72 73 20  [object members 
11720 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2d  \..            -
11730 6d 65 6d 62 65 72 74 79 70 65 73 20 50 72 6f 70  membertypes Prop
11740 65 72 74 79 20 2d 6e 61 6d 65 6f 6e 6c 79 20 24  erty -nameonly $
11750 6f 62 6a 65 63 74 5d 0d 0a 0d 0a 20 20 20 20 20  object]....     
11760 20 20 20 65 76 61 6c 20 6c 61 70 70 65 6e 64 20     eval lappend 
11770 6e 61 6d 65 73 20 5b 6f 62 6a 65 63 74 20 6d 65  names [object me
11780 6d 62 65 72 73 20 5c 0d 0a 20 20 20 20 20 20 20  mbers \..       
11790 20 20 20 20 20 2d 6d 65 6d 62 65 72 74 79 70 65       -membertype
117a0 73 20 46 69 65 6c 64 20 2d 6e 61 6d 65 6f 6e 6c  s Field -nameonl
117b0 79 20 24 6f 62 6a 65 63 74 5d 0d 0a 20 20 20 20  y $object]..    
117c0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 66 6f 72    }....      for
117d0 65 61 63 68 20 6e 61 6d 65 20 24 6e 61 6d 65 73  each name $names
117e0 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   {..        if {
117f0 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
11800 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b      object invok
11810 65 20 2d 6f 62 6a 65 63 74 66 6c 61 67 73 20 2b  e -objectflags +
11820 4e 6f 44 69 73 70 6f 73 65 20 24 6f 62 6a 65 63  NoDispose $objec
11830 74 20 24 6e 61 6d 65 0d 0a 20 20 20 20 20 20 20  t $name..       
11840 20 7d 20 76 61 6c 75 65 5d 20 3d 3d 20 30 7d 20   } value] == 0} 
11850 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
11860 20 20 69 66 20 7b 5b 69 73 4f 62 6a 65 63 74 48    if {[isObjectH
11870 61 6e 64 6c 65 20 24 76 61 6c 75 65 5d 20 26 26  andle $value] &&
11880 20 24 76 61 6c 75 65 20 6e 65 20 22 6e 75 6c 6c   $value ne "null
11890 22 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  "} then {..     
118a0 20 20 20 20 20 20 20 73 65 74 20 65 72 72 6f 72         set error
118b0 20 6e 75 6c 6c 3b 20 6f 62 6a 65 63 74 20 69 6e   null; object in
118c0 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e  voke -flags +Non
118d0 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20  Public \..      
118e0 20 20 20 20 20 20 20 20 20 20 2d 6d 61 72 73 68            -marsh
118f0 61 6c 66 6c 61 67 73 20 2b 4e 6f 48 61 6e 64 6c  alflags +NoHandl
11900 65 20 49 6e 74 65 72 70 72 65 74 65 72 2e 47 65  e Interpreter.Ge
11910 74 41 63 74 69 76 65 20 5c 0d 0a 20 20 20 20 20  tActive \..     
11920 20 20 20 20 20 20 20 20 20 20 20 41 64 64 4f 62             AddOb
11930 6a 65 63 74 52 65 66 65 72 65 6e 63 65 20 4f 6b  jectReference Ok
11940 20 24 76 61 6c 75 65 20 65 72 72 6f 72 0d 0a 0d   $value error...
11950 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 61 70  .            lap
11960 70 65 6e 64 20 70 72 6f 70 65 72 74 69 65 73 28  pend properties(
11970 6f 62 6a 65 63 74 73 29 20 5b 6c 69 73 74 20 24  objects) [list $
11980 6e 61 6d 65 20 24 76 61 6c 75 65 5d 0d 0a 20 20  name $value]..  
11990 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
119a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 61  ..            la
119b0 70 70 65 6e 64 20 70 72 6f 70 65 72 74 69 65 73  ppend properties
119c0 28 76 61 6c 75 65 73 29 20 5b 6c 69 73 74 20 24  (values) [list $
119d0 6e 61 6d 65 20 24 76 61 6c 75 65 5d 0d 0a 20 20  name $value]..  
119e0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
119f0 20 20 20 20 20 20 20 69 6e 63 72 20 63 6f 75 6e         incr coun
11a00 74 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73  t..        } els
11a10 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6c  e {..          l
11a20 61 70 70 65 6e 64 20 70 72 6f 70 65 72 74 69 65  append propertie
11a30 73 28 65 72 72 6f 72 73 29 20 5b 6c 69 73 74 20  s(errors) [list 
11a40 24 6e 61 6d 65 20 24 3a 3a 65 72 72 6f 72 43 6f  $name $::errorCo
11a50 64 65 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  de]..        }..
11a60 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
11a70 20 72 65 74 75 72 6e 20 24 63 6f 75 6e 74 0d 0a   return $count..
11a80 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
11a90 6f 63 20 67 65 74 41 6c 6c 50 72 6f 70 65 72 74  oc getAllPropert
11aa0 69 65 73 20 7b 20 6f 62 6a 65 63 74 20 76 61 72  ies { object var
11ab0 4e 61 6d 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20  Name } {..      
11ac0 75 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65  upvar 1 $varName
11ad0 20 70 72 6f 70 65 72 74 69 65 73 0d 0a 20 20 20   properties..   
11ae0 20 20 20 73 65 74 20 76 61 6c 75 65 20 24 6f 62     set value $ob
11af0 6a 65 63 74 0d 0a 0d 0a 20 20 20 20 20 20 77 68  ject....      wh
11b00 69 6c 65 20 7b 74 72 75 65 7d 20 7b 0d 0a 20 20  ile {true} {..  
11b10 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
11b20 20 65 78 69 73 74 73 20 70 72 6f 70 65 72 74 69   exists properti
11b30 65 73 28 73 65 65 6e 4f 62 6a 65 63 74 73 29 5d  es(seenObjects)]
11b40 20 7c 7c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   || \..         
11b50 20 20 20 24 76 61 6c 75 65 20 6e 69 20 24 70 72     $value ni $pr
11b60 6f 70 65 72 74 69 65 73 28 73 65 65 6e 4f 62 6a  operties(seenObj
11b70 65 63 74 73 29 7d 20 74 68 65 6e 20 7b 0d 0a 20  ects)} then {.. 
11b80 20 20 20 20 20 20 20 20 20 67 65 74 50 72 6f 70           getProp
11b90 65 72 74 69 65 73 20 24 76 61 6c 75 65 20 70 72  erties $value pr
11ba0 6f 70 65 72 74 69 65 73 0d 0a 20 20 20 20 20 20  operties..      
11bb0 20 20 20 20 6c 61 70 70 65 6e 64 20 70 72 6f 70      lappend prop
11bc0 65 72 74 69 65 73 28 73 65 65 6e 4f 62 6a 65 63  erties(seenObjec
11bd0 74 73 29 20 24 76 61 6c 75 65 0d 0a 20 20 20 20  ts) $value..    
11be0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
11bf0 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
11c00 74 73 20 70 72 6f 70 65 72 74 69 65 73 28 6f 62  ts properties(ob
11c10 6a 65 63 74 73 29 5d 7d 20 74 68 65 6e 20 7b 0d  jects)]} then {.
11c20 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
11c30 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
11c40 20 20 20 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e         if {[llen
11c50 67 74 68 20 24 70 72 6f 70 65 72 74 69 65 73 28  gth $properties(
11c60 6f 62 6a 65 63 74 73 29 5d 20 3d 3d 20 30 7d 20  objects)] == 0} 
11c70 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
11c80 20 20 75 6e 73 65 74 20 70 72 6f 70 65 72 74 69    unset properti
11c90 65 73 28 6f 62 6a 65 63 74 73 29 3b 20 62 72 65  es(objects); bre
11ca0 61 6b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  ak..        }...
11cb0 0a 20 20 20 20 20 20 20 20 73 65 74 20 76 61 6c  .        set val
11cc0 75 65 20 5b 6c 69 6e 64 65 78 20 5b 6c 69 6e 64  ue [lindex [lind
11cd0 65 78 20 24 70 72 6f 70 65 72 74 69 65 73 28 6f  ex $properties(o
11ce0 62 6a 65 63 74 73 29 20 30 5d 20 65 6e 64 5d 0d  bjects) 0] end].
11cf0 0a 20 20 20 20 20 20 20 20 73 65 74 20 70 72 6f  .        set pro
11d00 70 65 72 74 69 65 73 28 6f 62 6a 65 63 74 73 29  perties(objects)
11d10 20 5b 6c 72 61 6e 67 65 20 24 70 72 6f 70 65 72   [lrange $proper
11d20 74 69 65 73 28 6f 62 6a 65 63 74 73 29 20 31 20  ties(objects) 1 
11d30 65 6e 64 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  end]..      }...
11d40 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f  .      if {[info
11d50 20 65 78 69 73 74 73 20 70 72 6f 70 65 72 74 69   exists properti
11d60 65 73 28 73 65 65 6e 4f 62 6a 65 63 74 73 29 5d  es(seenObjects)]
11d70 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
11d80 20 20 66 6f 72 65 61 63 68 20 76 61 6c 75 65 20    foreach value 
11d90 24 70 72 6f 70 65 72 74 69 65 73 28 73 65 65 6e  $properties(seen
11da0 4f 62 6a 65 63 74 73 29 20 7b 0d 0a 20 20 20 20  Objects) {..    
11db0 20 20 20 20 20 20 69 66 20 7b 24 76 61 6c 75 65        if {$value
11dc0 20 65 71 20 24 6f 62 6a 65 63 74 7d 20 63 6f 6e   eq $object} con
11dd0 74 69 6e 75 65 0d 0a 20 20 20 20 20 20 20 20 20  tinue..         
11de0 20 63 61 74 63 68 20 7b 6f 62 6a 65 63 74 20 64   catch {object d
11df0 69 73 70 6f 73 65 20 24 76 61 6c 75 65 7d 0d 0a  ispose $value}..
11e00 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
11e10 20 20 20 20 20 75 6e 73 65 74 20 70 72 6f 70 65       unset prope
11e20 72 74 69 65 73 28 73 65 65 6e 4f 62 6a 65 63 74  rties(seenObject
11e30 73 29 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  s)..      }..   
11e40 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
11e50 67 65 74 56 61 72 69 61 62 6c 65 73 20 7b 20 76  getVariables { v
11e60 61 72 4e 61 6d 65 73 20 7b 6f 62 6a 65 63 74 73  arNames {objects
11e70 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20   false} } {..   
11e80 20 20 20 73 65 74 20 72 65 73 75 6c 74 20 5b 6c     set result [l
11e90 69 73 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 66 6f  ist]....      fo
11ea0 72 65 61 63 68 20 76 61 72 4e 61 6d 65 20 24 76  reach varName $v
11eb0 61 72 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20  arNames {..     
11ec0 20 20 20 69 66 20 7b 5b 75 70 6c 65 76 65 6c 20     if {[uplevel 
11ed0 31 20 5b 6c 69 73 74 20 61 72 72 61 79 20 65 78  1 [list array ex
11ee0 69 73 74 73 20 24 76 61 72 4e 61 6d 65 5d 5d 7d  ists $varName]]}
11ef0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
11f00 20 20 20 73 65 74 20 61 72 72 61 79 4e 61 6d 65     set arrayName
11f10 20 24 76 61 72 4e 61 6d 65 0d 0a 0d 0a 20 20 20   $varName....   
11f20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 65         foreach e
11f30 6c 65 6d 65 6e 74 4e 61 6d 65 20 5b 75 70 6c 65  lementName [uple
11f40 76 65 6c 20 31 20 5b 6c 69 73 74 20 61 72 72 61  vel 1 [list arra
11f50 79 20 6e 61 6d 65 73 20 24 61 72 72 61 79 4e 61  y names $arrayNa
11f60 6d 65 5d 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20  me]] {..        
11f70 20 20 20 20 73 65 74 20 6e 61 6d 65 20 5b 61 70      set name [ap
11f80 70 65 6e 64 41 72 67 73 20 24 61 72 72 61 79 4e  pendArgs $arrayN
11f90 61 6d 65 20 28 20 24 65 6c 65 6d 65 6e 74 4e 61  ame ( $elementNa
11fa0 6d 65 20 29 5d 0d 0a 20 20 20 20 20 20 20 20 20  me )]..         
11fb0 20 20 20 73 65 74 20 76 61 72 56 61 6c 75 65 20     set varValue 
11fc0 5b 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74  [uplevel 1 [list
11fd0 20 73 65 74 20 24 6e 61 6d 65 5d 5d 0d 0a 0d 0a   set $name]]....
11fe0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
11ff0 24 6f 62 6a 65 63 74 73 20 26 26 20 5b 69 73 4f  $objects && [isO
12000 62 6a 65 63 74 48 61 6e 64 6c 65 20 24 76 61 72  bjectHandle $var
12010 56 61 6c 75 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a  Value]} then {..
12020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 75 6e                un
12030 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20  set -nocomplain 
12040 70 72 6f 70 65 72 74 69 65 73 0d 0a 20 20 20 20  properties..    
12050 20 20 20 20 20 20 20 20 20 20 67 65 74 41 6c 6c            getAll
12060 50 72 6f 70 65 72 74 69 65 73 20 24 76 61 72 56  Properties $varV
12070 61 6c 75 65 20 70 72 6f 70 65 72 74 69 65 73 0d  alue properties.
12080 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
12090 20 6c 61 70 70 65 6e 64 20 72 65 73 75 6c 74 20   lappend result 
120a0 5b 6c 69 73 74 20 24 6e 61 6d 65 20 5b 61 72 72  [list $name [arr
120b0 61 79 20 67 65 74 20 70 72 6f 70 65 72 74 69 65  ay get propertie
120c0 73 5d 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s]]..           
120d0 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
120e0 20 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64           lappend
120f0 20 72 65 73 75 6c 74 20 5b 6c 69 73 74 20 24 6e   result [list $n
12100 61 6d 65 20 24 76 61 72 56 61 6c 75 65 5d 0d 0a  ame $varValue]..
12110 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
12120 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
12130 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
12140 20 20 20 20 20 20 20 20 73 65 74 20 76 61 72 56          set varV
12150 61 6c 75 65 20 5b 75 70 6c 65 76 65 6c 20 31 20  alue [uplevel 1 
12160 5b 6c 69 73 74 20 73 65 74 20 24 76 61 72 4e 61  [list set $varNa
12170 6d 65 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  me]]....        
12180 20 20 69 66 20 7b 24 6f 62 6a 65 63 74 73 20 26    if {$objects &
12190 26 20 5b 69 73 4f 62 6a 65 63 74 48 61 6e 64 6c  & [isObjectHandl
121a0 65 20 24 76 61 72 56 61 6c 75 65 5d 7d 20 74 68  e $varValue]} th
121b0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
121c0 20 20 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c    unset -nocompl
121d0 61 69 6e 20 70 72 6f 70 65 72 74 69 65 73 0d 0a  ain properties..
121e0 20 20 20 20 20 20 20 20 20 20 20 20 67 65 74 41              getA
121f0 6c 6c 50 72 6f 70 65 72 74 69 65 73 20 24 76 61  llProperties $va
12200 72 56 61 6c 75 65 20 70 72 6f 70 65 72 74 69 65  rValue propertie
12210 73 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s....           
12220 20 6c 61 70 70 65 6e 64 20 72 65 73 75 6c 74 20   lappend result 
12230 5b 6c 69 73 74 20 24 76 61 72 4e 61 6d 65 20 5b  [list $varName [
12240 61 72 72 61 79 20 67 65 74 20 70 72 6f 70 65 72  array get proper
12250 74 69 65 73 5d 5d 0d 0a 20 20 20 20 20 20 20 20  ties]]..        
12260 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
12270 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20          lappend 
12280 72 65 73 75 6c 74 20 5b 6c 69 73 74 20 24 76 61  result [list $va
12290 72 4e 61 6d 65 20 24 76 61 72 56 61 6c 75 65 5d  rName $varValue]
122a0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
122b0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
122c0 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72  }....      retur
122d0 6e 20 24 72 65 73 75 6c 74 0d 0a 20 20 20 20 7d  n $result..    }
122e0 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 65 6e  .....    proc en
122f0 75 6d 65 72 61 62 6c 65 54 6f 4c 69 73 74 20 7b  umerableToList {
12300 20 65 6e 75 6d 65 72 61 62 6c 65 20 7d 20 7b 0d   enumerable } {.
12310 0a 20 20 20 20 20 20 73 65 74 20 72 65 73 75 6c  .      set resul
12320 74 20 5b 6c 69 73 74 5d 0d 0a 0d 0a 20 20 20 20  t [list]....    
12330 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
12340 6e 67 74 68 20 24 65 6e 75 6d 65 72 61 62 6c 65  ngth $enumerable
12350 5d 20 3d 3d 20 30 20 7c 7c 20 24 65 6e 75 6d 65  ] == 0 || $enume
12360 72 61 62 6c 65 20 65 71 20 22 6e 75 6c 6c 22 7d  rable eq "null"}
12370 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
12380 20 72 65 74 75 72 6e 20 24 72 65 73 75 6c 74 0d   return $result.
12390 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
123a0 20 20 6f 62 6a 65 63 74 20 66 6f 72 65 61 63 68    object foreach
123b0 20 2d 61 6c 69 61 73 20 69 74 65 6d 20 24 65 6e   -alias item $en
123c0 75 6d 65 72 61 62 6c 65 20 7b 0d 0a 20 20 20 20  umerable {..    
123d0 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
123e0 6c 65 6e 67 74 68 20 24 69 74 65 6d 5d 20 3e 20  length $item] > 
123f0 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
12400 20 20 20 20 20 6c 61 70 70 65 6e 64 20 72 65 73       lappend res
12410 75 6c 74 20 5b 24 69 74 65 6d 20 54 6f 53 74 72  ult [$item ToStr
12420 69 6e 67 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d  ing]..        }.
12430 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
12440 20 20 72 65 74 75 72 6e 20 24 72 65 73 75 6c 74    return $result
12450 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
12460 70 72 6f 63 20 63 61 74 63 68 41 6e 64 52 65 74  proc catchAndRet
12470 75 72 6e 20 7b 20 73 63 72 69 70 74 20 7b 73 74  urn { script {st
12480 61 63 6b 54 72 61 63 65 20 66 61 6c 73 65 7d 20  ackTrace false} 
12490 7b 73 74 72 69 63 74 20 74 72 75 65 7d 20 7d 20  {strict true} } 
124a0 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
124b0 20 20 23 20 4e 4f 54 45 3a 20 45 76 61 6c 75 61    # NOTE: Evalua
124c0 74 65 20 74 68 65 20 73 63 72 69 70 74 20 70 72  te the script pr
124d0 6f 76 69 64 65 64 20 62 79 20 6f 75 72 20 63 61  ovided by our ca
124e0 6c 6c 65 72 20 69 6e 20 74 68 65 69 72 20 63 6f  ller in their co
124f0 6e 74 65 78 74 2c 0d 0a 20 20 20 20 20 20 23 20  ntext,..      # 
12500 20 20 20 20 20 20 63 61 70 74 75 72 69 6e 67 20        capturing 
12510 62 6f 74 68 20 74 68 65 20 72 65 73 75 6c 74 20  both the result 
12520 61 6e 64 20 74 68 65 20 72 65 74 75 72 6e 20 63  and the return c
12530 6f 64 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ode...      #.. 
12540 20 20 20 20 20 73 65 74 20 63 6f 64 65 20 5b 63       set code [c
12550 61 74 63 68 20 7b 75 70 6c 65 76 65 6c 20 31 20  atch {uplevel 1 
12560 24 73 63 72 69 70 74 7d 20 72 65 73 75 6c 74 5d  $script} result]
12570 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
12580 20 20 20 23 20 4e 4f 54 45 3a 20 44 69 64 20 74     # NOTE: Did t
12590 68 65 20 73 63 72 69 70 74 20 70 72 6f 76 69 64  he script provid
125a0 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72  ed by our caller
125b0 20 4e 4f 54 20 72 61 69 73 65 20 61 6e 20 65 72   NOT raise an er
125c0 72 6f 72 3f 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ror?..      #.. 
125d0 20 20 20 20 20 69 66 20 7b 24 73 74 72 69 63 74       if {$strict
125e0 20 26 26 20 24 63 6f 64 65 20 3d 3d 20 30 20 7c   && $code == 0 |
125f0 7c 20 21 24 73 74 72 69 63 74 20 26 26 20 24 63  | !$strict && $c
12600 6f 64 65 20 21 3d 20 31 7d 20 74 68 65 6e 20 7b  ode != 1} then {
12610 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
12620 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 75 63       # NOTE: Suc
12630 63 65 73 73 2e 20 20 52 65 74 75 72 6e 20 61 20  cess.  Return a 
12640 6c 69 73 74 20 77 69 74 68 20 74 68 65 20 72 65  list with the re
12650 74 75 72 6e 20 63 6f 64 65 20 61 6e 64 20 74 68  turn code and th
12660 65 20 72 65 73 75 6c 74 2e 0d 0a 20 20 20 20 20  e result...     
12670 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65     #..        re
12680 74 75 72 6e 20 5b 6c 69 73 74 20 24 63 6f 64 65  turn [list $code
12690 20 24 72 65 73 75 6c 74 5d 0d 0a 20 20 20 20 20   $result]..     
126a0 20 7d 20 65 6c 73 65 69 66 20 7b 24 73 74 61 63   } elseif {$stac
126b0 6b 54 72 61 63 65 7d 20 74 68 65 6e 20 7b 0d 0a  kTrace} then {..
126c0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
126d0 20 20 20 23 20 4e 4f 54 45 3a 20 46 61 69 6c 75     # NOTE: Failu
126e0 72 65 2e 20 20 4f 75 72 20 63 61 6c 6c 65 72 20  re.  Our caller 
126f0 77 61 6e 74 73 20 61 20 66 75 6c 6c 20 73 74 61  wants a full sta
12700 63 6b 20 74 72 61 63 65 20 28 69 66 20 61 70 70  ck trace (if app
12710 6c 69 63 61 62 6c 65 29 2c 0d 0a 20 20 20 20 20  licable),..     
12720 20 20 20 23 20 20 20 20 20 20 20 72 65 74 75 72     #       retur
12730 6e 20 61 20 6c 69 73 74 20 77 69 74 68 20 74 68  n a list with th
12740 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 61 6e  e return code an
12750 64 20 74 68 65 20 72 65 73 75 6c 74 20 76 65 72  d the result ver
12760 62 61 74 69 6d 2e 0d 0a 20 20 20 20 20 20 20 20  batim...        
12770 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  #..        retur
12780 6e 20 5b 6c 69 73 74 20 24 63 6f 64 65 20 24 72  n [list $code $r
12790 65 73 75 6c 74 5d 0d 0a 20 20 20 20 20 20 7d 20  esult]..      } 
127a0 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
127b0 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
127c0 45 3a 20 46 61 69 6c 75 72 65 2e 20 20 4f 75 72  E: Failure.  Our
127d0 20 63 61 6c 6c 65 72 20 64 6f 65 73 20 6e 6f 74   caller does not
127e0 20 77 61 6e 74 20 61 20 66 75 6c 6c 20 73 74 61   want a full sta
127f0 63 6b 20 74 72 61 63 65 20 28 69 66 0d 0a 20 20  ck trace (if..  
12800 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61 70        #       ap
12810 70 6c 69 63 61 62 6c 65 29 2c 20 72 65 74 75 72  plicable), retur
12820 6e 20 61 20 6c 69 73 74 20 77 69 74 68 20 74 68  n a list with th
12830 65 20 72 65 74 75 72 6e 20 63 6f 64 65 2c 20 74  e return code, t
12840 68 65 20 65 72 72 6f 72 0d 0a 20 20 20 20 20 20  he error..      
12850 20 20 23 20 20 20 20 20 20 20 63 6f 64 65 20 66    #       code f
12860 6f 72 20 74 68 65 20 69 6e 74 65 72 70 72 65 74  or the interpret
12870 65 72 2c 20 61 6e 64 20 74 68 65 20 65 72 72 6f  er, and the erro
12880 72 20 6d 65 73 73 61 67 65 20 75 70 20 74 6f 20  r message up to 
12890 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  the..        #  
128a0 20 20 20 20 20 70 6f 69 6e 74 20 77 68 65 72 65       point where
128b0 20 74 68 65 20 73 74 61 63 6b 20 74 72 61 63 65   the stack trace
128c0 20 73 68 6f 75 6c 64 20 73 74 61 72 74 2e 0d 0a   should start...
128d0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
128e0 20 20 20 72 65 74 75 72 6e 20 5b 6c 69 73 74 20     return [list 
128f0 24 63 6f 64 65 20 24 3a 3a 65 72 72 6f 72 43 6f  $code $::errorCo
12900 64 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  de \..          
12910 20 20 5b 65 78 74 72 61 63 74 53 79 73 74 65 6d    [extractSystem
12920 44 61 74 61 53 51 4c 69 74 65 45 78 63 65 70 74  DataSQLiteExcept
12930 69 6f 6e 4d 65 73 73 61 67 65 20 24 72 65 73 75  ionMessage $resu
12940 6c 74 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  lt]]..      }.. 
12950 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
12960 63 20 63 6f 6d 70 69 6c 65 43 53 68 61 72 70 57  c compileCSharpW
12970 69 74 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  ith {..         
12980 20 20 20 74 65 78 74 20 6d 65 6d 6f 72 79 20 73     text memory s
12990 79 6d 62 6f 6c 73 20 73 74 72 69 63 74 20 72 65  ymbols strict re
129a0 73 75 6c 74 73 56 61 72 4e 61 6d 65 20 65 72 72  sultsVarName err
129b0 6f 72 73 56 61 72 4e 61 6d 65 20 66 69 6c 65 4e  orsVarName fileN
129c0 61 6d 65 73 0d 0a 20 20 20 20 20 20 20 20 20 20  ames..          
129d0 20 20 61 72 67 73 20 7d 20 7b 0d 0a 20 20 20 20    args } {..    
129e0 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
129f0 45 3a 20 53 69 6e 63 65 20 77 65 20 61 72 65 20  E: Since we are 
12a00 67 6f 69 6e 67 20 74 6f 20 75 73 65 20 74 68 69  going to use thi
12a10 73 20 6d 65 74 68 6f 64 20 6e 61 6d 65 20 61 20  s method name a 
12a20 6c 6f 74 2c 20 61 73 73 69 67 6e 20 69 74 20 74  lot, assign it t
12a30 6f 20 61 0d 0a 20 20 20 20 20 20 23 20 20 20 20  o a..      #    
12a40 20 20 20 76 61 72 69 61 62 6c 65 20 66 69 72 73     variable firs
12a50 74 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  t...      #..   
12a60 20 20 20 73 65 74 20 61 64 64 20 52 65 66 65 72     set add Refer
12a70 65 6e 63 65 64 41 73 73 65 6d 62 6c 69 65 73 2e  encedAssemblies.
12a80 41 64 64 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a  Add....      #..
12a90 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 72        # NOTE: Cr
12aa0 65 61 74 65 20 74 68 65 20 62 61 73 65 20 63 6f  eate the base co
12ab0 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 75 61 74  mmand to evaluat
12ac0 65 20 61 6e 64 20 61 64 64 20 74 68 65 20 70 72  e and add the pr
12ad0 6f 70 65 72 74 79 20 73 65 74 74 69 6e 67 73 0d  operty settings.
12ae0 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74  .      #       t
12af0 68 61 74 20 61 72 65 20 61 6c 6d 6f 73 74 20 61  hat are almost a
12b00 6c 77 61 79 73 20 6e 65 65 64 65 64 20 62 79 20  lways needed by 
12b10 6f 75 72 20 75 6e 69 74 20 74 65 73 74 73 20 28  our unit tests (
12b20 69 2e 65 2e 20 74 68 65 20 53 79 73 74 65 6d 0d  i.e. the System.
12b30 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61  .      #       a
12b40 6e 64 20 53 79 73 74 65 6d 2e 44 61 74 61 20 61  nd System.Data a
12b50 73 73 65 6d 62 6c 79 20 72 65 66 65 72 65 6e 63  ssembly referenc
12b60 65 73 29 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  es)...      #.. 
12b70 20 20 20 20 20 73 65 74 20 63 6f 6d 6d 61 6e 64       set command
12b80 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20   [list \..      
12b90 20 20 20 20 63 6f 6d 70 69 6c 65 43 53 68 61 72      compileCShar
12ba0 70 20 24 74 65 78 74 20 24 6d 65 6d 6f 72 79 20  p $text $memory 
12bb0 24 73 79 6d 62 6f 6c 73 20 24 73 74 72 69 63 74  $symbols $strict
12bc0 20 72 65 73 75 6c 74 73 20 65 72 72 6f 72 73 20   results errors 
12bd0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 24 61 64  \..          $ad
12be0 64 20 53 79 73 74 65 6d 2e 64 6c 6c 20 24 61 64  d System.dll $ad
12bf0 64 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 64 6c  d System.Data.dl
12c00 6c 20 24 61 64 64 20 53 79 73 74 65 6d 2e 54 72  l $add System.Tr
12c10 61 6e 73 61 63 74 69 6f 6e 73 2e 64 6c 6c 20 5c  ansactions.dll \
12c20 0d 0a 20 20 20 20 20 20 20 20 20 20 24 61 64 64  ..          $add
12c30 20 53 79 73 74 65 6d 2e 58 6d 6c 2e 64 6c 6c 5d   System.Xml.dll]
12c40 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
12c50 20 20 20 23 20 4e 4f 54 45 3a 20 41 64 64 20 61     # NOTE: Add a
12c60 6c 6c 20 74 68 65 20 70 72 6f 76 69 64 65 64 20  ll the provided 
12c70 66 69 6c 65 20 6e 61 6d 65 73 20 61 73 20 61 73  file names as as
12c80 73 65 6d 62 6c 79 20 72 65 66 65 72 65 6e 63 65  sembly reference
12c90 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  s...      #..   
12ca0 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e     foreach fileN
12cb0 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 73 20 7b  ame $fileNames {
12cc0 0d 0a 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e  ..        lappen
12cd0 64 20 63 6f 6d 6d 61 6e 64 20 24 61 64 64 20 5b  d command $add [
12ce0 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d  getBinaryFileNam
12cf0 65 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20  e $fileName]..  
12d00 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
12d10 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
12d20 41 64 64 20 74 68 65 20 65 78 74 72 61 20 61 72  Add the extra ar
12d30 67 75 6d 65 6e 74 73 2c 20 69 66 20 61 6e 79 2c  guments, if any,
12d40 20 74 6f 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20   to the command 
12d50 74 6f 20 65 76 61 6c 75 61 74 65 2e 0d 0a 20 20  to evaluate...  
12d60 20 20 20 20 23 0d 0a 20 20 20 20 20 20 65 76 61      #..      eva
12d70 6c 20 6c 61 70 70 65 6e 64 20 63 6f 6d 6d 61 6e  l lappend comman
12d80 64 20 24 61 72 67 73 0d 0a 0d 0a 20 20 20 20 20  d $args....     
12d90 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
12da0 3a 20 41 6c 69 61 73 20 74 68 65 20 63 6f 6d 70  : Alias the comp
12db0 69 6c 65 72 20 6c 6f 63 61 6c 20 72 65 73 75 6c  iler local resul
12dc0 74 73 20 61 6e 64 20 65 72 72 6f 72 73 20 76 61  ts and errors va
12dd0 72 69 61 62 6c 65 73 20 74 6f 20 74 68 65 0d 0a  riables to the..
12de0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 76 61        #       va
12df0 72 69 61 62 6c 65 20 6e 61 6d 65 73 20 70 72 6f  riable names pro
12e00 76 69 64 65 64 20 62 79 20 6f 75 72 20 63 61 6c  vided by our cal
12e10 6c 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ler...      #.. 
12e20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
12e30 20 6c 65 6e 67 74 68 20 24 72 65 73 75 6c 74 73   length $results
12e40 56 61 72 4e 61 6d 65 5d 20 3e 20 30 7d 20 74 68  VarName] > 0} th
12e50 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 75 70  en {..        up
12e60 76 61 72 20 31 20 24 72 65 73 75 6c 74 73 56 61  var 1 $resultsVa
12e70 72 4e 61 6d 65 20 72 65 73 75 6c 74 73 0d 0a 20  rName results.. 
12e80 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
12e90 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
12ea0 74 68 20 24 65 72 72 6f 72 73 56 61 72 4e 61 6d  th $errorsVarNam
12eb0 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  e] > 0} then {..
12ec0 20 20 20 20 20 20 20 20 75 70 76 61 72 20 31 20          upvar 1 
12ed0 24 65 72 72 6f 72 73 56 61 72 4e 61 6d 65 20 65  $errorsVarName e
12ee0 72 72 6f 72 73 0d 0a 20 20 20 20 20 20 7d 0d 0a  rrors..      }..
12ef0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
12f00 20 23 20 4e 4f 54 45 3a 20 45 76 61 6c 75 61 74   # NOTE: Evaluat
12f10 65 20 74 68 65 20 63 6f 6e 73 74 72 75 63 74 65  e the constructe
12f20 64 20 5b 63 6f 6d 70 69 6c 65 43 53 68 61 72 70  d [compileCSharp
12f30 5d 20 63 6f 6d 6d 61 6e 64 20 61 6e 64 20 72 65  ] command and re
12f40 74 75 72 6e 20 74 68 65 0d 0a 20 20 20 20 20 20  turn the..      
12f50 23 20 20 20 20 20 20 20 72 65 73 75 6c 74 2e 0d  #       result..
12f60 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
12f70 65 76 61 6c 20 24 63 6f 6d 6d 61 6e 64 0d 0a 20  eval $command.. 
12f80 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
12f90 63 20 69 73 4d 65 6d 6f 72 79 44 62 20 7b 20 66  c isMemoryDb { f
12fa0 69 6c 65 4e 61 6d 65 20 7d 20 7b 0d 0a 20 20 20  ileName } {..   
12fb0 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
12fc0 54 45 3a 20 49 73 20 74 68 65 20 73 70 65 63 69  TE: Is the speci
12fd0 66 69 65 64 20 64 61 74 61 62 61 73 65 20 66 69  fied database fi
12fe0 6c 65 20 6e 61 6d 65 20 72 65 61 6c 6c 79 20 61  le name really a
12ff0 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
13000 62 61 73 65 3f 0d 0a 20 20 20 20 20 20 23 0d 0a  base?..      #..
13010 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 65 78        return [ex
13020 70 72 20 7b 24 66 69 6c 65 4e 61 6d 65 20 65 71  pr {$fileName eq
13030 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 7c 7c 20 5c   ":memory:" || \
13040 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72  ..          [str
13050 69 6e 67 20 72 61 6e 67 65 20 24 66 69 6c 65 4e  ing range $fileN
13060 61 6d 65 20 30 20 31 32 5d 20 65 71 20 22 66 69  ame 0 12] eq "fi
13070 6c 65 3a 3a 6d 65 6d 6f 72 79 3a 22 7d 5d 0d 0a  le::memory:"}]..
13080 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
13090 6f 63 20 69 73 54 61 62 6c 65 49 6e 44 62 20 7b  oc isTableInDb {
130a0 20 6e 61 6d 65 20 7b 76 61 72 4e 61 6d 65 20 64   name {varName d
130b0 62 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  b} } {..      #.
130c0 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52  .      # NOTE: R
130d0 65 66 65 72 20 74 6f 20 74 68 65 20 73 70 65 63  efer to the spec
130e0 69 66 69 65 64 20 76 61 72 69 61 62 6c 65 20 28  ified variable (
130f0 65 2e 67 2e 20 22 64 62 22 29 20 69 6e 20 74 68  e.g. "db") in th
13100 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72  e context of our
13110 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
13120 63 61 6c 6c 65 72 2e 20 20 49 74 20 63 6f 6e 74  caller.  It cont
13130 61 69 6e 73 20 74 68 65 20 64 61 74 61 62 61 73  ains the databas
13140 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e  e connection han
13150 64 6c 65 20 74 68 61 74 20 77 69 6c 6c 20 62 65  dle that will be
13160 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
13170 75 73 65 64 20 74 6f 20 65 78 65 63 75 74 65 20  used to execute 
13180 74 68 65 20 71 75 65 72 79 20 75 73 65 64 20 74  the query used t
13190 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74  o determine if t
131a0 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 20 69  he named table i
131b0 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  s..      #      
131c0 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 61 74   present in that
131d0 20 64 61 74 61 62 61 73 65 2e 0d 0a 20 20 20 20   database...    
131e0 20 20 23 0d 0a 20 20 20 20 20 20 75 70 76 61 72    #..      upvar
131f0 20 31 20 24 76 61 72 4e 61 6d 65 20 64 62 0d 0a   1 $varName db..
13200 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
13210 20 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65   # NOTE: Use the
13220 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
13230 61 62 6c 65 20 74 6f 20 64 65 74 65 72 6d 69 6e  able to determin
13240 65 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 74  e if the named t
13250 61 62 6c 65 20 69 73 0d 0a 20 20 20 20 20 20 23  able is..      #
13260 20 20 20 20 20 20 20 70 72 65 73 65 6e 74 20 69         present i
13270 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0d  n the database..
13280 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
13290 73 65 74 20 73 71 6c 20 7b 0d 0a 20 20 20 20 20  set sql {..     
132a0 20 20 20 53 45 4c 45 43 54 20 43 4f 55 4e 54 28     SELECT COUNT(
132b0 2a 29 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d  *) FROM sqlite_m
132c0 61 73 74 65 72 20 57 48 45 52 45 20 74 79 70 65  aster WHERE type
132d0 20 3d 20 27 74 61 62 6c 65 27 20 41 4e 44 20 6e   = 'table' AND n
132e0 61 6d 65 20 3d 20 3f 3b 0d 0a 20 20 20 20 20 20  ame = ?;..      
132f0 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
13300 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 74 75      # NOTE: Retu
13310 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74  rn non-zero if t
13320 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 20 69  he named table i
13330 73 20 70 72 65 73 65 6e 74 2e 0d 0a 20 20 20 20  s present...    
13340 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75 72    #..      retur
13350 6e 20 5b 65 78 70 72 20 7b 0d 0a 20 20 20 20 20  n [expr {..     
13360 20 20 20 5b 73 71 6c 20 65 78 65 63 75 74 65 20     [sql execute 
13370 2d 65 78 65 63 75 74 65 20 73 63 61 6c 61 72 20  -execute scalar 
13380 24 64 62 20 24 73 71 6c 20 5b 6c 69 73 74 20 70  $db $sql [list p
13390 61 72 61 6d 31 20 53 74 72 69 6e 67 20 24 6e 61  aram1 String $na
133a0 6d 65 5d 5d 20 3e 20 30 0d 0a 20 20 20 20 20 20  me]] > 0..      
133b0 7d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  }]..    }.....  
133c0 20 20 70 72 6f 63 20 67 65 74 44 62 44 65 66 61    proc getDbDefa
133d0 75 6c 74 50 61 67 65 53 69 7a 65 20 7b 7d 20 7b  ultPageSize {} {
133e0 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74  ..      if {[cat
133f0 63 68 20 7b 65 78 65 63 75 74 65 53 71 6c 20 22  ch {executeSql "
13400 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65  PRAGMA page_size
13410 3b 22 20 73 63 61 6c 61 72 7d 20 72 65 73 75 6c  ;" scalar} resul
13420 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  t] == 0} then {.
13430 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
13440 24 72 65 73 75 6c 74 0d 0a 20 20 20 20 20 20 7d  $result..      }
13450 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
13460 20 72 65 74 75 72 6e 20 30 0d 0a 20 20 20 20 20   return 0..     
13470 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
13480 20 20 70 72 6f 63 20 67 65 74 44 62 44 65 66 61    proc getDbDefa
13490 75 6c 74 43 61 63 68 65 53 69 7a 65 20 7b 7d 20  ultCacheSize {} 
134a0 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61  {..      if {[ca
134b0 74 63 68 20 7b 65 78 65 63 75 74 65 53 71 6c 20  tch {executeSql 
134c0 22 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69  "PRAGMA cache_si
134d0 7a 65 3b 22 20 73 63 61 6c 61 72 7d 20 72 65 73  ze;" scalar} res
134e0 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ult] == 0} then 
134f0 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  {..        retur
13500 6e 20 24 72 65 73 75 6c 74 0d 0a 20 20 20 20 20  n $result..     
13510 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
13520 20 20 20 72 65 74 75 72 6e 20 30 0d 0a 20 20 20     return 0..   
13530 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
13540 20 20 20 20 70 72 6f 63 20 75 73 65 4c 65 67 61      proc useLega
13550 63 79 44 62 50 61 67 65 41 6e 64 43 61 63 68 65  cyDbPageAndCache
13560 53 69 7a 65 73 20 7b 20 76 61 72 4e 61 6d 65 20  Sizes { varName 
13570 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
13580 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 66 65      # NOTE: Refe
13590 72 20 74 6f 20 74 68 65 20 73 70 65 63 69 66 69  r to the specifi
135a0 65 64 20 76 61 72 69 61 62 6c 65 20 28 65 2e 67  ed variable (e.g
135b0 2e 20 22 64 62 22 29 20 69 6e 20 74 68 65 20 63  . "db") in the c
135c0 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72 0d 0a 20  ontext of our.. 
135d0 20 20 20 20 20 23 20 20 20 20 20 20 20 63 61 6c       #       cal
135e0 6c 65 72 2e 20 20 49 74 20 63 6f 6e 74 61 69 6e  ler.  It contain
135f0 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  s the database c
13600 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65  onnection handle
13610 20 74 68 61 74 20 77 69 6c 6c 20 62 65 0d 0a 20   that will be.. 
13620 20 20 20 20 20 23 20 20 20 20 20 20 20 75 73 65       #       use
13630 64 20 74 6f 20 65 78 65 63 75 74 65 20 71 75 65  d to execute que
13640 72 69 65 73 20 75 73 65 64 20 74 6f 20 73 65 74  ries used to set
13650 20 74 68 65 20 70 61 67 65 20 61 6e 64 20 63 61   the page and ca
13660 63 68 65 20 73 69 7a 65 73 2e 0d 0a 20 20 20 20  che sizes...    
13670 20 20 23 0d 0a 20 20 20 20 20 20 75 70 76 61 72    #..      upvar
13680 20 31 20 24 76 61 72 4e 61 6d 65 20 64 62 0d 0a   1 $varName db..
13690 0d 0a 20 20 20 20 20 20 73 71 6c 20 65 78 65 63  ..      sql exec
136a0 75 74 65 20 24 64 62 20 7b 0d 0a 20 20 20 20 20  ute $db {..     
136b0 20 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73     PRAGMA page_s
136c0 69 7a 65 20 3d 20 31 30 32 34 3b 0d 0a 20 20 20  ize = 1024;..   
136d0 20 20 20 20 20 50 52 41 47 4d 41 20 63 61 63 68       PRAGMA cach
136e0 65 5f 73 69 7a 65 20 3d 20 32 30 30 30 3b 0d 0a  e_size = 2000;..
136f0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
13700 20 72 65 74 75 72 6e 20 5b 6c 69 73 74 20 5c 0d   return [list \.
13710 0a 20 20 20 20 20 20 20 20 20 20 5b 73 71 6c 20  .          [sql 
13720 65 78 65 63 75 74 65 20 2d 65 78 65 63 75 74 65  execute -execute
13730 20 73 63 61 6c 61 72 20 24 64 62 20 22 50 52 41   scalar $db "PRA
13740 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 3b 22 5d  GMA page_size;"]
13750 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73   \..          [s
13760 71 6c 20 65 78 65 63 75 74 65 20 2d 65 78 65 63  ql execute -exec
13770 75 74 65 20 73 63 61 6c 61 72 20 24 64 62 20 22  ute scalar $db "
13780 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a  PRAGMA cache_siz
13790 65 3b 22 5d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d  e;"]]..    }....
137a0 0a 20 20 20 20 70 72 6f 63 20 65 78 74 72 61 63  .    proc extrac
137b0 74 53 79 73 74 65 6d 44 61 74 61 53 51 4c 69 74  tSystemDataSQLit
137c0 65 45 78 63 65 70 74 69 6f 6e 4d 65 73 73 61 67  eExceptionMessag
137d0 65 20 7b 20 76 61 6c 75 65 20 7d 20 7b 0d 0a 20  e { value } {.. 
137e0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
137f0 4e 4f 54 45 3a 20 49 66 20 74 68 65 20 73 74 72  NOTE: If the str
13800 69 6e 67 20 63 6f 6e 66 6f 72 6d 73 20 74 6f 20  ing conforms to 
13810 66 6f 72 6d 61 74 20 6f 66 20 74 68 65 20 6e 6f  format of the no
13820 72 6d 61 6c 20 65 78 63 65 70 74 69 6f 6e 0d 0a  rmal exception..
13830 20 20 20 20 20 20 23 20 20 20 20 20 20 20 65 72        #       er
13840 72 6f 72 20 73 74 72 69 6e 67 73 2c 20 65 78 74  ror strings, ext
13850 72 61 63 74 20 61 6e 64 20 72 65 74 75 72 6e 20  ract and return 
13860 6f 6e 6c 79 20 74 68 65 20 65 72 72 6f 72 20 6d  only the error m
13870 65 73 73 61 67 65 0d 0a 20 20 20 20 20 20 23 20  essage..      # 
13880 20 20 20 20 20 20 70 6f 72 74 69 6f 6e 20 69 74        portion it
13890 73 65 6c 66 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  self...      #..
138a0 20 20 20 20 20 20 73 65 74 20 70 61 74 74 65 72        set patter
138b0 6e 73 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20  ns [list \..    
138c0 20 20 7b 53 79 73 74 65 6d 5c 2e 44 61 74 61 5c    {System\.Data\
138d0 2e 53 51 4c 69 74 65 5c 2e 53 51 4c 69 74 65 45  .SQLite\.SQLiteE
138e0 78 63 65 70 74 69 6f 6e 20 5c 28 30 78 38 30 30  xception \(0x800
138f0 30 34 30 30 35 5c 29 3a 20 28 2e 2b 3f 29 20 20  04005\): (.+?)  
13900 28 3f 3a 20 29 3f 61 74 7d 20 5c 0d 0a 20 20 20  (?: )?at} \..   
13910 20 20 20 7b 53 79 73 74 65 6d 5c 2e 44 61 74 61     {System\.Data
13920 5c 2e 53 51 4c 69 74 65 5c 2e 53 51 4c 69 74 65  \.SQLite\.SQLite
13930 45 78 63 65 70 74 69 6f 6e 3a 20 28 2e 2b 3f 29  Exception: (.+?)
13940 20 20 28 3f 3a 20 29 3f 61 74 7d 20 5c 0d 0a 20    (?: )?at} \.. 
13950 20 20 20 20 20 7b 45 61 67 6c 65 5c 2e 5f 43 6f       {Eagle\._Co
13960 6d 70 6f 6e 65 6e 74 73 5c 2e 50 75 62 6c 69 63  mponents\.Public
13970 5c 2e 53 63 72 69 70 74 45 78 63 65 70 74 69 6f  \.ScriptExceptio
13980 6e 3a 20 28 2e 2b 3f 29 20 20 28 3f 3a 20 29 3f  n: (.+?)  (?: )?
13990 61 74 7d 5d 0d 0a 0d 0a 20 20 20 20 20 20 66 6f  at}]....      fo
139a0 72 65 61 63 68 20 70 61 74 74 65 72 6e 20 24 70  reach pattern $p
139b0 61 74 74 65 72 6e 73 20 7b 0d 0a 20 20 20 20 20  atterns {..     
139c0 20 20 20 69 66 20 7b 5b 72 65 67 65 78 70 20 2d     if {[regexp -
139d0 2d 20 24 70 61 74 74 65 72 6e 20 24 76 61 6c 75  - $pattern $valu
139e0 65 20 64 75 6d 6d 79 20 6d 65 73 73 61 67 65 5d  e dummy message]
139f0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
13a00 20 20 20 20 73 65 74 20 6d 65 73 73 61 67 65 20      set message 
13a10 5b 73 74 72 69 6e 67 20 6d 61 70 20 5b 6c 69 73  [string map [lis
13a20 74 20 5c 72 5c 6e 20 5c 6e 5d 20 5b 73 74 72 69  t \r\n \n] [stri
13a30 6e 67 20 74 72 69 6d 20 24 6d 65 73 73 61 67 65  ng trim $message
13a40 5d 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65  ]]..          se
13a50 74 20 6c 69 6e 65 73 20 5b 73 70 6c 69 74 20 24  t lines [split $
13a60 6d 65 73 73 61 67 65 20 5c 6e 5d 0d 0a 0d 0a 20  message \n].... 
13a70 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 6c 6c           if {[ll
13a80 65 6e 67 74 68 20 24 6c 69 6e 65 73 5d 20 3d 3d  ength $lines] ==
13a90 20 32 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   2} then {..    
13aa0 20 20 20 20 20 20 20 20 69 66 20 7b 5b 6c 69 6e          if {[lin
13ab0 64 65 78 20 24 6c 69 6e 65 73 20 30 5d 20 65 71  dex $lines 0] eq
13ac0 20 5b 6c 69 6e 64 65 78 20 24 6c 69 6e 65 73 20   [lindex $lines 
13ad0 31 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  1]} then {..    
13ae0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
13af0 20 5b 6c 69 6e 64 65 78 20 24 6c 69 6e 65 73 20   [lindex $lines 
13b00 30 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  0]..            
13b10 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
13b20 20 72 65 74 75 72 6e 20 5b 61 70 70 65 6e 64 41   return [appendA
13b30 72 67 73 20 5b 6c 69 6e 64 65 78 20 24 6c 69 6e  rgs [lindex $lin
13b40 65 73 20 30 5d 20 22 20 2d 2d 20 22 20 5b 6c 69  es 0] " -- " [li
13b50 6e 64 65 78 20 24 6c 69 6e 65 73 20 31 5d 5d 0d  ndex $lines 1]].
13b60 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  .          }....
13b70 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
13b80 20 24 6d 65 73 73 61 67 65 0d 0a 20 20 20 20 20   $message..     
13b90 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d     }..      }...
13ba0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 76  .      return $v
13bb0 61 6c 75 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  alue..    }.....
13bc0 20 20 20 20 70 72 6f 63 20 74 72 69 6d 53 71 6c      proc trimSql
13bd0 20 7b 20 73 71 6c 20 7d 20 7b 0d 0a 20 20 20 20   { sql } {..    
13be0 20 20 72 65 74 75 72 6e 20 5b 72 65 67 73 75 62    return [regsub
13bf0 20 2d 61 6c 6c 20 2d 2d 20 7b 5c 73 2b 7d 20 5b   -all -- {\s+} [
13c00 73 74 72 69 6e 67 20 74 72 69 6d 20 24 73 71 6c  string trim $sql
13c10 5d 20 22 20 22 5d 0d 0a 20 20 20 20 7d 0d 0a 0c  ] " "]..    }...
13c20 0d 0a 20 20 20 20 70 72 6f 63 20 65 78 65 63 75  ..    proc execu
13c30 74 65 53 71 6c 20 7b 20 73 71 6c 20 7b 65 78 65  teSql { sql {exe
13c40 63 75 74 65 20 6e 6f 6e 65 7d 20 7b 66 6f 72 6d  cute none} {form
13c50 61 74 20 6e 6f 6e 65 7d 20 7b 66 69 6c 65 4e 61  at none} {fileNa
13c60 6d 65 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20  me ""} } {..    
13c70 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
13c80 6e 67 74 68 20 24 66 69 6c 65 4e 61 6d 65 5d 20  ngth $fileName] 
13c90 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 73 65 74 20  == 0} then {set 
13ca0 66 69 6c 65 4e 61 6d 65 20 3a 6d 65 6d 6f 72 79  fileName :memory
13cb0 3a 7d 0d 0a 20 20 20 20 20 20 73 65 74 75 70 44  :}..      setupD
13cc0 62 20 24 66 69 6c 65 4e 61 6d 65 20 22 22 20 22  b $fileName "" "
13cd0 22 20 22 22 20 22 22 20 22 22 20 66 61 6c 73 65  " "" "" "" false
13ce0 20 66 61 6c 73 65 20 66 61 6c 73 65 20 66 61 6c   false false fal
13cf0 73 65 20 64 62 20 74 72 75 65 0d 0a 0d 0a 20 20  se db true....  
13d00 20 20 20 20 74 72 79 20 7b 0d 0a 20 20 20 20 20      try {..     
13d10 20 20 20 72 65 74 75 72 6e 20 5b 75 70 6c 65 76     return [uplev
13d20 65 6c 20 31 20 5b 6c 69 73 74 20 5c 0d 0a 20 20  el 1 [list \..  
13d30 20 20 20 20 20 20 20 20 20 20 73 71 6c 20 65 78            sql ex
13d40 65 63 75 74 65 20 2d 65 78 65 63 75 74 65 20 24  ecute -execute $
13d50 65 78 65 63 75 74 65 20 2d 66 6f 72 6d 61 74 20  execute -format 
13d60 24 66 6f 72 6d 61 74 20 24 64 62 20 24 73 71 6c  $format $db $sql
13d70 5d 5d 0d 0a 20 20 20 20 20 20 7d 20 66 69 6e 61  ]]..      } fina
13d80 6c 6c 79 20 7b 0d 0a 20 20 20 20 20 20 20 20 73  lly {..        s
13d90 65 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 5b 67  et connection [g
13da0 65 74 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 5d 0d  etDbConnection].
13db0 0a 0d 0a 20 20 20 20 20 20 20 20 74 72 79 20 7b  ...        try {
13dc0 0d 0a 20 20 20 20 20 20 20 20 20 20 63 6c 65 61  ..          clea
13dd0 6e 75 70 44 62 20 24 66 69 6c 65 4e 61 6d 65 20  nupDb $fileName 
13de0 64 62 20 66 61 6c 73 65 20 66 61 6c 73 65 20 66  db false false f
13df0 61 6c 73 65 0d 0a 20 20 20 20 20 20 20 20 7d 20  alse..        } 
13e00 66 69 6e 61 6c 6c 79 20 7b 0d 0a 20 20 20 20 20  finally {..     
13e10 20 20 20 20 20 6f 62 6a 65 63 74 20 66 6c 61 67       object flag
13e20 73 20 24 63 6f 6e 6e 65 63 74 69 6f 6e 20 2d 4e  s $connection -N
13e30 6f 44 69 73 70 6f 73 65 3b 20 66 72 65 65 44 62  oDispose; freeDb
13e40 43 6f 6e 6e 65 63 74 69 6f 6e 0d 0a 20 20 20 20  Connection..    
13e50 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
13e60 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
13e70 6f 63 20 68 61 73 4e 6f 46 6c 61 67 73 20 7b 20  oc hasNoFlags { 
13e80 76 61 72 4e 61 6d 65 20 6e 6f 6e 65 20 7d 20 7b  varName none } {
13e90 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20 31 20  ..      upvar 1 
13ea0 24 76 61 72 4e 61 6d 65 20 66 6c 61 67 73 0d 0a  $varName flags..
13eb0 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e  ..      if {![in
13ec0 66 6f 20 65 78 69 73 74 73 20 66 6c 61 67 73 5d  fo exists flags]
13ed0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
13ee0 20 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20    return true.. 
13ef0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
13f00 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
13f10 74 68 20 24 66 6c 61 67 73 5d 20 3d 3d 20 30 7d  th $flags] == 0}
13f20 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
13f30 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20   return true..  
13f40 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69      }....      i
13f50 66 20 7b 24 6e 6f 6e 65 20 26 26 20 24 66 6c 61  f {$none && $fla
13f60 67 73 20 65 71 20 22 4e 6f 6e 65 22 7d 20 74 68  gs eq "None"} th
13f70 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65  en {..        re
13f80 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20  turn true..     
13f90 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75   }....      retu
13fa0 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20 7d 0d  rn false..    }.
13fb0 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74  ....    proc get
13fc0 43 6f 6e 6e 65 63 74 69 6f 6e 46 6c 61 67 73 20  ConnectionFlags 
13fd0 7b 20 66 69 6c 65 4e 61 6d 65 20 66 6c 61 67 73  { fileName flags
13fe0 20 7b 71 75 69 65 74 20 66 61 6c 73 65 7d 20 7d   {quiet false} }
13ff0 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
14000 20 20 20 23 20 4e 4f 54 45 3a 20 46 69 67 75 72     # NOTE: Figur
14010 65 20 6f 75 74 20 77 68 69 63 68 20 64 61 74 61  e out which data
14020 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 6f  base file name o
14030 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72  r connection str
14040 69 6e 67 20 74 68 65 73 65 0d 0a 20 20 20 20 20  ing these..     
14050 20 23 20 20 20 20 20 20 20 63 6f 6e 6e 65 63 74   #       connect
14060 69 6f 6e 20 66 6c 61 67 73 20 77 69 6c 6c 20 61  ion flags will a
14070 63 74 75 61 6c 6c 79 20 61 70 70 6c 79 20 74 6f  ctually apply to
14080 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 74 20 6e  .  This is not n
14090 65 63 65 73 73 61 72 79 0d 0a 20 20 20 20 20 20  ecessary..      
140a0 23 20 20 20 20 20 20 20 69 6e 20 71 75 69 65 74  #       in quiet
140b0 20 6d 6f 64 65 20 62 65 63 61 75 73 65 20 74 68   mode because th
140c0 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  is information i
140d0 73 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 20  s only used for 
140e0 6c 6f 67 67 69 6e 67 0d 0a 20 20 20 20 20 20 23  logging..      #
140f0 20 20 20 20 20 20 20 61 6e 64 20 72 65 70 6f 72         and repor
14100 74 69 6e 67 20 70 75 72 70 6f 73 65 73 2e 0d 0a  ting purposes...
14110 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
14120 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
14130 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   {..        if {
14140 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
14150 66 69 6c 65 4e 61 6d 65 5d 20 3e 20 30 7d 20 74  fileName] > 0} t
14160 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
14170 20 73 65 74 20 64 61 74 61 62 61 73 65 20 5b 61   set database [a
14180 70 70 65 6e 64 41 72 67 73 20 22 66 69 6c 65 20  ppendArgs "file 
14190 6e 61 6d 65 20 5c 22 22 20 24 66 69 6c 65 4e 61  name \"" $fileNa
141a0 6d 65 20 5c 22 5d 0d 0a 20 20 20 20 20 20 20 20  me \"]..        
141b0 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20  } elseif {[info 
141c0 65 78 69 73 74 73 20 3a 3a 64 61 74 61 53 6f 75  exists ::dataSou
141d0 72 63 65 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  rce] && \..     
141e0 20 20 20 20 20 20 20 21 5b 61 72 72 61 79 20 65         ![array e
141f0 78 69 73 74 73 20 3a 3a 64 61 74 61 53 6f 75 72  xists ::dataSour
14200 63 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ce]} then {..   
14210 20 20 20 20 20 20 20 73 65 74 20 64 61 74 61 62         set datab
14220 61 73 65 20 5b 61 70 70 65 6e 64 41 72 67 73 20  ase [appendArgs 
14230 22 64 61 74 61 20 73 6f 75 72 63 65 20 5c 22 22  "data source \""
14240 20 24 3a 3a 64 61 74 61 53 6f 75 72 63 65 20 5c   $::dataSource \
14250 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c  "]..        } el
14260 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
14270 73 65 74 20 64 61 74 61 62 61 73 65 20 3c 75 6e  set database <un
14280 6b 6e 6f 77 6e 3e 0d 0a 20 20 20 20 20 20 20 20  known>..        
14290 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  }..      }....  
142a0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
142b0 4f 54 45 3a 20 45 76 65 6e 20 74 68 6f 75 67 68  OTE: Even though
142c0 20 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 6f   there is only o
142d0 6e 65 20 73 6f 75 72 63 65 20 6f 66 20 66 6c 61  ne source of fla
142e0 67 73 20 73 6f 20 66 61 72 2c 20 74 68 65 79 0d  gs so far, they.
142f0 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6d  .      #       m
14300 75 73 74 20 62 65 20 63 6f 6d 62 69 6e 65 64 20  ust be combined 
14310 75 73 69 6e 67 20 74 68 65 20 63 6f 72 72 65 63  using the correc
14320 74 20 73 79 6e 74 61 78 20 66 6f 72 20 65 6e 75  t syntax for enu
14330 6d 65 72 61 74 65 64 0d 0a 20 20 20 20 20 20 23  merated..      #
14340 20 20 20 20 20 20 20 66 6c 61 67 20 76 61 6c 75         flag valu
14350 65 73 20 66 6f 72 20 74 68 65 20 2e 4e 45 54 20  es for the .NET 
14360 46 72 61 6d 65 77 6f 72 6b 2e 0d 0a 20 20 20 20  Framework...    
14370 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 66    #..      set f
14380 6c 61 67 73 20 5b 63 6f 6d 62 69 6e 65 46 6c 61  lags [combineFla
14390 67 73 20 24 66 6c 61 67 73 20 22 22 5d 0d 0a 0d  gs $flags ""]...
143a0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
143b0 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20 28 61 6e  # NOTE: Show (an
143c0 64 20 6c 6f 67 29 20 74 68 65 20 6c 6f 63 61 6c  d log) the local
143d0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67   connection flag
143e0 73 20 61 6e 64 20 74 68 65 20 61 73 73 6f 63 69  s and the associ
143f0 61 74 65 64 0d 0a 20 20 20 20 20 20 23 20 20 20  ated..      #   
14400 20 20 20 20 64 61 74 61 20 73 6f 75 72 63 65 20      data source 
14410 6f 72 20 66 69 6c 65 20 6e 61 6d 65 2e 0d 0a 20  or file name... 
14420 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
14430 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
14440 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21  {..        if {!
14450 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
14460 6f 28 65 6d 69 74 4c 6f 63 61 6c 46 6c 61 67 73  o(emitLocalFlags
14470 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  )] && \..       
14480 20 20 20 20 20 28 21 5b 69 6e 66 6f 20 65 78 69       (![info exi
14490 73 74 73 20 3a 3a 6e 6f 28 65 6d 69 74 4c 6f 63  sts ::no(emitLoc
144a0 61 6c 46 6c 61 67 73 49 66 4e 6f 6e 65 29 5d 20  alFlagsIfNone)] 
144b0 7c 7c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  || \..          
144c0 20 20 20 21 5b 68 61 73 4e 6f 46 6c 61 67 73 20     ![hasNoFlags 
144d0 66 6c 61 67 73 20 66 61 6c 73 65 5d 29 7d 20 74  flags false])} t
144e0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
144f0 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
14500 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
14510 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
14520 20 20 20 20 22 2d 2d 2d 2d 20 6c 6f 63 61 6c 20      "---- local 
14530 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73  connection flags
14540 20 66 6f 72 20 22 20 24 64 61 74 61 62 61 73 65   for " $database
14550 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
14560 20 20 22 20 61 72 65 3a 20 22 20 5b 65 78 70 72    " are: " [expr
14570 20 7b 21 5b 68 61 73 4e 6f 46 6c 61 67 73 20 66   {![hasNoFlags f
14580 6c 61 67 73 20 66 61 6c 73 65 5d 20 3f 20 5c 0d  lags false] ? \.
14590 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b  .              [
145a0 61 70 70 65 6e 64 41 72 67 73 20 5c 22 20 24 66  appendArgs \" $f
145b0 6c 61 67 73 20 5c 22 5d 20 3a 20 22 3c 6e 6f 6e  lags \"] : "<non
145c0 65 3e 22 7d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20  e>"}] \n]..     
145d0 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d     }..      }...
145e0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
145f0 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20 28 61 6e  # NOTE: Show (an
14600 64 20 6c 6f 67 29 20 74 68 65 20 73 68 61 72 65  d log) the share
14610 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61  d connection fla
14620 67 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  gs...      #..  
14630 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
14640 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
14650 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
14660 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20           object 
14670 69 6e 76 6f 6b 65 20 53 79 73 74 65 6d 2e 44 61  invoke System.Da
14680 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65  ta.SQLite.SQLite
14690 43 6f 6e 6e 65 63 74 69 6f 6e 20 53 68 61 72 65  Connection Share
146a0 64 46 6c 61 67 73 0d 0a 20 20 20 20 20 20 20 20  dFlags..        
146b0 7d 20 73 68 61 72 65 64 46 6c 61 67 73 5d 20 3d  } sharedFlags] =
146c0 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
146d0 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
146e0 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 65 6d  o exists ::no(em
146f0 69 74 53 68 61 72 65 64 46 6c 61 67 73 29 5d 20  itSharedFlags)] 
14700 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
14710 20 20 20 20 28 21 5b 69 6e 66 6f 20 65 78 69 73      (![info exis
14720 74 73 20 3a 3a 6e 6f 28 65 6d 69 74 53 68 61 72  ts ::no(emitShar
14730 65 64 46 6c 61 67 73 49 66 4e 6f 6e 65 29 5d 20  edFlagsIfNone)] 
14740 7c 7c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  || \..          
14750 20 20 20 20 20 21 5b 68 61 73 4e 6f 46 6c 61 67       ![hasNoFlag
14760 73 20 73 68 61 72 65 64 46 6c 61 67 73 20 74 72  s sharedFlags tr
14770 75 65 5d 29 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ue])} then {..  
14780 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
14790 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
147a0 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
147b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
147c0 2d 2d 2d 2d 20 73 68 61 72 65 64 20 63 6f 6e 6e  ---- shared conn
147d0 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 66 6f 72  ection flags for
147e0 20 22 20 24 64 61 74 61 62 61 73 65 20 5c 0d 0a   " $database \..
147f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14800 22 20 61 72 65 3a 20 22 20 5b 65 78 70 72 20 7b  " are: " [expr {
14810 21 5b 68 61 73 4e 6f 46 6c 61 67 73 20 73 68 61  ![hasNoFlags sha
14820 72 65 64 46 6c 61 67 73 20 74 72 75 65 5d 20 3f  redFlags true] ?
14830 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
14840 20 20 20 20 5b 61 70 70 65 6e 64 41 72 67 73 20      [appendArgs 
14850 5c 22 20 24 73 68 61 72 65 64 46 6c 61 67 73 20  \" $sharedFlags 
14860 5c 22 5d 20 3a 20 22 3c 6e 6f 6e 65 3e 22 7d 5d  \"] : "<none>"}]
14870 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \n]..          
14880 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73  }..        } els
14890 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69  e {..          i
148a0 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
148b0 20 3a 3a 6e 6f 28 65 6d 69 74 53 68 61 72 65 64   ::no(emitShared
148c0 46 6c 61 67 73 29 5d 20 26 26 20 5c 0d 0a 20 20  Flags)] && \..  
148d0 20 20 20 20 20 20 20 20 20 20 20 20 21 5b 69 6e              ![in
148e0 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 65  fo exists ::no(e
148f0 6d 69 74 53 68 61 72 65 64 46 6c 61 67 73 49 66  mitSharedFlagsIf
14900 55 6e 61 76 61 69 6c 61 62 6c 65 29 5d 7d 20 74  Unavailable)]} t
14910 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
14920 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
14930 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
14940 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
14950 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 68          "---- sh
14960 61 72 65 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ared connection 
14970 66 6c 61 67 73 20 66 6f 72 20 22 20 24 64 61 74  flags for " $dat
14980 61 62 61 73 65 20 5c 0d 0a 20 20 20 20 20 20 20  abase \..       
14990 20 20 20 20 20 20 20 20 20 22 20 61 72 65 3a 20           " are: 
149a0 3c 75 6e 61 76 61 69 6c 61 62 6c 65 3e 5c 6e 22  <unavailable>\n"
149b0 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ]..          }..
149c0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
149d0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   }....      #.. 
149e0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f       # NOTE: Sho
149f0 77 20 28 61 6e 64 20 6c 6f 67 29 20 74 68 65 20  w (and log) the 
14a00 64 65 74 65 63 74 65 64 20 67 6c 6f 62 61 6c 20  detected global 
14a10 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73  connection flags
14a20 2c 20 69 66 20 61 6e 79 2e 0d 0a 20 20 20 20 20  , if any...     
14a30 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 24   #..      if {!$
14a40 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
14a50 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
14a60 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 65 6d  o exists ::no(em
14a70 69 74 47 6c 6f 62 61 6c 46 6c 61 67 73 29 5d 20  itGlobalFlags)] 
14a80 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
14a90 20 20 28 21 5b 69 6e 66 6f 20 65 78 69 73 74 73    (![info exists
14aa0 20 3a 3a 6e 6f 28 65 6d 69 74 47 6c 6f 62 61 6c   ::no(emitGlobal
14ab0 46 6c 61 67 73 49 66 4e 6f 6e 65 29 5d 20 7c 7c  FlagsIfNone)] ||
14ac0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
14ad0 20 21 5b 68 61 73 4e 6f 46 6c 61 67 73 20 3a 3a   ![hasNoFlags ::
14ae0 63 6f 6e 6e 65 63 74 69 6f 6e 5f 66 6c 61 67 73  connection_flags
14af0 20 66 61 6c 73 65 5d 29 7d 20 74 68 65 6e 20 7b   false])} then {
14b00 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74  ..          tput
14b10 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
14b20 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
14b30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
14b40 2d 2d 2d 2d 20 67 6c 6f 62 61 6c 20 63 6f 6e 6e  ---- global conn
14b50 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 61 72 65  ection flags are
14b60 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  : " \..         
14b70 20 20 20 20 20 5b 65 78 70 72 20 7b 21 5b 68 61       [expr {![ha
14b80 73 4e 6f 46 6c 61 67 73 20 3a 3a 63 6f 6e 6e 65  sNoFlags ::conne
14b90 63 74 69 6f 6e 5f 66 6c 61 67 73 20 66 61 6c 73  ction_flags fals
14ba0 65 5d 20 3f 20 5c 0d 0a 20 20 20 20 20 20 20 20  e] ? \..        
14bb0 20 20 20 20 20 20 5b 61 70 70 65 6e 64 41 72 67        [appendArg
14bc0 73 20 5c 22 20 24 3a 3a 63 6f 6e 6e 65 63 74 69  s \" $::connecti
14bd0 6f 6e 5f 66 6c 61 67 73 20 5c 22 5d 20 3a 20 22  on_flags \"] : "
14be0 3c 6e 6f 6e 65 3e 22 7d 5d 20 5c 6e 5d 0d 0a 20  <none>"}] \n].. 
14bf0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
14c00 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
14c10 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 74      # NOTE: If t
14c20 68 65 72 65 20 61 72 65 20 61 6e 79 20 67 6c 6f  here are any glo
14c30 62 61 6c 20 28 70 65 72 20 74 65 73 74 20 72 75  bal (per test ru
14c40 6e 29 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c  n) connection fl
14c50 61 67 73 20 63 75 72 72 65 6e 74 6c 79 0d 0a 20  ags currently.. 
14c60 20 20 20 20 20 23 20 20 20 20 20 20 20 73 65 74       #       set
14c70 2c 20 75 73 65 20 74 68 65 6d 20 6e 6f 77 20 28  , use them now (
14c80 69 2e 65 2e 20 62 79 20 63 6f 6d 62 69 6e 69 6e  i.e. by combinin
14c90 67 20 74 68 65 6d 20 77 69 74 68 20 74 68 65 20  g them with the 
14ca0 6f 6e 65 73 20 66 6f 72 20 74 68 69 73 0d 0a 20  ones for this.. 
14cb0 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e       #       con
14cc0 6e 65 63 74 69 6f 6e 29 2e 0d 0a 20 20 20 20 20  nection)...     
14cd0 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69   #..      if {[i
14ce0 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 63 6f 6e  nfo exists ::con
14cf0 6e 65 63 74 69 6f 6e 5f 66 6c 61 67 73 5d 7d 20  nection_flags]} 
14d00 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
14d10 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
14d20 45 3a 20 43 6f 6d 62 69 6e 65 20 61 6e 64 2f 6f  E: Combine and/o
14d30 72 20 72 65 70 6c 61 63 65 20 74 68 65 20 63 6f  r replace the co
14d40 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 61  nnection flags a
14d50 6e 64 20 74 68 65 6e 20 73 68 6f 77 20 74 68 65  nd then show the
14d60 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
14d70 20 20 6e 65 77 20 76 61 6c 75 65 2e 0d 0a 20 20    new value...  
14d80 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
14d90 20 73 65 74 20 66 6c 61 67 73 20 5b 63 6f 6d 62   set flags [comb
14da0 69 6e 65 46 6c 61 67 73 20 24 66 6c 61 67 73 20  ineFlags $flags 
14db0 24 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e 5f 66 6c  $::connection_fl
14dc0 61 67 73 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ags]....        
14dd0 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
14de0 45 3a 20 53 68 6f 77 20 28 61 6e 64 20 6c 6f 67  E: Show (and log
14df0 29 20 74 68 65 20 6e 65 77 20 65 66 66 65 63 74  ) the new effect
14e00 69 76 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66  ive connection f
14e10 6c 61 67 73 2e 0d 0a 20 20 20 20 20 20 20 20 23  lags...        #
14e20 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 24  ..        if {!$
14e30 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
14e40 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69           if {![i
14e50 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
14e60 65 6d 69 74 43 6f 6d 62 69 6e 65 64 46 6c 61 67  emitCombinedFlag
14e70 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  s)] && \..      
14e80 20 20 20 20 20 20 20 20 28 21 5b 69 6e 66 6f 20          (![info 
14e90 65 78 69 73 74 73 20 3a 3a 6e 6f 28 65 6d 69 74  exists ::no(emit
14ea0 43 6f 6d 62 69 6e 65 64 46 6c 61 67 73 49 66 4e  CombinedFlagsIfN
14eb0 6f 6e 65 29 5d 20 7c 7c 20 5c 0d 0a 20 20 20 20  one)] || \..    
14ec0 20 20 20 20 20 20 20 20 20 20 20 21 5b 68 61 73             ![has
14ed0 4e 6f 46 6c 61 67 73 20 66 6c 61 67 73 20 66 61  NoFlags flags fa
14ee0 6c 73 65 5d 29 7d 20 74 68 65 6e 20 7b 0d 0a 20  lse])} then {.. 
14ef0 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
14f00 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
14f10 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
14f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f30 22 2d 2d 2d 2d 20 63 6f 6d 62 69 6e 65 64 20 63  "---- combined c
14f40 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 20  onnection flags 
14f50 66 6f 72 20 22 20 24 64 61 74 61 62 61 73 65 20  for " $database 
14f60 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
14f70 20 20 20 22 20 61 72 65 3a 20 22 20 5b 65 78 70     " are: " [exp
14f80 72 20 7b 21 5b 68 61 73 4e 6f 46 6c 61 67 73 20  r {![hasNoFlags 
14f90 66 6c 61 67 73 20 66 61 6c 73 65 5d 20 3f 20 5c  flags false] ? \
14fa0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
14fb0 20 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 22    [appendArgs \"
14fc0 20 24 66 6c 61 67 73 20 5c 22 5d 20 3a 20 22 3c   $flags \"] : "<
14fd0 6e 6f 6e 65 3e 22 7d 5d 20 5c 6e 5d 0d 0a 20 20  none>"}] \n]..  
14fe0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
14ff0 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d     }..      }...
15000 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 66  .      return $f
15010 6c 61 67 73 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  lags..    }.....
15020 20 20 20 20 70 72 6f 63 20 67 65 74 46 6c 61 67      proc getFlag
15030 73 50 72 6f 70 65 72 74 79 20 7b 20 7b 66 6c 61  sProperty { {fla
15040 67 73 20 22 22 7d 20 7b 71 75 69 65 74 20 66 61  gs ""} {quiet fa
15050 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20  lse} } {..      
15060 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
15070 20 44 65 74 65 72 6d 69 6e 65 20 77 68 61 74 20   Determine what 
15080 74 68 65 20 63 6f 6d 62 69 6e 65 64 20 28 67 6c  the combined (gl
15090 6f 62 61 6c 20 61 6e 64 20 6c 6f 63 61 6c 29 20  obal and local) 
150a0 63 6f 6e 6e 65 63 74 69 6f 6e 0d 0a 20 20 20 20  connection..    
150b0 20 20 23 20 20 20 20 20 20 20 66 6c 61 67 73 20    #       flags 
150c0 73 68 6f 75 6c 64 20 62 65 2c 20 70 6f 73 73 69  should be, possi
150d0 62 6c 79 20 71 75 69 65 74 6c 79 2e 0d 0a 20 20  bly quietly...  
150e0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74      #..      set
150f0 20 66 6c 61 67 73 20 5b 67 65 74 43 6f 6e 6e 65   flags [getConne
15100 63 74 69 6f 6e 46 6c 61 67 73 20 22 22 20 24 66  ctionFlags "" $f
15110 6c 61 67 73 20 24 71 75 69 65 74 5d 0d 0a 0d 0a  lags $quiet]....
15120 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
15130 20 4e 4f 54 45 3a 20 49 66 20 6e 6f 20 67 6c 6f   NOTE: If no glo
15140 62 61 6c 20 6f 72 20 6c 6f 63 61 6c 20 63 6f 6e  bal or local con
15150 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 77 65  nection flags we
15160 72 65 20 73 70 65 63 69 66 69 65 64 2c 20 74 68  re specified, th
15170 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
15180 20 64 65 66 61 75 6c 74 20 63 6f 6e 6e 65 63 74   default connect
15190 69 6f 6e 20 66 6c 61 67 73 20 73 68 6f 75 6c 64  ion flags should
151a0 20 62 65 20 75 73 65 64 3b 20 74 68 65 72 65 66   be used; theref
151b0 6f 72 65 2c 20 72 65 74 75 72 6e 0d 0a 20 20 20  ore, return..   
151c0 20 20 20 23 20 20 20 20 20 20 20 61 6e 20 65 6d     #       an em
151d0 70 74 79 20 73 74 72 69 6e 67 20 69 6e 20 74 68  pty string in th
151e0 61 74 20 63 61 73 65 2e 0d 0a 20 20 20 20 20 20  at case...      
151f0 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74  #..      if {[st
15200 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 66 6c 61  ring length $fla
15210 67 73 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  gs] == 0} then {
15220 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
15230 20 22 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a   ""..      }....
15240 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
15250 20 4e 4f 54 45 3a 20 49 6e 20 6f 72 64 65 72 20   NOTE: In order 
15260 74 6f 20 63 68 65 63 6b 20 69 66 20 74 68 65 20  to check if the 
15270 64 65 66 61 75 6c 74 20 63 6f 6e 6e 65 63 74 69  default connecti
15280 6f 6e 20 66 6c 61 67 73 20 61 72 65 20 62 65 69  on flags are bei
15290 6e 67 20 75 73 65 64 0d 0a 20 20 20 20 20 20 23  ng used..      #
152a0 20 20 20 20 20 20 20 69 74 20 69 73 20 6e 65 63         it is nec
152b0 65 73 73 61 72 79 20 74 6f 20 61 74 74 65 6d 70  essary to attemp
152c0 74 20 61 20 63 6f 6e 76 65 72 73 69 6f 6e 20 74  t a conversion t
152d0 6f 20 74 68 65 20 61 63 74 75 61 6c 20 65 6e 75  o the actual enu
152e0 6d 65 72 61 74 65 64 0d 0a 20 20 20 20 20 20 23  merated..      #
152f0 20 20 20 20 20 20 20 74 79 70 65 2e 20 20 46 61         type.  Fa
15300 69 6c 69 6e 67 20 74 68 61 74 2c 20 74 68 65 20  iling that, the 
15310 63 68 65 63 6b 20 61 67 61 69 6e 73 74 20 74 68  check against th
15320 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20  e default value 
15330 77 69 6c 6c 20 62 65 0d 0a 20 20 20 20 20 20 23  will be..      #
15340 20 20 20 20 20 20 20 73 6b 69 70 70 65 64 2e 0d         skipped..
15350 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
15360 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20  if {[catch {..  
15370 20 20 20 20 20 20 73 65 74 20 65 72 72 6f 72 20        set error 
15380 6e 75 6c 6c 3b 20 23 20 49 47 4e 4f 52 45 44 0d  null; # IGNORED.
15390 0a 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a 65 63  ...        objec
153a0 74 20 69 6e 76 6f 6b 65 20 55 74 69 6c 69 74 79  t invoke Utility
153b0 20 54 72 79 50 61 72 73 65 46 6c 61 67 73 45 6e   TryParseFlagsEn
153c0 75 6d 20 22 22 20 5c 0d 0a 20 20 20 20 20 20 20  um "" \..       
153d0 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61       System.Data
153e0 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 43 6f  .SQLite.SQLiteCo
153f0 6e 6e 65 63 74 69 6f 6e 46 6c 61 67 73 20 22 22  nnectionFlags ""
15400 20 24 66 6c 61 67 73 20 6e 75 6c 6c 20 74 72 75   $flags null tru
15410 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
15420 20 74 72 75 65 20 74 72 75 65 20 65 72 72 6f 72   true true error
15430 0d 0a 20 20 20 20 20 20 7d 20 76 61 6c 75 65 5d  ..      } value]
15440 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
15450 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
15460 4f 54 45 3a 20 41 74 74 65 6d 70 74 69 6e 67 20  OTE: Attempting 
15470 74 6f 20 70 61 72 73 65 20 74 68 65 20 63 6f 6e  to parse the con
15480 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 63 61  nection flags ca
15490 75 73 65 64 20 61 20 73 63 72 69 70 74 0d 0a 20  used a script.. 
154a0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 65         #       e
154b0 72 72 6f 72 2e 20 20 45 6d 69 74 20 61 20 77 61  rror.  Emit a wa
154c0 72 6e 69 6e 67 20 74 6f 20 74 68 65 20 74 65 73  rning to the tes
154d0 74 20 6c 6f 67 20 66 69 6c 65 20 61 6e 64 20 63  t log file and c
154e0 6f 6e 74 69 6e 75 65 0d 0a 20 20 20 20 20 20 20  ontinue..       
154f0 20 23 20 20 20 20 20 20 20 75 73 69 6e 67 20 61   #       using a
15500 6e 20 65 6d 74 70 79 20 73 74 72 69 6e 67 20 69  n emtpy string i
15510 6e 73 74 65 61 64 2e 0d 0a 20 20 20 20 20 20 20  nstead...       
15520 20 23 0d 0a 20 20 20 20 20 20 20 20 74 6c 6f 67   #..        tlog
15530 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
15540 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d              "===
15550 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65  = WARNING: faile
15560 64 20 74 6f 20 70 61 72 73 65 20 63 6f 6e 6e 65  d to parse conne
15570 63 74 69 6f 6e 20 66 6c 61 67 73 2c 20 65 72 72  ction flags, err
15580 6f 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20  or: " \..       
15590 20 20 20 20 20 5c 6e 5c 74 20 24 76 61 6c 75 65       \n\t $value
155a0 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20   \n]....        
155b0 73 65 74 20 76 61 6c 75 65 20 22 22 0d 0a 20 20  set value ""..  
155c0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
155d0 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
155e0 49 66 20 74 68 65 20 63 6f 6d 62 69 6e 65 64 20  If the combined 
155f0 66 6c 61 67 73 20 73 74 72 69 6e 67 20 63 6f 75  flags string cou
15600 6c 64 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  ld not actually 
15610 62 65 20 63 6f 6e 76 65 72 74 65 64 0d 0a 20 20  be converted..  
15620 20 20 20 20 23 20 20 20 20 20 20 20 74 6f 20 74      #       to t
15630 68 65 20 65 6e 75 6d 65 72 61 74 65 64 20 74 79  he enumerated ty
15640 70 65 20 69 74 20 69 73 20 74 68 65 20 64 65 66  pe it is the def
15650 61 75 6c 74 20 76 61 6c 75 65 2c 20 74 68 65 6e  ault value, then
15660 20 6a 75 73 74 20 75 73 65 0d 0a 20 20 20 20 20   just use..     
15670 20 23 20 20 20 20 20 20 20 69 74 20 76 65 72 62   #       it verb
15680 61 74 69 6d 3b 20 6f 74 68 65 72 77 69 73 65 2c  atim; otherwise,
15690 20 6a 75 73 74 20 72 65 74 75 72 6e 20 61 6e 20   just return an 
156a0 65 6d 70 74 79 20 73 74 72 69 6e 67 2e 20 20 49  empty string.  I
156b0 6e 20 74 68 61 74 0d 0a 20 20 20 20 20 20 23 20  n that..      # 
156c0 20 20 20 20 20 20 63 61 73 65 2c 20 74 68 65 20        case, the 
156d0 64 65 66 61 75 6c 74 20 63 6f 6e 6e 65 63 74 69  default connecti
156e0 6f 6e 20 66 6c 61 67 73 20 77 69 6c 6c 20 62 65  on flags will be
156f0 20 75 73 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d   used...      #.
15700 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69  .      if {[stri
15710 6e 67 20 6c 65 6e 67 74 68 20 24 76 61 6c 75 65  ng length $value
15720 5d 20 3d 3d 20 30 20 7c 7c 20 24 76 61 6c 75 65  ] == 0 || $value
15730 20 6e 65 20 22 44 65 66 61 75 6c 74 22 7d 20 74   ne "Default"} t
15740 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
15750 0d 0a 20 20 20 20 20 20 20 20 23 20 57 41 52 4e  ..        # WARN
15760 49 4e 47 3a 20 54 68 69 73 20 72 65 74 75 72 6e  ING: This return
15770 73 20 74 68 65 20 73 74 72 69 6e 67 20 76 61 6c  s the string val
15780 75 65 20 6f 66 20 74 68 65 20 63 6f 6d 62 69 6e  ue of the combin
15790 65 64 20 66 6c 61 67 73 2c 20 6e 6f 74 0d 0a 20  ed flags, not.. 
157a0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20         #        
157b0 20 20 74 68 65 20 65 6e 75 6d 65 72 61 74 65 64    the enumerated
157c0 20 76 61 6c 75 65 2e 20 20 54 68 69 73 20 69 73   value.  This is
157d0 20 62 79 20 64 65 73 69 67 6e 20 61 6e 64 20 73   by design and s
157e0 68 6f 75 6c 64 20 6e 6f 74 0d 0a 20 20 20 20 20  hould not..     
157f0 20 20 20 23 20 20 20 20 20 20 20 20 20 20 62 65     #          be
15800 20 63 68 61 6e 67 65 64 20 77 69 74 68 6f 75 74   changed without
15810 20 63 61 72 65 66 75 6c 20 63 6f 6e 73 69 64 65   careful conside
15820 72 61 74 69 6f 6e 20 28 65 2e 67 2e 20 69 74 20  ration (e.g. it 
15830 77 6f 75 6c 64 0d 0a 20 20 20 20 20 20 20 20 23  would..        #
15840 20 20 20 20 20 20 20 20 20 20 70 72 65 76 65 6e            preven
15850 74 20 74 68 65 20 53 51 4c 69 74 65 43 6f 6e 6e  t the SQLiteConn
15860 65 63 74 69 6f 6e 20 63 6c 61 73 73 20 66 72 6f  ection class fro
15870 6d 20 61 6c 6c 6f 77 69 6e 67 20 69 6e 76 61 6c  m allowing inval
15880 69 64 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  id..        #   
15890 20 20 20 20 20 20 20 5b 22 6d 61 67 69 63 61 6c         ["magical
158a0 22 5d 20 6d 65 74 61 2d 66 6c 61 67 73 29 2e 0d  "] meta-flags)..
158b0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
158c0 20 20 20 20 72 65 74 75 72 6e 20 5b 61 70 70 65      return [appe
158d0 6e 64 41 72 67 73 20 22 46 6c 61 67 73 3d 22 20  ndArgs "Flags=" 
158e0 24 66 6c 61 67 73 20 5c 3b 5d 0d 0a 20 20 20 20  $flags \;]..    
158f0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74    }....      ret
15900 75 72 6e 20 22 22 0d 0a 20 20 20 20 7d 0d 0a 0c  urn ""..    }...
15910 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 54 65  ..    proc getTe
15920 73 74 50 72 6f 70 65 72 74 69 65 73 20 7b 20 7b  stProperties { {
15930 66 6c 61 67 73 20 22 22 7d 20 7b 71 75 69 65 74  flags ""} {quiet
15940 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20   false} } {..   
15950 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
15960 54 45 3a 20 53 74 61 72 74 20 77 69 74 68 20 22  TE: Start with "
15970 46 6c 61 67 73 22 20 70 72 6f 70 65 72 74 79 20  Flags" property 
15980 66 6f 72 20 74 68 65 20 6e 65 77 20 63 6f 6e 6e  for the new conn
15990 65 63 74 69 6f 6e 2c 20 69 66 20 61 6e 79 2e 0d  ection, if any..
159a0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
159b0 73 65 74 20 72 65 73 75 6c 74 20 5b 67 65 74 46  set result [getF
159c0 6c 61 67 73 50 72 6f 70 65 72 74 79 20 24 66 6c  lagsProperty $fl
159d0 61 67 73 20 24 71 75 69 65 74 5d 0d 0a 0d 0a 20  ags $quiet].... 
159e0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
159f0 4e 4f 54 45 3a 20 41 64 64 20 74 68 65 20 6e 61  NOTE: Add the na
15a00 6d 65 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  me of the curren
15a10 74 20 74 65 73 74 20 66 69 6c 65 2c 20 69 66 20  t test file, if 
15a20 61 76 61 69 6c 61 62 6c 65 2e 20 20 54 68 69 73  available.  This
15a30 20 69 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20   is..      #    
15a40 20 20 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72     only used for
15a50 20 64 65 62 75 67 67 69 6e 67 2e 0d 0a 20 20 20   debugging...   
15a60 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
15a70 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74  [info exists ::t
15a80 65 73 74 5f 66 69 6c 65 5d 7d 20 74 68 65 6e 20  est_file]} then 
15a90 7b 0d 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e  {..        appen
15aa0 64 20 72 65 73 75 6c 74 20 54 65 73 74 46 69 6c  d result TestFil
15ab0 65 3d 20 24 3a 3a 74 65 73 74 5f 66 69 6c 65 20  e= $::test_file 
15ac0 5c 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  \;..      }.... 
15ad0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
15ae0 4e 4f 54 45 3a 20 41 64 64 20 74 68 65 20 6e 61  NOTE: Add the na
15af0 6d 65 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  me of the curren
15b00 74 20 74 65 73 74 2c 20 69 66 20 61 76 61 69 6c  t test, if avail
15b10 61 62 6c 65 2e 20 20 54 68 69 73 20 69 73 20 6f  able.  This is o
15b20 6e 6c 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20  nly..      #    
15b30 20 20 20 75 73 65 64 20 66 6f 72 20 64 65 62 75     used for debu
15b40 67 67 69 6e 67 2e 0d 0a 20 20 20 20 20 20 23 0d  gging...      #.
15b50 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f  .      if {[info
15b60 20 65 78 69 73 74 73 20 3a 3a 65 61 67 6c 65 5f   exists ::eagle_
15b70 74 65 73 74 73 28 43 75 72 72 65 6e 74 4e 61 6d  tests(CurrentNam
15b80 65 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  e)]} then {..   
15b90 20 20 20 20 20 61 70 70 65 6e 64 20 72 65 73 75       append resu
15ba0 6c 74 20 54 65 73 74 4e 61 6d 65 3d 20 24 3a 3a  lt TestName= $::
15bb0 65 61 67 6c 65 5f 74 65 73 74 73 28 43 75 72 72  eagle_tests(Curr
15bc0 65 6e 74 4e 61 6d 65 29 20 5c 3b 0d 0a 20 20 20  entName) \;..   
15bd0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65     }....      re
15be0 74 75 72 6e 20 24 72 65 73 75 6c 74 0d 0a 20 20  turn $result..  
15bf0 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
15c00 20 65 6e 61 62 6c 65 53 68 61 72 65 64 43 61 63   enableSharedCac
15c10 68 65 20 7b 20 63 68 61 6e 6e 65 6c 20 65 6e 61  he { channel ena
15c20 62 6c 65 20 7b 71 75 69 65 74 20 66 61 6c 73 65  ble {quiet false
15c30 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66 20  } } {..      if 
15c40 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
15c50 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65     object invoke
15c60 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c   -flags +NonPubl
15c70 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ic \..          
15c80 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51    System.Data.SQ
15c90 4c 69 74 65 2e 55 6e 73 61 66 65 4e 61 74 69 76  Lite.UnsafeNativ
15ca0 65 4d 65 74 68 6f 64 73 20 5c 0d 0a 20 20 20 20  eMethods \..    
15cb0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
15cc0 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f 63 61  enable_shared_ca
15cd0 63 68 65 20 5b 65 78 70 72 20 69 6e 74 28 24 65  che [expr int($e
15ce0 6e 61 62 6c 65 29 5d 0d 0a 20 20 20 20 20 20 7d  nable)]..      }
15cf0 20 72 65 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74   result] == 0} t
15d00 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69  hen {..        i
15d10 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
15d20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70   {..          tp
15d30 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
15d40 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
15d50 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
15d60 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f 65 6e 61  call sqlite3_ena
15d70 62 6c 65 5f 73 68 61 72 65 64 5f 63 61 63 68 65  ble_shared_cache
15d80 28 22 20 24 65 6e 61 62 6c 65 20 5c 0d 0a 20 20  (" $enable \..  
15d90 20 20 20 20 20 20 20 20 20 20 20 20 22 29 2e 2e              ")..
15da0 2e 20 6f 6b 3a 20 22 20 24 72 65 73 75 6c 74 20  . ok: " $result 
15db0 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  \n]..        }..
15dc0 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
15dd0 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
15de0 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
15df0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
15e00 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
15e10 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
15e20 20 20 20 22 2d 2d 2d 2d 20 63 61 6c 6c 20 73 71     "---- call sq
15e30 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 73 68 61  lite3_enable_sha
15e40 72 65 64 5f 63 61 63 68 65 28 22 20 24 65 6e 61  red_cache(" $ena
15e50 62 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ble \..         
15e60 20 20 20 20 20 22 29 2e 2e 2e 20 65 72 72 6f 72       ")... error
15e70 3a 20 22 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74  : " \n\t $result
15e80 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d   \n]..        }.
15e90 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
15ea0 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 73 65 74  ....    proc set
15eb0 75 70 44 62 20 7b 0d 0a 20 20 20 20 20 20 20 20  upDb {..        
15ec0 20 20 20 20 66 69 6c 65 4e 61 6d 65 20 7b 6d 6f      fileName {mo
15ed0 64 65 20 22 22 7d 20 7b 64 61 74 65 54 69 6d 65  de ""} {dateTime
15ee0 46 6f 72 6d 61 74 20 22 22 7d 20 7b 64 61 74 65  Format ""} {date
15ef0 54 69 6d 65 4b 69 6e 64 20 22 22 7d 20 7b 66 6c  TimeKind ""} {fl
15f00 61 67 73 20 22 22 7d 0d 0a 20 20 20 20 20 20 20  ags ""}..       
15f10 20 20 20 20 20 7b 65 78 74 72 61 20 22 22 7d 20       {extra ""} 
15f20 7b 71 75 61 6c 69 66 79 20 74 72 75 65 7d 20 7b  {qualify true} {
15f30 64 65 6c 65 74 65 20 74 72 75 65 7d 20 7b 75 72  delete true} {ur
15f40 69 20 66 61 6c 73 65 7d 0d 0a 20 20 20 20 20 20  i false}..      
15f50 20 20 20 20 20 20 7b 74 65 6d 70 6f 72 61 72 79        {temporary
15f60 20 74 72 75 65 7d 20 7b 76 61 72 4e 61 6d 65 20   true} {varName 
15f70 64 62 7d 20 7b 71 75 69 65 74 20 66 61 6c 73 65  db} {quiet false
15f80 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a  } } {..      #..
15f90 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69        # NOTE: Fi
15fa0 72 73 74 2c 20 73 65 65 20 69 66 20 6f 75 72 20  rst, see if our 
15fb0 63 61 6c 6c 65 72 20 68 61 73 20 72 65 71 75 65  caller has reque
15fc0 73 74 65 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  sted an in-memor
15fd0 79 20 64 61 74 61 62 61 73 65 2e 0d 0a 20 20 20  y database...   
15fe0 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20     #..      set 
15ff0 69 73 4d 65 6d 6f 72 79 20 5b 69 73 4d 65 6d 6f  isMemory [isMemo
16000 72 79 44 62 20 24 66 69 6c 65 4e 61 6d 65 5d 0d  ryDb $fileName].
16010 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
16020 20 20 23 20 4e 4f 54 45 3a 20 46 6f 72 20 6e 6f    # NOTE: For no
16030 77 2c 20 61 6c 6c 20 74 65 73 74 20 64 61 74 61  w, all test data
16040 62 61 73 65 73 20 75 73 65 64 20 62 79 20 74 68  bases used by th
16050 65 20 74 65 73 74 20 73 75 69 74 65 20 61 72 65  e test suite are
16060 20 70 6c 61 63 65 64 0d 0a 20 20 20 20 20 20 23   placed..      #
16070 20 20 20 20 20 20 20 69 6e 74 6f 20 74 68 65 20         into the 
16080 64 61 74 61 62 61 73 65 20 64 69 72 65 63 74 6f  database directo
16090 72 79 2e 20 20 45 61 63 68 20 64 61 74 61 62 61  ry.  Each databa
160a0 73 65 20 61 6e 64 20 72 65 6c 61 74 65 64 20 66  se and related f
160b0 69 6c 65 73 0d 0a 20 20 20 20 20 20 23 20 20 20  iles..      #   
160c0 20 20 20 20 75 73 65 64 20 62 79 20 61 20 74 65      used by a te
160d0 73 74 20 73 68 6f 75 6c 64 20 62 65 20 63 6c 65  st should be cle
160e0 61 6e 65 64 20 75 70 20 62 79 20 74 68 61 74 20  aned up by that 
160f0 74 65 73 74 20 75 73 69 6e 67 20 74 68 65 0d 0a  test using the..
16100 20 20 20 20 20 20 23 20 20 20 20 20 20 20 22 63        #       "c
16110 6c 65 61 6e 75 70 44 62 22 20 70 72 6f 63 65 64  leanupDb" proced
16120 75 72 65 2c 20 62 65 6c 6f 77 2e 0d 0a 20 20 20  ure, below...   
16130 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
16140 21 24 69 73 4d 65 6d 6f 72 79 20 26 26 20 24 71  !$isMemory && $q
16150 75 61 6c 69 66 79 7d 20 74 68 65 6e 20 7b 0d 0a  ualify} then {..
16160 20 20 20 20 20 20 20 20 73 65 74 20 66 69 6c 65          set file
16170 4e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20  Name [file join 
16180 5b 67 65 74 44 61 74 61 62 61 73 65 44 69 72 65  [getDatabaseDire
16190 63 74 6f 72 79 5d 20 5b 66 69 6c 65 20 74 61 69  ctory] [file tai
161a0 6c 20 24 66 69 6c 65 4e 61 6d 65 5d 5d 0d 0a 20  l $fileName]].. 
161b0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
161c0 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
161d0 20 42 79 20 64 65 66 61 75 6c 74 2c 20 64 65 6c   By default, del
161e0 65 74 65 20 61 6e 79 20 70 72 65 2d 65 78 69 73  ete any pre-exis
161f0 74 69 6e 67 20 64 61 74 61 62 61 73 65 20 77 69  ting database wi
16200 74 68 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65  th the same file
16210 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
16220 6e 61 6d 65 20 69 66 20 69 74 20 63 75 72 72 65  name if it curre
16230 6e 74 6c 79 20 65 78 69 73 74 73 2e 0d 0a 20 20  ntly exists...  
16240 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
16250 7b 21 24 69 73 4d 65 6d 6f 72 79 20 26 26 20 24  {!$isMemory && $
16260 64 65 6c 65 74 65 20 26 26 20 5b 66 69 6c 65 20  delete && [file 
16270 65 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65  exists $fileName
16280 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
16290 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
162a0 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f  NOTE: Attempt to
162b0 20 64 65 6c 65 74 65 20 61 6e 79 20 70 72 65 2d   delete any pre-
162c0 65 78 69 73 74 69 6e 67 20 64 61 74 61 62 61 73  existing databas
162d0 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  e with the same 
162e0 66 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 23 20  file..        # 
162f0 20 20 20 20 20 20 6e 61 6d 65 2e 0d 0a 20 20 20        name...   
16300 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
16310 69 66 20 7b 5b 63 61 74 63 68 20 7b 66 69 6c 65  if {[catch {file
16320 20 64 65 6c 65 74 65 20 24 66 69 6c 65 4e 61 6d   delete $fileNam
16330 65 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20  e} error]} then 
16340 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  {..          #..
16350 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
16360 3a 20 57 65 20 73 6f 6d 65 68 6f 77 20 66 61 69  : We somehow fai
16370 6c 65 64 20 74 6f 20 64 65 6c 65 74 65 20 74 68  led to delete th
16380 65 20 66 69 6c 65 2c 20 72 65 70 6f 72 74 20 77  e file, report w
16390 68 79 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  hy...          #
163a0 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
163b0 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
163c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
163d0 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
163e0 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
163f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
16400 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a    "==== WARNING:
16410 20 66 61 69 6c 65 64 20 74 6f 20 64 65 6c 65 74   failed to delet
16420 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
16430 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c 0d  \"" $fileName \.
16440 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16450 20 22 5c 22 20 64 75 72 69 6e 67 20 73 65 74 75   "\" during setu
16460 70 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74  p, error: " \n\t
16470 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20   $error \n]..   
16480 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
16490 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a    }..      }....
164a0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
164b0 20 4e 4f 54 45 3a 20 52 65 66 65 72 20 74 6f 20   NOTE: Refer to 
164c0 74 68 65 20 73 70 65 63 69 66 69 65 64 20 76 61  the specified va
164d0 72 69 61 62 6c 65 20 28 65 2e 67 2e 20 22 64 62  riable (e.g. "db
164e0 22 29 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 78  ") in the contex
164f0 74 20 6f 66 20 6f 75 72 0d 0a 20 20 20 20 20 20  t of our..      
16500 23 20 20 20 20 20 20 20 63 61 6c 6c 65 72 2e 20  #       caller. 
16510 20 54 68 65 20 68 61 6e 64 6c 65 20 74 6f 20 74   The handle to t
16520 68 65 20 6f 70 65 6e 65 64 20 64 61 74 61 62 61  he opened databa
16530 73 65 20 77 69 6c 6c 20 62 65 20 73 74 6f 72 65  se will be store
16540 64 20 74 68 65 72 65 2e 0d 0a 20 20 20 20 20 20  d there...      
16550 23 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20 31  #..      upvar 1
16560 20 24 76 61 72 4e 61 6d 65 20 64 62 0d 0a 0d 0a   $varName db....
16570 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
16580 20 4e 4f 54 45 3a 20 53 74 61 72 74 20 62 75 69   NOTE: Start bui
16590 6c 64 69 6e 67 20 74 68 65 20 63 6f 6e 6e 65 63  lding the connec
165a0 74 69 6f 6e 20 73 74 72 69 6e 67 2e 20 20 54 68  tion string.  Th
165b0 65 20 6f 6e 6c 79 20 72 65 71 75 69 72 65 64 20  e only required 
165c0 70 6f 72 74 69 6f 6e 0d 0a 20 20 20 20 20 20 23  portion..      #
165d0 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f         of the co
165e0 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e 67 20  nnection string 
165f0 69 73 20 74 68 65 20 64 61 74 61 20 73 6f 75 72  is the data sour
16600 63 65 2c 20 77 68 69 63 68 20 63 6f 6e 74 61 69  ce, which contai
16610 6e 73 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20  ns the..      # 
16620 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 66        database f
16630 69 6c 65 20 6e 61 6d 65 20 69 74 73 65 6c 66 2e  ile name itself.
16640 20 20 49 66 20 6f 75 72 20 63 61 6c 6c 65 72 20    If our caller 
16650 77 61 6e 74 73 20 74 6f 20 75 73 65 20 61 20 55  wants to use a U
16660 52 49 20 61 73 0d 0a 20 20 20 20 20 20 23 20 20  RI as..      #  
16670 20 20 20 20 20 74 68 65 20 64 61 74 61 20 73 6f       the data so
16680 75 72 63 65 2c 20 75 73 65 20 74 68 65 20 46 75  urce, use the Fu
16690 6c 6c 55 72 69 20 63 6f 6e 6e 65 63 74 69 6f 6e  llUri connection
166a0 20 73 74 72 69 6e 67 20 70 72 6f 70 65 72 74 79   string property
166b0 20 74 6f 0d 0a 20 20 20 20 20 20 23 20 20 20 20   to..      #    
166c0 20 20 20 70 72 65 76 65 6e 74 20 74 68 65 20 64     prevent the d
166d0 61 74 61 20 73 6f 75 72 63 65 20 73 74 72 69 6e  ata source strin
166e0 67 20 66 72 6f 6d 20 62 65 69 6e 67 20 6d 61 6e  g from being man
166f0 67 6c 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  gled...      #..
16700 20 20 20 20 20 20 69 66 20 7b 24 75 72 69 7d 20        if {$uri} 
16710 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
16720 73 65 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b  set connection {
16730 46 75 6c 6c 55 72 69 3d 24 7b 66 69 6c 65 4e 61  FullUri=${fileNa
16740 6d 65 7d 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c  me}}..      } el
16750 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65  se {..        se
16760 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 44 61  t connection {Da
16770 74 61 20 53 6f 75 72 63 65 3d 24 7b 66 69 6c 65  ta Source=${file
16780 4e 61 6d 65 7d 7d 0d 0a 20 20 20 20 20 20 7d 0d  Name}}..      }.
16790 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
167a0 20 20 23 20 4e 4f 54 45 3a 20 53 69 6e 63 65 20    # NOTE: Since 
167b0 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 68  this procedure h
167c0 61 73 20 6e 6f 20 73 70 65 63 69 61 6c 20 6b 6e  as no special kn
167d0 6f 77 6c 65 64 67 65 20 6f 66 20 77 68 61 74 20  owledge of what 
167e0 74 68 65 20 64 65 66 61 75 6c 74 0d 0a 20 20 20  the default..   
167f0 20 20 20 23 20 20 20 20 20 20 20 73 65 74 74 69     #       setti
16800 6e 67 20 69 73 20 66 6f 72 20 74 68 65 20 54 6f  ng is for the To
16810 46 75 6c 6c 50 61 74 68 20 63 6f 6e 6e 65 63 74  FullPath connect
16820 69 6f 6e 20 73 74 72 69 6e 67 20 70 72 6f 70 65  ion string prope
16830 72 79 2c 20 61 6c 77 61 79 73 0d 0a 20 20 20 20  ry, always..    
16840 20 20 23 20 20 20 20 20 20 20 61 64 64 20 74 68    #       add th
16850 65 20 76 61 6c 75 65 20 77 65 20 6b 6e 6f 77 20  e value we know 
16860 61 62 6f 75 74 20 74 6f 20 74 68 65 20 63 6f 6e  about to the con
16870 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e 67 2e 0d  nection string..
16880 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
16890 61 70 70 65 6e 64 20 63 6f 6e 6e 65 63 74 69 6f  append connectio
168a0 6e 20 7b 3b 54 6f 46 75 6c 6c 50 61 74 68 3d 24  n {;ToFullPath=$
168b0 7b 71 75 61 6c 69 66 79 7d 7d 0d 0a 0d 0a 20 20  {qualify}}....  
168c0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
168d0 4f 54 45 3a 20 49 66 20 6f 75 72 20 63 61 6c 6c  OTE: If our call
168e0 65 72 20 73 70 65 63 69 66 69 65 64 20 61 20 6a  er specified a j
168f0 6f 75 72 6e 61 6c 20 6d 6f 64 65 2c 20 61 64 64  ournal mode, add
16900 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 70   the necessary p
16910 6f 72 74 69 6f 6e 0d 0a 20 20 20 20 20 20 23 20  ortion..      # 
16920 20 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6e        of the con
16930 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e 67 20 6e  nection string n
16940 6f 77 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ow...      #..  
16950 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
16960 6c 65 6e 67 74 68 20 24 6d 6f 64 65 5d 20 3e 20  length $mode] > 
16970 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
16980 20 20 20 61 70 70 65 6e 64 20 63 6f 6e 6e 65 63     append connec
16990 74 69 6f 6e 20 7b 3b 4a 6f 75 72 6e 61 6c 20 4d  tion {;Journal M
169a0 6f 64 65 3d 24 7b 6d 6f 64 65 7d 7d 0d 0a 20 20  ode=${mode}}..  
169b0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
169c0 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
169d0 49 66 20 6f 75 72 20 63 61 6c 6c 65 72 20 73 70  If our caller sp
169e0 65 63 69 66 69 65 64 20 61 20 44 61 74 65 54 69  ecified a DateTi
169f0 6d 65 20 66 6f 72 6d 61 74 2c 20 61 64 64 20 74  me format, add t
16a00 68 65 20 6e 65 63 65 73 73 61 72 79 0d 0a 20 20  he necessary..  
16a10 20 20 20 20 23 20 20 20 20 20 20 20 70 6f 72 74      #       port
16a20 69 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65  ion of the conne
16a30 63 74 69 6f 6e 20 73 74 72 69 6e 67 20 6e 6f 77  ction string now
16a40 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
16a50 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
16a60 6e 67 74 68 20 24 64 61 74 65 54 69 6d 65 46 6f  ngth $dateTimeFo
16a70 72 6d 61 74 5d 20 3e 20 30 7d 20 74 68 65 6e 20  rmat] > 0} then 
16a80 7b 0d 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e  {..        appen
16a90 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 3b 44  d connection {;D
16aa0 61 74 65 54 69 6d 65 46 6f 72 6d 61 74 3d 24 7b  ateTimeFormat=${
16ab0 64 61 74 65 54 69 6d 65 46 6f 72 6d 61 74 7d 7d  dateTimeFormat}}
16ac0 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
16ad0 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
16ae0 54 45 3a 20 49 66 20 6f 75 72 20 63 61 6c 6c 65  TE: If our calle
16af0 72 20 73 70 65 63 69 66 69 65 64 20 61 20 44 61  r specified a Da
16b00 74 65 54 69 6d 65 4b 69 6e 64 2c 20 61 64 64 20  teTimeKind, add 
16b10 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 70 6f  the necessary po
16b20 72 74 69 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20  rtion..      #  
16b30 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6e 6e       of the conn
16b40 65 63 74 69 6f 6e 20 73 74 72 69 6e 67 20 6e 6f  ection string no
16b50 77 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  w...      #..   
16b60 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
16b70 65 6e 67 74 68 20 24 64 61 74 65 54 69 6d 65 4b  ength $dateTimeK
16b80 69 6e 64 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ind] > 0} then {
16b90 0d 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64  ..        append
16ba0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 3b 44 61   connection {;Da
16bb0 74 65 54 69 6d 65 4b 69 6e 64 3d 24 7b 64 61 74  teTimeKind=${dat
16bc0 65 54 69 6d 65 4b 69 6e 64 7d 7d 0d 0a 20 20 20  eTimeKind}}..   
16bd0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
16be0 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46  .      # NOTE: F
16bf0 69 67 75 72 65 20 6f 75 74 20 77 68 61 74 20 74  igure out what t
16c00 68 65 20 66 69 6e 61 6c 20 66 6c 61 67 73 20 66  he final flags f
16c10 6f 72 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69  or this connecti
16c20 6f 6e 20 6e 65 65 64 20 74 6f 20 62 65 2e 0d 0a  on need to be...
16c30 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73        #..      s
16c40 65 74 20 66 6c 61 67 73 20 5b 67 65 74 43 6f 6e  et flags [getCon
16c50 6e 65 63 74 69 6f 6e 46 6c 61 67 73 20 24 66 69  nectionFlags $fi
16c60 6c 65 4e 61 6d 65 20 24 66 6c 61 67 73 20 24 71  leName $flags $q
16c70 75 69 65 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 23  uiet]....      #
16c80 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
16c90 49 66 20 6f 75 72 20 63 61 6c 6c 65 72 20 73 70  If our caller sp
16ca0 65 63 69 66 69 65 64 20 73 6f 6d 65 20 53 51 4c  ecified some SQL
16cb0 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 46 6c 61  iteConnectionFla
16cc0 67 73 2c 20 61 64 64 20 74 68 65 0d 0a 20 20 20  gs, add the..   
16cd0 20 20 20 23 20 20 20 20 20 20 20 6e 65 63 65 73     #       neces
16ce0 73 61 72 79 20 70 6f 72 74 69 6f 6e 20 6f 66 20  sary portion of 
16cf0 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73  the connection s
16d00 74 72 69 6e 67 20 6e 6f 77 2e 0d 0a 20 20 20 20  tring now...    
16d10 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
16d20 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 66  string length $f
16d30 6c 61 67 73 5d 20 3e 20 30 7d 20 74 68 65 6e 20  lags] > 0} then 
16d40 7b 0d 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e  {..        appen
16d50 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 3b 46  d connection {;F
16d60 6c 61 67 73 3d 24 7b 66 6c 61 67 73 7d 7d 0d 0a  lags=${flags}}..
16d70 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
16d80 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
16d90 3a 20 49 66 20 6f 75 72 20 63 61 6c 6c 65 72 20  : If our caller 
16da0 73 70 65 63 69 66 69 65 64 20 61 6e 20 65 78 74  specified an ext
16db0 72 61 20 70 61 79 6c 6f 61 64 20 74 6f 20 74 68  ra payload to th
16dc0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0d 0a 20 20  e connection..  
16dd0 20 20 20 20 23 20 20 20 20 20 20 20 73 74 72 69      #       stri
16de0 6e 67 2c 20 61 70 70 65 6e 64 20 69 74 20 6e 6f  ng, append it no
16df0 77 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  w...      #..   
16e00 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
16e10 65 6e 67 74 68 20 24 65 78 74 72 61 5d 20 3e 20  ength $extra] > 
16e20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
16e30 20 20 20 61 70 70 65 6e 64 20 63 6f 6e 6e 65 63     append connec
16e40 74 69 6f 6e 20 5c 3b 20 24 65 78 74 72 61 0d 0a  tion \; $extra..
16e50 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
16e60 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
16e70 3a 20 41 64 64 20 74 68 65 20 6e 61 6d 65 20 6f  : Add the name o
16e80 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 65  f the current te
16e90 73 74 20 66 69 6c 65 2c 20 69 66 20 61 76 61 69  st file, if avai
16ea0 6c 61 62 6c 65 2e 20 20 54 68 69 73 20 69 73 0d  lable.  This is.
16eb0 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6f  .      #       o
16ec0 6e 6c 79 20 75 73 65 64 20 66 6f 72 20 64 65 62  nly used for deb
16ed0 75 67 67 69 6e 67 2e 0d 0a 20 20 20 20 20 20 23  ugging...      #
16ee0 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66  ..      if {[inf
16ef0 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 73 74 5f  o exists ::test_
16f00 66 69 6c 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  file]} then {.. 
16f10 20 20 20 20 20 20 20 61 70 70 65 6e 64 20 63 6f         append co
16f20 6e 6e 65 63 74 69 6f 6e 20 7b 3b 54 65 73 74 46  nnection {;TestF
16f30 69 6c 65 3d 24 7b 3a 3a 74 65 73 74 5f 66 69 6c  ile=${::test_fil
16f40 65 7d 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  e}}..      }....
16f50 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
16f60 20 4e 4f 54 45 3a 20 41 64 64 20 74 68 65 20 6e   NOTE: Add the n
16f70 61 6d 65 20 6f 66 20 74 68 65 20 63 75 72 72 65  ame of the curre
16f80 6e 74 20 74 65 73 74 2c 20 69 66 20 61 76 61 69  nt test, if avai
16f90 6c 61 62 6c 65 2e 20 20 54 68 69 73 20 69 73 20  lable.  This is 
16fa0 6f 6e 6c 79 0d 0a 20 20 20 20 20 20 23 20 20 20  only..      #   
16fb0 20 20 20 20 75 73 65 64 20 66 6f 72 20 64 65 62      used for deb
16fc0 75 67 67 69 6e 67 2e 0d 0a 20 20 20 20 20 20 23  ugging...      #
16fd0 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66  ..      if {[inf
16fe0 6f 20 65 78 69 73 74 73 20 3a 3a 65 61 67 6c 65  o exists ::eagle
16ff0 5f 74 65 73 74 73 28 43 75 72 72 65 6e 74 4e 61  _tests(CurrentNa
17000 6d 65 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  me)]} then {..  
17010 20 20 20 20 20 20 61 70 70 65 6e 64 20 63 6f 6e        append con
17020 6e 65 63 74 69 6f 6e 20 7b 3b 54 65 73 74 4e 61  nection {;TestNa
17030 6d 65 3d 24 7b 3a 3a 65 61 67 6c 65 5f 74 65 73  me=${::eagle_tes
17040 74 73 28 43 75 72 72 65 6e 74 4e 61 6d 65 29 7d  ts(CurrentName)}
17050 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  }..      }....  
17060 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
17070 4f 54 45 3a 20 46 6f 72 20 63 6c 61 72 69 74 79  OTE: For clarity
17080 2c 20 61 70 70 65 6e 64 20 61 20 66 69 6e 61 6c  , append a final
17090 20 73 65 6d 69 63 6f 6c 6f 6e 20 74 6f 20 74 68   semicolon to th
170a0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72  e connection str
170b0 69 6e 67 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ing...      #.. 
170c0 20 20 20 20 20 61 70 70 65 6e 64 20 63 6f 6e 6e       append conn
170d0 65 63 74 69 6f 6e 20 5c 3b 0d 0a 0d 0a 20 20 20  ection \;....   
170e0 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
170f0 54 45 3a 20 4f 70 65 6e 20 74 68 65 20 64 61 74  TE: Open the dat
17100 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
17110 20 6e 6f 77 2c 20 70 6c 61 63 69 6e 67 20 74 68   now, placing th
17120 65 20 6f 70 61 71 75 65 20 68 61 6e 64 6c 65 20  e opaque handle 
17130 76 61 6c 75 65 0d 0a 20 20 20 20 20 20 23 20 20  value..      #  
17140 20 20 20 20 20 69 6e 74 6f 20 74 68 65 20 76 61       into the va
17150 72 69 61 62 6c 65 20 73 70 65 63 69 66 69 65 64  riable specified
17160 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 2e 0d   by our caller..
17170 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
17180 73 65 74 20 64 62 20 5b 73 71 6c 20 6f 70 65 6e  set db [sql open
17190 20 2d 74 79 70 65 20 53 51 4c 69 74 65 20 5b 73   -type SQLite [s
171a0 75 62 73 74 20 24 63 6f 6e 6e 65 63 74 69 6f 6e  ubst $connection
171b0 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ]]....      #.. 
171c0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 6f 6e       # NOTE: Con
171d0 66 69 67 75 72 65 20 74 68 65 20 74 65 6d 70 6f  figure the tempo
171e0 72 61 72 79 20 64 69 72 65 63 74 6f 72 79 20 66  rary directory f
171f0 6f 72 20 74 68 65 20 6e 65 77 6c 79 20 6f 70 65  or the newly ope
17200 6e 65 64 20 64 61 74 61 62 61 73 65 0d 0a 20 20  ned database..  
17210 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e 6e      #       conn
17220 65 63 74 69 6f 6e 20 6e 6f 77 20 75 6e 6c 65 73  ection now unles
17230 73 20 6f 75 72 20 63 61 6c 6c 65 72 20 66 6f 72  s our caller for
17240 62 69 64 73 20 69 74 2e 0d 0a 20 20 20 20 20 20  bids it...      
17250 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 74 65  #..      if {$te
17260 6d 70 6f 72 61 72 79 20 26 26 20 21 5b 69 6e 66  mporary && ![inf
17270 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 73 65  o exists ::no(se
17280 74 54 65 6d 70 6f 72 61 72 79 44 69 72 65 63 74  tTemporaryDirect
17290 6f 72 79 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  ory)]} then {.. 
172a0 20 20 20 20 20 20 20 73 71 6c 20 65 78 65 63 75         sql execu
172b0 74 65 20 24 64 62 20 5b 61 70 70 65 6e 64 41 72  te $db [appendAr
172c0 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
172d0 20 20 22 50 52 41 47 4d 41 20 74 65 6d 70 5f 73    "PRAGMA temp_s
172e0 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 20 3d  tore_directory =
172f0 20 5c 22 22 20 5b 67 65 74 54 65 6d 70 6f 72 61   \"" [getTempora
17300 72 79 44 69 72 65 63 74 6f 72 79 5d 20 5c 22 5c  ryDirectory] \"\
17310 3b 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ;]..      }.... 
17320 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
17330 4e 4f 54 45 3a 20 50 65 72 66 6f 72 6d 20 61 6e  NOTE: Perform an
17340 79 20 65 78 74 72 61 20 70 65 72 2d 63 6f 6e 6e  y extra per-conn
17350 65 63 74 69 6f 6e 20 73 65 74 75 70 20 66 6f 72  ection setup for
17360 20 74 68 65 20 6e 65 77 6c 79 20 6f 70 65 6e 65   the newly opene
17370 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  d..      #      
17380 20 64 61 74 61 62 61 73 65 20 6e 6f 77 20 75 6e   database now un
17390 6c 65 73 73 20 6f 75 72 20 63 61 6c 6c 65 72 20  less our caller 
173a0 66 6f 72 62 69 64 73 20 69 74 2e 0d 0a 20 20 20  forbids it...   
173b0 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20     #..      set 
173c0 65 78 65 63 75 74 65 4f 6e 53 65 74 75 70 20 5b  executeOnSetup [
173d0 67 65 74 45 78 65 63 75 74 65 4f 6e 53 65 74 75  getExecuteOnSetu
173e0 70 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b  p]....      if {
173f0 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
17400 65 78 65 63 75 74 65 4f 6e 53 65 74 75 70 5d 20  executeOnSetup] 
17410 3e 20 30 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  > 0 && \..      
17420 20 20 20 20 21 5b 69 6e 66 6f 20 65 78 69 73 74      ![info exist
17430 73 20 3a 3a 6e 6f 28 65 78 65 63 75 74 65 4f 6e  s ::no(executeOn
17440 53 65 74 75 70 29 5d 7d 20 74 68 65 6e 20 7b 0d  Setup)]} then {.
17450 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
17460 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73      # NOTE: This
17470 20 63 6f 6d 6d 61 6e 64 20 6d 61 79 20 72 61 69   command may rai
17480 73 65 20 61 6e 20 65 72 72 6f 72 3b 20 69 66 20  se an error; if 
17490 73 6f 2c 20 74 68 61 74 20 69 73 20 66 69 6e 65  so, that is fine
174a0 2c 20 61 73 0d 0a 20 20 20 20 20 20 20 20 23 20  , as..        # 
174b0 20 20 20 20 20 20 74 68 65 20 65 6e 63 6c 6f 73        the enclos
174c0 69 6e 67 20 74 65 73 74 20 77 69 6c 6c 20 74 68  ing test will th
174d0 65 6e 20 66 61 69 6c 2e 20 20 54 68 65 20 5b 73  en fail.  The [s
174e0 75 62 73 74 5d 20 63 6f 6d 6d 61 6e 64 20 69 73  ubst] command is
174f0 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
17500 20 20 75 73 65 64 20 6f 6e 20 74 68 65 20 53 51    used on the SQ
17510 4c 20 69 6e 20 63 61 73 65 20 69 74 20 6e 65 65  L in case it nee
17520 64 73 20 74 6f 20 72 65 66 65 72 20 74 6f 20 73  ds to refer to s
17530 74 61 74 65 20 69 6e 20 6f 75 72 0d 0a 20 20 20  tate in our..   
17540 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e       #       con
17550 74 65 78 74 2e 0d 0a 20 20 20 20 20 20 20 20 23  text...        #
17560 0d 0a 20 20 20 20 20 20 20 20 73 71 6c 20 65 78  ..        sql ex
17570 65 63 75 74 65 20 24 64 62 20 5b 73 75 62 73 74  ecute $db [subst
17580 20 24 65 78 65 63 75 74 65 4f 6e 53 65 74 75 70   $executeOnSetup
17590 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  ]..      }....  
175a0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
175b0 4f 54 45 3a 20 41 6c 77 61 79 73 20 72 65 74 75  OTE: Always retu
175c0 72 6e 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  rn the connectio
175d0 6e 20 68 61 6e 64 6c 65 20 75 70 6f 6e 20 73 75  n handle upon su
175e0 63 63 65 73 73 2e 0d 0a 20 20 20 20 20 20 23 0d  ccess...      #.
175f0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 64  .      return $d
17600 62 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  b..    }.....   
17610 20 70 72 6f 63 20 67 65 74 44 62 43 6f 6e 6e 65   proc getDbConne
17620 63 74 69 6f 6e 20 7b 20 7b 76 61 72 4e 61 6d 65  ction { {varName
17630 20 64 62 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20   db} } {..      
17640 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
17650 20 52 65 66 65 72 20 74 6f 20 74 68 65 20 73 70   Refer to the sp
17660 65 63 69 66 69 65 64 20 76 61 72 69 61 62 6c 65  ecified variable
17670 20 28 65 2e 67 2e 20 22 64 62 22 29 20 69 6e 20   (e.g. "db") in 
17680 74 68 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f  the context of o
17690 75 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ur..      #     
176a0 20 20 63 61 6c 6c 65 72 2e 20 20 54 68 65 20 68    caller.  The h
176b0 61 6e 64 6c 65 20 74 6f 20 74 68 65 20 64 61 74  andle to the dat
176c0 61 62 61 73 65 20 70 72 65 76 69 6f 75 73 6c 79  abase previously
176d0 20 6f 70 65 6e 65 64 20 76 69 61 20 74 68 65 0d   opened via the.
176e0 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 5b  .      #       [
176f0 73 65 74 75 70 44 62 5d 20 70 72 6f 63 65 64 75  setupDb] procedu
17700 72 65 20 73 68 6f 75 6c 64 20 62 65 20 73 74 6f  re should be sto
17710 72 65 64 20 74 68 65 72 65 2e 0d 0a 20 20 20 20  red there...    
17720 20 20 23 0d 0a 20 20 20 20 20 20 75 70 76 61 72    #..      upvar
17730 20 31 20 24 76 61 72 4e 61 6d 65 20 64 62 0d 0a   1 $varName db..
17740 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
17750 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 72 65   # NOTE: This re
17760 74 75 72 6e 73 20 74 68 65 20 41 44 4f 2e 4e 45  turns the ADO.NE
17770 54 20 49 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 20  T IDbConnection 
17780 6f 62 6a 65 63 74 20 69 6e 73 74 61 6e 63 65 20  object instance 
17790 66 6f 72 20 74 68 65 0d 0a 20 20 20 20 20 20 23  for the..      #
177a0 20 20 20 20 20 20 20 73 70 65 63 69 66 69 65 64         specified
177b0 20 64 61 74 61 62 73 65 20 68 61 6e 64 6c 65 2e   databse handle.
177c0 20 20 53 69 6e 63 65 20 67 65 74 74 69 6e 67 20    Since getting 
177d0 74 68 69 73 20 6f 62 6a 65 63 74 20 72 65 6c 69  this object reli
177e0 65 73 20 75 70 6f 6e 0d 0a 20 20 20 20 20 20 23  es upon..      #
177f0 20 20 20 20 20 20 20 45 61 67 6c 65 20 69 6e 74         Eagle int
17800 65 72 6e 61 6c 73 2c 20 67 72 65 61 74 20 63 61  ernals, great ca
17810 72 65 20 73 68 6f 75 6c 64 20 62 65 20 74 61 6b  re should be tak
17820 65 6e 20 74 6f 20 61 76 6f 69 64 20 64 69 73 70  en to avoid disp
17830 6f 73 69 6e 67 20 6f 66 0d 0a 20 20 20 20 20 20  osing of..      
17840 23 20 20 20 20 20 20 20 74 68 69 73 20 6f 62 6a  #       this obj
17850 65 63 74 20 6f 72 20 6f 74 68 65 72 77 69 73 65  ect or otherwise
17860 20 70 75 74 74 69 6e 67 20 69 74 20 69 6e 74 6f   putting it into
17870 20 61 6e 20 69 6e 76 61 6c 69 64 20 73 74 61 74   an invalid stat
17880 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  e...      #..   
17890 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69     if {[info exi
178a0 73 74 73 20 64 62 5d 7d 20 74 68 65 6e 20 7b 0d  sts db]} then {.
178b0 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61  .        if {[ca
178c0 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
178d0 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d   object invoke -
178e0 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63  flags +NonPublic
178f0 20 2d 6f 62 6a 65 63 74 66 6c 61 67 73 20 2b 4e   -objectflags +N
17900 6f 44 69 73 70 6f 73 65 20 2d 61 6c 69 61 73 20  oDispose -alias 
17910 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
17920 20 49 6e 74 65 72 70 72 65 74 65 72 2e 47 65 74   Interpreter.Get
17930 41 63 74 69 76 65 2e 63 6f 6e 6e 65 63 74 69 6f  Active.connectio
17940 6e 73 20 49 74 65 6d 20 24 64 62 0d 0a 20 20 20  ns Item $db..   
17950 20 20 20 20 20 7d 20 72 65 73 75 6c 74 5d 20 3d       } result] =
17960 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
17970 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
17980 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 75 63 63      # NOTE: Succ
17990 65 73 73 2c 20 72 65 74 75 72 6e 20 74 68 65 20  ess, return the 
179a0 6f 70 61 71 75 65 20 6f 62 6a 65 63 74 20 68 61  opaque object ha
179b0 6e 64 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 20  ndle...         
179c0 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65   #..          re
179d0 74 75 72 6e 20 24 72 65 73 75 6c 74 0d 0a 20 20  turn $result..  
179e0 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
179f0 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
17a00 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46         # NOTE: F
17a10 61 69 6c 75 72 65 2c 20 72 65 70 6f 72 74 20 77  ailure, report w
17a20 68 79 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  hy...          #
17a30 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74  ..          tput
17a40 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
17a50 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
17a60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
17a70 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61  ==== WARNING: fa
17a80 69 6c 65 64 20 74 6f 20 67 65 74 20 63 6f 6e 6e  iled to get conn
17a90 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20 66 6f  ection handle fo
17aa0 72 20 64 61 74 61 62 61 73 65 20 5c 22 22 20 5c  r database \"" \
17ab0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
17ac0 24 64 62 20 22 5c 22 2c 20 65 72 72 6f 72 3a 20  $db "\", error: 
17ad0 22 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c  " \n\t $result \
17ae0 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  n]..        }.. 
17af0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
17b00 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
17b10 20 46 61 69 6c 75 72 65 2c 20 72 65 74 75 72 6e   Failure, return
17b20 20 61 6e 20 6f 62 76 69 6f 75 73 6c 79 20 69 6e   an obviously in
17b30 76 61 6c 69 64 20 6f 70 61 71 75 65 20 6f 62 6a  valid opaque obj
17b40 65 63 74 20 68 61 6e 64 6c 65 2e 0d 0a 20 20 20  ect handle...   
17b50 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75     #..      retu
17b60 72 6e 20 22 22 0d 0a 20 20 20 20 7d 0d 0a 0c 0d  rn ""..    }....
17b70 0a 20 20 20 20 70 72 6f 63 20 66 72 65 65 44 62  .    proc freeDb
17b80 43 6f 6e 6e 65 63 74 69 6f 6e 20 7b 20 7b 76 61  Connection { {va
17b90 72 4e 61 6d 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  rName connection
17ba0 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a  } } {..      #..
17bb0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65        # NOTE: Re
17bc0 66 65 72 20 74 6f 20 74 68 65 20 73 70 65 63 69  fer to the speci
17bd0 66 69 65 64 20 76 61 72 69 61 62 6c 65 20 28 65  fied variable (e
17be0 2e 67 2e 20 22 63 6f 6e 6e 65 63 74 69 6f 6e 22  .g. "connection"
17bf0 29 20 69 6e 20 74 68 65 0d 0a 20 20 20 20 20 20  ) in the..      
17c00 23 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74 20  #       context 
17c10 6f 66 20 6f 75 72 20 63 61 6c 6c 65 72 2e 20 20  of our caller.  
17c20 54 68 65 20 6f 70 61 71 75 65 20 6f 62 6a 65 63  The opaque objec
17c30 74 20 68 61 6e 64 6c 65 20 66 6f 72 20 61 6e 20  t handle for an 
17c40 41 44 4f 2e 4e 45 54 0d 0a 20 20 20 20 20 20 23  ADO.NET..      #
17c50 20 20 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f         connectio
17c60 6e 20 70 72 65 76 69 6f 75 73 6c 79 20 72 65 74  n previously ret
17c70 75 72 6e 65 64 20 62 79 20 5b 67 65 74 44 62 43  urned by [getDbC
17c80 6f 6e 6e 65 63 74 69 6f 6e 5d 20 73 68 6f 75 6c  onnection] shoul
17c90 64 20 62 65 0d 0a 20 20 20 20 20 20 23 20 20 20  d be..      #   
17ca0 20 20 20 20 73 74 6f 72 65 64 20 74 68 65 72 65      stored there
17cb0 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
17cc0 20 20 75 70 76 61 72 20 31 20 24 76 61 72 4e 61    upvar 1 $varNa
17cd0 6d 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0d 0a 0d  me connection...
17ce0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
17cf0 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20  # NOTE: Attempt 
17d00 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 6f 70  to remove the op
17d10 61 71 75 65 20 6f 62 6a 65 63 74 20 68 61 6e 64  aque object hand
17d20 6c 65 20 66 72 6f 6d 20 74 68 65 20 69 6e 74 65  le from the inte
17d30 72 70 72 65 74 65 72 0d 0a 20 20 20 20 20 20 23  rpreter..      #
17d40 20 20 20 20 20 20 20 6e 6f 77 2e 20 20 54 68 69         now.  Thi
17d50 73 20 5b 6f 62 6a 65 63 74 20 64 69 73 70 6f 73  s [object dispos
17d60 65 5d 20 63 61 6c 6c 20 77 69 6c 6c 20 6e 6f 74  e] call will not
17d70 20 61 63 74 75 61 6c 6c 79 20 64 69 73 70 6f 73   actually dispos
17d80 65 20 6f 66 20 74 68 65 0d 0a 20 20 20 20 20 20  e of the..      
17d90 23 20 20 20 20 20 20 20 75 6e 64 65 72 6c 79 69  #       underlyi
17da0 6e 67 20 6f 62 6a 65 63 74 20 62 65 63 61 75 73  ng object becaus
17db0 65 20 74 68 65 20 2b 4e 6f 44 69 73 70 6f 73 65  e the +NoDispose
17dc0 20 66 6c 61 67 20 77 61 73 20 73 65 74 20 6f 6e   flag was set on
17dd0 20 69 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20   it..      #    
17de0 20 20 20 64 75 72 69 6e 67 20 63 72 65 61 74 69     during creati
17df0 6f 6e 20 6f 66 20 74 68 65 20 6f 70 61 71 75 65  on of the opaque
17e00 20 6f 62 6a 65 63 74 20 68 61 6e 64 6c 65 2e 0d   object handle..
17e10 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
17e20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
17e30 20 63 6f 6e 6e 65 63 74 69 6f 6e 5d 20 26 26 20   connection] && 
17e40 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 63 61  \..          [ca
17e50 74 63 68 20 7b 6f 62 6a 65 63 74 20 64 69 73 70  tch {object disp
17e60 6f 73 65 20 24 63 6f 6e 6e 65 63 74 69 6f 6e 7d  ose $connection}
17e70 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d   error]} then {.
17e80 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
17e90 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 73      # NOTE: We s
17ea0 6f 6d 65 68 6f 77 20 66 61 69 6c 65 64 20 74 6f  omehow failed to
17eb0 20 72 65 6d 6f 76 65 20 74 68 65 20 68 61 6e 64   remove the hand
17ec0 6c 65 2c 20 72 65 70 6f 72 74 20 77 68 79 2e 0d  le, report why..
17ed0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
17ee0 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
17ef0 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
17f00 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
17f10 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49       "==== WARNI
17f20 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 72 65  NG: failed to re
17f30 6d 6f 76 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  move connection 
17f40 68 61 6e 64 6c 65 20 5c 22 22 20 24 63 6f 6e 6e  handle \"" $conn
17f50 65 63 74 69 6f 6e 20 5c 0d 0a 20 20 20 20 20 20  ection \..      
17f60 20 20 20 20 20 20 22 5c 22 2c 20 65 72 72 6f 72        "\", error
17f70 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20  : " \n\t $error 
17f80 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  \n]..      }..  
17f90 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
17fa0 20 61 64 64 44 62 43 6f 6e 6e 65 63 74 69 6f 6e   addDbConnection
17fb0 20 7b 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 76   { connection {v
17fc0 61 72 4e 61 6d 65 20 64 62 7d 20 7d 20 7b 0d 0a  arName db} } {..
17fd0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
17fe0 20 4e 4f 54 45 3a 20 52 65 66 65 72 20 74 6f 20   NOTE: Refer to 
17ff0 74 68 65 20 73 70 65 63 69 66 69 65 64 20 76 61  the specified va
18000 72 69 61 62 6c 65 20 28 65 2e 67 2e 20 22 64 62  riable (e.g. "db
18010 22 29 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 78  ") in the contex
18020 74 20 6f 66 20 6f 75 72 0d 0a 20 20 20 20 20 20  t of our..      
18030 23 20 20 20 20 20 20 20 63 61 6c 6c 65 72 2e 0d  #       caller..
18040 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
18050 75 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65  upvar 1 $varName
18060 20 64 62 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a   db....      #..
18070 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 72        # NOTE: Cr
18080 65 61 74 65 20 61 20 63 6f 72 72 65 63 74 6c 79  eate a correctly
18090 20 66 6f 72 6d 61 74 74 65 64 20 6e 61 6d 65 20   formatted name 
180a0 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65  for the database
180b0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 0d 0a   connection to..
180c0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62 65        #       be
180d0 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 6c 69   added to the li
180e0 73 74 20 6d 61 6e 61 67 65 64 20 62 79 20 74 68  st managed by th
180f0 65 20 45 61 67 6c 65 20 69 6e 74 65 72 70 72 65  e Eagle interpre
18100 74 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ter...      #.. 
18110 20 20 20 20 20 73 65 74 20 64 62 20 5b 6f 62 6a       set db [obj
18120 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67  ect invoke -flag
18130 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a  s +NonPublic \..
18140 20 20 20 20 20 20 20 20 20 20 45 61 67 6c 65 2e            Eagle.
18150 5f 43 6f 6d 70 6f 6e 65 6e 74 73 2e 50 72 69 76  _Components.Priv
18160 61 74 65 2e 46 6f 72 6d 61 74 4f 70 73 20 44 61  ate.FormatOps Da
18170 74 61 62 61 73 65 4f 62 6a 65 63 74 4e 61 6d 65  tabaseObjectName
18180 20 24 63 6f 6e 6e 65 63 74 69 6f 6e 20 5c 0d 0a   $connection \..
18190 20 20 20 20 20 20 20 20 20 20 53 51 4c 69 74 65            SQLite
181a0 43 6f 6e 6e 65 63 74 69 6f 6e 20 5b 6f 62 6a 65  Connection [obje
181b0 63 74 20 69 6e 76 6f 6b 65 20 49 6e 74 65 72 70  ct invoke Interp
181c0 72 65 74 65 72 2e 47 65 74 41 63 74 69 76 65 20  reter.GetActive 
181d0 4e 65 78 74 49 64 5d 5d 0d 0a 0d 0a 20 20 20 20  NextId]]....    
181e0 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
181f0 45 3a 20 41 64 64 20 74 68 65 20 64 61 74 61 62  E: Add the datab
18200 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70  ase connection p
18210 72 6f 76 69 64 65 64 20 62 79 20 6f 75 72 20 63  rovided by our c
18220 61 6c 6c 65 72 20 74 6f 20 74 68 65 20 6c 69 73  aller to the lis
18230 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  t..      #      
18240 20 6f 66 20 74 68 6f 73 65 20 6b 6e 6f 77 6e 20   of those known 
18250 74 6f 20 74 68 65 20 45 61 67 6c 65 20 69 6e 74  to the Eagle int
18260 65 72 70 72 65 74 65 72 2e 0d 0a 20 20 20 20 20  erpreter...     
18270 20 23 0d 0a 20 20 20 20 20 20 6f 62 6a 65 63 74   #..      object
18280 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b   invoke -flags +
18290 4e 6f 6e 50 75 62 6c 69 63 20 49 6e 74 65 72 70  NonPublic Interp
182a0 72 65 74 65 72 2e 47 65 74 41 63 74 69 76 65 2e  reter.GetActive.
182b0 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 41 64 64 20  connections Add 
182c0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 24 64 62  \..          $db
182d0 20 24 63 6f 6e 6e 65 63 74 69 6f 6e 0d 0a 20 20   $connection..  
182e0 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
182f0 20 72 65 6d 6f 76 65 44 62 54 72 61 6e 73 61 63   removeDbTransac
18300 74 69 6f 6e 20 7b 20 74 72 61 6e 73 61 63 74 69  tion { transacti
18310 6f 6e 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  on } {..      #.
18320 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52  .      # NOTE: R
18330 65 6d 6f 76 65 20 74 68 65 20 64 61 74 61 62 61  emove the databa
18340 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 70  se transaction p
18350 72 6f 76 69 64 65 64 20 62 79 20 6f 75 72 20 63  rovided by our c
18360 61 6c 6c 65 72 20 66 72 6f 6d 20 74 68 65 0d 0a  aller from the..
18370 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6c 69        #       li
18380 73 74 20 6f 66 20 74 68 6f 73 65 20 6b 6e 6f 77  st of those know
18390 6e 20 74 6f 20 74 68 65 20 45 61 67 6c 65 20 69  n to the Eagle i
183a0 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a 20 20 20  nterpreter...   
183b0 20 20 20 23 0d 0a 20 20 20 20 20 20 6f 62 6a 65     #..      obje
183c0 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73  ct invoke -flags
183d0 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 49 6e 74 65   +NonPublic Inte
183e0 72 70 72 65 74 65 72 2e 47 65 74 41 63 74 69 76  rpreter.GetActiv
183f0 65 2e 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 5c  e.transactions \
18400 0d 0a 20 20 20 20 20 20 20 20 20 20 52 65 6d 6f  ..          Remo
18410 76 65 20 24 74 72 61 6e 73 61 63 74 69 6f 6e 0d  ve $transaction.
18420 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
18430 72 6f 63 20 67 65 74 52 6f 77 73 46 72 6f 6d 44  roc getRowsFromD
18440 61 74 61 54 61 62 6c 65 20 7b 20 64 61 74 61 54  ataTable { dataT
18450 61 62 6c 65 20 7b 76 61 6c 75 65 43 61 6c 6c 62  able {valueCallb
18460 61 63 6b 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20  ack ""} } {..   
18470 20 20 20 73 65 74 20 72 6f 77 73 20 5b 6c 69 73     set rows [lis
18480 74 5d 0d 0a 20 20 20 20 20 20 73 65 74 20 63 6f  t]..      set co
18490 75 6e 74 20 5b 24 64 61 74 61 54 61 62 6c 65 20  unt [$dataTable 
184a0 43 6f 6c 75 6d 6e 73 2e 43 6f 75 6e 74 5d 0d 0a  Columns.Count]..
184b0 0d 0a 20 20 20 20 20 20 66 6f 72 20 7b 73 65 74  ..      for {set
184c0 20 69 6e 64 65 78 20 30 7d 20 7b 24 69 6e 64 65   index 0} {$inde
184d0 78 20 3c 20 24 63 6f 75 6e 74 7d 20 7b 69 6e 63  x < $count} {inc
184e0 72 20 69 6e 64 65 78 7d 20 7b 0d 0a 20 20 20 20  r index} {..    
184f0 20 20 20 20 73 65 74 20 64 61 74 61 43 6f 6c 75      set dataColu
18500 6d 6e 20 5b 24 64 61 74 61 54 61 62 6c 65 20 2d  mn [$dataTable -
18510 61 6c 69 61 73 20 43 6f 6c 75 6d 6e 73 2e 67 65  alias Columns.ge
18520 74 5f 49 74 65 6d 20 24 69 6e 64 65 78 5d 0d 0a  t_Item $index]..
18530 20 20 20 20 20 20 20 20 73 65 74 20 6e 61 6d 65          set name
18540 73 28 24 69 6e 64 65 78 29 20 5b 24 64 61 74 61  s($index) [$data
18550 43 6f 6c 75 6d 6e 20 43 6f 6c 75 6d 6e 4e 61 6d  Column ColumnNam
18560 65 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  e]..      }.... 
18570 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
18580 4e 4f 54 45 3a 20 53 65 74 75 70 20 73 6f 6d 65  NOTE: Setup some
18590 20 54 63 6c 20 72 65 74 75 72 6e 20 63 6f 64 65   Tcl return code
185a0 20 63 6f 6e 73 74 61 6e 74 73 2e 0d 0a 20 20 20   constants...   
185b0 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20     #..      set 
185c0 4f 6b 20 30 3b 20 73 65 74 20 45 72 72 6f 72 20  Ok 0; set Error 
185d0 31 3b 20 73 65 74 20 52 65 74 75 72 6e 20 32 3b  1; set Return 2;
185e0 20 73 65 74 20 42 72 65 61 6b 20 33 3b 20 73 65   set Break 3; se
185f0 74 20 43 6f 6e 74 69 6e 75 65 20 34 0d 0a 0d 0a  t Continue 4....
18600 20 20 20 20 20 20 6f 62 6a 65 63 74 20 66 6f 72        object for
18610 65 61 63 68 20 2d 61 6c 69 61 73 20 64 61 74 61  each -alias data
18620 52 6f 77 20 5b 73 65 74 20 64 61 74 61 52 6f 77  Row [set dataRow
18630 73 20 5b 24 64 61 74 61 54 61 62 6c 65 20 52 6f  s [$dataTable Ro
18640 77 73 5d 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20  ws]] {..        
18650 73 65 74 20 72 6f 77 20 5b 6c 69 73 74 5d 0d 0a  set row [list]..
18660 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 20 7b 73  ..        for {s
18670 65 74 20 69 6e 64 65 78 20 30 7d 20 7b 24 69 6e  et index 0} {$in
18680 64 65 78 20 3c 20 24 63 6f 75 6e 74 7d 20 7b 69  dex < $count} {i
18690 6e 63 72 20 69 6e 64 65 78 7d 20 7b 0d 0a 20 20  ncr index} {..  
186a0 20 20 20 20 20 20 20 20 73 65 74 20 76 61 6c 75          set valu
186b0 65 20 5b 24 64 61 74 61 52 6f 77 20 2d 63 72 65  e [$dataRow -cre
186c0 61 74 65 20 2d 61 6c 69 61 73 20 67 65 74 5f 49  ate -alias get_I
186d0 74 65 6d 20 24 69 6e 64 65 78 5d 0d 0a 0d 0a 20  tem $index].... 
186e0 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74           if {[st
186f0 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 61 6c  ring length $val
18700 75 65 43 61 6c 6c 62 61 63 6b 5d 20 3e 20 30 7d  ueCallback] > 0}
18710 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
18720 20 20 20 20 20 73 65 74 20 63 6f 64 65 20 5b 63       set code [c
18730 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
18740 20 20 20 20 20 20 24 76 61 6c 75 65 43 61 6c 6c        $valueCall
18750 62 61 63 6b 20 24 64 61 74 61 54 61 62 6c 65 20  back $dataTable 
18760 24 64 61 74 61 52 6f 77 20 24 69 6e 64 65 78 20  $dataRow $index 
18770 24 76 61 6c 75 65 0d 0a 20 20 20 20 20 20 20 20  $value..        
18780 20 20 20 20 7d 20 6e 65 77 56 61 6c 75 65 5d 0d      } newValue].
18790 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ...            i
187a0 66 20 7b 24 63 6f 64 65 20 3d 3d 20 24 4f 6b 7d  f {$code == $Ok}
187b0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
187c0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
187d0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
187e0 55 73 65 20 74 68 65 20 73 70 65 63 69 66 69 65  Use the specifie
187f0 64 20 28 6e 65 77 3f 29 20 72 6f 77 20 76 61 6c  d (new?) row val
18800 75 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ue...           
18810 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
18820 20 20 20 20 6c 61 70 70 65 6e 64 20 72 6f 77 20      lappend row 
18830 5b 6c 69 73 74 20 24 6e 61 6d 65 73 28 24 69 6e  [list $names($in
18840 64 65 78 29 20 24 6e 65 77 56 61 6c 75 65 5d 0d  dex) $newValue].
18850 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65  .            } e
18860 6c 73 65 69 66 20 7b 24 63 6f 64 65 20 3d 3d 20  lseif {$code == 
18870 24 45 72 72 6f 72 7d 20 74 68 65 6e 20 7b 0d 0a  $Error} then {..
18880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
18890 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
188a0 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20 28   NOTE: Use the (
188b0 6e 65 77 3f 29 20 4e 55 4c 4c 20 72 6f 77 20 76  new?) NULL row v
188c0 61 6c 75 65 2e 0d 0a 20 20 20 20 20 20 20 20 20  alue...         
188d0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
188e0 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 72 6f        lappend ro
188f0 77 20 5b 6c 69 73 74 20 24 6e 61 6d 65 73 28 24  w [list $names($
18900 69 6e 64 65 78 29 5d 0d 0a 20 20 20 20 20 20 20  index)]..       
18910 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 24       } elseif {$
18920 63 6f 64 65 20 3d 3d 20 24 52 65 74 75 72 6e 7d  code == $Return}
18930 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
18940 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
18950 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
18960 53 6b 69 70 20 72 65 6d 61 69 6e 69 6e 67 20 76  Skip remaining v
18970 61 6c 75 65 73 20 66 6f 72 20 74 68 69 73 20 72  alues for this r
18980 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ow...           
18990 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
189a0 20 20 20 20 62 72 65 61 6b 0d 0a 20 20 20 20 20      break..     
189b0 20 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20         } elseif 
189c0 7b 24 63 6f 64 65 20 3d 3d 20 24 42 72 65 61 6b  {$code == $Break
189d0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
189e0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
189f0 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
18a00 20 53 6b 69 70 20 70 72 6f 63 65 73 73 69 6e 67   Skip processing
18a10 20 74 68 69 73 20 72 6f 77 20 76 61 6c 75 65 2e   this row value.
18a20 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
18a30 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  #..            }
18a40 20 65 6c 73 65 69 66 20 7b 24 63 6f 64 65 20 3d   elseif {$code =
18a50 3d 20 24 43 6f 6e 74 69 6e 75 65 7d 20 74 68 65  = $Continue} the
18a60 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
18a70 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
18a80 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20      # NOTE: Use 
18a90 64 65 66 61 75 6c 74 20 72 6f 77 20 76 61 6c 75  default row valu
18aa0 65 20 68 61 6e 64 6c 69 6e 67 2e 0d 0a 20 20 20  e handling...   
18ab0 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
18ac0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
18ad0 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
18ae0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74  .            set
18af0 20 63 6f 64 65 20 24 43 6f 6e 74 69 6e 75 65 0d   code $Continue.
18b00 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  .          }....
18b10 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 24 63            if {$c
18b20 6f 64 65 20 3d 3d 20 24 43 6f 6e 74 69 6e 75 65  ode == $Continue
18b30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
18b40 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
18b50 67 20 6c 65 6e 67 74 68 20 24 76 61 6c 75 65 5d  g length $value]
18b60 20 3e 20 30 20 26 26 20 5c 0d 0a 20 20 20 20 20   > 0 && \..     
18b70 20 20 20 20 20 20 20 20 20 20 20 21 5b 6f 62 6a             ![obj
18b80 65 63 74 20 69 6e 76 6f 6b 65 20 43 6f 6e 76 65  ect invoke Conve
18b90 72 74 20 49 73 44 42 4e 75 6c 6c 20 24 76 61 6c  rt IsDBNull $val
18ba0 75 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ue]} then {..   
18bb0 20 20 20 20 20 20 20 20 20 20 20 6c 61 70 70 65             lappe
18bc0 6e 64 20 72 6f 77 20 5b 6c 69 73 74 20 24 6e 61  nd row [list $na
18bd0 6d 65 73 28 24 69 6e 64 65 78 29 20 5b 24 76 61  mes($index) [$va
18be0 6c 75 65 20 54 6f 53 74 72 69 6e 67 5d 5d 0d 0a  lue ToString]]..
18bf0 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c              } el
18c00 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
18c10 20 20 20 20 6c 61 70 70 65 6e 64 20 72 6f 77 20      lappend row 
18c20 5b 6c 69 73 74 20 24 6e 61 6d 65 73 28 24 69 6e  [list $names($in
18c30 64 65 78 29 5d 0d 0a 20 20 20 20 20 20 20 20 20  dex)]..         
18c40 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
18c50 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  }..        }....
18c60 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20          lappend 
18c70 72 6f 77 73 20 24 72 6f 77 0d 0a 20 20 20 20 20  rows $row..     
18c80 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75   }....      retu
18c90 72 6e 20 24 72 6f 77 73 0d 0a 20 20 20 20 7d 0d  rn $rows..    }.
18ca0 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 64 75 6d  ....    proc dum
18cb0 70 52 6f 77 73 46 72 6f 6d 44 61 74 61 54 61 62  pRowsFromDataTab
18cc0 6c 65 20 7b 20 63 68 61 6e 6e 65 6c 20 72 6f 77  le { channel row
18cd0 73 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74  s } {..      set
18ce0 20 73 65 71 75 65 6e 63 65 20 31 0d 0a 0d 0a 20   sequence 1.... 
18cf0 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77       foreach row
18d00 20 24 72 6f 77 73 20 7b 0d 0a 20 20 20 20 20 20   $rows {..      
18d10 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
18d20 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
18d30 20 20 20 20 20 20 20 20 20 20 20 20 5b 65 78 70              [exp
18d40 72 20 7b 24 73 65 71 75 65 6e 63 65 20 3e 20 31  r {$sequence > 1
18d50 20 3f 20 22 5c 6e 22 20 3a 20 22 22 7d 5d 20 22   ? "\n" : ""}] "
18d60 2d 2d 2d 2d 20 52 4f 57 20 23 22 20 24 73 65 71  ---- ROW #" $seq
18d70 75 65 6e 63 65 20 3a 5c 6e 5d 0d 0a 0d 0a 20 20  uence :\n]....  
18d80 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 70 61        foreach pa
18d90 69 72 20 24 72 6f 77 20 7b 0d 0a 20 20 20 20 20  ir $row {..     
18da0 20 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67 74       if {[llengt
18db0 68 20 24 70 61 69 72 5d 20 3e 3d 20 32 7d 20 74  h $pair] >= 2} t
18dc0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
18dd0 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
18de0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 74  l [appendArgs \t
18df0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
18e00 20 20 20 20 5b 6c 69 73 74 20 5b 6c 69 6e 64 65      [list [linde
18e10 78 20 24 70 61 69 72 20 30 5d 5d 20 22 3a 20 22  x $pair 0]] ": "
18e20 20 5b 6c 69 73 74 20 5b 6c 69 6e 64 65 78 20 24   [list [lindex $
18e30 70 61 69 72 20 31 5d 5d 20 5c 6e 5d 0d 0a 20 20  pair 1]] \n]..  
18e40 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66          } elseif
18e50 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 70 61 69 72   {[llength $pair
18e60 5d 20 3d 3d 20 31 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 1} then {..
18e70 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
18e80 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
18e90 6e 64 41 72 67 73 20 5c 74 20 5c 0d 0a 20 20 20  ndArgs \t \..   
18ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 6c 69               [li
18eb0 73 74 20 5b 6c 69 6e 64 65 78 20 24 70 61 69 72  st [lindex $pair
18ec0 20 30 5d 5d 20 22 3a 20 3c 6e 75 6c 6c 3e 5c 6e   0]] ": <null>\n
18ed0 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20  "]..          } 
18ee0 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
18ef0 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
18f00 65 6c 20 5c 74 3c 65 6d 70 74 79 3e 5c 6e 3b 20  el \t<empty>\n; 
18f10 23 20 4e 4f 54 45 3a 20 4e 6f 20 64 61 74 61 3f  # NOTE: No data?
18f20 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
18f30 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
18f40 20 20 20 20 69 6e 63 72 20 73 65 71 75 65 6e 63      incr sequenc
18f50 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  e..      }..    
18f60 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63  }.....    proc c
18f70 6c 65 61 6e 75 70 44 62 20 7b 20 66 69 6c 65 4e  leanupDb { fileN
18f80 61 6d 65 20 7b 76 61 72 4e 61 6d 65 20 64 62 7d  ame {varName db}
18f90 20 7b 63 6f 6c 6c 65 63 74 20 74 72 75 65 7d 20   {collect true} 
18fa0 7b 71 75 61 6c 69 66 79 20 74 72 75 65 7d 0d 0a  {qualify true}..
18fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18fc0 20 20 20 20 20 7b 64 65 6c 65 74 65 20 74 72 75       {delete tru
18fd0 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  e} } {..      #.
18fe0 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41  .      # NOTE: A
18ff0 74 74 65 6d 70 74 20 74 6f 20 66 6f 72 63 65 20  ttempt to force 
19000 61 6c 6c 20 70 65 6e 64 69 6e 67 20 22 67 61 72  all pending "gar
19010 62 61 67 65 22 20 6f 62 6a 65 63 74 73 20 74 6f  bage" objects to
19020 20 62 65 20 63 6f 6c 6c 65 63 74 65 64 2c 0d 0a   be collected,..
19030 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69 6e        #       in
19040 63 6c 75 64 69 6e 67 20 53 51 4c 69 74 65 20 73  cluding SQLite s
19050 74 61 74 65 6d 65 6e 74 73 20 61 6e 64 20 62 61  tatements and ba
19060 63 6b 75 70 20 6f 62 6a 65 63 74 73 3b 20 74 68  ckup objects; th
19070 69 73 20 73 68 6f 75 6c 64 20 61 6c 6c 6f 77 0d  is should allow.
19080 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74  .      #       t
19090 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61  he underlying da
190a0 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 62  tabase file to b
190b0 65 20 64 65 6c 65 74 65 64 2e 0d 0a 20 20 20 20  e deleted...    
190c0 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 24    #..      if {$
190d0 63 6f 6c 6c 65 63 74 7d 20 74 68 65 6e 20 7b 0d  collect} then {.
190e0 0a 20 20 20 20 20 20 20 20 63 6f 6c 6c 65 63 74  .        collect
190f0 47 61 72 62 61 67 65 20 24 3a 3a 74 65 73 74 5f  Garbage $::test_
19100 63 68 61 6e 6e 65 6c 0d 0a 20 20 20 20 20 20 7d  channel..      }
19110 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
19120 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 66 65 72     # NOTE: Refer
19130 20 74 6f 20 74 68 65 20 73 70 65 63 69 66 69 65   to the specifie
19140 64 20 76 61 72 69 61 62 6c 65 20 28 65 2e 67 2e  d variable (e.g.
19150 20 22 64 62 22 29 20 69 6e 20 74 68 65 20 63 6f   "db") in the co
19160 6e 74 65 78 74 20 6f 66 20 6f 75 72 0d 0a 20 20  ntext of our..  
19170 20 20 20 20 23 20 20 20 20 20 20 20 63 61 6c 6c      #       call
19180 65 72 2e 20 20 54 68 65 20 68 61 6e 64 6c 65 20  er.  The handle 
19190 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
191a0 70 72 65 76 69 6f 75 73 6c 79 20 6f 70 65 6e 65  previously opene
191b0 64 20 76 69 61 20 74 68 65 0d 0a 20 20 20 20 20  d via the..     
191c0 20 23 20 20 20 20 20 20 20 5b 73 65 74 75 70 44   #       [setupD
191d0 62 5d 20 70 72 6f 63 65 64 75 72 65 20 73 68 6f  b] procedure sho
191e0 75 6c 64 20 62 65 20 73 74 6f 72 65 64 20 74 68  uld be stored th
191f0 65 72 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ere...      #.. 
19200 20 20 20 20 20 75 70 76 61 72 20 31 20 24 76 61       upvar 1 $va
19210 72 4e 61 6d 65 20 64 62 0d 0a 0d 0a 20 20 20 20  rName db....    
19220 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
19230 45 3a 20 43 6c 6f 73 65 20 74 68 65 20 63 6f 6e  E: Close the con
19240 6e 65 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 64  nection to the d
19250 61 74 61 62 61 73 65 20 6e 6f 77 2e 20 20 54 68  atabase now.  Th
19260 69 73 20 73 68 6f 75 6c 64 20 61 6c 6c 6f 77 20  is should allow 
19270 75 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  us..      #     
19280 20 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20    to delete the 
19290 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62  underlying datab
192a0 61 73 65 20 66 69 6c 65 2e 0d 0a 20 20 20 20 20  ase file...     
192b0 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69   #..      if {[i
192c0 6e 66 6f 20 65 78 69 73 74 73 20 64 62 5d 20 26  nfo exists db] &
192d0 26 20 5b 63 61 74 63 68 20 7b 73 71 6c 20 63 6c  & [catch {sql cl
192e0 6f 73 65 20 24 64 62 7d 20 65 72 72 6f 72 5d 7d  ose $db} error]}
192f0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
19300 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
19310 54 45 3a 20 57 65 20 73 6f 6d 65 68 6f 77 20 66  TE: We somehow f
19320 61 69 6c 65 64 20 74 6f 20 63 6c 6f 73 65 20 74  ailed to close t
19330 68 65 20 64 61 74 61 62 61 73 65 2c 20 72 65 70  he database, rep
19340 6f 72 74 20 77 68 79 2e 0d 0a 20 20 20 20 20 20  ort why...      
19350 20 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75    #..        tpu
19360 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
19370 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
19380 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 3d  ..            "=
19390 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69  === WARNING: fai
193a0 6c 65 64 20 74 6f 20 63 6c 6f 73 65 20 64 61 74  led to close dat
193b0 61 62 61 73 65 20 5c 22 22 20 24 64 62 20 22 5c  abase \"" $db "\
193c0 22 2c 20 65 72 72 6f 72 3a 20 22 20 5c 0d 0a 20  ", error: " \.. 
193d0 20 20 20 20 20 20 20 20 20 20 20 5c 6e 5c 74 20             \n\t 
193e0 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20  $error \n]..    
193f0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
19400 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69        # NOTE: Fi
19410 72 73 74 2c 20 73 65 65 20 69 66 20 6f 75 72 20  rst, see if our 
19420 63 61 6c 6c 65 72 20 68 61 73 20 72 65 71 75 65  caller has reque
19430 73 74 65 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  sted an in-memor
19440 79 20 64 61 74 61 62 61 73 65 2e 0d 0a 20 20 20  y database...   
19450 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20     #..      set 
19460 69 73 4d 65 6d 6f 72 79 20 5b 69 73 4d 65 6d 6f  isMemory [isMemo
19470 72 79 44 62 20 24 66 69 6c 65 4e 61 6d 65 5d 0d  ryDb $fileName].
19480 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
19490 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20    # NOTE: Build 
194a0 74 68 65 20 66 75 6c 6c 20 70 61 74 68 20 74 6f  the full path to
194b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
194c0 6c 65 20 6e 61 6d 65 2e 20 20 46 6f 72 20 6e 6f  le name.  For no
194d0 77 2c 20 61 6c 6c 20 74 65 73 74 0d 0a 20 20 20  w, all test..   
194e0 20 20 20 23 20 20 20 20 20 20 20 64 61 74 61 62     #       datab
194f0 61 73 65 20 66 69 6c 65 73 20 61 72 65 20 73 74  ase files are st
19500 6f 72 65 64 20 69 6e 20 74 68 65 20 74 65 6d 70  ored in the temp
19510 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72 79 2e  orary directory.
19520 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
19530 20 69 66 20 7b 21 24 69 73 4d 65 6d 6f 72 79 20   if {!$isMemory 
19540 26 26 20 24 71 75 61 6c 69 66 79 7d 20 74 68 65  && $qualify} the
19550 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74  n {..        set
19560 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20   fileName [file 
19570 6a 6f 69 6e 20 5b 67 65 74 44 61 74 61 62 61 73  join [getDatabas
19580 65 44 69 72 65 63 74 6f 72 79 5d 20 5b 66 69 6c  eDirectory] [fil
19590 65 20 74 61 69 6c 20 24 66 69 6c 65 4e 61 6d 65  e tail $fileName
195a0 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ]]..      }.... 
195b0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
195c0 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20 74  NOTE: Check if t
195d0 68 65 20 66 69 6c 65 20 73 74 69 6c 6c 20 65 78  he file still ex
195e0 69 73 74 73 3b 20 69 6e 69 74 69 61 6c 6c 79 2c  ists; initially,
195f0 20 61 73 73 75 6d 65 20 61 6c 6c 20 66 69 6c 65   assume all file
19600 73 20 77 69 6c 6c 0d 0a 20 20 20 20 20 20 23 20  s will..      # 
19610 20 20 20 20 20 20 62 65 20 64 65 6c 65 74 65 64        be deleted
19620 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 69   successfully, i
19630 66 20 6e 65 63 65 73 73 61 72 79 2e 0d 0a 20 20  f necessary...  
19640 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74      #..      set
19650 20 73 75 63 63 65 73 73 20 74 72 75 65 0d 0a 0d   success true...
19660 0a 20 20 20 20 20 20 69 66 20 7b 21 24 69 73 4d  .      if {!$isM
19670 65 6d 6f 72 79 20 26 26 20 24 64 65 6c 65 74 65  emory && $delete
19680 20 26 26 20 5b 66 69 6c 65 20 65 78 69 73 74 73   && [file exists
19690 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65   $fileName]} the
196a0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
196b0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
196c0 53 6b 69 70 20 64 65 6c 65 74 69 6e 67 20 64 61  Skip deleting da
196d0 74 61 62 61 73 65 20 66 69 6c 65 73 20 69 66 20  tabase files if 
196e0 73 6f 6d 65 62 6f 64 79 20 73 65 74 73 20 74 68  somebody sets th
196f0 65 20 67 6c 6f 62 61 6c 0d 0a 20 20 20 20 20 20  e global..      
19700 20 20 23 20 20 20 20 20 20 20 76 61 72 69 61 62    #       variab
19710 6c 65 20 74 6f 20 70 72 65 76 65 6e 74 20 69 74  le to prevent it
19720 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
19730 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
19740 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6c 65   exists ::no(cle
19750 61 6e 75 70 44 62 46 69 6c 65 73 29 5d 7d 20 74  anupDbFiles)]} t
19760 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
19770 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
19780 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f  NOTE: Attempt to
19790 20 64 65 6c 65 74 65 20 74 68 65 20 74 65 73 74   delete the test
197a0 20 57 41 4c 20 66 69 6c 65 2c 20 69 66 20 61 6e   WAL file, if an
197b0 79 2c 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20  y, now...       
197c0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
197d0 73 65 74 20 77 61 6c 46 69 6c 65 4e 61 6d 65 20  set walFileName 
197e0 5b 61 70 70 65 6e 64 41 72 67 73 20 24 66 69 6c  [appendArgs $fil
197f0 65 4e 61 6d 65 20 2d 77 61 6c 5d 0d 0a 0d 0a 20  eName -wal].... 
19800 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 66 69           if {[fi
19810 6c 65 20 65 78 69 73 74 73 20 24 77 61 6c 46 69  le exists $walFi
19820 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d  leName]} then {.
19830 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a  .            #..
19840 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f              # NO
19850 54 45 3a 20 49 66 20 74 68 65 72 65 20 69 73 20  TE: If there is 
19860 61 20 57 41 4c 20 66 69 6c 65 2c 20 69 74 20 73  a WAL file, it s
19870 68 6f 75 6c 64 20 62 65 20 7a 65 72 6f 20 62 79  hould be zero by
19880 74 65 73 20 61 74 20 74 68 69 73 0d 0a 20 20 20  tes at this..   
19890 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
198a0 20 70 6f 69 6e 74 2e 0d 0a 20 20 20 20 20 20 20   point...       
198b0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
198c0 20 20 20 20 69 66 20 7b 5b 73 65 74 20 73 69 7a      if {[set siz
198d0 65 20 5b 66 69 6c 65 20 73 69 7a 65 20 24 77 61  e [file size $wa
198e0 6c 46 69 6c 65 4e 61 6d 65 5d 5d 20 3d 3d 20 30  lFileName]] == 0
198f0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
19900 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
19910 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
19920 20 57 65 20 73 6f 6d 65 68 6f 77 20 66 61 69 6c   We somehow fail
19930 65 64 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  ed to delete the
19940 20 57 41 4c 20 66 69 6c 65 2c 20 72 65 70 6f 72   WAL file, repor
19950 74 20 77 68 79 2e 0d 0a 20 20 20 20 20 20 20 20  t why...        
19960 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
19970 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
19980 68 20 7b 66 69 6c 65 20 64 65 6c 65 74 65 20 24  h {file delete $
19990 77 61 6c 46 69 6c 65 4e 61 6d 65 7d 20 65 72 72  walFileName} err
199a0 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  or]} then {..   
199b0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
199c0 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
199d0 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
199e0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
199f0 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e        "==== WARN
19a00 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 64  ING: failed to d
19a10 65 6c 65 74 65 20 57 41 4c 20 66 69 6c 65 20 5c  elete WAL file \
19a20 22 22 20 24 77 61 6c 46 69 6c 65 4e 61 6d 65 20  "" $walFileName 
19a30 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
19a40 20 20 20 20 20 20 20 22 5c 22 20 64 75 72 69 6e         "\" durin
19a50 67 20 63 6c 65 61 6e 75 70 2c 20 65 72 72 6f 72  g cleanup, error
19a60 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20  : " \n\t $error 
19a70 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  \n]....         
19a80 20 20 20 20 20 20 20 73 65 74 20 73 75 63 63 65         set succe
19a90 73 73 20 66 61 6c 73 65 0d 0a 20 20 20 20 20 20  ss false..      
19aa0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
19ab0 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
19ac0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  .              t
19ad0 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
19ae0 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
19af0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
19b00 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e        "==== WARN
19b10 49 4e 47 3a 20 57 41 4c 20 66 69 6c 65 20 5c 22  ING: WAL file \"
19b20 22 20 24 77 61 6c 46 69 6c 65 4e 61 6d 65 20 22  " $walFileName "
19b30 5c 22 20 69 73 20 22 20 24 73 69 7a 65 20 5c 0d  \" is " $size \.
19b40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19b50 20 20 20 22 20 62 79 74 65 73 20 69 6e 20 73 69     " bytes in si
19b60 7a 65 2c 20 73 6b 69 70 70 69 6e 67 20 61 6c 6c  ze, skipping all
19b70 20 66 69 6c 65 20 64 65 6c 65 74 69 6f 6e 73 2e   file deletions.
19b80 2e 2e 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20 20  ..\n"]....      
19b90 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
19ba0 3b 20 23 20 65 72 72 6f 72 0d 0a 20 20 20 20 20  ; # error..     
19bb0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
19bc0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
19bd0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
19be0 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20  # NOTE: Attempt 
19bf0 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 74 65  to delete the te
19c00 73 74 20 53 48 4d 20 66 69 6c 65 2c 20 69 66 20  st SHM file, if 
19c10 61 6e 79 2c 20 6e 6f 77 2e 0d 0a 20 20 20 20 20  any, now...     
19c20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
19c30 20 20 73 65 74 20 73 68 6d 46 69 6c 65 4e 61 6d    set shmFileNam
19c40 65 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 66  e [appendArgs $f
19c50 69 6c 65 4e 61 6d 65 20 2d 73 68 6d 5d 0d 0a 0d  ileName -shm]...
19c60 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b  .          if {[
19c70 66 69 6c 65 20 65 78 69 73 74 73 20 24 73 68 6d  file exists $shm
19c80 46 69 6c 65 4e 61 6d 65 5d 20 26 26 20 5c 0d 0a  FileName] && \..
19c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 63                [c
19ca0 61 74 63 68 20 7b 66 69 6c 65 20 64 65 6c 65 74  atch {file delet
19cb0 65 20 24 73 68 6d 46 69 6c 65 4e 61 6d 65 7d 20  e $shmFileName} 
19cc0 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a  error]} then {..
19cd0 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
19ce0 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
19cf0 45 3a 20 57 65 20 73 6f 6d 65 68 6f 77 20 66 61  E: We somehow fa
19d00 69 6c 65 64 20 74 6f 20 64 65 6c 65 74 65 20 74  iled to delete t
19d10 68 65 20 53 48 4d 20 66 69 6c 65 2c 20 72 65 70  he SHM file, rep
19d20 6f 72 74 20 77 68 79 2e 0d 0a 20 20 20 20 20 20  ort why...      
19d30 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
19d40 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
19d50 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
19d60 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
19d70 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20            "==== 
19d80 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20  WARNING: failed 
19d90 74 6f 20 64 65 6c 65 74 65 20 53 48 4d 20 66 69  to delete SHM fi
19da0 6c 65 20 5c 22 22 20 24 73 68 6d 46 69 6c 65 4e  le \"" $shmFileN
19db0 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ame \..         
19dc0 20 20 20 20 20 20 20 22 5c 22 20 64 75 72 69 6e         "\" durin
19dd0 67 20 63 6c 65 61 6e 75 70 2c 20 65 72 72 6f 72  g cleanup, error
19de0 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20  : " \n\t $error 
19df0 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  \n]....         
19e00 20 20 20 73 65 74 20 73 75 63 63 65 73 73 20 66     set success f
19e10 61 6c 73 65 0d 0a 20 20 20 20 20 20 20 20 20 20  alse..          
19e20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23  }....          #
19e30 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
19e40 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 64  TE: Attempt to d
19e50 65 6c 65 74 65 20 74 68 65 20 74 65 73 74 20 64  elete the test d
19e60 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 6f 77  atabase file now
19e70 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
19e80 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63            if {[c
19e90 61 74 63 68 20 7b 66 69 6c 65 20 64 65 6c 65 74  atch {file delet
19ea0 65 20 24 66 69 6c 65 4e 61 6d 65 7d 20 65 72 72  e $fileName} err
19eb0 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  or]} then {..   
19ec0 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
19ed0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
19ee0 57 65 20 73 6f 6d 65 68 6f 77 20 66 61 69 6c 65  We somehow faile
19ef0 64 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20  d to delete the 
19f00 66 69 6c 65 2c 20 72 65 70 6f 72 74 20 77 68 79  file, report why
19f10 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  ...            #
19f20 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
19f30 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
19f40 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
19f50 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
19f60 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47     "==== WARNING
19f70 3a 20 66 61 69 6c 65 64 20 74 6f 20 64 65 6c 65  : failed to dele
19f80 74 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  te database file
19f90 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c   \"" $fileName \
19fa0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
19fb0 20 20 22 5c 22 20 64 75 72 69 6e 67 20 63 6c 65    "\" during cle
19fc0 61 6e 75 70 2c 20 65 72 72 6f 72 3a 20 22 20 5c  anup, error: " \
19fd0 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a  n\t $error \n]..
19fe0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65  ..            se
19ff0 74 20 73 75 63 63 65 73 73 20 66 61 6c 73 65 0d  t success false.
1a000 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
1a010 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
1a020 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
1a030 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53         # NOTE: S
1a040 68 6f 77 20 74 68 61 74 20 77 65 20 73 6b 69 70  how that we skip
1a050 70 65 64 20 64 65 6c 65 74 69 6e 67 20 74 68 65  ped deleting the
1a060 20 66 69 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20   file...        
1a070 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 74    #..          t
1a080 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
1a090 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
1a0a0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1a0b0 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a    "==== WARNING:
1a0c0 20 73 6b 69 70 70 65 64 20 64 65 6c 65 74 69 6e   skipped deletin
1a0d0 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  g database file 
1a0e0 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c 0d  \"" $fileName \.
1a0f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
1a100 5c 22 20 64 75 72 69 6e 67 20 63 6c 65 61 6e 75  \" during cleanu
1a110 70 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d  p\n"]..        }
1a120 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
1a130 20 20 20 72 65 74 75 72 6e 20 5b 65 78 70 72 20     return [expr 
1a140 7b 24 73 75 63 63 65 73 73 20 3f 20 30 20 3a 20  {$success ? 0 : 
1a150 31 7d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20  1}]..    }..... 
1a160 20 20 20 70 72 6f 63 20 73 61 76 65 45 6e 76 69     proc saveEnvi
1a170 72 6f 6e 6d 65 6e 74 56 61 72 69 61 62 6c 65 73  ronmentVariables
1a180 20 7b 20 6e 61 6d 65 73 20 7b 76 61 72 4e 61 6d   { names {varNam
1a190 65 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  e ""} } {..     
1a1a0 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
1a1b0 3a 20 46 6f 72 20 65 61 63 68 20 6e 61 6d 65 2c  : For each name,
1a1c0 20 64 6f 65 73 20 74 68 65 20 6c 69 76 65 20 65   does the live e
1a1d0 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61  nvironment varia
1a1e0 62 6c 65 20 65 78 69 73 74 3f 20 20 49 66 0d 0a  ble exist?  If..
1a1f0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73 6f        #       so
1a200 2c 20 73 61 76 65 20 74 68 65 20 76 61 6c 75 65  , save the value
1a210 20 66 6f 72 20 6c 61 74 65 72 3b 20 6f 74 68 65   for later; othe
1a220 72 77 69 73 65 2c 20 6d 61 6b 65 20 73 75 72 65  rwise, make sure
1a230 20 74 68 65 20 73 61 76 65 64 0d 0a 20 20 20 20   the saved..    
1a240 20 20 23 20 20 20 20 20 20 20 76 61 6c 75 65 20    #       value 
1a250 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 20 65  does not exist e
1a260 69 74 68 65 72 2e 20 20 54 68 65 20 6c 69 76 65  ither.  The live
1a270 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72   environment var
1a280 69 61 62 6c 65 73 0d 0a 20 20 20 20 20 20 23 20  iables..      # 
1a290 20 20 20 20 20 20 41 52 45 20 4e 4f 54 20 63 68        ARE NOT ch
1a2a0 61 6e 67 65 64 20 62 79 20 74 68 69 73 20 70 72  anged by this pr
1a2b0 6f 63 65 64 75 72 65 2e 0d 0a 20 20 20 20 20 20  ocedure...      
1a2c0 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74  #..      if {[st
1a2d0 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 61 72  ring length $var
1a2e0 4e 61 6d 65 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  Name] == 0} then
1a2f0 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   {..        set 
1a300 76 61 72 4e 61 6d 65 20 73 61 76 65 64 45 6e 76  varName savedEnv
1a310 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
1a320 20 20 20 75 70 76 61 72 20 31 20 24 76 61 72 4e     upvar 1 $varN
1a330 61 6d 65 20 73 61 76 65 64 45 6e 76 0d 0a 0d 0a  ame savedEnv....
1a340 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 6e 61        foreach na
1a350 6d 65 20 24 6e 61 6d 65 73 20 7b 0d 0a 20 20 20  me $names {..   
1a360 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65       if {[info e
1a370 78 69 73 74 73 20 3a 3a 65 6e 76 28 24 6e 61 6d  xists ::env($nam
1a380 65 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  e)]} then {..   
1a390 20 20 20 20 20 20 20 73 65 74 20 73 61 76 65 64         set saved
1a3a0 45 6e 76 28 24 6e 61 6d 65 29 20 24 3a 3a 65 6e  Env($name) $::en
1a3b0 76 28 24 6e 61 6d 65 29 0d 0a 20 20 20 20 20 20  v($name)..      
1a3c0 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
1a3d0 20 20 20 20 20 20 75 6e 73 65 74 20 2d 6e 6f 63        unset -noc
1a3e0 6f 6d 70 6c 61 69 6e 20 73 61 76 65 64 45 6e 76  omplain savedEnv
1a3f0 28 24 6e 61 6d 65 29 0d 0a 20 20 20 20 20 20 20  ($name)..       
1a400 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20   }..      }.... 
1a410 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
1a420 4e 4f 54 45 3a 20 54 68 69 73 20 69 73 20 73 65  NOTE: This is se
1a430 6c 66 2d 63 6c 65 61 6e 69 6e 67 2e 20 20 49 66  lf-cleaning.  If
1a440 20 6e 6f 20 73 61 76 65 64 20 65 6e 76 69 72 6f   no saved enviro
1a450 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 73 20  nment variables 
1a460 6e 6f 77 0d 0a 20 20 20 20 20 20 23 20 20 20 20  now..      #    
1a470 20 20 20 65 78 69 73 74 2c 20 72 65 6d 6f 76 65     exist, remove
1a480 20 74 68 65 20 61 72 72 61 79 2e 0d 0a 20 20 20   the array...   
1a490 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
1a4a0 5b 61 72 72 61 79 20 73 69 7a 65 20 73 61 76 65  [array size save
1a4b0 64 45 6e 76 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  dEnv] == 0} then
1a4c0 20 7b 0d 0a 20 20 20 20 20 20 20 20 75 6e 73 65   {..        unse
1a4d0 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 73 61  t -nocomplain sa
1a4e0 76 65 64 45 6e 76 0d 0a 20 20 20 20 20 20 7d 0d  vedEnv..      }.
1a4f0 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
1a500 72 6f 63 20 72 65 73 74 6f 72 65 45 6e 76 69 72  roc restoreEnvir
1a510 6f 6e 6d 65 6e 74 56 61 72 69 61 62 6c 65 73 20  onmentVariables 
1a520 7b 20 6e 61 6d 65 73 20 7b 76 61 72 4e 61 6d 65  { names {varName
1a530 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20   ""} } {..      
1a540 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
1a550 20 46 6f 72 20 65 61 63 68 20 6e 61 6d 65 2c 20   For each name, 
1a560 64 6f 65 73 20 74 68 65 20 73 61 76 65 64 20 65  does the saved e
1a570 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61  nvironment varia
1a580 62 6c 65 20 65 78 69 73 74 3f 20 20 49 66 0d 0a  ble exist?  If..
1a590 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73 6f        #       so
1a5a0 2c 20 72 65 73 74 6f 72 65 20 74 68 65 20 73 61  , restore the sa
1a5b0 76 65 64 20 76 61 6c 75 65 20 61 6e 64 20 75 6e  ved value and un
1a5c0 73 65 74 20 69 74 3b 20 6f 74 68 65 72 77 69 73  set it; otherwis
1a5d0 65 2c 20 6d 61 6b 65 20 73 75 72 65 0d 0a 20 20  e, make sure..  
1a5e0 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20      #       the 
1a5f0 6c 69 76 65 20 65 6e 76 69 72 6f 6e 6d 65 6e 74  live environment
1a600 20 76 61 72 69 61 62 6c 65 20 64 6f 65 73 20 6e   variable does n
1a610 6f 74 20 65 78 69 73 74 20 65 69 74 68 65 72 20  ot exist either 
1a620 28 69 2e 65 2e 20 69 74 0d 0a 20 20 20 20 20 20  (i.e. it..      
1a630 23 20 20 20 20 20 20 20 77 61 73 20 6e 6f 74 20  #       was not 
1a640 73 65 74 20 74 6f 20 62 65 67 69 6e 20 77 69 74  set to begin wit
1a650 68 29 2e 20 20 42 6f 74 68 20 73 61 76 65 64 20  h).  Both saved 
1a660 61 6e 64 20 6c 69 76 65 20 65 6e 76 69 72 6f 6e  and live environ
1a670 6d 65 6e 74 0d 0a 20 20 20 20 20 20 23 20 20 20  ment..      #   
1a680 20 20 20 20 76 61 72 69 61 62 6c 65 73 20 41 52      variables AR
1a690 45 20 63 68 61 6e 67 65 64 20 62 79 20 74 68 69  E changed by thi
1a6a0 73 20 70 72 6f 63 65 64 75 72 65 2e 0d 0a 20 20  s procedure...  
1a6b0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
1a6c0 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
1a6d0 24 76 61 72 4e 61 6d 65 5d 20 3d 3d 20 30 7d 20  $varName] == 0} 
1a6e0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1a6f0 73 65 74 20 76 61 72 4e 61 6d 65 20 73 61 76 65  set varName save
1a700 64 45 6e 76 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  dEnv..      }...
1a710 0a 20 20 20 20 20 20 75 70 76 61 72 20 31 20 24  .      upvar 1 $
1a720 76 61 72 4e 61 6d 65 20 73 61 76 65 64 45 6e 76  varName savedEnv
1a730 0d 0a 0d 0a 20 20 20 20 20 20 66 6f 72 65 61 63  ....      foreac
1a740 68 20 6e 61 6d 65 20 24 6e 61 6d 65 73 20 7b 0d  h name $names {.
1a750 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69 6e  .        if {[in
1a760 66 6f 20 65 78 69 73 74 73 20 73 61 76 65 64 45  fo exists savedE
1a770 6e 76 28 24 6e 61 6d 65 29 5d 7d 20 74 68 65 6e  nv($name)]} then
1a780 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   {..          se
1a790 74 20 3a 3a 65 6e 76 28 24 6e 61 6d 65 29 20 24  t ::env($name) $
1a7a0 73 61 76 65 64 45 6e 76 28 24 6e 61 6d 65 29 0d  savedEnv($name).
1a7b0 0a 20 20 20 20 20 20 20 20 20 20 75 6e 73 65 74  .          unset
1a7c0 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 73 61 76   -nocomplain sav
1a7d0 65 64 45 6e 76 28 24 6e 61 6d 65 29 0d 0a 20 20  edEnv($name)..  
1a7e0 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
1a7f0 20 20 20 20 20 20 20 20 20 20 75 6e 73 65 74 20            unset 
1a800 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 3a 3a 65 6e  -nocomplain ::en
1a810 76 28 24 6e 61 6d 65 29 0d 0a 20 20 20 20 20 20  v($name)..      
1a820 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a    }..      }....
1a830 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
1a840 20 4e 4f 54 45 3a 20 54 68 69 73 20 69 73 20 73   NOTE: This is s
1a850 65 6c 66 2d 63 6c 65 61 6e 69 6e 67 2e 20 20 49  elf-cleaning.  I
1a860 66 20 6e 6f 20 73 61 76 65 64 20 65 6e 76 69 72  f no saved envir
1a870 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 73  onment variables
1a880 20 6e 6f 77 0d 0a 20 20 20 20 20 20 23 20 20 20   now..      #   
1a890 20 20 20 20 65 78 69 73 74 2c 20 72 65 6d 6f 76      exist, remov
1a8a0 65 20 74 68 65 20 61 72 72 61 79 2e 0d 0a 20 20  e the array...  
1a8b0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
1a8c0 7b 5b 61 72 72 61 79 20 73 69 7a 65 20 73 61 76  {[array size sav
1a8d0 65 64 45 6e 76 5d 20 3d 3d 20 30 7d 20 74 68 65  edEnv] == 0} the
1a8e0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 75 6e 73  n {..        uns
1a8f0 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 73  et -nocomplain s
1a900 61 76 65 64 45 6e 76 0d 0a 20 20 20 20 20 20 7d  avedEnv..      }
1a910 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
1a920 70 72 6f 63 20 73 61 76 65 45 61 67 6c 65 53 68  proc saveEagleSh
1a930 65 6c 6c 45 6e 76 69 72 6f 6e 6d 65 6e 74 20 7b  ellEnvironment {
1a940 7d 20 7b 0d 0a 20 20 20 20 20 20 75 70 76 61 72  } {..      upvar
1a950 20 31 20 73 61 76 65 64 45 6e 76 20 73 61 76 65   1 savedEnv save
1a960 64 45 6e 76 0d 0a 0d 0a 20 20 20 20 20 20 73 61  dEnv....      sa
1a970 76 65 45 6e 76 69 72 6f 6e 6d 65 6e 74 56 61 72  veEnvironmentVar
1a980 69 61 62 6c 65 73 20 5b 6c 69 73 74 20 4e 6f 4d  iables [list NoM
1a990 75 74 65 78 65 73 5d 20 73 61 76 65 64 45 6e 76  utexes] savedEnv
1a9a0 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
1a9b0 70 72 6f 63 20 72 65 73 74 6f 72 65 45 61 67 6c  proc restoreEagl
1a9c0 65 53 68 65 6c 6c 45 6e 76 69 72 6f 6e 6d 65 6e  eShellEnvironmen
1a9d0 74 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 75 70  t {} {..      up
1a9e0 76 61 72 20 31 20 73 61 76 65 64 45 6e 76 20 73  var 1 savedEnv s
1a9f0 61 76 65 64 45 6e 76 0d 0a 0d 0a 20 20 20 20 20  avedEnv....     
1aa00 20 72 65 73 74 6f 72 65 45 6e 76 69 72 6f 6e 6d   restoreEnvironm
1aa10 65 6e 74 56 61 72 69 61 62 6c 65 73 20 5b 6c 69  entVariables [li
1aa20 73 74 20 4e 6f 4d 75 74 65 78 65 73 5d 20 73 61  st NoMutexes] sa
1aa30 76 65 64 45 6e 76 0d 0a 20 20 20 20 7d 0d 0a 0c  vedEnv..    }...
1aa40 0d 0a 20 20 20 20 70 72 6f 63 20 73 61 76 65 4d  ..    proc saveM
1aa50 64 61 43 6f 6e 66 69 67 45 6e 76 69 72 6f 6e 6d  daConfigEnvironm
1aa60 65 6e 74 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20  ent {} {..      
1aa70 75 70 76 61 72 20 31 20 73 61 76 65 64 45 6e 76  upvar 1 savedEnv
1aa80 20 73 61 76 65 64 45 6e 76 0d 0a 0d 0a 20 20 20   savedEnv....   
1aa90 20 20 20 73 61 76 65 45 6e 76 69 72 6f 6e 6d 65     saveEnvironme
1aaa0 6e 74 56 61 72 69 61 62 6c 65 73 20 5b 6c 69 73  ntVariables [lis
1aab0 74 20 43 4f 4d 50 4c 55 53 5f 4d 44 41 5d 20 73  t COMPLUS_MDA] s
1aac0 61 76 65 64 45 6e 76 0d 0a 20 20 20 20 7d 0d 0a  avedEnv..    }..
1aad0 0c 0d 0a 20 20 20 20 70 72 6f 63 20 72 65 73 74  ...    proc rest
1aae0 6f 72 65 4d 64 61 43 6f 6e 66 69 67 45 6e 76 69  oreMdaConfigEnvi
1aaf0 72 6f 6e 6d 65 6e 74 20 7b 7d 20 7b 0d 0a 20 20  ronment {} {..  
1ab00 20 20 20 20 75 70 76 61 72 20 31 20 73 61 76 65      upvar 1 save
1ab10 64 45 6e 76 20 73 61 76 65 64 45 6e 76 0d 0a 0d  dEnv savedEnv...
1ab20 0a 20 20 20 20 20 20 72 65 73 74 6f 72 65 45 6e  .      restoreEn
1ab30 76 69 72 6f 6e 6d 65 6e 74 56 61 72 69 61 62 6c  vironmentVariabl
1ab40 65 73 20 5b 6c 69 73 74 20 43 4f 4d 50 4c 55 53  es [list COMPLUS
1ab50 5f 4d 44 41 5d 20 73 61 76 65 64 45 6e 76 0d 0a  _MDA] savedEnv..
1ab60 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
1ab70 6f 63 20 73 61 76 65 47 65 74 53 65 74 74 69 6e  oc saveGetSettin
1ab80 67 56 61 6c 75 65 45 6e 76 69 72 6f 6e 6d 65 6e  gValueEnvironmen
1ab90 74 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 75 70  t {} {..      up
1aba0 76 61 72 20 31 20 73 61 76 65 64 45 6e 76 20 73  var 1 savedEnv s
1abb0 61 76 65 64 45 6e 76 0d 0a 0d 0a 20 20 20 20 20  avedEnv....     
1abc0 20 73 61 76 65 45 6e 76 69 72 6f 6e 6d 65 6e 74   saveEnvironment
1abd0 56 61 72 69 61 62 6c 65 73 20 5b 6c 69 73 74 20  Variables [list 
1abe0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 4e 6f 5f  \..          No_
1abf0 45 78 70 61 6e 64 20 4e 6f 5f 53 51 4c 69 74 65  Expand No_SQLite
1ac00 47 65 74 53 65 74 74 69 6e 67 56 61 6c 75 65 20  GetSettingValue 
1ac10 4e 6f 5f 53 51 4c 69 74 65 58 6d 6c 43 6f 6e 66  No_SQLiteXmlConf
1ac20 69 67 46 69 6c 65 5d 20 5c 0d 0a 20 20 20 20 20  igFile] \..     
1ac30 20 20 20 20 20 73 61 76 65 64 45 6e 76 0d 0a 20       savedEnv.. 
1ac40 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
1ac50 63 20 72 65 73 74 6f 72 65 47 65 74 53 65 74 74  c restoreGetSett
1ac60 69 6e 67 56 61 6c 75 65 45 6e 76 69 72 6f 6e 6d  ingValueEnvironm
1ac70 65 6e 74 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20  ent {} {..      
1ac80 75 70 76 61 72 20 31 20 73 61 76 65 64 45 6e 76  upvar 1 savedEnv
1ac90 20 73 61 76 65 64 45 6e 76 0d 0a 0d 0a 20 20 20   savedEnv....   
1aca0 20 20 20 72 65 73 74 6f 72 65 45 6e 76 69 72 6f     restoreEnviro
1acb0 6e 6d 65 6e 74 56 61 72 69 61 62 6c 65 73 20 5b  nmentVariables [
1acc0 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20  list \..        
1acd0 20 20 4e 6f 5f 45 78 70 61 6e 64 20 4e 6f 5f 53    No_Expand No_S
1ace0 51 4c 69 74 65 47 65 74 53 65 74 74 69 6e 67 56  QLiteGetSettingV
1acf0 61 6c 75 65 20 4e 6f 5f 53 51 4c 69 74 65 58 6d  alue No_SQLiteXm
1ad00 6c 43 6f 6e 66 69 67 46 69 6c 65 5d 20 5c 0d 0a  lConfigFile] \..
1ad10 20 20 20 20 20 20 20 20 20 20 73 61 76 65 64 45            savedE
1ad20 6e 76 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  nv..    }.....  
1ad30 20 20 70 72 6f 63 20 73 61 76 65 53 51 4c 69 74    proc saveSQLit
1ad40 65 43 6f 6e 6e 65 63 74 69 6f 6e 45 6e 76 69 72  eConnectionEnvir
1ad50 6f 6e 6d 65 6e 74 20 7b 7d 20 7b 0d 0a 20 20 20  onment {} {..   
1ad60 20 20 20 75 70 76 61 72 20 31 20 73 61 76 65 64     upvar 1 saved
1ad70 45 6e 76 20 73 61 76 65 64 45 6e 76 0d 0a 0d 0a  Env savedEnv....
1ad80 20 20 20 20 20 20 73 61 76 65 45 6e 76 69 72 6f        saveEnviro
1ad90 6e 6d 65 6e 74 56 61 72 69 61 62 6c 65 73 20 5b  nmentVariables [
1ada0 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20  list \..        
1adb0 20 20 44 65 66 61 75 6c 74 46 6c 61 67 73 5f 53    DefaultFlags_S
1adc0 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 20  QLiteConnection 
1add0 4e 6f 5f 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74  No_SQLiteConnect
1ade0 69 6f 6e 4e 65 77 50 61 72 73 65 72 5d 20 5c 0d  ionNewParser] \.
1adf0 0a 20 20 20 20 20 20 20 20 20 20 73 61 76 65 64  .          saved
1ae00 45 6e 76 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20  Env..    }..... 
1ae10 20 20 20 70 72 6f 63 20 72 65 73 74 6f 72 65 53     proc restoreS
1ae20 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 45  QLiteConnectionE
1ae30 6e 76 69 72 6f 6e 6d 65 6e 74 20 7b 7d 20 7b 0d  nvironment {} {.
1ae40 0a 20 20 20 20 20 20 75 70 76 61 72 20 31 20 73  .      upvar 1 s
1ae50 61 76 65 64 45 6e 76 20 73 61 76 65 64 45 6e 76  avedEnv savedEnv
1ae60 0d 0a 0d 0a 20 20 20 20 20 20 72 65 73 74 6f 72  ....      restor
1ae70 65 45 6e 76 69 72 6f 6e 6d 65 6e 74 56 61 72 69  eEnvironmentVari
1ae80 61 62 6c 65 73 20 5b 6c 69 73 74 20 5c 0d 0a 20  ables [list \.. 
1ae90 20 20 20 20 20 20 20 20 20 44 65 66 61 75 6c 74           Default
1aea0 46 6c 61 67 73 5f 53 51 4c 69 74 65 43 6f 6e 6e  Flags_SQLiteConn
1aeb0 65 63 74 69 6f 6e 20 4e 6f 5f 53 51 4c 69 74 65  ection No_SQLite
1aec0 43 6f 6e 6e 65 63 74 69 6f 6e 4e 65 77 50 61 72  ConnectionNewPar
1aed0 73 65 72 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20  ser] \..        
1aee0 20 20 73 61 76 65 64 45 6e 76 0d 0a 20 20 20 20    savedEnv..    
1aef0 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 73  }.....    proc s
1af00 61 76 65 53 51 4c 69 74 65 43 6f 6e 76 65 72 74  aveSQLiteConvert
1af10 45 6e 76 69 72 6f 6e 6d 65 6e 74 20 7b 7d 20 7b  Environment {} {
1af20 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20 31 20  ..      upvar 1 
1af30 73 61 76 65 64 45 6e 76 20 73 61 76 65 64 45 6e  savedEnv savedEn
1af40 76 0d 0a 0d 0a 20 20 20 20 20 20 73 61 76 65 45  v....      saveE
1af50 6e 76 69 72 6f 6e 6d 65 6e 74 56 61 72 69 61 62  nvironmentVariab
1af60 6c 65 73 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20  les [list \..   
1af70 20 20 20 20 20 20 20 55 73 65 5f 53 51 4c 69 74         Use_SQLit
1af80 65 43 6f 6e 76 65 72 74 5f 44 65 66 61 75 6c 74  eConvert_Default
1af90 44 62 54 79 70 65 20 55 73 65 5f 53 51 4c 69 74  DbType Use_SQLit
1afa0 65 43 6f 6e 76 65 72 74 5f 44 65 66 61 75 6c 74  eConvert_Default
1afb0 54 79 70 65 4e 61 6d 65 5d 20 5c 0d 0a 20 20 20  TypeName] \..   
1afc0 20 20 20 20 20 20 20 73 61 76 65 64 45 6e 76 0d         savedEnv.
1afd0 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
1afe0 72 6f 63 20 72 65 73 74 6f 72 65 53 51 4c 69 74  roc restoreSQLit
1aff0 65 43 6f 6e 76 65 72 74 45 6e 76 69 72 6f 6e 6d  eConvertEnvironm
1b000 65 6e 74 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20  ent {} {..      
1b010 75 70 76 61 72 20 31 20 73 61 76 65 64 45 6e 76  upvar 1 savedEnv
1b020 20 73 61 76 65 64 45 6e 76 0d 0a 0d 0a 20 20 20   savedEnv....   
1b030 20 20 20 72 65 73 74 6f 72 65 45 6e 76 69 72 6f     restoreEnviro
1b040 6e 6d 65 6e 74 56 61 72 69 61 62 6c 65 73 20 5b  nmentVariables [
1b050 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20  list \..        
1b060 20 20 55 73 65 5f 53 51 4c 69 74 65 43 6f 6e 76    Use_SQLiteConv
1b070 65 72 74 5f 44 65 66 61 75 6c 74 44 62 54 79 70  ert_DefaultDbTyp
1b080 65 20 55 73 65 5f 53 51 4c 69 74 65 43 6f 6e 76  e Use_SQLiteConv
1b090 65 72 74 5f 44 65 66 61 75 6c 74 54 79 70 65 4e  ert_DefaultTypeN
1b0a0 61 6d 65 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20  ame] \..        
1b0b0 20 20 73 61 76 65 64 45 6e 76 0d 0a 20 20 20 20    savedEnv..    
1b0c0 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 73  }.....    proc s
1b0d0 65 74 75 70 44 62 49 6e 74 65 72 72 75 70 74 43  etupDbInterruptC
1b0e0 61 6c 6c 62 61 63 6b 20 7b 20 63 68 61 6e 6e 65  allback { channe
1b0f0 6c 20 6c 6f 67 20 7d 20 7b 0d 0a 20 20 20 20 20  l log } {..     
1b100 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
1b110 22 2d 2d 2d 2d 20 73 65 74 74 69 6e 67 20 75 70  "---- setting up
1b120 20 64 65 62 75 67 67 65 72 20 69 6e 74 65 72 72   debugger interr
1b130 75 70 74 20 63 61 6c 6c 62 61 63 6b 2e 2e 2e 20  upt callback... 
1b140 22 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  "....      if {[
1b150 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
1b160 20 73 61 76 65 45 6e 76 69 72 6f 6e 6d 65 6e 74   saveEnvironment
1b170 56 61 72 69 61 62 6c 65 73 20 5b 6c 69 73 74 20  Variables [list 
1b180 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 71  \..            q
1b190 75 69 65 74 46 69 6e 64 49 6e 74 65 72 70 72 65  uietFindInterpre
1b1a0 74 65 72 54 65 73 74 50 61 74 68 20 71 75 69 65  terTestPath quie
1b1b0 74 53 65 74 75 70 49 6e 74 65 72 70 72 65 74 65  tSetupInterprete
1b1c0 72 54 65 73 74 50 61 74 68 5d 0d 0a 0d 0a 20 20  rTestPath]....  
1b1d0 20 20 20 20 20 20 74 72 79 20 7b 0d 0a 20 20 20        try {..   
1b1e0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1b1f0 20 20 20 20 23 20 4e 4f 54 45 3a 20 50 72 65 76      # NOTE: Prev
1b200 65 6e 74 20 74 68 65 20 76 65 6e 64 6f 72 20 73  ent the vendor s
1b210 63 72 69 70 74 20 66 72 6f 6d 20 62 65 69 6e 67  cript from being
1b220 20 6e 6f 69 73 79 20 77 68 65 6e 20 63 72 65 61   noisy when crea
1b230 74 69 6e 67 0d 0a 20 20 20 20 20 20 20 20 20 20  ting..          
1b240 23 20 20 20 20 20 20 20 74 68 65 20 69 73 6f 6c  #       the isol
1b250 61 74 65 64 20 69 6e 74 65 72 70 72 65 74 65 72  ated interpreter
1b260 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
1b270 20 20 20 20 20 20 20 20 20 20 73 65 74 20 3a 3a            set ::
1b280 65 6e 76 28 71 75 69 65 74 46 69 6e 64 49 6e 74  env(quietFindInt
1b290 65 72 70 72 65 74 65 72 54 65 73 74 50 61 74 68  erpreterTestPath
1b2a0 29 20 31 0d 0a 20 20 20 20 20 20 20 20 20 20 73  ) 1..          s
1b2b0 65 74 20 3a 3a 65 6e 76 28 71 75 69 65 74 53 65  et ::env(quietSe
1b2c0 74 75 70 49 6e 74 65 72 70 72 65 74 65 72 54 65  tupInterpreterTe
1b2d0 73 74 50 61 74 68 29 20 31 0d 0a 0d 0a 20 20 20  stPath) 1....   
1b2e0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1b2f0 20 20 20 20 23 20 4e 4f 54 45 3a 20 4d 61 6b 65      # NOTE: Make
1b300 20 73 75 72 65 20 74 68 65 20 73 63 72 69 70 74   sure the script
1b310 20 64 65 62 75 67 67 65 72 20 61 6e 64 20 74 68   debugger and th
1b320 65 20 69 73 6f 6c 61 74 65 64 20 69 6e 74 65 72  e isolated inter
1b330 70 72 65 74 65 72 0d 0a 20 20 20 20 20 20 20 20  preter..        
1b340 20 20 23 20 20 20 20 20 20 20 61 72 65 20 73 65    #       are se
1b350 74 75 70 20 61 6e 64 20 72 65 61 64 79 20 66 6f  tup and ready fo
1b360 72 20 75 73 65 2e 0d 0a 20 20 20 20 20 20 20 20  r use...        
1b370 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 64    #..          d
1b380 65 62 75 67 20 73 65 74 75 70 20 74 72 75 65 20  ebug setup true 
1b390 74 72 75 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20  true....        
1b3a0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23    #..          #
1b3b0 20 4e 4f 54 45 3a 20 4c 6f 61 64 20 74 68 65 20   NOTE: Load the 
1b3c0 6e 65 63 65 73 73 61 72 79 20 70 61 63 6b 61 67  necessary packag
1b3d0 65 73 20 69 6e 74 6f 20 74 68 65 20 69 73 6f 6c  es into the isol
1b3e0 61 74 65 64 20 69 6e 74 65 72 70 72 65 74 65 72  ated interpreter
1b3f0 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
1b400 20 20 20 20 20 20 20 20 20 20 64 65 62 75 67 20            debug 
1b410 65 76 61 6c 20 7b 0d 0a 20 20 20 20 20 20 20 20  eval {..        
1b420 20 20 20 20 70 61 63 6b 61 67 65 20 72 65 71 75      package requ
1b430 69 72 65 20 45 61 67 6c 65 0d 0a 20 20 20 20 20  ire Eagle..     
1b440 20 20 20 20 20 20 20 70 61 63 6b 61 67 65 20 72         package r
1b450 65 71 75 69 72 65 20 45 61 67 6c 65 2e 4c 69 62  equire Eagle.Lib
1b460 72 61 72 79 0d 0a 20 20 20 20 20 20 20 20 20 20  rary..          
1b470 20 20 70 61 63 6b 61 67 65 20 72 65 71 75 69 72    package requir
1b480 65 20 45 61 67 6c 65 2e 54 65 73 74 0d 0a 20 20  e Eagle.Test..  
1b490 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
1b4a0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1b4b0 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 6f 70 79      # NOTE: Copy
1b4c0 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 76   the necessary v
1b4d0 61 72 69 61 62 6c 65 73 20 69 6e 74 6f 20 74 68  ariables into th
1b4e0 65 20 69 73 6f 6c 61 74 65 64 20 69 6e 74 65 72  e isolated inter
1b4f0 70 72 65 74 65 72 2e 0d 0a 20 20 20 20 20 20 20  preter...       
1b500 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
1b510 64 65 62 75 67 20 69 6e 76 6f 6b 65 20 30 20 73  debug invoke 0 s
1b520 65 74 20 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  et ::test_channe
1b530 6c 20 24 63 68 61 6e 6e 65 6c 3b 20 23 20 4e 4f  l $channel; # NO
1b540 54 45 3a 20 46 6f 72 20 5b 74 70 75 74 73 5d 2e  TE: For [tputs].
1b550 0d 0a 20 20 20 20 20 20 20 20 20 20 64 65 62 75  ..          debu
1b560 67 20 69 6e 76 6f 6b 65 20 30 20 73 65 74 20 3a  g invoke 0 set :
1b570 3a 74 65 73 74 5f 6c 6f 67 20 24 6c 6f 67 3b 20  :test_log $log; 
1b580 23 20 4e 4f 54 45 3a 20 46 6f 72 20 5b 74 6c 6f  # NOTE: For [tlo
1b590 67 5d 2e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  g].....         
1b5a0 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
1b5b0 4e 4f 54 45 3a 20 49 6e 73 74 61 6c 6c 20 74 68  NOTE: Install th
1b5c0 65 20 63 61 6c 6c 62 61 63 6b 20 73 63 72 69 70  e callback scrip
1b5d0 74 20 74 6f 20 62 65 20 65 76 61 6c 75 61 74 65  t to be evaluate
1b5e0 64 20 69 6e 20 74 68 65 20 69 73 6f 6c 61 74 65  d in the isolate
1b5f0 64 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20  d..          #  
1b600 20 20 20 20 20 69 6e 74 65 72 70 72 65 74 65 72       interpreter
1b610 20 77 68 65 6e 20 74 68 69 73 20 69 6e 74 65 72   when this inter
1b620 70 72 65 74 65 72 20 69 73 20 69 6e 74 65 72 72  preter is interr
1b630 75 70 74 65 64 20 62 79 20 73 63 72 69 70 74 0d  upted by script.
1b640 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20  .          #    
1b650 20 20 20 63 61 6e 63 65 6c 6c 61 74 69 6f 6e 2c     cancellation,
1b660 20 65 74 63 2e 0d 0a 20 20 20 20 20 20 20 20 20   etc...         
1b670 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 64 65   #..          de
1b680 62 75 67 20 63 61 6c 6c 62 61 63 6b 20 61 70 70  bug callback app
1b690 6c 79 20 7b 7b 73 65 6e 64 65 72 20 65 7d 20 7b  ly {{sender e} {
1b6a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d  ..            #.
1b6b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e  .            # N
1b6c0 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20 74 68  OTE: Check if th
1b6d0 69 73 20 64 65 62 75 67 67 65 72 20 63 61 6c 6c  is debugger call
1b6e0 62 61 63 6b 20 69 73 20 6f 6e 65 20 74 68 61 74  back is one that
1b6f0 20 77 65 20 63 61 72 65 20 61 62 6f 75 74 2e 0d   we care about..
1b700 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a  .            #..
1b710 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
1b720 69 6e 74 65 72 72 75 70 74 54 79 70 65 73 20 5b  interruptTypes [
1b730 73 70 6c 69 74 20 5b 24 65 20 49 6e 74 65 72 72  split [$e Interr
1b740 75 70 74 54 79 70 65 5d 20 22 2c 20 22 5d 0d 0a  uptType] ", "]..
1b750 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
1b760 20 7b 22 43 61 6e 63 65 6c 65 64 22 20 69 6e 20   {"Canceled" in 
1b770 24 69 6e 74 65 72 72 75 70 74 54 79 70 65 73 20  $interruptTypes 
1b780 7c 7c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  || \..          
1b790 20 20 20 20 20 20 22 55 6e 77 6f 75 6e 64 22 20        "Unwound" 
1b7a0 69 6e 20 24 69 6e 74 65 72 72 75 70 74 54 79 70  in $interruptTyp
1b7b0 65 73 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  es} then {..    
1b7c0 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
1b7d0 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
1b7e0 45 3a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  E: Make sure the
1b7f0 20 5b 6f 62 6a 65 63 74 5d 20 63 6f 6d 6d 61 6e   [object] comman
1b800 64 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 20  d is available. 
1b810 20 53 69 6e 63 65 0d 0a 20 20 20 20 20 20 20 20   Since..        
1b820 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68        #       th
1b830 69 73 20 69 73 20 61 6e 20 69 73 6f 6c 61 74 65  is is an isolate
1b840 64 20 69 6e 74 65 72 70 72 65 74 65 72 2c 20 63  d interpreter, c
1b850 68 65 63 6b 20 66 6f 72 20 69 74 20 74 68 65 20  heck for it the 
1b860 68 61 72 64 0d 0a 20 20 20 20 20 20 20 20 20 20  hard..          
1b870 20 20 20 20 23 20 20 20 20 20 20 20 77 61 79 2e      #       way.
1b880 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1b890 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  #..             
1b8a0 20 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 5b 69   if {[llength [i
1b8b0 6e 66 6f 20 63 6f 6d 6d 61 6e 64 73 20 6f 62 6a  nfo commands obj
1b8c0 65 63 74 5d 5d 20 3e 20 30 7d 20 74 68 65 6e 20  ect]] > 0} then 
1b8d0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
1b8e0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
1b8f0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 74        # NOTE: It
1b900 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 61 6c  erate through al
1b910 6c 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  l database conne
1b920 63 74 69 6f 6e 73 20 6b 6e 6f 77 6e 20 74 6f 20  ctions known to 
1b930 74 68 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  the..           
1b940 20 20 20 20 20 23 20 20 20 20 20 20 20 70 61 72       #       par
1b950 65 6e 74 20 69 6e 74 65 72 70 72 65 74 65 72 2e  ent interpreter.
1b960 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1b970 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
1b980 20 20 20 20 20 6f 62 6a 65 63 74 20 66 6f 72 65       object fore
1b990 61 63 68 20 2d 61 6c 69 61 73 20 70 61 69 72 20  ach -alias pair 
1b9a0 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d  [object invoke -
1b9b0 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63  flags +NonPublic
1b9c0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1b9d0 20 20 20 20 20 20 20 20 24 65 20 49 6e 74 65 72          $e Inter
1b9e0 70 72 65 74 65 72 2e 63 6f 6e 6e 65 63 74 69 6f  preter.connectio
1b9f0 6e 73 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  ns] {..         
1ba00 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
1ba10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
1ba20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f  NOTE: Attempt to
1ba30 20 63 61 6e 63 65 6c 20 61 6e 79 20 53 51 4c 20   cancel any SQL 
1ba40 71 75 65 72 69 65 73 20 69 6e 20 70 72 6f 67 72  queries in progr
1ba50 65 73 73 20 6f 6e 0d 0a 20 20 20 20 20 20 20 20  ess on..        
1ba60 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
1ba70 20 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20    this database 
1ba80 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0d 0a 20 20 20  connection...   
1ba90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
1baa0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1bab0 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
1bac0 24 70 61 69 72 20 56 61 6c 75 65 2e 43 61 6e 63  $pair Value.Canc
1bad0 65 6c 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e  el} error]} then
1bae0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1baf0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
1bb00 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
1bb10 70 70 65 6e 64 41 72 67 73 20 5c 6e 20 5c 0d 0a  ppendArgs \n \..
1bb20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb30 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41          "==== WA
1bb40 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f  RNING: failed to
1bb50 20 63 61 6e 63 65 6c 20 71 75 65 72 79 20 66 6f   cancel query fo
1bb60 72 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  r " \..         
1bb70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1bb80 63 6f 6e 6e 65 63 74 69 6f 6e 20 5c 22 22 20 5b  connection \"" [
1bb90 24 70 61 69 72 20 4b 65 79 5d 20 22 5c 22 2c 20  $pair Key] "\", 
1bba0 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 5c 0d  error: " \n\t \.
1bbb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1bbc0 20 20 20 20 20 20 20 20 20 24 65 72 72 6f 72 20           $error 
1bbd0 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  \n]..           
1bbe0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1bbf0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
1bc00 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73             } els
1bc10 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e {..           
1bc20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
1bc30 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
1bc40 6e 64 41 72 67 73 20 5c 6e 20 5c 0d 0a 20 20 20  ndArgs \n \..   
1bc50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc60 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20   "==== WARNING: 
1bc70 63 61 6e 6e 6f 74 20 63 61 6e 63 65 6c 20 61 6e  cannot cancel an
1bc80 79 20 71 75 65 72 69 65 73 3a 20 22 20 5c 0d 0a  y queries: " \..
1bc90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bca0 20 20 20 20 22 74 68 65 20 5c 22 6f 62 6a 65 63      "the \"objec
1bcb0 74 5c 22 20 63 6f 6d 6d 61 6e 64 20 69 73 20 6e  t\" command is n
1bcc0 6f 74 20 61 76 61 69 6c 61 62 6c 65 5c 6e 22 5d  ot available\n"]
1bcd0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1bce0 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  }..            }
1bcf0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 7d 0d 0a  ..          }}..
1bd00 20 20 20 20 20 20 20 20 7d 20 66 69 6e 61 6c 6c          } finall
1bd10 79 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 72  y {..          r
1bd20 65 73 74 6f 72 65 45 6e 76 69 72 6f 6e 6d 65 6e  estoreEnvironmen
1bd30 74 56 61 72 69 61 62 6c 65 73 20 5b 6c 69 73 74  tVariables [list
1bd40 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1bd50 20 20 71 75 69 65 74 46 69 6e 64 49 6e 74 65 72    quietFindInter
1bd60 70 72 65 74 65 72 54 65 73 74 50 61 74 68 20 71  preterTestPath q
1bd70 75 69 65 74 53 65 74 75 70 49 6e 74 65 72 70 72  uietSetupInterpr
1bd80 65 74 65 72 54 65 73 74 50 61 74 68 5d 0d 0a 20  eterTestPath].. 
1bd90 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1bda0 7d 20 65 72 72 6f 72 5d 20 3d 3d 20 30 7d 20 74  } error] == 0} t
1bdb0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 61  hen {..        a
1bdc0 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 69 6e 74  ddConstraint int
1bdd0 65 72 72 75 70 74 43 61 6c 6c 62 61 63 6b 2e 73  erruptCallback.s
1bde0 71 6c 69 74 65 33 0d 0a 0d 0a 20 20 20 20 20 20  qlite3....      
1bdf0 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
1be00 20 79 65 73 5c 6e 0d 0a 20 20 20 20 20 20 7d 20   yes\n..      } 
1be10 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
1be20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
1be30 61 70 70 65 6e 64 41 72 67 73 20 22 6e 6f 2c 20  appendArgs "no, 
1be40 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65  error: " \n\t $e
1be50 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  rror \n]..      
1be60 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
1be70 20 70 72 6f 63 20 63 6c 65 61 6e 75 70 46 69 6c   proc cleanupFil
1be80 65 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7b 63 6f  e { fileName {co
1be90 6c 6c 65 63 74 20 74 72 75 65 7d 20 7b 66 6f 72  llect true} {for
1bea0 63 65 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20  ce false} } {.. 
1beb0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
1bec0 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f  NOTE: Attempt to
1bed0 20 66 6f 72 63 65 20 61 6c 6c 20 70 65 6e 64 69   force all pendi
1bee0 6e 67 20 22 67 61 72 62 61 67 65 22 20 6f 62 6a  ng "garbage" obj
1bef0 65 63 74 73 20 74 6f 20 62 65 20 63 6f 6c 6c 65  ects to be colle
1bf00 63 74 65 64 2c 0d 0a 20 20 20 20 20 20 23 20 20  cted,..      #  
1bf10 20 20 20 20 20 69 6e 63 6c 75 64 69 6e 67 20 53       including S
1bf20 51 4c 69 74 65 20 73 74 61 74 65 6d 65 6e 74 73  QLite statements
1bf30 20 61 6e 64 20 62 61 63 6b 75 70 20 6f 62 6a 65   and backup obje
1bf40 63 74 73 3b 20 74 68 69 73 20 73 68 6f 75 6c 64  cts; this should
1bf50 20 61 6c 6c 6f 77 0d 0a 20 20 20 20 20 20 23 20   allow..      # 
1bf60 20 20 20 20 20 20 74 68 65 20 75 6e 64 65 72 6c        the underl
1bf70 79 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69  ying database fi
1bf80 6c 65 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64  le to be deleted
1bf90 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
1bfa0 20 20 69 66 20 7b 24 63 6f 6c 6c 65 63 74 7d 20    if {$collect} 
1bfb0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1bfc0 63 6f 6c 6c 65 63 74 47 61 72 62 61 67 65 20 24  collectGarbage $
1bfd0 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a  ::test_channel..
1bfe0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
1bff0 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
1c000 3a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 66  : Check if the f
1c010 69 6c 65 20 73 74 69 6c 6c 20 65 78 69 73 74 73  ile still exists
1c020 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
1c030 20 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73    if {[file exis
1c040 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74  ts $fileName]} t
1c050 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
1c060 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
1c070 3a 20 53 6b 69 70 20 64 65 6c 65 74 69 6e 67 20  : Skip deleting 
1c080 74 65 73 74 20 66 69 6c 65 73 20 69 66 20 73 6f  test files if so
1c090 6d 65 62 6f 64 79 20 73 65 74 73 20 74 68 65 20  mebody sets the 
1c0a0 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 0d  global variable.
1c0b0 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
1c0c0 20 74 6f 20 70 72 65 76 65 6e 74 20 69 74 2e 0d   to prevent it..
1c0d0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
1c0e0 20 20 20 20 69 66 20 7b 24 66 6f 72 63 65 20 7c      if {$force |
1c0f0 7c 20 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  | ![info exists 
1c100 3a 3a 6e 6f 28 63 6c 65 61 6e 75 70 46 69 6c 65  ::no(cleanupFile
1c110 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
1c120 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1c130 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d     # NOTE: Attem
1c140 70 74 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  pt to delete the
1c150 20 74 65 73 74 20 66 69 6c 65 20 6e 6f 77 2e 0d   test file now..
1c160 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
1c170 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 65 74          if {[set
1c180 20 63 6f 64 65 20 5b 63 61 74 63 68 20 7b 66 69   code [catch {fi
1c190 6c 65 20 64 65 6c 65 74 65 20 24 66 69 6c 65 4e  le delete $fileN
1c1a0 61 6d 65 7d 20 65 72 72 6f 72 5d 5d 7d 20 74 68  ame} error]]} th
1c1b0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
1c1c0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
1c1d0 20 23 20 4e 4f 54 45 3a 20 57 65 20 73 6f 6d 65   # NOTE: We some
1c1e0 68 6f 77 20 66 61 69 6c 65 64 20 74 6f 20 64 65  how failed to de
1c1f0 6c 65 74 65 20 74 68 65 20 66 69 6c 65 2c 20 72  lete the file, r
1c200 65 70 6f 72 74 20 77 68 79 2e 0d 0a 20 20 20 20  eport why...    
1c210 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1c220 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
1c230 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
1c240 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
1c250 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d              "===
1c260 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65  = WARNING: faile
1c270 64 20 74 6f 20 64 65 6c 65 74 65 20 74 65 73 74  d to delete test
1c280 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e   file \"" $fileN
1c290 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ame \..         
1c2a0 20 20 20 20 20 20 20 22 5c 22 20 64 75 72 69 6e         "\" durin
1c2b0 67 20 63 6c 65 61 6e 75 70 2c 20 65 72 72 6f 72  g cleanup, error
1c2c0 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20  : " \n\t $error 
1c2d0 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  \n]..          }
1c2e0 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65  ..        } else
1c2f0 20 7b 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 53 68 6f 77 20 74 68 61 74 20 77 65 20  E: Show that we 
1c320 73 6b 69 70 70 65 64 20 64 65 6c 65 74 69 6e 67  skipped deleting
1c330 20 74 68 65 20 66 69 6c 65 2e 0d 0a 20 20 20 20   the file...    
1c340 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1c350 20 20 20 73 65 74 20 63 6f 64 65 20 30 0d 0a 0d     set code 0...
1c360 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
1c370 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
1c380 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
1c390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d                "=
1c3a0 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 73 6b 69  === WARNING: ski
1c3b0 70 70 65 64 20 64 65 6c 65 74 69 6e 67 20 74 65  pped deleting te
1c3c0 73 74 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c  st file \"" $fil
1c3d0 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20  eName \..       
1c3e0 20 20 20 20 20 20 20 22 5c 22 20 64 75 72 69 6e         "\" durin
1c3f0 67 20 63 6c 65 61 6e 75 70 5c 6e 22 5d 0d 0a 20  g cleanup\n"].. 
1c400 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1c410 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
1c420 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
1c430 4f 54 45 3a 20 54 68 65 20 66 69 6c 65 20 64 6f  OTE: The file do
1c440 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 73 75  es not exist, su
1c450 63 63 65 73 73 21 0d 0a 20 20 20 20 20 20 20 20  ccess!..        
1c460 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 63  #..        set c
1c470 6f 64 65 20 30 0d 0a 20 20 20 20 20 20 7d 0d 0a  ode 0..      }..
1c480 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 24  ..      return $
1c490 63 6f 64 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  code..    }.....
1c4a0 20 20 20 20 70 72 6f 63 20 63 6c 65 61 6e 75 70      proc cleanup
1c4b0 4d 65 6d 6f 72 79 20 7b 20 76 61 72 4e 61 6d 65  Memory { varName
1c4c0 20 7b 71 75 69 65 74 20 66 61 6c 73 65 7d 20 7d   {quiet false} }
1c4d0 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 68   {..      if {[h
1c4e0 61 76 65 53 51 4c 69 74 65 4f 62 6a 65 63 74 43  aveSQLiteObjectC
1c4f0 6f 6d 6d 61 6e 64 5d 20 26 26 20 5c 0d 0a 20 20  ommand] && \..  
1c500 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20          [string 
1c510 6c 65 6e 67 74 68 20 24 76 61 72 4e 61 6d 65 5d  length $varName]
1c520 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
1c530 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1c540 20 23 20 4e 4f 54 45 3a 20 52 65 66 65 72 20 74   # NOTE: Refer t
1c550 6f 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  o the specified 
1c560 76 61 72 69 61 62 6c 65 20 28 65 2e 67 2e 20 22  variable (e.g. "
1c570 63 6f 6e 6e 65 63 74 69 6f 6e 22 29 20 69 6e 20  connection") in 
1c580 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  the..        #  
1c590 20 20 20 20 20 63 6f 6e 74 65 78 74 20 6f 66 20       context of 
1c5a0 6f 75 72 20 63 61 6c 6c 65 72 2e 20 20 54 68 65  our caller.  The
1c5b0 20 6f 70 61 71 75 65 20 6f 62 6a 65 63 74 20 68   opaque object h
1c5c0 61 6e 64 6c 65 20 66 6f 72 20 61 6e 0d 0a 20 20  andle for an..  
1c5d0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 41 44        #       AD
1c5e0 4f 2e 4e 45 54 20 63 6f 6e 6e 65 63 74 69 6f 6e  O.NET connection
1c5f0 20 70 72 65 76 69 6f 75 73 6c 79 20 72 65 74 75   previously retu
1c600 72 6e 65 64 20 62 79 20 5b 67 65 74 44 62 43 6f  rned by [getDbCo
1c610 6e 6e 65 63 74 69 6f 6e 5d 0d 0a 20 20 20 20 20  nnection]..     
1c620 20 20 20 23 20 20 20 20 20 20 20 73 68 6f 75 6c     #       shoul
1c630 64 20 62 65 20 73 74 6f 72 65 64 20 74 68 65 72  d be stored ther
1c640 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  e...        #.. 
1c650 20 20 20 20 20 20 20 75 70 76 61 72 20 31 20 24         upvar 1 $
1c660 76 61 72 4e 61 6d 65 20 63 6f 6e 6e 65 63 74 69  varName connecti
1c670 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66  on....        if
1c680 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
1c690 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76        object inv
1c6a0 6f 6b 65 20 24 63 6f 6e 6e 65 63 74 69 6f 6e 20  oke $connection 
1c6b0 52 65 6c 65 61 73 65 4d 65 6d 6f 72 79 0d 0a 20  ReleaseMemory.. 
1c6c0 20 20 20 20 20 20 20 7d 20 72 65 73 75 6c 74 5d         } result]
1c6d0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1c6e0 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
1c6f0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1c700 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
1c710 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
1c720 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
1c730 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20            "==== 
1c740 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20  WARNING: failed 
1c750 74 6f 20 72 65 6c 65 61 73 65 20 64 61 74 61 62  to release datab
1c760 61 73 65 20 6d 65 6d 6f 72 79 2c 20 65 72 72 6f  ase memory, erro
1c770 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20  r: " \..        
1c780 20 20 20 20 20 20 20 20 5c 6e 5c 74 20 24 72 65          \n\t $re
1c790 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  sult \n]..      
1c7a0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
1c7b0 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
1c7c0 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20     if {[llength 
1c7d0 5b 69 6e 66 6f 20 63 6f 6d 6d 61 6e 64 73 20 64  [info commands d
1c7e0 65 62 75 67 5d 5d 20 3e 20 30 7d 20 74 68 65 6e  ebug]] > 0} then
1c7f0 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   {..        if {
1c800 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
1c810 20 20 20 20 75 70 6c 65 76 65 6c 20 31 20 5b 6c      uplevel 1 [l
1c820 69 73 74 20 64 65 62 75 67 20 70 75 72 67 65 5d  ist debug purge]
1c830 0d 0a 20 20 20 20 20 20 20 20 7d 20 72 65 73 75  ..        } resu
1c840 6c 74 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  lt]} then {..   
1c850 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
1c860 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
1c870 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
1c880 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
1c890 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
1c8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d               "==
1c8b0 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c  == WARNING: fail
1c8c0 65 64 20 74 6f 20 70 75 72 67 65 20 63 61 6c 6c  ed to purge call
1c8d0 20 66 72 61 6d 65 2c 20 65 72 72 6f 72 3a 20 22   frame, error: "
1c8e0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1c8f0 20 20 20 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74      \n\t $result
1c900 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \n]..          
1c910 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  }..        }....
1c920 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
1c930 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
1c940 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74 20  uplevel 1 [list 
1c950 64 65 62 75 67 20 63 6c 65 61 6e 75 70 5d 0d 0a  debug cleanup]..
1c960 20 20 20 20 20 20 20 20 7d 20 72 65 73 75 6c 74          } result
1c970 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
1c980 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
1c990 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1c9a0 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
1c9b0 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
1c9c0 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
1c9d0 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d             "====
1c9e0 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64   WARNING: failed
1c9f0 20 74 6f 20 63 6c 65 61 6e 75 70 20 69 6e 74 65   to cleanup inte
1ca00 72 70 72 65 74 65 72 2c 20 65 72 72 6f 72 3a 20  rpreter, error: 
1ca10 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
1ca20 20 20 20 20 20 5c 6e 5c 74 20 24 72 65 73 75 6c       \n\t $resul
1ca30 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  t \n]..         
1ca40 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d   }..        }...
1ca50 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61  .        if {[ca
1ca60 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
1ca70 20 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74   uplevel 1 [list
1ca80 20 64 65 62 75 67 20 63 6f 6c 6c 65 63 74 5d 0d   debug collect].
1ca90 0a 20 20 20 20 20 20 20 20 7d 20 72 65 73 75 6c  .        } resul
1caa0 74 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  t]} then {..    
1cab0 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
1cac0 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
1cad0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
1cae0 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
1caf0 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
1cb00 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d              "===
1cb10 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65  = WARNING: faile
1cb20 64 20 74 6f 20 63 6f 6c 6c 65 63 74 20 67 61 72  d to collect gar
1cb30 62 61 67 65 2c 20 65 72 72 6f 72 3a 20 22 20 5c  bage, error: " \
1cb40 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1cb50 20 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c    \n\t $result \
1cb60 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  n]..          }.
1cb70 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
1cb80 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
1cb90 20 20 20 70 72 6f 63 20 73 65 74 75 70 4d 65 6d     proc setupMem
1cba0 6f 72 79 43 6f 75 6e 74 65 72 73 20 7b 20 76 61  oryCounters { va
1cbb0 72 4e 61 6d 65 20 7d 20 7b 0d 0a 20 20 20 20 20  rName } {..     
1cbc0 20 69 66 20 7b 5b 68 61 76 65 53 51 4c 69 74 65   if {[haveSQLite
1cbd0 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20  ObjectCommand]} 
1cbe0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1cbf0 75 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65  upvar 1 $varName
1cc00 20 63 6f 75 6e 74 65 72 0d 0a 0d 0a 20 20 20 20   counter....    
1cc10 20 20 20 20 73 65 74 20 63 6f 75 6e 74 65 72 28      set counter(
1cc20 31 29 20 5b 6f 62 6a 65 63 74 20 63 72 65 61 74  1) [object creat
1cc30 65 20 2d 61 6c 69 61 73 20 5c 0d 0a 20 20 20 20  e -alias \..    
1cc40 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44          System.D
1cc50 69 61 67 6e 6f 73 74 69 63 73 2e 50 65 72 66 6f  iagnostics.Perfo
1cc60 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72 20 50 72  rmanceCounter Pr
1cc70 6f 63 65 73 73 20 5c 0d 0a 20 20 20 20 20 20 20  ocess \..       
1cc80 20 20 20 20 20 22 57 6f 72 6b 69 6e 67 20 53 65       "Working Se
1cc90 74 22 20 5b 66 69 6c 65 20 72 6f 6f 74 6e 61 6d  t" [file rootnam
1cca0 65 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 3a 3a  e [file tail $::
1ccb0 62 69 6e 5f 66 69 6c 65 5d 5d 5d 0d 0a 0d 0a 20  bin_file]]].... 
1ccc0 20 20 20 20 20 20 20 73 65 74 20 63 6f 75 6e 74         set count
1ccd0 65 72 28 32 29 20 5b 6f 62 6a 65 63 74 20 63 72  er(2) [object cr
1cce0 65 61 74 65 20 2d 61 6c 69 61 73 20 5c 0d 0a 20  eate -alias \.. 
1ccf0 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65             Syste
1cd00 6d 2e 44 69 61 67 6e 6f 73 74 69 63 73 2e 50 65  m.Diagnostics.Pe
1cd10 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72  rformanceCounter
1cd20 20 50 72 6f 63 65 73 73 20 5c 0d 0a 20 20 20 20   Process \..    
1cd30 20 20 20 20 20 20 20 20 22 57 6f 72 6b 69 6e 67          "Working
1cd40 20 53 65 74 20 50 65 61 6b 22 20 5b 66 69 6c 65   Set Peak" [file
1cd50 20 72 6f 6f 74 6e 61 6d 65 20 5b 66 69 6c 65 20   rootname [file 
1cd60 74 61 69 6c 20 24 3a 3a 62 69 6e 5f 66 69 6c 65  tail $::bin_file
1cd70 5d 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73  ]]]....        s
1cd80 65 74 20 63 6f 75 6e 74 65 72 28 33 29 20 5b 6f  et counter(3) [o
1cd90 62 6a 65 63 74 20 63 72 65 61 74 65 20 2d 61 6c  bject create -al
1cda0 69 61 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ias \..         
1cdb0 20 20 20 53 79 73 74 65 6d 2e 44 69 61 67 6e 6f     System.Diagno
1cdc0 73 74 69 63 73 2e 50 65 72 66 6f 72 6d 61 6e 63  stics.Performanc
1cdd0 65 43 6f 75 6e 74 65 72 20 50 72 6f 63 65 73 73  eCounter Process
1cde0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1cdf0 22 50 72 69 76 61 74 65 20 42 79 74 65 73 22 20  "Private Bytes" 
1ce00 5b 66 69 6c 65 20 72 6f 6f 74 6e 61 6d 65 20 5b  [file rootname [
1ce10 66 69 6c 65 20 74 61 69 6c 20 24 3a 3a 62 69 6e  file tail $::bin
1ce20 5f 66 69 6c 65 5d 5d 5d 0d 0a 20 20 20 20 20 20  _file]]]..      
1ce30 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72  }....      retur
1ce40 6e 20 22 22 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  n ""..    }.....
1ce50 20 20 20 20 70 72 6f 63 20 72 65 70 6f 72 74 4d      proc reportM
1ce60 65 6d 6f 72 79 43 6f 75 6e 74 65 72 73 20 7b 20  emoryCounters { 
1ce70 63 68 61 6e 6e 65 6c 20 76 61 72 4e 61 6d 65 20  channel varName 
1ce80 70 72 65 66 69 78 20 7d 20 7b 0d 0a 20 20 20 20  prefix } {..    
1ce90 20 20 69 66 20 7b 5b 68 61 76 65 53 51 4c 69 74    if {[haveSQLit
1cea0 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d 7d  eObjectCommand]}
1ceb0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1cec0 20 75 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d   upvar 1 $varNam
1ced0 65 20 63 6f 75 6e 74 65 72 0d 0a 0d 0a 20 20 20  e counter....   
1cee0 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
1cef0 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
1cf00 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  \..            "
1cf10 2d 2d 2d 2d 20 22 20 24 70 72 65 66 69 78 20 22  ---- " $prefix "
1cf20 20 63 6f 75 6e 74 65 72 20 5c 22 22 20 5c 0d 0a   counter \"" \..
1cf30 20 20 20 20 20 20 20 20 20 20 20 20 5b 6f 62 6a              [obj
1cf40 65 63 74 20 69 6e 76 6f 6b 65 20 24 63 6f 75 6e  ect invoke $coun
1cf50 74 65 72 28 31 29 20 43 6f 75 6e 74 65 72 4e 61  ter(1) CounterNa
1cf60 6d 65 5d 20 22 5c 22 20 76 61 6c 75 65 20 69 73  me] "\" value is
1cf70 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   " \..          
1cf80 20 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65    [object invoke
1cf90 20 24 63 6f 75 6e 74 65 72 28 31 29 20 52 61 77   $counter(1) Raw
1cfa0 56 61 6c 75 65 5d 20 5c 6e 5d 0d 0a 0d 0a 20 20  Value] \n]....  
1cfb0 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
1cfc0 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
1cfd0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1cfe0 22 2d 2d 2d 2d 20 22 20 24 70 72 65 66 69 78 20  "---- " $prefix 
1cff0 22 20 63 6f 75 6e 74 65 72 20 5c 22 22 20 5c 0d  " counter \"" \.
1d000 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 6f 62  .            [ob
1d010 6a 65 63 74 20 69 6e 76 6f 6b 65 20 24 63 6f 75  ject invoke $cou
1d020 6e 74 65 72 28 32 29 20 43 6f 75 6e 74 65 72 4e  nter(2) CounterN
1d030 61 6d 65 5d 20 22 5c 22 20 76 61 6c 75 65 20 69  ame] "\" value i
1d040 73 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  s " \..         
1d050 20 20 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b     [object invok
1d060 65 20 24 63 6f 75 6e 74 65 72 28 32 29 20 52 61  e $counter(2) Ra
1d070 77 56 61 6c 75 65 5d 20 5c 6e 5d 0d 0a 0d 0a 20  wValue] \n].... 
1d080 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
1d090 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
1d0a0 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
1d0b0 20 22 2d 2d 2d 2d 20 22 20 24 70 72 65 66 69 78   "---- " $prefix
1d0c0 20 22 20 63 6f 75 6e 74 65 72 20 5c 22 22 20 5c   " counter \"" \
1d0d0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 6f  ..            [o
1d0e0 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 24 63 6f  bject invoke $co
1d0f0 75 6e 74 65 72 28 33 29 20 43 6f 75 6e 74 65 72  unter(3) Counter
1d100 4e 61 6d 65 5d 20 22 5c 22 20 76 61 6c 75 65 20  Name] "\" value 
1d110 69 73 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20  is " \..        
1d120 20 20 20 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f      [object invo
1d130 6b 65 20 24 63 6f 75 6e 74 65 72 28 33 29 20 52  ke $counter(3) R
1d140 61 77 56 61 6c 75 65 5d 20 5c 6e 5d 0d 0a 20 20  awValue] \n]..  
1d150 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
1d160 0a 20 20 20 20 70 72 6f 63 20 63 6f 6c 6c 65 63  .    proc collec
1d170 74 47 61 72 62 61 67 65 20 7b 20 63 68 61 6e 6e  tGarbage { chann
1d180 65 6c 20 7b 6d 69 6c 6c 69 73 65 63 6f 6e 64 73  el {milliseconds
1d190 20 31 30 30 30 7d 20 7b 71 75 69 65 74 20 74 72   1000} {quiet tr
1d1a0 75 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 69  ue} } {..      i
1d1b0 66 20 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f 62  f {[haveSQLiteOb
1d1c0 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68  jectCommand]} th
1d1d0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66  en {..        if
1d1e0 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
1d1f0 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76        object inv
1d200 6f 6b 65 20 47 43 20 47 65 74 54 6f 74 61 6c 4d  oke GC GetTotalM
1d210 65 6d 6f 72 79 20 66 61 6c 73 65 0d 0a 20 20 20  emory false..   
1d220 20 20 20 20 20 7d 20 72 65 73 75 6c 74 5d 20 3d       } result] =
1d230 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
1d240 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
1d250 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
1d260 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
1d270 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
1d280 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
1d290 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6d 65 6d 6f        "---- memo
1d2a0 72 79 20 69 6e 20 75 73 65 20 62 79 20 74 68 65  ry in use by the
1d2b0 20 43 4c 52 20 62 65 66 6f 72 65 20 63 6f 6c 6c   CLR before coll
1d2c0 65 63 74 69 6f 6e 2e 2e 2e 20 22 20 5c 0d 0a 20  ection... " \.. 
1d2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24                 $
1d2e0 72 65 73 75 6c 74 20 22 20 62 79 74 65 73 5c 6e  result " bytes\n
1d2f0 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  "]..          }.
1d300 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20  .        } else 
1d310 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  {..          if 
1d320 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
1d330 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
1d340 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
1d350 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
1d360 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d              "===
1d370 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65  = WARNING: faile
1d380 64 20 74 6f 20 67 65 74 20 43 4c 52 20 6d 65 6d  d to get CLR mem
1d390 6f 72 79 20 75 73 61 67 65 2c 20 65 72 72 6f 72  ory usage, error
1d3a0 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  : " \..         
1d3b0 20 20 20 20 20 20 20 5c 6e 5c 74 20 24 72 65 73         \n\t $res
1d3c0 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ult \n]..       
1d3d0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
1d3e0 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
1d3f0 20 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23    ##############
1d400 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1d410 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1d420 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1d430 23 23 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20  ###########.... 
1d440 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
1d450 4e 4f 54 45 3a 20 52 65 70 65 61 74 65 64 6c 79  NOTE: Repeatedly
1d460 20 61 74 74 65 6d 70 74 20 74 6f 20 63 6f 6c 6c   attempt to coll
1d470 65 63 74 20 67 61 72 62 61 67 65 20 75 6e 74 69  ect garbage unti
1d480 6c 20 74 68 65 20 61 6c 6c 6f 74 74 65 64 20 6e  l the allotted n
1d490 75 6d 62 65 72 0d 0a 20 20 20 20 20 20 23 20 20  umber..      #  
1d4a0 20 20 20 20 20 6f 66 20 6d 69 6c 6c 69 73 65 63       of millisec
1d4b0 6f 6e 64 73 20 68 61 73 20 65 6c 61 70 73 65 64  onds has elapsed
1d4c0 2e 20 20 41 6c 77 61 79 73 20 61 74 74 65 6d 70  .  Always attemp
1d4d0 74 20 74 6f 20 63 6f 6c 6c 65 63 74 20 67 61 72  t to collect gar
1d4e0 62 61 67 65 0d 0a 20 20 20 20 20 20 23 20 20 20  bage..      #   
1d4f0 20 20 20 20 61 74 20 6c 65 61 73 74 20 6f 6e 63      at least onc
1d500 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  e...      #..   
1d510 20 20 20 69 66 20 7b 5b 68 61 76 65 53 51 4c 69     if {[haveSQLi
1d520 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d  teObjectCommand]
1d530 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1d540 20 20 73 65 74 20 73 74 61 72 74 20 5b 63 6c 6f    set start [clo
1d550 63 6b 20 73 65 63 6f 6e 64 73 5d 0d 0a 20 20 20  ck seconds]..   
1d560 20 20 20 20 20 73 65 74 20 73 74 6f 70 20 5b 65       set stop [e
1d570 78 70 72 20 7b 24 73 74 61 72 74 20 2b 20 28 24  xpr {$start + ($
1d580 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 2f 20 31  milliseconds / 1
1d590 30 30 30 29 7d 5d 0d 0a 0d 0a 20 20 20 20 20 20  000)}]....      
1d5a0 20 20 64 6f 20 7b 0d 0a 20 20 20 20 20 20 20 20    do {..        
1d5b0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23    #..          #
1d5c0 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74   NOTE: Attempt t
1d5d0 6f 20 66 6f 72 63 65 20 61 20 66 75 6c 6c 20 67  o force a full g
1d5e0 61 72 62 61 67 65 20 63 6f 6c 6c 65 63 74 69 6f  arbage collectio
1d5f0 6e 20 6e 6f 77 2e 20 20 52 65 70 6f 72 74 20 61  n now.  Report a
1d600 6e 79 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20  ny..          # 
1d610 20 20 20 20 20 20 65 72 72 6f 72 20 74 68 61 74        error that
1d620 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20   is encountered 
1d630 69 66 20 77 65 20 66 61 69 6c 2e 0d 0a 20 20 20  if we fail...   
1d640 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1d650 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
1d660 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 62  ..            ob
1d670 6a 65 63 74 20 69 6e 76 6f 6b 65 20 47 43 20 47  ject invoke GC G
1d680 65 74 54 6f 74 61 6c 4d 65 6d 6f 72 79 20 74 72  etTotalMemory tr
1d690 75 65 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20  ue..          } 
1d6a0 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a  error]} then {..
1d6b0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
1d6c0 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
1d6d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  .              t
1d6e0 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
1d6f0 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
1d700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1d710 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61  ==== WARNING: fa
1d720 69 6c 65 64 20 66 75 6c 6c 20 67 61 72 62 61 67  iled full garbag
1d730 65 20 63 6f 6c 6c 65 63 74 69 6f 6e 2c 20 65 72  e collection, er
1d740 72 6f 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20  ror: " \..      
1d750 20 20 20 20 20 20 20 20 20 20 20 20 5c 6e 5c 74              \n\t
1d760 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20   $error \n]..   
1d770 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
1d780 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
1d790 20 20 20 20 20 73 65 74 20 6e 6f 77 20 5b 63 6c       set now [cl
1d7a0 6f 63 6b 20 73 65 63 6f 6e 64 73 5d 0d 0a 20 20  ock seconds]..  
1d7b0 20 20 20 20 20 20 7d 20 77 68 69 6c 65 20 7b 24        } while {$
1d7c0 73 74 61 72 74 20 3c 3d 20 24 6e 6f 77 20 26 26  start <= $now &&
1d7d0 20 24 6e 6f 77 20 3c 20 24 73 74 6f 70 7d 0d 0a   $now < $stop}..
1d7e0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
1d7f0 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23   ###############
1d800 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1d810 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1d820 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1d830 23 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20  ##########....  
1d840 20 20 20 20 69 66 20 7b 5b 68 61 76 65 53 51 4c      if {[haveSQL
1d850 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64  iteObjectCommand
1d860 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
1d870 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d     if {[catch {.
1d880 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63  .          objec
1d890 74 20 69 6e 76 6f 6b 65 20 47 43 20 47 65 74 54  t invoke GC GetT
1d8a0 6f 74 61 6c 4d 65 6d 6f 72 79 20 66 61 6c 73 65  otalMemory false
1d8b0 0d 0a 20 20 20 20 20 20 20 20 7d 20 72 65 73 75  ..        } resu
1d8c0 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  lt] == 0} then {
1d8d0 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
1d8e0 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
1d8f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
1d900 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
1d910 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
1d920 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
1d930 20 6d 65 6d 6f 72 79 20 69 6e 20 75 73 65 20 62   memory in use b
1d940 79 20 74 68 65 20 43 4c 52 20 61 66 74 65 72 20  y the CLR after 
1d950 63 6f 6c 6c 65 63 74 69 6f 6e 2e 2e 2e 20 22 20  collection... " 
1d960 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1d970 20 20 20 24 72 65 73 75 6c 74 20 22 20 62 79 74     $result " byt
1d980 65 73 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20  es\n"]..        
1d990 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65    }..        } e
1d9a0 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
1d9b0 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
1d9c0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
1d9d0 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
1d9e0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
1d9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da00 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66  "==== WARNING: f
1da10 61 69 6c 65 64 20 74 6f 20 67 65 74 20 43 4c 52  ailed to get CLR
1da20 20 6d 65 6d 6f 72 79 20 75 73 61 67 65 2c 20 65   memory usage, e
1da30 72 72 6f 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20  rror: " \..     
1da40 20 20 20 20 20 20 20 20 20 20 20 5c 6e 5c 74 20             \n\t 
1da50 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20  $result \n]..   
1da60 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1da70 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20    }..      }..  
1da80 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
1da90 20 67 65 74 53 51 4c 69 74 65 48 61 6e 64 6c 65   getSQLiteHandle
1daa0 43 6f 75 6e 74 73 20 7b 20 63 68 61 6e 6e 65 6c  Counts { channel
1dab0 20 7b 71 75 69 65 74 20 66 61 6c 73 65 7d 20 7d   {quiet false} }
1dac0 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 72 65   {..      set re
1dad0 73 75 6c 74 20 5b 6c 69 73 74 5d 0d 0a 0d 0a 20  sult [list].... 
1dae0 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65 53 51       if {[haveSQ
1daf0 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e  LiteObjectComman
1db00 64 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  d] && \..       
1db10 20 20 20 5b 68 61 76 65 53 51 4c 69 74 65 44 65     [haveSQLiteDe
1db20 66 69 6e 65 43 6f 6e 73 74 61 6e 74 20 43 4f 55  fineConstant COU
1db30 4e 54 5f 48 41 4e 44 4c 45 5d 7d 20 74 68 65 6e  NT_HANDLE]} then
1db40 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
1db50 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41         # NOTE: A
1db60 64 64 20 65 61 63 68 20 63 72 69 74 69 63 61 6c  dd each critical
1db70 20 68 61 6e 64 6c 65 20 63 6f 75 6e 74 20 74 6f   handle count to
1db80 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67 20 6c   the resulting l
1db90 69 73 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ist...        #.
1dba0 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68  .        foreach
1dbb0 20 6e 61 6d 65 20 5b 6c 69 73 74 20 5c 0d 0a 20   name [list \.. 
1dbc0 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 6e 65             conne
1dbd0 63 74 69 6f 6e 43 6f 75 6e 74 20 73 74 61 74 65  ctionCount state
1dbe0 6d 65 6e 74 43 6f 75 6e 74 20 62 61 63 6b 75 70  mentCount backup
1dbf0 43 6f 75 6e 74 20 62 6c 6f 62 43 6f 75 6e 74 5d  Count blobCount]
1dc00 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   {..          if
1dc10 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
1dc20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69          object i
1dc30 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f  nvoke -flags +No
1dc40 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20  nPublic \..     
1dc50 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65             Syste
1dc60 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 44 65  m.Data.SQLite.De
1dc70 62 75 67 44 61 74 61 20 24 6e 61 6d 65 0d 0a 20  bugData $name.. 
1dc80 20 20 20 20 20 20 20 20 20 7d 20 76 61 6c 75 65           } value
1dc90 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
1dca0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
1dcb0 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
1dcc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  .              t
1dcd0 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
1dce0 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
1dcf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1dd00 2d 2d 2d 2d 20 63 72 69 74 69 63 61 6c 20 68 61  ---- critical ha
1dd10 6e 64 6c 65 20 63 6f 75 6e 74 20 5c 22 22 20 24  ndle count \"" $
1dd20 6e 61 6d 65 20 22 5c 22 20 69 73 20 22 20 24 76  name "\" is " $v
1dd30 61 6c 75 65 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  alue \n]..      
1dd40 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
1dd50 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 72         lappend r
1dd60 65 73 75 6c 74 20 24 76 61 6c 75 65 0d 0a 20 20  esult $value..  
1dd70 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
1dd80 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
1dd90 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
1dda0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
1ddb0 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
1ddc0 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
1ddd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dde0 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20   "==== WARNING: 
1ddf0 66 61 69 6c 65 64 20 74 6f 20 67 65 74 20 63 72  failed to get cr
1de00 69 74 69 63 61 6c 20 68 61 6e 64 6c 65 20 63 6f  itical handle co
1de10 75 6e 74 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20  unt \"" \..     
1de20 20 20 20 20 20 20 20 20 20 20 20 20 20 24 6e 61               $na
1de30 6d 65 20 22 5c 22 2c 20 65 72 72 6f 72 3a 20 22  me "\", error: "
1de40 20 5c 6e 5c 74 20 24 76 61 6c 75 65 20 5c 6e 5d   \n\t $value \n]
1de50 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
1de60 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
1de70 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
1de80 20 65 6c 73 65 69 66 20 7b 21 24 71 75 69 65 74   elseif {!$quiet
1de90 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1dea0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
1deb0 4f 54 45 3a 20 54 68 65 20 61 63 74 75 61 6c 20  OTE: The actual 
1dec0 68 61 6e 64 6c 65 20 63 6f 75 6e 74 73 20 61 72  handle counts ar
1ded0 65 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 3b  e not available;
1dee0 20 74 68 65 72 65 66 6f 72 65 2c 20 6a 75 73 74   therefore, just
1def0 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
1df00 20 20 72 65 74 75 72 6e 20 61 6e 20 65 6d 70 74    return an empt
1df10 79 20 6c 69 73 74 2e 0d 0a 20 20 20 20 20 20 20  y list...       
1df20 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   #..        tput
1df30 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d  s $channel "----
1df40 20 63 72 69 74 69 63 61 6c 20 68 61 6e 64 6c 65   critical handle
1df50 20 63 6f 75 6e 74 73 20 75 6e 61 76 61 69 6c 61   counts unavaila
1df60 62 6c 65 5c 6e 22 0d 0a 20 20 20 20 20 20 7d 0d  ble\n"..      }.
1df70 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ...      return 
1df80 24 72 65 73 75 6c 74 0d 0a 20 20 20 20 7d 0d 0a  $result..    }..
1df90 0c 0d 0a 20 20 20 20 70 72 6f 63 20 73 68 75 74  ...    proc shut
1dfa0 64 6f 77 6e 53 51 4c 69 74 65 20 7b 20 63 68 61  downSQLite { cha
1dfb0 6e 6e 65 6c 20 7b 66 6f 72 63 65 20 66 61 6c 73  nnel {force fals
1dfc0 65 7d 20 7b 71 75 69 65 74 20 66 61 6c 73 65 7d  e} {quiet false}
1dfd0 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20   } {..      #.. 
1dfe0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4d 61 6b       # NOTE: Mak
1dff0 65 20 73 75 72 65 20 74 68 61 74 20 53 51 4c 69  e sure that SQLi
1e000 74 65 20 63 6f 72 65 20 6c 69 62 72 61 72 79 20  te core library 
1e010 69 73 20 63 6f 6d 70 6c 65 74 65 6c 79 20 73 68  is completely sh
1e020 75 74 64 6f 77 6e 2e 20 20 54 68 69 73 0d 0a 20  utdown.  This.. 
1e030 20 20 20 20 20 23 20 20 20 20 20 20 20 69 73 20       #       is 
1e040 75 73 65 64 20 62 79 20 74 65 73 74 73 20 74 68  used by tests th
1e050 61 74 20 63 68 61 6e 67 65 20 63 6f 6e 66 69 67  at change config
1e060 75 72 61 74 69 6f 6e 20 6f 70 74 69 6f 6e 73 20  uration options 
1e070 61 6e 64 2f 6f 72 20 74 68 6f 73 65 0d 0a 20 20  and/or those..  
1e080 20 20 20 20 23 20 20 20 20 20 20 20 74 68 61 74      #       that
1e090 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20 73 75   need to make su
1e0a0 72 65 20 6c 6f 67 67 69 6e 67 20 69 73 20 69 6e  re logging is in
1e0b0 69 74 69 61 6c 69 7a 65 64 20 28 69 2e 65 2e 20  itialized (i.e. 
1e0c0 6a 75 73 74 20 69 6e 20 63 61 73 65 0d 0a 20 20  just in case..  
1e0d0 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20      #       the 
1e0e0 53 51 4c 69 74 65 20 63 6f 72 65 20 6c 69 62 72  SQLite core libr
1e0f0 61 72 79 20 77 61 73 20 69 6e 69 74 69 61 6c 69  ary was initiali
1e100 7a 65 64 20 69 6e 20 74 68 65 20 70 72 6f 63 65  zed in the proce
1e110 73 73 20 70 72 69 6f 72 20 74 6f 0d 0a 20 20 20  ss prior to..   
1e120 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20 53     #       the S
1e130 51 4c 69 74 65 4c 6f 67 20 63 6c 61 73 73 20 62  QLiteLog class b
1e140 65 69 6e 67 20 61 62 6c 65 20 74 6f 20 73 65 74  eing able to set
1e150 75 70 20 69 74 73 20 6c 6f 67 67 69 6e 67 20 63  up its logging c
1e160 61 6c 6c 62 61 63 6b 29 2e 0d 0a 20 20 20 20 20  allback)...     
1e170 20 23 20 20 20 20 20 20 20 4e 6f 72 6d 61 6c 6c   #       Normall
1e180 79 2c 20 74 68 69 73 20 73 68 6f 75 6c 64 20 6f  y, this should o
1e190 6e 6c 79 20 62 65 20 70 65 72 66 6f 72 6d 65 64  nly be performed
1e1a0 20 69 66 20 53 51 4c 69 74 65 20 69 73 20 6c 6f   if SQLite is lo
1e1b0 61 64 65 64 20 61 6e 64 0d 0a 20 20 20 20 20 20  aded and..      
1e1c0 23 20 20 20 20 20 20 20 72 65 61 64 79 20 66 6f  #       ready fo
1e1d0 72 20 75 73 65 20 62 79 20 74 68 65 20 74 65 73  r use by the tes
1e1e0 74 20 73 75 69 74 65 2e 0d 0a 20 20 20 20 20 20  t suite...      
1e1f0 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 66 6f  #..      if {$fo
1e200 72 63 65 20 7c 7c 20 5b 69 73 53 51 4c 69 74 65  rce || [isSQLite
1e210 52 65 61 64 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a  Ready]} then {..
1e220 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1e230 20 20 20 23 20 42 55 47 46 49 58 3a 20 4d 61 6b     # BUGFIX: Mak
1e240 65 20 73 75 72 65 20 74 68 61 74 20 61 6e 79 20  e sure that any 
1e250 22 6c 65 61 6b 65 64 22 20 74 72 61 6e 73 61 63  "leaked" transac
1e260 74 69 6f 6e 73 20 61 6e 64 2f 6f 72 20 63 6f 6e  tions and/or con
1e270 6e 65 63 74 69 6f 6e 73 0d 0a 20 20 20 20 20 20  nections..      
1e280 20 20 23 20 20 20 20 20 20 20 20 20 61 72 65 20    #         are 
1e290 63 6c 65 61 6e 65 64 20 75 70 20 62 65 66 6f 72  cleaned up befor
1e2a0 65 20 63 61 6c 6c 69 6e 67 20 74 68 65 20 6e 61  e calling the na
1e2b0 74 69 76 65 20 73 68 75 74 64 6f 77 6e 20 66 75  tive shutdown fu
1e2c0 6e 63 74 69 6f 6e 2e 0d 0a 20 20 20 20 20 20 20  nction...       
1e2d0 20 23 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 65   #..        fore
1e2e0 61 63 68 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ach transaction 
1e2f0 5b 69 6e 66 6f 20 74 72 61 6e 73 61 63 74 69 6f  [info transactio
1e300 6e 73 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  ns] {..         
1e310 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6d 61 74   if {[string mat
1e320 63 68 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ch \..          
1e330 20 20 20 20 53 79 73 74 65 6d 23 44 61 74 61 23      System#Data#
1e340 53 51 4c 69 74 65 23 53 51 4c 69 74 65 54 72 61  SQLite#SQLiteTra
1e350 6e 73 61 63 74 69 6f 6e 23 2a 20 24 74 72 61 6e  nsaction#* $tran
1e360 73 61 63 74 69 6f 6e 5d 7d 20 74 68 65 6e 20 7b  saction]} then {
1e370 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
1e380 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
1e390 20 20 20 20 20 20 20 20 20 20 73 71 6c 20 74 72            sql tr
1e3a0 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61  ansaction rollba
1e3b0 63 6b 20 24 74 72 61 6e 73 61 63 74 69 6f 6e 0d  ck $transaction.
1e3c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65  .            } e
1e3d0 72 72 6f 72 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  rror] == 0} then
1e3e0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1e3f0 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
1e400 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1e410 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
1e420 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
1e430 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
1e440 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 72           "---- r
1e450 6f 6c 6c 65 64 20 62 61 63 6b 20 6c 65 61 6b 65  olled back leake
1e460 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 5c 22  d transaction \"
1e470 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
1e480 20 20 20 20 20 20 20 20 20 24 74 72 61 6e 73 61           $transa
1e490 63 74 69 6f 6e 20 5c 22 5c 6e 5d 0d 0a 20 20 20  ction \"\n]..   
1e4a0 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
1e4b0 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
1e4c0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1e4d0 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
1e4e0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1e4f0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
1e500 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
1e510 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
1e520 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57           "==== W
1e530 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74  ARNING: failed t
1e540 6f 20 72 6f 6c 6c 62 61 63 6b 20 6c 65 61 6b 65  o rollback leake
1e550 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 5c 22  d transaction \"
1e560 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
1e570 20 20 20 20 20 20 20 20 20 24 74 72 61 6e 73 61           $transa
1e580 63 74 69 6f 6e 20 22 5c 22 2c 20 65 72 72 6f 72  ction "\", error
1e590 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20  : " \n\t $error 
1e5a0 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  \n]..           
1e5b0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
1e5c0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d    }..          }
1e5d0 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
1e5e0 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 64         foreach d
1e5f0 62 20 5b 69 6e 66 6f 20 63 6f 6e 6e 65 63 74 69  b [info connecti
1e600 6f 6e 73 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20  ons] {..        
1e610 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6d 61    if {[string ma
1e620 74 63 68 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  tch \..         
1e630 20 20 20 20 20 53 79 73 74 65 6d 23 44 61 74 61       System#Data
1e640 23 53 51 4c 69 74 65 23 53 51 4c 69 74 65 43 6f  #SQLite#SQLiteCo
1e650 6e 6e 65 63 74 69 6f 6e 23 2a 20 24 64 62 5d 7d  nnection#* $db]}
1e660 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1e670 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
1e680 7b 73 71 6c 20 63 6c 6f 73 65 20 24 64 62 7d 20  {sql close $db} 
1e690 65 72 72 6f 72 5d 20 3d 3d 20 30 7d 20 74 68 65  error] == 0} the
1e6a0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
1e6b0 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
1e6c0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1e6d0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
1e6e0 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
1e6f0 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
1e700 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
1e710 63 6c 6f 73 65 64 20 6c 65 61 6b 65 64 20 64 61  closed leaked da
1e720 74 61 62 61 73 65 20 5c 22 22 20 24 64 62 20 5c  tabase \"" $db \
1e730 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  "\n]..          
1e740 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
1e750 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
1e760 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
1e770 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
1e780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e790 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
1e7a0 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
1e7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e7c0 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a    "==== WARNING:
1e7d0 20 66 61 69 6c 65 64 20 74 6f 20 63 6c 6f 73 65   failed to close
1e7e0 20 6c 65 61 6b 65 64 20 64 61 74 61 62 61 73 65   leaked database
1e7f0 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20   \"" \..        
1e800 20 20 20 20 20 20 20 20 20 20 20 20 24 64 62 20              $db 
1e810 22 5c 22 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e  "\", error: " \n
1e820 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20  \t $error \n].. 
1e830 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
1e840 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
1e850 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
1e860 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
1e870 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 42 55   #..        # BU
1e880 47 46 49 58 3a 20 42 65 66 6f 72 65 20 63 61 6c  GFIX: Before cal
1e890 6c 69 6e 67 20 74 68 65 20 6e 61 74 69 76 65 20  ling the native 
1e8a0 73 68 75 74 64 6f 77 6e 20 66 75 6e 63 74 69 6f  shutdown functio
1e8b0 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 62 6f 74  n, make sure bot
1e8c0 68 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  h..        #    
1e8d0 20 20 20 20 20 6f 66 20 74 68 65 20 50 52 41 47       of the PRAG
1e8e0 4d 41 20 72 65 6c 61 74 65 64 20 64 69 72 65 63  MA related direc
1e8f0 74 6f 72 79 20 6e 61 6d 65 73 20 61 72 65 20 66  tory names are f
1e900 72 65 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 23  reed...        #
1e910 0d 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 46  ..        checkF
1e920 6f 72 53 51 4c 69 74 65 44 69 72 65 63 74 6f 72  orSQLiteDirector
1e930 69 65 73 20 24 63 68 61 6e 6e 65 6c 20 74 72 75  ies $channel tru
1e940 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20  e....        if 
1e950 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
1e960 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f       object invo
1e970 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75  ke -flags +NonPu
1e980 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20  blic \..        
1e990 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74        System.Dat
1e9a0 61 2e 53 51 4c 69 74 65 2e 55 6e 73 61 66 65 4e  a.SQLite.UnsafeN
1e9b0 61 74 69 76 65 4d 65 74 68 6f 64 73 20 73 71 6c  ativeMethods sql
1e9c0 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 0d 0a 20  ite3_shutdown.. 
1e9d0 20 20 20 20 20 20 20 7d 20 72 65 73 75 6c 74 5d         } result]
1e9e0 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
1e9f0 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71           if {!$q
1ea00 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
1ea10 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
1ea20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
1ea30 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
1ea40 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 61          "---- ca
1ea50 6c 6c 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64  ll sqlite3_shutd
1ea60 6f 77 6e 28 29 2e 2e 2e 20 6f 6b 3a 20 22 20 24  own()... ok: " $
1ea70 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20  result \n]..    
1ea80 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
1ea90 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
1eaa0 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
1eab0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1eac0 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
1ead0 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
1eae0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1eaf0 20 20 20 20 22 2d 2d 2d 2d 20 63 61 6c 6c 20 73      "---- call s
1eb00 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 28  qlite3_shutdown(
1eb10 29 2e 2e 2e 20 65 72 72 6f 72 3a 20 22 20 5c 6e  )... error: " \n
1eb20 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a  \t $result \n]..
1eb30 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
1eb40 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
1eb50 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
1eb60 72 6f 63 20 67 65 74 53 65 74 74 69 6e 67 52 65  roc getSettingRe
1eb70 61 64 43 6f 75 6e 74 20 7b 20 6e 61 6d 65 20 7b  adCount { name {
1eb80 76 69 61 46 69 6c 65 20 66 61 6c 73 65 7d 20 7d  viaFile false} }
1eb90 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 68   {..      if {[h
1eba0 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 62 75  aveConstraint bu
1ebb0 69 6c 64 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e  ildConfiguration
1ebc0 2e 44 65 62 75 67 5d 20 26 26 20 5b 63 61 74 63  .Debug] && [catc
1ebd0 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a  h {..        obj
1ebe0 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67  ect invoke -flag
1ebf0 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 2d 61 6c  s +NonPublic -al
1ec00 69 61 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ias \..         
1ec10 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53     System.Data.S
1ec20 51 4c 69 74 65 2e 44 65 62 75 67 44 61 74 61 20  QLite.DebugData 
1ec30 47 65 74 53 65 74 74 69 6e 67 52 65 61 64 43 6f  GetSettingReadCo
1ec40 75 6e 74 73 20 24 76 69 61 46 69 6c 65 0d 0a 20  unts $viaFile.. 
1ec50 20 20 20 20 20 7d 20 73 65 74 74 69 6e 67 52 65       } settingRe
1ec60 61 64 43 6f 75 6e 74 73 5d 20 3d 3d 20 30 7d 20  adCounts] == 0} 
1ec70 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1ec80 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
1ec90 74 68 20 24 6e 61 6d 65 5d 20 3e 20 30 7d 20 74  th $name] > 0} t
1eca0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1ecb0 20 69 66 20 7b 5b 24 73 65 74 74 69 6e 67 52 65   if {[$settingRe
1ecc0 61 64 43 6f 75 6e 74 73 20 54 72 79 47 65 74 56  adCounts TryGetV
1ecd0 61 6c 75 65 20 24 6e 61 6d 65 20 76 61 6c 75 65  alue $name value
1ece0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
1ecf0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
1ed00 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
1ed10 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
1ed20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
1ed30 2d 20 73 65 74 74 69 6e 67 20 5c 22 22 20 24 6e  - setting \"" $n
1ed40 61 6d 65 20 22 5c 22 20 77 61 73 20 72 65 61 64  ame "\" was read
1ed50 20 22 20 24 76 61 6c 75 65 20 22 20 74 69 6d 65   " $value " time
1ed60 73 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  s" \..          
1ed70 20 20 20 20 20 20 5b 65 78 70 72 20 7b 24 76 69        [expr {$vi
1ed80 61 46 69 6c 65 20 3f 20 22 20 66 72 6f 6d 20 74  aFile ? " from t
1ed90 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  he configuration
1eda0 20 66 69 6c 65 22 20 3a 20 22 22 7d 5d 20 5c 6e   file" : ""}] \n
1edb0 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ]....           
1edc0 20 72 65 74 75 72 6e 20 24 76 61 6c 75 65 0d 0a   return $value..
1edd0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
1ede0 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
1edf0 20 20 20 20 20 20 20 20 20 73 65 74 20 6e 61 6d           set nam
1ee00 65 43 6f 75 6e 74 20 5b 24 73 65 74 74 69 6e 67  eCount [$setting
1ee10 52 65 61 64 43 6f 75 6e 74 73 20 43 6f 75 6e 74  ReadCounts Count
1ee20 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  ]..          set
1ee30 20 76 61 6c 75 65 43 6f 75 6e 74 20 30 0d 0a 0d   valueCount 0...
1ee40 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63  .          objec
1ee50 74 20 66 6f 72 65 61 63 68 20 2d 61 6c 69 61 73  t foreach -alias
1ee60 20 70 61 69 72 20 24 73 65 74 74 69 6e 67 52 65   pair $settingRe
1ee70 61 64 43 6f 75 6e 74 73 20 7b 0d 0a 20 20 20 20  adCounts {..    
1ee80 20 20 20 20 20 20 20 20 69 6e 63 72 20 76 61 6c          incr val
1ee90 75 65 43 6f 75 6e 74 20 5b 24 70 61 69 72 20 56  ueCount [$pair V
1eea0 61 6c 75 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  alue]....       
1eeb0 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
1eec0 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
1eed0 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
1eee0 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
1eef0 73 65 74 74 69 6e 67 20 5c 22 22 20 5b 24 70 61  setting \"" [$pa
1ef00 69 72 20 4b 65 79 5d 20 22 5c 22 20 77 61 73 20  ir Key] "\" was 
1ef10 72 65 61 64 20 22 20 5b 24 70 61 69 72 20 56 61  read " [$pair Va
1ef20 6c 75 65 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20  lue] \..        
1ef30 20 20 20 20 20 20 20 20 22 20 74 69 6d 65 73 22          " times"
1ef40 20 5b 65 78 70 72 20 7b 24 76 69 61 46 69 6c 65   [expr {$viaFile
1ef50 20 3f 20 22 20 66 72 6f 6d 20 74 68 65 20 63 6f   ? " from the co
1ef60 6e 66 69 67 75 72 61 74 69 6f 6e 20 66 69 6c 65  nfiguration file
1ef70 22 20 3a 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  " : \..         
1ef80 20 20 20 20 20 20 20 22 22 7d 5d 20 5c 6e 5d 0d         ""}] \n].
1ef90 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  .          }....
1efa0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1efb0 20 5b 6c 69 73 74 20 24 6e 61 6d 65 43 6f 75 6e   [list $nameCoun
1efc0 74 20 24 76 61 6c 75 65 43 6f 75 6e 74 5d 0d 0a  t $valueCount]..
1efd0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
1efe0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b   }....      if {
1eff0 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
1f000 6e 61 6d 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20  name] > 0} then 
1f010 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  {..        tputs
1f020 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
1f030 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
1f040 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
1f050 2d 20 73 65 74 74 69 6e 67 20 5c 22 22 20 24 6e  - setting \"" $n
1f060 61 6d 65 20 22 5c 22 20 77 61 73 20 6e 6f 74 20  ame "\" was not 
1f070 72 65 61 64 22 20 5b 65 78 70 72 20 7b 24 76 69  read" [expr {$vi
1f080 61 46 69 6c 65 20 3f 20 5c 0d 0a 20 20 20 20 20  aFile ? \..     
1f090 20 20 20 20 20 20 20 22 20 66 72 6f 6d 20 74 68         " from th
1f0a0 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  e configuration 
1f0b0 66 69 6c 65 22 20 3a 20 22 22 7d 5d 20 5c 6e 5d  file" : ""}] \n]
1f0c0 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
1f0d0 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
1f0e0 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
1f0f0 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
1f100 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
1f110 20 6e 6f 20 73 65 74 74 69 6e 67 73 20 77 65 72   no settings wer
1f120 65 20 72 65 61 64 22 20 5b 65 78 70 72 20 7b 24  e read" [expr {$
1f130 76 69 61 46 69 6c 65 20 3f 20 5c 0d 0a 20 20 20  viaFile ? \..   
1f140 20 20 20 20 20 20 20 20 20 22 20 66 72 6f 6d 20           " from 
1f150 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  the configuratio
1f160 6e 20 66 69 6c 65 22 20 3a 20 22 22 7d 5d 20 5c  n file" : ""}] \
1f170 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  n]..      }.... 
1f180 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 0d 0a       return -1..
1f190 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
1f1a0 6f 63 20 67 65 74 4f 74 68 65 72 43 6f 75 6e 74  oc getOtherCount
1f1b0 20 7b 20 6e 61 6d 65 20 7d 20 7b 0d 0a 20 20 20   { name } {..   
1f1c0 20 20 20 69 66 20 7b 5b 68 61 76 65 43 6f 6e 73     if {[haveCons
1f1d0 74 72 61 69 6e 74 20 62 75 69 6c 64 43 6f 6e 66  traint buildConf
1f1e0 69 67 75 72 61 74 69 6f 6e 2e 44 65 62 75 67 5d  iguration.Debug]
1f1f0 20 26 26 20 5b 63 61 74 63 68 20 7b 0d 0a 20 20   && [catch {..  
1f200 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76        object inv
1f210 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50  oke -flags +NonP
1f220 75 62 6c 69 63 20 2d 61 6c 69 61 73 20 5c 0d 0a  ublic -alias \..
1f230 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74              Syst
1f240 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 44  em.Data.SQLite.D
1f250 65 62 75 67 44 61 74 61 20 47 65 74 4f 74 68 65  ebugData GetOthe
1f260 72 43 6f 75 6e 74 73 0d 0a 20 20 20 20 20 20 7d  rCounts..      }
1f270 20 6f 74 68 65 72 43 6f 75 6e 74 73 5d 20 3d 3d   otherCounts] ==
1f280 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
1f290 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
1f2a0 6c 65 6e 67 74 68 20 24 6e 61 6d 65 5d 20 3e 20  length $name] > 
1f2b0 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
1f2c0 20 20 20 20 20 69 66 20 7b 5b 24 6f 74 68 65 72       if {[$other
1f2d0 43 6f 75 6e 74 73 20 54 72 79 47 65 74 56 61 6c  Counts TryGetVal
1f2e0 75 65 20 24 6e 61 6d 65 20 76 61 6c 75 65 5d 7d  ue $name value]}
1f2f0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1f300 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
1f310 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
1f320 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
1f330 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
1f340 6f 74 68 65 72 20 63 6f 75 6e 74 65 72 20 5c 22  other counter \"
1f350 22 20 24 6e 61 6d 65 20 22 5c 22 20 68 61 73 20  " $name "\" has 
1f360 76 61 6c 75 65 20 22 20 24 76 61 6c 75 65 20 5c  value " $value \
1f370 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  n]....          
1f380 20 20 72 65 74 75 72 6e 20 24 76 61 6c 75 65 0d    return $value.
1f390 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
1f3a0 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
1f3b0 20 20 20 20 20 20 20 20 20 20 73 65 74 20 6e 61            set na
1f3c0 6d 65 43 6f 75 6e 74 20 5b 24 6f 74 68 65 72 43  meCount [$otherC
1f3d0 6f 75 6e 74 73 20 43 6f 75 6e 74 5d 0d 0a 20 20  ounts Count]..  
1f3e0 20 20 20 20 20 20 20 20 73 65 74 20 76 61 6c 75          set valu
1f3f0 65 43 6f 75 6e 74 20 30 0d 0a 0d 0a 20 20 20 20  eCount 0....    
1f400 20 20 20 20 20 20 6f 62 6a 65 63 74 20 66 6f 72        object for
1f410 65 61 63 68 20 2d 61 6c 69 61 73 20 70 61 69 72  each -alias pair
1f420 20 24 6f 74 68 65 72 43 6f 75 6e 74 73 20 7b 0d   $otherCounts {.
1f430 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 63  .            inc
1f440 72 20 76 61 6c 75 65 43 6f 75 6e 74 20 5b 24 70  r valueCount [$p
1f450 61 69 72 20 56 61 6c 75 65 5d 0d 0a 0d 0a 20 20  air Value]....  
1f460 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
1f470 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
1f480 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
1f490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1f4a0 2d 2d 2d 2d 20 6f 74 68 65 72 20 63 6f 75 6e 74  ---- other count
1f4b0 65 72 20 5c 22 22 20 5b 24 70 61 69 72 20 4b 65  er \"" [$pair Ke
1f4c0 79 5d 20 22 5c 22 20 68 61 73 20 76 61 6c 75 65  y] "\" has value
1f4d0 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   " \..          
1f4e0 20 20 20 20 20 20 5b 24 70 61 69 72 20 56 61 6c        [$pair Val
1f4f0 75 65 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ue] \n]..       
1f500 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
1f510 20 20 72 65 74 75 72 6e 20 5b 6c 69 73 74 20 24    return [list $
1f520 6e 61 6d 65 43 6f 75 6e 74 20 24 76 61 6c 75 65  nameCount $value
1f530 43 6f 75 6e 74 5d 0d 0a 20 20 20 20 20 20 20 20  Count]..        
1f540 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  }..      }....  
1f550 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
1f560 6c 65 6e 67 74 68 20 24 6e 61 6d 65 5d 20 3e 20  length $name] > 
1f570 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
1f580 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
1f590 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
1f5a0 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
1f5b0 20 20 20 20 22 2d 2d 2d 2d 20 6f 74 68 65 72 20      "---- other 
1f5c0 63 6f 75 6e 74 65 72 20 5c 22 22 20 24 6e 61 6d  counter \"" $nam
1f5d0 65 20 22 5c 22 20 68 61 73 20 6e 6f 20 76 61 6c  e "\" has no val
1f5e0 75 65 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 7d 20  ue\n"]..      } 
1f5f0 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
1f600 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
1f610 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 74 68 65 72  annel "---- ther
1f620 65 20 61 72 65 20 6e 6f 20 6f 74 68 65 72 20 63  e are no other c
1f630 6f 75 6e 74 65 72 73 5c 6e 22 0d 0a 20 20 20 20  ounters\n"..    
1f640 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74    }....      ret
1f650 75 72 6e 20 2d 31 0d 0a 20 20 20 20 7d 0d 0a 0c  urn -1..    }...
1f660 0d 0a 20 20 20 20 70 72 6f 63 20 72 65 70 6f 72  ..    proc repor
1f670 74 53 51 4c 69 74 65 52 65 73 6f 75 72 63 65 73  tSQLiteResources
1f680 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1f690 63 68 61 6e 6e 65 6c 20 7b 71 75 69 65 74 20 66  channel {quiet f
1f6a0 61 6c 73 65 7d 20 7b 72 65 73 65 74 20 74 72 75  alse} {reset tru
1f6b0 65 7d 20 7b 63 6f 6c 6c 65 63 74 20 74 72 75 65  e} {collect true
1f6c0 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a  } } {..      #..
1f6d0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66        # NOTE: If
1f6e0 20 70 6f 73 73 69 62 6c 65 2c 20 61 6c 77 61 79   possible, alway
1f6f0 73 20 72 65 73 65 74 20 74 68 65 20 63 61 63 68  s reset the cach
1f700 65 64 20 61 73 73 65 6d 62 6c 79 20 64 69 72 65  ed assembly dire
1f710 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 23 20 20  ctory..      #  
1f720 20 20 20 20 20 61 6e 64 20 74 68 65 20 63 61 63       and the cac
1f730 68 65 64 20 58 4d 4c 20 63 6f 6e 66 69 67 75 72  hed XML configur
1f740 61 74 69 6f 6e 20 66 69 6c 65 20 6e 61 6d 65 2e  ation file name.
1f750 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
1f760 20 69 66 20 7b 5b 68 61 76 65 53 51 4c 69 74 65   if {[haveSQLite
1f770 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20  ObjectCommand]} 
1f780 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1f790 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20  if {[catch {..  
1f7a0 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69          object i
1f7b0 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f  nvoke -flags +No
1f7c0 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20  nPublic \..     
1f7d0 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e           System.
1f7e0 44 61 74 61 2e 53 51 4c 69 74 65 2e 55 6e 73 61  Data.SQLite.Unsa
1f7f0 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 20  feNativeMethods 
1f800 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1f810 20 52 65 73 65 74 43 61 63 68 65 64 41 73 73 65   ResetCachedAsse
1f820 6d 62 6c 79 44 69 72 65 63 74 6f 72 79 0d 0a 20  mblyDirectory.. 
1f830 20 20 20 20 20 20 20 7d 20 65 72 72 6f 72 5d 20         } error] 
1f840 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
1f850 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
1f860 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
1f870 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
1f880 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 72 65  channel "---- re
1f890 73 65 74 20 63 61 63 68 65 64 20 61 73 73 65 6d  set cached assem
1f8a0 62 6c 79 20 64 69 72 65 63 74 6f 72 79 5c 6e 22  bly directory\n"
1f8b0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
1f8c0 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
1f8d0 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21  .          if {!
1f8e0 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
1f8f0 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
1f900 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
1f910 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
1f920 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20            "==== 
1f930 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20  WARNING: failed 
1f940 74 6f 20 72 65 73 65 74 20 63 61 63 68 65 64 20  to reset cached 
1f950 61 73 73 65 6d 62 6c 79 20 64 69 72 65 63 74 6f  assembly directo
1f960 72 79 2c 20 22 20 5c 0d 0a 20 20 20 20 20 20 20  ry, " \..       
1f970 20 20 20 20 20 20 20 20 20 22 65 72 72 6f 72 3a           "error:
1f980 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c   " \n\t $error \
1f990 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  n]..          }.
1f9a0 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
1f9b0 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
1f9c0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62   {..          ob
1f9d0 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61  ject invoke -fla
1f9e0 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d  gs +NonPublic \.
1f9f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53  .              S
1fa00 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
1fa10 65 2e 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65  e.UnsafeNativeMe
1fa20 74 68 6f 64 73 20 5c 0d 0a 20 20 20 20 20 20 20  thods \..       
1fa30 20 20 20 20 20 20 20 52 65 73 65 74 43 61 63 68         ResetCach
1fa40 65 64 58 6d 6c 43 6f 6e 66 69 67 46 69 6c 65 4e  edXmlConfigFileN
1fa50 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 7d 20 65  ame..        } e
1fa60 72 72 6f 72 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  rror] == 0} then
1fa70 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   {..          if
1fa80 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
1fa90 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
1faa0 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d  puts $channel "-
1fab0 2d 2d 2d 20 72 65 73 65 74 20 63 61 63 68 65 64  --- reset cached
1fac0 20 58 4d 4c 20 63 6f 6e 66 69 67 75 72 61 74 69   XML configurati
1fad0 6f 6e 20 66 69 6c 65 20 6e 61 6d 65 5c 6e 22 0d  on file name\n".
1fae0 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
1faf0 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
1fb00 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24            if {!$
1fb10 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
1fb20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
1fb30 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
1fb40 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
1fb50 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57           "==== W
1fb60 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74  ARNING: failed t
1fb70 6f 20 72 65 73 65 74 20 63 61 63 68 65 64 20 58  o reset cached X
1fb80 4d 4c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  ML configuration
1fb90 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   " \..          
1fba0 20 20 20 20 20 20 22 66 69 6c 65 20 6e 61 6d 65        "file name
1fbb0 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20  , error: " \n\t 
1fbc0 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20  $error \n]..    
1fbd0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
1fbe0 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20   }..      }.... 
1fbf0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
1fc00 4e 4f 54 45 3a 20 49 66 20 61 76 61 69 6c 61 62  NOTE: If availab
1fc10 6c 65 2c 20 72 65 70 6f 72 74 20 6f 6e 20 28 61  le, report on (a
1fc20 6e 64 20 70 6f 73 73 69 62 6c 79 20 72 65 73 65  nd possibly rese
1fc30 74 29 20 74 68 65 20 72 75 6e 74 69 6d 65 0d 0a  t) the runtime..
1fc40 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f        #       co
1fc50 6e 66 69 67 75 72 61 74 69 6f 6e 20 73 74 61 74  nfiguration stat
1fc60 69 73 74 69 63 73 2e 0d 0a 20 20 20 20 20 20 23  istics...      #
1fc70 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76  ..      if {[hav
1fc80 65 53 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d  eSQLiteObjectCom
1fc90 6d 61 6e 64 5d 20 26 26 20 5c 0d 0a 20 20 20 20  mand] && \..    
1fca0 20 20 20 20 20 20 5b 68 61 76 65 43 6f 6e 73 74        [haveConst
1fcb0 72 61 69 6e 74 20 62 75 69 6c 64 43 6f 6e 66 69  raint buildConfi
1fcc0 67 75 72 61 74 69 6f 6e 2e 44 65 62 75 67 5d 7d  guration.Debug]}
1fcd0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1fce0 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
1fcf0 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20           object 
1fd00 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e  invoke -flags +N
1fd10 6f 6e 50 75 62 6c 69 63 20 2d 61 6c 69 61 73 20  onPublic -alias 
1fd20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1fd30 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
1fd40 69 74 65 2e 44 65 62 75 67 44 61 74 61 20 47 65  ite.DebugData Ge
1fd50 74 53 65 74 74 69 6e 67 52 65 61 64 43 6f 75 6e  tSettingReadCoun
1fd60 74 73 20 66 61 6c 73 65 0d 0a 20 20 20 20 20 20  ts false..      
1fd70 20 20 7d 20 73 65 74 74 69 6e 67 52 65 61 64 43    } settingReadC
1fd80 6f 75 6e 74 73 5d 20 3d 3d 20 30 7d 20 74 68 65  ounts] == 0} the
1fd90 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73  n {..          s
1fda0 65 74 20 6e 61 6d 65 43 6f 75 6e 74 20 5b 24 73  et nameCount [$s
1fdb0 65 74 74 69 6e 67 52 65 61 64 43 6f 75 6e 74 73  ettingReadCounts
1fdc0 20 43 6f 75 6e 74 5d 0d 0a 20 20 20 20 20 20 20   Count]..       
1fdd0 20 20 20 73 65 74 20 76 61 6c 75 65 43 6f 75 6e     set valueCoun
1fde0 74 20 30 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  t 0....         
1fdf0 20 6f 62 6a 65 63 74 20 66 6f 72 65 61 63 68 20   object foreach 
1fe00 2d 61 6c 69 61 73 20 70 61 69 72 20 24 73 65 74  -alias pair $set
1fe10 74 69 6e 67 52 65 61 64 43 6f 75 6e 74 73 20 7b  tingReadCounts {
1fe20 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  ..            in
1fe30 63 72 20 76 61 6c 75 65 43 6f 75 6e 74 20 5b 24  cr valueCount [$
1fe40 70 61 69 72 20 56 61 6c 75 65 5d 0d 0a 0d 0a 20  pair Value].... 
1fe50 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
1fe60 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
1fe70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70                tp
1fe80 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
1fe90 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
1fea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
1feb0 2d 2d 2d 20 73 65 74 74 69 6e 67 20 5c 22 22 20  --- setting \"" 
1fec0 5b 24 70 61 69 72 20 4b 65 79 5d 20 22 5c 22 20  [$pair Key] "\" 
1fed0 77 61 73 20 72 65 61 64 20 22 20 5c 0d 0a 20 20  was read " \..  
1fee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fef0 5b 24 70 61 69 72 20 56 61 6c 75 65 5d 20 22 20  [$pair Value] " 
1ff00 74 69 6d 65 73 5c 6e 22 5d 0d 0a 20 20 20 20 20  times\n"]..     
1ff10 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1ff20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
1ff30 20 20 20 69 66 20 7b 24 72 65 73 65 74 7d 20 74     if {$reset} t
1ff40 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1ff50 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d     if {[catch {.
1ff60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f  .              o
1ff70 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c  bject invoke -fl
1ff80 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 2d  ags +NonPublic -
1ff90 61 6c 69 61 73 20 5c 0d 0a 20 20 20 20 20 20 20  alias \..       
1ffa0 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65             Syste
1ffb0 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 44 65  m.Data.SQLite.De
1ffc0 62 75 67 44 61 74 61 20 43 6c 65 61 72 53 65 74  bugData ClearSet
1ffd0 74 69 6e 67 52 65 61 64 43 6f 75 6e 74 73 20 66  tingReadCounts f
1ffe0 61 6c 73 65 0d 0a 20 20 20 20 20 20 20 20 20 20  alse..          
1fff0 20 20 7d 20 65 72 72 6f 72 5d 20 3d 3d 20 30 7d    } error] == 0}
20000 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
20010 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
20020 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
20030 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
20040 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
20050 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
20060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
20070 2d 2d 2d 20 72 65 73 65 74 20 73 65 74 74 69 6e  --- reset settin
20080 67 20 73 74 61 74 69 73 74 69 63 73 20 66 6f 72  g statistics for
20090 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 22 20   the previous " 
200a0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
200b0 20 20 20 20 20 20 20 24 6e 61 6d 65 43 6f 75 6e         $nameCoun
200c0 74 20 22 20 6e 61 6d 65 73 20 61 6e 64 20 22 20  t " names and " 
200d0 24 76 61 6c 75 65 43 6f 75 6e 74 20 22 20 76 61  $valueCount " va
200e0 6c 75 65 73 20 72 65 61 64 5c 6e 22 5d 0d 0a 20  lues read\n"].. 
200f0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
20100 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c              } el
20110 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
20120 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
20130 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
20140 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
20150 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
20160 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
20170 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d             "====
20180 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64   WARNING: failed
20190 20 74 6f 20 72 65 73 65 74 20 73 65 74 74 69 6e   to reset settin
201a0 67 20 73 74 61 74 69 73 74 69 63 73 20 66 6f 72  g statistics for
201b0 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   " \..          
201c0 20 20 20 20 20 20 20 20 20 20 22 74 68 65 20 70            "the p
201d0 72 65 76 69 6f 75 73 20 22 20 24 6e 61 6d 65 43  revious " $nameC
201e0 6f 75 6e 74 20 22 20 6e 61 6d 65 73 20 61 6e 64  ount " names and
201f0 20 22 20 24 76 61 6c 75 65 43 6f 75 6e 74 20 5c   " $valueCount \
20200 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
20210 20 20 20 20 20 20 22 20 76 61 6c 75 65 73 20 72        " values r
20220 65 61 64 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e  ead, error: " \n
20230 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20  \t $error \n].. 
20240 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
20250 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
20260 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
20270 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
20280 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
20290 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20           object 
202a0 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e  invoke -flags +N
202b0 6f 6e 50 75 62 6c 69 63 20 2d 61 6c 69 61 73 20  onPublic -alias 
202c0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
202d0 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
202e0 69 74 65 2e 44 65 62 75 67 44 61 74 61 20 47 65  ite.DebugData Ge
202f0 74 53 65 74 74 69 6e 67 52 65 61 64 43 6f 75 6e  tSettingReadCoun
20300 74 73 20 74 72 75 65 0d 0a 20 20 20 20 20 20 20  ts true..       
20310 20 7d 20 73 65 74 74 69 6e 67 46 69 6c 65 52 65   } settingFileRe
20320 61 64 43 6f 75 6e 74 73 5d 20 3d 3d 20 30 7d 20  adCounts] == 0} 
20330 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
20340 20 20 73 65 74 20 6e 61 6d 65 43 6f 75 6e 74 20    set nameCount 
20350 5b 24 73 65 74 74 69 6e 67 46 69 6c 65 52 65 61  [$settingFileRea
20360 64 43 6f 75 6e 74 73 20 43 6f 75 6e 74 5d 0d 0a  dCounts Count]..
20370 20 20 20 20 20 20 20 20 20 20 73 65 74 20 76 61            set va
20380 6c 75 65 43 6f 75 6e 74 20 30 0d 0a 0d 0a 20 20  lueCount 0....  
20390 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 66          object f
203a0 6f 72 65 61 63 68 20 2d 61 6c 69 61 73 20 70 61  oreach -alias pa
203b0 69 72 20 24 73 65 74 74 69 6e 67 46 69 6c 65 52  ir $settingFileR
203c0 65 61 64 43 6f 75 6e 74 73 20 7b 0d 0a 20 20 20  eadCounts {..   
203d0 20 20 20 20 20 20 20 20 20 69 6e 63 72 20 76 61           incr va
203e0 6c 75 65 43 6f 75 6e 74 20 5b 24 70 61 69 72 20  lueCount [$pair 
203f0 56 61 6c 75 65 5d 0d 0a 0d 0a 20 20 20 20 20 20  Value]....      
20400 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
20410 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
20420 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
20430 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
20440 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
20450 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73           "---- s
20460 65 74 74 69 6e 67 20 5c 22 22 20 5b 24 70 61 69  etting \"" [$pai
20470 72 20 4b 65 79 5d 20 22 5c 22 20 77 61 73 20 72  r Key] "\" was r
20480 65 61 64 20 22 20 5c 0d 0a 20 20 20 20 20 20 20  ead " \..       
20490 20 20 20 20 20 20 20 20 20 20 20 5b 24 70 61 69             [$pai
204a0 72 20 56 61 6c 75 65 5d 20 22 20 74 69 6d 65 73  r Value] " times
204b0 20 66 72 6f 6d 20 74 68 65 20 63 6f 6e 66 69 67   from the config
204c0 75 72 61 74 69 6f 6e 20 66 69 6c 65 5c 6e 22 5d  uration file\n"]
204d0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
204e0 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  .          }....
204f0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 24 72            if {$r
20500 65 73 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  eset} then {..  
20510 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63            if {[c
20520 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
20530 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76        object inv
20540 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50  oke -flags +NonP
20550 75 62 6c 69 63 20 2d 61 6c 69 61 73 20 5c 0d 0a  ublic -alias \..
20560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20570 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51    System.Data.SQ
20580 4c 69 74 65 2e 44 65 62 75 67 44 61 74 61 20 43  Lite.DebugData C
20590 6c 65 61 72 53 65 74 74 69 6e 67 52 65 61 64 43  learSettingReadC
205a0 6f 75 6e 74 73 20 74 72 75 65 0d 0a 20 20 20 20  ounts true..    
205b0 20 20 20 20 20 20 20 20 7d 20 65 72 72 6f 72 5d          } error]
205c0 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
205d0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
205e0 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
205f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
20600 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
20610 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
20620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20630 20 20 20 20 22 2d 2d 2d 2d 20 72 65 73 65 74 20      "---- reset 
20640 73 65 74 74 69 6e 67 20 73 74 61 74 69 73 74 69  setting statisti
20650 63 73 20 66 6f 72 20 74 68 65 20 70 72 65 76 69  cs for the previ
20660 6f 75 73 20 22 20 5c 0d 0a 20 20 20 20 20 20 20  ous " \..       
20670 20 20 20 20 20 20 20 20 20 20 20 20 20 24 6e 61               $na
20680 6d 65 43 6f 75 6e 74 20 22 20 6e 61 6d 65 73 20  meCount " names 
20690 61 6e 64 20 22 20 24 76 61 6c 75 65 43 6f 75 6e  and " $valueCoun
206a0 74 20 22 20 76 61 6c 75 65 73 20 72 65 61 64 20  t " values read 
206b0 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
206c0 20 20 20 20 20 20 20 20 20 22 66 72 6f 6d 20 74           "from t
206d0 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  he configuration
206e0 20 66 69 6c 65 5c 6e 22 5d 0d 0a 20 20 20 20 20   file\n"]..     
206f0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
20700 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
20710 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
20720 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
20730 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
20740 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
20750 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
20760 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
20770 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52         "==== WAR
20780 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20  NING: failed to 
20790 72 65 73 65 74 20 73 65 74 74 69 6e 67 20 73 74  reset setting st
207a0 61 74 69 73 74 69 63 73 20 66 6f 72 20 22 20 5c  atistics for " \
207b0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
207c0 20 20 20 20 20 20 22 74 68 65 20 70 72 65 76 69        "the previ
207d0 6f 75 73 20 22 20 24 6e 61 6d 65 43 6f 75 6e 74  ous " $nameCount
207e0 20 22 20 6e 61 6d 65 73 20 61 6e 64 20 22 20 24   " names and " $
207f0 76 61 6c 75 65 43 6f 75 6e 74 20 5c 0d 0a 20 20  valueCount \..  
20800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20810 20 20 22 20 76 61 6c 75 65 73 20 72 65 61 64 20    " values read 
20820 66 72 6f 6d 20 74 68 65 20 63 6f 6e 66 69 67 75  from the configu
20830 72 61 74 69 6f 6e 20 66 69 6c 65 2c 20 65 72 72  ration file, err
20840 6f 72 3a 20 22 20 5c 6e 5c 74 20 5c 0d 0a 20 20  or: " \n\t \..  
20850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20860 20 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20    $error \n]..  
20870 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
20880 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
20890 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
208a0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
208b0 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20  if {[catch {..  
208c0 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69          object i
208d0 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f  nvoke -flags +No
208e0 6e 50 75 62 6c 69 63 20 2d 61 6c 69 61 73 20 5c  nPublic -alias \
208f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
20900 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
20910 74 65 2e 44 65 62 75 67 44 61 74 61 20 47 65 74  te.DebugData Get
20920 4f 74 68 65 72 43 6f 75 6e 74 73 0d 0a 20 20 20  OtherCounts..   
20930 20 20 20 20 20 7d 20 6f 74 68 65 72 43 6f 75 6e       } otherCoun
20940 74 73 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  ts] == 0} then {
20950 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
20960 6e 61 6d 65 43 6f 75 6e 74 20 5b 24 6f 74 68 65  nameCount [$othe
20970 72 43 6f 75 6e 74 73 20 43 6f 75 6e 74 5d 0d 0a  rCounts Count]..
20980 20 20 20 20 20 20 20 20 20 20 73 65 74 20 76 61            set va
20990 6c 75 65 43 6f 75 6e 74 20 30 0d 0a 0d 0a 20 20  lueCount 0....  
209a0 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 66          object f
209b0 6f 72 65 61 63 68 20 2d 61 6c 69 61 73 20 70 61  oreach -alias pa
209c0 69 72 20 24 6f 74 68 65 72 43 6f 75 6e 74 73 20  ir $otherCounts 
209d0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  {..            i
209e0 6e 63 72 20 76 61 6c 75 65 43 6f 75 6e 74 20 5b  ncr valueCount [
209f0 24 70 61 69 72 20 56 61 6c 75 65 5d 0d 0a 0d 0a  $pair Value]....
20a00 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
20a10 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
20a20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  .              t
20a30 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
20a40 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
20a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
20a60 2d 2d 2d 2d 20 6f 74 68 65 72 20 63 6f 75 6e 74  ---- other count
20a70 65 72 20 5c 22 22 20 5b 24 70 61 69 72 20 4b 65  er \"" [$pair Ke
20a80 79 5d 20 22 5c 22 20 68 61 73 20 76 61 6c 75 65  y] "\" has value
20a90 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   " \..          
20aa0 20 20 20 20 20 20 20 20 5b 24 70 61 69 72 20 56          [$pair V
20ab0 61 6c 75 65 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20  alue] \n]..     
20ac0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
20ad0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
20ae0 20 20 20 69 66 20 7b 24 72 65 73 65 74 7d 20 74     if {$reset} t
20af0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
20b00 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d     if {[catch {.
20b10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f  .              o
20b20 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c  bject invoke -fl
20b30 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 2d  ags +NonPublic -
20b40 61 6c 69 61 73 20 5c 0d 0a 20 20 20 20 20 20 20  alias \..       
20b50 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65             Syste
20b60 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 44 65  m.Data.SQLite.De
20b70 62 75 67 44 61 74 61 20 43 6c 65 61 72 4f 74 68  bugData ClearOth
20b80 65 72 43 6f 75 6e 74 73 0d 0a 20 20 20 20 20 20  erCounts..      
20b90 20 20 20 20 20 20 7d 20 65 72 72 6f 72 5d 20 3d        } error] =
20ba0 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
20bb0 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
20bc0 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
20bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20be0 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
20bf0 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
20c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20c10 20 20 22 2d 2d 2d 2d 20 72 65 73 65 74 20 6f 74    "---- reset ot
20c20 68 65 72 20 63 6f 75 6e 74 65 72 73 20 66 6f 72  her counters for
20c30 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 22 20   the previous " 
20c40 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
20c50 20 20 20 20 20 20 20 24 6e 61 6d 65 43 6f 75 6e         $nameCoun
20c60 74 20 22 20 6e 61 6d 65 73 20 61 6e 64 20 22 20  t " names and " 
20c70 24 76 61 6c 75 65 43 6f 75 6e 74 20 22 20 76 61  $valueCount " va
20c80 6c 75 65 73 5c 6e 22 5d 0d 0a 20 20 20 20 20 20  lues\n"]..      
20c90 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
20ca0 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
20cb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
20cc0 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
20cd0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
20ce0 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
20cf0 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
20d00 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
20d10 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e        "==== WARN
20d20 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 72  ING: failed to r
20d30 65 73 65 74 20 6f 74 68 65 72 20 63 6f 75 6e 74  eset other count
20d40 65 72 73 20 66 6f 72 20 22 20 5c 0d 0a 20 20 20  ers for " \..   
20d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d60 20 22 74 68 65 20 70 72 65 76 69 6f 75 73 20 22   "the previous "
20d70 20 24 6e 61 6d 65 43 6f 75 6e 74 20 22 20 6e 61   $nameCount " na
20d80 6d 65 73 20 61 6e 64 20 22 20 24 76 61 6c 75 65  mes and " $value
20d90 43 6f 75 6e 74 20 5c 0d 0a 20 20 20 20 20 20 20  Count \..       
20da0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 76               " v
20db0 61 6c 75 65 73 2c 20 65 72 72 6f 72 3a 20 22 20  alues, error: " 
20dc0 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d  \n\t $error \n].
20dd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
20de0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
20df0 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
20e00 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
20e10 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 68  ....      if {[h
20e20 61 76 65 53 51 4c 69 74 65 4f 62 6a 65 63 74 43  aveSQLiteObjectC
20e30 6f 6d 6d 61 6e 64 5d 20 26 26 20 5c 0d 0a 20 20  ommand] && \..  
20e40 20 20 20 20 20 20 20 20 5b 68 61 76 65 53 51 4c          [haveSQL
20e50 69 74 65 44 65 66 69 6e 65 43 6f 6e 73 74 61 6e  iteDefineConstan
20e60 74 20 49 4e 54 45 52 4f 50 5f 56 49 52 54 55 41  t INTEROP_VIRTUA
20e70 4c 5f 54 41 42 4c 45 5d 20 26 26 20 5c 0d 0a 20  L_TABLE] && \.. 
20e80 20 20 20 20 20 20 20 20 20 5b 68 61 76 65 53 51           [haveSQ
20e90 4c 69 74 65 44 65 66 69 6e 65 43 6f 6e 73 74 61  LiteDefineConsta
20ea0 6e 74 20 54 52 41 43 4b 5f 4d 45 4d 4f 52 59 5f  nt TRACK_MEMORY_
20eb0 42 59 54 45 53 5d 7d 20 74 68 65 6e 20 7b 0d 0a  BYTES]} then {..
20ec0 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
20ed0 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
20ee0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
20ef0 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 75 72 72  annel "---- curr
20f00 65 6e 74 20 6d 65 6d 6f 72 79 20 69 6e 20 75 73  ent memory in us
20f10 65 20 62 79 20 53 51 4c 69 74 65 4d 65 6d 6f 72  e by SQLiteMemor
20f20 79 2e 2e 2e 20 22 0d 0a 20 20 20 20 20 20 20 20  y... "..        
20f30 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20  }....        if 
20f40 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
20f50 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f       object invo
20f60 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75  ke -flags +NonPu
20f70 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20  blic \..        
20f80 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74        System.Dat
20f90 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 4d  a.SQLite.SQLiteM
20fa0 65 6d 6f 72 79 20 62 79 74 65 73 41 6c 6c 6f 63  emory bytesAlloc
20fb0 61 74 65 64 0d 0a 20 20 20 20 20 20 20 20 7d 20  ated..        } 
20fc0 6d 65 6d 6f 72 79 5d 20 3d 3d 20 30 7d 20 74 68  memory] == 0} th
20fd0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
20fe0 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
20ff0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
21000 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
21010 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d  [appendArgs $mem
21020 6f 72 79 20 22 20 62 79 74 65 73 5c 6e 22 5d 0d  ory " bytes\n"].
21030 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
21040 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
21050 20 20 20 20 20 20 20 20 20 20 73 65 74 20 6d 65            set me
21060 6d 6f 72 79 20 75 6e 6b 6e 6f 77 6e 0d 0a 0d 0a  mory unknown....
21070 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24            if {!$
21080 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
21090 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
210a0 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
210b0 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 5c 6e  dArgs $memory \n
210c0 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ]..          }..
210d0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
210e0 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
210f0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
21100 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
21110 65 6c 20 22 2d 2d 2d 2d 20 6d 61 78 69 6d 75 6d  el "---- maximum
21120 20 6d 65 6d 6f 72 79 20 69 6e 20 75 73 65 20 62   memory in use b
21130 79 20 53 51 4c 69 74 65 4d 65 6d 6f 72 79 2e 2e  y SQLiteMemory..
21140 2e 20 22 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  . "..        }..
21150 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63  ..        if {[c
21160 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
21170 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20    object invoke 
21180 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69  -flags +NonPubli
21190 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  c \..           
211a0 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53     System.Data.S
211b0 51 4c 69 74 65 2e 53 51 4c 69 74 65 4d 65 6d 6f  QLite.SQLiteMemo
211c0 72 79 20 6d 61 78 69 6d 75 6d 42 79 74 65 73 41  ry maximumBytesA
211d0 6c 6c 6f 63 61 74 65 64 0d 0a 20 20 20 20 20 20  llocated..      
211e0 20 20 7d 20 6d 65 6d 6f 72 79 5d 20 3d 3d 20 30    } memory] == 0
211f0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
21200 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
21210 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
21220 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
21230 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
21240 24 6d 65 6d 6f 72 79 20 22 20 62 79 74 65 73 5c  $memory " bytes\
21250 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  n"]..          }
21260 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65  ..        } else
21270 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   {..          se
21280 74 20 6d 65 6d 6f 72 79 20 75 6e 6b 6e 6f 77 6e  t memory unknown
21290 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66  ....          if
212a0 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
212b0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
212c0 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
212d0 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72  ppendArgs $memor
212e0 79 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  y \n]..         
212f0 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20   }..        }.. 
21300 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
21310 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
21320 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75  n {..        tpu
21330 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d  ts $channel "---
21340 2d 20 63 75 72 72 65 6e 74 20 6d 65 6d 6f 72 79  - current memory
21350 20 69 6e 20 75 73 65 20 62 79 20 53 51 4c 69 74   in use by SQLit
21360 65 2e 2e 2e 20 22 0d 0a 20 20 20 20 20 20 7d 0d  e... "..      }.
21370 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 68 61  ...      if {[ha
21380 76 65 53 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f  veSQLiteObjectCo
21390 6d 6d 61 6e 64 5d 7d 20 74 68 65 6e 20 7b 0d 0a  mmand]} then {..
213a0 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
213b0 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
213c0 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66  object invoke -f
213d0 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20  lags +NonPublic 
213e0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
213f0 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
21400 69 74 65 2e 55 6e 73 61 66 65 4e 61 74 69 76 65  ite.UnsafeNative
21410 4d 65 74 68 6f 64 73 20 73 71 6c 69 74 65 33 5f  Methods sqlite3_
21420 6d 65 6d 6f 72 79 5f 75 73 65 64 0d 0a 20 20 20  memory_used..   
21430 20 20 20 20 20 7d 20 6d 65 6d 6f 72 79 5d 20 3d       } memory] =
21440 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
21450 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
21460 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
21470 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
21480 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
21490 67 73 20 24 6d 65 6d 6f 72 79 20 22 20 62 79 74  gs $memory " byt
214a0 65 73 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20  es\n"]..        
214b0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65    }..        } e
214c0 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
214d0 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
214e0 4e 4f 54 45 3a 20 4d 61 79 62 65 20 74 68 65 20  NOTE: Maybe the 
214f0 53 51 4c 69 74 65 20 63 6f 72 65 20 6c 69 62 72  SQLite core libr
21500 61 72 79 20 69 73 20 75 6e 61 76 61 69 6c 61 62  ary is unavailab
21510 6c 65 3f 0d 0a 20 20 20 20 20 20 20 20 20 20 23  le?..          #
21520 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
21530 6d 65 6d 6f 72 79 20 75 6e 6b 6e 6f 77 6e 0d 0a  memory unknown..
21540 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
21550 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
21560 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
21570 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
21580 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20  endArgs $memory 
21590 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  \n]..          }
215a0 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
215b0 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
215c0 20 20 20 20 20 73 65 74 20 6d 65 6d 6f 72 79 20       set memory 
215d0 75 6e 61 76 61 69 6c 61 62 6c 65 0d 0a 0d 0a 20  unavailable.... 
215e0 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
215f0 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
21600 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
21610 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
21620 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20   $memory \n]..  
21630 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
21640 0d 0a 0d 0a 20 20 20 20 20 20 73 65 74 20 72 65  ....      set re
21650 73 75 6c 74 20 24 6d 65 6d 6f 72 79 3b 20 23 20  sult $memory; # 
21660 4e 4f 54 45 3a 20 52 65 74 75 72 6e 20 6d 65 6d  NOTE: Return mem
21670 6f 72 79 20 69 6e 2d 75 73 65 20 74 6f 20 6f 75  ory in-use to ou
21680 72 20 63 61 6c 6c 65 72 2e 0d 0a 0d 0a 20 20 20  r caller.....   
21690 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
216a0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
216b0 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22  tputs $channel "
216c0 2d 2d 2d 2d 20 6d 61 78 69 6d 75 6d 20 6d 65 6d  ---- maximum mem
216d0 6f 72 79 20 69 6e 20 75 73 65 20 62 79 20 53 51  ory in use by SQ
216e0 4c 69 74 65 2e 2e 2e 20 22 0d 0a 20 20 20 20 20  Lite... "..     
216f0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b   }....      if {
21700 5b 68 61 76 65 53 51 4c 69 74 65 4f 62 6a 65 63  [haveSQLiteObjec
21710 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65 6e 20  tCommand]} then 
21720 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  {..        if {[
21730 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
21740 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65     object invoke
21750 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c   -flags +NonPubl
21760 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ic \..          
21770 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e      System.Data.
21780 53 51 4c 69 74 65 2e 55 6e 73 61 66 65 4e 61 74  SQLite.UnsafeNat
21790 69 76 65 4d 65 74 68 6f 64 73 20 5c 0d 0a 20 20  iveMethods \..  
217a0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
217b0 74 65 33 5f 6d 65 6d 6f 72 79 5f 68 69 67 68 77  te3_memory_highw
217c0 61 74 65 72 20 30 0d 0a 20 20 20 20 20 20 20 20  ater 0..        
217d0 7d 20 6d 65 6d 6f 72 79 5d 20 3d 3d 20 30 7d 20  } memory] == 0} 
217e0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
217f0 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
21800 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
21810 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
21820 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d  l [appendArgs $m
21830 65 6d 6f 72 79 20 22 20 62 79 74 65 73 5c 6e 22  emory " bytes\n"
21840 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ]..          }..
21850 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
21860 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
21870 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
21880 20 4d 61 79 62 65 20 74 68 65 20 53 51 4c 69 74   Maybe the SQLit
21890 65 20 63 6f 72 65 20 6c 69 62 72 61 72 79 20 69  e core library i
218a0 73 20 75 6e 61 76 61 69 6c 61 62 6c 65 3f 0d 0a  s unavailable?..
218b0 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
218c0 20 20 20 20 20 20 20 73 65 74 20 6d 65 6d 6f 72         set memor
218d0 79 20 75 6e 6b 6e 6f 77 6e 0d 0a 0d 0a 20 20 20  y unknown....   
218e0 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
218f0 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
21900 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
21910 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
21920 67 73 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a  gs $memory \n]..
21930 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
21940 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20       }..      } 
21950 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
21960 73 65 74 20 6d 65 6d 6f 72 79 20 75 6e 61 76 61  set memory unava
21970 69 6c 61 62 6c 65 0d 0a 0d 0a 20 20 20 20 20 20  ilable....      
21980 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
21990 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
219a0 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
219b0 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d  [appendArgs $mem
219c0 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ory \n]..       
219d0 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20   }..      }.... 
219e0 20 20 20 20 20 69 66 20 7b 24 63 6f 6c 6c 65 63       if {$collec
219f0 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
21a00 20 20 20 63 6f 6c 6c 65 63 74 47 61 72 62 61 67     collectGarbag
21a10 65 20 24 63 68 61 6e 6e 65 6c 0d 0a 20 20 20 20  e $channel..    
21a20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20    }....      if 
21a30 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
21a40 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
21a50 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63  $channel "---- c
21a60 75 72 72 65 6e 74 20 6d 65 6d 6f 72 79 20 69 6e  urrent memory in
21a70 20 75 73 65 20 62 79 20 74 68 65 20 43 4c 52 2e   use by the CLR.
21a80 2e 2e 20 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  .. "..      }...
21a90 0a 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65  .      if {[have
21aa0 53 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d  SQLiteObjectComm
21ab0 61 6e 64 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  and]} then {..  
21ac0 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
21ad0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62   {..          ob
21ae0 6a 65 63 74 20 69 6e 76 6f 6b 65 20 47 43 20 47  ject invoke GC G
21af0 65 74 54 6f 74 61 6c 4d 65 6d 6f 72 79 20 66 61  etTotalMemory fa
21b00 6c 73 65 0d 0a 20 20 20 20 20 20 20 20 7d 20 6d  lse..        } m
21b10 65 6d 6f 72 79 5d 20 3d 3d 20 30 7d 20 74 68 65  emory] == 0} the
21b20 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69  n {..          i
21b30 66 20 7b 5b 73 74 72 69 6e 67 20 69 73 20 69 6e  f {[string is in
21b40 74 65 67 65 72 20 2d 73 74 72 69 63 74 20 24 6d  teger -strict $m
21b50 65 6d 6f 72 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a  emory]} then {..
21b60 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
21b70 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
21b80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  .              t
21b90 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
21ba0 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72  ppendArgs $memor
21bb0 79 20 22 20 62 79 74 65 73 5c 6e 22 5d 0d 0a 20  y " bytes\n"].. 
21bc0 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
21bd0 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
21be0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65  ..            se
21bf0 74 20 6d 65 6d 6f 72 79 20 69 6e 76 61 6c 69 64  t memory invalid
21c00 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
21c10 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
21c20 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
21c30 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
21c40 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d  l [appendArgs $m
21c50 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20 20 20  emory \n]..     
21c60 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
21c70 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
21c80 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
21c90 20 20 20 73 65 74 20 6d 65 6d 6f 72 79 20 75 6e     set memory un
21ca0 6b 6e 6f 77 6e 0d 0a 0d 0a 20 20 20 20 20 20 20  known....       
21cb0 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
21cc0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
21cd0 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
21ce0 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24  el [appendArgs $
21cf0 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20 20  memory \n]..    
21d00 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
21d10 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65   }..      } else
21d20 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   {..        set 
21d30 6d 65 6d 6f 72 79 20 75 6e 61 76 61 69 6c 61 62  memory unavailab
21d40 6c 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66  le....        if
21d50 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
21d60 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75  {..          tpu
21d70 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
21d80 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20  endArgs $memory 
21d90 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  \n]..        }..
21da0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
21db0 20 72 65 74 75 72 6e 20 24 72 65 73 75 6c 74 0d   return $result.
21dc0 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
21dd0 72 6f 63 20 63 68 65 63 6b 46 6f 72 53 51 4c 69  roc checkForSQLi
21de0 74 65 44 69 72 65 63 74 6f 72 69 65 73 20 7b 20  teDirectories { 
21df0 63 68 61 6e 6e 65 6c 20 7b 72 65 73 65 74 20 66  channel {reset f
21e00 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  alse} } {..     
21e10 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
21e20 3a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 73  : Check if the s
21e30 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74  qlite3_win32_set
21e40 5f 64 69 72 65 63 74 6f 72 79 20 66 75 6e 63 74  _directory funct
21e50 69 6f 6e 20 69 73 20 61 76 61 69 6c 61 62 6c 65  ion is available
21e60 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
21e70 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
21e80 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 22 2d   \..          "-
21e90 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72  --- checking for
21ea0 20 66 75 6e 63 74 69 6f 6e 20 73 71 6c 69 74 65   function sqlite
21eb0 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65  3_win32_set_dire
21ec0 63 74 6f 72 79 2e 2e 2e 20 22 0d 0a 0d 0a 20 20  ctory... "....  
21ed0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
21ee0 4f 54 45 3a 20 54 68 69 73 20 63 61 6c 6c 20 74  OTE: This call t
21ef0 6f 20 74 68 65 20 73 71 6c 69 74 65 33 5f 77 69  o the sqlite3_wi
21f00 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72  n32_set_director
21f10 79 20 66 75 6e 63 74 69 6f 6e 20 75 73 65 73 20  y function uses 
21f20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  the..      #    
21f30 20 20 20 69 6e 76 61 6c 69 64 20 76 61 6c 75 65     invalid value
21f40 20 30 20 66 6f 72 20 74 68 65 20 66 69 72 73 74   0 for the first
21f50 20 61 72 67 75 6d 65 6e 74 2e 20 20 54 68 69 73   argument.  This
21f60 20 63 6f 64 65 20 69 73 20 64 65 73 69 67 6e 65   code is designe
21f70 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  d..      #      
21f80 20 74 6f 20 63 68 65 63 6b 20 69 66 20 63 61 6c   to check if cal
21f90 6c 69 6e 67 20 74 68 65 20 66 75 6e 63 74 69 6f  ling the functio
21fa0 6e 20 77 69 6c 6c 20 72 61 69 73 65 20 61 6e 20  n will raise an 
21fb0 65 78 63 65 70 74 69 6f 6e 20 28 69 2e 65 2e 0d  exception (i.e..
21fc0 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74  .      #       t
21fd0 68 65 20 61 63 74 75 61 6c 20 72 65 73 75 6c 74  he actual result
21fe0 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   of the function
21ff0 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65 72   does not matter
22000 20 61 73 20 6c 6f 6e 67 20 61 73 20 6e 6f 0d 0a   as long as no..
22010 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64 69        #       di
22020 72 65 63 74 6f 72 79 20 69 73 20 63 68 61 6e 67  rectory is chang
22030 65 64 29 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ed)...      #.. 
22040 20 20 20 20 20 69 66 20 7b 5b 69 73 57 69 6e 64       if {[isWind
22050 6f 77 73 5d 20 26 26 20 5b 63 61 74 63 68 20 7b  ows] && [catch {
22060 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74  ..        object
22070 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b   invoke -flags +
22080 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20  NonPublic \..   
22090 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e           System.
220a0 44 61 74 61 2e 53 51 4c 69 74 65 2e 55 6e 73 61  Data.SQLite.Unsa
220b0 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 20  feNativeMethods 
220c0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  \..            s
220d0 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74  qlite3_win32_set
220e0 5f 64 69 72 65 63 74 6f 72 79 20 30 20 6e 75 6c  _directory 0 nul
220f0 6c 0d 0a 20 20 20 20 20 20 7d 5d 20 3d 3d 20 30  l..      }] == 0
22100 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
22110 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
22120 4f 54 45 3a 20 43 61 6c 6c 69 6e 67 20 74 68 65  OTE: Calling the
22130 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73   sqlite3_win32_s
22140 65 74 5f 64 69 72 65 63 74 6f 72 79 20 66 75 6e  et_directory fun
22150 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 0d 0a  ction does not..
22160 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
22170 63 61 75 73 65 20 61 6e 20 65 78 63 65 70 74 69  cause an excepti
22180 6f 6e 3b 20 74 68 65 72 65 66 6f 72 65 2c 20 69  on; therefore, i
22190 74 20 6d 75 73 74 20 62 65 20 61 76 61 69 6c 61  t must be availa
221a0 62 6c 65 20 28 69 2e 65 2e 0d 0a 20 20 20 20 20  ble (i.e...     
221b0 20 20 20 23 20 20 20 20 20 20 20 65 76 65 6e 20     #       even 
221c0 74 68 6f 75 67 68 20 69 74 20 73 68 6f 75 6c 64  though it should
221d0 20 72 65 74 75 72 6e 20 61 20 66 61 69 6c 75 72   return a failur
221e0 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 69 6e  e return code in
221f0 20 74 68 69 73 0d 0a 20 20 20 20 20 20 20 20 23   this..        #
22200 20 20 20 20 20 20 20 63 61 73 65 29 2e 0d 0a 20         case)... 
22210 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
22220 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20    addConstraint 
22230 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65  sqlite3_win32_se
22240 74 5f 64 69 72 65 63 74 6f 72 79 0d 0a 0d 0a 20  t_directory.... 
22250 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
22260 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 0d 0a 20  annel yes\n.... 
22270 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
22280 20 20 23 20 4e 4f 54 45 3a 20 44 6f 65 73 20 6f    # NOTE: Does o
22290 75 72 20 63 61 6c 6c 65 72 20 77 61 6e 74 20 74  ur caller want t
222a0 6f 20 72 65 73 65 74 20 74 68 65 20 64 69 72 65  o reset the dire
222b0 63 74 6f 72 69 65 73 3f 0d 0a 20 20 20 20 20 20  ctories?..      
222c0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20    #..        if 
222d0 7b 24 72 65 73 65 74 7d 20 74 68 65 6e 20 7b 0d  {$reset} then {.
222e0 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
222f0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
22300 4e 6f 77 20 6d 61 6b 65 20 73 75 72 65 20 74 68  Now make sure th
22310 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 74  e database and t
22320 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f  emporary directo
22330 72 69 65 73 20 61 72 65 0d 0a 20 20 20 20 20 20  ries are..      
22340 20 20 20 20 23 20 20 20 20 20 20 20 72 65 73 65      #       rese
22350 74 20 74 68 65 69 72 20 64 65 66 61 75 6c 74 20  t their default 
22360 76 61 6c 75 65 73 2c 20 77 68 69 63 68 20 73 68  values, which sh
22370 6f 75 6c 64 20 62 65 20 6e 75 6c 6c 20 66 6f 72  ould be null for
22380 20 62 6f 74 68 2e 0d 0a 20 20 20 20 20 20 20 20   both...        
22390 20 20 23 20 20 20 20 20 20 20 53 69 6e 63 65 20    #       Since 
223a0 74 68 65 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  the sqlite3_win3
223b0 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79 20  2_set_directory 
223c0 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 76 61 69  function is avai
223d0 6c 61 62 6c 65 2c 0d 0a 20 20 20 20 20 20 20 20  lable,..        
223e0 20 20 23 20 20 20 20 20 20 20 75 73 65 20 69 74    #       use it
223f0 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
22400 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 7b 73            for {s
22410 65 74 20 69 6e 64 65 78 20 31 7d 20 7b 24 69 6e  et index 1} {$in
22420 64 65 78 20 3c 20 33 7d 20 7b 69 6e 63 72 20 69  dex < 3} {incr i
22430 6e 64 65 78 7d 20 7b 0d 0a 20 20 20 20 20 20 20  ndex} {..       
22440 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
22450 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
22460 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d   object invoke -
22470 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63  flags +NonPublic
22480 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
22490 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74        System.Dat
224a0 61 2e 53 51 4c 69 74 65 2e 55 6e 73 61 66 65 4e  a.SQLite.UnsafeN
224b0 61 74 69 76 65 4d 65 74 68 6f 64 73 20 5c 0d 0a  ativeMethods \..
224c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
224d0 20 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f    sqlite3_win32_
224e0 73 65 74 5f 64 69 72 65 63 74 6f 72 79 20 24 69  set_directory $i
224f0 6e 64 65 78 20 6e 75 6c 6c 0d 0a 20 20 20 20 20  ndex null..     
22500 20 20 20 20 20 20 20 7d 20 72 65 73 75 6c 74 5d         } result]
22510 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
22520 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
22530 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
22540 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
22550 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
22560 2d 2d 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f  -- call sqlite3_
22570 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74  win32_set_direct
22580 6f 72 79 28 22 20 24 69 6e 64 65 78 20 5c 0d 0a  ory(" $index \..
22590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
225a0 20 20 22 2c 20 6e 75 6c 6c 29 2e 2e 2e 20 6f 6b    ", null)... ok
225b0 3a 20 22 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d  : " $result \n].
225c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65  .            } e
225d0 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
225e0 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
225f0 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
22600 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
22610 20 20 20 20 20 22 2d 2d 2d 2d 20 63 61 6c 6c 20       "---- call 
22620 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65  sqlite3_win32_se
22630 74 5f 64 69 72 65 63 74 6f 72 79 28 22 20 24 69  t_directory(" $i
22640 6e 64 65 78 20 5c 0d 0a 20 20 20 20 20 20 20 20  ndex \..        
22650 20 20 20 20 20 20 20 20 20 20 22 2c 20 6e 75 6c            ", nul
22660 6c 29 2e 2e 2e 20 65 72 72 6f 72 3a 20 22 20 5c  l)... error: " \
22670 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d  n\t $result \n].
22680 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
22690 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
226a0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20       }..      } 
226b0 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
226c0 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e  tputs $channel n
226d0 6f 5c 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23  o\n....        #
226e0 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
226f0 3a 20 44 6f 65 73 20 6f 75 72 20 63 61 6c 6c 65  : Does our calle
22700 72 20 77 61 6e 74 20 74 6f 20 72 65 73 65 74 20  r want to reset 
22710 74 68 65 20 64 69 72 65 63 74 6f 72 69 65 73 3f  the directories?
22720 20 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 0d    This can only.
22730 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
22740 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20 69 66   be performed if
22750 20 53 51 4c 69 74 65 20 69 73 20 6c 6f 61 64 65   SQLite is loade
22760 64 20 61 6e 64 20 72 65 61 64 79 20 66 6f 72 20  d and ready for 
22770 75 73 65 20 62 79 20 74 68 65 20 74 65 73 74 0d  use by the test.
22780 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
22790 20 73 75 69 74 65 2e 0d 0a 20 20 20 20 20 20 20   suite...       
227a0 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   #..        if {
227b0 24 72 65 73 65 74 20 26 26 20 5b 69 73 53 51 4c  $reset && [isSQL
227c0 69 74 65 52 65 61 64 79 5d 7d 20 74 68 65 6e 20  iteReady]} then 
227d0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  {..          #..
227e0 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
227f0 3a 20 4e 6f 77 20 6d 61 6b 65 20 73 75 72 65 20  : Now make sure 
22800 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64  the database and
22810 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63   temporary direc
22820 74 6f 72 69 65 73 20 61 72 65 0d 0a 20 20 20 20  tories are..    
22830 20 20 20 20 20 20 23 20 20 20 20 20 20 20 72 65        #       re
22840 73 65 74 20 74 68 65 69 72 20 64 65 66 61 75 6c  set their defaul
22850 74 20 76 61 6c 75 65 73 2c 20 77 68 69 63 68 20  t values, which 
22860 73 68 6f 75 6c 64 20 62 65 20 6e 75 6c 6c 20 66  should be null f
22870 6f 72 20 62 6f 74 68 2e 0d 0a 20 20 20 20 20 20  or both...      
22880 20 20 20 20 23 20 20 20 20 20 20 20 53 69 6e 63      #       Sinc
22890 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f 77 69  e the sqlite3_wi
228a0 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72  n32_set_director
228b0 79 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20  y function does 
228c0 6e 6f 74 0d 0a 20 20 20 20 20 20 20 20 20 20 23  not..          #
228d0 20 20 20 20 20 20 20 61 70 70 65 61 72 20 74 6f         appear to
228e0 20 62 65 20 61 76 61 69 6c 61 62 6c 65 2c 20 75   be available, u
228f0 73 65 20 74 68 65 20 61 73 73 6f 63 69 61 74 65  se the associate
22900 64 20 50 52 41 47 4d 41 20 63 6f 6d 6d 61 6e 64  d PRAGMA command
22910 73 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20  s..          #  
22920 20 20 20 20 20 69 6e 73 74 65 61 64 2e 0d 0a 20       instead... 
22930 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
22940 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 64 69        foreach di
22950 72 65 63 74 6f 72 79 20 5b 6c 69 73 74 20 64 61  rectory [list da
22960 74 61 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f  ta_store_directo
22970 72 79 20 74 65 6d 70 5f 73 74 6f 72 65 5f 64 69  ry temp_store_di
22980 72 65 63 74 6f 72 79 5d 20 7b 0d 0a 20 20 20 20  rectory] {..    
22990 20 20 20 20 20 20 20 20 73 65 74 20 73 71 6c 20          set sql 
229a0 5b 61 70 70 65 6e 64 41 72 67 73 20 22 50 52 41  [appendArgs "PRA
229b0 47 4d 41 20 22 20 24 64 69 72 65 63 74 6f 72 79  GMA " $directory
229c0 20 22 20 3d 20 5c 22 5c 22 3b 22 5d 0d 0a 0d 0a   " = \"\";"]....
229d0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
229e0 5b 63 61 74 63 68 20 7b 65 78 65 63 75 74 65 53  [catch {executeS
229f0 71 6c 20 24 73 71 6c 7d 20 72 65 73 75 6c 74 5d  ql $sql} result]
22a00 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
22a10 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
22a20 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
22a30 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
22a40 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
22a50 2d 2d 20 65 78 65 63 75 74 65 20 50 52 41 47 4d  -- execute PRAGM
22a60 41 20 22 20 24 64 69 72 65 63 74 6f 72 79 20 22  A " $directory "
22a70 2e 2e 2e 20 6f 6b 3a 20 5c 22 22 20 5c 0d 0a 20  ... ok: \"" \.. 
22a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22a90 20 24 72 65 73 75 6c 74 20 5c 22 5c 6e 5d 0d 0a   $result \"\n]..
22aa0 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c              } el
22ab0 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
22ac0 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
22ad0 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
22ae0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
22af0 20 20 20 20 22 2d 2d 2d 2d 20 65 78 65 63 75 74      "---- execut
22b00 65 20 50 52 41 47 4d 41 20 22 20 24 64 69 72 65  e PRAGMA " $dire
22b10 63 74 6f 72 79 20 22 2e 2e 2e 20 65 72 72 6f 72  ctory "... error
22b20 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  : " \..         
22b30 20 20 20 20 20 20 20 20 20 5c 6e 5c 74 20 24 72           \n\t $r
22b40 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20  esult \n]..     
22b50 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
22b60 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
22b70 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
22b80 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
22b90 54 45 3a 20 46 69 6e 61 6c 6c 79 2c 20 73 68 6f  TE: Finally, sho
22ba0 77 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61  w the current va
22bb0 6c 75 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  lue of the datab
22bc0 61 73 65 20 61 6e 64 20 74 65 6d 70 6f 72 61 72  ase and temporar
22bd0 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  y..      #      
22be0 20 64 69 72 65 63 74 6f 72 69 65 73 2e 20 20 54   directories.  T
22bf0 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20  his can only be 
22c00 70 65 72 66 6f 72 6d 65 64 20 69 66 20 53 51 4c  performed if SQL
22c10 69 74 65 20 69 73 20 6c 6f 61 64 65 64 0d 0a 20  ite is loaded.. 
22c20 20 20 20 20 20 23 20 20 20 20 20 20 20 61 6e 64       #       and
22c30 20 72 65 61 64 79 20 66 6f 72 20 75 73 65 20 62   ready for use b
22c40 79 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65  y the test suite
22c50 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
22c60 20 20 69 66 20 7b 5b 69 73 53 51 4c 69 74 65 52    if {[isSQLiteR
22c70 65 61 64 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  eady]} then {.. 
22c80 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 64         foreach d
22c90 69 72 65 63 74 6f 72 79 20 5b 6c 69 73 74 20 64  irectory [list d
22ca0 61 74 61 5f 73 74 6f 72 65 5f 64 69 72 65 63 74  ata_store_direct
22cb0 6f 72 79 20 74 65 6d 70 5f 73 74 6f 72 65 5f 64  ory temp_store_d
22cc0 69 72 65 63 74 6f 72 79 5d 20 7b 0d 0a 20 20 20  irectory] {..   
22cd0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
22ce0 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
22cf0 73 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67  s "---- checking
22d00 20 22 20 24 64 69 72 65 63 74 6f 72 79 20 22 2e   " $directory ".
22d10 2e 2e 20 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  .. "]....       
22d20 20 20 20 73 65 74 20 73 71 6c 20 5b 61 70 70 65     set sql [appe
22d30 6e 64 41 72 67 73 20 22 50 52 41 47 4d 41 20 22  ndArgs "PRAGMA "
22d40 20 24 64 69 72 65 63 74 6f 72 79 20 5c 3b 5d 0d   $directory \;].
22d50 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  ...          if 
22d60 7b 5b 63 61 74 63 68 20 7b 65 78 65 63 75 74 65  {[catch {execute
22d70 53 71 6c 20 24 73 71 6c 20 73 63 61 6c 61 72 7d  Sql $sql scalar}
22d80 20 72 65 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74   result] == 0} t
22d90 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
22da0 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
22db0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 6f  l [appendArgs "o
22dc0 6b 3a 20 5c 22 22 20 24 72 65 73 75 6c 74 20 5c  k: \"" $result \
22dd0 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  "\n]..          
22de0 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
22df0 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
22e00 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
22e10 20 22 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20   "error: " \n\t 
22e20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20  $result \n]..   
22e30 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
22e40 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20    }..      }..  
22e50 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
22e60 20 6c 6f 61 64 53 51 4c 69 74 65 54 65 73 74 53   loadSQLiteTestS
22e70 65 74 74 69 6e 67 73 20 7b 20 63 68 61 6e 6e 65  ettings { channe
22e80 6c 20 7b 73 75 66 66 69 78 20 22 22 7d 20 7b 71  l {suffix ""} {q
22e90 75 69 65 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d  uiet false} } {.
22ea0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
22eb0 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20 6c 6f 61  # NOTE: Skip loa
22ec0 64 69 6e 67 20 74 68 65 20 73 65 74 74 69 6e 67  ding the setting
22ed0 73 20 69 66 20 74 68 65 69 72 20 75 73 61 67 65  s if their usage
22ee0 20 68 61 73 20 62 65 65 6e 20 64 69 73 61 62 6c   has been disabl
22ef0 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ed...      #..  
22f00 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
22f10 78 69 73 74 73 20 3a 3a 6e 6f 28 73 71 6c 69 74  xists ::no(sqlit
22f20 65 54 65 73 74 53 65 74 74 69 6e 67 73 29 5d 7d  eTestSettings)]}
22f30 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
22f40 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
22f50 54 45 3a 20 4c 6f 61 64 20 63 75 73 74 6f 6d 20  TE: Load custom 
22f60 70 65 72 2d 75 73 65 72 20 61 6e 64 2f 6f 72 20  per-user and/or 
22f70 70 65 72 2d 68 6f 73 74 20 74 65 73 74 20 73 65  per-host test se
22f80 74 74 69 6e 67 73 20 6e 6f 77 2e 0d 0a 20 20 20  ttings now...   
22f90 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
22fa0 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
22fb0 20 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28   ::tcl_platform(
22fc0 75 73 65 72 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  user)]} then {..
22fd0 20 20 20 20 20 20 20 20 20 20 73 65 74 20 75 73            set us
22fe0 65 72 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61  erSettingsFileNa
22ff0 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67  me [file join [g
23000 65 74 43 6f 6d 6d 6f 6e 44 69 72 65 63 74 6f 72  etCommonDirector
23010 79 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  y] \..          
23020 20 20 20 20 5b 61 70 70 65 6e 64 41 72 67 73 20      [appendArgs 
23030 73 65 74 74 69 6e 67 73 20 24 73 75 66 66 69 78  settings $suffix
23040 20 2e 20 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f   . $::tcl_platfo
23050 72 6d 28 75 73 65 72 29 20 2e 65 61 67 6c 65 5d  rm(user) .eagle]
23060 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69  ]....          i
23070 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20  f {[file exists 
23080 24 75 73 65 72 53 65 74 74 69 6e 67 73 46 69 6c  $userSettingsFil
23090 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a  eName]} then {..
230a0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
230b0 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
230c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  .              t
230d0 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
230e0 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
230f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
23100 2d 2d 2d 2d 20 6c 6f 61 64 69 6e 67 20 70 65 72  ---- loading per
23110 2d 75 73 65 72 20 74 65 73 74 20 73 65 74 74 69  -user test setti
23120 6e 67 73 20 66 69 6c 65 20 5c 22 22 20 5c 0d 0a  ngs file \"" \..
23130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23140 20 20 24 75 73 65 72 53 65 74 74 69 6e 67 73 46    $userSettingsF
23150 69 6c 65 4e 61 6d 65 20 5c 22 2e 2e 2e 5c 6e 5d  ileName \"...\n]
23160 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
23170 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ...            i
23180 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  f {[catch {..   
23190 20 20 20 20 20 20 20 20 20 20 20 75 70 6c 65 76             uplev
231a0 65 6c 20 31 20 5b 6c 69 73 74 20 73 6f 75 72 63  el 1 [list sourc
231b0 65 20 24 75 73 65 72 53 65 74 74 69 6e 67 73 46  e $userSettingsF
231c0 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20  ileName]..      
231d0 20 20 20 20 20 20 7d 20 65 72 72 6f 72 5d 7d 20        } error]} 
231e0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
231f0 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
23200 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
23210 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
23220 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
23230 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
23240 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d               "==
23250 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c  == WARNING: fail
23260 65 64 20 74 6f 20 6c 6f 61 64 20 70 65 72 2d 75  ed to load per-u
23270 73 65 72 20 73 65 74 74 69 6e 67 73 20 66 69 6c  ser settings fil
23280 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20  e \"" \..       
23290 20 20 20 20 20 20 20 20 20 20 20 20 20 24 75 73               $us
232a0 65 72 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61  erSettingsFileNa
232b0 6d 65 20 22 5c 22 2c 20 65 72 72 6f 72 3a 20 22  me "\", error: "
232c0 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d   \n\t $error \n]
232d0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
232e0 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  }..            }
232f0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c  ..          } el
23300 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
23310 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
23320 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
23330 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
23340 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
23350 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
23360 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6b 69 70 70       "---- skipp
23370 65 64 20 6c 6f 61 64 69 6e 67 20 70 65 72 2d 75  ed loading per-u
23380 73 65 72 20 74 65 73 74 20 73 65 74 74 69 6e 67  ser test setting
23390 73 20 66 69 6c 65 20 5c 22 22 20 5c 0d 0a 20 20  s file \"" \..  
233a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
233b0 24 75 73 65 72 53 65 74 74 69 6e 67 73 46 69 6c  $userSettingsFil
233c0 65 4e 61 6d 65 20 22 5c 22 2c 20 69 74 20 64 6f  eName "\", it do
233d0 65 73 20 6e 6f 74 20 65 78 69 73 74 5c 6e 22 5d  es not exist\n"]
233e0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
233f0 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
23400 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
23410 20 20 20 23 23 23 23 23 23 23 23 23 23 23 23 23     #############
23420 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
23430 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
23440 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
23450 23 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20  ##########....  
23460 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20        if {[info 
23470 65 78 69 73 74 73 20 3a 3a 74 63 6c 5f 70 6c 61  exists ::tcl_pla
23480 74 66 6f 72 6d 28 68 6f 73 74 29 5d 7d 20 74 68  tform(host)]} th
23490 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
234a0 73 65 74 20 68 6f 73 74 53 65 74 74 69 6e 67 73  set hostSettings
234b0 46 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6a  FileName [file j
234c0 6f 69 6e 20 5b 67 65 74 43 6f 6d 6d 6f 6e 44 69  oin [getCommonDi
234d0 72 65 63 74 6f 72 79 5d 20 5c 0d 0a 20 20 20 20  rectory] \..    
234e0 20 20 20 20 20 20 20 20 20 20 5b 61 70 70 65 6e            [appen
234f0 64 41 72 67 73 20 73 65 74 74 69 6e 67 73 20 24  dArgs settings $
23500 73 75 66 66 69 78 20 2e 20 24 3a 3a 74 63 6c 5f  suffix . $::tcl_
23510 70 6c 61 74 66 6f 72 6d 28 68 6f 73 74 29 20 2e  platform(host) .
23520 65 61 67 6c 65 5d 5d 0d 0a 0d 0a 20 20 20 20 20  eagle]]....     
23530 20 20 20 20 20 69 66 20 7b 5b 66 69 6c 65 20 65       if {[file e
23540 78 69 73 74 73 20 24 68 6f 73 74 53 65 74 74 69  xists $hostSetti
23550 6e 67 73 46 69 6c 65 4e 61 6d 65 5d 7d 20 74 68  ngsFileName]} th
23560 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
23570 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
23580 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
23590 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
235a0 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
235b0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
235c0 20 20 20 20 20 22 2d 2d 2d 2d 20 6c 6f 61 64 69       "---- loadi
235d0 6e 67 20 70 65 72 2d 68 6f 73 74 20 74 65 73 74  ng per-host test
235e0 20 73 65 74 74 69 6e 67 73 20 66 69 6c 65 20 5c   settings file \
235f0 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  "" \..          
23600 20 20 20 20 20 20 20 20 24 68 6f 73 74 53 65 74          $hostSet
23610 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 20 5c 22  tingsFileName \"
23620 2e 2e 2e 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  ...\n]..        
23630 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
23640 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
23650 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
23660 20 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74   uplevel 1 [list
23670 20 73 6f 75 72 63 65 20 24 68 6f 73 74 53 65 74   source $hostSet
23680 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 5d 0d 0a  tingsFileName]..
23690 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 72              } er
236a0 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ror]} then {..  
236b0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
236c0 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
236d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
236e0 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
236f0 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
23700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23710 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47     "==== WARNING
23720 3a 20 66 61 69 6c 65 64 20 74 6f 20 6c 6f 61 64  : failed to load
23730 20 70 65 72 2d 68 6f 73 74 20 73 65 74 74 69 6e   per-host settin
23740 67 73 20 66 69 6c 65 20 5c 22 22 20 5c 0d 0a 20  gs file \"" \.. 
23750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23760 20 20 20 24 68 6f 73 74 53 65 74 74 69 6e 67 73     $hostSettings
23770 46 69 6c 65 4e 61 6d 65 20 22 5c 22 2c 20 65 72  FileName "\", er
23780 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72  ror: " \n\t $err
23790 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  or \n]..        
237a0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
237b0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
237c0 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
237d0 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
237e0 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
237f0 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
23800 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
23810 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
23820 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
23830 20 73 6b 69 70 70 65 64 20 6c 6f 61 64 69 6e 67   skipped loading
23840 20 70 65 72 2d 68 6f 73 74 20 74 65 73 74 20 73   per-host test s
23850 65 74 74 69 6e 67 73 20 66 69 6c 65 20 5c 22 22  ettings file \""
23860 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
23870 20 20 20 20 20 20 24 68 6f 73 74 53 65 74 74 69        $hostSetti
23880 6e 67 73 46 69 6c 65 4e 61 6d 65 20 22 5c 22 2c  ngsFileName "\",
23890 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69   it does not exi
238a0 73 74 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20  st\n"]..        
238b0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
238c0 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20   }..        }.. 
238d0 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
238e0 0d 0a 20 20 20 20 70 72 6f 63 20 63 6f 70 79 53  ..    proc copyS
238f0 61 6d 70 6c 65 44 61 74 61 62 61 73 65 46 69 6c  ampleDatabaseFil
23900 65 73 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 75  es {} {..      u
23910 70 6c 65 76 65 6c 20 31 20 7b 0d 0a 20 20 20 20  plevel 1 {..    
23920 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
23930 20 4e 4f 54 45 3a 20 43 6f 70 79 20 28 6f 72 20   NOTE: Copy (or 
23940 72 65 2d 63 6f 70 79 29 20 74 68 65 20 72 65 66  re-copy) the ref
23950 65 72 65 6e 63 65 20 64 61 74 61 62 61 73 65 20  erence database 
23960 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20 74 68  file used for th
23970 69 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  is..        #   
23980 20 20 20 20 75 6e 69 74 20 74 65 73 74 20 74 6f      unit test to
23990 20 74 68 65 20 62 75 69 6c 64 20 64 69 72 65 63   the build direc
239a0 74 6f 72 79 20 69 6e 20 63 61 73 65 20 69 74 20  tory in case it 
239b0 68 61 73 20 62 65 65 6e 20 63 68 61 6e 67 65 64  has been changed
239c0 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
239d0 20 20 62 79 20 61 20 70 72 65 76 69 6f 75 73 20    by a previous 
239e0 74 65 73 74 20 72 75 6e 2e 0d 0a 20 20 20 20 20  test run...     
239f0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 66 69     #..        fi
23a00 6c 65 20 63 6f 70 79 20 2d 66 6f 72 63 65 20 24  le copy -force $
23a10 6e 6f 72 74 68 77 69 6e 64 45 66 44 62 46 69 6c  northwindEfDbFil
23a20 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b  e \..          [
23a30 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 42 75  file join [getBu
23a40 69 6c 64 44 69 72 65 63 74 6f 72 79 20 66 61 6c  ildDirectory fal
23a50 73 65 5d 20 5b 66 69 6c 65 20 74 61 69 6c 20 24  se] [file tail $
23a60 6e 6f 72 74 68 77 69 6e 64 45 66 44 62 46 69 6c  northwindEfDbFil
23a70 65 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  e]]..      }..  
23a80 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
23a90 20 72 75 6e 53 51 4c 69 74 65 54 65 73 74 50 72   runSQLiteTestPr
23aa0 6f 6c 6f 67 75 65 20 7b 7d 20 7b 0d 0a 20 20 20  ologue {} {..   
23ab0 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
23ac0 54 45 3a 20 53 6b 69 70 20 72 75 6e 6e 69 6e 67  TE: Skip running
23ad0 20 6f 75 72 20 63 75 73 74 6f 6d 20 70 72 6f 6c   our custom prol
23ae0 6f 67 75 65 20 69 66 20 74 68 65 20 6d 61 69 6e  ogue if the main
23af0 20 6f 6e 65 20 68 61 73 20 62 65 65 6e 0d 0a 20   one has been.. 
23b00 20 20 20 20 20 23 20 20 20 20 20 20 20 73 6b 69       #       ski
23b10 70 70 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  pped...      #..
23b20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
23b30 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 70 72 6f   exists ::no(pro
23b40 6c 6f 67 75 65 2e 65 61 67 6c 65 29 5d 7d 20 74  logue.eagle)]} t
23b50 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
23b60 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
23b70 3a 20 4c 6f 61 64 20 74 68 65 20 22 62 65 66 6f  : Load the "befo
23b80 72 65 2d 63 6f 6e 73 74 72 61 69 6e 74 73 22 20  re-constraints" 
23b90 63 75 73 74 6f 6d 20 70 65 72 2d 75 73 65 72 20  custom per-user 
23ba0 61 6e 64 2f 6f 72 20 70 65 72 2d 68 6f 73 74 0d  and/or per-host.
23bb0 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
23bc0 20 74 65 73 74 20 73 65 74 74 69 6e 67 73 20 6e   test settings n
23bd0 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ow...        #..
23be0 20 20 20 20 20 20 20 20 75 70 6c 65 76 65 6c 20          uplevel 
23bf0 31 20 5b 6c 69 73 74 20 6c 6f 61 64 53 51 4c 69  1 [list loadSQLi
23c00 74 65 54 65 73 74 53 65 74 74 69 6e 67 73 20 24  teTestSettings $
23c10 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 2e  ::test_channel .
23c20 62 65 66 6f 72 65 5d 0d 0a 0d 0a 20 20 20 20 20  before]....     
23c30 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
23c40 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20 74  NOTE: Check if t
23c50 68 65 20 5b 6f 62 6a 65 63 74 5d 20 63 6f 6d 6d  he [object] comm
23c60 61 6e 64 20 69 73 20 61 76 61 69 6c 61 62 6c 65  and is available
23c70 3b 20 69 66 20 6e 6f 74 2c 20 61 64 64 20 73 6f  ; if not, add so
23c80 6d 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  me..        #   
23c90 20 20 20 20 73 68 69 6d 73 20 74 6f 20 6d 61 6b      shims to mak
23ca0 65 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65  e the test suite
23cb0 20 72 75 6e 20 73 6d 6f 6f 74 68 65 72 2e 0d 0a   run smoother...
23cc0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
23cd0 20 20 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74     checkForSQLit
23ce0 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 20 24  eObjectCommand $
23cf0 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a  ::test_channel..
23d00 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
23d10 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 44 65 74       # NOTE: Det
23d20 65 72 6d 69 6e 65 20 74 68 65 20 6e 61 6d 65 73  ermine the names
23d30 20 6f 66 20 74 68 65 20 6e 61 74 69 76 65 20 70   of the native p
23d40 6c 61 74 66 6f 72 6d 20 61 6e 64 20 61 72 63 68  latform and arch
23d50 69 74 65 63 74 75 72 65 2e 0d 0a 20 20 20 20 20  itecture...     
23d60 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65     #..        se
23d70 74 20 70 6c 61 74 66 6f 72 6d 20 5b 67 65 74 42  t platform [getB
23d80 75 69 6c 64 50 6c 61 74 66 6f 72 6d 20 74 72 75  uildPlatform tru
23d90 65 5d 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20  e]..        set 
23da0 61 72 63 68 69 74 65 63 74 75 72 65 20 5b 61 72  architecture [ar
23db0 63 68 69 74 65 63 74 75 72 65 46 6f 72 50 6c 61  chitectureForPla
23dc0 74 66 6f 72 6d 20 24 70 6c 61 74 66 6f 72 6d 5d  tform $platform]
23dd0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
23de0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53         # NOTE: S
23df0 68 6f 77 20 74 68 65 20 70 6c 61 74 66 6f 72 6d  how the platform
23e00 20 61 6e 64 20 61 72 63 68 69 74 65 63 74 75 72   and architectur
23e10 65 20 75 73 65 64 20 74 6f 20 68 65 6c 70 20 6c  e used to help l
23e20 6f 63 61 74 65 20 74 68 65 0d 0a 20 20 20 20 20  ocate the..     
23e30 20 20 20 23 20 20 20 20 20 20 20 6e 61 74 69 76     #       nativ
23e40 65 20 62 75 69 6c 64 20 66 69 6c 65 73 2e 0d 0a  e build files...
23e50 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
23e60 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
23e70 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
23e80 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
23e90 20 20 20 20 22 2d 2d 2d 2d 20 70 6c 61 74 66 6f      "---- platfo
23ea0 72 6d 20 66 6f 72 20 6c 6f 63 61 74 69 6e 67 20  rm for locating 
23eb0 6e 61 74 69 76 65 20 62 75 69 6c 64 20 66 69 6c  native build fil
23ec0 65 73 20 69 73 20 5c 22 22 20 5c 0d 0a 20 20 20  es is \"" \..   
23ed0 20 20 20 20 20 20 20 20 20 24 70 6c 61 74 66 6f           $platfo
23ee0 72 6d 20 5c 22 5c 6e 5d 0d 0a 0d 0a 20 20 20 20  rm \"\n]....    
23ef0 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
23f00 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
23f10 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
23f20 20 20 20 20 20 22 2d 2d 2d 2d 20 61 72 63 68 69       "---- archi
23f30 74 65 63 74 75 72 65 20 66 6f 72 20 6c 6f 63 61  tecture for loca
23f40 74 69 6e 67 20 6e 61 74 69 76 65 20 62 75 69 6c  ting native buil
23f50 64 20 66 69 6c 65 73 20 69 73 20 5c 22 22 20 5c  d files is \"" \
23f60 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 24 61  ..            $a
23f70 72 63 68 69 74 65 63 74 75 72 65 20 5c 22 5c 6e  rchitecture \"\n
23f80 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ]....        #..
23f90 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
23fa0 42 75 69 6c 64 20 61 20 6c 69 73 74 20 6f 66 20  Build a list of 
23fb0 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 66 69  configuration fi
23fc0 6c 65 73 20 74 68 61 74 20 77 65 20 68 61 6e 64  les that we hand
23fd0 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  le...        #..
23fe0 20 20 20 20 20 20 20 20 73 65 74 20 63 6f 6e 66          set conf
23ff0 69 67 46 69 6c 65 4e 61 6d 65 73 20 5b 6c 69 73  igFileNames [lis
24000 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  t \..           
24010 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
24020 69 74 65 2e 64 6c 6c 2e 63 6f 6e 66 69 67 5d 0d  ite.dll.config].
24030 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
24040 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75        # NOTE: Bu
24050 69 6c 64 20 61 20 6c 69 73 74 20 6f 66 20 61 75  ild a list of au
24060 78 69 6c 69 61 72 79 20 4d 61 6e 61 67 65 64 20  xiliary Managed 
24070 44 65 62 75 67 67 69 6e 67 20 41 73 73 69 73 74  Debugging Assist
24080 61 6e 74 73 20 28 4d 44 41 29 0d 0a 20 20 20 20  ants (MDA)..    
24090 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e 66      #       conf
240a0 69 67 75 72 61 74 69 6f 6e 20 66 69 6c 65 73 20  iguration files 
240b0 74 68 61 74 20 77 65 20 68 61 6e 64 6c 65 2e 0d  that we handle..
240c0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
240d0 20 20 20 20 73 65 74 20 6d 64 61 43 6f 6e 66 69      set mdaConfi
240e0 67 46 69 6c 65 4e 61 6d 65 73 20 5b 6c 69 73 74  gFileNames [list
240f0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
24100 45 61 67 6c 65 53 68 65 6c 6c 33 32 2e 65 78 65  EagleShell32.exe
24110 2e 6d 64 61 2e 63 6f 6e 66 69 67 20 49 6e 73 74  .mda.config Inst
24120 61 6c 6c 65 72 2e 65 78 65 2e 6d 64 61 2e 63 6f  aller.exe.mda.co
24130 6e 66 69 67 20 5c 0d 0a 20 20 20 20 20 20 20 20  nfig \..        
24140 20 20 20 20 74 65 73 74 2e 65 78 65 2e 6d 64 61      test.exe.mda
24150 2e 63 6f 6e 66 69 67 20 74 65 73 74 6c 69 6e 71  .config testlinq
24160 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e 66 69 67 20  .exe.mda.config 
24170 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  \..            t
24180 65 73 74 65 66 36 2e 65 78 65 2e 6d 64 61 2e 63  estef6.exe.mda.c
24190 6f 6e 66 69 67 5d 0d 0a 0d 0a 20 20 20 20 20 20  onfig]....      
241a0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
241b0 4f 54 45 3a 20 42 75 69 6c 64 20 74 68 65 20 6c  OTE: Build the l
241c0 69 73 74 20 6f 66 20 65 78 74 65 72 6e 61 6c 20  ist of external 
241d0 66 69 6c 65 73 20 74 68 61 74 20 77 65 20 68 61  files that we ha
241e0 6e 64 6c 65 2e 20 20 53 6f 6d 65 20 6f 66 0d 0a  ndle.  Some of..
241f0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
24200 74 68 65 73 65 20 66 69 6c 65 73 20 6d 61 79 20  these files may 
24210 62 65 20 6e 61 74 69 76 65 20 61 6e 64 2f 6f 72  be native and/or
24220 20 6d 61 6e 61 67 65 64 20 61 73 73 65 6d 62 6c   managed assembl
24230 69 65 73 20 74 68 61 74 20 61 72 65 0d 0a 20 20  ies that are..  
24240 20 20 20 20 20 20 23 20 20 20 20 20 20 20 72 65        #       re
24250 71 75 69 72 65 64 20 74 6f 20 70 65 72 66 6f 72  quired to perfor
24260 6d 20 76 61 72 69 6f 75 73 20 74 65 73 74 73 2e  m various tests.
24270 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
24280 20 20 20 20 20 73 65 74 20 65 78 74 65 72 6e 61       set externa
24290 6c 46 69 6c 65 4e 61 6d 65 73 20 5b 6c 69 73 74  lFileNames [list
242a0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
242b0 5b 66 69 6c 65 20 6a 6f 69 6e 20 45 6e 74 69 74  [file join Entit
242c0 79 46 72 61 6d 65 77 6f 72 6b 20 6c 69 62 20 5b  yFramework lib [
242d0 73 74 72 69 6e 67 20 6d 61 70 20 5b 6c 69 73 74  string map [list
242e0 20 46 78 20 22 22 5d 20 5c 0d 0a 20 20 20 20 20   Fx ""] \..     
242f0 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6d         [string m
24300 61 70 20 5b 6c 69 73 74 20 6e 65 74 46 78 34 35  ap [list netFx45
24310 31 20 6e 65 74 46 78 34 35 20 6e 65 74 46 78 34  1 netFx45 netFx4
24320 35 32 20 6e 65 74 46 78 34 35 20 6e 65 74 46 78  52 netFx45 netFx
24330 34 36 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  46 \..          
24340 20 20 6e 65 74 46 78 34 35 20 6e 65 74 46 78 34    netFx45 netFx4
24350 36 31 20 6e 65 74 46 78 34 35 20 6e 65 74 46 78  61 netFx45 netFx
24360 34 36 32 20 6e 65 74 46 78 34 35 20 6e 65 74 46  462 netFx45 netF
24370 78 34 37 20 6e 65 74 46 78 34 35 20 5c 0d 0a 20  x47 netFx45 \.. 
24380 20 20 20 20 20 20 20 20 20 20 20 6e 65 74 46 78             netFx
24390 34 37 31 20 6e 65 74 46 78 34 35 5d 20 5b 67 65  471 netFx45] [ge
243a0 74 42 75 69 6c 64 4e 65 74 46 78 5d 5d 5d 20 45  tBuildNetFx]]] E
243b0 6e 74 69 74 79 46 72 61 6d 65 77 6f 72 6b 2e 64  ntityFramework.d
243c0 6c 6c 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ll]]....        
243d0 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
243e0 45 3a 20 42 75 69 6c 64 20 74 68 65 20 6c 69 73  E: Build the lis
243f0 74 20 6f 66 20 6e 61 74 69 76 65 20 61 73 73 65  t of native asse
24400 6d 62 6c 79 20 66 69 6c 65 73 20 74 68 61 74 20  mbly files that 
24410 77 65 20 68 61 6e 64 6c 65 2e 0d 0a 20 20 20 20  we handle...    
24420 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73      #..        s
24430 65 74 20 6e 61 74 69 76 65 46 69 6c 65 4e 61 6d  et nativeFileNam
24440 65 73 20 5b 6c 69 73 74 5d 0d 0a 0d 0a 20 20 20  es [list]....   
24450 20 20 20 20 20 65 76 61 6c 20 6c 61 70 70 65 6e       eval lappen
24460 64 20 6e 61 74 69 76 65 46 69 6c 65 4e 61 6d 65  d nativeFileName
24470 73 20 5b 67 65 74 4e 61 74 69 76 65 4c 69 62 72  s [getNativeLibr
24480 61 72 79 46 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79  aryFileNamesOnly
24490 5d 0d 0a 20 20 20 20 20 20 20 20 65 76 61 6c 20  ]..        eval 
244a0 6c 61 70 70 65 6e 64 20 6e 61 74 69 76 65 46 69  lappend nativeFi
244b0 6c 65 4e 61 6d 65 73 20 5b 67 65 74 49 6e 74 65  leNames [getInte
244c0 72 6f 70 41 73 73 65 6d 62 6c 79 46 69 6c 65 4e  ropAssemblyFileN
244d0 61 6d 65 73 4f 6e 6c 79 5d 0d 0a 0d 0a 20 20 20  amesOnly]....   
244e0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
244f0 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74 68  # NOTE: Build th
24500 65 20 6c 69 73 74 20 6f 66 20 6d 69 78 65 64 2d  e list of mixed-
24510 6d 6f 64 65 20 61 73 73 65 6d 62 6c 79 20 66 69  mode assembly fi
24520 6c 65 73 20 74 68 61 74 20 77 65 20 68 61 6e 64  les that we hand
24530 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  le...        #..
24540 20 20 20 20 20 20 20 20 73 65 74 20 6d 69 78 65          set mixe
24550 64 46 69 6c 65 4e 61 6d 65 73 20 5b 6c 69 73 74  dFileNames [list
24560 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20  ]....        if 
24570 7b 5b 68 61 73 52 75 6e 74 69 6d 65 4f 70 74 69  {[hasRuntimeOpti
24580 6f 6e 20 6e 61 74 69 76 65 5d 7d 20 74 68 65 6e  on native]} then
24590 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6c 61   {..          la
245a0 70 70 65 6e 64 20 6d 69 78 65 64 46 69 6c 65 4e  ppend mixedFileN
245b0 61 6d 65 73 20 53 79 73 74 65 6d 2e 44 61 74 61  ames System.Data
245c0 2e 53 51 4c 69 74 65 2e 64 6c 6c 0d 0a 20 20 20  .SQLite.dll..   
245d0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
245e0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
245f0 4f 54 45 3a 20 42 75 69 6c 64 20 74 68 65 20 6c  OTE: Build the l
24600 69 73 74 20 6f 66 20 6d 61 6e 61 67 65 64 20 61  ist of managed a
24610 73 73 65 6d 62 6c 79 20 66 69 6c 65 73 20 74 68  ssembly files th
24620 61 74 20 77 65 20 68 61 6e 64 6c 65 2e 0d 0a 20  at we handle... 
24630 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
24640 20 20 73 65 74 20 6d 61 6e 61 67 65 64 46 69 6c    set managedFil
24650 65 4e 61 6d 65 73 20 5b 6c 69 73 74 20 5c 0d 0a  eNames [list \..
24660 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74              Syst
24670 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 4c  em.Data.SQLite.L
24680 69 6e 71 2e 64 6c 6c 20 53 79 73 74 65 6d 2e 44  inq.dll System.D
24690 61 74 61 2e 53 51 4c 69 74 65 2e 45 46 36 2e 64  ata.SQLite.EF6.d
246a0 6c 6c 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69  ll]....        i
246b0 66 20 7b 21 5b 68 61 73 52 75 6e 74 69 6d 65 4f  f {![hasRuntimeO
246c0 70 74 69 6f 6e 20 6e 61 74 69 76 65 5d 7d 20 74  ption native]} t
246d0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
246e0 20 6c 61 70 70 65 6e 64 20 6d 61 6e 61 67 65 64   lappend managed
246f0 46 69 6c 65 4e 61 6d 65 73 20 53 79 73 74 65 6d  FileNames System
24700 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c  .Data.SQLite.dll
24710 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
24720 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
24730 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20 74    # NOTE: Show t
24740 68 65 20 76 61 72 69 6f 75 73 20 6c 69 73 74 73  he various lists
24750 20 6f 66 20 66 69 6c 65 20 6e 61 6d 65 73 20 74   of file names t
24760 68 61 74 20 61 72 65 20 68 61 6e 64 6c 65 64 20  hat are handled 
24770 62 79 20 74 68 69 73 0d 0a 20 20 20 20 20 20 20  by this..       
24780 20 23 20 20 20 20 20 20 20 70 72 6f 63 65 64 75   #       procedu
24790 72 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  re...        #..
247a0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
247b0 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
247c0 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
247d0 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6c           "---- l
247e0 69 73 74 20 6f 66 20 5c 22 63 6f 6e 66 69 67 75  ist of \"configu
247f0 72 61 74 69 6f 6e 5c 22 20 66 69 6c 65 20 6e 61  ration\" file na
24800 6d 65 73 20 69 73 3a 20 22 20 5c 0d 0a 20 20 20  mes is: " \..   
24810 20 20 20 20 20 20 20 20 20 24 63 6f 6e 66 69 67           $config
24820 46 69 6c 65 4e 61 6d 65 73 20 5c 6e 5d 0d 0a 0d  FileNames \n]...
24830 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
24840 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
24850 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
24860 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
24870 6c 69 73 74 20 6f 66 20 5c 22 4d 44 41 20 63 6f  list of \"MDA co
24880 6e 66 69 67 75 72 61 74 69 6f 6e 5c 22 20 66 69  nfiguration\" fi
24890 6c 65 20 6e 61 6d 65 73 20 69 73 3a 20 22 20 5c  le names is: " \
248a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 24 6d  ..            $m
248b0 64 61 43 6f 6e 66 69 67 46 69 6c 65 4e 61 6d 65  daConfigFileName
248c0 73 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  s \n]....       
248d0 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
248e0 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
248f0 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
24900 20 20 22 2d 2d 2d 2d 20 6c 69 73 74 20 6f 66 20    "---- list of 
24910 5c 22 65 78 74 65 72 6e 61 6c 5c 22 20 66 69 6c  \"external\" fil
24920 65 20 6e 61 6d 65 73 20 69 73 3a 20 22 20 24 65  e names is: " $e
24930 78 74 65 72 6e 61 6c 46 69 6c 65 4e 61 6d 65 73  xternalFileNames
24940 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20   \n]....        
24950 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
24960 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
24970 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
24980 20 22 2d 2d 2d 2d 20 6c 69 73 74 20 6f 66 20 5c   "---- list of \
24990 22 6e 61 74 69 76 65 5c 22 20 66 69 6c 65 20 6e  "native\" file n
249a0 61 6d 65 73 20 69 73 3a 20 22 20 24 6e 61 74 69  ames is: " $nati
249b0 76 65 46 69 6c 65 4e 61 6d 65 73 20 5c 6e 5d 0d  veFileNames \n].
249c0 0a 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  ...        tputs
249d0 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
249e0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
249f0 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
24a00 2d 20 6c 69 73 74 20 6f 66 20 5c 22 6d 69 78 65  - list of \"mixe
24a10 64 5c 22 20 66 69 6c 65 20 6e 61 6d 65 73 20 69  d\" file names i
24a20 73 3a 20 22 20 24 6d 69 78 65 64 46 69 6c 65 4e  s: " $mixedFileN
24a30 61 6d 65 73 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20  ames \n]....    
24a40 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
24a50 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
24a60 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
24a70 20 20 20 20 20 22 2d 2d 2d 2d 20 6c 69 73 74 20       "---- list 
24a80 6f 66 20 5c 22 6d 61 6e 61 67 65 64 5c 22 20 66  of \"managed\" f
24a90 69 6c 65 20 6e 61 6d 65 73 20 69 73 3a 20 22 20  ile names is: " 
24aa0 24 6d 61 6e 61 67 65 64 46 69 6c 65 4e 61 6d 65  $managedFileName
24ab0 73 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  s \n]....       
24ac0 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
24ad0 54 45 3a 20 52 65 6d 6f 76 65 20 61 6e 79 20 74  TE: Remove any t
24ae0 65 73 74 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  est constraints 
24af0 74 68 61 74 20 72 65 66 65 72 20 74 6f 20 74 68  that refer to th
24b00 65 20 6e 61 74 69 76 65 20 61 6e 64 2f 6f 72 0d  e native and/or.
24b10 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
24b20 20 6d 61 6e 61 67 65 64 20 61 73 73 65 6d 62 6c   managed assembl
24b30 79 20 66 69 6c 65 73 20 74 68 61 74 20 77 65 20  y files that we 
24b40 68 61 6e 64 6c 65 20 75 6e 6c 65 73 73 20 66 6f  handle unless fo
24b50 72 62 69 64 64 65 6e 20 66 72 6f 6d 0d 0a 20 20  rbidden from..  
24b60 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64 6f        #       do
24b70 69 6e 67 20 73 6f 2e 0d 0a 20 20 20 20 20 20 20  ing so...       
24b80 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   #..        if {
24b90 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
24ba0 6e 6f 28 73 71 6c 69 74 65 52 65 6d 6f 76 65 43  no(sqliteRemoveC
24bb0 6f 6e 73 74 72 61 69 6e 74 73 29 5d 7d 20 74 68  onstraints)]} th
24bc0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
24bd0 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65  foreach fileName
24be0 20 24 63 6f 6e 66 69 67 46 69 6c 65 4e 61 6d 65   $configFileName
24bf0 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s {..           
24c00 20 72 65 6d 6f 76 65 43 6f 6e 73 74 72 61 69 6e   removeConstrain
24c10 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69  t [appendArgs fi
24c20 6c 65 5f 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a  le_ $fileName]..
24c30 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
24c40 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
24c50 20 66 69 6c 65 4e 61 6d 65 20 24 6d 64 61 43 6f   fileName $mdaCo
24c60 6e 66 69 67 46 69 6c 65 4e 61 6d 65 73 20 7b 0d  nfigFileNames {.
24c70 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6d  .            rem
24c80 6f 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61  oveConstraint [a
24c90 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20  ppendArgs file_ 
24ca0 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20 20  $fileName]..    
24cb0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
24cc0 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c       foreach fil
24cd0 65 4e 61 6d 65 20 24 65 78 74 65 72 6e 61 6c 46  eName $externalF
24ce0 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20  ileNames {..    
24cf0 20 20 20 20 20 20 20 20 72 65 6d 6f 76 65 43 6f          removeCo
24d00 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64  nstraint [append
24d10 41 72 67 73 20 66 69 6c 65 5f 20 5b 66 69 6c 65  Args file_ [file
24d20 20 74 61 69 6c 20 24 66 69 6c 65 4e 61 6d 65 5d   tail $fileName]
24d30 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ]..          }..
24d40 0d 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 65  ..          fore
24d50 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6e 61  ach fileName $na
24d60 74 69 76 65 46 69 6c 65 4e 61 6d 65 73 20 7b 0d  tiveFileNames {.
24d70 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6d  .            rem
24d80 6f 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61  oveConstraint [a
24d90 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20  ppendArgs file_ 
24da0 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20 20  $fileName]..    
24db0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
24dc0 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c       foreach fil
24dd0 65 4e 61 6d 65 20 24 6d 69 78 65 64 46 69 6c 65  eName $mixedFile
24de0 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20  Names {..       
24df0 20 20 20 20 20 72 65 6d 6f 76 65 43 6f 6e 73 74       removeConst
24e00 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67  raint [appendArg
24e10 73 20 66 69 6c 65 5f 20 24 66 69 6c 65 4e 61 6d  s file_ $fileNam
24e20 65 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  e]..          }.
24e30 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  ...          for
24e40 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6d  each fileName $m
24e50 61 6e 61 67 65 64 46 69 6c 65 4e 61 6d 65 73 20  anagedFileNames 
24e60 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  {..            r
24e70 65 6d 6f 76 65 43 6f 6e 73 74 72 61 69 6e 74 20  emoveConstraint 
24e80 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65  [appendArgs file
24e90 5f 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20  _ $fileName]..  
24ea0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
24eb0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
24ec0 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
24ed0 45 3a 20 53 6b 69 70 20 61 6c 6c 20 53 79 73 74  E: Skip all Syst
24ee0 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 72  em.Data.SQLite r
24ef0 65 6c 61 74 65 64 20 66 69 6c 65 20 68 61 6e 64  elated file hand
24f00 6c 69 6e 67 20 28 64 65 6c 65 74 69 6e 67 2c 0d  ling (deleting,.
24f10 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
24f20 20 63 6f 70 79 69 6e 67 2c 20 61 6e 64 20 6c 6f   copying, and lo
24f30 61 64 69 6e 67 29 20 69 66 20 69 6e 73 74 72 75  ading) if instru
24f40 63 74 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 23  cted...        #
24f50 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b  ..        if {![
24f60 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
24f70 28 73 71 6c 69 74 65 46 69 6c 65 73 29 5d 7d 20  (sqliteFiles)]} 
24f80 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
24f90 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23    #..          #
24fa0 20 4e 4f 54 45 3a 20 53 6b 69 70 20 74 72 79 69   NOTE: Skip tryi
24fb0 6e 67 20 74 6f 20 64 65 6c 65 74 65 20 61 6e 79  ng to delete any
24fc0 20 66 69 6c 65 73 20 69 66 20 69 6e 73 74 72 75   files if instru
24fd0 63 74 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 20  cted...         
24fe0 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   #..          if
24ff0 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
25000 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69 74  ::no(deleteSqlit
25010 65 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b  eFiles)]} then {
25020 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
25030 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
25040 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69 74  ::no(deleteSqlit
25050 65 43 6f 6e 66 69 67 46 69 6c 65 73 29 5d 7d 20  eConfigFiles)]} 
25060 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
25070 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69        foreach fi
25080 6c 65 4e 61 6d 65 20 24 63 6f 6e 66 69 67 46 69  leName $configFi
25090 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20  leNames {..     
250a0 20 20 20 20 20 20 20 20 20 20 20 74 72 79 44 65             tryDe
250b0 6c 65 74 65 42 69 6e 61 72 79 46 69 6c 65 20 24  leteBinaryFile $
250c0 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20  fileName..      
250d0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
250e0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
250f0 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
25100 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64  fo exists ::no(d
25110 65 6c 65 74 65 53 71 6c 69 74 65 45 78 74 65 72  eleteSqliteExter
25120 6e 61 6c 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e  nalFiles)]} then
25130 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
25140 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61    foreach fileNa
25150 6d 65 20 24 6d 64 61 43 6f 6e 66 69 67 46 69 6c  me $mdaConfigFil
25160 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20  eNames {..      
25170 20 20 20 20 20 20 20 20 20 20 74 72 79 44 65 6c            tryDel
25180 65 74 65 42 75 69 6c 64 46 69 6c 65 20 24 66 69  eteBuildFile $fi
25190 6c 65 4e 61 6d 65 20 66 61 6c 73 65 0d 0a 20 20  leName false..  
251a0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
251b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66  .              f
251c0 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20  oreach fileName 
251d0 24 65 78 74 65 72 6e 61 6c 46 69 6c 65 4e 61 6d  $externalFileNam
251e0 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  es {..          
251f0 20 20 20 20 20 20 74 72 79 44 65 6c 65 74 65 42        tryDeleteB
25200 69 6e 61 72 79 46 69 6c 65 20 24 66 69 6c 65 4e  inaryFile $fileN
25210 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ame..           
25220 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
25230 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
25240 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
25250 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74 65  ists ::no(delete
25260 53 71 6c 69 74 65 4e 61 74 69 76 65 46 69 6c 65  SqliteNativeFile
25270 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  s)]} then {..   
25280 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
25290 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
252a0 6f 28 64 65 6c 65 74 65 53 71 6c 69 74 65 49 6d  o(deleteSqliteIm
252b0 70 6c 69 63 69 74 4e 61 74 69 76 65 46 69 6c 65  plicitNativeFile
252c0 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  s)]} then {..   
252d0 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
252e0 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6e  each fileName $n
252f0 61 74 69 76 65 46 69 6c 65 4e 61 6d 65 73 20 7b  ativeFileNames {
25300 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
25310 20 20 20 20 74 72 79 44 65 6c 65 74 65 41 73 73      tryDeleteAss
25320 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61 6d 65 0d  embly $fileName.
25330 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25340 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
25350 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
25360 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
25370 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65  exists ::no(dele
25380 74 65 53 71 6c 69 74 65 4e 6f 6e 49 6d 70 6c 69  teSqliteNonImpli
25390 63 69 74 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e  citFiles)]} then
253a0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
253b0 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
253c0 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74  xists ::no(delet
253d0 65 53 71 6c 69 74 65 50 6c 61 74 66 6f 72 6d 46  eSqlitePlatformF
253e0 69 6c 65 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20  iles)] && \..   
253f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25400 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20   [string length 
25410 24 70 6c 61 74 66 6f 72 6d 5d 20 3e 20 30 7d 20  $platform] > 0} 
25420 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
25430 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63            foreac
25440 68 20 66 69 6c 65 4e 61 6d 65 20 24 6e 61 74 69  h fileName $nati
25450 76 65 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20  veFileNames {.. 
25460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25470 20 20 20 74 72 79 44 65 6c 65 74 65 41 73 73 65     tryDeleteAsse
25480 6d 62 6c 79 20 24 66 69 6c 65 4e 61 6d 65 20 24  mbly $fileName $
25490 70 6c 61 74 66 6f 72 6d 0d 0a 20 20 20 20 20 20  platform..      
254a0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
254b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
254c0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
254d0 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
254e0 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74  xists ::no(delet
254f0 65 53 71 6c 69 74 65 41 72 63 68 69 74 65 63 74  eSqliteArchitect
25500 75 72 65 46 69 6c 65 73 29 5d 20 26 26 20 5c 0d  ureFiles)] && \.
25510 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25520 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
25530 67 74 68 20 24 61 72 63 68 69 74 65 63 74 75 72  gth $architectur
25540 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  e] > 0} then {..
25550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25560 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61    foreach fileNa
25570 6d 65 20 24 6e 61 74 69 76 65 46 69 6c 65 4e 61  me $nativeFileNa
25580 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  mes {..         
25590 20 20 20 20 20 20 20 20 20 20 20 74 72 79 44 65             tryDe
255a0 6c 65 74 65 41 73 73 65 6d 62 6c 79 20 24 66 69  leteAssembly $fi
255b0 6c 65 4e 61 6d 65 20 24 61 72 63 68 69 74 65 63  leName $architec
255c0 74 75 72 65 0d 0a 20 20 20 20 20 20 20 20 20 20  ture..          
255d0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
255e0 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
255f0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
25600 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
25610 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
25620 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
25630 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69 74 65 4d  no(deleteSqliteM
25640 69 78 65 64 46 69 6c 65 73 29 5d 7d 20 74 68 65  ixedFiles)]} the
25650 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
25660 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
25670 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 74      # NOTE: If t
25680 68 65 20 22 6e 61 74 69 76 65 22 20 72 75 6e 74  he "native" runt
25690 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 73 65  ime option is se
256a0 74 2c 20 64 65 6c 65 74 65 20 69 6d 70 6c 69 63  t, delete implic
256b0 69 74 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  it..            
256c0 20 20 23 20 20 20 20 20 20 20 6d 69 78 65 64 2d    #       mixed-
256d0 6d 6f 64 65 20 61 73 73 65 6d 62 6c 79 20 66 69  mode assembly fi
256e0 6c 65 73 20 61 73 20 77 65 6c 6c 2e 20 20 54 68  les as well.  Th
256f0 69 73 20 72 75 6e 74 69 6d 65 20 6f 70 74 69 6f  is runtime optio
25700 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n..             
25710 20 23 20 20 20 20 20 20 20 63 68 65 63 6b 20 69   #       check i
25720 73 20 68 61 6e 64 6c 65 64 20 77 68 65 6e 20 62  s handled when b
25730 75 69 6c 64 69 6e 67 20 74 68 65 20 6c 69 73 74  uilding the list
25740 20 6f 66 20 6d 69 78 65 64 2d 6d 6f 64 65 0d 0a   of mixed-mode..
25750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
25760 20 20 20 20 20 20 61 73 73 65 6d 62 6c 79 20 66        assembly f
25770 69 6c 65 20 6e 61 6d 65 73 2e 0d 0a 20 20 20 20  ile names...    
25780 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
25790 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
257a0 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
257b0 6f 28 64 65 6c 65 74 65 53 71 6c 69 74 65 49 6d  o(deleteSqliteIm
257c0 70 6c 69 63 69 74 4d 69 78 65 64 46 69 6c 65 73  plicitMixedFiles
257d0 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
257e0 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65              fore
257f0 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6d 69  ach fileName $mi
25800 78 65 64 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a  xedFileNames {..
25810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25820 20 20 74 72 79 44 65 6c 65 74 65 41 73 73 65 6d    tryDeleteAssem
25830 62 6c 79 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20  bly $fileName.. 
25840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
25850 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
25860 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
25870 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
25880 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74 65  ists ::no(delete
25890 53 71 6c 69 74 65 4e 6f 6e 49 6d 70 6c 69 63 69  SqliteNonImplici
258a0 74 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b  tFiles)]} then {
258b0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
258c0 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
258d0 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53  sts ::no(deleteS
258e0 71 6c 69 74 65 50 6c 61 74 66 6f 72 6d 46 69 6c  qlitePlatformFil
258f0 65 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  es)] && \..     
25900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b                 [
25910 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 70  string length $p
25920 6c 61 74 66 6f 72 6d 5d 20 3e 20 30 7d 20 74 68  latform] > 0} th
25930 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
25940 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
25950 66 69 6c 65 4e 61 6d 65 20 24 6d 69 78 65 64 46  fileName $mixedF
25960 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20  ileNames {..    
25970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25980 74 72 79 44 65 6c 65 74 65 41 73 73 65 6d 62 6c  tryDeleteAssembl
25990 79 20 24 66 69 6c 65 4e 61 6d 65 20 24 70 6c 61  y $fileName $pla
259a0 74 66 6f 72 6d 0d 0a 20 20 20 20 20 20 20 20 20  tform..         
259b0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
259c0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
259d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
259e0 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
259f0 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71  ts ::no(deleteSq
25a00 6c 69 74 65 41 72 63 68 69 74 65 63 74 75 72 65  liteArchitecture
25a10 46 69 6c 65 73 29 5d 20 26 26 20 5c 0d 0a 20 20  Files)] && \..  
25a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25a30 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
25a40 20 24 61 72 63 68 69 74 65 63 74 75 72 65 5d 20   $architecture] 
25a50 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
25a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
25a70 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20  oreach fileName 
25a80 24 6d 69 78 65 64 46 69 6c 65 4e 61 6d 65 73 20  $mixedFileNames 
25a90 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
25aa0 20 20 20 20 20 20 20 74 72 79 44 65 6c 65 74 65         tryDelete
25ab0 41 73 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61  Assembly $fileNa
25ac0 6d 65 20 24 61 72 63 68 69 74 65 63 74 75 72 65  me $architecture
25ad0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
25ae0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
25af0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
25b00 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
25b10 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
25b20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
25b30 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64  fo exists ::no(d
25b40 65 6c 65 74 65 53 71 6c 69 74 65 4d 61 6e 61 67  eleteSqliteManag
25b50 65 64 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20  edFiles)]} then 
25b60 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
25b70 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d   foreach fileNam
25b80 65 20 24 6d 61 6e 61 67 65 64 46 69 6c 65 4e 61  e $managedFileNa
25b90 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  mes {..         
25ba0 20 20 20 20 20 20 20 74 72 79 44 65 6c 65 74 65         tryDelete
25bb0 41 73 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61  Assembly $fileNa
25bc0 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  me..            
25bd0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
25be0 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d   }..          }.
25bf0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
25c00 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
25c10 3a 20 43 68 65 63 6b 20 66 6f 72 20 74 68 65 20  : Check for the 
25c20 22 61 75 74 6f 53 65 6c 65 63 74 22 20 72 75 6e  "autoSelect" run
25c30 74 69 6d 65 20 6f 70 74 69 6f 6e 2e 20 20 49 66  time option.  If
25c40 20 70 72 65 73 65 6e 74 2c 0d 0a 20 20 20 20 20   present,..     
25c50 20 20 20 20 20 23 20 20 20 20 20 20 20 61 74 74       #       att
25c60 65 6d 70 74 20 74 6f 20 61 75 74 6f 6d 61 74 69  empt to automati
25c70 63 61 6c 6c 79 20 73 65 6c 65 63 74 20 74 68 65  cally select the
25c80 20 66 69 72 73 74 20 61 76 61 69 6c 61 62 6c 65   first available
25c90 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20  ..          #   
25ca0 20 20 20 20 62 75 69 6c 64 20 28 6f 72 20 22 72      build (or "r
25cb0 65 6c 65 61 73 65 22 29 20 6f 66 20 53 51 4c 69  elease") of SQLi
25cc0 74 65 20 61 6e 64 20 53 79 73 74 65 6d 2e 44 61  te and System.Da
25cd0 74 61 2e 53 51 4c 69 74 65 0d 0a 20 20 20 20 20  ta.SQLite..     
25ce0 20 20 20 20 20 23 20 20 20 20 20 20 20 66 6f 72       #       for
25cf0 20 75 73 65 20 77 69 74 68 20 74 68 65 20 74 65   use with the te
25d00 73 74 20 73 75 69 74 65 2e 0d 0a 20 20 20 20 20  st suite...     
25d10 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
25d20 20 20 69 66 20 7b 5b 68 61 73 52 75 6e 74 69 6d    if {[hasRuntim
25d30 65 4f 70 74 69 6f 6e 20 61 75 74 6f 53 65 6c 65  eOption autoSele
25d40 63 74 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ct]} then {..   
25d50 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 63           if {![c
25d60 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 42 75 69  heckForSQLiteBui
25d70 6c 64 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  lds $::test_chan
25d80 6e 65 6c 20 74 72 75 65 5d 7d 20 74 68 65 6e 20  nel true]} then 
25d90 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
25da0 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 52   checkForSQLiteR
25db0 65 6c 65 61 73 65 73 20 24 3a 3a 74 65 73 74 5f  eleases $::test_
25dc0 63 68 61 6e 6e 65 6c 20 74 72 75 65 0d 0a 20 20  channel true..  
25dd0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
25de0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
25df0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
25e00 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20     # NOTE: Skip 
25e10 74 72 79 69 6e 67 20 74 6f 20 76 65 72 69 66 79  trying to verify
25e20 20 74 68 65 20 62 75 69 6c 64 20 64 69 72 65 63   the build direc
25e30 74 6f 72 79 20 69 66 20 69 6e 73 74 72 75 63 74  tory if instruct
25e40 65 64 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 23  ed;..          #
25e50 20 20 20 20 20 20 20 6f 74 68 65 72 77 69 73 65         otherwise
25e60 2c 20 6d 61 6b 65 20 73 75 72 65 20 69 74 20 61  , make sure it a
25e70 63 74 75 61 6c 6c 79 20 65 78 69 73 74 73 20 6f  ctually exists o
25e80 72 20 68 61 6c 74 20 74 68 65 20 65 6e 74 69 72  r halt the entir
25e90 65 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20  e..          #  
25ea0 20 20 20 20 20 74 65 73 74 69 6e 67 20 70 72 6f       testing pro
25eb0 63 65 73 73 20 69 66 20 69 74 20 64 6f 65 73 20  cess if it does 
25ec0 6e 6f 74 20 65 78 69 73 74 2e 0d 0a 20 20 20 20  not exist...    
25ed0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
25ee0 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
25ef0 69 73 74 73 20 3a 3a 6e 6f 28 76 65 72 69 66 79  ists ::no(verify
25f00 42 75 69 6c 64 44 69 72 65 63 74 6f 72 79 29 5d  BuildDirectory)]
25f10 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
25f20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
25f30 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 20       # NOTE: At 
25f40 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 20  this point, the 
25f50 62 75 69 6c 64 20 64 69 72 65 63 74 6f 72 79 20  build directory 
25f60 4d 55 53 54 20 65 78 69 73 74 20 61 73 20 61 0d  MUST exist as a.
25f70 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20  .            #  
25f80 20 20 20 20 20 76 61 6c 69 64 20 64 69 72 65 63       valid direc
25f90 74 6f 72 79 20 66 6f 72 20 74 68 65 20 74 65 73  tory for the tes
25fa0 74 69 6e 67 20 70 72 6f 63 65 73 73 20 74 6f 20  ting process to 
25fb0 63 6f 6e 74 69 6e 75 65 2e 0d 0a 20 20 20 20 20  continue...     
25fc0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
25fd0 20 20 20 20 20 20 73 65 74 20 64 69 72 65 63 74        set direct
25fe0 6f 72 79 20 5b 67 65 74 42 75 69 6c 64 44 69 72  ory [getBuildDir
25ff0 65 63 74 6f 72 79 20 66 61 6c 73 65 5d 0d 0a 0d  ectory false]...
26000 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
26010 7b 21 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24  {![file exists $
26020 64 69 72 65 63 74 6f 72 79 5d 20 7c 7c 20 5c 0d  directory] || \.
26030 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26040 20 21 5b 66 69 6c 65 20 69 73 64 69 72 65 63 74   ![file isdirect
26050 6f 72 79 20 24 64 69 72 65 63 74 6f 72 79 5d 7d  ory $directory]}
26060 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
26070 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
26080 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
26090 4a 75 73 74 20 70 72 69 6f 72 20 74 6f 20 61 63  Just prior to ac
260a0 74 75 61 6c 6c 79 20 68 61 6c 74 69 6e 67 20 74  tually halting t
260b0 68 65 20 74 65 73 74 69 6e 67 20 70 72 6f 63 65  he testing proce
260c0 73 73 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ss,..           
260d0 20 20 20 23 20 20 20 20 20 20 20 61 64 64 20 61     #       add a
260e0 6e 20 65 72 72 6f 72 20 74 6f 20 74 68 65 20 74  n error to the t
260f0 65 73 74 20 6c 6f 67 20 66 69 6c 65 2e 0d 0a 20  est log file... 
26100 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a               #..
26110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70                tp
26120 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
26130 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
26140 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
26150 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 75 6c 64       "---- could
26160 20 6e 6f 74 20 76 65 72 69 66 79 20 62 75 69 6c   not verify buil
26170 64 20 64 69 72 65 63 74 6f 72 79 20 5c 22 22 20  d directory \"" 
26180 24 64 69 72 65 63 74 6f 72 79 20 5c 0d 0a 20 20  $directory \..  
26190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
261a0 22 5c 22 2c 20 61 6c 6c 20 74 65 73 74 69 6e 67  "\", all testing
261b0 20 68 61 6c 74 65 64 5c 6e 22 5d 0d 0a 0d 0a 20   halted\n"].... 
261c0 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a               #..
261d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
261e0 4e 4f 54 45 3a 20 52 61 69 73 69 6e 67 20 61 20  NOTE: Raising a 
261f0 73 63 72 69 70 74 20 65 72 72 6f 72 20 66 72 6f  script error fro
26200 6d 20 74 68 69 73 20 70 6f 69 6e 74 20 73 68 6f  m this point sho
26210 75 6c 64 20 68 61 6c 74 0d 0a 20 20 20 20 20 20  uld halt..      
26220 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
26230 74 68 65 20 74 65 73 74 69 6e 67 20 70 72 6f 63  the testing proc
26240 65 73 73 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ess...          
26250 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
26260 20 20 20 20 20 65 72 72 6f 72 20 5b 61 70 70 65       error [appe
26270 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
26280 20 20 20 20 20 20 20 20 20 20 20 20 22 63 6f 75              "cou
26290 6c 64 20 6e 6f 74 20 76 65 72 69 66 79 20 62 75  ld not verify bu
262a0 69 6c 64 20 64 69 72 65 63 74 6f 72 79 20 5c 22  ild directory \"
262b0 22 20 24 64 69 72 65 63 74 6f 72 79 20 5c 0d 0a  " $directory \..
262c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
262d0 20 20 22 5c 22 2c 20 61 6c 6c 20 74 65 73 74 69    "\", all testi
262e0 6e 67 20 68 61 6c 74 65 64 22 5d 0d 0a 20 20 20  ng halted"]..   
262f0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
26300 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
26310 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
26320 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20 74    # NOTE: Skip t
26330 72 79 69 6e 67 20 74 6f 20 63 6f 70 79 20 61 6e  rying to copy an
26340 79 20 66 69 6c 65 73 20 69 66 20 69 6e 73 74 72  y files if instr
26350 75 63 74 65 64 2e 0d 0a 20 20 20 20 20 20 20 20  ucted...        
26360 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69    #..          i
26370 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
26380 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65   ::no(copySqlite
26390 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d  Files)]} then {.
263a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
263b0 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
263c0 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65 43 6f  :no(copySqliteCo
263d0 6e 66 69 67 46 69 6c 65 73 29 5d 7d 20 74 68 65  nfigFiles)]} the
263e0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
263f0 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
26400 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20  _channel \..    
26410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
26420 2d 2d 2d 20 63 6f 70 79 69 6e 67 20 5c 22 63 6f  --- copying \"co
26430 6e 66 69 67 75 72 61 74 69 6f 6e 5c 22 20 66 69  nfiguration\" fi
26440 6c 65 73 2e 2e 2e 5c 6e 22 0d 0a 0d 0a 20 20 20  les...\n"....   
26450 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61             forea
26460 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 63 6f 6e  ch fileName $con
26470 66 69 67 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a  figFileNames {..
26480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26490 74 72 79 43 6f 70 79 42 75 69 6c 64 46 69 6c 65  tryCopyBuildFile
264a0 20 24 66 69 6c 65 4e 61 6d 65 20 66 61 6c 73 65   $fileName false
264b0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
264c0 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  }..            }
264d0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
264e0 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
264f0 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74  s ::no(copySqlit
26500 65 45 78 74 65 72 6e 61 6c 46 69 6c 65 73 29 5d  eExternalFiles)]
26510 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
26520 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
26530 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
26540 20 43 6f 70 79 20 74 68 65 20 4d 61 6e 61 67 65   Copy the Manage
26550 64 20 44 65 62 75 67 67 69 6e 67 20 41 73 73 69  d Debugging Assi
26560 73 74 61 6e 74 73 20 28 4d 44 41 29 20 63 6f 6e  stants (MDA) con
26570 66 69 67 75 72 61 74 69 6f 6e 0d 0a 20 20 20 20  figuration..    
26580 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
26590 20 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20 45    file for the E
265a0 61 67 6c 65 20 73 68 65 6c 6c 20 74 6f 20 74 68  agle shell to th
265b0 65 20 62 75 69 6c 64 20 6f 75 74 70 75 74 20 64  e build output d
265c0 69 72 65 63 74 6f 72 79 2c 0d 0a 20 20 20 20 20  irectory,..     
265d0 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
265e0 20 77 68 69 6c 65 20 75 73 69 6e 67 20 65 61 63   while using eac
265f0 68 20 6f 66 20 74 68 65 20 6e 61 6d 65 73 20 6f  h of the names o
26600 66 20 74 68 65 20 76 61 72 69 6f 75 73 20 6c 65  f the various le
26610 67 61 63 79 20 74 65 73 74 0d 0a 20 20 20 20 20  gacy test..     
26620 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
26630 20 65 78 65 63 75 74 61 62 6c 65 73 2e 20 20 54   executables.  T
26640 68 69 73 20 77 69 6c 6c 20 68 65 6c 70 20 74 6f  his will help to
26650 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
26660 61 6c 6c 20 74 68 65 0d 0a 20 20 20 20 20 20 20  all the..       
26670 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6c         #       l
26680 65 67 61 63 79 20 74 65 73 74 73 20 72 75 6e 20  egacy tests run 
26690 77 69 74 68 20 65 78 61 63 74 6c 79 20 74 68 65  with exactly the
266a0 20 73 61 6d 65 20 73 65 74 20 6f 66 20 4d 61 6e   same set of Man
266b0 61 67 65 64 0d 0a 20 20 20 20 20 20 20 20 20 20  aged..          
266c0 20 20 20 20 23 20 20 20 20 20 20 20 44 65 62 75      #       Debu
266d0 67 67 69 6e 67 20 41 73 73 69 73 74 61 6e 74 73  gging Assistants
266e0 20 63 6f 6e 66 69 67 75 72 65 64 2e 0d 0a 20 20   configured...  
266f0 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
26700 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
26710 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
26720 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  el \..          
26730 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6f          "---- co
26740 70 79 69 6e 67 20 5c 22 4d 44 41 20 63 6f 6e 66  pying \"MDA conf
26750 69 67 75 72 61 74 69 6f 6e 5c 22 20 66 69 6c 65  iguration\" file
26760 73 2e 2e 2e 5c 6e 22 0d 0a 0d 0a 20 20 20 20 20  s...\n"....     
26770 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
26780 20 66 69 6c 65 4e 61 6d 65 20 24 6d 64 61 43 6f   fileName $mdaCo
26790 6e 66 69 67 46 69 6c 65 4e 61 6d 65 73 20 7b 0d  nfigFileNames {.
267a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
267b0 20 74 72 79 43 6f 70 79 42 69 6e 61 72 79 46 69   tryCopyBinaryFi
267c0 6c 65 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78  le EagleShell.ex
267d0 65 2e 6d 64 61 2e 63 6f 6e 66 69 67 20 74 72 75  e.mda.config tru
267e0 65 20 22 22 20 24 66 69 6c 65 4e 61 6d 65 0d 0a  e "" $fileName..
267f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
26800 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
26810 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
26820 20 20 23 20 4e 4f 54 45 3a 20 43 6f 70 79 20 74    # NOTE: Copy t
26830 68 65 20 65 78 74 65 72 6e 61 6c 20 62 69 6e 61  he external bina
26840 72 69 65 73 2c 20 69 66 20 61 6e 79 2c 20 74 6f  ries, if any, to
26850 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 74   the directory t
26860 68 61 74 0d 0a 20 20 20 20 20 20 20 20 20 20 20  hat..           
26870 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e 74 61     #       conta
26880 69 6e 73 20 74 68 65 20 45 61 67 6c 65 20 73 68  ins the Eagle sh
26890 65 6c 6c 2e 20 20 54 68 69 73 20 69 73 20 74 79  ell.  This is ty
268a0 70 69 63 61 6c 6c 79 20 75 73 65 64 20 74 6f 20  pically used to 
268b0 6d 61 6b 65 0d 0a 20 20 20 20 20 20 20 20 20 20  make..          
268c0 20 20 20 20 23 20 20 20 20 20 20 20 73 75 72 65      #       sure
268d0 20 61 73 73 65 6d 62 6c 69 65 73 20 72 65 66 65   assemblies refe
268e0 72 65 6e 63 65 64 20 62 79 20 74 68 65 20 6f 6e  renced by the on
268f0 65 73 20 62 65 69 6e 67 20 74 65 73 74 65 64 20  es being tested 
26900 61 72 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  are..           
26910 20 20 20 23 20 20 20 20 20 20 20 61 76 61 69 6c     #       avail
26920 61 62 6c 65 20 64 75 72 69 6e 67 20 74 68 65 20  able during the 
26930 74 65 73 74 69 6e 67 20 70 72 6f 63 65 73 73 2e  testing process.
26940 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
26950 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  #..             
26960 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
26970 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 6f 70  hannel "---- cop
26980 79 69 6e 67 20 5c 22 65 78 74 65 72 6e 61 6c 5c  ying \"external\
26990 22 20 66 69 6c 65 73 2e 2e 2e 5c 6e 22 0d 0a 0d  " files...\n"...
269a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66  .              f
269b0 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20  oreach fileName 
269c0 24 65 78 74 65 72 6e 61 6c 46 69 6c 65 4e 61 6d  $externalFileNam
269d0 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  es {..          
269e0 20 20 20 20 20 20 74 72 79 43 6f 70 79 45 78 74        tryCopyExt
269f0 65 72 6e 61 6c 46 69 6c 65 20 24 66 69 6c 65 4e  ernalFile $fileN
26a00 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ame..           
26a10 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
26a20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
26a30 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
26a40 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71  ists ::no(copySq
26a50 6c 69 74 65 4e 61 74 69 76 65 46 69 6c 65 73 29  liteNativeFiles)
26a60 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
26a70 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
26a80 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
26a90 3a 20 49 66 20 74 68 65 20 74 65 73 74 20 70 6c  : If the test pl
26aa0 61 74 66 6f 72 6d 20 69 73 20 6c 69 6b 65 6c 79  atform is likely
26ab0 20 74 68 65 20 64 65 66 61 75 6c 74 20 66 6f 72   the default for
26ac0 20 74 68 69 73 0d 0a 20 20 20 20 20 20 20 20 20   this..         
26ad0 20 20 20 20 20 23 20 20 20 20 20 20 20 6d 61 63       #       mac
26ae0 68 69 6e 65 2c 20 61 6c 73 6f 20 74 72 79 20 74  hine, also try t
26af0 6f 20 63 6f 70 79 20 74 68 65 20 6e 61 74 69 76  o copy the nativ
26b00 65 20 66 69 6c 65 73 20 74 6f 20 74 68 65 0d 0a  e files to the..
26b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
26b20 20 20 20 20 20 20 62 69 6e 61 72 79 20 6c 6f 63        binary loc
26b30 61 74 69 6f 6e 2e 0d 0a 20 20 20 20 20 20 20 20  ation...        
26b40 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
26b50 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
26b60 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f  o exists ::no(co
26b70 70 79 53 71 6c 69 74 65 49 6d 70 6c 69 63 69 74  pySqliteImplicit
26b80 4e 61 74 69 76 65 46 69 6c 65 73 29 5d 20 26 26  NativeFiles)] &&
26b90 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
26ba0 20 20 20 20 20 20 5b 69 73 44 65 66 61 75 6c 74        [isDefault
26bb0 42 75 69 6c 64 50 6c 61 74 66 6f 72 6d 5d 7d 20  BuildPlatform]} 
26bc0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
26bd0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
26be0 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d  :test_channel \.
26bf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26c00 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 70 79 69       "---- copyi
26c10 6e 67 20 69 6d 70 6c 69 63 69 74 20 5c 22 6e 61  ng implicit \"na
26c20 74 69 76 65 5c 22 20 66 69 6c 65 73 2e 2e 2e 5c  tive\" files...\
26c30 6e 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  n"....          
26c40 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69        foreach fi
26c50 6c 65 4e 61 6d 65 20 24 6e 61 74 69 76 65 46 69  leName $nativeFi
26c60 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20  leNames {..     
26c70 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79               try
26c80 43 6f 70 79 41 73 73 65 6d 62 6c 79 20 24 66 69  CopyAssembly $fi
26c90 6c 65 4e 61 6d 65 20 66 61 6c 73 65 0d 0a 20 20  leName false..  
26ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
26cb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
26cc0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
26cd0 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
26ce0 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c  sts ::no(copySql
26cf0 69 74 65 4e 6f 6e 49 6d 70 6c 69 63 69 74 46 69  iteNonImplicitFi
26d00 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  les)]} then {.. 
26d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
26d20 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
26d30 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65   ::no(copySqlite
26d40 50 6c 61 74 66 6f 72 6d 46 69 6c 65 73 29 5d 20  PlatformFiles)] 
26d50 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
26d60 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e            [strin
26d70 67 20 6c 65 6e 67 74 68 20 24 70 6c 61 74 66 6f  g length $platfo
26d80 72 6d 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  rm] > 0} then {.
26d90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26da0 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
26db0 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
26dc0 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
26dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
26de0 2d 2d 2d 20 63 6f 70 79 69 6e 67 20 5c 22 6e 61  --- copying \"na
26df0 74 69 76 65 5c 22 20 66 69 6c 65 73 20 66 6f 72  tive\" files for
26e00 20 70 6c 61 74 66 6f 72 6d 20 5c 22 22 20 5c 0d   platform \"" \.
26e10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26e20 20 20 20 20 20 20 20 24 70 6c 61 74 66 6f 72 6d         $platform
26e30 20 5c 22 2e 2e 2e 5c 6e 5d 0d 0a 0d 0a 20 20 20   \"...\n]....   
26e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
26e50 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20  oreach fileName 
26e60 24 6e 61 74 69 76 65 46 69 6c 65 4e 61 6d 65 73  $nativeFileNames
26e70 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
26e80 20 20 20 20 20 20 20 20 74 72 79 43 6f 70 79 41          tryCopyA
26e90 73 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61 6d  ssembly $fileNam
26ea0 65 20 66 61 6c 73 65 20 24 70 6c 61 74 66 6f 72  e false $platfor
26eb0 6d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  m..             
26ec0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
26ed0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
26ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
26ef0 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
26f00 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65 41 72  :no(copySqliteAr
26f10 63 68 69 74 65 63 74 75 72 65 46 69 6c 65 73 29  chitectureFiles)
26f20 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
26f30 20 20 20 20 20 20 20 20 20 20 20 20 5b 73 74 72              [str
26f40 69 6e 67 20 6c 65 6e 67 74 68 20 24 61 72 63 68  ing length $arch
26f50 69 74 65 63 74 75 72 65 5d 20 3e 20 30 7d 20 74  itecture] > 0} t
26f60 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
26f70 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
26f80 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
26f90 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
26fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26fb0 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 70 79 69 6e      "---- copyin
26fc0 67 20 5c 22 6e 61 74 69 76 65 5c 22 20 66 69 6c  g \"native\" fil
26fd0 65 73 20 66 6f 72 20 61 72 63 68 69 74 65 63 74  es for architect
26fe0 75 72 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20  ure \"" \..     
26ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27000 20 24 61 72 63 68 69 74 65 63 74 75 72 65 20 5c   $architecture \
27010 22 2e 2e 2e 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20  "...\n]....     
27020 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
27030 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6e  each fileName $n
27040 61 74 69 76 65 46 69 6c 65 4e 61 6d 65 73 20 7b  ativeFileNames {
27050 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
27060 20 20 20 20 20 20 74 72 79 43 6f 70 79 41 73 73        tryCopyAss
27070 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61 6d 65 20  embly $fileName 
27080 66 61 6c 73 65 20 24 61 72 63 68 69 74 65 63 74  false $architect
27090 75 72 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ure..           
270a0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
270b0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
270c0 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
270d0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
270e0 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
270f0 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
27100 6f 28 63 6f 70 79 53 71 6c 69 74 65 4d 69 78 65  o(copySqliteMixe
27110 64 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b  dFiles)]} then {
27120 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
27130 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  #..             
27140 20 23 20 4e 4f 54 45 3a 20 49 66 20 74 68 65 20   # NOTE: If the 
27150 22 6e 61 74 69 76 65 22 20 72 75 6e 74 69 6d 65  "native" runtime
27160 20 6f 70 74 69 6f 6e 20 69 73 20 73 65 74 2c 20   option is set, 
27170 63 6f 70 79 20 69 6d 70 6c 69 63 69 74 0d 0a 20  copy implicit.. 
27180 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20               #  
27190 20 20 20 20 20 6d 69 78 65 64 2d 6d 6f 64 65 20       mixed-mode 
271a0 61 73 73 65 6d 62 6c 79 20 66 69 6c 65 73 20 61  assembly files a
271b0 73 20 77 65 6c 6c 2e 20 20 54 68 65 20 72 75 6e  s well.  The run
271c0 74 69 6d 65 20 6f 70 74 69 6f 6e 0d 0a 20 20 20  time option..   
271d0 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20             #    
271e0 20 20 20 63 68 65 63 6b 20 69 73 20 68 61 6e 64     check is hand
271f0 6c 65 64 20 77 68 65 6e 20 62 75 69 6c 64 69 6e  led when buildin
27200 67 20 74 68 65 20 6c 69 73 74 20 6f 66 20 6d 69  g the list of mi
27210 78 65 64 2d 6d 6f 64 65 0d 0a 20 20 20 20 20 20  xed-mode..      
27220 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
27230 61 73 73 65 6d 62 6c 79 20 66 69 6c 65 20 6e 61  assembly file na
27240 6d 65 73 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  mes...          
27250 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
27260 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
27270 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79  exists ::no(copy
27280 53 71 6c 69 74 65 49 6d 70 6c 69 63 69 74 4d 69  SqliteImplicitMi
27290 78 65 64 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e  xedFiles)]} then
272a0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
272b0 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
272c0 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20  t_channel \..   
272d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
272e0 20 22 2d 2d 2d 2d 20 63 6f 70 79 69 6e 67 20 69   "---- copying i
272f0 6d 70 6c 69 63 69 74 20 5c 22 6d 69 78 65 64 5c  mplicit \"mixed\
27300 22 20 66 69 6c 65 73 2e 2e 2e 5c 6e 22 0d 0a 0d  " files...\n"...
27310 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
27320 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d   foreach fileNam
27330 65 20 24 6d 69 78 65 64 46 69 6c 65 4e 61 6d 65  e $mixedFileName
27340 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s {..           
27350 20 20 20 20 20 20 20 74 72 79 43 6f 70 79 41 73         tryCopyAs
27360 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61 6d 65  sembly $fileName
27370 20 66 61 6c 73 65 0d 0a 20 20 20 20 20 20 20 20   false..        
27380 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
27390 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
273a0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
273b0 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
273c0 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65 4e 6f 6e  no(copySqliteNon
273d0 49 6d 70 6c 69 63 69 74 46 69 6c 65 73 29 5d 7d  ImplicitFiles)]}
273e0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
273f0 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69           if {![i
27400 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
27410 63 6f 70 79 53 71 6c 69 74 65 50 6c 61 74 66 6f  copySqlitePlatfo
27420 72 6d 46 69 6c 65 73 29 5d 20 26 26 20 5c 0d 0a  rmFiles)] && \..
27430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27440 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67      [string leng
27450 74 68 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3e 20  th $platform] > 
27460 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
27470 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
27480 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
27490 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
274a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
274b0 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6f          "---- co
274c0 70 79 69 6e 67 20 5c 22 6d 69 78 65 64 5c 22 20  pying \"mixed\" 
274d0 66 69 6c 65 73 20 66 6f 72 20 70 6c 61 74 66 6f  files for platfo
274e0 72 6d 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20  rm \"" \..      
274f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27500 24 70 6c 61 74 66 6f 72 6d 20 5c 22 2e 2e 2e 5c  $platform \"...\
27510 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  n]....          
27520 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
27530 66 69 6c 65 4e 61 6d 65 20 24 6d 69 78 65 64 46  fileName $mixedF
27540 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20  ileNames {..    
27550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27560 74 72 79 43 6f 70 79 41 73 73 65 6d 62 6c 79 20  tryCopyAssembly 
27570 24 66 69 6c 65 4e 61 6d 65 20 66 61 6c 73 65 20  $fileName false 
27580 24 70 6c 61 74 66 6f 72 6d 0d 0a 20 20 20 20 20  $platform..     
27590 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
275a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
275b0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
275c0 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
275d0 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79  exists ::no(copy
275e0 53 71 6c 69 74 65 41 72 63 68 69 74 65 63 74 75  SqliteArchitectu
275f0 72 65 46 69 6c 65 73 29 5d 20 26 26 20 5c 0d 0a  reFiles)] && \..
27600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27610 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67      [string leng
27620 74 68 20 24 61 72 63 68 69 74 65 63 74 75 72 65  th $architecture
27630 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
27640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27650 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
27660 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
27670 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
27680 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
27690 2d 20 63 6f 70 79 69 6e 67 20 5c 22 6d 69 78 65  - copying \"mixe
276a0 64 5c 22 20 66 69 6c 65 73 20 66 6f 72 20 61 72  d\" files for ar
276b0 63 68 69 74 65 63 74 75 72 65 20 5c 22 22 20 5c  chitecture \"" \
276c0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
276d0 20 20 20 20 20 20 20 20 24 61 72 63 68 69 74 65          $archite
276e0 63 74 75 72 65 20 5c 22 2e 2e 2e 5c 6e 5d 0d 0a  cture \"...\n]..
276f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
27700 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65      foreach file
27710 4e 61 6d 65 20 24 6d 69 78 65 64 46 69 6c 65 4e  Name $mixedFileN
27720 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20  ames {..        
27730 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79 43              tryC
27740 6f 70 79 41 73 73 65 6d 62 6c 79 20 24 66 69 6c  opyAssembly $fil
27750 65 4e 61 6d 65 20 66 61 6c 73 65 20 24 61 72 63  eName false $arc
27760 68 69 74 65 63 74 75 72 65 0d 0a 20 20 20 20 20  hitecture..     
27770 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
27780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27790 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  }..             
277a0 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
277b0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
277c0 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
277d0 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69  ts ::no(copySqli
277e0 74 65 4d 61 6e 61 67 65 64 46 69 6c 65 73 29 5d  teManagedFiles)]
277f0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
27800 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
27810 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 22 2d  :test_channel "-
27820 2d 2d 2d 20 63 6f 70 79 69 6e 67 20 5c 22 6d 61  --- copying \"ma
27830 6e 61 67 65 64 5c 22 20 66 69 6c 65 73 2e 2e 2e  naged\" files...
27840 5c 6e 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  \n"....         
27850 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c       foreach fil
27860 65 4e 61 6d 65 20 24 6d 61 6e 61 67 65 64 46 69  eName $managedFi
27870 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20  leNames {..     
27880 20 20 20 20 20 20 20 20 20 20 20 74 72 79 43 6f             tryCo
27890 70 79 41 73 73 65 6d 62 6c 79 20 24 66 69 6c 65  pyAssembly $file
278a0 4e 61 6d 65 20 74 72 75 65 0d 0a 20 20 20 20 20  Name true..     
278b0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
278c0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
278d0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
278e0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
278f0 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20 74 72   # NOTE: Skip tr
27900 79 69 6e 67 20 74 6f 20 6c 6f 61 64 20 61 6e 79  ying to load any
27910 20 66 69 6c 65 73 20 69 66 20 69 6e 73 74 72 75   files if instru
27920 63 74 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 20  cted...         
27930 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   #..          if
27940 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
27950 3a 3a 6e 6f 28 6c 6f 61 64 53 71 6c 69 74 65 46  ::no(loadSqliteF
27960 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  iles)]} then {..
27970 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
27980 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
27990 6e 6f 28 6c 6f 61 64 53 71 6c 69 74 65 49 6d 70  no(loadSqliteImp
279a0 6c 69 63 69 74 46 69 6c 65 73 29 5d 7d 20 74 68  licitFiles)]} th
279b0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
279c0 20 20 20 20 74 72 79 4c 6f 61 64 41 73 73 65 6d      tryLoadAssem
279d0 62 6c 79 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  bly System.Data.
279e0 53 51 4c 69 74 65 2e 64 6c 6c 0d 0a 20 20 20 20  SQLite.dll..    
279f0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
27a00 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69           if {![i
27a10 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
27a20 6c 6f 61 64 53 71 6c 69 74 65 4c 69 6e 71 46 69  loadSqliteLinqFi
27a30 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  les)]} then {.. 
27a40 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79               try
27a50 4c 6f 61 64 41 73 73 65 6d 62 6c 79 20 53 79 73  LoadAssembly Sys
27a60 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
27a70 4c 69 6e 71 2e 64 6c 6c 0d 0a 20 20 20 20 20 20  Linq.dll..      
27a80 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
27a90 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
27aa0 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 6c 6f  o exists ::no(lo
27ab0 61 64 53 71 6c 69 74 65 45 66 36 46 69 6c 65 73  adSqliteEf6Files
27ac0 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
27ad0 20 20 20 20 20 20 20 20 20 20 74 72 79 4c 6f 61            tryLoa
27ae0 64 41 73 73 65 6d 62 6c 79 20 53 79 73 74 65 6d  dAssembly System
27af0 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 45 46 36  .Data.SQLite.EF6
27b00 2e 64 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20 20  .dll..          
27b10 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
27b20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
27b30 69 73 74 73 20 3a 3a 6e 6f 28 6c 6f 61 64 53 71  ists ::no(loadSq
27b40 6c 69 74 65 4e 6f 6e 49 6d 70 6c 69 63 69 74 46  liteNonImplicitF
27b50 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  iles)]} then {..
27b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
27b70 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
27b80 3a 3a 6e 6f 28 6c 6f 61 64 53 71 6c 69 74 65 50  ::no(loadSqliteP
27b90 6c 61 74 66 6f 72 6d 46 69 6c 65 73 29 5d 20 26  latformFiles)] &
27ba0 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  & \..           
27bb0 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c         [string l
27bc0 65 6e 67 74 68 20 24 70 6c 61 74 66 6f 72 6d 5d  ength $platform]
27bd0 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
27be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72                tr
27bf0 79 4c 6f 61 64 41 73 73 65 6d 62 6c 79 20 53 79  yLoadAssembly Sy
27c00 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
27c10 2e 64 6c 6c 20 24 70 6c 61 74 66 6f 72 6d 0d 0a  .dll $platform..
27c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
27c30 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
27c40 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
27c50 74 73 20 3a 3a 6e 6f 28 6c 6f 61 64 53 71 6c 69  ts ::no(loadSqli
27c60 74 65 41 72 63 68 69 74 65 63 74 75 72 65 46 69  teArchitectureFi
27c70 6c 65 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20  les)] && \..    
27c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 73                [s
27c90 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 61 72  tring length $ar
27ca0 63 68 69 74 65 63 74 75 72 65 5d 20 3e 20 30 7d  chitecture] > 0}
27cb0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
27cc0 20 20 20 20 20 20 20 20 20 74 72 79 4c 6f 61 64           tryLoad
27cd0 41 73 73 65 6d 62 6c 79 20 53 79 73 74 65 6d 2e  Assembly System.
27ce0 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 20  Data.SQLite.dll 
27cf0 24 61 72 63 68 69 74 65 63 74 75 72 65 0d 0a 20  $architecture.. 
27d00 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
27d10 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
27d20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
27d30 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
27d40 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d   foreach fileNam
27d50 65 4f 6e 6c 79 20 24 6e 61 74 69 76 65 46 69 6c  eOnly $nativeFil
27d60 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20  eNames {..      
27d70 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20      catch {..   
27d80 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
27d90 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
27da0 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
27db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
27dc0 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73 69 6f 6e  --- file version
27dd0 20 6f 66 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d   of \"" $fileNam
27de0 65 4f 6e 6c 79 20 22 5c 22 2e 2e 2e 20 5c 22 22  eOnly "\"... \""
27df0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
27e00 20 20 20 20 5b 66 69 6c 65 20 76 65 72 73 69 6f      [file versio
27e10 6e 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65  n [getBinaryFile
27e20 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 4f 6e  Name $fileNameOn
27e30 6c 79 5d 5d 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20  ly]] \"\n]..    
27e40 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
27e50 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 66 6f   }....        fo
27e60 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 4f 6e  reach fileNameOn
27e70 6c 79 20 24 6d 69 78 65 64 46 69 6c 65 4e 61 6d  ly $mixedFileNam
27e80 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  es {..          
27e90 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
27ea0 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
27eb0 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
27ec0 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
27ed0 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
27ee0 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66 20  file version of 
27ef0 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c  \"" $fileNameOnl
27f00 79 20 22 5c 22 2e 2e 2e 20 5c 22 22 20 5c 0d 0a  y "\"... \"" \..
27f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27f20 5b 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 5b 67  [file version [g
27f30 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65  etBinaryFileName
27f40 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 5d 5d   $fileNameOnly]]
27f50 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20   \"\n]..        
27f60 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
27f70 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63  ..        foreac
27f80 68 20 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 24  h fileNameOnly $
27f90 6d 61 6e 61 67 65 64 46 69 6c 65 4e 61 6d 65 73  managedFileNames
27fa0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 61   {..          ca
27fb0 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
27fc0 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
27fd0 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
27fe0 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
27ff0 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69          "---- fi
28000 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22  le version of \"
28010 22 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20  " $fileNameOnly 
28020 22 5c 22 2e 2e 2e 20 5c 22 22 20 5c 0d 0a 20 20  "\"... \"" \..  
28030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 66                [f
28040 69 6c 65 20 76 65 72 73 69 6f 6e 20 5b 67 65 74  ile version [get
28050 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 24  BinaryFileName $
28060 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 5d 5d 20 5c  fileNameOnly]] \
28070 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  "\n]..          
28080 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  }..        }....
28090 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72          if {[str
280a0 69 6e 67 20 6c 65 6e 67 74 68 20 24 70 6c 61 74  ing length $plat
280b0 66 6f 72 6d 5d 20 3e 20 30 7d 20 74 68 65 6e 20  form] > 0} then 
280c0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  {..          for
280d0 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 4f 6e 6c  each fileNameOnl
280e0 79 20 24 6e 61 74 69 76 65 46 69 6c 65 4e 61 6d  y $nativeFileNam
280f0 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  es {..          
28100 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20    catch {..     
28110 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
28120 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
28130 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
28140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28150 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73 69  "---- file versi
28160 6f 6e 20 6f 66 20 5c 22 22 20 24 70 6c 61 74 66  on of \"" $platf
28170 6f 72 6d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  orm \..         
28180 20 20 20 20 20 20 20 20 20 2f 20 24 66 69 6c 65           / $file
28190 4e 61 6d 65 4f 6e 6c 79 20 22 5c 22 2e 2e 2e 20  NameOnly "\"... 
281a0 5c 22 22 20 5b 66 69 6c 65 20 76 65 72 73 69 6f  \"" [file versio
281b0 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n \..           
281c0 20 20 20 20 20 20 20 5b 67 65 74 42 69 6e 61 72         [getBinar
281d0 79 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e  yFileName $fileN
281e0 61 6d 65 4f 6e 6c 79 20 24 70 6c 61 74 66 6f 72  ameOnly $platfor
281f0 6d 5d 5d 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20  m]] \"\n]..     
28200 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
28210 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
28220 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e     foreach fileN
28230 61 6d 65 4f 6e 6c 79 20 24 6d 69 78 65 64 46 69  ameOnly $mixedFi
28240 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20  leNames {..     
28250 20 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a         catch {..
28260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70                tp
28270 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
28280 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
28290 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
282a0 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20       "---- file 
282b0 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22 22 20 24  version of \"" $
282c0 70 6c 61 74 66 6f 72 6d 20 5c 0d 0a 20 20 20 20  platform \..    
282d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 20                / 
282e0 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 22 5c  $fileNameOnly "\
282f0 22 2e 2e 2e 20 5c 22 22 20 5b 66 69 6c 65 20 76  "... \"" [file v
28300 65 72 73 69 6f 6e 20 5c 0d 0a 20 20 20 20 20 20  ersion \..      
28310 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74              [get
28320 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 24  BinaryFileName $
28330 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 24 70 6c  fileNameOnly $pl
28340 61 74 66 6f 72 6d 5d 5d 20 5c 22 5c 6e 5d 0d 0a  atform]] \"\n]..
28350 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
28360 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
28370 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
28380 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
28390 67 74 68 20 24 61 72 63 68 69 74 65 63 74 75 72  gth $architectur
283a0 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  e] > 0} then {..
283b0 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63            foreac
283c0 68 20 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 24  h fileNameOnly $
283d0 6e 61 74 69 76 65 46 69 6c 65 4e 61 6d 65 73 20  nativeFileNames 
283e0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  {..            c
283f0 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
28400 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
28410 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
28420 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
28430 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
28440 2d 2d 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 20  -- file version 
28450 6f 66 20 5c 22 22 20 24 61 72 63 68 69 74 65 63  of \"" $architec
28460 74 75 72 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  ture \..        
28470 20 20 20 20 20 20 20 20 20 20 2f 20 24 66 69 6c            / $fil
28480 65 4e 61 6d 65 4f 6e 6c 79 20 22 5c 22 2e 2e 2e  eNameOnly "\"...
28490 20 5c 22 22 20 5b 66 69 6c 65 20 76 65 72 73 69   \"" [file versi
284a0 6f 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  on \..          
284b0 20 20 20 20 20 20 20 20 5b 67 65 74 42 69 6e 61          [getBina
284c0 72 79 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65  ryFileName $file
284d0 4e 61 6d 65 4f 6e 6c 79 20 24 61 72 63 68 69 74  NameOnly $archit
284e0 65 63 74 75 72 65 5d 5d 20 5c 22 5c 6e 5d 0d 0a  ecture]] \"\n]..
284f0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
28500 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
28510 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
28520 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 24 6d 69  fileNameOnly $mi
28530 78 65 64 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a  xedFileNames {..
28540 20 20 20 20 20 20 20 20 20 20 20 20 63 61 74 63              catc
28550 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  h {..           
28560 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
28570 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
28580 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
28590 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
285a0 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66 20  file version of 
285b0 5c 22 22 20 24 61 72 63 68 69 74 65 63 74 75 72  \"" $architectur
285c0 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
285d0 20 20 20 20 20 20 20 2f 20 24 66 69 6c 65 4e 61         / $fileNa
285e0 6d 65 4f 6e 6c 79 20 22 5c 22 2e 2e 2e 20 5c 22  meOnly "\"... \"
285f0 22 20 5b 66 69 6c 65 20 76 65 72 73 69 6f 6e 20  " [file version 
28600 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
28610 20 20 20 20 20 5b 67 65 74 42 69 6e 61 72 79 46       [getBinaryF
28620 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d  ileName $fileNam
28630 65 4f 6e 6c 79 20 24 61 72 63 68 69 74 65 63 74  eOnly $architect
28640 75 72 65 5d 5d 20 5c 22 5c 6e 5d 0d 0a 20 20 20  ure]] \"\n]..   
28650 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
28660 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
28670 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d   }....        #.
28680 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
28690 20 47 72 61 62 20 74 68 65 20 6c 69 73 74 20 6f   Grab the list o
286a0 66 20 6d 61 6e 61 67 65 64 20 61 73 73 65 6d 62  f managed assemb
286b0 6c 69 65 73 20 66 6f 72 20 74 68 65 20 63 75 72  lies for the cur
286c0 72 65 6e 74 20 70 72 6f 63 65 73 73 0d 0a 20 20  rent process..  
286d0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61 6e        #       an
286e0 64 20 72 65 70 6f 72 74 20 6f 6e 20 74 68 65 20  d report on the 
286f0 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
28700 74 65 20 72 65 6c 61 74 65 64 20 6f 6e 65 73 2e  te related ones.
28710 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
28720 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65 53 51       if {[haveSQ
28730 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e  LiteObjectComman
28740 64 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  d]} then {..    
28750 20 20 20 20 20 20 73 65 74 20 61 73 73 65 6d 62        set assemb
28760 6c 69 65 73 20 5b 6f 62 6a 65 63 74 20 69 6e 76  lies [object inv
28770 6f 6b 65 20 41 70 70 44 6f 6d 61 69 6e 2e 43 75  oke AppDomain.Cu
28780 72 72 65 6e 74 44 6f 6d 61 69 6e 20 47 65 74 41  rrentDomain GetA
28790 73 73 65 6d 62 6c 69 65 73 5d 0d 0a 0d 0a 20 20  ssemblies]....  
287a0 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 66          object f
287b0 6f 72 65 61 63 68 20 61 73 73 65 6d 62 6c 79 20  oreach assembly 
287c0 24 61 73 73 65 6d 62 6c 69 65 73 20 7b 0d 0a 20  $assemblies {.. 
287d0 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b             if {[
287e0 73 74 72 69 6e 67 20 6d 61 74 63 68 20 5c 7b 53  string match \{S
287f0 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
28800 65 2a 20 24 61 73 73 65 6d 62 6c 79 5d 7d 20 74  e* $assembly]} t
28810 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
28820 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
28830 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
28840 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
28850 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
28860 2d 20 66 6f 75 6e 64 20 6c 6f 61 64 65 64 20 61  - found loaded a
28870 73 73 65 6d 62 6c 79 3a 20 22 20 24 61 73 73 65  ssembly: " $asse
28880 6d 62 6c 79 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  mbly \n]..      
28890 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
288a0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
288b0 0a 0d 0a 20 20 20 20 20 20 20 20 63 61 74 63 68  ...        catch
288c0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70   {..          tp
288d0 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
288e0 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  nel \..         
288f0 20 20 20 20 20 22 2d 2d 2d 2d 20 64 65 66 69 6e       "---- defin
28900 65 20 63 6f 6e 73 74 61 6e 74 73 20 66 6f 72 20  e constants for 
28910 5c 22 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  \"System.Data.SQ
28920 4c 69 74 65 5c 22 2e 2e 2e 20 22 0d 0a 0d 0a 20  Lite\"... ".... 
28930 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61           if {[ca
28940 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
28950 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65     object invoke
28960 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c   -flags +NonPubl
28970 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ic \..          
28980 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74        System.Dat
28990 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 33  a.SQLite.SQLite3
289a0 20 44 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 73   DefineConstants
289b0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 64 65  ..          } de
289c0 66 69 6e 65 43 6f 6e 73 74 61 6e 74 73 5d 20 3d  fineConstants] =
289d0 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
289e0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
289f0 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
28a00 61 70 70 65 6e 64 41 72 67 73 20 5b 66 6f 72 6d  appendArgs [form
28a10 61 74 4c 69 73 74 20 5b 6c 73 6f 72 74 20 5c 0d  atList [lsort \.
28a20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
28a30 20 24 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74   $defineConstant
28a40 73 5d 20 3c 6e 6f 6e 65 3e 5d 20 5c 6e 5d 0d 0a  s] <none>] \n]..
28a50 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
28a60 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
28a70 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
28a80 61 6e 6e 65 6c 20 75 6e 6b 6e 6f 77 6e 5c 6e 0d  annel unknown\n.
28a90 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
28aa0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
28ab0 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20     catch {..    
28ac0 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
28ad0 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20  est_channel \.. 
28ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
28af0 2d 2d 20 73 6f 75 72 63 65 20 76 65 72 73 69 6f  -- source versio
28b00 6e 20 6f 66 20 5c 22 53 79 73 74 65 6d 2e 44 61  n of \"System.Da
28b10 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 5c 22 2e  ta.SQLite.dll\".
28b20 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20  .. "....        
28b30 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
28b40 20 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65              obje
28b50 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73  ct invoke -flags
28b60 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20   +NonPublic \.. 
28b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
28b80 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
28b90 65 2e 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69  e.SQLiteConnecti
28ba0 6f 6e 20 50 72 6f 76 69 64 65 72 56 65 72 73 69  on ProviderVersi
28bb0 6f 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20  on..          } 
28bc0 76 65 72 73 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74  version] == 0} t
28bd0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
28be0 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
28bf0 65 6e 67 74 68 20 24 76 65 72 73 69 6f 6e 5d 20  ength $version] 
28c00 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
28c10 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
28c20 76 65 72 73 69 6f 6e 20 6e 75 6c 6c 0d 0a 20 20  version null..  
28c30 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
28c40 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
28c50 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
28c60 61 70 70 65 6e 64 41 72 67 73 20 24 76 65 72 73  appendArgs $vers
28c70 69 6f 6e 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ion \n]..       
28c80 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
28c90 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
28ca0 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 75  ::test_channel u
28cb0 6e 6b 6e 6f 77 6e 5c 6e 0d 0a 20 20 20 20 20 20  nknown\n..      
28cc0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
28cd0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63 61 74 63  ....        catc
28ce0 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74  h {..          t
28cf0 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
28d00 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20  nnel \..        
28d10 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6f 75 72        "---- sour
28d20 63 65 20 63 68 65 63 6b 6f 75 74 20 6f 66 20 5c  ce checkout of \
28d30 22 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c  "System.Data.SQL
28d40 69 74 65 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 0d 0a  ite.dll\"... "..
28d50 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
28d60 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
28d70 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76        object inv
28d80 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50  oke -flags +NonP
28d90 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20  ublic \..       
28da0 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e           System.
28db0 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69  Data.SQLite.SQLi
28dc0 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 50 72 6f  teConnection Pro
28dd0 76 69 64 65 72 53 6f 75 72 63 65 49 64 0d 0a 20  viderSourceId.. 
28de0 20 20 20 20 20 20 20 20 20 7d 20 73 6f 75 72 63           } sourc
28df0 65 49 64 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  eId] == 0} then 
28e00 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  {..            i
28e10 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  f {[string lengt
28e20 68 20 24 73 6f 75 72 63 65 49 64 5d 20 3d 3d 20  h $sourceId] == 
28e30 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
28e40 20 20 20 20 20 20 20 20 20 73 65 74 20 73 6f 75           set sou
28e50 72 63 65 49 64 20 6e 75 6c 6c 0d 0a 20 20 20 20  rceId null..    
28e60 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
28e70 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
28e80 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
28e90 70 65 6e 64 41 72 67 73 20 24 73 6f 75 72 63 65  pendArgs $source
28ea0 49 64 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  Id \n]..        
28eb0 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
28ec0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
28ed0 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 75 6e  :test_channel un
28ee0 6b 6e 6f 77 6e 5c 6e 0d 0a 20 20 20 20 20 20 20  known\n..       
28ef0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
28f00 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
28f10 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65        # NOTE: Re
28f20 73 65 74 20 63 61 63 68 65 64 20 22 62 72 65 61  set cached "brea
28f30 6b 20 69 6e 74 6f 20 64 65 62 75 67 67 65 72 22  k into debugger"
28f40 20 73 65 74 74 69 6e 67 20 73 6f 20 74 68 61 74   setting so that
28f50 20 69 74 20 63 61 6e 20 62 65 0d 0a 20 20 20 20   it can be..    
28f60 20 20 20 20 23 20 20 20 20 20 20 20 75 73 65 64      #       used
28f70 20 64 75 72 69 6e 67 20 74 68 65 20 74 65 73 74   during the test
28f80 20 66 69 6c 65 2c 20 69 66 20 6e 65 65 64 65 64   file, if needed
28f90 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
28fa0 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
28fb0 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 72 65 73   exists ::no(res
28fc0 65 74 42 72 65 61 6b 49 6e 74 6f 44 65 62 75 67  etBreakIntoDebug
28fd0 67 65 72 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20  ger)] && \..    
28fe0 20 20 20 20 20 20 20 20 5b 68 61 76 65 53 51 4c          [haveSQL
28ff0 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64  iteObjectCommand
29000 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
29010 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
29020 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f  {..            o
29030 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c  bject invoke -fl
29040 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c  ags +NonPublic \
29050 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
29060 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51    System.Data.SQ
29070 4c 69 74 65 2e 48 65 6c 70 65 72 4d 65 74 68 6f  Lite.HelperMetho
29080 64 73 20 52 65 73 65 74 42 72 65 61 6b 49 6e 74  ds ResetBreakInt
29090 6f 44 65 62 75 67 67 65 72 0d 0a 20 20 20 20 20  oDebugger..     
290a0 20 20 20 20 20 7d 20 72 65 73 75 6c 74 5d 20 3d       } result] =
290b0 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
290c0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
290d0 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
290e0 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
290f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
29100 2d 2d 2d 20 63 61 6c 6c 20 52 65 73 65 74 42 72  --- call ResetBr
29110 65 61 6b 49 6e 74 6f 44 65 62 75 67 67 65 72 28  eakIntoDebugger(
29120 29 2e 2e 2e 20 6f 6b 5c 6e 22 5d 0d 0a 20 20 20  )... ok\n"]..   
29130 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
29140 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
29150 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
29160 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
29170 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
29180 20 20 22 2d 2d 2d 2d 20 63 61 6c 6c 20 52 65 73    "---- call Res
29190 65 74 42 72 65 61 6b 49 6e 74 6f 44 65 62 75 67  etBreakIntoDebug
291a0 67 65 72 28 29 2e 2e 2e 20 65 72 72 6f 72 3a 20  ger()... error: 
291b0 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
291c0 20 20 20 20 20 5c 6e 5c 74 20 24 72 65 73 75 6c       \n\t $resul
291d0 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  t \n]..         
291e0 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d   }..        }...
291f0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
29200 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63      # NOTE: Chec
29210 6b 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65 20  k the available 
29220 62 75 69 6c 64 73 20 28 61 6e 64 20 22 72 65 6c  builds (and "rel
29230 65 61 73 65 73 22 29 20 6f 66 20 53 51 4c 69 74  eases") of SQLit
29240 65 20 61 6e 64 0d 0a 20 20 20 20 20 20 20 20 23  e and..        #
29250 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61         System.Da
29260 74 61 2e 53 51 4c 69 74 65 2e 0d 0a 20 20 20 20  ta.SQLite...    
29270 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 63      #..        c
29280 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 42 75 69  heckForSQLiteBui
29290 6c 64 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  lds $::test_chan
292a0 6e 65 6c 0d 0a 20 20 20 20 20 20 20 20 63 68 65  nel..        che
292b0 63 6b 46 6f 72 53 51 4c 69 74 65 52 65 6c 65 61  ckForSQLiteRelea
292c0 73 65 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  ses $::test_chan
292d0 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23  nel....        #
292e0 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
292f0 3a 20 4e 6f 77 2c 20 77 65 20 6e 65 65 64 20 74  : Now, we need t
29300 6f 20 6b 6e 6f 77 20 69 66 20 74 68 65 20 53 51  o know if the SQ
29310 4c 69 74 65 20 63 6f 72 65 20 6c 69 62 72 61 72  Lite core librar
29320 79 20 69 73 20 61 76 61 69 6c 61 62 6c 65 0d 0a  y is available..
29330 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
29340 28 69 2e 65 2e 20 62 65 63 61 75 73 65 20 74 68  (i.e. because th
29350 65 20 6d 61 6e 61 67 65 64 2d 6f 6e 6c 79 20 53  e managed-only S
29360 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
29370 65 20 61 73 73 65 6d 62 6c 79 20 63 61 6e 0d 0a  e assembly can..
29380 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
29390 6c 6f 61 64 20 77 69 74 68 6f 75 74 20 69 74 3b  load without it;
293a0 20 68 6f 77 65 76 65 72 2c 20 69 74 20 63 61 6e   however, it can
293b0 6e 6f 74 20 64 6f 20 61 6e 79 74 68 69 6e 67 20  not do anything 
293c0 75 73 65 66 75 6c 20 77 69 74 68 6f 75 74 0d 0a  useful without..
293d0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
293e0 69 74 29 2e 20 20 49 66 20 77 65 20 61 72 65 20  it).  If we are 
293f0 75 73 69 6e 67 20 74 68 65 20 6d 69 78 65 64 2d  using the mixed-
29400 6d 6f 64 65 20 61 73 73 65 6d 62 6c 79 20 61 6e  mode assembly an
29410 64 20 77 65 20 61 6c 72 65 61 64 79 0d 0a 20 20  d we already..  
29420 20 20 20 20 20 20 23 20 20 20 20 20 20 20 66 6f        #       fo
29430 75 6e 64 20 69 74 20 28 61 62 6f 76 65 29 2c 20  und it (above), 
29440 74 68 69 73 20 73 68 6f 75 6c 64 20 61 6c 77 61  this should alwa
29450 79 73 20 73 75 63 63 65 65 64 2e 0d 0a 20 20 20  ys succeed...   
29460 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
29470 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 4c 69  checkForSQLiteLi
29480 62 72 61 72 79 20 24 3a 3a 74 65 73 74 5f 63 68  brary $::test_ch
29490 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20 20 20  annel....       
294a0 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
294b0 54 45 3a 20 43 68 65 63 6b 20 69 66 20 74 68 65  TE: Check if the
294c0 20 53 51 4c 69 74 65 20 69 6e 74 65 72 6f 70 20   SQLite interop 
294d0 61 73 73 65 6d 62 6c 79 20 69 73 20 61 76 61 69  assembly is avai
294e0 6c 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20  lable...        
294f0 23 0d 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b  #..        check
29500 46 6f 72 53 51 4c 69 74 65 49 6e 74 65 72 6f 70  ForSQLiteInterop
29510 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
29520 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
29530 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43         # NOTE: C
29540 68 65 63 6b 20 74 68 65 20 53 51 4c 69 74 65 20  heck the SQLite 
29550 64 61 74 61 62 61 73 65 20 61 6e 64 20 74 65 6d  database and tem
29560 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72 69  porary directori
29570 65 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  es...        #..
29580 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72          checkFor
29590 53 51 4c 69 74 65 44 69 72 65 63 74 6f 72 69 65  SQLiteDirectorie
295a0 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
295b0 6c 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  l....        #..
295c0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
295d0 41 74 74 65 6d 70 74 20 74 6f 20 64 65 74 65 72  Attempt to deter
295e0 6d 69 6e 65 20 69 66 20 76 61 72 69 6f 75 73 20  mine if various 
295f0 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74  compile-time opt
29600 69 6f 6e 73 20 6e 65 65 64 65 64 20 66 6f 72 0d  ions needed for.
29610 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
29620 20 74 65 73 74 20 63 6f 6e 73 74 72 61 69 6e 74   test constraint
29630 73 20 77 65 72 65 20 65 6e 61 62 6c 65 64 20 66  s were enabled f
29640 6f 72 20 74 68 65 20 6d 61 6e 61 67 65 64 20 61  or the managed a
29650 73 73 65 6d 62 6c 79 2e 20 20 54 68 65 72 65 0d  ssembly.  There.
29660 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
29670 20 61 72 65 20 73 6f 6d 65 20 63 6f 6d 70 69 6c   are some compil
29680 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 73 20 74  e-time options t
29690 68 61 74 20 6d 75 73 74 20 61 6c 73 6f 20 68 61  hat must also ha
296a0 76 65 20 62 65 65 6e 20 65 6e 61 62 6c 65 64 0d  ve been enabled.
296b0 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
296c0 20 66 6f 72 20 74 68 65 20 69 6e 74 65 72 6f 70   for the interop
296d0 20 61 73 73 65 6d 62 6c 79 20 69 6e 20 6f 72 64   assembly in ord
296e0 65 72 20 74 6f 20 62 65 20 65 66 66 65 63 74 69  er to be effecti
296f0 76 65 2e 20 20 46 6f 72 20 74 68 6f 73 65 0d 0a  ve.  For those..
29700 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
29710 6f 70 74 69 6f 6e 73 2c 20 69 74 20 77 69 6c 6c  options, it will
29720 20 62 65 20 61 73 73 75 6d 65 64 20 74 68 61 74   be assumed that
29730 20 69 74 20 77 61 73 20 65 6e 61 62 6c 65 64 20   it was enabled 
29740 66 6f 72 20 74 68 65 20 69 6e 74 65 72 6f 70 0d  for the interop.
29750 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
29760 20 61 73 73 65 6d 62 6c 79 20 69 66 20 69 74 20   assembly if it 
29770 77 61 73 20 65 6e 61 62 6c 65 64 20 66 6f 72 20  was enabled for 
29780 74 68 65 20 6d 61 6e 61 67 65 64 20 61 73 73 65  the managed asse
29790 6d 62 6c 79 2e 0d 0a 20 20 20 20 20 20 20 20 23  mbly...        #
297a0 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63  ..        foreac
297b0 68 20 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74  h defineConstant
297c0 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20   [list \..      
297d0 20 20 20 20 20 20 43 48 45 43 4b 5f 53 54 41 54        CHECK_STAT
297e0 45 20 43 4f 55 4e 54 5f 48 41 4e 44 4c 45 20 44  E COUNT_HANDLE D
297f0 45 42 55 47 20 49 4e 54 45 52 4f 50 5f 43 4f 44  EBUG INTEROP_COD
29800 45 43 20 49 4e 54 45 52 4f 50 5f 44 45 42 55 47  EC INTEROP_DEBUG
29810 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
29820 49 4e 54 45 52 4f 50 5f 45 58 54 45 4e 53 49 4f  INTEROP_EXTENSIO
29830 4e 5f 46 55 4e 43 54 49 4f 4e 53 20 49 4e 54 45  N_FUNCTIONS INTE
29840 52 4f 50 5f 46 54 53 35 5f 45 58 54 45 4e 53 49  ROP_FTS5_EXTENSI
29850 4f 4e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ON \..          
29860 20 20 49 4e 54 45 52 4f 50 5f 49 4e 43 4c 55 44    INTEROP_INCLUD
29870 45 5f 43 45 52 4f 44 20 49 4e 54 45 52 4f 50 5f  E_CEROD INTEROP_
29880 49 4e 43 4c 55 44 45 5f 45 58 54 52 41 20 49 4e  INCLUDE_EXTRA IN
29890 54 45 52 4f 50 5f 49 4e 43 4c 55 44 45 5f 53 45  TEROP_INCLUDE_SE
298a0 45 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  E \..           
298b0 20 49 4e 54 45 52 4f 50 5f 49 4e 43 4c 55 44 45   INTEROP_INCLUDE
298c0 5f 5a 49 50 56 46 53 20 49 4e 54 45 52 4f 50 5f  _ZIPVFS INTEROP_
298d0 4a 53 4f 4e 31 5f 45 58 54 45 4e 53 49 4f 4e 20  JSON1_EXTENSION 
298e0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 49  \..            I
298f0 4e 54 45 52 4f 50 5f 4c 45 47 41 43 59 5f 43 4c  NTEROP_LEGACY_CL
29900 4f 53 45 20 49 4e 54 45 52 4f 50 5f 4c 4f 47 20  OSE INTEROP_LOG 
29910 49 4e 54 45 52 4f 50 5f 50 45 52 43 45 4e 54 49  INTEROP_PERCENTI
29920 4c 45 5f 45 58 54 45 4e 53 49 4f 4e 20 5c 0d 0a  LE_EXTENSION \..
29930 20 20 20 20 20 20 20 20 20 20 20 20 49 4e 54 45              INTE
29940 52 4f 50 5f 52 45 47 45 58 50 5f 45 58 54 45 4e  ROP_REGEXP_EXTEN
29950 53 49 4f 4e 20 49 4e 54 45 52 4f 50 5f 53 45 53  SION INTEROP_SES
29960 53 49 4f 4e 5f 45 58 54 45 4e 53 49 4f 4e 20 5c  SION_EXTENSION \
29970 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 49 4e  ..            IN
29980 54 45 52 4f 50 5f 53 48 41 31 5f 45 58 54 45 4e  TEROP_SHA1_EXTEN
29990 53 49 4f 4e 20 49 4e 54 45 52 4f 50 5f 54 45 53  SION INTEROP_TES
299a0 54 5f 45 58 54 45 4e 53 49 4f 4e 20 5c 0d 0a 20  T_EXTENSION \.. 
299b0 20 20 20 20 20 20 20 20 20 20 20 49 4e 54 45 52             INTER
299c0 4f 50 5f 54 4f 54 59 50 45 5f 45 58 54 45 4e 53  OP_TOTYPE_EXTENS
299d0 49 4f 4e 20 49 4e 54 45 52 4f 50 5f 56 49 52 54  ION INTEROP_VIRT
299e0 55 41 4c 5f 54 41 42 4c 45 20 5c 0d 0a 20 20 20  UAL_TABLE \..   
299f0 20 20 20 20 20 20 20 20 20 4e 45 54 5f 32 30 20           NET_20 
29a00 4e 45 54 5f 33 35 20 4e 45 54 5f 34 30 20 4e 45  NET_35 NET_40 NE
29a10 54 5f 34 35 20 4e 45 54 5f 34 35 31 20 4e 45 54  T_45 NET_451 NET
29a20 5f 34 35 32 20 4e 45 54 5f 34 36 20 4e 45 54 5f  _452 NET_46 NET_
29a30 34 36 31 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  461 \..         
29a40 20 20 20 4e 45 54 5f 34 36 32 20 4e 45 54 5f 34     NET_462 NET_4
29a50 37 20 4e 45 54 5f 34 37 31 20 4e 45 54 5f 43 4f  7 NET_471 NET_CO
29a60 4d 50 41 43 54 5f 32 30 20 50 4c 41 54 46 4f 52  MPACT_20 PLATFOR
29a70 4d 5f 43 4f 4d 50 41 43 54 46 52 41 4d 45 57 4f  M_COMPACTFRAMEWO
29a80 52 4b 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  RK \..          
29a90 20 20 50 52 45 4c 4f 41 44 5f 4e 41 54 49 56 45    PRELOAD_NATIVE
29aa0 5f 4c 49 42 52 41 52 59 20 52 45 54 41 52 47 45  _LIBRARY RETARGE
29ab0 54 41 42 4c 45 20 53 51 4c 49 54 45 5f 53 54 41  TABLE SQLITE_STA
29ac0 4e 44 41 52 44 20 5c 0d 0a 20 20 20 20 20 20 20  NDARD \..       
29ad0 20 20 20 20 20 54 48 52 4f 57 5f 4f 4e 5f 44 49       THROW_ON_DI
29ae0 53 50 4f 53 45 44 20 54 52 41 43 45 20 54 52 41  SPOSED TRACE TRA
29af0 43 45 5f 43 4f 4e 4e 45 43 54 49 4f 4e 20 54 52  CE_CONNECTION TR
29b00 41 43 45 5f 44 45 54 45 43 54 49 4f 4e 20 5c 0d  ACE_DETECTION \.
29b10 0a 20 20 20 20 20 20 20 20 20 20 20 20 54 52 41  .            TRA
29b20 43 45 5f 48 41 4e 44 4c 45 20 54 52 41 43 45 5f  CE_HANDLE TRACE_
29b30 50 52 45 4c 4f 41 44 20 54 52 41 43 45 5f 53 48  PRELOAD TRACE_SH
29b40 41 52 45 44 20 54 52 41 43 45 5f 53 54 41 54 45  ARED TRACE_STATE
29b50 4d 45 4e 54 20 5c 0d 0a 20 20 20 20 20 20 20 20  MENT \..        
29b60 20 20 20 20 54 52 41 43 45 5f 57 41 52 4e 49 4e      TRACE_WARNIN
29b70 47 20 54 52 41 43 4b 5f 4d 45 4d 4f 52 59 5f 42  G TRACK_MEMORY_B
29b80 59 54 45 53 20 55 53 45 5f 45 4e 54 49 54 59 5f  YTES USE_ENTITY_
29b90 46 52 41 4d 45 57 4f 52 4b 5f 36 20 5c 0d 0a 20  FRAMEWORK_6 \.. 
29ba0 20 20 20 20 20 20 20 20 20 20 20 55 53 45 5f 49             USE_I
29bb0 4e 54 45 52 4f 50 5f 44 4c 4c 20 55 53 45 5f 50  NTEROP_DLL USE_P
29bc0 52 45 50 41 52 45 5f 56 32 20 57 49 4e 44 4f 57  REPARE_V2 WINDOW
29bd0 53 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  S] {..          
29be0 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e  #..          # N
29bf0 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20 74 68  OTE: Check if th
29c00 65 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f  e compile-time o
29c10 70 74 69 6f 6e 20 69 73 20 6c 69 73 74 65 64 20  ption is listed 
29c20 69 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 0d 0a  in the list of..
29c30 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
29c40 20 20 22 64 65 66 69 6e 65 20 63 6f 6e 73 74 61    "define consta
29c50 6e 74 73 22 20 6b 65 70 74 20 74 72 61 63 6b 20  nts" kept track 
29c60 6f 66 20 62 79 20 74 68 65 20 6d 61 6e 61 67 65  of by the manage
29c70 64 20 61 73 73 65 6d 62 6c 79 2e 0d 0a 20 20 20  d assembly...   
29c80 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
29c90 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51 4c 69      checkForSQLi
29ca0 74 65 44 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74  teDefineConstant
29cb0 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
29cc0 20 24 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74   $defineConstant
29cd0 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
29ce0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
29cf0 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20    # NOTE: Check 
29d00 69 66 20 74 68 65 20 53 79 73 74 65 6d 2e 44 61  if the System.Da
29d10 74 61 2e 53 51 4c 69 74 65 20 70 72 6f 76 69 64  ta.SQLite provid
29d20 65 72 20 77 61 73 20 63 6f 6d 70 69 6c 65 64 20  er was compiled 
29d30 77 69 74 68 0d 0a 20 20 20 20 20 20 20 20 23 20  with..        # 
29d40 20 20 20 20 20 20 73 75 70 70 6f 72 74 20 66 6f        support fo
29d50 72 20 61 6e 79 20 65 6e 63 72 79 70 74 65 64 20  r any encrypted 
29d60 64 61 74 61 62 61 73 65 73 2e 0d 0a 20 20 20 20  databases...    
29d70 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69      #..        i
29d80 66 20 7b 5b 68 61 76 65 53 51 4c 69 74 65 44 65  f {[haveSQLiteDe
29d90 66 69 6e 65 43 6f 6e 73 74 61 6e 74 20 49 4e 54  fineConstant INT
29da0 45 52 4f 50 5f 43 4f 44 45 43 5d 20 7c 7c 20 5c  EROP_CODEC] || \
29db0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 68  ..            [h
29dc0 61 76 65 53 51 4c 69 74 65 44 65 66 69 6e 65 43  aveSQLiteDefineC
29dd0 6f 6e 73 74 61 6e 74 20 49 4e 54 45 52 4f 50 5f  onstant INTEROP_
29de0 49 4e 43 4c 55 44 45 5f 53 45 45 5d 7d 20 74 68  INCLUDE_SEE]} th
29df0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
29e00 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e  #..          # N
29e10 4f 54 45 3a 20 59 65 73 2c 20 61 64 64 20 67 65  OTE: Yes, add ge
29e20 6e 65 72 69 63 20 63 6f 6e 73 74 72 61 69 6e 74  neric constraint
29e30 20 66 6f 72 20 75 73 65 20 62 79 20 74 68 65 20   for use by the 
29e40 74 65 73 74 20 73 75 69 74 65 2e 0d 0a 20 20 20  test suite...   
29e50 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
29e60 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e      addConstrain
29e70 74 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  t System.Data.SQ
29e80 4c 69 74 65 2e 45 6e 63 72 79 70 74 69 6f 6e 0d  Lite.Encryption.
29e90 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
29ea0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
29eb0 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 74   # NOTE: Check t
29ec0 68 65 20 63 75 72 72 65 6e 74 20 62 75 69 6c 64  he current build
29ed0 20 79 65 61 72 2e 20 20 42 61 73 69 63 61 6c 6c   year.  Basicall
29ee0 79 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74 65  y, this indicate
29ef0 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  s..        #    
29f00 20 20 20 77 68 69 63 68 20 76 65 72 73 69 6f 6e     which version
29f10 20 6f 66 20 4d 53 42 75 69 6c 64 20 61 6e 64 2f   of MSBuild and/
29f20 6f 72 20 56 69 73 75 61 6c 20 53 74 75 64 69 6f  or Visual Studio
29f30 20 77 61 73 20 75 73 65 64 20 74 6f 0d 0a 20 20   was used to..  
29f40 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f        #       co
29f50 6d 70 69 6c 65 20 74 68 65 20 61 73 73 65 6d 62  mpile the assemb
29f60 6c 79 20 62 69 6e 61 72 69 65 73 20 75 6e 64 65  ly binaries unde
29f70 72 20 74 65 73 74 2e 0d 0a 20 20 20 20 20 20 20  r test...       
29f80 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   #..        tput
29f90 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
29fa0 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  l \..           
29fb0 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20   "---- checking 
29fc0 66 6f 72 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  for System.Data.
29fd0 53 51 4c 69 74 65 20 62 75 69 6c 64 20 79 65 61  SQLite build yea
29fe0 72 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20  r... "....      
29ff0 20 20 73 65 74 20 79 65 61 72 20 5b 67 65 74 42    set year [getB
2a000 75 69 6c 64 59 65 61 72 5d 0d 0a 20 20 20 20 20  uildYear]..     
2a010 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74     addConstraint
2a020 20 5b 61 70 70 65 6e 64 41 72 67 73 20 62 75 69   [appendArgs bui
2a030 6c 64 59 65 61 72 2e 20 24 79 65 61 72 5d 0d 0a  ldYear. $year]..
2a040 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
2a050 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
2a060 70 70 65 6e 64 41 72 67 73 20 5c 22 20 24 79 65  ppendArgs \" $ye
2a070 61 72 20 5c 22 5c 6e 5d 0d 0a 0d 0a 20 20 20 20  ar \"\n]....    
2a080 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
2a090 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 74 68 65   NOTE: Check the
2a0a0 20 63 75 72 72 65 6e 74 20 62 75 69 6c 64 20 2e   current build .
2a0b0 4e 45 54 20 46 72 61 6d 65 77 6f 72 6b 2e 20 20  NET Framework.  
2a0c0 42 61 73 69 63 61 6c 6c 79 2c 20 74 68 69 73 0d  Basically, this.
2a0d0 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
2a0e0 20 69 6e 64 69 63 61 74 65 73 20 77 68 69 63 68   indicates which
2a0f0 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20   version of the 
2a100 2e 4e 45 54 20 46 72 61 6d 65 77 6f 72 6b 20 69  .NET Framework i
2a110 73 20 62 65 69 6e 67 0d 0a 20 20 20 20 20 20 20  s being..       
2a120 20 23 20 20 20 20 20 20 20 75 73 65 64 20 62 79   #       used by
2a130 20 74 68 65 20 61 73 73 65 6d 62 6c 79 20 62 69   the assembly bi
2a140 6e 61 72 69 65 73 20 75 6e 64 65 72 20 74 65 73  naries under tes
2a150 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  t...        #.. 
2a160 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
2a170 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a  test_channel \..
2a180 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
2a190 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 53  - checking for S
2a1a0 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
2a1b0 65 20 62 75 69 6c 64 20 2e 4e 45 54 20 46 72 61  e build .NET Fra
2a1c0 6d 65 77 6f 72 6b 2e 2e 2e 20 22 0d 0a 0d 0a 20  mework... ".... 
2a1d0 20 20 20 20 20 20 20 73 65 74 20 6e 65 74 46 78         set netFx
2a1e0 20 5b 67 65 74 42 75 69 6c 64 4e 65 74 46 78 5d   [getBuildNetFx]
2a1f0 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e  ..        addCon
2a200 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41  straint [appendA
2a210 72 67 73 20 62 75 69 6c 64 46 72 61 6d 65 77 6f  rgs buildFramewo
2a220 72 6b 2e 20 24 6e 65 74 46 78 5d 0d 0a 20 20 20  rk. $netFx]..   
2a230 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
2a240 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
2a250 6e 64 41 72 67 73 20 5c 22 20 24 6e 65 74 46 78  ndArgs \" $netFx
2a260 20 5c 22 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20   \"\n]....      
2a270 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
2a280 4f 54 45 3a 20 43 68 65 63 6b 20 74 68 65 20 63  OTE: Check the c
2a290 75 72 72 65 6e 74 20 62 75 69 6c 64 20 63 6f 6e  urrent build con
2a2a0 66 69 67 75 72 61 74 69 6f 6e 2e 20 20 54 68 69  figuration.  Thi
2a2b0 73 20 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c  s should normall
2a2c0 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  y..        #    
2a2d0 20 20 20 62 65 20 65 69 74 68 65 72 20 22 44 65     be either "De
2a2e0 62 75 67 22 20 6f 72 20 22 52 65 6c 65 61 73 65  bug" or "Release
2a2f0 22 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  "...        #.. 
2a300 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
2a310 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a  test_channel \..
2a320 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
2a330 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 53  - checking for S
2a340 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
2a350 65 20 62 75 69 6c 64 20 63 6f 6e 66 69 67 75 72  e build configur
2a360 61 74 69 6f 6e 2e 2e 2e 20 22 0d 0a 0d 0a 20 20  ation... "....  
2a370 20 20 20 20 20 20 73 65 74 20 63 6f 6e 66 69 67        set config
2a380 75 72 61 74 69 6f 6e 20 5b 67 65 74 42 75 69 6c  uration [getBuil
2a390 64 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 5d 0d  dConfiguration].
2a3a0 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73  .        addCons
2a3b0 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
2a3c0 67 73 20 62 75 69 6c 64 43 6f 6e 66 69 67 75 72  gs buildConfigur
2a3d0 61 74 69 6f 6e 2e 20 24 63 6f 6e 66 69 67 75 72  ation. $configur
2a3e0 61 74 69 6f 6e 5d 0d 0a 20 20 20 20 20 20 20 20  ation]..        
2a3f0 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
2a400 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
2a410 73 20 5c 22 20 24 63 6f 6e 66 69 67 75 72 61 74  s \" $configurat
2a420 69 6f 6e 20 5c 22 5c 6e 5d 0d 0a 0d 0a 20 20 20  ion \"\n]....   
2a430 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
2a440 23 20 4e 4f 54 45 3a 20 54 72 79 20 74 6f 20 73  # NOTE: Try to s
2a450 65 74 75 70 20 61 6e 20 69 6e 74 65 72 72 75 70  etup an interrup
2a460 74 20 63 61 6c 6c 62 61 63 6b 20 75 73 69 6e 67  t callback using
2a470 20 74 68 65 20 73 63 72 69 70 74 20 64 65 62 75   the script debu
2a480 67 67 65 72 0d 0a 20 20 20 20 20 20 20 20 23 20  gger..        # 
2a490 20 20 20 20 20 20 74 68 61 74 20 77 69 6c 6c 20        that will 
2a4a0 63 61 6e 63 65 6c 20 61 6c 6c 20 53 51 4c 20 71  cancel all SQL q
2a4b0 75 65 72 69 65 73 20 69 6e 20 70 72 6f 67 72 65  ueries in progre
2a4c0 73 73 20 66 6f 72 20 61 6c 6c 20 64 61 74 61 62  ss for all datab
2a4d0 61 73 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ase..        #  
2a4e0 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 73       connections
2a4f0 20 6b 6e 6f 77 6e 20 74 6f 20 74 68 69 73 20 69   known to this i
2a500 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a 20 20 20  nterpreter...   
2a510 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
2a520 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
2a530 73 20 3a 3a 6e 6f 28 73 71 6c 69 74 65 49 6e 74  s ::no(sqliteInt
2a540 65 72 72 75 70 74 43 61 6c 6c 62 61 63 6b 29 5d  erruptCallback)]
2a550 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
2a560 20 20 20 20 73 65 74 75 70 44 62 49 6e 74 65 72      setupDbInter
2a570 72 75 70 74 43 61 6c 6c 62 61 63 6b 20 24 3a 3a  ruptCallback $::
2a580 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 3a 3a  test_channel $::
2a590 74 65 73 74 5f 6c 6f 67 0d 0a 20 20 20 20 20 20  test_log..      
2a5a0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23    }....        #
2a5b0 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
2a5c0 3a 20 43 68 65 63 6b 20 66 6f 72 20 74 68 65 20  : Check for the 
2a5d0 6e 61 74 69 76 65 20 72 75 6e 74 69 6d 65 20 6f  native runtime o
2a5e0 70 74 69 6f 6e 2c 20 77 68 69 63 68 20 77 6f 75  ption, which wou
2a5f0 6c 64 20 6d 65 61 6e 20 77 65 20 61 72 65 0d 0a  ld mean we are..
2a600 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
2a610 75 73 69 6e 67 20 74 68 65 20 6d 69 78 65 64 2d  using the mixed-
2a620 6d 6f 64 65 20 61 73 73 65 6d 62 6c 79 2e 0d 0a  mode assembly...
2a630 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
2a640 20 20 20 63 68 65 63 6b 46 6f 72 52 75 6e 74 69     checkForRunti
2a650 6d 65 4f 70 74 69 6f 6e 20 24 3a 3a 74 65 73 74  meOption $::test
2a660 5f 63 68 61 6e 6e 65 6c 20 6e 61 74 69 76 65 0d  _channel native.
2a670 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
2a680 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68        # NOTE: Ch
2a690 65 63 6b 20 69 66 20 74 68 65 20 74 65 73 74 20  eck if the test 
2a6a0 73 75 69 74 65 20 73 68 6f 75 6c 64 20 63 6f 75  suite should cou
2a6b0 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nt the number of
2a6c0 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0d 0a 20 20   connections..  
2a6d0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 22 6f        #       "o
2a6e0 70 65 6e 65 64 22 20 61 6e 64 20 22 63 6c 6f 73  pened" and "clos
2a6f0 65 64 22 20 66 72 6f 6d 20 74 68 65 20 70 6f 6f  ed" from the poo
2a700 6c 20 77 68 65 6e 20 64 65 74 65 72 6d 69 6e 69  l when determini
2a710 6e 67 20 69 66 20 61 20 74 65 73 74 0d 0a 20 20  ng if a test..  
2a720 20 20 20 20 20 20 23 20 20 20 20 20 20 20 70 61        #       pa
2a730 73 73 65 64 2e 20 20 44 69 73 61 62 6c 69 6e 67  ssed.  Disabling
2a740 20 74 68 69 73 20 62 65 68 61 76 69 6f 72 20 69   this behavior i
2a750 73 20 73 6f 6d 65 74 69 6d 65 73 20 6e 65 63 65  s sometimes nece
2a760 73 73 61 72 79 20 28 65 2e 67 2e 0d 0a 20 20 20  ssary (e.g...   
2a770 20 20 20 20 20 23 20 20 20 20 20 20 20 64 75 72       #       dur
2a780 69 6e 67 20 74 68 65 20 72 65 6c 65 61 73 65 20  ing the release 
2a790 74 65 73 74 69 6e 67 20 70 72 6f 63 65 73 73 29  testing process)
2a7a0 20 62 65 63 61 75 73 65 20 74 68 65 72 65 20 61   because there a
2a7b0 72 65 20 73 65 76 65 72 61 6c 0d 0a 20 20 20 20  re several..    
2a7c0 20 20 20 20 23 20 20 20 20 20 20 20 74 65 73 74      #       test
2a7d0 73 20 74 68 61 74 20 72 65 6c 79 20 6f 6e 20 74  s that rely on t
2a7e0 68 65 20 22 6f 70 65 6e 65 64 20 66 72 6f 6d 20  he "opened from 
2a7f0 70 6f 6f 6c 22 20 63 6f 75 6e 74 20 62 65 69 6e  pool" count bein
2a800 67 20 67 72 65 61 74 65 72 0d 0a 20 20 20 20 20  g greater..     
2a810 20 20 20 23 20 20 20 20 20 20 20 74 68 61 6e 20     #       than 
2a820 7a 65 72 6f 2e 20 20 54 68 65 73 65 20 74 65 73  zero.  These tes
2a830 74 73 20 6d 61 79 20 66 61 69 6c 20 64 75 65 20  ts may fail due 
2a840 74 6f 20 74 68 65 20 6e 6f 6e 2d 64 65 74 65 72  to the non-deter
2a850 6d 69 6e 69 73 74 69 63 0d 0a 20 20 20 20 20 20  ministic..      
2a860 20 20 23 20 20 20 20 20 20 20 62 65 68 61 76 69    #       behavi
2a870 6f 72 20 6f 66 20 74 68 65 20 43 4c 52 20 47 43  or of the CLR GC
2a880 2c 20 65 76 65 6e 20 77 68 65 6e 20 74 68 65 72  , even when ther
2a890 65 20 69 73 20 6e 6f 20 62 75 67 20 69 6e 20 74  e is no bug in t
2a8a0 68 65 20 63 6f 64 65 0d 0a 20 20 20 20 20 20 20  he code..       
2a8b0 20 23 20 20 20 20 20 20 20 62 65 69 6e 67 20 74   #       being t
2a8c0 65 73 74 65 64 2e 0d 0a 20 20 20 20 20 20 20 20  ested...        
2a8d0 23 0d 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b  #..        check
2a8e0 46 6f 72 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e  ForRuntimeOption
2a8f0 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
2a900 20 6e 6f 50 6f 6f 6c 43 6f 75 6e 74 73 0d 0a 0d   noPoolCounts...
2a910 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
2a920 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63      # NOTE: Chec
2a930 6b 20 69 66 20 74 68 65 20 74 65 73 74 20 73 75  k if the test su
2a940 69 74 65 20 73 68 6f 75 6c 64 20 75 73 65 20 73  ite should use s
2a950 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65  hared-cache mode
2a960 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
2a970 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 52 75        checkForRu
2a980 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 24 3a 3a 74  ntimeOption $::t
2a990 65 73 74 5f 63 68 61 6e 6e 65 6c 20 73 68 61 72  est_channel shar
2a9a0 65 64 43 61 63 68 65 0d 0a 0d 0a 20 20 20 20 20  edCache....     
2a9b0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
2a9c0 4e 4f 54 45 3a 20 52 65 70 6f 72 74 20 74 68 65  NOTE: Report the
2a9d0 20 72 65 73 6f 75 72 63 65 20 75 73 61 67 65 20   resource usage 
2a9e0 70 72 69 6f 72 20 74 6f 20 72 75 6e 6e 69 6e 67  prior to running
2a9f0 20 61 6e 79 20 74 65 73 74 73 2e 0d 0a 20 20 20   any tests...   
2aa00 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
2aa10 72 65 70 6f 72 74 53 51 4c 69 74 65 52 65 73 6f  reportSQLiteReso
2aa20 75 72 63 65 73 20 24 3a 3a 74 65 73 74 5f 63 68  urces $::test_ch
2aa30 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20 20 20  annel....       
2aa40 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
2aa50 54 45 3a 20 47 72 61 62 20 74 68 65 20 6c 69 73  TE: Grab the lis
2aa60 74 20 6f 66 20 6e 61 74 69 76 65 20 6d 6f 64 75  t of native modu
2aa70 6c 65 73 20 66 6f 72 20 74 68 65 20 63 75 72 72  les for the curr
2aa80 65 6e 74 20 70 72 6f 63 65 73 73 20 61 6e 64 0d  ent process and.
2aa90 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
2aaa0 20 72 65 70 6f 72 74 20 6f 6e 20 74 68 65 20 53   report on the S
2aab0 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
2aac0 65 20 72 65 6c 61 74 65 64 20 6f 6e 65 73 2e 0d  e related ones..
2aad0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
2aae0 20 20 20 20 69 66 20 7b 5b 68 61 76 65 53 51 4c      if {[haveSQL
2aaf0 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64  iteObjectCommand
2ab00 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
2ab10 20 20 20 20 20 73 65 74 20 6d 6f 64 75 6c 65 73       set modules
2ab20 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20   [object invoke 
2ab30 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
2ab40 20 53 79 73 74 65 6d 2e 44 69 61 67 6e 6f 73 74   System.Diagnost
2ab50 69 63 73 2e 50 72 6f 63 65 73 73 2e 47 65 74 43  ics.Process.GetC
2ab60 75 72 72 65 6e 74 50 72 6f 63 65 73 73 20 4d 6f  urrentProcess Mo
2ab70 64 75 6c 65 73 5d 0d 0a 0d 0a 20 20 20 20 20 20  dules]....      
2ab80 20 20 20 20 6f 62 6a 65 63 74 20 66 6f 72 65 61      object forea
2ab90 63 68 20 2d 61 6c 69 61 73 20 6d 6f 64 75 6c 65  ch -alias module
2aba0 20 24 6d 6f 64 75 6c 65 73 20 7b 0d 0a 20 20 20   $modules {..   
2abb0 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
2abc0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
2abd0 54 68 65 20 6d 6f 64 75 6c 65 20 66 69 6c 65 20  The module file 
2abe0 6e 61 6d 65 20 68 65 72 65 20 6d 75 73 74 20 62  name here must b
2abf0 65 20 6e 6f 72 6d 61 6c 69 7a 65 64 2e 0d 0a 20  e normalized... 
2ac00 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
2ac10 20 20 20 20 20 20 20 20 20 20 73 65 74 20 66 69            set fi
2ac20 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6e 6f 72  leName [file nor
2ac30 6d 61 6c 69 7a 65 20 5b 24 6d 6f 64 75 6c 65 20  malize [$module 
2ac40 46 69 6c 65 4e 61 6d 65 5d 5d 0d 0a 20 20 20 20  FileName]]..    
2ac50 20 20 20 20 20 20 20 20 73 65 74 20 66 69 6c 65          set file
2ac60 4e 61 6d 65 4f 6e 6c 79 20 5b 66 69 6c 65 20 74  NameOnly [file t
2ac70 61 69 6c 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a  ail $fileName]..
2ac80 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
2ac90 20 7b 5b 6c 73 65 61 72 63 68 20 2d 65 78 61 63   {[lsearch -exac
2aca0 74 20 2d 6e 6f 63 61 73 65 20 2d 2d 20 5c 0d 0a  t -nocase -- \..
2acb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2acc0 5b 67 65 74 4e 61 74 69 76 65 4c 69 62 72 61 72  [getNativeLibrar
2acd0 79 46 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79 5d 20  yFileNamesOnly] 
2ace0 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 5d 20 21  $fileNameOnly] !
2acf0 3d 20 2d 31 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  = -1} then {..  
2ad00 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
2ad10 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
2ad20 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
2ad30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2ad40 20 20 20 22 2d 2d 2d 2d 20 66 6f 75 6e 64 20 6c     "---- found l
2ad50 6f 61 64 65 64 20 53 51 4c 69 74 65 20 6e 61 74  oaded SQLite nat
2ad60 69 76 65 20 6c 69 62 72 61 72 79 20 6d 6f 64 75  ive library modu
2ad70 6c 65 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20  le: " \..       
2ad80 20 20 20 20 20 20 20 20 20 20 20 24 66 69 6c 65             $file
2ad90 4e 61 6d 65 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  Name \n]..      
2ada0 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b        } elseif {
2adb0 5b 6c 73 65 61 72 63 68 20 2d 65 78 61 63 74 20  [lsearch -exact 
2adc0 2d 6e 6f 63 61 73 65 20 2d 2d 20 5c 0d 0a 20 20  -nocase -- \..  
2add0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 67                [g
2ade0 65 74 49 6e 74 65 72 6f 70 41 73 73 65 6d 62 6c  etInteropAssembl
2adf0 79 46 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79 5d 20  yFileNamesOnly] 
2ae00 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 5d 20 21  $fileNameOnly] !
2ae10 3d 20 2d 31 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  = -1} then {..  
2ae20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
2ae30 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
2ae40 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
2ae50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2ae60 20 20 20 22 2d 2d 2d 2d 20 66 6f 75 6e 64 20 6c     "---- found l
2ae70 6f 61 64 65 64 20 53 51 4c 69 74 65 20 69 6e 74  oaded SQLite int
2ae80 65 72 6f 70 20 61 73 73 65 6d 62 6c 79 20 6d 6f  erop assembly mo
2ae90 64 75 6c 65 3a 20 22 20 5c 0d 0a 20 20 20 20 20  dule: " \..     
2aea0 20 20 20 20 20 20 20 20 20 20 20 20 20 24 66 69               $fi
2aeb0 6c 65 4e 61 6d 65 20 5c 6e 5d 0d 0a 20 20 20 20  leName \n]..    
2aec0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
2aed0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
2aee0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63 61 74  }....        cat
2aef0 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
2af00 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
2af10 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20  annel \..       
2af20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 6d         "---- com
2af30 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e  pile-time option
2af40 73 20 66 6f 72 20 53 51 4c 69 74 65 20 63 6f 72  s for SQLite cor
2af50 65 20 6c 69 62 72 61 72 79 2e 2e 2e 20 22 0d 0a  e library... "..
2af60 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
2af70 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
2af80 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76        object inv
2af90 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50  oke -flags +NonP
2afa0 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20  ublic \..       
2afb0 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e           System.
2afc0 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69  Data.SQLite.SQLi
2afd0 74 65 33 20 53 51 4c 69 74 65 43 6f 6d 70 69 6c  te3 SQLiteCompil
2afe0 65 4f 70 74 69 6f 6e 73 0d 0a 20 20 20 20 20 20  eOptions..      
2aff0 20 20 20 20 7d 20 63 6f 6d 70 69 6c 65 4f 70 74      } compileOpt
2b000 69 6f 6e 73 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  ions] == 0} then
2b010 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
2b020 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
2b030 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
2b040 73 20 5b 66 6f 72 6d 61 74 4c 69 73 74 20 5b 6c  s [formatList [l
2b050 73 6f 72 74 20 5c 0d 0a 20 20 20 20 20 20 20 20  sort \..        
2b060 20 20 20 20 20 20 20 20 24 63 6f 6d 70 69 6c 65          $compile
2b070 4f 70 74 69 6f 6e 73 5d 20 3c 6e 6f 6e 65 3e 5d  Options] <none>]
2b080 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \n]..          
2b090 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
2b0a0 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
2b0b0 65 73 74 5f 63 68 61 6e 6e 65 6c 20 75 6e 6b 6e  est_channel unkn
2b0c0 6f 77 6e 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20  own\n..         
2b0d0 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d   }..        }...
2b0e0 0a 20 20 20 20 20 20 20 20 63 61 74 63 68 20 7b  .        catch {
2b0f0 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74  ..          tput
2b100 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
2b110 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  l \..           
2b120 20 20 20 22 2d 2d 2d 2d 20 63 6f 6d 70 69 6c 65     "---- compile
2b130 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 73 20 66 6f  -time options fo
2b140 72 20 53 51 4c 69 74 65 20 69 6e 74 65 72 6f 70  r SQLite interop
2b150 20 61 73 73 65 6d 62 6c 79 2e 2e 2e 20 22 0d 0a   assembly... "..
2b160 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
2b170 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
2b180 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76        object inv
2b190 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50  oke -flags +NonP
2b1a0 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20  ublic \..       
2b1b0 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e           System.
2b1c0 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69  Data.SQLite.SQLi
2b1d0 74 65 33 20 49 6e 74 65 72 6f 70 43 6f 6d 70 69  te3 InteropCompi
2b1e0 6c 65 4f 70 74 69 6f 6e 73 0d 0a 20 20 20 20 20  leOptions..     
2b1f0 20 20 20 20 20 7d 20 63 6f 6d 70 69 6c 65 4f 70       } compileOp
2b200 74 69 6f 6e 73 5d 20 3d 3d 20 30 7d 20 74 68 65  tions] == 0} the
2b210 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
2b220 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
2b230 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
2b240 67 73 20 5b 66 6f 72 6d 61 74 4c 69 73 74 20 5b  gs [formatList [
2b250 6c 73 6f 72 74 20 5c 0d 0a 20 20 20 20 20 20 20  lsort \..       
2b260 20 20 20 20 20 20 20 20 20 24 63 6f 6d 70 69 6c           $compil
2b270 65 4f 70 74 69 6f 6e 73 5d 20 3c 6e 6f 6e 65 3e  eOptions] <none>
2b280 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  ] \n]..         
2b290 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
2b2a0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
2b2b0 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 75 6e 6b  test_channel unk
2b2c0 6e 6f 77 6e 5c 6e 0d 0a 20 20 20 20 20 20 20 20  nown\n..        
2b2d0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
2b2e0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
2b2f0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f       # NOTE: Sho
2b300 77 20 74 68 65 20 61 63 74 69 76 65 20 74 65 73  w the active tes
2b310 74 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0d 0a  t constraints...
2b320 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
2b330 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
2b340 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
2b350 41 72 67 73 20 22 2d 2d 2d 2d 20 63 6f 6e 73 74  Args "---- const
2b360 72 61 69 6e 74 73 3a 20 22 20 5c 0d 0a 20 20 20  raints: " \..   
2b370 20 20 20 20 20 20 20 20 20 5b 66 6f 72 6d 61 74           [format
2b380 4c 69 73 74 20 5b 6c 73 6f 72 74 20 5b 67 65 74  List [lsort [get
2b390 43 6f 6e 73 74 72 61 69 6e 74 73 5d 5d 20 3c 6e  Constraints]] <n
2b3a0 6f 6e 65 3e 5d 20 5c 6e 5d 0d 0a 0d 0a 20 20 20  one>] \n]....   
2b3b0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
2b3c0 23 20 4e 4f 54 45 3a 20 53 61 76 65 20 74 68 65  # NOTE: Save the
2b3d0 20 74 65 73 74 20 63 6f 6e 73 74 72 61 69 6e 74   test constraint
2b3e0 73 20 66 6f 72 20 75 73 65 20 62 79 20 74 68 72  s for use by thr
2b3f0 65 61 64 73 20 63 72 65 61 74 65 64 20 69 6e 20  eads created in 
2b400 74 68 69 73 0d 0a 20 20 20 20 20 20 20 20 23 20  this..        # 
2b410 20 20 20 20 20 20 61 70 70 6c 69 63 61 74 69 6f        applicatio
2b420 6e 20 64 6f 6d 61 69 6e 2e 20 20 54 68 69 73 20  n domain.  This 
2b430 69 73 20 6e 65 63 65 73 73 61 72 79 20 62 65 63  is necessary bec
2b440 61 75 73 65 20 61 6c 6c 20 74 68 65 20 45 61 67  ause all the Eag
2b450 6c 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  le..        #   
2b460 20 20 20 20 22 74 65 73 74 20 63 6f 6e 74 65 78      "test contex
2b470 74 22 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  t" information i
2b480 73 20 70 65 72 2d 74 68 72 65 61 64 2e 0d 0a 20  s per-thread... 
2b490 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
2b4a0 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
2b4b0 73 74 73 20 3a 3a 74 65 73 74 5f 63 6f 6e 73 74  sts ::test_const
2b4c0 72 61 69 6e 74 73 5d 7d 20 74 68 65 6e 20 7b 0d  raints]} then {.
2b4d0 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20 3a  .          set :
2b4e0 3a 74 65 73 74 5f 63 6f 6e 73 74 72 61 69 6e 74  :test_constraint
2b4f0 73 20 24 3a 3a 65 61 67 6c 65 5f 74 65 73 74 73  s $::eagle_tests
2b500 28 43 6f 6e 73 74 72 61 69 6e 74 73 29 0d 0a 20  (Constraints).. 
2b510 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
2b520 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
2b530 20 4e 4f 54 45 3a 20 4c 6f 61 64 20 74 68 65 20   NOTE: Load the 
2b540 22 61 66 74 65 72 2d 63 6f 6e 73 74 72 61 69 6e  "after-constrain
2b550 74 73 22 20 63 75 73 74 6f 6d 20 70 65 72 2d 75  ts" custom per-u
2b560 73 65 72 20 61 6e 64 2f 6f 72 20 70 65 72 2d 68  ser and/or per-h
2b570 6f 73 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ost..        #  
2b580 20 20 20 20 20 74 65 73 74 20 73 65 74 74 69 6e       test settin
2b590 67 73 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20  gs now...       
2b5a0 20 23 0d 0a 20 20 20 20 20 20 20 20 75 70 6c 65   #..        uple
2b5b0 76 65 6c 20 31 20 5b 6c 69 73 74 20 6c 6f 61 64  vel 1 [list load
2b5c0 53 51 4c 69 74 65 54 65 73 74 53 65 74 74 69 6e  SQLiteTestSettin
2b5d0 67 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  gs $::test_chann
2b5e0 65 6c 20 2e 61 66 74 65 72 5d 0d 0a 0d 0a 20 20  el .after]....  
2b5f0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
2b600 20 23 20 4e 4f 54 45 3a 20 49 66 20 6e 65 63 65   # NOTE: If nece
2b610 73 73 61 72 79 2c 20 65 6e 61 62 6c 65 20 73 68  ssary, enable sh
2b620 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 20  ared-cache mode 
2b630 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  now...        #.
2b640 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 68 61  .        if {[ha
2b650 73 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 73  sRuntimeOption s
2b660 68 61 72 65 64 43 61 63 68 65 5d 7d 20 74 68 65  haredCache]} the
2b670 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 65  n {..          e
2b680 6e 61 62 6c 65 53 68 61 72 65 64 43 61 63 68 65  nableSharedCache
2b690 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
2b6a0 20 74 72 75 65 0d 0a 20 20 20 20 20 20 20 20 7d   true..        }
2b6b0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
2b6c0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53         # NOTE: S
2b6d0 68 6f 77 20 77 68 65 6e 20 6f 75 72 20 74 65 73  how when our tes
2b6e0 74 73 20 61 63 74 75 61 6c 6c 79 20 62 65 67 61  ts actually bega
2b6f0 6e 20 28 6e 6f 77 29 2e 0d 0a 20 20 20 20 20 20  n (now)...      
2b700 20 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75    #..        tpu
2b710 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
2b720 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
2b730 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d  ..            "-
2b740 2d 2d 2d 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  --- System.Data.
2b750 53 51 4c 69 74 65 20 74 65 73 74 73 20 62 65 67  SQLite tests beg
2b760 61 6e 20 61 74 20 22 20 5c 0d 0a 20 20 20 20 20  an at " \..     
2b770 20 20 20 20 20 20 20 5b 63 6c 6f 63 6b 20 66 6f         [clock fo
2b780 72 6d 61 74 20 5b 63 6c 6f 63 6b 20 73 65 63 6f  rmat [clock seco
2b790 6e 64 73 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20  nds]] \n]..     
2b7a0 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
2b7b0 20 20 70 72 6f 63 20 72 75 6e 53 51 4c 69 74 65    proc runSQLite
2b7c0 54 65 73 74 46 69 6c 65 73 50 72 6f 6c 6f 67 75  TestFilesPrologu
2b7d0 65 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  e {} {..      #.
2b7e0 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53  .      # NOTE: S
2b7f0 6b 69 70 20 72 75 6e 6e 69 6e 67 20 6f 75 72 20  kip running our 
2b800 63 75 73 74 6f 6d 20 66 69 6c 65 73 20 70 72 6f  custom files pro
2b810 6c 6f 67 75 65 20 69 66 20 74 68 65 20 6d 61 69  logue if the mai
2b820 6e 20 6f 6e 65 20 68 61 73 20 62 65 65 6e 0d 0a  n one has been..
2b830 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73 6b        #       sk
2b840 69 70 70 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d  ipped...      #.
2b850 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66  .      if {![inf
2b860 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 70 72  o exists ::no(pr
2b870 6f 6c 6f 67 75 65 2e 65 61 67 6c 65 29 5d 7d 20  ologue.eagle)]} 
2b880 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
2b890 75 70 6c 65 76 65 6c 20 31 20 7b 0d 0a 20 20 20  uplevel 1 {..   
2b8a0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
2b8b0 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 65 74 75      # NOTE: Setu
2b8c0 70 20 74 68 65 20 76 61 72 69 61 62 6c 65 73 20  p the variables 
2b8d0 74 68 61 74 20 72 65 66 65 72 20 74 6f 20 74 68  that refer to th
2b8e0 65 20 76 61 72 69 6f 75 73 20 6e 6f 6e 2d 64 61  e various non-da
2b8f0 74 61 20 66 69 6c 65 73 0d 0a 20 20 20 20 20 20  ta files..      
2b900 20 20 20 20 23 20 20 20 20 20 20 20 72 65 71 75      #       requ
2b910 69 72 65 64 20 62 79 20 74 68 65 20 74 65 73 74  ired by the test
2b920 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 2e 0d  s in this file..
2b930 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
2b940 20 20 20 20 20 20 20 20 73 65 74 20 65 6e 74 69          set enti
2b950 74 79 46 72 61 6d 65 77 6f 72 6b 44 6c 6c 46 69  tyFrameworkDllFi
2b960 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  le \..          
2b970 20 20 20 20 5b 67 65 74 42 75 69 6c 64 46 69 6c      [getBuildFil
2b980 65 4e 61 6d 65 20 45 6e 74 69 74 79 46 72 61 6d  eName EntityFram
2b990 65 77 6f 72 6b 2e 64 6c 6c 20 66 61 6c 73 65 5d  ework.dll false]
2b9a0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65  ....          se
2b9b0 74 20 69 6e 73 74 61 6c 6c 65 72 45 78 65 46 69  t installerExeFi
2b9c0 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  le \..          
2b9d0 20 20 20 20 5b 67 65 74 42 75 69 6c 64 46 69 6c      [getBuildFil
2b9e0 65 4e 61 6d 65 20 49 6e 73 74 61 6c 6c 65 72 2e  eName Installer.
2b9f0 65 78 65 20 66 61 6c 73 65 5d 0d 0a 0d 0a 20 20  exe false]....  
2ba00 20 20 20 20 20 20 20 20 73 65 74 20 73 71 6c 69          set sqli
2ba10 74 65 44 65 73 69 67 6e 65 72 44 6c 6c 46 69 6c  teDesignerDllFil
2ba20 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
2ba30 20 20 20 5b 67 65 74 42 75 69 6c 64 46 69 6c 65     [getBuildFile
2ba40 4e 61 6d 65 20 53 51 4c 69 74 65 2e 44 65 73 69  Name SQLite.Desi
2ba50 67 6e 65 72 2e 64 6c 6c 20 66 61 6c 73 65 5d 0d  gner.dll false].
2ba60 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  ...          set
2ba70 20 73 79 73 74 65 6d 44 61 74 61 53 51 4c 69 74   systemDataSQLit
2ba80 65 44 6c 6c 46 69 6c 65 20 5c 0d 0a 20 20 20 20  eDllFile \..    
2ba90 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 42 75            [getBu
2baa0 69 6c 64 46 69 6c 65 4e 61 6d 65 20 53 79 73 74  ildFileName Syst
2bab0 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64  em.Data.SQLite.d
2bac0 6c 6c 20 66 61 6c 73 65 5d 0d 0a 0d 0a 20 20 20  ll false]....   
2bad0 20 20 20 20 20 20 20 73 65 74 20 73 79 73 74 65         set syste
2bae0 6d 44 61 74 61 53 51 4c 69 74 65 4c 69 6e 71 44  mDataSQLiteLinqD
2baf0 6c 6c 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20  llFile \..      
2bb00 20 20 20 20 20 20 20 20 5b 67 65 74 42 75 69 6c          [getBuil
2bb10 64 46 69 6c 65 4e 61 6d 65 20 53 79 73 74 65 6d  dFileName System
2bb20 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 4c 69 6e  .Data.SQLite.Lin
2bb30 71 2e 64 6c 6c 20 66 61 6c 73 65 5d 0d 0a 0d 0a  q.dll false]....
2bb40 20 20 20 20 20 20 20 20 20 20 73 65 74 20 73 79            set sy
2bb50 73 74 65 6d 44 61 74 61 53 51 4c 69 74 65 45 66  stemDataSQLiteEf
2bb60 36 44 6c 6c 46 69 6c 65 20 5c 0d 0a 20 20 20 20  6DllFile \..    
2bb70 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 42 75            [getBu
2bb80 69 6c 64 46 69 6c 65 4e 61 6d 65 20 53 79 73 74  ildFileName Syst
2bb90 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 45  em.Data.SQLite.E
2bba0 46 36 2e 64 6c 6c 20 66 61 6c 73 65 5d 0d 0a 0d  F6.dll false]...
2bbb0 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20 74  .          set t
2bbc0 65 73 74 45 78 65 46 69 6c 65 20 5b 67 65 74 42  estExeFile [getB
2bbd0 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20 74 65 73  uildFileName tes
2bbe0 74 2e 65 78 65 20 66 61 6c 73 65 5d 0d 0a 20 20  t.exe false]..  
2bbf0 20 20 20 20 20 20 20 20 73 65 74 20 74 65 73 74          set test
2bc00 4c 69 6e 71 45 78 65 46 69 6c 65 20 5b 67 65 74  LinqExeFile [get
2bc10 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20 74 65  BuildFileName te
2bc20 73 74 6c 69 6e 71 2e 65 78 65 20 66 61 6c 73 65  stlinq.exe false
2bc30 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  ]..          set
2bc40 20 74 65 73 74 45 66 36 45 78 65 46 69 6c 65 20   testEf6ExeFile 
2bc50 5b 67 65 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d  [getBuildFileNam
2bc60 65 20 74 65 73 74 65 66 36 2e 65 78 65 20 66 61  e testef6.exe fa
2bc70 6c 73 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  lse]....        
2bc80 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23    #..          #
2bc90 20 4e 4f 54 45 3a 20 53 65 74 75 70 20 74 68 65   NOTE: Setup the
2bca0 20 76 61 72 69 61 62 6c 65 73 20 74 68 61 74 20   variables that 
2bcb0 72 65 66 65 72 20 74 6f 20 74 68 65 20 76 61 72  refer to the var
2bcc0 69 6f 75 73 20 64 61 74 61 20 66 69 6c 65 73 0d  ious data files.
2bcd0 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20  .          #    
2bce0 20 20 20 72 65 71 75 69 72 65 64 20 62 79 20 74     required by t
2bcf0 68 65 20 74 65 73 74 73 20 69 6e 20 74 68 69 73  he tests in this
2bd00 20 66 69 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20   file...        
2bd10 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73    #..          s
2bd20 65 74 20 74 65 73 74 4c 69 6e 71 4f 75 74 46 69  et testLinqOutFi
2bd30 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e  le [file nativen
2bd40 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c  ame [file join \
2bd50 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2bd60 5b 67 65 74 53 51 4c 69 74 65 54 65 73 74 44 61  [getSQLiteTestDa
2bd70 74 61 50 61 74 68 5d 20 74 65 73 74 6c 69 6e 71  taPath] testlinq
2bd80 2e 6f 75 74 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20  .out]]....      
2bd90 20 20 20 20 73 65 74 20 6e 6f 72 74 68 77 69 6e      set northwin
2bda0 64 45 66 44 62 46 69 6c 65 20 5b 66 69 6c 65 20  dEfDbFile [file 
2bdb0 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65  nativename [file
2bdc0 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20   join \..       
2bdd0 20 20 20 20 20 20 20 5b 66 69 6c 65 20 64 69 72         [file dir
2bde0 6e 61 6d 65 20 5b 66 69 6c 65 20 64 69 72 6e 61  name [file dirna
2bdf0 6d 65 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73  me [getSQLiteTes
2be00 74 44 61 74 61 50 61 74 68 5d 5d 5d 20 5c 0d 0a  tDataPath]]] \..
2be10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65                te
2be20 73 74 6c 69 6e 71 20 6e 6f 72 74 68 77 69 6e 64  stlinq northwind
2be30 45 46 2e 64 62 5d 5d 0d 0a 0d 0a 20 20 20 20 20  EF.db]]....     
2be40 20 20 20 20 20 73 65 74 20 6e 6f 6e 57 61 6c 44       set nonWalD
2be50 62 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69  bFile [file nati
2be60 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69  vename [file joi
2be70 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n \..           
2be80 20 20 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73     [getSQLiteTes
2be90 74 44 61 74 61 50 61 74 68 5d 20 6e 6f 6e 57 61  tDataPath] nonWa
2bea0 6c 2e 64 62 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20  l.db]]....      
2beb0 20 20 20 20 73 65 74 20 77 61 6c 44 62 46 69 6c      set walDbFil
2bec0 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61  e [file nativena
2bed0 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d  me [file join \.
2bee0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b  .              [
2bef0 67 65 74 53 51 4c 69 74 65 54 65 73 74 44 61 74  getSQLiteTestDat
2bf00 61 50 61 74 68 5d 20 77 61 6c 2e 64 62 5d 5d 0d  aPath] wal.db]].
2bf10 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
2bf20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
2bf30 3a 20 54 68 65 20 76 61 72 69 6f 75 73 20 69 6e  : The various in
2bf40 73 74 61 6c 6c 2f 75 6e 69 6e 73 74 61 6c 6c 20  stall/uninstall 
2bf50 6c 6f 67 20 66 69 6c 65 73 20 75 73 65 64 20 74  log files used t
2bf60 6f 20 74 65 73 74 20 74 68 65 0d 0a 20 20 20 20  o test the..    
2bf70 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64 65        #       de
2bf80 73 69 67 6e 2d 74 69 6d 65 20 63 6f 6d 70 6f 6e  sign-time compon
2bf90 65 6e 74 20 69 6e 73 74 61 6c 6c 65 72 2e 0d 0a  ent installer...
2bfa0 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
2bfb0 20 20 20 20 20 20 20 73 65 74 20 74 65 73 74 49         set testI
2bfc0 6e 73 74 61 6c 6c 56 73 32 30 30 35 4c 6f 67 46  nstallVs2005LogF
2bfd0 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65  ile [file native
2bfe0 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20  name [file join 
2bff0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
2c000 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73 74 44   [getSQLiteTestD
2c010 61 74 61 50 61 74 68 5d 20 49 6e 73 74 61 6c 6c  ataPath] Install
2c020 65 72 5f 54 65 73 74 5f 56 73 32 30 30 35 2e 6c  er_Test_Vs2005.l
2c030 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  og]]....        
2c040 20 20 73 65 74 20 74 65 73 74 49 6e 73 74 61 6c    set testInstal
2c050 6c 56 73 32 30 30 38 4c 6f 67 46 69 6c 65 20 5b  lVs2008LogFile [
2c060 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20  file nativename 
2c070 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20  [file join \..  
2c080 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74              [get
2c090 53 51 4c 69 74 65 54 65 73 74 44 61 74 61 50 61  SQLiteTestDataPa
2c0a0 74 68 5d 20 49 6e 73 74 61 6c 6c 65 72 5f 54 65  th] Installer_Te
2c0b0 73 74 5f 56 73 32 30 30 38 2e 6c 6f 67 5d 5d 0d  st_Vs2008.log]].
2c0c0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  ...          set
2c0d0 20 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30   testInstallVs20
2c0e0 31 30 4c 6f 67 46 69 6c 65 20 5b 66 69 6c 65 20  10LogFile [file 
2c0f0 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65  nativename [file
2c100 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20   join \..       
2c110 20 20 20 20 20 20 20 5b 67 65 74 53 51 4c 69 74         [getSQLit
2c120 65 54 65 73 74 44 61 74 61 50 61 74 68 5d 20 49  eTestDataPath] I
2c130 6e 73 74 61 6c 6c 65 72 5f 54 65 73 74 5f 56 73  nstaller_Test_Vs
2c140 32 30 31 30 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20  2010.log]]....  
2c150 20 20 20 20 20 20 20 20 73 65 74 20 74 65 73 74          set test
2c160 49 6e 73 74 61 6c 6c 56 73 32 30 31 32 4c 6f 67  InstallVs2012Log
2c170 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69 76  File [file nativ
2c180 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e  ename [file join
2c190 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
2c1a0 20 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73 74    [getSQLiteTest
2c1b0 44 61 74 61 50 61 74 68 5d 20 49 6e 73 74 61 6c  DataPath] Instal
2c1c0 6c 65 72 5f 54 65 73 74 5f 56 73 32 30 31 32 2e  ler_Test_Vs2012.
2c1d0 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  log]]....       
2c1e0 20 20 20 73 65 74 20 74 65 73 74 49 6e 73 74 61     set testInsta
2c1f0 6c 6c 56 73 32 30 31 33 4c 6f 67 46 69 6c 65 20  llVs2013LogFile 
2c200 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65  [file nativename
2c210 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20   [file join \.. 
2c220 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65               [ge
2c230 74 53 51 4c 69 74 65 54 65 73 74 44 61 74 61 50  tSQLiteTestDataP
2c240 61 74 68 5d 20 49 6e 73 74 61 6c 6c 65 72 5f 54  ath] Installer_T
2c250 65 73 74 5f 56 73 32 30 31 33 2e 6c 6f 67 5d 5d  est_Vs2013.log]]
2c260 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65  ....          se
2c270 74 20 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32  t testInstallVs2
2c280 30 31 35 4c 6f 67 46 69 6c 65 20 5b 66 69 6c 65  015LogFile [file
2c290 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c   nativename [fil
2c2a0 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20  e join \..      
2c2b0 20 20 20 20 20 20 20 20 5b 67 65 74 53 51 4c 69          [getSQLi
2c2c0 74 65 54 65 73 74 44 61 74 61 50 61 74 68 5d 20  teTestDataPath] 
2c2d0 49 6e 73 74 61 6c 6c 65 72 5f 54 65 73 74 5f 56  Installer_Test_V
2c2e0 73 32 30 31 35 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20  s2015.log]].... 
2c2f0 20 20 20 20 20 20 20 20 20 73 65 74 20 74 65 73           set tes
2c300 74 49 6e 73 74 61 6c 6c 56 73 32 30 31 37 4c 6f  tInstallVs2017Lo
2c310 67 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69  gFile [file nati
2c320 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69  vename [file joi
2c330 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n \..           
2c340 20 20 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73     [getSQLiteTes
2c350 74 44 61 74 61 50 61 74 68 5d 20 49 6e 73 74 61  tDataPath] Insta
2c360 6c 6c 65 72 5f 54 65 73 74 5f 56 73 32 30 31 37  ller_Test_Vs2017
2c370 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20  .log]]....      
2c380 20 20 20 20 73 65 74 20 74 65 73 74 55 6e 69 6e      set testUnin
2c390 73 74 61 6c 6c 56 73 32 30 30 35 4c 6f 67 46 69  stallVs2005LogFi
2c3a0 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e  le [file nativen
2c3b0 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c  ame [file join \
2c3c0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2c3d0 5b 67 65 74 53 51 4c 69 74 65 54 65 73 74 44 61  [getSQLiteTestDa
2c3e0 74 61 50 61 74 68 5d 20 55 6e 69 6e 73 74 61 6c  taPath] Uninstal
2c3f0 6c 65 72 5f 54 65 73 74 5f 56 73 32 30 30 35 2e  ler_Test_Vs2005.
2c400 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  log]]....       
2c410 20 20 20 73 65 74 20 74 65 73 74 55 6e 69 6e 73     set testUnins
2c420 74 61 6c 6c 56 73 32 30 30 38 4c 6f 67 46 69 6c  tallVs2008LogFil
2c430 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61  e [file nativena
2c440 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d  me [file join \.
2c450 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b  .              [
2c460 67 65 74 53 51 4c 69 74 65 54 65 73 74 44 61 74  getSQLiteTestDat
2c470 61 50 61 74 68 5d 20 55 6e 69 6e 73 74 61 6c 6c  aPath] Uninstall
2c480 65 72 5f 54 65 73 74 5f 56 73 32 30 30 38 2e 6c  er_Test_Vs2008.l
2c490 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  og]]....        
2c4a0 20 20 73 65 74 20 74 65 73 74 55 6e 69 6e 73 74    set testUninst
2c4b0 61 6c 6c 56 73 32 30 31 30 4c 6f 67 46 69 6c 65  allVs2010LogFile
2c4c0 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d   [file nativenam
2c4d0 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a  e [file join \..
2c4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 67                [g
2c4f0 65 74 53 51 4c 69 74 65 54 65 73 74 44 61 74 61  etSQLiteTestData
2c500 50 61 74 68 5d 20 55 6e 69 6e 73 74 61 6c 6c 65  Path] Uninstalle
2c510 72 5f 54 65 73 74 5f 56 73 32 30 31 30 2e 6c 6f  r_Test_Vs2010.lo
2c520 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  g]]....         
2c530 20 73 65 74 20 74 65 73 74 55 6e 69 6e 73 74 61   set testUninsta
2c540 6c 6c 56 73 32 30 31 32 4c 6f 67 46 69 6c 65 20  llVs2012LogFile 
2c550 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65  [file nativename
2c560 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20   [file join \.. 
2c570 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65               [ge
2c580 74 53 51 4c 69 74 65 54 65 73 74 44 61 74 61 50  tSQLiteTestDataP
2c590 61 74 68 5d 20 55 6e 69 6e 73 74 61 6c 6c 65 72  ath] Uninstaller
2c5a0 5f 54 65 73 74 5f 56 73 32 30 31 32 2e 6c 6f 67  _Test_Vs2012.log
2c5b0 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  ]]....          
2c5c0 73 65 74 20 74 65 73 74 55 6e 69 6e 73 74 61 6c  set testUninstal
2c5d0 6c 56 73 32 30 31 33 4c 6f 67 46 69 6c 65 20 5b  lVs2013LogFile [
2c5e0 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20  file nativename 
2c5f0 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20  [file join \..  
2c600 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74              [get
2c610 53 51 4c 69 74 65 54 65 73 74 44 61 74 61 50 61  SQLiteTestDataPa
2c620 74 68 5d 20 55 6e 69 6e 73 74 61 6c 6c 65 72 5f  th] Uninstaller_
2c630 54 65 73 74 5f 56 73 32 30 31 33 2e 6c 6f 67 5d  Test_Vs2013.log]
2c640 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 73  ]....          s
2c650 65 74 20 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c  et testUninstall
2c660 56 73 32 30 31 35 4c 6f 67 46 69 6c 65 20 5b 66  Vs2015LogFile [f
2c670 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b  ile nativename [
2c680 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20  file join \..   
2c690 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 53             [getS
2c6a0 51 4c 69 74 65 54 65 73 74 44 61 74 61 50 61 74  QLiteTestDataPat
2c6b0 68 5d 20 55 6e 69 6e 73 74 61 6c 6c 65 72 5f 54  h] Uninstaller_T
2c6c0 65 73 74 5f 56 73 32 30 31 35 2e 6c 6f 67 5d 5d  est_Vs2015.log]]
2c6d0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65  ....          se
2c6e0 74 20 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56  t testUninstallV
2c6f0 73 32 30 31 37 4c 6f 67 46 69 6c 65 20 5b 66 69  s2017LogFile [fi
2c700 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66  le nativename [f
2c710 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20  ile join \..    
2c720 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 53 51            [getSQ
2c730 4c 69 74 65 54 65 73 74 44 61 74 61 50 61 74 68  LiteTestDataPath
2c740 5d 20 55 6e 69 6e 73 74 61 6c 6c 65 72 5f 54 65  ] Uninstaller_Te
2c750 73 74 5f 56 73 32 30 31 37 2e 6c 6f 67 5d 5d 0d  st_Vs2017.log]].
2c760 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23 23 23  ...          ###
2c770 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2c780 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2c790 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2c7a0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2c7b0 23 23 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  ##....          
2c7c0 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
2c7d0 73 20 3a 3a 6e 6f 28 63 68 65 63 6b 46 6f 72 53  s ::no(checkForS
2c7e0 71 6c 69 74 65 46 69 6c 65 73 29 5d 7d 20 74 68  qliteFiles)]} th
2c7f0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
2c800 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73    if {![haveCons
2c810 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
2c820 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20  gs file_ \..    
2c830 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c              [fil
2c840 65 20 74 61 69 6c 20 24 65 6e 74 69 74 79 46 72  e tail $entityFr
2c850 61 6d 65 77 6f 72 6b 44 6c 6c 46 69 6c 65 5d 5d  ameworkDllFile]]
2c860 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
2c870 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f           checkFo
2c880 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e  rFile $test_chan
2c890 6e 65 6c 20 24 65 6e 74 69 74 79 46 72 61 6d 65  nel $entityFrame
2c8a0 77 6f 72 6b 44 6c 6c 46 69 6c 65 0d 0a 20 20 20  workDllFile..   
2c8b0 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
2c8c0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
2c8d0 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b  haveConstraint [
2c8e0 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f  appendArgs file_
2c8f0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
2c900 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24      [file tail $
2c910 69 6e 73 74 61 6c 6c 65 72 45 78 65 46 69 6c 65  installerExeFile
2c920 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ]]]} then {..   
2c930 20 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b             check
2c940 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68  ForFile $test_ch
2c950 61 6e 6e 65 6c 20 24 69 6e 73 74 61 6c 6c 65 72  annel $installer
2c960 45 78 65 46 69 6c 65 20 49 6e 73 74 61 6c 6c 65  ExeFile Installe
2c970 72 2e 65 78 65 0d 0a 20 20 20 20 20 20 20 20 20  r.exe..         
2c980 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
2c990 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f      if {![haveCo
2c9a0 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64  nstraint [append
2c9b0 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20  Args file_ \..  
2c9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 66                [f
2c9d0 69 6c 65 20 74 61 69 6c 20 24 73 71 6c 69 74 65  ile tail $sqlite
2c9e0 44 65 73 69 67 6e 65 72 44 6c 6c 46 69 6c 65 5d  DesignerDllFile]
2c9f0 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  ]]} then {..    
2ca00 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 46            checkF
2ca10 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61  orFile $test_cha
2ca20 6e 6e 65 6c 20 24 73 71 6c 69 74 65 44 65 73 69  nnel $sqliteDesi
2ca30 67 6e 65 72 44 6c 6c 46 69 6c 65 0d 0a 20 20 20  gnerDllFile..   
2ca40 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
2ca50 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
2ca60 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b  haveConstraint [
2ca70 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f  appendArgs file_
2ca80 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
2ca90 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24      [file tail $
2caa0 73 79 73 74 65 6d 44 61 74 61 53 51 4c 69 74 65  systemDataSQLite
2cab0 44 6c 6c 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e  DllFile]]]} then
2cac0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
2cad0 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24    checkForFile $
2cae0 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 73 79  test_channel $sy
2caf0 73 74 65 6d 44 61 74 61 53 51 4c 69 74 65 44 6c  stemDataSQLiteDl
2cb00 6c 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 20  lFile..         
2cb10 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
2cb20 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f      if {![haveCo
2cb30 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64  nstraint [append
2cb40 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20  Args file_ \..  
2cb50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 66                [f
2cb60 69 6c 65 20 74 61 69 6c 20 24 73 79 73 74 65 6d  ile tail $system
2cb70 44 61 74 61 53 51 4c 69 74 65 4c 69 6e 71 44 6c  DataSQLiteLinqDl
2cb80 6c 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b  lFile]]]} then {
2cb90 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2cba0 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65  checkForFile $te
2cbb0 73 74 5f 63 68 61 6e 6e 65 6c 20 24 73 79 73 74  st_channel $syst
2cbc0 65 6d 44 61 74 61 53 51 4c 69 74 65 4c 69 6e 71  emDataSQLiteLinq
2cbd0 44 6c 6c 46 69 6c 65 0d 0a 20 20 20 20 20 20 20  DllFile..       
2cbe0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
2cbf0 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65        if {![have
2cc00 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65  Constraint [appe
2cc10 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a  ndArgs file_ \..
2cc20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cc30 5b 66 69 6c 65 20 74 61 69 6c 20 24 73 79 73 74  [file tail $syst
2cc40 65 6d 44 61 74 61 53 51 4c 69 74 65 45 66 36 44  emDataSQLiteEf6D
2cc50 6c 6c 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20  llFile]]]} then 
2cc60 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
2cc70 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74   checkForFile $t
2cc80 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 73 79 73  est_channel $sys
2cc90 74 65 6d 44 61 74 61 53 51 4c 69 74 65 45 66 36  temDataSQLiteEf6
2cca0 44 6c 6c 46 69 6c 65 0d 0a 20 20 20 20 20 20 20  DllFile..       
2ccb0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
2ccc0 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65        if {![have
2ccd0 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65  Constraint [appe
2cce0 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a  ndArgs file_ \..
2ccf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cd00 5b 66 69 6c 65 20 74 61 69 6c 20 24 74 65 73 74  [file tail $test
2cd10 45 78 65 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e  ExeFile]]]} then
2cd20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
2cd30 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24    checkForFile $
2cd40 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65  test_channel $te
2cd50 73 74 45 78 65 46 69 6c 65 20 74 65 73 74 2e 65  stExeFile test.e
2cd60 78 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  xe..            
2cd70 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
2cd80 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74   if {![haveConst
2cd90 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67  raint [appendArg
2cda0 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20  s file_ \..     
2cdb0 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65             [file
2cdc0 20 74 61 69 6c 20 24 74 65 73 74 4c 69 6e 71 45   tail $testLinqE
2cdd0 78 65 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20  xeFile]]]} then 
2cde0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
2cdf0 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74   checkForFile $t
2ce00 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73  est_channel $tes
2ce10 74 4c 69 6e 71 45 78 65 46 69 6c 65 20 74 65 73  tLinqExeFile tes
2ce20 74 6c 69 6e 71 2e 65 78 65 0d 0a 20 20 20 20 20  tlinq.exe..     
2ce30 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
2ce40 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61          if {![ha
2ce50 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70  veConstraint [ap
2ce60 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c  pendArgs file_ \
2ce70 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2ce80 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 74 65    [file tail $te
2ce90 73 74 45 66 36 45 78 65 46 69 6c 65 5d 5d 5d 7d  stEf6ExeFile]]]}
2cea0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
2ceb0 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46         checkForF
2cec0 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65  ile $test_channe
2ced0 6c 20 24 74 65 73 74 45 66 36 45 78 65 46 69 6c  l $testEf6ExeFil
2cee0 65 20 74 65 73 74 65 66 36 2e 65 78 65 0d 0a 20  e testef6.exe.. 
2cef0 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
2cf00 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
2cf10 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74  ![haveConstraint
2cf20 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c   [appendArgs fil
2cf30 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  e_ \..          
2cf40 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c        [file tail
2cf50 20 24 74 65 73 74 4c 69 6e 71 4f 75 74 46 69 6c   $testLinqOutFil
2cf60 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  e]]]} then {..  
2cf70 20 20 20 20 20 20 20 20 20 20 20 20 63 68 65 63              chec
2cf80 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63  kForFile $test_c
2cf90 68 61 6e 6e 65 6c 20 24 74 65 73 74 4c 69 6e 71  hannel $testLinq
2cfa0 4f 75 74 46 69 6c 65 0d 0a 20 20 20 20 20 20 20  OutFile..       
2cfb0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
2cfc0 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65        if {![have
2cfd0 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65  Constraint [appe
2cfe0 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a  ndArgs file_ \..
2cff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d000 5b 66 69 6c 65 20 74 61 69 6c 20 24 6e 6f 72 74  [file tail $nort
2d010 68 77 69 6e 64 45 66 44 62 46 69 6c 65 5d 5d 5d  hwindEfDbFile]]]
2d020 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
2d030 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72          checkFor
2d040 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e  File $test_chann
2d050 65 6c 20 24 6e 6f 72 74 68 77 69 6e 64 45 66 44  el $northwindEfD
2d060 62 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 20  bFile..         
2d070 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
2d080 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f      if {![haveCo
2d090 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64  nstraint [append
2d0a0 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20  Args file_ \..  
2d0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 66                [f
2d0c0 69 6c 65 20 74 61 69 6c 20 24 6e 6f 6e 57 61 6c  ile tail $nonWal
2d0d0 44 62 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20  DbFile]]]} then 
2d0e0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
2d0f0 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74   checkForFile $t
2d100 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 6e 6f 6e  est_channel $non
2d110 57 61 6c 44 62 46 69 6c 65 0d 0a 20 20 20 20 20  WalDbFile..     
2d120 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
2d130 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61          if {![ha
2d140 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70  veConstraint [ap
2d150 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c  pendArgs file_ \
2d160 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2d170 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 77 61    [file tail $wa
2d180 6c 44 62 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e  lDbFile]]]} then
2d190 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
2d1a0 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24    checkForFile $
2d1b0 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 77 61  test_channel $wa
2d1c0 6c 44 62 46 69 6c 65 0d 0a 20 20 20 20 20 20 20  lDbFile..       
2d1d0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
2d1e0 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65        if {![have
2d1f0 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65  Constraint [appe
2d200 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a  ndArgs file_ \..
2d210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d220 5b 66 69 6c 65 20 74 61 69 6c 20 24 74 65 73 74  [file tail $test
2d230 49 6e 73 74 61 6c 6c 56 73 32 30 30 35 4c 6f 67  InstallVs2005Log
2d240 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d  File]]]} then {.
2d250 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  .              c
2d260 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73  heckForFile $tes
2d270 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73 74 49  t_channel $testI
2d280 6e 73 74 61 6c 6c 56 73 32 30 30 35 4c 6f 67 46  nstallVs2005LogF
2d290 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ile..           
2d2a0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
2d2b0 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73    if {![haveCons
2d2c0 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
2d2d0 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20  gs file_ \..    
2d2e0 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c              [fil
2d2f0 65 20 74 61 69 6c 20 24 74 65 73 74 49 6e 73 74  e tail $testInst
2d300 61 6c 6c 56 73 32 30 30 38 4c 6f 67 46 69 6c 65  allVs2008LogFile
2d310 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ]]]} then {..   
2d320 20 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b             check
2d330 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68  ForFile $test_ch
2d340 61 6e 6e 65 6c 20 24 74 65 73 74 49 6e 73 74 61  annel $testInsta
2d350 6c 6c 56 73 32 30 30 38 4c 6f 67 46 69 6c 65 0d  llVs2008LogFile.
2d360 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
2d370 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
2d380 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69   {![haveConstrai
2d390 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66  nt [appendArgs f
2d3a0 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20  ile_ \..        
2d3b0 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61          [file ta
2d3c0 69 6c 20 24 74 65 73 74 49 6e 73 74 61 6c 6c 56  il $testInstallV
2d3d0 73 32 30 31 30 4c 6f 67 46 69 6c 65 5d 5d 5d 7d  s2010LogFile]]]}
2d3e0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
2d3f0 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46         checkForF
2d400 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65  ile $test_channe
2d410 6c 20 24 74 65 73 74 49 6e 73 74 61 6c 6c 56 73  l $testInstallVs
2d420 32 30 31 30 4c 6f 67 46 69 6c 65 0d 0a 20 20 20  2010LogFile..   
2d430 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
2d440 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
2d450 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b  haveConstraint [
2d460 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f  appendArgs file_
2d470 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
2d480 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24      [file tail $
2d490 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 31  testInstallVs201
2d4a0 32 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74 68 65  2LogFile]]]} the
2d4b0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
2d4c0 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20     checkForFile 
2d4d0 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74  $test_channel $t
2d4e0 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 31 32  estInstallVs2012
2d4f0 4c 6f 67 46 69 6c 65 0d 0a 20 20 20 20 20 20 20  LogFile..       
2d500 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
2d510 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65        if {![have
2d520 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65  Constraint [appe
2d530 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a  ndArgs file_ \..
2d540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d550 5b 66 69 6c 65 20 74 61 69 6c 20 24 74 65 73 74  [file tail $test
2d560 49 6e 73 74 61 6c 6c 56 73 32 30 31 33 4c 6f 67  InstallVs2013Log
2d570 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d  File]]]} then {.
2d580 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  .              c
2d590 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73  heckForFile $tes
2d5a0 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73 74 49  t_channel $testI
2d5b0 6e 73 74 61 6c 6c 56 73 32 30 31 33 4c 6f 67 46  nstallVs2013LogF
2d5c0 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ile..           
2d5d0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
2d5e0 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73    if {![haveCons
2d5f0 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
2d600 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20  gs file_ \..    
2d610 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c              [fil
2d620 65 20 74 61 69 6c 20 24 74 65 73 74 49 6e 73 74  e tail $testInst
2d630 61 6c 6c 56 73 32 30 31 35 4c 6f 67 46 69 6c 65  allVs2015LogFile
2d640 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ]]]} then {..   
2d650 20 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b             check
2d660 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68  ForFile $test_ch
2d670 61 6e 6e 65 6c 20 24 74 65 73 74 49 6e 73 74 61  annel $testInsta
2d680 6c 6c 56 73 32 30 31 35 4c 6f 67 46 69 6c 65 0d  llVs2015LogFile.
2d690 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
2d6a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
2d6b0 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69   {![haveConstrai
2d6c0 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66  nt [appendArgs f
2d6d0 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20  ile_ \..        
2d6e0 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61          [file ta
2d6f0 69 6c 20 24 74 65 73 74 49 6e 73 74 61 6c 6c 56  il $testInstallV
2d700 73 32 30 31 37 4c 6f 67 46 69 6c 65 5d 5d 5d 7d  s2017LogFile]]]}
2d710 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
2d720 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46         checkForF
2d730 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65  ile $test_channe
2d740 6c 20 24 74 65 73 74 49 6e 73 74 61 6c 6c 56 73  l $testInstallVs
2d750 32 30 31 37 4c 6f 67 46 69 6c 65 0d 0a 20 20 20  2017LogFile..   
2d760 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
2d770 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
2d780 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b  haveConstraint [
2d790 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f  appendArgs file_
2d7a0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
2d7b0 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24      [file tail $
2d7c0 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32  testUninstallVs2
2d7d0 30 30 35 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74  005LogFile]]]} t
2d7e0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
2d7f0 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c       checkForFil
2d800 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  e $test_channel 
2d810 24 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73  $testUninstallVs
2d820 32 30 30 35 4c 6f 67 46 69 6c 65 0d 0a 20 20 20  2005LogFile..   
2d830 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
2d840 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
2d850 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b  haveConstraint [
2d860 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f  appendArgs file_
2d870 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
2d880 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24      [file tail $
2d890 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32  testUninstallVs2
2d8a0 30 30 38 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74  008LogFile]]]} t
2d8b0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
2d8c0 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c       checkForFil
2d8d0 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  e $test_channel 
2d8e0 24 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73  $testUninstallVs
2d8f0 32 30 30 38 4c 6f 67 46 69 6c 65 0d 0a 20 20 20  2008LogFile..   
2d900 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
2d910 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
2d920 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b  haveConstraint [
2d930 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f  appendArgs file_
2d940 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
2d950 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24      [file tail $
2d960 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32  testUninstallVs2
2d970 30 31 30 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74  010LogFile]]]} t
2d980 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
2d990 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c       checkForFil
2d9a0 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  e $test_channel 
2d9b0 24 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73  $testUninstallVs
2d9c0 32 30 31 30 4c 6f 67 46 69 6c 65 0d 0a 20 20 20  2010LogFile..   
2d9d0 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
2d9e0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
2d9f0 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b  haveConstraint [
2da00 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f  appendArgs file_
2da10 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
2da20 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24      [file tail $
2da30 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32  testUninstallVs2
2da40 30 31 32 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74  012LogFile]]]} t
2da50 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
2da60 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c       checkForFil
2da70 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  e $test_channel 
2da80 24 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73  $testUninstallVs
2da90 32 30 31 32 4c 6f 67 46 69 6c 65 0d 0a 20 20 20  2012LogFile..   
2daa0 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
2dab0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
2dac0 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b  haveConstraint [
2dad0 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f  appendArgs file_
2dae0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
2daf0 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24      [file tail $
2db00 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32  testUninstallVs2
2db10 30 31 33 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74  013LogFile]]]} t
2db20 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
2db30 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c       checkForFil
2db40 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  e $test_channel 
2db50 24 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73  $testUninstallVs
2db60 32 30 31 33 4c 6f 67 46 69 6c 65 0d 0a 20 20 20  2013LogFile..   
2db70 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
2db80 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
2db90 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b  haveConstraint [
2dba0 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f  appendArgs file_
2dbb0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
2dbc0 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24      [file tail $
2dbd0 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32  testUninstallVs2
2dbe0 30 31 35 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74  015LogFile]]]} t
2dbf0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
2dc00 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c       checkForFil
2dc10 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  e $test_channel 
2dc20 24 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73  $testUninstallVs
2dc30 32 30 31 35 4c 6f 67 46 69 6c 65 0d 0a 20 20 20  2015LogFile..   
2dc40 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
2dc50 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
2dc60 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b  haveConstraint [
2dc70 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f  appendArgs file_
2dc80 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
2dc90 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24      [file tail $
2dca0 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32  testUninstallVs2
2dcb0 30 31 37 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74  017LogFile]]]} t
2dcc0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
2dcd0 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c       checkForFil
2dce0 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  e $test_channel 
2dcf0 24 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73  $testUninstallVs
2dd00 32 30 31 37 4c 6f 67 46 69 6c 65 0d 0a 20 20 20  2017LogFile..   
2dd10 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
2dd20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
2dd30 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20   }..      }..   
2dd40 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
2dd50 72 75 6e 53 51 4c 69 74 65 54 65 73 74 46 69 6c  runSQLiteTestFil
2dd60 65 73 45 70 69 6c 6f 67 75 65 20 7b 7d 20 7b 0d  esEpilogue {} {.
2dd70 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
2dd80 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20 72 75 6e  # NOTE: Skip run
2dd90 6e 69 6e 67 20 6f 75 72 20 63 75 73 74 6f 6d 20  ning our custom 
2dda0 66 69 6c 65 73 20 65 70 69 6c 6f 67 75 65 20 69  files epilogue i
2ddb0 66 20 74 68 65 20 6d 61 69 6e 20 6f 6e 65 20 68  f the main one h
2ddc0 61 73 20 62 65 65 6e 0d 0a 20 20 20 20 20 20 23  as been..      #
2ddd0 20 20 20 20 20 20 20 73 6b 69 70 70 65 64 2e 0d         skipped..
2dde0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
2ddf0 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
2de00 73 20 3a 3a 6e 6f 28 65 70 69 6c 6f 67 75 65 2e  s ::no(epilogue.
2de10 65 61 67 6c 65 29 5d 7d 20 74 68 65 6e 20 7b 0d  eagle)]} then {.
2de20 0a 20 20 20 20 20 20 20 20 75 70 6c 65 76 65 6c  .        uplevel
2de30 20 31 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20   1 {..          
2de40 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69  unset -nocomplai
2de50 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n \..           
2de60 20 20 20 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c     testUninstall
2de70 56 73 32 30 31 37 4c 6f 67 46 69 6c 65 20 74 65  Vs2017LogFile te
2de80 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31  stUninstallVs201
2de90 35 4c 6f 67 46 69 6c 65 20 5c 0d 0a 20 20 20 20  5LogFile \..    
2dea0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 55 6e            testUn
2deb0 69 6e 73 74 61 6c 6c 56 73 32 30 31 33 4c 6f 67  installVs2013Log
2dec0 46 69 6c 65 20 74 65 73 74 55 6e 69 6e 73 74 61  File testUninsta
2ded0 6c 6c 56 73 32 30 31 32 4c 6f 67 46 69 6c 65 20  llVs2012LogFile 
2dee0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
2def0 20 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73   testUninstallVs
2df00 32 30 31 30 4c 6f 67 46 69 6c 65 20 74 65 73 74  2010LogFile test
2df10 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 30 38 4c  UninstallVs2008L
2df20 6f 67 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20  ogFile \..      
2df30 20 20 20 20 20 20 20 20 74 65 73 74 55 6e 69 6e          testUnin
2df40 73 74 61 6c 6c 56 73 32 30 30 35 4c 6f 67 46 69  stallVs2005LogFi
2df50 6c 65 20 74 65 73 74 49 6e 73 74 61 6c 6c 56 73  le testInstallVs
2df60 32 30 31 37 4c 6f 67 46 69 6c 65 20 5c 0d 0a 20  2017LogFile \.. 
2df70 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73               tes
2df80 74 49 6e 73 74 61 6c 6c 56 73 32 30 31 35 4c 6f  tInstallVs2015Lo
2df90 67 46 69 6c 65 20 74 65 73 74 49 6e 73 74 61 6c  gFile testInstal
2dfa0 6c 56 73 32 30 31 33 4c 6f 67 46 69 6c 65 20 5c  lVs2013LogFile \
2dfb0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2dfc0 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 31  testInstallVs201
2dfd0 32 4c 6f 67 46 69 6c 65 20 74 65 73 74 49 6e 73  2LogFile testIns
2dfe0 74 61 6c 6c 56 73 32 30 31 30 4c 6f 67 46 69 6c  tallVs2010LogFil
2dff0 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
2e000 20 20 20 74 65 73 74 49 6e 73 74 61 6c 6c 56 73     testInstallVs
2e010 32 30 30 38 4c 6f 67 46 69 6c 65 20 74 65 73 74  2008LogFile test
2e020 49 6e 73 74 61 6c 6c 56 73 32 30 30 35 4c 6f 67  InstallVs2005Log
2e030 46 69 6c 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20  File....        
2e040 20 20 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c    unset -nocompl
2e050 61 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ain \..         
2e060 20 20 20 20 20 6e 6f 72 74 68 77 69 6e 64 45 66       northwindEf
2e070 44 62 46 69 6c 65 20 74 65 73 74 4c 69 6e 71 4f  DbFile testLinqO
2e080 75 74 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20  utFile \..      
2e090 20 20 20 20 20 20 20 20 77 61 6c 44 62 46 69 6c          walDbFil
2e0a0 65 20 6e 6f 6e 57 61 6c 44 62 46 69 6c 65 0d 0a  e nonWalDbFile..
2e0b0 0d 0a 20 20 20 20 20 20 20 20 20 20 75 6e 73 65  ..          unse
2e0c0 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 5c 0d  t -nocomplain \.
2e0d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  .              t
2e0e0 65 73 74 45 66 36 45 78 65 46 69 6c 65 20 74 65  estEf6ExeFile te
2e0f0 73 74 4c 69 6e 71 45 78 65 46 69 6c 65 20 5c 0d  stLinqExeFile \.
2e100 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  .              t
2e110 65 73 74 45 78 65 46 69 6c 65 20 73 79 73 74 65  estExeFile syste
2e120 6d 44 61 74 61 53 51 4c 69 74 65 45 66 36 44 6c  mDataSQLiteEf6Dl
2e130 6c 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20  lFile \..       
2e140 20 20 20 20 20 20 20 73 79 73 74 65 6d 44 61 74         systemDat
2e150 61 53 51 4c 69 74 65 4c 69 6e 71 44 6c 6c 46 69  aSQLiteLinqDllFi
2e160 6c 65 20 73 79 73 74 65 6d 44 61 74 61 53 51 4c  le systemDataSQL
2e170 69 74 65 44 6c 6c 46 69 6c 65 20 5c 0d 0a 20 20  iteDllFile \..  
2e180 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
2e190 74 65 44 65 73 69 67 6e 65 72 44 6c 6c 46 69 6c  teDesignerDllFil
2e1a0 65 20 69 6e 73 74 61 6c 6c 65 72 45 78 65 46 69  e installerExeFi
2e1b0 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  le \..          
2e1c0 20 20 20 20 65 6e 74 69 74 79 46 72 61 6d 65 77      entityFramew
2e1d0 6f 72 6b 44 6c 6c 46 69 6c 65 0d 0a 20 20 20 20  orkDllFile..    
2e1e0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
2e1f0 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
2e200 6f 63 20 72 75 6e 53 51 4c 69 74 65 54 65 73 74  oc runSQLiteTest
2e210 45 70 69 6c 6f 67 75 65 20 7b 7d 20 7b 0d 0a 20  Epilogue {} {.. 
2e220 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
2e230 4e 4f 54 45 3a 20 53 6b 69 70 20 72 75 6e 6e 69  NOTE: Skip runni
2e240 6e 67 20 6f 75 72 20 63 75 73 74 6f 6d 20 65 70  ng our custom ep
2e250 69 6c 6f 67 75 65 20 69 66 20 74 68 65 20 6d 61  ilogue if the ma
2e260 69 6e 20 6f 6e 65 20 68 61 73 20 62 65 65 6e 0d  in one has been.
2e270 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73  .      #       s
2e280 6b 69 70 70 65 64 2e 0d 0a 20 20 20 20 20 20 23  kipped...      #
2e290 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e  ..      if {![in
2e2a0 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 65  fo exists ::no(e
2e2b0 70 69 6c 6f 67 75 65 2e 65 61 67 6c 65 29 5d 7d  pilogue.eagle)]}
2e2c0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
2e2d0 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
2e2e0 54 45 3a 20 53 68 6f 77 20 77 68 65 6e 20 6f 75  TE: Show when ou
2e2f0 72 20 74 65 73 74 73 20 61 63 74 75 61 6c 6c 79  r tests actually
2e300 20 65 6e 64 65 64 20 28 6e 6f 77 29 2e 0d 0a 20   ended (now)... 
2e310 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
2e320 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
2e330 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
2e340 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
2e350 20 20 20 22 2d 2d 2d 2d 20 53 79 73 74 65 6d 2e     "---- System.
2e360 44 61 74 61 2e 53 51 4c 69 74 65 20 74 65 73 74  Data.SQLite test
2e370 73 20 65 6e 64 65 64 20 61 74 20 22 20 5c 0d 0a  s ended at " \..
2e380 20 20 20 20 20 20 20 20 20 20 20 20 5b 63 6c 6f              [clo
2e390 63 6b 20 66 6f 72 6d 61 74 20 5b 63 6c 6f 63 6b  ck format [clock
2e3a0 20 73 65 63 6f 6e 64 73 5d 5d 20 5c 6e 5d 0d 0a   seconds]] \n]..
2e3b0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
2e3c0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4c 6f 61       # NOTE: Loa
2e3d0 64 20 74 68 65 20 22 65 70 69 6c 6f 67 75 65 22  d the "epilogue"
2e3e0 20 63 75 73 74 6f 6d 20 70 65 72 2d 75 73 65 72   custom per-user
2e3f0 20 61 6e 64 2f 6f 72 20 70 65 72 2d 68 6f 73 74   and/or per-host
2e400 20 74 65 73 74 0d 0a 20 20 20 20 20 20 20 20 23   test..        #
2e410 20 20 20 20 20 20 20 73 65 74 74 69 6e 67 73 20         settings 
2e420 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  now...        #.
2e430 0a 20 20 20 20 20 20 20 20 75 70 6c 65 76 65 6c  .        uplevel
2e440 20 31 20 5b 6c 69 73 74 20 6c 6f 61 64 53 51 4c   1 [list loadSQL
2e450 69 74 65 54 65 73 74 53 65 74 74 69 6e 67 73 20  iteTestSettings 
2e460 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
2e470 2e 65 70 69 6c 6f 67 75 65 5d 0d 0a 0d 0a 20 20  .epilogue]....  
2e480 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
2e490 20 23 20 42 55 47 46 49 58 3a 20 42 65 66 6f 72   # BUGFIX: Befor
2e4a0 65 20 63 68 65 63 6b 69 6e 67 20 74 68 65 20 66  e checking the f
2e4b0 69 6e 61 6c 20 72 65 73 6f 75 72 63 65 73 20 69  inal resources i
2e4c0 6e 20 75 73 65 20 62 79 20 53 51 4c 69 74 65 2c  n use by SQLite,
2e4d0 20 6d 61 6b 65 0d 0a 20 20 20 20 20 20 20 20 23   make..        #
2e4e0 20 20 20 20 20 20 20 20 20 73 75 72 65 20 62 6f           sure bo
2e4f0 74 68 20 6f 66 20 74 68 65 20 50 52 41 47 4d 41  th of the PRAGMA
2e500 20 72 65 6c 61 74 65 64 20 64 69 72 65 63 74 6f   related directo
2e510 72 79 20 6e 61 6d 65 73 20 61 72 65 20 66 72 65  ry names are fre
2e520 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ed...        #..
2e530 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72          checkFor
2e540 53 51 4c 69 74 65 44 69 72 65 63 74 6f 72 69 65  SQLiteDirectorie
2e550 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
2e560 6c 20 74 72 75 65 0d 0a 0d 0a 20 20 20 20 20 20  l true....      
2e570 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
2e580 4f 54 45 3a 20 41 6c 73 6f 20 72 65 70 6f 72 74  OTE: Also report
2e590 20 74 68 65 20 72 65 73 6f 75 72 63 65 20 75 73   the resource us
2e5a0 61 67 65 20 61 66 74 65 72 20 72 75 6e 6e 69 6e  age after runnin
2e5b0 67 20 74 68 65 20 74 65 73 74 73 2e 0d 0a 20 20  g the tests...  
2e5c0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
2e5d0 20 72 65 70 6f 72 74 53 51 4c 69 74 65 52 65 73   reportSQLiteRes
2e5e0 6f 75 72 63 65 73 20 24 3a 3a 74 65 73 74 5f 63  ources $::test_c
2e5f0 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20 20  hannel....      
2e600 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
2e610 4f 54 45 3a 20 52 65 70 6f 72 74 20 74 68 65 20  OTE: Report the 
2e620 63 72 69 74 69 63 61 6c 20 68 61 6e 64 6c 65 20  critical handle 
2e630 63 6f 75 6e 74 73 20 61 66 74 65 72 20 72 75 6e  counts after run
2e640 6e 69 6e 67 20 74 68 65 20 74 65 73 74 73 2e 0d  ning the tests..
2e650 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
2e660 20 20 20 20 67 65 74 53 51 4c 69 74 65 48 61 6e      getSQLiteHan
2e670 64 6c 65 43 6f 75 6e 74 73 20 24 3a 3a 74 65 73  dleCounts $::tes
2e680 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20  t_channel....   
2e690 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
2e6a0 23 20 4e 4f 54 45 3a 20 49 66 20 6e 65 63 65 73  # NOTE: If neces
2e6b0 73 61 72 79 2c 20 64 69 73 61 62 6c 65 20 73 68  sary, disable sh
2e6c0 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 20  ared-cache mode 
2e6d0 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  now...        #.
2e6e0 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 68 61  .        if {[ha
2e6f0 73 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 73  sRuntimeOption s
2e700 68 61 72 65 64 43 61 63 68 65 5d 7d 20 74 68 65  haredCache]} the
2e710 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 65  n {..          e
2e720 6e 61 62 6c 65 53 68 61 72 65 64 43 61 63 68 65  nableSharedCache
2e730 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
2e740 20 66 61 6c 73 65 0d 0a 20 20 20 20 20 20 20 20   false..        
2e750 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  }..      }..    
2e760 7d 0d 0a 0c 0d 0a 20 20 20 20 23 23 23 23 23 23  }.....    ######
2e770 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2e780 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2e790 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2e7a0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2e7b0 23 23 23 23 23 0d 0a 20 20 20 20 23 23 23 23 23  #####..    #####
2e7c0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2e7d0 23 23 23 23 23 23 23 23 20 45 4e 44 20 45 61 67  ######## END Eag
2e7e0 6c 65 20 4f 4e 4c 59 20 23 23 23 23 23 23 23 23  le ONLY ########
2e7f0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2e800 23 23 23 23 23 23 0d 0a 20 20 20 20 23 23 23 23  ######..    ####
2e810 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2e820 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2e830 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2e840 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2e850 23 23 23 23 23 23 23 0d 0a 20 20 7d 0d 0a 0d 0a  #######..  }....
2e860 20 20 23 0d 0a 20 20 23 20 4e 4f 54 45 3a 20 53    #..  # NOTE: S
2e870 61 76 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ave the name of 
2e880 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 63 6f  the directory co
2e890 6e 74 61 69 6e 69 6e 67 20 74 68 69 73 20 66 69  ntaining this fi
2e8a0 6c 65 2e 0d 0a 20 20 23 0d 0a 20 20 69 66 20 7b  le...  #..  if {
2e8b0 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 63 6f  ![info exists co
2e8c0 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79 5d 7d  mmon_directory]}
2e8d0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 73 65 74   then {..    set
2e8e0 20 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f 72   common_director
2e8f0 79 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20  y [file dirname 
2e900 5b 69 6e 66 6f 20 73 63 72 69 70 74 5d 5d 0d 0a  [info script]]..
2e910 20 20 7d 0d 0a 0d 0a 20 20 23 0d 0a 20 20 23 20    }....  #..  # 
2e920 4e 4f 54 45 3a 20 50 72 6f 76 69 64 65 20 74 68  NOTE: Provide th
2e930 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  e System.Data.SQ
2e940 4c 69 74 65 20 74 65 73 74 20 70 61 63 6b 61 67  Lite test packag
2e950 65 20 74 6f 20 74 68 65 20 69 6e 74 65 72 70 72  e to the interpr
2e960 65 74 65 72 2e 0d 0a 20 20 23 0d 0a 20 20 70 61  eter...  #..  pa
2e970 63 6b 61 67 65 20 70 72 6f 76 69 64 65 20 53 79  ckage provide Sy
2e980 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
2e990 2e 54 65 73 74 20 31 2e 30 0d 0a 7d 0d 0a        .Test 1.0..}..