System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact a52b6472edb07d08ccc82481d1fa0eb53d601f82:


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 72 65 73 65 74 45 78 63 65 70 74 69 6f 6e  c resetException
12970 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a   {} {..      #..
12980 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65        # NOTE: Re
12990 73 65 74 20 65 78 63 65 70 74 69 6f 6e 20 61 73  set exception as
129a0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
129b0 69 73 20 69 6e 74 65 72 70 72 65 74 65 72 20 28  is interpreter (
129c0 74 6f 20 6e 75 6c 6c 29 2e 0d 0a 20 20 20 20 20  to null)...     
129d0 20 23 20 20 20 20 20 20 20 54 68 69 73 20 28 70   #       This (p
129e0 72 69 76 61 74 65 29 20 70 72 6f 70 65 72 74 79  rivate) property
129f0 20 69 73 20 6d 61 69 6e 74 61 69 6e 65 64 20 6f   is maintained o
12a00 6e 20 61 20 70 65 72 2d 74 68 72 65 61 64 20 62  n a per-thread b
12a10 61 73 69 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  asis...      #..
12a20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76        object inv
12a30 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50  oke -flags +NonP
12a40 75 62 6c 69 63 20 49 6e 74 65 72 70 72 65 74 65  ublic Interprete
12a50 72 2e 47 65 74 41 63 74 69 76 65 20 45 78 63 65  r.GetActive Exce
12a60 70 74 69 6f 6e 20 6e 75 6c 6c 0d 0a 20 20 20 20  ption null..    
12a70 20 20 72 65 74 75 72 6e 20 22 22 0d 0a 20 20 20    return ""..   
12a80 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
12a90 63 61 74 63 68 41 6e 64 53 65 74 45 78 63 65 70  catchAndSetExcep
12aa0 74 69 6f 6e 20 7b 20 73 63 72 69 70 74 20 7b 76  tion { script {v
12ab0 61 72 4e 61 6d 65 20 22 22 7d 20 7d 20 7b 0d 0a  arName ""} } {..
12ac0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
12ad0 20 4e 4f 54 45 3a 20 45 76 61 6c 75 61 74 65 20   NOTE: Evaluate 
12ae0 74 68 65 20 73 63 72 69 70 74 20 70 72 6f 76 69  the script provi
12af0 64 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65  ded by our calle
12b00 72 20 69 6e 20 74 68 65 69 72 20 63 6f 6e 74 65  r in their conte
12b10 78 74 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  xt...      #..  
12b20 20 20 20 20 63 61 74 63 68 20 7b 75 70 6c 65 76      catch {uplev
12b30 65 6c 20 31 20 24 73 63 72 69 70 74 7d 0d 0a 0d  el 1 $script}...
12b40 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
12b50 23 20 4e 4f 54 45 3a 20 47 72 61 62 20 74 68 65  # NOTE: Grab the
12b60 20 28 70 72 69 76 61 74 65 29 20 65 78 63 65 70   (private) excep
12b70 74 69 6f 6e 20 70 72 6f 70 65 72 74 79 20 66 72  tion property fr
12b80 6f 6d 20 74 68 69 73 20 69 6e 74 65 72 70 72 65  om this interpre
12b90 74 65 72 2c 0d 0a 20 20 20 20 20 20 23 20 20 20  ter,..      #   
12ba0 20 20 20 20 66 6f 72 20 74 68 69 73 20 74 68 72      for this thr
12bb0 65 61 64 2c 20 61 6e 64 20 61 64 64 20 61 73 20  ead, and add as 
12bc0 61 6e 20 6f 70 61 71 75 65 20 6f 62 6a 65 63 74  an opaque object
12bd0 20 68 61 6e 64 6c 65 20 69 6e 20 74 68 65 0d 0a   handle in the..
12be0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f        #       co
12bf0 6e 74 65 78 74 20 6f 66 20 6f 75 72 20 63 61 6c  ntext of our cal
12c00 6c 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ler...      #.. 
12c10 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
12c20 20 6c 65 6e 67 74 68 20 24 76 61 72 4e 61 6d 65   length $varName
12c30 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
12c40 20 20 20 20 20 20 20 75 70 76 61 72 20 31 20 24         upvar 1 $
12c50 76 61 72 4e 61 6d 65 20 65 78 63 65 70 74 69 6f  varName exceptio
12c60 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  n..      }....  
12c70 20 20 20 20 73 65 74 20 65 78 63 65 70 74 69 6f      set exceptio
12c80 6e 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65  n [object invoke
12c90 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 2d 61   \..          -a
12ca0 6c 69 61 73 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e  lias -flags +Non
12cb0 50 75 62 6c 69 63 20 49 6e 74 65 72 70 72 65 74  Public Interpret
12cc0 65 72 2e 47 65 74 41 63 74 69 76 65 20 45 78 63  er.GetActive Exc
12cd0 65 70 74 69 6f 6e 5d 0d 0a 0d 0a 20 20 20 20 20  eption]....     
12ce0 20 72 65 74 75 72 6e 20 22 22 0d 0a 20 20 20 20   return ""..    
12cf0 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63  }.....    proc c
12d00 6f 6d 70 69 6c 65 43 53 68 61 72 70 57 69 74 68  ompileCSharpWith
12d10 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
12d20 74 65 78 74 20 6d 65 6d 6f 72 79 20 73 79 6d 62  text memory symb
12d30 6f 6c 73 20 73 74 72 69 63 74 20 72 65 73 75 6c  ols strict resul
12d40 74 73 56 61 72 4e 61 6d 65 20 65 72 72 6f 72 73  tsVarName errors
12d50 56 61 72 4e 61 6d 65 20 66 69 6c 65 4e 61 6d 65  VarName fileName
12d60 73 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  s..            a
12d70 72 67 73 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23  rgs } {..      #
12d80 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
12d90 53 69 6e 63 65 20 77 65 20 61 72 65 20 67 6f 69  Since we are goi
12da0 6e 67 20 74 6f 20 75 73 65 20 74 68 69 73 20 6d  ng to use this m
12db0 65 74 68 6f 64 20 6e 61 6d 65 20 61 20 6c 6f 74  ethod name a lot
12dc0 2c 20 61 73 73 69 67 6e 20 69 74 20 74 6f 20 61  , assign it to a
12dd0 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
12de0 76 61 72 69 61 62 6c 65 20 66 69 72 73 74 2e 0d  variable first..
12df0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
12e00 73 65 74 20 61 64 64 20 52 65 66 65 72 65 6e 63  set add Referenc
12e10 65 64 41 73 73 65 6d 62 6c 69 65 73 2e 41 64 64  edAssemblies.Add
12e20 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
12e30 20 20 20 23 20 4e 4f 54 45 3a 20 43 72 65 61 74     # NOTE: Creat
12e40 65 20 74 68 65 20 62 61 73 65 20 63 6f 6d 6d 61  e the base comma
12e50 6e 64 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61  nd to evaluate a
12e60 6e 64 20 61 64 64 20 74 68 65 20 70 72 6f 70 65  nd add the prope
12e70 72 74 79 20 73 65 74 74 69 6e 67 73 0d 0a 20 20  rty settings..  
12e80 20 20 20 20 23 20 20 20 20 20 20 20 74 68 61 74      #       that
12e90 20 61 72 65 20 61 6c 6d 6f 73 74 20 61 6c 77 61   are almost alwa
12ea0 79 73 20 6e 65 65 64 65 64 20 62 79 20 6f 75 72  ys needed by our
12eb0 20 75 6e 69 74 20 74 65 73 74 73 20 28 69 2e 65   unit tests (i.e
12ec0 2e 20 74 68 65 20 53 79 73 74 65 6d 0d 0a 20 20  . the System..  
12ed0 20 20 20 20 23 20 20 20 20 20 20 20 61 6e 64 20      #       and 
12ee0 53 79 73 74 65 6d 2e 44 61 74 61 20 61 73 73 65  System.Data asse
12ef0 6d 62 6c 79 20 72 65 66 65 72 65 6e 63 65 73 29  mbly references)
12f00 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
12f10 20 20 73 65 74 20 63 6f 6d 6d 61 6e 64 20 5b 6c    set command [l
12f20 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ist \..         
12f30 20 63 6f 6d 70 69 6c 65 43 53 68 61 72 70 20 24   compileCSharp $
12f40 74 65 78 74 20 24 6d 65 6d 6f 72 79 20 24 73 79  text $memory $sy
12f50 6d 62 6f 6c 73 20 24 73 74 72 69 63 74 20 72 65  mbols $strict re
12f60 73 75 6c 74 73 20 65 72 72 6f 72 73 20 5c 0d 0a  sults errors \..
12f70 20 20 20 20 20 20 20 20 20 20 24 61 64 64 20 53            $add S
12f80 79 73 74 65 6d 2e 64 6c 6c 20 24 61 64 64 20 53  ystem.dll $add S
12f90 79 73 74 65 6d 2e 44 61 74 61 2e 64 6c 6c 20 24  ystem.Data.dll $
12fa0 61 64 64 20 53 79 73 74 65 6d 2e 54 72 61 6e 73  add System.Trans
12fb0 61 63 74 69 6f 6e 73 2e 64 6c 6c 20 5c 0d 0a 20  actions.dll \.. 
12fc0 20 20 20 20 20 20 20 20 20 24 61 64 64 20 53 79           $add Sy
12fd0 73 74 65 6d 2e 58 6d 6c 2e 64 6c 6c 5d 0d 0a 0d  stem.Xml.dll]...
12fe0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
12ff0 23 20 4e 4f 54 45 3a 20 41 64 64 20 61 6c 6c 20  # NOTE: Add all 
13000 74 68 65 20 70 72 6f 76 69 64 65 64 20 66 69 6c  the provided fil
13010 65 20 6e 61 6d 65 73 20 61 73 20 61 73 73 65 6d  e names as assem
13020 62 6c 79 20 72 65 66 65 72 65 6e 63 65 73 2e 0d  bly references..
13030 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
13040 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65  foreach fileName
13050 20 24 66 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20   $fileNames {.. 
13060 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 63         lappend c
13070 6f 6d 6d 61 6e 64 20 24 61 64 64 20 5b 67 65 74  ommand $add [get
13080 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 24  BinaryFileName $
13090 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20 20 20  fileName]..     
130a0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   }....      #.. 
130b0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 64 64       # NOTE: Add
130c0 20 74 68 65 20 65 78 74 72 61 20 61 72 67 75 6d   the extra argum
130d0 65 6e 74 73 2c 20 69 66 20 61 6e 79 2c 20 74 6f  ents, if any, to
130e0 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20   the command to 
130f0 65 76 61 6c 75 61 74 65 2e 0d 0a 20 20 20 20 20  evaluate...     
13100 20 23 0d 0a 20 20 20 20 20 20 65 76 61 6c 20 6c   #..      eval l
13110 61 70 70 65 6e 64 20 63 6f 6d 6d 61 6e 64 20 24  append command $
13120 61 72 67 73 0d 0a 0d 0a 20 20 20 20 20 20 23 0d  args....      #.
13130 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41  .      # NOTE: A
13140 6c 69 61 73 20 74 68 65 20 63 6f 6d 70 69 6c 65  lias the compile
13150 72 20 6c 6f 63 61 6c 20 72 65 73 75 6c 74 73 20  r local results 
13160 61 6e 64 20 65 72 72 6f 72 73 20 76 61 72 69 61  and errors varia
13170 62 6c 65 73 20 74 6f 20 74 68 65 0d 0a 20 20 20  bles to the..   
13180 20 20 20 23 20 20 20 20 20 20 20 76 61 72 69 61     #       varia
13190 62 6c 65 20 6e 61 6d 65 73 20 70 72 6f 76 69 64  ble names provid
131a0 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72  ed by our caller
131b0 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
131c0 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
131d0 6e 67 74 68 20 24 72 65 73 75 6c 74 73 56 61 72  ngth $resultsVar
131e0 4e 61 6d 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20  Name] > 0} then 
131f0 7b 0d 0a 20 20 20 20 20 20 20 20 75 70 76 61 72  {..        upvar
13200 20 31 20 24 72 65 73 75 6c 74 73 56 61 72 4e 61   1 $resultsVarNa
13210 6d 65 20 72 65 73 75 6c 74 73 0d 0a 20 20 20 20  me results..    
13220 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20    }....      if 
13230 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
13240 24 65 72 72 6f 72 73 56 61 72 4e 61 6d 65 5d 20  $errorsVarName] 
13250 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
13260 20 20 20 20 20 75 70 76 61 72 20 31 20 24 65 72       upvar 1 $er
13270 72 6f 72 73 56 61 72 4e 61 6d 65 20 65 72 72 6f  rorsVarName erro
13280 72 73 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  rs..      }.... 
13290 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
132a0 4e 4f 54 45 3a 20 45 76 61 6c 75 61 74 65 20 74  NOTE: Evaluate t
132b0 68 65 20 63 6f 6e 73 74 72 75 63 74 65 64 20 5b  he constructed [
132c0 63 6f 6d 70 69 6c 65 43 53 68 61 72 70 5d 20 63  compileCSharp] c
132d0 6f 6d 6d 61 6e 64 20 61 6e 64 20 72 65 74 75 72  ommand and retur
132e0 6e 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20  n the..      #  
132f0 20 20 20 20 20 72 65 73 75 6c 74 2e 0d 0a 20 20       result...  
13300 20 20 20 20 23 0d 0a 20 20 20 20 20 20 65 76 61      #..      eva
13310 6c 20 24 63 6f 6d 6d 61 6e 64 0d 0a 20 20 20 20  l $command..    
13320 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 69  }.....    proc i
13330 73 4d 65 6d 6f 72 79 44 62 20 7b 20 66 69 6c 65  sMemoryDb { file
13340 4e 61 6d 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20  Name } {..      
13350 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
13360 20 49 73 20 74 68 65 20 73 70 65 63 69 66 69 65   Is the specifie
13370 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  d database file 
13380 6e 61 6d 65 20 72 65 61 6c 6c 79 20 61 6e 20 69  name really an i
13390 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
133a0 65 3f 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  e?..      #..   
133b0 20 20 20 72 65 74 75 72 6e 20 5b 65 78 70 72 20     return [expr 
133c0 7b 24 66 69 6c 65 4e 61 6d 65 20 65 71 20 22 3a  {$fileName eq ":
133d0 6d 65 6d 6f 72 79 3a 22 20 7c 7c 20 5c 0d 0a 20  memory:" || \.. 
133e0 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67           [string
133f0 20 72 61 6e 67 65 20 24 66 69 6c 65 4e 61 6d 65   range $fileName
13400 20 30 20 31 32 5d 20 65 71 20 22 66 69 6c 65 3a   0 12] eq "file:
13410 3a 6d 65 6d 6f 72 79 3a 22 7d 5d 0d 0a 20 20 20  :memory:"}]..   
13420 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
13430 69 73 54 61 62 6c 65 49 6e 44 62 20 7b 20 6e 61  isTableInDb { na
13440 6d 65 20 7b 76 61 72 4e 61 6d 65 20 64 62 7d 20  me {varName db} 
13450 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
13460 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 66 65      # NOTE: Refe
13470 72 20 74 6f 20 74 68 65 20 73 70 65 63 69 66 69  r to the specifi
13480 65 64 20 76 61 72 69 61 62 6c 65 20 28 65 2e 67  ed variable (e.g
13490 2e 20 22 64 62 22 29 20 69 6e 20 74 68 65 20 63  . "db") in the c
134a0 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72 0d 0a 20  ontext of our.. 
134b0 20 20 20 20 20 23 20 20 20 20 20 20 20 63 61 6c       #       cal
134c0 6c 65 72 2e 20 20 49 74 20 63 6f 6e 74 61 69 6e  ler.  It contain
134d0 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  s the database c
134e0 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65  onnection handle
134f0 20 74 68 61 74 20 77 69 6c 6c 20 62 65 0d 0a 20   that will be.. 
13500 20 20 20 20 20 23 20 20 20 20 20 20 20 75 73 65       #       use
13510 64 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65  d to execute the
13520 20 71 75 65 72 79 20 75 73 65 64 20 74 6f 20 64   query used to d
13530 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20  etermine if the 
13540 6e 61 6d 65 64 20 74 61 62 6c 65 20 69 73 0d 0a  named table is..
13550 20 20 20 20 20 20 23 20 20 20 20 20 20 20 70 72        #       pr
13560 65 73 65 6e 74 20 69 6e 20 74 68 61 74 20 64 61  esent in that da
13570 74 61 62 61 73 65 2e 0d 0a 20 20 20 20 20 20 23  tabase...      #
13580 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20 31 20  ..      upvar 1 
13590 24 76 61 72 4e 61 6d 65 20 64 62 0d 0a 0d 0a 20  $varName db.... 
135a0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
135b0 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20 73 71  NOTE: Use the sq
135c0 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
135d0 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69  e to determine i
135e0 66 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c  f the named tabl
135f0 65 20 69 73 0d 0a 20 20 20 20 20 20 23 20 20 20  e is..      #   
13600 20 20 20 20 70 72 65 73 65 6e 74 20 69 6e 20 74      present in t
13610 68 65 20 64 61 74 61 62 61 73 65 2e 0d 0a 20 20  he database...  
13620 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74      #..      set
13630 20 73 71 6c 20 7b 0d 0a 20 20 20 20 20 20 20 20   sql {..        
13640 53 45 4c 45 43 54 20 43 4f 55 4e 54 28 2a 29 20  SELECT COUNT(*) 
13650 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
13660 65 72 20 57 48 45 52 45 20 74 79 70 65 20 3d 20  er WHERE type = 
13670 27 74 61 62 6c 65 27 20 41 4e 44 20 6e 61 6d 65  'table' AND name
13680 20 3d 20 3f 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a   = ?;..      }..
13690 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
136a0 20 23 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e 20   # NOTE: Return 
136b0 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20  non-zero if the 
136c0 6e 61 6d 65 64 20 74 61 62 6c 65 20 69 73 20 70  named table is p
136d0 72 65 73 65 6e 74 2e 0d 0a 20 20 20 20 20 20 23  resent...      #
136e0 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b  ..      return [
136f0 65 78 70 72 20 7b 0d 0a 20 20 20 20 20 20 20 20  expr {..        
13700 5b 73 71 6c 20 65 78 65 63 75 74 65 20 2d 65 78  [sql execute -ex
13710 65 63 75 74 65 20 73 63 61 6c 61 72 20 24 64 62  ecute scalar $db
13720 20 24 73 71 6c 20 5b 6c 69 73 74 20 70 61 72 61   $sql [list para
13730 6d 31 20 53 74 72 69 6e 67 20 24 6e 61 6d 65 5d  m1 String $name]
13740 5d 20 3e 20 30 0d 0a 20 20 20 20 20 20 7d 5d 0d  ] > 0..      }].
13750 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
13760 72 6f 63 20 67 65 74 44 62 44 65 66 61 75 6c 74  roc getDbDefault
13770 50 61 67 65 53 69 7a 65 20 7b 7d 20 7b 0d 0a 20  PageSize {} {.. 
13780 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
13790 7b 65 78 65 63 75 74 65 53 71 6c 20 22 50 52 41  {executeSql "PRA
137a0 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 3b 22 20  GMA page_size;" 
137b0 73 63 61 6c 61 72 7d 20 72 65 73 75 6c 74 5d 20  scalar} result] 
137c0 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
137d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 72 65        return $re
137e0 73 75 6c 74 0d 0a 20 20 20 20 20 20 7d 20 65 6c  sult..      } el
137f0 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65  se {..        re
13800 74 75 72 6e 20 30 0d 0a 20 20 20 20 20 20 7d 0d  turn 0..      }.
13810 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
13820 72 6f 63 20 67 65 74 44 62 44 65 66 61 75 6c 74  roc getDbDefault
13830 43 61 63 68 65 53 69 7a 65 20 7b 7d 20 7b 0d 0a  CacheSize {} {..
13840 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
13850 20 7b 65 78 65 63 75 74 65 53 71 6c 20 22 50 52   {executeSql "PR
13860 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 3b  AGMA cache_size;
13870 22 20 73 63 61 6c 61 72 7d 20 72 65 73 75 6c 74  " scalar} result
13880 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
13890 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24          return $
138a0 72 65 73 75 6c 74 0d 0a 20 20 20 20 20 20 7d 20  result..      } 
138b0 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
138c0 72 65 74 75 72 6e 20 30 0d 0a 20 20 20 20 20 20  return 0..      
138d0 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
138e0 20 70 72 6f 63 20 75 73 65 4c 65 67 61 63 79 44   proc useLegacyD
138f0 62 50 61 67 65 41 6e 64 43 61 63 68 65 53 69 7a  bPageAndCacheSiz
13900 65 73 20 7b 20 76 61 72 4e 61 6d 65 20 7d 20 7b  es { varName } {
13910 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
13920 20 23 20 4e 4f 54 45 3a 20 52 65 66 65 72 20 74   # NOTE: Refer t
13930 6f 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  o the specified 
13940 76 61 72 69 61 62 6c 65 20 28 65 2e 67 2e 20 22  variable (e.g. "
13950 64 62 22 29 20 69 6e 20 74 68 65 20 63 6f 6e 74  db") in the cont
13960 65 78 74 20 6f 66 20 6f 75 72 0d 0a 20 20 20 20  ext of our..    
13970 20 20 23 20 20 20 20 20 20 20 63 61 6c 6c 65 72    #       caller
13980 2e 20 20 49 74 20 63 6f 6e 74 61 69 6e 73 20 74  .  It contains t
13990 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
139a0 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20 74 68  ection handle th
139b0 61 74 20 77 69 6c 6c 20 62 65 0d 0a 20 20 20 20  at will be..    
139c0 20 20 23 20 20 20 20 20 20 20 75 73 65 64 20 74    #       used t
139d0 6f 20 65 78 65 63 75 74 65 20 71 75 65 72 69 65  o execute querie
139e0 73 20 75 73 65 64 20 74 6f 20 73 65 74 20 74 68  s used to set th
139f0 65 20 70 61 67 65 20 61 6e 64 20 63 61 63 68 65  e page and cache
13a00 20 73 69 7a 65 73 2e 0d 0a 20 20 20 20 20 20 23   sizes...      #
13a10 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20 31 20  ..      upvar 1 
13a20 24 76 61 72 4e 61 6d 65 20 64 62 0d 0a 0d 0a 20  $varName db.... 
13a30 20 20 20 20 20 73 71 6c 20 65 78 65 63 75 74 65       sql execute
13a40 20 24 64 62 20 7b 0d 0a 20 20 20 20 20 20 20 20   $db {..        
13a50 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65  PRAGMA page_size
13a60 20 3d 20 31 30 32 34 3b 0d 0a 20 20 20 20 20 20   = 1024;..      
13a70 20 20 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73    PRAGMA cache_s
13a80 69 7a 65 20 3d 20 32 30 30 30 3b 0d 0a 20 20 20  ize = 2000;..   
13a90 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65     }....      re
13aa0 74 75 72 6e 20 5b 6c 69 73 74 20 5c 0d 0a 20 20  turn [list \..  
13ab0 20 20 20 20 20 20 20 20 5b 73 71 6c 20 65 78 65          [sql exe
13ac0 63 75 74 65 20 2d 65 78 65 63 75 74 65 20 73 63  cute -execute sc
13ad0 61 6c 61 72 20 24 64 62 20 22 50 52 41 47 4d 41  alar $db "PRAGMA
13ae0 20 70 61 67 65 5f 73 69 7a 65 3b 22 5d 20 5c 0d   page_size;"] \.
13af0 0a 20 20 20 20 20 20 20 20 20 20 5b 73 71 6c 20  .          [sql 
13b00 65 78 65 63 75 74 65 20 2d 65 78 65 63 75 74 65  execute -execute
13b10 20 73 63 61 6c 61 72 20 24 64 62 20 22 50 52 41   scalar $db "PRA
13b20 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 3b 22  GMA cache_size;"
13b30 5d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  ]]..    }.....  
13b40 20 20 70 72 6f 63 20 6e 6f 72 6d 61 6c 69 7a 65    proc normalize
13b50 45 78 63 65 70 74 69 6f 6e 4d 65 73 73 61 67 65  ExceptionMessage
13b60 20 7b 20 76 61 6c 75 65 20 7d 20 7b 0d 0a 20 20   { value } {..  
13b70 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
13b80 6c 65 6e 67 74 68 20 24 76 61 6c 75 65 5d 20 3d  length $value] =
13b90 3d 20 30 7d 20 74 68 65 6e 20 7b 72 65 74 75 72  = 0} then {retur
13ba0 6e 20 24 76 61 6c 75 65 7d 0d 0a 20 20 20 20 20  n $value}..     
13bb0 20 72 65 74 75 72 6e 20 5b 73 74 72 69 6e 67 20   return [string 
13bc0 6d 61 70 20 5b 6c 69 73 74 20 5c 72 5c 6e 20 22  map [list \r\n "
13bd0 20 3d 3d 3e 20 22 20 5c 6e 20 22 20 3d 3d 3e 20   ==> " \n " ==> 
13be0 22 5d 20 24 76 61 6c 75 65 5d 0d 0a 20 20 20 20  "] $value]..    
13bf0 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 65  }.....    proc e
13c00 78 74 72 61 63 74 53 79 73 74 65 6d 44 61 74 61  xtractSystemData
13c10 53 51 4c 69 74 65 45 78 63 65 70 74 69 6f 6e 4d  SQLiteExceptionM
13c20 65 73 73 61 67 65 20 7b 20 76 61 6c 75 65 20 7d  essage { value }
13c30 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
13c40 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 74 68     # NOTE: If th
13c50 65 20 73 74 72 69 6e 67 20 63 6f 6e 66 6f 72 6d  e string conform
13c60 73 20 74 6f 20 66 6f 72 6d 61 74 20 6f 66 20 74  s to format of t
13c70 68 65 20 6e 6f 72 6d 61 6c 20 65 78 63 65 70 74  he normal except
13c80 69 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ion..      #    
13c90 20 20 20 65 72 72 6f 72 20 73 74 72 69 6e 67 73     error strings
13ca0 2c 20 65 78 74 72 61 63 74 20 61 6e 64 20 72 65  , extract and re
13cb0 74 75 72 6e 20 6f 6e 6c 79 20 74 68 65 20 65 72  turn only the er
13cc0 72 6f 72 20 6d 65 73 73 61 67 65 0d 0a 20 20 20  ror message..   
13cd0 20 20 20 23 20 20 20 20 20 20 20 70 6f 72 74 69     #       porti
13ce0 6f 6e 20 69 74 73 65 6c 66 2e 0d 0a 20 20 20 20  on itself...    
13cf0 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 70    #..      set p
13d00 61 74 74 65 72 6e 73 20 5b 6c 69 73 74 20 5c 0d  atterns [list \.
13d10 0a 20 20 20 20 20 20 7b 53 79 73 74 65 6d 5c 2e  .      {System\.
13d20 44 61 74 61 5c 2e 53 51 4c 69 74 65 5c 2e 53 51  Data\.SQLite\.SQ
13d30 4c 69 74 65 45 78 63 65 70 74 69 6f 6e 20 5c 28  LiteException \(
13d40 30 78 38 30 30 30 34 30 30 35 5c 29 3a 20 28 2e  0x80004005\): (.
13d50 2b 3f 29 20 20 28 3f 3a 20 29 3f 61 74 7d 20 5c  +?)  (?: )?at} \
13d60 0d 0a 20 20 20 20 20 20 7b 53 79 73 74 65 6d 5c  ..      {System\
13d70 2e 44 61 74 61 5c 2e 53 51 4c 69 74 65 5c 2e 53  .Data\.SQLite\.S
13d80 51 4c 69 74 65 45 78 63 65 70 74 69 6f 6e 3a 20  QLiteException: 
13d90 28 2e 2b 3f 29 20 20 28 3f 3a 20 29 3f 61 74 7d  (.+?)  (?: )?at}
13da0 20 5c 0d 0a 20 20 20 20 20 20 7b 45 61 67 6c 65   \..      {Eagle
13db0 5c 2e 5f 43 6f 6d 70 6f 6e 65 6e 74 73 5c 2e 50  \._Components\.P
13dc0 75 62 6c 69 63 5c 2e 53 63 72 69 70 74 45 78 63  ublic\.ScriptExc
13dd0 65 70 74 69 6f 6e 3a 20 28 2e 2b 3f 29 20 20 28  eption: (.+?)  (
13de0 3f 3a 20 29 3f 61 74 7d 5d 0d 0a 0d 0a 20 20 20  ?: )?at}]....   
13df0 20 20 20 66 6f 72 65 61 63 68 20 70 61 74 74 65     foreach patte
13e00 72 6e 20 24 70 61 74 74 65 72 6e 73 20 7b 0d 0a  rn $patterns {..
13e10 20 20 20 20 20 20 20 20 69 66 20 7b 5b 72 65 67          if {[reg
13e20 65 78 70 20 2d 2d 20 24 70 61 74 74 65 72 6e 20  exp -- $pattern 
13e30 24 76 61 6c 75 65 20 64 75 6d 6d 79 20 6d 65 73  $value dummy mes
13e40 73 61 67 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  sage]} then {.. 
13e50 20 20 20 20 20 20 20 20 20 73 65 74 20 6d 65 73           set mes
13e60 73 61 67 65 20 5b 73 74 72 69 6e 67 20 6d 61 70  sage [string map
13e70 20 5b 6c 69 73 74 20 5c 72 5c 6e 20 5c 6e 5d 20   [list \r\n \n] 
13e80 5b 73 74 72 69 6e 67 20 74 72 69 6d 20 24 6d 65  [string trim $me
13e90 73 73 61 67 65 5d 5d 0d 0a 20 20 20 20 20 20 20  ssage]]..       
13ea0 20 20 20 73 65 74 20 6c 69 6e 65 73 20 5b 73 70     set lines [sp
13eb0 6c 69 74 20 24 6d 65 73 73 61 67 65 20 5c 6e 5d  lit $message \n]
13ec0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66  ....          if
13ed0 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 6c 69 6e 65   {[llength $line
13ee0 73 5d 20 3d 3d 20 32 7d 20 74 68 65 6e 20 7b 0d  s] == 2} then {.
13ef0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
13f00 7b 5b 6c 69 6e 64 65 78 20 24 6c 69 6e 65 73 20  {[lindex $lines 
13f10 30 5d 20 65 71 20 5b 6c 69 6e 64 65 78 20 24 6c  0] eq [lindex $l
13f20 69 6e 65 73 20 31 5d 7d 20 74 68 65 6e 20 7b 0d  ines 1]} then {.
13f30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
13f40 65 74 75 72 6e 20 5b 6c 69 6e 64 65 78 20 24 6c  eturn [lindex $l
13f50 69 6e 65 73 20 30 5d 0d 0a 20 20 20 20 20 20 20  ines 0]..       
13f60 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
13f70 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 61 70        return [ap
13f80 70 65 6e 64 41 72 67 73 20 5b 6c 69 6e 64 65 78  pendArgs [lindex
13f90 20 24 6c 69 6e 65 73 20 30 5d 20 22 20 2d 2d 20   $lines 0] " -- 
13fa0 22 20 5b 6c 69 6e 64 65 78 20 24 6c 69 6e 65 73  " [lindex $lines
13fb0 20 31 5d 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   1]]..          
13fc0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 72  }....          r
13fd0 65 74 75 72 6e 20 24 6d 65 73 73 61 67 65 0d 0a  eturn $message..
13fe0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
13ff0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75   }....      retu
14000 72 6e 20 24 76 61 6c 75 65 0d 0a 20 20 20 20 7d  rn $value..    }
14010 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 74 72  .....    proc tr
14020 69 6d 53 71 6c 20 7b 20 73 71 6c 20 7d 20 7b 0d  imSql { sql } {.
14030 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 72  .      return [r
14040 65 67 73 75 62 20 2d 61 6c 6c 20 2d 2d 20 7b 5c  egsub -all -- {\
14050 73 2b 7d 20 5b 73 74 72 69 6e 67 20 74 72 69 6d  s+} [string trim
14060 20 24 73 71 6c 5d 20 22 20 22 5d 0d 0a 20 20 20   $sql] " "]..   
14070 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
14080 65 78 65 63 75 74 65 53 71 6c 20 7b 20 73 71 6c  executeSql { sql
14090 20 7b 65 78 65 63 75 74 65 20 6e 6f 6e 65 7d 20   {execute none} 
140a0 7b 66 6f 72 6d 61 74 20 6e 6f 6e 65 7d 20 7b 66  {format none} {f
140b0 69 6c 65 4e 61 6d 65 20 22 22 7d 20 7d 20 7b 0d  ileName ""} } {.
140c0 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69  .      if {[stri
140d0 6e 67 20 6c 65 6e 67 74 68 20 24 66 69 6c 65 4e  ng length $fileN
140e0 61 6d 65 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ame] == 0} then 
140f0 7b 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 3a 6d  {set fileName :m
14100 65 6d 6f 72 79 3a 7d 0d 0a 20 20 20 20 20 20 73  emory:}..      s
14110 65 74 75 70 44 62 20 24 66 69 6c 65 4e 61 6d 65  etupDb $fileName
14120 20 22 22 20 22 22 20 22 22 20 22 22 20 22 22 20   "" "" "" "" "" 
14130 66 61 6c 73 65 20 66 61 6c 73 65 20 66 61 6c 73  false false fals
14140 65 20 66 61 6c 73 65 20 64 62 20 74 72 75 65 0d  e false db true.
14150 0a 0d 0a 20 20 20 20 20 20 74 72 79 20 7b 0d 0a  ...      try {..
14160 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b          return [
14170 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74 20  uplevel 1 [list 
14180 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  \..            s
14190 71 6c 20 65 78 65 63 75 74 65 20 2d 65 78 65 63  ql execute -exec
141a0 75 74 65 20 24 65 78 65 63 75 74 65 20 2d 66 6f  ute $execute -fo
141b0 72 6d 61 74 20 24 66 6f 72 6d 61 74 20 24 64 62  rmat $format $db
141c0 20 24 73 71 6c 5d 5d 0d 0a 20 20 20 20 20 20 7d   $sql]]..      }
141d0 20 66 69 6e 61 6c 6c 79 20 7b 0d 0a 20 20 20 20   finally {..    
141e0 20 20 20 20 73 65 74 20 63 6f 6e 6e 65 63 74 69      set connecti
141f0 6f 6e 20 5b 67 65 74 44 62 43 6f 6e 6e 65 63 74  on [getDbConnect
14200 69 6f 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ion]....        
14210 74 72 79 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  try {..         
14220 20 63 6c 65 61 6e 75 70 44 62 20 24 66 69 6c 65   cleanupDb $file
14230 4e 61 6d 65 20 64 62 20 66 61 6c 73 65 20 66 61  Name db false fa
14240 6c 73 65 20 66 61 6c 73 65 0d 0a 20 20 20 20 20  lse false..     
14250 20 20 20 7d 20 66 69 6e 61 6c 6c 79 20 7b 0d 0a     } finally {..
14260 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74            object
14270 20 66 6c 61 67 73 20 24 63 6f 6e 6e 65 63 74 69   flags $connecti
14280 6f 6e 20 2d 4e 6f 44 69 73 70 6f 73 65 3b 20 66  on -NoDispose; f
14290 72 65 65 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 0d  reeDbConnection.
142a0 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
142b0 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
142c0 20 20 20 70 72 6f 63 20 68 61 73 4e 6f 46 6c 61     proc hasNoFla
142d0 67 73 20 7b 20 76 61 72 4e 61 6d 65 20 6e 6f 6e  gs { varName non
142e0 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20 75 70 76  e } {..      upv
142f0 61 72 20 31 20 24 76 61 72 4e 61 6d 65 20 66 6c  ar 1 $varName fl
14300 61 67 73 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20  ags....      if 
14310 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 66  {![info exists f
14320 6c 61 67 73 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  lags]} then {.. 
14330 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72         return tr
14340 75 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ue..      }.... 
14350 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
14360 20 6c 65 6e 67 74 68 20 24 66 6c 61 67 73 5d 20   length $flags] 
14370 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
14380 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75        return tru
14390 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  e..      }....  
143a0 20 20 20 20 69 66 20 7b 24 6e 6f 6e 65 20 26 26      if {$none &&
143b0 20 24 66 6c 61 67 73 20 65 71 20 22 4e 6f 6e 65   $flags eq "None
143c0 22 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  "} then {..     
143d0 20 20 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a     return true..
143e0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
143f0 20 72 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20   return false.. 
14400 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
14410 63 20 67 65 74 43 6f 6e 6e 65 63 74 69 6f 6e 46  c getConnectionF
14420 6c 61 67 73 20 7b 20 66 69 6c 65 4e 61 6d 65 20  lags { fileName 
14430 66 6c 61 67 73 20 7b 71 75 69 65 74 20 66 61 6c  flags {quiet fal
14440 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23  se} } {..      #
14450 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
14460 46 69 67 75 72 65 20 6f 75 74 20 77 68 69 63 68  Figure out which
14470 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e   database file n
14480 61 6d 65 20 6f 72 20 63 6f 6e 6e 65 63 74 69 6f  ame or connectio
14490 6e 20 73 74 72 69 6e 67 20 74 68 65 73 65 0d 0a  n string these..
144a0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f        #       co
144b0 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 77  nnection flags w
144c0 69 6c 6c 20 61 63 74 75 61 6c 6c 79 20 61 70 70  ill actually app
144d0 6c 79 20 74 6f 2e 20 20 54 68 69 73 20 69 73 20  ly to.  This is 
144e0 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 0d 0a 20  not necessary.. 
144f0 20 20 20 20 20 23 20 20 20 20 20 20 20 69 6e 20       #       in 
14500 71 75 69 65 74 20 6d 6f 64 65 20 62 65 63 61 75  quiet mode becau
14510 73 65 20 74 68 69 73 20 69 6e 66 6f 72 6d 61 74  se this informat
14520 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64  ion is only used
14530 20 66 6f 72 20 6c 6f 67 67 69 6e 67 0d 0a 20 20   for logging..  
14540 20 20 20 20 23 20 20 20 20 20 20 20 61 6e 64 20      #       and 
14550 72 65 70 6f 72 74 69 6e 67 20 70 75 72 70 6f 73  reporting purpos
14560 65 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  es...      #..  
14570 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
14580 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
14590 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
145a0 67 74 68 20 24 66 69 6c 65 4e 61 6d 65 5d 20 3e  gth $fileName] >
145b0 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
145c0 20 20 20 20 20 20 73 65 74 20 64 61 74 61 62 61        set databa
145d0 73 65 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22  se [appendArgs "
145e0 66 69 6c 65 20 6e 61 6d 65 20 5c 22 22 20 24 66  file name \"" $f
145f0 69 6c 65 4e 61 6d 65 20 5c 22 5d 0d 0a 20 20 20  ileName \"]..   
14600 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b       } elseif {[
14610 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 64 61  info exists ::da
14620 74 61 53 6f 75 72 63 65 5d 20 26 26 20 5c 0d 0a  taSource] && \..
14630 20 20 20 20 20 20 20 20 20 20 20 20 21 5b 61 72              ![ar
14640 72 61 79 20 65 78 69 73 74 73 20 3a 3a 64 61 74  ray exists ::dat
14650 61 53 6f 75 72 63 65 5d 7d 20 74 68 65 6e 20 7b  aSource]} then {
14660 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
14670 64 61 74 61 62 61 73 65 20 5b 61 70 70 65 6e 64  database [append
14680 41 72 67 73 20 22 64 61 74 61 20 73 6f 75 72 63  Args "data sourc
14690 65 20 5c 22 22 20 24 3a 3a 64 61 74 61 53 6f 75  e \"" $::dataSou
146a0 72 63 65 20 5c 22 5d 0d 0a 20 20 20 20 20 20 20  rce \"]..       
146b0 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
146c0 20 20 20 20 20 73 65 74 20 64 61 74 61 62 61 73       set databas
146d0 65 20 3c 75 6e 6b 6e 6f 77 6e 3e 0d 0a 20 20 20  e <unknown>..   
146e0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
146f0 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
14700 20 20 23 20 4e 4f 54 45 3a 20 45 76 65 6e 20 74    # NOTE: Even t
14710 68 6f 75 67 68 20 74 68 65 72 65 20 69 73 20 6f  hough there is o
14720 6e 6c 79 20 6f 6e 65 20 73 6f 75 72 63 65 20 6f  nly one source o
14730 66 20 66 6c 61 67 73 20 73 6f 20 66 61 72 2c 20  f flags so far, 
14740 74 68 65 79 0d 0a 20 20 20 20 20 20 23 20 20 20  they..      #   
14750 20 20 20 20 6d 75 73 74 20 62 65 20 63 6f 6d 62      must be comb
14760 69 6e 65 64 20 75 73 69 6e 67 20 74 68 65 20 63  ined using the c
14770 6f 72 72 65 63 74 20 73 79 6e 74 61 78 20 66 6f  orrect syntax fo
14780 72 20 65 6e 75 6d 65 72 61 74 65 64 0d 0a 20 20  r enumerated..  
14790 20 20 20 20 23 20 20 20 20 20 20 20 66 6c 61 67      #       flag
147a0 20 76 61 6c 75 65 73 20 66 6f 72 20 74 68 65 20   values for the 
147b0 2e 4e 45 54 20 46 72 61 6d 65 77 6f 72 6b 2e 0d  .NET Framework..
147c0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
147d0 73 65 74 20 66 6c 61 67 73 20 5b 63 6f 6d 62 69  set flags [combi
147e0 6e 65 46 6c 61 67 73 20 24 66 6c 61 67 73 20 22  neFlags $flags "
147f0 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20  "]....      #.. 
14800 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f       # NOTE: Sho
14810 77 20 28 61 6e 64 20 6c 6f 67 29 20 74 68 65 20  w (and log) the 
14820 6c 6f 63 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e  local connection
14830 20 66 6c 61 67 73 20 61 6e 64 20 74 68 65 20 61   flags and the a
14840 73 73 6f 63 69 61 74 65 64 0d 0a 20 20 20 20 20  ssociated..     
14850 20 23 20 20 20 20 20 20 20 64 61 74 61 20 73 6f   #       data so
14860 75 72 63 65 20 6f 72 20 66 69 6c 65 20 6e 61 6d  urce or file nam
14870 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  e...      #..   
14880 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
14890 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
148a0 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
148b0 73 20 3a 3a 6e 6f 28 65 6d 69 74 4c 6f 63 61 6c  s ::no(emitLocal
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 28 21 5b 69 6e 66            (![inf
148e0 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 65 6d  o exists ::no(em
148f0 69 74 4c 6f 63 61 6c 46 6c 61 67 73 49 66 4e 6f  itLocalFlagsIfNo
14900 6e 65 29 5d 20 7c 7c 20 5c 0d 0a 20 20 20 20 20  ne)] || \..     
14910 20 20 20 20 20 20 20 20 21 5b 68 61 73 4e 6f 46          ![hasNoF
14920 6c 61 67 73 20 66 6c 61 67 73 20 66 61 6c 73 65  lags flags false
14930 5d 29 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  ])} then {..    
14940 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
14950 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
14960 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
14970 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6c           "---- l
14980 6f 63 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ocal connection 
14990 66 6c 61 67 73 20 66 6f 72 20 22 20 24 64 61 74  flags for " $dat
149a0 61 62 61 73 65 20 5c 0d 0a 20 20 20 20 20 20 20  abase \..       
149b0 20 20 20 20 20 20 20 22 20 61 72 65 3a 20 22 20         " are: " 
149c0 5b 65 78 70 72 20 7b 21 5b 68 61 73 4e 6f 46 6c  [expr {![hasNoFl
149d0 61 67 73 20 66 6c 61 67 73 20 66 61 6c 73 65 5d  ags flags false]
149e0 20 3f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   ? \..          
149f0 20 20 20 20 5b 61 70 70 65 6e 64 41 72 67 73 20      [appendArgs 
14a00 5c 22 20 24 66 6c 61 67 73 20 5c 22 5d 20 3a 20  \" $flags \"] : 
14a10 22 3c 6e 6f 6e 65 3e 22 7d 5d 20 5c 6e 5d 0d 0a  "<none>"}] \n]..
14a20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
14a30 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   }....      #.. 
14a40 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f       # NOTE: Sho
14a50 77 20 28 61 6e 64 20 6c 6f 67 29 20 74 68 65 20  w (and log) the 
14a60 73 68 61 72 65 64 20 63 6f 6e 6e 65 63 74 69 6f  shared connectio
14a70 6e 20 66 6c 61 67 73 2e 0d 0a 20 20 20 20 20 20  n flags...      
14a80 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 24 71  #..      if {!$q
14a90 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
14aa0 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
14ab0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62   {..          ob
14ac0 6a 65 63 74 20 69 6e 76 6f 6b 65 20 53 79 73 74  ject invoke Syst
14ad0 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53  em.Data.SQLite.S
14ae0 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 20  QLiteConnection 
14af0 53 68 61 72 65 64 46 6c 61 67 73 0d 0a 20 20 20  SharedFlags..   
14b00 20 20 20 20 20 7d 20 73 68 61 72 65 64 46 6c 61       } sharedFla
14b10 67 73 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  gs] == 0} then {
14b20 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
14b30 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
14b40 6e 6f 28 65 6d 69 74 53 68 61 72 65 64 46 6c 61  no(emitSharedFla
14b50 67 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  gs)] && \..     
14b60 20 20 20 20 20 20 20 20 20 28 21 5b 69 6e 66 6f           (![info
14b70 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 65 6d 69   exists ::no(emi
14b80 74 53 68 61 72 65 64 46 6c 61 67 73 49 66 4e 6f  tSharedFlagsIfNo
14b90 6e 65 29 5d 20 7c 7c 20 5c 0d 0a 20 20 20 20 20  ne)] || \..     
14ba0 20 20 20 20 20 20 20 20 20 20 21 5b 68 61 73 4e            ![hasN
14bb0 6f 46 6c 61 67 73 20 73 68 61 72 65 64 46 6c 61  oFlags sharedFla
14bc0 67 73 20 74 72 75 65 5d 29 7d 20 74 68 65 6e 20  gs true])} then 
14bd0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
14be0 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
14bf0 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
14c00 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
14c10 20 20 20 20 22 2d 2d 2d 2d 20 73 68 61 72 65 64      "---- shared
14c20 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67   connection flag
14c30 73 20 66 6f 72 20 22 20 24 64 61 74 61 62 61 73  s for " $databas
14c40 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
14c50 20 20 20 20 20 22 20 61 72 65 3a 20 22 20 5b 65       " are: " [e
14c60 78 70 72 20 7b 21 5b 68 61 73 4e 6f 46 6c 61 67  xpr {![hasNoFlag
14c70 73 20 73 68 61 72 65 64 46 6c 61 67 73 20 74 72  s sharedFlags tr
14c80 75 65 5d 20 3f 20 5c 0d 0a 20 20 20 20 20 20 20  ue] ? \..       
14c90 20 20 20 20 20 20 20 20 20 5b 61 70 70 65 6e 64           [append
14ca0 41 72 67 73 20 5c 22 20 24 73 68 61 72 65 64 46  Args \" $sharedF
14cb0 6c 61 67 73 20 5c 22 5d 20 3a 20 22 3c 6e 6f 6e  lags \"] : "<non
14cc0 65 3e 22 7d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20  e>"}] \n]..     
14cd0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
14ce0 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
14cf0 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
14d00 78 69 73 74 73 20 3a 3a 6e 6f 28 65 6d 69 74 53  xists ::no(emitS
14d10 68 61 72 65 64 46 6c 61 67 73 29 5d 20 26 26 20  haredFlags)] && 
14d20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
14d30 20 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   ![info exists :
14d40 3a 6e 6f 28 65 6d 69 74 53 68 61 72 65 64 46 6c  :no(emitSharedFl
14d50 61 67 73 49 66 55 6e 61 76 61 69 6c 61 62 6c 65  agsIfUnavailable
14d60 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
14d70 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
14d80 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
14d90 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
14da0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
14db0 2d 2d 20 73 68 61 72 65 64 20 63 6f 6e 6e 65 63  -- shared connec
14dc0 74 69 6f 6e 20 66 6c 61 67 73 20 66 6f 72 20 22  tion flags for "
14dd0 20 24 64 61 74 61 62 61 73 65 20 5c 0d 0a 20 20   $database \..  
14de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
14df0 61 72 65 3a 20 3c 75 6e 61 76 61 69 6c 61 62 6c  are: <unavailabl
14e00 65 3e 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20  e>\n"]..        
14e10 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
14e20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
14e30 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
14e40 3a 20 53 68 6f 77 20 28 61 6e 64 20 6c 6f 67 29  : Show (and log)
14e50 20 74 68 65 20 64 65 74 65 63 74 65 64 20 67 6c   the detected gl
14e60 6f 62 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  obal connection 
14e70 66 6c 61 67 73 2c 20 69 66 20 61 6e 79 2e 0d 0a  flags, if any...
14e80 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
14e90 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
14ea0 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   {..        if {
14eb0 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
14ec0 6e 6f 28 65 6d 69 74 47 6c 6f 62 61 6c 46 6c 61  no(emitGlobalFla
14ed0 67 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  gs)] && \..     
14ee0 20 20 20 20 20 20 20 28 21 5b 69 6e 66 6f 20 65         (![info e
14ef0 78 69 73 74 73 20 3a 3a 6e 6f 28 65 6d 69 74 47  xists ::no(emitG
14f00 6c 6f 62 61 6c 46 6c 61 67 73 49 66 4e 6f 6e 65  lobalFlagsIfNone
14f10 29 5d 20 7c 7c 20 5c 0d 0a 20 20 20 20 20 20 20  )] || \..       
14f20 20 20 20 20 20 20 21 5b 68 61 73 4e 6f 46 6c 61        ![hasNoFla
14f30 67 73 20 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e 5f  gs ::connection_
14f40 66 6c 61 67 73 20 66 61 6c 73 65 5d 29 7d 20 74  flags false])} t
14f50 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
14f60 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
14f70 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
14f80 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
14f90 20 20 20 20 22 2d 2d 2d 2d 20 67 6c 6f 62 61 6c      "---- global
14fa0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67   connection flag
14fb0 73 20 61 72 65 3a 20 22 20 5c 0d 0a 20 20 20 20  s are: " \..    
14fc0 20 20 20 20 20 20 20 20 20 20 5b 65 78 70 72 20            [expr 
14fd0 7b 21 5b 68 61 73 4e 6f 46 6c 61 67 73 20 3a 3a  {![hasNoFlags ::
14fe0 63 6f 6e 6e 65 63 74 69 6f 6e 5f 66 6c 61 67 73  connection_flags
14ff0 20 66 61 6c 73 65 5d 20 3f 20 5c 0d 0a 20 20 20   false] ? \..   
15000 20 20 20 20 20 20 20 20 20 20 20 5b 61 70 70 65             [appe
15010 6e 64 41 72 67 73 20 5c 22 20 24 3a 3a 63 6f 6e  ndArgs \" $::con
15020 6e 65 63 74 69 6f 6e 5f 66 6c 61 67 73 20 5c 22  nection_flags \"
15030 5d 20 3a 20 22 3c 6e 6f 6e 65 3e 22 7d 5d 20 5c  ] : "<none>"}] \
15040 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  n]..        }.. 
15050 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
15060 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
15070 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61 6e   If there are an
15080 79 20 67 6c 6f 62 61 6c 20 28 70 65 72 20 74 65  y global (per te
15090 73 74 20 72 75 6e 29 20 63 6f 6e 6e 65 63 74 69  st run) connecti
150a0 6f 6e 20 66 6c 61 67 73 20 63 75 72 72 65 6e 74  on flags current
150b0 6c 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ly..      #     
150c0 20 20 73 65 74 2c 20 75 73 65 20 74 68 65 6d 20    set, use them 
150d0 6e 6f 77 20 28 69 2e 65 2e 20 62 79 20 63 6f 6d  now (i.e. by com
150e0 62 69 6e 69 6e 67 20 74 68 65 6d 20 77 69 74 68  bining them with
150f0 20 74 68 65 20 6f 6e 65 73 20 66 6f 72 20 74 68   the ones for th
15100 69 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  is..      #     
15110 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 29 2e 0d 0a    connection)...
15120 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
15130 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
15140 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e 5f 66 6c 61  ::connection_fla
15150 67 73 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  gs]} then {..   
15160 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
15170 23 20 4e 4f 54 45 3a 20 43 6f 6d 62 69 6e 65 20  # NOTE: Combine 
15180 61 6e 64 2f 6f 72 20 72 65 70 6c 61 63 65 20 74  and/or replace t
15190 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c  he connection fl
151a0 61 67 73 20 61 6e 64 20 74 68 65 6e 20 73 68 6f  ags and then sho
151b0 77 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23  w the..        #
151c0 20 20 20 20 20 20 20 6e 65 77 20 76 61 6c 75 65         new value
151d0 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
151e0 20 20 20 20 20 20 73 65 74 20 66 6c 61 67 73 20        set flags 
151f0 5b 63 6f 6d 62 69 6e 65 46 6c 61 67 73 20 24 66  [combineFlags $f
15200 6c 61 67 73 20 24 3a 3a 63 6f 6e 6e 65 63 74 69  lags $::connecti
15210 6f 6e 5f 66 6c 61 67 73 5d 0d 0a 0d 0a 20 20 20  on_flags]....   
15220 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
15230 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20 28 61 6e  # NOTE: Show (an
15240 64 20 6c 6f 67 29 20 74 68 65 20 6e 65 77 20 65  d log) the new e
15250 66 66 65 63 74 69 76 65 20 63 6f 6e 6e 65 63 74  ffective connect
15260 69 6f 6e 20 66 6c 61 67 73 2e 0d 0a 20 20 20 20  ion flags...    
15270 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69      #..        i
15280 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
15290 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   {..          if
152a0 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
152b0 3a 3a 6e 6f 28 65 6d 69 74 43 6f 6d 62 69 6e 65  ::no(emitCombine
152c0 64 46 6c 61 67 73 29 5d 20 26 26 20 5c 0d 0a 20  dFlags)] && \.. 
152d0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 21 5b               (![
152e0 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
152f0 28 65 6d 69 74 43 6f 6d 62 69 6e 65 64 46 6c 61  (emitCombinedFla
15300 67 73 49 66 4e 6f 6e 65 29 5d 20 7c 7c 20 5c 0d  gsIfNone)] || \.
15310 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15320 21 5b 68 61 73 4e 6f 46 6c 61 67 73 20 66 6c 61  ![hasNoFlags fla
15330 67 73 20 66 61 6c 73 65 5d 29 7d 20 74 68 65 6e  gs false])} then
15340 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
15350 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
15360 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
15370 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
15380 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 6d 62 69       "---- combi
15390 6e 65 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66  ned connection f
153a0 6c 61 67 73 20 66 6f 72 20 22 20 24 64 61 74 61  lags for " $data
153b0 62 61 73 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  base \..        
153c0 20 20 20 20 20 20 20 20 22 20 61 72 65 3a 20 22          " are: "
153d0 20 5b 65 78 70 72 20 7b 21 5b 68 61 73 4e 6f 46   [expr {![hasNoF
153e0 6c 61 67 73 20 66 6c 61 67 73 20 66 61 6c 73 65  lags flags false
153f0 5d 20 3f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ] ? \..         
15400 20 20 20 20 20 20 20 5b 61 70 70 65 6e 64 41 72         [appendAr
15410 67 73 20 5c 22 20 24 66 6c 61 67 73 20 5c 22 5d  gs \" $flags \"]
15420 20 3a 20 22 3c 6e 6f 6e 65 3e 22 7d 5d 20 5c 6e   : "<none>"}] \n
15430 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ]..          }..
15440 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
15450 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75   }....      retu
15460 72 6e 20 24 66 6c 61 67 73 0d 0a 20 20 20 20 7d  rn $flags..    }
15470 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65  .....    proc ge
15480 74 46 6c 61 67 73 50 72 6f 70 65 72 74 79 20 7b  tFlagsProperty {
15490 20 7b 66 6c 61 67 73 20 22 22 7d 20 7b 71 75 69   {flags ""} {qui
154a0 65 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20  et false} } {.. 
154b0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
154c0 4e 4f 54 45 3a 20 44 65 74 65 72 6d 69 6e 65 20  NOTE: Determine 
154d0 77 68 61 74 20 74 68 65 20 63 6f 6d 62 69 6e 65  what the combine
154e0 64 20 28 67 6c 6f 62 61 6c 20 61 6e 64 20 6c 6f  d (global and lo
154f0 63 61 6c 29 20 63 6f 6e 6e 65 63 74 69 6f 6e 0d  cal) connection.
15500 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 66  .      #       f
15510 6c 61 67 73 20 73 68 6f 75 6c 64 20 62 65 2c 20  lags should be, 
15520 70 6f 73 73 69 62 6c 79 20 71 75 69 65 74 6c 79  possibly quietly
15530 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
15540 20 20 73 65 74 20 66 6c 61 67 73 20 5b 67 65 74    set flags [get
15550 43 6f 6e 6e 65 63 74 69 6f 6e 46 6c 61 67 73 20  ConnectionFlags 
15560 22 22 20 24 66 6c 61 67 73 20 24 71 75 69 65 74  "" $flags $quiet
15570 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ]....      #..  
15580 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 6e      # NOTE: If n
15590 6f 20 67 6c 6f 62 61 6c 20 6f 72 20 6c 6f 63 61  o global or loca
155a0 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61  l connection fla
155b0 67 73 20 77 65 72 65 20 73 70 65 63 69 66 69 65  gs were specifie
155c0 64 2c 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20  d, the..      # 
155d0 20 20 20 20 20 20 64 65 66 61 75 6c 74 20 63 6f        default co
155e0 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 73  nnection flags s
155f0 68 6f 75 6c 64 20 62 65 20 75 73 65 64 3b 20 74  hould be used; t
15600 68 65 72 65 66 6f 72 65 2c 20 72 65 74 75 72 6e  herefore, return
15610 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
15620 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 20  an empty string 
15630 69 6e 20 74 68 61 74 20 63 61 73 65 2e 0d 0a 20  in that case... 
15640 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
15650 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   {[string length
15660 20 24 66 6c 61 67 73 5d 20 3d 3d 20 30 7d 20 74   $flags] == 0} t
15670 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72  hen {..        r
15680 65 74 75 72 6e 20 22 22 0d 0a 20 20 20 20 20 20  eturn ""..      
15690 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
156a0 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 6e 20 6f      # NOTE: In o
156b0 72 64 65 72 20 74 6f 20 63 68 65 63 6b 20 69 66  rder to check if
156c0 20 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6e   the default con
156d0 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 61 72  nection flags ar
156e0 65 20 62 65 69 6e 67 20 75 73 65 64 0d 0a 20 20  e being used..  
156f0 20 20 20 20 23 20 20 20 20 20 20 20 69 74 20 69      #       it i
15700 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 61  s necessary to a
15710 74 74 65 6d 70 74 20 61 20 63 6f 6e 76 65 72 73  ttempt a convers
15720 69 6f 6e 20 74 6f 20 74 68 65 20 61 63 74 75 61  ion to the actua
15730 6c 20 65 6e 75 6d 65 72 61 74 65 64 0d 0a 20 20  l enumerated..  
15740 20 20 20 20 23 20 20 20 20 20 20 20 74 79 70 65      #       type
15750 2e 20 20 46 61 69 6c 69 6e 67 20 74 68 61 74 2c  .  Failing that,
15760 20 74 68 65 20 63 68 65 63 6b 20 61 67 61 69 6e   the check again
15770 73 74 20 74 68 65 20 64 65 66 61 75 6c 74 20 76  st the default v
15780 61 6c 75 65 20 77 69 6c 6c 20 62 65 0d 0a 20 20  alue will be..  
15790 20 20 20 20 23 20 20 20 20 20 20 20 73 6b 69 70      #       skip
157a0 70 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ped...      #.. 
157b0 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
157c0 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 65  {..        set e
157d0 72 72 6f 72 20 6e 75 6c 6c 3b 20 23 20 49 47 4e  rror null; # IGN
157e0 4f 52 45 44 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ORED....        
157f0 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 55 74  object invoke Ut
15800 69 6c 69 74 79 20 54 72 79 50 61 72 73 65 46 6c  ility TryParseFl
15810 61 67 73 45 6e 75 6d 20 22 22 20 5c 0d 0a 20 20  agsEnum "" \..  
15820 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d            System
15830 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c  .Data.SQLite.SQL
15840 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 46 6c 61  iteConnectionFla
15850 67 73 20 22 22 20 24 66 6c 61 67 73 20 6e 75 6c  gs "" $flags nul
15860 6c 20 74 72 75 65 20 5c 0d 0a 20 20 20 20 20 20  l true \..      
15870 20 20 20 20 20 20 74 72 75 65 20 74 72 75 65 20        true true 
15880 65 72 72 6f 72 0d 0a 20 20 20 20 20 20 7d 20 76  error..      } v
15890 61 6c 75 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  alue]} then {.. 
158a0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
158b0 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70    # NOTE: Attemp
158c0 74 69 6e 67 20 74 6f 20 70 61 72 73 65 20 74 68  ting to parse th
158d0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61  e connection fla
158e0 67 73 20 63 61 75 73 65 64 20 61 20 73 63 72 69  gs caused a scri
158f0 70 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  pt..        #   
15900 20 20 20 20 65 72 72 6f 72 2e 20 20 45 6d 69 74      error.  Emit
15910 20 61 20 77 61 72 6e 69 6e 67 20 74 6f 20 74 68   a warning to th
15920 65 20 74 65 73 74 20 6c 6f 67 20 66 69 6c 65 20  e test log file 
15930 61 6e 64 20 63 6f 6e 74 69 6e 75 65 0d 0a 20 20  and continue..  
15940 20 20 20 20 20 20 23 20 20 20 20 20 20 20 75 73        #       us
15950 69 6e 67 20 61 6e 20 65 6d 74 70 79 20 73 74 72  ing an emtpy str
15960 69 6e 67 20 69 6e 73 74 65 61 64 2e 0d 0a 20 20  ing instead...  
15970 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
15980 20 74 6c 6f 67 20 5b 61 70 70 65 6e 64 41 72 67   tlog [appendArg
15990 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
159a0 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20   "==== WARNING: 
159b0 66 61 69 6c 65 64 20 74 6f 20 70 61 72 73 65 20  failed to parse 
159c0 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73  connection flags
159d0 2c 20 65 72 72 6f 72 3a 20 22 20 5c 0d 0a 20 20  , error: " \..  
159e0 20 20 20 20 20 20 20 20 20 20 5c 6e 5c 74 20 24            \n\t $
159f0 76 61 6c 75 65 20 5c 6e 5d 0d 0a 0d 0a 20 20 20  value \n]....   
15a00 20 20 20 20 20 73 65 74 20 76 61 6c 75 65 20 22       set value "
15a10 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  "..      }....  
15a20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
15a30 4f 54 45 3a 20 49 66 20 74 68 65 20 63 6f 6d 62  OTE: If the comb
15a40 69 6e 65 64 20 66 6c 61 67 73 20 73 74 72 69 6e  ined flags strin
15a50 67 20 63 6f 75 6c 64 20 6e 6f 74 20 61 63 74 75  g could not actu
15a60 61 6c 6c 79 20 62 65 20 63 6f 6e 76 65 72 74 65  ally be converte
15a70 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  d..      #      
15a80 20 74 6f 20 74 68 65 20 65 6e 75 6d 65 72 61 74   to the enumerat
15a90 65 64 20 74 79 70 65 20 69 74 20 69 73 20 74 68  ed type it is th
15aa0 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 2c  e default value,
15ab0 20 74 68 65 6e 20 6a 75 73 74 20 75 73 65 0d 0a   then just use..
15ac0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69 74        #       it
15ad0 20 76 65 72 62 61 74 69 6d 3b 20 6f 74 68 65 72   verbatim; other
15ae0 77 69 73 65 2c 20 6a 75 73 74 20 72 65 74 75 72  wise, just retur
15af0 6e 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e  n an empty strin
15b00 67 2e 20 20 49 6e 20 74 68 61 74 0d 0a 20 20 20  g.  In that..   
15b10 20 20 20 23 20 20 20 20 20 20 20 63 61 73 65 2c     #       case,
15b20 20 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6e   the default con
15b30 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 77 69  nection flags wi
15b40 6c 6c 20 62 65 20 75 73 65 64 2e 0d 0a 20 20 20  ll be used...   
15b50 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
15b60 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
15b70 76 61 6c 75 65 5d 20 3d 3d 20 30 20 7c 7c 20 24  value] == 0 || $
15b80 76 61 6c 75 65 20 6e 65 20 22 44 65 66 61 75 6c  value ne "Defaul
15b90 74 22 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  t"} then {..    
15ba0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
15bb0 20 57 41 52 4e 49 4e 47 3a 20 54 68 69 73 20 72   WARNING: This r
15bc0 65 74 75 72 6e 73 20 74 68 65 20 73 74 72 69 6e  eturns the strin
15bd0 67 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 63  g value of the c
15be0 6f 6d 62 69 6e 65 64 20 66 6c 61 67 73 2c 20 6e  ombined flags, n
15bf0 6f 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ot..        #   
15c00 20 20 20 20 20 20 20 74 68 65 20 65 6e 75 6d 65         the enume
15c10 72 61 74 65 64 20 76 61 6c 75 65 2e 20 20 54 68  rated value.  Th
15c20 69 73 20 69 73 20 62 79 20 64 65 73 69 67 6e 20  is is by design 
15c30 61 6e 64 20 73 68 6f 75 6c 64 20 6e 6f 74 0d 0a  and should not..
15c40 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
15c50 20 20 20 62 65 20 63 68 61 6e 67 65 64 20 77 69     be changed wi
15c60 74 68 6f 75 74 20 63 61 72 65 66 75 6c 20 63 6f  thout careful co
15c70 6e 73 69 64 65 72 61 74 69 6f 6e 20 28 65 2e 67  nsideration (e.g
15c80 2e 20 69 74 20 77 6f 75 6c 64 0d 0a 20 20 20 20  . it would..    
15c90 20 20 20 20 23 20 20 20 20 20 20 20 20 20 20 70      #          p
15ca0 72 65 76 65 6e 74 20 74 68 65 20 53 51 4c 69 74  revent the SQLit
15cb0 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 63 6c 61 73  eConnection clas
15cc0 73 20 66 72 6f 6d 20 61 6c 6c 6f 77 69 6e 67 20  s from allowing 
15cd0 69 6e 76 61 6c 69 64 0d 0a 20 20 20 20 20 20 20  invalid..       
15ce0 20 23 20 20 20 20 20 20 20 20 20 20 5b 22 6d 61   #          ["ma
15cf0 67 69 63 61 6c 22 5d 20 6d 65 74 61 2d 66 6c 61  gical"] meta-fla
15d00 67 73 29 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  gs)...        #.
15d10 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
15d20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 46 6c 61  [appendArgs "Fla
15d30 67 73 3d 22 20 24 66 6c 61 67 73 20 5c 3b 5d 0d  gs=" $flags \;].
15d40 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
15d50 20 20 72 65 74 75 72 6e 20 22 22 0d 0a 20 20 20    return ""..   
15d60 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
15d70 67 65 74 54 65 73 74 50 72 6f 70 65 72 74 69 65  getTestPropertie
15d80 73 20 7b 20 7b 66 6c 61 67 73 20 22 22 7d 20 7b  s { {flags ""} {
15d90 71 75 69 65 74 20 66 61 6c 73 65 7d 20 7d 20 7b  quiet false} } {
15da0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
15db0 20 23 20 4e 4f 54 45 3a 20 53 74 61 72 74 20 77   # NOTE: Start w
15dc0 69 74 68 20 22 46 6c 61 67 73 22 20 70 72 6f 70  ith "Flags" prop
15dd0 65 72 74 79 20 66 6f 72 20 74 68 65 20 6e 65 77  erty for the new
15de0 20 63 6f 6e 6e 65 63 74 69 6f 6e 2c 20 69 66 20   connection, if 
15df0 61 6e 79 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  any...      #.. 
15e00 20 20 20 20 20 73 65 74 20 72 65 73 75 6c 74 20       set result 
15e10 5b 67 65 74 46 6c 61 67 73 50 72 6f 70 65 72 74  [getFlagsPropert
15e20 79 20 24 66 6c 61 67 73 20 24 71 75 69 65 74 5d  y $flags $quiet]
15e30 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
15e40 20 20 20 23 20 4e 4f 54 45 3a 20 41 64 64 20 74     # NOTE: Add t
15e50 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 63  he name of the c
15e60 75 72 72 65 6e 74 20 74 65 73 74 20 66 69 6c 65  urrent test file
15e70 2c 20 69 66 20 61 76 61 69 6c 61 62 6c 65 2e 20  , if available. 
15e80 20 54 68 69 73 20 69 73 0d 0a 20 20 20 20 20 20   This is..      
15e90 23 20 20 20 20 20 20 20 6f 6e 6c 79 20 75 73 65  #       only use
15ea0 64 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 2e  d for debugging.
15eb0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
15ec0 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
15ed0 73 20 3a 3a 74 65 73 74 5f 66 69 6c 65 5d 7d 20  s ::test_file]} 
15ee0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
15ef0 61 70 70 65 6e 64 20 72 65 73 75 6c 74 20 54 65  append result Te
15f00 73 74 46 69 6c 65 3d 20 24 3a 3a 74 65 73 74 5f  stFile= $::test_
15f10 66 69 6c 65 20 5c 3b 0d 0a 20 20 20 20 20 20 7d  file \;..      }
15f20 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
15f30 20 20 20 23 20 4e 4f 54 45 3a 20 41 64 64 20 74     # NOTE: Add t
15f40 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 63  he name of the c
15f50 75 72 72 65 6e 74 20 74 65 73 74 2c 20 69 66 20  urrent test, if 
15f60 61 76 61 69 6c 61 62 6c 65 2e 20 20 54 68 69 73  available.  This
15f70 20 69 73 20 6f 6e 6c 79 0d 0a 20 20 20 20 20 20   is only..      
15f80 23 20 20 20 20 20 20 20 75 73 65 64 20 66 6f 72  #       used for
15f90 20 64 65 62 75 67 67 69 6e 67 2e 0d 0a 20 20 20   debugging...   
15fa0 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
15fb0 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 65  [info exists ::e
15fc0 61 67 6c 65 5f 74 65 73 74 73 28 43 75 72 72 65  agle_tests(Curre
15fd0 6e 74 4e 61 6d 65 29 5d 7d 20 74 68 65 6e 20 7b  ntName)]} then {
15fe0 0d 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64  ..        append
15ff0 20 72 65 73 75 6c 74 20 54 65 73 74 4e 61 6d 65   result TestName
16000 3d 20 24 3a 3a 65 61 67 6c 65 5f 74 65 73 74 73  = $::eagle_tests
16010 28 43 75 72 72 65 6e 74 4e 61 6d 65 29 20 5c 3b  (CurrentName) \;
16020 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
16030 20 20 20 72 65 74 75 72 6e 20 24 72 65 73 75 6c     return $resul
16040 74 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  t..    }.....   
16050 20 70 72 6f 63 20 65 6e 61 62 6c 65 53 68 61 72   proc enableShar
16060 65 64 43 61 63 68 65 20 7b 20 63 68 61 6e 6e 65  edCache { channe
16070 6c 20 65 6e 61 62 6c 65 20 7b 71 75 69 65 74 20  l enable {quiet 
16080 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20  false} } {..    
16090 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
160a0 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69          object i
160b0 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f  nvoke -flags +No
160c0 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20  nPublic \..     
160d0 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61         System.Da
160e0 74 61 2e 53 51 4c 69 74 65 2e 55 6e 73 61 66 65  ta.SQLite.Unsafe
160f0 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 20 5c 0d  NativeMethods \.
16100 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
16110 69 74 65 33 5f 65 6e 61 62 6c 65 5f 73 68 61 72  ite3_enable_shar
16120 65 64 5f 63 61 63 68 65 20 5b 65 78 70 72 20 69  ed_cache [expr i
16130 6e 74 28 24 65 6e 61 62 6c 65 29 5d 0d 0a 20 20  nt($enable)]..  
16140 20 20 20 20 7d 20 72 65 73 75 6c 74 5d 20 3d 3d      } result] ==
16150 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
16160 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
16170 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
16180 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
16190 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
161a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
161b0 2d 2d 2d 2d 20 63 61 6c 6c 20 73 71 6c 69 74 65  ---- call sqlite
161c0 33 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f  3_enable_shared_
161d0 63 61 63 68 65 28 22 20 24 65 6e 61 62 6c 65 20  cache(" $enable 
161e0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
161f0 20 22 29 2e 2e 2e 20 6f 6b 3a 20 22 20 24 72 65   ")... ok: " $re
16200 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  sult \n]..      
16210 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73    }..      } els
16220 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20  e {..        if 
16230 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
16240 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74  ..          tput
16250 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
16260 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
16270 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 61          "---- ca
16280 6c 6c 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c  ll sqlite3_enabl
16290 65 5f 73 68 61 72 65 64 5f 63 61 63 68 65 28 22  e_shared_cache("
162a0 20 24 65 6e 61 62 6c 65 20 5c 0d 0a 20 20 20 20   $enable \..    
162b0 20 20 20 20 20 20 20 20 20 20 22 29 2e 2e 2e 20            ")... 
162c0 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 72  error: " \n\t $r
162d0 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20  esult \n]..     
162e0 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20     }..      }.. 
162f0 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
16300 63 20 73 65 74 75 70 44 62 20 7b 0d 0a 20 20 20  c setupDb {..   
16310 20 20 20 20 20 20 20 20 20 66 69 6c 65 4e 61 6d           fileNam
16320 65 20 7b 6d 6f 64 65 20 22 22 7d 20 7b 64 61 74  e {mode ""} {dat
16330 65 54 69 6d 65 46 6f 72 6d 61 74 20 22 22 7d 20  eTimeFormat ""} 
16340 7b 64 61 74 65 54 69 6d 65 4b 69 6e 64 20 22 22  {dateTimeKind ""
16350 7d 20 7b 66 6c 61 67 73 20 22 22 7d 0d 0a 20 20  } {flags ""}..  
16360 20 20 20 20 20 20 20 20 20 20 7b 65 78 74 72 61            {extra
16370 20 22 22 7d 20 7b 71 75 61 6c 69 66 79 20 74 72   ""} {qualify tr
16380 75 65 7d 20 7b 64 65 6c 65 74 65 20 74 72 75 65  ue} {delete true
16390 7d 20 7b 75 72 69 20 66 61 6c 73 65 7d 0d 0a 20  } {uri false}.. 
163a0 20 20 20 20 20 20 20 20 20 20 20 7b 74 65 6d 70             {temp
163b0 6f 72 61 72 79 20 74 72 75 65 7d 20 7b 76 61 72  orary true} {var
163c0 4e 61 6d 65 20 64 62 7d 20 7b 71 75 69 65 74 20  Name db} {quiet 
163d0 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20  false} } {..    
163e0 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
163f0 45 3a 20 46 69 72 73 74 2c 20 73 65 65 20 69 66  E: First, see if
16400 20 6f 75 72 20 63 61 6c 6c 65 72 20 68 61 73 20   our caller has 
16410 72 65 71 75 65 73 74 65 64 20 61 6e 20 69 6e 2d  requested an in-
16420 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e  memory database.
16430 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
16440 20 73 65 74 20 69 73 4d 65 6d 6f 72 79 20 5b 69   set isMemory [i
16450 73 4d 65 6d 6f 72 79 44 62 20 24 66 69 6c 65 4e  sMemoryDb $fileN
16460 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d  ame]....      #.
16470 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46  .      # NOTE: F
16480 6f 72 20 6e 6f 77 2c 20 61 6c 6c 20 74 65 73 74  or now, all test
16490 20 64 61 74 61 62 61 73 65 73 20 75 73 65 64 20   databases used 
164a0 62 79 20 74 68 65 20 74 65 73 74 20 73 75 69 74  by the test suit
164b0 65 20 61 72 65 20 70 6c 61 63 65 64 0d 0a 20 20  e are placed..  
164c0 20 20 20 20 23 20 20 20 20 20 20 20 69 6e 74 6f      #       into
164d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 64 69   the database di
164e0 72 65 63 74 6f 72 79 2e 20 20 45 61 63 68 20 64  rectory.  Each d
164f0 61 74 61 62 61 73 65 20 61 6e 64 20 72 65 6c 61  atabase and rela
16500 74 65 64 20 66 69 6c 65 73 0d 0a 20 20 20 20 20  ted files..     
16510 20 23 20 20 20 20 20 20 20 75 73 65 64 20 62 79   #       used by
16520 20 61 20 74 65 73 74 20 73 68 6f 75 6c 64 20 62   a test should b
16530 65 20 63 6c 65 61 6e 65 64 20 75 70 20 62 79 20  e cleaned up by 
16540 74 68 61 74 20 74 65 73 74 20 75 73 69 6e 67 20  that test using 
16550 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  the..      #    
16560 20 20 20 22 63 6c 65 61 6e 75 70 44 62 22 20 70     "cleanupDb" p
16570 72 6f 63 65 64 75 72 65 2c 20 62 65 6c 6f 77 2e  rocedure, below.
16580 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
16590 20 69 66 20 7b 21 24 69 73 4d 65 6d 6f 72 79 20   if {!$isMemory 
165a0 26 26 20 24 71 75 61 6c 69 66 79 7d 20 74 68 65  && $qualify} the
165b0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74  n {..        set
165c0 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20   fileName [file 
165d0 6a 6f 69 6e 20 5b 67 65 74 44 61 74 61 62 61 73  join [getDatabas
165e0 65 44 69 72 65 63 74 6f 72 79 5d 20 5b 66 69 6c  eDirectory] [fil
165f0 65 20 74 61 69 6c 20 24 66 69 6c 65 4e 61 6d 65  e tail $fileName
16600 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ]]..      }.... 
16610 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
16620 4e 4f 54 45 3a 20 42 79 20 64 65 66 61 75 6c 74  NOTE: By default
16630 2c 20 64 65 6c 65 74 65 20 61 6e 79 20 70 72 65  , delete any pre
16640 2d 65 78 69 73 74 69 6e 67 20 64 61 74 61 62 61  -existing databa
16650 73 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  se with the same
16660 20 66 69 6c 65 0d 0a 20 20 20 20 20 20 23 20 20   file..      #  
16670 20 20 20 20 20 6e 61 6d 65 20 69 66 20 69 74 20       name if it 
16680 63 75 72 72 65 6e 74 6c 79 20 65 78 69 73 74 73  currently exists
16690 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
166a0 20 20 69 66 20 7b 21 24 69 73 4d 65 6d 6f 72 79    if {!$isMemory
166b0 20 26 26 20 24 64 65 6c 65 74 65 20 26 26 20 5b   && $delete && [
166c0 66 69 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c  file exists $fil
166d0 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a  eName]} then {..
166e0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
166f0 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d     # NOTE: Attem
16700 70 74 20 74 6f 20 64 65 6c 65 74 65 20 61 6e 79  pt to delete any
16710 20 70 72 65 2d 65 78 69 73 74 69 6e 67 20 64 61   pre-existing da
16720 74 61 62 61 73 65 20 77 69 74 68 20 74 68 65 20  tabase with the 
16730 73 61 6d 65 20 66 69 6c 65 0d 0a 20 20 20 20 20  same file..     
16740 20 20 20 23 20 20 20 20 20 20 20 6e 61 6d 65 2e     #       name.
16750 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
16760 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
16770 7b 66 69 6c 65 20 64 65 6c 65 74 65 20 24 66 69  {file delete $fi
16780 6c 65 4e 61 6d 65 7d 20 65 72 72 6f 72 5d 7d 20  leName} error]} 
16790 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
167a0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23    #..          #
167b0 20 4e 4f 54 45 3a 20 57 65 20 73 6f 6d 65 68 6f   NOTE: We someho
167c0 77 20 66 61 69 6c 65 64 20 74 6f 20 64 65 6c 65  w failed to dele
167d0 74 65 20 74 68 65 20 66 69 6c 65 2c 20 72 65 70  te the file, rep
167e0 6f 72 74 20 77 68 79 2e 0d 0a 20 20 20 20 20 20  ort why...      
167f0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
16800 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
16810 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
16820 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
16830 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
16840 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
16850 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52         "==== WAR
16860 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20  NING: failed to 
16870 64 65 6c 65 74 65 20 64 61 74 61 62 61 73 65 20  delete database 
16880 66 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e 61  file \"" $fileNa
16890 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  me \..          
168a0 20 20 20 20 20 20 22 5c 22 20 64 75 72 69 6e 67        "\" during
168b0 20 73 65 74 75 70 2c 20 65 72 72 6f 72 3a 20 22   setup, error: "
168c0 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d   \n\t $error \n]
168d0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
168e0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
168f0 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
16900 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 66 65      # NOTE: Refe
16910 72 20 74 6f 20 74 68 65 20 73 70 65 63 69 66 69  r to the specifi
16920 65 64 20 76 61 72 69 61 62 6c 65 20 28 65 2e 67  ed variable (e.g
16930 2e 20 22 64 62 22 29 20 69 6e 20 74 68 65 20 63  . "db") in the c
16940 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72 0d 0a 20  ontext of our.. 
16950 20 20 20 20 20 23 20 20 20 20 20 20 20 63 61 6c       #       cal
16960 6c 65 72 2e 20 20 54 68 65 20 68 61 6e 64 6c 65  ler.  The handle
16970 20 74 6f 20 74 68 65 20 6f 70 65 6e 65 64 20 64   to the opened d
16980 61 74 61 62 61 73 65 20 77 69 6c 6c 20 62 65 20  atabase will be 
16990 73 74 6f 72 65 64 20 74 68 65 72 65 2e 0d 0a 20  stored there... 
169a0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 75 70       #..      up
169b0 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65 20 64  var 1 $varName d
169c0 62 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  b....      #..  
169d0 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 74 61 72      # NOTE: Star
169e0 74 20 62 75 69 6c 64 69 6e 67 20 74 68 65 20 63  t building the c
169f0 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e 67  onnection string
16a00 2e 20 20 54 68 65 20 6f 6e 6c 79 20 72 65 71 75  .  The only requ
16a10 69 72 65 64 20 70 6f 72 74 69 6f 6e 0d 0a 20 20  ired portion..  
16a20 20 20 20 20 23 20 20 20 20 20 20 20 6f 66 20 74      #       of t
16a30 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74  he connection st
16a40 72 69 6e 67 20 69 73 20 74 68 65 20 64 61 74 61  ring is the data
16a50 20 73 6f 75 72 63 65 2c 20 77 68 69 63 68 20 63   source, which c
16a60 6f 6e 74 61 69 6e 73 20 74 68 65 0d 0a 20 20 20  ontains the..   
16a70 20 20 20 23 20 20 20 20 20 20 20 64 61 74 61 62     #       datab
16a80 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 69 74  ase file name it
16a90 73 65 6c 66 2e 20 20 49 66 20 6f 75 72 20 63 61  self.  If our ca
16aa0 6c 6c 65 72 20 77 61 6e 74 73 20 74 6f 20 75 73  ller wants to us
16ab0 65 20 61 20 55 52 49 20 61 73 0d 0a 20 20 20 20  e a URI as..    
16ac0 20 20 23 20 20 20 20 20 20 20 74 68 65 20 64 61    #       the da
16ad0 74 61 20 73 6f 75 72 63 65 2c 20 75 73 65 20 74  ta source, use t
16ae0 68 65 20 46 75 6c 6c 55 72 69 20 63 6f 6e 6e 65  he FullUri conne
16af0 63 74 69 6f 6e 20 73 74 72 69 6e 67 20 70 72 6f  ction string pro
16b00 70 65 72 74 79 20 74 6f 0d 0a 20 20 20 20 20 20  perty to..      
16b10 23 20 20 20 20 20 20 20 70 72 65 76 65 6e 74 20  #       prevent 
16b20 74 68 65 20 64 61 74 61 20 73 6f 75 72 63 65 20  the data source 
16b30 73 74 72 69 6e 67 20 66 72 6f 6d 20 62 65 69 6e  string from bein
16b40 67 20 6d 61 6e 67 6c 65 64 2e 0d 0a 20 20 20 20  g mangled...    
16b50 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 24    #..      if {$
16b60 75 72 69 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  uri} then {..   
16b70 20 20 20 20 20 73 65 74 20 63 6f 6e 6e 65 63 74       set connect
16b80 69 6f 6e 20 7b 46 75 6c 6c 55 72 69 3d 24 7b 66  ion {FullUri=${f
16b90 69 6c 65 4e 61 6d 65 7d 7d 0d 0a 20 20 20 20 20  ileName}}..     
16ba0 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
16bb0 20 20 20 73 65 74 20 63 6f 6e 6e 65 63 74 69 6f     set connectio
16bc0 6e 20 7b 44 61 74 61 20 53 6f 75 72 63 65 3d 24  n {Data Source=$
16bd0 7b 66 69 6c 65 4e 61 6d 65 7d 7d 0d 0a 20 20 20  {fileName}}..   
16be0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
16bf0 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53  .      # NOTE: S
16c00 69 6e 63 65 20 74 68 69 73 20 70 72 6f 63 65 64  ince this proced
16c10 75 72 65 20 68 61 73 20 6e 6f 20 73 70 65 63 69  ure has no speci
16c20 61 6c 20 6b 6e 6f 77 6c 65 64 67 65 20 6f 66 20  al knowledge of 
16c30 77 68 61 74 20 74 68 65 20 64 65 66 61 75 6c 74  what the default
16c40 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
16c50 73 65 74 74 69 6e 67 20 69 73 20 66 6f 72 20 74  setting is for t
16c60 68 65 20 54 6f 46 75 6c 6c 50 61 74 68 20 63 6f  he ToFullPath co
16c70 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e 67 20  nnection string 
16c80 70 72 6f 70 65 72 79 2c 20 61 6c 77 61 79 73 0d  propery, always.
16c90 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61  .      #       a
16ca0 64 64 20 74 68 65 20 76 61 6c 75 65 20 77 65 20  dd the value we 
16cb0 6b 6e 6f 77 20 61 62 6f 75 74 20 74 6f 20 74 68  know about to th
16cc0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72  e connection str
16cd0 69 6e 67 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ing...      #.. 
16ce0 20 20 20 20 20 61 70 70 65 6e 64 20 63 6f 6e 6e       append conn
16cf0 65 63 74 69 6f 6e 20 7b 3b 54 6f 46 75 6c 6c 50  ection {;ToFullP
16d00 61 74 68 3d 24 7b 71 75 61 6c 69 66 79 7d 7d 0d  ath=${qualify}}.
16d10 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
16d20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 6f 75 72    # NOTE: If our
16d30 20 63 61 6c 6c 65 72 20 73 70 65 63 69 66 69 65   caller specifie
16d40 64 20 61 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65  d a journal mode
16d50 2c 20 61 64 64 20 74 68 65 20 6e 65 63 65 73 73  , add the necess
16d60 61 72 79 20 70 6f 72 74 69 6f 6e 0d 0a 20 20 20  ary portion..   
16d70 20 20 20 23 20 20 20 20 20 20 20 6f 66 20 74 68     #       of th
16d80 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72  e connection str
16d90 69 6e 67 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20  ing now...      
16da0 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74  #..      if {[st
16db0 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 6d 6f 64  ring length $mod
16dc0 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  e] > 0} then {..
16dd0 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 20 63          append c
16de0 6f 6e 6e 65 63 74 69 6f 6e 20 7b 3b 4a 6f 75 72  onnection {;Jour
16df0 6e 61 6c 20 4d 6f 64 65 3d 24 7b 6d 6f 64 65 7d  nal Mode=${mode}
16e00 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  }..      }....  
16e10 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
16e20 4f 54 45 3a 20 49 66 20 6f 75 72 20 63 61 6c 6c  OTE: If our call
16e30 65 72 20 73 70 65 63 69 66 69 65 64 20 61 20 44  er specified a D
16e40 61 74 65 54 69 6d 65 20 66 6f 72 6d 61 74 2c 20  ateTime format, 
16e50 61 64 64 20 74 68 65 20 6e 65 63 65 73 73 61 72  add the necessar
16e60 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  y..      #      
16e70 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20   portion of the 
16e80 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e  connection strin
16e90 67 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 23 0d  g now...      #.
16ea0 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69  .      if {[stri
16eb0 6e 67 20 6c 65 6e 67 74 68 20 24 64 61 74 65 54  ng length $dateT
16ec0 69 6d 65 46 6f 72 6d 61 74 5d 20 3e 20 30 7d 20  imeFormat] > 0} 
16ed0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
16ee0 61 70 70 65 6e 64 20 63 6f 6e 6e 65 63 74 69 6f  append connectio
16ef0 6e 20 7b 3b 44 61 74 65 54 69 6d 65 46 6f 72 6d  n {;DateTimeForm
16f00 61 74 3d 24 7b 64 61 74 65 54 69 6d 65 46 6f 72  at=${dateTimeFor
16f10 6d 61 74 7d 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a  mat}}..      }..
16f20 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
16f30 20 23 20 4e 4f 54 45 3a 20 49 66 20 6f 75 72 20   # NOTE: If our 
16f40 63 61 6c 6c 65 72 20 73 70 65 63 69 66 69 65 64  caller specified
16f50 20 61 20 44 61 74 65 54 69 6d 65 4b 69 6e 64 2c   a DateTimeKind,
16f60 20 61 64 64 20 74 68 65 20 6e 65 63 65 73 73 61   add the necessa
16f70 72 79 20 70 6f 72 74 69 6f 6e 0d 0a 20 20 20 20  ry portion..    
16f80 20 20 23 20 20 20 20 20 20 20 6f 66 20 74 68 65    #       of the
16f90 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69   connection stri
16fa0 6e 67 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 23  ng now...      #
16fb0 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72  ..      if {[str
16fc0 69 6e 67 20 6c 65 6e 67 74 68 20 24 64 61 74 65  ing length $date
16fd0 54 69 6d 65 4b 69 6e 64 5d 20 3e 20 30 7d 20 74  TimeKind] > 0} t
16fe0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 61  hen {..        a
16ff0 70 70 65 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e  ppend connection
17000 20 7b 3b 44 61 74 65 54 69 6d 65 4b 69 6e 64 3d   {;DateTimeKind=
17010 24 7b 64 61 74 65 54 69 6d 65 4b 69 6e 64 7d 7d  ${dateTimeKind}}
17020 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
17030 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
17040 54 45 3a 20 46 69 67 75 72 65 20 6f 75 74 20 77  TE: Figure out w
17050 68 61 74 20 74 68 65 20 66 69 6e 61 6c 20 66 6c  hat the final fl
17060 61 67 73 20 66 6f 72 20 74 68 69 73 20 63 6f 6e  ags for this con
17070 6e 65 63 74 69 6f 6e 20 6e 65 65 64 20 74 6f 20  nection need to 
17080 62 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  be...      #..  
17090 20 20 20 20 73 65 74 20 66 6c 61 67 73 20 5b 67      set flags [g
170a0 65 74 43 6f 6e 6e 65 63 74 69 6f 6e 46 6c 61 67  etConnectionFlag
170b0 73 20 24 66 69 6c 65 4e 61 6d 65 20 24 66 6c 61  s $fileName $fla
170c0 67 73 20 24 71 75 69 65 74 5d 0d 0a 0d 0a 20 20  gs $quiet]....  
170d0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
170e0 4f 54 45 3a 20 49 66 20 6f 75 72 20 63 61 6c 6c  OTE: If our call
170f0 65 72 20 73 70 65 63 69 66 69 65 64 20 73 6f 6d  er specified som
17100 65 20 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69  e SQLiteConnecti
17110 6f 6e 46 6c 61 67 73 2c 20 61 64 64 20 74 68 65  onFlags, add the
17120 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
17130 6e 65 63 65 73 73 61 72 79 20 70 6f 72 74 69 6f  necessary portio
17140 6e 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74  n of the connect
17150 69 6f 6e 20 73 74 72 69 6e 67 20 6e 6f 77 2e 0d  ion string now..
17160 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
17170 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
17180 74 68 20 24 66 6c 61 67 73 5d 20 3e 20 30 7d 20  th $flags] > 0} 
17190 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
171a0 61 70 70 65 6e 64 20 63 6f 6e 6e 65 63 74 69 6f  append connectio
171b0 6e 20 7b 3b 46 6c 61 67 73 3d 24 7b 66 6c 61 67  n {;Flags=${flag
171c0 73 7d 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  s}}..      }....
171d0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
171e0 20 4e 4f 54 45 3a 20 49 66 20 6f 75 72 20 63 61   NOTE: If our ca
171f0 6c 6c 65 72 20 73 70 65 63 69 66 69 65 64 20 61  ller specified a
17200 6e 20 65 78 74 72 61 20 70 61 79 6c 6f 61 64 20  n extra payload 
17210 74 6f 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  to the connectio
17220 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  n..      #      
17230 20 73 74 72 69 6e 67 2c 20 61 70 70 65 6e 64 20   string, append 
17240 69 74 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 23  it now...      #
17250 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72  ..      if {[str
17260 69 6e 67 20 6c 65 6e 67 74 68 20 24 65 78 74 72  ing length $extr
17270 61 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  a] > 0} then {..
17280 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 20 63          append c
17290 6f 6e 6e 65 63 74 69 6f 6e 20 5c 3b 20 24 65 78  onnection \; $ex
172a0 74 72 61 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  tra..      }....
172b0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
172c0 20 4e 4f 54 45 3a 20 41 64 64 20 74 68 65 20 6e   NOTE: Add the n
172d0 61 6d 65 20 6f 66 20 74 68 65 20 63 75 72 72 65  ame of the curre
172e0 6e 74 20 74 65 73 74 20 66 69 6c 65 2c 20 69 66  nt test file, if
172f0 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 54 68 69   available.  Thi
17300 73 20 69 73 0d 0a 20 20 20 20 20 20 23 20 20 20  s is..      #   
17310 20 20 20 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f      only used fo
17320 72 20 64 65 62 75 67 67 69 6e 67 2e 0d 0a 20 20  r debugging...  
17330 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
17340 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
17350 74 65 73 74 5f 66 69 6c 65 5d 7d 20 74 68 65 6e  test_file]} then
17360 20 7b 0d 0a 20 20 20 20 20 20 20 20 61 70 70 65   {..        appe
17370 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 3b  nd connection {;
17380 54 65 73 74 46 69 6c 65 3d 24 7b 3a 3a 74 65 73  TestFile=${::tes
17390 74 5f 66 69 6c 65 7d 7d 0d 0a 20 20 20 20 20 20  t_file}}..      
173a0 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
173b0 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 64 64 20      # NOTE: Add 
173c0 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
173d0 63 75 72 72 65 6e 74 20 74 65 73 74 2c 20 69 66  current test, if
173e0 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 54 68 69   available.  Thi
173f0 73 20 69 73 20 6f 6e 6c 79 0d 0a 20 20 20 20 20  s is only..     
17400 20 23 20 20 20 20 20 20 20 75 73 65 64 20 66 6f   #       used fo
17410 72 20 64 65 62 75 67 67 69 6e 67 2e 0d 0a 20 20  r debugging...  
17420 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
17430 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
17440 65 61 67 6c 65 5f 74 65 73 74 73 28 43 75 72 72  eagle_tests(Curr
17450 65 6e 74 4e 61 6d 65 29 5d 7d 20 74 68 65 6e 20  entName)]} then 
17460 7b 0d 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e  {..        appen
17470 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 3b 54  d connection {;T
17480 65 73 74 4e 61 6d 65 3d 24 7b 3a 3a 65 61 67 6c  estName=${::eagl
17490 65 5f 74 65 73 74 73 28 43 75 72 72 65 6e 74 4e  e_tests(CurrentN
174a0 61 6d 65 29 7d 7d 0d 0a 20 20 20 20 20 20 7d 0d  ame)}}..      }.
174b0 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
174c0 20 20 23 20 4e 4f 54 45 3a 20 46 6f 72 20 63 6c    # NOTE: For cl
174d0 61 72 69 74 79 2c 20 61 70 70 65 6e 64 20 61 20  arity, append a 
174e0 66 69 6e 61 6c 20 73 65 6d 69 63 6f 6c 6f 6e 20  final semicolon 
174f0 74 6f 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  to the connectio
17500 6e 20 73 74 72 69 6e 67 2e 0d 0a 20 20 20 20 20  n string...     
17510 20 23 0d 0a 20 20 20 20 20 20 61 70 70 65 6e 64   #..      append
17520 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 5c 3b 0d 0a   connection \;..
17530 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
17540 20 23 20 4e 4f 54 45 3a 20 4f 70 65 6e 20 74 68   # NOTE: Open th
17550 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
17560 63 74 69 6f 6e 20 6e 6f 77 2c 20 70 6c 61 63 69  ction now, placi
17570 6e 67 20 74 68 65 20 6f 70 61 71 75 65 20 68 61  ng the opaque ha
17580 6e 64 6c 65 20 76 61 6c 75 65 0d 0a 20 20 20 20  ndle value..    
17590 20 20 23 20 20 20 20 20 20 20 69 6e 74 6f 20 74    #       into t
175a0 68 65 20 76 61 72 69 61 62 6c 65 20 73 70 65 63  he variable spec
175b0 69 66 69 65 64 20 62 79 20 6f 75 72 20 63 61 6c  ified by our cal
175c0 6c 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ler...      #.. 
175d0 20 20 20 20 20 73 65 74 20 64 62 20 5b 73 71 6c       set db [sql
175e0 20 6f 70 65 6e 20 2d 74 79 70 65 20 53 51 4c 69   open -type SQLi
175f0 74 65 20 5b 73 75 62 73 74 20 24 63 6f 6e 6e 65  te [subst $conne
17600 63 74 69 6f 6e 5d 5d 0d 0a 0d 0a 20 20 20 20 20  ction]]....     
17610 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
17620 3a 20 43 6f 6e 66 69 67 75 72 65 20 74 68 65 20  : Configure the 
17630 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74  temporary direct
17640 6f 72 79 20 66 6f 72 20 74 68 65 20 6e 65 77 6c  ory for the newl
17650 79 20 6f 70 65 6e 65 64 20 64 61 74 61 62 61 73  y opened databas
17660 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
17670 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6e 6f 77 20   connection now 
17680 75 6e 6c 65 73 73 20 6f 75 72 20 63 61 6c 6c 65  unless our calle
17690 72 20 66 6f 72 62 69 64 73 20 69 74 2e 0d 0a 20  r forbids it... 
176a0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
176b0 20 7b 24 74 65 6d 70 6f 72 61 72 79 20 26 26 20   {$temporary && 
176c0 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
176d0 6e 6f 28 73 65 74 54 65 6d 70 6f 72 61 72 79 44  no(setTemporaryD
176e0 69 72 65 63 74 6f 72 79 29 5d 7d 20 74 68 65 6e  irectory)]} then
176f0 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 71 6c 20   {..        sql 
17700 65 78 65 63 75 74 65 20 24 64 62 20 5b 61 70 70  execute $db [app
17710 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
17720 20 20 20 20 20 20 20 22 50 52 41 47 4d 41 20 74         "PRAGMA t
17730 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65 63 74  emp_store_direct
17740 6f 72 79 20 3d 20 5c 22 22 20 5b 67 65 74 54 65  ory = \"" [getTe
17750 6d 70 6f 72 61 72 79 44 69 72 65 63 74 6f 72 79  mporaryDirectory
17760 5d 20 5c 22 5c 3b 5d 0d 0a 20 20 20 20 20 20 7d  ] \"\;]..      }
17770 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
17780 20 20 20 23 20 4e 4f 54 45 3a 20 50 65 72 66 6f     # NOTE: Perfo
17790 72 6d 20 61 6e 79 20 65 78 74 72 61 20 70 65 72  rm any extra per
177a0 2d 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 65 74 75  -connection setu
177b0 70 20 66 6f 72 20 74 68 65 20 6e 65 77 6c 79 20  p for the newly 
177c0 6f 70 65 6e 65 64 0d 0a 20 20 20 20 20 20 23 20  opened..      # 
177d0 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 6e        database n
177e0 6f 77 20 75 6e 6c 65 73 73 20 6f 75 72 20 63 61  ow unless our ca
177f0 6c 6c 65 72 20 66 6f 72 62 69 64 73 20 69 74 2e  ller forbids it.
17800 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
17810 20 73 65 74 20 65 78 65 63 75 74 65 4f 6e 53 65   set executeOnSe
17820 74 75 70 20 5b 67 65 74 45 78 65 63 75 74 65 4f  tup [getExecuteO
17830 6e 53 65 74 75 70 5d 0d 0a 0d 0a 20 20 20 20 20  nSetup]....     
17840 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
17850 67 74 68 20 24 65 78 65 63 75 74 65 4f 6e 53 65  gth $executeOnSe
17860 74 75 70 5d 20 3e 20 30 20 26 26 20 5c 0d 0a 20  tup] > 0 && \.. 
17870 20 20 20 20 20 20 20 20 20 21 5b 69 6e 66 6f 20           ![info 
17880 65 78 69 73 74 73 20 3a 3a 6e 6f 28 65 78 65 63  exists ::no(exec
17890 75 74 65 4f 6e 53 65 74 75 70 29 5d 7d 20 74 68  uteOnSetup)]} th
178a0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
178b0 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
178c0 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 6d 61   This command ma
178d0 79 20 72 61 69 73 65 20 61 6e 20 65 72 72 6f 72  y raise an error
178e0 3b 20 69 66 20 73 6f 2c 20 74 68 61 74 20 69 73  ; if so, that is
178f0 20 66 69 6e 65 2c 20 61 73 0d 0a 20 20 20 20 20   fine, as..     
17900 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20 65     #       the e
17910 6e 63 6c 6f 73 69 6e 67 20 74 65 73 74 20 77 69  nclosing test wi
17920 6c 6c 20 74 68 65 6e 20 66 61 69 6c 2e 20 20 54  ll then fail.  T
17930 68 65 20 5b 73 75 62 73 74 5d 20 63 6f 6d 6d 61  he [subst] comma
17940 6e 64 20 69 73 0d 0a 20 20 20 20 20 20 20 20 23  nd is..        #
17950 20 20 20 20 20 20 20 75 73 65 64 20 6f 6e 20 74         used on t
17960 68 65 20 53 51 4c 20 69 6e 20 63 61 73 65 20 69  he SQL in case i
17970 74 20 6e 65 65 64 73 20 74 6f 20 72 65 66 65 72  t needs to refer
17980 20 74 6f 20 73 74 61 74 65 20 69 6e 20 6f 75 72   to state in our
17990 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
179a0 20 20 63 6f 6e 74 65 78 74 2e 0d 0a 20 20 20 20    context...    
179b0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73      #..        s
179c0 71 6c 20 65 78 65 63 75 74 65 20 24 64 62 20 5b  ql execute $db [
179d0 73 75 62 73 74 20 24 65 78 65 63 75 74 65 4f 6e  subst $executeOn
179e0 53 65 74 75 70 5d 0d 0a 20 20 20 20 20 20 7d 0d  Setup]..      }.
179f0 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
17a00 20 20 23 20 4e 4f 54 45 3a 20 41 6c 77 61 79 73    # NOTE: Always
17a10 20 72 65 74 75 72 6e 20 74 68 65 20 63 6f 6e 6e   return the conn
17a20 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20 75 70  ection handle up
17a30 6f 6e 20 73 75 63 63 65 73 73 2e 0d 0a 20 20 20  on success...   
17a40 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75     #..      retu
17a50 72 6e 20 24 64 62 0d 0a 20 20 20 20 7d 0d 0a 0c  rn $db..    }...
17a60 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 44 62  ..    proc getDb
17a70 43 6f 6e 6e 65 63 74 69 6f 6e 20 7b 20 7b 76 61  Connection { {va
17a80 72 4e 61 6d 65 20 64 62 7d 20 7d 20 7b 0d 0a 20  rName db} } {.. 
17a90 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
17aa0 4e 4f 54 45 3a 20 52 65 66 65 72 20 74 6f 20 74  NOTE: Refer to t
17ab0 68 65 20 73 70 65 63 69 66 69 65 64 20 76 61 72  he specified var
17ac0 69 61 62 6c 65 20 28 65 2e 67 2e 20 22 64 62 22  iable (e.g. "db"
17ad0 29 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 78 74  ) in the context
17ae0 20 6f 66 20 6f 75 72 0d 0a 20 20 20 20 20 20 23   of our..      #
17af0 20 20 20 20 20 20 20 63 61 6c 6c 65 72 2e 20 20         caller.  
17b00 54 68 65 20 68 61 6e 64 6c 65 20 74 6f 20 74 68  The handle to th
17b10 65 20 64 61 74 61 62 61 73 65 20 70 72 65 76 69  e database previ
17b20 6f 75 73 6c 79 20 6f 70 65 6e 65 64 20 76 69 61  ously opened via
17b30 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20   the..      #   
17b40 20 20 20 20 5b 73 65 74 75 70 44 62 5d 20 70 72      [setupDb] pr
17b50 6f 63 65 64 75 72 65 20 73 68 6f 75 6c 64 20 62  ocedure should b
17b60 65 20 73 74 6f 72 65 64 20 74 68 65 72 65 2e 0d  e stored there..
17b70 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
17b80 75 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65  upvar 1 $varName
17b90 20 64 62 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a   db....      #..
17ba0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68        # NOTE: Th
17bb0 69 73 20 72 65 74 75 72 6e 73 20 74 68 65 20 41  is returns the A
17bc0 44 4f 2e 4e 45 54 20 49 44 62 43 6f 6e 6e 65 63  DO.NET IDbConnec
17bd0 74 69 6f 6e 20 6f 62 6a 65 63 74 20 69 6e 73 74  tion object inst
17be0 61 6e 63 65 20 66 6f 72 20 74 68 65 0d 0a 20 20  ance for the..  
17bf0 20 20 20 20 23 20 20 20 20 20 20 20 73 70 65 63      #       spec
17c00 69 66 69 65 64 20 64 61 74 61 62 73 65 20 68 61  ified databse ha
17c10 6e 64 6c 65 2e 20 20 53 69 6e 63 65 20 67 65 74  ndle.  Since get
17c20 74 69 6e 67 20 74 68 69 73 20 6f 62 6a 65 63 74  ting this object
17c30 20 72 65 6c 69 65 73 20 75 70 6f 6e 0d 0a 20 20   relies upon..  
17c40 20 20 20 20 23 20 20 20 20 20 20 20 45 61 67 6c      #       Eagl
17c50 65 20 69 6e 74 65 72 6e 61 6c 73 2c 20 67 72 65  e internals, gre
17c60 61 74 20 63 61 72 65 20 73 68 6f 75 6c 64 20 62  at care should b
17c70 65 20 74 61 6b 65 6e 20 74 6f 20 61 76 6f 69 64  e taken to avoid
17c80 20 64 69 73 70 6f 73 69 6e 67 20 6f 66 0d 0a 20   disposing of.. 
17c90 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 69       #       thi
17ca0 73 20 6f 62 6a 65 63 74 20 6f 72 20 6f 74 68 65  s object or othe
17cb0 72 77 69 73 65 20 70 75 74 74 69 6e 67 20 69 74  rwise putting it
17cc0 20 69 6e 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64   into an invalid
17cd0 20 73 74 61 74 65 2e 0d 0a 20 20 20 20 20 20 23   state...      #
17ce0 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66  ..      if {[inf
17cf0 6f 20 65 78 69 73 74 73 20 64 62 5d 7d 20 74 68  o exists db]} th
17d00 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66  en {..        if
17d10 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
17d20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76        object inv
17d30 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50  oke -flags +NonP
17d40 75 62 6c 69 63 20 2d 6f 62 6a 65 63 74 66 6c 61  ublic -objectfla
17d50 67 73 20 2b 4e 6f 44 69 73 70 6f 73 65 20 2d 61  gs +NoDispose -a
17d60 6c 69 61 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  lias \..        
17d70 20 20 20 20 20 20 49 6e 74 65 72 70 72 65 74 65        Interprete
17d80 72 2e 47 65 74 41 63 74 69 76 65 2e 63 6f 6e 6e  r.GetActive.conn
17d90 65 63 74 69 6f 6e 73 20 49 74 65 6d 20 24 64 62  ections Item $db
17da0 0d 0a 20 20 20 20 20 20 20 20 7d 20 72 65 73 75  ..        } resu
17db0 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  lt] == 0} then {
17dc0 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
17dd0 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
17de0 20 53 75 63 63 65 73 73 2c 20 72 65 74 75 72 6e   Success, return
17df0 20 74 68 65 20 6f 70 61 71 75 65 20 6f 62 6a 65   the opaque obje
17e00 63 74 20 68 61 6e 64 6c 65 2e 0d 0a 20 20 20 20  ct handle...    
17e10 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
17e20 20 20 20 72 65 74 75 72 6e 20 24 72 65 73 75 6c     return $resul
17e30 74 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73  t..        } els
17e40 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23  e {..          #
17e50 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
17e60 54 45 3a 20 46 61 69 6c 75 72 65 2c 20 72 65 70  TE: Failure, rep
17e70 6f 72 74 20 77 68 79 2e 0d 0a 20 20 20 20 20 20  ort why...      
17e80 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
17e90 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
17ea0 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
17eb0 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
17ec0 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e      "==== WARNIN
17ed0 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 67 65 74  G: failed to get
17ee0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64   connection hand
17ef0 6c 65 20 66 6f 72 20 64 61 74 61 62 61 73 65 20  le for database 
17f00 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  \"" \..         
17f10 20 20 20 20 20 24 64 62 20 22 5c 22 2c 20 65 72       $db "\", er
17f20 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 72 65 73  ror: " \n\t $res
17f30 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ult \n]..       
17f40 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20   }..      }.... 
17f50 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
17f60 4e 4f 54 45 3a 20 46 61 69 6c 75 72 65 2c 20 72  NOTE: Failure, r
17f70 65 74 75 72 6e 20 61 6e 20 6f 62 76 69 6f 75 73  eturn an obvious
17f80 6c 79 20 69 6e 76 61 6c 69 64 20 6f 70 61 71 75  ly invalid opaqu
17f90 65 20 6f 62 6a 65 63 74 20 68 61 6e 64 6c 65 2e  e object handle.
17fa0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
17fb0 20 72 65 74 75 72 6e 20 22 22 0d 0a 20 20 20 20   return ""..    
17fc0 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 66  }.....    proc f
17fd0 72 65 65 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 20  reeDbConnection 
17fe0 7b 20 7b 76 61 72 4e 61 6d 65 20 63 6f 6e 6e 65  { {varName conne
17ff0 63 74 69 6f 6e 7d 20 7d 20 7b 0d 0a 20 20 20 20  ction} } {..    
18000 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
18010 45 3a 20 52 65 66 65 72 20 74 6f 20 74 68 65 20  E: Refer to the 
18020 73 70 65 63 69 66 69 65 64 20 76 61 72 69 61 62  specified variab
18030 6c 65 20 28 65 2e 67 2e 20 22 63 6f 6e 6e 65 63  le (e.g. "connec
18040 74 69 6f 6e 22 29 20 69 6e 20 74 68 65 0d 0a 20  tion") in the.. 
18050 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e       #       con
18060 74 65 78 74 20 6f 66 20 6f 75 72 20 63 61 6c 6c  text of our call
18070 65 72 2e 20 20 54 68 65 20 6f 70 61 71 75 65 20  er.  The opaque 
18080 6f 62 6a 65 63 74 20 68 61 6e 64 6c 65 20 66 6f  object handle fo
18090 72 20 61 6e 20 41 44 4f 2e 4e 45 54 0d 0a 20 20  r an ADO.NET..  
180a0 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e 6e      #       conn
180b0 65 63 74 69 6f 6e 20 70 72 65 76 69 6f 75 73 6c  ection previousl
180c0 79 20 72 65 74 75 72 6e 65 64 20 62 79 20 5b 67  y returned by [g
180d0 65 74 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 5d 20  etDbConnection] 
180e0 73 68 6f 75 6c 64 20 62 65 0d 0a 20 20 20 20 20  should be..     
180f0 20 23 20 20 20 20 20 20 20 73 74 6f 72 65 64 20   #       stored 
18100 74 68 65 72 65 2e 0d 0a 20 20 20 20 20 20 23 0d  there...      #.
18110 0a 20 20 20 20 20 20 75 70 76 61 72 20 31 20 24  .      upvar 1 $
18120 76 61 72 4e 61 6d 65 20 63 6f 6e 6e 65 63 74 69  varName connecti
18130 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20  on....      #.. 
18140 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74       # NOTE: Att
18150 65 6d 70 74 20 74 6f 20 72 65 6d 6f 76 65 20 74  empt to remove t
18160 68 65 20 6f 70 61 71 75 65 20 6f 62 6a 65 63 74  he opaque object
18170 20 68 61 6e 64 6c 65 20 66 72 6f 6d 20 74 68 65   handle from the
18180 20 69 6e 74 65 72 70 72 65 74 65 72 0d 0a 20 20   interpreter..  
18190 20 20 20 20 23 20 20 20 20 20 20 20 6e 6f 77 2e      #       now.
181a0 20 20 54 68 69 73 20 5b 6f 62 6a 65 63 74 20 64    This [object d
181b0 69 73 70 6f 73 65 5d 20 63 61 6c 6c 20 77 69 6c  ispose] call wil
181c0 6c 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 64  l not actually d
181d0 69 73 70 6f 73 65 20 6f 66 20 74 68 65 0d 0a 20  ispose of the.. 
181e0 20 20 20 20 20 23 20 20 20 20 20 20 20 75 6e 64       #       und
181f0 65 72 6c 79 69 6e 67 20 6f 62 6a 65 63 74 20 62  erlying object b
18200 65 63 61 75 73 65 20 74 68 65 20 2b 4e 6f 44 69  ecause the +NoDi
18210 73 70 6f 73 65 20 66 6c 61 67 20 77 61 73 20 73  spose flag was s
18220 65 74 20 6f 6e 20 69 74 0d 0a 20 20 20 20 20 20  et on it..      
18230 23 20 20 20 20 20 20 20 64 75 72 69 6e 67 20 63  #       during c
18240 72 65 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6f  reation of the o
18250 70 61 71 75 65 20 6f 62 6a 65 63 74 20 68 61 6e  paque object han
18260 64 6c 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  dle...      #.. 
18270 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65       if {[info e
18280 78 69 73 74 73 20 63 6f 6e 6e 65 63 74 69 6f 6e  xists connection
18290 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
182a0 20 20 5b 63 61 74 63 68 20 7b 6f 62 6a 65 63 74    [catch {object
182b0 20 64 69 73 70 6f 73 65 20 24 63 6f 6e 6e 65 63   dispose $connec
182c0 74 69 6f 6e 7d 20 65 72 72 6f 72 5d 7d 20 74 68  tion} error]} th
182d0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
182e0 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
182f0 20 57 65 20 73 6f 6d 65 68 6f 77 20 66 61 69 6c   We somehow fail
18300 65 64 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65  ed to remove the
18310 20 68 61 6e 64 6c 65 2c 20 72 65 70 6f 72 74 20   handle, report 
18320 77 68 79 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  why...        #.
18330 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
18340 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
18350 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
18360 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20            "==== 
18370 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20  WARNING: failed 
18380 74 6f 20 72 65 6d 6f 76 65 20 63 6f 6e 6e 65 63  to remove connec
18390 74 69 6f 6e 20 68 61 6e 64 6c 65 20 5c 22 22 20  tion handle \"" 
183a0 24 63 6f 6e 6e 65 63 74 69 6f 6e 20 5c 0d 0a 20  $connection \.. 
183b0 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c 20             "\", 
183c0 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65  error: " \n\t $e
183d0 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  rror \n]..      
183e0 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
183f0 20 70 72 6f 63 20 61 64 64 44 62 43 6f 6e 6e 65   proc addDbConne
18400 63 74 69 6f 6e 20 7b 20 63 6f 6e 6e 65 63 74 69  ction { connecti
18410 6f 6e 20 7b 76 61 72 4e 61 6d 65 20 64 62 7d 20  on {varName db} 
18420 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
18430 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 66 65      # NOTE: Refe
18440 72 20 74 6f 20 74 68 65 20 73 70 65 63 69 66 69  r to the specifi
18450 65 64 20 76 61 72 69 61 62 6c 65 20 28 65 2e 67  ed variable (e.g
18460 2e 20 22 64 62 22 29 20 69 6e 20 74 68 65 20 63  . "db") in the c
18470 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72 0d 0a 20  ontext of our.. 
18480 20 20 20 20 20 23 20 20 20 20 20 20 20 63 61 6c       #       cal
18490 6c 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ler...      #.. 
184a0 20 20 20 20 20 75 70 76 61 72 20 31 20 24 76 61       upvar 1 $va
184b0 72 4e 61 6d 65 20 64 62 0d 0a 0d 0a 20 20 20 20  rName db....    
184c0 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
184d0 45 3a 20 43 72 65 61 74 65 20 61 20 63 6f 72 72  E: Create a corr
184e0 65 63 74 6c 79 20 66 6f 72 6d 61 74 74 65 64 20  ectly formatted 
184f0 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 64 61 74  name for the dat
18500 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
18510 20 74 6f 0d 0a 20 20 20 20 20 20 23 20 20 20 20   to..      #    
18520 20 20 20 62 65 20 61 64 64 65 64 20 74 6f 20 74     be added to t
18530 68 65 20 6c 69 73 74 20 6d 61 6e 61 67 65 64 20  he list managed 
18540 62 79 20 74 68 65 20 45 61 67 6c 65 20 69 6e 74  by the Eagle int
18550 65 72 70 72 65 74 65 72 2e 0d 0a 20 20 20 20 20  erpreter...     
18560 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 64 62   #..      set db
18570 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20   [object invoke 
18580 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69  -flags +NonPubli
18590 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 45  c \..          E
185a0 61 67 6c 65 2e 5f 43 6f 6d 70 6f 6e 65 6e 74 73  agle._Components
185b0 2e 50 72 69 76 61 74 65 2e 46 6f 72 6d 61 74 4f  .Private.FormatO
185c0 70 73 20 44 61 74 61 62 61 73 65 4f 62 6a 65 63  ps DatabaseObjec
185d0 74 4e 61 6d 65 20 24 63 6f 6e 6e 65 63 74 69 6f  tName $connectio
185e0 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 53  n \..          S
185f0 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 20  QLiteConnection 
18600 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 49  [object invoke I
18610 6e 74 65 72 70 72 65 74 65 72 2e 47 65 74 41 63  nterpreter.GetAc
18620 74 69 76 65 20 4e 65 78 74 49 64 5d 5d 0d 0a 0d  tive NextId]]...
18630 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
18640 23 20 4e 4f 54 45 3a 20 41 64 64 20 74 68 65 20  # NOTE: Add the 
18650 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
18660 69 6f 6e 20 70 72 6f 76 69 64 65 64 20 62 79 20  ion provided by 
18670 6f 75 72 20 63 61 6c 6c 65 72 20 74 6f 20 74 68  our caller to th
18680 65 20 6c 69 73 74 0d 0a 20 20 20 20 20 20 23 20  e list..      # 
18690 20 20 20 20 20 20 6f 66 20 74 68 6f 73 65 20 6b        of those k
186a0 6e 6f 77 6e 20 74 6f 20 74 68 65 20 45 61 67 6c  nown to the Eagl
186b0 65 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a  e interpreter...
186c0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 6f        #..      o
186d0 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c  bject invoke -fl
186e0 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 49  ags +NonPublic I
186f0 6e 74 65 72 70 72 65 74 65 72 2e 47 65 74 41 63  nterpreter.GetAc
18700 74 69 76 65 2e 63 6f 6e 6e 65 63 74 69 6f 6e 73  tive.connections
18710 20 41 64 64 20 5c 0d 0a 20 20 20 20 20 20 20 20   Add \..        
18720 20 20 24 64 62 20 24 63 6f 6e 6e 65 63 74 69 6f    $db $connectio
18730 6e 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  n..    }.....   
18740 20 70 72 6f 63 20 72 65 6d 6f 76 65 44 62 54 72   proc removeDbTr
18750 61 6e 73 61 63 74 69 6f 6e 20 7b 20 74 72 61 6e  ansaction { tran
18760 73 61 63 74 69 6f 6e 20 7d 20 7b 0d 0a 20 20 20  saction } {..   
18770 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
18780 54 45 3a 20 52 65 6d 6f 76 65 20 74 68 65 20 64  TE: Remove the d
18790 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74  atabase transact
187a0 69 6f 6e 20 70 72 6f 76 69 64 65 64 20 62 79 20  ion provided by 
187b0 6f 75 72 20 63 61 6c 6c 65 72 20 66 72 6f 6d 20  our caller from 
187c0 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  the..      #    
187d0 20 20 20 6c 69 73 74 20 6f 66 20 74 68 6f 73 65     list of those
187e0 20 6b 6e 6f 77 6e 20 74 6f 20 74 68 65 20 45 61   known to the Ea
187f0 67 6c 65 20 69 6e 74 65 72 70 72 65 74 65 72 2e  gle interpreter.
18800 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
18810 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d   object invoke -
18820 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63  flags +NonPublic
18830 20 49 6e 74 65 72 70 72 65 74 65 72 2e 47 65 74   Interpreter.Get
18840 41 63 74 69 76 65 2e 74 72 61 6e 73 61 63 74 69  Active.transacti
18850 6f 6e 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ons \..         
18860 20 52 65 6d 6f 76 65 20 24 74 72 61 6e 73 61 63   Remove $transac
18870 74 69 6f 6e 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  tion..    }.....
18880 20 20 20 20 70 72 6f 63 20 67 65 74 52 6f 77 73      proc getRows
18890 46 72 6f 6d 44 61 74 61 54 61 62 6c 65 20 7b 20  FromDataTable { 
188a0 64 61 74 61 54 61 62 6c 65 20 7b 76 61 6c 75 65  dataTable {value
188b0 43 61 6c 6c 62 61 63 6b 20 22 22 7d 20 7d 20 7b  Callback ""} } {
188c0 0d 0a 20 20 20 20 20 20 73 65 74 20 72 6f 77 73  ..      set rows
188d0 20 5b 6c 69 73 74 5d 0d 0a 20 20 20 20 20 20 73   [list]..      s
188e0 65 74 20 63 6f 75 6e 74 20 5b 24 64 61 74 61 54  et count [$dataT
188f0 61 62 6c 65 20 43 6f 6c 75 6d 6e 73 2e 43 6f 75  able Columns.Cou
18900 6e 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 66 6f 72  nt]....      for
18910 20 7b 73 65 74 20 69 6e 64 65 78 20 30 7d 20 7b   {set index 0} {
18920 24 69 6e 64 65 78 20 3c 20 24 63 6f 75 6e 74 7d  $index < $count}
18930 20 7b 69 6e 63 72 20 69 6e 64 65 78 7d 20 7b 0d   {incr index} {.
18940 0a 20 20 20 20 20 20 20 20 73 65 74 20 64 61 74  .        set dat
18950 61 43 6f 6c 75 6d 6e 20 5b 24 64 61 74 61 54 61  aColumn [$dataTa
18960 62 6c 65 20 2d 61 6c 69 61 73 20 43 6f 6c 75 6d  ble -alias Colum
18970 6e 73 2e 67 65 74 5f 49 74 65 6d 20 24 69 6e 64  ns.get_Item $ind
18980 65 78 5d 0d 0a 20 20 20 20 20 20 20 20 73 65 74  ex]..        set
18990 20 6e 61 6d 65 73 28 24 69 6e 64 65 78 29 20 5b   names($index) [
189a0 24 64 61 74 61 43 6f 6c 75 6d 6e 20 43 6f 6c 75  $dataColumn Colu
189b0 6d 6e 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20 7d  mnName]..      }
189c0 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
189d0 20 20 20 23 20 4e 4f 54 45 3a 20 53 65 74 75 70     # NOTE: Setup
189e0 20 73 6f 6d 65 20 54 63 6c 20 72 65 74 75 72 6e   some Tcl return
189f0 20 63 6f 64 65 20 63 6f 6e 73 74 61 6e 74 73 2e   code constants.
18a00 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
18a10 20 73 65 74 20 4f 6b 20 30 3b 20 73 65 74 20 45   set Ok 0; set E
18a20 72 72 6f 72 20 31 3b 20 73 65 74 20 52 65 74 75  rror 1; set Retu
18a30 72 6e 20 32 3b 20 73 65 74 20 42 72 65 61 6b 20  rn 2; set Break 
18a40 33 3b 20 73 65 74 20 43 6f 6e 74 69 6e 75 65 20  3; set Continue 
18a50 34 0d 0a 0d 0a 20 20 20 20 20 20 6f 62 6a 65 63  4....      objec
18a60 74 20 66 6f 72 65 61 63 68 20 2d 61 6c 69 61 73  t foreach -alias
18a70 20 64 61 74 61 52 6f 77 20 5b 73 65 74 20 64 61   dataRow [set da
18a80 74 61 52 6f 77 73 20 5b 24 64 61 74 61 54 61 62  taRows [$dataTab
18a90 6c 65 20 52 6f 77 73 5d 5d 20 7b 0d 0a 20 20 20  le Rows]] {..   
18aa0 20 20 20 20 20 73 65 74 20 72 6f 77 20 5b 6c 69       set row [li
18ab0 73 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 66  st]....        f
18ac0 6f 72 20 7b 73 65 74 20 69 6e 64 65 78 20 30 7d  or {set index 0}
18ad0 20 7b 24 69 6e 64 65 78 20 3c 20 24 63 6f 75 6e   {$index < $coun
18ae0 74 7d 20 7b 69 6e 63 72 20 69 6e 64 65 78 7d 20  t} {incr index} 
18af0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  {..          set
18b00 20 76 61 6c 75 65 20 5b 24 64 61 74 61 52 6f 77   value [$dataRow
18b10 20 2d 63 72 65 61 74 65 20 2d 61 6c 69 61 73 20   -create -alias 
18b20 67 65 74 5f 49 74 65 6d 20 24 69 6e 64 65 78 5d  get_Item $index]
18b30 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66  ....          if
18b40 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   {[string length
18b50 20 24 76 61 6c 75 65 43 61 6c 6c 62 61 63 6b 5d   $valueCallback]
18b60 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
18b70 20 20 20 20 20 20 20 20 20 20 73 65 74 20 63 6f            set co
18b80 64 65 20 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  de [catch {..   
18b90 20 20 20 20 20 20 20 20 20 20 20 24 76 61 6c 75             $valu
18ba0 65 43 61 6c 6c 62 61 63 6b 20 24 64 61 74 61 54  eCallback $dataT
18bb0 61 62 6c 65 20 24 64 61 74 61 52 6f 77 20 24 69  able $dataRow $i
18bc0 6e 64 65 78 20 24 76 61 6c 75 65 0d 0a 20 20 20  ndex $value..   
18bd0 20 20 20 20 20 20 20 20 20 7d 20 6e 65 77 56 61           } newVa
18be0 6c 75 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  lue]....        
18bf0 20 20 20 20 69 66 20 7b 24 63 6f 64 65 20 3d 3d      if {$code ==
18c00 20 24 4f 6b 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   $Ok} then {..  
18c10 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
18c20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e               # N
18c30 4f 54 45 3a 20 55 73 65 20 74 68 65 20 73 70 65  OTE: Use the spe
18c40 63 69 66 69 65 64 20 28 6e 65 77 3f 29 20 72 6f  cified (new?) ro
18c50 77 20 76 61 6c 75 65 2e 0d 0a 20 20 20 20 20 20  w value...      
18c60 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
18c70 20 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64           lappend
18c80 20 72 6f 77 20 5b 6c 69 73 74 20 24 6e 61 6d 65   row [list $name
18c90 73 28 24 69 6e 64 65 78 29 20 24 6e 65 77 56 61  s($index) $newVa
18ca0 6c 75 65 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  lue]..          
18cb0 20 20 7d 20 65 6c 73 65 69 66 20 7b 24 63 6f 64    } elseif {$cod
18cc0 65 20 3d 3d 20 24 45 72 72 6f 72 7d 20 74 68 65  e == $Error} the
18cd0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
18ce0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
18cf0 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20      # NOTE: Use 
18d00 74 68 65 20 28 6e 65 77 3f 29 20 4e 55 4c 4c 20  the (new?) NULL 
18d10 72 6f 77 20 76 61 6c 75 65 2e 0d 0a 20 20 20 20  row value...    
18d20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
18d30 20 20 20 20 20 20 20 20 20 20 20 6c 61 70 70 65             lappe
18d40 6e 64 20 72 6f 77 20 5b 6c 69 73 74 20 24 6e 61  nd row [list $na
18d50 6d 65 73 28 24 69 6e 64 65 78 29 5d 0d 0a 20 20  mes($index)]..  
18d60 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
18d70 69 66 20 7b 24 63 6f 64 65 20 3d 3d 20 24 52 65  if {$code == $Re
18d80 74 75 72 6e 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  turn} then {..  
18d90 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
18da0 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e               # N
18db0 4f 54 45 3a 20 53 6b 69 70 20 72 65 6d 61 69 6e  OTE: Skip remain
18dc0 69 6e 67 20 76 61 6c 75 65 73 20 66 6f 72 20 74  ing values for t
18dd0 68 69 73 20 72 6f 77 2e 0d 0a 20 20 20 20 20 20  his row...      
18de0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
18df0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 0d 0a           break..
18e00 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c              } el
18e10 73 65 69 66 20 7b 24 63 6f 64 65 20 3d 3d 20 24  seif {$code == $
18e20 42 72 65 61 6b 7d 20 74 68 65 6e 20 7b 0d 0a 20  Break} then {.. 
18e30 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a               #..
18e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
18e50 4e 4f 54 45 3a 20 53 6b 69 70 20 70 72 6f 63 65  NOTE: Skip proce
18e60 73 73 69 6e 67 20 74 68 69 73 20 72 6f 77 20 76  ssing this row v
18e70 61 6c 75 65 2e 0d 0a 20 20 20 20 20 20 20 20 20  alue...         
18e80 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
18e90 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 24 63      } elseif {$c
18ea0 6f 64 65 20 3d 3d 20 24 43 6f 6e 74 69 6e 75 65  ode == $Continue
18eb0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
18ec0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
18ed0 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
18ee0 20 55 73 65 20 64 65 66 61 75 6c 74 20 72 6f 77   Use default row
18ef0 20 76 61 6c 75 65 20 68 61 6e 64 6c 69 6e 67 2e   value handling.
18f00 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
18f10 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  #..            }
18f20 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c  ..          } el
18f30 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
18f40 20 20 73 65 74 20 63 6f 64 65 20 24 43 6f 6e 74    set code $Cont
18f50 69 6e 75 65 0d 0a 20 20 20 20 20 20 20 20 20 20  inue..          
18f60 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69  }....          i
18f70 66 20 7b 24 63 6f 64 65 20 3d 3d 20 24 43 6f 6e  f {$code == $Con
18f80 74 69 6e 75 65 7d 20 74 68 65 6e 20 7b 0d 0a 20  tinue} then {.. 
18f90 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b             if {[
18fa0 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76  string length $v
18fb0 61 6c 75 65 5d 20 3e 20 30 20 26 26 20 5c 0d 0a  alue] > 0 && \..
18fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18fd0 21 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20  ![object invoke 
18fe0 43 6f 6e 76 65 72 74 20 49 73 44 42 4e 75 6c 6c  Convert IsDBNull
18ff0 20 24 76 61 6c 75 65 5d 7d 20 74 68 65 6e 20 7b   $value]} then {
19000 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
19010 6c 61 70 70 65 6e 64 20 72 6f 77 20 5b 6c 69 73  lappend row [lis
19020 74 20 24 6e 61 6d 65 73 28 24 69 6e 64 65 78 29  t $names($index)
19030 20 5b 24 76 61 6c 75 65 20 54 6f 53 74 72 69 6e   [$value ToStrin
19040 67 5d 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  g]]..           
19050 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
19060 20 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64           lappend
19070 20 72 6f 77 20 5b 6c 69 73 74 20 24 6e 61 6d 65   row [list $name
19080 73 28 24 69 6e 64 65 78 29 5d 0d 0a 20 20 20 20  s($index)]..    
19090 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
190a0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
190b0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 6c 61 70  }....        lap
190c0 70 65 6e 64 20 72 6f 77 73 20 24 72 6f 77 0d 0a  pend rows $row..
190d0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
190e0 20 72 65 74 75 72 6e 20 24 72 6f 77 73 0d 0a 20   return $rows.. 
190f0 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
19100 63 20 64 75 6d 70 52 6f 77 73 46 72 6f 6d 44 61  c dumpRowsFromDa
19110 74 61 54 61 62 6c 65 20 7b 20 63 68 61 6e 6e 65  taTable { channe
19120 6c 20 72 6f 77 73 20 7d 20 7b 0d 0a 20 20 20 20  l rows } {..    
19130 20 20 73 65 74 20 73 65 71 75 65 6e 63 65 20 31    set sequence 1
19140 0d 0a 0d 0a 20 20 20 20 20 20 66 6f 72 65 61 63  ....      foreac
19150 68 20 72 6f 77 20 24 72 6f 77 73 20 7b 0d 0a 20  h row $rows {.. 
19160 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
19170 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
19180 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
19190 20 5b 65 78 70 72 20 7b 24 73 65 71 75 65 6e 63   [expr {$sequenc
191a0 65 20 3e 20 31 20 3f 20 22 5c 6e 22 20 3a 20 22  e > 1 ? "\n" : "
191b0 22 7d 5d 20 22 2d 2d 2d 2d 20 52 4f 57 20 23 22  "}] "---- ROW #"
191c0 20 24 73 65 71 75 65 6e 63 65 20 3a 5c 6e 5d 0d   $sequence :\n].
191d0 0a 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61  ...        forea
191e0 63 68 20 70 61 69 72 20 24 72 6f 77 20 7b 0d 0a  ch pair $row {..
191f0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 6c            if {[l
19200 6c 65 6e 67 74 68 20 24 70 61 69 72 5d 20 3e 3d  length $pair] >=
19210 20 32 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   2} then {..    
19220 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
19230 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
19240 67 73 20 5c 74 20 5c 0d 0a 20 20 20 20 20 20 20  gs \t \..       
19250 20 20 20 20 20 20 20 20 20 5b 6c 69 73 74 20 5b           [list [
19260 6c 69 6e 64 65 78 20 24 70 61 69 72 20 30 5d 5d  lindex $pair 0]]
19270 20 22 3a 20 22 20 5b 6c 69 73 74 20 5b 6c 69 6e   ": " [list [lin
19280 64 65 78 20 24 70 61 69 72 20 31 5d 5d 20 5c 6e  dex $pair 1]] \n
19290 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65  ]..          } e
192a0 6c 73 65 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20  lseif {[llength 
192b0 24 70 61 69 72 5d 20 3d 3d 20 31 7d 20 74 68 65  $pair] == 1} the
192c0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
192d0 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
192e0 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 74 20 5c  [appendArgs \t \
192f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
19300 20 20 5b 6c 69 73 74 20 5b 6c 69 6e 64 65 78 20    [list [lindex 
19310 24 70 61 69 72 20 30 5d 5d 20 22 3a 20 3c 6e 75  $pair 0]] ": <nu
19320 6c 6c 3e 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20  ll>\n"]..       
19330 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
19340 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
19350 63 68 61 6e 6e 65 6c 20 5c 74 3c 65 6d 70 74 79  channel \t<empty
19360 3e 5c 6e 3b 20 23 20 4e 4f 54 45 3a 20 4e 6f 20  >\n; # NOTE: No 
19370 64 61 74 61 3f 0d 0a 20 20 20 20 20 20 20 20 20  data?..         
19380 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d   }..        }...
19390 0a 20 20 20 20 20 20 20 20 69 6e 63 72 20 73 65  .        incr se
193a0 71 75 65 6e 63 65 0d 0a 20 20 20 20 20 20 7d 0d  quence..      }.
193b0 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
193c0 72 6f 63 20 63 6c 65 61 6e 75 70 44 62 20 7b 20  roc cleanupDb { 
193d0 66 69 6c 65 4e 61 6d 65 20 7b 76 61 72 4e 61 6d  fileName {varNam
193e0 65 20 64 62 7d 20 7b 63 6f 6c 6c 65 63 74 20 74  e db} {collect t
193f0 72 75 65 7d 20 7b 71 75 61 6c 69 66 79 20 74 72  rue} {qualify tr
19400 75 65 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ue}..           
19410 20 20 20 20 20 20 20 20 20 20 7b 64 65 6c 65 74            {delet
19420 65 20 74 72 75 65 7d 20 7d 20 7b 0d 0a 20 20 20  e true} } {..   
19430 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
19440 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 66  TE: Attempt to f
19450 6f 72 63 65 20 61 6c 6c 20 70 65 6e 64 69 6e 67  orce all pending
19460 20 22 67 61 72 62 61 67 65 22 20 6f 62 6a 65 63   "garbage" objec
19470 74 73 20 74 6f 20 62 65 20 63 6f 6c 6c 65 63 74  ts to be collect
19480 65 64 2c 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ed,..      #    
19490 20 20 20 69 6e 63 6c 75 64 69 6e 67 20 53 51 4c     including SQL
194a0 69 74 65 20 73 74 61 74 65 6d 65 6e 74 73 20 61  ite statements a
194b0 6e 64 20 62 61 63 6b 75 70 20 6f 62 6a 65 63 74  nd backup object
194c0 73 3b 20 74 68 69 73 20 73 68 6f 75 6c 64 20 61  s; this should a
194d0 6c 6c 6f 77 0d 0a 20 20 20 20 20 20 23 20 20 20  llow..      #   
194e0 20 20 20 20 74 68 65 20 75 6e 64 65 72 6c 79 69      the underlyi
194f0 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ng database file
19500 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 2e 0d   to be deleted..
19510 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
19520 69 66 20 7b 24 63 6f 6c 6c 65 63 74 7d 20 74 68  if {$collect} th
19530 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 63 6f  en {..        co
19540 6c 6c 65 63 74 47 61 72 62 61 67 65 20 24 3a 3a  llectGarbage $::
19550 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 20 20  test_channel..  
19560 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
19570 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
19580 52 65 66 65 72 20 74 6f 20 74 68 65 20 73 70 65  Refer to the spe
19590 63 69 66 69 65 64 20 76 61 72 69 61 62 6c 65 20  cified variable 
195a0 28 65 2e 67 2e 20 22 64 62 22 29 20 69 6e 20 74  (e.g. "db") in t
195b0 68 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75  he context of ou
195c0 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  r..      #      
195d0 20 63 61 6c 6c 65 72 2e 20 20 54 68 65 20 68 61   caller.  The ha
195e0 6e 64 6c 65 20 74 6f 20 74 68 65 20 64 61 74 61  ndle to the data
195f0 62 61 73 65 20 70 72 65 76 69 6f 75 73 6c 79 20  base previously 
19600 6f 70 65 6e 65 64 20 76 69 61 20 74 68 65 0d 0a  opened via the..
19610 20 20 20 20 20 20 23 20 20 20 20 20 20 20 5b 73        #       [s
19620 65 74 75 70 44 62 5d 20 70 72 6f 63 65 64 75 72  etupDb] procedur
19630 65 20 73 68 6f 75 6c 64 20 62 65 20 73 74 6f 72  e should be stor
19640 65 64 20 74 68 65 72 65 2e 0d 0a 20 20 20 20 20  ed there...     
19650 20 23 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20   #..      upvar 
19660 31 20 24 76 61 72 4e 61 6d 65 20 64 62 0d 0a 0d  1 $varName db...
19670 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
19680 23 20 4e 4f 54 45 3a 20 43 6c 6f 73 65 20 74 68  # NOTE: Close th
19690 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  e connection to 
196a0 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 6f 77  the database now
196b0 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20 61  .  This should a
196c0 6c 6c 6f 77 20 75 73 0d 0a 20 20 20 20 20 20 23  llow us..      #
196d0 20 20 20 20 20 20 20 74 6f 20 64 65 6c 65 74 65         to delete
196e0 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
196f0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0d 0a  database file...
19700 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
19710 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
19720 64 62 5d 20 26 26 20 5b 63 61 74 63 68 20 7b 73  db] && [catch {s
19730 71 6c 20 63 6c 6f 73 65 20 24 64 62 7d 20 65 72  ql close $db} er
19740 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ror]} then {..  
19750 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
19760 20 23 20 4e 4f 54 45 3a 20 57 65 20 73 6f 6d 65   # NOTE: We some
19770 68 6f 77 20 66 61 69 6c 65 64 20 74 6f 20 63 6c  how failed to cl
19780 6f 73 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ose the database
19790 2c 20 72 65 70 6f 72 74 20 77 68 79 2e 0d 0a 20  , report why... 
197a0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
197b0 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
197c0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
197d0 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
197e0 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47     "==== WARNING
197f0 3a 20 66 61 69 6c 65 64 20 74 6f 20 63 6c 6f 73  : failed to clos
19800 65 20 64 61 74 61 62 61 73 65 20 5c 22 22 20 24  e database \"" $
19810 64 62 20 22 5c 22 2c 20 65 72 72 6f 72 3a 20 22  db "\", error: "
19820 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
19830 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d  \n\t $error \n].
19840 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
19850 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
19860 45 3a 20 46 69 72 73 74 2c 20 73 65 65 20 69 66  E: First, see if
19870 20 6f 75 72 20 63 61 6c 6c 65 72 20 68 61 73 20   our caller has 
19880 72 65 71 75 65 73 74 65 64 20 61 6e 20 69 6e 2d  requested an in-
19890 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e  memory database.
198a0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
198b0 20 73 65 74 20 69 73 4d 65 6d 6f 72 79 20 5b 69   set isMemory [i
198c0 73 4d 65 6d 6f 72 79 44 62 20 24 66 69 6c 65 4e  sMemoryDb $fileN
198d0 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d  ame]....      #.
198e0 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42  .      # NOTE: B
198f0 75 69 6c 64 20 74 68 65 20 66 75 6c 6c 20 70 61  uild the full pa
19900 74 68 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  th to the databa
19910 73 65 20 66 69 6c 65 20 6e 61 6d 65 2e 20 20 46  se file name.  F
19920 6f 72 20 6e 6f 77 2c 20 61 6c 6c 20 74 65 73 74  or now, all test
19930 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
19940 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 61  database files a
19950 72 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  re stored in the
19960 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63   temporary direc
19970 74 6f 72 79 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  tory...      #..
19980 20 20 20 20 20 20 69 66 20 7b 21 24 69 73 4d 65        if {!$isMe
19990 6d 6f 72 79 20 26 26 20 24 71 75 61 6c 69 66 79  mory && $qualify
199a0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
199b0 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b    set fileName [
199c0 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 44 61  file join [getDa
199d0 74 61 62 61 73 65 44 69 72 65 63 74 6f 72 79 5d  tabaseDirectory]
199e0 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69 6c   [file tail $fil
199f0 65 4e 61 6d 65 5d 5d 0d 0a 20 20 20 20 20 20 7d  eName]]..      }
19a00 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
19a10 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b     # NOTE: Check
19a20 20 69 66 20 74 68 65 20 66 69 6c 65 20 73 74 69   if the file sti
19a30 6c 6c 20 65 78 69 73 74 73 3b 20 69 6e 69 74 69  ll exists; initi
19a40 61 6c 6c 79 2c 20 61 73 73 75 6d 65 20 61 6c 6c  ally, assume all
19a50 20 66 69 6c 65 73 20 77 69 6c 6c 0d 0a 20 20 20   files will..   
19a60 20 20 20 23 20 20 20 20 20 20 20 62 65 20 64 65     #       be de
19a70 6c 65 74 65 64 20 73 75 63 63 65 73 73 66 75 6c  leted successful
19a80 6c 79 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79  ly, if necessary
19a90 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
19aa0 20 20 73 65 74 20 73 75 63 63 65 73 73 20 74 72    set success tr
19ab0 75 65 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b  ue....      if {
19ac0 21 24 69 73 4d 65 6d 6f 72 79 20 26 26 20 24 64  !$isMemory && $d
19ad0 65 6c 65 74 65 20 26 26 20 5b 66 69 6c 65 20 65  elete && [file e
19ae0 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d  xists $fileName]
19af0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
19b00 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
19b10 4f 54 45 3a 20 53 6b 69 70 20 64 65 6c 65 74 69  OTE: Skip deleti
19b20 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ng database file
19b30 73 20 69 66 20 73 6f 6d 65 62 6f 64 79 20 73 65  s if somebody se
19b40 74 73 20 74 68 65 20 67 6c 6f 62 61 6c 0d 0a 20  ts the global.. 
19b50 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 76         #       v
19b60 61 72 69 61 62 6c 65 20 74 6f 20 70 72 65 76 65  ariable to preve
19b70 6e 74 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20  nt it...        
19b80 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21  #..        if {!
19b90 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
19ba0 6f 28 63 6c 65 61 6e 75 70 44 62 46 69 6c 65 73  o(cleanupDbFiles
19bb0 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
19bc0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
19bd0 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d     # NOTE: Attem
19be0 70 74 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  pt to delete the
19bf0 20 74 65 73 74 20 57 41 4c 20 66 69 6c 65 2c 20   test WAL file, 
19c00 69 66 20 61 6e 79 2c 20 6e 6f 77 2e 0d 0a 20 20  if any, now...  
19c10 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
19c20 20 20 20 20 20 73 65 74 20 77 61 6c 46 69 6c 65       set walFile
19c30 4e 61 6d 65 20 5b 61 70 70 65 6e 64 41 72 67 73  Name [appendArgs
19c40 20 24 66 69 6c 65 4e 61 6d 65 20 2d 77 61 6c 5d   $fileName -wal]
19c50 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66  ....          if
19c60 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24   {[file exists $
19c70 77 61 6c 46 69 6c 65 4e 61 6d 65 5d 7d 20 74 68  walFileName]} th
19c80 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
19c90 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
19ca0 20 23 20 4e 4f 54 45 3a 20 49 66 20 74 68 65 72   # NOTE: If ther
19cb0 65 20 69 73 20 61 20 57 41 4c 20 66 69 6c 65 2c  e is a WAL file,
19cc0 20 69 74 20 73 68 6f 75 6c 64 20 62 65 20 7a 65   it should be ze
19cd0 72 6f 20 62 79 74 65 73 20 61 74 20 74 68 69 73  ro bytes at this
19ce0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20  ..            # 
19cf0 20 20 20 20 20 20 70 6f 69 6e 74 2e 0d 0a 20 20        point...  
19d00 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
19d10 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 65           if {[se
19d20 74 20 73 69 7a 65 20 5b 66 69 6c 65 20 73 69 7a  t size [file siz
19d30 65 20 24 77 61 6c 46 69 6c 65 4e 61 6d 65 5d 5d  e $walFileName]]
19d40 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
19d50 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a               #..
19d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
19d70 4e 4f 54 45 3a 20 57 65 20 73 6f 6d 65 68 6f 77  NOTE: We somehow
19d80 20 66 61 69 6c 65 64 20 74 6f 20 64 65 6c 65 74   failed to delet
19d90 65 20 74 68 65 20 57 41 4c 20 66 69 6c 65 2c 20  e the WAL file, 
19da0 72 65 70 6f 72 74 20 77 68 79 2e 0d 0a 20 20 20  report why...   
19db0 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
19dc0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
19dd0 5b 63 61 74 63 68 20 7b 66 69 6c 65 20 64 65 6c  [catch {file del
19de0 65 74 65 20 24 77 61 6c 46 69 6c 65 4e 61 6d 65  ete $walFileName
19df0 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b  } error]} then {
19e00 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
19e10 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
19e20 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
19e30 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
19e40 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d             "====
19e50 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64   WARNING: failed
19e60 20 74 6f 20 64 65 6c 65 74 65 20 57 41 4c 20 66   to delete WAL f
19e70 69 6c 65 20 5c 22 22 20 24 77 61 6c 46 69 6c 65  ile \"" $walFile
19e80 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  Name \..        
19e90 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 20              "\" 
19ea0 64 75 72 69 6e 67 20 63 6c 65 61 6e 75 70 2c 20  during cleanup, 
19eb0 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65  error: " \n\t $e
19ec0 72 72 6f 72 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20  rror \n]....    
19ed0 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
19ee0 73 75 63 63 65 73 73 20 66 61 6c 73 65 0d 0a 20  success false.. 
19ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
19f00 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c              } el
19f10 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
19f20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
19f30 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
19f40 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
19f50 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d             "====
19f60 20 57 41 52 4e 49 4e 47 3a 20 57 41 4c 20 66 69   WARNING: WAL fi
19f70 6c 65 20 5c 22 22 20 24 77 61 6c 46 69 6c 65 4e  le \"" $walFileN
19f80 61 6d 65 20 22 5c 22 20 69 73 20 22 20 24 73 69  ame "\" is " $si
19f90 7a 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ze \..          
19fa0 20 20 20 20 20 20 20 20 22 20 62 79 74 65 73 20          " bytes 
19fb0 69 6e 20 73 69 7a 65 2c 20 73 6b 69 70 70 69 6e  in size, skippin
19fc0 67 20 61 6c 6c 20 66 69 6c 65 20 64 65 6c 65 74  g all file delet
19fd0 69 6f 6e 73 2e 2e 2e 5c 6e 22 5d 0d 0a 0d 0a 20  ions...\n"].... 
19fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
19ff0 75 72 6e 20 31 3b 20 23 20 65 72 72 6f 72 0d 0a  urn 1; # error..
1a000 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
1a010 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
1a020 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1a030 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74       # NOTE: Att
1a040 65 6d 70 74 20 74 6f 20 64 65 6c 65 74 65 20 74  empt to delete t
1a050 68 65 20 74 65 73 74 20 53 48 4d 20 66 69 6c 65  he test SHM file
1a060 2c 20 69 66 20 61 6e 79 2c 20 6e 6f 77 2e 0d 0a  , if any, now...
1a070 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
1a080 20 20 20 20 20 20 20 73 65 74 20 73 68 6d 46 69         set shmFi
1a090 6c 65 4e 61 6d 65 20 5b 61 70 70 65 6e 64 41 72  leName [appendAr
1a0a0 67 73 20 24 66 69 6c 65 4e 61 6d 65 20 2d 73 68  gs $fileName -sh
1a0b0 6d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  m]....          
1a0c0 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73  if {[file exists
1a0d0 20 24 73 68 6d 46 69 6c 65 4e 61 6d 65 5d 20 26   $shmFileName] &
1a0e0 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  & \..           
1a0f0 20 20 20 5b 63 61 74 63 68 20 7b 66 69 6c 65 20     [catch {file 
1a100 64 65 6c 65 74 65 20 24 73 68 6d 46 69 6c 65 4e  delete $shmFileN
1a110 61 6d 65 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65  ame} error]} the
1a120 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
1a130 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
1a140 23 20 4e 4f 54 45 3a 20 57 65 20 73 6f 6d 65 68  # NOTE: We someh
1a150 6f 77 20 66 61 69 6c 65 64 20 74 6f 20 64 65 6c  ow failed to del
1a160 65 74 65 20 74 68 65 20 53 48 4d 20 66 69 6c 65  ete the SHM file
1a170 2c 20 72 65 70 6f 72 74 20 77 68 79 2e 0d 0a 20  , report why... 
1a180 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
1a190 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
1a1a0 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
1a1b0 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
1a1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1a1d0 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61  ==== WARNING: fa
1a1e0 69 6c 65 64 20 74 6f 20 64 65 6c 65 74 65 20 53  iled to delete S
1a1f0 48 4d 20 66 69 6c 65 20 5c 22 22 20 24 73 68 6d  HM file \"" $shm
1a200 46 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20  FileName \..    
1a210 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 20              "\" 
1a220 64 75 72 69 6e 67 20 63 6c 65 61 6e 75 70 2c 20  during cleanup, 
1a230 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65  error: " \n\t $e
1a240 72 72 6f 72 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20  rror \n]....    
1a250 20 20 20 20 20 20 20 20 73 65 74 20 73 75 63 63          set succ
1a260 65 73 73 20 66 61 6c 73 65 0d 0a 20 20 20 20 20  ess false..     
1a270 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
1a280 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
1a290 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74   # NOTE: Attempt
1a2a0 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 74   to delete the t
1a2b0 65 73 74 20 64 61 74 61 62 61 73 65 20 66 69 6c  est database fil
1a2c0 65 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20  e now...        
1a2d0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69    #..          i
1a2e0 66 20 7b 5b 63 61 74 63 68 20 7b 66 69 6c 65 20  f {[catch {file 
1a2f0 64 65 6c 65 74 65 20 24 66 69 6c 65 4e 61 6d 65  delete $fileName
1a300 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b  } error]} then {
1a310 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d  ..            #.
1a320 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e  .            # N
1a330 4f 54 45 3a 20 57 65 20 73 6f 6d 65 68 6f 77 20  OTE: We somehow 
1a340 66 61 69 6c 65 64 20 74 6f 20 64 65 6c 65 74 65  failed to delete
1a350 20 74 68 65 20 66 69 6c 65 2c 20 72 65 70 6f 72   the file, repor
1a360 74 20 77 68 79 2e 0d 0a 20 20 20 20 20 20 20 20  t why...        
1a370 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
1a380 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
1a390 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
1a3a0 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
1a3b0 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41          "==== WA
1a3c0 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f  RNING: failed to
1a3d0 20 64 65 6c 65 74 65 20 64 61 74 61 62 61 73 65   delete database
1a3e0 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e   file \"" $fileN
1a3f0 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ame \..         
1a400 20 20 20 20 20 20 20 22 5c 22 20 64 75 72 69 6e         "\" durin
1a410 67 20 63 6c 65 61 6e 75 70 2c 20 65 72 72 6f 72  g cleanup, error
1a420 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20  : " \n\t $error 
1a430 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  \n]....         
1a440 20 20 20 73 65 74 20 73 75 63 63 65 73 73 20 66     set success f
1a450 61 6c 73 65 0d 0a 20 20 20 20 20 20 20 20 20 20  alse..          
1a460 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73  }..        } els
1a470 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23  e {..          #
1a480 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
1a490 54 45 3a 20 53 68 6f 77 20 74 68 61 74 20 77 65  TE: Show that we
1a4a0 20 73 6b 69 70 70 65 64 20 64 65 6c 65 74 69 6e   skipped deletin
1a4b0 67 20 74 68 65 20 66 69 6c 65 2e 0d 0a 20 20 20  g the file...   
1a4c0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1a4d0 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
1a4e0 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
1a4f0 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
1a500 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52         "==== WAR
1a510 4e 49 4e 47 3a 20 73 6b 69 70 70 65 64 20 64 65  NING: skipped de
1a520 6c 65 74 69 6e 67 20 64 61 74 61 62 61 73 65 20  leting database 
1a530 66 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e 61  file \"" $fileNa
1a540 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  me \..          
1a550 20 20 20 20 22 5c 22 20 64 75 72 69 6e 67 20 63      "\" during c
1a560 6c 65 61 6e 75 70 5c 6e 22 5d 0d 0a 20 20 20 20  leanup\n"]..    
1a570 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
1a580 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b  ..      return [
1a590 65 78 70 72 20 7b 24 73 75 63 63 65 73 73 20 3f  expr {$success ?
1a5a0 20 30 20 3a 20 31 7d 5d 0d 0a 20 20 20 20 7d 0d   0 : 1}]..    }.
1a5b0 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 73 61 76  ....    proc sav
1a5c0 65 45 6e 76 69 72 6f 6e 6d 65 6e 74 56 61 72 69  eEnvironmentVari
1a5d0 61 62 6c 65 73 20 7b 20 6e 61 6d 65 73 20 7b 76  ables { names {v
1a5e0 61 72 4e 61 6d 65 20 22 22 7d 20 7d 20 7b 0d 0a  arName ""} } {..
1a5f0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
1a600 20 4e 4f 54 45 3a 20 46 6f 72 20 65 61 63 68 20   NOTE: For each 
1a610 6e 61 6d 65 2c 20 64 6f 65 73 20 74 68 65 20 6c  name, does the l
1a620 69 76 65 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20  ive environment 
1a630 76 61 72 69 61 62 6c 65 20 65 78 69 73 74 3f 20  variable exist? 
1a640 20 49 66 0d 0a 20 20 20 20 20 20 23 20 20 20 20   If..      #    
1a650 20 20 20 73 6f 2c 20 73 61 76 65 20 74 68 65 20     so, save the 
1a660 76 61 6c 75 65 20 66 6f 72 20 6c 61 74 65 72 3b  value for later;
1a670 20 6f 74 68 65 72 77 69 73 65 2c 20 6d 61 6b 65   otherwise, make
1a680 20 73 75 72 65 20 74 68 65 20 73 61 76 65 64 0d   sure the saved.
1a690 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 76  .      #       v
1a6a0 61 6c 75 65 20 64 6f 65 73 20 6e 6f 74 20 65 78  alue does not ex
1a6b0 69 73 74 20 65 69 74 68 65 72 2e 20 20 54 68 65  ist either.  The
1a6c0 20 6c 69 76 65 20 65 6e 76 69 72 6f 6e 6d 65 6e   live environmen
1a6d0 74 20 76 61 72 69 61 62 6c 65 73 0d 0a 20 20 20  t variables..   
1a6e0 20 20 20 23 20 20 20 20 20 20 20 41 52 45 20 4e     #       ARE N
1a6f0 4f 54 20 63 68 61 6e 67 65 64 20 62 79 20 74 68  OT changed by th
1a700 69 73 20 70 72 6f 63 65 64 75 72 65 2e 0d 0a 20  is procedure... 
1a710 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
1a720 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   {[string length
1a730 20 24 76 61 72 4e 61 6d 65 5d 20 3d 3d 20 30 7d   $varName] == 0}
1a740 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1a750 20 73 65 74 20 76 61 72 4e 61 6d 65 20 73 61 76   set varName sav
1a760 65 64 45 6e 76 0d 0a 20 20 20 20 20 20 7d 0d 0a  edEnv..      }..
1a770 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20 31 20  ..      upvar 1 
1a780 24 76 61 72 4e 61 6d 65 20 73 61 76 65 64 45 6e  $varName savedEn
1a790 76 0d 0a 0d 0a 20 20 20 20 20 20 66 6f 72 65 61  v....      forea
1a7a0 63 68 20 6e 61 6d 65 20 24 6e 61 6d 65 73 20 7b  ch name $names {
1a7b0 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69  ..        if {[i
1a7c0 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 65 6e 76  nfo exists ::env
1a7d0 28 24 6e 61 6d 65 29 5d 7d 20 74 68 65 6e 20 7b  ($name)]} then {
1a7e0 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
1a7f0 73 61 76 65 64 45 6e 76 28 24 6e 61 6d 65 29 20  savedEnv($name) 
1a800 24 3a 3a 65 6e 76 28 24 6e 61 6d 65 29 0d 0a 20  $::env($name).. 
1a810 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
1a820 0a 20 20 20 20 20 20 20 20 20 20 75 6e 73 65 74  .          unset
1a830 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 73 61 76   -nocomplain sav
1a840 65 64 45 6e 76 28 24 6e 61 6d 65 29 0d 0a 20 20  edEnv($name)..  
1a850 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
1a860 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
1a870 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20     # NOTE: This 
1a880 69 73 20 73 65 6c 66 2d 63 6c 65 61 6e 69 6e 67  is self-cleaning
1a890 2e 20 20 49 66 20 6e 6f 20 73 61 76 65 64 20 65  .  If no saved e
1a8a0 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61  nvironment varia
1a8b0 62 6c 65 73 20 6e 6f 77 0d 0a 20 20 20 20 20 20  bles now..      
1a8c0 23 20 20 20 20 20 20 20 65 78 69 73 74 2c 20 72  #       exist, r
1a8d0 65 6d 6f 76 65 20 74 68 65 20 61 72 72 61 79 2e  emove the array.
1a8e0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
1a8f0 20 69 66 20 7b 5b 61 72 72 61 79 20 73 69 7a 65   if {[array size
1a900 20 73 61 76 65 64 45 6e 76 5d 20 3d 3d 20 30 7d   savedEnv] == 0}
1a910 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1a920 20 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61   unset -nocompla
1a930 69 6e 20 73 61 76 65 64 45 6e 76 0d 0a 20 20 20  in savedEnv..   
1a940 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
1a950 20 20 20 20 70 72 6f 63 20 72 65 73 74 6f 72 65      proc restore
1a960 45 6e 76 69 72 6f 6e 6d 65 6e 74 56 61 72 69 61  EnvironmentVaria
1a970 62 6c 65 73 20 7b 20 6e 61 6d 65 73 20 7b 76 61  bles { names {va
1a980 72 4e 61 6d 65 20 22 22 7d 20 7d 20 7b 0d 0a 20  rName ""} } {.. 
1a990 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
1a9a0 4e 4f 54 45 3a 20 46 6f 72 20 65 61 63 68 20 6e  NOTE: For each n
1a9b0 61 6d 65 2c 20 64 6f 65 73 20 74 68 65 20 73 61  ame, does the sa
1a9c0 76 65 64 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20  ved environment 
1a9d0 76 61 72 69 61 62 6c 65 20 65 78 69 73 74 3f 20  variable exist? 
1a9e0 20 49 66 0d 0a 20 20 20 20 20 20 23 20 20 20 20   If..      #    
1a9f0 20 20 20 73 6f 2c 20 72 65 73 74 6f 72 65 20 74     so, restore t
1aa00 68 65 20 73 61 76 65 64 20 76 61 6c 75 65 20 61  he saved value a
1aa10 6e 64 20 75 6e 73 65 74 20 69 74 3b 20 6f 74 68  nd unset it; oth
1aa20 65 72 77 69 73 65 2c 20 6d 61 6b 65 20 73 75 72  erwise, make sur
1aa30 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
1aa40 20 74 68 65 20 6c 69 76 65 20 65 6e 76 69 72 6f   the live enviro
1aa50 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 20 64  nment variable d
1aa60 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 20 65 69  oes not exist ei
1aa70 74 68 65 72 20 28 69 2e 65 2e 20 69 74 0d 0a 20  ther (i.e. it.. 
1aa80 20 20 20 20 20 23 20 20 20 20 20 20 20 77 61 73       #       was
1aa90 20 6e 6f 74 20 73 65 74 20 74 6f 20 62 65 67 69   not set to begi
1aaa0 6e 20 77 69 74 68 29 2e 20 20 42 6f 74 68 20 73  n with).  Both s
1aab0 61 76 65 64 20 61 6e 64 20 6c 69 76 65 20 65 6e  aved and live en
1aac0 76 69 72 6f 6e 6d 65 6e 74 0d 0a 20 20 20 20 20  vironment..     
1aad0 20 23 20 20 20 20 20 20 20 76 61 72 69 61 62 6c   #       variabl
1aae0 65 73 20 41 52 45 20 63 68 61 6e 67 65 64 20 62  es ARE changed b
1aaf0 79 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65  y this procedure
1ab00 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
1ab10 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
1ab20 6e 67 74 68 20 24 76 61 72 4e 61 6d 65 5d 20 3d  ngth $varName] =
1ab30 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
1ab40 20 20 20 20 20 73 65 74 20 76 61 72 4e 61 6d 65       set varName
1ab50 20 73 61 76 65 64 45 6e 76 0d 0a 20 20 20 20 20   savedEnv..     
1ab60 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 75 70 76 61   }....      upva
1ab70 72 20 31 20 24 76 61 72 4e 61 6d 65 20 73 61 76  r 1 $varName sav
1ab80 65 64 45 6e 76 0d 0a 0d 0a 20 20 20 20 20 20 66  edEnv....      f
1ab90 6f 72 65 61 63 68 20 6e 61 6d 65 20 24 6e 61 6d  oreach name $nam
1aba0 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66  es {..        if
1abb0 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 73   {[info exists s
1abc0 61 76 65 64 45 6e 76 28 24 6e 61 6d 65 29 5d 7d  avedEnv($name)]}
1abd0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1abe0 20 20 20 73 65 74 20 3a 3a 65 6e 76 28 24 6e 61     set ::env($na
1abf0 6d 65 29 20 24 73 61 76 65 64 45 6e 76 28 24 6e  me) $savedEnv($n
1ac00 61 6d 65 29 0d 0a 20 20 20 20 20 20 20 20 20 20  ame)..          
1ac10 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69  unset -nocomplai
1ac20 6e 20 73 61 76 65 64 45 6e 76 28 24 6e 61 6d 65  n savedEnv($name
1ac30 29 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73  )..        } els
1ac40 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 75  e {..          u
1ac50 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e  nset -nocomplain
1ac60 20 3a 3a 65 6e 76 28 24 6e 61 6d 65 29 0d 0a 20   ::env($name).. 
1ac70 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1ac80 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
1ac90 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73      # NOTE: This
1aca0 20 69 73 20 73 65 6c 66 2d 63 6c 65 61 6e 69 6e   is self-cleanin
1acb0 67 2e 20 20 49 66 20 6e 6f 20 73 61 76 65 64 20  g.  If no saved 
1acc0 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69  environment vari
1acd0 61 62 6c 65 73 20 6e 6f 77 0d 0a 20 20 20 20 20  ables now..     
1ace0 20 23 20 20 20 20 20 20 20 65 78 69 73 74 2c 20   #       exist, 
1acf0 72 65 6d 6f 76 65 20 74 68 65 20 61 72 72 61 79  remove the array
1ad00 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
1ad10 20 20 69 66 20 7b 5b 61 72 72 61 79 20 73 69 7a    if {[array siz
1ad20 65 20 73 61 76 65 64 45 6e 76 5d 20 3d 3d 20 30  e savedEnv] == 0
1ad30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1ad40 20 20 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c    unset -nocompl
1ad50 61 69 6e 20 73 61 76 65 64 45 6e 76 0d 0a 20 20  ain savedEnv..  
1ad60 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
1ad70 0a 20 20 20 20 70 72 6f 63 20 73 61 76 65 45 61  .    proc saveEa
1ad80 67 6c 65 53 68 65 6c 6c 45 6e 76 69 72 6f 6e 6d  gleShellEnvironm
1ad90 65 6e 74 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20  ent {} {..      
1ada0 75 70 76 61 72 20 31 20 73 61 76 65 64 45 6e 76  upvar 1 savedEnv
1adb0 20 73 61 76 65 64 45 6e 76 0d 0a 0d 0a 20 20 20   savedEnv....   
1adc0 20 20 20 73 61 76 65 45 6e 76 69 72 6f 6e 6d 65     saveEnvironme
1add0 6e 74 56 61 72 69 61 62 6c 65 73 20 5b 6c 69 73  ntVariables [lis
1ade0 74 20 4e 6f 4d 75 74 65 78 65 73 5d 20 73 61 76  t NoMutexes] sav
1adf0 65 64 45 6e 76 0d 0a 20 20 20 20 7d 0d 0a 0c 0d  edEnv..    }....
1ae00 0a 20 20 20 20 70 72 6f 63 20 72 65 73 74 6f 72  .    proc restor
1ae10 65 45 61 67 6c 65 53 68 65 6c 6c 45 6e 76 69 72  eEagleShellEnvir
1ae20 6f 6e 6d 65 6e 74 20 7b 7d 20 7b 0d 0a 20 20 20  onment {} {..   
1ae30 20 20 20 75 70 76 61 72 20 31 20 73 61 76 65 64     upvar 1 saved
1ae40 45 6e 76 20 73 61 76 65 64 45 6e 76 0d 0a 0d 0a  Env savedEnv....
1ae50 20 20 20 20 20 20 72 65 73 74 6f 72 65 45 6e 76        restoreEnv
1ae60 69 72 6f 6e 6d 65 6e 74 56 61 72 69 61 62 6c 65  ironmentVariable
1ae70 73 20 5b 6c 69 73 74 20 4e 6f 4d 75 74 65 78 65  s [list NoMutexe
1ae80 73 5d 20 73 61 76 65 64 45 6e 76 0d 0a 20 20 20  s] savedEnv..   
1ae90 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
1aea0 73 61 76 65 4d 64 61 43 6f 6e 66 69 67 45 6e 76  saveMdaConfigEnv
1aeb0 69 72 6f 6e 6d 65 6e 74 20 7b 7d 20 7b 0d 0a 20  ironment {} {.. 
1aec0 20 20 20 20 20 75 70 76 61 72 20 31 20 73 61 76       upvar 1 sav
1aed0 65 64 45 6e 76 20 73 61 76 65 64 45 6e 76 0d 0a  edEnv savedEnv..
1aee0 0d 0a 20 20 20 20 20 20 73 61 76 65 45 6e 76 69  ..      saveEnvi
1aef0 72 6f 6e 6d 65 6e 74 56 61 72 69 61 62 6c 65 73  ronmentVariables
1af00 20 5b 6c 69 73 74 20 43 4f 4d 50 4c 55 53 5f 4d   [list COMPLUS_M
1af10 44 41 5d 20 73 61 76 65 64 45 6e 76 0d 0a 20 20  DA] savedEnv..  
1af20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
1af30 20 72 65 73 74 6f 72 65 4d 64 61 43 6f 6e 66 69   restoreMdaConfi
1af40 67 45 6e 76 69 72 6f 6e 6d 65 6e 74 20 7b 7d 20  gEnvironment {} 
1af50 7b 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20 31  {..      upvar 1
1af60 20 73 61 76 65 64 45 6e 76 20 73 61 76 65 64 45   savedEnv savedE
1af70 6e 76 0d 0a 0d 0a 20 20 20 20 20 20 72 65 73 74  nv....      rest
1af80 6f 72 65 45 6e 76 69 72 6f 6e 6d 65 6e 74 56 61  oreEnvironmentVa
1af90 72 69 61 62 6c 65 73 20 5b 6c 69 73 74 20 43 4f  riables [list CO
1afa0 4d 50 4c 55 53 5f 4d 44 41 5d 20 73 61 76 65 64  MPLUS_MDA] saved
1afb0 45 6e 76 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20  Env..    }..... 
1afc0 20 20 20 70 72 6f 63 20 73 61 76 65 47 65 74 53     proc saveGetS
1afd0 65 74 74 69 6e 67 56 61 6c 75 65 45 6e 76 69 72  ettingValueEnvir
1afe0 6f 6e 6d 65 6e 74 20 7b 7d 20 7b 0d 0a 20 20 20  onment {} {..   
1aff0 20 20 20 75 70 76 61 72 20 31 20 73 61 76 65 64     upvar 1 saved
1b000 45 6e 76 20 73 61 76 65 64 45 6e 76 0d 0a 0d 0a  Env savedEnv....
1b010 20 20 20 20 20 20 73 61 76 65 45 6e 76 69 72 6f        saveEnviro
1b020 6e 6d 65 6e 74 56 61 72 69 61 62 6c 65 73 20 5b  nmentVariables [
1b030 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20  list \..        
1b040 20 20 4e 6f 5f 45 78 70 61 6e 64 20 4e 6f 5f 53    No_Expand No_S
1b050 51 4c 69 74 65 47 65 74 53 65 74 74 69 6e 67 56  QLiteGetSettingV
1b060 61 6c 75 65 20 4e 6f 5f 53 51 4c 69 74 65 58 6d  alue No_SQLiteXm
1b070 6c 43 6f 6e 66 69 67 46 69 6c 65 5d 20 5c 0d 0a  lConfigFile] \..
1b080 20 20 20 20 20 20 20 20 20 20 73 61 76 65 64 45            savedE
1b090 6e 76 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  nv..    }.....  
1b0a0 20 20 70 72 6f 63 20 72 65 73 74 6f 72 65 47 65    proc restoreGe
1b0b0 74 53 65 74 74 69 6e 67 56 61 6c 75 65 45 6e 76  tSettingValueEnv
1b0c0 69 72 6f 6e 6d 65 6e 74 20 7b 7d 20 7b 0d 0a 20  ironment {} {.. 
1b0d0 20 20 20 20 20 75 70 76 61 72 20 31 20 73 61 76       upvar 1 sav
1b0e0 65 64 45 6e 76 20 73 61 76 65 64 45 6e 76 0d 0a  edEnv savedEnv..
1b0f0 0d 0a 20 20 20 20 20 20 72 65 73 74 6f 72 65 45  ..      restoreE
1b100 6e 76 69 72 6f 6e 6d 65 6e 74 56 61 72 69 61 62  nvironmentVariab
1b110 6c 65 73 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20  les [list \..   
1b120 20 20 20 20 20 20 20 4e 6f 5f 45 78 70 61 6e 64         No_Expand
1b130 20 4e 6f 5f 53 51 4c 69 74 65 47 65 74 53 65 74   No_SQLiteGetSet
1b140 74 69 6e 67 56 61 6c 75 65 20 4e 6f 5f 53 51 4c  tingValue No_SQL
1b150 69 74 65 58 6d 6c 43 6f 6e 66 69 67 46 69 6c 65  iteXmlConfigFile
1b160 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 73  ] \..          s
1b170 61 76 65 64 45 6e 76 0d 0a 20 20 20 20 7d 0d 0a  avedEnv..    }..
1b180 0c 0d 0a 20 20 20 20 70 72 6f 63 20 73 61 76 65  ...    proc save
1b190 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e  SQLiteConnection
1b1a0 45 6e 76 69 72 6f 6e 6d 65 6e 74 20 7b 7d 20 7b  Environment {} {
1b1b0 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20 31 20  ..      upvar 1 
1b1c0 73 61 76 65 64 45 6e 76 20 73 61 76 65 64 45 6e  savedEnv savedEn
1b1d0 76 0d 0a 0d 0a 20 20 20 20 20 20 73 61 76 65 45  v....      saveE
1b1e0 6e 76 69 72 6f 6e 6d 65 6e 74 56 61 72 69 61 62  nvironmentVariab
1b1f0 6c 65 73 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20  les [list \..   
1b200 20 20 20 20 20 20 20 44 65 66 61 75 6c 74 46 6c         DefaultFl
1b210 61 67 73 5f 53 51 4c 69 74 65 43 6f 6e 6e 65 63  ags_SQLiteConnec
1b220 74 69 6f 6e 20 4e 6f 5f 53 51 4c 69 74 65 43 6f  tion No_SQLiteCo
1b230 6e 6e 65 63 74 69 6f 6e 4e 65 77 50 61 72 73 65  nnectionNewParse
1b240 72 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  r] \..          
1b250 73 61 76 65 64 45 6e 76 0d 0a 20 20 20 20 7d 0d  savedEnv..    }.
1b260 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 72 65 73  ....    proc res
1b270 74 6f 72 65 53 51 4c 69 74 65 43 6f 6e 6e 65 63  toreSQLiteConnec
1b280 74 69 6f 6e 45 6e 76 69 72 6f 6e 6d 65 6e 74 20  tionEnvironment 
1b290 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 75 70 76 61  {} {..      upva
1b2a0 72 20 31 20 73 61 76 65 64 45 6e 76 20 73 61 76  r 1 savedEnv sav
1b2b0 65 64 45 6e 76 0d 0a 0d 0a 20 20 20 20 20 20 72  edEnv....      r
1b2c0 65 73 74 6f 72 65 45 6e 76 69 72 6f 6e 6d 65 6e  estoreEnvironmen
1b2d0 74 56 61 72 69 61 62 6c 65 73 20 5b 6c 69 73 74  tVariables [list
1b2e0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 44 65   \..          De
1b2f0 66 61 75 6c 74 46 6c 61 67 73 5f 53 51 4c 69 74  faultFlags_SQLit
1b300 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 4e 6f 5f 53  eConnection No_S
1b310 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 4e  QLiteConnectionN
1b320 65 77 50 61 72 73 65 72 5d 20 5c 0d 0a 20 20 20  ewParser] \..   
1b330 20 20 20 20 20 20 20 73 61 76 65 64 45 6e 76 0d         savedEnv.
1b340 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
1b350 72 6f 63 20 73 61 76 65 53 51 4c 69 74 65 43 6f  roc saveSQLiteCo
1b360 6e 76 65 72 74 45 6e 76 69 72 6f 6e 6d 65 6e 74  nvertEnvironment
1b370 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 75 70 76   {} {..      upv
1b380 61 72 20 31 20 73 61 76 65 64 45 6e 76 20 73 61  ar 1 savedEnv sa
1b390 76 65 64 45 6e 76 0d 0a 0d 0a 20 20 20 20 20 20  vedEnv....      
1b3a0 73 61 76 65 45 6e 76 69 72 6f 6e 6d 65 6e 74 56  saveEnvironmentV
1b3b0 61 72 69 61 62 6c 65 73 20 5b 6c 69 73 74 20 5c  ariables [list \
1b3c0 0d 0a 20 20 20 20 20 20 20 20 20 20 55 73 65 5f  ..          Use_
1b3d0 53 51 4c 69 74 65 43 6f 6e 76 65 72 74 5f 44 65  SQLiteConvert_De
1b3e0 66 61 75 6c 74 44 62 54 79 70 65 20 55 73 65 5f  faultDbType Use_
1b3f0 53 51 4c 69 74 65 43 6f 6e 76 65 72 74 5f 44 65  SQLiteConvert_De
1b400 66 61 75 6c 74 54 79 70 65 4e 61 6d 65 5d 20 5c  faultTypeName] \
1b410 0d 0a 20 20 20 20 20 20 20 20 20 20 73 61 76 65  ..          save
1b420 64 45 6e 76 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  dEnv..    }.....
1b430 20 20 20 20 70 72 6f 63 20 72 65 73 74 6f 72 65      proc restore
1b440 53 51 4c 69 74 65 43 6f 6e 76 65 72 74 45 6e 76  SQLiteConvertEnv
1b450 69 72 6f 6e 6d 65 6e 74 20 7b 7d 20 7b 0d 0a 20  ironment {} {.. 
1b460 20 20 20 20 20 75 70 76 61 72 20 31 20 73 61 76       upvar 1 sav
1b470 65 64 45 6e 76 20 73 61 76 65 64 45 6e 76 0d 0a  edEnv savedEnv..
1b480 0d 0a 20 20 20 20 20 20 72 65 73 74 6f 72 65 45  ..      restoreE
1b490 6e 76 69 72 6f 6e 6d 65 6e 74 56 61 72 69 61 62  nvironmentVariab
1b4a0 6c 65 73 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20  les [list \..   
1b4b0 20 20 20 20 20 20 20 55 73 65 5f 53 51 4c 69 74         Use_SQLit
1b4c0 65 43 6f 6e 76 65 72 74 5f 44 65 66 61 75 6c 74  eConvert_Default
1b4d0 44 62 54 79 70 65 20 55 73 65 5f 53 51 4c 69 74  DbType Use_SQLit
1b4e0 65 43 6f 6e 76 65 72 74 5f 44 65 66 61 75 6c 74  eConvert_Default
1b4f0 54 79 70 65 4e 61 6d 65 5d 20 5c 0d 0a 20 20 20  TypeName] \..   
1b500 20 20 20 20 20 20 20 73 61 76 65 64 45 6e 76 0d         savedEnv.
1b510 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
1b520 72 6f 63 20 73 65 74 75 70 44 62 49 6e 74 65 72  roc setupDbInter
1b530 72 75 70 74 43 61 6c 6c 62 61 63 6b 20 7b 20 63  ruptCallback { c
1b540 68 61 6e 6e 65 6c 20 6c 6f 67 20 7d 20 7b 0d 0a  hannel log } {..
1b550 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
1b560 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 73 65 74 74 69  nnel "---- setti
1b570 6e 67 20 75 70 20 64 65 62 75 67 67 65 72 20 69  ng up debugger i
1b580 6e 74 65 72 72 75 70 74 20 63 61 6c 6c 62 61 63  nterrupt callbac
1b590 6b 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20  k... "....      
1b5a0 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20  if {[catch {..  
1b5b0 20 20 20 20 20 20 73 61 76 65 45 6e 76 69 72 6f        saveEnviro
1b5c0 6e 6d 65 6e 74 56 61 72 69 61 62 6c 65 73 20 5b  nmentVariables [
1b5d0 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20  list \..        
1b5e0 20 20 20 20 71 75 69 65 74 46 69 6e 64 49 6e 74      quietFindInt
1b5f0 65 72 70 72 65 74 65 72 54 65 73 74 50 61 74 68  erpreterTestPath
1b600 20 71 75 69 65 74 53 65 74 75 70 49 6e 74 65 72   quietSetupInter
1b610 70 72 65 74 65 72 54 65 73 74 50 61 74 68 5d 0d  preterTestPath].
1b620 0a 0d 0a 20 20 20 20 20 20 20 20 74 72 79 20 7b  ...        try {
1b630 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
1b640 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
1b650 20 50 72 65 76 65 6e 74 20 74 68 65 20 76 65 6e   Prevent the ven
1b660 64 6f 72 20 73 63 72 69 70 74 20 66 72 6f 6d 20  dor script from 
1b670 62 65 69 6e 67 20 6e 6f 69 73 79 20 77 68 65 6e  being noisy when
1b680 20 63 72 65 61 74 69 6e 67 0d 0a 20 20 20 20 20   creating..     
1b690 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
1b6a0 20 69 73 6f 6c 61 74 65 64 20 69 6e 74 65 72 70   isolated interp
1b6b0 72 65 74 65 72 2e 0d 0a 20 20 20 20 20 20 20 20  reter...        
1b6c0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73    #..          s
1b6d0 65 74 20 3a 3a 65 6e 76 28 71 75 69 65 74 46 69  et ::env(quietFi
1b6e0 6e 64 49 6e 74 65 72 70 72 65 74 65 72 54 65 73  ndInterpreterTes
1b6f0 74 50 61 74 68 29 20 31 0d 0a 20 20 20 20 20 20  tPath) 1..      
1b700 20 20 20 20 73 65 74 20 3a 3a 65 6e 76 28 71 75      set ::env(qu
1b710 69 65 74 53 65 74 75 70 49 6e 74 65 72 70 72 65  ietSetupInterpre
1b720 74 65 72 54 65 73 74 50 61 74 68 29 20 31 0d 0a  terTestPath) 1..
1b730 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
1b740 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
1b750 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73   Make sure the s
1b760 63 72 69 70 74 20 64 65 62 75 67 67 65 72 20 61  cript debugger a
1b770 6e 64 20 74 68 65 20 69 73 6f 6c 61 74 65 64 20  nd the isolated 
1b780 69 6e 74 65 72 70 72 65 74 65 72 0d 0a 20 20 20  interpreter..   
1b790 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61         #       a
1b7a0 72 65 20 73 65 74 75 70 20 61 6e 64 20 72 65 61  re setup and rea
1b7b0 64 79 20 66 6f 72 20 75 73 65 2e 0d 0a 20 20 20  dy for use...   
1b7c0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1b7d0 20 20 20 20 64 65 62 75 67 20 73 65 74 75 70 20      debug setup 
1b7e0 74 72 75 65 20 74 72 75 65 0d 0a 0d 0a 20 20 20  true true....   
1b7f0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1b800 20 20 20 20 23 20 4e 4f 54 45 3a 20 4c 6f 61 64      # NOTE: Load
1b810 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 70   the necessary p
1b820 61 63 6b 61 67 65 73 20 69 6e 74 6f 20 74 68 65  ackages into the
1b830 20 69 73 6f 6c 61 74 65 64 20 69 6e 74 65 72 70   isolated interp
1b840 72 65 74 65 72 2e 0d 0a 20 20 20 20 20 20 20 20  reter...        
1b850 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 64    #..          d
1b860 65 62 75 67 20 65 76 61 6c 20 7b 0d 0a 20 20 20  ebug eval {..   
1b870 20 20 20 20 20 20 20 20 20 70 61 63 6b 61 67 65           package
1b880 20 72 65 71 75 69 72 65 20 45 61 67 6c 65 0d 0a   require Eagle..
1b890 20 20 20 20 20 20 20 20 20 20 20 20 70 61 63 6b              pack
1b8a0 61 67 65 20 72 65 71 75 69 72 65 20 45 61 67 6c  age require Eagl
1b8b0 65 2e 4c 69 62 72 61 72 79 0d 0a 20 20 20 20 20  e.Library..     
1b8c0 20 20 20 20 20 20 20 70 61 63 6b 61 67 65 20 72         package r
1b8d0 65 71 75 69 72 65 20 45 61 67 6c 65 2e 54 65 73  equire Eagle.Tes
1b8e0 74 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  t..          }..
1b8f0 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
1b900 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
1b910 20 43 6f 70 79 20 74 68 65 20 6e 65 63 65 73 73   Copy the necess
1b920 61 72 79 20 76 61 72 69 61 62 6c 65 73 20 69 6e  ary variables in
1b930 74 6f 20 74 68 65 20 69 73 6f 6c 61 74 65 64 20  to the isolated 
1b940 69 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a 20 20  interpreter...  
1b950 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1b960 20 20 20 20 20 64 65 62 75 67 20 69 6e 76 6f 6b       debug invok
1b970 65 20 30 20 73 65 74 20 3a 3a 74 65 73 74 5f 63  e 0 set ::test_c
1b980 68 61 6e 6e 65 6c 20 24 63 68 61 6e 6e 65 6c 3b  hannel $channel;
1b990 20 23 20 4e 4f 54 45 3a 20 46 6f 72 20 5b 74 70   # NOTE: For [tp
1b9a0 75 74 73 5d 2e 0d 0a 20 20 20 20 20 20 20 20 20  uts]...         
1b9b0 20 64 65 62 75 67 20 69 6e 76 6f 6b 65 20 30 20   debug invoke 0 
1b9c0 73 65 74 20 3a 3a 74 65 73 74 5f 6c 6f 67 20 24  set ::test_log $
1b9d0 6c 6f 67 3b 20 23 20 4e 4f 54 45 3a 20 46 6f 72  log; # NOTE: For
1b9e0 20 5b 74 6c 6f 67 5d 2e 0d 0a 0d 0a 20 20 20 20   [tlog].....    
1b9f0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1ba00 20 20 20 23 20 4e 4f 54 45 3a 20 49 6e 73 74 61     # NOTE: Insta
1ba10 6c 6c 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20  ll the callback 
1ba20 73 63 72 69 70 74 20 74 6f 20 62 65 20 65 76 61  script to be eva
1ba30 6c 75 61 74 65 64 20 69 6e 20 74 68 65 20 69 73  luated in the is
1ba40 6f 6c 61 74 65 64 0d 0a 20 20 20 20 20 20 20 20  olated..        
1ba50 20 20 23 20 20 20 20 20 20 20 69 6e 74 65 72 70    #       interp
1ba60 72 65 74 65 72 20 77 68 65 6e 20 74 68 69 73 20  reter when this 
1ba70 69 6e 74 65 72 70 72 65 74 65 72 20 69 73 20 69  interpreter is i
1ba80 6e 74 65 72 72 75 70 74 65 64 20 62 79 20 73 63  nterrupted by sc
1ba90 72 69 70 74 0d 0a 20 20 20 20 20 20 20 20 20 20  ript..          
1baa0 23 20 20 20 20 20 20 20 63 61 6e 63 65 6c 6c 61  #       cancella
1bab0 74 69 6f 6e 2c 20 65 74 63 2e 0d 0a 20 20 20 20  tion, etc...    
1bac0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1bad0 20 20 20 64 65 62 75 67 20 63 61 6c 6c 62 61 63     debug callbac
1bae0 6b 20 61 70 70 6c 79 20 7b 7b 73 65 6e 64 65 72  k apply {{sender
1baf0 20 65 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20   e} {..         
1bb00 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
1bb10 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20    # NOTE: Check 
1bb20 69 66 20 74 68 69 73 20 64 65 62 75 67 67 65 72  if this debugger
1bb30 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 6f 6e 65   callback is one
1bb40 20 74 68 61 74 20 77 65 20 63 61 72 65 20 61 62   that we care ab
1bb50 6f 75 74 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  out...          
1bb60 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
1bb70 20 73 65 74 20 69 6e 74 65 72 72 75 70 74 54 79   set interruptTy
1bb80 70 65 73 20 5b 73 70 6c 69 74 20 5b 24 65 20 49  pes [split [$e I
1bb90 6e 74 65 72 72 75 70 74 54 79 70 65 5d 20 22 2c  nterruptType] ",
1bba0 20 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20   "]....         
1bbb0 20 20 20 69 66 20 7b 22 43 61 6e 63 65 6c 65 64     if {"Canceled
1bbc0 22 20 69 6e 20 24 69 6e 74 65 72 72 75 70 74 54  " in $interruptT
1bbd0 79 70 65 73 20 7c 7c 20 5c 0d 0a 20 20 20 20 20  ypes || \..     
1bbe0 20 20 20 20 20 20 20 20 20 20 20 22 55 6e 77 6f             "Unwo
1bbf0 75 6e 64 22 20 69 6e 20 24 69 6e 74 65 72 72 75  und" in $interru
1bc00 70 74 54 79 70 65 73 7d 20 74 68 65 6e 20 7b 0d  ptTypes} then {.
1bc10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
1bc20 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1bc30 23 20 4e 4f 54 45 3a 20 4d 61 6b 65 20 73 75 72  # NOTE: Make sur
1bc40 65 20 74 68 65 20 5b 6f 62 6a 65 63 74 5d 20 63  e the [object] c
1bc50 6f 6d 6d 61 6e 64 20 69 73 20 61 76 61 69 6c 61  ommand is availa
1bc60 62 6c 65 2e 20 20 53 69 6e 63 65 0d 0a 20 20 20  ble.  Since..   
1bc70 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20             #    
1bc80 20 20 20 74 68 69 73 20 69 73 20 61 6e 20 69 73     this is an is
1bc90 6f 6c 61 74 65 64 20 69 6e 74 65 72 70 72 65 74  olated interpret
1bca0 65 72 2c 20 63 68 65 63 6b 20 66 6f 72 20 69 74  er, check for it
1bcb0 20 74 68 65 20 68 61 72 64 0d 0a 20 20 20 20 20   the hard..     
1bcc0 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
1bcd0 20 77 61 79 2e 0d 0a 20 20 20 20 20 20 20 20 20   way...         
1bce0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1bcf0 20 20 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67        if {[lleng
1bd00 74 68 20 5b 69 6e 66 6f 20 63 6f 6d 6d 61 6e 64  th [info command
1bd10 73 20 6f 62 6a 65 63 74 5d 5d 20 3e 20 30 7d 20  s object]] > 0} 
1bd20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1bd30 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1bd40 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
1bd50 45 3a 20 49 74 65 72 61 74 65 20 74 68 72 6f 75  E: Iterate throu
1bd60 67 68 20 61 6c 6c 20 64 61 74 61 62 61 73 65 20  gh all database 
1bd70 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6b 6e 6f 77  connections know
1bd80 6e 20 74 6f 20 74 68 65 0d 0a 20 20 20 20 20 20  n to the..      
1bd90 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
1bda0 20 20 70 61 72 65 6e 74 20 69 6e 74 65 72 70 72    parent interpr
1bdb0 65 74 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 20  eter...         
1bdc0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1bdd0 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74            object
1bde0 20 66 6f 72 65 61 63 68 20 2d 61 6c 69 61 73 20   foreach -alias 
1bdf0 70 61 69 72 20 5b 6f 62 6a 65 63 74 20 69 6e 76  pair [object inv
1be00 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50  oke -flags +NonP
1be10 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20  ublic \..       
1be20 20 20 20 20 20 20 20 20 20 20 20 20 20 24 65 20               $e 
1be30 49 6e 74 65 72 70 72 65 74 65 72 2e 63 6f 6e 6e  Interpreter.conn
1be40 65 63 74 69 6f 6e 73 5d 20 7b 0d 0a 20 20 20 20  ections] {..    
1be50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
1be60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1be70 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d     # NOTE: Attem
1be80 70 74 20 74 6f 20 63 61 6e 63 65 6c 20 61 6e 79  pt to cancel any
1be90 20 53 51 4c 20 71 75 65 72 69 65 73 20 69 6e 20   SQL queries in 
1bea0 70 72 6f 67 72 65 73 73 20 6f 6e 0d 0a 20 20 20  progress on..   
1beb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
1bec0 20 20 20 20 20 20 20 74 68 69 73 20 64 61 74 61         this data
1bed0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
1bee0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1bef0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
1bf00 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61           if {[ca
1bf10 74 63 68 20 7b 24 70 61 69 72 20 56 61 6c 75 65  tch {$pair Value
1bf20 2e 43 61 6e 63 65 6c 7d 20 65 72 72 6f 72 5d 7d  .Cancel} error]}
1bf30 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1bf40 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
1bf50 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
1bf60 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
1bf70 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n \..           
1bf80 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d               "==
1bf90 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c  == WARNING: fail
1bfa0 65 64 20 74 6f 20 63 61 6e 63 65 6c 20 71 75 65  ed to cancel que
1bfb0 72 79 20 66 6f 72 20 22 20 5c 0d 0a 20 20 20 20  ry for " \..    
1bfc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bfd0 20 20 20 20 22 63 6f 6e 6e 65 63 74 69 6f 6e 20      "connection 
1bfe0 5c 22 22 20 5b 24 70 61 69 72 20 4b 65 79 5d 20  \"" [$pair Key] 
1bff0 22 5c 22 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e  "\", error: " \n
1c000 5c 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  \t \..          
1c010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24 65                $e
1c020 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  rror \n]..      
1c030 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
1c040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
1c050 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1c060 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
1c070 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
1c080 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
1c090 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 6e 20 5c  [appendArgs \n \
1c0a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1c0b0 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e        "==== WARN
1c0c0 49 4e 47 3a 20 63 61 6e 6e 6f 74 20 63 61 6e 63  ING: cannot canc
1c0d0 65 6c 20 61 6e 79 20 71 75 65 72 69 65 73 3a 20  el any queries: 
1c0e0 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
1c0f0 20 20 20 20 20 20 20 20 20 22 74 68 65 20 5c 22           "the \"
1c100 6f 62 6a 65 63 74 5c 22 20 63 6f 6d 6d 61 6e 64  object\" command
1c110 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c   is not availabl
1c120 65 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20  e\n"]..         
1c130 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
1c140 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
1c150 20 7d 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 66   }}..        } f
1c160 69 6e 61 6c 6c 79 20 7b 0d 0a 20 20 20 20 20 20  inally {..      
1c170 20 20 20 20 72 65 73 74 6f 72 65 45 6e 76 69 72      restoreEnvir
1c180 6f 6e 6d 65 6e 74 56 61 72 69 61 62 6c 65 73 20  onmentVariables 
1c190 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 20  [list \..       
1c1a0 20 20 20 20 20 20 20 71 75 69 65 74 46 69 6e 64         quietFind
1c1b0 49 6e 74 65 72 70 72 65 74 65 72 54 65 73 74 50  InterpreterTestP
1c1c0 61 74 68 20 71 75 69 65 74 53 65 74 75 70 49 6e  ath quietSetupIn
1c1d0 74 65 72 70 72 65 74 65 72 54 65 73 74 50 61 74  terpreterTestPat
1c1e0 68 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  h]..        }.. 
1c1f0 20 20 20 20 20 7d 20 65 72 72 6f 72 5d 20 3d 3d       } error] ==
1c200 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
1c210 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e      addConstrain
1c220 74 20 69 6e 74 65 72 72 75 70 74 43 61 6c 6c 62  t interruptCallb
1c230 61 63 6b 2e 73 71 6c 69 74 65 33 0d 0a 0d 0a 20  ack.sqlite3.... 
1c240 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
1c250 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20 20 20  annel yes\n..   
1c260 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
1c270 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
1c280 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
1c290 22 6e 6f 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e  "no, error: " \n
1c2a0 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20  \t $error \n].. 
1c2b0 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
1c2c0 0d 0a 20 20 20 20 70 72 6f 63 20 63 6c 65 61 6e  ..    proc clean
1c2d0 75 70 46 69 6c 65 20 7b 20 66 69 6c 65 4e 61 6d  upFile { fileNam
1c2e0 65 20 7b 63 6f 6c 6c 65 63 74 20 74 72 75 65 7d  e {collect true}
1c2f0 20 7b 66 6f 72 63 65 20 66 61 6c 73 65 7d 20 7d   {force false} }
1c300 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
1c310 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d     # NOTE: Attem
1c320 70 74 20 74 6f 20 66 6f 72 63 65 20 61 6c 6c 20  pt to force all 
1c330 70 65 6e 64 69 6e 67 20 22 67 61 72 62 61 67 65  pending "garbage
1c340 22 20 6f 62 6a 65 63 74 73 20 74 6f 20 62 65 20  " objects to be 
1c350 63 6f 6c 6c 65 63 74 65 64 2c 0d 0a 20 20 20 20  collected,..    
1c360 20 20 23 20 20 20 20 20 20 20 69 6e 63 6c 75 64    #       includ
1c370 69 6e 67 20 53 51 4c 69 74 65 20 73 74 61 74 65  ing SQLite state
1c380 6d 65 6e 74 73 20 61 6e 64 20 62 61 63 6b 75 70  ments and backup
1c390 20 6f 62 6a 65 63 74 73 3b 20 74 68 69 73 20 73   objects; this s
1c3a0 68 6f 75 6c 64 20 61 6c 6c 6f 77 0d 0a 20 20 20  hould allow..   
1c3b0 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20 75     #       the u
1c3c0 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61  nderlying databa
1c3d0 73 65 20 66 69 6c 65 20 74 6f 20 62 65 20 64 65  se file to be de
1c3e0 6c 65 74 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d  leted...      #.
1c3f0 0a 20 20 20 20 20 20 69 66 20 7b 24 63 6f 6c 6c  .      if {$coll
1c400 65 63 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ect} then {..   
1c410 20 20 20 20 20 63 6f 6c 6c 65 63 74 47 61 72 62       collectGarb
1c420 61 67 65 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  age $::test_chan
1c430 6e 65 6c 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  nel..      }....
1c440 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
1c450 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20   NOTE: Check if 
1c460 74 68 65 20 66 69 6c 65 20 73 74 69 6c 6c 20 65  the file still e
1c470 78 69 73 74 73 2e 0d 0a 20 20 20 20 20 20 23 0d  xists...      #.
1c480 0a 20 20 20 20 20 20 69 66 20 7b 5b 66 69 6c 65  .      if {[file
1c490 20 65 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d   exists $fileNam
1c4a0 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  e]} then {..    
1c4b0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
1c4c0 20 4e 4f 54 45 3a 20 53 6b 69 70 20 64 65 6c 65   NOTE: Skip dele
1c4d0 74 69 6e 67 20 74 65 73 74 20 66 69 6c 65 73 20  ting test files 
1c4e0 69 66 20 73 6f 6d 65 62 6f 64 79 20 73 65 74 73  if somebody sets
1c4f0 20 74 68 65 20 67 6c 6f 62 61 6c 20 76 61 72 69   the global vari
1c500 61 62 6c 65 0d 0a 20 20 20 20 20 20 20 20 23 20  able..        # 
1c510 20 20 20 20 20 20 74 6f 20 70 72 65 76 65 6e 74        to prevent
1c520 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d   it...        #.
1c530 0a 20 20 20 20 20 20 20 20 69 66 20 7b 24 66 6f  .        if {$fo
1c540 72 63 65 20 7c 7c 20 21 5b 69 6e 66 6f 20 65 78  rce || ![info ex
1c550 69 73 74 73 20 3a 3a 6e 6f 28 63 6c 65 61 6e 75  ists ::no(cleanu
1c560 70 46 69 6c 65 29 5d 7d 20 74 68 65 6e 20 7b 0d  pFile)]} then {.
1c570 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
1c580 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
1c590 41 74 74 65 6d 70 74 20 74 6f 20 64 65 6c 65 74  Attempt to delet
1c5a0 65 20 74 68 65 20 74 65 73 74 20 66 69 6c 65 20  e the test file 
1c5b0 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  now...          
1c5c0 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  #..          if 
1c5d0 7b 5b 73 65 74 20 63 6f 64 65 20 5b 63 61 74 63  {[set code [catc
1c5e0 68 20 7b 66 69 6c 65 20 64 65 6c 65 74 65 20 24  h {file delete $
1c5f0 66 69 6c 65 4e 61 6d 65 7d 20 65 72 72 6f 72 5d  fileName} error]
1c600 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
1c610 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1c620 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 65        # NOTE: We
1c630 20 73 6f 6d 65 68 6f 77 20 66 61 69 6c 65 64 20   somehow failed 
1c640 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 66 69  to delete the fi
1c650 6c 65 2c 20 72 65 70 6f 72 74 20 77 68 79 2e 0d  le, report why..
1c660 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a  .            #..
1c670 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
1c680 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
1c690 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
1c6a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1c6b0 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20   "==== WARNING: 
1c6c0 66 61 69 6c 65 64 20 74 6f 20 64 65 6c 65 74 65  failed to delete
1c6d0 20 74 65 73 74 20 66 69 6c 65 20 5c 22 22 20 24   test file \"" $
1c6e0 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20  fileName \..    
1c6f0 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 20              "\" 
1c700 64 75 72 69 6e 67 20 63 6c 65 61 6e 75 70 2c 20  during cleanup, 
1c710 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65  error: " \n\t $e
1c720 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  rror \n]..      
1c730 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
1c740 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
1c750 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
1c760 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20 74 68 61  # NOTE: Show tha
1c770 74 20 77 65 20 73 6b 69 70 70 65 64 20 64 65 6c  t we skipped del
1c780 65 74 69 6e 67 20 74 68 65 20 66 69 6c 65 2e 0d  eting the file..
1c790 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
1c7a0 20 20 20 20 20 20 20 20 73 65 74 20 63 6f 64 65          set code
1c7b0 20 30 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   0....          
1c7c0 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
1c7d0 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
1c7e0 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
1c7f0 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47     "==== WARNING
1c800 3a 20 73 6b 69 70 70 65 64 20 64 65 6c 65 74 69  : skipped deleti
1c810 6e 67 20 74 65 73 74 20 66 69 6c 65 20 5c 22 22  ng test file \""
1c820 20 24 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20   $fileName \..  
1c830 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 20              "\" 
1c840 64 75 72 69 6e 67 20 63 6c 65 61 6e 75 70 5c 6e  during cleanup\n
1c850 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  "]..        }.. 
1c860 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
1c870 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1c880 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 66 69    # NOTE: The fi
1c890 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  le does not exis
1c8a0 74 2c 20 73 75 63 63 65 73 73 21 0d 0a 20 20 20  t, success!..   
1c8b0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1c8c0 73 65 74 20 63 6f 64 65 20 30 0d 0a 20 20 20 20  set code 0..    
1c8d0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74    }....      ret
1c8e0 75 72 6e 20 24 63 6f 64 65 0d 0a 20 20 20 20 7d  urn $code..    }
1c8f0 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 6c  .....    proc cl
1c900 65 61 6e 75 70 4d 65 6d 6f 72 79 20 7b 20 76 61  eanupMemory { va
1c910 72 4e 61 6d 65 20 7b 71 75 69 65 74 20 66 61 6c  rName {quiet fal
1c920 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 69  se} } {..      i
1c930 66 20 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f 62  f {[haveSQLiteOb
1c940 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d 20 26 26 20  jectCommand] && 
1c950 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74  \..          [st
1c960 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 61 72  ring length $var
1c970 4e 61 6d 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20  Name] > 0} then 
1c980 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
1c990 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65        # NOTE: Re
1c9a0 66 65 72 20 74 6f 20 74 68 65 20 73 70 65 63 69  fer to the speci
1c9b0 66 69 65 64 20 76 61 72 69 61 62 6c 65 20 28 65  fied variable (e
1c9c0 2e 67 2e 20 22 63 6f 6e 6e 65 63 74 69 6f 6e 22  .g. "connection"
1c9d0 29 20 69 6e 20 74 68 65 0d 0a 20 20 20 20 20 20  ) in the..      
1c9e0 20 20 23 20 20 20 20 20 20 20 63 6f 6e 74 65 78    #       contex
1c9f0 74 20 6f 66 20 6f 75 72 20 63 61 6c 6c 65 72 2e  t of our caller.
1ca00 20 20 54 68 65 20 6f 70 61 71 75 65 20 6f 62 6a    The opaque obj
1ca10 65 63 74 20 68 61 6e 64 6c 65 20 66 6f 72 20 61  ect handle for a
1ca20 6e 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  n..        #    
1ca30 20 20 20 41 44 4f 2e 4e 45 54 20 63 6f 6e 6e 65     ADO.NET conne
1ca40 63 74 69 6f 6e 20 70 72 65 76 69 6f 75 73 6c 79  ction previously
1ca50 20 72 65 74 75 72 6e 65 64 20 62 79 20 5b 67 65   returned by [ge
1ca60 74 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 5d 0d 0a  tDbConnection]..
1ca70 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
1ca80 73 68 6f 75 6c 64 20 62 65 20 73 74 6f 72 65 64  should be stored
1ca90 20 74 68 65 72 65 2e 0d 0a 20 20 20 20 20 20 20   there...       
1caa0 20 23 0d 0a 20 20 20 20 20 20 20 20 75 70 76 61   #..        upva
1cab0 72 20 31 20 24 76 61 72 4e 61 6d 65 20 63 6f 6e  r 1 $varName con
1cac0 6e 65 63 74 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20  nection....     
1cad0 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d     if {[catch {.
1cae0 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63  .          objec
1caf0 74 20 69 6e 76 6f 6b 65 20 24 63 6f 6e 6e 65 63  t invoke $connec
1cb00 74 69 6f 6e 20 52 65 6c 65 61 73 65 4d 65 6d 6f  tion ReleaseMemo
1cb10 72 79 0d 0a 20 20 20 20 20 20 20 20 7d 20 72 65  ry..        } re
1cb20 73 75 6c 74 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  sult]} then {.. 
1cb30 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71           if {!$q
1cb40 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
1cb50 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
1cb60 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
1cb70 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
1cb80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1cb90 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61  ==== WARNING: fa
1cba0 69 6c 65 64 20 74 6f 20 72 65 6c 65 61 73 65 20  iled to release 
1cbb0 64 61 74 61 62 61 73 65 20 6d 65 6d 6f 72 79 2c  database memory,
1cbc0 20 65 72 72 6f 72 3a 20 22 20 5c 0d 0a 20 20 20   error: " \..   
1cbd0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 6e 5c               \n\
1cbe0 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20  t $result \n].. 
1cbf0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
1cc00 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
1cc10 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 6c 6c 65  ..      if {[lle
1cc20 6e 67 74 68 20 5b 69 6e 66 6f 20 63 6f 6d 6d 61  ngth [info comma
1cc30 6e 64 73 20 64 65 62 75 67 5d 5d 20 3e 20 30 7d  nds debug]] > 0}
1cc40 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1cc50 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
1cc60 20 20 20 20 20 20 20 20 20 75 70 6c 65 76 65 6c           uplevel
1cc70 20 31 20 5b 6c 69 73 74 20 64 65 62 75 67 20 70   1 [list debug p
1cc80 75 72 67 65 5d 0d 0a 20 20 20 20 20 20 20 20 7d  urge]..        }
1cc90 20 72 65 73 75 6c 74 5d 7d 20 74 68 65 6e 20 7b   result]} then {
1cca0 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
1ccb0 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
1ccc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
1ccd0 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
1cce0 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
1ccf0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1cd00 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a    "==== WARNING:
1cd10 20 66 61 69 6c 65 64 20 74 6f 20 70 75 72 67 65   failed to purge
1cd20 20 63 61 6c 6c 20 66 72 61 6d 65 2c 20 65 72 72   call frame, err
1cd30 6f 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20  or: " \..       
1cd40 20 20 20 20 20 20 20 20 20 5c 6e 5c 74 20 24 72           \n\t $r
1cd50 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20  esult \n]..     
1cd60 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
1cd70 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20  }....        if 
1cd80 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
1cd90 20 20 20 20 20 75 70 6c 65 76 65 6c 20 31 20 5b       uplevel 1 [
1cda0 6c 69 73 74 20 64 65 62 75 67 20 63 6c 65 61 6e  list debug clean
1cdb0 75 70 5d 0d 0a 20 20 20 20 20 20 20 20 7d 20 72  up]..        } r
1cdc0 65 73 75 6c 74 5d 7d 20 74 68 65 6e 20 7b 0d 0a  esult]} then {..
1cdd0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24            if {!$
1cde0 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
1cdf0 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
1ce00 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
1ce10 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
1ce20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce30 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66  "==== WARNING: f
1ce40 61 69 6c 65 64 20 74 6f 20 63 6c 65 61 6e 75 70  ailed to cleanup
1ce50 20 69 6e 74 65 72 70 72 65 74 65 72 2c 20 65 72   interpreter, er
1ce60 72 6f 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20  ror: " \..      
1ce70 20 20 20 20 20 20 20 20 20 20 5c 6e 5c 74 20 24            \n\t $
1ce80 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20  result \n]..    
1ce90 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
1cea0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66   }....        if
1ceb0 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
1cec0 20 20 20 20 20 20 75 70 6c 65 76 65 6c 20 31 20        uplevel 1 
1ced0 5b 6c 69 73 74 20 64 65 62 75 67 20 63 6f 6c 6c  [list debug coll
1cee0 65 63 74 5d 0d 0a 20 20 20 20 20 20 20 20 7d 20  ect]..        } 
1cef0 72 65 73 75 6c 74 5d 7d 20 74 68 65 6e 20 7b 0d  result]} then {.
1cf00 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21  .          if {!
1cf10 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
1cf20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
1cf30 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
1cf40 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
1cf50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1cf60 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20   "==== WARNING: 
1cf70 66 61 69 6c 65 64 20 74 6f 20 63 6f 6c 6c 65 63  failed to collec
1cf80 74 20 67 61 72 62 61 67 65 2c 20 65 72 72 6f 72  t garbage, error
1cf90 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  : " \..         
1cfa0 20 20 20 20 20 20 20 5c 6e 5c 74 20 24 72 65 73         \n\t $res
1cfb0 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ult \n]..       
1cfc0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
1cfd0 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
1cfe0 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 73 65 74  ....    proc set
1cff0 75 70 4d 65 6d 6f 72 79 43 6f 75 6e 74 65 72 73  upMemoryCounters
1d000 20 7b 20 76 61 72 4e 61 6d 65 20 7d 20 7b 0d 0a   { varName } {..
1d010 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65 53        if {[haveS
1d020 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61  QLiteObjectComma
1d030 6e 64 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  nd]} then {..   
1d040 20 20 20 20 20 75 70 76 61 72 20 31 20 24 76 61       upvar 1 $va
1d050 72 4e 61 6d 65 20 63 6f 75 6e 74 65 72 0d 0a 0d  rName counter...
1d060 0a 20 20 20 20 20 20 20 20 73 65 74 20 63 6f 75  .        set cou
1d070 6e 74 65 72 28 31 29 20 5b 6f 62 6a 65 63 74 20  nter(1) [object 
1d080 63 72 65 61 74 65 20 2d 61 6c 69 61 73 20 5c 0d  create -alias \.
1d090 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73  .            Sys
1d0a0 74 65 6d 2e 44 69 61 67 6e 6f 73 74 69 63 73 2e  tem.Diagnostics.
1d0b0 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74  PerformanceCount
1d0c0 65 72 20 50 72 6f 63 65 73 73 20 5c 0d 0a 20 20  er Process \..  
1d0d0 20 20 20 20 20 20 20 20 20 20 22 57 6f 72 6b 69            "Worki
1d0e0 6e 67 20 53 65 74 22 20 5b 66 69 6c 65 20 72 6f  ng Set" [file ro
1d0f0 6f 74 6e 61 6d 65 20 5b 66 69 6c 65 20 74 61 69  otname [file tai
1d100 6c 20 24 3a 3a 62 69 6e 5f 66 69 6c 65 5d 5d 5d  l $::bin_file]]]
1d110 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20  ....        set 
1d120 63 6f 75 6e 74 65 72 28 32 29 20 5b 6f 62 6a 65  counter(2) [obje
1d130 63 74 20 63 72 65 61 74 65 20 2d 61 6c 69 61 73  ct create -alias
1d140 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1d150 53 79 73 74 65 6d 2e 44 69 61 67 6e 6f 73 74 69  System.Diagnosti
1d160 63 73 2e 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f  cs.PerformanceCo
1d170 75 6e 74 65 72 20 50 72 6f 63 65 73 73 20 5c 0d  unter Process \.
1d180 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 57 6f  .            "Wo
1d190 72 6b 69 6e 67 20 53 65 74 20 50 65 61 6b 22 20  rking Set Peak" 
1d1a0 5b 66 69 6c 65 20 72 6f 6f 74 6e 61 6d 65 20 5b  [file rootname [
1d1b0 66 69 6c 65 20 74 61 69 6c 20 24 3a 3a 62 69 6e  file tail $::bin
1d1c0 5f 66 69 6c 65 5d 5d 5d 0d 0a 0d 0a 20 20 20 20  _file]]]....    
1d1d0 20 20 20 20 73 65 74 20 63 6f 75 6e 74 65 72 28      set counter(
1d1e0 33 29 20 5b 6f 62 6a 65 63 74 20 63 72 65 61 74  3) [object creat
1d1f0 65 20 2d 61 6c 69 61 73 20 5c 0d 0a 20 20 20 20  e -alias \..    
1d200 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44          System.D
1d210 69 61 67 6e 6f 73 74 69 63 73 2e 50 65 72 66 6f  iagnostics.Perfo
1d220 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72 20 50 72  rmanceCounter Pr
1d230 6f 63 65 73 73 20 5c 0d 0a 20 20 20 20 20 20 20  ocess \..       
1d240 20 20 20 20 20 22 50 72 69 76 61 74 65 20 42 79       "Private By
1d250 74 65 73 22 20 5b 66 69 6c 65 20 72 6f 6f 74 6e  tes" [file rootn
1d260 61 6d 65 20 5b 66 69 6c 65 20 74 61 69 6c 20 24  ame [file tail $
1d270 3a 3a 62 69 6e 5f 66 69 6c 65 5d 5d 5d 0d 0a 20  ::bin_file]]].. 
1d280 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
1d290 72 65 74 75 72 6e 20 22 22 0d 0a 20 20 20 20 7d  return ""..    }
1d2a0 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 72 65  .....    proc re
1d2b0 70 6f 72 74 4d 65 6d 6f 72 79 43 6f 75 6e 74 65  portMemoryCounte
1d2c0 72 73 20 7b 20 63 68 61 6e 6e 65 6c 20 76 61 72  rs { channel var
1d2d0 4e 61 6d 65 20 70 72 65 66 69 78 20 7d 20 7b 0d  Name prefix } {.
1d2e0 0a 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65  .      if {[have
1d2f0 53 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d  SQLiteObjectComm
1d300 61 6e 64 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  and]} then {..  
1d310 20 20 20 20 20 20 75 70 76 61 72 20 31 20 24 76        upvar 1 $v
1d320 61 72 4e 61 6d 65 20 63 6f 75 6e 74 65 72 0d 0a  arName counter..
1d330 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
1d340 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
1d350 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
1d360 20 20 20 20 22 2d 2d 2d 2d 20 22 20 24 70 72 65      "---- " $pre
1d370 66 69 78 20 22 20 63 6f 75 6e 74 65 72 20 5c 22  fix " counter \"
1d380 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
1d390 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20   [object invoke 
1d3a0 24 63 6f 75 6e 74 65 72 28 31 29 20 43 6f 75 6e  $counter(1) Coun
1d3b0 74 65 72 4e 61 6d 65 5d 20 22 5c 22 20 76 61 6c  terName] "\" val
1d3c0 75 65 20 69 73 20 22 20 5c 0d 0a 20 20 20 20 20  ue is " \..     
1d3d0 20 20 20 20 20 20 20 5b 6f 62 6a 65 63 74 20 69         [object i
1d3e0 6e 76 6f 6b 65 20 24 63 6f 75 6e 74 65 72 28 31  nvoke $counter(1
1d3f0 29 20 52 61 77 56 61 6c 75 65 5d 20 5c 6e 5d 0d  ) RawValue] \n].
1d400 0a 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  ...        tputs
1d410 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
1d420 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
1d430 20 20 20 20 20 22 2d 2d 2d 2d 20 22 20 24 70 72       "---- " $pr
1d440 65 66 69 78 20 22 20 63 6f 75 6e 74 65 72 20 5c  efix " counter \
1d450 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  "" \..          
1d460 20 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65    [object invoke
1d470 20 24 63 6f 75 6e 74 65 72 28 32 29 20 43 6f 75   $counter(2) Cou
1d480 6e 74 65 72 4e 61 6d 65 5d 20 22 5c 22 20 76 61  nterName] "\" va
1d490 6c 75 65 20 69 73 20 22 20 5c 0d 0a 20 20 20 20  lue is " \..    
1d4a0 20 20 20 20 20 20 20 20 5b 6f 62 6a 65 63 74 20          [object 
1d4b0 69 6e 76 6f 6b 65 20 24 63 6f 75 6e 74 65 72 28  invoke $counter(
1d4c0 32 29 20 52 61 77 56 61 6c 75 65 5d 20 5c 6e 5d  2) RawValue] \n]
1d4d0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74  ....        tput
1d4e0 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
1d4f0 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
1d500 20 20 20 20 20 20 22 2d 2d 2d 2d 20 22 20 24 70        "---- " $p
1d510 72 65 66 69 78 20 22 20 63 6f 75 6e 74 65 72 20  refix " counter 
1d520 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  \"" \..         
1d530 20 20 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b     [object invok
1d540 65 20 24 63 6f 75 6e 74 65 72 28 33 29 20 43 6f  e $counter(3) Co
1d550 75 6e 74 65 72 4e 61 6d 65 5d 20 22 5c 22 20 76  unterName] "\" v
1d560 61 6c 75 65 20 69 73 20 22 20 5c 0d 0a 20 20 20  alue is " \..   
1d570 20 20 20 20 20 20 20 20 20 5b 6f 62 6a 65 63 74           [object
1d580 20 69 6e 76 6f 6b 65 20 24 63 6f 75 6e 74 65 72   invoke $counter
1d590 28 33 29 20 52 61 77 56 61 6c 75 65 5d 20 5c 6e  (3) RawValue] \n
1d5a0 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  ]..      }..    
1d5b0 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63  }.....    proc c
1d5c0 6f 6c 6c 65 63 74 47 61 72 62 61 67 65 20 7b 20  ollectGarbage { 
1d5d0 63 68 61 6e 6e 65 6c 20 7b 6d 69 6c 6c 69 73 65  channel {millise
1d5e0 63 6f 6e 64 73 20 31 30 30 30 7d 20 7b 71 75 69  conds 1000} {qui
1d5f0 65 74 20 74 72 75 65 7d 20 7d 20 7b 0d 0a 20 20  et true} } {..  
1d600 20 20 20 20 69 66 20 7b 5b 68 61 76 65 53 51 4c      if {[haveSQL
1d610 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64  iteObjectCommand
1d620 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
1d630 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d     if {[catch {.
1d640 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63  .          objec
1d650 74 20 69 6e 76 6f 6b 65 20 47 43 20 47 65 74 54  t invoke GC GetT
1d660 6f 74 61 6c 4d 65 6d 6f 72 79 20 66 61 6c 73 65  otalMemory false
1d670 0d 0a 20 20 20 20 20 20 20 20 7d 20 72 65 73 75  ..        } resu
1d680 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  lt] == 0} then {
1d690 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
1d6a0 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
1d6b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
1d6c0 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
1d6d0 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
1d6e0 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
1d6f0 20 6d 65 6d 6f 72 79 20 69 6e 20 75 73 65 20 62   memory in use b
1d700 79 20 74 68 65 20 43 4c 52 20 62 65 66 6f 72 65  y the CLR before
1d710 20 63 6f 6c 6c 65 63 74 69 6f 6e 2e 2e 2e 20 22   collection... "
1d720 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1d730 20 20 20 20 24 72 65 73 75 6c 74 20 22 20 62 79      $result " by
1d740 74 65 73 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20  tes\n"]..       
1d750 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20     }..        } 
1d760 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
1d770 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
1d780 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1d790 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
1d7a0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
1d7b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1d7c0 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20   "==== WARNING: 
1d7d0 66 61 69 6c 65 64 20 74 6f 20 67 65 74 20 43 4c  failed to get CL
1d7e0 52 20 6d 65 6d 6f 72 79 20 75 73 61 67 65 2c 20  R memory usage, 
1d7f0 65 72 72 6f 72 3a 20 22 20 5c 0d 0a 20 20 20 20  error: " \..    
1d800 20 20 20 20 20 20 20 20 20 20 20 20 5c 6e 5c 74              \n\t
1d810 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20   $result \n]..  
1d820 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
1d830 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d     }..      }...
1d840 0a 20 20 20 20 20 20 23 23 23 23 23 23 23 23 23  .      #########
1d850 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1d860 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1d870 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1d880 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1d890 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
1d8a0 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 70 65 61     # NOTE: Repea
1d8b0 74 65 64 6c 79 20 61 74 74 65 6d 70 74 20 74 6f  tedly attempt to
1d8c0 20 63 6f 6c 6c 65 63 74 20 67 61 72 62 61 67 65   collect garbage
1d8d0 20 75 6e 74 69 6c 20 74 68 65 20 61 6c 6c 6f 74   until the allot
1d8e0 74 65 64 20 6e 75 6d 62 65 72 0d 0a 20 20 20 20  ted number..    
1d8f0 20 20 23 20 20 20 20 20 20 20 6f 66 20 6d 69 6c    #       of mil
1d900 6c 69 73 65 63 6f 6e 64 73 20 68 61 73 20 65 6c  liseconds has el
1d910 61 70 73 65 64 2e 20 20 41 6c 77 61 79 73 20 61  apsed.  Always a
1d920 74 74 65 6d 70 74 20 74 6f 20 63 6f 6c 6c 65 63  ttempt to collec
1d930 74 20 67 61 72 62 61 67 65 0d 0a 20 20 20 20 20  t garbage..     
1d940 20 23 20 20 20 20 20 20 20 61 74 20 6c 65 61 73   #       at leas
1d950 74 20 6f 6e 63 65 2e 0d 0a 20 20 20 20 20 20 23  t once...      #
1d960 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76  ..      if {[hav
1d970 65 53 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d  eSQLiteObjectCom
1d980 6d 61 6e 64 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  mand]} then {.. 
1d990 20 20 20 20 20 20 20 73 65 74 20 73 74 61 72 74         set start
1d9a0 20 5b 63 6c 6f 63 6b 20 73 65 63 6f 6e 64 73 5d   [clock seconds]
1d9b0 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 73 74  ..        set st
1d9c0 6f 70 20 5b 65 78 70 72 20 7b 24 73 74 61 72 74  op [expr {$start
1d9d0 20 2b 20 28 24 6d 69 6c 6c 69 73 65 63 6f 6e 64   + ($millisecond
1d9e0 73 20 2f 20 31 30 30 30 29 7d 5d 0d 0a 0d 0a 20  s / 1000)}].... 
1d9f0 20 20 20 20 20 20 20 64 6f 20 7b 0d 0a 20 20 20         do {..   
1da00 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1da10 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65      # NOTE: Atte
1da20 6d 70 74 20 74 6f 20 66 6f 72 63 65 20 61 20 66  mpt to force a f
1da30 75 6c 6c 20 67 61 72 62 61 67 65 20 63 6f 6c 6c  ull garbage coll
1da40 65 63 74 69 6f 6e 20 6e 6f 77 2e 20 20 52 65 70  ection now.  Rep
1da50 6f 72 74 20 61 6e 79 0d 0a 20 20 20 20 20 20 20  ort any..       
1da60 20 20 20 23 20 20 20 20 20 20 20 65 72 72 6f 72     #       error
1da70 20 74 68 61 74 20 69 73 20 65 6e 63 6f 75 6e 74   that is encount
1da80 65 72 65 64 20 69 66 20 77 65 20 66 61 69 6c 2e  ered if we fail.
1da90 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
1daa0 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61           if {[ca
1dab0 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
1dac0 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65     object invoke
1dad0 20 47 43 20 47 65 74 54 6f 74 61 6c 4d 65 6d 6f   GC GetTotalMemo
1dae0 72 79 20 74 72 75 65 0d 0a 20 20 20 20 20 20 20  ry true..       
1daf0 20 20 20 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65     } error]} the
1db00 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
1db10 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
1db20 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
1db30 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
1db40 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
1db50 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1db60 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e      "==== WARNIN
1db70 47 3a 20 66 61 69 6c 65 64 20 66 75 6c 6c 20 67  G: failed full g
1db80 61 72 62 61 67 65 20 63 6f 6c 6c 65 63 74 69 6f  arbage collectio
1db90 6e 2c 20 65 72 72 6f 72 3a 20 22 20 5c 0d 0a 20  n, error: " \.. 
1dba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dbb0 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d   \n\t $error \n]
1dbc0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
1dbd0 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  .          }....
1dbe0 20 20 20 20 20 20 20 20 20 20 73 65 74 20 6e 6f            set no
1dbf0 77 20 5b 63 6c 6f 63 6b 20 73 65 63 6f 6e 64 73  w [clock seconds
1dc00 5d 0d 0a 20 20 20 20 20 20 20 20 7d 20 77 68 69  ]..        } whi
1dc10 6c 65 20 7b 24 73 74 61 72 74 20 3c 3d 20 24 6e  le {$start <= $n
1dc20 6f 77 20 26 26 20 24 6e 6f 77 20 3c 20 24 73 74  ow && $now < $st
1dc30 6f 70 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  op}..      }....
1dc40 20 20 20 20 20 20 23 23 23 23 23 23 23 23 23 23        ##########
1dc50 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1dc60 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1dc70 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1dc80 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d  ###############.
1dc90 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 68 61  ...      if {[ha
1dca0 76 65 53 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f  veSQLiteObjectCo
1dcb0 6d 6d 61 6e 64 5d 7d 20 74 68 65 6e 20 7b 0d 0a  mmand]} then {..
1dcc0 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
1dcd0 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
1dce0 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 47 43  object invoke GC
1dcf0 20 47 65 74 54 6f 74 61 6c 4d 65 6d 6f 72 79 20   GetTotalMemory 
1dd00 66 61 6c 73 65 0d 0a 20 20 20 20 20 20 20 20 7d  false..        }
1dd10 20 72 65 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74   result] == 0} t
1dd20 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1dd30 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
1dd40 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
1dd50 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
1dd60 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
1dd70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd80 22 2d 2d 2d 2d 20 6d 65 6d 6f 72 79 20 69 6e 20  "---- memory in 
1dd90 75 73 65 20 62 79 20 74 68 65 20 43 4c 52 20 61  use by the CLR a
1dda0 66 74 65 72 20 63 6f 6c 6c 65 63 74 69 6f 6e 2e  fter collection.
1ddb0 2e 2e 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20  .. " \..        
1ddc0 20 20 20 20 20 20 20 20 24 72 65 73 75 6c 74 20          $result 
1ddd0 22 20 62 79 74 65 73 5c 6e 22 5d 0d 0a 20 20 20  " bytes\n"]..   
1dde0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1ddf0 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
1de00 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
1de10 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
1de20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
1de30 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
1de40 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
1de50 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49       "==== WARNI
1de60 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 67 65  NG: failed to ge
1de70 74 20 43 4c 52 20 6d 65 6d 6f 72 79 20 75 73 61  t CLR memory usa
1de80 67 65 2c 20 65 72 72 6f 72 3a 20 22 20 5c 0d 0a  ge, error: " \..
1de90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dea0 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d  \n\t $result \n]
1deb0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
1dec0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1ded0 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
1dee0 20 70 72 6f 63 20 67 65 74 53 51 4c 69 74 65 48   proc getSQLiteH
1def0 61 6e 64 6c 65 43 6f 75 6e 74 73 20 7b 20 63 68  andleCounts { ch
1df00 61 6e 6e 65 6c 20 7b 71 75 69 65 74 20 66 61 6c  annel {quiet fal
1df10 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73  se} } {..      s
1df20 65 74 20 72 65 73 75 6c 74 20 5b 6c 69 73 74 5d  et result [list]
1df30 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 68  ....      if {[h
1df40 61 76 65 53 51 4c 69 74 65 4f 62 6a 65 63 74 43  aveSQLiteObjectC
1df50 6f 6d 6d 61 6e 64 5d 20 26 26 20 5c 0d 0a 20 20  ommand] && \..  
1df60 20 20 20 20 20 20 20 20 5b 68 61 76 65 53 51 4c          [haveSQL
1df70 69 74 65 44 65 66 69 6e 65 43 6f 6e 73 74 61 6e  iteDefineConstan
1df80 74 20 43 4f 55 4e 54 5f 48 41 4e 44 4c 45 5d 7d  t COUNT_HANDLE]}
1df90 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1dfa0 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
1dfb0 54 45 3a 20 41 64 64 20 65 61 63 68 20 63 72 69  TE: Add each cri
1dfc0 74 69 63 61 6c 20 68 61 6e 64 6c 65 20 63 6f 75  tical handle cou
1dfd0 6e 74 20 74 6f 20 74 68 65 20 72 65 73 75 6c 74  nt to the result
1dfe0 69 6e 67 20 6c 69 73 74 2e 0d 0a 20 20 20 20 20  ing list...     
1dff0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 66 6f     #..        fo
1e000 72 65 61 63 68 20 6e 61 6d 65 20 5b 6c 69 73 74  reach name [list
1e010 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1e020 63 6f 6e 6e 65 63 74 69 6f 6e 43 6f 75 6e 74 20  connectionCount 
1e030 73 74 61 74 65 6d 65 6e 74 43 6f 75 6e 74 20 62  statementCount b
1e040 61 63 6b 75 70 43 6f 75 6e 74 20 62 6c 6f 62 43  ackupCount blobC
1e050 6f 75 6e 74 5d 20 7b 0d 0a 20 20 20 20 20 20 20  ount] {..       
1e060 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d     if {[catch {.
1e070 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a  .            obj
1e080 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67  ect invoke -flag
1e090 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a  s +NonPublic \..
1e0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e0b0 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
1e0c0 74 65 2e 44 65 62 75 67 44 61 74 61 20 24 6e 61  te.DebugData $na
1e0d0 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20  me..          } 
1e0e0 76 61 6c 75 65 5d 20 3d 3d 20 30 7d 20 74 68 65  value] == 0} the
1e0f0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
1e100 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
1e110 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
1e120 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
1e130 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
1e140 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1e150 20 20 20 20 22 2d 2d 2d 2d 20 63 72 69 74 69 63      "---- critic
1e160 61 6c 20 68 61 6e 64 6c 65 20 63 6f 75 6e 74 20  al handle count 
1e170 5c 22 22 20 24 6e 61 6d 65 20 22 5c 22 20 69 73  \"" $name "\" is
1e180 20 22 20 24 76 61 6c 75 65 20 5c 6e 5d 0d 0a 20   " $value \n].. 
1e190 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
1e1a0 20 20 20 20 20 20 20 20 20 20 20 20 6c 61 70 70              lapp
1e1b0 65 6e 64 20 72 65 73 75 6c 74 20 24 76 61 6c 75  end result $valu
1e1c0 65 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65  e..          } e
1e1d0 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
1e1e0 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
1e1f0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1e200 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
1e210 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
1e220 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1e230 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e        "==== WARN
1e240 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 67  ING: failed to g
1e250 65 74 20 63 72 69 74 69 63 61 6c 20 68 61 6e 64  et critical hand
1e260 6c 65 20 63 6f 75 6e 74 20 5c 22 22 20 5c 0d 0a  le count \"" \..
1e270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e280 20 20 24 6e 61 6d 65 20 22 5c 22 2c 20 65 72 72    $name "\", err
1e290 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 76 61 6c 75  or: " \n\t $valu
1e2a0 65 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  e \n]..         
1e2b0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
1e2c0 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  }..        }..  
1e2d0 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 21 24      } elseif {!$
1e2e0 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
1e2f0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1e300 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 61 63    # NOTE: The ac
1e310 74 75 61 6c 20 68 61 6e 64 6c 65 20 63 6f 75 6e  tual handle coun
1e320 74 73 20 61 72 65 20 6e 6f 74 20 61 76 61 69 6c  ts are not avail
1e330 61 62 6c 65 3b 20 74 68 65 72 65 66 6f 72 65 2c  able; therefore,
1e340 20 6a 75 73 74 0d 0a 20 20 20 20 20 20 20 20 23   just..        #
1e350 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 6e         return an
1e360 20 65 6d 70 74 79 20 6c 69 73 74 2e 0d 0a 20 20   empty list...  
1e370 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1e380 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
1e390 22 2d 2d 2d 2d 20 63 72 69 74 69 63 61 6c 20 68  "---- critical h
1e3a0 61 6e 64 6c 65 20 63 6f 75 6e 74 73 20 75 6e 61  andle counts una
1e3b0 76 61 69 6c 61 62 6c 65 5c 6e 22 0d 0a 20 20 20  vailable\n"..   
1e3c0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65     }....      re
1e3d0 74 75 72 6e 20 24 72 65 73 75 6c 74 0d 0a 20 20  turn $result..  
1e3e0 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
1e3f0 20 73 68 75 74 64 6f 77 6e 53 51 4c 69 74 65 20   shutdownSQLite 
1e400 7b 20 63 68 61 6e 6e 65 6c 20 7b 66 6f 72 63 65  { channel {force
1e410 20 66 61 6c 73 65 7d 20 7b 71 75 69 65 74 20 66   false} {quiet f
1e420 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  alse} } {..     
1e430 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
1e440 3a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 61 74  : Make sure that
1e450 20 53 51 4c 69 74 65 20 63 6f 72 65 20 6c 69 62   SQLite core lib
1e460 72 61 72 79 20 69 73 20 63 6f 6d 70 6c 65 74 65  rary is complete
1e470 6c 79 20 73 68 75 74 64 6f 77 6e 2e 20 20 54 68  ly shutdown.  Th
1e480 69 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  is..      #     
1e490 20 20 69 73 20 75 73 65 64 20 62 79 20 74 65 73    is used by tes
1e4a0 74 73 20 74 68 61 74 20 63 68 61 6e 67 65 20 63  ts that change c
1e4b0 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 70 74  onfiguration opt
1e4c0 69 6f 6e 73 20 61 6e 64 2f 6f 72 20 74 68 6f 73  ions and/or thos
1e4d0 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
1e4e0 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 6d 61   that need to ma
1e4f0 6b 65 20 73 75 72 65 20 6c 6f 67 67 69 6e 67 20  ke sure logging 
1e500 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 28  is initialized (
1e510 69 2e 65 2e 20 6a 75 73 74 20 69 6e 20 63 61 73  i.e. just in cas
1e520 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
1e530 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65   the SQLite core
1e540 20 6c 69 62 72 61 72 79 20 77 61 73 20 69 6e 69   library was ini
1e550 74 69 61 6c 69 7a 65 64 20 69 6e 20 74 68 65 20  tialized in the 
1e560 70 72 6f 63 65 73 73 20 70 72 69 6f 72 20 74 6f  process prior to
1e570 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
1e580 74 68 65 20 53 51 4c 69 74 65 4c 6f 67 20 63 6c  the SQLiteLog cl
1e590 61 73 73 20 62 65 69 6e 67 20 61 62 6c 65 20 74  ass being able t
1e5a0 6f 20 73 65 74 75 70 20 69 74 73 20 6c 6f 67 67  o setup its logg
1e5b0 69 6e 67 20 63 61 6c 6c 62 61 63 6b 29 2e 0d 0a  ing callback)...
1e5c0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 4e 6f        #       No
1e5d0 72 6d 61 6c 6c 79 2c 20 74 68 69 73 20 73 68 6f  rmally, this sho
1e5e0 75 6c 64 20 6f 6e 6c 79 20 62 65 20 70 65 72 66  uld only be perf
1e5f0 6f 72 6d 65 64 20 69 66 20 53 51 4c 69 74 65 20  ormed if SQLite 
1e600 69 73 20 6c 6f 61 64 65 64 20 61 6e 64 0d 0a 20  is loaded and.. 
1e610 20 20 20 20 20 23 20 20 20 20 20 20 20 72 65 61       #       rea
1e620 64 79 20 66 6f 72 20 75 73 65 20 62 79 20 74 68  dy for use by th
1e630 65 20 74 65 73 74 20 73 75 69 74 65 2e 0d 0a 20  e test suite... 
1e640 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
1e650 20 7b 24 66 6f 72 63 65 20 7c 7c 20 5b 69 73 53   {$force || [isS
1e660 51 4c 69 74 65 52 65 61 64 79 5d 7d 20 74 68 65  QLiteReady]} the
1e670 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
1e680 20 20 20 20 20 20 20 20 23 20 42 55 47 46 49 58          # BUGFIX
1e690 3a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 61 74  : Make sure that
1e6a0 20 61 6e 79 20 22 6c 65 61 6b 65 64 22 20 74 72   any "leaked" tr
1e6b0 61 6e 73 61 63 74 69 6f 6e 73 20 61 6e 64 2f 6f  ansactions and/o
1e6c0 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0d 0a 20  r connections.. 
1e6d0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20         #        
1e6e0 20 61 72 65 20 63 6c 65 61 6e 65 64 20 75 70 20   are cleaned up 
1e6f0 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74  before calling t
1e700 68 65 20 6e 61 74 69 76 65 20 73 68 75 74 64 6f  he native shutdo
1e710 77 6e 20 66 75 6e 63 74 69 6f 6e 2e 0d 0a 20 20  wn function...  
1e720 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1e730 20 66 6f 72 65 61 63 68 20 74 72 61 6e 73 61 63   foreach transac
1e740 74 69 6f 6e 20 5b 69 6e 66 6f 20 74 72 61 6e 73  tion [info trans
1e750 61 63 74 69 6f 6e 73 5d 20 7b 0d 0a 20 20 20 20  actions] {..    
1e760 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
1e770 67 20 6d 61 74 63 68 20 5c 0d 0a 20 20 20 20 20  g match \..     
1e780 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 23           System#
1e790 44 61 74 61 23 53 51 4c 69 74 65 23 53 51 4c 69  Data#SQLite#SQLi
1e7a0 74 65 54 72 61 6e 73 61 63 74 69 6f 6e 23 2a 20  teTransaction#* 
1e7b0 24 74 72 61 6e 73 61 63 74 69 6f 6e 5d 7d 20 74  $transaction]} t
1e7c0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1e7d0 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d     if {[catch {.
1e7e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
1e7f0 71 6c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72  ql transaction r
1e800 6f 6c 6c 62 61 63 6b 20 24 74 72 61 6e 73 61 63  ollback $transac
1e810 74 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20 20 20  tion..          
1e820 20 20 7d 20 65 72 72 6f 72 5d 20 3d 3d 20 30 7d    } error] == 0}
1e830 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1e840 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
1e850 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
1e860 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
1e870 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
1e880 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
1e890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
1e8a0 2d 2d 2d 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  --- rolled back 
1e8b0 6c 65 61 6b 65 64 20 74 72 61 6e 73 61 63 74 69  leaked transacti
1e8c0 6f 6e 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20  on \"" \..      
1e8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24 74                $t
1e8e0 72 61 6e 73 61 63 74 69 6f 6e 20 5c 22 5c 6e 5d  ransaction \"\n]
1e8f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1e900 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  }..            }
1e910 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
1e920 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
1e930 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
1e940 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
1e950 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
1e960 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
1e970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d                "=
1e980 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69  === WARNING: fai
1e990 6c 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20  led to rollback 
1e9a0 6c 65 61 6b 65 64 20 74 72 61 6e 73 61 63 74 69  leaked transacti
1e9b0 6f 6e 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20  on \"" \..      
1e9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24 74                $t
1e9d0 72 61 6e 73 61 63 74 69 6f 6e 20 22 5c 22 2c 20  ransaction "\", 
1e9e0 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65  error: " \n\t $e
1e9f0 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  rror \n]..      
1ea00 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
1ea10 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1ea20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
1ea30 0d 0a 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 65  ....        fore
1ea40 61 63 68 20 64 62 20 5b 69 6e 66 6f 20 63 6f 6e  ach db [info con
1ea50 6e 65 63 74 69 6f 6e 73 5d 20 7b 0d 0a 20 20 20  nections] {..   
1ea60 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69         if {[stri
1ea70 6e 67 20 6d 61 74 63 68 20 5c 0d 0a 20 20 20 20  ng match \..    
1ea80 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d            System
1ea90 23 44 61 74 61 23 53 51 4c 69 74 65 23 53 51 4c  #Data#SQLite#SQL
1eaa0 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 23 2a 20  iteConnection#* 
1eab0 24 64 62 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  $db]} then {..  
1eac0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63            if {[c
1ead0 61 74 63 68 20 7b 73 71 6c 20 63 6c 6f 73 65 20  atch {sql close 
1eae0 24 64 62 7d 20 65 72 72 6f 72 5d 20 3d 3d 20 30  $db} error] == 0
1eaf0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1eb00 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
1eb10 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
1eb20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
1eb30 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
1eb40 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
1eb50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1eb60 2d 2d 2d 2d 20 63 6c 6f 73 65 64 20 6c 65 61 6b  ---- closed leak
1eb70 65 64 20 64 61 74 61 62 61 73 65 20 5c 22 22 20  ed database \"" 
1eb80 24 64 62 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20  $db \"\n]..     
1eb90 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
1eba0 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
1ebb0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1ebc0 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
1ebd0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
1ebe0 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
1ebf0 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
1ec00 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1ec10 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52         "==== WAR
1ec20 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20  NING: failed to 
1ec30 63 6c 6f 73 65 20 6c 65 61 6b 65 64 20 64 61 74  close leaked dat
1ec40 61 62 61 73 65 20 5c 22 22 20 5c 0d 0a 20 20 20  abase \"" \..   
1ec50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec60 20 24 64 62 20 22 5c 22 2c 20 65 72 72 6f 72 3a   $db "\", error:
1ec70 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c   " \n\t $error \
1ec80 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  n]..            
1ec90 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
1eca0 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d   }..          }.
1ecb0 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
1ecc0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1ecd0 20 23 20 42 55 47 46 49 58 3a 20 42 65 66 6f 72   # BUGFIX: Befor
1ece0 65 20 63 61 6c 6c 69 6e 67 20 74 68 65 20 6e 61  e calling the na
1ecf0 74 69 76 65 20 73 68 75 74 64 6f 77 6e 20 66 75  tive shutdown fu
1ed00 6e 63 74 69 6f 6e 2c 20 6d 61 6b 65 20 73 75 72  nction, make sur
1ed10 65 20 62 6f 74 68 0d 0a 20 20 20 20 20 20 20 20  e both..        
1ed20 23 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65  #         of the
1ed30 20 50 52 41 47 4d 41 20 72 65 6c 61 74 65 64 20   PRAGMA related 
1ed40 64 69 72 65 63 74 6f 72 79 20 6e 61 6d 65 73 20  directory names 
1ed50 61 72 65 20 66 72 65 65 64 2e 0d 0a 20 20 20 20  are freed...    
1ed60 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 63      #..        c
1ed70 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 44 69 72  heckForSQLiteDir
1ed80 65 63 74 6f 72 69 65 73 20 24 63 68 61 6e 6e 65  ectories $channe
1ed90 6c 20 74 72 75 65 0d 0a 0d 0a 20 20 20 20 20 20  l true....      
1eda0 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
1edb0 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74            object
1edc0 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b   invoke -flags +
1edd0 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20  NonPublic \..   
1ede0 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65             Syste
1edf0 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 55 6e  m.Data.SQLite.Un
1ee00 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64  safeNativeMethod
1ee10 73 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f  s sqlite3_shutdo
1ee20 77 6e 0d 0a 20 20 20 20 20 20 20 20 7d 20 72 65  wn..        } re
1ee30 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  sult] == 0} then
1ee40 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   {..          if
1ee50 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
1ee60 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
1ee70 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
1ee80 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
1ee90 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
1eea0 2d 2d 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f  -- call sqlite3_
1eeb0 73 68 75 74 64 6f 77 6e 28 29 2e 2e 2e 20 6f 6b  shutdown()... ok
1eec0 3a 20 22 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d  : " $result \n].
1eed0 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
1eee0 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
1eef0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24            if {!$
1ef00 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
1ef10 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
1ef20 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
1ef30 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
1ef40 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63           "---- c
1ef50 61 6c 6c 20 73 71 6c 69 74 65 33 5f 73 68 75 74  all sqlite3_shut
1ef60 64 6f 77 6e 28 29 2e 2e 2e 20 65 72 72 6f 72 3a  down()... error:
1ef70 20 22 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20   " \n\t $result 
1ef80 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  \n]..          }
1ef90 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
1efa0 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
1efb0 20 20 20 20 70 72 6f 63 20 67 65 74 53 65 74 74      proc getSett
1efc0 69 6e 67 52 65 61 64 43 6f 75 6e 74 20 7b 20 6e  ingReadCount { n
1efd0 61 6d 65 20 7b 76 69 61 46 69 6c 65 20 66 61 6c  ame {viaFile fal
1efe0 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 69  se} } {..      i
1eff0 66 20 7b 5b 68 61 76 65 43 6f 6e 73 74 72 61 69  f {[haveConstrai
1f000 6e 74 20 62 75 69 6c 64 43 6f 6e 66 69 67 75 72  nt buildConfigur
1f010 61 74 69 6f 6e 2e 44 65 62 75 67 5d 20 26 26 20  ation.Debug] && 
1f020 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
1f030 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20    object invoke 
1f040 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69  -flags +NonPubli
1f050 63 20 2d 61 6c 69 61 73 20 5c 0d 0a 20 20 20 20  c -alias \..    
1f060 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44          System.D
1f070 61 74 61 2e 53 51 4c 69 74 65 2e 44 65 62 75 67  ata.SQLite.Debug
1f080 44 61 74 61 20 47 65 74 53 65 74 74 69 6e 67 52  Data GetSettingR
1f090 65 61 64 43 6f 75 6e 74 73 20 24 76 69 61 46 69  eadCounts $viaFi
1f0a0 6c 65 0d 0a 20 20 20 20 20 20 7d 20 73 65 74 74  le..      } sett
1f0b0 69 6e 67 52 65 61 64 43 6f 75 6e 74 73 5d 20 3d  ingReadCounts] =
1f0c0 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
1f0d0 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
1f0e0 20 6c 65 6e 67 74 68 20 24 6e 61 6d 65 5d 20 3e   length $name] >
1f0f0 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
1f100 20 20 20 20 20 20 69 66 20 7b 5b 24 73 65 74 74        if {[$sett
1f110 69 6e 67 52 65 61 64 43 6f 75 6e 74 73 20 54 72  ingReadCounts Tr
1f120 79 47 65 74 56 61 6c 75 65 20 24 6e 61 6d 65 20  yGetValue $name 
1f130 76 61 6c 75 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a  value]} then {..
1f140 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
1f150 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
1f160 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
1f170 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f180 20 22 2d 2d 2d 2d 20 73 65 74 74 69 6e 67 20 5c   "---- setting \
1f190 22 22 20 24 6e 61 6d 65 20 22 5c 22 20 77 61 73  "" $name "\" was
1f1a0 20 72 65 61 64 20 22 20 24 76 61 6c 75 65 20 22   read " $value "
1f1b0 20 74 69 6d 65 73 22 20 5c 0d 0a 20 20 20 20 20   times" \..     
1f1c0 20 20 20 20 20 20 20 20 20 20 20 5b 65 78 70 72             [expr
1f1d0 20 7b 24 76 69 61 46 69 6c 65 20 3f 20 22 20 66   {$viaFile ? " f
1f1e0 72 6f 6d 20 74 68 65 20 63 6f 6e 66 69 67 75 72  rom the configur
1f1f0 61 74 69 6f 6e 20 66 69 6c 65 22 20 3a 20 22 22  ation file" : ""
1f200 7d 5d 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20  }] \n]....      
1f210 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 76 61        return $va
1f220 6c 75 65 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  lue..          }
1f230 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65  ..        } else
1f240 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   {..          se
1f250 74 20 6e 61 6d 65 43 6f 75 6e 74 20 5b 24 73 65  t nameCount [$se
1f260 74 74 69 6e 67 52 65 61 64 43 6f 75 6e 74 73 20  ttingReadCounts 
1f270 43 6f 75 6e 74 5d 0d 0a 20 20 20 20 20 20 20 20  Count]..        
1f280 20 20 73 65 74 20 76 61 6c 75 65 43 6f 75 6e 74    set valueCount
1f290 20 30 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   0....          
1f2a0 6f 62 6a 65 63 74 20 66 6f 72 65 61 63 68 20 2d  object foreach -
1f2b0 61 6c 69 61 73 20 70 61 69 72 20 24 73 65 74 74  alias pair $sett
1f2c0 69 6e 67 52 65 61 64 43 6f 75 6e 74 73 20 7b 0d  ingReadCounts {.
1f2d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 63  .            inc
1f2e0 72 20 76 61 6c 75 65 43 6f 75 6e 74 20 5b 24 70  r valueCount [$p
1f2f0 61 69 72 20 56 61 6c 75 65 5d 0d 0a 0d 0a 20 20  air Value]....  
1f300 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
1f310 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
1f320 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
1f330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1f340 2d 2d 2d 2d 20 73 65 74 74 69 6e 67 20 5c 22 22  ---- setting \""
1f350 20 5b 24 70 61 69 72 20 4b 65 79 5d 20 22 5c 22   [$pair Key] "\"
1f360 20 77 61 73 20 72 65 61 64 20 22 20 5b 24 70 61   was read " [$pa
1f370 69 72 20 56 61 6c 75 65 5d 20 5c 0d 0a 20 20 20  ir Value] \..   
1f380 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 74               " t
1f390 69 6d 65 73 22 20 5b 65 78 70 72 20 7b 24 76 69  imes" [expr {$vi
1f3a0 61 46 69 6c 65 20 3f 20 22 20 66 72 6f 6d 20 74  aFile ? " from t
1f3b0 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  he configuration
1f3c0 20 66 69 6c 65 22 20 3a 20 5c 0d 0a 20 20 20 20   file" : \..    
1f3d0 20 20 20 20 20 20 20 20 20 20 20 20 22 22 7d 5d              ""}]
1f3e0 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \n]..          
1f3f0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 72  }....          r
1f400 65 74 75 72 6e 20 5b 6c 69 73 74 20 24 6e 61 6d  eturn [list $nam
1f410 65 43 6f 75 6e 74 20 24 76 61 6c 75 65 43 6f 75  eCount $valueCou
1f420 6e 74 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  nt]..        }..
1f430 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
1f440 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
1f450 67 74 68 20 24 6e 61 6d 65 5d 20 3e 20 30 7d 20  gth $name] > 0} 
1f460 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1f470 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
1f480 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
1f490 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
1f4a0 20 22 2d 2d 2d 2d 20 73 65 74 74 69 6e 67 20 5c   "---- setting \
1f4b0 22 22 20 24 6e 61 6d 65 20 22 5c 22 20 77 61 73  "" $name "\" was
1f4c0 20 6e 6f 74 20 72 65 61 64 22 20 5b 65 78 70 72   not read" [expr
1f4d0 20 7b 24 76 69 61 46 69 6c 65 20 3f 20 5c 0d 0a   {$viaFile ? \..
1f4e0 20 20 20 20 20 20 20 20 20 20 20 20 22 20 66 72              " fr
1f4f0 6f 6d 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61  om the configura
1f500 74 69 6f 6e 20 66 69 6c 65 22 20 3a 20 22 22 7d  tion file" : ""}
1f510 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 20 65  ] \n]..      } e
1f520 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74  lse {..        t
1f530 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
1f540 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
1f550 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1f560 22 2d 2d 2d 2d 20 6e 6f 20 73 65 74 74 69 6e 67  "---- no setting
1f570 73 20 77 65 72 65 20 72 65 61 64 22 20 5b 65 78  s were read" [ex
1f580 70 72 20 7b 24 76 69 61 46 69 6c 65 20 3f 20 5c  pr {$viaFile ? \
1f590 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 20  ..            " 
1f5a0 66 72 6f 6d 20 74 68 65 20 63 6f 6e 66 69 67 75  from the configu
1f5b0 72 61 74 69 6f 6e 20 66 69 6c 65 22 20 3a 20 22  ration file" : "
1f5c0 22 7d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d  "}] \n]..      }
1f5d0 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ....      return
1f5e0 20 2d 31 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20   -1..    }..... 
1f5f0 20 20 20 70 72 6f 63 20 67 65 74 4f 74 68 65 72     proc getOther
1f600 43 6f 75 6e 74 20 7b 20 6e 61 6d 65 20 7d 20 7b  Count { name } {
1f610 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76  ..      if {[hav
1f620 65 43 6f 6e 73 74 72 61 69 6e 74 20 62 75 69 6c  eConstraint buil
1f630 64 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 44  dConfiguration.D
1f640 65 62 75 67 5d 20 26 26 20 5b 63 61 74 63 68 20  ebug] && [catch 
1f650 7b 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a 65 63  {..        objec
1f660 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20  t invoke -flags 
1f670 2b 4e 6f 6e 50 75 62 6c 69 63 20 2d 61 6c 69 61  +NonPublic -alia
1f680 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
1f690 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
1f6a0 69 74 65 2e 44 65 62 75 67 44 61 74 61 20 47 65  ite.DebugData Ge
1f6b0 74 4f 74 68 65 72 43 6f 75 6e 74 73 0d 0a 20 20  tOtherCounts..  
1f6c0 20 20 20 20 7d 20 6f 74 68 65 72 43 6f 75 6e 74      } otherCount
1f6d0 73 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  s] == 0} then {.
1f6e0 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74  .        if {[st
1f6f0 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 6e 61 6d  ring length $nam
1f700 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  e] > 0} then {..
1f710 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 24            if {[$
1f720 6f 74 68 65 72 43 6f 75 6e 74 73 20 54 72 79 47  otherCounts TryG
1f730 65 74 56 61 6c 75 65 20 24 6e 61 6d 65 20 76 61  etValue $name va
1f740 6c 75 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  lue]} then {..  
1f750 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
1f760 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
1f770 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
1f780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1f790 2d 2d 2d 2d 20 6f 74 68 65 72 20 63 6f 75 6e 74  ---- other count
1f7a0 65 72 20 5c 22 22 20 24 6e 61 6d 65 20 22 5c 22  er \"" $name "\"
1f7b0 20 68 61 73 20 76 61 6c 75 65 20 22 20 24 76 61   has value " $va
1f7c0 6c 75 65 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20  lue \n]....     
1f7d0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 76         return $v
1f7e0 61 6c 75 65 0d 0a 20 20 20 20 20 20 20 20 20 20  alue..          
1f7f0 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73  }..        } els
1f800 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73  e {..          s
1f810 65 74 20 6e 61 6d 65 43 6f 75 6e 74 20 5b 24 6f  et nameCount [$o
1f820 74 68 65 72 43 6f 75 6e 74 73 20 43 6f 75 6e 74  therCounts Count
1f830 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  ]..          set
1f840 20 76 61 6c 75 65 43 6f 75 6e 74 20 30 0d 0a 0d   valueCount 0...
1f850 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63  .          objec
1f860 74 20 66 6f 72 65 61 63 68 20 2d 61 6c 69 61 73  t foreach -alias
1f870 20 70 61 69 72 20 24 6f 74 68 65 72 43 6f 75 6e   pair $otherCoun
1f880 74 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ts {..          
1f890 20 20 69 6e 63 72 20 76 61 6c 75 65 43 6f 75 6e    incr valueCoun
1f8a0 74 20 5b 24 70 61 69 72 20 56 61 6c 75 65 5d 0d  t [$pair Value].
1f8b0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  ...            t
1f8c0 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
1f8d0 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
1f8e0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1f8f0 20 20 20 20 22 2d 2d 2d 2d 20 6f 74 68 65 72 20      "---- other 
1f900 63 6f 75 6e 74 65 72 20 5c 22 22 20 5b 24 70 61  counter \"" [$pa
1f910 69 72 20 4b 65 79 5d 20 22 5c 22 20 68 61 73 20  ir Key] "\" has 
1f920 76 61 6c 75 65 20 22 20 5c 0d 0a 20 20 20 20 20  value " \..     
1f930 20 20 20 20 20 20 20 20 20 20 20 5b 24 70 61 69             [$pai
1f940 72 20 56 61 6c 75 65 5d 20 5c 6e 5d 0d 0a 20 20  r Value] \n]..  
1f950 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
1f960 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6c         return [l
1f970 69 73 74 20 24 6e 61 6d 65 43 6f 75 6e 74 20 24  ist $nameCount $
1f980 76 61 6c 75 65 43 6f 75 6e 74 5d 0d 0a 20 20 20  valueCount]..   
1f990 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
1f9a0 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74  ...      if {[st
1f9b0 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 6e 61 6d  ring length $nam
1f9c0 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  e] > 0} then {..
1f9d0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
1f9e0 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
1f9f0 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
1fa00 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6f           "---- o
1fa10 74 68 65 72 20 63 6f 75 6e 74 65 72 20 5c 22 22  ther counter \""
1fa20 20 24 6e 61 6d 65 20 22 5c 22 20 68 61 73 20 6e   $name "\" has n
1fa30 6f 20 76 61 6c 75 65 5c 6e 22 5d 0d 0a 20 20 20  o value\n"]..   
1fa40 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
1fa50 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
1fa60 73 74 5f 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d  st_channel "----
1fa70 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 74   there are no ot
1fa80 68 65 72 20 63 6f 75 6e 74 65 72 73 5c 6e 22 0d  her counters\n".
1fa90 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
1faa0 20 20 72 65 74 75 72 6e 20 2d 31 0d 0a 20 20 20    return -1..   
1fab0 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
1fac0 72 65 70 6f 72 74 53 51 4c 69 74 65 52 65 73 6f  reportSQLiteReso
1fad0 75 72 63 65 73 20 7b 0d 0a 20 20 20 20 20 20 20  urces {..       
1fae0 20 20 20 20 20 63 68 61 6e 6e 65 6c 20 7b 71 75       channel {qu
1faf0 69 65 74 20 66 61 6c 73 65 7d 20 7b 72 65 73 65  iet false} {rese
1fb00 74 20 74 72 75 65 7d 20 7b 63 6f 6c 6c 65 63 74  t true} {collect
1fb10 20 74 72 75 65 7d 20 7d 20 7b 0d 0a 20 20 20 20   true} } {..    
1fb20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
1fb30 45 3a 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20  E: If possible, 
1fb40 61 6c 77 61 79 73 20 72 65 73 65 74 20 74 68 65  always reset the
1fb50 20 63 61 63 68 65 64 20 61 73 73 65 6d 62 6c 79   cached assembly
1fb60 20 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20   directory..    
1fb70 20 20 23 20 20 20 20 20 20 20 61 6e 64 20 74 68    #       and th
1fb80 65 20 63 61 63 68 65 64 20 58 4d 4c 20 63 6f 6e  e cached XML con
1fb90 66 69 67 75 72 61 74 69 6f 6e 20 66 69 6c 65 20  figuration file 
1fba0 6e 61 6d 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  name...      #..
1fbb0 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65 53        if {[haveS
1fbc0 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61  QLiteObjectComma
1fbd0 6e 64 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  nd]} then {..   
1fbe0 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
1fbf0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a  {..          obj
1fc00 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67  ect invoke -flag
1fc10 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a  s +NonPublic \..
1fc20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79                Sy
1fc30 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
1fc40 2e 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74  .UnsafeNativeMet
1fc50 68 6f 64 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  hods \..        
1fc60 20 20 20 20 20 20 52 65 73 65 74 43 61 63 68 65        ResetCache
1fc70 64 41 73 73 65 6d 62 6c 79 44 69 72 65 63 74 6f  dAssemblyDirecto
1fc80 72 79 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 72  ry..        } er
1fc90 72 6f 72 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ror] == 0} then 
1fca0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  {..          if 
1fcb0 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
1fcc0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
1fcd0 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d  uts $channel "--
1fce0 2d 2d 20 72 65 73 65 74 20 63 61 63 68 65 64 20  -- reset cached 
1fcf0 61 73 73 65 6d 62 6c 79 20 64 69 72 65 63 74 6f  assembly directo
1fd00 72 79 5c 6e 22 0d 0a 20 20 20 20 20 20 20 20 20  ry\n"..         
1fd10 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c   }..        } el
1fd20 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
1fd30 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
1fd40 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
1fd50 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
1fd60 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
1fd70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1fd80 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61  ==== WARNING: fa
1fd90 69 6c 65 64 20 74 6f 20 72 65 73 65 74 20 63 61  iled to reset ca
1fda0 63 68 65 64 20 61 73 73 65 6d 62 6c 79 20 64 69  ched assembly di
1fdb0 72 65 63 74 6f 72 79 2c 20 22 20 5c 0d 0a 20 20  rectory, " \..  
1fdc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 65                "e
1fdd0 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72  rror: " \n\t $er
1fde0 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ror \n]..       
1fdf0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
1fe00 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  ...        if {[
1fe10 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
1fe20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65     object invoke
1fe30 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c   -flags +NonPubl
1fe40 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ic \..          
1fe50 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e      System.Data.
1fe60 53 51 4c 69 74 65 2e 55 6e 73 61 66 65 4e 61 74  SQLite.UnsafeNat
1fe70 69 76 65 4d 65 74 68 6f 64 73 20 5c 0d 0a 20 20  iveMethods \..  
1fe80 20 20 20 20 20 20 20 20 20 20 20 20 52 65 73 65              Rese
1fe90 74 43 61 63 68 65 64 58 6d 6c 43 6f 6e 66 69 67  tCachedXmlConfig
1fea0 46 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20  FileName..      
1feb0 20 20 7d 20 65 72 72 6f 72 5d 20 3d 3d 20 30 7d    } error] == 0}
1fec0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1fed0 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
1fee0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1fef0 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
1ff00 65 6c 20 22 2d 2d 2d 2d 20 72 65 73 65 74 20 63  el "---- reset c
1ff10 61 63 68 65 64 20 58 4d 4c 20 63 6f 6e 66 69 67  ached XML config
1ff20 75 72 61 74 69 6f 6e 20 66 69 6c 65 20 6e 61 6d  uration file nam
1ff30 65 5c 6e 22 0d 0a 20 20 20 20 20 20 20 20 20 20  e\n"..          
1ff40 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73  }..        } els
1ff50 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69  e {..          i
1ff60 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
1ff70 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1ff80 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
1ff90 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
1ffa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d                "=
1ffb0 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69  === WARNING: fai
1ffc0 6c 65 64 20 74 6f 20 72 65 73 65 74 20 63 61 63  led to reset cac
1ffd0 68 65 64 20 58 4d 4c 20 63 6f 6e 66 69 67 75 72  hed XML configur
1ffe0 61 74 69 6f 6e 20 22 20 5c 0d 0a 20 20 20 20 20  ation " \..     
1fff0 20 20 20 20 20 20 20 20 20 20 20 22 66 69 6c 65             "file
20000 20 6e 61 6d 65 2c 20 65 72 72 6f 72 3a 20 22 20   name, error: " 
20010 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d  \n\t $error \n].
20020 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
20030 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
20040 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
20050 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 61 76     # NOTE: If av
20060 61 69 6c 61 62 6c 65 2c 20 72 65 70 6f 72 74 20  ailable, report 
20070 6f 6e 20 28 61 6e 64 20 70 6f 73 73 69 62 6c 79  on (and possibly
20080 20 72 65 73 65 74 29 20 74 68 65 20 72 75 6e 74   reset) the runt
20090 69 6d 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ime..      #    
200a0 20 20 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e     configuration
200b0 20 73 74 61 74 69 73 74 69 63 73 2e 0d 0a 20 20   statistics...  
200c0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
200d0 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f 62 6a 65  {[haveSQLiteObje
200e0 63 74 43 6f 6d 6d 61 6e 64 5d 20 26 26 20 5c 0d  ctCommand] && \.
200f0 0a 20 20 20 20 20 20 20 20 20 20 5b 68 61 76 65  .          [have
20100 43 6f 6e 73 74 72 61 69 6e 74 20 62 75 69 6c 64  Constraint build
20110 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 44 65  Configuration.De
20120 62 75 67 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  bug]} then {..  
20130 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
20140 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62   {..          ob
20150 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61  ject invoke -fla
20160 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 2d 61  gs +NonPublic -a
20170 6c 69 61 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  lias \..        
20180 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74        System.Dat
20190 61 2e 53 51 4c 69 74 65 2e 44 65 62 75 67 44 61  a.SQLite.DebugDa
201a0 74 61 20 47 65 74 53 65 74 74 69 6e 67 52 65 61  ta GetSettingRea
201b0 64 43 6f 75 6e 74 73 20 66 61 6c 73 65 0d 0a 20  dCounts false.. 
201c0 20 20 20 20 20 20 20 7d 20 73 65 74 74 69 6e 67         } setting
201d0 52 65 61 64 43 6f 75 6e 74 73 5d 20 3d 3d 20 30  ReadCounts] == 0
201e0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
201f0 20 20 20 20 73 65 74 20 6e 61 6d 65 43 6f 75 6e      set nameCoun
20200 74 20 5b 24 73 65 74 74 69 6e 67 52 65 61 64 43  t [$settingReadC
20210 6f 75 6e 74 73 20 43 6f 75 6e 74 5d 0d 0a 20 20  ounts Count]..  
20220 20 20 20 20 20 20 20 20 73 65 74 20 76 61 6c 75          set valu
20230 65 43 6f 75 6e 74 20 30 0d 0a 0d 0a 20 20 20 20  eCount 0....    
20240 20 20 20 20 20 20 6f 62 6a 65 63 74 20 66 6f 72        object for
20250 65 61 63 68 20 2d 61 6c 69 61 73 20 70 61 69 72  each -alias pair
20260 20 24 73 65 74 74 69 6e 67 52 65 61 64 43 6f 75   $settingReadCou
20270 6e 74 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  nts {..         
20280 20 20 20 69 6e 63 72 20 76 61 6c 75 65 43 6f 75     incr valueCou
20290 6e 74 20 5b 24 70 61 69 72 20 56 61 6c 75 65 5d  nt [$pair Value]
202a0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
202b0 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
202c0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
202d0 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
202e0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
202f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20300 20 20 20 22 2d 2d 2d 2d 20 73 65 74 74 69 6e 67     "---- setting
20310 20 5c 22 22 20 5b 24 70 61 69 72 20 4b 65 79 5d   \"" [$pair Key]
20320 20 22 5c 22 20 77 61 73 20 72 65 61 64 20 22 20   "\" was read " 
20330 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
20340 20 20 20 20 20 5b 24 70 61 69 72 20 56 61 6c 75       [$pair Valu
20350 65 5d 20 22 20 74 69 6d 65 73 5c 6e 22 5d 0d 0a  e] " times\n"]..
20360 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
20370 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
20380 20 20 20 20 20 20 20 20 69 66 20 7b 24 72 65 73          if {$res
20390 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
203a0 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
203b0 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
203c0 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b      object invok
203d0 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62  e -flags +NonPub
203e0 6c 69 63 20 2d 61 6c 69 61 73 20 5c 0d 0a 20 20  lic -alias \..  
203f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20400 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
20410 74 65 2e 44 65 62 75 67 44 61 74 61 20 43 6c 65  te.DebugData Cle
20420 61 72 53 65 74 74 69 6e 67 52 65 61 64 43 6f 75  arSettingReadCou
20430 6e 74 73 20 66 61 6c 73 65 0d 0a 20 20 20 20 20  nts false..     
20440 20 20 20 20 20 20 20 7d 20 65 72 72 6f 72 5d 20         } error] 
20450 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
20460 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
20470 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
20480 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20490 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
204a0 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
204b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
204c0 20 20 20 22 2d 2d 2d 2d 20 72 65 73 65 74 20 73     "---- reset s
204d0 65 74 74 69 6e 67 20 73 74 61 74 69 73 74 69 63  etting statistic
204e0 73 20 66 6f 72 20 74 68 65 20 70 72 65 76 69 6f  s for the previo
204f0 75 73 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20  us " \..        
20500 20 20 20 20 20 20 20 20 20 20 20 20 24 6e 61 6d              $nam
20510 65 43 6f 75 6e 74 20 22 20 6e 61 6d 65 73 20 61  eCount " names a
20520 6e 64 20 22 20 24 76 61 6c 75 65 43 6f 75 6e 74  nd " $valueCount
20530 20 22 20 76 61 6c 75 65 73 20 72 65 61 64 5c 6e   " values read\n
20540 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  "]..            
20550 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
20560 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
20570 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71           if {!$q
20580 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
20590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70                tp
205a0 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
205b0 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
205c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
205d0 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66  "==== WARNING: f
205e0 61 69 6c 65 64 20 74 6f 20 72 65 73 65 74 20 73  ailed to reset s
205f0 65 74 74 69 6e 67 20 73 74 61 74 69 73 74 69 63  etting statistic
20600 73 20 66 6f 72 20 22 20 5c 0d 0a 20 20 20 20 20  s for " \..     
20610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
20620 74 68 65 20 70 72 65 76 69 6f 75 73 20 22 20 24  the previous " $
20630 6e 61 6d 65 43 6f 75 6e 74 20 22 20 6e 61 6d 65  nameCount " name
20640 73 20 61 6e 64 20 22 20 24 76 61 6c 75 65 43 6f  s and " $valueCo
20650 75 6e 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  unt \..         
20660 20 20 20 20 20 20 20 20 20 20 20 22 20 76 61 6c             " val
20670 75 65 73 20 72 65 61 64 2c 20 65 72 72 6f 72 3a  ues read, error:
20680 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c   " \n\t $error \
20690 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  n]..            
206a0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
206b0 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d   }..          }.
206c0 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
206d0 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
206e0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62   {..          ob
206f0 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61  ject invoke -fla
20700 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 2d 61  gs +NonPublic -a
20710 6c 69 61 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  lias \..        
20720 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74        System.Dat
20730 61 2e 53 51 4c 69 74 65 2e 44 65 62 75 67 44 61  a.SQLite.DebugDa
20740 74 61 20 47 65 74 53 65 74 74 69 6e 67 52 65 61  ta GetSettingRea
20750 64 43 6f 75 6e 74 73 20 74 72 75 65 0d 0a 20 20  dCounts true..  
20760 20 20 20 20 20 20 7d 20 73 65 74 74 69 6e 67 46        } settingF
20770 69 6c 65 52 65 61 64 43 6f 75 6e 74 73 5d 20 3d  ileReadCounts] =
20780 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
20790 20 20 20 20 20 20 20 73 65 74 20 6e 61 6d 65 43         set nameC
207a0 6f 75 6e 74 20 5b 24 73 65 74 74 69 6e 67 46 69  ount [$settingFi
207b0 6c 65 52 65 61 64 43 6f 75 6e 74 73 20 43 6f 75  leReadCounts Cou
207c0 6e 74 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 73  nt]..          s
207d0 65 74 20 76 61 6c 75 65 43 6f 75 6e 74 20 30 0d  et valueCount 0.
207e0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a  ...          obj
207f0 65 63 74 20 66 6f 72 65 61 63 68 20 2d 61 6c 69  ect foreach -ali
20800 61 73 20 70 61 69 72 20 24 73 65 74 74 69 6e 67  as pair $setting
20810 46 69 6c 65 52 65 61 64 43 6f 75 6e 74 73 20 7b  FileReadCounts {
20820 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  ..            in
20830 63 72 20 76 61 6c 75 65 43 6f 75 6e 74 20 5b 24  cr valueCount [$
20840 70 61 69 72 20 56 61 6c 75 65 5d 0d 0a 0d 0a 20  pair Value].... 
20850 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
20860 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
20870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70                tp
20880 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
20890 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
208a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
208b0 2d 2d 2d 20 73 65 74 74 69 6e 67 20 5c 22 22 20  --- setting \"" 
208c0 5b 24 70 61 69 72 20 4b 65 79 5d 20 22 5c 22 20  [$pair Key] "\" 
208d0 77 61 73 20 72 65 61 64 20 22 20 5c 0d 0a 20 20  was read " \..  
208e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
208f0 5b 24 70 61 69 72 20 56 61 6c 75 65 5d 20 22 20  [$pair Value] " 
20900 74 69 6d 65 73 20 66 72 6f 6d 20 74 68 65 20 63  times from the c
20910 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 66 69 6c  onfiguration fil
20920 65 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20  e\n"]..         
20930 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
20940 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69  }....          i
20950 66 20 7b 24 72 65 73 65 74 7d 20 74 68 65 6e 20  f {$reset} then 
20960 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  {..            i
20970 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  f {[catch {..   
20980 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63             objec
20990 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20  t invoke -flags 
209a0 2b 4e 6f 6e 50 75 62 6c 69 63 20 2d 61 6c 69 61  +NonPublic -alia
209b0 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
209c0 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61         System.Da
209d0 74 61 2e 53 51 4c 69 74 65 2e 44 65 62 75 67 44  ta.SQLite.DebugD
209e0 61 74 61 20 43 6c 65 61 72 53 65 74 74 69 6e 67  ata ClearSetting
209f0 52 65 61 64 43 6f 75 6e 74 73 20 74 72 75 65 0d  ReadCounts true.
20a00 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65  .            } e
20a10 72 72 6f 72 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  rror] == 0} then
20a20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
20a30 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
20a40 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
20a50 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
20a60 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
20a70 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
20a80 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 72           "---- r
20a90 65 73 65 74 20 73 65 74 74 69 6e 67 20 73 74 61  eset setting sta
20aa0 74 69 73 74 69 63 73 20 66 6f 72 20 74 68 65 20  tistics for the 
20ab0 70 72 65 76 69 6f 75 73 20 22 20 5c 0d 0a 20 20  previous " \..  
20ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ad0 20 20 24 6e 61 6d 65 43 6f 75 6e 74 20 22 20 6e    $nameCount " n
20ae0 61 6d 65 73 20 61 6e 64 20 22 20 24 76 61 6c 75  ames and " $valu
20af0 65 43 6f 75 6e 74 20 22 20 76 61 6c 75 65 73 20  eCount " values 
20b00 72 65 61 64 20 22 20 5c 0d 0a 20 20 20 20 20 20  read " \..      
20b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 66                "f
20b20 72 6f 6d 20 74 68 65 20 63 6f 6e 66 69 67 75 72  rom the configur
20b30 61 74 69 6f 6e 20 66 69 6c 65 5c 6e 22 5d 0d 0a  ation file\n"]..
20b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
20b50 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65  .            } e
20b60 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
20b70 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
20b80 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
20b90 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
20ba0 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
20bb0 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
20bc0 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d              "===
20bd0 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65  = WARNING: faile
20be0 64 20 74 6f 20 72 65 73 65 74 20 73 65 74 74 69  d to reset setti
20bf0 6e 67 20 73 74 61 74 69 73 74 69 63 73 20 66 6f  ng statistics fo
20c00 72 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  r " \..         
20c10 20 20 20 20 20 20 20 20 20 20 20 22 74 68 65 20             "the 
20c20 70 72 65 76 69 6f 75 73 20 22 20 24 6e 61 6d 65  previous " $name
20c30 43 6f 75 6e 74 20 22 20 6e 61 6d 65 73 20 61 6e  Count " names an
20c40 64 20 22 20 24 76 61 6c 75 65 43 6f 75 6e 74 20  d " $valueCount 
20c50 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
20c60 20 20 20 20 20 20 20 22 20 76 61 6c 75 65 73 20         " values 
20c70 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 63 6f  read from the co
20c80 6e 66 69 67 75 72 61 74 69 6f 6e 20 66 69 6c 65  nfiguration file
20c90 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20  , error: " \n\t 
20ca0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
20cb0 20 20 20 20 20 20 20 24 65 72 72 6f 72 20 5c 6e         $error \n
20cc0 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ]..             
20cd0 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
20ce0 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  }..          }..
20cf0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
20d00 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
20d10 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a  {..          obj
20d20 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67  ect invoke -flag
20d30 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 2d 61 6c  s +NonPublic -al
20d40 69 61 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ias \..         
20d50 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61       System.Data
20d60 2e 53 51 4c 69 74 65 2e 44 65 62 75 67 44 61 74  .SQLite.DebugDat
20d70 61 20 47 65 74 4f 74 68 65 72 43 6f 75 6e 74 73  a GetOtherCounts
20d80 0d 0a 20 20 20 20 20 20 20 20 7d 20 6f 74 68 65  ..        } othe
20d90 72 43 6f 75 6e 74 73 5d 20 3d 3d 20 30 7d 20 74  rCounts] == 0} t
20da0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
20db0 20 73 65 74 20 6e 61 6d 65 43 6f 75 6e 74 20 5b   set nameCount [
20dc0 24 6f 74 68 65 72 43 6f 75 6e 74 73 20 43 6f 75  $otherCounts Cou
20dd0 6e 74 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 73  nt]..          s
20de0 65 74 20 76 61 6c 75 65 43 6f 75 6e 74 20 30 0d  et valueCount 0.
20df0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a  ...          obj
20e00 65 63 74 20 66 6f 72 65 61 63 68 20 2d 61 6c 69  ect foreach -ali
20e10 61 73 20 70 61 69 72 20 24 6f 74 68 65 72 43 6f  as pair $otherCo
20e20 75 6e 74 73 20 7b 0d 0a 20 20 20 20 20 20 20 20  unts {..        
20e30 20 20 20 20 69 6e 63 72 20 76 61 6c 75 65 43 6f      incr valueCo
20e40 75 6e 74 20 5b 24 70 61 69 72 20 56 61 6c 75 65  unt [$pair Value
20e50 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ]....           
20e60 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
20e70 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
20e80 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
20e90 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
20ea0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
20eb0 20 20 20 20 22 2d 2d 2d 2d 20 6f 74 68 65 72 20      "---- other 
20ec0 63 6f 75 6e 74 65 72 20 5c 22 22 20 5b 24 70 61  counter \"" [$pa
20ed0 69 72 20 4b 65 79 5d 20 22 5c 22 20 68 61 73 20  ir Key] "\" has 
20ee0 76 61 6c 75 65 20 22 20 5c 0d 0a 20 20 20 20 20  value " \..     
20ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 24 70               [$p
20f00 61 69 72 20 56 61 6c 75 65 5d 20 5c 6e 5d 0d 0a  air Value] \n]..
20f10 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
20f20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
20f30 20 20 20 20 20 20 20 20 69 66 20 7b 24 72 65 73          if {$res
20f40 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
20f50 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
20f60 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
20f70 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b      object invok
20f80 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62  e -flags +NonPub
20f90 6c 69 63 20 2d 61 6c 69 61 73 20 5c 0d 0a 20 20  lic -alias \..  
20fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20fb0 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
20fc0 74 65 2e 44 65 62 75 67 44 61 74 61 20 43 6c 65  te.DebugData Cle
20fd0 61 72 4f 74 68 65 72 43 6f 75 6e 74 73 0d 0a 20  arOtherCounts.. 
20fe0 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 72 72             } err
20ff0 6f 72 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  or] == 0} then {
21000 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
21010 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
21020 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
21030 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
21040 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
21050 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
21060 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 72 65 73         "---- res
21070 65 74 20 6f 74 68 65 72 20 63 6f 75 6e 74 65 72  et other counter
21080 73 20 66 6f 72 20 74 68 65 20 70 72 65 76 69 6f  s for the previo
21090 75 73 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20  us " \..        
210a0 20 20 20 20 20 20 20 20 20 20 20 20 24 6e 61 6d              $nam
210b0 65 43 6f 75 6e 74 20 22 20 6e 61 6d 65 73 20 61  eCount " names a
210c0 6e 64 20 22 20 24 76 61 6c 75 65 43 6f 75 6e 74  nd " $valueCount
210d0 20 22 20 76 61 6c 75 65 73 5c 6e 22 5d 0d 0a 20   " values\n"].. 
210e0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
210f0 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c              } el
21100 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
21110 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
21120 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
21130 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
21140 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
21150 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
21160 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d             "====
21170 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64   WARNING: failed
21180 20 74 6f 20 72 65 73 65 74 20 6f 74 68 65 72 20   to reset other 
21190 63 6f 75 6e 74 65 72 73 20 66 6f 72 20 22 20 5c  counters for " \
211a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
211b0 20 20 20 20 20 20 22 74 68 65 20 70 72 65 76 69        "the previ
211c0 6f 75 73 20 22 20 24 6e 61 6d 65 43 6f 75 6e 74  ous " $nameCount
211d0 20 22 20 6e 61 6d 65 73 20 61 6e 64 20 22 20 24   " names and " $
211e0 76 61 6c 75 65 43 6f 75 6e 74 20 5c 0d 0a 20 20  valueCount \..  
211f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21200 20 20 22 20 76 61 6c 75 65 73 2c 20 65 72 72 6f    " values, erro
21210 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72  r: " \n\t $error
21220 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \n]..          
21230 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
21240 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
21250 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  }..        }..  
21260 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69      }....      i
21270 66 20 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f 62  f {[haveSQLiteOb
21280 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d 20 26 26 20  jectCommand] && 
21290 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 68 61  \..          [ha
212a0 76 65 53 51 4c 69 74 65 44 65 66 69 6e 65 43 6f  veSQLiteDefineCo
212b0 6e 73 74 61 6e 74 20 49 4e 54 45 52 4f 50 5f 56  nstant INTEROP_V
212c0 49 52 54 55 41 4c 5f 54 41 42 4c 45 5d 20 26 26  IRTUAL_TABLE] &&
212d0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 68   \..          [h
212e0 61 76 65 53 51 4c 69 74 65 44 65 66 69 6e 65 43  aveSQLiteDefineC
212f0 6f 6e 73 74 61 6e 74 20 54 52 41 43 4b 5f 4d 45  onstant TRACK_ME
21300 4d 4f 52 59 5f 42 59 54 45 53 5d 7d 20 74 68 65  MORY_BYTES]} the
21310 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20  n {..        if 
21320 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
21330 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74  ..          tput
21340 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d  s $channel "----
21350 20 63 75 72 72 65 6e 74 20 6d 65 6d 6f 72 79 20   current memory 
21360 69 6e 20 75 73 65 20 62 79 20 53 51 4c 69 74 65  in use by SQLite
21370 4d 65 6d 6f 72 79 2e 2e 2e 20 22 0d 0a 20 20 20  Memory... "..   
21380 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
21390 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
213a0 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74            object
213b0 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b   invoke -flags +
213c0 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20  NonPublic \..   
213d0 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65             Syste
213e0 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51  m.Data.SQLite.SQ
213f0 4c 69 74 65 4d 65 6d 6f 72 79 20 62 79 74 65 73  LiteMemory bytes
21400 41 6c 6c 6f 63 61 74 65 64 0d 0a 20 20 20 20 20  Allocated..     
21410 20 20 20 7d 20 6d 65 6d 6f 72 79 5d 20 3d 3d 20     } memory] == 
21420 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
21430 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
21440 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
21450 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
21460 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
21470 20 24 6d 65 6d 6f 72 79 20 22 20 62 79 74 65 73   $memory " bytes
21480 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  \n"]..          
21490 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73  }..        } els
214a0 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73  e {..          s
214b0 65 74 20 6d 65 6d 6f 72 79 20 75 6e 6b 6e 6f 77  et memory unknow
214c0 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69  n....          i
214d0 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
214e0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
214f0 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
21500 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f  appendArgs $memo
21510 72 79 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  ry \n]..        
21520 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
21530 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 24  ..        if {!$
21540 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
21550 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
21560 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 6d 61  channel "---- ma
21570 78 69 6d 75 6d 20 6d 65 6d 6f 72 79 20 69 6e 20  ximum memory in 
21580 75 73 65 20 62 79 20 53 51 4c 69 74 65 4d 65 6d  use by SQLiteMem
21590 6f 72 79 2e 2e 2e 20 22 0d 0a 20 20 20 20 20 20  ory... "..      
215a0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69    }....        i
215b0 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  f {[catch {..   
215c0 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e         object in
215d0 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e  voke -flags +Non
215e0 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20  Public \..      
215f0 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44          System.D
21600 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74  ata.SQLite.SQLit
21610 65 4d 65 6d 6f 72 79 20 6d 61 78 69 6d 75 6d 42  eMemory maximumB
21620 79 74 65 73 41 6c 6c 6f 63 61 74 65 64 0d 0a 20  ytesAllocated.. 
21630 20 20 20 20 20 20 20 7d 20 6d 65 6d 6f 72 79 5d         } memory]
21640 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
21650 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71           if {!$q
21660 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
21670 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
21680 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
21690 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 22 20 62  Args $memory " b
216a0 79 74 65 73 5c 6e 22 5d 0d 0a 20 20 20 20 20 20  ytes\n"]..      
216b0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
216c0 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
216d0 20 20 20 73 65 74 20 6d 65 6d 6f 72 79 20 75 6e     set memory un
216e0 6b 6e 6f 77 6e 0d 0a 0d 0a 20 20 20 20 20 20 20  known....       
216f0 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
21700 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
21710 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
21720 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24  el [appendArgs $
21730 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20 20  memory \n]..    
21740 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
21750 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20   }..      }.... 
21760 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
21770 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
21780 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
21790 20 22 2d 2d 2d 2d 20 63 75 72 72 65 6e 74 20 6d   "---- current m
217a0 65 6d 6f 72 79 20 69 6e 20 75 73 65 20 62 79 20  emory in use by 
217b0 53 51 4c 69 74 65 2e 2e 2e 20 22 0d 0a 20 20 20  SQLite... "..   
217c0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66     }....      if
217d0 20 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f 62 6a   {[haveSQLiteObj
217e0 65 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65  ectCommand]} the
217f0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20  n {..        if 
21800 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
21810 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f       object invo
21820 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75  ke -flags +NonPu
21830 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20  blic \..        
21840 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74        System.Dat
21850 61 2e 53 51 4c 69 74 65 2e 55 6e 73 61 66 65 4e  a.SQLite.UnsafeN
21860 61 74 69 76 65 4d 65 74 68 6f 64 73 20 73 71 6c  ativeMethods sql
21870 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 75 73 65 64  ite3_memory_used
21880 0d 0a 20 20 20 20 20 20 20 20 7d 20 6d 65 6d 6f  ..        } memo
21890 72 79 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  ry] == 0} then {
218a0 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
218b0 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
218c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
218d0 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
218e0 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20  endArgs $memory 
218f0 22 20 62 79 74 65 73 5c 6e 22 5d 0d 0a 20 20 20  " bytes\n"]..   
21900 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
21910 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
21920 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
21930 20 20 20 23 20 4e 4f 54 45 3a 20 4d 61 79 62 65     # NOTE: Maybe
21940 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65   the SQLite core
21950 20 6c 69 62 72 61 72 79 20 69 73 20 75 6e 61 76   library is unav
21960 61 69 6c 61 62 6c 65 3f 0d 0a 20 20 20 20 20 20  ailable?..      
21970 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
21980 20 73 65 74 20 6d 65 6d 6f 72 79 20 75 6e 6b 6e   set memory unkn
21990 6f 77 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  own....         
219a0 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
219b0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
219c0 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
219d0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65   [appendArgs $me
219e0 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  mory \n]..      
219f0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
21a00 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
21a10 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 6d 65  ..        set me
21a20 6d 6f 72 79 20 75 6e 61 76 61 69 6c 61 62 6c 65  mory unavailable
21a30 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b  ....        if {
21a40 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
21a50 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
21a60 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
21a70 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 5c 6e  dArgs $memory \n
21a80 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  ]..        }..  
21a90 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 73      }....      s
21aa0 65 74 20 72 65 73 75 6c 74 20 24 6d 65 6d 6f 72  et result $memor
21ab0 79 3b 20 23 20 4e 4f 54 45 3a 20 52 65 74 75 72  y; # NOTE: Retur
21ac0 6e 20 6d 65 6d 6f 72 79 20 69 6e 2d 75 73 65 20  n memory in-use 
21ad0 74 6f 20 6f 75 72 20 63 61 6c 6c 65 72 2e 0d 0a  to our caller...
21ae0 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 24 71 75  ..      if {!$qu
21af0 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
21b00 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
21b10 6e 65 6c 20 22 2d 2d 2d 2d 20 6d 61 78 69 6d 75  nel "---- maximu
21b20 6d 20 6d 65 6d 6f 72 79 20 69 6e 20 75 73 65 20  m memory in use 
21b30 62 79 20 53 51 4c 69 74 65 2e 2e 2e 20 22 0d 0a  by SQLite... "..
21b40 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
21b50 20 69 66 20 7b 5b 68 61 76 65 53 51 4c 69 74 65   if {[haveSQLite
21b60 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20  ObjectCommand]} 
21b70 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
21b80 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20  if {[catch {..  
21b90 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69          object i
21ba0 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f  nvoke -flags +No
21bb0 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20  nPublic \..     
21bc0 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e           System.
21bd0 44 61 74 61 2e 53 51 4c 69 74 65 2e 55 6e 73 61  Data.SQLite.Unsa
21be0 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 20  feNativeMethods 
21bf0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
21c00 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f   sqlite3_memory_
21c10 68 69 67 68 77 61 74 65 72 20 30 0d 0a 20 20 20  highwater 0..   
21c20 20 20 20 20 20 7d 20 6d 65 6d 6f 72 79 5d 20 3d       } memory] =
21c30 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
21c40 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
21c50 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
21c60 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
21c70 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
21c80 67 73 20 24 6d 65 6d 6f 72 79 20 22 20 62 79 74  gs $memory " byt
21c90 65 73 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20  es\n"]..        
21ca0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65    }..        } e
21cb0 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
21cc0 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
21cd0 4e 4f 54 45 3a 20 4d 61 79 62 65 20 74 68 65 20  NOTE: Maybe the 
21ce0 53 51 4c 69 74 65 20 63 6f 72 65 20 6c 69 62 72  SQLite core libr
21cf0 61 72 79 20 69 73 20 75 6e 61 76 61 69 6c 61 62  ary is unavailab
21d00 6c 65 3f 0d 0a 20 20 20 20 20 20 20 20 20 20 23  le?..          #
21d10 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
21d20 6d 65 6d 6f 72 79 20 75 6e 6b 6e 6f 77 6e 0d 0a  memory unknown..
21d30 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
21d40 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
21d50 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
21d60 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
21d70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20  endArgs $memory 
21d80 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  \n]..          }
21d90 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
21da0 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
21db0 20 20 20 20 20 73 65 74 20 6d 65 6d 6f 72 79 20       set memory 
21dc0 75 6e 61 76 61 69 6c 61 62 6c 65 0d 0a 0d 0a 20  unavailable.... 
21dd0 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
21de0 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
21df0 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
21e00 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
21e10 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20   $memory \n]..  
21e20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
21e30 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 63  ....      if {$c
21e40 6f 6c 6c 65 63 74 7d 20 74 68 65 6e 20 7b 0d 0a  ollect} then {..
21e50 20 20 20 20 20 20 20 20 63 6f 6c 6c 65 63 74 47          collectG
21e60 61 72 62 61 67 65 20 24 63 68 61 6e 6e 65 6c 0d  arbage $channel.
21e70 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
21e80 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
21e90 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74  hen {..        t
21ea0 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d  puts $channel "-
21eb0 2d 2d 2d 20 63 75 72 72 65 6e 74 20 6d 65 6d 6f  --- current memo
21ec0 72 79 20 69 6e 20 75 73 65 20 62 79 20 74 68 65  ry in use by the
21ed0 20 43 4c 52 2e 2e 2e 20 22 0d 0a 20 20 20 20 20   CLR... "..     
21ee0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b   }....      if {
21ef0 5b 68 61 76 65 53 51 4c 69 74 65 4f 62 6a 65 63  [haveSQLiteObjec
21f00 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65 6e 20  tCommand]} then 
21f10 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  {..        if {[
21f20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
21f30 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65     object invoke
21f40 20 47 43 20 47 65 74 54 6f 74 61 6c 4d 65 6d 6f   GC GetTotalMemo
21f50 72 79 20 66 61 6c 73 65 0d 0a 20 20 20 20 20 20  ry false..      
21f60 20 20 7d 20 6d 65 6d 6f 72 79 5d 20 3d 3d 20 30    } memory] == 0
21f70 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
21f80 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
21f90 69 73 20 69 6e 74 65 67 65 72 20 2d 73 74 72 69  is integer -stri
21fa0 63 74 20 24 6d 65 6d 6f 72 79 5d 7d 20 74 68 65  ct $memory]} the
21fb0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
21fc0 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
21fd0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
21fe0 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
21ff0 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24  el [appendArgs $
22000 6d 65 6d 6f 72 79 20 22 20 62 79 74 65 73 5c 6e  memory " bytes\n
22010 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  "]..            
22020 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65  }..          } e
22030 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
22040 20 20 20 73 65 74 20 6d 65 6d 6f 72 79 20 69 6e     set memory in
22050 76 61 6c 69 64 0d 0a 0d 0a 20 20 20 20 20 20 20  valid....       
22060 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
22070 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
22080 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
22090 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
220a0 67 73 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a  gs $memory \n]..
220b0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
220c0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
220d0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
220e0 20 20 20 20 20 20 20 20 73 65 74 20 6d 65 6d 6f          set memo
220f0 72 79 20 75 6e 6b 6e 6f 77 6e 0d 0a 0d 0a 20 20  ry unknown....  
22100 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
22110 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
22120 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
22130 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
22140 72 67 73 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d  rgs $memory \n].
22150 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
22160 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
22170 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
22180 20 73 65 74 20 6d 65 6d 6f 72 79 20 75 6e 61 76   set memory unav
22190 61 69 6c 61 62 6c 65 0d 0a 0d 0a 20 20 20 20 20  ailable....     
221a0 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
221b0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
221c0 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
221d0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65   [appendArgs $me
221e0 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  mory \n]..      
221f0 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a    }..      }....
22200 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 72 65        return $re
22210 73 75 6c 74 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  sult..    }.....
22220 20 20 20 20 70 72 6f 63 20 63 68 65 63 6b 46 6f      proc checkFo
22230 72 53 51 4c 69 74 65 44 69 72 65 63 74 6f 72 69  rSQLiteDirectori
22240 65 73 20 7b 20 63 68 61 6e 6e 65 6c 20 7b 72 65  es { channel {re
22250 73 65 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a  set false} } {..
22260 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
22270 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20   NOTE: Check if 
22280 74 68 65 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  the sqlite3_win3
22290 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79 20  2_set_directory 
222a0 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 76 61 69  function is avai
222b0 6c 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20 23 0d  lable...      #.
222c0 0a 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68  .      tputs $ch
222d0 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20  annel \..       
222e0 20 20 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e     "---- checkin
222f0 67 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20 73  g for function s
22300 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74  qlite3_win32_set
22310 5f 64 69 72 65 63 74 6f 72 79 2e 2e 2e 20 22 0d  _directory... ".
22320 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
22330 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 63    # NOTE: This c
22340 61 6c 6c 20 74 6f 20 74 68 65 20 73 71 6c 69 74  all to the sqlit
22350 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72  e3_win32_set_dir
22360 65 63 74 6f 72 79 20 66 75 6e 63 74 69 6f 6e 20  ectory function 
22370 75 73 65 73 20 74 68 65 0d 0a 20 20 20 20 20 20  uses the..      
22380 23 20 20 20 20 20 20 20 69 6e 76 61 6c 69 64 20  #       invalid 
22390 76 61 6c 75 65 20 30 20 66 6f 72 20 74 68 65 20  value 0 for the 
223a0 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20  first argument. 
223b0 20 54 68 69 73 20 63 6f 64 65 20 69 73 20 64 65   This code is de
223c0 73 69 67 6e 65 64 0d 0a 20 20 20 20 20 20 23 20  signed..      # 
223d0 20 20 20 20 20 20 74 6f 20 63 68 65 63 6b 20 69        to check i
223e0 66 20 63 61 6c 6c 69 6e 67 20 74 68 65 20 66 75  f calling the fu
223f0 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 72 61 69 73  nction will rais
22400 65 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 20 28  e an exception (
22410 69 2e 65 2e 0d 0a 20 20 20 20 20 20 23 20 20 20  i.e...      #   
22420 20 20 20 20 74 68 65 20 61 63 74 75 61 6c 20 72      the actual r
22430 65 73 75 6c 74 20 6f 66 20 74 68 65 20 66 75 6e  esult of the fun
22440 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6d  ction does not m
22450 61 74 74 65 72 20 61 73 20 6c 6f 6e 67 20 61 73  atter as long as
22460 20 6e 6f 0d 0a 20 20 20 20 20 20 23 20 20 20 20   no..      #    
22470 20 20 20 64 69 72 65 63 74 6f 72 79 20 69 73 20     directory is 
22480 63 68 61 6e 67 65 64 29 2e 0d 0a 20 20 20 20 20  changed)...     
22490 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69   #..      if {[i
224a0 73 57 69 6e 64 6f 77 73 5d 20 26 26 20 5b 63 61  sWindows] && [ca
224b0 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 6f  tch {..        o
224c0 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c  bject invoke -fl
224d0 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c  ags +NonPublic \
224e0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 79  ..            Sy
224f0 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
22500 2e 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74  .UnsafeNativeMet
22510 68 6f 64 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  hods \..        
22520 20 20 20 20 73 71 6c 69 74 65 33 5f 77 69 6e 33      sqlite3_win3
22530 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79 20  2_set_directory 
22540 30 20 6e 75 6c 6c 0d 0a 20 20 20 20 20 20 7d 5d  0 null..      }]
22550 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
22560 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
22570 20 20 23 20 4e 4f 54 45 3a 20 43 61 6c 6c 69 6e    # NOTE: Callin
22580 67 20 74 68 65 20 73 71 6c 69 74 65 33 5f 77 69  g the sqlite3_wi
22590 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72  n32_set_director
225a0 79 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20  y function does 
225b0 6e 6f 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20  not..        #  
225c0 20 20 20 20 20 63 61 75 73 65 20 61 6e 20 65 78       cause an ex
225d0 63 65 70 74 69 6f 6e 3b 20 74 68 65 72 65 66 6f  ception; therefo
225e0 72 65 2c 20 69 74 20 6d 75 73 74 20 62 65 20 61  re, it must be a
225f0 76 61 69 6c 61 62 6c 65 20 28 69 2e 65 2e 0d 0a  vailable (i.e...
22600 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
22610 65 76 65 6e 20 74 68 6f 75 67 68 20 69 74 20 73  even though it s
22620 68 6f 75 6c 64 20 72 65 74 75 72 6e 20 61 20 66  hould return a f
22630 61 69 6c 75 72 65 20 72 65 74 75 72 6e 20 63 6f  ailure return co
22640 64 65 20 69 6e 20 74 68 69 73 0d 0a 20 20 20 20  de in this..    
22650 20 20 20 20 23 20 20 20 20 20 20 20 63 61 73 65      #       case
22660 29 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  )...        #.. 
22670 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72         addConstr
22680 61 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 69 6e  aint sqlite3_win
22690 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79  32_set_directory
226a0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74  ....        tput
226b0 73 20 24 63 68 61 6e 6e 65 6c 20 79 65 73 5c 6e  s $channel yes\n
226c0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
226d0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 44         # NOTE: D
226e0 6f 65 73 20 6f 75 72 20 63 61 6c 6c 65 72 20 77  oes our caller w
226f0 61 6e 74 20 74 6f 20 72 65 73 65 74 20 74 68 65  ant to reset the
22700 20 64 69 72 65 63 74 6f 72 69 65 73 3f 0d 0a 20   directories?.. 
22710 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
22720 20 20 69 66 20 7b 24 72 65 73 65 74 7d 20 74 68    if {$reset} th
22730 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
22740 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e  #..          # N
22750 4f 54 45 3a 20 4e 6f 77 20 6d 61 6b 65 20 73 75  OTE: Now make su
22760 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  re the database 
22770 61 6e 64 20 74 65 6d 70 6f 72 61 72 79 20 64 69  and temporary di
22780 72 65 63 74 6f 72 69 65 73 20 61 72 65 0d 0a 20  rectories are.. 
22790 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
227a0 20 72 65 73 65 74 20 74 68 65 69 72 20 64 65 66   reset their def
227b0 61 75 6c 74 20 76 61 6c 75 65 73 2c 20 77 68 69  ault values, whi
227c0 63 68 20 73 68 6f 75 6c 64 20 62 65 20 6e 75 6c  ch should be nul
227d0 6c 20 66 6f 72 20 62 6f 74 68 2e 0d 0a 20 20 20  l for both...   
227e0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 53         #       S
227f0 69 6e 63 65 20 74 68 65 20 73 71 6c 69 74 65 33  ince the sqlite3
22800 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63  _win32_set_direc
22810 74 6f 72 79 20 66 75 6e 63 74 69 6f 6e 20 69 73  tory function is
22820 20 61 76 61 69 6c 61 62 6c 65 2c 0d 0a 20 20 20   available,..   
22830 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 75         #       u
22840 73 65 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20  se it...        
22850 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 66    #..          f
22860 6f 72 20 7b 73 65 74 20 69 6e 64 65 78 20 31 7d  or {set index 1}
22870 20 7b 24 69 6e 64 65 78 20 3c 20 33 7d 20 7b 69   {$index < 3} {i
22880 6e 63 72 20 69 6e 64 65 78 7d 20 7b 0d 0a 20 20  ncr index} {..  
22890 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63            if {[c
228a0 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
228b0 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76        object inv
228c0 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50  oke -flags +NonP
228d0 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20  ublic \..       
228e0 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65             Syste
228f0 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 55 6e  m.Data.SQLite.Un
22900 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64  safeNativeMethod
22910 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
22920 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 77         sqlite3_w
22930 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f  in32_set_directo
22940 72 79 20 24 69 6e 64 65 78 20 6e 75 6c 6c 0d 0a  ry $index null..
22950 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 72 65              } re
22960 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  sult] == 0} then
22970 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
22980 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
22990 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
229a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
229b0 20 20 22 2d 2d 2d 2d 20 63 61 6c 6c 20 73 71 6c    "---- call sql
229c0 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64  ite3_win32_set_d
229d0 69 72 65 63 74 6f 72 79 28 22 20 24 69 6e 64 65  irectory(" $inde
229e0 78 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  x \..           
229f0 20 20 20 20 20 20 20 22 2c 20 6e 75 6c 6c 29 2e         ", null).
22a00 2e 2e 20 6f 6b 3a 20 22 20 24 72 65 73 75 6c 74  .. ok: " $result
22a10 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \n]..          
22a20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
22a30 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
22a40 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
22a50 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
22a60 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
22a70 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f 77 69 6e  call sqlite3_win
22a80 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79  32_set_directory
22a90 28 22 20 24 69 6e 64 65 78 20 5c 0d 0a 20 20 20  (" $index \..   
22aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
22ab0 2c 20 6e 75 6c 6c 29 2e 2e 2e 20 65 72 72 6f 72  , null)... error
22ac0 3a 20 22 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74  : " \n\t $result
22ad0 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \n]..          
22ae0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d    }..          }
22af0 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
22b00 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
22b10 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
22b20 6e 65 6c 20 6e 6f 5c 6e 0d 0a 0d 0a 20 20 20 20  nel no\n....    
22b30 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
22b40 20 4e 4f 54 45 3a 20 44 6f 65 73 20 6f 75 72 20   NOTE: Does our 
22b50 63 61 6c 6c 65 72 20 77 61 6e 74 20 74 6f 20 72  caller want to r
22b60 65 73 65 74 20 74 68 65 20 64 69 72 65 63 74 6f  eset the directo
22b70 72 69 65 73 3f 20 20 54 68 69 73 20 63 61 6e 20  ries?  This can 
22b80 6f 6e 6c 79 0d 0a 20 20 20 20 20 20 20 20 23 20  only..        # 
22b90 20 20 20 20 20 20 62 65 20 70 65 72 66 6f 72 6d        be perform
22ba0 65 64 20 69 66 20 53 51 4c 69 74 65 20 69 73 20  ed if SQLite is 
22bb0 6c 6f 61 64 65 64 20 61 6e 64 20 72 65 61 64 79  loaded and ready
22bc0 20 66 6f 72 20 75 73 65 20 62 79 20 74 68 65 20   for use by the 
22bd0 74 65 73 74 0d 0a 20 20 20 20 20 20 20 20 23 20  test..        # 
22be0 20 20 20 20 20 20 73 75 69 74 65 2e 0d 0a 20 20        suite...  
22bf0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
22c00 20 69 66 20 7b 24 72 65 73 65 74 20 26 26 20 5b   if {$reset && [
22c10 69 73 53 51 4c 69 74 65 52 65 61 64 79 5d 7d 20  isSQLiteReady]} 
22c20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
22c30 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23    #..          #
22c40 20 4e 4f 54 45 3a 20 4e 6f 77 20 6d 61 6b 65 20   NOTE: Now make 
22c50 73 75 72 65 20 74 68 65 20 64 61 74 61 62 61 73  sure the databas
22c60 65 20 61 6e 64 20 74 65 6d 70 6f 72 61 72 79 20  e and temporary 
22c70 64 69 72 65 63 74 6f 72 69 65 73 20 61 72 65 0d  directories are.
22c80 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20  .          #    
22c90 20 20 20 72 65 73 65 74 20 74 68 65 69 72 20 64     reset their d
22ca0 65 66 61 75 6c 74 20 76 61 6c 75 65 73 2c 20 77  efault values, w
22cb0 68 69 63 68 20 73 68 6f 75 6c 64 20 62 65 20 6e  hich should be n
22cc0 75 6c 6c 20 66 6f 72 20 62 6f 74 68 2e 0d 0a 20  ull for both... 
22cd0 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
22ce0 20 53 69 6e 63 65 20 74 68 65 20 73 71 6c 69 74   Since the sqlit
22cf0 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72  e3_win32_set_dir
22d00 65 63 74 6f 72 79 20 66 75 6e 63 74 69 6f 6e 20  ectory function 
22d10 64 6f 65 73 20 6e 6f 74 0d 0a 20 20 20 20 20 20  does not..      
22d20 20 20 20 20 23 20 20 20 20 20 20 20 61 70 70 65      #       appe
22d30 61 72 20 74 6f 20 62 65 20 61 76 61 69 6c 61 62  ar to be availab
22d40 6c 65 2c 20 75 73 65 20 74 68 65 20 61 73 73 6f  le, use the asso
22d50 63 69 61 74 65 64 20 50 52 41 47 4d 41 20 63 6f  ciated PRAGMA co
22d60 6d 6d 61 6e 64 73 0d 0a 20 20 20 20 20 20 20 20  mmands..        
22d70 20 20 23 20 20 20 20 20 20 20 69 6e 73 74 65 61    #       instea
22d80 64 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  d...          #.
22d90 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61  .          forea
22da0 63 68 20 64 69 72 65 63 74 6f 72 79 20 5b 6c 69  ch directory [li
22db0 73 74 20 64 61 74 61 5f 73 74 6f 72 65 5f 64 69  st data_store_di
22dc0 72 65 63 74 6f 72 79 20 74 65 6d 70 5f 73 74 6f  rectory temp_sto
22dd0 72 65 5f 64 69 72 65 63 74 6f 72 79 5d 20 7b 0d  re_directory] {.
22de0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74  .            set
22df0 20 73 71 6c 20 5b 61 70 70 65 6e 64 41 72 67 73   sql [appendArgs
22e00 20 22 50 52 41 47 4d 41 20 22 20 24 64 69 72 65   "PRAGMA " $dire
22e10 63 74 6f 72 79 20 22 20 3d 20 5c 22 5c 22 3b 22  ctory " = \"\";"
22e20 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ]....           
22e30 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 65 78 65   if {[catch {exe
22e40 63 75 74 65 53 71 6c 20 24 73 71 6c 7d 20 72 65  cuteSql $sql} re
22e50 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  sult] == 0} then
22e60 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
22e70 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
22e80 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
22e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ea0 20 20 22 2d 2d 2d 2d 20 65 78 65 63 75 74 65 20    "---- execute 
22eb0 50 52 41 47 4d 41 20 22 20 24 64 69 72 65 63 74  PRAGMA " $direct
22ec0 6f 72 79 20 22 2e 2e 2e 20 6f 6b 3a 20 5c 22 22  ory "... ok: \""
22ed0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
22ee0 20 20 20 20 20 20 24 72 65 73 75 6c 74 20 5c 22        $result \"
22ef0 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  \n]..           
22f00 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
22f10 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
22f20 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
22f30 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
22f40 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 65           "---- e
22f50 78 65 63 75 74 65 20 50 52 41 47 4d 41 20 22 20  xecute PRAGMA " 
22f60 24 64 69 72 65 63 74 6f 72 79 20 22 2e 2e 2e 20  $directory "... 
22f70 65 72 72 6f 72 3a 20 22 20 5c 0d 0a 20 20 20 20  error: " \..    
22f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 6e                \n
22f90 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a  \t $result \n]..
22fa0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
22fb0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
22fc0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
22fd0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
22fe0 20 23 20 4e 4f 54 45 3a 20 46 69 6e 61 6c 6c 79   # NOTE: Finally
22ff0 2c 20 73 68 6f 77 20 74 68 65 20 63 75 72 72 65  , show the curre
23000 6e 74 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  nt value of the 
23010 64 61 74 61 62 61 73 65 20 61 6e 64 20 74 65 6d  database and tem
23020 70 6f 72 61 72 79 0d 0a 20 20 20 20 20 20 23 20  porary..      # 
23030 20 20 20 20 20 20 64 69 72 65 63 74 6f 72 69 65        directorie
23040 73 2e 20 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c  s.  This can onl
23050 79 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20 69  y be performed i
23060 66 20 53 51 4c 69 74 65 20 69 73 20 6c 6f 61 64  f SQLite is load
23070 65 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ed..      #     
23080 20 20 61 6e 64 20 72 65 61 64 79 20 66 6f 72 20    and ready for 
23090 75 73 65 20 62 79 20 74 68 65 20 74 65 73 74 20  use by the test 
230a0 73 75 69 74 65 2e 0d 0a 20 20 20 20 20 20 23 0d  suite...      #.
230b0 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 73 53 51  .      if {[isSQ
230c0 4c 69 74 65 52 65 61 64 79 5d 7d 20 74 68 65 6e  LiteReady]} then
230d0 20 7b 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 65   {..        fore
230e0 61 63 68 20 64 69 72 65 63 74 6f 72 79 20 5b 6c  ach directory [l
230f0 69 73 74 20 64 61 74 61 5f 73 74 6f 72 65 5f 64  ist data_store_d
23100 69 72 65 63 74 6f 72 79 20 74 65 6d 70 5f 73 74  irectory temp_st
23110 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 5d 20 7b  ore_directory] {
23120 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74  ..          tput
23130 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
23140 6e 64 41 72 67 73 20 22 2d 2d 2d 2d 20 63 68 65  ndArgs "---- che
23150 63 6b 69 6e 67 20 22 20 24 64 69 72 65 63 74 6f  cking " $directo
23160 72 79 20 22 2e 2e 2e 20 22 5d 0d 0a 0d 0a 20 20  ry "... "]....  
23170 20 20 20 20 20 20 20 20 73 65 74 20 73 71 6c 20          set sql 
23180 5b 61 70 70 65 6e 64 41 72 67 73 20 22 50 52 41  [appendArgs "PRA
23190 47 4d 41 20 22 20 24 64 69 72 65 63 74 6f 72 79  GMA " $directory
231a0 20 5c 3b 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20   \;]....        
231b0 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 65 78    if {[catch {ex
231c0 65 63 75 74 65 53 71 6c 20 24 73 71 6c 20 73 63  ecuteSql $sql sc
231d0 61 6c 61 72 7d 20 72 65 73 75 6c 74 5d 20 3d 3d  alar} result] ==
231e0 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
231f0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
23200 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
23210 67 73 20 22 6f 6b 3a 20 5c 22 22 20 24 72 65 73  gs "ok: \"" $res
23220 75 6c 74 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20  ult \"\n]..     
23230 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
23240 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
23250 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
23260 64 41 72 67 73 20 22 65 72 72 6f 72 3a 20 22 20  dArgs "error: " 
23270 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d  \n\t $result \n]
23280 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
23290 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
232a0 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
232b0 20 70 72 6f 63 20 6c 6f 61 64 53 51 4c 69 74 65   proc loadSQLite
232c0 54 65 73 74 53 65 74 74 69 6e 67 73 20 7b 20 63  TestSettings { c
232d0 68 61 6e 6e 65 6c 20 7b 73 75 66 66 69 78 20 22  hannel {suffix "
232e0 22 7d 20 7b 71 75 69 65 74 20 66 61 6c 73 65 7d  "} {quiet false}
232f0 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20   } {..      #.. 
23300 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69       # NOTE: Ski
23310 70 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 73 65  p loading the se
23320 74 74 69 6e 67 73 20 69 66 20 74 68 65 69 72 20  ttings if their 
23330 75 73 61 67 65 20 68 61 73 20 62 65 65 6e 20 64  usage has been d
23340 69 73 61 62 6c 65 64 2e 0d 0a 20 20 20 20 20 20  isabled...      
23350 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 69  #..      if {![i
23360 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
23370 73 71 6c 69 74 65 54 65 73 74 53 65 74 74 69 6e  sqliteTestSettin
23380 67 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  gs)]} then {..  
23390 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
233a0 20 23 20 4e 4f 54 45 3a 20 4c 6f 61 64 20 63 75   # NOTE: Load cu
233b0 73 74 6f 6d 20 70 65 72 2d 75 73 65 72 20 61 6e  stom per-user an
233c0 64 2f 6f 72 20 70 65 72 2d 68 6f 73 74 20 74 65  d/or per-host te
233d0 73 74 20 73 65 74 74 69 6e 67 73 20 6e 6f 77 2e  st settings now.
233e0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
233f0 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65       if {[info e
23400 78 69 73 74 73 20 3a 3a 74 63 6c 5f 70 6c 61 74  xists ::tcl_plat
23410 66 6f 72 6d 28 75 73 65 72 29 5d 7d 20 74 68 65  form(user)]} the
23420 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73  n {..          s
23430 65 74 20 75 73 65 72 53 65 74 74 69 6e 67 73 46  et userSettingsF
23440 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f  ileName [file jo
23450 69 6e 20 5b 67 65 74 43 6f 6d 6d 6f 6e 44 69 72  in [getCommonDir
23460 65 63 74 6f 72 79 5d 20 5c 0d 0a 20 20 20 20 20  ectory] \..     
23470 20 20 20 20 20 20 20 20 20 5b 61 70 70 65 6e 64           [append
23480 41 72 67 73 20 73 65 74 74 69 6e 67 73 20 24 73  Args settings $s
23490 75 66 66 69 78 20 2e 20 24 3a 3a 74 63 6c 5f 70  uffix . $::tcl_p
234a0 6c 61 74 66 6f 72 6d 28 75 73 65 72 29 20 2e 65  latform(user) .e
234b0 61 67 6c 65 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20  agle]]....      
234c0 20 20 20 20 69 66 20 7b 5b 66 69 6c 65 20 65 78      if {[file ex
234d0 69 73 74 73 20 24 75 73 65 72 53 65 74 74 69 6e  ists $userSettin
234e0 67 73 46 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65  gsFileName]} the
234f0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
23500 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
23510 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
23520 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
23530 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
23540 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
23550 20 20 20 20 22 2d 2d 2d 2d 20 6c 6f 61 64 69 6e      "---- loadin
23560 67 20 70 65 72 2d 75 73 65 72 20 74 65 73 74 20  g per-user test 
23570 73 65 74 74 69 6e 67 73 20 66 69 6c 65 20 5c 22  settings file \"
23580 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
23590 20 20 20 20 20 20 20 24 75 73 65 72 53 65 74 74         $userSett
235a0 69 6e 67 73 46 69 6c 65 4e 61 6d 65 20 5c 22 2e  ingsFileName \".
235b0 2e 2e 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  ..\n]..         
235c0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
235d0 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
235e0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
235f0 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74 20  uplevel 1 [list 
23600 73 6f 75 72 63 65 20 24 75 73 65 72 53 65 74 74  source $userSett
23610 69 6e 67 73 46 69 6c 65 4e 61 6d 65 5d 0d 0a 20  ingsFileName].. 
23620 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 72 72             } err
23630 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  or]} then {..   
23640 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
23650 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
23660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23670 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
23680 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
23690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
236a0 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a    "==== WARNING:
236b0 20 66 61 69 6c 65 64 20 74 6f 20 6c 6f 61 64 20   failed to load 
236c0 70 65 72 2d 75 73 65 72 20 73 65 74 74 69 6e 67  per-user setting
236d0 73 20 66 69 6c 65 20 5c 22 22 20 5c 0d 0a 20 20  s file \"" \..  
236e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
236f0 20 20 24 75 73 65 72 53 65 74 74 69 6e 67 73 46    $userSettingsF
23700 69 6c 65 4e 61 6d 65 20 22 5c 22 2c 20 65 72 72  ileName "\", err
23710 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f  or: " \n\t $erro
23720 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  r \n]..         
23730 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
23740 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
23750 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
23760 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
23770 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
23780 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
23790 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
237a0 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
237b0 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
237c0 73 6b 69 70 70 65 64 20 6c 6f 61 64 69 6e 67 20  skipped loading 
237d0 70 65 72 2d 75 73 65 72 20 74 65 73 74 20 73 65  per-user test se
237e0 74 74 69 6e 67 73 20 66 69 6c 65 20 5c 22 22 20  ttings file \"" 
237f0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
23800 20 20 20 20 20 24 75 73 65 72 53 65 74 74 69 6e       $userSettin
23810 67 73 46 69 6c 65 4e 61 6d 65 20 22 5c 22 2c 20  gsFileName "\", 
23820 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  it does not exis
23830 74 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20  t\n"]..         
23840 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
23850 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  }..        }....
23860 20 20 20 20 20 20 20 20 23 23 23 23 23 23 23 23          ########
23870 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
23880 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
23890 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
238a0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d  ###############.
238b0 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  ...        if {[
238c0 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 63  info exists ::tc
238d0 6c 5f 70 6c 61 74 66 6f 72 6d 28 68 6f 73 74 29  l_platform(host)
238e0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
238f0 20 20 20 20 20 73 65 74 20 68 6f 73 74 53 65 74       set hostSet
23900 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 20 5b 66  tingsFileName [f
23910 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 43 6f 6d  ile join [getCom
23920 6d 6f 6e 44 69 72 65 63 74 6f 72 79 5d 20 5c 0d  monDirectory] \.
23930 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b  .              [
23940 61 70 70 65 6e 64 41 72 67 73 20 73 65 74 74 69  appendArgs setti
23950 6e 67 73 20 24 73 75 66 66 69 78 20 2e 20 24 3a  ngs $suffix . $:
23960 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 68 6f  :tcl_platform(ho
23970 73 74 29 20 2e 65 61 67 6c 65 5d 5d 0d 0a 0d 0a  st) .eagle]]....
23980 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 66            if {[f
23990 69 6c 65 20 65 78 69 73 74 73 20 24 68 6f 73 74  ile exists $host
239a0 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65  SettingsFileName
239b0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
239c0 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
239d0 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
239e0 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
239f0 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
23a00 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
23a10 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
23a20 6c 6f 61 64 69 6e 67 20 70 65 72 2d 68 6f 73 74  loading per-host
23a30 20 74 65 73 74 20 73 65 74 74 69 6e 67 73 20 66   test settings f
23a40 69 6c 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20  ile \"" \..     
23a50 20 20 20 20 20 20 20 20 20 20 20 20 20 24 68 6f               $ho
23a60 73 74 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61  stSettingsFileNa
23a70 6d 65 20 5c 22 2e 2e 2e 5c 6e 5d 0d 0a 20 20 20  me \"...\n]..   
23a80 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
23a90 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63            if {[c
23aa0 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
23ab0 20 20 20 20 20 20 75 70 6c 65 76 65 6c 20 31 20        uplevel 1 
23ac0 5b 6c 69 73 74 20 73 6f 75 72 63 65 20 24 68 6f  [list source $ho
23ad0 73 74 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61  stSettingsFileNa
23ae0 6d 65 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  me]..           
23af0 20 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20   } error]} then 
23b00 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
23b10 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
23b20 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
23b30 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
23b40 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
23b50 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
23b60 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41          "==== WA
23b70 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f  RNING: failed to
23b80 20 6c 6f 61 64 20 70 65 72 2d 68 6f 73 74 20 73   load per-host s
23b90 65 74 74 69 6e 67 73 20 66 69 6c 65 20 5c 22 22  ettings file \""
23ba0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
23bb0 20 20 20 20 20 20 20 20 24 68 6f 73 74 53 65 74          $hostSet
23bc0 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 20 22 5c  tingsFileName "\
23bd0 22 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74  ", error: " \n\t
23be0 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20   $error \n]..   
23bf0 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
23c00 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
23c10 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
23c20 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
23c30 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
23c40 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
23c50 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
23c60 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
23c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c80 22 2d 2d 2d 2d 20 73 6b 69 70 70 65 64 20 6c 6f  "---- skipped lo
23c90 61 64 69 6e 67 20 70 65 72 2d 68 6f 73 74 20 74  ading per-host t
23ca0 65 73 74 20 73 65 74 74 69 6e 67 73 20 66 69 6c  est settings fil
23cb0 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20  e \"" \..       
23cc0 20 20 20 20 20 20 20 20 20 20 20 24 68 6f 73 74             $host
23cd0 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65  SettingsFileName
23ce0 20 22 5c 22 2c 20 69 74 20 64 6f 65 73 20 6e 6f   "\", it does no
23cf0 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a 20 20 20  t exist\n"]..   
23d00 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
23d10 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
23d20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20   }..      }..   
23d30 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
23d40 63 6f 70 79 53 61 6d 70 6c 65 44 61 74 61 62 61  copySampleDataba
23d50 73 65 46 69 6c 65 73 20 7b 7d 20 7b 0d 0a 20 20  seFiles {} {..  
23d60 20 20 20 20 75 70 6c 65 76 65 6c 20 31 20 7b 0d      uplevel 1 {.
23d70 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
23d80 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 6f 70 79      # NOTE: Copy
23d90 20 28 6f 72 20 72 65 2d 63 6f 70 79 29 20 74 68   (or re-copy) th
23da0 65 20 72 65 66 65 72 65 6e 63 65 20 64 61 74 61  e reference data
23db0 62 61 73 65 20 66 69 6c 65 20 75 73 65 64 20 66  base file used f
23dc0 6f 72 20 74 68 69 73 0d 0a 20 20 20 20 20 20 20  or this..       
23dd0 20 23 20 20 20 20 20 20 20 75 6e 69 74 20 74 65   #       unit te
23de0 73 74 20 74 6f 20 74 68 65 20 62 75 69 6c 64 20  st to the build 
23df0 64 69 72 65 63 74 6f 72 79 20 69 6e 20 63 61 73  directory in cas
23e00 65 20 69 74 20 68 61 73 20 62 65 65 6e 20 63 68  e it has been ch
23e10 61 6e 67 65 64 0d 0a 20 20 20 20 20 20 20 20 23  anged..        #
23e20 20 20 20 20 20 20 20 62 79 20 61 20 70 72 65 76         by a prev
23e30 69 6f 75 73 20 74 65 73 74 20 72 75 6e 2e 0d 0a  ious test run...
23e40 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
23e50 20 20 20 66 69 6c 65 20 63 6f 70 79 20 2d 66 6f     file copy -fo
23e60 72 63 65 20 24 6e 6f 72 74 68 77 69 6e 64 45 66  rce $northwindEf
23e70 44 62 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20  DbFile \..      
23e80 20 20 20 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b      [file join [
23e90 67 65 74 42 75 69 6c 64 44 69 72 65 63 74 6f 72  getBuildDirector
23ea0 79 20 66 61 6c 73 65 5d 20 5b 66 69 6c 65 20 74  y false] [file t
23eb0 61 69 6c 20 24 6e 6f 72 74 68 77 69 6e 64 45 66  ail $northwindEf
23ec0 44 62 46 69 6c 65 5d 5d 0d 0a 20 20 20 20 20 20  DbFile]]..      
23ed0 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
23ee0 20 70 72 6f 63 20 72 75 6e 53 51 4c 69 74 65 54   proc runSQLiteT
23ef0 65 73 74 50 72 6f 6c 6f 67 75 65 20 7b 7d 20 7b  estPrologue {} {
23f00 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
23f10 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20 72 75   # NOTE: Skip ru
23f20 6e 6e 69 6e 67 20 6f 75 72 20 63 75 73 74 6f 6d  nning our custom
23f30 20 70 72 6f 6c 6f 67 75 65 20 69 66 20 74 68 65   prologue if the
23f40 20 6d 61 69 6e 20 6f 6e 65 20 68 61 73 20 62 65   main one has be
23f50 65 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  en..      #     
23f60 20 20 73 6b 69 70 70 65 64 2e 0d 0a 20 20 20 20    skipped...    
23f70 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 21    #..      if {!
23f80 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
23f90 6f 28 70 72 6f 6c 6f 67 75 65 2e 65 61 67 6c 65  o(prologue.eagle
23fa0 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
23fb0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
23fc0 20 4e 4f 54 45 3a 20 4c 6f 61 64 20 74 68 65 20   NOTE: Load the 
23fd0 22 62 65 66 6f 72 65 2d 63 6f 6e 73 74 72 61 69  "before-constrai
23fe0 6e 74 73 22 20 63 75 73 74 6f 6d 20 70 65 72 2d  nts" custom per-
23ff0 75 73 65 72 20 61 6e 64 2f 6f 72 20 70 65 72 2d  user and/or per-
24000 68 6f 73 74 0d 0a 20 20 20 20 20 20 20 20 23 20  host..        # 
24010 20 20 20 20 20 20 74 65 73 74 20 73 65 74 74 69        test setti
24020 6e 67 73 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20  ngs now...      
24030 20 20 23 0d 0a 20 20 20 20 20 20 20 20 75 70 6c    #..        upl
24040 65 76 65 6c 20 31 20 5b 6c 69 73 74 20 6c 6f 61  evel 1 [list loa
24050 64 53 51 4c 69 74 65 54 65 73 74 53 65 74 74 69  dSQLiteTestSetti
24060 6e 67 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  ngs $::test_chan
24070 6e 65 6c 20 2e 62 65 66 6f 72 65 5d 0d 0a 0d 0a  nel .before]....
24080 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
24090 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b     # NOTE: Check
240a0 20 69 66 20 74 68 65 20 5b 6f 62 6a 65 63 74 5d   if the [object]
240b0 20 63 6f 6d 6d 61 6e 64 20 69 73 20 61 76 61 69   command is avai
240c0 6c 61 62 6c 65 3b 20 69 66 20 6e 6f 74 2c 20 61  lable; if not, a
240d0 64 64 20 73 6f 6d 65 0d 0a 20 20 20 20 20 20 20  dd some..       
240e0 20 23 20 20 20 20 20 20 20 73 68 69 6d 73 20 74   #       shims t
240f0 6f 20 6d 61 6b 65 20 74 68 65 20 74 65 73 74 20  o make the test 
24100 73 75 69 74 65 20 72 75 6e 20 73 6d 6f 6f 74 68  suite run smooth
24110 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  er...        #..
24120 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72          checkFor
24130 53 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d  SQLiteObjectComm
24140 61 6e 64 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  and $::test_chan
24150 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23  nel....        #
24160 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
24170 3a 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20  : Determine the 
24180 6e 61 6d 65 73 20 6f 66 20 74 68 65 20 6e 61 74  names of the nat
24190 69 76 65 20 70 6c 61 74 66 6f 72 6d 20 61 6e 64  ive platform and
241a0 20 61 72 63 68 69 74 65 63 74 75 72 65 2e 0d 0a   architecture...
241b0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
241c0 20 20 20 73 65 74 20 70 6c 61 74 66 6f 72 6d 20     set platform 
241d0 5b 67 65 74 42 75 69 6c 64 50 6c 61 74 66 6f 72  [getBuildPlatfor
241e0 6d 20 74 72 75 65 5d 0d 0a 20 20 20 20 20 20 20  m true]..       
241f0 20 73 65 74 20 61 72 63 68 69 74 65 63 74 75 72   set architectur
24200 65 20 5b 61 72 63 68 69 74 65 63 74 75 72 65 46  e [architectureF
24210 6f 72 50 6c 61 74 66 6f 72 6d 20 24 70 6c 61 74  orPlatform $plat
24220 66 6f 72 6d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  form]....       
24230 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
24240 54 45 3a 20 53 68 6f 77 20 74 68 65 20 70 6c 61  TE: Show the pla
24250 74 66 6f 72 6d 20 61 6e 64 20 61 72 63 68 69 74  tform and archit
24260 65 63 74 75 72 65 20 75 73 65 64 20 74 6f 20 68  ecture used to h
24270 65 6c 70 20 6c 6f 63 61 74 65 20 74 68 65 0d 0a  elp locate the..
24280 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
24290 6e 61 74 69 76 65 20 62 75 69 6c 64 20 66 69 6c  native build fil
242a0 65 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  es...        #..
242b0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
242c0 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
242d0 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
242e0 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 70           "---- p
242f0 6c 61 74 66 6f 72 6d 20 66 6f 72 20 6c 6f 63 61  latform for loca
24300 74 69 6e 67 20 6e 61 74 69 76 65 20 62 75 69 6c  ting native buil
24310 64 20 66 69 6c 65 73 20 69 73 20 5c 22 22 20 5c  d files is \"" \
24320 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 24 70  ..            $p
24330 6c 61 74 66 6f 72 6d 20 5c 22 5c 6e 5d 0d 0a 0d  latform \"\n]...
24340 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
24350 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
24360 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
24370 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
24380 61 72 63 68 69 74 65 63 74 75 72 65 20 66 6f 72  architecture for
24390 20 6c 6f 63 61 74 69 6e 67 20 6e 61 74 69 76 65   locating native
243a0 20 62 75 69 6c 64 20 66 69 6c 65 73 20 69 73 20   build files is 
243b0 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  \"" \..         
243c0 20 20 20 24 61 72 63 68 69 74 65 63 74 75 72 65     $architecture
243d0 20 5c 22 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20   \"\n]....      
243e0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
243f0 4f 54 45 3a 20 42 75 69 6c 64 20 61 20 6c 69 73  OTE: Build a lis
24400 74 20 6f 66 20 63 6f 6e 66 69 67 75 72 61 74 69  t of configurati
24410 6f 6e 20 66 69 6c 65 73 20 74 68 61 74 20 77 65  on files that we
24420 20 68 61 6e 64 6c 65 2e 0d 0a 20 20 20 20 20 20   handle...      
24430 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74    #..        set
24440 20 63 6f 6e 66 69 67 46 69 6c 65 4e 61 6d 65 73   configFileNames
24450 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20   [list \..      
24460 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74        System.Dat
24470 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 2e 63 6f 6e  a.SQLite.dll.con
24480 66 69 67 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  fig]....        
24490 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
244a0 45 3a 20 42 75 69 6c 64 20 61 20 6c 69 73 74 20  E: Build a list 
244b0 6f 66 20 61 75 78 69 6c 69 61 72 79 20 4d 61 6e  of auxiliary Man
244c0 61 67 65 64 20 44 65 62 75 67 67 69 6e 67 20 41  aged Debugging A
244d0 73 73 69 73 74 61 6e 74 73 20 28 4d 44 41 29 0d  ssistants (MDA).
244e0 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
244f0 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 66   configuration f
24500 69 6c 65 73 20 74 68 61 74 20 77 65 20 68 61 6e  iles that we han
24510 64 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  dle...        #.
24520 0a 20 20 20 20 20 20 20 20 73 65 74 20 6d 64 61  .        set mda
24530 43 6f 6e 66 69 67 46 69 6c 65 4e 61 6d 65 73 20  ConfigFileNames 
24540 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 20  [list \..       
24550 20 20 20 20 20 45 61 67 6c 65 53 68 65 6c 6c 33       EagleShell3
24560 32 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e 66 69 67  2.exe.mda.config
24570 20 49 6e 73 74 61 6c 6c 65 72 2e 65 78 65 2e 6d   Installer.exe.m
24580 64 61 2e 63 6f 6e 66 69 67 20 5c 0d 0a 20 20 20  da.config \..   
24590 20 20 20 20 20 20 20 20 20 74 65 73 74 2e 65 78           test.ex
245a0 65 2e 6d 64 61 2e 63 6f 6e 66 69 67 20 74 65 73  e.mda.config tes
245b0 74 6c 69 6e 71 2e 65 78 65 2e 6d 64 61 2e 63 6f  tlinq.exe.mda.co
245c0 6e 66 69 67 20 5c 0d 0a 20 20 20 20 20 20 20 20  nfig \..        
245d0 20 20 20 20 74 65 73 74 65 66 36 2e 65 78 65 2e      testef6.exe.
245e0 6d 64 61 2e 63 6f 6e 66 69 67 5d 0d 0a 0d 0a 20  mda.config].... 
245f0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
24600 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20    # NOTE: Build 
24610 74 68 65 20 6c 69 73 74 20 6f 66 20 65 78 74 65  the list of exte
24620 72 6e 61 6c 20 66 69 6c 65 73 20 74 68 61 74 20  rnal files that 
24630 77 65 20 68 61 6e 64 6c 65 2e 20 20 53 6f 6d 65  we handle.  Some
24640 20 6f 66 0d 0a 20 20 20 20 20 20 20 20 23 20 20   of..        #  
24650 20 20 20 20 20 74 68 65 73 65 20 66 69 6c 65 73       these files
24660 20 6d 61 79 20 62 65 20 6e 61 74 69 76 65 20 61   may be native a
24670 6e 64 2f 6f 72 20 6d 61 6e 61 67 65 64 20 61 73  nd/or managed as
24680 73 65 6d 62 6c 69 65 73 20 74 68 61 74 20 61 72  semblies that ar
24690 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
246a0 20 20 20 72 65 71 75 69 72 65 64 20 74 6f 20 70     required to p
246b0 65 72 66 6f 72 6d 20 76 61 72 69 6f 75 73 20 74  erform various t
246c0 65 73 74 73 2e 0d 0a 20 20 20 20 20 20 20 20 23  ests...        #
246d0 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 65 78  ..        set ex
246e0 74 65 72 6e 61 6c 46 69 6c 65 4e 61 6d 65 73 20  ternalFileNames 
246f0 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 20  [list \..       
24700 20 20 20 20 20 5b 66 69 6c 65 20 6a 6f 69 6e 20       [file join 
24710 45 6e 74 69 74 79 46 72 61 6d 65 77 6f 72 6b 20  EntityFramework 
24720 6c 69 62 20 5b 73 74 72 69 6e 67 20 6d 61 70 20  lib [string map 
24730 5b 6c 69 73 74 20 46 78 20 22 22 5d 20 5c 0d 0a  [list Fx ""] \..
24740 20 20 20 20 20 20 20 20 20 20 20 20 5b 73 74 72              [str
24750 69 6e 67 20 6d 61 70 20 5b 6c 69 73 74 20 6e 65  ing map [list ne
24760 74 46 78 34 35 31 20 6e 65 74 46 78 34 35 20 6e  tFx451 netFx45 n
24770 65 74 46 78 34 35 32 20 6e 65 74 46 78 34 35 20  etFx452 netFx45 
24780 6e 65 74 46 78 34 36 20 5c 0d 0a 20 20 20 20 20  netFx46 \..     
24790 20 20 20 20 20 20 20 6e 65 74 46 78 34 35 20 6e         netFx45 n
247a0 65 74 46 78 34 36 31 20 6e 65 74 46 78 34 35 20  etFx461 netFx45 
247b0 6e 65 74 46 78 34 36 32 20 6e 65 74 46 78 34 35  netFx462 netFx45
247c0 20 6e 65 74 46 78 34 37 20 6e 65 74 46 78 34 35   netFx47 netFx45
247d0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
247e0 6e 65 74 46 78 34 37 31 20 6e 65 74 46 78 34 35  netFx471 netFx45
247f0 5d 20 5b 67 65 74 42 75 69 6c 64 4e 65 74 46 78  ] [getBuildNetFx
24800 5d 5d 5d 20 45 6e 74 69 74 79 46 72 61 6d 65 77  ]]] EntityFramew
24810 6f 72 6b 2e 64 6c 6c 5d 5d 0d 0a 0d 0a 20 20 20  ork.dll]]....   
24820 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
24830 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74 68  # NOTE: Build th
24840 65 20 6c 69 73 74 20 6f 66 20 6e 61 74 69 76 65  e list of native
24850 20 61 73 73 65 6d 62 6c 79 20 66 69 6c 65 73 20   assembly files 
24860 74 68 61 74 20 77 65 20 68 61 6e 64 6c 65 2e 0d  that we handle..
24870 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
24880 20 20 20 20 73 65 74 20 6e 61 74 69 76 65 46 69      set nativeFi
24890 6c 65 4e 61 6d 65 73 20 5b 6c 69 73 74 5d 0d 0a  leNames [list]..
248a0 0d 0a 20 20 20 20 20 20 20 20 65 76 61 6c 20 6c  ..        eval l
248b0 61 70 70 65 6e 64 20 6e 61 74 69 76 65 46 69 6c  append nativeFil
248c0 65 4e 61 6d 65 73 20 5b 67 65 74 4e 61 74 69 76  eNames [getNativ
248d0 65 4c 69 62 72 61 72 79 46 69 6c 65 4e 61 6d 65  eLibraryFileName
248e0 73 4f 6e 6c 79 5d 0d 0a 20 20 20 20 20 20 20 20  sOnly]..        
248f0 65 76 61 6c 20 6c 61 70 70 65 6e 64 20 6e 61 74  eval lappend nat
24900 69 76 65 46 69 6c 65 4e 61 6d 65 73 20 5b 67 65  iveFileNames [ge
24910 74 49 6e 74 65 72 6f 70 41 73 73 65 6d 62 6c 79  tInteropAssembly
24920 46 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79 5d 0d 0a  FileNamesOnly]..
24930 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
24940 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69       # NOTE: Bui
24950 6c 64 20 74 68 65 20 6c 69 73 74 20 6f 66 20 6d  ld the list of m
24960 69 78 65 64 2d 6d 6f 64 65 20 61 73 73 65 6d 62  ixed-mode assemb
24970 6c 79 20 66 69 6c 65 73 20 74 68 61 74 20 77 65  ly files that we
24980 20 68 61 6e 64 6c 65 2e 0d 0a 20 20 20 20 20 20   handle...      
24990 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74    #..        set
249a0 20 6d 69 78 65 64 46 69 6c 65 4e 61 6d 65 73 20   mixedFileNames 
249b0 5b 6c 69 73 74 5d 0d 0a 0d 0a 20 20 20 20 20 20  [list]....      
249c0 20 20 69 66 20 7b 5b 68 61 73 52 75 6e 74 69 6d    if {[hasRuntim
249d0 65 4f 70 74 69 6f 6e 20 6e 61 74 69 76 65 5d 7d  eOption native]}
249e0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
249f0 20 20 20 6c 61 70 70 65 6e 64 20 6d 69 78 65 64     lappend mixed
24a00 46 69 6c 65 4e 61 6d 65 73 20 53 79 73 74 65 6d  FileNames System
24a10 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c  .Data.SQLite.dll
24a20 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
24a30 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
24a40 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20    # NOTE: Build 
24a50 74 68 65 20 6c 69 73 74 20 6f 66 20 6d 61 6e 61  the list of mana
24a60 67 65 64 20 61 73 73 65 6d 62 6c 79 20 66 69 6c  ged assembly fil
24a70 65 73 20 74 68 61 74 20 77 65 20 68 61 6e 64 6c  es that we handl
24a80 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  e...        #.. 
24a90 20 20 20 20 20 20 20 73 65 74 20 6d 61 6e 61 67         set manag
24aa0 65 64 46 69 6c 65 4e 61 6d 65 73 20 5b 6c 69 73  edFileNames [lis
24ab0 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  t \..           
24ac0 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
24ad0 69 74 65 2e 4c 69 6e 71 2e 64 6c 6c 20 53 79 73  ite.Linq.dll Sys
24ae0 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
24af0 45 46 36 2e 64 6c 6c 5d 0d 0a 0d 0a 20 20 20 20  EF6.dll]....    
24b00 20 20 20 20 69 66 20 7b 21 5b 68 61 73 52 75 6e      if {![hasRun
24b10 74 69 6d 65 4f 70 74 69 6f 6e 20 6e 61 74 69 76  timeOption nativ
24b20 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  e]} then {..    
24b30 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 6d 61        lappend ma
24b40 6e 61 67 65 64 46 69 6c 65 4e 61 6d 65 73 20 53  nagedFileNames S
24b50 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
24b60 65 2e 64 6c 6c 0d 0a 20 20 20 20 20 20 20 20 7d  e.dll..        }
24b70 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
24b80 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53         # NOTE: S
24b90 68 6f 77 20 74 68 65 20 76 61 72 69 6f 75 73 20  how the various 
24ba0 6c 69 73 74 73 20 6f 66 20 66 69 6c 65 20 6e 61  lists of file na
24bb0 6d 65 73 20 74 68 61 74 20 61 72 65 20 68 61 6e  mes that are han
24bc0 64 6c 65 64 20 62 79 20 74 68 69 73 0d 0a 20 20  dled by this..  
24bd0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 70 72        #       pr
24be0 6f 63 65 64 75 72 65 2e 0d 0a 20 20 20 20 20 20  ocedure...      
24bf0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75    #..        tpu
24c00 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
24c10 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
24c20 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d  ..            "-
24c30 2d 2d 2d 20 6c 69 73 74 20 6f 66 20 5c 22 63 6f  --- list of \"co
24c40 6e 66 69 67 75 72 61 74 69 6f 6e 5c 22 20 66 69  nfiguration\" fi
24c50 6c 65 20 6e 61 6d 65 73 20 69 73 3a 20 22 20 5c  le names is: " \
24c60 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 24 63  ..            $c
24c70 6f 6e 66 69 67 46 69 6c 65 4e 61 6d 65 73 20 5c  onfigFileNames \
24c80 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 70  n]....        tp
24c90 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
24ca0 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
24cb0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  \..            "
24cc0 2d 2d 2d 2d 20 6c 69 73 74 20 6f 66 20 5c 22 4d  ---- list of \"M
24cd0 44 41 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  DA configuration
24ce0 5c 22 20 66 69 6c 65 20 6e 61 6d 65 73 20 69 73  \" file names is
24cf0 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  : " \..         
24d00 20 20 20 24 6d 64 61 43 6f 6e 66 69 67 46 69 6c     $mdaConfigFil
24d10 65 4e 61 6d 65 73 20 5c 6e 5d 0d 0a 0d 0a 20 20  eNames \n]....  
24d20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
24d30 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
24d40 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
24d50 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6c 69 73         "---- lis
24d60 74 20 6f 66 20 5c 22 65 78 74 65 72 6e 61 6c 5c  t of \"external\
24d70 22 20 66 69 6c 65 20 6e 61 6d 65 73 20 69 73 3a  " file names is:
24d80 20 22 20 24 65 78 74 65 72 6e 61 6c 46 69 6c 65   " $externalFile
24d90 4e 61 6d 65 73 20 5c 6e 5d 0d 0a 0d 0a 20 20 20  Names \n]....   
24da0 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
24db0 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
24dc0 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
24dd0 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6c 69 73 74        "---- list
24de0 20 6f 66 20 5c 22 6e 61 74 69 76 65 5c 22 20 66   of \"native\" f
24df0 69 6c 65 20 6e 61 6d 65 73 20 69 73 3a 20 22 20  ile names is: " 
24e00 24 6e 61 74 69 76 65 46 69 6c 65 4e 61 6d 65 73  $nativeFileNames
24e10 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20   \n]....        
24e20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
24e30 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
24e40 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
24e50 20 22 2d 2d 2d 2d 20 6c 69 73 74 20 6f 66 20 5c   "---- list of \
24e60 22 6d 69 78 65 64 5c 22 20 66 69 6c 65 20 6e 61  "mixed\" file na
24e70 6d 65 73 20 69 73 3a 20 22 20 24 6d 69 78 65 64  mes is: " $mixed
24e80 46 69 6c 65 4e 61 6d 65 73 20 5c 6e 5d 0d 0a 0d  FileNames \n]...
24e90 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
24ea0 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
24eb0 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
24ec0 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
24ed0 6c 69 73 74 20 6f 66 20 5c 22 6d 61 6e 61 67 65  list of \"manage
24ee0 64 5c 22 20 66 69 6c 65 20 6e 61 6d 65 73 20 69  d\" file names i
24ef0 73 3a 20 22 20 24 6d 61 6e 61 67 65 64 46 69 6c  s: " $managedFil
24f00 65 4e 61 6d 65 73 20 5c 6e 5d 0d 0a 0d 0a 20 20  eNames \n]....  
24f10 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
24f20 20 23 20 4e 4f 54 45 3a 20 52 65 6d 6f 76 65 20   # NOTE: Remove 
24f30 61 6e 79 20 74 65 73 74 20 63 6f 6e 73 74 72 61  any test constra
24f40 69 6e 74 73 20 74 68 61 74 20 72 65 66 65 72 20  ints that refer 
24f50 74 6f 20 74 68 65 20 6e 61 74 69 76 65 20 61 6e  to the native an
24f60 64 2f 6f 72 0d 0a 20 20 20 20 20 20 20 20 23 20  d/or..        # 
24f70 20 20 20 20 20 20 6d 61 6e 61 67 65 64 20 61 73        managed as
24f80 73 65 6d 62 6c 79 20 66 69 6c 65 73 20 74 68 61  sembly files tha
24f90 74 20 77 65 20 68 61 6e 64 6c 65 20 75 6e 6c 65  t we handle unle
24fa0 73 73 20 66 6f 72 62 69 64 64 65 6e 20 66 72 6f  ss forbidden fro
24fb0 6d 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  m..        #    
24fc0 20 20 20 64 6f 69 6e 67 20 73 6f 2e 0d 0a 20 20     doing so...  
24fd0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
24fe0 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
24ff0 74 73 20 3a 3a 6e 6f 28 73 71 6c 69 74 65 52 65  ts ::no(sqliteRe
25000 6d 6f 76 65 43 6f 6e 73 74 72 61 69 6e 74 73 29  moveConstraints)
25010 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
25020 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c       foreach fil
25030 65 4e 61 6d 65 20 24 63 6f 6e 66 69 67 46 69 6c  eName $configFil
25040 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20  eNames {..      
25050 20 20 20 20 20 20 72 65 6d 6f 76 65 43 6f 6e 73        removeCons
25060 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
25070 67 73 20 66 69 6c 65 5f 20 24 66 69 6c 65 4e 61  gs file_ $fileNa
25080 6d 65 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  me]..          }
25090 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 66 6f  ....          fo
250a0 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24  reach fileName $
250b0 6d 64 61 43 6f 6e 66 69 67 46 69 6c 65 4e 61 6d  mdaConfigFileNam
250c0 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  es {..          
250d0 20 20 72 65 6d 6f 76 65 43 6f 6e 73 74 72 61 69    removeConstrai
250e0 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66  nt [appendArgs f
250f0 69 6c 65 5f 20 24 66 69 6c 65 4e 61 6d 65 5d 0d  ile_ $fileName].
25100 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  .          }....
25110 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63            foreac
25120 68 20 66 69 6c 65 4e 61 6d 65 20 24 65 78 74 65  h fileName $exte
25130 72 6e 61 6c 46 69 6c 65 4e 61 6d 65 73 20 7b 0d  rnalFileNames {.
25140 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6d  .            rem
25150 6f 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61  oveConstraint [a
25160 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20  ppendArgs file_ 
25170 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69 6c 65  [file tail $file
25180 4e 61 6d 65 5d 5d 0d 0a 20 20 20 20 20 20 20 20  Name]]..        
25190 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
251a0 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d   foreach fileNam
251b0 65 20 24 6e 61 74 69 76 65 46 69 6c 65 4e 61 6d  e $nativeFileNam
251c0 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  es {..          
251d0 20 20 72 65 6d 6f 76 65 43 6f 6e 73 74 72 61 69    removeConstrai
251e0 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66  nt [appendArgs f
251f0 69 6c 65 5f 20 24 66 69 6c 65 4e 61 6d 65 5d 0d  ile_ $fileName].
25200 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  .          }....
25210 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63            foreac
25220 68 20 66 69 6c 65 4e 61 6d 65 20 24 6d 69 78 65  h fileName $mixe
25230 64 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20  dFileNames {..  
25240 20 20 20 20 20 20 20 20 20 20 72 65 6d 6f 76 65            remove
25250 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65  Constraint [appe
25260 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 24 66 69  ndArgs file_ $fi
25270 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20 20  leName]..       
25280 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
25290 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61    foreach fileNa
252a0 6d 65 20 24 6d 61 6e 61 67 65 64 46 69 6c 65 4e  me $managedFileN
252b0 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20  ames {..        
252c0 20 20 20 20 72 65 6d 6f 76 65 43 6f 6e 73 74 72      removeConstr
252d0 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
252e0 20 66 69 6c 65 5f 20 24 66 69 6c 65 4e 61 6d 65   file_ $fileName
252f0 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ]..          }..
25300 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
25310 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
25320 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20 61 6c 6c  # NOTE: Skip all
25330 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
25340 69 74 65 20 72 65 6c 61 74 65 64 20 66 69 6c 65  ite related file
25350 20 68 61 6e 64 6c 69 6e 67 20 28 64 65 6c 65 74   handling (delet
25360 69 6e 67 2c 0d 0a 20 20 20 20 20 20 20 20 23 20  ing,..        # 
25370 20 20 20 20 20 20 63 6f 70 79 69 6e 67 2c 20 61        copying, a
25380 6e 64 20 6c 6f 61 64 69 6e 67 29 20 69 66 20 69  nd loading) if i
25390 6e 73 74 72 75 63 74 65 64 2e 0d 0a 20 20 20 20  nstructed...    
253a0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69      #..        i
253b0 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
253c0 20 3a 3a 6e 6f 28 73 71 6c 69 74 65 46 69 6c 65   ::no(sqliteFile
253d0 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  s)]} then {..   
253e0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
253f0 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70      # NOTE: Skip
25400 20 74 72 79 69 6e 67 20 74 6f 20 64 65 6c 65 74   trying to delet
25410 65 20 61 6e 79 20 66 69 6c 65 73 20 69 66 20 69  e any files if i
25420 6e 73 74 72 75 63 74 65 64 2e 0d 0a 20 20 20 20  nstructed...    
25430 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
25440 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
25450 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74 65  ists ::no(delete
25460 53 71 6c 69 74 65 46 69 6c 65 73 29 5d 7d 20 74  SqliteFiles)]} t
25470 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
25480 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
25490 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74 65  ists ::no(delete
254a0 53 71 6c 69 74 65 43 6f 6e 66 69 67 46 69 6c 65  SqliteConfigFile
254b0 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  s)]} then {..   
254c0 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61             forea
254d0 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 63 6f 6e  ch fileName $con
254e0 66 69 67 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a  figFileNames {..
254f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25500 74 72 79 44 65 6c 65 74 65 42 69 6e 61 72 79 46  tryDeleteBinaryF
25510 69 6c 65 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20  ile $fileName.. 
25520 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
25530 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
25540 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
25550 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
25560 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69 74 65  :no(deleteSqlite
25570 45 78 74 65 72 6e 61 6c 46 69 6c 65 73 29 5d 7d  ExternalFiles)]}
25580 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
25590 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66         foreach f
255a0 69 6c 65 4e 61 6d 65 20 24 6d 64 61 43 6f 6e 66  ileName $mdaConf
255b0 69 67 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20  igFileNames {.. 
255c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
255d0 72 79 44 65 6c 65 74 65 42 75 69 6c 64 46 69 6c  ryDeleteBuildFil
255e0 65 20 24 66 69 6c 65 4e 61 6d 65 20 66 61 6c 73  e $fileName fals
255f0 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e..             
25600 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
25610 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65      foreach file
25620 4e 61 6d 65 20 24 65 78 74 65 72 6e 61 6c 46 69  Name $externalFi
25630 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20  leNames {..     
25640 20 20 20 20 20 20 20 20 20 20 20 74 72 79 44 65             tryDe
25650 6c 65 74 65 42 69 6e 61 72 79 46 69 6c 65 20 24  leteBinaryFile $
25660 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20  fileName..      
25670 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
25680 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
25690 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
256a0 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64  fo exists ::no(d
256b0 65 6c 65 74 65 53 71 6c 69 74 65 4e 61 74 69 76  eleteSqliteNativ
256c0 65 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b  eFiles)]} then {
256d0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
256e0 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
256f0 73 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c  s ::no(deleteSql
25700 69 74 65 49 6d 70 6c 69 63 69 74 4e 61 74 69 76  iteImplicitNativ
25710 65 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b  eFiles)]} then {
25720 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
25730 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61    foreach fileNa
25740 6d 65 20 24 6e 61 74 69 76 65 46 69 6c 65 4e 61  me $nativeFileNa
25750 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  mes {..         
25760 20 20 20 20 20 20 20 20 20 74 72 79 44 65 6c 65           tryDele
25770 74 65 41 73 73 65 6d 62 6c 79 20 24 66 69 6c 65  teAssembly $file
25780 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20  Name..          
25790 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
257a0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
257b0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
257c0 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
257d0 28 64 65 6c 65 74 65 53 71 6c 69 74 65 4e 6f 6e  (deleteSqliteNon
257e0 49 6d 70 6c 69 63 69 74 46 69 6c 65 73 29 5d 7d  ImplicitFiles)]}
257f0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
25800 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69           if {![i
25810 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
25820 64 65 6c 65 74 65 53 71 6c 69 74 65 50 6c 61 74  deleteSqlitePlat
25830 66 6f 72 6d 46 69 6c 65 73 29 5d 20 26 26 20 5c  formFiles)] && \
25840 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
25850 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65        [string le
25860 6e 67 74 68 20 24 70 6c 61 74 66 6f 72 6d 5d 20  ngth $platform] 
25870 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
25880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
25890 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20  oreach fileName 
258a0 24 6e 61 74 69 76 65 46 69 6c 65 4e 61 6d 65 73  $nativeFileNames
258b0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
258c0 20 20 20 20 20 20 20 20 74 72 79 44 65 6c 65 74          tryDelet
258d0 65 41 73 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e  eAssembly $fileN
258e0 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 0d 0a 20  ame $platform.. 
258f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25900 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
25910 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
25920 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69           if {![i
25930 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
25940 64 65 6c 65 74 65 53 71 6c 69 74 65 41 72 63 68  deleteSqliteArch
25950 69 74 65 63 74 75 72 65 46 69 6c 65 73 29 5d 20  itectureFiles)] 
25960 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
25970 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e            [strin
25980 67 20 6c 65 6e 67 74 68 20 24 61 72 63 68 69 74  g length $archit
25990 65 63 74 75 72 65 5d 20 3e 20 30 7d 20 74 68 65  ecture] > 0} the
259a0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
259b0 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66         foreach f
259c0 69 6c 65 4e 61 6d 65 20 24 6e 61 74 69 76 65 46  ileName $nativeF
259d0 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20  ileNames {..    
259e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
259f0 74 72 79 44 65 6c 65 74 65 41 73 73 65 6d 62 6c  tryDeleteAssembl
25a00 79 20 24 66 69 6c 65 4e 61 6d 65 20 24 61 72 63  y $fileName $arc
25a10 68 69 74 65 63 74 75 72 65 0d 0a 20 20 20 20 20  hitecture..     
25a20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
25a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25a40 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  }..             
25a50 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
25a60 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
25a70 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
25a80 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71  ts ::no(deleteSq
25a90 6c 69 74 65 4d 69 78 65 64 46 69 6c 65 73 29 5d  liteMixedFiles)]
25aa0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
25ab0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
25ac0 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
25ad0 20 49 66 20 74 68 65 20 22 6e 61 74 69 76 65 22   If the "native"
25ae0 20 72 75 6e 74 69 6d 65 20 6f 70 74 69 6f 6e 20   runtime option 
25af0 69 73 20 73 65 74 2c 20 64 65 6c 65 74 65 20 69  is set, delete i
25b00 6d 70 6c 69 63 69 74 0d 0a 20 20 20 20 20 20 20  mplicit..       
25b10 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6d         #       m
25b20 69 78 65 64 2d 6d 6f 64 65 20 61 73 73 65 6d 62  ixed-mode assemb
25b30 6c 79 20 66 69 6c 65 73 20 61 73 20 77 65 6c 6c  ly files as well
25b40 2e 20 20 54 68 69 73 20 72 75 6e 74 69 6d 65 20  .  This runtime 
25b50 6f 70 74 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20  option..        
25b60 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 68        #       ch
25b70 65 63 6b 20 69 73 20 68 61 6e 64 6c 65 64 20 77  eck is handled w
25b80 68 65 6e 20 62 75 69 6c 64 69 6e 67 20 74 68 65  hen building the
25b90 20 6c 69 73 74 20 6f 66 20 6d 69 78 65 64 2d 6d   list of mixed-m
25ba0 6f 64 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ode..           
25bb0 20 20 20 23 20 20 20 20 20 20 20 61 73 73 65 6d     #       assem
25bc0 62 6c 79 20 66 69 6c 65 20 6e 61 6d 65 73 2e 0d  bly file names..
25bd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
25be0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
25bf0 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
25c00 73 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c  s ::no(deleteSql
25c10 69 74 65 49 6d 70 6c 69 63 69 74 4d 69 78 65 64  iteImplicitMixed
25c20 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d  Files)]} then {.
25c30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25c40 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d   foreach fileNam
25c50 65 20 24 6d 69 78 65 64 46 69 6c 65 4e 61 6d 65  e $mixedFileName
25c60 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s {..           
25c70 20 20 20 20 20 20 20 74 72 79 44 65 6c 65 74 65         tryDelete
25c80 41 73 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61  Assembly $fileNa
25c90 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  me..            
25ca0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
25cb0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
25cc0 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
25cd0 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64  fo exists ::no(d
25ce0 65 6c 65 74 65 53 71 6c 69 74 65 4e 6f 6e 49 6d  eleteSqliteNonIm
25cf0 70 6c 69 63 69 74 46 69 6c 65 73 29 5d 7d 20 74  plicitFiles)]} t
25d00 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
25d10 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
25d20 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65  o exists ::no(de
25d30 6c 65 74 65 53 71 6c 69 74 65 50 6c 61 74 66 6f  leteSqlitePlatfo
25d40 72 6d 46 69 6c 65 73 29 5d 20 26 26 20 5c 0d 0a  rmFiles)] && \..
25d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25d60 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67      [string leng
25d70 74 68 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3e 20  th $platform] > 
25d80 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
25d90 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
25da0 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6d  each fileName $m
25db0 69 78 65 64 46 69 6c 65 4e 61 6d 65 73 20 7b 0d  ixedFileNames {.
25dc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25dd0 20 20 20 20 20 74 72 79 44 65 6c 65 74 65 41 73       tryDeleteAs
25de0 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61 6d 65  sembly $fileName
25df0 20 24 70 6c 61 74 66 6f 72 6d 0d 0a 20 20 20 20   $platform..    
25e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
25e10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25e20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
25e30 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
25e40 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c   exists ::no(del
25e50 65 74 65 53 71 6c 69 74 65 41 72 63 68 69 74 65  eteSqliteArchite
25e60 63 74 75 72 65 46 69 6c 65 73 29 5d 20 26 26 20  ctureFiles)] && 
25e70 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
25e80 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c         [string l
25e90 65 6e 67 74 68 20 24 61 72 63 68 69 74 65 63 74  ength $architect
25ea0 75 72 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ure] > 0} then {
25eb0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
25ec0 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65      foreach file
25ed0 4e 61 6d 65 20 24 6d 69 78 65 64 46 69 6c 65 4e  Name $mixedFileN
25ee0 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20  ames {..        
25ef0 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79 44              tryD
25f00 65 6c 65 74 65 41 73 73 65 6d 62 6c 79 20 24 66  eleteAssembly $f
25f10 69 6c 65 4e 61 6d 65 20 24 61 72 63 68 69 74 65  ileName $archite
25f20 63 74 75 72 65 0d 0a 20 20 20 20 20 20 20 20 20  cture..         
25f30 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
25f40 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
25f50 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
25f60 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
25f70 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
25f80 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
25f90 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69 74 65  :no(deleteSqlite
25fa0 4d 61 6e 61 67 65 64 46 69 6c 65 73 29 5d 7d 20  ManagedFiles)]} 
25fb0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
25fc0 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69        foreach fi
25fd0 6c 65 4e 61 6d 65 20 24 6d 61 6e 61 67 65 64 46  leName $managedF
25fe0 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20  ileNames {..    
25ff0 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79 44              tryD
26000 65 6c 65 74 65 41 73 73 65 6d 62 6c 79 20 24 66  eleteAssembly $f
26010 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20  ileName..       
26020 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
26030 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
26040 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
26050 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23    #..          #
26060 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 66 6f 72   NOTE: Check for
26070 20 74 68 65 20 22 61 75 74 6f 53 65 6c 65 63 74   the "autoSelect
26080 22 20 72 75 6e 74 69 6d 65 20 6f 70 74 69 6f 6e  " runtime option
26090 2e 20 20 49 66 20 70 72 65 73 65 6e 74 2c 0d 0a  .  If present,..
260a0 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
260b0 20 20 61 74 74 65 6d 70 74 20 74 6f 20 61 75 74    attempt to aut
260c0 6f 6d 61 74 69 63 61 6c 6c 79 20 73 65 6c 65 63  omatically selec
260d0 74 20 74 68 65 20 66 69 72 73 74 20 61 76 61 69  t the first avai
260e0 6c 61 62 6c 65 0d 0a 20 20 20 20 20 20 20 20 20  lable..         
260f0 20 23 20 20 20 20 20 20 20 62 75 69 6c 64 20 28   #       build (
26100 6f 72 20 22 72 65 6c 65 61 73 65 22 29 20 6f 66  or "release") of
26110 20 53 51 4c 69 74 65 20 61 6e 64 20 53 79 73 74   SQLite and Syst
26120 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 0d 0a  em.Data.SQLite..
26130 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
26140 20 20 66 6f 72 20 75 73 65 20 77 69 74 68 20 74    for use with t
26150 68 65 20 74 65 73 74 20 73 75 69 74 65 2e 0d 0a  he test suite...
26160 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
26170 20 20 20 20 20 20 20 69 66 20 7b 5b 68 61 73 52         if {[hasR
26180 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 61 75 74  untimeOption aut
26190 6f 53 65 6c 65 63 74 5d 7d 20 74 68 65 6e 20 7b  oSelect]} then {
261a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
261b0 20 7b 21 5b 63 68 65 63 6b 46 6f 72 53 51 4c 69   {![checkForSQLi
261c0 74 65 42 75 69 6c 64 73 20 24 3a 3a 74 65 73 74  teBuilds $::test
261d0 5f 63 68 61 6e 6e 65 6c 20 74 72 75 65 5d 7d 20  _channel true]} 
261e0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
261f0 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51        checkForSQ
26200 4c 69 74 65 52 65 6c 65 61 73 65 73 20 24 3a 3a  LiteReleases $::
26210 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 74 72 75  test_channel tru
26220 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e..            }
26230 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d  ..          }...
26240 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
26250 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
26260 53 6b 69 70 20 74 72 79 69 6e 67 20 74 6f 20 76  Skip trying to v
26270 65 72 69 66 79 20 74 68 65 20 62 75 69 6c 64 20  erify the build 
26280 64 69 72 65 63 74 6f 72 79 20 69 66 20 69 6e 73  directory if ins
26290 74 72 75 63 74 65 64 3b 0d 0a 20 20 20 20 20 20  tructed;..      
262a0 20 20 20 20 23 20 20 20 20 20 20 20 6f 74 68 65      #       othe
262b0 72 77 69 73 65 2c 20 6d 61 6b 65 20 73 75 72 65  rwise, make sure
262c0 20 69 74 20 61 63 74 75 61 6c 6c 79 20 65 78 69   it actually exi
262d0 73 74 73 20 6f 72 20 68 61 6c 74 20 74 68 65 20  sts or halt the 
262e0 65 6e 74 69 72 65 0d 0a 20 20 20 20 20 20 20 20  entire..        
262f0 20 20 23 20 20 20 20 20 20 20 74 65 73 74 69 6e    #       testin
26300 67 20 70 72 6f 63 65 73 73 20 69 66 20 69 74 20  g process if it 
26310 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 0d  does not exist..
26320 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
26330 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
26340 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 76  fo exists ::no(v
26350 65 72 69 66 79 42 75 69 6c 64 44 69 72 65 63 74  erifyBuildDirect
26360 6f 72 79 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  ory)]} then {.. 
26370 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
26380 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
26390 3a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  : At this point,
263a0 20 74 68 65 20 62 75 69 6c 64 20 64 69 72 65 63   the build direc
263b0 74 6f 72 79 20 4d 55 53 54 20 65 78 69 73 74 20  tory MUST exist 
263c0 61 73 20 61 0d 0a 20 20 20 20 20 20 20 20 20 20  as a..          
263d0 20 20 23 20 20 20 20 20 20 20 76 61 6c 69 64 20    #       valid 
263e0 64 69 72 65 63 74 6f 72 79 20 66 6f 72 20 74 68  directory for th
263f0 65 20 74 65 73 74 69 6e 67 20 70 72 6f 63 65 73  e testing proces
26400 73 20 74 6f 20 63 6f 6e 74 69 6e 75 65 2e 0d 0a  s to continue...
26410 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
26420 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 64             set d
26430 69 72 65 63 74 6f 72 79 20 5b 67 65 74 42 75 69  irectory [getBui
26440 6c 64 44 69 72 65 63 74 6f 72 79 20 66 61 6c 73  ldDirectory fals
26450 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  e]....          
26460 20 20 69 66 20 7b 21 5b 66 69 6c 65 20 65 78 69    if {![file exi
26470 73 74 73 20 24 64 69 72 65 63 74 6f 72 79 5d 20  sts $directory] 
26480 7c 7c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  || \..          
26490 20 20 20 20 20 20 21 5b 66 69 6c 65 20 69 73 64        ![file isd
264a0 69 72 65 63 74 6f 72 79 20 24 64 69 72 65 63 74  irectory $direct
264b0 6f 72 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ory]} then {..  
264c0 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
264d0 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e               # N
264e0 4f 54 45 3a 20 4a 75 73 74 20 70 72 69 6f 72 20  OTE: Just prior 
264f0 74 6f 20 61 63 74 75 61 6c 6c 79 20 68 61 6c 74  to actually halt
26500 69 6e 67 20 74 68 65 20 74 65 73 74 69 6e 67 20  ing the testing 
26510 70 72 6f 63 65 73 73 2c 0d 0a 20 20 20 20 20 20  process,..      
26520 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
26530 61 64 64 20 61 6e 20 65 72 72 6f 72 20 74 6f 20  add an error to 
26540 74 68 65 20 74 65 73 74 20 6c 6f 67 20 66 69 6c  the test log fil
26550 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e...            
26560 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
26570 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
26580 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
26590 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
265a0 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
265b0 63 6f 75 6c 64 20 6e 6f 74 20 76 65 72 69 66 79  could not verify
265c0 20 62 75 69 6c 64 20 64 69 72 65 63 74 6f 72 79   build directory
265d0 20 5c 22 22 20 24 64 69 72 65 63 74 6f 72 79 20   \"" $directory 
265e0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
265f0 20 20 20 20 20 22 5c 22 2c 20 61 6c 6c 20 74 65       "\", all te
26600 73 74 69 6e 67 20 68 61 6c 74 65 64 5c 6e 22 5d  sting halted\n"]
26610 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
26620 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
26630 20 20 20 23 20 4e 4f 54 45 3a 20 52 61 69 73 69     # NOTE: Raisi
26640 6e 67 20 61 20 73 63 72 69 70 74 20 65 72 72 6f  ng a script erro
26650 72 20 66 72 6f 6d 20 74 68 69 73 20 70 6f 69 6e  r from this poin
26660 74 20 73 68 6f 75 6c 64 20 68 61 6c 74 0d 0a 20  t should halt.. 
26670 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20               #  
26680 20 20 20 20 20 74 68 65 20 74 65 73 74 69 6e 67       the testing
26690 20 70 72 6f 63 65 73 73 2e 0d 0a 20 20 20 20 20   process...     
266a0 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
266b0 20 20 20 20 20 20 20 20 20 20 65 72 72 6f 72 20            error 
266c0 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
266d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
266e0 20 22 63 6f 75 6c 64 20 6e 6f 74 20 76 65 72 69   "could not veri
266f0 66 79 20 62 75 69 6c 64 20 64 69 72 65 63 74 6f  fy build directo
26700 72 79 20 5c 22 22 20 24 64 69 72 65 63 74 6f 72  ry \"" $director
26710 79 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  y \..           
26720 20 20 20 20 20 20 20 22 5c 22 2c 20 61 6c 6c 20         "\", all 
26730 74 65 73 74 69 6e 67 20 68 61 6c 74 65 64 22 5d  testing halted"]
26740 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
26750 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  .          }....
26760 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
26770 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53         # NOTE: S
26780 6b 69 70 20 74 72 79 69 6e 67 20 74 6f 20 63 6f  kip trying to co
26790 70 79 20 61 6e 79 20 66 69 6c 65 73 20 69 66 20  py any files if 
267a0 69 6e 73 74 72 75 63 74 65 64 2e 0d 0a 20 20 20  instructed...   
267b0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
267c0 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
267d0 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53  xists ::no(copyS
267e0 71 6c 69 74 65 46 69 6c 65 73 29 5d 7d 20 74 68  qliteFiles)]} th
267f0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
26800 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
26810 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c  sts ::no(copySql
26820 69 74 65 43 6f 6e 66 69 67 46 69 6c 65 73 29 5d  iteConfigFiles)]
26830 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
26840 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
26850 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d  :test_channel \.
26860 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26870 20 20 20 22 2d 2d 2d 2d 20 63 6f 70 79 69 6e 67     "---- copying
26880 20 5c 22 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e   \"configuration
26890 5c 22 20 66 69 6c 65 73 2e 2e 2e 5c 6e 22 0d 0a  \" files...\n"..
268a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
268b0 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65  foreach fileName
268c0 20 24 63 6f 6e 66 69 67 46 69 6c 65 4e 61 6d 65   $configFileName
268d0 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s {..           
268e0 20 20 20 20 20 74 72 79 43 6f 70 79 42 75 69 6c       tryCopyBuil
268f0 64 46 69 6c 65 20 24 66 69 6c 65 4e 61 6d 65 20  dFile $fileName 
26900 66 61 6c 73 65 0d 0a 20 20 20 20 20 20 20 20 20  false..         
26910 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
26920 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
26930 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
26940 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79  exists ::no(copy
26950 53 71 6c 69 74 65 45 78 74 65 72 6e 61 6c 46 69  SqliteExternalFi
26960 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  les)]} then {.. 
26970 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a               #..
26980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
26990 4e 4f 54 45 3a 20 43 6f 70 79 20 74 68 65 20 4d  NOTE: Copy the M
269a0 61 6e 61 67 65 64 20 44 65 62 75 67 67 69 6e 67  anaged Debugging
269b0 20 41 73 73 69 73 74 61 6e 74 73 20 28 4d 44 41   Assistants (MDA
269c0 29 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 0d  ) configuration.
269d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
269e0 20 20 20 20 20 20 20 66 69 6c 65 20 66 6f 72 20         file for 
269f0 74 68 65 20 45 61 67 6c 65 20 73 68 65 6c 6c 20  the Eagle shell 
26a00 74 6f 20 74 68 65 20 62 75 69 6c 64 20 6f 75 74  to the build out
26a10 70 75 74 20 64 69 72 65 63 74 6f 72 79 2c 0d 0a  put directory,..
26a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
26a30 20 20 20 20 20 20 77 68 69 6c 65 20 75 73 69 6e        while usin
26a40 67 20 65 61 63 68 20 6f 66 20 74 68 65 20 6e 61  g each of the na
26a50 6d 65 73 20 6f 66 20 74 68 65 20 76 61 72 69 6f  mes of the vario
26a60 75 73 20 6c 65 67 61 63 79 20 74 65 73 74 0d 0a  us legacy test..
26a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
26a80 20 20 20 20 20 20 65 78 65 63 75 74 61 62 6c 65        executable
26a90 73 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 68 65  s.  This will he
26aa0 6c 70 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  lp to make sure 
26ab0 74 68 61 74 20 61 6c 6c 20 74 68 65 0d 0a 20 20  that all the..  
26ac0 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20              #   
26ad0 20 20 20 20 6c 65 67 61 63 79 20 74 65 73 74 73      legacy tests
26ae0 20 72 75 6e 20 77 69 74 68 20 65 78 61 63 74 6c   run with exactl
26af0 79 20 74 68 65 20 73 61 6d 65 20 73 65 74 20 6f  y the same set o
26b00 66 20 4d 61 6e 61 67 65 64 0d 0a 20 20 20 20 20  f Managed..     
26b10 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
26b20 20 44 65 62 75 67 67 69 6e 67 20 41 73 73 69 73   Debugging Assis
26b30 74 61 6e 74 73 20 63 6f 6e 66 69 67 75 72 65 64  tants configured
26b40 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
26b50 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
26b60 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
26b70 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20  channel \..     
26b80 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
26b90 2d 2d 20 63 6f 70 79 69 6e 67 20 5c 22 4d 44 41  -- copying \"MDA
26ba0 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 5c 22   configuration\"
26bb0 20 66 69 6c 65 73 2e 2e 2e 5c 6e 22 0d 0a 0d 0a   files...\n"....
26bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f                fo
26bd0 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24  reach fileName $
26be0 6d 64 61 43 6f 6e 66 69 67 46 69 6c 65 4e 61 6d  mdaConfigFileNam
26bf0 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  es {..          
26c00 20 20 20 20 20 20 74 72 79 43 6f 70 79 42 69 6e        tryCopyBin
26c10 61 72 79 46 69 6c 65 20 45 61 67 6c 65 53 68 65  aryFile EagleShe
26c20 6c 6c 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e 66 69  ll.exe.mda.confi
26c30 67 20 74 72 75 65 20 22 22 20 24 66 69 6c 65 4e  g true "" $fileN
26c40 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ame..           
26c50 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
26c60 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
26c70 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43         # NOTE: C
26c80 6f 70 79 20 74 68 65 20 65 78 74 65 72 6e 61 6c  opy the external
26c90 20 62 69 6e 61 72 69 65 73 2c 20 69 66 20 61 6e   binaries, if an
26ca0 79 2c 20 74 6f 20 74 68 65 20 64 69 72 65 63 74  y, to the direct
26cb0 6f 72 79 20 74 68 61 74 0d 0a 20 20 20 20 20 20  ory that..      
26cc0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
26cd0 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 45 61 67  contains the Eag
26ce0 6c 65 20 73 68 65 6c 6c 2e 20 20 54 68 69 73 20  le shell.  This 
26cf0 69 73 20 74 79 70 69 63 61 6c 6c 79 20 75 73 65  is typically use
26d00 64 20 74 6f 20 6d 61 6b 65 0d 0a 20 20 20 20 20  d to make..     
26d10 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
26d20 20 73 75 72 65 20 61 73 73 65 6d 62 6c 69 65 73   sure assemblies
26d30 20 72 65 66 65 72 65 6e 63 65 64 20 62 79 20 74   referenced by t
26d40 68 65 20 6f 6e 65 73 20 62 65 69 6e 67 20 74 65  he ones being te
26d50 73 74 65 64 20 61 72 65 0d 0a 20 20 20 20 20 20  sted are..      
26d60 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
26d70 61 76 61 69 6c 61 62 6c 65 20 64 75 72 69 6e 67  available during
26d80 20 74 68 65 20 74 65 73 74 69 6e 67 20 70 72 6f   the testing pro
26d90 63 65 73 73 2e 0d 0a 20 20 20 20 20 20 20 20 20  cess...         
26da0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
26db0 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
26dc0 65 73 74 5f 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d  est_channel "---
26dd0 2d 20 63 6f 70 79 69 6e 67 20 5c 22 65 78 74 65  - copying \"exte
26de0 72 6e 61 6c 5c 22 20 66 69 6c 65 73 2e 2e 2e 5c  rnal\" files...\
26df0 6e 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  n"....          
26e00 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65      foreach file
26e10 4e 61 6d 65 20 24 65 78 74 65 72 6e 61 6c 46 69  Name $externalFi
26e20 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20  leNames {..     
26e30 20 20 20 20 20 20 20 20 20 20 20 74 72 79 43 6f             tryCo
26e40 70 79 45 78 74 65 72 6e 61 6c 46 69 6c 65 20 24  pyExternalFile $
26e50 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20  fileName..      
26e60 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
26e70 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
26e80 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
26e90 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63  fo exists ::no(c
26ea0 6f 70 79 53 71 6c 69 74 65 4e 61 74 69 76 65 46  opySqliteNativeF
26eb0 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  iles)]} then {..
26ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
26ed0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
26ee0 20 4e 4f 54 45 3a 20 49 66 20 74 68 65 20 74 65   NOTE: If the te
26ef0 73 74 20 70 6c 61 74 66 6f 72 6d 20 69 73 20 6c  st platform is l
26f00 69 6b 65 6c 79 20 74 68 65 20 64 65 66 61 75 6c  ikely the defaul
26f10 74 20 66 6f 72 20 74 68 69 73 0d 0a 20 20 20 20  t for this..    
26f20 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
26f30 20 20 6d 61 63 68 69 6e 65 2c 20 61 6c 73 6f 20    machine, also 
26f40 74 72 79 20 74 6f 20 63 6f 70 79 20 74 68 65 20  try to copy the 
26f50 6e 61 74 69 76 65 20 66 69 6c 65 73 20 74 6f 20  native files to 
26f60 74 68 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  the..           
26f70 20 20 20 23 20 20 20 20 20 20 20 62 69 6e 61 72     #       binar
26f80 79 20 6c 6f 63 61 74 69 6f 6e 2e 0d 0a 20 20 20  y location...   
26f90 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
26fa0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
26fb0 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
26fc0 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65 49 6d 70  no(copySqliteImp
26fd0 6c 69 63 69 74 4e 61 74 69 76 65 46 69 6c 65 73  licitNativeFiles
26fe0 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  )] && \..       
26ff0 20 20 20 20 20 20 20 20 20 20 20 5b 69 73 44 65             [isDe
27000 66 61 75 6c 74 42 75 69 6c 64 50 6c 61 74 66 6f  faultBuildPlatfo
27010 72 6d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  rm]} then {..   
27020 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
27030 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
27040 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  el \..          
27050 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
27060 63 6f 70 79 69 6e 67 20 69 6d 70 6c 69 63 69 74  copying implicit
27070 20 5c 22 6e 61 74 69 76 65 5c 22 20 66 69 6c 65   \"native\" file
27080 73 2e 2e 2e 5c 6e 22 0d 0a 0d 0a 20 20 20 20 20  s...\n"....     
27090 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61             forea
270a0 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6e 61 74  ch fileName $nat
270b0 69 76 65 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a  iveFileNames {..
270c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
270d0 20 20 74 72 79 43 6f 70 79 41 73 73 65 6d 62 6c    tryCopyAssembl
270e0 79 20 24 66 69 6c 65 4e 61 6d 65 20 66 61 6c 73  y $fileName fals
270f0 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e..             
27100 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
27110 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
27120 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
27130 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f  o exists ::no(co
27140 70 79 53 71 6c 69 74 65 4e 6f 6e 49 6d 70 6c 69  pySqliteNonImpli
27150 63 69 74 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e  citFiles)]} then
27160 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
27170 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
27180 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53  xists ::no(copyS
27190 71 6c 69 74 65 50 6c 61 74 66 6f 72 6d 46 69 6c  qlitePlatformFil
271a0 65 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  es)] && \..     
271b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b                 [
271c0 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 70  string length $p
271d0 6c 61 74 66 6f 72 6d 5d 20 3e 20 30 7d 20 74 68  latform] > 0} th
271e0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
271f0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
27200 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
27210 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
27220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27230 20 20 20 22 2d 2d 2d 2d 20 63 6f 70 79 69 6e 67     "---- copying
27240 20 5c 22 6e 61 74 69 76 65 5c 22 20 66 69 6c 65   \"native\" file
27250 73 20 66 6f 72 20 70 6c 61 74 66 6f 72 6d 20 5c  s for platform \
27260 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  "" \..          
27270 20 20 20 20 20 20 20 20 20 20 20 20 24 70 6c 61              $pla
27280 74 66 6f 72 6d 20 5c 22 2e 2e 2e 5c 6e 5d 0d 0a  tform \"...\n]..
27290 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
272a0 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65      foreach file
272b0 4e 61 6d 65 20 24 6e 61 74 69 76 65 46 69 6c 65  Name $nativeFile
272c0 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20  Names {..       
272d0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79               try
272e0 43 6f 70 79 41 73 73 65 6d 62 6c 79 20 24 66 69  CopyAssembly $fi
272f0 6c 65 4e 61 6d 65 20 66 61 6c 73 65 20 24 70 6c  leName false $pl
27300 61 74 66 6f 72 6d 0d 0a 20 20 20 20 20 20 20 20  atform..        
27310 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
27320 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
27330 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
27340 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
27350 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c  sts ::no(copySql
27360 69 74 65 41 72 63 68 69 74 65 63 74 75 72 65 46  iteArchitectureF
27370 69 6c 65 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20  iles)] && \..   
27380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27390 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20   [string length 
273a0 24 61 72 63 68 69 74 65 63 74 75 72 65 5d 20 3e  $architecture] >
273b0 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
273c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70                tp
273d0 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
273e0 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
273f0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
27400 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63           "---- c
27410 6f 70 79 69 6e 67 20 5c 22 6e 61 74 69 76 65 5c  opying \"native\
27420 22 20 66 69 6c 65 73 20 66 6f 72 20 61 72 63 68  " files for arch
27430 69 74 65 63 74 75 72 65 20 5c 22 22 20 5c 0d 0a  itecture \"" \..
27440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27450 20 20 20 20 20 20 24 61 72 63 68 69 74 65 63 74        $architect
27460 75 72 65 20 5c 22 2e 2e 2e 5c 6e 5d 0d 0a 0d 0a  ure \"...\n]....
27470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27480 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61    foreach fileNa
27490 6d 65 20 24 6e 61 74 69 76 65 46 69 6c 65 4e 61  me $nativeFileNa
274a0 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  mes {..         
274b0 20 20 20 20 20 20 20 20 20 20 20 74 72 79 43 6f             tryCo
274c0 70 79 41 73 73 65 6d 62 6c 79 20 24 66 69 6c 65  pyAssembly $file
274d0 4e 61 6d 65 20 66 61 6c 73 65 20 24 61 72 63 68  Name false $arch
274e0 69 74 65 63 74 75 72 65 0d 0a 20 20 20 20 20 20  itecture..      
274f0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
27500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
27510 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
27520 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  }..            }
27530 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
27540 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
27550 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74  s ::no(copySqlit
27560 65 4d 69 78 65 64 46 69 6c 65 73 29 5d 7d 20 74  eMixedFiles)]} t
27570 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
27580 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
27590 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66        # NOTE: If
275a0 20 74 68 65 20 22 6e 61 74 69 76 65 22 20 72 75   the "native" ru
275b0 6e 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20  ntime option is 
275c0 73 65 74 2c 20 63 6f 70 79 20 69 6d 70 6c 69 63  set, copy implic
275d0 69 74 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  it..            
275e0 20 20 23 20 20 20 20 20 20 20 6d 69 78 65 64 2d    #       mixed-
275f0 6d 6f 64 65 20 61 73 73 65 6d 62 6c 79 20 66 69  mode assembly fi
27600 6c 65 73 20 61 73 20 77 65 6c 6c 2e 20 20 54 68  les as well.  Th
27610 65 20 72 75 6e 74 69 6d 65 20 6f 70 74 69 6f 6e  e runtime option
27620 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
27630 23 20 20 20 20 20 20 20 63 68 65 63 6b 20 69 73  #       check is
27640 20 68 61 6e 64 6c 65 64 20 77 68 65 6e 20 62 75   handled when bu
27650 69 6c 64 69 6e 67 20 74 68 65 20 6c 69 73 74 20  ilding the list 
27660 6f 66 20 6d 69 78 65 64 2d 6d 6f 64 65 0d 0a 20  of mixed-mode.. 
27670 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20               #  
27680 20 20 20 20 20 61 73 73 65 6d 62 6c 79 20 66 69       assembly fi
27690 6c 65 20 6e 61 6d 65 73 2e 0d 0a 20 20 20 20 20  le names...     
276a0 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
276b0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
276c0 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
276d0 28 63 6f 70 79 53 71 6c 69 74 65 49 6d 70 6c 69  (copySqliteImpli
276e0 63 69 74 4d 69 78 65 64 46 69 6c 65 73 29 5d 7d  citMixedFiles)]}
276f0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
27700 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
27710 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c  ::test_channel \
27720 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
27730 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 70 79        "---- copy
27740 69 6e 67 20 69 6d 70 6c 69 63 69 74 20 5c 22 6d  ing implicit \"m
27750 69 78 65 64 5c 22 20 66 69 6c 65 73 2e 2e 2e 5c  ixed\" files...\
27760 6e 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  n"....          
27770 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69        foreach fi
27780 6c 65 4e 61 6d 65 20 24 6d 69 78 65 64 46 69 6c  leName $mixedFil
27790 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20  eNames {..      
277a0 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79 43              tryC
277b0 6f 70 79 41 73 73 65 6d 62 6c 79 20 24 66 69 6c  opyAssembly $fil
277c0 65 4e 61 6d 65 20 66 61 6c 73 65 0d 0a 20 20 20  eName false..   
277d0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
277e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
277f0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
27800 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
27810 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69  ts ::no(copySqli
27820 74 65 4e 6f 6e 49 6d 70 6c 69 63 69 74 46 69 6c  teNonImplicitFil
27830 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  es)]} then {..  
27840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
27850 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
27860 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65 50  ::no(copySqliteP
27870 6c 61 74 66 6f 72 6d 46 69 6c 65 73 29 5d 20 26  latformFiles)] &
27880 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  & \..           
27890 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67           [string
278a0 20 6c 65 6e 67 74 68 20 24 70 6c 61 74 66 6f 72   length $platfor
278b0 6d 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  m] > 0} then {..
278c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
278d0 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
278e0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
278f0 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
27900 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
27910 2d 2d 20 63 6f 70 79 69 6e 67 20 5c 22 6d 69 78  -- copying \"mix
27920 65 64 5c 22 20 66 69 6c 65 73 20 66 6f 72 20 70  ed\" files for p
27930 6c 61 74 66 6f 72 6d 20 5c 22 22 20 5c 0d 0a 20  latform \"" \.. 
27940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27950 20 20 20 20 20 24 70 6c 61 74 66 6f 72 6d 20 5c       $platform \
27960 22 2e 2e 2e 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20  "...\n]....     
27970 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
27980 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6d  each fileName $m
27990 69 78 65 64 46 69 6c 65 4e 61 6d 65 73 20 7b 0d  ixedFileNames {.
279a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
279b0 20 20 20 20 20 74 72 79 43 6f 70 79 41 73 73 65       tryCopyAsse
279c0 6d 62 6c 79 20 24 66 69 6c 65 4e 61 6d 65 20 66  mbly $fileName f
279d0 61 6c 73 65 20 24 70 6c 61 74 66 6f 72 6d 0d 0a  alse $platform..
279e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
279f0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
27a00 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
27a10 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
27a20 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
27a30 28 63 6f 70 79 53 71 6c 69 74 65 41 72 63 68 69  (copySqliteArchi
27a40 74 65 63 74 75 72 65 46 69 6c 65 73 29 5d 20 26  tectureFiles)] &
27a50 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  & \..           
27a60 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67           [string
27a70 20 6c 65 6e 67 74 68 20 24 61 72 63 68 69 74 65   length $archite
27a80 63 74 75 72 65 5d 20 3e 20 30 7d 20 74 68 65 6e  cture] > 0} then
27a90 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
27aa0 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
27ab0 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
27ac0 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
27ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27ae0 20 22 2d 2d 2d 2d 20 63 6f 70 79 69 6e 67 20 5c   "---- copying \
27af0 22 6d 69 78 65 64 5c 22 20 66 69 6c 65 73 20 66  "mixed\" files f
27b00 6f 72 20 61 72 63 68 69 74 65 63 74 75 72 65 20  or architecture 
27b10 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  \"" \..         
27b20 20 20 20 20 20 20 20 20 20 20 20 20 20 24 61 72               $ar
27b30 63 68 69 74 65 63 74 75 72 65 20 5c 22 2e 2e 2e  chitecture \"...
27b40 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  \n]....         
27b50 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
27b60 20 66 69 6c 65 4e 61 6d 65 20 24 6d 69 78 65 64   fileName $mixed
27b70 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20  FileNames {..   
27b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27b90 20 74 72 79 43 6f 70 79 41 73 73 65 6d 62 6c 79   tryCopyAssembly
27ba0 20 24 66 69 6c 65 4e 61 6d 65 20 66 61 6c 73 65   $fileName false
27bb0 20 24 61 72 63 68 69 74 65 63 74 75 72 65 0d 0a   $architecture..
27bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27bd0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
27be0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
27bf0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
27c00 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
27c10 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
27c20 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70   exists ::no(cop
27c30 79 53 71 6c 69 74 65 4d 61 6e 61 67 65 64 46 69  ySqliteManagedFi
27c40 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  les)]} then {.. 
27c50 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
27c60 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
27c70 65 6c 20 22 2d 2d 2d 2d 20 63 6f 70 79 69 6e 67  el "---- copying
27c80 20 5c 22 6d 61 6e 61 67 65 64 5c 22 20 66 69 6c   \"managed\" fil
27c90 65 73 2e 2e 2e 5c 6e 22 0d 0a 0d 0a 20 20 20 20  es...\n"....    
27ca0 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63            foreac
27cb0 68 20 66 69 6c 65 4e 61 6d 65 20 24 6d 61 6e 61  h fileName $mana
27cc0 67 65 64 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a  gedFileNames {..
27cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27ce0 74 72 79 43 6f 70 79 41 73 73 65 6d 62 6c 79 20  tryCopyAssembly 
27cf0 24 66 69 6c 65 4e 61 6d 65 20 74 72 75 65 0d 0a  $fileName true..
27d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
27d10 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
27d20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
27d30 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
27d40 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b        # NOTE: Sk
27d50 69 70 20 74 72 79 69 6e 67 20 74 6f 20 6c 6f 61  ip trying to loa
27d60 64 20 61 6e 79 20 66 69 6c 65 73 20 69 66 20 69  d any files if i
27d70 6e 73 74 72 75 63 74 65 64 2e 0d 0a 20 20 20 20  nstructed...    
27d80 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
27d90 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
27da0 69 73 74 73 20 3a 3a 6e 6f 28 6c 6f 61 64 53 71  ists ::no(loadSq
27db0 6c 69 74 65 46 69 6c 65 73 29 5d 7d 20 74 68 65  liteFiles)]} the
27dc0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
27dd0 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
27de0 74 73 20 3a 3a 6e 6f 28 6c 6f 61 64 53 71 6c 69  ts ::no(loadSqli
27df0 74 65 49 6d 70 6c 69 63 69 74 46 69 6c 65 73 29  teImplicitFiles)
27e00 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
27e10 20 20 20 20 20 20 20 20 20 74 72 79 4c 6f 61 64           tryLoad
27e20 41 73 73 65 6d 62 6c 79 20 53 79 73 74 65 6d 2e  Assembly System.
27e30 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 0d  Data.SQLite.dll.
27e40 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
27e50 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
27e60 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
27e70 3a 3a 6e 6f 28 6c 6f 61 64 53 71 6c 69 74 65 4c  ::no(loadSqliteL
27e80 69 6e 71 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e  inqFiles)]} then
27e90 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
27ea0 20 20 74 72 79 4c 6f 61 64 41 73 73 65 6d 62 6c    tryLoadAssembl
27eb0 79 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  y System.Data.SQ
27ec0 4c 69 74 65 2e 4c 69 6e 71 2e 64 6c 6c 0d 0a 20  Lite.Linq.dll.. 
27ed0 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
27ee0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
27ef0 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
27f00 6e 6f 28 6c 6f 61 64 53 71 6c 69 74 65 45 66 36  no(loadSqliteEf6
27f10 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d  Files)]} then {.
27f20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  .              t
27f30 72 79 4c 6f 61 64 41 73 73 65 6d 62 6c 79 20 53  ryLoadAssembly S
27f40 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
27f50 65 2e 45 46 36 2e 64 6c 6c 0d 0a 20 20 20 20 20  e.EF6.dll..     
27f60 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
27f70 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
27f80 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 6c  fo exists ::no(l
27f90 6f 61 64 53 71 6c 69 74 65 4e 6f 6e 49 6d 70 6c  oadSqliteNonImpl
27fa0 69 63 69 74 46 69 6c 65 73 29 5d 7d 20 74 68 65  icitFiles)]} the
27fb0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
27fc0 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
27fd0 69 73 74 73 20 3a 3a 6e 6f 28 6c 6f 61 64 53 71  ists ::no(loadSq
27fe0 6c 69 74 65 50 6c 61 74 66 6f 72 6d 46 69 6c 65  litePlatformFile
27ff0 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  s)] && \..      
28000 20 20 20 20 20 20 20 20 20 20 20 20 5b 73 74 72              [str
28010 69 6e 67 20 6c 65 6e 67 74 68 20 24 70 6c 61 74  ing length $plat
28020 66 6f 72 6d 5d 20 3e 20 30 7d 20 74 68 65 6e 20  form] > 0} then 
28030 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
28040 20 20 20 74 72 79 4c 6f 61 64 41 73 73 65 6d 62     tryLoadAssemb
28050 6c 79 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  ly System.Data.S
28060 51 4c 69 74 65 2e 64 6c 6c 20 24 70 6c 61 74 66  QLite.dll $platf
28070 6f 72 6d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  orm..           
28080 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
28090 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
280a0 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 6c 6f 61   exists ::no(loa
280b0 64 53 71 6c 69 74 65 41 72 63 68 69 74 65 63 74  dSqliteArchitect
280c0 75 72 65 46 69 6c 65 73 29 5d 20 26 26 20 5c 0d  ureFiles)] && \.
280d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
280e0 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74     [string lengt
280f0 68 20 24 61 72 63 68 69 74 65 63 74 75 72 65 5d  h $architecture]
28100 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
28110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72                tr
28120 79 4c 6f 61 64 41 73 73 65 6d 62 6c 79 20 53 79  yLoadAssembly Sy
28130 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
28140 2e 64 6c 6c 20 24 61 72 63 68 69 74 65 63 74 75  .dll $architectu
28150 72 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  re..            
28160 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
28170 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d   }..          }.
28180 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
28190 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69        foreach fi
281a0 6c 65 4e 61 6d 65 4f 6e 6c 79 20 24 6e 61 74 69  leNameOnly $nati
281b0 76 65 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20  veFileNames {.. 
281c0 20 20 20 20 20 20 20 20 20 63 61 74 63 68 20 7b           catch {
281d0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
281e0 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
281f0 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
28200 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
28210 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65     "---- file ve
28220 72 73 69 6f 6e 20 6f 66 20 5c 22 22 20 24 66 69  rsion of \"" $fi
28230 6c 65 4e 61 6d 65 4f 6e 6c 79 20 22 5c 22 2e 2e  leNameOnly "\"..
28240 2e 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20  . \"" \..       
28250 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 76           [file v
28260 65 72 73 69 6f 6e 20 5b 67 65 74 42 69 6e 61 72  ersion [getBinar
28270 79 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e  yFileName $fileN
28280 61 6d 65 4f 6e 6c 79 5d 5d 20 5c 22 5c 6e 5d 0d  ameOnly]] \"\n].
28290 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
282a0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
282b0 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e     foreach fileN
282c0 61 6d 65 4f 6e 6c 79 20 24 6d 69 78 65 64 46 69  ameOnly $mixedFi
282d0 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20  leNames {..     
282e0 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20       catch {..  
282f0 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
28300 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
28310 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
28320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
28330 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73 69 6f  ---- file versio
28340 6e 20 6f 66 20 5c 22 22 20 24 66 69 6c 65 4e 61  n of \"" $fileNa
28350 6d 65 4f 6e 6c 79 20 22 5c 22 2e 2e 2e 20 5c 22  meOnly "\"... \"
28360 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
28370 20 20 20 20 20 5b 66 69 6c 65 20 76 65 72 73 69       [file versi
28380 6f 6e 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c  on [getBinaryFil
28390 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 4f  eName $fileNameO
283a0 6e 6c 79 5d 5d 20 5c 22 5c 6e 5d 0d 0a 20 20 20  nly]] \"\n]..   
283b0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
283c0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 66    }....        f
283d0 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 4f  oreach fileNameO
283e0 6e 6c 79 20 24 6d 61 6e 61 67 65 64 46 69 6c 65  nly $managedFile
283f0 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20  Names {..       
28400 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20     catch {..    
28410 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
28420 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
28430 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
28440 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
28450 2d 2d 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 20  -- file version 
28460 6f 66 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65  of \"" $fileName
28470 4f 6e 6c 79 20 22 5c 22 2e 2e 2e 20 5c 22 22 20  Only "\"... \"" 
28480 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
28490 20 20 20 5b 66 69 6c 65 20 76 65 72 73 69 6f 6e     [file version
284a0 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e   [getBinaryFileN
284b0 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c  ame $fileNameOnl
284c0 79 5d 5d 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20  y]] \"\n]..     
284d0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
284e0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20  }....        if 
284f0 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
28500 24 70 6c 61 74 66 6f 72 6d 5d 20 3e 20 30 7d 20  $platform] > 0} 
28510 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
28520 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61    foreach fileNa
28530 6d 65 4f 6e 6c 79 20 24 6e 61 74 69 76 65 46 69  meOnly $nativeFi
28540 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20  leNames {..     
28550 20 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a         catch {..
28560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70                tp
28570 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
28580 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
28590 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
285a0 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20       "---- file 
285b0 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22 22 20 24  version of \"" $
285c0 70 6c 61 74 66 6f 72 6d 20 5c 0d 0a 20 20 20 20  platform \..    
285d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 20                / 
285e0 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 22 5c  $fileNameOnly "\
285f0 22 2e 2e 2e 20 5c 22 22 20 5b 66 69 6c 65 20 76  "... \"" [file v
28600 65 72 73 69 6f 6e 20 5c 0d 0a 20 20 20 20 20 20  ersion \..      
28610 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74              [get
28620 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 24  BinaryFileName $
28630 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 24 70 6c  fileNameOnly $pl
28640 61 74 66 6f 72 6d 5d 5d 20 5c 22 5c 6e 5d 0d 0a  atform]] \"\n]..
28650 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
28660 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
28670 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
28680 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 24 6d 69  fileNameOnly $mi
28690 78 65 64 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a  xedFileNames {..
286a0 20 20 20 20 20 20 20 20 20 20 20 20 63 61 74 63              catc
286b0 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  h {..           
286c0 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
286d0 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
286e0 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
286f0 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
28700 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66 20  file version of 
28710 5c 22 22 20 24 70 6c 61 74 66 6f 72 6d 20 5c 0d  \"" $platform \.
28720 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
28730 20 20 20 2f 20 24 66 69 6c 65 4e 61 6d 65 4f 6e     / $fileNameOn
28740 6c 79 20 22 5c 22 2e 2e 2e 20 5c 22 22 20 5b 66  ly "\"... \"" [f
28750 69 6c 65 20 76 65 72 73 69 6f 6e 20 5c 0d 0a 20  ile version \.. 
28760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28770 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e   [getBinaryFileN
28780 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c  ame $fileNameOnl
28790 79 20 24 70 6c 61 74 66 6f 72 6d 5d 5d 20 5c 22  y $platform]] \"
287a0 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  \n]..           
287b0 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d   }..          }.
287c0 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
287d0 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
287e0 67 20 6c 65 6e 67 74 68 20 24 61 72 63 68 69 74  g length $archit
287f0 65 63 74 75 72 65 5d 20 3e 20 30 7d 20 74 68 65  ecture] > 0} the
28800 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 66  n {..          f
28810 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 4f  oreach fileNameO
28820 6e 6c 79 20 24 6e 61 74 69 76 65 46 69 6c 65 4e  nly $nativeFileN
28830 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20  ames {..        
28840 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20      catch {..   
28850 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
28860 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
28870 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
28880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28890 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72    "---- file ver
288a0 73 69 6f 6e 20 6f 66 20 5c 22 22 20 24 61 72 63  sion of \"" $arc
288b0 68 69 74 65 63 74 75 72 65 20 5c 0d 0a 20 20 20  hitecture \..   
288c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
288d0 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 22   $fileNameOnly "
288e0 5c 22 2e 2e 2e 20 5c 22 22 20 5b 66 69 6c 65 20  \"... \"" [file 
288f0 76 65 72 73 69 6f 6e 20 5c 0d 0a 20 20 20 20 20  version \..     
28900 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65               [ge
28910 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20  tBinaryFileName 
28920 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 24 61  $fileNameOnly $a
28930 72 63 68 69 74 65 63 74 75 72 65 5d 5d 20 5c 22  rchitecture]] \"
28940 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  \n]..           
28950 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d   }..          }.
28960 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  ...          for
28970 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 4f 6e 6c  each fileNameOnl
28980 79 20 24 6d 69 78 65 64 46 69 6c 65 4e 61 6d 65  y $mixedFileName
28990 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s {..           
289a0 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20   catch {..      
289b0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
289c0 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
289d0 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
289e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
289f0 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73 69 6f  ---- file versio
28a00 6e 20 6f 66 20 5c 22 22 20 24 61 72 63 68 69 74  n of \"" $archit
28a10 65 63 74 75 72 65 20 5c 0d 0a 20 20 20 20 20 20  ecture \..      
28a20 20 20 20 20 20 20 20 20 20 20 20 20 2f 20 24 66              / $f
28a30 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 22 5c 22 2e  ileNameOnly "\".
28a40 2e 2e 20 5c 22 22 20 5b 66 69 6c 65 20 76 65 72  .. \"" [file ver
28a50 73 69 6f 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20  sion \..        
28a60 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 42 69            [getBi
28a70 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 24 66 69  naryFileName $fi
28a80 6c 65 4e 61 6d 65 4f 6e 6c 79 20 24 61 72 63 68  leNameOnly $arch
28a90 69 74 65 63 74 75 72 65 5d 5d 20 5c 22 5c 6e 5d  itecture]] \"\n]
28aa0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
28ab0 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
28ac0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
28ad0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
28ae0 4e 4f 54 45 3a 20 47 72 61 62 20 74 68 65 20 6c  NOTE: Grab the l
28af0 69 73 74 20 6f 66 20 6d 61 6e 61 67 65 64 20 61  ist of managed a
28b00 73 73 65 6d 62 6c 69 65 73 20 66 6f 72 20 74 68  ssemblies for th
28b10 65 20 63 75 72 72 65 6e 74 20 70 72 6f 63 65 73  e current proces
28b20 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  s..        #    
28b30 20 20 20 61 6e 64 20 72 65 70 6f 72 74 20 6f 6e     and report on
28b40 20 74 68 65 20 53 79 73 74 65 6d 2e 44 61 74 61   the System.Data
28b50 2e 53 51 4c 69 74 65 20 72 65 6c 61 74 65 64 20  .SQLite related 
28b60 6f 6e 65 73 2e 0d 0a 20 20 20 20 20 20 20 20 23  ones...        #
28b70 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 68  ..        if {[h
28b80 61 76 65 53 51 4c 69 74 65 4f 62 6a 65 63 74 43  aveSQLiteObjectC
28b90 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65 6e 20 7b 0d  ommand]} then {.
28ba0 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20 61  .          set a
28bb0 73 73 65 6d 62 6c 69 65 73 20 5b 6f 62 6a 65 63  ssemblies [objec
28bc0 74 20 69 6e 76 6f 6b 65 20 41 70 70 44 6f 6d 61  t invoke AppDoma
28bd0 69 6e 2e 43 75 72 72 65 6e 74 44 6f 6d 61 69 6e  in.CurrentDomain
28be0 20 47 65 74 41 73 73 65 6d 62 6c 69 65 73 5d 0d   GetAssemblies].
28bf0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a  ...          obj
28c00 65 63 74 20 66 6f 72 65 61 63 68 20 61 73 73 65  ect foreach asse
28c10 6d 62 6c 79 20 24 61 73 73 65 6d 62 6c 69 65 73  mbly $assemblies
28c20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
28c30 69 66 20 7b 5b 73 74 72 69 6e 67 20 6d 61 74 63  if {[string matc
28c40 68 20 5c 7b 53 79 73 74 65 6d 2e 44 61 74 61 2e  h \{System.Data.
28c50 53 51 4c 69 74 65 2a 20 24 61 73 73 65 6d 62 6c  SQLite* $assembl
28c60 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  y]} then {..    
28c70 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
28c80 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
28c90 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
28ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28cb0 20 22 2d 2d 2d 2d 20 66 6f 75 6e 64 20 6c 6f 61   "---- found loa
28cc0 64 65 64 20 61 73 73 65 6d 62 6c 79 3a 20 22 20  ded assembly: " 
28cd0 24 61 73 73 65 6d 62 6c 79 20 5c 6e 5d 0d 0a 20  $assembly \n].. 
28ce0 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
28cf0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
28d00 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
28d10 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
28d20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
28d30 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20  _channel \..    
28d40 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
28d50 64 65 66 69 6e 65 20 63 6f 6e 73 74 61 6e 74 73  define constants
28d60 20 66 6f 72 20 5c 22 53 79 73 74 65 6d 2e 44 61   for \"System.Da
28d70 74 61 2e 53 51 4c 69 74 65 5c 22 2e 2e 2e 20 22  ta.SQLite\"... "
28d80 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66  ....          if
28d90 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
28da0 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69          object i
28db0 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f  nvoke -flags +No
28dc0 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20  nPublic \..     
28dd0 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65             Syste
28de0 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51  m.Data.SQLite.SQ
28df0 4c 69 74 65 33 20 44 65 66 69 6e 65 43 6f 6e 73  Lite3 DefineCons
28e00 74 61 6e 74 73 0d 0a 20 20 20 20 20 20 20 20 20  tants..         
28e10 20 7d 20 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e   } defineConstan
28e20 74 73 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  ts] == 0} then {
28e30 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
28e40 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
28e50 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
28e60 5b 66 6f 72 6d 61 74 4c 69 73 74 20 5b 6c 73 6f  [formatList [lso
28e70 72 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  rt \..          
28e80 20 20 20 20 20 20 24 64 65 66 69 6e 65 43 6f 6e        $defineCon
28e90 73 74 61 6e 74 73 5d 20 3c 6e 6f 6e 65 3e 5d 20  stants] <none>] 
28ea0 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  \n]..          }
28eb0 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
28ec0 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
28ed0 73 74 5f 63 68 61 6e 6e 65 6c 20 75 6e 6b 6e 6f  st_channel unkno
28ee0 77 6e 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20 20  wn\n..          
28ef0 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  }..        }....
28f00 20 20 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d          catch {.
28f10 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
28f20 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
28f30 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
28f40 20 20 22 2d 2d 2d 2d 20 73 6f 75 72 63 65 20 76    "---- source v
28f50 65 72 73 69 6f 6e 20 6f 66 20 5c 22 53 79 73 74  ersion of \"Syst
28f60 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64  em.Data.SQLite.d
28f70 6c 6c 5c 22 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20  ll\"... "....   
28f80 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
28f90 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  h {..           
28fa0 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d   object invoke -
28fb0 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63  flags +NonPublic
28fc0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
28fd0 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e      System.Data.
28fe0 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 43 6f 6e  SQLite.SQLiteCon
28ff0 6e 65 63 74 69 6f 6e 20 50 72 6f 76 69 64 65 72  nection Provider
29000 56 65 72 73 69 6f 6e 0d 0a 20 20 20 20 20 20 20  Version..       
29010 20 20 20 7d 20 76 65 72 73 69 6f 6e 5d 20 3d 3d     } version] ==
29020 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
29030 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72          if {[str
29040 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 65 72 73  ing length $vers
29050 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ion] == 0} then 
29060 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
29070 20 73 65 74 20 76 65 72 73 69 6f 6e 20 6e 75 6c   set version nul
29080 6c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  l..            }
29090 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
290a0 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
290b0 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
290c0 24 76 65 72 73 69 6f 6e 20 5c 6e 5d 0d 0a 20 20  $version \n]..  
290d0 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
290e0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
290f0 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
29100 6e 65 6c 20 75 6e 6b 6e 6f 77 6e 5c 6e 0d 0a 20  nel unknown\n.. 
29110 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
29120 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
29130 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20   catch {..      
29140 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
29150 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20  t_channel \..   
29160 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
29170 20 73 6f 75 72 63 65 20 63 68 65 63 6b 6f 75 74   source checkout
29180 20 6f 66 20 5c 22 53 79 73 74 65 6d 2e 44 61 74   of \"System.Dat
29190 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 5c 22 2e 2e  a.SQLite.dll\"..
291a0 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  . "....         
291b0 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
291c0 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63             objec
291d0 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20  t invoke -flags 
291e0 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20  +NonPublic \..  
291f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79                Sy
29200 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
29210 2e 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f  .SQLiteConnectio
29220 6e 20 50 72 6f 76 69 64 65 72 53 6f 75 72 63 65  n ProviderSource
29230 49 64 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20  Id..          } 
29240 73 6f 75 72 63 65 49 64 5d 20 3d 3d 20 30 7d 20  sourceId] == 0} 
29250 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
29260 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
29270 6c 65 6e 67 74 68 20 24 73 6f 75 72 63 65 49 64  length $sourceId
29280 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
29290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
292a0 74 20 73 6f 75 72 63 65 49 64 20 6e 75 6c 6c 0d  t sourceId null.
292b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
292c0 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
292d0 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
292e0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 73  l [appendArgs $s
292f0 6f 75 72 63 65 49 64 20 5c 6e 5d 0d 0a 20 20 20  ourceId \n]..   
29300 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
29310 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
29320 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
29330 65 6c 20 75 6e 6b 6e 6f 77 6e 5c 6e 0d 0a 20 20  el unknown\n..  
29340 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
29350 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
29360 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
29370 45 3a 20 52 65 73 65 74 20 63 61 63 68 65 64 20  E: Reset cached 
29380 22 62 72 65 61 6b 20 69 6e 74 6f 20 64 65 62 75  "break into debu
29390 67 67 65 72 22 20 73 65 74 74 69 6e 67 20 73 6f  gger" setting so
293a0 20 74 68 61 74 20 69 74 20 63 61 6e 20 62 65 0d   that it can be.
293b0 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
293c0 20 75 73 65 64 20 64 75 72 69 6e 67 20 74 68 65   used during the
293d0 20 74 65 73 74 20 66 69 6c 65 2c 20 69 66 20 6e   test file, if n
293e0 65 65 64 65 64 2e 0d 0a 20 20 20 20 20 20 20 20  eeded...        
293f0 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21  #..        if {!
29400 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
29410 6f 28 72 65 73 65 74 42 72 65 61 6b 49 6e 74 6f  o(resetBreakInto
29420 44 65 62 75 67 67 65 72 29 5d 20 26 26 20 5c 0d  Debugger)] && \.
29430 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 68 61  .            [ha
29440 76 65 53 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f  veSQLiteObjectCo
29450 6d 6d 61 6e 64 5d 7d 20 74 68 65 6e 20 7b 0d 0a  mmand]} then {..
29460 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63            if {[c
29470 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
29480 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b      object invok
29490 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62  e -flags +NonPub
294a0 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  lic \..         
294b0 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61         System.Da
294c0 74 61 2e 53 51 4c 69 74 65 2e 48 65 6c 70 65 72  ta.SQLite.Helper
294d0 4d 65 74 68 6f 64 73 20 52 65 73 65 74 42 72 65  Methods ResetBre
294e0 61 6b 49 6e 74 6f 44 65 62 75 67 67 65 72 0d 0a  akIntoDebugger..
294f0 20 20 20 20 20 20 20 20 20 20 7d 20 72 65 73 75            } resu
29500 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  lt] == 0} then {
29510 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
29520 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
29530 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
29540 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
29550 20 20 20 22 2d 2d 2d 2d 20 63 61 6c 6c 20 52 65     "---- call Re
29560 73 65 74 42 72 65 61 6b 49 6e 74 6f 44 65 62 75  setBreakIntoDebu
29570 67 67 65 72 28 29 2e 2e 2e 20 6f 6b 5c 6e 22 5d  gger()... ok\n"]
29580 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c  ..          } el
29590 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
295a0 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
295b0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
295c0 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
295d0 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 61 6c         "---- cal
295e0 6c 20 52 65 73 65 74 42 72 65 61 6b 49 6e 74 6f  l ResetBreakInto
295f0 44 65 62 75 67 67 65 72 28 29 2e 2e 2e 20 65 72  Debugger()... er
29600 72 6f 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20  ror: " \..      
29610 20 20 20 20 20 20 20 20 20 20 5c 6e 5c 74 20 24            \n\t $
29620 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20  result \n]..    
29630 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
29640 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d   }....        #.
29650 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
29660 20 43 68 65 63 6b 20 74 68 65 20 61 76 61 69 6c   Check the avail
29670 61 62 6c 65 20 62 75 69 6c 64 73 20 28 61 6e 64  able builds (and
29680 20 22 72 65 6c 65 61 73 65 73 22 29 20 6f 66 20   "releases") of 
29690 53 51 4c 69 74 65 20 61 6e 64 0d 0a 20 20 20 20  SQLite and..    
296a0 20 20 20 20 23 20 20 20 20 20 20 20 53 79 73 74      #       Syst
296b0 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 0d  em.Data.SQLite..
296c0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
296d0 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51 4c 69      checkForSQLi
296e0 74 65 42 75 69 6c 64 73 20 24 3a 3a 74 65 73 74  teBuilds $::test
296f0 5f 63 68 61 6e 6e 65 6c 0d 0a 20 20 20 20 20 20  _channel..      
29700 20 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65    checkForSQLite
29710 52 65 6c 65 61 73 65 73 20 24 3a 3a 74 65 73 74  Releases $::test
29720 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20  _channel....    
29730 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
29740 20 4e 4f 54 45 3a 20 4e 6f 77 2c 20 77 65 20 6e   NOTE: Now, we n
29750 65 65 64 20 74 6f 20 6b 6e 6f 77 20 69 66 20 74  eed to know if t
29760 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20 6c  he SQLite core l
29770 69 62 72 61 72 79 20 69 73 20 61 76 61 69 6c 61  ibrary is availa
29780 62 6c 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ble..        #  
29790 20 20 20 20 20 28 69 2e 65 2e 20 62 65 63 61 75       (i.e. becau
297a0 73 65 20 74 68 65 20 6d 61 6e 61 67 65 64 2d 6f  se the managed-o
297b0 6e 6c 79 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  nly System.Data.
297c0 53 51 4c 69 74 65 20 61 73 73 65 6d 62 6c 79 20  SQLite assembly 
297d0 63 61 6e 0d 0a 20 20 20 20 20 20 20 20 23 20 20  can..        #  
297e0 20 20 20 20 20 6c 6f 61 64 20 77 69 74 68 6f 75       load withou
297f0 74 20 69 74 3b 20 68 6f 77 65 76 65 72 2c 20 69  t it; however, i
29800 74 20 63 61 6e 6e 6f 74 20 64 6f 20 61 6e 79 74  t cannot do anyt
29810 68 69 6e 67 20 75 73 65 66 75 6c 20 77 69 74 68  hing useful with
29820 6f 75 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20  out..        #  
29830 20 20 20 20 20 69 74 29 2e 20 20 49 66 20 77 65       it).  If we
29840 20 61 72 65 20 75 73 69 6e 67 20 74 68 65 20 6d   are using the m
29850 69 78 65 64 2d 6d 6f 64 65 20 61 73 73 65 6d 62  ixed-mode assemb
29860 6c 79 20 61 6e 64 20 77 65 20 61 6c 72 65 61 64  ly and we alread
29870 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  y..        #    
29880 20 20 20 66 6f 75 6e 64 20 69 74 20 28 61 62 6f     found it (abo
29890 76 65 29 2c 20 74 68 69 73 20 73 68 6f 75 6c 64  ve), this should
298a0 20 61 6c 77 61 79 73 20 73 75 63 63 65 65 64 2e   always succeed.
298b0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
298c0 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51 4c       checkForSQL
298d0 69 74 65 4c 69 62 72 61 72 79 20 24 3a 3a 74 65  iteLibrary $::te
298e0 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20  st_channel....  
298f0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
29900 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69   # NOTE: Check i
29910 66 20 74 68 65 20 53 51 4c 69 74 65 20 69 6e 74  f the SQLite int
29920 65 72 6f 70 20 61 73 73 65 6d 62 6c 79 20 69 73  erop assembly is
29930 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0a 20 20 20   available...   
29940 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
29950 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 49 6e  checkForSQLiteIn
29960 74 65 72 6f 70 20 24 3a 3a 74 65 73 74 5f 63 68  terop $::test_ch
29970 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20 20 20  annel....       
29980 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
29990 54 45 3a 20 43 68 65 63 6b 20 74 68 65 20 53 51  TE: Check the SQ
299a0 4c 69 74 65 20 64 61 74 61 62 61 73 65 20 61 6e  Lite database an
299b0 64 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65  d temporary dire
299c0 63 74 6f 72 69 65 73 2e 0d 0a 20 20 20 20 20 20  ctories...      
299d0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 63 68 65    #..        che
299e0 63 6b 46 6f 72 53 51 4c 69 74 65 44 69 72 65 63  ckForSQLiteDirec
299f0 74 6f 72 69 65 73 20 24 3a 3a 74 65 73 74 5f 63  tories $::test_c
29a00 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20 20  hannel....      
29a10 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
29a20 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20  OTE: Attempt to 
29a30 64 65 74 65 72 6d 69 6e 65 20 69 66 20 76 61 72  determine if var
29a40 69 6f 75 73 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  ious compile-tim
29a50 65 20 6f 70 74 69 6f 6e 73 20 6e 65 65 64 65 64  e options needed
29a60 20 66 6f 72 0d 0a 20 20 20 20 20 20 20 20 23 20   for..        # 
29a70 20 20 20 20 20 20 74 65 73 74 20 63 6f 6e 73 74        test const
29a80 72 61 69 6e 74 73 20 77 65 72 65 20 65 6e 61 62  raints were enab
29a90 6c 65 64 20 66 6f 72 20 74 68 65 20 6d 61 6e 61  led for the mana
29aa0 67 65 64 20 61 73 73 65 6d 62 6c 79 2e 20 20 54  ged assembly.  T
29ab0 68 65 72 65 0d 0a 20 20 20 20 20 20 20 20 23 20  here..        # 
29ac0 20 20 20 20 20 20 61 72 65 20 73 6f 6d 65 20 63        are some c
29ad0 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69  ompile-time opti
29ae0 6f 6e 73 20 74 68 61 74 20 6d 75 73 74 20 61 6c  ons that must al
29af0 73 6f 20 68 61 76 65 20 62 65 65 6e 20 65 6e 61  so have been ena
29b00 62 6c 65 64 0d 0a 20 20 20 20 20 20 20 20 23 20  bled..        # 
29b10 20 20 20 20 20 20 66 6f 72 20 74 68 65 20 69 6e        for the in
29b20 74 65 72 6f 70 20 61 73 73 65 6d 62 6c 79 20 69  terop assembly i
29b30 6e 20 6f 72 64 65 72 20 74 6f 20 62 65 20 65 66  n order to be ef
29b40 66 65 63 74 69 76 65 2e 20 20 46 6f 72 20 74 68  fective.  For th
29b50 6f 73 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ose..        #  
29b60 20 20 20 20 20 6f 70 74 69 6f 6e 73 2c 20 69 74       options, it
29b70 20 77 69 6c 6c 20 62 65 20 61 73 73 75 6d 65 64   will be assumed
29b80 20 74 68 61 74 20 69 74 20 77 61 73 20 65 6e 61   that it was ena
29b90 62 6c 65 64 20 66 6f 72 20 74 68 65 20 69 6e 74  bled for the int
29ba0 65 72 6f 70 0d 0a 20 20 20 20 20 20 20 20 23 20  erop..        # 
29bb0 20 20 20 20 20 20 61 73 73 65 6d 62 6c 79 20 69        assembly i
29bc0 66 20 69 74 20 77 61 73 20 65 6e 61 62 6c 65 64  f it was enabled
29bd0 20 66 6f 72 20 74 68 65 20 6d 61 6e 61 67 65 64   for the managed
29be0 20 61 73 73 65 6d 62 6c 79 2e 0d 0a 20 20 20 20   assembly...    
29bf0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 66      #..        f
29c00 6f 72 65 61 63 68 20 64 65 66 69 6e 65 43 6f 6e  oreach defineCon
29c10 73 74 61 6e 74 20 5b 6c 69 73 74 20 5c 0d 0a 20  stant [list \.. 
29c20 20 20 20 20 20 20 20 20 20 20 20 43 48 45 43 4b             CHECK
29c30 5f 53 54 41 54 45 20 43 4f 55 4e 54 5f 48 41 4e  _STATE COUNT_HAN
29c40 44 4c 45 20 44 45 42 55 47 20 49 4e 54 45 52 4f  DLE DEBUG INTERO
29c50 50 5f 43 4f 44 45 43 20 49 4e 54 45 52 4f 50 5f  P_CODEC INTEROP_
29c60 44 45 42 55 47 20 5c 0d 0a 20 20 20 20 20 20 20  DEBUG \..       
29c70 20 20 20 20 20 49 4e 54 45 52 4f 50 5f 45 58 54       INTEROP_EXT
29c80 45 4e 53 49 4f 4e 5f 46 55 4e 43 54 49 4f 4e 53  ENSION_FUNCTIONS
29c90 20 49 4e 54 45 52 4f 50 5f 46 54 53 35 5f 45 58   INTEROP_FTS5_EX
29ca0 54 45 4e 53 49 4f 4e 20 5c 0d 0a 20 20 20 20 20  TENSION \..     
29cb0 20 20 20 20 20 20 20 49 4e 54 45 52 4f 50 5f 49         INTEROP_I
29cc0 4e 43 4c 55 44 45 5f 43 45 52 4f 44 20 49 4e 54  NCLUDE_CEROD INT
29cd0 45 52 4f 50 5f 49 4e 43 4c 55 44 45 5f 45 58 54  EROP_INCLUDE_EXT
29ce0 52 41 20 49 4e 54 45 52 4f 50 5f 49 4e 43 4c 55  RA INTEROP_INCLU
29cf0 44 45 5f 53 45 45 20 5c 0d 0a 20 20 20 20 20 20  DE_SEE \..      
29d00 20 20 20 20 20 20 49 4e 54 45 52 4f 50 5f 49 4e        INTEROP_IN
29d10 43 4c 55 44 45 5f 5a 49 50 56 46 53 20 49 4e 54  CLUDE_ZIPVFS INT
29d20 45 52 4f 50 5f 4a 53 4f 4e 31 5f 45 58 54 45 4e  EROP_JSON1_EXTEN
29d30 53 49 4f 4e 20 5c 0d 0a 20 20 20 20 20 20 20 20  SION \..        
29d40 20 20 20 20 49 4e 54 45 52 4f 50 5f 4c 45 47 41      INTEROP_LEGA
29d50 43 59 5f 43 4c 4f 53 45 20 49 4e 54 45 52 4f 50  CY_CLOSE INTEROP
29d60 5f 4c 4f 47 20 49 4e 54 45 52 4f 50 5f 50 45 52  _LOG INTEROP_PER
29d70 43 45 4e 54 49 4c 45 5f 45 58 54 45 4e 53 49 4f  CENTILE_EXTENSIO
29d80 4e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  N \..           
29d90 20 49 4e 54 45 52 4f 50 5f 52 45 47 45 58 50 5f   INTEROP_REGEXP_
29da0 45 58 54 45 4e 53 49 4f 4e 20 49 4e 54 45 52 4f  EXTENSION INTERO
29db0 50 5f 53 45 53 53 49 4f 4e 5f 45 58 54 45 4e 53  P_SESSION_EXTENS
29dc0 49 4f 4e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ION \..         
29dd0 20 20 20 49 4e 54 45 52 4f 50 5f 53 48 41 31 5f     INTEROP_SHA1_
29de0 45 58 54 45 4e 53 49 4f 4e 20 49 4e 54 45 52 4f  EXTENSION INTERO
29df0 50 5f 54 45 53 54 5f 45 58 54 45 4e 53 49 4f 4e  P_TEST_EXTENSION
29e00 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
29e10 49 4e 54 45 52 4f 50 5f 54 4f 54 59 50 45 5f 45  INTEROP_TOTYPE_E
29e20 58 54 45 4e 53 49 4f 4e 20 49 4e 54 45 52 4f 50  XTENSION INTEROP
29e30 5f 56 49 52 54 55 41 4c 5f 54 41 42 4c 45 20 5c  _VIRTUAL_TABLE \
29e40 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 4e 45  ..            NE
29e50 54 5f 32 30 20 4e 45 54 5f 33 35 20 4e 45 54 5f  T_20 NET_35 NET_
29e60 34 30 20 4e 45 54 5f 34 35 20 4e 45 54 5f 34 35  40 NET_45 NET_45
29e70 31 20 4e 45 54 5f 34 35 32 20 4e 45 54 5f 34 36  1 NET_452 NET_46
29e80 20 4e 45 54 5f 34 36 31 20 5c 0d 0a 20 20 20 20   NET_461 \..    
29e90 20 20 20 20 20 20 20 20 4e 45 54 5f 34 36 32 20          NET_462 
29ea0 4e 45 54 5f 34 37 20 4e 45 54 5f 34 37 31 20 4e  NET_47 NET_471 N
29eb0 45 54 5f 43 4f 4d 50 41 43 54 5f 32 30 20 50 4c  ET_COMPACT_20 PL
29ec0 41 54 46 4f 52 4d 5f 43 4f 4d 50 41 43 54 46 52  ATFORM_COMPACTFR
29ed0 41 4d 45 57 4f 52 4b 20 5c 0d 0a 20 20 20 20 20  AMEWORK \..     
29ee0 20 20 20 20 20 20 20 50 52 45 4c 4f 41 44 5f 4e         PRELOAD_N
29ef0 41 54 49 56 45 5f 4c 49 42 52 41 52 59 20 52 45  ATIVE_LIBRARY RE
29f00 54 41 52 47 45 54 41 42 4c 45 20 53 51 4c 49 54  TARGETABLE SQLIT
29f10 45 5f 53 54 41 4e 44 41 52 44 20 5c 0d 0a 20 20  E_STANDARD \..  
29f20 20 20 20 20 20 20 20 20 20 20 54 48 52 4f 57 5f            THROW_
29f30 4f 4e 5f 44 49 53 50 4f 53 45 44 20 54 52 41 43  ON_DISPOSED TRAC
29f40 45 20 54 52 41 43 45 5f 43 4f 4e 4e 45 43 54 49  E TRACE_CONNECTI
29f50 4f 4e 20 54 52 41 43 45 5f 44 45 54 45 43 54 49  ON TRACE_DETECTI
29f60 4f 4e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ON \..          
29f70 20 20 54 52 41 43 45 5f 48 41 4e 44 4c 45 20 54    TRACE_HANDLE T
29f80 52 41 43 45 5f 50 52 45 4c 4f 41 44 20 54 52 41  RACE_PRELOAD TRA
29f90 43 45 5f 53 48 41 52 45 44 20 54 52 41 43 45 5f  CE_SHARED TRACE_
29fa0 53 54 41 54 45 4d 45 4e 54 20 5c 0d 0a 20 20 20  STATEMENT \..   
29fb0 20 20 20 20 20 20 20 20 20 54 52 41 43 45 5f 57           TRACE_W
29fc0 41 52 4e 49 4e 47 20 54 52 41 43 4b 5f 4d 45 4d  ARNING TRACK_MEM
29fd0 4f 52 59 5f 42 59 54 45 53 20 55 53 45 5f 45 4e  ORY_BYTES USE_EN
29fe0 54 49 54 59 5f 46 52 41 4d 45 57 4f 52 4b 5f 36  TITY_FRAMEWORK_6
29ff0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
2a000 55 53 45 5f 49 4e 54 45 52 4f 50 5f 44 4c 4c 20  USE_INTEROP_DLL 
2a010 55 53 45 5f 50 52 45 50 41 52 45 5f 56 32 20 57  USE_PREPARE_V2 W
2a020 49 4e 44 4f 57 53 5d 20 7b 0d 0a 20 20 20 20 20  INDOWS] {..     
2a030 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
2a040 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20    # NOTE: Check 
2a050 69 66 20 74 68 65 20 63 6f 6d 70 69 6c 65 2d 74  if the compile-t
2a060 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 6c 69  ime option is li
2a070 73 74 65 64 20 69 6e 20 74 68 65 20 6c 69 73 74  sted in the list
2a080 20 6f 66 0d 0a 20 20 20 20 20 20 20 20 20 20 23   of..          #
2a090 20 20 20 20 20 20 20 22 64 65 66 69 6e 65 20 63         "define c
2a0a0 6f 6e 73 74 61 6e 74 73 22 20 6b 65 70 74 20 74  onstants" kept t
2a0b0 72 61 63 6b 20 6f 66 20 62 79 20 74 68 65 20 6d  rack of by the m
2a0c0 61 6e 61 67 65 64 20 61 73 73 65 6d 62 6c 79 2e  anaged assembly.
2a0d0 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
2a0e0 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f           checkFo
2a0f0 72 53 51 4c 69 74 65 44 65 66 69 6e 65 43 6f 6e  rSQLiteDefineCon
2a100 73 74 61 6e 74 20 24 3a 3a 74 65 73 74 5f 63 68  stant $::test_ch
2a110 61 6e 6e 65 6c 20 24 64 65 66 69 6e 65 43 6f 6e  annel $defineCon
2a120 73 74 61 6e 74 0d 0a 20 20 20 20 20 20 20 20 7d  stant..        }
2a130 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
2a140 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43         # NOTE: C
2a150 68 65 63 6b 20 69 66 20 74 68 65 20 53 79 73 74  heck if the Syst
2a160 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 70  em.Data.SQLite p
2a170 72 6f 76 69 64 65 72 20 77 61 73 20 63 6f 6d 70  rovider was comp
2a180 69 6c 65 64 20 77 69 74 68 0d 0a 20 20 20 20 20  iled with..     
2a190 20 20 20 23 20 20 20 20 20 20 20 73 75 70 70 6f     #       suppo
2a1a0 72 74 20 66 6f 72 20 61 6e 79 20 65 6e 63 72 79  rt for any encry
2a1b0 70 74 65 64 20 64 61 74 61 62 61 73 65 73 2e 0d  pted databases..
2a1c0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
2a1d0 20 20 20 20 69 66 20 7b 5b 68 61 76 65 53 51 4c      if {[haveSQL
2a1e0 69 74 65 44 65 66 69 6e 65 43 6f 6e 73 74 61 6e  iteDefineConstan
2a1f0 74 20 49 4e 54 45 52 4f 50 5f 43 4f 44 45 43 5d  t INTEROP_CODEC]
2a200 20 7c 7c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   || \..         
2a210 20 20 20 5b 68 61 76 65 53 51 4c 69 74 65 44 65     [haveSQLiteDe
2a220 66 69 6e 65 43 6f 6e 73 74 61 6e 74 20 49 4e 54  fineConstant INT
2a230 45 52 4f 50 5f 49 4e 43 4c 55 44 45 5f 53 45 45  EROP_INCLUDE_SEE
2a240 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
2a250 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
2a260 20 20 23 20 4e 4f 54 45 3a 20 59 65 73 2c 20 61    # NOTE: Yes, a
2a270 64 64 20 67 65 6e 65 72 69 63 20 63 6f 6e 73 74  dd generic const
2a280 72 61 69 6e 74 20 66 6f 72 20 75 73 65 20 62 79  raint for use by
2a290 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65 2e   the test suite.
2a2a0 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
2a2b0 20 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73           addCons
2a2c0 74 72 61 69 6e 74 20 53 79 73 74 65 6d 2e 44 61  traint System.Da
2a2d0 74 61 2e 53 51 4c 69 74 65 2e 45 6e 63 72 79 70  ta.SQLite.Encryp
2a2e0 74 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20 7d 0d  tion..        }.
2a2f0 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
2a300 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68        # NOTE: Ch
2a310 65 63 6b 20 74 68 65 20 63 75 72 72 65 6e 74 20  eck the current 
2a320 62 75 69 6c 64 20 79 65 61 72 2e 20 20 42 61 73  build year.  Bas
2a330 69 63 61 6c 6c 79 2c 20 74 68 69 73 20 69 6e 64  ically, this ind
2a340 69 63 61 74 65 73 0d 0a 20 20 20 20 20 20 20 20  icates..        
2a350 23 20 20 20 20 20 20 20 77 68 69 63 68 20 76 65  #       which ve
2a360 72 73 69 6f 6e 20 6f 66 20 4d 53 42 75 69 6c 64  rsion of MSBuild
2a370 20 61 6e 64 2f 6f 72 20 56 69 73 75 61 6c 20 53   and/or Visual S
2a380 74 75 64 69 6f 20 77 61 73 20 75 73 65 64 20 74  tudio was used t
2a390 6f 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  o..        #    
2a3a0 20 20 20 63 6f 6d 70 69 6c 65 20 74 68 65 20 61     compile the a
2a3b0 73 73 65 6d 62 6c 79 20 62 69 6e 61 72 69 65 73  ssembly binaries
2a3c0 20 75 6e 64 65 72 20 74 65 73 74 2e 0d 0a 20 20   under test...  
2a3d0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
2a3e0 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
2a3f0 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20  hannel \..      
2a400 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65 63        "---- chec
2a410 6b 69 6e 67 20 66 6f 72 20 53 79 73 74 65 6d 2e  king for System.
2a420 44 61 74 61 2e 53 51 4c 69 74 65 20 62 75 69 6c  Data.SQLite buil
2a430 64 20 79 65 61 72 2e 2e 2e 20 22 0d 0a 0d 0a 20  d year... ".... 
2a440 20 20 20 20 20 20 20 73 65 74 20 79 65 61 72 20         set year 
2a450 5b 67 65 74 42 75 69 6c 64 59 65 61 72 5d 0d 0a  [getBuildYear]..
2a460 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74          addConst
2a470 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67  raint [appendArg
2a480 73 20 62 75 69 6c 64 59 65 61 72 2e 20 24 79 65  s buildYear. $ye
2a490 61 72 5d 0d 0a 20 20 20 20 20 20 20 20 74 70 75  ar]..        tpu
2a4a0 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
2a4b0 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
2a4c0 22 20 24 79 65 61 72 20 5c 22 5c 6e 5d 0d 0a 0d  " $year \"\n]...
2a4d0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
2a4e0 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63      # NOTE: Chec
2a4f0 6b 20 74 68 65 20 63 75 72 72 65 6e 74 20 62 75  k the current bu
2a500 69 6c 64 20 2e 4e 45 54 20 46 72 61 6d 65 77 6f  ild .NET Framewo
2a510 72 6b 2e 20 20 42 61 73 69 63 61 6c 6c 79 2c 20  rk.  Basically, 
2a520 74 68 69 73 0d 0a 20 20 20 20 20 20 20 20 23 20  this..        # 
2a530 20 20 20 20 20 20 69 6e 64 69 63 61 74 65 73 20        indicates 
2a540 77 68 69 63 68 20 76 65 72 73 69 6f 6e 20 6f 66  which version of
2a550 20 74 68 65 20 2e 4e 45 54 20 46 72 61 6d 65 77   the .NET Framew
2a560 6f 72 6b 20 69 73 20 62 65 69 6e 67 0d 0a 20 20  ork is being..  
2a570 20 20 20 20 20 20 23 20 20 20 20 20 20 20 75 73        #       us
2a580 65 64 20 62 79 20 74 68 65 20 61 73 73 65 6d 62  ed by the assemb
2a590 6c 79 20 62 69 6e 61 72 69 65 73 20 75 6e 64 65  ly binaries unde
2a5a0 72 20 74 65 73 74 2e 0d 0a 20 20 20 20 20 20 20  r test...       
2a5b0 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   #..        tput
2a5c0 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
2a5d0 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  l \..           
2a5e0 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20   "---- checking 
2a5f0 66 6f 72 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  for System.Data.
2a600 53 51 4c 69 74 65 20 62 75 69 6c 64 20 2e 4e 45  SQLite build .NE
2a610 54 20 46 72 61 6d 65 77 6f 72 6b 2e 2e 2e 20 22  T Framework... "
2a620 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20  ....        set 
2a630 6e 65 74 46 78 20 5b 67 65 74 42 75 69 6c 64 4e  netFx [getBuildN
2a640 65 74 46 78 5d 0d 0a 20 20 20 20 20 20 20 20 61  etFx]..        a
2a650 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70  ddConstraint [ap
2a660 70 65 6e 64 41 72 67 73 20 62 75 69 6c 64 46 72  pendArgs buildFr
2a670 61 6d 65 77 6f 72 6b 2e 20 24 6e 65 74 46 78 5d  amework. $netFx]
2a680 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
2a690 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
2a6a0 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 22 20 24  [appendArgs \" $
2a6b0 6e 65 74 46 78 20 5c 22 5c 6e 5d 0d 0a 0d 0a 20  netFx \"\n].... 
2a6c0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
2a6d0 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20    # NOTE: Check 
2a6e0 74 68 65 20 63 75 72 72 65 6e 74 20 62 75 69 6c  the current buil
2a6f0 64 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e  d configuration.
2a700 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f    This should no
2a710 72 6d 61 6c 6c 79 0d 0a 20 20 20 20 20 20 20 20  rmally..        
2a720 23 20 20 20 20 20 20 20 62 65 20 65 69 74 68 65  #       be eithe
2a730 72 20 22 44 65 62 75 67 22 20 6f 72 20 22 52 65  r "Debug" or "Re
2a740 6c 65 61 73 65 22 2e 0d 0a 20 20 20 20 20 20 20  lease"...       
2a750 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   #..        tput
2a760 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
2a770 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  l \..           
2a780 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20   "---- checking 
2a790 66 6f 72 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  for System.Data.
2a7a0 53 51 4c 69 74 65 20 62 75 69 6c 64 20 63 6f 6e  SQLite build con
2a7b0 66 69 67 75 72 61 74 69 6f 6e 2e 2e 2e 20 22 0d  figuration... ".
2a7c0 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 63  ...        set c
2a7d0 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 5b 67 65  onfiguration [ge
2a7e0 74 42 75 69 6c 64 43 6f 6e 66 69 67 75 72 61 74  tBuildConfigurat
2a7f0 69 6f 6e 5d 0d 0a 20 20 20 20 20 20 20 20 61 64  ion]..        ad
2a800 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70  dConstraint [app
2a810 65 6e 64 41 72 67 73 20 62 75 69 6c 64 43 6f 6e  endArgs buildCon
2a820 66 69 67 75 72 61 74 69 6f 6e 2e 20 24 63 6f 6e  figuration. $con
2a830 66 69 67 75 72 61 74 69 6f 6e 5d 0d 0a 20 20 20  figuration]..   
2a840 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
2a850 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
2a860 6e 64 41 72 67 73 20 5c 22 20 24 63 6f 6e 66 69  ndArgs \" $confi
2a870 67 75 72 61 74 69 6f 6e 20 5c 22 5c 6e 5d 0d 0a  guration \"\n]..
2a880 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
2a890 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 72 79       # NOTE: Try
2a8a0 20 74 6f 20 73 65 74 75 70 20 61 6e 20 69 6e 74   to setup an int
2a8b0 65 72 72 75 70 74 20 63 61 6c 6c 62 61 63 6b 20  errupt callback 
2a8c0 75 73 69 6e 67 20 74 68 65 20 73 63 72 69 70 74  using the script
2a8d0 20 64 65 62 75 67 67 65 72 0d 0a 20 20 20 20 20   debugger..     
2a8e0 20 20 20 23 20 20 20 20 20 20 20 74 68 61 74 20     #       that 
2a8f0 77 69 6c 6c 20 63 61 6e 63 65 6c 20 61 6c 6c 20  will cancel all 
2a900 53 51 4c 20 71 75 65 72 69 65 73 20 69 6e 20 70  SQL queries in p
2a910 72 6f 67 72 65 73 73 20 66 6f 72 20 61 6c 6c 20  rogress for all 
2a920 64 61 74 61 62 61 73 65 0d 0a 20 20 20 20 20 20  database..      
2a930 20 20 23 20 20 20 20 20 20 20 63 6f 6e 6e 65 63    #       connec
2a940 74 69 6f 6e 73 20 6b 6e 6f 77 6e 20 74 6f 20 74  tions known to t
2a950 68 69 73 20 69 6e 74 65 72 70 72 65 74 65 72 2e  his interpreter.
2a960 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
2a970 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
2a980 65 78 69 73 74 73 20 3a 3a 6e 6f 28 73 71 6c 69  exists ::no(sqli
2a990 74 65 49 6e 74 65 72 72 75 70 74 43 61 6c 6c 62  teInterruptCallb
2a9a0 61 63 6b 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  ack)]} then {.. 
2a9b0 20 20 20 20 20 20 20 20 20 73 65 74 75 70 44 62           setupDb
2a9c0 49 6e 74 65 72 72 75 70 74 43 61 6c 6c 62 61 63  InterruptCallbac
2a9d0 6b 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  k $::test_channe
2a9e0 6c 20 24 3a 3a 74 65 73 74 5f 6c 6f 67 0d 0a 20  l $::test_log.. 
2a9f0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
2aa00 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
2aa10 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 66 6f 72   NOTE: Check for
2aa20 20 74 68 65 20 6e 61 74 69 76 65 20 72 75 6e 74   the native runt
2aa30 69 6d 65 20 6f 70 74 69 6f 6e 2c 20 77 68 69 63  ime option, whic
2aa40 68 20 77 6f 75 6c 64 20 6d 65 61 6e 20 77 65 20  h would mean we 
2aa50 61 72 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  are..        #  
2aa60 20 20 20 20 20 75 73 69 6e 67 20 74 68 65 20 6d       using the m
2aa70 69 78 65 64 2d 6d 6f 64 65 20 61 73 73 65 6d 62  ixed-mode assemb
2aa80 6c 79 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ly...        #..
2aa90 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72          checkFor
2aaa0 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 24 3a  RuntimeOption $:
2aab0 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 6e 61  :test_channel na
2aac0 74 69 76 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20  tive....        
2aad0 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
2aae0 45 3a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20  E: Check if the 
2aaf0 74 65 73 74 20 73 75 69 74 65 20 73 68 6f 75 6c  test suite shoul
2ab00 64 20 63 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62  d count the numb
2ab10 65 72 20 6f 66 20 63 6f 6e 6e 65 63 74 69 6f 6e  er of connection
2ab20 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  s..        #    
2ab30 20 20 20 22 6f 70 65 6e 65 64 22 20 61 6e 64 20     "opened" and 
2ab40 22 63 6c 6f 73 65 64 22 20 66 72 6f 6d 20 74 68  "closed" from th
2ab50 65 20 70 6f 6f 6c 20 77 68 65 6e 20 64 65 74 65  e pool when dete
2ab60 72 6d 69 6e 69 6e 67 20 69 66 20 61 20 74 65 73  rmining if a tes
2ab70 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  t..        #    
2ab80 20 20 20 70 61 73 73 65 64 2e 20 20 44 69 73 61     passed.  Disa
2ab90 62 6c 69 6e 67 20 74 68 69 73 20 62 65 68 61 76  bling this behav
2aba0 69 6f 72 20 69 73 20 73 6f 6d 65 74 69 6d 65 73  ior is sometimes
2abb0 20 6e 65 63 65 73 73 61 72 79 20 28 65 2e 67 2e   necessary (e.g.
2abc0 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
2abd0 20 20 64 75 72 69 6e 67 20 74 68 65 20 72 65 6c    during the rel
2abe0 65 61 73 65 20 74 65 73 74 69 6e 67 20 70 72 6f  ease testing pro
2abf0 63 65 73 73 29 20 62 65 63 61 75 73 65 20 74 68  cess) because th
2ac00 65 72 65 20 61 72 65 20 73 65 76 65 72 61 6c 0d  ere are several.
2ac10 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
2ac20 20 74 65 73 74 73 20 74 68 61 74 20 72 65 6c 79   tests that rely
2ac30 20 6f 6e 20 74 68 65 20 22 6f 70 65 6e 65 64 20   on the "opened 
2ac40 66 72 6f 6d 20 70 6f 6f 6c 22 20 63 6f 75 6e 74  from pool" count
2ac50 20 62 65 69 6e 67 20 67 72 65 61 74 65 72 0d 0a   being greater..
2ac60 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
2ac70 74 68 61 6e 20 7a 65 72 6f 2e 20 20 54 68 65 73  than zero.  Thes
2ac80 65 20 74 65 73 74 73 20 6d 61 79 20 66 61 69 6c  e tests may fail
2ac90 20 64 75 65 20 74 6f 20 74 68 65 20 6e 6f 6e 2d   due to the non-
2aca0 64 65 74 65 72 6d 69 6e 69 73 74 69 63 0d 0a 20  deterministic.. 
2acb0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62         #       b
2acc0 65 68 61 76 69 6f 72 20 6f 66 20 74 68 65 20 43  ehavior of the C
2acd0 4c 52 20 47 43 2c 20 65 76 65 6e 20 77 68 65 6e  LR GC, even when
2ace0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 62 75 67   there is no bug
2acf0 20 69 6e 20 74 68 65 20 63 6f 64 65 0d 0a 20 20   in the code..  
2ad00 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62 65        #       be
2ad10 69 6e 67 20 74 65 73 74 65 64 2e 0d 0a 20 20 20  ing tested...   
2ad20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
2ad30 63 68 65 63 6b 46 6f 72 52 75 6e 74 69 6d 65 4f  checkForRuntimeO
2ad40 70 74 69 6f 6e 20 24 3a 3a 74 65 73 74 5f 63 68  ption $::test_ch
2ad50 61 6e 6e 65 6c 20 6e 6f 50 6f 6f 6c 43 6f 75 6e  annel noPoolCoun
2ad60 74 73 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d  ts....        #.
2ad70 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
2ad80 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 74 65   Check if the te
2ad90 73 74 20 73 75 69 74 65 20 73 68 6f 75 6c 64 20  st suite should 
2ada0 75 73 65 20 73 68 61 72 65 64 2d 63 61 63 68 65  use shared-cache
2adb0 20 6d 6f 64 65 2e 0d 0a 20 20 20 20 20 20 20 20   mode...        
2adc0 23 0d 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b  #..        check
2add0 46 6f 72 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e  ForRuntimeOption
2ade0 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
2adf0 20 73 68 61 72 65 64 43 61 63 68 65 0d 0a 0d 0a   sharedCache....
2ae00 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
2ae10 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 70 6f 72     # NOTE: Repor
2ae20 74 20 74 68 65 20 72 65 73 6f 75 72 63 65 20 75  t the resource u
2ae30 73 61 67 65 20 70 72 69 6f 72 20 74 6f 20 72 75  sage prior to ru
2ae40 6e 6e 69 6e 67 20 61 6e 79 20 74 65 73 74 73 2e  nning any tests.
2ae50 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
2ae60 20 20 20 20 20 72 65 70 6f 72 74 53 51 4c 69 74       reportSQLit
2ae70 65 52 65 73 6f 75 72 63 65 73 20 24 3a 3a 74 65  eResources $::te
2ae80 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20  st_channel....  
2ae90 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
2aea0 20 23 20 4e 4f 54 45 3a 20 47 72 61 62 20 74 68   # NOTE: Grab th
2aeb0 65 20 6c 69 73 74 20 6f 66 20 6e 61 74 69 76 65  e list of native
2aec0 20 6d 6f 64 75 6c 65 73 20 66 6f 72 20 74 68 65   modules for the
2aed0 20 63 75 72 72 65 6e 74 20 70 72 6f 63 65 73 73   current process
2aee0 20 61 6e 64 0d 0a 20 20 20 20 20 20 20 20 23 20   and..        # 
2aef0 20 20 20 20 20 20 72 65 70 6f 72 74 20 6f 6e 20        report on 
2af00 74 68 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  the System.Data.
2af10 53 51 4c 69 74 65 20 72 65 6c 61 74 65 64 20 6f  SQLite related o
2af20 6e 65 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  nes...        #.
2af30 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 68 61  .        if {[ha
2af40 76 65 53 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f  veSQLiteObjectCo
2af50 6d 6d 61 6e 64 5d 7d 20 74 68 65 6e 20 7b 0d 0a  mmand]} then {..
2af60 20 20 20 20 20 20 20 20 20 20 73 65 74 20 6d 6f            set mo
2af70 64 75 6c 65 73 20 5b 6f 62 6a 65 63 74 20 69 6e  dules [object in
2af80 76 6f 6b 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  voke \..        
2af90 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 69 61        System.Dia
2afa0 67 6e 6f 73 74 69 63 73 2e 50 72 6f 63 65 73 73  gnostics.Process
2afb0 2e 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  .GetCurrentProce
2afc0 73 73 20 4d 6f 64 75 6c 65 73 5d 0d 0a 0d 0a 20  ss Modules].... 
2afd0 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20           object 
2afe0 66 6f 72 65 61 63 68 20 2d 61 6c 69 61 73 20 6d  foreach -alias m
2aff0 6f 64 75 6c 65 20 24 6d 6f 64 75 6c 65 73 20 7b  odule $modules {
2b000 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d  ..            #.
2b010 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e  .            # N
2b020 4f 54 45 3a 20 54 68 65 20 6d 6f 64 75 6c 65 20  OTE: The module 
2b030 66 69 6c 65 20 6e 61 6d 65 20 68 65 72 65 20 6d  file name here m
2b040 75 73 74 20 62 65 20 6e 6f 72 6d 61 6c 69 7a 65  ust be normalize
2b050 64 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  d...            
2b060 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  #..            s
2b070 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c  et fileName [fil
2b080 65 20 6e 6f 72 6d 61 6c 69 7a 65 20 5b 24 6d 6f  e normalize [$mo
2b090 64 75 6c 65 20 46 69 6c 65 4e 61 6d 65 5d 5d 0d  dule FileName]].
2b0a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74  .            set
2b0b0 20 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 5b 66   fileNameOnly [f
2b0c0 69 6c 65 20 74 61 69 6c 20 24 66 69 6c 65 4e 61  ile tail $fileNa
2b0d0 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  me]....         
2b0e0 20 20 20 69 66 20 7b 5b 6c 73 65 61 72 63 68 20     if {[lsearch 
2b0f0 2d 65 78 61 63 74 20 2d 6e 6f 63 61 73 65 20 2d  -exact -nocase -
2b100 2d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  - \..           
2b110 20 20 20 20 20 5b 67 65 74 4e 61 74 69 76 65 4c       [getNativeL
2b120 69 62 72 61 72 79 46 69 6c 65 4e 61 6d 65 73 4f  ibraryFileNamesO
2b130 6e 6c 79 5d 20 24 66 69 6c 65 4e 61 6d 65 4f 6e  nly] $fileNameOn
2b140 6c 79 5d 20 21 3d 20 2d 31 7d 20 74 68 65 6e 20  ly] != -1} then 
2b150 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
2b160 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
2b170 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
2b180 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
2b190 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 6f          "---- fo
2b1a0 75 6e 64 20 6c 6f 61 64 65 64 20 53 51 4c 69 74  und loaded SQLit
2b1b0 65 20 6e 61 74 69 76 65 20 6c 69 62 72 61 72 79  e native library
2b1c0 20 6d 6f 64 75 6c 65 3a 20 22 20 5c 0d 0a 20 20   module: " \..  
2b1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b1e0 24 66 69 6c 65 4e 61 6d 65 20 5c 6e 5d 0d 0a 20  $fileName \n].. 
2b1f0 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73             } els
2b200 65 69 66 20 7b 5b 6c 73 65 61 72 63 68 20 2d 65  eif {[lsearch -e
2b210 78 61 63 74 20 2d 6e 6f 63 61 73 65 20 2d 2d 20  xact -nocase -- 
2b220 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
2b230 20 20 20 5b 67 65 74 49 6e 74 65 72 6f 70 41 73     [getInteropAs
2b240 73 65 6d 62 6c 79 46 69 6c 65 4e 61 6d 65 73 4f  semblyFileNamesO
2b250 6e 6c 79 5d 20 24 66 69 6c 65 4e 61 6d 65 4f 6e  nly] $fileNameOn
2b260 6c 79 5d 20 21 3d 20 2d 31 7d 20 74 68 65 6e 20  ly] != -1} then 
2b270 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
2b280 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
2b290 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
2b2a0 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
2b2b0 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 6f          "---- fo
2b2c0 75 6e 64 20 6c 6f 61 64 65 64 20 53 51 4c 69 74  und loaded SQLit
2b2d0 65 20 69 6e 74 65 72 6f 70 20 61 73 73 65 6d 62  e interop assemb
2b2e0 6c 79 20 6d 6f 64 75 6c 65 3a 20 22 20 5c 0d 0a  ly module: " \..
2b2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b300 20 20 24 66 69 6c 65 4e 61 6d 65 20 5c 6e 5d 0d    $fileName \n].
2b310 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
2b320 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
2b330 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
2b340 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20    catch {..     
2b350 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
2b360 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20  st_channel \..  
2b370 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
2b380 2d 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f  - compile-time o
2b390 70 74 69 6f 6e 73 20 66 6f 72 20 53 51 4c 69 74  ptions for SQLit
2b3a0 65 20 63 6f 72 65 20 6c 69 62 72 61 72 79 2e 2e  e core library..
2b3b0 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  . "....         
2b3c0 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
2b3d0 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63             objec
2b3e0 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20  t invoke -flags 
2b3f0 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20  +NonPublic \..  
2b400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79                Sy
2b410 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
2b420 2e 53 51 4c 69 74 65 33 20 53 51 4c 69 74 65 43  .SQLite3 SQLiteC
2b430 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 73 0d 0a 20  ompileOptions.. 
2b440 20 20 20 20 20 20 20 20 20 7d 20 63 6f 6d 70 69           } compi
2b450 6c 65 4f 70 74 69 6f 6e 73 5d 20 3d 3d 20 30 7d  leOptions] == 0}
2b460 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
2b470 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
2b480 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
2b490 6e 64 41 72 67 73 20 5b 66 6f 72 6d 61 74 4c 69  ndArgs [formatLi
2b4a0 73 74 20 5b 6c 73 6f 72 74 20 5c 0d 0a 20 20 20  st [lsort \..   
2b4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 24 63 6f               $co
2b4c0 6d 70 69 6c 65 4f 70 74 69 6f 6e 73 5d 20 3c 6e  mpileOptions] <n
2b4d0 6f 6e 65 3e 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20  one>] \n]..     
2b4e0 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
2b4f0 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
2b500 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
2b510 20 75 6e 6b 6e 6f 77 6e 5c 6e 0d 0a 20 20 20 20   unknown\n..    
2b520 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
2b530 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63 61   }....        ca
2b540 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
2b550 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
2b560 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20  hannel \..      
2b570 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6f          "---- co
2b580 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f  mpile-time optio
2b590 6e 73 20 66 6f 72 20 53 51 4c 69 74 65 20 69 6e  ns for SQLite in
2b5a0 74 65 72 6f 70 20 61 73 73 65 6d 62 6c 79 2e 2e  terop assembly..
2b5b0 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  . "....         
2b5c0 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
2b5d0 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63             objec
2b5e0 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20  t invoke -flags 
2b5f0 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20  +NonPublic \..  
2b600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79                Sy
2b610 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
2b620 2e 53 51 4c 69 74 65 33 20 49 6e 74 65 72 6f 70  .SQLite3 Interop
2b630 43 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 73 0d 0a  CompileOptions..
2b640 20 20 20 20 20 20 20 20 20 20 7d 20 63 6f 6d 70            } comp
2b650 69 6c 65 4f 70 74 69 6f 6e 73 5d 20 3d 3d 20 30  ileOptions] == 0
2b660 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
2b670 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
2b680 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
2b690 65 6e 64 41 72 67 73 20 5b 66 6f 72 6d 61 74 4c  endArgs [formatL
2b6a0 69 73 74 20 5b 6c 73 6f 72 74 20 5c 0d 0a 20 20  ist [lsort \..  
2b6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24 63                $c
2b6c0 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 73 5d 20 3c  ompileOptions] <
2b6d0 6e 6f 6e 65 3e 5d 20 5c 6e 5d 0d 0a 20 20 20 20  none>] \n]..    
2b6e0 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
2b6f0 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
2b700 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
2b710 6c 20 75 6e 6b 6e 6f 77 6e 5c 6e 0d 0a 20 20 20  l unknown\n..   
2b720 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
2b730 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23    }....        #
2b740 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
2b750 3a 20 53 68 6f 77 20 74 68 65 20 61 63 74 69 76  : Show the activ
2b760 65 20 74 65 73 74 20 63 6f 6e 73 74 72 61 69 6e  e test constrain
2b770 74 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ts...        #..
2b780 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
2b790 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
2b7a0 70 70 65 6e 64 41 72 67 73 20 22 2d 2d 2d 2d 20  ppendArgs "---- 
2b7b0 63 6f 6e 73 74 72 61 69 6e 74 73 3a 20 22 20 5c  constraints: " \
2b7c0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 66  ..            [f
2b7d0 6f 72 6d 61 74 4c 69 73 74 20 5b 6c 73 6f 72 74  ormatList [lsort
2b7e0 20 5b 67 65 74 43 6f 6e 73 74 72 61 69 6e 74 73   [getConstraints
2b7f0 5d 5d 20 3c 6e 6f 6e 65 3e 5d 20 5c 6e 5d 0d 0a  ]] <none>] \n]..
2b800 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
2b810 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 61 76       # NOTE: Sav
2b820 65 20 74 68 65 20 74 65 73 74 20 63 6f 6e 73 74  e the test const
2b830 72 61 69 6e 74 73 20 66 6f 72 20 75 73 65 20 62  raints for use b
2b840 79 20 74 68 72 65 61 64 73 20 63 72 65 61 74 65  y threads create
2b850 64 20 69 6e 20 74 68 69 73 0d 0a 20 20 20 20 20  d in this..     
2b860 20 20 20 23 20 20 20 20 20 20 20 61 70 70 6c 69     #       appli
2b870 63 61 74 69 6f 6e 20 64 6f 6d 61 69 6e 2e 20 20  cation domain.  
2b880 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72  This is necessar
2b890 79 20 62 65 63 61 75 73 65 20 61 6c 6c 20 74 68  y because all th
2b8a0 65 20 45 61 67 6c 65 0d 0a 20 20 20 20 20 20 20  e Eagle..       
2b8b0 20 23 20 20 20 20 20 20 20 22 74 65 73 74 20 63   #       "test c
2b8c0 6f 6e 74 65 78 74 22 20 69 6e 66 6f 72 6d 61 74  ontext" informat
2b8d0 69 6f 6e 20 69 73 20 70 65 72 2d 74 68 72 65 61  ion is per-threa
2b8e0 64 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  d...        #.. 
2b8f0 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
2b900 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 73 74 5f  o exists ::test_
2b910 63 6f 6e 73 74 72 61 69 6e 74 73 5d 7d 20 74 68  constraints]} th
2b920 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
2b930 73 65 74 20 3a 3a 74 65 73 74 5f 63 6f 6e 73 74  set ::test_const
2b940 72 61 69 6e 74 73 20 24 3a 3a 65 61 67 6c 65 5f  raints $::eagle_
2b950 74 65 73 74 73 28 43 6f 6e 73 74 72 61 69 6e 74  tests(Constraint
2b960 73 29 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  s)..        }...
2b970 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
2b980 20 20 20 20 23 20 4e 4f 54 45 3a 20 4c 6f 61 64      # NOTE: Load
2b990 20 74 68 65 20 22 61 66 74 65 72 2d 63 6f 6e 73   the "after-cons
2b9a0 74 72 61 69 6e 74 73 22 20 63 75 73 74 6f 6d 20  traints" custom 
2b9b0 70 65 72 2d 75 73 65 72 20 61 6e 64 2f 6f 72 20  per-user and/or 
2b9c0 70 65 72 2d 68 6f 73 74 0d 0a 20 20 20 20 20 20  per-host..      
2b9d0 20 20 23 20 20 20 20 20 20 20 74 65 73 74 20 73    #       test s
2b9e0 65 74 74 69 6e 67 73 20 6e 6f 77 2e 0d 0a 20 20  ettings now...  
2b9f0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
2ba00 20 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74   uplevel 1 [list
2ba10 20 6c 6f 61 64 53 51 4c 69 74 65 54 65 73 74 53   loadSQLiteTestS
2ba20 65 74 74 69 6e 67 73 20 24 3a 3a 74 65 73 74 5f  ettings $::test_
2ba30 63 68 61 6e 6e 65 6c 20 2e 61 66 74 65 72 5d 0d  channel .after].
2ba40 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
2ba50 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66        # NOTE: If
2ba60 20 6e 65 63 65 73 73 61 72 79 2c 20 65 6e 61 62   necessary, enab
2ba70 6c 65 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  le shared-cache 
2ba80 6d 6f 64 65 20 6e 6f 77 2e 0d 0a 20 20 20 20 20  mode now...     
2ba90 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66     #..        if
2baa0 20 7b 5b 68 61 73 52 75 6e 74 69 6d 65 4f 70 74   {[hasRuntimeOpt
2bab0 69 6f 6e 20 73 68 61 72 65 64 43 61 63 68 65 5d  ion sharedCache]
2bac0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
2bad0 20 20 20 20 65 6e 61 62 6c 65 53 68 61 72 65 64      enableShared
2bae0 43 61 63 68 65 20 24 3a 3a 74 65 73 74 5f 63 68  Cache $::test_ch
2baf0 61 6e 6e 65 6c 20 74 72 75 65 0d 0a 20 20 20 20  annel true..    
2bb00 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
2bb10 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
2bb20 54 45 3a 20 53 68 6f 77 20 77 68 65 6e 20 6f 75  TE: Show when ou
2bb30 72 20 74 65 73 74 73 20 61 63 74 75 61 6c 6c 79  r tests actually
2bb40 20 62 65 67 61 6e 20 28 6e 6f 77 29 2e 0d 0a 20   began (now)... 
2bb50 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
2bb60 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
2bb70 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
2bb80 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
2bb90 20 20 20 22 2d 2d 2d 2d 20 53 79 73 74 65 6d 2e     "---- System.
2bba0 44 61 74 61 2e 53 51 4c 69 74 65 20 74 65 73 74  Data.SQLite test
2bbb0 73 20 62 65 67 61 6e 20 61 74 20 22 20 5c 0d 0a  s began at " \..
2bbc0 20 20 20 20 20 20 20 20 20 20 20 20 5b 63 6c 6f              [clo
2bbd0 63 6b 20 66 6f 72 6d 61 74 20 5b 63 6c 6f 63 6b  ck format [clock
2bbe0 20 73 65 63 6f 6e 64 73 5d 5d 20 5c 6e 5d 0d 0a   seconds]] \n]..
2bbf0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
2bc00 0c 0d 0a 20 20 20 20 70 72 6f 63 20 72 75 6e 53  ...    proc runS
2bc10 51 4c 69 74 65 54 65 73 74 46 69 6c 65 73 50 72  QLiteTestFilesPr
2bc20 6f 6c 6f 67 75 65 20 7b 7d 20 7b 0d 0a 20 20 20  ologue {} {..   
2bc30 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
2bc40 54 45 3a 20 53 6b 69 70 20 72 75 6e 6e 69 6e 67  TE: Skip running
2bc50 20 6f 75 72 20 63 75 73 74 6f 6d 20 66 69 6c 65   our custom file
2bc60 73 20 70 72 6f 6c 6f 67 75 65 20 69 66 20 74 68  s prologue if th
2bc70 65 20 6d 61 69 6e 20 6f 6e 65 20 68 61 73 20 62  e main one has b
2bc80 65 65 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20  een..      #    
2bc90 20 20 20 73 6b 69 70 70 65 64 2e 0d 0a 20 20 20     skipped...   
2bca0 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
2bcb0 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
2bcc0 6e 6f 28 70 72 6f 6c 6f 67 75 65 2e 65 61 67 6c  no(prologue.eagl
2bcd0 65 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  e)]} then {..   
2bce0 20 20 20 20 20 75 70 6c 65 76 65 6c 20 31 20 7b       uplevel 1 {
2bcf0 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
2bd00 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
2bd10 20 53 65 74 75 70 20 74 68 65 20 76 61 72 69 61   Setup the varia
2bd20 62 6c 65 73 20 74 68 61 74 20 72 65 66 65 72 20  bles that refer 
2bd30 74 6f 20 74 68 65 20 76 61 72 69 6f 75 73 20 6e  to the various n
2bd40 6f 6e 2d 64 61 74 61 20 66 69 6c 65 73 0d 0a 20  on-data files.. 
2bd50 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
2bd60 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68 65   required by the
2bd70 20 74 65 73 74 73 20 69 6e 20 74 68 69 73 20 66   tests in this f
2bd80 69 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ile...          
2bd90 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  #..          set
2bda0 20 65 6e 74 69 74 79 46 72 61 6d 65 77 6f 72 6b   entityFramework
2bdb0 44 6c 6c 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20  DllFile \..     
2bdc0 20 20 20 20 20 20 20 20 20 5b 67 65 74 42 75 69           [getBui
2bdd0 6c 64 46 69 6c 65 4e 61 6d 65 20 45 6e 74 69 74  ldFileName Entit
2bde0 79 46 72 61 6d 65 77 6f 72 6b 2e 64 6c 6c 20 66  yFramework.dll f
2bdf0 61 6c 73 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  alse]....       
2be00 20 20 20 73 65 74 20 69 6e 73 74 61 6c 6c 65 72     set installer
2be10 45 78 65 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20  ExeFile \..     
2be20 20 20 20 20 20 20 20 20 20 5b 67 65 74 42 75 69           [getBui
2be30 6c 64 46 69 6c 65 4e 61 6d 65 20 49 6e 73 74 61  ldFileName Insta
2be40 6c 6c 65 72 2e 65 78 65 20 66 61 6c 73 65 5d 0d  ller.exe false].
2be50 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  ...          set
2be60 20 73 71 6c 69 74 65 44 65 73 69 67 6e 65 72 44   sqliteDesignerD
2be70 6c 6c 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20  llFile \..      
2be80 20 20 20 20 20 20 20 20 5b 67 65 74 42 75 69 6c          [getBuil
2be90 64 46 69 6c 65 4e 61 6d 65 20 53 51 4c 69 74 65  dFileName SQLite
2bea0 2e 44 65 73 69 67 6e 65 72 2e 64 6c 6c 20 66 61  .Designer.dll fa
2beb0 6c 73 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  lse]....        
2bec0 20 20 73 65 74 20 73 79 73 74 65 6d 44 61 74 61    set systemData
2bed0 53 51 4c 69 74 65 44 6c 6c 46 69 6c 65 20 5c 0d  SQLiteDllFile \.
2bee0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b  .              [
2bef0 67 65 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65  getBuildFileName
2bf00 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
2bf10 69 74 65 2e 64 6c 6c 20 66 61 6c 73 65 5d 0d 0a  ite.dll false]..
2bf20 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
2bf30 73 79 73 74 65 6d 44 61 74 61 53 51 4c 69 74 65  systemDataSQLite
2bf40 4c 69 6e 71 44 6c 6c 46 69 6c 65 20 5c 0d 0a 20  LinqDllFile \.. 
2bf50 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65               [ge
2bf60 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20 53  tBuildFileName S
2bf70 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
2bf80 65 2e 4c 69 6e 71 2e 64 6c 6c 20 66 61 6c 73 65  e.Linq.dll false
2bf90 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 73  ]....          s
2bfa0 65 74 20 73 79 73 74 65 6d 44 61 74 61 53 51 4c  et systemDataSQL
2bfb0 69 74 65 45 66 36 44 6c 6c 46 69 6c 65 20 5c 0d  iteEf6DllFile \.
2bfc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b  .              [
2bfd0 67 65 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65  getBuildFileName
2bfe0 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
2bff0 69 74 65 2e 45 46 36 2e 64 6c 6c 20 66 61 6c 73  ite.EF6.dll fals
2c000 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  e]....          
2c010 73 65 74 20 74 65 73 74 45 78 65 46 69 6c 65 20  set testExeFile 
2c020 5b 67 65 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d  [getBuildFileNam
2c030 65 20 74 65 73 74 2e 65 78 65 20 66 61 6c 73 65  e test.exe false
2c040 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  ]..          set
2c050 20 74 65 73 74 4c 69 6e 71 45 78 65 46 69 6c 65   testLinqExeFile
2c060 20 5b 67 65 74 42 75 69 6c 64 46 69 6c 65 4e 61   [getBuildFileNa
2c070 6d 65 20 74 65 73 74 6c 69 6e 71 2e 65 78 65 20  me testlinq.exe 
2c080 66 61 6c 73 65 5d 0d 0a 20 20 20 20 20 20 20 20  false]..        
2c090 20 20 73 65 74 20 74 65 73 74 45 66 36 45 78 65    set testEf6Exe
2c0a0 46 69 6c 65 20 5b 67 65 74 42 75 69 6c 64 46 69  File [getBuildFi
2c0b0 6c 65 4e 61 6d 65 20 74 65 73 74 65 66 36 2e 65  leName testef6.e
2c0c0 78 65 20 66 61 6c 73 65 5d 0d 0a 0d 0a 20 20 20  xe false]....   
2c0d0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
2c0e0 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 65 74 75      # NOTE: Setu
2c0f0 70 20 74 68 65 20 76 61 72 69 61 62 6c 65 73 20  p the variables 
2c100 74 68 61 74 20 72 65 66 65 72 20 74 6f 20 74 68  that refer to th
2c110 65 20 76 61 72 69 6f 75 73 20 64 61 74 61 20 66  e various data f
2c120 69 6c 65 73 0d 0a 20 20 20 20 20 20 20 20 20 20  iles..          
2c130 23 20 20 20 20 20 20 20 72 65 71 75 69 72 65 64  #       required
2c140 20 62 79 20 74 68 65 20 74 65 73 74 73 20 69 6e   by the tests in
2c150 20 74 68 69 73 20 66 69 6c 65 2e 0d 0a 20 20 20   this file...   
2c160 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
2c170 20 20 20 20 73 65 74 20 74 65 73 74 4c 69 6e 71      set testLinq
2c180 4f 75 74 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61  OutFile [file na
2c190 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a  tivename [file j
2c1a0 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  oin \..         
2c1b0 20 20 20 20 20 5b 67 65 74 53 51 4c 69 74 65 54       [getSQLiteT
2c1c0 65 73 74 44 61 74 61 50 61 74 68 5d 20 74 65 73  estDataPath] tes
2c1d0 74 6c 69 6e 71 2e 6f 75 74 5d 5d 0d 0a 0d 0a 20  tlinq.out]].... 
2c1e0 20 20 20 20 20 20 20 20 20 73 65 74 20 6e 6f 72           set nor
2c1f0 74 68 77 69 6e 64 45 66 44 62 46 69 6c 65 20 5b  thwindEfDbFile [
2c200 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20  file nativename 
2c210 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20  [file join \..  
2c220 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c              [fil
2c230 65 20 64 69 72 6e 61 6d 65 20 5b 66 69 6c 65 20  e dirname [file 
2c240 64 69 72 6e 61 6d 65 20 5b 67 65 74 53 51 4c 69  dirname [getSQLi
2c250 74 65 54 65 73 74 44 61 74 61 50 61 74 68 5d 5d  teTestDataPath]]
2c260 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ] \..           
2c270 20 20 20 74 65 73 74 6c 69 6e 71 20 6e 6f 72 74     testlinq nort
2c280 68 77 69 6e 64 45 46 2e 64 62 5d 5d 0d 0a 0d 0a  hwindEF.db]]....
2c290 20 20 20 20 20 20 20 20 20 20 73 65 74 20 6e 6f            set no
2c2a0 6e 57 61 6c 44 62 46 69 6c 65 20 5b 66 69 6c 65  nWalDbFile [file
2c2b0 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c   nativename [fil
2c2c0 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20  e join \..      
2c2d0 20 20 20 20 20 20 20 20 5b 67 65 74 53 51 4c 69          [getSQLi
2c2e0 74 65 54 65 73 74 44 61 74 61 50 61 74 68 5d 20  teTestDataPath] 
2c2f0 6e 6f 6e 57 61 6c 2e 64 62 5d 5d 0d 0a 0d 0a 20  nonWal.db]].... 
2c300 20 20 20 20 20 20 20 20 20 73 65 74 20 77 61 6c           set wal
2c310 44 62 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74  DbFile [file nat
2c320 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f  ivename [file jo
2c330 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  in \..          
2c340 20 20 20 20 5b 67 65 74 53 51 4c 69 74 65 54 65      [getSQLiteTe
2c350 73 74 44 61 74 61 50 61 74 68 5d 20 77 61 6c 2e  stDataPath] wal.
2c360 64 62 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  db]]....        
2c370 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23    #..          #
2c380 20 4e 4f 54 45 3a 20 54 68 65 20 76 61 72 69 6f   NOTE: The vario
2c390 75 73 20 69 6e 73 74 61 6c 6c 2f 75 6e 69 6e 73  us install/unins
2c3a0 74 61 6c 6c 20 6c 6f 67 20 66 69 6c 65 73 20 75  tall log files u
2c3b0 73 65 64 20 74 6f 20 74 65 73 74 20 74 68 65 0d  sed to test the.
2c3c0 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20  .          #    
2c3d0 20 20 20 64 65 73 69 67 6e 2d 74 69 6d 65 20 63     design-time c
2c3e0 6f 6d 70 6f 6e 65 6e 74 20 69 6e 73 74 61 6c 6c  omponent install
2c3f0 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  er...          #
2c400 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
2c410 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 30  testInstallVs200
2c420 35 4c 6f 67 46 69 6c 65 20 5b 66 69 6c 65 20 6e  5LogFile [file n
2c430 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20  ativename [file 
2c440 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20  join \..        
2c450 20 20 20 20 20 20 5b 67 65 74 53 51 4c 69 74 65        [getSQLite
2c460 54 65 73 74 44 61 74 61 50 61 74 68 5d 20 49 6e  TestDataPath] In
2c470 73 74 61 6c 6c 65 72 5f 54 65 73 74 5f 56 73 32  staller_Test_Vs2
2c480 30 30 35 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20  005.log]]....   
2c490 20 20 20 20 20 20 20 73 65 74 20 74 65 73 74 49         set testI
2c4a0 6e 73 74 61 6c 6c 56 73 32 30 30 38 4c 6f 67 46  nstallVs2008LogF
2c4b0 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65  ile [file native
2c4c0 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20  name [file join 
2c4d0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
2c4e0 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73 74 44   [getSQLiteTestD
2c4f0 61 74 61 50 61 74 68 5d 20 49 6e 73 74 61 6c 6c  ataPath] Install
2c500 65 72 5f 54 65 73 74 5f 56 73 32 30 30 38 2e 6c  er_Test_Vs2008.l
2c510 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  og]]....        
2c520 20 20 73 65 74 20 74 65 73 74 49 6e 73 74 61 6c    set testInstal
2c530 6c 56 73 32 30 31 30 4c 6f 67 46 69 6c 65 20 5b  lVs2010LogFile [
2c540 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20  file nativename 
2c550 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20  [file join \..  
2c560 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74              [get
2c570 53 51 4c 69 74 65 54 65 73 74 44 61 74 61 50 61  SQLiteTestDataPa
2c580 74 68 5d 20 49 6e 73 74 61 6c 6c 65 72 5f 54 65  th] Installer_Te
2c590 73 74 5f 56 73 32 30 31 30 2e 6c 6f 67 5d 5d 0d  st_Vs2010.log]].
2c5a0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  ...          set
2c5b0 20 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30   testInstallVs20
2c5c0 31 32 4c 6f 67 46 69 6c 65 20 5b 66 69 6c 65 20  12LogFile [file 
2c5d0 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65  nativename [file
2c5e0 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20   join \..       
2c5f0 20 20 20 20 20 20 20 5b 67 65 74 53 51 4c 69 74         [getSQLit
2c600 65 54 65 73 74 44 61 74 61 50 61 74 68 5d 20 49  eTestDataPath] I
2c610 6e 73 74 61 6c 6c 65 72 5f 54 65 73 74 5f 56 73  nstaller_Test_Vs
2c620 32 30 31 32 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20  2012.log]]....  
2c630 20 20 20 20 20 20 20 20 73 65 74 20 74 65 73 74          set test
2c640 49 6e 73 74 61 6c 6c 56 73 32 30 31 33 4c 6f 67  InstallVs2013Log
2c650 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69 76  File [file nativ
2c660 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e  ename [file join
2c670 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
2c680 20 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73 74    [getSQLiteTest
2c690 44 61 74 61 50 61 74 68 5d 20 49 6e 73 74 61 6c  DataPath] Instal
2c6a0 6c 65 72 5f 54 65 73 74 5f 56 73 32 30 31 33 2e  ler_Test_Vs2013.
2c6b0 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  log]]....       
2c6c0 20 20 20 73 65 74 20 74 65 73 74 49 6e 73 74 61     set testInsta
2c6d0 6c 6c 56 73 32 30 31 35 4c 6f 67 46 69 6c 65 20  llVs2015LogFile 
2c6e0 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65  [file nativename
2c6f0 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20   [file join \.. 
2c700 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65               [ge
2c710 74 53 51 4c 69 74 65 54 65 73 74 44 61 74 61 50  tSQLiteTestDataP
2c720 61 74 68 5d 20 49 6e 73 74 61 6c 6c 65 72 5f 54  ath] Installer_T
2c730 65 73 74 5f 56 73 32 30 31 35 2e 6c 6f 67 5d 5d  est_Vs2015.log]]
2c740 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65  ....          se
2c750 74 20 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32  t testInstallVs2
2c760 30 31 37 4c 6f 67 46 69 6c 65 20 5b 66 69 6c 65  017LogFile [file
2c770 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c   nativename [fil
2c780 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20  e join \..      
2c790 20 20 20 20 20 20 20 20 5b 67 65 74 53 51 4c 69          [getSQLi
2c7a0 74 65 54 65 73 74 44 61 74 61 50 61 74 68 5d 20  teTestDataPath] 
2c7b0 49 6e 73 74 61 6c 6c 65 72 5f 54 65 73 74 5f 56  Installer_Test_V
2c7c0 73 32 30 31 37 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20  s2017.log]].... 
2c7d0 20 20 20 20 20 20 20 20 20 73 65 74 20 74 65 73           set tes
2c7e0 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 30 35  tUninstallVs2005
2c7f0 4c 6f 67 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61  LogFile [file na
2c800 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a  tivename [file j
2c810 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  oin \..         
2c820 20 20 20 20 20 5b 67 65 74 53 51 4c 69 74 65 54       [getSQLiteT
2c830 65 73 74 44 61 74 61 50 61 74 68 5d 20 55 6e 69  estDataPath] Uni
2c840 6e 73 74 61 6c 6c 65 72 5f 54 65 73 74 5f 56 73  nstaller_Test_Vs
2c850 32 30 30 35 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20  2005.log]]....  
2c860 20 20 20 20 20 20 20 20 73 65 74 20 74 65 73 74          set test
2c870 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 30 38 4c  UninstallVs2008L
2c880 6f 67 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74  ogFile [file nat
2c890 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f  ivename [file jo
2c8a0 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  in \..          
2c8b0 20 20 20 20 5b 67 65 74 53 51 4c 69 74 65 54 65      [getSQLiteTe
2c8c0 73 74 44 61 74 61 50 61 74 68 5d 20 55 6e 69 6e  stDataPath] Unin
2c8d0 73 74 61 6c 6c 65 72 5f 54 65 73 74 5f 56 73 32  staller_Test_Vs2
2c8e0 30 30 38 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20  008.log]]....   
2c8f0 20 20 20 20 20 20 20 73 65 74 20 74 65 73 74 55         set testU
2c900 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31 30 4c 6f  ninstallVs2010Lo
2c910 67 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69  gFile [file nati
2c920 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69  vename [file joi
2c930 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n \..           
2c940 20 20 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73     [getSQLiteTes
2c950 74 44 61 74 61 50 61 74 68 5d 20 55 6e 69 6e 73  tDataPath] Unins
2c960 74 61 6c 6c 65 72 5f 54 65 73 74 5f 56 73 32 30  taller_Test_Vs20
2c970 31 30 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20  10.log]]....    
2c980 20 20 20 20 20 20 73 65 74 20 74 65 73 74 55 6e        set testUn
2c990 69 6e 73 74 61 6c 6c 56 73 32 30 31 32 4c 6f 67  installVs2012Log
2c9a0 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69 76  File [file nativ
2c9b0 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e  ename [file join
2c9c0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
2c9d0 20 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73 74    [getSQLiteTest
2c9e0 44 61 74 61 50 61 74 68 5d 20 55 6e 69 6e 73 74  DataPath] Uninst
2c9f0 61 6c 6c 65 72 5f 54 65 73 74 5f 56 73 32 30 31  aller_Test_Vs201
2ca00 32 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20  2.log]]....     
2ca10 20 20 20 20 20 73 65 74 20 74 65 73 74 55 6e 69       set testUni
2ca20 6e 73 74 61 6c 6c 56 73 32 30 31 33 4c 6f 67 46  nstallVs2013LogF
2ca30 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65  ile [file native
2ca40 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20  name [file join 
2ca50 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
2ca60 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73 74 44   [getSQLiteTestD
2ca70 61 74 61 50 61 74 68 5d 20 55 6e 69 6e 73 74 61  ataPath] Uninsta
2ca80 6c 6c 65 72 5f 54 65 73 74 5f 56 73 32 30 31 33  ller_Test_Vs2013
2ca90 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20  .log]]....      
2caa0 20 20 20 20 73 65 74 20 74 65 73 74 55 6e 69 6e      set testUnin
2cab0 73 74 61 6c 6c 56 73 32 30 31 35 4c 6f 67 46 69  stallVs2015LogFi
2cac0 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e  le [file nativen
2cad0 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c  ame [file join \
2cae0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2caf0 5b 67 65 74 53 51 4c 69 74 65 54 65 73 74 44 61  [getSQLiteTestDa
2cb00 74 61 50 61 74 68 5d 20 55 6e 69 6e 73 74 61 6c  taPath] Uninstal
2cb10 6c 65 72 5f 54 65 73 74 5f 56 73 32 30 31 35 2e  ler_Test_Vs2015.
2cb20 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  log]]....       
2cb30 20 20 20 73 65 74 20 74 65 73 74 55 6e 69 6e 73     set testUnins
2cb40 74 61 6c 6c 56 73 32 30 31 37 4c 6f 67 46 69 6c  tallVs2017LogFil
2cb50 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61  e [file nativena
2cb60 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d  me [file join \.
2cb70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b  .              [
2cb80 67 65 74 53 51 4c 69 74 65 54 65 73 74 44 61 74  getSQLiteTestDat
2cb90 61 50 61 74 68 5d 20 55 6e 69 6e 73 74 61 6c 6c  aPath] Uninstall
2cba0 65 72 5f 54 65 73 74 5f 56 73 32 30 31 37 2e 6c  er_Test_Vs2017.l
2cbb0 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  og]]....        
2cbc0 20 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23    ##############
2cbd0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2cbe0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2cbf0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2cc00 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20 20 20 20  #######....     
2cc10 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
2cc20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 68 65 63  exists ::no(chec
2cc30 6b 46 6f 72 53 71 6c 69 74 65 46 69 6c 65 73 29  kForSqliteFiles)
2cc40 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
2cc50 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76         if {![hav
2cc60 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70  eConstraint [app
2cc70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d  endArgs file_ \.
2cc80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2cc90 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 65 6e 74   [file tail $ent
2cca0 69 74 79 46 72 61 6d 65 77 6f 72 6b 44 6c 6c 46  ityFrameworkDllF
2ccb0 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a  ile]]]} then {..
2ccc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 68                ch
2ccd0 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74  eckForFile $test
2cce0 5f 63 68 61 6e 6e 65 6c 20 24 65 6e 74 69 74 79  _channel $entity
2ccf0 46 72 61 6d 65 77 6f 72 6b 44 6c 6c 46 69 6c 65  FrameworkDllFile
2cd00 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
2cd10 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ...            i
2cd20 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61  f {![haveConstra
2cd30 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20  int [appendArgs 
2cd40 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20  file_ \..       
2cd50 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74           [file t
2cd60 61 69 6c 20 24 69 6e 73 74 61 6c 6c 65 72 45 78  ail $installerEx
2cd70 65 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b  eFile]]]} then {
2cd80 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2cd90 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65  checkForFile $te
2cda0 73 74 5f 63 68 61 6e 6e 65 6c 20 24 69 6e 73 74  st_channel $inst
2cdb0 61 6c 6c 65 72 45 78 65 46 69 6c 65 20 49 6e 73  allerExeFile Ins
2cdc0 74 61 6c 6c 65 72 2e 65 78 65 0d 0a 20 20 20 20  taller.exe..    
2cdd0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
2cde0 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68           if {![h
2cdf0 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61  aveConstraint [a
2ce00 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20  ppendArgs file_ 
2ce10 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
2ce20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 73     [file tail $s
2ce30 71 6c 69 74 65 44 65 73 69 67 6e 65 72 44 6c 6c  qliteDesignerDll
2ce40 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d  File]]]} then {.
2ce50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  .              c
2ce60 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73  heckForFile $tes
2ce70 74 5f 63 68 61 6e 6e 65 6c 20 24 73 71 6c 69 74  t_channel $sqlit
2ce80 65 44 65 73 69 67 6e 65 72 44 6c 6c 46 69 6c 65  eDesignerDllFile
2ce90 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
2cea0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ...            i
2ceb0 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61  f {![haveConstra
2cec0 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20  int [appendArgs 
2ced0 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20  file_ \..       
2cee0 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74           [file t
2cef0 61 69 6c 20 24 73 79 73 74 65 6d 44 61 74 61 53  ail $systemDataS
2cf00 51 4c 69 74 65 44 6c 6c 46 69 6c 65 5d 5d 5d 7d  QLiteDllFile]]]}
2cf10 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
2cf20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46         checkForF
2cf30 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65  ile $test_channe
2cf40 6c 20 24 73 79 73 74 65 6d 44 61 74 61 53 51 4c  l $systemDataSQL
2cf50 69 74 65 44 6c 6c 46 69 6c 65 0d 0a 20 20 20 20  iteDllFile..    
2cf60 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
2cf70 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68           if {![h
2cf80 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61  aveConstraint [a
2cf90 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20  ppendArgs file_ 
2cfa0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
2cfb0 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 73     [file tail $s
2cfc0 79 73 74 65 6d 44 61 74 61 53 51 4c 69 74 65 4c  ystemDataSQLiteL
2cfd0 69 6e 71 44 6c 6c 46 69 6c 65 5d 5d 5d 7d 20 74  inqDllFile]]]} t
2cfe0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
2cff0 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c       checkForFil
2d000 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  e $test_channel 
2d010 24 73 79 73 74 65 6d 44 61 74 61 53 51 4c 69 74  $systemDataSQLit
2d020 65 4c 69 6e 71 44 6c 6c 46 69 6c 65 0d 0a 20 20  eLinqDllFile..  
2d030 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
2d040 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
2d050 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20  [haveConstraint 
2d060 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65  [appendArgs file
2d070 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  _ \..           
2d080 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20       [file tail 
2d090 24 73 79 73 74 65 6d 44 61 74 61 53 51 4c 69 74  $systemDataSQLit
2d0a0 65 45 66 36 44 6c 6c 46 69 6c 65 5d 5d 5d 7d 20  eEf6DllFile]]]} 
2d0b0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
2d0c0 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69        checkForFi
2d0d0 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c  le $test_channel
2d0e0 20 24 73 79 73 74 65 6d 44 61 74 61 53 51 4c 69   $systemDataSQLi
2d0f0 74 65 45 66 36 44 6c 6c 46 69 6c 65 0d 0a 20 20  teEf6DllFile..  
2d100 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
2d110 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
2d120 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20  [haveConstraint 
2d130 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65  [appendArgs file
2d140 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  _ \..           
2d150 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20       [file tail 
2d160 24 74 65 73 74 45 78 65 46 69 6c 65 5d 5d 5d 7d  $testExeFile]]]}
2d170 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
2d180 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46         checkForF
2d190 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65  ile $test_channe
2d1a0 6c 20 24 74 65 73 74 45 78 65 46 69 6c 65 20 74  l $testExeFile t
2d1b0 65 73 74 2e 65 78 65 0d 0a 20 20 20 20 20 20 20  est.exe..       
2d1c0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
2d1d0 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65        if {![have
2d1e0 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65  Constraint [appe
2d1f0 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a  ndArgs file_ \..
2d200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d210 5b 66 69 6c 65 20 74 61 69 6c 20 24 74 65 73 74  [file tail $test
2d220 4c 69 6e 71 45 78 65 46 69 6c 65 5d 5d 5d 7d 20  LinqExeFile]]]} 
2d230 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
2d240 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69        checkForFi
2d250 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c  le $test_channel
2d260 20 24 74 65 73 74 4c 69 6e 71 45 78 65 46 69 6c   $testLinqExeFil
2d270 65 20 74 65 73 74 6c 69 6e 71 2e 65 78 65 0d 0a  e testlinq.exe..
2d280 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
2d290 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
2d2a0 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e  {![haveConstrain
2d2b0 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69  t [appendArgs fi
2d2c0 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  le_ \..         
2d2d0 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69         [file tai
2d2e0 6c 20 24 74 65 73 74 45 66 36 45 78 65 46 69 6c  l $testEf6ExeFil
2d2f0 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  e]]]} then {..  
2d300 20 20 20 20 20 20 20 20 20 20 20 20 63 68 65 63              chec
2d310 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63  kForFile $test_c
2d320 68 61 6e 6e 65 6c 20 24 74 65 73 74 45 66 36 45  hannel $testEf6E
2d330 78 65 46 69 6c 65 20 74 65 73 74 65 66 36 2e 65  xeFile testef6.e
2d340 78 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  xe..            
2d350 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
2d360 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74   if {![haveConst
2d370 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67  raint [appendArg
2d380 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20  s file_ \..     
2d390 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65             [file
2d3a0 20 74 61 69 6c 20 24 74 65 73 74 4c 69 6e 71 4f   tail $testLinqO
2d3b0 75 74 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20  utFile]]]} then 
2d3c0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
2d3d0 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74   checkForFile $t
2d3e0 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73  est_channel $tes
2d3f0 74 4c 69 6e 71 4f 75 74 46 69 6c 65 0d 0a 20 20  tLinqOutFile..  
2d400 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
2d410 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
2d420 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20  [haveConstraint 
2d430 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65  [appendArgs file
2d440 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  _ \..           
2d450 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20       [file tail 
2d460 24 6e 6f 72 74 68 77 69 6e 64 45 66 44 62 46 69  $northwindEfDbFi
2d470 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  le]]]} then {.. 
2d480 20 20 20 20 20 20 20 20 20 20 20 20 20 63 68 65               che
2d490 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f  ckForFile $test_
2d4a0 63 68 61 6e 6e 65 6c 20 24 6e 6f 72 74 68 77 69  channel $northwi
2d4b0 6e 64 45 66 44 62 46 69 6c 65 0d 0a 20 20 20 20  ndEfDbFile..    
2d4c0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
2d4d0 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68           if {![h
2d4e0 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61  aveConstraint [a
2d4f0 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20  ppendArgs file_ 
2d500 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
2d510 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 6e     [file tail $n
2d520 6f 6e 57 61 6c 44 62 46 69 6c 65 5d 5d 5d 7d 20  onWalDbFile]]]} 
2d530 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
2d540 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69        checkForFi
2d550 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c  le $test_channel
2d560 20 24 6e 6f 6e 57 61 6c 44 62 46 69 6c 65 0d 0a   $nonWalDbFile..
2d570 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
2d580 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
2d590 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e  {![haveConstrain
2d5a0 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69  t [appendArgs fi
2d5b0 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  le_ \..         
2d5c0 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69         [file tai
2d5d0 6c 20 24 77 61 6c 44 62 46 69 6c 65 5d 5d 5d 7d  l $walDbFile]]]}
2d5e0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
2d5f0 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46         checkForF
2d600 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65  ile $test_channe
2d610 6c 20 24 77 61 6c 44 62 46 69 6c 65 0d 0a 20 20  l $walDbFile..  
2d620 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
2d630 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
2d640 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20  [haveConstraint 
2d650 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65  [appendArgs file
2d660 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  _ \..           
2d670 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20       [file tail 
2d680 24 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30  $testInstallVs20
2d690 30 35 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74 68  05LogFile]]]} th
2d6a0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
2d6b0 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65      checkForFile
2d6c0 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24   $test_channel $
2d6d0 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 30  testInstallVs200
2d6e0 35 4c 6f 67 46 69 6c 65 0d 0a 20 20 20 20 20 20  5LogFile..      
2d6f0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
2d700 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76         if {![hav
2d710 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70  eConstraint [app
2d720 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d  endArgs file_ \.
2d730 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2d740 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 74 65 73   [file tail $tes
2d750 74 49 6e 73 74 61 6c 6c 56 73 32 30 30 38 4c 6f  tInstallVs2008Lo
2d760 67 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b  gFile]]]} then {
2d770 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2d780 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65  checkForFile $te
2d790 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73 74  st_channel $test
2d7a0 49 6e 73 74 61 6c 6c 56 73 32 30 30 38 4c 6f 67  InstallVs2008Log
2d7b0 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 20 20  File..          
2d7c0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
2d7d0 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e     if {![haveCon
2d7e0 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41  straint [appendA
2d7f0 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20  rgs file_ \..   
2d800 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69               [fi
2d810 6c 65 20 74 61 69 6c 20 24 74 65 73 74 49 6e 73  le tail $testIns
2d820 74 61 6c 6c 56 73 32 30 31 30 4c 6f 67 46 69 6c  tallVs2010LogFil
2d830 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  e]]]} then {..  
2d840 20 20 20 20 20 20 20 20 20 20 20 20 63 68 65 63              chec
2d850 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63  kForFile $test_c
2d860 68 61 6e 6e 65 6c 20 24 74 65 73 74 49 6e 73 74  hannel $testInst
2d870 61 6c 6c 56 73 32 30 31 30 4c 6f 67 46 69 6c 65  allVs2010LogFile
2d880 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
2d890 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ...            i
2d8a0 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61  f {![haveConstra
2d8b0 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20  int [appendArgs 
2d8c0 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20  file_ \..       
2d8d0 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74           [file t
2d8e0 61 69 6c 20 24 74 65 73 74 49 6e 73 74 61 6c 6c  ail $testInstall
2d8f0 56 73 32 30 31 32 4c 6f 67 46 69 6c 65 5d 5d 5d  Vs2012LogFile]]]
2d900 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
2d910 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72          checkFor
2d920 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e  File $test_chann
2d930 65 6c 20 24 74 65 73 74 49 6e 73 74 61 6c 6c 56  el $testInstallV
2d940 73 32 30 31 32 4c 6f 67 46 69 6c 65 0d 0a 20 20  s2012LogFile..  
2d950 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
2d960 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
2d970 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20  [haveConstraint 
2d980 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65  [appendArgs file
2d990 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  _ \..           
2d9a0 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20       [file tail 
2d9b0 24 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30  $testInstallVs20
2d9c0 31 33 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74 68  13LogFile]]]} th
2d9d0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
2d9e0 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65      checkForFile
2d9f0 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24   $test_channel $
2da00 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 31  testInstallVs201
2da10 33 4c 6f 67 46 69 6c 65 0d 0a 20 20 20 20 20 20  3LogFile..      
2da20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
2da30 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76         if {![hav
2da40 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70  eConstraint [app
2da50 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d  endArgs file_ \.
2da60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2da70 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 74 65 73   [file tail $tes
2da80 74 49 6e 73 74 61 6c 6c 56 73 32 30 31 35 4c 6f  tInstallVs2015Lo
2da90 67 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b  gFile]]]} then {
2daa0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2dab0 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65  checkForFile $te
2dac0 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73 74  st_channel $test
2dad0 49 6e 73 74 61 6c 6c 56 73 32 30 31 35 4c 6f 67  InstallVs2015Log
2dae0 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 20 20  File..          
2daf0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
2db00 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e     if {![haveCon
2db10 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41  straint [appendA
2db20 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20  rgs file_ \..   
2db30 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69               [fi
2db40 6c 65 20 74 61 69 6c 20 24 74 65 73 74 49 6e 73  le tail $testIns
2db50 74 61 6c 6c 56 73 32 30 31 37 4c 6f 67 46 69 6c  tallVs2017LogFil
2db60 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  e]]]} then {..  
2db70 20 20 20 20 20 20 20 20 20 20 20 20 63 68 65 63              chec
2db80 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63  kForFile $test_c
2db90 68 61 6e 6e 65 6c 20 24 74 65 73 74 49 6e 73 74  hannel $testInst
2dba0 61 6c 6c 56 73 32 30 31 37 4c 6f 67 46 69 6c 65  allVs2017LogFile
2dbb0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
2dbc0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ...            i
2dbd0 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61  f {![haveConstra
2dbe0 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20  int [appendArgs 
2dbf0 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20  file_ \..       
2dc00 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74           [file t
2dc10 61 69 6c 20 24 74 65 73 74 55 6e 69 6e 73 74 61  ail $testUninsta
2dc20 6c 6c 56 73 32 30 30 35 4c 6f 67 46 69 6c 65 5d  llVs2005LogFile]
2dc30 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  ]]} then {..    
2dc40 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 46            checkF
2dc50 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61  orFile $test_cha
2dc60 6e 6e 65 6c 20 24 74 65 73 74 55 6e 69 6e 73 74  nnel $testUninst
2dc70 61 6c 6c 56 73 32 30 30 35 4c 6f 67 46 69 6c 65  allVs2005LogFile
2dc80 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
2dc90 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ...            i
2dca0 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61  f {![haveConstra
2dcb0 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20  int [appendArgs 
2dcc0 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20  file_ \..       
2dcd0 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74           [file t
2dce0 61 69 6c 20 24 74 65 73 74 55 6e 69 6e 73 74 61  ail $testUninsta
2dcf0 6c 6c 56 73 32 30 30 38 4c 6f 67 46 69 6c 65 5d  llVs2008LogFile]
2dd00 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  ]]} then {..    
2dd10 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 46            checkF
2dd20 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61  orFile $test_cha
2dd30 6e 6e 65 6c 20 24 74 65 73 74 55 6e 69 6e 73 74  nnel $testUninst
2dd40 61 6c 6c 56 73 32 30 30 38 4c 6f 67 46 69 6c 65  allVs2008LogFile
2dd50 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
2dd60 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ...            i
2dd70 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61  f {![haveConstra
2dd80 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20  int [appendArgs 
2dd90 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20  file_ \..       
2dda0 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74           [file t
2ddb0 61 69 6c 20 24 74 65 73 74 55 6e 69 6e 73 74 61  ail $testUninsta
2ddc0 6c 6c 56 73 32 30 31 30 4c 6f 67 46 69 6c 65 5d  llVs2010LogFile]
2ddd0 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  ]]} then {..    
2dde0 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 46            checkF
2ddf0 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61  orFile $test_cha
2de00 6e 6e 65 6c 20 24 74 65 73 74 55 6e 69 6e 73 74  nnel $testUninst
2de10 61 6c 6c 56 73 32 30 31 30 4c 6f 67 46 69 6c 65  allVs2010LogFile
2de20 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
2de30 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ...            i
2de40 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61  f {![haveConstra
2de50 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20  int [appendArgs 
2de60 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20  file_ \..       
2de70 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74           [file t
2de80 61 69 6c 20 24 74 65 73 74 55 6e 69 6e 73 74 61  ail $testUninsta
2de90 6c 6c 56 73 32 30 31 32 4c 6f 67 46 69 6c 65 5d  llVs2012LogFile]
2dea0 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  ]]} then {..    
2deb0 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 46            checkF
2dec0 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61  orFile $test_cha
2ded0 6e 6e 65 6c 20 24 74 65 73 74 55 6e 69 6e 73 74  nnel $testUninst
2dee0 61 6c 6c 56 73 32 30 31 32 4c 6f 67 46 69 6c 65  allVs2012LogFile
2def0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
2df00 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ...            i
2df10 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61  f {![haveConstra
2df20 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20  int [appendArgs 
2df30 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20  file_ \..       
2df40 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74           [file t
2df50 61 69 6c 20 24 74 65 73 74 55 6e 69 6e 73 74 61  ail $testUninsta
2df60 6c 6c 56 73 32 30 31 33 4c 6f 67 46 69 6c 65 5d  llVs2013LogFile]
2df70 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  ]]} then {..    
2df80 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 46            checkF
2df90 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61  orFile $test_cha
2dfa0 6e 6e 65 6c 20 24 74 65 73 74 55 6e 69 6e 73 74  nnel $testUninst
2dfb0 61 6c 6c 56 73 32 30 31 33 4c 6f 67 46 69 6c 65  allVs2013LogFile
2dfc0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
2dfd0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ...            i
2dfe0 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61  f {![haveConstra
2dff0 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20  int [appendArgs 
2e000 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20  file_ \..       
2e010 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74           [file t
2e020 61 69 6c 20 24 74 65 73 74 55 6e 69 6e 73 74 61  ail $testUninsta
2e030 6c 6c 56 73 32 30 31 35 4c 6f 67 46 69 6c 65 5d  llVs2015LogFile]
2e040 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  ]]} then {..    
2e050 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 46            checkF
2e060 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61  orFile $test_cha
2e070 6e 6e 65 6c 20 24 74 65 73 74 55 6e 69 6e 73 74  nnel $testUninst
2e080 61 6c 6c 56 73 32 30 31 35 4c 6f 67 46 69 6c 65  allVs2015LogFile
2e090 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
2e0a0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ...            i
2e0b0 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61  f {![haveConstra
2e0c0 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20  int [appendArgs 
2e0d0 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20  file_ \..       
2e0e0 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74           [file t
2e0f0 61 69 6c 20 24 74 65 73 74 55 6e 69 6e 73 74 61  ail $testUninsta
2e100 6c 6c 56 73 32 30 31 37 4c 6f 67 46 69 6c 65 5d  llVs2017LogFile]
2e110 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  ]]} then {..    
2e120 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 46            checkF
2e130 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61  orFile $test_cha
2e140 6e 6e 65 6c 20 24 74 65 73 74 55 6e 69 6e 73 74  nnel $testUninst
2e150 61 6c 6c 56 73 32 30 31 37 4c 6f 67 46 69 6c 65  allVs2017LogFile
2e160 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
2e170 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
2e180 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
2e190 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
2e1a0 70 72 6f 63 20 72 75 6e 53 51 4c 69 74 65 54 65  proc runSQLiteTe
2e1b0 73 74 46 69 6c 65 73 45 70 69 6c 6f 67 75 65 20  stFilesEpilogue 
2e1c0 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20  {} {..      #.. 
2e1d0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69       # NOTE: Ski
2e1e0 70 20 72 75 6e 6e 69 6e 67 20 6f 75 72 20 63 75  p running our cu
2e1f0 73 74 6f 6d 20 66 69 6c 65 73 20 65 70 69 6c 6f  stom files epilo
2e200 67 75 65 20 69 66 20 74 68 65 20 6d 61 69 6e 20  gue if the main 
2e210 6f 6e 65 20 68 61 73 20 62 65 65 6e 0d 0a 20 20  one has been..  
2e220 20 20 20 20 23 20 20 20 20 20 20 20 73 6b 69 70      #       skip
2e230 70 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ped...      #.. 
2e240 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
2e250 65 78 69 73 74 73 20 3a 3a 6e 6f 28 65 70 69 6c  exists ::no(epil
2e260 6f 67 75 65 2e 65 61 67 6c 65 29 5d 7d 20 74 68  ogue.eagle)]} th
2e270 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 75 70  en {..        up
2e280 6c 65 76 65 6c 20 31 20 7b 0d 0a 20 20 20 20 20  level 1 {..     
2e290 20 20 20 20 20 75 6e 73 65 74 20 2d 6e 6f 63 6f       unset -noco
2e2a0 6d 70 6c 61 69 6e 20 5c 0d 0a 20 20 20 20 20 20  mplain \..      
2e2b0 20 20 20 20 20 20 20 20 74 65 73 74 55 6e 69 6e          testUnin
2e2c0 73 74 61 6c 6c 56 73 32 30 31 37 4c 6f 67 46 69  stallVs2017LogFi
2e2d0 6c 65 20 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c  le testUninstall
2e2e0 56 73 32 30 31 35 4c 6f 67 46 69 6c 65 20 5c 0d  Vs2015LogFile \.
2e2f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  .              t
2e300 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30  estUninstallVs20
2e310 31 33 4c 6f 67 46 69 6c 65 20 74 65 73 74 55 6e  13LogFile testUn
2e320 69 6e 73 74 61 6c 6c 56 73 32 30 31 32 4c 6f 67  installVs2012Log
2e330 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  File \..        
2e340 20 20 20 20 20 20 74 65 73 74 55 6e 69 6e 73 74        testUninst
2e350 61 6c 6c 56 73 32 30 31 30 4c 6f 67 46 69 6c 65  allVs2010LogFile
2e360 20 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73   testUninstallVs
2e370 32 30 30 38 4c 6f 67 46 69 6c 65 20 5c 0d 0a 20  2008LogFile \.. 
2e380 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73               tes
2e390 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 30 35  tUninstallVs2005
2e3a0 4c 6f 67 46 69 6c 65 20 74 65 73 74 49 6e 73 74  LogFile testInst
2e3b0 61 6c 6c 56 73 32 30 31 37 4c 6f 67 46 69 6c 65  allVs2017LogFile
2e3c0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
2e3d0 20 20 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32    testInstallVs2
2e3e0 30 31 35 4c 6f 67 46 69 6c 65 20 74 65 73 74 49  015LogFile testI
2e3f0 6e 73 74 61 6c 6c 56 73 32 30 31 33 4c 6f 67 46  nstallVs2013LogF
2e400 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ile \..         
2e410 20 20 20 20 20 74 65 73 74 49 6e 73 74 61 6c 6c       testInstall
2e420 56 73 32 30 31 32 4c 6f 67 46 69 6c 65 20 74 65  Vs2012LogFile te
2e430 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 31 30 4c  stInstallVs2010L
2e440 6f 67 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20  ogFile \..      
2e450 20 20 20 20 20 20 20 20 74 65 73 74 49 6e 73 74          testInst
2e460 61 6c 6c 56 73 32 30 30 38 4c 6f 67 46 69 6c 65  allVs2008LogFile
2e470 20 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30   testInstallVs20
2e480 30 35 4c 6f 67 46 69 6c 65 0d 0a 0d 0a 20 20 20  05LogFile....   
2e490 20 20 20 20 20 20 20 75 6e 73 65 74 20 2d 6e 6f         unset -no
2e4a0 63 6f 6d 70 6c 61 69 6e 20 5c 0d 0a 20 20 20 20  complain \..    
2e4b0 20 20 20 20 20 20 20 20 20 20 6e 6f 72 74 68 77            northw
2e4c0 69 6e 64 45 66 44 62 46 69 6c 65 20 74 65 73 74  indEfDbFile test
2e4d0 4c 69 6e 71 4f 75 74 46 69 6c 65 20 5c 0d 0a 20  LinqOutFile \.. 
2e4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 77 61 6c               wal
2e4f0 44 62 46 69 6c 65 20 6e 6f 6e 57 61 6c 44 62 46  DbFile nonWalDbF
2e500 69 6c 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ile....         
2e510 20 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61   unset -nocompla
2e520 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  in \..          
2e530 20 20 20 20 74 65 73 74 45 66 36 45 78 65 46 69      testEf6ExeFi
2e540 6c 65 20 74 65 73 74 4c 69 6e 71 45 78 65 46 69  le testLinqExeFi
2e550 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  le \..          
2e560 20 20 20 20 74 65 73 74 45 78 65 46 69 6c 65 20      testExeFile 
2e570 73 79 73 74 65 6d 44 61 74 61 53 51 4c 69 74 65  systemDataSQLite
2e580 45 66 36 44 6c 6c 46 69 6c 65 20 5c 0d 0a 20 20  Ef6DllFile \..  
2e590 20 20 20 20 20 20 20 20 20 20 20 20 73 79 73 74              syst
2e5a0 65 6d 44 61 74 61 53 51 4c 69 74 65 4c 69 6e 71  emDataSQLiteLinq
2e5b0 44 6c 6c 46 69 6c 65 20 73 79 73 74 65 6d 44 61  DllFile systemDa
2e5c0 74 61 53 51 4c 69 74 65 44 6c 6c 46 69 6c 65 20  taSQLiteDllFile 
2e5d0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
2e5e0 20 73 71 6c 69 74 65 44 65 73 69 67 6e 65 72 44   sqliteDesignerD
2e5f0 6c 6c 46 69 6c 65 20 69 6e 73 74 61 6c 6c 65 72  llFile installer
2e600 45 78 65 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20  ExeFile \..     
2e610 20 20 20 20 20 20 20 20 20 65 6e 74 69 74 79 46           entityF
2e620 72 61 6d 65 77 6f 72 6b 44 6c 6c 46 69 6c 65 0d  rameworkDllFile.
2e630 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
2e640 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
2e650 20 20 20 70 72 6f 63 20 72 75 6e 53 51 4c 69 74     proc runSQLit
2e660 65 54 65 73 74 45 70 69 6c 6f 67 75 65 20 7b 7d  eTestEpilogue {}
2e670 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
2e680 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20     # NOTE: Skip 
2e690 72 75 6e 6e 69 6e 67 20 6f 75 72 20 63 75 73 74  running our cust
2e6a0 6f 6d 20 65 70 69 6c 6f 67 75 65 20 69 66 20 74  om epilogue if t
2e6b0 68 65 20 6d 61 69 6e 20 6f 6e 65 20 68 61 73 20  he main one has 
2e6c0 62 65 65 6e 0d 0a 20 20 20 20 20 20 23 20 20 20  been..      #   
2e6d0 20 20 20 20 73 6b 69 70 70 65 64 2e 0d 0a 20 20      skipped...  
2e6e0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
2e6f0 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
2e700 3a 6e 6f 28 65 70 69 6c 6f 67 75 65 2e 65 61 67  :no(epilogue.eag
2e710 6c 65 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  le)]} then {..  
2e720 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
2e730 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20 77 68   # NOTE: Show wh
2e740 65 6e 20 6f 75 72 20 74 65 73 74 73 20 61 63 74  en our tests act
2e750 75 61 6c 6c 79 20 65 6e 64 65 64 20 28 6e 6f 77  ually ended (now
2e760 29 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  )...        #.. 
2e770 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
2e780 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
2e790 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
2e7a0 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 53 79          "---- Sy
2e7b0 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
2e7c0 20 74 65 73 74 73 20 65 6e 64 65 64 20 61 74 20   tests ended at 
2e7d0 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
2e7e0 20 5b 63 6c 6f 63 6b 20 66 6f 72 6d 61 74 20 5b   [clock format [
2e7f0 63 6c 6f 63 6b 20 73 65 63 6f 6e 64 73 5d 5d 20  clock seconds]] 
2e800 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23  \n]....        #
2e810 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
2e820 3a 20 4c 6f 61 64 20 74 68 65 20 22 65 70 69 6c  : Load the "epil
2e830 6f 67 75 65 22 20 63 75 73 74 6f 6d 20 70 65 72  ogue" custom per
2e840 2d 75 73 65 72 20 61 6e 64 2f 6f 72 20 70 65 72  -user and/or per
2e850 2d 68 6f 73 74 20 74 65 73 74 0d 0a 20 20 20 20  -host test..    
2e860 20 20 20 20 23 20 20 20 20 20 20 20 73 65 74 74      #       sett
2e870 69 6e 67 73 20 6e 6f 77 2e 0d 0a 20 20 20 20 20  ings now...     
2e880 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 75 70     #..        up
2e890 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74 20 6c 6f  level 1 [list lo
2e8a0 61 64 53 51 4c 69 74 65 54 65 73 74 53 65 74 74  adSQLiteTestSett
2e8b0 69 6e 67 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  ings $::test_cha
2e8c0 6e 6e 65 6c 20 2e 65 70 69 6c 6f 67 75 65 5d 0d  nnel .epilogue].
2e8d0 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
2e8e0 20 20 20 20 20 20 23 20 42 55 47 46 49 58 3a 20        # BUGFIX: 
2e8f0 42 65 66 6f 72 65 20 63 68 65 63 6b 69 6e 67 20  Before checking 
2e900 74 68 65 20 66 69 6e 61 6c 20 72 65 73 6f 75 72  the final resour
2e910 63 65 73 20 69 6e 20 75 73 65 20 62 79 20 53 51  ces in use by SQ
2e920 4c 69 74 65 2c 20 6d 61 6b 65 0d 0a 20 20 20 20  Lite, make..    
2e930 20 20 20 20 23 20 20 20 20 20 20 20 20 20 73 75      #         su
2e940 72 65 20 62 6f 74 68 20 6f 66 20 74 68 65 20 50  re both of the P
2e950 52 41 47 4d 41 20 72 65 6c 61 74 65 64 20 64 69  RAGMA related di
2e960 72 65 63 74 6f 72 79 20 6e 61 6d 65 73 20 61 72  rectory names ar
2e970 65 20 66 72 65 65 64 2e 0d 0a 20 20 20 20 20 20  e freed...      
2e980 20 20 23 0d 0a 20 20 20 20 20 20 20 20 63 68 65    #..        che
2e990 63 6b 46 6f 72 53 51 4c 69 74 65 44 69 72 65 63  ckForSQLiteDirec
2e9a0 74 6f 72 69 65 73 20 24 3a 3a 74 65 73 74 5f 63  tories $::test_c
2e9b0 68 61 6e 6e 65 6c 20 74 72 75 65 0d 0a 0d 0a 20  hannel true.... 
2e9c0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
2e9d0 20 20 23 20 4e 4f 54 45 3a 20 41 6c 73 6f 20 72    # NOTE: Also r
2e9e0 65 70 6f 72 74 20 74 68 65 20 72 65 73 6f 75 72  eport the resour
2e9f0 63 65 20 75 73 61 67 65 20 61 66 74 65 72 20 72  ce usage after r
2ea00 75 6e 6e 69 6e 67 20 74 68 65 20 74 65 73 74 73  unning the tests
2ea10 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
2ea20 20 20 20 20 20 20 72 65 70 6f 72 74 53 51 4c 69        reportSQLi
2ea30 74 65 52 65 73 6f 75 72 63 65 73 20 24 3a 3a 74  teResources $::t
2ea40 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20  est_channel.... 
2ea50 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
2ea60 20 20 23 20 4e 4f 54 45 3a 20 52 65 70 6f 72 74    # NOTE: Report
2ea70 20 74 68 65 20 63 72 69 74 69 63 61 6c 20 68 61   the critical ha
2ea80 6e 64 6c 65 20 63 6f 75 6e 74 73 20 61 66 74 65  ndle counts afte
2ea90 72 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 74 65  r running the te
2eaa0 73 74 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  sts...        #.
2eab0 0a 20 20 20 20 20 20 20 20 67 65 74 53 51 4c 69  .        getSQLi
2eac0 74 65 48 61 6e 64 6c 65 43 6f 75 6e 74 73 20 24  teHandleCounts $
2ead0 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a  ::test_channel..
2eae0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
2eaf0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20       # NOTE: If 
2eb00 6e 65 63 65 73 73 61 72 79 2c 20 64 69 73 61 62  necessary, disab
2eb10 6c 65 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  le shared-cache 
2eb20 6d 6f 64 65 20 6e 6f 77 2e 0d 0a 20 20 20 20 20  mode now...     
2eb30 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66     #..        if
2eb40 20 7b 5b 68 61 73 52 75 6e 74 69 6d 65 4f 70 74   {[hasRuntimeOpt
2eb50 69 6f 6e 20 73 68 61 72 65 64 43 61 63 68 65 5d  ion sharedCache]
2eb60 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
2eb70 20 20 20 20 65 6e 61 62 6c 65 53 68 61 72 65 64      enableShared
2eb80 43 61 63 68 65 20 24 3a 3a 74 65 73 74 5f 63 68  Cache $::test_ch
2eb90 61 6e 6e 65 6c 20 66 61 6c 73 65 0d 0a 20 20 20  annel false..   
2eba0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
2ebb0 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 23  .    }.....    #
2ebc0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2ebd0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2ebe0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2ebf0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2ec00 23 23 23 23 23 23 23 23 23 23 0d 0a 20 20 20 20  ##########..    
2ec10 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2ec20 23 23 23 23 23 23 23 23 23 23 23 23 23 20 45 4e  ############# EN
2ec30 44 20 45 61 67 6c 65 20 4f 4e 4c 59 20 23 23 23  D Eagle ONLY ###
2ec40 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2ec50 23 23 23 23 23 23 23 23 23 23 23 0d 0a 20 20 20  ###########..   
2ec60 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23   ###############
2ec70 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2ec80 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2ec90 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2eca0 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a 20 20  ############..  
2ecb0 7d 0d 0a 0d 0a 20 20 23 0d 0a 20 20 23 20 4e 4f  }....  #..  # NO
2ecc0 54 45 3a 20 53 61 76 65 20 74 68 65 20 6e 61 6d  TE: Save the nam
2ecd0 65 20 6f 66 20 74 68 65 20 64 69 72 65 63 74 6f  e of the directo
2ece0 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ry containing th
2ecf0 69 73 20 66 69 6c 65 2e 0d 0a 20 20 23 0d 0a 20  is file...  #.. 
2ed00 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
2ed10 74 73 20 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74  ts common_direct
2ed20 6f 72 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ory]} then {..  
2ed30 20 20 73 65 74 20 63 6f 6d 6d 6f 6e 5f 64 69 72    set common_dir
2ed40 65 63 74 6f 72 79 20 5b 66 69 6c 65 20 64 69 72  ectory [file dir
2ed50 6e 61 6d 65 20 5b 69 6e 66 6f 20 73 63 72 69 70  name [info scrip
2ed60 74 5d 5d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 23 0d  t]]..  }....  #.
2ed70 0a 20 20 23 20 4e 4f 54 45 3a 20 50 72 6f 76 69  .  # NOTE: Provi
2ed80 64 65 20 74 68 65 20 53 79 73 74 65 6d 2e 44 61  de the System.Da
2ed90 74 61 2e 53 51 4c 69 74 65 20 74 65 73 74 20 70  ta.SQLite test p
2eda0 61 63 6b 61 67 65 20 74 6f 20 74 68 65 20 69 6e  ackage to the in
2edb0 74 65 72 70 72 65 74 65 72 2e 0d 0a 20 20 23 0d  terpreter...  #.
2edc0 0a 20 20 70 61 63 6b 61 67 65 20 70 72 6f 76 69  .  package provi
2edd0 64 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  de System.Data.S
2ede0 51 4c 69 74 65 2e 54 65 73 74 20 31 2e 30 0d 0a  QLite.Test 1.0..
2edf0 7d 0d 0a                                         }..