System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact 835f34b4c5c85134a0dd0cd101e8acffd38c88ea:


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 0d 0a 20  eturn netFx47.. 
23b0: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
23c0: 20 20 20 20 20 20 20 20 20 20 64 65 66 61 75 6c            defaul
23d0: 74 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  t {..           
23e0: 20 20 20 72 65 74 75 72 6e 20 6e 65 74 46 78 33     return netFx3
23f0: 35 3b 20 23 20 54 4f 44 4f 3a 20 47 6f 6f 64 20  5; # TODO: Good 
2400: 22 66 61 6c 6c 62 61 63 6b 22 20 64 65 66 61 75  "fallback" defau
2410: 6c 74 3f 0d 0a 20 20 20 20 20 20 20 20 20 20 20  lt?..           
2420: 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d   }..          }.
2430: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
2440: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
2450: 20 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54 45     #..    # NOTE
2460: 3a 20 54 68 69 73 20 70 72 6f 63 65 64 75 72 65  : This procedure
2470: 20 73 68 6f 75 6c 64 20 72 65 74 75 72 6e 20 6e   should return n
2480: 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 63  on-zero if the c
2490: 6f 6e 66 69 67 75 72 65 64 20 74 65 73 74 0d 0a  onfigured test..
24a0: 20 20 20 20 23 20 20 20 20 20 20 20 70 6c 61 74      #       plat
24b0: 66 6f 72 6d 20 69 73 20 6d 6f 73 74 20 6c 69 6b  form is most lik
24c0: 65 6c 79 20 74 68 65 20 64 65 66 61 75 6c 74 20  ely the default 
24d0: 66 6f 72 20 74 68 69 73 20 6d 61 63 68 69 6e 65  for this machine
24e0: 2e 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 70 72  ...    #..    pr
24f0: 6f 63 20 69 73 44 65 66 61 75 6c 74 42 75 69 6c  oc isDefaultBuil
2500: 64 50 6c 61 74 66 6f 72 6d 20 7b 20 7b 76 65 72  dPlatform { {ver
2510: 62 6f 73 65 20 74 72 75 65 7d 20 7d 20 7b 0d 0a  bose true} } {..
2520: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
2530: 20 4e 4f 54 45 3a 20 52 75 6e 6e 69 6e 67 20 6f   NOTE: Running o
2540: 6e 20 57 6f 57 36 34 20 69 73 20 6e 65 76 65 72  n WoW64 is never
2550: 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 6c 61   the default pla
2560: 74 66 6f 72 6d 2e 0d 0a 20 20 20 20 20 20 23 0d  tform...      #.
2570: 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 73 52 75  .      if {[isRu
2580: 6e 6e 69 6e 67 57 6f 57 36 34 5d 7d 20 74 68 65  nningWoW64]} the
2590: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20  n {..        if 
25a0: 7b 24 76 65 72 62 6f 73 65 7d 20 74 68 65 6e 20  {$verbose} then 
25b0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75  {..          tpu
25c0: 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
25d0: 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  el \..          
25e0: 20 20 20 20 22 2d 2d 2d 2d 20 64 65 74 65 63 74      "---- detect
25f0: 65 64 20 6e 6f 6e 2d 64 65 66 61 75 6c 74 20 70  ed non-default p
2600: 6c 61 74 66 6f 72 6d 20 28 57 6f 57 36 34 29 5c  latform (WoW64)\
2610: 6e 22 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  n"..        }...
2620: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2630: 66 61 6c 73 65 0d 0a 20 20 20 20 20 20 7d 0d 0a  false..      }..
2640: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
2650: 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 68 61   # NOTE: This ha
2660: 73 20 61 20 67 6f 6f 64 20 63 68 61 6e 63 65 20  s a good chance 
2670: 6f 66 20 62 65 69 6e 67 20 74 68 65 20 64 65 66  of being the def
2680: 61 75 6c 74 20 70 6c 61 74 66 6f 72 6d 2e 0d 0a  ault platform...
2690: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
26a0: 66 20 7b 24 76 65 72 62 6f 73 65 7d 20 74 68 65  f {$verbose} the
26b0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75  n {..        tpu
26c0: 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
26d0: 65 6c 20 22 2d 2d 2d 2d 20 64 65 74 65 63 74 65  el "---- detecte
26e0: 64 20 64 65 66 61 75 6c 74 20 70 6c 61 74 66 6f  d default platfo
26f0: 72 6d 5c 6e 22 0d 0a 20 20 20 20 20 20 7d 0d 0a  rm\n"..      }..
2700: 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 74  ..      return t
2710: 72 75 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20  rue..    }..... 
2720: 20 20 20 70 72 6f 63 20 67 65 74 42 75 69 6c 64     proc getBuild
2730: 50 6c 61 74 66 6f 72 6d 20 7b 20 6e 61 74 69 76  Platform { nativ
2740: 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66 20  e } {..      if 
2750: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
2760: 74 65 73 74 5f 70 6c 61 74 66 6f 72 6d 5d 20 26  test_platform] &
2770: 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b  & \..          [
2780: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a  string length $:
2790: 3a 74 65 73 74 5f 70 6c 61 74 66 6f 72 6d 5d 20  :test_platform] 
27a0: 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
27b0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
27c0: 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20  # NOTE: Use the 
27d0: 73 70 65 63 69 66 69 65 64 20 74 65 73 74 20 70  specified test p
27e0: 6c 61 74 66 6f 72 6d 2e 20 20 49 66 20 74 68 69  latform.  If thi
27f0: 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 6e 6f  s variable is no
2800: 74 20 73 65 74 2c 0d 0a 20 20 20 20 20 20 20 20  t set,..        
2810: 23 20 20 20 20 20 20 20 74 68 65 20 64 65 66 61  #       the defa
2820: 75 6c 74 20 76 61 6c 75 65 20 77 69 6c 6c 20 62  ult value will b
2830: 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 6d  e based on the m
2840: 61 63 68 69 6e 65 20 61 72 63 68 69 74 65 63 74  achine architect
2850: 75 72 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ure...        #.
2860: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2870: 5b 65 78 70 72 20 7b 24 6e 61 74 69 76 65 20 3f  [expr {$native ?
2880: 20 24 3a 3a 74 65 73 74 5f 70 6c 61 74 66 6f 72   $::test_platfor
2890: 6d 20 3a 20 22 22 7d 5d 0d 0a 20 20 20 20 20 20  m : ""}]..      
28a0: 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20  } elseif {[info 
28b0: 65 78 69 73 74 73 20 3a 3a 74 65 73 74 5f 6d 61  exists ::test_ma
28c0: 63 68 69 6e 65 5d 20 26 26 20 5c 0d 0a 20 20 20  chine] && \..   
28d0: 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c         [string l
28e0: 65 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f 6d 61  ength $::test_ma
28f0: 63 68 69 6e 65 5d 20 3e 20 30 7d 20 74 68 65 6e  chine] > 0} then
2900: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
2910: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46         # NOTE: F
2920: 6f 72 20 6e 61 74 69 76 65 20 62 75 69 6c 64 73  or native builds
2930: 2c 20 72 65 74 75 72 6e 20 74 68 65 20 70 6c 61  , return the pla
2940: 74 66 6f 72 6d 20 6e 61 6d 65 20 63 6f 72 72 65  tform name corre
2950: 73 70 6f 6e 64 69 6e 67 20 74 6f 0d 0a 20 20 20  sponding to..   
2960: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
2970: 20 74 65 73 74 20 6d 61 63 68 69 6e 65 20 61 72   test machine ar
2980: 63 68 69 74 65 63 74 75 72 65 3b 20 6f 74 68 65  chitecture; othe
2990: 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 61 6e  rwise, return an
29a0: 20 65 6d 70 74 79 0d 0a 20 20 20 20 20 20 20 20   empty..        
29b0: 23 20 20 20 20 20 20 20 73 74 72 69 6e 67 2e 0d  #       string..
29c0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
29d0: 20 20 20 20 72 65 74 75 72 6e 20 5b 65 78 70 72      return [expr
29e0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 24 6e   {..          $n
29f0: 61 74 69 76 65 20 3f 20 5b 6d 61 63 68 69 6e 65  ative ? [machine
2a00: 54 6f 50 6c 61 74 66 6f 72 6d 20 24 3a 3a 74 65  ToPlatform $::te
2a10: 73 74 5f 6d 61 63 68 69 6e 65 5d 20 3a 20 22 22  st_machine] : ""
2a20: 0d 0a 20 20 20 20 20 20 20 20 7d 5d 0d 0a 20 20  ..        }]..  
2a30: 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69      } elseif {[i
2a40: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 63 6c  nfo exists ::tcl
2a50: 5f 70 6c 61 74 66 6f 72 6d 28 6d 61 63 68 69 6e  _platform(machin
2a60: 65 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  e)]} then {..   
2a70: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
2a80: 23 20 4e 4f 54 45 3a 20 46 6f 72 20 6e 61 74 69  # NOTE: For nati
2a90: 76 65 20 62 75 69 6c 64 73 2c 20 72 65 74 75 72  ve builds, retur
2aa0: 6e 20 74 68 65 20 70 6c 61 74 66 6f 72 6d 20 6e  n the platform n
2ab0: 61 6d 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  ame correspondin
2ac0: 67 20 74 6f 0d 0a 20 20 20 20 20 20 20 20 23 20  g to..        # 
2ad0: 20 20 20 20 20 20 74 68 65 20 6d 61 63 68 69 6e        the machin
2ae0: 65 20 61 72 63 68 69 74 65 63 74 75 72 65 3b 20  e architecture; 
2af0: 6f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72  otherwise, retur
2b00: 6e 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e  n an empty strin
2b10: 67 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  g...        #.. 
2b20: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 65         return [e
2b30: 78 70 72 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  xpr {..         
2b40: 20 24 6e 61 74 69 76 65 20 3f 20 5b 6d 61 63 68   $native ? [mach
2b50: 69 6e 65 54 6f 50 6c 61 74 66 6f 72 6d 20 24 3a  ineToPlatform $:
2b60: 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 6d 61  :tcl_platform(ma
2b70: 63 68 69 6e 65 29 5d 20 3a 20 22 22 0d 0a 20 20  chine)] : ""..  
2b80: 20 20 20 20 20 20 7d 5d 0d 0a 20 20 20 20 20 20        }]..      
2b90: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
2ba0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
2bb0: 4f 54 45 3a 20 4e 6f 20 6d 61 63 68 69 6e 65 20  OTE: No machine 
2bc0: 61 72 63 68 69 74 65 63 74 75 72 65 20 69 73 20  architecture is 
2bd0: 61 76 61 69 6c 61 62 6c 65 2c 20 72 65 74 75 72  available, retur
2be0: 6e 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e  n an empty strin
2bf0: 67 2e 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  g...        #   
2c00: 20 20 20 20 49 74 20 69 73 20 69 6d 70 6f 72 74      It is import
2c10: 61 6e 74 20 74 6f 20 72 65 74 75 72 6e 20 61 6e  ant to return an
2c20: 20 65 6d 70 74 79 20 73 74 72 69 6e 67 20 68 65   empty string he
2c30: 72 65 20 62 65 63 61 75 73 65 20 74 68 65 0d 0a  re because the..
2c40: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
2c50: 72 65 73 75 6c 74 20 6f 66 20 74 68 69 73 20 70  result of this p
2c60: 72 6f 63 65 64 75 72 65 20 6d 61 79 20 62 65 20  rocedure may be 
2c70: 75 73 65 64 20 77 69 74 68 20 5b 66 69 6c 65 20  used with [file 
2c80: 6a 6f 69 6e 5d 2e 0d 0a 20 20 20 20 20 20 20 20  join]...        
2c90: 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  #..        retur
2ca0: 6e 20 22 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  n ""..      }.. 
2cb0: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
2cc0: 63 20 67 65 74 42 75 69 6c 64 43 6f 6e 66 69 67  c getBuildConfig
2cd0: 75 72 61 74 69 6f 6e 20 7b 7d 20 7b 0d 0a 20 20  uration {} {..  
2ce0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
2cf0: 4f 54 45 3a 20 53 65 65 20 69 66 20 74 68 65 20  OTE: See if the 
2d00: 22 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 22 20  "configuration" 
2d10: 73 65 74 74 69 6e 67 20 68 61 73 20 62 65 65 6e  setting has been
2d20: 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20 74   overridden by t
2d30: 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  he..      #     
2d40: 20 20 75 73 65 72 20 28 65 2e 67 2e 20 6f 6e 20    user (e.g. on 
2d50: 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65  the command line
2d60: 29 2e 20 20 54 68 69 73 20 68 65 6c 70 73 20 63  ).  This helps c
2d70: 6f 6e 74 72 6f 6c 20 65 78 61 63 74 6c 79 0d 0a  ontrol exactly..
2d80: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 77 68        #       wh
2d90: 69 63 68 20 73 65 74 20 6f 66 20 62 69 6e 61 72  ich set of binar
2da0: 69 65 73 20 77 65 20 61 72 65 20 74 65 73 74 69  ies we are testi
2db0: 6e 67 20 28 69 2e 65 2e 20 74 68 6f 73 65 20 62  ng (i.e. those b
2dc0: 75 69 6c 74 20 69 6e 20 74 68 65 0d 0a 20 20 20  uilt in the..   
2dd0: 20 20 20 23 20 20 20 20 20 20 20 22 44 65 62 75     #       "Debu
2de0: 67 22 20 6f 72 20 22 52 65 6c 65 61 73 65 22 20  g" or "Release" 
2df0: 62 75 69 6c 64 20 63 6f 6e 66 69 67 75 72 61 74  build configurat
2e00: 69 6f 6e 73 29 2e 20 20 54 6f 20 6f 76 65 72 72  ions).  To overr
2e10: 69 64 65 20 74 68 69 73 0d 0a 20 20 20 20 20 20  ide this..      
2e20: 23 20 20 20 20 20 20 20 76 61 6c 75 65 20 76 69  #       value vi
2e30: 61 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69  a the command li
2e40: 6e 65 2c 20 65 6e 74 65 72 20 61 20 63 6f 6d 6d  ne, enter a comm
2e50: 61 6e 64 20 73 69 6d 69 6c 61 72 20 74 6f 20 6f  and similar to o
2e60: 6e 65 20 6f 66 0d 0a 20 20 20 20 20 20 23 20 20  ne of..      #  
2e70: 20 20 20 20 20 74 68 65 20 66 6f 6c 6c 6f 77 69       the followi
2e80: 6e 67 20 28 61 6c 6c 20 6f 6e 20 6f 6e 65 20 6c  ng (all on one l
2e90: 69 6e 65 29 3a 0d 0a 20 20 20 20 20 20 23 0d 0a  ine):..      #..
2ea0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 45 61        #       Ea
2eb0: 67 6c 65 53 68 65 6c 6c 2e 65 78 65 20 2d 61 6e  gleShell.exe -an
2ec0: 79 49 6e 69 74 69 61 6c 69 7a 65 20 22 73 65 74  yInitialize "set
2ed0: 20 74 65 73 74 5f 63 6f 6e 66 69 67 75 72 61 74   test_configurat
2ee0: 69 6f 6e 20 44 65 62 75 67 22 0d 0a 20 20 20 20  ion Debug"..    
2ef0: 20 20 23 20 20 20 20 20 20 20 20 20 2d 66 69 6c    #         -fil
2f00: 65 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e  e .\path\to\all.
2f10: 65 61 67 6c 65 0d 0a 20 20 20 20 20 20 23 0d 0a  eagle..      #..
2f20: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 45 61        #       Ea
2f30: 67 6c 65 53 68 65 6c 6c 2e 65 78 65 20 2d 61 6e  gleShell.exe -an
2f40: 79 49 6e 69 74 69 61 6c 69 7a 65 20 22 73 65 74  yInitialize "set
2f50: 20 74 65 73 74 5f 63 6f 6e 66 69 67 75 72 61 74   test_configurat
2f60: 69 6f 6e 20 52 65 6c 65 61 73 65 22 0d 0a 20 20  ion Release"..  
2f70: 20 20 20 20 23 20 20 20 20 20 20 20 20 20 2d 66      #         -f
2f80: 69 6c 65 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c  ile .\path\to\al
2f90: 6c 2e 65 61 67 6c 65 0d 0a 20 20 20 20 20 20 23  l.eagle..      #
2fa0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
2fb0: 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65 20 2d  EagleShell.exe -
2fc0: 66 69 6c 65 20 2e 5c 70 61 74 68 5c 74 6f 5c 61  file .\path\to\a
2fd0: 6c 6c 2e 65 61 67 6c 65 20 2d 70 72 65 54 65 73  ll.eagle -preTes
2fe0: 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  t..      #      
2ff0: 20 20 20 22 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d     "unset -nocom
3000: 70 6c 61 69 6e 20 74 65 73 74 5f 63 6f 6e 66 69  plain test_confi
3010: 67 75 72 61 74 69 6f 6e 22 0d 0a 20 20 20 20 20  guration"..     
3020: 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69   #..      if {[i
3030: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 73  nfo exists ::tes
3040: 74 5f 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 5d  t_configuration]
3050: 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
3060: 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20   [string length 
3070: 24 3a 3a 74 65 73 74 5f 63 6f 6e 66 69 67 75 72  $::test_configur
3080: 61 74 69 6f 6e 5d 20 3e 20 30 7d 20 74 68 65 6e  ation] > 0} then
3090: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
30a0: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55         # NOTE: U
30b0: 73 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64  se the specified
30c0: 20 74 65 73 74 20 63 6f 6e 66 69 67 75 72 61 74   test configurat
30d0: 69 6f 6e 2e 20 20 54 68 65 20 64 65 66 61 75 6c  ion.  The defaul
30e0: 74 20 76 61 6c 75 65 20 75 73 65 64 0d 0a 20 20  t value used..  
30f0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 66 6f        #       fo
3100: 72 20 74 68 69 73 20 76 61 72 69 61 62 6c 65 20  r this variable 
3110: 69 73 20 74 79 70 69 63 61 6c 6c 79 20 22 52 65  is typically "Re
3120: 6c 65 61 73 65 22 2c 20 61 73 20 73 65 74 20 62  lease", as set b
3130: 79 20 74 68 65 20 74 65 73 74 0d 0a 20 20 20 20  y the test..    
3140: 20 20 20 20 23 20 20 20 20 20 20 20 73 75 69 74      #       suit
3150: 65 20 69 74 73 65 6c 66 2e 0d 0a 20 20 20 20 20  e itself...     
3160: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65     #..        re
3170: 74 75 72 6e 20 24 3a 3a 74 65 73 74 5f 63 6f 6e  turn $::test_con
3180: 66 69 67 75 72 61 74 69 6f 6e 0d 0a 20 20 20 20  figuration..    
3190: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
31a0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
31b0: 20 4e 4f 54 45 3a 20 4e 6f 72 6d 61 6c 6c 79 2c   NOTE: Normally,
31c0: 20 77 65 20 77 69 6c 6c 20 6e 65 76 65 72 20 68   we will never h
31d0: 69 74 20 74 68 69 73 20 63 61 73 65 20 62 65 63  it this case bec
31e0: 61 75 73 65 20 74 68 65 20 76 61 6c 75 65 20 6f  ause the value o
31f0: 66 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23  f the..        #
3200: 20 20 20 20 20 20 20 74 65 73 74 20 63 6f 6e 66         test conf
3210: 69 67 75 72 61 74 69 6f 6e 20 76 61 72 69 61 62  iguration variab
3220: 6c 65 20 69 73 20 61 6c 77 61 79 73 20 73 65 74  le is always set
3230: 20 62 79 20 74 68 65 20 74 65 73 74 20 73 75 69   by the test sui
3240: 74 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  te..        #   
3250: 20 20 20 20 69 74 73 65 6c 66 3b 20 68 6f 77 65      itself; howe
3260: 76 65 72 2c 20 69 74 20 63 61 6e 20 62 65 20 6f  ver, it can be o
3270: 76 65 72 72 69 64 64 65 6e 20 75 73 69 6e 67 20  verridden using 
3280: 74 68 65 20 75 6e 73 65 74 20 63 6f 6d 6d 61 6e  the unset comman
3290: 64 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  d..        #    
32a0: 20 20 20 66 72 6f 6d 20 74 68 65 20 2d 70 72 65     from the -pre
32b0: 54 65 73 74 20 6f 70 74 69 6f 6e 20 74 6f 20 74  Test option to t
32c0: 68 65 20 74 65 73 74 20 73 75 69 74 65 2e 0d 0a  he test suite...
32d0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
32e0: 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 65 61 67     return $::eag
32f0: 6c 65 5f 70 6c 61 74 66 6f 72 6d 28 63 6f 6e 66  le_platform(conf
3300: 69 67 75 72 61 74 69 6f 6e 29 0d 0a 20 20 20 20  iguration)..    
3310: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
3320: 20 20 20 70 72 6f 63 20 67 65 74 42 75 69 6c 64     proc getBuild
3330: 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20 7b  Configurations {
3340: 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
3350: 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 65 65 20      # NOTE: See 
3360: 69 66 20 74 68 65 20 6c 69 73 74 20 6f 66 20 74  if the list of t
3370: 65 73 74 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  est configuratio
3380: 6e 73 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72  ns has been over
3390: 72 69 64 64 65 6e 20 62 79 0d 0a 20 20 20 20 20  ridden by..     
33a0: 20 23 20 20 20 20 20 20 20 74 68 65 20 75 73 65   #       the use
33b0: 72 20 28 65 2e 67 2e 20 6f 6e 20 74 68 65 20 63  r (e.g. on the c
33c0: 6f 6d 6d 61 6e 64 20 6c 69 6e 65 29 2e 0d 0a 20  ommand line)... 
33d0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
33e0: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
33f0: 3a 74 65 73 74 5f 63 6f 6e 66 69 67 75 72 61 74  :test_configurat
3400: 69 6f 6e 73 5d 20 26 26 20 5c 0d 0a 20 20 20 20  ions] && \..    
3410: 20 20 20 20 20 20 5b 6c 6c 65 6e 67 74 68 20 24        [llength $
3420: 3a 3a 74 65 73 74 5f 63 6f 6e 66 69 67 75 72 61  ::test_configura
3430: 74 69 6f 6e 73 5d 20 3e 20 30 7d 20 74 68 65 6e  tions] > 0} then
3440: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
3450: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55         # NOTE: U
3460: 73 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64  se the specified
3470: 20 6c 69 73 74 20 6f 66 20 74 65 73 74 20 63 6f   list of test co
3480: 6e 66 69 67 75 72 61 74 69 6f 6e 73 2e 0d 0a 20  nfigurations... 
3490: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
34a0: 20 20 72 65 74 75 72 6e 20 24 3a 3a 74 65 73 74    return $::test
34b0: 5f 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 0d  _configurations.
34c0: 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
34d0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
34e0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20      # NOTE: Use 
34f0: 74 68 65 20 64 65 66 61 75 6c 74 20 6c 69 73 74  the default list
3500: 20 6f 66 20 74 65 73 74 20 63 6f 6e 66 69 67 75   of test configu
3510: 72 61 74 69 6f 6e 73 2e 0d 0a 20 20 20 20 20 20  rations...      
3520: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
3530: 75 72 6e 20 5b 6c 69 73 74 20 44 65 62 75 67 20  urn [list Debug 
3540: 52 65 6c 65 61 73 65 5d 0d 0a 20 20 20 20 20 20  Release]..      
3550: 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
3560: 20 70 72 6f 63 20 67 65 74 42 75 69 6c 64 42 61   proc getBuildBa
3570: 73 65 44 69 72 65 63 74 6f 72 79 20 7b 7d 20 7b  seDirectory {} {
3580: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
3590: 20 23 20 4e 4f 54 45 3a 20 46 69 67 75 72 65 20   # NOTE: Figure 
35a0: 6f 75 74 20 74 68 65 20 62 61 73 65 20 64 69 72  out the base dir
35b0: 65 63 74 6f 72 79 20 77 68 65 72 65 20 61 6c 6c  ectory where all
35c0: 20 74 68 65 20 62 75 69 6c 64 73 20 73 68 6f 75   the builds shou
35d0: 6c 64 20 62 65 0d 0a 20 20 20 20 20 20 23 20 20  ld be..      #  
35e0: 20 20 20 20 20 6c 6f 63 61 74 65 64 2e 20 20 54       located.  T
35f0: 68 69 73 20 77 69 6c 6c 20 62 65 20 74 68 65 20  his will be the 
3600: 64 69 72 65 63 74 6f 72 79 20 74 68 61 74 20 63  directory that c
3610: 6f 6e 74 61 69 6e 73 20 74 68 65 20 61 63 74 75  ontains the actu
3620: 61 6c 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  al..      #     
3630: 20 20 62 75 69 6c 64 20 6f 75 74 70 75 74 20 64    build output d
3640: 69 72 65 63 74 6f 72 79 20 28 65 2e 67 2e 20 70  irectory (e.g. p
3650: 61 72 65 6e 74 20 6f 66 20 22 62 69 6e 22 29 2e  arent of "bin").
3660: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
3670: 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
3680: 73 20 3a 3a 62 75 69 6c 64 5f 62 61 73 65 5f 64  s ::build_base_d
3690: 69 72 65 63 74 6f 72 79 5d 20 26 26 20 5c 0d 0a  irectory] && \..
36a0: 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e            [strin
36b0: 67 20 6c 65 6e 67 74 68 20 24 3a 3a 62 75 69 6c  g length $::buil
36c0: 64 5f 62 61 73 65 5f 64 69 72 65 63 74 6f 72 79  d_base_directory
36d0: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
36e0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
36f0: 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c 6f    # NOTE: The lo
3700: 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 62 75  cation of the bu
3710: 69 6c 64 20 62 61 73 65 20 64 69 72 65 63 74 6f  ild base directo
3720: 72 79 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72  ry has been over
3730: 72 69 64 64 65 6e 3b 0d 0a 20 20 20 20 20 20 20  ridden;..       
3740: 20 23 20 20 20 20 20 20 20 74 68 65 72 65 66 6f   #       therefo
3750: 72 65 2c 20 75 73 65 20 69 74 20 76 65 72 62 61  re, use it verba
3760: 74 69 6d 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  tim...        #.
3770: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
3780: 24 3a 3a 62 75 69 6c 64 5f 62 61 73 65 5f 64 69  $::build_base_di
3790: 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d  rectory..      }
37a0: 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20 65   elseif {[info e
37b0: 78 69 73 74 73 20 3a 3a 63 6f 6d 6d 6f 6e 5f 64  xists ::common_d
37c0: 69 72 65 63 74 6f 72 79 5d 20 26 26 20 5c 0d 0a  irectory] && \..
37d0: 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e            [strin
37e0: 67 20 6c 65 6e 67 74 68 20 24 3a 3a 63 6f 6d 6d  g length $::comm
37f0: 6f 6e 5f 64 69 72 65 63 74 6f 72 79 5d 20 3e 20  on_directory] > 
3800: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
3810: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
3820: 4e 4f 54 45 3a 20 4e 65 78 74 2c 20 66 61 6c 6c  NOTE: Next, fall
3830: 62 61 63 6b 20 74 6f 20 74 68 65 20 67 72 61 6e  back to the gran
3840: 64 70 61 72 65 6e 74 20 64 69 72 65 63 74 6f 72  dparent director
3850: 79 20 6f 66 20 74 68 65 20 6f 6e 65 0d 0a 20 20  y of the one..  
3860: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f        #       co
3870: 6e 74 61 69 6e 69 6e 67 20 74 68 69 73 20 66 69  ntaining this fi
3880: 6c 65 20 28 69 2e 65 2e 20 22 63 6f 6d 6d 6f 6e  le (i.e. "common
3890: 2e 65 61 67 6c 65 22 29 2c 20 69 66 20 61 76 61  .eagle"), if ava
38a0: 69 6c 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20 20  ilable...       
38b0: 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   #..        retu
38c0: 72 6e 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65  rn [file dirname
38d0: 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20 24   [file dirname $
38e0: 3a 3a 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f  ::common_directo
38f0: 72 79 5d 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c  ry]]..      } el
3900: 73 65 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73  seif {[info exis
3910: 74 73 20 3a 3a 70 61 74 68 5d 20 26 26 20 5c 0d  ts ::path] && \.
3920: 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69  .          [stri
3930: 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 70 61 74  ng length $::pat
3940: 68 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  h] > 0} then {..
3950: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
3960: 20 20 20 23 20 4e 4f 54 45 3a 20 46 69 6e 61 6c     # NOTE: Final
3970: 6c 79 2c 20 66 61 6c 6c 62 61 63 6b 20 74 6f 20  ly, fallback to 
3980: 74 68 65 20 70 61 72 65 6e 74 20 64 69 72 65 63  the parent direc
3990: 74 6f 72 79 20 6f 66 20 74 68 65 20 45 61 67 6c  tory of the Eagl
39a0: 65 54 65 73 74 0d 0a 20 20 20 20 20 20 20 20 23  eTest..        #
39b0: 20 20 20 20 20 20 20 70 61 74 68 2e 20 20 54 68         path.  Th
39c0: 65 20 45 61 67 6c 65 54 65 73 74 20 70 61 63 6b  e EagleTest pack
39d0: 61 67 65 20 67 75 61 72 61 6e 74 65 65 73 20 74  age guarantees t
39e0: 68 61 74 20 74 68 69 73 20 76 61 72 69 61 62 6c  hat this variabl
39f0: 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
3a00: 20 20 20 77 69 6c 6c 20 62 65 20 73 65 74 20 74     will be set t
3a10: 6f 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  o the directory 
3a20: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 66  containing the f
3a30: 69 72 73 74 20 66 69 6c 65 20 74 6f 0d 0a 20 20  irst file to..  
3a40: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 65 78        #       ex
3a50: 65 63 75 74 65 20 74 68 65 20 5b 72 75 6e 54 65  ecute the [runTe
3a60: 73 74 50 72 6f 6c 6f 67 75 65 5d 20 73 63 72 69  stPrologue] scri
3a70: 70 74 20 6c 69 62 72 61 72 79 20 70 72 6f 63 65  pt library proce
3a80: 64 75 72 65 2e 0d 0a 20 20 20 20 20 20 20 20 23  dure...        #
3a90: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
3aa0: 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20 24   [file dirname $
3ab0: 3a 3a 70 61 74 68 5d 0d 0a 20 20 20 20 20 20 7d  ::path]..      }
3ac0: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
3ad0: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
3ae0: 54 45 3a 20 4e 6f 20 70 61 74 68 20 69 73 20 61  TE: No path is a
3af0: 76 61 69 6c 61 62 6c 65 2c 20 72 65 74 75 72 6e  vailable, return
3b00: 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67   an empty string
3b10: 2e 20 20 54 68 69 73 20 70 6f 69 6e 74 0d 0a 20  .  This point.. 
3b20: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73         #       s
3b30: 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 72 65 61  hould not be rea
3b40: 63 68 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 23  ched...        #
3b50: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
3b60: 20 22 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20   ""..      }..  
3b70: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
3b80: 20 67 65 74 53 51 4c 69 74 65 54 65 73 74 44 61   getSQLiteTestDa
3b90: 74 61 50 61 74 68 20 7b 7d 20 7b 0d 0a 20 20 20  taPath {} {..   
3ba0: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
3bb0: 54 45 3a 20 46 69 67 75 72 65 20 6f 75 74 20 74  TE: Figure out t
3bc0: 68 65 20 64 69 72 65 63 74 6f 72 79 20 77 68 65  he directory whe
3bd0: 72 65 20 61 6c 6c 20 74 68 65 20 74 65 73 74 20  re all the test 
3be0: 64 61 74 61 20 66 69 6c 65 73 20 73 68 6f 75 6c  data files shoul
3bf0: 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  d..      #      
3c00: 20 62 65 20 6c 6f 63 61 74 65 64 2e 20 20 54 68   be located.  Th
3c10: 69 73 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65  is should be the
3c20: 20 22 64 61 74 61 22 20 64 69 72 65 63 74 6f 72   "data" director
3c30: 79 20 62 65 6e 65 61 74 68 20 74 68 65 0d 0a 20  y beneath the.. 
3c40: 20 20 20 20 20 23 20 20 20 20 20 20 20 64 69 72       #       dir
3c50: 65 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e  ectory containin
3c60: 67 20 74 68 65 20 61 63 74 75 61 6c 20 74 65 73  g the actual tes
3c70: 74 20 73 63 72 69 70 74 73 2e 0d 0a 20 20 20 20  t scripts...    
3c80: 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75 72    #..      retur
3c90: 6e 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 3a 3a  n [file join $::
3ca0: 70 61 74 68 20 64 61 74 61 5d 0d 0a 20 20 20 20  path data]..    
3cb0: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 69  }.....    proc i
3cc0: 73 52 75 6e 6e 69 6e 67 57 6f 57 36 34 20 7b 7d  sRunningWoW64 {}
3cd0: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
3ce0: 20 20 20 23 20 4e 4f 54 45 3a 20 46 6f 72 20 6e     # NOTE: For n
3cf0: 6f 77 2c 20 6a 75 73 74 20 75 73 65 20 74 68 65  ow, just use the
3d00: 20 65 78 69 73 74 69 6e 67 20 74 65 73 74 20 63   existing test c
3d10: 6f 6e 73 74 72 61 69 6e 74 20 66 6f 72 20 64 65  onstraint for de
3d20: 74 65 63 74 69 6e 67 0d 0a 20 20 20 20 20 20 23  tecting..      #
3d30: 20 20 20 20 20 20 20 61 20 57 6f 57 36 34 20 70         a WoW64 p
3d40: 72 6f 63 65 73 73 2e 0d 0a 20 20 20 20 20 20 23  rocess...      #
3d50: 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b  ..      return [
3d60: 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 77  haveConstraint w
3d70: 6f 77 36 34 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d  ow64]..    }....
3d80: 0a 20 20 20 20 70 72 6f 63 20 69 73 4d 69 78 65  .    proc isMixe
3d90: 64 4d 6f 64 65 41 73 73 65 6d 62 6c 79 20 7b 20  dModeAssembly { 
3da0: 66 69 6c 65 4e 61 6d 65 20 7b 76 61 72 4e 61 6d  fileName {varNam
3db0: 65 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  e ""} } {..     
3dc0: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
3dd0: 3a 20 46 69 72 73 74 2c 20 6d 61 6b 65 20 73 75  : First, make su
3de0: 72 65 20 74 68 65 20 74 65 73 74 20 73 75 69 74  re the test suit
3df0: 65 20 69 6e 66 72 61 73 74 72 75 63 74 75 72 65  e infrastructure
3e00: 20 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f 0d 0a   is allowed to..
3e10: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 75 73        #       us
3e20: 65 20 74 68 65 20 5b 65 78 65 63 5d 20 63 6f 6d  e the [exec] com
3e30: 6d 61 6e 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  mand...      #..
3e40: 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
3e50: 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 65 78 65   exists ::no(exe
3e60: 63 29 5d 20 26 26 20 21 5b 69 6e 66 6f 20 65 78  c)] && ![info ex
3e70: 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 72 46 6c 61  ists ::no(corFla
3e80: 67 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  gs)]} then {..  
3e90: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
3ea0: 20 23 20 4e 4f 54 45 3a 20 49 66 20 74 68 65 20   # NOTE: If the 
3eb0: 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 43 6f 72 46  location of CorF
3ec0: 6c 61 67 73 20 69 73 20 70 72 65 73 65 6e 74 20  lags is present 
3ed0: 69 6e 20 74 68 65 20 65 6e 76 69 72 6f 6e 6d 65  in the environme
3ee0: 6e 74 2c 0d 0a 20 20 20 20 20 20 20 20 23 20 20  nt,..        #  
3ef0: 20 20 20 20 20 75 73 65 20 69 74 3b 20 6f 74 68       use it; oth
3f00: 65 72 77 69 73 65 20 61 73 73 75 6d 65 20 69 74  erwise assume it
3f10: 20 69 73 20 69 6e 20 74 68 65 20 50 41 54 48 2e   is in the PATH.
3f20: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
3f30: 20 20 20 20 20 73 65 74 20 63 6f 72 46 6c 61 67       set corFlag
3f40: 73 20 5b 65 78 70 72 20 7b 0d 0a 20 20 20 20 20  s [expr {..     
3f50: 20 20 20 20 20 5b 69 6e 66 6f 20 65 78 69 73 74       [info exist
3f60: 73 20 3a 3a 65 6e 76 28 43 6f 72 46 6c 61 67 73  s ::env(CorFlags
3f70: 29 5d 20 3f 20 24 3a 3a 65 6e 76 28 43 6f 72 46  )] ? $::env(CorF
3f80: 6c 61 67 73 29 20 3a 20 22 43 6f 72 46 6c 61 67  lags) : "CorFlag
3f90: 73 22 0d 0a 20 20 20 20 20 20 20 20 7d 5d 0d 0a  s"..        }]..
3fa0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
3fb0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74       # NOTE: Att
3fc0: 65 6d 70 74 20 74 6f 20 65 78 65 63 75 74 65 20  empt to execute 
3fd0: 43 6f 72 46 6c 61 67 73 20 6f 6e 20 74 68 65 20  CorFlags on the 
3fe0: 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 2e 0d  specified file..
3ff0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
4000: 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
4010: 0d 0a 20 20 20 20 20 20 20 20 20 20 65 78 65 63  ..          exec
4020: 20 2d 2d 20 24 63 6f 72 46 6c 61 67 73 20 5b 66   -- $corFlags [f
4030: 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 24  ile nativename $
4040: 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20 20 20  fileName]..     
4050: 20 20 20 7d 20 65 78 65 63 5d 20 3d 3d 20 30 7d     } exec] == 0}
4060: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
4070: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
4080: 23 20 4e 4f 54 45 3a 20 49 66 20 72 65 71 75 65  # NOTE: If reque
4090: 73 74 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c  sted by our call
40a0: 65 72 2c 20 61 74 74 65 6d 70 74 20 74 6f 20 64  er, attempt to d
40b0: 65 74 65 72 6d 69 6e 65 20 74 68 65 0d 0a 20 20  etermine the..  
40c0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
40d0: 70 6c 61 74 66 6f 72 6d 20 66 6f 72 20 74 68 65  platform for the
40e0: 20 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 20   specified file 
40f0: 61 73 20 77 65 6c 6c 2e 0d 0a 20 20 20 20 20 20  as well...      
4100: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
4110: 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
4120: 67 74 68 20 24 76 61 72 4e 61 6d 65 5d 20 3e 20  gth $varName] > 
4130: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
4140: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
4150: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 74        # NOTE: St
4160: 6f 72 65 20 74 68 65 20 70 6c 61 74 66 6f 72 6d  ore the platform
4170: 20 69 6e 20 74 68 65 20 6e 61 6d 65 64 20 76 61   in the named va
4180: 72 69 61 62 6c 65 20 69 6e 20 74 68 65 0d 0a 20  riable in the.. 
4190: 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20             #    
41a0: 20 20 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75     context of ou
41b0: 72 20 63 61 6c 6c 65 72 2e 0d 0a 20 20 20 20 20  r caller...     
41c0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
41d0: 20 20 20 20 20 20 75 70 76 61 72 20 31 20 24 76        upvar 1 $v
41e0: 61 72 4e 61 6d 65 20 70 6c 61 74 66 6f 72 6d 0d  arName platform.
41f0: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  ...            #
4200: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20  ..            # 
4210: 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f  NOTE: Attempt to
4220: 20 65 78 74 72 61 63 74 20 74 68 65 20 50 45 20   extract the PE 
4230: 6c 69 6e 65 20 66 72 6f 6d 20 74 68 65 20 63 61  line from the ca
4240: 70 74 75 72 65 64 0d 0a 20 20 20 20 20 20 20 20  ptured..        
4250: 20 20 20 20 23 20 20 20 20 20 20 20 6f 75 74 70      #       outp
4260: 75 74 2e 20 20 49 66 20 74 68 69 73 20 76 61 6c  ut.  If this val
4270: 75 65 20 69 73 20 22 50 45 33 32 22 20 6f 72 20  ue is "PE32" or 
4280: 22 50 45 33 32 2b 22 2c 20 74 68 65 0d 0a 20 20  "PE32+", the..  
4290: 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
42a0: 20 20 61 73 73 65 6d 62 6c 79 20 66 69 6c 65 20    assembly file 
42b0: 69 73 20 33 32 2d 62 69 74 20 6f 72 20 36 34 2d  is 32-bit or 64-
42c0: 62 69 74 2c 20 72 65 73 70 65 63 74 69 76 65 6c  bit, respectivel
42d0: 79 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  y;..            
42e0: 23 20 20 20 20 20 20 20 6f 74 68 65 72 77 69 73  #       otherwis
42f0: 65 2c 20 69 74 73 20 74 79 70 65 20 69 73 20 75  e, its type is u
4300: 6e 6b 6e 6f 77 6e 2e 0d 0a 20 20 20 20 20 20 20  nknown...       
4310: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
4320: 20 20 20 20 73 65 74 20 70 61 74 74 65 72 6e 20      set pattern 
4330: 7b 5e 50 45 20 20 20 20 20 20 20 20 3a 20 28 50  {^PE        : (P
4340: 45 33 32 7c 50 45 33 32 5c 2b 29 5c 73 2b 24 7d  E32|PE32\+)\s+$}
4350: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
4360: 69 66 20 7b 5b 72 65 67 65 78 70 20 2d 6c 69 6e  if {[regexp -lin
4370: 65 20 2d 2d 20 24 70 61 74 74 65 72 6e 20 24 65  e -- $pattern $e
4380: 78 65 63 20 64 75 6d 6d 79 20 70 65 33 32 5d 7d  xec dummy pe32]}
4390: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
43a0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
43b0: 20 20 20 20 20 20 20 20 23 20 48 41 43 4b 3a 20          # HACK: 
43c0: 54 68 69 73 20 5b 73 77 69 74 63 68 5d 20 61 73  This [switch] as
43d0: 73 75 6d 65 73 20 74 68 61 74 20 33 32 2d 62 69  sumes that 32-bi
43e0: 74 20 65 78 65 63 75 74 61 62 6c 65 73 20 61 72  t executables ar
43f0: 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e..             
4400: 20 23 20 20 20 20 20 20 20 61 6c 77 61 79 73 20   #       always 
4410: 78 38 36 20 61 6e 64 20 74 68 61 74 20 36 34 2d  x86 and that 64-
4420: 62 69 74 20 65 78 65 63 75 74 61 62 6c 65 73 20  bit executables 
4430: 61 72 65 20 61 6c 77 61 79 73 0d 0a 20 20 20 20  are always..    
4440: 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
4450: 20 20 78 36 34 2e 0d 0a 20 20 20 20 20 20 20 20    x64...        
4460: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
4470: 20 20 20 20 20 20 20 73 77 69 74 63 68 20 2d 65         switch -e
4480: 78 61 63 74 20 2d 2d 20 24 70 65 33 32 20 7b 0d  xact -- $pe32 {.
4490: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
44a0: 20 50 45 33 32 20 7b 0d 0a 20 20 20 20 20 20 20   PE32 {..       
44b0: 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 70             set p
44c0: 6c 61 74 66 6f 72 6d 20 57 69 6e 33 32 0d 0a 20  latform Win32.. 
44d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
44e0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
44f0: 20 20 50 45 33 32 2b 20 7b 0d 0a 20 20 20 20 20    PE32+ {..     
4500: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74               set
4510: 20 70 6c 61 74 66 6f 72 6d 20 78 36 34 0d 0a 20   platform x64.. 
4520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
4530: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
4540: 20 20 64 65 66 61 75 6c 74 20 7b 0d 0a 20 20 20    default {..   
4550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
4560: 65 74 20 70 6c 61 74 66 6f 72 6d 20 22 22 0d 0a  et platform ""..
4570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4580: 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  }..             
4590: 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
45a0: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
45b0: 20 20 20 20 20 20 20 20 73 65 74 20 70 6c 61 74          set plat
45c0: 66 6f 72 6d 20 22 22 0d 0a 20 20 20 20 20 20 20  form ""..       
45d0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
45e0: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
45f0: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
4600: 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f  NOTE: Attempt to
4610: 20 65 78 74 72 61 63 74 20 74 68 65 20 49 4c 4f   extract the ILO
4620: 4e 4c 59 20 6c 69 6e 65 20 66 72 6f 6d 20 74 68  NLY line from th
4630: 65 20 63 61 70 74 75 72 65 64 0d 0a 20 20 20 20  e captured..    
4640: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6f 75        #       ou
4650: 74 70 75 74 2e 20 20 49 66 20 74 68 69 73 20 76  tput.  If this v
4660: 61 6c 75 65 20 69 73 20 7a 65 72 6f 2c 20 74 68  alue is zero, th
4670: 65 20 73 70 65 63 69 66 69 65 64 20 66 69 6c 65  e specified file
4680: 20 6d 75 73 74 0d 0a 20 20 20 20 20 20 20 20 20   must..         
4690: 20 23 20 20 20 20 20 20 20 62 65 20 61 20 6d 69   #       be a mi
46a0: 78 65 64 2d 6d 6f 64 65 20 61 73 73 65 6d 62 6c  xed-mode assembl
46b0: 79 3b 20 6f 74 68 65 72 77 69 73 65 2c 20 69 74  y; otherwise, it
46c0: 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79 0d 0a   contains only..
46d0: 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
46e0: 20 20 6d 61 6e 61 67 65 64 20 63 6f 6d 70 6f 6e    managed compon
46f0: 65 6e 74 73 2e 0d 0a 20 20 20 20 20 20 20 20 20  ents...         
4700: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   #..          se
4710: 74 20 70 61 74 74 65 72 6e 20 7b 5e 49 4c 4f 4e  t pattern {^ILON
4720: 4c 59 20 20 20 20 3a 20 28 30 7c 31 29 5c 73 2b  LY    : (0|1)\s+
4730: 24 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  $}....          
4740: 69 66 20 7b 21 5b 72 65 67 65 78 70 20 2d 6c 69  if {![regexp -li
4750: 6e 65 20 2d 2d 20 24 70 61 74 74 65 72 6e 20 24  ne -- $pattern $
4760: 65 78 65 63 20 64 75 6d 6d 79 20 69 6c 4f 6e 6c  exec dummy ilOnl
4770: 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  y]} then {..    
4780: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 66          return f
4790: 61 6c 73 65 0d 0a 20 20 20 20 20 20 20 20 20 20  alse..          
47a0: 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69  }....          i
47b0: 66 20 7b 21 24 69 6c 4f 6e 6c 79 7d 20 74 68 65  f {!$ilOnly} the
47c0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
47d0: 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20   return true..  
47e0: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
47f0: 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d     }..      }...
4800: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
4810: 23 20 4e 4f 54 45 3a 20 49 66 20 74 68 65 20 74  # NOTE: If the t
4820: 65 73 74 20 73 75 69 74 65 20 63 61 6e 6e 6f 74  est suite cannot
4830: 20 75 73 65 20 5b 65 78 65 63 5d 20 6f 72 20 65   use [exec] or e
4840: 78 65 63 75 74 69 6f 6e 20 6f 66 20 43 6f 72 46  xecution of CorF
4850: 6c 61 67 73 0d 0a 20 20 20 20 20 20 23 20 20 20  lags..      #   
4860: 20 20 20 20 66 61 69 6c 65 64 2c 20 72 65 74 75      failed, retu
4870: 72 6e 20 66 61 6c 73 65 2e 0d 0a 20 20 20 20 20  rn false...     
4880: 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e   #..      return
4890: 20 66 61 6c 73 65 0d 0a 20 20 20 20 7d 0d 0a 0c   false..    }...
48a0: 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 4e 61  ..    proc getNa
48b0: 74 69 76 65 4c 69 62 72 61 72 79 46 69 6c 65 4e  tiveLibraryFileN
48c0: 61 6d 65 73 4f 6e 6c 79 20 7b 7d 20 7b 0d 0a 20  amesOnly {} {.. 
48d0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
48e0: 4e 4f 54 45 3a 20 46 69 72 73 74 2c 20 63 68 65  NOTE: First, che
48f0: 63 6b 20 69 66 20 74 68 65 20 6c 69 73 74 20 6f  ck if the list o
4900: 66 20 6e 61 74 69 76 65 20 6c 69 62 72 61 72 79  f native library
4910: 20 66 69 6c 65 20 6e 61 6d 65 73 20 68 61 73 20   file names has 
4920: 62 65 65 6e 0d 0a 20 20 20 20 20 20 23 20 20 20  been..      #   
4930: 20 20 20 20 6d 61 6e 75 61 6c 6c 79 20 6f 76 65      manually ove
4940: 72 72 69 64 64 65 6e 2e 0d 0a 20 20 20 20 20 20  rridden...      
4950: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e  #..      if {[in
4960: 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 61 74 69  fo exists ::nati
4970: 76 65 5f 6c 69 62 72 61 72 79 5f 66 69 6c 65 5f  ve_library_file_
4980: 6e 61 6d 65 73 5d 20 26 26 20 5c 0d 0a 20 20 20  names] && \..   
4990: 20 20 20 20 20 20 20 5b 6c 6c 65 6e 67 74 68 20         [llength 
49a0: 24 3a 3a 6e 61 74 69 76 65 5f 6c 69 62 72 61 72  $::native_librar
49b0: 79 5f 66 69 6c 65 5f 6e 61 6d 65 73 5d 20 3e 20  y_file_names] > 
49c0: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
49d0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
49e0: 4e 4f 54 45 3a 20 54 68 65 20 6c 69 73 74 20 6f  NOTE: The list o
49f0: 66 20 6e 61 74 69 76 65 20 6c 69 62 72 61 72 79  f native library
4a00: 20 66 69 6c 65 20 6e 61 6d 65 73 20 68 61 73 20   file names has 
4a10: 62 65 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b  been overridden;
4a20: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
4a30: 20 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65    therefore, use
4a40: 20 69 74 20 76 65 72 62 61 74 69 6d 2e 0d 0a 20   it verbatim... 
4a50: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
4a60: 20 20 72 65 74 75 72 6e 20 24 3a 3a 6e 61 74 69    return $::nati
4a70: 76 65 5f 6c 69 62 72 61 72 79 5f 66 69 6c 65 5f  ve_library_file_
4a80: 6e 61 6d 65 73 0d 0a 20 20 20 20 20 20 7d 20 65  names..      } e
4a90: 6c 73 65 69 66 20 7b 5b 69 73 57 69 6e 64 6f 77  lseif {[isWindow
4aa0: 73 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  s]} then {..    
4ab0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
4ac0: 20 4e 4f 54 45 3a 20 4f 74 68 65 72 77 69 73 65   NOTE: Otherwise
4ad0: 2c 20 6f 6e 20 57 69 6e 64 6f 77 73 2c 20 61 6c  , on Windows, al
4ae0: 77 61 79 73 20 75 73 65 20 74 68 65 20 64 65 66  ways use the def
4af0: 61 75 6c 74 20 66 69 6c 65 20 6e 61 6d 65 0d 0a  ault file name..
4b00: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
4b10: 22 73 71 6c 69 74 65 33 2e 64 6c 6c 22 2e 0d 0a  "sqlite3.dll"...
4b20: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
4b30: 20 20 20 72 65 74 75 72 6e 20 5b 6c 69 73 74 20     return [list 
4b40: 73 71 6c 69 74 65 33 2e 64 6c 6c 5d 0d 0a 20 20  sqlite3.dll]..  
4b50: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
4b60: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
4b70: 20 23 20 4e 4f 54 45 3a 20 4f 74 68 65 72 77 69   # NOTE: Otherwi
4b80: 73 65 2c 20 72 65 74 75 72 6e 20 62 6f 74 68 20  se, return both 
4b90: 74 68 65 20 67 65 6e 65 72 69 63 20 50 4f 53 49  the generic POSI
4ba0: 58 20 66 69 6c 65 20 6e 61 6d 65 20 61 6e 64 20  X file name and 
4bb0: 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  the..        #  
4bc0: 20 20 20 20 20 4d 61 63 20 4f 53 20 58 20 66 69       Mac OS X fi
4bd0: 6c 65 20 6e 61 6d 65 2c 20 73 69 6e 63 65 20 77  le name, since w
4be0: 65 20 64 6f 20 6e 6f 74 20 63 75 72 72 65 6e 74  e do not current
4bf0: 6c 79 20 68 61 76 65 20 61 6e 20 65 61 73 79 0d  ly have an easy.
4c00: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
4c10: 20 77 61 79 20 74 6f 20 64 65 74 65 63 74 20 77   way to detect w
4c20: 68 69 63 68 20 6f 66 20 74 68 6f 73 65 20 70 6c  hich of those pl
4c30: 61 74 66 6f 72 6d 73 20 77 65 20 61 72 65 20 72  atforms we are r
4c40: 75 6e 6e 69 6e 67 20 6f 6e 2e 0d 0a 20 20 20 20  unning on...    
4c50: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
4c60: 65 74 75 72 6e 20 5b 6c 69 73 74 20 6c 69 62 73  eturn [list libs
4c70: 71 6c 69 74 65 33 2e 64 79 6c 69 62 20 6c 69 62  qlite3.dylib lib
4c80: 73 71 6c 69 74 65 33 2e 73 6f 5d 0d 0a 20 20 20  sqlite3.so]..   
4c90: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
4ca0: 20 20 20 20 70 72 6f 63 20 67 65 74 49 6e 74 65      proc getInte
4cb0: 72 6f 70 41 73 73 65 6d 62 6c 79 46 69 6c 65 4e  ropAssemblyFileN
4cc0: 61 6d 65 73 4f 6e 6c 79 20 7b 7d 20 7b 0d 0a 20  amesOnly {} {.. 
4cd0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
4ce0: 4e 4f 54 45 3a 20 46 69 72 73 74 2c 20 63 68 65  NOTE: First, che
4cf0: 63 6b 20 69 66 20 74 68 65 20 6c 69 73 74 20 6f  ck if the list o
4d00: 66 20 69 6e 74 65 72 6f 70 20 61 73 73 65 6d 62  f interop assemb
4d10: 6c 79 20 66 69 6c 65 20 6e 61 6d 65 73 20 68 61  ly file names ha
4d20: 73 20 62 65 65 6e 0d 0a 20 20 20 20 20 20 23 20  s been..      # 
4d30: 20 20 20 20 20 20 6d 61 6e 75 61 6c 6c 79 20 6f        manually o
4d40: 76 65 72 72 69 64 64 65 6e 2e 0d 0a 20 20 20 20  verridden...    
4d50: 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
4d60: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 69 6e  info exists ::in
4d70: 74 65 72 6f 70 5f 61 73 73 65 6d 62 6c 79 5f 66  terop_assembly_f
4d80: 69 6c 65 5f 6e 61 6d 65 73 5d 20 26 26 20 5c 0d  ile_names] && \.
4d90: 0a 20 20 20 20 20 20 20 20 20 20 5b 6c 6c 65 6e  .          [llen
4da0: 67 74 68 20 24 3a 3a 69 6e 74 65 72 6f 70 5f 61  gth $::interop_a
4db0: 73 73 65 6d 62 6c 79 5f 66 69 6c 65 5f 6e 61 6d  ssembly_file_nam
4dc0: 65 73 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  es] > 0} then {.
4dd0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
4de0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20      # NOTE: The 
4df0: 6c 69 73 74 20 6f 66 20 69 6e 74 65 72 6f 70 20  list of interop 
4e00: 61 73 73 65 6d 62 6c 79 20 66 69 6c 65 20 6e 61  assembly file na
4e10: 6d 65 73 20 68 61 73 20 62 65 65 6e 20 6f 76 65  mes has been ove
4e20: 72 72 69 64 64 65 6e 3b 0d 0a 20 20 20 20 20 20  rridden;..      
4e30: 20 20 23 20 20 20 20 20 20 20 74 68 65 72 65 66    #       theref
4e40: 6f 72 65 2c 20 75 73 65 20 69 74 20 76 65 72 62  ore, use it verb
4e50: 61 74 69 6d 2e 0d 0a 20 20 20 20 20 20 20 20 23  atim...        #
4e60: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
4e70: 20 24 3a 3a 69 6e 74 65 72 6f 70 5f 61 73 73 65   $::interop_asse
4e80: 6d 62 6c 79 5f 66 69 6c 65 5f 6e 61 6d 65 73 0d  mbly_file_names.
4e90: 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20  .      } elseif 
4ea0: 7b 5b 69 73 57 69 6e 64 6f 77 73 5d 7d 20 74 68  {[isWindows]} th
4eb0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
4ec0: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
4ed0: 20 4f 74 68 65 72 77 69 73 65 2c 20 6f 6e 20 57   Otherwise, on W
4ee0: 69 6e 64 6f 77 73 2c 20 61 6c 77 61 79 73 20 75  indows, always u
4ef0: 73 65 20 74 68 65 20 64 65 66 61 75 6c 74 20 66  se the default f
4f00: 69 6c 65 20 6e 61 6d 65 0d 0a 20 20 20 20 20 20  ile name..      
4f10: 20 20 23 20 20 20 20 20 20 20 22 53 51 4c 69 74    #       "SQLit
4f20: 65 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c 22 2e 0d  e.Interop.dll"..
4f30: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
4f40: 20 20 20 20 72 65 74 75 72 6e 20 5b 6c 69 73 74      return [list
4f50: 20 53 51 4c 69 74 65 2e 49 6e 74 65 72 6f 70 2e   SQLite.Interop.
4f60: 64 6c 6c 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c  dll]..      } el
4f70: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  se {..        #.
4f80: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
4f90: 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75   Otherwise, retu
4fa0: 72 6e 20 62 6f 74 68 20 74 68 65 20 67 65 6e 65  rn both the gene
4fb0: 72 69 63 20 50 4f 53 49 58 20 66 69 6c 65 20 6e  ric POSIX file n
4fc0: 61 6d 65 20 61 6e 64 20 74 68 65 0d 0a 20 20 20  ame and the..   
4fd0: 20 20 20 20 20 23 20 20 20 20 20 20 20 4d 61 63       #       Mac
4fe0: 20 4f 53 20 58 20 66 69 6c 65 20 6e 61 6d 65 2c   OS X file name,
4ff0: 20 73 69 6e 63 65 20 77 65 20 64 6f 20 6e 6f 74   since we do not
5000: 20 63 75 72 72 65 6e 74 6c 79 20 68 61 76 65 20   currently have 
5010: 61 6e 20 65 61 73 79 0d 0a 20 20 20 20 20 20 20  an easy..       
5020: 20 23 20 20 20 20 20 20 20 77 61 79 20 74 6f 20   #       way to 
5030: 64 65 74 65 63 74 20 77 68 69 63 68 20 6f 66 20  detect which of 
5040: 74 68 6f 73 65 20 70 6c 61 74 66 6f 72 6d 73 20  those platforms 
5050: 77 65 20 61 72 65 20 72 75 6e 6e 69 6e 67 20 6f  we are running o
5060: 6e 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  n...        #.. 
5070: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6c         return [l
5080: 69 73 74 20 6c 69 62 53 51 4c 69 74 65 2e 49 6e  ist libSQLite.In
5090: 74 65 72 6f 70 2e 64 79 6c 69 62 20 6c 69 62 53  terop.dylib libS
50a0: 51 4c 69 74 65 2e 49 6e 74 65 72 6f 70 2e 73 6f  QLite.Interop.so
50b0: 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  ]..      }..    
50c0: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67  }.....    proc g
50d0: 65 74 43 6f 72 65 45 78 74 65 6e 73 69 6f 6e 42  etCoreExtensionB
50e0: 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 7b 20  inaryFileName { 
50f0: 7b 64 65 66 61 75 6c 74 20 22 22 7d 20 7d 20 7b  {default ""} } {
5100: 0d 0a 20 20 20 20 20 20 73 65 74 20 66 69 6c 65  ..      set file
5110: 4e 61 6d 65 20 5b 67 65 74 43 6f 72 65 42 69 6e  Name [getCoreBin
5120: 61 72 79 46 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a  aryFileName]....
5130: 20 20 20 20 20 20 69 66 20 7b 5b 66 69 6c 65 20        if {[file 
5140: 65 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65  exists $fileName
5150: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
5160: 20 20 20 72 65 74 75 72 6e 20 24 66 69 6c 65 4e     return $fileN
5170: 61 6d 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  ame..      }....
5180: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 64 65        return $de
5190: 66 61 75 6c 74 0d 0a 20 20 20 20 7d 0d 0a 0c 0d  fault..    }....
51a0: 0a 20 20 20 20 70 72 6f 63 20 69 73 42 75 69 6c  .    proc isBuil
51b0: 64 41 76 61 69 6c 61 62 6c 65 20 7b 20 6e 61 74  dAvailable { nat
51c0: 69 76 65 20 64 69 72 65 63 74 6f 72 79 20 7b 76  ive directory {v
51d0: 61 72 4e 61 6d 65 20 22 22 7d 20 7d 20 7b 0d 0a  arName ""} } {..
51e0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
51f0: 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74 68 65   NOTE: Build the
5200: 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64   fully qualified
5210: 20 66 69 6c 65 20 6e 61 6d 65 20 66 6f 72 20 74   file name for t
5220: 68 65 20 70 72 69 6d 61 72 79 20 61 73 73 65 6d  he primary assem
5230: 62 6c 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20  bly..      #    
5240: 20 20 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68     containing th
5250: 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  e System.Data.SQ
5260: 4c 69 74 65 20 6d 61 6e 61 67 65 64 20 63 6f 6d  Lite managed com
5270: 70 6f 6e 65 6e 74 73 2e 20 20 49 74 0d 0a 20 20  ponents.  It..  
5280: 20 20 20 20 23 20 20 20 20 20 20 20 73 68 6f 75      #       shou
5290: 6c 64 20 62 65 20 6e 6f 74 65 64 20 74 68 61 74  ld be noted that
52a0: 20 74 68 69 73 20 61 73 73 65 6d 62 6c 79 20 66   this assembly f
52b0: 69 6c 65 20 6d 61 79 20 61 6c 73 6f 20 63 6f 6e  ile may also con
52c0: 74 61 69 6e 20 74 68 65 0d 0a 20 20 20 20 20 20  tain the..      
52d0: 23 20 20 20 20 20 20 20 6e 61 74 69 76 65 20 63  #       native c
52e0: 6f 6d 70 6f 6e 65 6e 74 73 2c 20 69 66 20 61 20  omponents, if a 
52f0: 6e 61 74 69 76 65 20 62 75 69 6c 64 20 69 73 20  native build is 
5300: 69 6e 20 75 73 65 2e 0d 0a 20 20 20 20 20 20 23  in use...      #
5310: 0d 0a 20 20 20 20 20 20 73 65 74 20 66 69 6c 65  ..      set file
5320: 4e 61 6d 65 20 5b 66 69 6c 65 20 6e 61 74 69 76  Name [file nativ
5330: 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e  ename [file join
5340: 20 24 64 69 72 65 63 74 6f 72 79 20 5c 0d 0a 20   $directory \.. 
5350: 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e           System.
5360: 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 5d  Data.SQLite.dll]
5370: 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 21  ]....      if {!
5380: 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 66 69  [file exists $fi
5390: 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d  leName]} then {.
53a0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
53b0: 66 61 6c 73 65 0d 0a 20 20 20 20 20 20 7d 0d 0a  false..      }..
53c0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
53d0: 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74   # NOTE: Attempt
53e0: 20 74 6f 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   to automaticall
53f0: 79 20 64 65 74 65 63 74 20 69 66 20 74 68 65 20  y detect if the 
5400: 70 72 69 6d 61 72 79 20 61 73 73 65 6d 62 6c 79  primary assembly
5410: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
5420: 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 6e 61 74  contains any nat
5430: 69 76 65 20 63 6f 6d 70 6f 6e 65 6e 74 73 2c 20  ive components, 
5440: 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0d 0a 20  if necessary... 
5450: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
5460: 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   {[string length
5470: 20 24 6e 61 74 69 76 65 5d 20 3d 3d 20 30 7d 20   $native] == 0} 
5480: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
5490: 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
54a0: 74 68 20 24 76 61 72 4e 61 6d 65 5d 20 3e 20 30  th $varName] > 0
54b0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
54c0: 20 20 20 20 75 70 76 61 72 20 31 20 24 76 61 72      upvar 1 $var
54d0: 4e 61 6d 65 20 24 76 61 72 4e 61 6d 65 0d 0a 20  Name $varName.. 
54e0: 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
54f0: 20 20 20 20 73 65 74 20 6e 61 74 69 76 65 20 5b      set native [
5500: 69 73 4d 69 78 65 64 4d 6f 64 65 41 73 73 65 6d  isMixedModeAssem
5510: 62 6c 79 20 24 66 69 6c 65 4e 61 6d 65 20 24 76  bly $fileName $v
5520: 61 72 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20 7d  arName]..      }
5530: 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
5540: 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 74 68     # NOTE: If th
5550: 65 20 70 72 69 6d 61 72 79 20 61 73 73 65 6d 62  e primary assemb
5560: 6c 79 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 73  ly also contains
5570: 20 74 68 65 20 6e 61 74 69 76 65 20 63 6f 6d 70   the native comp
5580: 6f 6e 65 6e 74 73 2c 0d 0a 20 20 20 20 20 20 23  onents,..      #
5590: 20 20 20 20 20 20 20 77 65 20 68 61 76 65 20 65         we have e
55a0: 76 65 72 79 74 68 69 6e 67 20 77 65 20 6e 65 65  verything we nee
55b0: 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  d...      #..   
55c0: 20 20 20 69 66 20 7b 24 6e 61 74 69 76 65 7d 20     if {$native} 
55d0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
55e0: 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20  return true..   
55f0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
5600: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49  .      # NOTE: I
5610: 66 20 74 68 65 20 6d 61 63 68 69 6e 65 20 6e 61  f the machine na
5620: 6d 65 20 69 73 20 75 6e 61 76 61 69 6c 61 62 6c  me is unavailabl
5630: 65 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 74 68  e, there is noth
5640: 69 67 6e 20 65 6c 73 65 20 77 65 0d 0a 20 20 20  ign else we..   
5650: 20 20 20 23 20 20 20 20 20 20 20 63 61 6e 20 64     #       can d
5660: 6f 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  o...      #..   
5670: 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
5680: 69 73 74 73 20 3a 3a 74 63 6c 5f 70 6c 61 74 66  ists ::tcl_platf
5690: 6f 72 6d 28 6d 61 63 68 69 6e 65 29 5d 7d 20 74  orm(machine)]} t
56a0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72  hen {..        r
56b0: 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20  eturn false..   
56c0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
56d0: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57  .      # NOTE: W
56e0: 68 61 74 20 69 73 20 74 68 65 20 61 72 63 68 69  hat is the archi
56f0: 74 65 63 74 75 72 65 20 66 6f 72 20 74 68 69 73  tecture for this
5700: 20 6d 61 63 68 69 6e 65 3f 0d 0a 20 20 20 20 20   machine?..     
5710: 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 61 72   #..      set ar
5720: 63 68 69 74 65 63 74 75 72 65 20 5b 6d 61 63 68  chitecture [mach
5730: 69 6e 65 54 6f 50 6c 61 74 66 6f 72 6d 20 24 3a  ineToPlatform $:
5740: 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 6d 61  :tcl_platform(ma
5750: 63 68 69 6e 65 29 20 74 72 75 65 5d 0d 0a 0d 0a  chine) true]....
5760: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
5770: 20 4e 4f 54 45 3a 20 57 68 61 74 20 69 73 20 74   NOTE: What is t
5780: 68 65 20 70 6c 61 74 66 6f 72 6d 20 66 6f 72 20  he platform for 
5790: 74 68 69 73 20 6d 61 63 68 69 6e 65 3f 0d 0a 20  this machine?.. 
57a0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65       #..      se
57b0: 74 20 70 6c 61 74 66 6f 72 6d 20 5b 6d 61 63 68  t platform [mach
57c0: 69 6e 65 54 6f 50 6c 61 74 66 6f 72 6d 20 24 3a  ineToPlatform $:
57d0: 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 6d 61  :tcl_platform(ma
57e0: 63 68 69 6e 65 29 5d 0d 0a 0d 0a 20 20 20 20 20  chine)]....     
57f0: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
5800: 3a 20 42 75 69 6c 64 20 74 68 65 20 66 75 6c 6c  : Build the full
5810: 79 20 71 75 61 6c 69 66 69 65 64 20 66 69 6c 65  y qualified file
5820: 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 69 6e   name for the in
5830: 74 65 72 6f 70 20 61 73 73 65 6d 62 6c 79 0d 0a  terop assembly..
5840: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f        #       co
5850: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 53 79 73  ntaining the Sys
5860: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20  tem.Data.SQLite 
5870: 6e 61 74 69 76 65 20 63 6f 6d 70 6f 6e 65 6e 74  native component
5880: 73 2e 20 20 49 66 20 74 68 69 73 0d 0a 20 20 20  s.  If this..   
5890: 20 20 20 23 20 20 20 20 20 20 20 66 69 6c 65 20     #       file 
58a0: 65 78 69 73 74 73 2c 20 77 65 20 73 68 6f 75 6c  exists, we shoul
58b0: 64 20 68 61 76 65 20 65 76 65 72 79 74 68 69 6e  d have everythin
58c0: 67 20 77 65 20 6e 65 65 64 2e 0d 0a 20 20 20 20  g we need...    
58d0: 20 20 23 0d 0a 20 20 20 20 20 20 66 6f 72 65 61    #..      forea
58e0: 63 68 20 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20  ch fileNameOnly 
58f0: 5b 67 65 74 49 6e 74 65 72 6f 70 41 73 73 65 6d  [getInteropAssem
5900: 62 6c 79 46 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79  blyFileNamesOnly
5910: 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74  ] {..        set
5920: 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20   fileName [file 
5930: 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65  nativename [file
5940: 20 6a 6f 69 6e 20 24 64 69 72 65 63 74 6f 72 79   join $directory
5950: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
5960: 24 61 72 63 68 69 74 65 63 74 75 72 65 20 24 66  $architecture $f
5970: 69 6c 65 4e 61 6d 65 4f 6e 6c 79 5d 5d 0d 0a 0d  ileNameOnly]]...
5980: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 66 69  .        if {[fi
5990: 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c 65 4e  le exists $fileN
59a0: 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ame]} then {..  
59b0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74          return t
59c0: 72 75 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  rue..        }..
59d0: 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 66 69  ..        set fi
59e0: 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6e 61 74  leName [file nat
59f0: 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f  ivename [file jo
5a00: 69 6e 20 24 64 69 72 65 63 74 6f 72 79 20 5c 0d  in $directory \.
5a10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 24 70 6c  .            $pl
5a20: 61 74 66 6f 72 6d 20 24 66 69 6c 65 4e 61 6d 65  atform $fileName
5a30: 4f 6e 6c 79 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20  Only]]....      
5a40: 20 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73    if {[file exis
5a50: 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74  ts $fileName]} t
5a60: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
5a70: 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20   return true..  
5a80: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
5a90: 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 20     set fileName 
5aa0: 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65  [file nativename
5ab0: 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 64 69 72   [file join $dir
5ac0: 65 63 74 6f 72 79 20 5c 0d 0a 20 20 20 20 20 20  ectory \..      
5ad0: 20 20 20 20 20 20 24 66 69 6c 65 4e 61 6d 65 4f        $fileNameO
5ae0: 6e 6c 79 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  nly]]....       
5af0: 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74   if {[file exist
5b00: 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68  s $fileName]} th
5b10: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
5b20: 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20  return true..   
5b30: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
5b40: 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
5b50: 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20    # NOTE: Build 
5b60: 74 68 65 20 66 75 6c 6c 79 20 71 75 61 6c 69 66  the fully qualif
5b70: 69 65 64 20 66 69 6c 65 20 6e 61 6d 65 20 66 6f  ied file name fo
5b80: 72 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72  r the SQLite cor
5b90: 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
5ba0: 20 6c 69 62 72 61 72 79 2e 20 20 49 66 20 74 68   library.  If th
5bb0: 69 73 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20  is file exists, 
5bc0: 77 65 20 73 68 6f 75 6c 64 20 68 61 76 65 20 65  we should have e
5bd0: 76 65 72 79 74 68 69 6e 67 20 77 65 0d 0a 20 20  verything we..  
5be0: 20 20 20 20 23 20 20 20 20 20 20 20 6e 65 65 64      #       need
5bf0: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
5c00: 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61    foreach fileNa
5c10: 6d 65 4f 6e 6c 79 20 5b 67 65 74 4e 61 74 69 76  meOnly [getNativ
5c20: 65 4c 69 62 72 61 72 79 46 69 6c 65 4e 61 6d 65  eLibraryFileName
5c30: 73 4f 6e 6c 79 5d 20 7b 0d 0a 20 20 20 20 20 20  sOnly] {..      
5c40: 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b    set fileName [
5c50: 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20  file nativename 
5c60: 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 64 69 72 65  [file join $dire
5c70: 63 74 6f 72 79 20 5c 0d 0a 20 20 20 20 20 20 20  ctory \..       
5c80: 20 20 20 20 20 24 61 72 63 68 69 74 65 63 74 75       $architectu
5c90: 72 65 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79  re $fileNameOnly
5ca0: 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66  ]]....        if
5cb0: 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24   {[file exists $
5cc0: 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20  fileName]} then 
5cd0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  {..          ret
5ce0: 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20  urn true..      
5cf0: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73    }....        s
5d00: 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c  et fileName [fil
5d10: 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69  e nativename [fi
5d20: 6c 65 20 6a 6f 69 6e 20 24 64 69 72 65 63 74 6f  le join $directo
5d30: 72 79 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ry \..          
5d40: 20 20 24 70 6c 61 74 66 6f 72 6d 20 24 66 69 6c    $platform $fil
5d50: 65 4e 61 6d 65 4f 6e 6c 79 5d 5d 0d 0a 0d 0a 20  eNameOnly]].... 
5d60: 20 20 20 20 20 20 20 69 66 20 7b 5b 66 69 6c 65         if {[file
5d70: 20 65 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d   exists $fileNam
5d80: 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  e]} then {..    
5d90: 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75        return tru
5da0: 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  e..        }....
5db0: 20 20 20 20 20 20 20 20 73 65 74 20 66 69 6c 65          set file
5dc0: 4e 61 6d 65 20 5b 66 69 6c 65 20 6e 61 74 69 76  Name [file nativ
5dd0: 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e  ename [file join
5de0: 20 24 64 69 72 65 63 74 6f 72 79 20 5c 0d 0a 20   $directory \.. 
5df0: 20 20 20 20 20 20 20 20 20 20 20 24 66 69 6c 65             $file
5e00: 4e 61 6d 65 4f 6e 6c 79 5d 5d 0d 0a 0d 0a 20 20  NameOnly]]....  
5e10: 20 20 20 20 20 20 69 66 20 7b 5b 66 69 6c 65 20        if {[file 
5e20: 65 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65  exists $fileName
5e30: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
5e40: 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65       return true
5e50: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
5e60: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
5e70: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4f  .      # NOTE: O
5e80: 6e 65 20 6f 72 20 6d 6f 72 65 20 6e 61 74 69 76  ne or more nativ
5e90: 65 20 63 6f 6d 70 6f 6e 65 6e 74 73 20 6e 65 65  e components nee
5ea0: 64 65 64 20 62 79 20 53 79 73 74 65 6d 2e 44 61  ded by System.Da
5eb0: 74 61 2e 53 51 4c 69 74 65 0d 0a 20 20 20 20 20  ta.SQLite..     
5ec0: 20 23 20 20 20 20 20 20 20 61 72 65 20 6d 69 73   #       are mis
5ed0: 73 69 6e 67 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  sing...      #..
5ee0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c        return fal
5ef0: 73 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  se..    }.....  
5f00: 20 20 70 72 6f 63 20 69 73 52 65 6c 65 61 73 65    proc isRelease
5f10: 41 76 61 69 6c 61 62 6c 65 20 7b 20 64 69 72 65  Available { dire
5f20: 63 74 6f 72 79 20 7b 76 61 72 4e 61 6d 65 20 22  ctory {varName "
5f30: 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66  "} } {..      if
5f40: 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   {[string length
5f50: 20 24 76 61 72 4e 61 6d 65 5d 20 3e 20 30 7d 20   $varName] > 0} 
5f60: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
5f70: 75 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65  upvar 1 $varName
5f80: 20 24 76 61 72 4e 61 6d 65 0d 0a 20 20 20 20 20   $varName..     
5f90: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75   }....      retu
5fa0: 72 6e 20 5b 69 73 42 75 69 6c 64 41 76 61 69 6c  rn [isBuildAvail
5fb0: 61 62 6c 65 20 22 22 20 24 64 69 72 65 63 74 6f  able "" $directo
5fc0: 72 79 20 24 76 61 72 4e 61 6d 65 5d 0d 0a 20 20  ry $varName]..  
5fd0: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
5fe0: 20 6a 6f 69 6e 42 75 69 6c 64 44 69 72 65 63 74   joinBuildDirect
5ff0: 6f 72 79 20 7b 20 6e 61 74 69 76 65 20 70 61 74  ory { native pat
6000: 68 20 79 65 61 72 20 70 6c 61 74 66 6f 72 6d 20  h year platform 
6010: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 7d 20  configuration } 
6020: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
6030: 20 20 23 20 4e 4f 54 45 3a 20 46 69 67 75 72 65    # NOTE: Figure
6040: 20 6f 75 74 20 61 6e 64 20 74 68 65 6e 20 72 65   out and then re
6050: 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 79 20 71  turn the fully q
6060: 75 61 6c 69 66 69 65 64 20 70 61 74 68 20 74 6f  ualified path to
6070: 20 74 68 65 20 62 75 69 6c 64 0d 0a 20 20 20 20   the build..    
6080: 20 20 23 20 20 20 20 20 20 20 64 69 72 65 63 74    #       direct
6090: 6f 72 79 20 62 61 73 65 64 20 6f 6e 20 61 6c 6c  ory based on all
60a0: 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20 70   the arguments p
60b0: 72 6f 76 69 64 65 64 20 62 79 20 6f 75 72 20 63  rovided by our c
60c0: 61 6c 6c 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d  aller...      #.
60d0: 0a 20 20 20 20 20 20 69 66 20 7b 24 6e 61 74 69  .      if {$nati
60e0: 76 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  ve} then {..    
60f0: 20 20 20 20 72 65 74 75 72 6e 20 5b 66 69 6c 65      return [file
6100: 20 6a 6f 69 6e 20 24 70 61 74 68 20 62 69 6e 20   join $path bin 
6110: 24 79 65 61 72 20 24 70 6c 61 74 66 6f 72 6d 20  $year $platform 
6120: 24 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 5d 0d  $configuration].
6130: 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
6140: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
6150: 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 70 61 74 68  [file join $path
6160: 20 62 69 6e 20 24 79 65 61 72 20 24 63 6f 6e 66   bin $year $conf
6170: 69 67 75 72 61 74 69 6f 6e 20 62 69 6e 5d 0d 0a  iguration bin]..
6180: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
6190: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 42  ...    proc getB
61a0: 75 69 6c 64 44 69 72 65 63 74 6f 72 79 20 7b 20  uildDirectory { 
61b0: 6d 61 6e 61 67 65 64 4f 6e 6c 79 20 7d 20 7b 0d  managedOnly } {.
61c0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
61d0: 23 20 4e 4f 54 45 3a 20 53 65 65 20 69 66 20 74  # NOTE: See if t
61e0: 68 65 20 22 6e 61 74 69 76 65 22 20 72 75 6e 74  he "native" runt
61f0: 69 6d 65 20 6f 70 74 69 6f 6e 20 68 61 73 20 62  ime option has b
6200: 65 65 6e 20 73 65 74 2e 20 20 49 66 20 73 6f 2c  een set.  If so,
6210: 20 75 73 65 20 74 68 65 0d 0a 20 20 20 20 20 20   use the..      
6220: 23 20 20 20 20 20 20 20 64 69 72 65 63 74 6f 72  #       director
6230: 79 20 66 6f 72 20 74 68 65 20 6d 69 78 65 64 2d  y for the mixed-
6240: 6d 6f 64 65 20 61 73 73 65 6d 62 6c 79 20 28 61  mode assembly (a
6250: 2e 6b 2e 61 2e 20 74 68 65 20 6e 61 74 69 76 65  .k.a. the native
6260: 20 69 6e 74 65 72 6f 70 0d 0a 20 20 20 20 20 20   interop..      
6270: 23 20 20 20 20 20 20 20 61 73 73 65 6d 62 6c 79  #       assembly
6280: 29 2e 20 20 54 6f 20 65 6e 61 62 6c 65 20 74 68  ).  To enable th
6290: 69 73 20 6f 70 74 69 6f 6e 20 76 69 61 20 74 68  is option via th
62a0: 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 2c 20  e command line, 
62b0: 65 6e 74 65 72 20 61 0d 0a 20 20 20 20 20 20 23  enter a..      #
62c0: 20 20 20 20 20 20 20 63 6f 6d 6d 61 6e 64 20 73         command s
62d0: 69 6d 69 6c 61 72 20 74 6f 20 6f 6e 65 20 6f 66  imilar to one of
62e0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 28   the following (
62f0: 61 6c 6c 20 6f 6e 20 6f 6e 65 20 6c 69 6e 65 29  all on one line)
6300: 3a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  :..      #..    
6310: 20 20 23 20 20 20 20 20 20 20 45 61 67 6c 65 53    #       EagleS
6320: 68 65 6c 6c 2e 65 78 65 20 2d 69 6e 69 74 69 61  hell.exe -initia
6330: 6c 69 7a 65 20 2d 72 75 6e 74 69 6d 65 4f 70 74  lize -runtimeOpt
6340: 69 6f 6e 20 6e 61 74 69 76 65 0d 0a 20 20 20 20  ion native..    
6350: 20 20 23 20 20 20 20 20 20 20 20 20 2d 66 69 6c    #         -fil
6360: 65 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e  e .\path\to\all.
6370: 65 61 67 6c 65 0d 0a 20 20 20 20 20 20 23 0d 0a  eagle..      #..
6380: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 54 6f        #       To
6390: 20 65 6e 61 62 6c 65 20 74 68 69 73 20 6f 70 74   enable this opt
63a0: 69 6f 6e 20 76 69 61 20 74 68 65 20 63 6f 6d 6d  ion via the comm
63b0: 61 6e 64 20 6c 69 6e 65 20 70 72 69 6f 72 20 74  and line prior t
63c0: 6f 20 74 68 65 20 22 62 65 74 61 20 31 36 22 0d  o the "beta 16".
63d0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 72  .      #       r
63e0: 65 6c 65 61 73 65 20 6f 66 20 45 61 67 6c 65 2c  elease of Eagle,
63f0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   the following c
6400: 6f 6d 6d 61 6e 64 20 6d 75 73 74 20 62 65 20 75  ommand must be u
6410: 73 65 64 20 69 6e 73 74 65 61 64 0d 0a 20 20 20  sed instead..   
6420: 20 20 20 23 20 20 20 20 20 20 20 28 61 6c 73 6f     #       (also
6430: 20 61 6c 6c 20 6f 6e 20 6f 6e 65 20 6c 69 6e 65   all on one line
6440: 29 3a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ):..      #..   
6450: 20 20 20 23 20 20 20 20 20 20 20 45 61 67 6c 65     #       Eagle
6460: 53 68 65 6c 6c 2e 65 78 65 20 2d 69 6e 69 74 69  Shell.exe -initi
6470: 61 6c 69 7a 65 20 2d 70 6f 73 74 49 6e 69 74 69  alize -postIniti
6480: 61 6c 69 7a 65 0d 0a 20 20 20 20 20 20 23 20 20  alize..      #  
6490: 20 20 20 20 20 20 20 22 6f 62 6a 65 63 74 20 69         "object i
64a0: 6e 76 6f 6b 65 20 49 6e 74 65 72 70 72 65 74 65  nvoke Interprete
64b0: 72 2e 47 65 74 41 63 74 69 76 65 20 41 64 64 52  r.GetActive AddR
64c0: 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 6e 61 74  untimeOption nat
64d0: 69 76 65 22 0d 0a 20 20 20 20 20 20 23 20 20 20  ive"..      #   
64e0: 20 20 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70 61        -file .\pa
64f0: 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d  th\to\all.eagle.
6500: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
6510: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
6520: 20 3a 3a 62 75 69 6c 64 5f 64 69 72 65 63 74 6f   ::build_directo
6530: 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  ry] && \..      
6540: 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67      [string leng
6550: 74 68 20 24 3a 3a 62 75 69 6c 64 5f 64 69 72 65  th $::build_dire
6560: 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e  ctory] > 0} then
6570: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
6580: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54         # NOTE: T
6590: 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74  he location of t
65a0: 68 65 20 62 75 69 6c 64 20 64 69 72 65 63 74 6f  he build directo
65b0: 72 79 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72  ry has been over
65c0: 72 69 64 64 65 6e 3b 0d 0a 20 20 20 20 20 20 20  ridden;..       
65d0: 20 23 20 20 20 20 20 20 20 74 68 65 72 65 66 6f   #       therefo
65e0: 72 65 2c 20 75 73 65 20 69 74 20 76 65 72 62 61  re, use it verba
65f0: 74 69 6d 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  tim...        #.
6600: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
6610: 24 3a 3a 62 75 69 6c 64 5f 64 69 72 65 63 74 6f  $::build_directo
6620: 72 79 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  ry..      } else
6630: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
6640: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49         # NOTE: I
6650: 66 20 74 68 65 20 22 6e 61 74 69 76 65 22 20 72  f the "native" r
6660: 75 6e 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73  untime option is
6670: 20 73 65 74 2c 20 74 68 65 20 6d 69 78 65 64 2d   set, the mixed-
6680: 6d 6f 64 65 20 61 73 73 65 6d 62 6c 79 0d 0a 20  mode assembly.. 
6690: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69         #       i
66a0: 73 20 62 65 69 6e 67 20 74 65 73 74 65 64 2e 20  s being tested. 
66b0: 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74   In that case, t
66c0: 68 65 20 70 61 74 68 20 74 6f 20 74 68 65 20 62  he path to the b
66d0: 75 69 6c 64 20 64 69 72 65 63 74 6f 72 79 0d 0a  uild directory..
66e0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
66f0: 77 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 74 68 65  will contain the
6700: 20 70 6c 61 74 66 6f 72 6d 20 6e 61 6d 65 20 61   platform name a
6710: 6e 64 20 61 6c 6c 20 74 68 65 20 62 69 6e 61 72  nd all the binar
6720: 69 65 73 20 75 6e 64 65 72 20 74 65 73 74 0d 0a  ies under test..
6730: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
6740: 73 68 6f 75 6c 64 20 62 65 20 70 72 65 73 65 6e  should be presen
6750: 74 20 69 6e 20 74 68 61 74 20 64 69 72 65 63 74  t in that direct
6760: 6f 72 79 2e 20 20 49 66 20 74 68 65 20 22 6e 61  ory.  If the "na
6770: 74 69 76 65 22 20 72 75 6e 74 69 6d 65 0d 0a 20  tive" runtime.. 
6780: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6f         #       o
6790: 70 74 69 6f 6e 20 69 73 20 6e 6f 74 20 73 65 74  ption is not set
67a0: 2c 20 74 68 65 20 62 75 69 6c 64 20 64 69 72 65  , the build dire
67b0: 63 74 6f 72 79 20 77 69 6c 6c 20 62 65 20 63 6f  ctory will be co
67c0: 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 0d 0a  nsidered to be..
67d0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
67e0: 22 70 6c 61 74 66 6f 72 6d 2d 6e 65 75 74 72 61  "platform-neutra
67f0: 6c 22 2c 20 77 69 74 68 20 74 68 65 20 6e 6f 74  l", with the not
6800: 61 62 6c 65 20 65 78 63 65 70 74 69 6f 6e 20 6f  able exception o
6810: 66 20 61 6e 79 20 6e 61 74 69 76 65 0d 0a 20 20  f any native..  
6820: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61 73        #       as
6830: 73 65 6d 62 6c 79 20 28 65 2e 67 2e 20 22 53 51  sembly (e.g. "SQ
6840: 4c 69 74 65 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c  Lite.Interop.dll
6850: 22 29 20 63 6f 70 69 65 64 20 74 68 65 72 65 20  ") copied there 
6860: 64 75 72 69 6e 67 20 74 68 65 0d 0a 20 20 20 20  during the..    
6870: 20 20 20 20 23 20 20 20 20 20 20 20 62 75 69 6c      #       buil
6880: 64 20 70 72 6f 63 65 73 73 20 69 74 73 65 6c 66  d process itself
6890: 2e 20 20 49 66 20 74 68 65 20 62 75 69 6c 64 20  .  If the build 
68a0: 70 72 6f 63 65 73 73 20 73 6f 6d 65 68 6f 77 20  process somehow 
68b0: 64 6f 65 73 20 6e 6f 74 0d 0a 20 20 20 20 20 20  does not..      
68c0: 20 20 23 20 20 20 20 20 20 20 63 6f 70 79 20 74    #       copy t
68d0: 68 65 20 6e 61 74 69 76 65 20 61 73 73 65 6d 62  he native assemb
68e0: 6c 79 20 66 6f 72 20 74 68 69 73 20 70 6c 61 74  ly for this plat
68f0: 66 6f 72 6d 2c 20 6d 6f 73 74 20 6f 66 20 74 68  form, most of th
6900: 65 20 74 65 73 74 73 0d 0a 20 20 20 20 20 20 20  e tests..       
6910: 20 23 20 20 20 20 20 20 20 69 6e 20 74 68 65 20   #       in the 
6920: 73 75 69 74 65 20 77 69 6c 6c 20 73 69 6d 70 6c  suite will simpl
6930: 79 20 62 65 20 73 6b 69 70 70 65 64 2e 20 20 47  y be skipped.  G
6940: 65 6e 65 72 61 6c 6c 79 20 73 70 65 61 6b 69 6e  enerally speakin
6950: 67 2c 20 74 68 65 72 65 0d 0a 20 20 20 20 20 20  g, there..      
6960: 20 20 23 20 20 20 20 20 20 20 61 72 65 20 74 77    #       are tw
6970: 6f 20 77 61 79 73 20 74 6f 20 62 75 69 6c 64 20  o ways to build 
6980: 74 68 65 20 62 69 6e 61 72 69 65 73 20 77 68 65  the binaries whe
6990: 6e 20 70 72 65 70 61 72 69 6e 67 20 74 6f 20 72  n preparing to r
69a0: 75 6e 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20  un the..        
69b0: 23 20 20 20 20 20 20 20 74 65 73 74 20 73 75 69  #       test sui
69c0: 74 65 3a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  te:..        #..
69d0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
69e0: 31 2e 20 42 75 69 6c 64 20 74 68 65 20 73 65 70  1. Build the sep
69f0: 61 72 61 74 65 20 6d 61 6e 61 67 65 64 20 61 6e  arate managed an
6a00: 64 20 6e 61 74 69 76 65 20 61 73 73 65 6d 62 6c  d native assembl
6a10: 69 65 73 20 75 73 69 6e 67 20 73 6f 6d 65 0d 0a  ies using some..
6a20: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
6a30: 20 20 20 63 6f 6d 6d 61 6e 64 73 20 73 69 6d 69     commands simi
6a40: 6c 61 72 20 74 6f 3a 0d 0a 20 20 20 20 20 20 20  lar to:..       
6a50: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20   #..        #   
6a60: 20 20 20 20 20 20 20 62 75 69 6c 64 2e 62 61 74         build.bat
6a70: 20 24 7b 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e   ${Configuration
6a80: 7d 4d 61 6e 61 67 65 64 4f 6e 6c 79 20 24 7b 50  }ManagedOnly ${P
6a90: 6c 61 74 66 6f 72 6d 7d 0d 0a 20 20 20 20 20 20  latform}..      
6aa0: 20 20 23 20 20 20 20 20 20 20 20 20 20 62 75 69    #          bui
6ab0: 6c 64 2e 62 61 74 20 24 7b 43 6f 6e 66 69 67 75  ld.bat ${Configu
6ac0: 72 61 74 69 6f 6e 7d 4e 61 74 69 76 65 4f 6e 6c  ration}NativeOnl
6ad0: 79 20 24 7b 50 6c 61 74 66 6f 72 6d 7d 0d 0a 20  y ${Platform}.. 
6ae0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
6af0: 20 20 23 20 20 20 20 20 20 20 20 20 20 57 68 65    #          Whe
6b00: 72 65 20 24 7b 43 6f 6e 66 69 67 75 72 61 74 69  re ${Configurati
6b10: 6f 6e 7d 20 69 73 20 65 69 74 68 65 72 20 22 44  on} is either "D
6b20: 65 62 75 67 22 20 6f 72 20 22 52 65 6c 65 61 73  ebug" or "Releas
6b30: 65 22 20 61 6e 64 0d 0a 20 20 20 20 20 20 20 20  e" and..        
6b40: 23 20 20 20 20 20 20 20 20 20 20 24 7b 50 6c 61  #          ${Pla
6b50: 74 66 6f 72 6d 7d 20 69 73 20 65 69 74 68 65 72  tform} is either
6b60: 20 22 57 69 6e 33 32 22 20 6f 72 20 22 78 36 34   "Win32" or "x64
6b70: 22 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  "...        #.. 
6b80: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 32         #       2
6b90: 2e 20 42 75 69 6c 64 20 74 68 65 20 6d 69 78 65  . Build the mixe
6ba0: 64 2d 6d 6f 64 65 20 61 73 73 65 6d 62 6c 79 20  d-mode assembly 
6bb0: 75 73 69 6e 67 20 61 20 63 6f 6d 6d 61 6e 64 20  using a command 
6bc0: 73 69 6d 69 6c 61 72 20 74 6f 3a 0d 0a 20 20 20  similar to:..   
6bd0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
6be0: 23 20 20 20 20 20 20 20 20 20 20 62 75 69 6c 64  #          build
6bf0: 2e 62 61 74 20 24 7b 43 6f 6e 66 69 67 75 72 61  .bat ${Configura
6c00: 74 69 6f 6e 7d 20 24 7b 50 6c 61 74 66 6f 72 6d  tion} ${Platform
6c10: 7d 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  }..        #..  
6c20: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20        #         
6c30: 20 57 68 65 72 65 20 24 7b 43 6f 6e 66 69 67 75   Where ${Configu
6c40: 72 61 74 69 6f 6e 7d 20 69 73 20 65 69 74 68 65  ration} is eithe
6c50: 72 20 22 44 65 62 75 67 22 20 6f 72 20 22 52 65  r "Debug" or "Re
6c60: 6c 65 61 73 65 22 20 61 6e 64 0d 0a 20 20 20 20  lease" and..    
6c70: 20 20 20 20 23 20 20 20 20 20 20 20 20 20 20 24      #          $
6c80: 7b 50 6c 61 74 66 6f 72 6d 7d 20 69 73 20 65 69  {Platform} is ei
6c90: 74 68 65 72 20 22 57 69 6e 33 32 22 20 6f 72 20  ther "Win32" or 
6ca0: 22 78 36 34 22 2e 20 20 49 66 20 74 68 69 73 20  "x64".  If this 
6cb0: 63 6f 6d 6d 61 6e 64 20 69 73 0d 0a 20 20 20 20  command is..    
6cc0: 20 20 20 20 23 20 20 20 20 20 20 20 20 20 20 75      #          u
6cd0: 73 65 64 2c 20 76 61 72 69 6f 75 73 20 74 65 73  sed, various tes
6ce0: 74 73 20 74 68 61 74 20 72 65 71 75 69 72 65 20  ts that require 
6cf0: 73 75 70 70 6c 65 6d 65 6e 74 61 72 79 20 6d 61  supplementary ma
6d00: 6e 61 67 65 64 0d 0a 20 20 20 20 20 20 20 20 23  naged..        #
6d10: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 6d 62            assemb
6d20: 6c 69 65 73 20 28 65 2e 67 2e 20 4c 49 4e 51 29  lies (e.g. LINQ)
6d30: 20 6d 61 79 20 62 65 20 73 6b 69 70 70 65 64 20   may be skipped 
6d40: 75 6e 6c 65 73 73 20 74 68 6f 73 65 20 62 69 6e  unless those bin
6d50: 61 72 69 65 73 0d 0a 20 20 20 20 20 20 20 20 23  aries..        #
6d60: 20 20 20 20 20 20 20 20 20 20 61 72 65 20 73 75            are su
6d70: 62 73 65 71 75 65 6e 74 6c 79 20 63 6f 70 69 65  bsequently copie
6d80: 64 20 69 6e 74 6f 20 74 68 65 20 63 6f 72 72 65  d into the corre
6d90: 63 74 20 64 69 72 65 63 74 6f 72 79 20 28 69 2e  ct directory (i.
6da0: 65 2e 20 62 79 0d 0a 20 20 20 20 20 20 20 20 23  e. by..        #
6db0: 20 20 20 20 20 20 20 20 20 20 22 74 65 73 74 5f            "test_
6dc0: 61 6c 6c 2e 62 61 74 22 29 2e 0d 0a 20 20 20 20  all.bat")...    
6dd0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
6de0: 20 20 20 20 20 20 20 4e 6f 74 65 20 74 68 61 74         Note that
6df0: 20 61 6c 6c 20 6f 66 20 74 68 65 20 62 75 69 6c   all of the buil
6e00: 64 20 63 6f 6d 6d 61 6e 64 73 20 61 62 6f 76 65  d commands above
6e10: 20 77 69 6c 6c 20 64 65 66 61 75 6c 74 20 74 6f   will default to
6e20: 20 75 73 69 6e 67 0d 0a 20 20 20 20 20 20 20 20   using..        
6e30: 23 20 20 20 20 20 20 20 74 68 65 20 6c 61 74 65  #       the late
6e40: 73 74 20 76 65 72 73 69 6f 6e 20 6f 66 20 4d 53  st version of MS
6e50: 42 75 69 6c 64 20 61 76 61 69 6c 61 62 6c 65 20  Build available 
6e60: 61 6e 64 20 74 68 65 20 22 74 65 73 74 5f 79 65  and the "test_ye
6e70: 61 72 22 20 6d 61 79 0d 0a 20 20 20 20 20 20 20  ar" may..       
6e80: 20 23 20 20 20 20 20 20 20 6e 65 65 64 20 74 6f   #       need to
6e90: 20 62 65 20 61 64 6a 75 73 74 65 64 20 61 63 63   be adjusted acc
6ea0: 6f 72 64 69 6e 67 6c 79 20 74 6f 20 61 63 74 75  ordingly to actu
6eb0: 61 6c 6c 79 20 72 75 6e 20 74 68 65 20 74 65 73  ally run the tes
6ec0: 74 20 73 75 69 74 65 2e 0d 0a 20 20 20 20 20 20  t suite...      
6ed0: 20 20 23 20 20 20 20 20 20 20 52 65 66 65 72 20    #       Refer 
6ee0: 74 6f 20 74 68 65 20 63 6f 6d 6d 65 6e 74 73 20  to the comments 
6ef0: 69 6e 20 5b 67 65 74 42 75 69 6c 64 59 65 61 72  in [getBuildYear
6f00: 5d 20 66 6f 72 20 6d 6f 72 65 20 69 6e 66 6f 72  ] for more infor
6f10: 6d 61 74 69 6f 6e 20 6f 6e 0d 0a 20 20 20 20 20  mation on..     
6f20: 20 20 20 23 20 20 20 20 20 20 20 68 6f 77 20 74     #       how t
6f30: 6f 20 73 65 74 20 74 68 69 73 20 76 61 72 69 61  o set this varia
6f40: 62 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ble...        #.
6f50: 0a 20 20 20 20 20 20 20 20 73 65 74 20 6e 61 74  .        set nat
6f60: 69 76 65 20 5b 65 78 70 72 20 7b 21 24 6d 61 6e  ive [expr {!$man
6f70: 61 67 65 64 4f 6e 6c 79 20 26 26 20 5b 68 61 73  agedOnly && [has
6f80: 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 6e 61  RuntimeOption na
6f90: 74 69 76 65 5d 7d 5d 0d 0a 0d 0a 20 20 20 20 20  tive]}]....     
6fa0: 20 20 20 72 65 74 75 72 6e 20 5b 6a 6f 69 6e 42     return [joinB
6fb0: 75 69 6c 64 44 69 72 65 63 74 6f 72 79 20 24 6e  uildDirectory $n
6fc0: 61 74 69 76 65 20 5b 67 65 74 42 75 69 6c 64 42  ative [getBuildB
6fd0: 61 73 65 44 69 72 65 63 74 6f 72 79 5d 20 5c 0d  aseDirectory] \.
6fe0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65  .            [ge
6ff0: 74 42 75 69 6c 64 59 65 61 72 5d 20 5b 67 65 74  tBuildYear] [get
7000: 42 75 69 6c 64 50 6c 61 74 66 6f 72 6d 20 24 6e  BuildPlatform $n
7010: 61 74 69 76 65 5d 20 5b 67 65 74 42 75 69 6c 64  ative] [getBuild
7020: 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 5d 5d 0d  Configuration]].
7030: 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
7040: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74  ....    proc get
7050: 52 65 6c 65 61 73 65 56 65 72 73 69 6f 6e 20 7b  ReleaseVersion {
7060: 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
7070: 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69 67 75      # NOTE: Figu
7080: 72 65 20 6f 75 74 20 74 68 65 20 72 65 6c 65 61  re out the relea
7090: 73 65 20 76 65 72 73 69 6f 6e 20 66 6f 72 20 75  se version for u
70a0: 73 65 20 77 69 74 68 20 74 68 65 20 62 75 69 6c  se with the buil
70b0: 64 20 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20  d directory..   
70c0: 20 20 20 23 20 20 20 20 20 20 20 77 68 65 6e 20     #       when 
70d0: 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 61 76 61  checking for ava
70e0: 69 6c 61 62 6c 65 20 72 65 6c 65 61 73 65 73 2e  ilable releases.
70f0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
7100: 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
7110: 73 20 3a 3a 72 65 6c 65 61 73 65 5f 76 65 72 73  s ::release_vers
7120: 69 6f 6e 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  ion] && \..     
7130: 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
7140: 67 74 68 20 24 3a 3a 72 65 6c 65 61 73 65 5f 76  gth $::release_v
7150: 65 72 73 69 6f 6e 5d 20 3e 20 30 7d 20 74 68 65  ersion] > 0} the
7160: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
7170: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
7180: 54 68 65 20 72 65 6c 65 61 73 65 20 76 65 72 73  The release vers
7190: 69 6f 6e 20 68 61 73 20 62 65 65 6e 20 6f 76 65  ion has been ove
71a0: 72 72 69 64 64 65 6e 3b 20 74 68 65 72 65 66 6f  rridden; therefo
71b0: 72 65 2c 20 75 73 65 20 69 74 0d 0a 20 20 20 20  re, use it..    
71c0: 20 20 20 20 23 20 20 20 20 20 20 20 76 65 72 62      #       verb
71d0: 61 74 69 6d 2e 0d 0a 20 20 20 20 20 20 20 20 23  atim...        #
71e0: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
71f0: 20 24 3a 3a 72 65 6c 65 61 73 65 5f 76 65 72 73   $::release_vers
7200: 69 6f 6e 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  ion..      } els
7210: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  e {..        #..
7220: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
7230: 4e 6f 20 72 65 6c 65 61 73 65 20 76 65 72 73 69  No release versi
7240: 6f 6e 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c  on is available,
7250: 20 72 65 74 75 72 6e 20 61 6e 20 65 6d 70 74 79   return an empty
7260: 20 73 74 72 69 6e 67 2e 0d 0a 20 20 20 20 20 20   string...      
7270: 20 20 23 20 20 20 20 20 20 20 49 74 20 69 73 20    #       It is 
7280: 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 72 65 74  important to ret
7290: 75 72 6e 20 61 6e 20 65 6d 70 74 79 20 73 74 72  urn an empty str
72a0: 69 6e 67 20 68 65 72 65 20 62 65 63 61 75 73 65  ing here because
72b0: 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20   the..        # 
72c0: 20 20 20 20 20 20 72 65 73 75 6c 74 20 6f 66 20        result of 
72d0: 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 6d  this procedure m
72e0: 61 79 20 62 65 20 75 73 65 64 20 77 69 74 68 20  ay be used with 
72f0: 5b 66 69 6c 65 20 6a 6f 69 6e 5d 2e 0d 0a 20 20  [file join]...  
7300: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
7310: 20 72 65 74 75 72 6e 20 22 22 0d 0a 20 20 20 20   return ""..    
7320: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
7330: 20 20 20 70 72 6f 63 20 67 65 74 42 75 69 6c 64     proc getBuild
7340: 46 69 6c 65 4e 61 6d 65 20 7b 20 66 69 6c 65 4e  FileName { fileN
7350: 61 6d 65 20 6d 61 6e 61 67 65 64 4f 6e 6c 79 20  ame managedOnly 
7360: 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20 7d 20  {platform ""} } 
7370: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
7380: 20 20 23 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e    # NOTE: Return
7390: 73 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  s the specified 
73a0: 66 69 6c 65 20 6e 61 6d 65 20 61 73 20 69 66 20  file name as if 
73b0: 69 74 20 77 65 72 65 20 6c 6f 63 61 74 65 64 20  it were located 
73c0: 69 6e 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20  in the..      # 
73d0: 20 20 20 20 20 20 62 75 69 6c 64 20 64 69 72 65        build dire
73e0: 63 74 6f 72 79 2c 20 64 69 73 63 61 72 64 69 6e  ctory, discardin
73f0: 67 20 61 6e 79 20 64 69 72 65 63 74 6f 72 79 20  g any directory 
7400: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 70 72 65 73  information pres
7410: 65 6e 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ent..      #    
7420: 20 20 20 69 6e 20 74 68 65 20 66 69 6c 65 20 6e     in the file n
7430: 61 6d 65 20 61 73 20 70 72 6f 76 69 64 65 64 20  ame as provided 
7440: 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 2e 0d 0a  by our caller...
7450: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73        #..      s
7460: 65 74 20 72 65 73 75 6c 74 20 5b 66 69 6c 65 20  et result [file 
7470: 6e 61 74 69 76 65 6e 61 6d 65 20 5c 0d 0a 20 20  nativename \..  
7480: 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 6a 6f          [file jo
7490: 69 6e 20 5b 67 65 74 42 75 69 6c 64 44 69 72 65  in [getBuildDire
74a0: 63 74 6f 72 79 20 24 6d 61 6e 61 67 65 64 4f 6e  ctory $managedOn
74b0: 6c 79 5d 20 24 70 6c 61 74 66 6f 72 6d 20 5c 0d  ly] $platform \.
74c0: 0a 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65  .          [file
74d0: 20 74 61 69 6c 20 24 66 69 6c 65 4e 61 6d 65 5d   tail $fileName]
74e0: 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ]]....      #.. 
74f0: 20 20 20 20 20 23 20 48 41 43 4b 3a 20 57 68 65       # HACK: Whe
7500: 6e 20 72 75 6e 6e 69 6e 67 20 6f 6e 20 57 6f 57  n running on WoW
7510: 36 34 2c 20 61 73 73 75 6d 65 20 74 68 65 20 74  64, assume the t
7520: 65 73 74 20 65 78 65 63 75 74 61 62 6c 65 73 20  est executables 
7530: 61 72 65 20 70 72 65 73 65 6e 74 0d 0a 20 20 20  are present..   
7540: 20 20 20 23 20 20 20 20 20 20 20 77 69 74 68 20     #       with 
7550: 74 68 65 20 22 33 32 22 20 73 75 66 66 69 78 20  the "32" suffix 
7560: 6f 6e 20 74 68 65 6d 2e 0d 0a 20 20 20 20 20 20  on them...      
7570: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 73  #..      if {[is
7580: 52 75 6e 6e 69 6e 67 57 6f 57 36 34 5d 20 26 26  RunningWoW64] &&
7590: 20 5b 66 69 6c 65 20 65 78 74 65 6e 73 69 6f 6e   [file extension
75a0: 20 24 72 65 73 75 6c 74 5d 20 65 71 20 22 2e 65   $result] eq ".e
75b0: 78 65 22 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  xe"} then {..   
75c0: 20 20 20 20 20 73 65 74 20 72 65 73 75 6c 74 20       set result 
75d0: 5b 61 70 70 65 6e 64 41 72 67 73 20 5b 66 69 6c  [appendArgs [fil
75e0: 65 20 72 6f 6f 74 6e 61 6d 65 20 24 72 65 73 75  e rootname $resu
75f0: 6c 74 5d 20 33 32 2e 65 78 65 5d 0d 0a 20 20 20  lt] 32.exe]..   
7600: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65     }....      re
7610: 74 75 72 6e 20 24 72 65 73 75 6c 74 0d 0a 20 20  turn $result..  
7620: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
7630: 20 67 65 74 45 78 74 65 72 6e 61 6c 44 69 72 65   getExternalDire
7640: 63 74 6f 72 79 20 7b 7d 20 7b 0d 0a 20 20 20 20  ctory {} {..    
7650: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
7660: 45 3a 20 54 68 69 73 20 70 72 6f 63 65 64 75 72  E: This procedur
7670: 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 64 69  e returns the di
7680: 72 65 63 74 6f 72 79 20 77 68 65 72 65 20 74 68  rectory where th
7690: 65 20 65 78 74 65 72 6e 61 6c 20 62 69 6e 61 72  e external binar
76a0: 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  y..      #      
76b0: 20 66 69 6c 65 73 20 61 72 65 20 6c 6f 63 61 74   files are locat
76c0: 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ed...      #..  
76d0: 20 20 20 20 72 65 74 75 72 6e 20 5b 66 69 6c 65      return [file
76e0: 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c   nativename [fil
76f0: 65 20 64 69 72 6e 61 6d 65 20 5b 66 69 6c 65 20  e dirname [file 
7700: 64 69 72 6e 61 6d 65 20 5b 69 6e 66 6f 20 62 69  dirname [info bi
7710: 6e 61 72 79 5d 5d 5d 5d 0d 0a 20 20 20 20 7d 0d  nary]]]]..    }.
7720: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74  ....    proc get
7730: 42 69 6e 61 72 79 44 69 72 65 63 74 6f 72 79 20  BinaryDirectory 
7740: 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20  {} {..      #.. 
7750: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69       # NOTE: Thi
7760: 73 20 70 72 6f 63 65 64 75 72 65 20 72 65 74 75  s procedure retu
7770: 72 6e 73 20 74 68 65 20 64 69 72 65 63 74 6f 72  rns the director
7780: 79 20 77 68 65 72 65 20 74 68 65 20 74 65 73 74  y where the test
7790: 20 61 70 70 6c 69 63 61 74 69 6f 6e 0d 0a 20 20   application..  
77a0: 20 20 20 20 23 20 20 20 20 20 20 20 69 74 73 65      #       itse
77b0: 6c 66 20 28 69 2e 65 2e 20 74 68 65 20 45 61 67  lf (i.e. the Eag
77c0: 6c 65 20 73 68 65 6c 6c 29 20 69 73 20 6c 6f 63  le shell) is loc
77d0: 61 74 65 64 2e 20 20 54 68 69 73 20 77 69 6c 6c  ated.  This will
77e0: 20 62 65 20 75 73 65 64 20 61 73 0d 0a 20 20 20   be used as..   
77f0: 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20 64     #       the d
7800: 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72 20 74  estination for t
7810: 68 65 20 63 6f 70 69 65 64 20 53 79 73 74 65 6d  he copied System
7820: 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 6e 61 74  .Data.SQLite nat
7830: 69 76 65 20 61 6e 64 0d 0a 20 20 20 20 20 20 23  ive and..      #
7840: 20 20 20 20 20 20 20 6d 61 6e 61 67 65 64 20 61         managed a
7850: 73 73 65 6d 62 6c 69 65 73 20 28 69 2e 65 2e 20  ssemblies (i.e. 
7860: 62 65 63 61 75 73 65 20 74 68 69 73 20 69 73 20  because this is 
7870: 6f 6e 65 20 6f 66 20 74 68 65 20 66 65 77 20 70  one of the few p
7880: 6c 61 63 65 73 0d 0a 20 20 20 20 20 20 23 20 20  laces..      #  
7890: 20 20 20 20 20 77 68 65 72 65 20 74 68 65 20 43       where the C
78a0: 4c 52 20 77 69 6c 6c 20 61 63 74 75 61 6c 6c 79  LR will actually
78b0: 20 66 69 6e 64 20 61 6e 64 20 6c 6f 61 64 20 74   find and load t
78c0: 68 65 6d 20 70 72 6f 70 65 72 6c 79 29 2e 0d 0a  hem properly)...
78d0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
78e0: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
78f0: 3a 3a 62 69 6e 61 72 79 5f 64 69 72 65 63 74 6f  ::binary_directo
7900: 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  ry] && \..      
7910: 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67      [string leng
7920: 74 68 20 24 3a 3a 62 69 6e 61 72 79 5f 64 69 72  th $::binary_dir
7930: 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65  ectory] > 0} the
7940: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
7950: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
7960: 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20  The location of 
7970: 74 68 65 20 62 69 6e 61 72 79 20 64 69 72 65 63  the binary direc
7980: 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 6f 76  tory has been ov
7990: 65 72 72 69 64 64 65 6e 3b 0d 0a 20 20 20 20 20  erridden;..     
79a0: 20 20 20 23 20 20 20 20 20 20 20 74 68 65 72 65     #       there
79b0: 66 6f 72 65 2c 20 75 73 65 20 69 74 20 76 65 72  fore, use it ver
79c0: 62 61 74 69 6d 2e 0d 0a 20 20 20 20 20 20 20 20  batim...        
79d0: 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  #..        retur
79e0: 6e 20 24 3a 3a 62 69 6e 61 72 79 5f 64 69 72 65  n $::binary_dire
79f0: 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20 65  ctory..      } e
7a00: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 72  lse {..        r
7a10: 65 74 75 72 6e 20 5b 69 6e 66 6f 20 62 69 6e 61  eturn [info bina
7a20: 72 79 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  ry]..      }..  
7a30: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
7a40: 20 67 65 74 45 78 74 65 72 6e 61 6c 46 69 6c 65   getExternalFile
7a50: 4e 61 6d 65 20 7b 20 66 69 6c 65 4e 61 6d 65 20  Name { fileName 
7a60: 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
7a70: 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 74 75      # NOTE: Retu
7a80: 72 6e 73 20 74 68 65 20 73 70 65 63 69 66 69 65  rns the specifie
7a90: 64 20 66 69 6c 65 20 6e 61 6d 65 20 61 73 20 69  d file name as i
7aa0: 66 20 69 74 20 77 65 72 65 20 6c 6f 63 61 74 65  f it were locate
7ab0: 64 20 69 6e 20 74 68 65 0d 0a 20 20 20 20 20 20  d in the..      
7ac0: 23 20 20 20 20 20 20 20 64 69 72 65 63 74 6f 72  #       director
7ad0: 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  y containing the
7ae0: 20 65 78 74 65 72 6e 61 6c 20 62 69 6e 61 72 69   external binari
7af0: 65 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  es...      #..  
7b00: 20 20 20 20 72 65 74 75 72 6e 20 5b 66 69 6c 65      return [file
7b10: 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c   nativename [fil
7b20: 65 20 6a 6f 69 6e 20 5b 67 65 74 45 78 74 65 72  e join [getExter
7b30: 6e 61 6c 44 69 72 65 63 74 6f 72 79 5d 20 24 66  nalDirectory] $f
7b40: 69 6c 65 4e 61 6d 65 5d 5d 0d 0a 20 20 20 20 7d  ileName]]..    }
7b50: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65  .....    proc ge
7b60: 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20  tBinaryFileName 
7b70: 7b 20 66 69 6c 65 4e 61 6d 65 20 7b 70 6c 61 74  { fileName {plat
7b80: 66 6f 72 6d 20 22 22 7d 20 7d 20 7b 0d 0a 20 20  form ""} } {..  
7b90: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
7ba0: 4f 54 45 3a 20 52 65 74 75 72 6e 73 20 74 68 65  OTE: Returns the
7bb0: 20 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 20   specified file 
7bc0: 6e 61 6d 65 20 61 73 20 69 66 20 69 74 20 77 65  name as if it we
7bd0: 72 65 20 6c 6f 63 61 74 65 64 20 69 6e 20 74 68  re located in th
7be0: 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
7bf0: 20 62 69 6e 61 72 79 20 64 69 72 65 63 74 6f 72   binary director
7c00: 79 2c 20 64 69 73 63 61 72 64 69 6e 67 20 61 6e  y, discarding an
7c10: 79 20 64 69 72 65 63 74 6f 72 79 20 69 6e 66 6f  y directory info
7c20: 72 6d 61 74 69 6f 6e 20 70 72 65 73 65 6e 74 0d  rmation present.
7c30: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69  .      #       i
7c40: 6e 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 20  n the file name 
7c50: 61 73 20 70 72 6f 76 69 64 65 64 20 62 79 20 6f  as provided by o
7c60: 75 72 20 63 61 6c 6c 65 72 2e 0d 0a 20 20 20 20  ur caller...    
7c70: 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75 72    #..      retur
7c80: 6e 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61  n [file nativena
7c90: 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  me \..          
7ca0: 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 42  [file join [getB
7cb0: 69 6e 61 72 79 44 69 72 65 63 74 6f 72 79 5d 20  inaryDirectory] 
7cc0: 24 70 6c 61 74 66 6f 72 6d 20 5b 66 69 6c 65 20  $platform [file 
7cd0: 74 61 69 6c 20 24 66 69 6c 65 4e 61 6d 65 5d 5d  tail $fileName]]
7ce0: 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  ]..    }.....   
7cf0: 20 70 72 6f 63 20 67 65 74 43 6f 72 65 42 69 6e   proc getCoreBin
7d00: 61 72 79 46 69 6c 65 4e 61 6d 65 20 7b 20 7b 70  aryFileName { {p
7d10: 6c 61 74 66 6f 72 6d 20 22 22 7d 20 7b 73 74 61  latform ""} {sta
7d20: 6e 64 61 72 64 20 22 22 7d 20 7d 20 7b 0d 0a 20  ndard ""} } {.. 
7d30: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
7d40: 4e 4f 54 45 3a 20 52 65 74 75 72 6e 73 20 74 68  NOTE: Returns th
7d50: 65 20 66 75 6c 6c 20 70 61 74 68 20 66 6f 72 20  e full path for 
7d60: 74 68 65 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e  the file contain
7d70: 69 6e 67 20 74 68 65 20 53 51 4c 69 74 65 20 63  ing the SQLite c
7d80: 6f 72 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ore..      #    
7d90: 20 20 20 6e 61 74 69 76 65 20 6c 69 62 72 61 72     native librar
7da0: 79 20 63 6f 64 65 20 66 6f 72 20 74 68 69 73 20  y code for this 
7db0: 70 6c 61 74 66 6f 72 6d 2e 20 20 46 69 72 73 74  platform.  First
7dc0: 2c 20 63 68 65 63 6b 20 61 6e 64 20 73 65 65 20  , check and see 
7dd0: 69 66 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  if..      #     
7de0: 20 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72    the SQLite cor
7df0: 65 20 6e 61 74 69 76 65 20 6c 69 62 72 61 72 79  e native library
7e00: 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
7e10: 6e 20 6c 6f 61 64 65 64 2e 20 20 4e 65 78 74 2c  n loaded.  Next,
7e20: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
7e30: 66 61 6c 6c 62 61 63 6b 20 74 6f 20 77 68 61 74  fallback to what
7e40: 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 20 73   the full path s
7e50: 68 6f 75 6c 64 20 62 65 2c 20 62 61 73 65 64 20  hould be, based 
7e60: 6f 6e 20 77 68 65 74 68 65 72 20 74 68 65 0d 0a  on whether the..
7e70: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6d 69        #       mi
7e80: 78 65 64 2d 6d 6f 64 65 20 61 73 73 65 6d 62 6c  xed-mode assembl
7e90: 79 20 69 73 20 62 65 69 6e 67 20 75 73 65 64 20  y is being used 
7ea0: 61 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  and the name of 
7eb0: 74 68 65 20 63 75 72 72 65 6e 74 0d 0a 20 20 20  the current..   
7ec0: 20 20 20 23 20 20 20 20 20 20 20 70 6c 61 74 66     #       platf
7ed0: 6f 72 6d 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  orm...      #.. 
7ee0: 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
7ef0: 7b 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a 65 63  {..        objec
7f00: 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20  t invoke -flags 
7f10: 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20  +NonPublic \..  
7f20: 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d            System
7f30: 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 55 6e 73  .Data.SQLite.Uns
7f40: 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73  afeNativeMethods
7f50: 20 5f 53 51 4c 69 74 65 4e 61 74 69 76 65 4d 6f   _SQLiteNativeMo
7f60: 64 75 6c 65 46 69 6c 65 4e 61 6d 65 0d 0a 20 20  duleFileName..  
7f70: 20 20 20 20 7d 20 66 69 6c 65 4e 61 6d 65 5d 20      } fileName] 
7f80: 3d 3d 20 30 20 26 26 20 5b 73 74 72 69 6e 67 20  == 0 && [string 
7f90: 6c 65 6e 67 74 68 20 24 66 69 6c 65 4e 61 6d 65  length $fileName
7fa0: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
7fb0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
7fc0: 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 53 51    # NOTE: The SQ
7fd0: 4c 69 74 65 20 63 6f 72 65 20 6e 61 74 69 76 65  Lite core native
7fe0: 20 6c 69 62 72 61 72 79 20 68 61 73 20 61 6c 72   library has alr
7ff0: 65 61 64 79 20 62 65 65 6e 20 6c 6f 61 64 65 64  eady been loaded
8000: 20 76 69 61 0d 0a 20 20 20 20 20 20 20 20 23 20   via..        # 
8010: 20 20 20 20 20 20 74 68 65 20 6e 61 74 69 76 65        the native
8020: 20 6c 69 62 72 61 72 79 20 70 72 65 2d 6c 6f 61   library pre-loa
8030: 64 65 72 2e 20 20 52 65 74 75 72 6e 20 74 68 61  der.  Return tha
8040: 74 20 66 69 6c 65 20 6e 61 6d 65 20 6e 6f 77 2e  t file name now.
8050: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
8060: 20 20 20 20 20 72 65 74 75 72 6e 20 24 66 69 6c       return $fil
8070: 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 7d 0d 0a  eName..      }..
8080: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
8090: 20 23 20 4e 4f 54 45 3a 20 49 66 20 74 68 65 20   # NOTE: If the 
80a0: 22 6e 61 74 69 76 65 22 20 72 75 6e 74 69 6d 65  "native" runtime
80b0: 20 6f 70 74 69 6f 6e 20 68 61 73 20 62 65 65 6e   option has been
80c0: 20 73 65 74 2c 20 61 6c 77 61 79 73 20 72 65 74   set, always ret
80d0: 75 72 6e 20 74 68 65 0d 0a 20 20 20 20 20 20 23  urn the..      #
80e0: 20 20 20 20 20 20 20 66 69 6c 65 20 6e 61 6d 65         file name
80f0: 20 66 6f 72 20 74 68 65 20 6d 69 78 65 64 2d 6d   for the mixed-m
8100: 6f 64 65 20 61 73 73 65 6d 62 6c 79 2e 0d 0a 20  ode assembly... 
8110: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
8120: 20 7b 5b 68 61 73 52 75 6e 74 69 6d 65 4f 70 74   {[hasRuntimeOpt
8130: 69 6f 6e 20 6e 61 74 69 76 65 5d 7d 20 74 68 65  ion native]} the
8140: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
8150: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
8160: 52 65 74 75 72 6e 20 74 68 65 20 6d 69 78 65 64  Return the mixed
8170: 2d 6d 6f 64 65 20 61 73 73 65 6d 62 6c 79 20 66  -mode assembly f
8180: 69 6c 65 20 6e 61 6d 65 2e 0d 0a 20 20 20 20 20  ile name...     
8190: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65     #..        re
81a0: 74 75 72 6e 20 5b 66 69 6c 65 20 6e 61 74 69 76  turn [file nativ
81b0: 65 6e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20  ename \..       
81c0: 20 20 20 20 20 5b 66 69 6c 65 20 6a 6f 69 6e 20       [file join 
81d0: 5b 67 65 74 42 69 6e 61 72 79 44 69 72 65 63 74  [getBinaryDirect
81e0: 6f 72 79 5d 20 24 70 6c 61 74 66 6f 72 6d 20 53  ory] $platform S
81f0: 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
8200: 65 2e 64 6c 6c 5d 5d 0d 0a 20 20 20 20 20 20 7d  e.dll]]..      }
8210: 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
8220: 20 20 20 23 20 4e 4f 54 45 3a 20 41 72 65 20 77     # NOTE: Are w
8230: 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20  e attempting to 
8240: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65  automatically de
8250: 74 65 63 74 20 77 68 65 74 68 65 72 20 6f 72 20  tect whether or 
8260: 6e 6f 74 20 74 68 65 0d 0a 20 20 20 20 20 20 23  not the..      #
8270: 20 20 20 20 20 20 20 69 6e 74 65 72 6f 70 20 61         interop a
8280: 73 73 65 6d 62 6c 79 20 73 68 6f 75 6c 64 20 62  ssembly should b
8290: 65 20 75 73 65 64 3f 0d 0a 20 20 20 20 20 20 23  e used?..      #
82a0: 0d 0a 20 20 20 20 20 20 73 65 74 20 61 75 74 6f  ..      set auto
82b0: 6d 61 74 69 63 20 5b 65 78 70 72 20 7b 5b 73 74  matic [expr {[st
82c0: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 73 74 61  ring length $sta
82d0: 6e 64 61 72 64 5d 20 3d 3d 20 30 7d 5d 0d 0a 0d  ndard] == 0}]...
82e0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
82f0: 23 20 4e 4f 54 45 3a 20 46 69 72 73 74 2c 20 69  # NOTE: First, i
8300: 6e 20 65 69 74 68 65 72 20 22 61 75 74 6f 6d 61  n either "automa
8310: 74 69 63 22 20 6f 72 20 22 6e 6f 6e 2d 73 74 61  tic" or "non-sta
8320: 6e 64 61 72 64 22 20 6d 6f 64 65 73 2c 20 61 74  ndard" modes, at
8330: 74 65 6d 70 74 0d 0a 20 20 20 20 20 20 23 20 20  tempt..      #  
8340: 20 20 20 20 20 74 6f 20 66 69 6e 64 20 74 68 65       to find the
8350: 20 6e 61 74 69 76 65 2d 6f 6e 6c 79 20 69 6e 74   native-only int
8360: 65 72 6f 70 20 61 73 73 65 6d 62 6c 79 2e 0d 0a  erop assembly...
8370: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
8380: 66 20 7b 24 61 75 74 6f 6d 61 74 69 63 20 7c 7c  f {$automatic ||
8390: 20 21 24 73 74 61 6e 64 61 72 64 7d 20 74 68 65   !$standard} the
83a0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
83b0: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
83c0: 41 74 74 65 6d 70 74 20 74 6f 20 64 65 74 65 72  Attempt to deter
83d0: 6d 69 6e 65 20 74 68 65 20 6e 61 74 69 76 65 2d  mine the native-
83e0: 6f 6e 6c 79 20 69 6e 74 65 72 6f 70 20 61 73 73  only interop ass
83f0: 65 6d 62 6c 79 20 66 69 6c 65 0d 0a 20 20 20 20  embly file..    
8400: 20 20 20 20 23 20 20 20 20 20 20 20 6e 61 6d 65      #       name
8410: 20 66 6f 72 20 74 68 69 73 20 70 6c 61 74 66 6f   for this platfo
8420: 72 6d 20 61 6e 64 20 74 68 65 6e 20 72 65 74 75  rm and then retu
8430: 72 6e 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20  rn it...        
8440: 23 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61  #..        forea
8450: 63 68 20 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20  ch fileNameOnly 
8460: 5b 67 65 74 49 6e 74 65 72 6f 70 41 73 73 65 6d  [getInteropAssem
8470: 62 6c 79 46 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79  blyFileNamesOnly
8480: 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73  ] {..          s
8490: 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c  et fileName [fil
84a0: 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5c 0d 0a  e nativename \..
84b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 66                [f
84c0: 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 42 69 6e  ile join [getBin
84d0: 61 72 79 44 69 72 65 63 74 6f 72 79 5d 20 24 70  aryDirectory] $p
84e0: 6c 61 74 66 6f 72 6d 20 24 66 69 6c 65 4e 61 6d  latform $fileNam
84f0: 65 4f 6e 6c 79 5d 5d 0d 0a 0d 0a 20 20 20 20 20  eOnly]]....     
8500: 20 20 20 20 20 69 66 20 7b 5b 66 69 6c 65 20 65       if {[file e
8510: 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d  xists $fileName]
8520: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
8530: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 66 69        return $fi
8540: 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20  leName..        
8550: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
8560: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
8570: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
8580: 3a 20 54 68 65 6e 2c 20 69 6e 20 65 69 74 68 65  : Then, in eithe
8590: 72 20 22 61 75 74 6f 6d 61 74 69 63 22 20 6f 72  r "automatic" or
85a0: 20 22 73 74 61 6e 64 61 72 64 22 20 6d 6f 64 65   "standard" mode
85b0: 73 2c 20 61 74 74 65 6d 70 74 20 74 6f 0d 0a 20  s, attempt to.. 
85c0: 20 20 20 20 20 23 20 20 20 20 20 20 20 66 69 6e       #       fin
85d0: 64 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 53  d the standard S
85e0: 51 4c 69 74 65 20 6c 69 62 72 61 72 79 2e 0d 0a  QLite library...
85f0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
8600: 66 20 7b 24 61 75 74 6f 6d 61 74 69 63 20 7c 7c  f {$automatic ||
8610: 20 24 73 74 61 6e 64 61 72 64 7d 20 74 68 65 6e   $standard} then
8620: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
8630: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41         # NOTE: A
8640: 74 74 65 6d 70 74 20 74 6f 20 64 65 74 65 72 6d  ttempt to determ
8650: 69 6e 65 20 74 68 65 20 6e 61 74 69 76 65 2d 6f  ine the native-o
8660: 6e 6c 79 20 73 74 61 6e 64 61 72 64 20 53 51 4c  nly standard SQL
8670: 69 74 65 20 6c 69 62 72 61 72 79 0d 0a 20 20 20  ite library..   
8680: 20 20 20 20 20 23 20 20 20 20 20 20 20 66 69 6c       #       fil
8690: 65 20 6e 61 6d 65 20 66 6f 72 20 74 68 69 73 20  e name for this 
86a0: 70 6c 61 74 66 6f 72 6d 20 61 6e 64 20 74 68 65  platform and the
86b0: 6e 20 72 65 74 75 72 6e 20 69 74 2e 0d 0a 20 20  n return it...  
86c0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
86d0: 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d   foreach fileNam
86e0: 65 4f 6e 6c 79 20 5b 67 65 74 4e 61 74 69 76 65  eOnly [getNative
86f0: 4c 69 62 72 61 72 79 46 69 6c 65 4e 61 6d 65 73  LibraryFileNames
8700: 4f 6e 6c 79 5d 20 7b 0d 0a 20 20 20 20 20 20 20  Only] {..       
8710: 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 20     set fileName 
8720: 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65  [file nativename
8730: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
8740: 20 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65    [file join [ge
8750: 74 42 69 6e 61 72 79 44 69 72 65 63 74 6f 72 79  tBinaryDirectory
8760: 5d 20 24 70 6c 61 74 66 6f 72 6d 20 24 66 69 6c  ] $platform $fil
8770: 65 4e 61 6d 65 4f 6e 6c 79 5d 5d 0d 0a 0d 0a 20  eNameOnly]].... 
8780: 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 66 69           if {[fi
8790: 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c 65 4e  le exists $fileN
87a0: 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ame]} then {..  
87b0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
87c0: 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20   $fileName..    
87d0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
87e0: 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20   }..      }.... 
87f0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
8800: 4e 4f 54 45 3a 20 57 61 73 20 74 68 65 20 6d 61  NOTE: Was the ma
8810: 6e 61 67 65 64 20 61 73 73 65 6d 62 6c 79 20 63  naged assembly c
8820: 6f 6d 70 69 6c 65 64 20 65 78 70 65 63 74 69 6e  ompiled expectin
8830: 67 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 74  g to deal with t
8840: 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  he..      #     
8850: 20 20 73 74 61 6e 64 61 72 64 20 63 6f 72 65 20    standard core 
8860: 6c 69 62 72 61 72 79 3f 0d 0a 20 20 20 20 20 20  library?..      
8870: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 68 61  #..      if {[ha
8880: 76 65 53 51 4c 69 74 65 44 65 66 69 6e 65 43 6f  veSQLiteDefineCo
8890: 6e 73 74 61 6e 74 20 53 51 4c 49 54 45 5f 53 54  nstant SQLITE_ST
88a0: 41 4e 44 41 52 44 5d 7d 20 74 68 65 6e 20 7b 0d  ANDARD]} then {.
88b0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
88c0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 61 6c 6c      # NOTE: Fall
88d0: 62 61 63 6b 20 74 6f 20 72 65 74 75 72 6e 69 6e  back to returnin
88e0: 67 20 74 68 65 20 6e 61 74 69 76 65 2d 6f 6e 6c  g the native-onl
88f0: 79 20 73 74 61 6e 64 61 72 64 20 53 51 4c 69 74  y standard SQLit
8900: 65 20 6c 69 62 72 61 72 79 0d 0a 20 20 20 20 20  e library..     
8910: 20 20 20 23 20 20 20 20 20 20 20 66 69 6c 65 20     #       file 
8920: 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 70 6c 61  name for the pla
8930: 74 66 6f 72 6d 2e 0d 0a 20 20 20 20 20 20 20 20  tform...        
8940: 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 66  #..        set f
8950: 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79 20 5b 67 65  ileNamesOnly [ge
8960: 74 4e 61 74 69 76 65 4c 69 62 72 61 72 79 46 69  tNativeLibraryFi
8970: 6c 65 4e 61 6d 65 73 4f 6e 6c 79 5d 0d 0a 0d 0a  leNamesOnly]....
8980: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 6c 6c 65          if {[lle
8990: 6e 67 74 68 20 24 66 69 6c 65 4e 61 6d 65 73 4f  ngth $fileNamesO
89a0: 6e 6c 79 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  nly] == 0} then 
89b0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  {..          ret
89c0: 75 72 6e 20 22 22 0d 0a 20 20 20 20 20 20 20 20  urn ""..        
89d0: 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 72 65 74  }....        ret
89e0: 75 72 6e 20 5b 66 69 6c 65 20 6e 61 74 69 76 65  urn [file native
89f0: 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20  name [file join 
8a00: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
8a10: 67 65 74 42 69 6e 61 72 79 44 69 72 65 63 74 6f  getBinaryDirecto
8a20: 72 79 5d 20 24 70 6c 61 74 66 6f 72 6d 20 5b 6c  ry] $platform [l
8a30: 69 6e 64 65 78 20 24 66 69 6c 65 4e 61 6d 65 73  index $fileNames
8a40: 4f 6e 6c 79 20 30 5d 5d 5d 0d 0a 20 20 20 20 20  Only 0]]]..     
8a50: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
8a60: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
8a70: 4e 4f 54 45 3a 20 46 61 6c 6c 62 61 63 6b 20 74  NOTE: Fallback t
8a80: 6f 20 72 65 74 75 72 6e 69 6e 67 20 74 68 65 20  o returning the 
8a90: 6e 61 74 69 76 65 2d 6f 6e 6c 79 20 69 6e 74 65  native-only inte
8aa0: 72 6f 70 20 61 73 73 65 6d 62 6c 79 20 66 69 6c  rop assembly fil
8ab0: 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
8ac0: 20 20 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20     name for the 
8ad0: 70 6c 61 74 66 6f 72 6d 2e 0d 0a 20 20 20 20 20  platform...     
8ae0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65     #..        se
8af0: 74 20 66 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79 20  t fileNamesOnly 
8b00: 5b 67 65 74 49 6e 74 65 72 6f 70 41 73 73 65 6d  [getInteropAssem
8b10: 62 6c 79 46 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79  blyFileNamesOnly
8b20: 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20  ]....        if 
8b30: 7b 5b 6c 6c 65 6e 67 74 68 20 24 66 69 6c 65 4e  {[llength $fileN
8b40: 61 6d 65 73 4f 6e 6c 79 5d 20 3d 3d 20 30 7d 20  amesOnly] == 0} 
8b50: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
8b60: 20 20 72 65 74 75 72 6e 20 22 22 0d 0a 20 20 20    return ""..   
8b70: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
8b80: 20 20 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 6e    return [file n
8b90: 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20  ativename [file 
8ba0: 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20  join \..        
8bb0: 20 20 20 20 5b 67 65 74 42 69 6e 61 72 79 44 69      [getBinaryDi
8bc0: 72 65 63 74 6f 72 79 5d 20 24 70 6c 61 74 66 6f  rectory] $platfo
8bd0: 72 6d 20 5b 6c 69 6e 64 65 78 20 24 66 69 6c 65  rm [lindex $file
8be0: 4e 61 6d 65 73 4f 6e 6c 79 20 30 5d 5d 5d 0d 0a  NamesOnly 0]]]..
8bf0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
8c00: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 43  ...    proc getC
8c10: 6f 6d 6d 6f 6e 44 69 72 65 63 74 6f 72 79 20 7b  ommonDirectory {
8c20: 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
8c30: 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73      # NOTE: This
8c40: 20 70 72 6f 63 65 64 75 72 65 20 72 65 74 75 72   procedure retur
8c50: 6e 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  ns the directory
8c60: 20 77 68 65 72 65 20 74 68 65 20 74 65 73 74 20   where the test 
8c70: 73 63 72 69 70 74 73 0d 0a 20 20 20 20 20 20 23  scripts..      #
8c80: 20 20 20 20 20 20 20 73 68 6f 75 6c 64 20 62 65         should be
8c90: 20 6c 6f 63 61 74 65 64 2e 20 20 42 79 20 64 65   located.  By de
8ca0: 66 61 75 6c 74 2c 20 74 68 69 73 20 6a 75 73 74  fault, this just
8cb0: 20 72 65 74 75 72 6e 73 20 74 68 65 20 45 61 67   returns the Eag
8cc0: 6c 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  le..      #     
8cd0: 20 20 62 69 6e 61 72 79 20 64 69 72 65 63 74 6f    binary directo
8ce0: 72 79 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ry...      #..  
8cf0: 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
8d00: 69 73 74 73 20 3a 3a 63 6f 6d 6d 6f 6e 5f 64 69  ists ::common_di
8d10: 72 65 63 74 6f 72 79 5d 20 26 26 20 5c 0d 0a 20  rectory] && \.. 
8d20: 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67           [string
8d30: 20 6c 65 6e 67 74 68 20 24 3a 3a 63 6f 6d 6d 6f   length $::commo
8d40: 6e 5f 64 69 72 65 63 74 6f 72 79 5d 20 3e 20 30  n_directory] > 0
8d50: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
8d60: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
8d70: 4f 54 45 3a 20 54 68 65 20 6c 6f 63 61 74 69 6f  OTE: The locatio
8d80: 6e 20 6f 66 20 74 68 65 20 63 6f 6d 6d 6f 6e 20  n of the common 
8d90: 64 69 72 65 63 74 6f 72 79 20 68 61 73 20 62 65  directory has be
8da0: 65 6e 20 73 65 74 3b 0d 0a 20 20 20 20 20 20 20  en set;..       
8db0: 20 23 20 20 20 20 20 20 20 74 68 65 72 65 66 6f   #       therefo
8dc0: 72 65 2c 20 75 73 65 20 69 74 2e 0d 0a 20 20 20  re, use it...   
8dd0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
8de0: 72 65 74 75 72 6e 20 24 3a 3a 63 6f 6d 6d 6f 6e  return $::common
8df0: 5f 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20  _directory..    
8e00: 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66    } elseif {[inf
8e10: 6f 20 65 78 69 73 74 73 20 3a 3a 76 65 6e 64 6f  o exists ::vendo
8e20: 72 5f 64 69 72 65 63 74 6f 72 79 5d 20 26 26 20  r_directory] && 
8e30: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74  \..          [st
8e40: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 76  ring length $::v
8e50: 65 6e 64 6f 72 5f 64 69 72 65 63 74 6f 72 79 5d  endor_directory]
8e60: 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
8e70: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
8e80: 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c 6f 63   # NOTE: The loc
8e90: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 76 65 6e  ation of the ven
8ea0: 64 6f 72 20 64 69 72 65 63 74 6f 72 79 20 68 61  dor directory ha
8eb0: 73 20 62 65 65 6e 20 73 65 74 3b 0d 0a 20 20 20  s been set;..   
8ec0: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
8ed0: 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74 2e 0d  refore, use it..
8ee0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
8ef0: 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 76 65      return $::ve
8f00: 6e 64 6f 72 5f 64 69 72 65 63 74 6f 72 79 0d 0a  ndor_directory..
8f10: 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b        } elseif {
8f20: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74  [info exists ::t
8f30: 63 6c 5f 6c 69 62 72 61 72 79 5d 20 26 26 20 5c  cl_library] && \
8f40: 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72  ..          [str
8f50: 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 74 63  ing length $::tc
8f60: 6c 5f 6c 69 62 72 61 72 79 5d 20 3e 20 30 20 26  l_library] > 0 &
8f70: 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b  & \..          [
8f80: 66 69 6c 65 20 69 73 64 69 72 65 63 74 6f 72 79  file isdirectory
8f90: 20 24 3a 3a 74 63 6c 5f 6c 69 62 72 61 72 79 5d   $::tcl_library]
8fa0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
8fb0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
8fc0: 4f 54 45 3a 20 54 68 65 20 76 61 72 69 61 62 6c  OTE: The variabl
8fd0: 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 61 74  e with the locat
8fe0: 69 6f 6e 20 6f 66 20 74 68 65 20 73 63 72 69 70  ion of the scrip
8ff0: 74 20 6c 69 62 72 61 72 79 20 69 73 0d 0a 20 20  t library is..  
9000: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73 65        #       se
9010: 74 20 61 6e 64 20 61 70 70 65 61 72 73 20 74 6f  t and appears to
9020: 20 62 65 20 61 20 72 65 61 6c 20 64 69 72 65 63   be a real direc
9030: 74 6f 72 79 20 28 69 2e 65 2e 20 6e 6f 74 20 65  tory (i.e. not e
9040: 6d 62 65 64 64 65 64 0d 0a 20 20 20 20 20 20 20  mbedded..       
9050: 20 23 20 20 20 20 20 20 20 77 69 74 68 69 6e 20   #       within 
9060: 61 20 66 69 6c 65 29 3b 20 74 68 65 72 65 66 6f  a file); therefo
9070: 72 65 2c 20 75 73 65 20 69 74 2e 0d 0a 20 20 20  re, use it...   
9080: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
9090: 72 65 74 75 72 6e 20 24 3a 3a 74 63 6c 5f 6c 69  return $::tcl_li
90a0: 62 72 61 72 79 0d 0a 20 20 20 20 20 20 7d 20 65  brary..      } e
90b0: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  lse {..        #
90c0: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
90d0: 3a 20 46 61 6c 6c 62 61 63 6b 20 74 6f 20 74 68  : Fallback to th
90e0: 65 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 74  e directory cont
90f0: 61 69 6e 69 6e 67 20 74 68 65 20 65 78 65 63 75  aining the execu
9100: 74 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20  table...        
9110: 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  #..        retur
9120: 6e 20 5b 69 6e 66 6f 20 62 69 6e 61 72 79 5d 0d  n [info binary].
9130: 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
9140: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74  ....    proc get
9150: 44 61 74 61 62 61 73 65 44 69 72 65 63 74 6f 72  DatabaseDirector
9160: 79 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  y {} {..      #.
9170: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54  .      # NOTE: T
9180: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 72 65  his procedure re
9190: 74 75 72 6e 73 20 74 68 65 20 64 69 72 65 63 74  turns the direct
91a0: 6f 72 79 20 77 68 65 72 65 20 74 68 65 20 74 65  ory where the te
91b0: 73 74 20 64 61 74 61 62 61 73 65 73 0d 0a 20 20  st databases..  
91c0: 20 20 20 20 23 20 20 20 20 20 20 20 73 68 6f 75      #       shou
91d0: 6c 64 20 62 65 20 6c 6f 63 61 74 65 64 2e 20 20  ld be located.  
91e0: 42 79 20 64 65 66 61 75 6c 74 2c 20 74 68 69 73  By default, this
91f0: 20 6a 75 73 74 20 75 73 65 73 20 74 68 65 20 74   just uses the t
9200: 65 6d 70 6f 72 61 72 79 0d 0a 20 20 20 20 20 20  emporary..      
9210: 23 20 20 20 20 20 20 20 64 69 72 65 63 74 6f 72  #       director
9220: 79 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72  y configured for
9230: 20 74 68 69 73 20 73 79 73 74 65 6d 2e 0d 0a 20   this system... 
9240: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
9250: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
9260: 3a 64 61 74 61 62 61 73 65 5f 64 69 72 65 63 74  :database_direct
9270: 6f 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  ory] && \..     
9280: 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
9290: 67 74 68 20 24 3a 3a 64 61 74 61 62 61 73 65 5f  gth $::database_
92a0: 64 69 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20  directory] > 0} 
92b0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
92c0: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
92d0: 45 3a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20  E: The location 
92e0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
92f0: 64 69 72 65 63 74 6f 72 79 20 68 61 73 20 62 65  directory has be
9300: 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b 0d 0a  en overridden;..
9310: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
9320: 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69  therefore, use i
9330: 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  t...        #.. 
9340: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a         return $:
9350: 3a 64 61 74 61 62 61 73 65 5f 64 69 72 65 63 74  :database_direct
9360: 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  ory..      } els
9370: 65 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74  eif {[info exist
9380: 73 20 3a 3a 73 63 72 61 74 63 68 5f 64 69 72 65  s ::scratch_dire
9390: 63 74 6f 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20  ctory] && \..   
93a0: 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c         [string l
93b0: 65 6e 67 74 68 20 24 3a 3a 73 63 72 61 74 63 68  ength $::scratch
93c0: 5f 64 69 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d  _directory] > 0}
93d0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
93e0: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
93f0: 54 45 3a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e  TE: The location
9400: 20 6f 66 20 74 68 65 20 73 63 72 61 74 63 68 20   of the scratch 
9410: 64 69 72 65 63 74 6f 72 79 20 68 61 73 20 62 65  directory has be
9420: 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b 0d 0a  en overridden;..
9430: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
9440: 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69  therefore, use i
9450: 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  t...        #.. 
9460: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a         return $:
9470: 3a 73 63 72 61 74 63 68 5f 64 69 72 65 63 74 6f  :scratch_directo
9480: 72 79 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  ry..      } else
9490: 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   {..        retu
94a0: 72 6e 20 5b 67 65 74 54 65 6d 70 6f 72 61 72 79  rn [getTemporary
94b0: 50 61 74 68 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a  Path]..      }..
94c0: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
94d0: 6f 63 20 67 65 74 54 65 6d 70 6f 72 61 72 79 44  oc getTemporaryD
94e0: 69 72 65 63 74 6f 72 79 20 7b 7d 20 7b 0d 0a 20  irectory {} {.. 
94f0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
9500: 4e 4f 54 45 3a 20 54 68 69 73 20 70 72 6f 63 65  NOTE: This proce
9510: 64 75 72 65 20 72 65 74 75 72 6e 73 20 74 68 65  dure returns the
9520: 20 64 69 72 65 63 74 6f 72 79 20 77 68 65 72 65   directory where
9530: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66   the temporary f
9540: 69 6c 65 73 0d 0a 20 20 20 20 20 20 23 20 20 20  iles..      #   
9550: 20 20 20 20 73 68 6f 75 6c 64 20 62 65 20 6c 6f      should be lo
9560: 63 61 74 65 64 2e 20 20 42 79 20 64 65 66 61 75  cated.  By defau
9570: 6c 74 2c 20 74 68 69 73 20 6a 75 73 74 20 75 73  lt, this just us
9580: 65 73 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  es the temporary
9590: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
95a0: 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 66 69 67  directory config
95b0: 75 72 65 64 20 66 6f 72 20 74 68 69 73 20 73 79  ured for this sy
95c0: 73 74 65 6d 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  stem...      #..
95d0: 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20        if {[info 
95e0: 65 78 69 73 74 73 20 3a 3a 74 65 6d 70 6f 72 61  exists ::tempora
95f0: 72 79 5f 64 69 72 65 63 74 6f 72 79 5d 20 26 26  ry_directory] &&
9600: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73   \..          [s
9610: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a  tring length $::
9620: 74 65 6d 70 6f 72 61 72 79 5f 64 69 72 65 63 74  temporary_direct
9630: 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ory] > 0} then {
9640: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
9650: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65       # NOTE: The
9660: 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65   location of the
9670: 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63   temporary direc
9680: 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 6f 76  tory has been ov
9690: 65 72 72 69 64 64 65 6e 3b 0d 0a 20 20 20 20 20  erridden;..     
96a0: 20 20 20 23 20 20 20 20 20 20 20 74 68 65 72 65     #       there
96b0: 66 6f 72 65 2c 20 75 73 65 20 69 74 2e 0d 0a 20  fore, use it... 
96c0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
96d0: 20 20 72 65 74 75 72 6e 20 24 3a 3a 74 65 6d 70    return $::temp
96e0: 6f 72 61 72 79 5f 64 69 72 65 63 74 6f 72 79 0d  orary_directory.
96f0: 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20  .      } elseif 
9700: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
9710: 73 63 72 61 74 63 68 5f 64 69 72 65 63 74 6f 72  scratch_director
9720: 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  y] && \..       
9730: 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74     [string lengt
9740: 68 20 24 3a 3a 73 63 72 61 74 63 68 5f 64 69 72  h $::scratch_dir
9750: 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65  ectory] > 0} the
9760: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
9770: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
9780: 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20  The location of 
9790: 74 68 65 20 73 63 72 61 74 63 68 20 64 69 72 65  the scratch dire
97a0: 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 6f  ctory has been o
97b0: 76 65 72 72 69 64 64 65 6e 3b 0d 0a 20 20 20 20  verridden;..    
97c0: 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65 72      #       ther
97d0: 65 66 6f 72 65 2c 20 75 73 65 20 69 74 2e 0d 0a  efore, use it...
97e0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
97f0: 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 73 63 72     return $::scr
9800: 61 74 63 68 5f 64 69 72 65 63 74 6f 72 79 0d 0a  atch_directory..
9810: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
9820: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b          return [
9830: 67 65 74 54 65 6d 70 6f 72 61 72 79 50 61 74 68  getTemporaryPath
9840: 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  ]..      }..    
9850: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67  }.....    proc g
9860: 65 74 45 78 65 63 75 74 65 4f 6e 53 65 74 75 70  etExecuteOnSetup
9870: 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66 20   {} {..      if 
9880: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
9890: 65 78 65 63 75 74 65 5f 6f 6e 5f 73 65 74 75 70  execute_on_setup
98a0: 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
98b0: 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
98c0: 20 24 3a 3a 65 78 65 63 75 74 65 5f 6f 6e 5f 73   $::execute_on_s
98d0: 65 74 75 70 5d 20 3e 20 30 7d 20 74 68 65 6e 20  etup] > 0} then 
98e0: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
98f0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65        # NOTE: Re
9900: 74 75 72 6e 20 74 68 65 20 63 6f 6e 66 69 67 75  turn the configu
9910: 72 65 64 20 53 51 4c 20 74 6f 20 65 78 65 63 75  red SQL to execu
9920: 74 65 20 64 75 72 69 6e 67 20 74 68 65 20 63 6f  te during the co
9930: 6e 6e 65 63 74 69 6f 6e 0d 0a 20 20 20 20 20 20  nnection..      
9940: 20 20 23 20 20 20 20 20 20 20 73 65 74 75 70 20    #       setup 
9950: 70 72 6f 63 65 64 75 72 65 20 28 69 2e 65 2e 20  procedure (i.e. 
9960: 66 6f 72 20 65 76 65 72 79 20 74 65 73 74 20 64  for every test d
9970: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
9980: 6f 6e 29 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  on)...        #.
9990: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
99a0: 24 3a 3a 65 78 65 63 75 74 65 5f 6f 6e 5f 73 65  $::execute_on_se
99b0: 74 75 70 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  tup..      } els
99c0: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  e {..        #..
99d0: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
99e0: 42 79 20 64 65 66 61 75 6c 74 2c 20 74 68 65 72  By default, ther
99f0: 65 20 69 73 20 6e 6f 20 53 51 4c 20 74 6f 20 65  e is no SQL to e
9a00: 78 65 63 75 74 65 20 64 75 72 69 6e 67 20 74 68  xecute during th
9a10: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0d 0a 20 20  e connection..  
9a20: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73 65        #       se
9a30: 74 75 70 20 70 72 6f 63 65 64 75 72 65 20 28 69  tup procedure (i
9a40: 2e 65 2e 20 66 6f 72 20 65 76 65 72 79 20 74 65  .e. for every te
9a50: 73 74 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  st database conn
9a60: 65 63 74 69 6f 6e 29 2e 0d 0a 20 20 20 20 20 20  ection)...      
9a70: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
9a80: 75 72 6e 20 22 22 0d 0a 20 20 20 20 20 20 7d 0d  urn ""..      }.
9a90: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
9aa0: 72 6f 63 20 67 65 74 53 74 72 69 6e 67 4d 61 70  roc getStringMap
9ab0: 46 6f 72 54 63 6c 45 73 63 61 70 65 20 7b 7d 20  ForTclEscape {} 
9ac0: 7b 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  {..      return 
9ad0: 5b 6c 69 73 74 20 5c 5c 20 5c 5c 5c 5c 20 5c 5b  [list \\ \\\\ \[
9ae0: 20 5c 5c 5c 5b 20 5c 5d 20 5c 5c 5c 5d 20 5c 24   \\\[ \] \\\] \$
9af0: 20 5c 5c 5c 24 5d 0d 0a 20 20 20 20 7d 0d 0a 0c   \\\$]..    }...
9b00: 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 54 65  ..    proc getTe
9b10: 73 74 4f 76 65 72 72 69 64 65 73 50 72 65 61 6d  stOverridesPream
9b20: 62 6c 65 20 7b 20 7b 65 78 74 72 61 56 61 72 4e  ble { {extraVarN
9b30: 61 6d 65 73 20 22 22 7d 20 7d 20 7b 0d 0a 20 20  ames ""} } {..  
9b40: 20 20 20 20 73 65 74 20 76 61 72 4e 61 6d 65 73      set varNames
9b50: 20 5b 6c 69 73 74 5d 0d 0a 0d 0a 20 20 20 20 20   [list]....     
9b60: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
9b70: 3a 20 49 66 20 61 76 61 69 6c 61 62 6c 65 2c 20  : If available, 
9b80: 73 74 61 72 74 20 77 69 74 68 20 74 68 65 20 6d  start with the m
9b90: 61 73 74 65 72 20 6c 69 73 74 20 6f 66 20 74 65  aster list of te
9ba0: 73 74 20 6f 76 65 72 72 69 64 65 0d 0a 20 20 20  st override..   
9bb0: 20 20 20 23 20 20 20 20 20 20 20 76 61 72 69 61     #       varia
9bc0: 62 6c 65 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  bles...      #..
9bd0: 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20        if {[info 
9be0: 65 78 69 73 74 73 20 3a 3a 74 65 73 74 5f 6f 76  exists ::test_ov
9bf0: 65 72 72 69 64 65 73 5d 20 26 26 20 5c 0d 0a 20  errides] && \.. 
9c00: 20 20 20 20 20 20 20 20 20 5b 6c 6c 65 6e 67 74           [llengt
9c10: 68 20 24 3a 3a 74 65 73 74 5f 6f 76 65 72 72 69  h $::test_overri
9c20: 64 65 73 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  des] > 0} then {
9c30: 0d 0a 20 20 20 20 20 20 20 20 65 76 61 6c 20 6c  ..        eval l
9c40: 61 70 70 65 6e 64 20 76 61 72 4e 61 6d 65 73 20  append varNames 
9c50: 24 3a 3a 74 65 73 74 5f 6f 76 65 72 72 69 64 65  $::test_override
9c60: 73 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  s..      }....  
9c70: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
9c80: 4f 54 45 3a 20 49 66 20 72 65 71 75 65 73 74 65  OTE: If requeste
9c90: 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 2c  d by our caller,
9ca0: 20 61 64 64 20 61 6e 79 20 61 64 64 69 74 69 6f   add any additio
9cb0: 6e 61 6c 20 76 61 72 69 61 62 6c 65 0d 0a 20 20  nal variable..  
9cc0: 20 20 20 20 23 20 20 20 20 20 20 20 6e 61 6d 65      #       name
9cd0: 73 20 74 6f 20 63 6f 70 79 20 6e 6f 77 2e 0d 0a  s to copy now...
9ce0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
9cf0: 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 65 78 74  f {[llength $ext
9d00: 72 61 56 61 72 4e 61 6d 65 73 5d 20 3e 20 30 7d  raVarNames] > 0}
9d10: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
9d20: 20 65 76 61 6c 20 6c 61 70 70 65 6e 64 20 76 61   eval lappend va
9d30: 72 4e 61 6d 65 73 20 24 65 78 74 72 61 56 61 72  rNames $extraVar
9d40: 4e 61 6d 65 73 0d 0a 20 20 20 20 20 20 7d 0d 0a  Names..      }..
9d50: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
9d60: 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74   # NOTE: Build t
9d70: 68 65 20 73 63 72 69 70 74 20 66 72 61 67 6d 65  he script fragme
9d80: 6e 74 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65  nt to be returne
9d90: 64 20 62 79 20 70 72 6f 63 65 73 73 69 6e 67 20  d by processing 
9da0: 65 61 63 68 0d 0a 20 20 20 20 20 20 23 20 20 20  each..      #   
9db0: 20 20 20 20 76 61 72 69 61 62 6c 65 20 6e 61 6d      variable nam
9dc0: 65 20 61 6e 64 20 61 64 64 69 6e 67 20 74 68 65  e and adding the
9dd0: 20 6e 65 63 65 63 65 73 73 61 72 79 20 73 63 72   nececessary scr
9de0: 69 70 74 20 66 72 61 67 6d 65 6e 74 73 20 66 6f  ipt fragments fo
9df0: 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  r..      #      
9e00: 20 65 61 63 68 20 6f 6e 65 2e 0d 0a 20 20 20 20   each one...    
9e10: 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 72    #..      set r
9e20: 65 73 75 6c 74 20 22 22 0d 0a 0d 0a 20 20 20 20  esult ""....    
9e30: 20 20 66 6f 72 65 61 63 68 20 76 61 72 4e 61 6d    foreach varNam
9e40: 65 20 24 76 61 72 4e 61 6d 65 73 20 7b 0d 0a 20  e $varNames {.. 
9e50: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
9e60: 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20    # NOTE: Build 
9e70: 74 68 65 20 71 75 61 6c 69 66 69 65 64 20 67 6c  the qualified gl
9e80: 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 6e 61  obal variable na
9e90: 6d 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  me...        #..
9ea0: 20 20 20 20 20 20 20 20 73 65 74 20 66 75 6c 6c          set full
9eb0: 56 61 72 4e 61 6d 65 20 5b 61 70 70 65 6e 64 41  VarName [appendA
9ec0: 72 67 73 20 3a 3a 20 24 76 61 72 4e 61 6d 65 5d  rgs :: $varName]
9ed0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
9ee0: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 44         # NOTE: D
9ef0: 6f 65 73 20 74 68 65 20 76 61 72 69 61 62 6c 65  oes the variable
9f00: 20 65 78 69 73 74 20 69 6e 20 74 68 69 73 20 69   exist in this i
9f10: 6e 74 65 72 70 72 65 74 65 72 20 63 6f 6e 74 65  nterpreter conte
9f20: 78 74 3f 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  xt?..        #..
9f30: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66          if {[inf
9f40: 6f 20 65 78 69 73 74 73 20 24 66 75 6c 6c 56 61  o exists $fullVa
9f50: 72 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a  rName]} then {..
9f60: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
9f70: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41         # NOTE: A
9f80: 70 70 65 6e 64 20 61 20 73 63 72 69 70 74 20 66  ppend a script f
9f90: 72 61 67 6d 65 6e 74 20 74 6f 20 74 68 65 20 72  ragment to the r
9fa0: 65 73 75 6c 74 20 74 68 61 74 20 77 69 6c 6c 20  esult that will 
9fb0: 63 6f 72 72 65 63 74 6c 79 0d 0a 20 20 20 20 20  correctly..     
9fc0: 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 70       #       cop
9fd0: 79 20 61 6e 79 20 63 6f 6e 74 61 69 6e 65 64 20  y any contained 
9fe0: 76 61 6c 75 65 20 74 6f 20 61 6e 6f 74 68 65 72  value to another
9ff0: 20 69 6e 74 65 72 70 72 65 74 65 72 20 63 6f 6e   interpreter con
a000: 74 65 78 74 2e 0d 0a 20 20 20 20 20 20 20 20 20  text...         
a010: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 61 70   #..          ap
a020: 70 65 6e 64 20 72 65 73 75 6c 74 20 5c 6e 20 22  pend result \n "
a030: 73 65 74 20 22 20 24 66 75 6c 6c 56 61 72 4e 61  set " $fullVarNa
a040: 6d 65 20 22 20 5c 7b 22 20 5b 73 74 72 69 6e 67  me " \{" [string
a050: 20 6d 61 70 20 5c 0d 0a 20 20 20 20 20 20 20 20   map \..        
a060: 20 20 20 20 20 20 5b 67 65 74 53 74 72 69 6e 67        [getString
a070: 4d 61 70 46 6f 72 54 63 6c 45 73 63 61 70 65 5d  MapForTclEscape]
a080: 20 5b 73 65 74 20 24 66 75 6c 6c 56 61 72 4e 61   [set $fullVarNa
a090: 6d 65 5d 5d 20 5c 7d 0d 0a 20 20 20 20 20 20 20  me]] \}..       
a0a0: 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20   }..      }.... 
a0b0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
a0c0: 4e 4f 54 45 3a 20 49 66 20 74 68 65 20 72 65 73  NOTE: If the res
a0d0: 75 6c 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65  ult contains one
a0e0: 20 6f 72 20 6d 6f 72 65 20 73 63 72 69 70 74 20   or more script 
a0f0: 66 72 61 67 6d 65 6e 74 73 2c 20 61 70 70 65 6e  fragments, appen
a100: 64 20 61 0d 0a 20 20 20 20 20 20 23 20 20 20 20  d a..      #    
a110: 20 20 20 6e 65 77 6c 69 6e 65 2e 0d 0a 20 20 20     newline...   
a120: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
a130: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
a140: 72 65 73 75 6c 74 5d 20 3e 20 30 7d 20 74 68 65  result] > 0} the
a150: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 61 70 70  n {..        app
a160: 65 6e 64 20 72 65 73 75 6c 74 20 5c 6e 0d 0a 20  end result \n.. 
a170: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
a180: 72 65 74 75 72 6e 20 24 72 65 73 75 6c 74 0d 0a  return $result..
a190: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
a1a0: 6f 63 20 6d 6f 76 65 53 79 73 74 65 6d 44 61 74  oc moveSystemDat
a1b0: 61 53 51 4c 69 74 65 44 6c 6c 43 6f 6e 66 69 67  aSQLiteDllConfig
a1c0: 20 7b 20 7b 72 65 73 74 6f 72 65 20 66 61 6c 73   { {restore fals
a1d0: 65 7d 20 7b 76 65 72 62 6f 73 65 20 74 72 75 65  e} {verbose true
a1e0: 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74  } } {..      set
a1f0: 20 64 69 72 65 63 74 6f 72 79 20 5b 67 65 74 42   directory [getB
a200: 69 6e 61 72 79 44 69 72 65 63 74 6f 72 79 5d 0d  inaryDirectory].
a210: 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74  ...      if {[st
a220: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 64 69 72  ring length $dir
a230: 65 63 74 6f 72 79 5d 20 3d 3d 20 30 7d 20 74 68  ectory] == 0} th
a240: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66  en {..        if
a250: 20 7b 24 76 65 72 62 6f 73 65 7d 20 74 68 65 6e   {$verbose} then
a260: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70   {..          tp
a270: 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
a280: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
a290: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
a2a0: 20 22 2d 2d 2d 2d 20 73 6b 69 70 70 65 64 20 6d   "---- skipped m
a2b0: 6f 76 69 6e 67 20 5c 22 53 79 73 74 65 6d 2e 44  oving \"System.D
a2c0: 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 2e 63  ata.SQLite.dll.c
a2d0: 6f 6e 66 69 67 5c 22 2c 20 22 20 5c 0d 0a 20 20  onfig\", " \..  
a2e0: 20 20 20 20 20 20 20 20 20 20 20 20 22 6e 6f 20              "no 
a2f0: 62 69 6e 61 72 79 20 64 69 72 65 63 74 6f 72 79  binary directory
a300: 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d  \n"]..        }.
a310: 0a 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ...        retur
a320: 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  n..      }....  
a330: 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65      set fileName
a340: 28 31 29 20 5b 66 69 6c 65 20 6e 6f 72 6d 61 6c  (1) [file normal
a350: 69 7a 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ize \..         
a360: 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 64 69 72   [file join $dir
a370: 65 63 74 6f 72 79 20 53 79 73 74 65 6d 2e 44 61  ectory System.Da
a380: 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 2e 63 6f  ta.SQLite.dll.co
a390: 6e 66 69 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20  nfig]]....      
a3a0: 73 65 74 20 66 69 6c 65 4e 61 6d 65 28 32 29 20  set fileName(2) 
a3b0: 5b 61 70 70 65 6e 64 41 72 67 73 20 24 66 69 6c  [appendArgs $fil
a3c0: 65 4e 61 6d 65 28 31 29 20 2e 6d 6f 76 65 64 5d  eName(1) .moved]
a3d0: 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 72  ....      if {$r
a3e0: 65 73 74 6f 72 65 7d 20 74 68 65 6e 20 7b 0d 0a  estore} then {..
a3f0: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 66 69 6c          if {[fil
a400: 65 20 65 78 69 73 74 73 20 24 66 69 6c 65 4e 61  e exists $fileNa
a410: 6d 65 28 32 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  me(2)]} then {..
a420: 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 72            file r
a430: 65 6e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 28  ename $fileName(
a440: 32 29 20 24 66 69 6c 65 4e 61 6d 65 28 31 29 0d  2) $fileName(1).
a450: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  ...          if 
a460: 7b 24 76 65 72 62 6f 73 65 7d 20 74 68 65 6e 20  {$verbose} then 
a470: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
a480: 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
a490: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
a4a0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
a4b0: 20 20 20 20 22 2d 2d 2d 2d 20 6d 6f 76 65 64 20      "---- moved 
a4c0: 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 28 32 29  \"" $fileName(2)
a4d0: 20 22 5c 22 20 74 6f 20 5c 22 22 20 5c 0d 0a 20   "\" to \"" \.. 
a4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24                 $
a4f0: 66 69 6c 65 4e 61 6d 65 28 31 29 20 5c 22 5c 6e  fileName(1) \"\n
a500: 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ]..          }..
a510: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
a520: 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
a530: 24 76 65 72 62 6f 73 65 7d 20 74 68 65 6e 20 7b  $verbose} then {
a540: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
a550: 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
a560: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
a570: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
a580: 20 20 20 22 2d 2d 2d 2d 20 73 6b 69 70 70 65 64     "---- skipped
a590: 20 6d 6f 76 69 6e 67 20 5c 22 22 20 24 66 69 6c   moving \"" $fil
a5a0: 65 4e 61 6d 65 28 32 29 20 5c 0d 0a 20 20 20 20  eName(2) \..    
a5b0: 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c              "\",
a5c0: 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69   it does not exi
a5d0: 73 74 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20  st\n"]..        
a5e0: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
a5f0: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
a600: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 66 69 6c          if {[fil
a610: 65 20 65 78 69 73 74 73 20 24 66 69 6c 65 4e 61  e exists $fileNa
a620: 6d 65 28 31 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  me(1)]} then {..
a630: 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 72            file r
a640: 65 6e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 28  ename $fileName(
a650: 31 29 20 24 66 69 6c 65 4e 61 6d 65 28 32 29 0d  1) $fileName(2).
a660: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  ...          if 
a670: 7b 24 76 65 72 62 6f 73 65 7d 20 74 68 65 6e 20  {$verbose} then 
a680: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
a690: 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
a6a0: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
a6b0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
a6c0: 20 20 20 20 22 2d 2d 2d 2d 20 6d 6f 76 65 64 20      "---- moved 
a6d0: 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 28 31 29  \"" $fileName(1)
a6e0: 20 22 5c 22 20 74 6f 20 5c 22 22 20 5c 0d 0a 20   "\" to \"" \.. 
a6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24                 $
a700: 66 69 6c 65 4e 61 6d 65 28 32 29 20 5c 22 5c 6e  fileName(2) \"\n
a710: 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ]..          }..
a720: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
a730: 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
a740: 24 76 65 72 62 6f 73 65 7d 20 74 68 65 6e 20 7b  $verbose} then {
a750: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
a760: 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
a770: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
a780: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
a790: 20 20 20 22 2d 2d 2d 2d 20 73 6b 69 70 70 65 64     "---- skipped
a7a0: 20 6d 6f 76 69 6e 67 20 5c 22 22 20 24 66 69 6c   moving \"" $fil
a7b0: 65 4e 61 6d 65 28 31 29 20 5c 0d 0a 20 20 20 20  eName(1) \..    
a7c0: 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c              "\",
a7d0: 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69   it does not exi
a7e0: 73 74 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20  st\n"]..        
a7f0: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
a800: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
a810: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 41  ...    proc getA
a820: 70 70 44 6f 6d 61 69 6e 50 72 65 61 6d 62 6c 65  ppDomainPreamble
a830: 20 7b 20 7b 70 72 65 66 69 78 20 22 22 7d 20 7b   { {prefix ""} {
a840: 73 75 66 66 69 78 20 22 22 7d 20 7d 20 7b 0d 0a  suffix ""} } {..
a850: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
a860: 20 4e 4f 54 45 3a 20 54 68 69 73 20 70 72 6f 63   NOTE: This proc
a870: 65 64 75 72 65 20 72 65 74 75 72 6e 73 20 61 20  edure returns a 
a880: 74 65 73 74 20 73 65 74 75 70 20 73 63 72 69 70  test setup scrip
a890: 74 20 66 72 61 67 6d 65 6e 74 20 73 75 69 74 61  t fragment suita
a8a0: 62 6c 65 20 66 6f 72 0d 0a 20 20 20 20 20 20 23  ble for..      #
a8b0: 20 20 20 20 20 20 20 65 76 61 6c 75 61 74 69 6f         evaluatio
a8c0: 6e 20 62 79 20 61 6e 20 69 6e 74 65 72 70 72 65  n by an interpre
a8d0: 74 65 72 20 63 72 65 61 74 65 64 20 69 6e 20 61  ter created in a
a8e0: 6e 20 69 73 6f 6c 61 74 65 64 20 61 70 70 6c 69  n isolated appli
a8f0: 63 61 74 69 6f 6e 0d 0a 20 20 20 20 20 20 23 20  cation..      # 
a900: 20 20 20 20 20 20 64 6f 6d 61 69 6e 2e 20 20 54        domain.  T
a910: 68 65 20 73 63 72 69 70 74 20 66 72 61 67 6d 65  he script fragme
a920: 6e 74 20 62 65 69 6e 67 20 72 65 74 75 72 6e 65  nt being returne
a930: 64 20 77 69 6c 6c 20 62 65 20 73 75 72 72 6f 75  d will be surrou
a940: 6e 64 65 64 20 62 79 0d 0a 20 20 20 20 20 20 23  nded by..      #
a950: 20 20 20 20 20 20 20 74 68 65 20 70 72 65 66 69         the prefi
a960: 78 20 61 6e 64 20 73 75 66 66 69 78 20 22 73 63  x and suffix "sc
a970: 72 69 70 74 20 66 72 61 67 6d 65 6e 74 73 22 20  ript fragments" 
a980: 73 70 65 63 69 66 69 65 64 20 62 79 20 6f 75 72  specified by our
a990: 20 63 61 6c 6c 65 72 2c 0d 0a 20 20 20 20 20 20   caller,..      
a9a0: 23 20 20 20 20 20 20 20 69 66 20 61 6e 79 2e 20  #       if any. 
a9b0: 20 54 68 65 20 65 6e 74 69 72 65 20 73 63 72 69   The entire scri
a9c0: 70 74 20 62 65 69 6e 67 20 72 65 74 75 72 6e 65  pt being returne
a9d0: 64 20 77 69 6c 6c 20 62 65 20 73 75 62 73 74 69  d will be substi
a9e0: 74 75 74 65 64 20 76 69 61 0d 0a 20 20 20 20 20  tuted via..     
a9f0: 20 23 20 20 20 20 20 20 20 5b 73 75 62 73 74 5d   #       [subst]
aa00: 2c 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 78 74  , in the context
aa10: 20 6f 66 20 6f 75 72 20 63 61 6c 6c 65 72 2c 20   of our caller, 
aa20: 62 65 66 6f 72 65 20 62 65 69 6e 67 20 72 65 74  before being ret
aa30: 75 72 6e 65 64 2e 0d 0a 20 20 20 20 20 20 23 20  urned...      # 
aa40: 20 20 20 20 20 20 54 68 69 73 20 73 74 65 70 20        This step 
aa50: 69 73 20 6e 65 63 65 73 73 61 72 79 20 73 6f 20  is necessary so 
aa60: 74 68 61 74 20 73 6f 6d 65 20 6c 69 6d 69 74 65  that some limite
aa70: 64 20 63 6f 6e 74 65 78 74 20 69 6e 66 6f 72 6d  d context inform
aa80: 61 74 69 6f 6e 2c 0d 0a 20 20 20 20 20 20 23 20  ation,..      # 
aa90: 20 20 20 20 20 20 70 72 69 6d 61 72 69 6c 79 20        primarily 
aaa0: 72 65 6c 61 74 65 64 20 74 6f 20 74 68 65 20 74  related to the t
aab0: 65 73 74 69 6e 67 20 64 69 72 65 63 74 6f 72 69  esting directori
aac0: 65 73 2c 20 63 61 6e 20 62 65 20 74 72 61 6e 73  es, can be trans
aad0: 66 65 72 72 65 64 0d 0a 20 20 20 20 20 20 23 20  ferred..      # 
aae0: 20 20 20 20 20 20 74 6f 20 74 68 65 20 69 6e 74        to the int
aaf0: 65 72 70 72 65 74 65 72 20 69 6e 20 74 68 65 20  erpreter in the 
ab00: 69 73 6f 6c 61 74 65 64 20 61 70 70 6c 69 63 61  isolated applica
ab10: 74 69 6f 6e 20 64 6f 6d 61 69 6e 2c 20 6d 61 6b  tion domain, mak
ab20: 69 6e 67 20 69 74 0d 0a 20 20 20 20 20 20 23 20  ing it..      # 
ab30: 20 20 20 20 20 20 61 62 6c 65 20 74 6f 20 73 75        able to su
ab40: 63 63 65 73 73 66 75 6c 6c 79 20 72 75 6e 20 74  ccessfully run t
ab50: 65 73 74 73 20 74 68 61 74 20 72 65 71 75 69 72  ests that requir
ab60: 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66  e one or more of
ab70: 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20   the..      #   
ab80: 20 20 20 20 66 69 6c 65 73 20 69 6e 20 6f 6e 65      files in one
ab90: 20 6f 66 20 74 68 65 20 74 65 73 74 69 6e 67 20   of the testing 
aba0: 64 69 72 65 63 74 6f 72 69 65 73 2e 20 20 43 61  directories.  Ca
abb0: 6c 6c 65 72 73 20 73 68 6f 75 6c 64 20 6b 65 65  llers should kee
abc0: 70 20 69 6e 0d 0a 20 20 20 20 20 20 23 20 20 20  p in..      #   
abd0: 20 20 20 20 6d 69 6e 64 20 74 68 61 74 20 74 68      mind that th
abe0: 65 20 74 65 73 74 20 73 63 72 69 70 74 20 66 72  e test script fr
abf0: 61 67 6d 65 6e 74 20 62 65 69 6e 67 20 72 65 74  agment being ret
ac00: 75 72 6e 65 64 20 63 61 6e 6e 6f 74 20 72 65 6c  urned cannot rel
ac10: 79 20 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20 20  y on..      #   
ac20: 20 20 20 20 61 6e 79 20 73 63 72 69 70 74 20 6c      any script l
ac30: 69 62 72 61 72 79 20 70 72 6f 63 65 64 75 72 65  ibrary procedure
ac40: 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 70  s that are not p
ac50: 72 6f 76 69 64 65 64 20 62 79 20 74 68 65 20 45  rovided by the E
ac60: 61 67 6c 65 0d 0a 20 20 20 20 20 20 23 20 20 20  agle..      #   
ac70: 20 20 20 20 6c 69 62 72 61 72 79 20 70 61 63 6b      library pack
ac80: 61 67 65 20 28 69 2e 65 2e 20 22 69 6e 69 74 2e  age (i.e. "init.
ac90: 65 61 67 6c 65 22 29 2c 20 69 6e 63 6c 75 64 69  eagle"), includi
aca0: 6e 67 20 74 68 6f 73 65 20 70 72 6f 76 69 64 65  ng those provide
acb0: 64 20 62 79 0d 0a 20 20 20 20 20 20 23 20 20 20  d by..      #   
acc0: 20 20 20 20 74 68 65 20 45 61 67 6c 65 20 74 65      the Eagle te
acd0: 73 74 20 70 61 63 6b 61 67 65 2c 20 75 6e 6c 65  st package, unle
ace0: 73 73 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74  ss the file cont
acf0: 61 69 6e 69 6e 67 20 74 68 65 6d 20 69 73 20 6c  aining them is l
ad00: 6f 61 64 65 64 0d 0a 20 20 20 20 20 20 23 20 20  oaded..      #  
ad10: 20 20 20 20 20 6d 61 6e 75 61 6c 6c 79 20 76 69       manually vi
ad20: 61 20 73 6f 6d 65 20 6f 74 68 65 72 20 6d 65 63  a some other mec
ad30: 68 61 6e 69 73 6d 20 28 65 2e 67 2e 20 62 79 20  hanism (e.g. by 
ad40: 69 6e 63 6c 75 64 69 6e 67 20 61 70 70 72 6f 70  including approp
ad50: 72 69 61 74 65 0d 0a 20 20 20 20 20 20 23 20 20  riate..      #  
ad60: 20 20 20 20 20 5b 70 61 63 6b 61 67 65 20 72 65       [package re
ad70: 71 75 69 72 65 5d 20 6f 72 20 5b 73 6f 75 72 63  quire] or [sourc
ad80: 65 5d 20 63 6f 6d 6d 61 6e 64 73 20 69 6e 20 74  e] commands in t
ad90: 68 65 20 70 72 65 66 69 78 20 6f 72 20 73 75 66  he prefix or suf
ada0: 66 69 78 0d 0a 20 20 20 20 20 20 23 20 20 20 20  fix..      #    
adb0: 20 20 20 73 63 72 69 70 74 20 66 72 61 67 6d 65     script fragme
adc0: 6e 74 73 29 2e 20 20 41 6c 73 6f 2c 20 61 6c 6c  nts).  Also, all
add0: 20 76 61 72 69 61 62 6c 65 20 72 65 66 65 72 65   variable refere
ade0: 6e 63 65 73 20 61 6e 64 20 61 6c 6c 20 6e 65 73  nces and all nes
adf0: 74 65 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ted..      #    
ae00: 20 20 20 63 6f 6d 6d 61 6e 64 73 20 28 69 2e 65     commands (i.e
ae10: 2e 20 74 68 6f 73 65 20 69 6e 20 73 71 75 61 72  . those in squar
ae20: 65 20 62 72 61 63 6b 65 74 73 29 20 63 6f 6e 74  e brackets) cont
ae30: 61 69 6e 65 64 20 69 6e 20 74 68 65 20 66 69 6e  ained in the fin
ae40: 61 6c 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  al..      #     
ae50: 20 20 73 63 72 69 70 74 20 66 72 61 67 6d 65 6e    script fragmen
ae60: 74 20 77 69 6c 6c 20 65 6e 64 20 75 70 20 62 65  t will end up be
ae70: 69 6e 67 20 65 76 61 6c 75 61 74 65 64 20 69 6e  ing evaluated in
ae80: 20 74 68 65 20 63 6f 6e 74 65 78 74 20 6f 66 20   the context of 
ae90: 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  the..      #    
aea0: 20 20 20 63 61 6c 6c 69 6e 67 20 69 6e 74 65 72     calling inter
aeb0: 70 72 65 74 65 72 20 61 6e 64 20 6e 6f 74 20 74  preter and not t
aec0: 68 65 20 74 61 72 67 65 74 20 69 6e 74 65 72 70  he target interp
aed0: 72 65 74 65 72 20 63 72 65 61 74 65 64 20 69 6e  reter created in
aee0: 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20   the..      #   
aef0: 20 20 20 20 69 73 6f 6c 61 74 65 64 20 61 70 70      isolated app
af00: 6c 69 63 61 74 69 6f 6e 20 64 6f 6d 61 69 6e 20  lication domain 
af10: 75 6e 6c 65 73 73 20 74 68 65 20 64 6f 6c 6c 61  unless the dolla
af20: 72 20 73 69 67 6e 73 20 61 6e 64 2f 6f 72 20 73  r signs and/or s
af30: 71 75 61 72 65 0d 0a 20 20 20 20 20 20 23 20 20  quare..      #  
af40: 20 20 20 20 20 62 72 61 63 6b 65 74 73 20 61 72       brackets ar
af50: 65 20 73 70 65 63 69 61 6c 6c 79 20 71 75 6f 74  e specially quot
af60: 65 64 20 77 69 74 68 20 62 61 63 6b 73 6c 61 73  ed with backslas
af70: 68 65 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  hes...      #.. 
af80: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 75 70 6c       return [upl
af90: 65 76 65 6c 20 31 20 5b 6c 69 73 74 20 73 75 62  evel 1 [list sub
afa0: 73 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24  st [appendArgs $
afb0: 70 72 65 66 69 78 20 7b 0d 0a 20 20 20 20 20 20  prefix {..      
afc0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
afd0: 4f 54 45 3a 20 54 68 65 20 5c 5b 6f 62 6a 65 63  OTE: The \[objec
afe0: 74 5c 5d 20 63 6f 6d 6d 61 6e 64 20 6d 61 79 20  t\] command may 
aff0: 62 65 20 6d 69 73 73 69 6e 67 20 69 6e 20 73 6f  be missing in so
b000: 6d 65 20 45 61 67 6c 65 20 63 6f 72 65 0d 0a 20  me Eagle core.. 
b010: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6c         #       l
b020: 69 62 72 61 72 79 20 63 6f 6e 66 69 67 75 72 61  ibrary configura
b030: 74 69 6f 6e 73 2e 20 20 43 6c 6f 6e 69 6e 67 20  tions.  Cloning 
b040: 61 6e 64 20 75 73 69 6e 67 20 74 68 65 20 70 72  and using the pr
b050: 6f 63 65 64 75 72 65 0d 0a 20 20 20 20 20 20 20  ocedure..       
b060: 20 23 20 20 20 20 20 20 20 5c 5b 63 68 61 6e 67   #       \[chang
b070: 65 4e 61 74 69 76 65 52 75 6e 74 69 6d 65 4f 70  eNativeRuntimeOp
b080: 74 69 6f 6e 5c 5d 20 6d 61 79 20 68 65 6c 70 20  tion\] may help 
b090: 74 6f 20 6d 69 74 69 67 61 74 65 20 74 68 69 73  to mitigate this
b0a0: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
b0b0: 20 20 20 20 20 20 70 72 6f 63 20 63 68 61 6e 67        proc chang
b0c0: 65 4e 61 74 69 76 65 52 75 6e 74 69 6d 65 4f 70  eNativeRuntimeOp
b0d0: 74 69 6f 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20  tion \..        
b0e0: 20 20 20 20 7b 5b 69 6e 66 6f 20 61 72 67 73 20      {[info args 
b0f0: 63 68 61 6e 67 65 4e 61 74 69 76 65 52 75 6e 74  changeNativeRunt
b100: 69 6d 65 4f 70 74 69 6f 6e 5d 7d 20 5c 0d 0a 20  imeOption]} \.. 
b110: 20 20 20 20 20 20 20 20 20 20 20 7b 5b 69 6e 66             {[inf
b120: 6f 20 62 6f 64 79 20 63 68 61 6e 67 65 4e 61 74  o body changeNat
b130: 69 76 65 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e  iveRuntimeOption
b140: 5d 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63 61  ]}....        ca
b150: 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
b160: 20 63 68 61 6e 67 65 4e 61 74 69 76 65 52 75 6e   changeNativeRun
b170: 74 69 6d 65 4f 70 74 69 6f 6e 20 5b 68 61 73 52  timeOption [hasR
b180: 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 6e 61 74  untimeOption nat
b190: 69 76 65 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d  ive]..        }.
b1a0: 0a 20 20 20 20 20 20 7d 20 5b 67 65 74 54 65 73  .      } [getTes
b1b0: 74 4f 76 65 72 72 69 64 65 73 50 72 65 61 6d 62  tOverridesPreamb
b1c0: 6c 65 20 5b 6c 69 73 74 20 70 61 74 68 20 74 65  le [list path te
b1d0: 73 74 5f 63 68 61 6e 6e 65 6c 5d 5d 20 24 73 75  st_channel]] $su
b1e0: 66 66 69 78 5d 5d 5d 0d 0a 20 20 20 20 7d 0d 0a  ffix]]]..    }..
b1f0: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 74 72 79 43  ...    proc tryC
b200: 6f 70 79 45 78 74 65 72 6e 61 6c 46 69 6c 65 20  opyExternalFile 
b210: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  {..            f
b220: 69 6c 65 4e 61 6d 65 20 7b 70 6c 61 74 66 6f 72  ileName {platfor
b230: 6d 20 22 22 7d 20 7b 6e 65 77 46 69 6c 65 4e 61  m ""} {newFileNa
b240: 6d 65 20 22 22 7d 20 7b 76 65 72 62 6f 73 65 20  me ""} {verbose 
b250: 74 72 75 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  true} } {..     
b260: 20 73 65 74 20 73 6f 75 72 63 65 46 69 6c 65 4e   set sourceFileN
b270: 61 6d 65 20 5b 67 65 74 45 78 74 65 72 6e 61 6c  ame [getExternal
b280: 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61  FileName $fileNa
b290: 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20  me]....      if 
b2a0: 7b 21 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24  {![file exists $
b2b0: 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 5d 7d  sourceFileName]}
b2c0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
b2d0: 20 69 66 20 7b 24 76 65 72 62 6f 73 65 7d 20 74   if {$verbose} t
b2e0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
b2f0: 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
b300: 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
b310: 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
b320: 20 20 20 20 22 2d 2d 2d 2d 20 73 6b 69 70 70 65      "---- skippe
b330: 64 20 63 6f 70 79 69 6e 67 20 65 78 74 65 72 6e  d copying extern
b340: 61 6c 20 66 69 6c 65 20 5c 22 22 20 24 73 6f 75  al file \"" $sou
b350: 72 63 65 46 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20  rceFileName \.. 
b360: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22               "\"
b370: 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78  , it does not ex
b380: 69 73 74 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20  ist\n"]..       
b390: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 72 65   }....        re
b3a0: 74 75 72 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  turn..      }...
b3b0: 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69  .      if {[stri
b3c0: 6e 67 20 6c 65 6e 67 74 68 20 24 6e 65 77 46 69  ng length $newFi
b3d0: 6c 65 4e 61 6d 65 5d 20 3e 20 30 7d 20 74 68 65  leName] > 0} the
b3e0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74  n {..        set
b3f0: 20 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 20   targetFileName 
b400: 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61  [getBinaryFileNa
b410: 6d 65 20 24 6e 65 77 46 69 6c 65 4e 61 6d 65 20  me $newFileName 
b420: 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a 20 20 20 20  $platform]..    
b430: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
b440: 20 20 20 20 73 65 74 20 74 61 72 67 65 74 46 69      set targetFi
b450: 6c 65 4e 61 6d 65 20 5b 67 65 74 42 69 6e 61 72  leName [getBinar
b460: 79 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e  yFileName $fileN
b470: 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a  ame $platform]..
b480: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
b490: 20 73 65 74 20 74 61 72 67 65 74 44 69 72 65 63   set targetDirec
b4a0: 74 6f 72 79 20 5b 66 69 6c 65 20 64 69 72 6e 61  tory [file dirna
b4b0: 6d 65 20 24 74 61 72 67 65 74 46 69 6c 65 4e 61  me $targetFileNa
b4c0: 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20  me]....      if 
b4d0: 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
b4e0: 20 20 20 69 66 20 7b 21 5b 66 69 6c 65 20 65 78     if {![file ex
b4f0: 69 73 74 73 20 24 74 61 72 67 65 74 44 69 72 65  ists $targetDire
b500: 63 74 6f 72 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a  ctory]} then {..
b510: 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 6d            file m
b520: 6b 64 69 72 20 24 74 61 72 67 65 74 44 69 72 65  kdir $targetDire
b530: 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 20 20 7d  ctory..        }
b540: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 66 69 6c 65  ....        file
b550: 20 63 6f 70 79 20 2d 66 6f 72 63 65 20 24 73 6f   copy -force $so
b560: 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 24 74 61  urceFileName $ta
b570: 72 67 65 74 46 69 6c 65 4e 61 6d 65 0d 0a 20 20  rgetFileName..  
b580: 20 20 20 20 7d 5d 20 3d 3d 20 30 7d 20 74 68 65      }] == 0} the
b590: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75  n {..        tpu
b5a0: 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
b5b0: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
b5c0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d  ..            "-
b5d0: 2d 2d 2d 20 63 6f 70 69 65 64 20 65 78 74 65 72  --- copied exter
b5e0: 6e 61 6c 20 66 69 6c 65 20 66 72 6f 6d 20 5c 22  nal file from \"
b5f0: 22 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d  " $sourceFileNam
b600: 65 20 22 5c 22 20 74 6f 20 5c 22 22 20 5c 0d 0a  e "\" to \"" \..
b610: 20 20 20 20 20 20 20 20 20 20 20 20 24 74 61 72              $tar
b620: 67 65 74 46 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e  getFileName \"\n
b630: 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  ]..      } else 
b640: 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  {..        tputs
b650: 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
b660: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
b670: 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
b680: 2d 20 66 61 69 6c 65 64 20 74 6f 20 63 6f 70 79  - failed to copy
b690: 20 65 78 74 65 72 6e 61 6c 20 66 69 6c 65 20 66   external file f
b6a0: 72 6f 6d 20 5c 22 22 20 24 73 6f 75 72 63 65 46  rom \"" $sourceF
b6b0: 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20  ileName \..     
b6c0: 20 20 20 20 20 20 20 22 5c 22 20 74 6f 20 5c 22         "\" to \"
b6d0: 22 20 24 74 61 72 67 65 74 46 69 6c 65 4e 61 6d  " $targetFileNam
b6e0: 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d  e \"\n]..      }
b6f0: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
b700: 70 72 6f 63 20 74 72 79 43 6f 70 79 42 69 6e 61  proc tryCopyBina
b710: 72 79 46 69 6c 65 20 7b 0d 0a 20 20 20 20 20 20  ryFile {..      
b720: 20 20 20 20 20 20 66 69 6c 65 4e 61 6d 65 20 6d        fileName m
b730: 61 6e 61 67 65 64 4f 6e 6c 79 20 7b 70 6c 61 74  anagedOnly {plat
b740: 66 6f 72 6d 20 22 22 7d 20 7b 6e 65 77 46 69 6c  form ""} {newFil
b750: 65 4e 61 6d 65 20 22 22 7d 0d 0a 20 20 20 20 20  eName ""}..     
b760: 20 20 20 20 20 20 20 7b 76 65 72 62 6f 73 65 20         {verbose 
b770: 74 72 75 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  true} } {..     
b780: 20 73 65 74 20 73 6f 75 72 63 65 46 69 6c 65 4e   set sourceFileN
b790: 61 6d 65 20 5b 67 65 74 42 69 6e 61 72 79 46 69  ame [getBinaryFi
b7a0: 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65  leName $fileName
b7b0: 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a 0d 0a 20   $platform].... 
b7c0: 20 20 20 20 20 69 66 20 7b 21 5b 66 69 6c 65 20       if {![file 
b7d0: 65 78 69 73 74 73 20 24 73 6f 75 72 63 65 46 69  exists $sourceFi
b7e0: 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d  leName]} then {.
b7f0: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 24 76 65  .        if {$ve
b800: 72 62 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20  rbose} then {.. 
b810: 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
b820: 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
b830: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
b840: 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
b850: 2d 20 73 6b 69 70 70 65 64 20 63 6f 70 79 69 6e  - skipped copyin
b860: 67 20 62 69 6e 61 72 79 20 66 69 6c 65 20 5c 22  g binary file \"
b870: 22 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d  " $sourceFileNam
b880: 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
b890: 20 20 20 22 5c 22 2c 20 69 74 20 64 6f 65 73 20     "\", it does 
b8a0: 6e 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a 20  not exist\n"].. 
b8b0: 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
b8c0: 20 20 20 20 72 65 74 75 72 6e 0d 0a 20 20 20 20      return..    
b8d0: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20    }....      if 
b8e0: 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
b8f0: 24 6e 65 77 46 69 6c 65 4e 61 6d 65 5d 20 3e 20  $newFileName] > 
b900: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
b910: 20 20 20 73 65 74 20 74 61 72 67 65 74 46 69 6c     set targetFil
b920: 65 4e 61 6d 65 20 5b 67 65 74 42 75 69 6c 64 46  eName [getBuildF
b930: 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20  ileName \..     
b940: 20 20 20 20 20 20 20 24 6e 65 77 46 69 6c 65 4e         $newFileN
b950: 61 6d 65 20 24 6d 61 6e 61 67 65 64 4f 6e 6c 79  ame $managedOnly
b960: 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a 20 20 20   $platform]..   
b970: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
b980: 20 20 20 20 20 73 65 74 20 74 61 72 67 65 74 46       set targetF
b990: 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42 75 69 6c  ileName [getBuil
b9a0: 64 46 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20  dFileName \..   
b9b0: 20 20 20 20 20 20 20 20 20 24 66 69 6c 65 4e 61           $fileNa
b9c0: 6d 65 20 24 6d 61 6e 61 67 65 64 4f 6e 6c 79 20  me $managedOnly 
b9d0: 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a 20 20 20 20  $platform]..    
b9e0: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 73 65 74    }....      set
b9f0: 20 74 61 72 67 65 74 44 69 72 65 63 74 6f 72 79   targetDirectory
ba00: 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20 24   [file dirname $
ba10: 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 5d 0d  targetFileName].
ba20: 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61  ...      if {[ca
ba30: 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 69  tch {..        i
ba40: 66 20 7b 21 5b 66 69 6c 65 20 65 78 69 73 74 73  f {![file exists
ba50: 20 24 74 61 72 67 65 74 44 69 72 65 63 74 6f 72   $targetDirector
ba60: 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  y]} then {..    
ba70: 20 20 20 20 20 20 66 69 6c 65 20 6d 6b 64 69 72        file mkdir
ba80: 20 24 74 61 72 67 65 74 44 69 72 65 63 74 6f 72   $targetDirector
ba90: 79 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  y..        }....
baa0: 20 20 20 20 20 20 20 20 66 69 6c 65 20 63 6f 70          file cop
bab0: 79 20 2d 66 6f 72 63 65 20 24 73 6f 75 72 63 65  y -force $source
bac0: 46 69 6c 65 4e 61 6d 65 20 24 74 61 72 67 65 74  FileName $target
bad0: 46 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20  FileName..      
bae0: 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  }] == 0} then {.
baf0: 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
bb00: 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
bb10: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
bb20: 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
bb30: 63 6f 70 69 65 64 20 62 69 6e 61 72 79 20 66 69  copied binary fi
bb40: 6c 65 20 66 72 6f 6d 20 5c 22 22 20 24 73 6f 75  le from \"" $sou
bb50: 72 63 65 46 69 6c 65 4e 61 6d 65 20 22 5c 22 20  rceFileName "\" 
bb60: 74 6f 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20  to \"" \..      
bb70: 20 20 20 20 20 20 24 74 61 72 67 65 74 46 69 6c        $targetFil
bb80: 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20  eName \"\n]..   
bb90: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
bba0: 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
bbb0: 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
bbc0: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
bbd0: 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 61 69 6c        "---- fail
bbe0: 65 64 20 74 6f 20 63 6f 70 79 20 62 69 6e 61 72  ed to copy binar
bbf0: 79 20 66 69 6c 65 20 66 72 6f 6d 20 5c 22 22 20  y file from \"" 
bc00: 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20  $sourceFileName 
bc10: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  \..            "
bc20: 5c 22 20 74 6f 20 5c 22 22 20 24 74 61 72 67 65  \" to \"" $targe
bc30: 74 46 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d  tFileName \"\n].
bc40: 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
bc50: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 74 72 79  ....    proc try
bc60: 43 6f 70 79 42 75 69 6c 64 46 69 6c 65 20 7b 0d  CopyBuildFile {.
bc70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c  .            fil
bc80: 65 4e 61 6d 65 20 6d 61 6e 61 67 65 64 4f 6e 6c  eName managedOnl
bc90: 79 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20  y {platform ""} 
bca0: 7b 6e 65 77 46 69 6c 65 4e 61 6d 65 20 22 22 7d  {newFileName ""}
bcb0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 76  ..            {v
bcc0: 65 72 62 6f 73 65 20 74 72 75 65 7d 20 7d 20 7b  erbose true} } {
bcd0: 0d 0a 20 20 20 20 20 20 73 65 74 20 73 6f 75 72  ..      set sour
bce0: 63 65 46 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42  ceFileName [getB
bcf0: 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20 24 66 69  uildFileName $fi
bd00: 6c 65 4e 61 6d 65 20 24 6d 61 6e 61 67 65 64 4f  leName $managedO
bd10: 6e 6c 79 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a  nly $platform]..
bd20: 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 66 69  ..      if {![fi
bd30: 6c 65 20 65 78 69 73 74 73 20 24 73 6f 75 72 63  le exists $sourc
bd40: 65 46 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e  eFileName]} then
bd50: 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   {..        if {
bd60: 24 76 65 72 62 6f 73 65 7d 20 74 68 65 6e 20 7b  $verbose} then {
bd70: 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74  ..          tput
bd80: 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
bd90: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
bda0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
bdb0: 2d 2d 2d 2d 20 73 6b 69 70 70 65 64 20 63 6f 70  ---- skipped cop
bdc0: 79 69 6e 67 20 62 75 69 6c 64 20 66 69 6c 65 20  ying build file 
bdd0: 5c 22 22 20 24 73 6f 75 72 63 65 46 69 6c 65 4e  \"" $sourceFileN
bde0: 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ame \..         
bdf0: 20 20 20 20 20 22 5c 22 2c 20 69 74 20 64 6f 65       "\", it doe
be00: 73 20 6e 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d  s not exist\n"].
be10: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
be20: 20 20 20 20 20 20 72 65 74 75 72 6e 0d 0a 20 20        return..  
be30: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69      }....      i
be40: 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  f {[string lengt
be50: 68 20 24 6e 65 77 46 69 6c 65 4e 61 6d 65 5d 20  h $newFileName] 
be60: 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
be70: 20 20 20 20 20 73 65 74 20 74 61 72 67 65 74 46       set targetF
be80: 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42 69 6e 61  ileName [getBina
be90: 72 79 46 69 6c 65 4e 61 6d 65 20 24 6e 65 77 46  ryFileName $newF
bea0: 69 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72  ileName $platfor
beb0: 6d 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  m]..      } else
bec0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   {..        set 
bed0: 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 20 5b  targetFileName [
bee0: 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d  getBinaryFileNam
bef0: 65 20 24 66 69 6c 65 4e 61 6d 65 20 24 70 6c 61  e $fileName $pla
bf00: 74 66 6f 72 6d 5d 0d 0a 20 20 20 20 20 20 7d 0d  tform]..      }.
bf10: 0a 0d 0a 20 20 20 20 20 20 73 65 74 20 74 61 72  ...      set tar
bf20: 67 65 74 44 69 72 65 63 74 6f 72 79 20 5b 66 69  getDirectory [fi
bf30: 6c 65 20 64 69 72 6e 61 6d 65 20 24 74 61 72 67  le dirname $targ
bf40: 65 74 46 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20  etFileName].... 
bf50: 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
bf60: 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21  {..        if {!
bf70: 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 74 61  [file exists $ta
bf80: 72 67 65 74 44 69 72 65 63 74 6f 72 79 5d 7d 20  rgetDirectory]} 
bf90: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
bfa0: 20 20 66 69 6c 65 20 6d 6b 64 69 72 20 24 74 61    file mkdir $ta
bfb0: 72 67 65 74 44 69 72 65 63 74 6f 72 79 0d 0a 20  rgetDirectory.. 
bfc0: 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
bfd0: 20 20 20 20 66 69 6c 65 20 63 6f 70 79 20 2d 66      file copy -f
bfe0: 6f 72 63 65 20 24 73 6f 75 72 63 65 46 69 6c 65  orce $sourceFile
bff0: 4e 61 6d 65 20 24 74 61 72 67 65 74 46 69 6c 65  Name $targetFile
c000: 4e 61 6d 65 0d 0a 20 20 20 20 20 20 7d 5d 20 3d  Name..      }] =
c010: 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
c020: 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
c030: 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
c040: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
c050: 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 70 69        "---- copi
c060: 65 64 20 62 75 69 6c 64 20 66 69 6c 65 20 66 72  ed build file fr
c070: 6f 6d 20 5c 22 22 20 24 73 6f 75 72 63 65 46 69  om \"" $sourceFi
c080: 6c 65 4e 61 6d 65 20 22 5c 22 20 74 6f 20 5c 22  leName "\" to \"
c090: 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
c0a0: 20 24 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65   $targetFileName
c0b0: 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 20   \"\n]..      } 
c0c0: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
c0d0: 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
c0e0: 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
c0f0: 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
c100: 20 22 2d 2d 2d 2d 20 66 61 69 6c 65 64 20 74 6f   "---- failed to
c110: 20 63 6f 70 79 20 62 75 69 6c 64 20 66 69 6c 65   copy build file
c120: 20 66 72 6f 6d 20 5c 22 22 20 24 73 6f 75 72 63   from \"" $sourc
c130: 65 46 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20  eFileName \..   
c140: 20 20 20 20 20 20 20 20 20 22 5c 22 20 74 6f 20           "\" to 
c150: 5c 22 22 20 24 74 61 72 67 65 74 46 69 6c 65 4e  \"" $targetFileN
c160: 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20  ame \"\n]..     
c170: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
c180: 20 20 70 72 6f 63 20 74 72 79 44 65 6c 65 74 65    proc tryDelete
c190: 42 69 6e 61 72 79 46 69 6c 65 20 7b 20 66 69 6c  BinaryFile { fil
c1a0: 65 4e 61 6d 65 20 7b 70 6c 61 74 66 6f 72 6d 20  eName {platform 
c1b0: 22 22 7d 20 7b 76 65 72 62 6f 73 65 20 74 72 75  ""} {verbose tru
c1c0: 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65  e} } {..      se
c1d0: 74 20 66 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42  t fileName [getB
c1e0: 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 24 66  inaryFileName $f
c1f0: 69 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72  ileName $platfor
c200: 6d 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b  m]....      if {
c210: 21 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 66  ![file exists $f
c220: 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b  ileName]} then {
c230: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 24 76  ..        if {$v
c240: 65 72 62 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a  erbose} then {..
c250: 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
c260: 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
c270: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
c280: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
c290: 2d 2d 20 73 6b 69 70 70 65 64 20 64 65 6c 65 74  -- skipped delet
c2a0: 69 6e 67 20 62 69 6e 61 72 79 20 66 69 6c 65 20  ing binary file 
c2b0: 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c 0d  \"" $fileName \.
c2c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
c2d0: 5c 22 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20  \", it does not 
c2e0: 65 78 69 73 74 5c 6e 22 5d 0d 0a 20 20 20 20 20  exist\n"]..     
c2f0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
c300: 72 65 74 75 72 6e 0d 0a 20 20 20 20 20 20 7d 0d  return..      }.
c310: 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61  ...      if {[ca
c320: 74 63 68 20 7b 66 69 6c 65 20 64 65 6c 65 74 65  tch {file delete
c330: 20 24 66 69 6c 65 4e 61 6d 65 7d 5d 20 3d 3d 20   $fileName}] == 
c340: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
c350: 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
c360: 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
c370: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
c380: 20 20 20 20 22 2d 2d 2d 2d 20 64 65 6c 65 74 65      "---- delete
c390: 64 20 62 69 6e 61 72 79 20 66 69 6c 65 20 5c 22  d binary file \"
c3a0: 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e  " $fileName \"\n
c3b0: 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  ]..      } else 
c3c0: 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  {..        tputs
c3d0: 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
c3e0: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
c3f0: 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
c400: 2d 20 66 61 69 6c 65 64 20 74 6f 20 64 65 6c 65  - failed to dele
c410: 74 65 20 62 69 6e 61 72 79 20 66 69 6c 65 20 5c  te binary file \
c420: 22 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c 22 5c  "" $fileName \"\
c430: 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  n]..      }..   
c440: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
c450: 74 72 79 44 65 6c 65 74 65 42 75 69 6c 64 46 69  tryDeleteBuildFi
c460: 6c 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  le {..          
c470: 20 20 66 69 6c 65 4e 61 6d 65 20 6d 61 6e 61 67    fileName manag
c480: 65 64 4f 6e 6c 79 20 7b 70 6c 61 74 66 6f 72 6d  edOnly {platform
c490: 20 22 22 7d 20 7b 76 65 72 62 6f 73 65 20 74 72   ""} {verbose tr
c4a0: 75 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73  ue} } {..      s
c4b0: 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 67 65 74  et fileName [get
c4c0: 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20 24 66  BuildFileName $f
c4d0: 69 6c 65 4e 61 6d 65 20 24 6d 61 6e 61 67 65 64  ileName $managed
c4e0: 4f 6e 6c 79 20 24 70 6c 61 74 66 6f 72 6d 5d 0d  Only $platform].
c4f0: 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 66  ...      if {![f
c500: 69 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c 65  ile exists $file
c510: 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  Name]} then {.. 
c520: 20 20 20 20 20 20 20 69 66 20 7b 24 76 65 72 62         if {$verb
c530: 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ose} then {..   
c540: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
c550: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
c560: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
c570: 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
c580: 73 6b 69 70 70 65 64 20 64 65 6c 65 74 69 6e 67  skipped deleting
c590: 20 62 75 69 6c 64 20 66 69 6c 65 20 5c 22 22 20   build file \"" 
c5a0: 24 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20  $fileName \..   
c5b0: 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c 20             "\", 
c5c0: 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  it does not exis
c5d0: 74 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d  t\n"]..        }
c5e0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75  ....        retu
c5f0: 72 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  rn..      }.... 
c600: 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
c610: 7b 66 69 6c 65 20 64 65 6c 65 74 65 20 24 66 69  {file delete $fi
c620: 6c 65 4e 61 6d 65 7d 5d 20 3d 3d 20 30 7d 20 74  leName}] == 0} t
c630: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74  hen {..        t
c640: 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
c650: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
c660: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
c670: 22 2d 2d 2d 2d 20 64 65 6c 65 74 65 64 20 62 75  "---- deleted bu
c680: 69 6c 64 20 66 69 6c 65 20 5c 22 22 20 24 66 69  ild file \"" $fi
c690: 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20  leName \"\n]..  
c6a0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
c6b0: 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
c6c0: 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
c6d0: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
c6e0: 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 61 69         "---- fai
c6f0: 6c 65 64 20 74 6f 20 64 65 6c 65 74 65 20 62 75  led to delete bu
c700: 69 6c 64 20 66 69 6c 65 20 5c 22 22 20 24 66 69  ild file \"" $fi
c710: 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20  leName \"\n]..  
c720: 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
c730: 0a 20 20 20 20 70 72 6f 63 20 74 72 79 43 6f 70  .    proc tryCop
c740: 79 41 73 73 65 6d 62 6c 79 20 7b 0d 0a 20 20 20  yAssembly {..   
c750: 20 20 20 20 20 20 20 20 20 66 69 6c 65 4e 61 6d           fileNam
c760: 65 20 6d 61 6e 61 67 65 64 4f 6e 6c 79 20 7b 70  e managedOnly {p
c770: 6c 61 74 66 6f 72 6d 20 22 22 7d 20 7b 70 64 62  latform ""} {pdb
c780: 20 74 72 75 65 7d 20 7b 76 65 72 62 6f 73 65 20   true} {verbose 
c790: 74 72 75 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  true} } {..     
c7a0: 20 74 72 79 43 6f 70 79 42 75 69 6c 64 46 69 6c   tryCopyBuildFil
c7b0: 65 20 24 66 69 6c 65 4e 61 6d 65 20 24 6d 61 6e  e $fileName $man
c7c0: 61 67 65 64 4f 6e 6c 79 20 24 70 6c 61 74 66 6f  agedOnly $platfo
c7d0: 72 6d 20 22 22 20 24 76 65 72 62 6f 73 65 0d 0a  rm "" $verbose..
c7e0: 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 70 64 62  ..      if {$pdb
c7f0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
c800: 20 20 74 72 79 43 6f 70 79 42 75 69 6c 64 46 69    tryCopyBuildFi
c810: 6c 65 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  le [appendArgs \
c820: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 66  ..            [f
c830: 69 6c 65 20 72 6f 6f 74 6e 61 6d 65 20 24 66 69  ile rootname $fi
c840: 6c 65 4e 61 6d 65 5d 20 2e 70 64 62 5d 20 24 6d  leName] .pdb] $m
c850: 61 6e 61 67 65 64 4f 6e 6c 79 20 24 70 6c 61 74  anagedOnly $plat
c860: 66 6f 72 6d 20 22 22 20 24 76 65 72 62 6f 73 65  form "" $verbose
c870: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
c880: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 74 72  .....    proc tr
c890: 79 44 65 6c 65 74 65 41 73 73 65 6d 62 6c 79 20  yDeleteAssembly 
c8a0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  {..            f
c8b0: 69 6c 65 4e 61 6d 65 20 7b 70 6c 61 74 66 6f 72  ileName {platfor
c8c0: 6d 20 22 22 7d 20 7b 70 64 62 20 74 72 75 65 7d  m ""} {pdb true}
c8d0: 20 7b 76 65 72 62 6f 73 65 20 74 72 75 65 7d 20   {verbose true} 
c8e0: 7d 20 7b 0d 0a 20 20 20 20 20 20 74 72 79 44 65  } {..      tryDe
c8f0: 6c 65 74 65 42 69 6e 61 72 79 46 69 6c 65 20 24  leteBinaryFile $
c900: 66 69 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f  fileName $platfo
c910: 72 6d 20 24 76 65 72 62 6f 73 65 0d 0a 0d 0a 20  rm $verbose.... 
c920: 20 20 20 20 20 69 66 20 7b 24 70 64 62 7d 20 74       if {$pdb} t
c930: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74  hen {..        t
c940: 72 79 44 65 6c 65 74 65 42 69 6e 61 72 79 46 69  ryDeleteBinaryFi
c950: 6c 65 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  le [appendArgs \
c960: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 66  ..            [f
c970: 69 6c 65 20 72 6f 6f 74 6e 61 6d 65 20 24 66 69  ile rootname $fi
c980: 6c 65 4e 61 6d 65 5d 20 2e 70 64 62 5d 20 24 70  leName] .pdb] $p
c990: 6c 61 74 66 6f 72 6d 20 24 76 65 72 62 6f 73 65  latform $verbose
c9a0: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
c9b0: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 74 72  .....    proc tr
c9c0: 79 4c 6f 61 64 41 73 73 65 6d 62 6c 79 20 7b 20  yLoadAssembly { 
c9d0: 66 69 6c 65 4e 61 6d 65 20 7b 70 6c 61 74 66 6f  fileName {platfo
c9e0: 72 6d 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20  rm ""} } {..    
c9f0: 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b    set fileName [
ca00: 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d  getBinaryFileNam
ca10: 65 20 24 66 69 6c 65 4e 61 6d 65 20 24 70 6c 61  e $fileName $pla
ca20: 74 66 6f 72 6d 5d 0d 0a 0d 0a 20 20 20 20 20 20  tform]....      
ca30: 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20  if {[catch {..  
ca40: 20 20 20 20 20 20 73 65 74 20 61 73 73 65 6d 62        set assemb
ca50: 6c 79 20 5b 6f 62 6a 65 63 74 20 6c 6f 61 64 20  ly [object load 
ca60: 2d 6c 6f 61 64 74 79 70 65 20 46 69 6c 65 20 2d  -loadtype File -
ca70: 61 6c 69 61 73 20 24 66 69 6c 65 4e 61 6d 65 5d  alias $fileName]
ca80: 0d 0a 20 20 20 20 20 20 7d 5d 20 3d 3d 20 30 7d  ..      }] == 0}
ca90: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
caa0: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
cab0: 54 45 3a 20 4e 6f 77 2c 20 61 64 64 20 74 68 65  TE: Now, add the
cac0: 20 6e 65 63 65 73 73 61 72 79 20 74 65 73 74 20   necessary test 
cad0: 63 6f 6e 73 74 72 61 69 6e 74 2e 0d 0a 20 20 20  constraint...   
cae0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
caf0: 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 66  addConstraint [f
cb00: 69 6c 65 20 72 6f 6f 74 6e 61 6d 65 20 5b 66 69  ile rootname [fi
cb10: 6c 65 20 74 61 69 6c 20 24 66 69 6c 65 4e 61 6d  le tail $fileNam
cb20: 65 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23  e]]....        #
cb30: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
cb40: 3a 20 47 72 61 62 20 74 68 65 20 69 6d 61 67 65  : Grab the image
cb50: 20 72 75 6e 74 69 6d 65 20 76 65 72 73 69 6f 6e   runtime version
cb60: 20 66 72 6f 6d 20 74 68 65 20 61 73 73 65 6d 62   from the assemb
cb70: 6c 79 20 62 65 63 61 75 73 65 0d 0a 20 20 20 20  ly because..    
cb80: 20 20 20 20 23 20 20 20 20 20 20 20 73 65 76 65      #       seve
cb90: 72 61 6c 20 74 65 73 74 73 20 72 65 6c 79 20 6f  ral tests rely o
cba0: 6e 20 69 74 20 68 61 76 69 6e 67 20 61 20 63 65  n it having a ce
cbb0: 72 74 61 69 6e 20 76 61 6c 75 65 2e 0d 0a 20 20  rtain value...  
cbc0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
cbd0: 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b   addConstraint [
cbe0: 61 70 70 65 6e 64 41 72 67 73 20 5b 66 69 6c 65  appendArgs [file
cbf0: 20 74 61 69 6c 20 24 66 69 6c 65 4e 61 6d 65 5d   tail $fileName]
cc00: 20 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   _ \..          
cc10: 20 20 5b 24 61 73 73 65 6d 62 6c 79 20 49 6d 61    [$assembly Ima
cc20: 67 65 52 75 6e 74 69 6d 65 56 65 72 73 69 6f 6e  geRuntimeVersion
cc30: 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d  ]]....        #.
cc40: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
cc50: 20 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c   Return the full
cc60: 20 70 61 74 68 20 6f 66 20 74 68 65 20 6c 6f 61   path of the loa
cc70: 64 65 64 20 66 69 6c 65 2e 0d 0a 20 20 20 20 20  ded file...     
cc80: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65     #..        re
cc90: 74 75 72 6e 20 24 66 69 6c 65 4e 61 6d 65 0d 0a  turn $fileName..
cca0: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
ccb0: 20 72 65 74 75 72 6e 20 22 22 0d 0a 20 20 20 20   return ""..    
ccc0: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 69  }.....    proc i
ccd0: 73 53 51 4c 69 74 65 52 65 61 64 79 20 7b 7d 20  sSQLiteReady {} 
cce0: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
ccf0: 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 70    # NOTE: This p
cd00: 72 6f 63 65 64 75 72 65 20 6d 75 73 74 20 72 65  rocedure must re
cd10: 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 6e  turn non-zero on
cd20: 6c 79 20 69 66 20 74 68 65 20 53 51 4c 69 74 65  ly if the SQLite
cd30: 20 6e 61 74 69 76 65 0d 0a 20 20 20 20 20 20 23   native..      #
cd40: 20 20 20 20 20 20 20 6c 69 62 72 61 72 79 20 61         library a
cd50: 6e 64 20 74 68 65 20 53 79 73 74 65 6d 2e 44 61  nd the System.Da
cd60: 74 61 2e 53 51 4c 69 74 65 20 6d 61 6e 61 67 65  ta.SQLite manage
cd70: 64 20 61 73 73 65 6d 62 6c 79 20 61 72 65 20 6c  d assembly are l
cd80: 6f 61 64 65 64 0d 0a 20 20 20 20 20 20 23 20 20  oaded..      #  
cd90: 20 20 20 20 20 61 6e 64 20 72 65 61 64 79 20 66       and ready f
cda0: 6f 72 20 75 73 65 20 62 79 20 74 68 65 20 74 65  or use by the te
cdb0: 73 74 20 73 75 69 74 65 2e 20 20 43 75 72 72 65  st suite.  Curre
cdc0: 6e 74 6c 79 2c 20 74 68 69 73 20 70 72 6f 63 65  ntly, this proce
cdd0: 64 75 72 65 0d 0a 20 20 20 20 20 20 23 20 20 20  dure..      #   
cde0: 20 20 20 20 73 68 6f 75 6c 64 20 62 65 20 63 61      should be ca
cdf0: 6c 6c 65 64 20 6f 6e 6c 79 20 61 66 74 65 72 20  lled only after 
ce00: 74 68 65 20 5b 74 72 79 4c 6f 61 64 41 73 73 65  the [tryLoadAsse
ce10: 6d 62 6c 79 5d 20 70 72 6f 63 65 64 75 72 65 20  mbly] procedure 
ce20: 68 61 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20  has..      #    
ce30: 20 20 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 74     been called t
ce40: 6f 20 70 72 6f 62 65 20 66 6f 72 20 74 68 65 20  o probe for the 
ce50: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
ce60: 74 65 20 6d 61 6e 61 67 65 64 20 61 73 73 65 6d  te managed assem
ce70: 62 6c 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20  bly..      #    
ce80: 20 20 20 61 6e 64 20 74 68 65 20 5b 63 68 65 63     and the [chec
ce90: 6b 46 6f 72 53 51 4c 69 74 65 5d 20 70 72 6f 63  kForSQLite] proc
cea0: 65 64 75 72 65 20 68 61 73 20 62 65 65 6e 20 63  edure has been c
ceb0: 61 6c 6c 65 64 20 74 6f 20 70 72 6f 62 65 20 66  alled to probe f
cec0: 6f 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  or..      #     
ced0: 20 20 74 68 65 20 53 51 4c 69 74 65 20 6e 61 74    the SQLite nat
cee0: 69 76 65 20 6c 69 62 72 61 72 79 3b 20 6f 74 68  ive library; oth
cef0: 65 72 77 69 73 65 2c 20 74 68 69 73 20 70 72 6f  erwise, this pro
cf00: 63 65 64 75 72 65 20 77 69 6c 6c 20 73 69 6d 70  cedure will simp
cf10: 6c 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ly..      #     
cf20: 20 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e 20    always return 
cf30: 7a 65 72 6f 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  zero...      #..
cf40: 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 65 78        return [ex
cf50: 70 72 20 7b 0d 0a 20 20 20 20 20 20 20 20 5b 68  pr {..        [h
cf60: 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 53 79  aveConstraint Sy
cf70: 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
cf80: 5d 20 26 26 20 5b 68 61 76 65 43 6f 6e 73 74 72  ] && [haveConstr
cf90: 61 69 6e 74 20 53 51 4c 69 74 65 5d 0d 0a 20 20  aint SQLite]..  
cfa0: 20 20 20 20 7d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c      }]..    }...
cfb0: 0d 0a 20 20 20 20 70 72 6f 63 20 6d 61 74 63 68  ..    proc match
cfc0: 50 6c 61 74 66 6f 72 6d 20 7b 20 70 6c 61 74 66  Platform { platf
cfd0: 6f 72 6d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23  orm } {..      #
cfe0: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
cff0: 41 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 20  An empty string 
d000: 66 6f 72 20 74 68 65 20 70 6c 61 74 66 6f 72 6d  for the platform
d010: 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
d020: 62 75 69 6c 64 20 69 73 20 6e 6f 74 0d 0a 20 20  build is not..  
d030: 20 20 20 20 23 20 20 20 20 20 20 20 5b 70 72 69      #       [pri
d040: 6d 61 72 69 6c 79 5d 20 61 20 6e 61 74 69 76 65  marily] a native
d050: 20 62 75 69 6c 64 3b 20 74 68 65 72 65 66 6f 72   build; therefor
d060: 65 2c 20 69 74 20 61 6c 77 61 79 73 20 6d 61 74  e, it always mat
d070: 63 68 65 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  ches...      #..
d080: 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
d090: 67 20 6c 65 6e 67 74 68 20 24 70 6c 61 74 66 6f  g length $platfo
d0a0: 72 6d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  rm] == 0} then {
d0b0: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
d0c0: 20 74 72 75 65 0d 0a 20 20 20 20 20 20 7d 0d 0a   true..      }..
d0d0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
d0e0: 20 23 20 4e 4f 54 45 3a 20 49 66 20 74 68 65 20   # NOTE: If the 
d0f0: 6d 61 63 68 69 6e 65 20 6e 61 6d 65 20 69 73 20  machine name is 
d100: 75 6e 61 76 61 69 6c 61 62 6c 65 2c 20 74 68 65  unavailable, the
d110: 72 65 20 69 73 20 6e 6f 74 68 69 67 6e 20 65 6c  re is nothign el
d120: 73 65 20 77 65 0d 0a 20 20 20 20 20 20 23 20 20  se we..      #  
d130: 20 20 20 20 20 63 61 6e 20 64 6f 2e 0d 0a 20 20       can do...  
d140: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
d150: 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
d160: 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 6d 61  :tcl_platform(ma
d170: 63 68 69 6e 65 29 5d 7d 20 74 68 65 6e 20 7b 0d  chine)]} then {.
d180: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
d190: 66 61 6c 73 65 0d 0a 20 20 20 20 20 20 7d 0d 0a  false..      }..
d1a0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
d1b0: 20 23 20 4e 4f 54 45 3a 20 44 6f 65 73 20 74 68   # NOTE: Does th
d1c0: 65 20 73 70 65 63 69 66 69 65 64 20 70 6c 61 74  e specified plat
d1d0: 66 6f 72 6d 20 6d 61 74 63 68 20 75 70 20 74 6f  form match up to
d1e0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 72 6f   the current pro
d1f0: 63 65 73 73 3f 0d 0a 20 20 20 20 20 20 23 0d 0a  cess?..      #..
d200: 20 20 20 20 20 20 69 66 20 7b 24 70 6c 61 74 66        if {$platf
d210: 6f 72 6d 20 65 71 20 5b 6d 61 63 68 69 6e 65 54  orm eq [machineT
d220: 6f 50 6c 61 74 66 6f 72 6d 20 24 3a 3a 74 63 6c  oPlatform $::tcl
d230: 5f 70 6c 61 74 66 6f 72 6d 28 6d 61 63 68 69 6e  _platform(machin
d240: 65 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  e)]} then {..   
d250: 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65       return true
d260: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
d270: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
d280: 54 45 3a 20 54 68 65 20 73 70 65 63 69 66 69 65  TE: The specifie
d290: 64 20 70 6c 61 74 66 6f 72 6d 20 64 6f 65 73 20  d platform does 
d2a0: 6e 6f 74 20 6d 61 74 63 68 20 75 70 20 77 69 74  not match up wit
d2b0: 68 20 74 68 65 20 70 6c 61 74 66 6f 72 6d 0d 0a  h the platform..
d2c0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 66 6f        #       fo
d2d0: 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 72  r the current pr
d2e0: 6f 63 65 73 73 2e 0d 0a 20 20 20 20 20 20 23 0d  ocess...      #.
d2f0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61  .      return fa
d300: 6c 73 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20  lse..    }..... 
d310: 20 20 20 70 72 6f 63 20 68 61 76 65 53 51 4c 69     proc haveSQLi
d320: 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 20  teObjectCommand 
d330: 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20  {} {..      #.. 
d340: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 73 20       # NOTE: Is 
d350: 74 68 65 20 5b 6f 62 6a 65 63 74 5d 20 63 6f 6d  the [object] com
d360: 6d 61 6e 64 20 63 75 72 72 65 6e 74 6c 79 20 61  mand currently a
d370: 76 61 69 6c 61 62 6c 65 3f 0d 0a 20 20 20 20 20  vailable?..     
d380: 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e   #..      return
d390: 20 5b 65 78 70 72 20 7b 5b 6c 6c 65 6e 67 74 68   [expr {[llength
d3a0: 20 5b 69 6e 66 6f 20 63 6f 6d 6d 61 6e 64 73 20   [info commands 
d3b0: 6f 62 6a 65 63 74 5d 5d 20 3e 20 30 7d 5d 0d 0a  object]] > 0}]..
d3c0: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
d3d0: 6f 63 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74  oc checkForSQLit
d3e0: 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 20 7b  eObjectCommand {
d3f0: 20 63 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20   channel } {..  
d400: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
d410: 65 6c 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e  el "---- checkin
d420: 67 20 66 6f 72 20 5c 22 6f 62 6a 65 63 74 5c 22  g for \"object\"
d430: 20 63 6f 6d 6d 61 6e 64 20 75 73 61 67 65 2e 2e   command usage..
d440: 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20  . "....      if 
d450: 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
d460: 3a 6e 6f 28 73 71 6c 69 74 65 4f 62 6a 65 63 74  :no(sqliteObject
d470: 43 6f 6d 6d 61 6e 64 29 5d 20 26 26 20 5c 0d 0a  Command)] && \..
d480: 20 20 20 20 20 20 20 20 20 20 5b 68 61 76 65 53            [haveS
d490: 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61  QLiteObjectComma
d4a0: 6e 64 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  nd]} then {..   
d4b0: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
d4c0: 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20 20 20 20 20  nel yes\n..     
d4d0: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
d4e0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
d4f0: 4e 4f 54 45 3a 20 55 6e 6c 65 73 73 20 77 65 20  NOTE: Unless we 
d500: 61 72 65 20 66 6f 72 62 69 64 64 65 6e 20 66 72  are forbidden fr
d510: 6f 6d 20 64 6f 69 6e 67 20 73 6f 2c 20 61 64 64  om doing so, add
d520: 20 73 6f 6d 65 20 63 6f 6e 73 74 72 61 69 6e 74   some constraint
d530: 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  s..        #    
d540: 20 20 20 74 68 61 74 20 77 69 6c 6c 20 61 6c 6c     that will all
d550: 6f 77 20 6d 6f 73 74 20 6f 66 20 74 68 65 20 74  ow most of the t
d560: 65 73 74 20 73 75 69 74 65 20 74 6f 20 72 75 6e  est suite to run
d570: 20 28 69 2e 65 2e 20 74 68 6f 73 65 0d 0a 20 20   (i.e. those..  
d580: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 65        #       te
d590: 73 74 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20  sts that do not 
d5a0: 64 69 72 65 63 74 6c 79 20 72 65 6c 79 20 75 70  directly rely up
d5b0: 6f 6e 20 74 68 65 20 5b 6f 62 6a 65 63 74 5d 20  on the [object] 
d5c0: 63 6f 6d 6d 61 6e 64 29 2e 0d 0a 20 20 20 20 20  command)...     
d5d0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66     #..        if
d5e0: 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
d5f0: 3a 3a 6e 6f 28 73 68 69 6d 53 51 4c 69 74 65 41  ::no(shimSQLiteA
d600: 73 73 65 6d 62 6c 79 43 6f 6e 73 74 72 61 69 6e  ssemblyConstrain
d610: 74 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ts)]} then {..  
d620: 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74          addConst
d630: 72 61 69 6e 74 20 53 51 4c 69 74 65 0d 0a 20 20  raint SQLite..  
d640: 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74          addConst
d650: 72 61 69 6e 74 20 53 51 4c 69 74 65 49 6e 74 65  raint SQLiteInte
d660: 72 6f 70 0d 0a 20 20 20 20 20 20 20 20 20 20 61  rop..          a
d670: 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 53 79 73  ddConstraint Sys
d680: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 0d  tem.Data.SQLite.
d690: 0a 20 20 20 20 20 20 20 20 20 20 61 64 64 43 6f  .          addCo
d6a0: 6e 73 74 72 61 69 6e 74 20 53 79 73 74 65 6d 2e  nstraint System.
d6b0: 44 61 74 61 2e 53 51 4c 69 74 65 2e 45 6e 63 72  Data.SQLite.Encr
d6c0: 79 70 74 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20  yption..        
d6d0: 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20    addConstraint 
d6e0: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
d6f0: 74 65 2e 4c 69 6e 71 0d 0a 0d 0a 20 20 20 20 20  te.Linq....     
d700: 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
d710: 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  nt [appendArgs \
d720: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
d730: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
d740: 74 65 2e 64 6c 6c 5f 76 20 5b 67 65 74 42 75 69  te.dll_v [getBui
d750: 6c 64 43 6c 72 56 65 72 73 69 6f 6e 5d 5d 0d 0a  ldClrVersion]]..
d760: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
d770: 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
d780: 65 78 69 73 74 73 20 3a 3a 6e 6f 28 73 68 69 6d  exists ::no(shim
d790: 53 51 4c 69 74 65 44 65 66 69 6e 65 43 6f 6e 73  SQLiteDefineCons
d7a0: 74 61 6e 74 43 6f 6e 73 74 72 61 69 6e 74 73 29  tantConstraints)
d7b0: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
d7c0: 20 20 20 20 20 66 6f 72 65 61 63 68 20 64 65 66       foreach def
d7d0: 69 6e 65 43 6f 6e 73 74 61 6e 74 20 5b 6c 69 73  ineConstant [lis
d7e0: 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  t \..           
d7f0: 20 20 20 49 4e 54 45 52 4f 50 5f 45 58 54 45 4e     INTEROP_EXTEN
d800: 53 49 4f 4e 5f 46 55 4e 43 54 49 4f 4e 53 20 49  SION_FUNCTIONS I
d810: 4e 54 45 52 4f 50 5f 46 54 53 35 5f 45 58 54 45  NTEROP_FTS5_EXTE
d820: 4e 53 49 4f 4e 20 5c 0d 0a 20 20 20 20 20 20 20  NSION \..       
d830: 20 20 20 20 20 20 20 49 4e 54 45 52 4f 50 5f 4a         INTEROP_J
d840: 53 4f 4e 31 5f 45 58 54 45 4e 53 49 4f 4e 20 49  SON1_EXTENSION I
d850: 4e 54 45 52 4f 50 5f 50 45 52 43 45 4e 54 49 4c  NTEROP_PERCENTIL
d860: 45 5f 45 58 54 45 4e 53 49 4f 4e 20 5c 0d 0a 20  E_EXTENSION \.. 
d870: 20 20 20 20 20 20 20 20 20 20 20 20 20 49 4e 54               INT
d880: 45 52 4f 50 5f 52 45 47 45 58 50 5f 45 58 54 45  EROP_REGEXP_EXTE
d890: 4e 53 49 4f 4e 20 49 4e 54 45 52 4f 50 5f 54 45  NSION INTEROP_TE
d8a0: 53 54 5f 45 58 54 45 4e 53 49 4f 4e 20 5c 0d 0a  ST_EXTENSION \..
d8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 49 4e                IN
d8c0: 54 45 52 4f 50 5f 53 48 41 31 5f 45 58 54 45 4e  TEROP_SHA1_EXTEN
d8d0: 53 49 4f 4e 20 49 4e 54 45 52 4f 50 5f 54 4f 54  SION INTEROP_TOT
d8e0: 59 50 45 5f 45 58 54 45 4e 53 49 4f 4e 20 5c 0d  YPE_EXTENSION \.
d8f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 49  .              I
d900: 4e 54 45 52 4f 50 5f 56 49 52 54 55 41 4c 5f 54  NTEROP_VIRTUAL_T
d910: 41 42 4c 45 20 55 53 45 5f 49 4e 54 45 52 4f 50  ABLE USE_INTEROP
d920: 5f 44 4c 4c 5d 20 7b 0d 0a 20 20 20 20 20 20 20  _DLL] {..       
d930: 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
d940: 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  nt [appendArgs \
d950: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
d960: 20 20 5b 67 65 74 53 51 4c 69 74 65 44 65 66 69    [getSQLiteDefi
d970: 6e 65 43 6f 6e 73 74 61 6e 74 50 72 65 66 69 78  neConstantPrefix
d980: 5d 20 24 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e  ] $defineConstan
d990: 74 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  t]..          }.
d9a0: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
d9b0: 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
d9c0: 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 73 68 69   exists ::no(shi
d9d0: 6d 53 51 4c 69 74 65 56 69 73 75 61 6c 53 74 75  mSQLiteVisualStu
d9e0: 64 69 6f 43 6f 6e 73 74 72 61 69 6e 74 73 29 5d  dioConstraints)]
d9f0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
da00: 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e      addConstrain
da10: 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 76 69  t [appendArgs vi
da20: 73 75 61 6c 53 74 75 64 69 6f 20 5b 67 65 74 42  sualStudio [getB
da30: 75 69 6c 64 59 65 61 72 5d 5d 0d 0a 20 20 20 20  uildYear]]..    
da40: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
da50: 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
da60: 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  no\n..      }.. 
da70: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
da80: 63 20 63 68 61 6e 67 65 4e 61 74 69 76 65 52 75  c changeNativeRu
da90: 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 7b 20 6e 61  ntimeOption { na
daa0: 74 69 76 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20  tive } {..      
dab0: 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 5b 69 6e  if {[llength [in
dac0: 66 6f 20 63 6f 6d 6d 61 6e 64 73 20 64 65 62 75  fo commands debu
dad0: 67 5d 5d 20 3e 20 30 20 26 26 20 5c 0d 0a 20 20  g]] > 0 && \..  
dae0: 20 20 20 20 20 20 20 20 5b 6c 6c 65 6e 67 74 68          [llength
daf0: 20 5b 69 6e 66 6f 20 73 75 62 63 6f 6d 6d 61 6e   [info subcomman
db00: 64 73 20 64 65 62 75 67 20 72 75 6e 74 69 6d 65  ds debug runtime
db10: 6f 70 74 69 6f 6e 5d 5d 20 3e 20 30 20 26 26 20  option]] > 0 && 
db20: 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
db30: 20 20 64 65 62 75 67 20 72 75 6e 74 69 6d 65 6f    debug runtimeo
db40: 70 74 69 6f 6e 20 5b 65 78 70 72 20 7b 24 6e 61  ption [expr {$na
db50: 74 69 76 65 20 3f 20 22 61 64 64 22 20 3a 20 22  tive ? "add" : "
db60: 72 65 6d 6f 76 65 22 7d 5d 20 6e 61 74 69 76 65  remove"}] native
db70: 0d 0a 20 20 20 20 20 20 7d 5d 20 3d 3d 20 30 7d  ..      }] == 0}
db80: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
db90: 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20   return true..  
dba0: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69      }....      i
dbb0: 66 20 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f 62  f {[haveSQLiteOb
dbc0: 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d 20 26 26 20  jectCommand] && 
dbd0: 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
dbe0: 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20    object invoke 
dbf0: 49 6e 74 65 72 70 72 65 74 65 72 2e 47 65 74 41  Interpreter.GetA
dc00: 63 74 69 76 65 20 5b 65 78 70 72 20 7b 24 6e 61  ctive [expr {$na
dc10: 74 69 76 65 20 3f 20 5c 0d 0a 20 20 20 20 20 20  tive ? \..      
dc20: 20 20 20 20 20 20 22 41 64 64 52 75 6e 74 69 6d        "AddRuntim
dc30: 65 4f 70 74 69 6f 6e 22 20 3a 20 22 52 65 6d 6f  eOption" : "Remo
dc40: 76 65 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 22  veRuntimeOption"
dc50: 7d 5d 20 6e 61 74 69 76 65 0d 0a 20 20 20 20 20  }] native..     
dc60: 20 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b   }] == 0} then {
dc70: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
dc80: 20 74 72 75 65 0d 0a 20 20 20 20 20 20 7d 0d 0a   true..      }..
dc90: 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 66  ..      return f
dca0: 61 6c 73 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  alse..    }.....
dcb0: 20 20 20 20 70 72 6f 63 20 63 68 65 63 6b 46 6f      proc checkFo
dcc0: 72 53 51 4c 69 74 65 42 75 69 6c 64 73 20 7b 20  rSQLiteBuilds { 
dcd0: 63 68 61 6e 6e 65 6c 20 7b 73 65 6c 65 63 74 20  channel {select 
dce0: 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20  false} } {..    
dcf0: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
dd00: 45 3a 20 43 68 65 63 6b 20 66 6f 72 20 65 76 65  E: Check for eve
dd10: 72 79 20 70 6f 73 73 69 62 6c 65 20 76 61 6c 69  ry possible vali
dd20: 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66  d combination of
dd30: 20 76 61 6c 75 65 73 20 75 73 65 64 20 77 68 65   values used whe
dd40: 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  n..      #      
dd50: 20 6c 6f 63 61 74 69 6e 67 20 6f 75 74 20 74 68   locating out th
dd60: 65 20 62 75 69 6c 64 20 6f 75 74 70 75 74 20 64  e build output d
dd70: 69 72 65 63 74 6f 72 79 2c 20 73 68 6f 77 69 6e  irectory, showin
dd80: 67 20 65 61 63 68 20 61 76 61 69 6c 61 62 6c 65  g each available
dd90: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
dda0: 62 75 69 6c 64 20 76 61 72 69 61 74 69 6f 6e 20  build variation 
ddb0: 61 6c 6f 6e 67 20 74 68 65 20 77 61 79 2e 0d 0a  along the way...
ddc0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 66        #..      f
ddd0: 6f 72 65 61 63 68 20 6e 61 74 69 76 65 20 5b 6c  oreach native [l
dde0: 69 73 74 20 66 61 6c 73 65 20 74 72 75 65 5d 20  ist false true] 
ddf0: 7b 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61  {..        forea
de00: 63 68 20 79 65 61 72 20 5b 67 65 74 42 75 69 6c  ch year [getBuil
de10: 64 59 65 61 72 73 5d 20 7b 0d 0a 20 20 20 20 20  dYears] {..     
de20: 20 20 20 20 20 66 6f 72 65 61 63 68 20 63 6f 6e       foreach con
de30: 66 69 67 75 72 61 74 69 6f 6e 20 5b 67 65 74 42  figuration [getB
de40: 75 69 6c 64 43 6f 6e 66 69 67 75 72 61 74 69 6f  uildConfiguratio
de50: 6e 73 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  ns] {..         
de60: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
de70: 20 20 23 20 4e 4f 54 45 3a 20 46 69 67 75 72 65    # NOTE: Figure
de80: 20 6f 75 74 20 74 68 65 20 65 66 66 65 63 74 69   out the effecti
de90: 76 65 20 62 75 69 6c 64 20 70 6c 61 74 66 6f 72  ve build platfor
dea0: 6d 2e 20 20 54 68 69 73 20 69 73 0d 0a 20 20 20  m.  This is..   
deb0: 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
dec0: 20 62 61 73 65 64 20 6f 6e 20 77 68 65 74 68 65   based on whethe
ded0: 72 20 6f 72 20 6e 6f 74 20 61 20 5b 70 72 69 6d  r or not a [prim
dee0: 61 72 69 6c 79 5d 20 6e 61 74 69 76 65 20 62 75  arily] native bu
def0: 69 6c 64 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ild..           
df00: 20 23 20 20 20 20 20 20 20 69 73 20 62 65 69 6e   #       is bein
df10: 67 20 75 73 65 64 2e 20 20 46 6f 72 20 5b 70 72  g used.  For [pr
df20: 69 6d 61 72 69 6c 79 5d 20 6e 6f 6e 2d 6e 61 74  imarily] non-nat
df30: 69 76 65 20 62 75 69 6c 64 73 2c 0d 0a 20 20 20  ive builds,..   
df40: 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
df50: 20 74 68 69 73 20 77 69 6c 6c 20 62 65 20 61 6e   this will be an
df60: 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e 0d 0a   empty string...
df70: 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
df80: 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 70             set p
df90: 6c 61 74 66 6f 72 6d 20 5b 67 65 74 42 75 69 6c  latform [getBuil
dfa0: 64 50 6c 61 74 66 6f 72 6d 20 24 6e 61 74 69 76  dPlatform $nativ
dfb0: 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  e]....          
dfc0: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
dfd0: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
dfe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dff0: 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66  "---- checking f
e000: 6f 72 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  or System.Data.S
e010: 51 4c 69 74 65 20 62 75 69 6c 64 20 5c 22 22 20  QLite build \"" 
e020: 5b 65 78 70 72 20 5c 0d 0a 20 20 20 20 20 20 20  [expr \..       
e030: 20 20 20 20 20 20 20 20 20 7b 24 6e 61 74 69 76           {$nativ
e040: 65 20 3f 20 22 6e 61 74 69 76 65 2f 22 20 3a 20  e ? "native/" : 
e050: 22 22 7d 5d 20 5b 65 78 70 72 20 7b 5b 73 74 72  ""}] [expr {[str
e060: 69 6e 67 20 6c 65 6e 67 74 68 20 5c 0d 0a 20 20  ing length \..  
e070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24 70                $p
e080: 6c 61 74 66 6f 72 6d 5d 20 3e 20 30 20 3f 20 5b  latform] > 0 ? [
e090: 61 70 70 65 6e 64 41 72 67 73 20 24 70 6c 61 74  appendArgs $plat
e0a0: 66 6f 72 6d 20 2f 5d 20 3a 20 22 22 7d 5d 20 24  form /] : ""}] $
e0b0: 79 65 61 72 20 5c 0d 0a 20 20 20 20 20 20 20 20  year \..        
e0c0: 20 20 20 20 20 20 20 20 2f 20 24 63 6f 6e 66 69          / $confi
e0d0: 67 75 72 61 74 69 6f 6e 20 22 5c 22 2e 2e 2e 20  guration "\"... 
e0e0: 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  "]....          
e0f0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
e100: 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74   # NOTE: Build t
e110: 68 65 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69  he fully qualifi
e120: 65 64 20 64 69 72 65 63 74 6f 72 79 20 77 68 65  ed directory whe
e130: 72 65 20 74 68 65 20 6e 65 63 65 73 73 61 72 79  re the necessary
e140: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20  ..            # 
e150: 20 20 20 20 20 20 63 6f 6d 70 6f 6e 65 6e 74 73        components
e160: 20 66 6f 72 20 53 79 73 74 65 6d 2e 44 61 74 61   for System.Data
e170: 2e 53 51 4c 69 74 65 20 73 68 6f 75 6c 64 20 62  .SQLite should b
e180: 65 20 66 6f 75 6e 64 2e 0d 0a 20 20 20 20 20 20  e found...      
e190: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
e1a0: 20 20 20 20 20 73 65 74 20 64 69 72 65 63 74 6f       set directo
e1b0: 72 79 20 5b 6a 6f 69 6e 42 75 69 6c 64 44 69 72  ry [joinBuildDir
e1c0: 65 63 74 6f 72 79 20 24 6e 61 74 69 76 65 20 5c  ectory $native \
e1d0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
e1e0: 20 20 5b 67 65 74 42 75 69 6c 64 42 61 73 65 44    [getBuildBaseD
e1f0: 69 72 65 63 74 6f 72 79 5d 20 24 79 65 61 72 20  irectory] $year 
e200: 24 70 6c 61 74 66 6f 72 6d 20 24 63 6f 6e 66 69  $platform $confi
e210: 67 75 72 61 74 69 6f 6e 5d 0d 0a 0d 0a 20 20 20  guration]....   
e220: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
e230: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
e240: 44 6f 20 74 68 65 20 6e 65 63 65 73 73 61 72 79  Do the necessary
e250: 20 66 69 6c 65 73 20 65 78 69 73 74 3f 20 20 43   files exist?  C
e260: 75 72 72 65 6e 74 6c 79 2c 20 6e 6f 20 6f 74 68  urrently, no oth
e270: 65 72 20 73 74 65 70 73 0d 0a 20 20 20 20 20 20  er steps..      
e280: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61 72        #       ar
e290: 65 20 74 61 6b 65 6e 20 74 6f 20 76 65 72 69 66  e taken to verif
e2a0: 79 20 74 68 69 73 20 62 75 69 6c 64 20 69 73 20  y this build is 
e2b0: 61 63 74 75 61 6c 6c 79 20 76 69 61 62 6c 65 2e  actually viable.
e2c0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d  ..            #.
e2d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
e2e0: 7b 5b 69 73 42 75 69 6c 64 41 76 61 69 6c 61 62  {[isBuildAvailab
e2f0: 6c 65 20 24 6e 61 74 69 76 65 20 24 64 69 72 65  le $native $dire
e300: 63 74 6f 72 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a  ctory]} then {..
e310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
e320: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
e330: 20 4e 4f 54 45 3a 20 57 68 65 6e 20 69 6e 20 22   NOTE: When in "
e340: 73 65 6c 65 63 74 22 20 6d 6f 64 65 2c 20 61 75  select" mode, au
e350: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 73 65 6c 65  tomatically sele
e360: 63 74 20 74 68 65 20 66 69 72 73 74 0d 0a 20 20  ct the first..  
e370: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20              #   
e380: 20 20 20 20 61 76 61 69 6c 61 62 6c 65 20 62 75      available bu
e390: 69 6c 64 20 6f 66 20 53 79 73 74 65 6d 2e 44 61  ild of System.Da
e3a0: 74 61 2e 53 51 4c 69 74 65 20 61 6e 64 20 74 68  ta.SQLite and th
e3b0: 65 6e 20 72 65 74 75 72 6e 0d 0a 20 20 20 20 20  en return..     
e3c0: 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
e3d0: 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0d 0a 20   immediately... 
e3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a               #..
e3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
e400: 20 7b 24 73 65 6c 65 63 74 20 26 26 20 5b 6d 61   {$select && [ma
e410: 74 63 68 50 6c 61 74 66 6f 72 6d 20 24 70 6c 61  tchPlatform $pla
e420: 74 66 6f 72 6d 5d 7d 20 74 68 65 6e 20 7b 0d 0a  tform]} then {..
e430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e440: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  #..             
e450: 20 20 20 23 20 4e 4f 54 45 3a 20 4d 61 6e 75 61     # NOTE: Manua
e460: 6c 6c 79 20 6f 76 65 72 72 69 64 65 20 61 6c 6c  lly override all
e470: 20 74 68 65 20 62 75 69 6c 64 20 64 69 72 65 63   the build direc
e480: 74 6f 72 79 20 73 65 6c 65 63 74 69 6f 6e 0d 0a  tory selection..
e490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e4a0: 23 20 20 20 20 20 20 20 72 65 6c 61 74 65 64 20  #       related 
e4b0: 74 65 73 74 20 73 65 74 74 69 6e 67 73 20 69 6e  test settings in
e4c0: 20 6f 72 64 65 72 20 74 6f 20 66 6f 72 63 65 20   order to force 
e4d0: 74 68 69 73 20 62 75 69 6c 64 0d 0a 20 20 20 20  this build..    
e4e0: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20              #   
e4f0: 20 20 20 20 6f 66 20 53 79 73 74 65 6d 2e 44 61      of System.Da
e500: 74 61 2e 53 51 4c 69 74 65 20 74 6f 20 62 65 20  ta.SQLite to be 
e510: 75 73 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 20  used...         
e520: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
e530: 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
e540: 63 68 61 6e 67 65 4e 61 74 69 76 65 52 75 6e 74  changeNativeRunt
e550: 69 6d 65 4f 70 74 69 6f 6e 20 24 6e 61 74 69 76  imeOption $nativ
e560: 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  e]} then {..    
e570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70                tp
e580: 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
e590: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
e5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e5b0: 20 20 22 6e 6f 2c 20 66 61 69 6c 65 64 20 74 6f    "no, failed to
e5c0: 20 22 20 5b 65 78 70 72 20 7b 24 6e 61 74 69 76   " [expr {$nativ
e5d0: 65 20 3f 20 22 61 64 64 22 20 3a 20 22 72 65 6d  e ? "add" : "rem
e5e0: 6f 76 65 22 7d 5d 20 5c 0d 0a 20 20 20 20 20 20  ove"}] \..      
e5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e600: 22 20 74 68 65 20 5c 22 6e 61 74 69 76 65 5c 22  " the \"native\"
e610: 20 72 75 6e 74 69 6d 65 20 6f 70 74 69 6f 6e 5c   runtime option\
e620: 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  n"]....         
e630: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
e640: 66 61 6c 73 65 0d 0a 20 20 20 20 20 20 20 20 20  false..         
e650: 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
e660: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
e670: 3a 3a 74 65 73 74 5f 79 65 61 72 20 24 79 65 61  ::test_year $yea
e680: 72 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r..             
e690: 20 20 20 73 65 74 20 3a 3a 74 65 73 74 5f 70 6c     set ::test_pl
e6a0: 61 74 66 6f 72 6d 20 24 70 6c 61 74 66 6f 72 6d  atform $platform
e6b0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
e6c0: 20 20 73 65 74 20 3a 3a 74 65 73 74 5f 63 6f 6e    set ::test_con
e6d0: 66 69 67 75 72 61 74 69 6f 6e 20 24 63 6f 6e 66  figuration $conf
e6e0: 69 67 75 72 61 74 69 6f 6e 0d 0a 0d 0a 20 20 20  iguration....   
e6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
e700: 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
e710: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
e720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
e730: 79 65 73 2c 20 73 65 6c 65 63 74 65 64 20 28 22  yes, selected ("
e740: 20 5b 65 78 70 72 20 7b 24 6e 61 74 69 76 65 20   [expr {$native 
e750: 3f 20 22 6e 61 74 69 76 65 2f 22 20 3a 20 22 22  ? "native/" : ""
e760: 7d 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  }] \..          
e770: 20 20 20 20 20 20 20 20 20 20 5b 65 78 70 72 20            [expr 
e780: 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
e790: 24 70 6c 61 74 66 6f 72 6d 5d 20 3e 20 30 20 3f  $platform] > 0 ?
e7a0: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
e7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e7c0: 20 20 20 20 24 70 6c 61 74 66 6f 72 6d 20 2f 5d      $platform /]
e7d0: 20 3a 20 22 22 7d 5d 20 24 79 65 61 72 20 2f 20   : ""}] $year / 
e7e0: 24 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 22  $configuration "
e7f0: 29 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  )\n"]....       
e800: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
e810: 74 72 75 65 0d 0a 20 20 20 20 20 20 20 20 20 20  true..          
e820: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
e830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70                tp
e840: 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 79 65 73  uts $channel yes
e850: 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  \n..            
e860: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
e870: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
e880: 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
e890: 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20  channel no\n..  
e8a0: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
e8b0: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
e8c0: 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a    }..      }....
e8d0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c        return fal
e8e0: 73 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  se..    }.....  
e8f0: 20 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72 53    proc checkForS
e900: 51 4c 69 74 65 52 65 6c 65 61 73 65 73 20 7b 20  QLiteReleases { 
e910: 63 68 61 6e 6e 65 6c 20 7b 73 65 6c 65 63 74 20  channel {select 
e920: 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20  false} } {..    
e930: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
e940: 45 3a 20 43 68 65 63 6b 20 66 6f 72 20 70 61 73  E: Check for pas
e950: 74 20 72 65 6c 65 61 73 65 73 20 6f 66 20 53 79  t releases of Sy
e960: 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
e970: 20 69 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72   in the director
e980: 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  y..      #      
e990: 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68   contained in th
e9a0: 65 20 22 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  e "System.Data.S
e9b0: 51 4c 69 74 65 22 20 65 6e 76 69 72 6f 6e 6d 65  QLite" environme
e9c0: 6e 74 20 76 61 72 69 61 62 6c 65 2c 20 69 66 0d  nt variable, if.
e9d0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 70  .      #       p
e9e0: 72 65 73 65 6e 74 2e 0d 0a 20 20 20 20 20 20 23  resent...      #
e9f0: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66  ..      if {[inf
ea00: 6f 20 65 78 69 73 74 73 20 3a 3a 65 6e 76 28 53  o exists ::env(S
ea10: 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
ea20: 65 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  e)] && \..      
ea30: 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67      [string leng
ea40: 74 68 20 24 3a 3a 65 6e 76 28 53 79 73 74 65 6d  th $::env(System
ea50: 2e 44 61 74 61 2e 53 51 4c 69 74 65 29 5d 20 3e  .Data.SQLite)] >
ea60: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
ea70: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
ea80: 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74 68 65   NOTE: Build the
ea90: 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64   fully qualified
eaa0: 20 64 69 72 65 63 74 6f 72 79 20 77 68 65 72 65   directory where
eab0: 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 0d 0a   the necessary..
eac0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
ead0: 63 6f 6d 70 6f 6e 65 6e 74 73 20 66 6f 72 20 53  components for S
eae0: 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
eaf0: 65 20 73 68 6f 75 6c 64 20 62 65 20 66 6f 75 6e  e should be foun
eb00: 64 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  d...        #.. 
eb10: 20 20 20 20 20 20 20 73 65 74 20 64 69 72 65 63         set direc
eb20: 74 6f 72 79 20 5b 66 69 6c 65 20 6e 61 74 69 76  tory [file nativ
eb30: 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e  ename [file join
eb40: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
eb50: 24 3a 3a 65 6e 76 28 53 79 73 74 65 6d 2e 44 61  $::env(System.Da
eb60: 74 61 2e 53 51 4c 69 74 65 29 20 5b 67 65 74 52  ta.SQLite) [getR
eb70: 65 6c 65 61 73 65 56 65 72 73 69 6f 6e 5d 5d 5d  eleaseVersion]]]
eb80: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74  ....        tput
eb90: 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
eba0: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
ebb0: 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65 63        "---- chec
ebc0: 6b 69 6e 67 20 66 6f 72 20 53 79 73 74 65 6d 2e  king for System.
ebd0: 44 61 74 61 2e 53 51 4c 69 74 65 20 72 65 6c 65  Data.SQLite rele
ebe0: 61 73 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20  ase \"" \..     
ebf0: 20 20 20 20 20 20 20 24 64 69 72 65 63 74 6f 72         $director
ec00: 79 20 22 5c 22 2e 2e 2e 20 22 5d 0d 0a 0d 0a 20  y "\"... "].... 
ec10: 20 20 20 20 20 20 20 69 66 20 7b 5b 69 73 52 65         if {[isRe
ec20: 6c 65 61 73 65 41 76 61 69 6c 61 62 6c 65 20 24  leaseAvailable $
ec30: 64 69 72 65 63 74 6f 72 79 20 70 6c 61 74 66 6f  directory platfo
ec40: 72 6d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  rm]} then {..   
ec50: 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69         if {[stri
ec60: 6e 67 20 6c 65 6e 67 74 68 20 24 70 6c 61 74 66  ng length $platf
ec70: 6f 72 6d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  orm] == 0} then 
ec80: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  {..            s
ec90: 65 74 20 70 6c 61 74 66 6f 72 6d 20 75 6e 6b 6e  et platform unkn
eca0: 6f 77 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  own..          }
ecb0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66  ....          if
ecc0: 20 7b 24 73 65 6c 65 63 74 20 26 26 20 5b 6d 61   {$select && [ma
ecd0: 74 63 68 50 6c 61 74 66 6f 72 6d 20 24 70 6c 61  tchPlatform $pla
ece0: 74 66 6f 72 6d 5d 7d 20 74 68 65 6e 20 7b 0d 0a  tform]} then {..
ecf0: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
ed00: 3a 3a 62 75 69 6c 64 5f 64 69 72 65 63 74 6f 72  ::build_director
ed10: 79 20 24 64 69 72 65 63 74 6f 72 79 0d 0a 0d 0a  y $directory....
ed20: 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
ed30: 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
ed40: 6e 64 41 72 67 73 20 22 79 65 73 2c 20 73 65 6c  ndArgs "yes, sel
ed50: 65 63 74 65 64 20 28 22 20 24 70 6c 61 74 66 6f  ected (" $platfo
ed60: 72 6d 20 22 29 5c 6e 22 5d 0d 0a 0d 0a 20 20 20  rm ")\n"]....   
ed70: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
ed80: 74 72 75 65 0d 0a 20 20 20 20 20 20 20 20 20 20  true..          
ed90: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
eda0: 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
edb0: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
edc0: 20 22 79 65 73 20 28 22 20 24 70 6c 61 74 66 6f   "yes (" $platfo
edd0: 72 6d 20 22 29 5c 6e 22 5d 0d 0a 20 20 20 20 20  rm ")\n"]..     
ede0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
edf0: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
ee00: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
ee10: 65 6c 20 6e 6f 5c 6e 0d 0a 0d 0a 20 20 20 20 20  el no\n....     
ee20: 20 20 20 20 20 66 6f 72 65 61 63 68 20 70 61 74       foreach pat
ee30: 68 20 5b 6c 73 6f 72 74 20 2d 64 65 63 72 65 61  h [lsort -decrea
ee40: 73 69 6e 67 20 5b 66 69 6c 65 20 6c 69 73 74 20  sing [file list 
ee50: 24 64 69 72 65 63 74 6f 72 79 20 2a 5d 5d 20 7b  $directory *]] {
ee60: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
ee70: 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24   {[file exists $
ee80: 70 61 74 68 5d 20 26 26 20 5b 66 69 6c 65 20 69  path] && [file i
ee90: 73 64 69 72 65 63 74 6f 72 79 20 24 70 61 74 68  sdirectory $path
eea0: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
eeb0: 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
eec0: 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
eed0: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
eee0: 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63           "---- c
eef0: 68 65 63 6b 69 6e 67 20 66 6f 72 20 53 79 73 74  hecking for Syst
ef00: 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 72  em.Data.SQLite r
ef10: 65 6c 65 61 73 65 20 5c 22 22 20 5c 0d 0a 20 20  elease \"" \..  
ef20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef30: 24 70 61 74 68 20 22 5c 22 2e 2e 2e 20 22 5d 0d  $path "\"... "].
ef40: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
ef50: 20 69 66 20 7b 5b 69 73 52 65 6c 65 61 73 65 41   if {[isReleaseA
ef60: 76 61 69 6c 61 62 6c 65 20 24 70 61 74 68 20 70  vailable $path p
ef70: 6c 61 74 66 6f 72 6d 5d 7d 20 74 68 65 6e 20 7b  latform]} then {
ef80: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
ef90: 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
efa0: 6e 67 74 68 20 24 70 6c 61 74 66 6f 72 6d 5d 20  ngth $platform] 
efb0: 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
efc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
efd0: 73 65 74 20 70 6c 61 74 66 6f 72 6d 20 75 6e 6b  set platform unk
efe0: 6e 6f 77 6e 0d 0a 20 20 20 20 20 20 20 20 20 20  nown..          
eff0: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
f000: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 24             if {$
f010: 73 65 6c 65 63 74 20 26 26 20 5b 6d 61 74 63 68  select && [match
f020: 50 6c 61 74 66 6f 72 6d 20 24 70 6c 61 74 66 6f  Platform $platfo
f030: 72 6d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  rm]} then {..   
f040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
f050: 65 74 20 3a 3a 62 75 69 6c 64 5f 64 69 72 65 63  et ::build_direc
f060: 74 6f 72 79 20 24 70 61 74 68 0d 0a 0d 0a 20 20  tory $path....  
f070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f080: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
f090: 61 70 70 65 6e 64 41 72 67 73 20 22 79 65 73 2c  appendArgs "yes,
f0a0: 20 73 65 6c 65 63 74 65 64 20 28 22 20 24 70 6c   selected (" $pl
f0b0: 61 74 66 6f 72 6d 20 22 29 5c 6e 22 5d 0d 0a 0d  atform ")\n"]...
f0c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f0d0: 20 20 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a     return true..
f0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f0f0: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
f100: 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
f110: 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
f120: 6e 64 41 72 67 73 20 22 79 65 73 20 28 22 20 24  ndArgs "yes (" $
f130: 70 6c 61 74 66 6f 72 6d 20 22 29 5c 6e 22 5d 0d  platform ")\n"].
f140: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f150: 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
f160: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
f170: 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
f180: 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d  s $channel no\n.
f190: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
f1a0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
f1b0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
f1c0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
f1d0: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
f1e0: 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
f1f0: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
f200: 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
f210: 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72   environment var
f220: 69 61 62 6c 65 20 5c 22 53 79 73 74 65 6d 2e 44  iable \"System.D
f230: 61 74 61 2e 53 51 4c 69 74 65 5c 22 20 69 73 20  ata.SQLite\" is 
f240: 6e 6f 74 20 22 20 5c 0d 0a 20 20 20 20 20 20 20  not " \..       
f250: 20 20 20 20 20 22 73 65 74 2c 20 73 6b 69 70 70       "set, skipp
f260: 69 6e 67 20 63 68 65 63 6b 20 66 6f 72 20 72 65  ing check for re
f270: 6c 65 61 73 65 73 2e 2e 2e 5c 6e 22 5d 0d 0a 20  leases...\n"].. 
f280: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
f290: 72 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20  return false..  
f2a0: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
f2b0: 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 4c   checkForSQLiteL
f2c0: 69 62 72 61 72 79 20 7b 20 63 68 61 6e 6e 65 6c  ibrary { channel
f2d0: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74 70 75 74   } {..      tput
f2e0: 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d  s $channel "----
f2f0: 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 53 51   checking for SQ
f300: 4c 69 74 65 20 63 6f 72 65 20 6c 69 62 72 61 72  Lite core librar
f310: 79 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20  y... "....      
f320: 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20  if {[catch {..  
f330: 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76        object inv
f340: 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50  oke -flags +NonP
f350: 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20  ublic \..       
f360: 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61       System.Data
f370: 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 33 20  .SQLite.SQLite3 
f380: 53 51 4c 69 74 65 56 65 72 73 69 6f 6e 0d 0a 20  SQLiteVersion.. 
f390: 20 20 20 20 20 7d 20 76 65 72 73 69 6f 6e 5d 20       } version] 
f3a0: 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
f3b0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
f3c0: 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69   # NOTE: Check i
f3d0: 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 76  f the returned v
f3e0: 65 72 73 69 6f 6e 20 77 61 73 20 6e 75 6c 6c 2e  ersion was null.
f3f0: 20 20 49 66 20 73 6f 2c 20 6d 61 6b 65 20 69 74    If so, make it
f400: 20 65 61 73 79 0d 0a 20 20 20 20 20 20 20 20 23   easy..        #
f410: 20 20 20 20 20 20 20 74 6f 20 73 70 6f 74 2e 0d         to spot..
f420: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
f430: 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
f440: 6c 65 6e 67 74 68 20 24 76 65 72 73 69 6f 6e 5d  length $version]
f450: 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
f460: 20 20 20 20 20 20 20 20 20 73 65 74 20 76 65 72           set ver
f470: 73 69 6f 6e 20 6e 75 6c 6c 0d 0a 20 20 20 20 20  sion null..     
f480: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
f490: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
f4a0: 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 71 75  E: Attempt to qu
f4b0: 65 72 79 20 74 68 65 20 46 6f 73 73 69 6c 20 73  ery the Fossil s
f4c0: 6f 75 72 63 65 20 69 64 65 6e 74 69 66 69 65 72  ource identifier
f4d0: 20 66 6f 72 20 74 68 65 20 53 51 4c 69 74 65 0d   for the SQLite.
f4e0: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
f4f0: 20 63 6f 72 65 20 6c 69 62 72 61 72 79 2e 0d 0a   core library...
f500: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
f510: 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d     if {[catch {.
f520: 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63  .          objec
f530: 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20  t invoke -flags 
f540: 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20  +NonPublic \..  
f550: 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74              Syst
f560: 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53  em.Data.SQLite.S
f570: 51 4c 69 74 65 33 20 53 51 4c 69 74 65 53 6f 75  QLite3 SQLiteSou
f580: 72 63 65 49 64 0d 0a 20 20 20 20 20 20 20 20 7d  rceId..        }
f590: 20 73 6f 75 72 63 65 49 64 5d 7d 20 74 68 65 6e   sourceId]} then
f5a0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d   {..          #.
f5b0: 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
f5c0: 45 3a 20 57 65 20 66 61 69 6c 65 64 20 74 6f 20  E: We failed to 
f5d0: 71 75 65 72 79 20 74 68 65 20 46 6f 73 73 69 6c  query the Fossil
f5e0: 20 73 6f 75 72 63 65 20 69 64 65 6e 74 69 66 69   source identifi
f5f0: 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  er...          #
f600: 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
f610: 73 6f 75 72 63 65 49 64 20 75 6e 6b 6e 6f 77 6e  sourceId unknown
f620: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
f630: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
f640: 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20    # NOTE: Check 
f650: 69 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  if the returned 
f660: 46 6f 73 73 69 6c 20 73 6f 75 72 63 65 20 69 64  Fossil source id
f670: 65 6e 74 69 66 69 65 72 20 77 61 73 20 6e 75 6c  entifier was nul
f680: 6c 2e 20 20 49 66 0d 0a 20 20 20 20 20 20 20 20  l.  If..        
f690: 23 20 20 20 20 20 20 20 73 6f 2c 20 6d 61 6b 65  #       so, make
f6a0: 20 69 74 20 65 61 73 79 20 74 6f 20 73 70 6f 74   it easy to spot
f6b0: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
f6c0: 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
f6d0: 67 20 6c 65 6e 67 74 68 20 24 73 6f 75 72 63 65  g length $source
f6e0: 49 64 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  Id] == 0} then {
f6f0: 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
f700: 73 6f 75 72 63 65 49 64 20 6e 75 6c 6c 0d 0a 20  sourceId null.. 
f710: 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
f720: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
f730: 20 4e 4f 54 45 3a 20 59 65 73 2c 20 74 68 65 20   NOTE: Yes, the 
f740: 53 51 4c 69 74 65 20 63 6f 72 65 20 6c 69 62 72  SQLite core libr
f750: 61 72 79 20 61 70 70 65 61 72 73 20 74 6f 20 62  ary appears to b
f760: 65 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0a 20 20  e available...  
f770: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
f780: 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 53   addConstraint S
f790: 51 4c 69 74 65 0d 0a 0d 0a 20 20 20 20 20 20 20  QLite....       
f7a0: 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
f7b0: 5b 61 70 70 65 6e 64 41 72 67 73 20 22 79 65 73  [appendArgs "yes
f7c0: 20 28 22 20 24 76 65 72 73 69 6f 6e 20 22 20 22   (" $version " "
f7d0: 20 24 73 6f 75 72 63 65 49 64 20 22 29 5c 6e 22   $sourceId ")\n"
f7e0: 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  ]..      } else 
f7f0: 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  {..        tputs
f800: 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a   $channel no\n..
f810: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
f820: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 68 65 63  ...    proc chec
f830: 6b 46 6f 72 53 51 4c 69 74 65 49 6e 74 65 72 6f  kForSQLiteIntero
f840: 70 20 7b 20 63 68 61 6e 6e 65 6c 20 7d 20 7b 0d  p { channel } {.
f850: 0a 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68  .      tputs $ch
f860: 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 68 65 63  annel "---- chec
f870: 6b 69 6e 67 20 66 6f 72 20 53 51 4c 69 74 65 20  king for SQLite 
f880: 69 6e 74 65 72 6f 70 20 61 73 73 65 6d 62 6c 79  interop assembly
f890: 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 69  ... "....      i
f8a0: 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  f {[catch {..   
f8b0: 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f       object invo
f8c0: 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75  ke -flags +NonPu
f8d0: 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20  blic \..        
f8e0: 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e      System.Data.
f8f0: 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 33 20 49  SQLite.SQLite3 I
f900: 6e 74 65 72 6f 70 56 65 72 73 69 6f 6e 0d 0a 20  nteropVersion.. 
f910: 20 20 20 20 20 7d 20 76 65 72 73 69 6f 6e 5d 20       } version] 
f920: 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
f930: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
f940: 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69   # NOTE: Check i
f950: 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 76  f the returned v
f960: 65 72 73 69 6f 6e 20 77 61 73 20 6e 75 6c 6c 2e  ersion was null.
f970: 20 20 49 66 20 73 6f 2c 20 6d 61 6b 65 20 69 74    If so, make it
f980: 20 65 61 73 79 0d 0a 20 20 20 20 20 20 20 20 23   easy..        #
f990: 20 20 20 20 20 20 20 74 6f 20 73 70 6f 74 2e 0d         to spot..
f9a0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
f9b0: 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
f9c0: 6c 65 6e 67 74 68 20 24 76 65 72 73 69 6f 6e 5d  length $version]
f9d0: 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
f9e0: 20 20 20 20 20 20 20 20 20 73 65 74 20 76 65 72           set ver
f9f0: 73 69 6f 6e 20 6e 75 6c 6c 0d 0a 20 20 20 20 20  sion null..     
fa00: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
fa10: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
fa20: 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 71 75  E: Attempt to qu
fa30: 65 72 79 20 74 68 65 20 46 6f 73 73 69 6c 20 73  ery the Fossil s
fa40: 6f 75 72 63 65 20 69 64 65 6e 74 69 66 69 65 72  ource identifier
fa50: 20 66 6f 72 20 74 68 65 20 53 51 4c 69 74 65 0d   for the SQLite.
fa60: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
fa70: 20 63 6f 72 65 20 6c 69 62 72 61 72 79 2e 0d 0a   core library...
fa80: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
fa90: 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d     if {[catch {.
faa0: 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63  .          objec
fab0: 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20  t invoke -flags 
fac0: 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20  +NonPublic \..  
fad0: 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74              Syst
fae0: 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53  em.Data.SQLite.S
faf0: 51 4c 69 74 65 33 20 49 6e 74 65 72 6f 70 53 6f  QLite3 InteropSo
fb00: 75 72 63 65 49 64 0d 0a 20 20 20 20 20 20 20 20  urceId..        
fb10: 7d 20 73 6f 75 72 63 65 49 64 5d 7d 20 74 68 65  } sourceId]} the
fb20: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23  n {..          #
fb30: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
fb40: 54 45 3a 20 57 65 20 66 61 69 6c 65 64 20 74 6f  TE: We failed to
fb50: 20 71 75 65 72 79 20 74 68 65 20 46 6f 73 73 69   query the Fossi
fb60: 6c 20 73 6f 75 72 63 65 20 69 64 65 6e 74 69 66  l source identif
fb70: 69 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ier...          
fb80: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  #..          set
fb90: 20 73 6f 75 72 63 65 49 64 20 75 6e 6b 6e 6f 77   sourceId unknow
fba0: 6e 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  n..        }....
fbb0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
fbc0: 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b     # NOTE: Check
fbd0: 20 69 66 20 74 68 65 20 72 65 74 75 72 6e 65 64   if the returned
fbe0: 20 46 6f 73 73 69 6c 20 73 6f 75 72 63 65 20 69   Fossil source i
fbf0: 64 65 6e 74 69 66 69 65 72 20 77 61 73 20 6e 75  dentifier was nu
fc00: 6c 6c 2e 20 20 49 66 0d 0a 20 20 20 20 20 20 20  ll.  If..       
fc10: 20 23 20 20 20 20 20 20 20 73 6f 2c 20 6d 61 6b   #       so, mak
fc20: 65 20 69 74 20 65 61 73 79 20 74 6f 20 73 70 6f  e it easy to spo
fc30: 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  t...        #.. 
fc40: 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69         if {[stri
fc50: 6e 67 20 6c 65 6e 67 74 68 20 24 73 6f 75 72 63  ng length $sourc
fc60: 65 49 64 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  eId] == 0} then 
fc70: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  {..          set
fc80: 20 73 6f 75 72 63 65 49 64 20 6e 75 6c 6c 0d 0a   sourceId null..
fc90: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
fca0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
fcb0: 23 20 4e 4f 54 45 3a 20 42 65 66 6f 72 65 20 61  # NOTE: Before a
fcc0: 63 74 75 61 6c 6c 79 20 61 64 64 69 6e 67 20 74  ctually adding t
fcd0: 68 65 20 74 65 73 74 20 63 6f 6e 73 74 72 61 69  he test constrai
fce0: 6e 74 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68  nt, make sure th
fcf0: 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
fd00: 20 20 20 76 65 72 73 69 6f 6e 20 69 73 20 76 61     version is va
fd10: 6c 69 64 20 28 69 2e 65 2e 20 6e 6f 74 20 6a 75  lid (i.e. not ju
fd20: 73 74 20 74 68 61 74 20 77 65 20 63 6f 75 6c 64  st that we could
fd30: 20 71 75 65 72 79 20 69 74 29 2e 0d 0a 20 20 20   query it)...   
fd40: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
fd50: 69 66 20 7b 24 76 65 72 73 69 6f 6e 20 6e 65 20  if {$version ne 
fd60: 22 6e 75 6c 6c 22 7d 20 74 68 65 6e 20 7b 0d 0a  "null"} then {..
fd70: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
fd80: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 59         # NOTE: Y
fd90: 65 73 2c 20 74 68 65 20 53 51 4c 69 74 65 20 69  es, the SQLite i
fda0: 6e 74 65 72 6f 70 20 61 73 73 65 6d 62 6c 79 20  nterop assembly 
fdb0: 61 70 70 65 61 72 73 20 74 6f 20 62 65 20 61 76  appears to be av
fdc0: 61 69 6c 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20  ailable...      
fdd0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
fde0: 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 53   addConstraint S
fdf0: 51 4c 69 74 65 49 6e 74 65 72 6f 70 0d 0a 0d 0a  QLiteInterop....
fe00: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 61 6e            set an
fe10: 73 77 65 72 20 79 65 73 0d 0a 20 20 20 20 20 20  swer yes..      
fe20: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
fe30: 20 20 20 20 20 20 73 65 74 20 61 6e 73 77 65 72        set answer
fe40: 20 6e 6f 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a   no..        }..
fe50: 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
fe60: 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
fe70: 41 72 67 73 20 24 61 6e 73 77 65 72 20 22 20 28  Args $answer " (
fe80: 22 20 24 76 65 72 73 69 6f 6e 20 22 20 22 20 24  " $version " " $
fe90: 73 6f 75 72 63 65 49 64 20 22 29 5c 6e 22 5d 0d  sourceId ")\n"].
fea0: 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
feb0: 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
fec0: 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20  channel no\n..  
fed0: 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
fee0: 0a 20 20 20 20 70 72 6f 63 20 63 68 65 63 6b 46  .    proc checkF
fef0: 6f 72 53 51 4c 69 74 65 44 65 66 69 6e 65 43 6f  orSQLiteDefineCo
ff00: 6e 73 74 61 6e 74 20 7b 20 63 68 61 6e 6e 65 6c  nstant { channel
ff10: 20 6e 61 6d 65 20 7d 20 7b 0d 0a 20 20 20 20 20   name } {..     
ff20: 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
ff30: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
ff40: 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63           "---- c
ff50: 68 65 63 6b 69 6e 67 20 66 6f 72 20 53 79 73 74  hecking for Syst
ff60: 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 64  em.Data.SQLite d
ff70: 65 66 69 6e 65 20 63 6f 6e 73 74 61 6e 74 20 5c  efine constant \
ff80: 22 22 20 24 6e 61 6d 65 20 5c 0d 0a 20 20 20 20  "" $name \..    
ff90: 20 20 20 20 20 20 22 5c 22 2e 2e 2e 20 22 5d 0d        "\"... "].
ffa0: 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61  ...      if {[ca
ffb0: 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 6f  tch {..        o
ffc0: 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c  bject invoke -fl
ffd0: 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c  ags +NonPublic \
ffe0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 79  ..            Sy
fff0: 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
10000 2e 53 51 4c 69 74 65 33 20 44 65 66 69 6e 65 43  .SQLite3 DefineC
10010 6f 6e 73 74 61 6e 74 73 0d 0a 20 20 20 20 20 20  onstants..      
10020 7d 20 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74  } defineConstant
10030 73 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  s] == 0} then {.
10040 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 6c 73  .        if {[ls
10050 65 61 72 63 68 20 2d 65 78 61 63 74 20 2d 6e 6f  earch -exact -no
10060 63 61 73 65 20 24 64 65 66 69 6e 65 43 6f 6e 73  case $defineCons
10070 74 61 6e 74 73 20 24 6e 61 6d 65 5d 20 21 3d 20  tants $name] != 
10080 2d 31 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  -1} then {..    
10090 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
100a0 20 20 20 23 20 4e 4f 54 45 3a 20 59 65 73 2c 20     # NOTE: Yes, 
100b0 74 68 69 73 20 64 65 66 69 6e 65 20 63 6f 6e 73  this define cons
100c0 74 61 6e 74 20 77 61 73 20 65 6e 61 62 6c 65 64  tant was enabled
100d0 20 77 68 65 6e 20 74 68 65 20 6d 61 6e 61 67 65   when the manage
100e0 64 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20  d..          #  
100f0 20 20 20 20 20 61 73 73 65 6d 62 6c 79 20 77 61       assembly wa
10100 73 20 63 6f 6d 70 69 6c 65 64 2e 0d 0a 20 20 20  s compiled...   
10110 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
10120 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e      addConstrain
10130 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5b 67  t [appendArgs [g
10140 65 74 53 51 4c 69 74 65 44 65 66 69 6e 65 43 6f  etSQLiteDefineCo
10150 6e 73 74 61 6e 74 50 72 65 66 69 78 5d 20 24 6e  nstantPrefix] $n
10160 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ame]....        
10170 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
10180 20 79 65 73 5c 6e 0d 0a 20 20 20 20 20 20 20 20   yes\n..        
10190 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
101a0 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
101b0 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20 20  el no\n..       
101c0 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65   }..      } else
101d0 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   {..        tput
101e0 73 20 24 63 68 61 6e 6e 65 6c 20 65 72 72 6f 72  s $channel error
101f0 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  \n..      }..   
10200 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
10210 67 65 74 44 61 74 65 54 69 6d 65 46 6f 72 6d 61  getDateTimeForma
10220 74 20 7b 20 7b 74 69 6d 65 5a 6f 6e 65 20 74 72  t { {timeZone tr
10230 75 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23  ue} } {..      #
10240 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
10250 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 73  This procedure s
10260 69 6d 70 6c 79 20 72 65 74 75 72 6e 73 20 74 68  imply returns th
10270 65 20 22 64 65 66 61 75 6c 74 22 20 44 61 74 65  e "default" Date
10280 54 69 6d 65 20 66 6f 72 6d 61 74 20 75 73 65 64  Time format used
10290 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
102a0 62 79 20 74 68 65 20 74 65 73 74 20 73 75 69 74  by the test suit
102b0 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  e...      #..   
102c0 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69     if {[info exi
102d0 73 74 73 20 3a 3a 64 61 74 65 74 69 6d 65 5f 66  sts ::datetime_f
102e0 6f 72 6d 61 74 5d 20 26 26 20 5c 0d 0a 20 20 20  ormat] && \..   
102f0 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c         [string l
10300 65 6e 67 74 68 20 24 3a 3a 64 61 74 65 74 69 6d  ength $::datetim
10310 65 5f 66 6f 72 6d 61 74 5d 20 3e 20 30 7d 20 74  e_format] > 0} t
10320 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
10330 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
10340 3a 20 52 65 74 75 72 6e 20 74 68 65 20 6d 61 6e  : Return the man
10350 75 61 6c 6c 79 20 6f 76 65 72 72 69 64 64 65 6e  ually overridden
10360 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 44   value for the D
10370 61 74 65 54 69 6d 65 20 66 6f 72 6d 61 74 2e 0d  ateTime format..
10380 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
10390 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 64 61      return $::da
103a0 74 65 74 69 6d 65 5f 66 6f 72 6d 61 74 0d 0a 20  tetime_format.. 
103b0 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
103c0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
103d0 20 20 23 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e    # NOTE: Return
103e0 20 61 6e 20 49 53 4f 38 36 30 31 20 44 61 74 65   an ISO8601 Date
103f0 54 69 6d 65 20 66 6f 72 6d 61 74 20 63 6f 6d 70  Time format comp
10400 61 74 69 62 6c 65 20 77 69 74 68 20 53 51 4c 69  atible with SQLi
10410 74 65 2c 0d 0a 20 20 20 20 20 20 20 20 23 20 20  te,..        #  
10420 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61       System.Data
10430 2e 53 51 4c 69 74 65 2c 20 61 6e 64 20 73 75 69  .SQLite, and sui
10440 74 61 62 6c 65 20 66 6f 72 20 72 6f 75 6e 64 2d  table for round-
10450 74 72 69 70 70 69 6e 67 20 77 69 74 68 20 74 68  tripping with th
10460 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
10470 20 20 20 44 61 74 65 54 69 6d 65 20 63 6c 61 73     DateTime clas
10480 73 20 6f 66 20 74 68 65 20 66 72 61 6d 65 77 6f  s of the framewo
10490 72 6b 2e 20 20 49 66 20 74 68 69 73 20 76 61 6c  rk.  If this val
104a0 75 65 20 69 73 20 63 68 61 6e 67 65 64 2c 0d 0a  ue is changed,..
104b0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
104c0 76 61 72 69 6f 75 73 20 74 65 73 74 73 20 6d 61  various tests ma
104d0 79 20 66 61 69 6c 2e 0d 0a 20 20 20 20 20 20 20  y fail...       
104e0 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   #..        retu
104f0 72 6e 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  rn [appendArgs \
10500 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 79  ..            "y
10510 79 79 79 2d 4d 4d 2d 64 64 20 48 48 3a 6d 6d 3a  yyy-MM-dd HH:mm:
10520 73 73 2e 46 46 46 46 46 46 46 22 20 5b 65 78 70  ss.FFFFFFF" [exp
10530 72 20 7b 24 74 69 6d 65 5a 6f 6e 65 20 3f 20 22  r {$timeZone ? "
10540 4b 22 20 3a 20 22 22 7d 5d 5d 0d 0a 20 20 20 20  K" : ""}]]..    
10550 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
10560 20 20 20 70 72 6f 63 20 67 65 74 44 61 74 65 54     proc getDateT
10570 69 6d 65 54 69 63 6b 73 20 7b 20 76 61 6c 75 65  imeTicks { value
10580 20 7b 6c 6f 63 61 6c 20 22 22 7d 20 7b 64 65 66   {local ""} {def
10590 61 75 6c 74 20 22 22 7d 20 7d 20 7b 0d 0a 20 20  ault ""} } {..  
105a0 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
105b0 6c 65 6e 67 74 68 20 24 76 61 6c 75 65 5d 20 3d  length $value] =
105c0 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
105d0 20 20 20 20 20 72 65 74 75 72 6e 20 24 64 65 66       return $def
105e0 61 75 6c 74 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  ault..      }...
105f0 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63  .      if {[catc
10600 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74  h {..        set
10610 20 64 61 74 65 54 69 6d 65 20 5b 6f 62 6a 65 63   dateTime [objec
10620 74 20 69 6e 76 6f 6b 65 20 2d 63 72 65 61 74 65  t invoke -create
10630 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
10640 2d 70 61 72 61 6d 65 74 65 72 74 79 70 65 73 20  -parametertypes 
10650 5b 6c 69 73 74 20 53 74 72 69 6e 67 20 53 74 72  [list String Str
10660 69 6e 67 20 49 46 6f 72 6d 61 74 50 72 6f 76 69  ing IFormatProvi
10670 64 65 72 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  der \..         
10680 20 20 20 53 79 73 74 65 6d 2e 47 6c 6f 62 61 6c     System.Global
10690 69 7a 61 74 69 6f 6e 2e 44 61 74 65 54 69 6d 65  ization.DateTime
106a0 53 74 79 6c 65 73 5d 20 44 61 74 65 54 69 6d 65  Styles] DateTime
106b0 20 50 61 72 73 65 45 78 61 63 74 20 5c 0d 0a 20   ParseExact \.. 
106c0 20 20 20 20 20 20 20 20 20 20 20 24 76 61 6c 75             $valu
106d0 65 20 5b 67 65 74 44 61 74 65 54 69 6d 65 46 6f  e [getDateTimeFo
106e0 72 6d 61 74 5d 20 6e 75 6c 6c 20 41 64 6a 75 73  rmat] null Adjus
106f0 74 54 6f 55 6e 69 76 65 72 73 61 6c 5d 0d 0a 20  tToUniversal].. 
10700 20 20 20 20 20 7d 5d 7d 20 74 68 65 6e 20 7b 0d       }]} then {.
10710 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
10720 24 64 65 66 61 75 6c 74 0d 0a 20 20 20 20 20 20  $default..      
10730 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  }....      if {[
10740 73 74 72 69 6e 67 20 69 73 20 62 6f 6f 6c 65 61  string is boolea
10750 6e 20 2d 73 74 72 69 63 74 20 24 6c 6f 63 61 6c  n -strict $local
10760 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
10770 20 20 20 73 65 74 20 64 61 74 65 54 69 6d 65 20     set dateTime 
10780 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d  [object invoke -
10790 63 72 65 61 74 65 20 44 61 74 65 54 69 6d 65 20  create DateTime 
107a0 53 70 65 63 69 66 79 4b 69 6e 64 20 5c 0d 0a 20  SpecifyKind \.. 
107b0 20 20 20 20 20 20 20 20 20 20 20 24 64 61 74 65             $date
107c0 54 69 6d 65 20 55 74 63 5d 0d 0a 20 20 20 20 20  Time Utc]..     
107d0 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
107e0 20 20 20 72 65 74 75 72 6e 20 5b 6f 62 6a 65 63     return [objec
107f0 74 20 69 6e 76 6f 6b 65 20 24 64 61 74 65 54 69  t invoke $dateTi
10800 6d 65 20 54 69 63 6b 73 5d 0d 0a 20 20 20 20 20  me Ticks]..     
10810 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b   }....      if {
10820 24 6c 6f 63 61 6c 7d 20 74 68 65 6e 20 7b 0d 0a  $local} then {..
10830 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b          return [
10840 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 24 64  object invoke $d
10850 61 74 65 54 69 6d 65 20 54 6f 4c 6f 63 61 6c 54  ateTime ToLocalT
10860 69 6d 65 2e 54 69 63 6b 73 5d 0d 0a 20 20 20 20  ime.Ticks]..    
10870 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
10880 20 20 20 20 72 65 74 75 72 6e 20 5b 6f 62 6a 65      return [obje
10890 63 74 20 69 6e 76 6f 6b 65 20 24 64 61 74 65 54  ct invoke $dateT
108a0 69 6d 65 20 54 6f 55 6e 69 76 65 72 73 61 6c 54  ime ToUniversalT
108b0 69 6d 65 2e 54 69 63 6b 73 5d 0d 0a 20 20 20 20  ime.Ticks]..    
108c0 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
108d0 20 20 20 70 72 6f 63 20 67 65 74 50 72 6f 70 65     proc getPrope
108e0 72 74 69 65 73 20 7b 20 6f 62 6a 65 63 74 20 76  rties { object v
108f0 61 72 4e 61 6d 65 20 7d 20 7b 0d 0a 20 20 20 20  arName } {..    
10900 20 20 75 70 76 61 72 20 31 20 24 76 61 72 4e 61    upvar 1 $varNa
10910 6d 65 20 70 72 6f 70 65 72 74 69 65 73 0d 0a 0d  me properties...
10920 0a 20 20 20 20 20 20 73 65 74 20 63 6f 75 6e 74  .      set count
10930 20 30 0d 0a 20 20 20 20 20 20 73 65 74 20 6e 61   0..      set na
10940 6d 65 73 20 5b 6c 69 73 74 5d 0d 0a 0d 0a 20 20  mes [list]....  
10950 20 20 20 20 69 66 20 7b 5b 69 73 4f 62 6a 65 63      if {[isObjec
10960 74 48 61 6e 64 6c 65 20 24 6f 62 6a 65 63 74 5d  tHandle $object]
10970 20 26 26 20 24 6f 62 6a 65 63 74 20 6e 65 20 22   && $object ne "
10980 6e 75 6c 6c 22 7d 20 74 68 65 6e 20 7b 0d 0a 20  null"} then {.. 
10990 20 20 20 20 20 20 20 65 76 61 6c 20 6c 61 70 70         eval lapp
109a0 65 6e 64 20 6e 61 6d 65 73 20 5b 6f 62 6a 65 63  end names [objec
109b0 74 20 6d 65 6d 62 65 72 73 20 5c 0d 0a 20 20 20  t members \..   
109c0 20 20 20 20 20 20 20 20 20 2d 6d 65 6d 62 65 72           -member
109d0 74 79 70 65 73 20 50 72 6f 70 65 72 74 79 20 2d  types Property -
109e0 6e 61 6d 65 6f 6e 6c 79 20 24 6f 62 6a 65 63 74  nameonly $object
109f0 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 65 76 61  ]....        eva
10a00 6c 20 6c 61 70 70 65 6e 64 20 6e 61 6d 65 73 20  l lappend names 
10a10 5b 6f 62 6a 65 63 74 20 6d 65 6d 62 65 72 73 20  [object members 
10a20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2d  \..            -
10a30 6d 65 6d 62 65 72 74 79 70 65 73 20 46 69 65 6c  membertypes Fiel
10a40 64 20 2d 6e 61 6d 65 6f 6e 6c 79 20 24 6f 62 6a  d -nameonly $obj
10a50 65 63 74 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  ect]..      }...
10a60 0a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 6e  .      foreach n
10a70 61 6d 65 20 24 6e 61 6d 65 73 20 7b 0d 0a 20 20  ame $names {..  
10a80 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
10a90 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62   {..          ob
10aa0 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 6f 62 6a  ject invoke -obj
10ab0 65 63 74 66 6c 61 67 73 20 2b 4e 6f 44 69 73 70  ectflags +NoDisp
10ac0 6f 73 65 20 24 6f 62 6a 65 63 74 20 24 6e 61 6d  ose $object $nam
10ad0 65 0d 0a 20 20 20 20 20 20 20 20 7d 20 76 61 6c  e..        } val
10ae0 75 65 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  ue] == 0} then {
10af0 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
10b00 5b 69 73 4f 62 6a 65 63 74 48 61 6e 64 6c 65 20  [isObjectHandle 
10b10 24 76 61 6c 75 65 5d 20 26 26 20 24 76 61 6c 75  $value] && $valu
10b20 65 20 6e 65 20 22 6e 75 6c 6c 22 7d 20 74 68 65  e ne "null"} the
10b30 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
10b40 20 73 65 74 20 65 72 72 6f 72 20 6e 75 6c 6c 3b   set error null;
10b50 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d   object invoke -
10b60 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63  flags +NonPublic
10b70 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
10b80 20 20 20 20 2d 6d 61 72 73 68 61 6c 66 6c 61 67      -marshalflag
10b90 73 20 2b 4e 6f 48 61 6e 64 6c 65 20 49 6e 74 65  s +NoHandle Inte
10ba0 72 70 72 65 74 65 72 2e 47 65 74 41 63 74 69 76  rpreter.GetActiv
10bb0 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
10bc0 20 20 20 20 20 41 64 64 4f 62 6a 65 63 74 52 65       AddObjectRe
10bd0 66 65 72 65 6e 63 65 20 4f 6b 20 24 76 61 6c 75  ference Ok $valu
10be0 65 20 65 72 72 6f 72 0d 0a 0d 0a 20 20 20 20 20  e error....     
10bf0 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 70         lappend p
10c00 72 6f 70 65 72 74 69 65 73 28 6f 62 6a 65 63 74  roperties(object
10c10 73 29 20 5b 6c 69 73 74 20 24 6e 61 6d 65 20 24  s) [list $name $
10c20 76 61 6c 75 65 5d 0d 0a 20 20 20 20 20 20 20 20  value]..        
10c30 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
10c40 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20          lappend 
10c50 70 72 6f 70 65 72 74 69 65 73 28 76 61 6c 75 65  properties(value
10c60 73 29 20 5b 6c 69 73 74 20 24 6e 61 6d 65 20 24  s) [list $name $
10c70 76 61 6c 75 65 5d 0d 0a 20 20 20 20 20 20 20 20  value]..        
10c80 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
10c90 20 69 6e 63 72 20 63 6f 75 6e 74 0d 0a 20 20 20   incr count..   
10ca0 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
10cb0 20 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64           lappend
10cc0 20 70 72 6f 70 65 72 74 69 65 73 28 65 72 72 6f   properties(erro
10cd0 72 73 29 20 5b 6c 69 73 74 20 24 6e 61 6d 65 20  rs) [list $name 
10ce0 24 3a 3a 65 72 72 6f 72 43 6f 64 65 5d 0d 0a 20  $::errorCode].. 
10cf0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
10d00 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72  }....      retur
10d10 6e 20 24 63 6f 75 6e 74 0d 0a 20 20 20 20 7d 0d  n $count..    }.
10d20 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74  ....    proc get
10d30 41 6c 6c 50 72 6f 70 65 72 74 69 65 73 20 7b 20  AllProperties { 
10d40 6f 62 6a 65 63 74 20 76 61 72 4e 61 6d 65 20 7d  object varName }
10d50 20 7b 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20   {..      upvar 
10d60 31 20 24 76 61 72 4e 61 6d 65 20 70 72 6f 70 65  1 $varName prope
10d70 72 74 69 65 73 0d 0a 20 20 20 20 20 20 73 65 74  rties..      set
10d80 20 76 61 6c 75 65 20 24 6f 62 6a 65 63 74 0d 0a   value $object..
10d90 0d 0a 20 20 20 20 20 20 77 68 69 6c 65 20 7b 74  ..      while {t
10da0 72 75 65 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20  rue} {..        
10db0 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
10dc0 73 20 70 72 6f 70 65 72 74 69 65 73 28 73 65 65  s properties(see
10dd0 6e 4f 62 6a 65 63 74 73 29 5d 20 7c 7c 20 5c 0d  nObjects)] || \.
10de0 0a 20 20 20 20 20 20 20 20 20 20 20 20 24 76 61  .            $va
10df0 6c 75 65 20 6e 69 20 24 70 72 6f 70 65 72 74 69  lue ni $properti
10e00 65 73 28 73 65 65 6e 4f 62 6a 65 63 74 73 29 7d  es(seenObjects)}
10e10 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
10e20 20 20 20 67 65 74 50 72 6f 70 65 72 74 69 65 73     getProperties
10e30 20 24 76 61 6c 75 65 20 70 72 6f 70 65 72 74 69   $value properti
10e40 65 73 0d 0a 20 20 20 20 20 20 20 20 20 20 6c 61  es..          la
10e50 70 70 65 6e 64 20 70 72 6f 70 65 72 74 69 65 73  ppend properties
10e60 28 73 65 65 6e 4f 62 6a 65 63 74 73 29 20 24 76  (seenObjects) $v
10e70 61 6c 75 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d  alue..        }.
10e80 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21  ...        if {!
10e90 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 70 72 6f  [info exists pro
10ea0 70 65 72 74 69 65 73 28 6f 62 6a 65 63 74 73 29  perties(objects)
10eb0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
10ec0 20 20 20 20 20 62 72 65 61 6b 0d 0a 20 20 20 20       break..    
10ed0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
10ee0 20 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 70   if {[llength $p
10ef0 72 6f 70 65 72 74 69 65 73 28 6f 62 6a 65 63 74  roperties(object
10f00 73 29 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  s)] == 0} then {
10f10 0d 0a 20 20 20 20 20 20 20 20 20 20 75 6e 73 65  ..          unse
10f20 74 20 70 72 6f 70 65 72 74 69 65 73 28 6f 62 6a  t properties(obj
10f30 65 63 74 73 29 3b 20 62 72 65 61 6b 0d 0a 20 20  ects); break..  
10f40 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
10f50 20 20 20 73 65 74 20 76 61 6c 75 65 20 5b 6c 69     set value [li
10f60 6e 64 65 78 20 5b 6c 69 6e 64 65 78 20 24 70 72  ndex [lindex $pr
10f70 6f 70 65 72 74 69 65 73 28 6f 62 6a 65 63 74 73  operties(objects
10f80 29 20 30 5d 20 65 6e 64 5d 0d 0a 20 20 20 20 20  ) 0] end]..     
10f90 20 20 20 73 65 74 20 70 72 6f 70 65 72 74 69 65     set propertie
10fa0 73 28 6f 62 6a 65 63 74 73 29 20 5b 6c 72 61 6e  s(objects) [lran
10fb0 67 65 20 24 70 72 6f 70 65 72 74 69 65 73 28 6f  ge $properties(o
10fc0 62 6a 65 63 74 73 29 20 31 20 65 6e 64 5d 0d 0a  bjects) 1 end]..
10fd0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
10fe0 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
10ff0 73 20 70 72 6f 70 65 72 74 69 65 73 28 73 65 65  s properties(see
11000 6e 4f 62 6a 65 63 74 73 29 5d 7d 20 74 68 65 6e  nObjects)]} then
11010 20 7b 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 65   {..        fore
11020 61 63 68 20 76 61 6c 75 65 20 24 70 72 6f 70 65  ach value $prope
11030 72 74 69 65 73 28 73 65 65 6e 4f 62 6a 65 63 74  rties(seenObject
11040 73 29 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  s) {..          
11050 69 66 20 7b 24 76 61 6c 75 65 20 65 71 20 24 6f  if {$value eq $o
11060 62 6a 65 63 74 7d 20 63 6f 6e 74 69 6e 75 65 0d  bject} continue.
11070 0a 20 20 20 20 20 20 20 20 20 20 63 61 74 63 68  .          catch
11080 20 7b 6f 62 6a 65 63 74 20 64 69 73 70 6f 73 65   {object dispose
11090 20 24 76 61 6c 75 65 7d 0d 0a 20 20 20 20 20 20   $value}..      
110a0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 75    }....        u
110b0 6e 73 65 74 20 70 72 6f 70 65 72 74 69 65 73 28  nset properties(
110c0 73 65 65 6e 4f 62 6a 65 63 74 73 29 0d 0a 20 20  seenObjects)..  
110d0 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
110e0 0a 20 20 20 20 70 72 6f 63 20 67 65 74 56 61 72  .    proc getVar
110f0 69 61 62 6c 65 73 20 7b 20 76 61 72 4e 61 6d 65  iables { varName
11100 73 20 7b 6f 62 6a 65 63 74 73 20 66 61 6c 73 65  s {objects false
11110 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74  } } {..      set
11120 20 72 65 73 75 6c 74 20 5b 6c 69 73 74 5d 0d 0a   result [list]..
11130 0d 0a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20  ..      foreach 
11140 76 61 72 4e 61 6d 65 20 24 76 61 72 4e 61 6d 65  varName $varName
11150 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20  s {..        if 
11160 7b 5b 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73  {[uplevel 1 [lis
11170 74 20 61 72 72 61 79 20 65 78 69 73 74 73 20 24  t array exists $
11180 76 61 72 4e 61 6d 65 5d 5d 7d 20 74 68 65 6e 20  varName]]} then 
11190 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  {..          set
111a0 20 61 72 72 61 79 4e 61 6d 65 20 24 76 61 72 4e   arrayName $varN
111b0 61 6d 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ame....         
111c0 20 66 6f 72 65 61 63 68 20 65 6c 65 6d 65 6e 74   foreach element
111d0 4e 61 6d 65 20 5b 75 70 6c 65 76 65 6c 20 31 20  Name [uplevel 1 
111e0 5b 6c 69 73 74 20 61 72 72 61 79 20 6e 61 6d 65  [list array name
111f0 73 20 24 61 72 72 61 79 4e 61 6d 65 5d 5d 20 7b  s $arrayName]] {
11200 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65  ..            se
11210 74 20 6e 61 6d 65 20 5b 61 70 70 65 6e 64 41 72  t name [appendAr
11220 67 73 20 24 61 72 72 61 79 4e 61 6d 65 20 28 20  gs $arrayName ( 
11230 24 65 6c 65 6d 65 6e 74 4e 61 6d 65 20 29 5d 0d  $elementName )].
11240 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74  .            set
11250 20 76 61 72 56 61 6c 75 65 20 5b 75 70 6c 65 76   varValue [uplev
11260 65 6c 20 31 20 5b 6c 69 73 74 20 73 65 74 20 24  el 1 [list set $
11270 6e 61 6d 65 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20  name]]....      
11280 20 20 20 20 20 20 69 66 20 7b 24 6f 62 6a 65 63        if {$objec
11290 74 73 20 26 26 20 5b 69 73 4f 62 6a 65 63 74 48  ts && [isObjectH
112a0 61 6e 64 6c 65 20 24 76 61 72 56 61 6c 75 65 5d  andle $varValue]
112b0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
112c0 20 20 20 20 20 20 20 20 75 6e 73 65 74 20 2d 6e          unset -n
112d0 6f 63 6f 6d 70 6c 61 69 6e 20 70 72 6f 70 65 72  ocomplain proper
112e0 74 69 65 73 0d 0a 20 20 20 20 20 20 20 20 20 20  ties..          
112f0 20 20 20 20 67 65 74 41 6c 6c 50 72 6f 70 65 72      getAllProper
11300 74 69 65 73 20 24 76 61 72 56 61 6c 75 65 20 70  ties $varValue p
11310 72 6f 70 65 72 74 69 65 73 0d 0a 0d 0a 20 20 20  roperties....   
11320 20 20 20 20 20 20 20 20 20 20 20 6c 61 70 70 65             lappe
11330 6e 64 20 72 65 73 75 6c 74 20 5b 6c 69 73 74 20  nd result [list 
11340 24 6e 61 6d 65 20 5b 61 72 72 61 79 20 67 65 74  $name [array get
11350 20 70 72 6f 70 65 72 74 69 65 73 5d 5d 0d 0a 20   properties]].. 
11360 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73             } els
11370 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e {..           
11380 20 20 20 6c 61 70 70 65 6e 64 20 72 65 73 75 6c     lappend resul
11390 74 20 5b 6c 69 73 74 20 24 6e 61 6d 65 20 24 76  t [list $name $v
113a0 61 72 56 61 6c 75 65 5d 0d 0a 20 20 20 20 20 20  arValue]..      
113b0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
113c0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20     }..        } 
113d0 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
113e0 20 20 73 65 74 20 76 61 72 56 61 6c 75 65 20 5b    set varValue [
113f0 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74 20  uplevel 1 [list 
11400 73 65 74 20 24 76 61 72 4e 61 6d 65 5d 5d 0d 0a  set $varName]]..
11410 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
11420 24 6f 62 6a 65 63 74 73 20 26 26 20 5b 69 73 4f  $objects && [isO
11430 62 6a 65 63 74 48 61 6e 64 6c 65 20 24 76 61 72  bjectHandle $var
11440 56 61 6c 75 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a  Value]} then {..
11450 20 20 20 20 20 20 20 20 20 20 20 20 75 6e 73 65              unse
11460 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 70 72  t -nocomplain pr
11470 6f 70 65 72 74 69 65 73 0d 0a 20 20 20 20 20 20  operties..      
11480 20 20 20 20 20 20 67 65 74 41 6c 6c 50 72 6f 70        getAllProp
11490 65 72 74 69 65 73 20 24 76 61 72 56 61 6c 75 65  erties $varValue
114a0 20 70 72 6f 70 65 72 74 69 65 73 0d 0a 0d 0a 20   properties.... 
114b0 20 20 20 20 20 20 20 20 20 20 20 6c 61 70 70 65             lappe
114c0 6e 64 20 72 65 73 75 6c 74 20 5b 6c 69 73 74 20  nd result [list 
114d0 24 76 61 72 4e 61 6d 65 20 5b 61 72 72 61 79 20  $varName [array 
114e0 67 65 74 20 70 72 6f 70 65 72 74 69 65 73 5d 5d  get properties]]
114f0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c  ..          } el
11500 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
11510 20 20 6c 61 70 70 65 6e 64 20 72 65 73 75 6c 74    lappend result
11520 20 5b 6c 69 73 74 20 24 76 61 72 4e 61 6d 65 20   [list $varName 
11530 24 76 61 72 56 61 6c 75 65 5d 0d 0a 20 20 20 20  $varValue]..    
11540 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
11550 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20   }..      }.... 
11560 20 20 20 20 20 72 65 74 75 72 6e 20 24 72 65 73       return $res
11570 75 6c 74 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20  ult..    }..... 
11580 20 20 20 70 72 6f 63 20 65 6e 75 6d 65 72 61 62     proc enumerab
11590 6c 65 54 6f 4c 69 73 74 20 7b 20 65 6e 75 6d 65  leToList { enume
115a0 72 61 62 6c 65 20 7d 20 7b 0d 0a 20 20 20 20 20  rable } {..     
115b0 20 73 65 74 20 72 65 73 75 6c 74 20 5b 6c 69 73   set result [lis
115c0 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b  t]....      if {
115d0 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
115e0 65 6e 75 6d 65 72 61 62 6c 65 5d 20 3d 3d 20 30  enumerable] == 0
115f0 20 7c 7c 20 24 65 6e 75 6d 65 72 61 62 6c 65 20   || $enumerable 
11600 65 71 20 22 6e 75 6c 6c 22 7d 20 74 68 65 6e 20  eq "null"} then 
11610 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  {..        retur
11620 6e 20 24 72 65 73 75 6c 74 0d 0a 20 20 20 20 20  n $result..     
11630 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 6f 62 6a 65   }....      obje
11640 63 74 20 66 6f 72 65 61 63 68 20 2d 61 6c 69 61  ct foreach -alia
11650 73 20 69 74 65 6d 20 24 65 6e 75 6d 65 72 61 62  s item $enumerab
11660 6c 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66  le {..        if
11670 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   {[string length
11680 20 24 69 74 65 6d 5d 20 3e 20 30 7d 20 74 68 65   $item] > 0} the
11690 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6c  n {..          l
116a0 61 70 70 65 6e 64 20 72 65 73 75 6c 74 20 5b 24  append result [$
116b0 69 74 65 6d 20 54 6f 53 74 72 69 6e 67 5d 0d 0a  item ToString]..
116c0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
116d0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75   }....      retu
116e0 72 6e 20 24 72 65 73 75 6c 74 0d 0a 20 20 20 20  rn $result..    
116f0 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63  }.....    proc c
11700 61 74 63 68 41 6e 64 52 65 74 75 72 6e 20 7b 20  atchAndReturn { 
11710 73 63 72 69 70 74 20 7b 73 74 61 63 6b 54 72 61  script {stackTra
11720 63 65 20 66 61 6c 73 65 7d 20 7b 73 74 72 69 63  ce false} {stric
11730 74 20 74 72 75 65 7d 20 7d 20 7b 0d 0a 20 20 20  t true} } {..   
11740 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
11750 54 45 3a 20 45 76 61 6c 75 61 74 65 20 74 68 65  TE: Evaluate the
11760 20 73 63 72 69 70 74 20 70 72 6f 76 69 64 65 64   script provided
11770 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 20 69   by our caller i
11780 6e 20 74 68 65 69 72 20 63 6f 6e 74 65 78 74 2c  n their context,
11790 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
117a0 63 61 70 74 75 72 69 6e 67 20 62 6f 74 68 20 74  capturing both t
117b0 68 65 20 72 65 73 75 6c 74 20 61 6e 64 20 74 68  he result and th
117c0 65 20 72 65 74 75 72 6e 20 63 6f 64 65 2e 0d 0a  e return code...
117d0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73        #..      s
117e0 65 74 20 63 6f 64 65 20 5b 63 61 74 63 68 20 7b  et code [catch {
117f0 75 70 6c 65 76 65 6c 20 31 20 24 73 63 72 69 70  uplevel 1 $scrip
11800 74 7d 20 72 65 73 75 6c 74 5d 0d 0a 0d 0a 20 20  t} result]....  
11810 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
11820 4f 54 45 3a 20 44 69 64 20 74 68 65 20 73 63 72  OTE: Did the scr
11830 69 70 74 20 70 72 6f 76 69 64 65 64 20 62 79 20  ipt provided by 
11840 6f 75 72 20 63 61 6c 6c 65 72 20 4e 4f 54 20 72  our caller NOT r
11850 61 69 73 65 20 61 6e 20 65 72 72 6f 72 3f 0d 0a  aise an error?..
11860 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
11870 66 20 7b 24 73 74 72 69 63 74 20 26 26 20 24 63  f {$strict && $c
11880 6f 64 65 20 3d 3d 20 30 20 7c 7c 20 21 24 73 74  ode == 0 || !$st
11890 72 69 63 74 20 26 26 20 24 63 6f 64 65 20 21 3d  rict && $code !=
118a0 20 31 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   1} then {..    
118b0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
118c0 20 4e 4f 54 45 3a 20 53 75 63 63 65 73 73 2e 20   NOTE: Success. 
118d0 20 52 65 74 75 72 6e 20 61 20 6c 69 73 74 20 77   Return a list w
118e0 69 74 68 20 74 68 65 20 72 65 74 75 72 6e 20 63  ith the return c
118f0 6f 64 65 20 61 6e 64 20 74 68 65 20 72 65 73 75  ode and the resu
11900 6c 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  lt...        #..
11910 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b          return [
11920 6c 69 73 74 20 24 63 6f 64 65 20 24 72 65 73 75  list $code $resu
11930 6c 74 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  lt]..      } els
11940 65 69 66 20 7b 24 73 74 61 63 6b 54 72 61 63 65  eif {$stackTrace
11950 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
11960 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
11970 4f 54 45 3a 20 46 61 69 6c 75 72 65 2e 20 20 4f  OTE: Failure.  O
11980 75 72 20 63 61 6c 6c 65 72 20 77 61 6e 74 73 20  ur caller wants 
11990 61 20 66 75 6c 6c 20 73 74 61 63 6b 20 74 72 61  a full stack tra
119a0 63 65 20 28 69 66 20 61 70 70 6c 69 63 61 62 6c  ce (if applicabl
119b0 65 29 2c 0d 0a 20 20 20 20 20 20 20 20 23 20 20  e),..        #  
119c0 20 20 20 20 20 72 65 74 75 72 6e 20 61 20 6c 69       return a li
119d0 73 74 20 77 69 74 68 20 74 68 65 20 72 65 74 75  st with the retu
119e0 72 6e 20 63 6f 64 65 20 61 6e 64 20 74 68 65 20  rn code and the 
119f0 72 65 73 75 6c 74 20 76 65 72 62 61 74 69 6d 2e  result verbatim.
11a00 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
11a10 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6c 69 73       return [lis
11a20 74 20 24 63 6f 64 65 20 24 72 65 73 75 6c 74 5d  t $code $result]
11a30 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
11a40 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
11a50 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 61 69       # NOTE: Fai
11a60 6c 75 72 65 2e 20 20 4f 75 72 20 63 61 6c 6c 65  lure.  Our calle
11a70 72 20 64 6f 65 73 20 6e 6f 74 20 77 61 6e 74 20  r does not want 
11a80 61 20 66 75 6c 6c 20 73 74 61 63 6b 20 74 72 61  a full stack tra
11a90 63 65 20 28 69 66 0d 0a 20 20 20 20 20 20 20 20  ce (if..        
11aa0 23 20 20 20 20 20 20 20 61 70 70 6c 69 63 61 62  #       applicab
11ab0 6c 65 29 2c 20 72 65 74 75 72 6e 20 61 20 6c 69  le), return a li
11ac0 73 74 20 77 69 74 68 20 74 68 65 20 72 65 74 75  st with the retu
11ad0 72 6e 20 63 6f 64 65 2c 20 74 68 65 20 65 72 72  rn code, the err
11ae0 6f 72 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  or..        #   
11af0 20 20 20 20 63 6f 64 65 20 66 6f 72 20 74 68 65      code for the
11b00 20 69 6e 74 65 72 70 72 65 74 65 72 2c 20 61 6e   interpreter, an
11b10 64 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73  d the error mess
11b20 61 67 65 20 75 70 20 74 6f 20 74 68 65 0d 0a 20  age up to the.. 
11b30 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 70         #       p
11b40 6f 69 6e 74 20 77 68 65 72 65 20 74 68 65 20 73  oint where the s
11b50 74 61 63 6b 20 74 72 61 63 65 20 73 68 6f 75 6c  tack trace shoul
11b60 64 20 73 74 61 72 74 2e 0d 0a 20 20 20 20 20 20  d start...      
11b70 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
11b80 75 72 6e 20 5b 6c 69 73 74 20 24 63 6f 64 65 20  urn [list $code 
11b90 24 3a 3a 65 72 72 6f 72 43 6f 64 65 20 5c 0d 0a  $::errorCode \..
11ba0 20 20 20 20 20 20 20 20 20 20 20 20 5b 65 78 74              [ext
11bb0 72 61 63 74 53 79 73 74 65 6d 44 61 74 61 53 51  ractSystemDataSQ
11bc0 4c 69 74 65 45 78 63 65 70 74 69 6f 6e 4d 65 73  LiteExceptionMes
11bd0 73 61 67 65 20 24 72 65 73 75 6c 74 5d 5d 0d 0a  sage $result]]..
11be0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
11bf0 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 6f 6d 70  ...    proc comp
11c00 69 6c 65 43 53 68 61 72 70 57 69 74 68 20 7b 0d  ileCSharpWith {.
11c10 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65 78  .            tex
11c20 74 20 6d 65 6d 6f 72 79 20 73 79 6d 62 6f 6c 73  t memory symbols
11c30 20 73 74 72 69 63 74 20 72 65 73 75 6c 74 73 56   strict resultsV
11c40 61 72 4e 61 6d 65 20 65 72 72 6f 72 73 56 61 72  arName errorsVar
11c50 4e 61 6d 65 20 66 69 6c 65 4e 61 6d 65 73 0d 0a  Name fileNames..
11c60 20 20 20 20 20 20 20 20 20 20 20 20 61 72 67 73              args
11c70 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20   } {..      #.. 
11c80 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 69 6e       # NOTE: Sin
11c90 63 65 20 77 65 20 61 72 65 20 67 6f 69 6e 67 20  ce we are going 
11ca0 74 6f 20 75 73 65 20 74 68 69 73 20 6d 65 74 68  to use this meth
11cb0 6f 64 20 6e 61 6d 65 20 61 20 6c 6f 74 2c 20 61  od name a lot, a
11cc0 73 73 69 67 6e 20 69 74 20 74 6f 20 61 0d 0a 20  ssign it to a.. 
11cd0 20 20 20 20 20 23 20 20 20 20 20 20 20 76 61 72       #       var
11ce0 69 61 62 6c 65 20 66 69 72 73 74 2e 0d 0a 20 20  iable first...  
11cf0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74      #..      set
11d00 20 61 64 64 20 52 65 66 65 72 65 6e 63 65 64 41   add ReferencedA
11d10 73 73 65 6d 62 6c 69 65 73 2e 41 64 64 0d 0a 0d  ssemblies.Add...
11d20 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
11d30 23 20 4e 4f 54 45 3a 20 43 72 65 61 74 65 20 74  # NOTE: Create t
11d40 68 65 20 62 61 73 65 20 63 6f 6d 6d 61 6e 64 20  he base command 
11d50 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6e 64 20  to evaluate and 
11d60 61 64 64 20 74 68 65 20 70 72 6f 70 65 72 74 79  add the property
11d70 20 73 65 74 74 69 6e 67 73 0d 0a 20 20 20 20 20   settings..     
11d80 20 23 20 20 20 20 20 20 20 74 68 61 74 20 61 72   #       that ar
11d90 65 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20  e almost always 
11da0 6e 65 65 64 65 64 20 62 79 20 6f 75 72 20 75 6e  needed by our un
11db0 69 74 20 74 65 73 74 73 20 28 69 2e 65 2e 20 74  it tests (i.e. t
11dc0 68 65 20 53 79 73 74 65 6d 0d 0a 20 20 20 20 20  he System..     
11dd0 20 23 20 20 20 20 20 20 20 61 6e 64 20 53 79 73   #       and Sys
11de0 74 65 6d 2e 44 61 74 61 20 61 73 73 65 6d 62 6c  tem.Data assembl
11df0 79 20 72 65 66 65 72 65 6e 63 65 73 29 2e 0d 0a  y references)...
11e00 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73        #..      s
11e10 65 74 20 63 6f 6d 6d 61 6e 64 20 5b 6c 69 73 74  et command [list
11e20 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 63 6f   \..          co
11e30 6d 70 69 6c 65 43 53 68 61 72 70 20 24 74 65 78  mpileCSharp $tex
11e40 74 20 24 6d 65 6d 6f 72 79 20 24 73 79 6d 62 6f  t $memory $symbo
11e50 6c 73 20 24 73 74 72 69 63 74 20 72 65 73 75 6c  ls $strict resul
11e60 74 73 20 65 72 72 6f 72 73 20 5c 0d 0a 20 20 20  ts errors \..   
11e70 20 20 20 20 20 20 20 24 61 64 64 20 53 79 73 74         $add Syst
11e80 65 6d 2e 64 6c 6c 20 24 61 64 64 20 53 79 73 74  em.dll $add Syst
11e90 65 6d 2e 44 61 74 61 2e 64 6c 6c 20 24 61 64 64  em.Data.dll $add
11ea0 20 53 79 73 74 65 6d 2e 54 72 61 6e 73 61 63 74   System.Transact
11eb0 69 6f 6e 73 2e 64 6c 6c 20 5c 0d 0a 20 20 20 20  ions.dll \..    
11ec0 20 20 20 20 20 20 24 61 64 64 20 53 79 73 74 65        $add Syste
11ed0 6d 2e 58 6d 6c 2e 64 6c 6c 5d 0d 0a 0d 0a 20 20  m.Xml.dll]....  
11ee0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
11ef0 4f 54 45 3a 20 41 64 64 20 61 6c 6c 20 74 68 65  OTE: Add all the
11f00 20 70 72 6f 76 69 64 65 64 20 66 69 6c 65 20 6e   provided file n
11f10 61 6d 65 73 20 61 73 20 61 73 73 65 6d 62 6c 79  ames as assembly
11f20 20 72 65 66 65 72 65 6e 63 65 73 2e 0d 0a 20 20   references...  
11f30 20 20 20 20 23 0d 0a 20 20 20 20 20 20 66 6f 72      #..      for
11f40 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 66  each fileName $f
11f50 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20  ileNames {..    
11f60 20 20 20 20 6c 61 70 70 65 6e 64 20 63 6f 6d 6d      lappend comm
11f70 61 6e 64 20 24 61 64 64 20 5b 67 65 74 42 69 6e  and $add [getBin
11f80 61 72 79 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c  aryFileName $fil
11f90 65 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20 7d 0d  eName]..      }.
11fa0 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
11fb0 20 20 23 20 4e 4f 54 45 3a 20 41 64 64 20 74 68    # NOTE: Add th
11fc0 65 20 65 78 74 72 61 20 61 72 67 75 6d 65 6e 74  e extra argument
11fd0 73 2c 20 69 66 20 61 6e 79 2c 20 74 6f 20 74 68  s, if any, to th
11fe0 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61  e command to eva
11ff0 6c 75 61 74 65 2e 0d 0a 20 20 20 20 20 20 23 0d  luate...      #.
12000 0a 20 20 20 20 20 20 65 76 61 6c 20 6c 61 70 70  .      eval lapp
12010 65 6e 64 20 63 6f 6d 6d 61 6e 64 20 24 61 72 67  end command $arg
12020 73 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  s....      #..  
12030 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 6c 69 61      # NOTE: Alia
12040 73 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 6c  s the compiler l
12050 6f 63 61 6c 20 72 65 73 75 6c 74 73 20 61 6e 64  ocal results and
12060 20 65 72 72 6f 72 73 20 76 61 72 69 61 62 6c 65   errors variable
12070 73 20 74 6f 20 74 68 65 0d 0a 20 20 20 20 20 20  s to the..      
12080 23 20 20 20 20 20 20 20 76 61 72 69 61 62 6c 65  #       variable
12090 20 6e 61 6d 65 73 20 70 72 6f 76 69 64 65 64 20   names provided 
120a0 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 2e 0d 0a  by our caller...
120b0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
120c0 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  f {[string lengt
120d0 68 20 24 72 65 73 75 6c 74 73 56 61 72 4e 61 6d  h $resultsVarNam
120e0 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  e] > 0} then {..
120f0 20 20 20 20 20 20 20 20 75 70 76 61 72 20 31 20          upvar 1 
12100 24 72 65 73 75 6c 74 73 56 61 72 4e 61 6d 65 20  $resultsVarName 
12110 72 65 73 75 6c 74 73 0d 0a 20 20 20 20 20 20 7d  results..      }
12120 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73  ....      if {[s
12130 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 65 72  tring length $er
12140 72 6f 72 73 56 61 72 4e 61 6d 65 5d 20 3e 20 30  rorsVarName] > 0
12150 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
12160 20 20 75 70 76 61 72 20 31 20 24 65 72 72 6f 72    upvar 1 $error
12170 73 56 61 72 4e 61 6d 65 20 65 72 72 6f 72 73 0d  sVarName errors.
12180 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
12190 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
121a0 45 3a 20 45 76 61 6c 75 61 74 65 20 74 68 65 20  E: Evaluate the 
121b0 63 6f 6e 73 74 72 75 63 74 65 64 20 5b 63 6f 6d  constructed [com
121c0 70 69 6c 65 43 53 68 61 72 70 5d 20 63 6f 6d 6d  pileCSharp] comm
121d0 61 6e 64 20 61 6e 64 20 72 65 74 75 72 6e 20 74  and and return t
121e0 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  he..      #     
121f0 20 20 72 65 73 75 6c 74 2e 0d 0a 20 20 20 20 20    result...     
12200 20 23 0d 0a 20 20 20 20 20 20 65 76 61 6c 20 24   #..      eval $
12210 63 6f 6d 6d 61 6e 64 0d 0a 20 20 20 20 7d 0d 0a  command..    }..
12220 0c 0d 0a 20 20 20 20 70 72 6f 63 20 69 73 4d 65  ...    proc isMe
12230 6d 6f 72 79 44 62 20 7b 20 66 69 6c 65 4e 61 6d  moryDb { fileNam
12240 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a  e } {..      #..
12250 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 73        # NOTE: Is
12260 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 64   the specified d
12270 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d  atabase file nam
12280 65 20 72 65 61 6c 6c 79 20 61 6e 20 69 6e 2d 6d  e really an in-m
12290 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 3f 0d  emory database?.
122a0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
122b0 72 65 74 75 72 6e 20 5b 65 78 70 72 20 7b 24 66  return [expr {$f
122c0 69 6c 65 4e 61 6d 65 20 65 71 20 22 3a 6d 65 6d  ileName eq ":mem
122d0 6f 72 79 3a 22 20 7c 7c 20 5c 0d 0a 20 20 20 20  ory:" || \..    
122e0 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 72 61        [string ra
122f0 6e 67 65 20 24 66 69 6c 65 4e 61 6d 65 20 30 20  nge $fileName 0 
12300 31 32 5d 20 65 71 20 22 66 69 6c 65 3a 3a 6d 65  12] eq "file::me
12310 6d 6f 72 79 3a 22 7d 5d 0d 0a 20 20 20 20 7d 0d  mory:"}]..    }.
12320 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 69 73 54  ....    proc isT
12330 61 62 6c 65 49 6e 44 62 20 7b 20 6e 61 6d 65 20  ableInDb { name 
12340 7b 76 61 72 4e 61 6d 65 20 64 62 7d 20 7d 20 7b  {varName db} } {
12350 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
12360 20 23 20 4e 4f 54 45 3a 20 52 65 66 65 72 20 74   # NOTE: Refer t
12370 6f 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  o the specified 
12380 76 61 72 69 61 62 6c 65 20 28 65 2e 67 2e 20 22  variable (e.g. "
12390 64 62 22 29 20 69 6e 20 74 68 65 20 63 6f 6e 74  db") in the cont
123a0 65 78 74 20 6f 66 20 6f 75 72 0d 0a 20 20 20 20  ext of our..    
123b0 20 20 23 20 20 20 20 20 20 20 63 61 6c 6c 65 72    #       caller
123c0 2e 20 20 49 74 20 63 6f 6e 74 61 69 6e 73 20 74  .  It contains t
123d0 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
123e0 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20 74 68  ection handle th
123f0 61 74 20 77 69 6c 6c 20 62 65 0d 0a 20 20 20 20  at will be..    
12400 20 20 23 20 20 20 20 20 20 20 75 73 65 64 20 74    #       used t
12410 6f 20 65 78 65 63 75 74 65 20 74 68 65 20 71 75  o execute the qu
12420 65 72 79 20 75 73 65 64 20 74 6f 20 64 65 74 65  ery used to dete
12430 72 6d 69 6e 65 20 69 66 20 74 68 65 20 6e 61 6d  rmine if the nam
12440 65 64 20 74 61 62 6c 65 20 69 73 0d 0a 20 20 20  ed table is..   
12450 20 20 20 23 20 20 20 20 20 20 20 70 72 65 73 65     #       prese
12460 6e 74 20 69 6e 20 74 68 61 74 20 64 61 74 61 62  nt in that datab
12470 61 73 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ase...      #.. 
12480 20 20 20 20 20 75 70 76 61 72 20 31 20 24 76 61       upvar 1 $va
12490 72 4e 61 6d 65 20 64 62 0d 0a 0d 0a 20 20 20 20  rName db....    
124a0 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
124b0 45 3a 20 55 73 65 20 74 68 65 20 73 71 6c 69 74  E: Use the sqlit
124c0 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 74  e_master table t
124d0 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74  o determine if t
124e0 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 20 69  he named table i
124f0 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  s..      #      
12500 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20   present in the 
12510 64 61 74 61 62 61 73 65 2e 0d 0a 20 20 20 20 20  database...     
12520 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 73 71   #..      set sq
12530 6c 20 7b 0d 0a 20 20 20 20 20 20 20 20 53 45 4c  l {..        SEL
12540 45 43 54 20 43 4f 55 4e 54 28 2a 29 20 46 52 4f  ECT COUNT(*) FRO
12550 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  M sqlite_master 
12560 57 48 45 52 45 20 74 79 70 65 20 3d 20 27 74 61  WHERE type = 'ta
12570 62 6c 65 27 20 41 4e 44 20 6e 61 6d 65 20 3d 20  ble' AND name = 
12580 3f 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ?;..      }.... 
12590 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
125a0 4e 4f 54 45 3a 20 52 65 74 75 72 6e 20 6e 6f 6e  NOTE: Return non
125b0 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 6e 61 6d  -zero if the nam
125c0 65 64 20 74 61 62 6c 65 20 69 73 20 70 72 65 73  ed table is pres
125d0 65 6e 74 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ent...      #.. 
125e0 20 20 20 20 20 72 65 74 75 72 6e 20 5b 65 78 70       return [exp
125f0 72 20 7b 0d 0a 20 20 20 20 20 20 20 20 5b 73 71  r {..        [sq
12600 6c 20 65 78 65 63 75 74 65 20 2d 65 78 65 63 75  l execute -execu
12610 74 65 20 73 63 61 6c 61 72 20 24 64 62 20 24 73  te scalar $db $s
12620 71 6c 20 5b 6c 69 73 74 20 70 61 72 61 6d 31 20  ql [list param1 
12630 53 74 72 69 6e 67 20 24 6e 61 6d 65 5d 5d 20 3e  String $name]] >
12640 20 30 0d 0a 20 20 20 20 20 20 7d 5d 0d 0a 20 20   0..      }]..  
12650 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
12660 20 67 65 74 44 62 44 65 66 61 75 6c 74 50 61 67   getDbDefaultPag
12670 65 53 69 7a 65 20 7b 7d 20 7b 0d 0a 20 20 20 20  eSize {} {..    
12680 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 65 78    if {[catch {ex
12690 65 63 75 74 65 53 71 6c 20 22 50 52 41 47 4d 41  ecuteSql "PRAGMA
126a0 20 70 61 67 65 5f 73 69 7a 65 3b 22 20 73 63 61   page_size;" sca
126b0 6c 61 72 7d 20 72 65 73 75 6c 74 5d 20 3d 3d 20  lar} result] == 
126c0 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
126d0 20 20 20 72 65 74 75 72 6e 20 24 72 65 73 75 6c     return $resul
126e0 74 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  t..      } else 
126f0 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  {..        retur
12700 6e 20 30 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  n 0..      }..  
12710 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
12720 20 67 65 74 44 62 44 65 66 61 75 6c 74 43 61 63   getDbDefaultCac
12730 68 65 53 69 7a 65 20 7b 7d 20 7b 0d 0a 20 20 20  heSize {} {..   
12740 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 65     if {[catch {e
12750 78 65 63 75 74 65 53 71 6c 20 22 50 52 41 47 4d  xecuteSql "PRAGM
12760 41 20 63 61 63 68 65 5f 73 69 7a 65 3b 22 20 73  A cache_size;" s
12770 63 61 6c 61 72 7d 20 72 65 73 75 6c 74 5d 20 3d  calar} result] =
12780 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
12790 20 20 20 20 20 72 65 74 75 72 6e 20 24 72 65 73       return $res
127a0 75 6c 74 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  ult..      } els
127b0 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74  e {..        ret
127c0 75 72 6e 20 30 0d 0a 20 20 20 20 20 20 7d 0d 0a  urn 0..      }..
127d0 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
127e0 6f 63 20 75 73 65 4c 65 67 61 63 79 44 62 50 61  oc useLegacyDbPa
127f0 67 65 41 6e 64 43 61 63 68 65 53 69 7a 65 73 20  geAndCacheSizes 
12800 7b 20 76 61 72 4e 61 6d 65 20 7d 20 7b 0d 0a 20  { varName } {.. 
12810 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
12820 4e 4f 54 45 3a 20 52 65 66 65 72 20 74 6f 20 74  NOTE: Refer to t
12830 68 65 20 73 70 65 63 69 66 69 65 64 20 76 61 72  he specified var
12840 69 61 62 6c 65 20 28 65 2e 67 2e 20 22 64 62 22  iable (e.g. "db"
12850 29 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 78 74  ) in the context
12860 20 6f 66 20 6f 75 72 0d 0a 20 20 20 20 20 20 23   of our..      #
12870 20 20 20 20 20 20 20 63 61 6c 6c 65 72 2e 20 20         caller.  
12880 49 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  It contains the 
12890 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
128a0 69 6f 6e 20 68 61 6e 64 6c 65 20 74 68 61 74 20  ion handle that 
128b0 77 69 6c 6c 20 62 65 0d 0a 20 20 20 20 20 20 23  will be..      #
128c0 20 20 20 20 20 20 20 75 73 65 64 20 74 6f 20 65         used to e
128d0 78 65 63 75 74 65 20 71 75 65 72 69 65 73 20 75  xecute queries u
128e0 73 65 64 20 74 6f 20 73 65 74 20 74 68 65 20 70  sed to set the p
128f0 61 67 65 20 61 6e 64 20 63 61 63 68 65 20 73 69  age and cache si
12900 7a 65 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  zes...      #.. 
12910 20 20 20 20 20 75 70 76 61 72 20 31 20 24 76 61       upvar 1 $va
12920 72 4e 61 6d 65 20 64 62 0d 0a 0d 0a 20 20 20 20  rName db....    
12930 20 20 73 71 6c 20 65 78 65 63 75 74 65 20 24 64    sql execute $d
12940 62 20 7b 0d 0a 20 20 20 20 20 20 20 20 50 52 41  b {..        PRA
12950 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20  GMA page_size = 
12960 31 30 32 34 3b 0d 0a 20 20 20 20 20 20 20 20 50  1024;..        P
12970 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65  RAGMA cache_size
12980 20 3d 20 32 30 30 30 3b 0d 0a 20 20 20 20 20 20   = 2000;..      
12990 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72  }....      retur
129a0 6e 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20  n [list \..     
129b0 20 20 20 20 20 5b 73 71 6c 20 65 78 65 63 75 74       [sql execut
129c0 65 20 2d 65 78 65 63 75 74 65 20 73 63 61 6c 61  e -execute scala
129d0 72 20 24 64 62 20 22 50 52 41 47 4d 41 20 70 61  r $db "PRAGMA pa
129e0 67 65 5f 73 69 7a 65 3b 22 5d 20 5c 0d 0a 20 20  ge_size;"] \..  
129f0 20 20 20 20 20 20 20 20 5b 73 71 6c 20 65 78 65          [sql exe
12a00 63 75 74 65 20 2d 65 78 65 63 75 74 65 20 73 63  cute -execute sc
12a10 61 6c 61 72 20 24 64 62 20 22 50 52 41 47 4d 41  alar $db "PRAGMA
12a20 20 63 61 63 68 65 5f 73 69 7a 65 3b 22 5d 5d 0d   cache_size;"]].
12a30 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
12a40 72 6f 63 20 65 78 74 72 61 63 74 53 79 73 74 65  roc extractSyste
12a50 6d 44 61 74 61 53 51 4c 69 74 65 45 78 63 65 70  mDataSQLiteExcep
12a60 74 69 6f 6e 4d 65 73 73 61 67 65 20 7b 20 76 61  tionMessage { va
12a70 6c 75 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23  lue } {..      #
12a80 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
12a90 49 66 20 74 68 65 20 73 74 72 69 6e 67 20 63 6f  If the string co
12aa0 6e 66 6f 72 6d 73 20 74 6f 20 66 6f 72 6d 61 74  nforms to format
12ab0 20 6f 66 20 74 68 65 20 6e 6f 72 6d 61 6c 20 65   of the normal e
12ac0 78 63 65 70 74 69 6f 6e 0d 0a 20 20 20 20 20 20  xception..      
12ad0 23 20 20 20 20 20 20 20 65 72 72 6f 72 20 73 74  #       error st
12ae0 72 69 6e 67 73 2c 20 65 78 74 72 61 63 74 20 61  rings, extract a
12af0 6e 64 20 72 65 74 75 72 6e 20 6f 6e 6c 79 20 74  nd return only t
12b00 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  he error message
12b10 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
12b20 70 6f 72 74 69 6f 6e 20 69 74 73 65 6c 66 2e 0d  portion itself..
12b30 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
12b40 73 65 74 20 70 61 74 74 65 72 6e 73 20 5b 6c 69  set patterns [li
12b50 73 74 20 5c 0d 0a 20 20 20 20 20 20 7b 53 79 73  st \..      {Sys
12b60 74 65 6d 5c 2e 44 61 74 61 5c 2e 53 51 4c 69 74  tem\.Data\.SQLit
12b70 65 5c 2e 53 51 4c 69 74 65 45 78 63 65 70 74 69  e\.SQLiteExcepti
12b80 6f 6e 20 5c 28 30 78 38 30 30 30 34 30 30 35 5c  on \(0x80004005\
12b90 29 3a 20 28 2e 2b 3f 29 20 20 28 3f 3a 20 29 3f  ): (.+?)  (?: )?
12ba0 61 74 7d 20 5c 0d 0a 20 20 20 20 20 20 7b 53 79  at} \..      {Sy
12bb0 73 74 65 6d 5c 2e 44 61 74 61 5c 2e 53 51 4c 69  stem\.Data\.SQLi
12bc0 74 65 5c 2e 53 51 4c 69 74 65 45 78 63 65 70 74  te\.SQLiteExcept
12bd0 69 6f 6e 3a 20 28 2e 2b 3f 29 20 20 28 3f 3a 20  ion: (.+?)  (?: 
12be0 29 3f 61 74 7d 20 5c 0d 0a 20 20 20 20 20 20 7b  )?at} \..      {
12bf0 45 61 67 6c 65 5c 2e 5f 43 6f 6d 70 6f 6e 65 6e  Eagle\._Componen
12c00 74 73 5c 2e 50 75 62 6c 69 63 5c 2e 53 63 72 69  ts\.Public\.Scri
12c10 70 74 45 78 63 65 70 74 69 6f 6e 3a 20 28 2e 2b  ptException: (.+
12c20 3f 29 20 20 28 3f 3a 20 29 3f 61 74 7d 5d 0d 0a  ?)  (?: )?at}]..
12c30 0d 0a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20  ..      foreach 
12c40 70 61 74 74 65 72 6e 20 24 70 61 74 74 65 72 6e  pattern $pattern
12c50 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20  s {..        if 
12c60 7b 5b 72 65 67 65 78 70 20 2d 2d 20 24 70 61 74  {[regexp -- $pat
12c70 74 65 72 6e 20 24 76 61 6c 75 65 20 64 75 6d 6d  tern $value dumm
12c80 79 20 6d 65 73 73 61 67 65 5d 7d 20 74 68 65 6e  y message]} then
12c90 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   {..          se
12ca0 74 20 6d 65 73 73 61 67 65 20 5b 73 74 72 69 6e  t message [strin
12cb0 67 20 6d 61 70 20 5b 6c 69 73 74 20 5c 72 5c 6e  g map [list \r\n
12cc0 20 5c 6e 5d 20 5b 73 74 72 69 6e 67 20 74 72 69   \n] [string tri
12cd0 6d 20 24 6d 65 73 73 61 67 65 5d 5d 0d 0a 20 20  m $message]]..  
12ce0 20 20 20 20 20 20 20 20 73 65 74 20 6c 69 6e 65          set line
12cf0 73 20 5b 73 70 6c 69 74 20 24 6d 65 73 73 61 67  s [split $messag
12d00 65 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  e \n]....       
12d10 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20     if {[llength 
12d20 24 6c 69 6e 65 73 5d 20 3d 3d 20 32 7d 20 74 68  $lines] == 2} th
12d30 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
12d40 20 20 69 66 20 7b 5b 6c 69 6e 64 65 78 20 24 6c    if {[lindex $l
12d50 69 6e 65 73 20 30 5d 20 65 71 20 5b 6c 69 6e 64  ines 0] eq [lind
12d60 65 78 20 24 6c 69 6e 65 73 20 31 5d 7d 20 74 68  ex $lines 1]} th
12d70 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
12d80 20 20 20 20 72 65 74 75 72 6e 20 5b 6c 69 6e 64      return [lind
12d90 65 78 20 24 6c 69 6e 65 73 20 30 5d 0d 0a 20 20  ex $lines 0]..  
12da0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
12db0 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
12dc0 6e 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5b 6c  n [appendArgs [l
12dd0 69 6e 64 65 78 20 24 6c 69 6e 65 73 20 30 5d 20  index $lines 0] 
12de0 22 20 2d 2d 20 22 20 5b 6c 69 6e 64 65 78 20 24  " -- " [lindex $
12df0 6c 69 6e 65 73 20 31 5d 5d 0d 0a 20 20 20 20 20  lines 1]]..     
12e00 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
12e10 20 20 20 20 72 65 74 75 72 6e 20 24 6d 65 73 73      return $mess
12e20 61 67 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  age..        }..
12e30 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
12e40 20 72 65 74 75 72 6e 20 24 76 61 6c 75 65 0d 0a   return $value..
12e50 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
12e60 6f 63 20 74 72 69 6d 53 71 6c 20 7b 20 73 71 6c  oc trimSql { sql
12e70 20 7d 20 7b 0d 0a 20 20 20 20 20 20 72 65 74 75   } {..      retu
12e80 72 6e 20 5b 72 65 67 73 75 62 20 2d 61 6c 6c 20  rn [regsub -all 
12e90 2d 2d 20 7b 5c 73 2b 7d 20 5b 73 74 72 69 6e 67  -- {\s+} [string
12ea0 20 74 72 69 6d 20 24 73 71 6c 5d 20 22 20 22 5d   trim $sql] " "]
12eb0 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
12ec0 70 72 6f 63 20 65 78 65 63 75 74 65 53 71 6c 20  proc executeSql 
12ed0 7b 20 73 71 6c 20 7b 65 78 65 63 75 74 65 20 6e  { sql {execute n
12ee0 6f 6e 65 7d 20 7b 66 6f 72 6d 61 74 20 6e 6f 6e  one} {format non
12ef0 65 7d 20 7b 66 69 6c 65 4e 61 6d 65 20 22 22 7d  e} {fileName ""}
12f00 20 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b   } {..      if {
12f10 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
12f20 66 69 6c 65 4e 61 6d 65 5d 20 3d 3d 20 30 7d 20  fileName] == 0} 
12f30 74 68 65 6e 20 7b 73 65 74 20 66 69 6c 65 4e 61  then {set fileNa
12f40 6d 65 20 3a 6d 65 6d 6f 72 79 3a 7d 0d 0a 20 20  me :memory:}..  
12f50 20 20 20 20 73 65 74 75 70 44 62 20 24 66 69 6c      setupDb $fil
12f60 65 4e 61 6d 65 20 22 22 20 22 22 20 22 22 20 22  eName "" "" "" "
12f70 22 20 22 22 20 66 61 6c 73 65 20 66 61 6c 73 65  " "" false false
12f80 20 66 61 6c 73 65 20 66 61 6c 73 65 20 64 62 20   false false db 
12f90 74 72 75 65 0d 0a 0d 0a 20 20 20 20 20 20 74 72  true....      tr
12fa0 79 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74  y {..        ret
12fb0 75 72 6e 20 5b 75 70 6c 65 76 65 6c 20 31 20 5b  urn [uplevel 1 [
12fc0 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20  list \..        
12fd0 20 20 20 20 73 71 6c 20 65 78 65 63 75 74 65 20      sql execute 
12fe0 2d 65 78 65 63 75 74 65 20 24 65 78 65 63 75 74  -execute $execut
12ff0 65 20 2d 66 6f 72 6d 61 74 20 24 66 6f 72 6d 61  e -format $forma
13000 74 20 24 64 62 20 24 73 71 6c 5d 5d 0d 0a 20 20  t $db $sql]]..  
13010 20 20 20 20 7d 20 66 69 6e 61 6c 6c 79 20 7b 0d      } finally {.
13020 0a 20 20 20 20 20 20 20 20 73 65 74 20 63 6f 6e  .        set con
13030 6e 65 63 74 69 6f 6e 20 5b 67 65 74 44 62 43 6f  nection [getDbCo
13040 6e 6e 65 63 74 69 6f 6e 5d 0d 0a 0d 0a 20 20 20  nnection]....   
13050 20 20 20 20 20 74 72 79 20 7b 0d 0a 20 20 20 20       try {..    
13060 20 20 20 20 20 20 63 6c 65 61 6e 75 70 44 62 20        cleanupDb 
13070 24 66 69 6c 65 4e 61 6d 65 20 64 62 20 66 61 6c  $fileName db fal
13080 73 65 20 66 61 6c 73 65 20 66 61 6c 73 65 0d 0a  se false false..
13090 20 20 20 20 20 20 20 20 7d 20 66 69 6e 61 6c 6c          } finall
130a0 79 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6f  y {..          o
130b0 62 6a 65 63 74 20 66 6c 61 67 73 20 24 63 6f 6e  bject flags $con
130c0 6e 65 63 74 69 6f 6e 20 2d 4e 6f 44 69 73 70 6f  nection -NoDispo
130d0 73 65 3b 20 66 72 65 65 44 62 43 6f 6e 6e 65 63  se; freeDbConnec
130e0 74 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20 7d 0d  tion..        }.
130f0 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
13100 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 68 61 73  ....    proc has
13110 4e 6f 46 6c 61 67 73 20 7b 20 76 61 72 4e 61 6d  NoFlags { varNam
13120 65 20 6e 6f 6e 65 20 7d 20 7b 0d 0a 20 20 20 20  e none } {..    
13130 20 20 75 70 76 61 72 20 31 20 24 76 61 72 4e 61    upvar 1 $varNa
13140 6d 65 20 66 6c 61 67 73 0d 0a 0d 0a 20 20 20 20  me flags....    
13150 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
13160 73 74 73 20 66 6c 61 67 73 5d 7d 20 74 68 65 6e  sts flags]} then
13170 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   {..        retu
13180 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20 7d  rn true..      }
13190 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73  ....      if {[s
131a0 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 66 6c  tring length $fl
131b0 61 67 73 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ags] == 0} then 
131c0 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  {..        retur
131d0 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20 7d 0d  n true..      }.
131e0 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 6e 6f  ...      if {$no
131f0 6e 65 20 26 26 20 24 66 6c 61 67 73 20 65 71 20  ne && $flags eq 
13200 22 4e 6f 6e 65 22 7d 20 74 68 65 6e 20 7b 0d 0a  "None"} then {..
13210 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74          return t
13220 72 75 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  rue..      }....
13230 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c        return fal
13240 73 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  se..    }.....  
13250 20 20 70 72 6f 63 20 67 65 74 43 6f 6e 6e 65 63    proc getConnec
13260 74 69 6f 6e 46 6c 61 67 73 20 7b 20 66 69 6c 65  tionFlags { file
13270 4e 61 6d 65 20 66 6c 61 67 73 20 7b 71 75 69 65  Name flags {quie
13280 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20  t false} } {..  
13290 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
132a0 4f 54 45 3a 20 46 69 67 75 72 65 20 6f 75 74 20  OTE: Figure out 
132b0 77 68 69 63 68 20 64 61 74 61 62 61 73 65 20 66  which database f
132c0 69 6c 65 20 6e 61 6d 65 20 6f 72 20 63 6f 6e 6e  ile name or conn
132d0 65 63 74 69 6f 6e 20 73 74 72 69 6e 67 20 74 68  ection string th
132e0 65 73 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ese..      #    
132f0 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c     connection fl
13300 61 67 73 20 77 69 6c 6c 20 61 63 74 75 61 6c 6c  ags will actuall
13310 79 20 61 70 70 6c 79 20 74 6f 2e 20 20 54 68 69  y apply to.  Thi
13320 73 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  s is not necessa
13330 72 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ry..      #     
13340 20 20 69 6e 20 71 75 69 65 74 20 6d 6f 64 65 20    in quiet mode 
13350 62 65 63 61 75 73 65 20 74 68 69 73 20 69 6e 66  because this inf
13360 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6f 6e 6c 79  ormation is only
13370 20 75 73 65 64 20 66 6f 72 20 6c 6f 67 67 69 6e   used for loggin
13380 67 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  g..      #      
13390 20 61 6e 64 20 72 65 70 6f 72 74 69 6e 67 20 70   and reporting p
133a0 75 72 70 6f 73 65 73 2e 0d 0a 20 20 20 20 20 20  urposes...      
133b0 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 24 71  #..      if {!$q
133c0 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
133d0 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
133e0 67 20 6c 65 6e 67 74 68 20 24 66 69 6c 65 4e 61  g length $fileNa
133f0 6d 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  me] > 0} then {.
13400 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20 64  .          set d
13410 61 74 61 62 61 73 65 20 5b 61 70 70 65 6e 64 41  atabase [appendA
13420 72 67 73 20 22 66 69 6c 65 20 6e 61 6d 65 20 5c  rgs "file name \
13430 22 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c 22 5d  "" $fileName \"]
13440 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65  ..        } else
13450 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
13460 20 3a 3a 64 61 74 61 53 6f 75 72 63 65 5d 20 26   ::dataSource] &
13470 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  & \..           
13480 20 21 5b 61 72 72 61 79 20 65 78 69 73 74 73 20   ![array exists 
13490 3a 3a 64 61 74 61 53 6f 75 72 63 65 5d 7d 20 74  ::dataSource]} t
134a0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
134b0 20 73 65 74 20 64 61 74 61 62 61 73 65 20 5b 61   set database [a
134c0 70 70 65 6e 64 41 72 67 73 20 22 64 61 74 61 20  ppendArgs "data 
134d0 73 6f 75 72 63 65 20 5c 22 22 20 24 3a 3a 64 61  source \"" $::da
134e0 74 61 53 6f 75 72 63 65 20 5c 22 5d 0d 0a 20 20  taSource \"]..  
134f0 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
13500 20 20 20 20 20 20 20 20 20 20 73 65 74 20 64 61            set da
13510 74 61 62 61 73 65 20 3c 75 6e 6b 6e 6f 77 6e 3e  tabase <unknown>
13520 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
13530 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
13540 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 45  .      # NOTE: E
13550 76 65 6e 20 74 68 6f 75 67 68 20 74 68 65 72 65  ven though there
13560 20 69 73 20 6f 6e 6c 79 20 6f 6e 65 20 73 6f 75   is only one sou
13570 72 63 65 20 6f 66 20 66 6c 61 67 73 20 73 6f 20  rce of flags so 
13580 66 61 72 2c 20 74 68 65 79 0d 0a 20 20 20 20 20  far, they..     
13590 20 23 20 20 20 20 20 20 20 6d 75 73 74 20 62 65   #       must be
135a0 20 63 6f 6d 62 69 6e 65 64 20 75 73 69 6e 67 20   combined using 
135b0 74 68 65 20 63 6f 72 72 65 63 74 20 73 79 6e 74  the correct synt
135c0 61 78 20 66 6f 72 20 65 6e 75 6d 65 72 61 74 65  ax for enumerate
135d0 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  d..      #      
135e0 20 66 6c 61 67 20 76 61 6c 75 65 73 20 66 6f 72   flag values for
135f0 20 74 68 65 20 2e 4e 45 54 20 46 72 61 6d 65 77   the .NET Framew
13600 6f 72 6b 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ork...      #.. 
13610 20 20 20 20 20 73 65 74 20 66 6c 61 67 73 20 5b       set flags [
13620 63 6f 6d 62 69 6e 65 46 6c 61 67 73 20 24 66 6c  combineFlags $fl
13630 61 67 73 20 22 22 5d 0d 0a 0d 0a 20 20 20 20 20  ags ""]....     
13640 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
13650 3a 20 53 68 6f 77 20 28 61 6e 64 20 6c 6f 67 29  : Show (and log)
13660 20 74 68 65 20 6c 6f 63 61 6c 20 63 6f 6e 6e 65   the local conne
13670 63 74 69 6f 6e 20 66 6c 61 67 73 20 61 6e 64 20  ction flags and 
13680 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 0d 0a  the associated..
13690 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64 61        #       da
136a0 74 61 20 73 6f 75 72 63 65 20 6f 72 20 66 69 6c  ta source or fil
136b0 65 20 6e 61 6d 65 2e 0d 0a 20 20 20 20 20 20 23  e name...      #
136c0 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 24 71 75  ..      if {!$qu
136d0 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
136e0 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
136f0 65 78 69 73 74 73 20 3a 3a 6e 6f 28 65 6d 69 74  exists ::no(emit
13700 4c 6f 63 61 6c 46 6c 61 67 73 29 5d 20 26 26 20  LocalFlags)] && 
13710 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 28  \..            (
13720 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
13730 6e 6f 28 65 6d 69 74 4c 6f 63 61 6c 46 6c 61 67  no(emitLocalFlag
13740 73 49 66 4e 6f 6e 65 29 5d 20 7c 7c 20 5c 0d 0a  sIfNone)] || \..
13750 20 20 20 20 20 20 20 20 20 20 20 20 20 21 5b 68               ![h
13760 61 73 4e 6f 46 6c 61 67 73 20 66 6c 61 67 73 20  asNoFlags flags 
13770 66 61 6c 73 65 5d 29 7d 20 74 68 65 6e 20 7b 0d  false])} then {.
13780 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
13790 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
137a0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
137b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
137c0 2d 2d 2d 20 6c 6f 63 61 6c 20 63 6f 6e 6e 65 63  --- local connec
137d0 74 69 6f 6e 20 66 6c 61 67 73 20 66 6f 72 20 22  tion flags for "
137e0 20 24 64 61 74 61 62 61 73 65 20 5c 0d 0a 20 20   $database \..  
137f0 20 20 20 20 20 20 20 20 20 20 20 20 22 20 61 72              " ar
13800 65 3a 20 22 20 5b 65 78 70 72 20 7b 21 5b 68 61  e: " [expr {![ha
13810 73 4e 6f 46 6c 61 67 73 20 66 6c 61 67 73 20 66  sNoFlags flags f
13820 61 6c 73 65 5d 20 3f 20 5c 0d 0a 20 20 20 20 20  alse] ? \..     
13830 20 20 20 20 20 20 20 20 20 5b 61 70 70 65 6e 64           [append
13840 41 72 67 73 20 5c 22 20 24 66 6c 61 67 73 20 5c  Args \" $flags \
13850 22 5d 20 3a 20 22 3c 6e 6f 6e 65 3e 22 7d 5d 20  "] : "<none>"}] 
13860 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  \n]..        }..
13870 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
13880 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
13890 3a 20 53 68 6f 77 20 28 61 6e 64 20 6c 6f 67 29  : Show (and log)
138a0 20 74 68 65 20 73 68 61 72 65 64 20 63 6f 6e 6e   the shared conn
138b0 65 63 74 69 6f 6e 20 66 6c 61 67 73 2e 0d 0a 20  ection flags... 
138c0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
138d0 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
138e0 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  {..        if {[
138f0 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
13900 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65     object invoke
13910 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
13920 69 74 65 2e 53 51 4c 69 74 65 43 6f 6e 6e 65 63  ite.SQLiteConnec
13930 74 69 6f 6e 20 53 68 61 72 65 64 46 6c 61 67 73  tion SharedFlags
13940 0d 0a 20 20 20 20 20 20 20 20 7d 20 73 68 61 72  ..        } shar
13950 65 64 46 6c 61 67 73 5d 20 3d 3d 20 30 7d 20 74  edFlags] == 0} t
13960 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
13970 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
13980 74 73 20 3a 3a 6e 6f 28 65 6d 69 74 53 68 61 72  ts ::no(emitShar
13990 65 64 46 6c 61 67 73 29 5d 20 26 26 20 5c 0d 0a  edFlags)] && \..
139a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 21                (!
139b0 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
139c0 6f 28 65 6d 69 74 53 68 61 72 65 64 46 6c 61 67  o(emitSharedFlag
139d0 73 49 66 4e 6f 6e 65 29 5d 20 7c 7c 20 5c 0d 0a  sIfNone)] || \..
139e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 21                 !
139f0 5b 68 61 73 4e 6f 46 6c 61 67 73 20 73 68 61 72  [hasNoFlags shar
13a00 65 64 46 6c 61 67 73 20 74 72 75 65 5d 29 7d 20  edFlags true])} 
13a10 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
13a20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
13a30 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
13a40 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
13a50 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73           "---- s
13a60 68 61 72 65 64 20 63 6f 6e 6e 65 63 74 69 6f 6e  hared connection
13a70 20 66 6c 61 67 73 20 66 6f 72 20 22 20 24 64 61   flags for " $da
13a80 74 61 62 61 73 65 20 5c 0d 0a 20 20 20 20 20 20  tabase \..      
13a90 20 20 20 20 20 20 20 20 20 20 22 20 61 72 65 3a            " are:
13aa0 20 22 20 5b 65 78 70 72 20 7b 21 5b 68 61 73 4e   " [expr {![hasN
13ab0 6f 46 6c 61 67 73 20 73 68 61 72 65 64 46 6c 61  oFlags sharedFla
13ac0 67 73 20 74 72 75 65 5d 20 3f 20 5c 0d 0a 20 20  gs true] ? \..  
13ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 61                [a
13ae0 70 70 65 6e 64 41 72 67 73 20 5c 22 20 24 73 68  ppendArgs \" $sh
13af0 61 72 65 64 46 6c 61 67 73 20 5c 22 5d 20 3a 20  aredFlags \"] : 
13b00 22 3c 6e 6f 6e 65 3e 22 7d 5d 20 5c 6e 5d 0d 0a  "<none>"}] \n]..
13b10 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
13b20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
13b30 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69           if {![i
13b40 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
13b50 65 6d 69 74 53 68 61 72 65 64 46 6c 61 67 73 29  emitSharedFlags)
13b60 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
13b70 20 20 20 20 20 20 21 5b 69 6e 66 6f 20 65 78 69        ![info exi
13b80 73 74 73 20 3a 3a 6e 6f 28 65 6d 69 74 53 68 61  sts ::no(emitSha
13b90 72 65 64 46 6c 61 67 73 49 66 55 6e 61 76 61 69  redFlagsIfUnavai
13ba0 6c 61 62 6c 65 29 5d 7d 20 74 68 65 6e 20 7b 0d  lable)]} then {.
13bb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
13bc0 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
13bd0 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
13be0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
13bf0 20 20 22 2d 2d 2d 2d 20 73 68 61 72 65 64 20 63    "---- shared c
13c00 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 20  onnection flags 
13c10 66 6f 72 20 22 20 24 64 61 74 61 62 61 73 65 20  for " $database 
13c20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
13c30 20 20 20 22 20 61 72 65 3a 20 3c 75 6e 61 76 61     " are: <unava
13c40 69 6c 61 62 6c 65 3e 5c 6e 22 5d 0d 0a 20 20 20  ilable>\n"]..   
13c50 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
13c60 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a    }..      }....
13c70 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
13c80 20 4e 4f 54 45 3a 20 53 68 6f 77 20 28 61 6e 64   NOTE: Show (and
13c90 20 6c 6f 67 29 20 74 68 65 20 64 65 74 65 63 74   log) the detect
13ca0 65 64 20 67 6c 6f 62 61 6c 20 63 6f 6e 6e 65 63  ed global connec
13cb0 74 69 6f 6e 20 66 6c 61 67 73 2c 20 69 66 20 61  tion flags, if a
13cc0 6e 79 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ny...      #..  
13cd0 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
13ce0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
13cf0 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
13d00 74 73 20 3a 3a 6e 6f 28 65 6d 69 74 47 6c 6f 62  ts ::no(emitGlob
13d10 61 6c 46 6c 61 67 73 29 5d 20 26 26 20 5c 0d 0a  alFlags)] && \..
13d20 20 20 20 20 20 20 20 20 20 20 20 20 28 21 5b 69              (![i
13d30 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
13d40 65 6d 69 74 47 6c 6f 62 61 6c 46 6c 61 67 73 49  emitGlobalFlagsI
13d50 66 4e 6f 6e 65 29 5d 20 7c 7c 20 5c 0d 0a 20 20  fNone)] || \..  
13d60 20 20 20 20 20 20 20 20 20 20 20 21 5b 68 61 73             ![has
13d70 4e 6f 46 6c 61 67 73 20 3a 3a 63 6f 6e 6e 65 63  NoFlags ::connec
13d80 74 69 6f 6e 5f 66 6c 61 67 73 20 66 61 6c 73 65  tion_flags false
13d90 5d 29 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  ])} then {..    
13da0 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
13db0 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
13dc0 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
13dd0 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 67           "---- g
13de0 6c 6f 62 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e  lobal connection
13df0 20 66 6c 61 67 73 20 61 72 65 3a 20 22 20 5c 0d   flags are: " \.
13e00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b  .              [
13e10 65 78 70 72 20 7b 21 5b 68 61 73 4e 6f 46 6c 61  expr {![hasNoFla
13e20 67 73 20 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e 5f  gs ::connection_
13e30 66 6c 61 67 73 20 66 61 6c 73 65 5d 20 3f 20 5c  flags false] ? \
13e40 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
13e50 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 22 20 24  [appendArgs \" $
13e60 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e 5f 66 6c 61  ::connection_fla
13e70 67 73 20 5c 22 5d 20 3a 20 22 3c 6e 6f 6e 65 3e  gs \"] : "<none>
13e80 22 7d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  "}] \n]..       
13e90 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20   }..      }.... 
13ea0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
13eb0 4e 4f 54 45 3a 20 49 66 20 74 68 65 72 65 20 61  NOTE: If there a
13ec0 72 65 20 61 6e 79 20 67 6c 6f 62 61 6c 20 28 70  re any global (p
13ed0 65 72 20 74 65 73 74 20 72 75 6e 29 20 63 6f 6e  er test run) con
13ee0 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 63 75  nection flags cu
13ef0 72 72 65 6e 74 6c 79 0d 0a 20 20 20 20 20 20 23  rrently..      #
13f00 20 20 20 20 20 20 20 73 65 74 2c 20 75 73 65 20         set, use 
13f10 74 68 65 6d 20 6e 6f 77 20 28 69 2e 65 2e 20 62  them now (i.e. b
13f20 79 20 63 6f 6d 62 69 6e 69 6e 67 20 74 68 65 6d  y combining them
13f30 20 77 69 74 68 20 74 68 65 20 6f 6e 65 73 20 66   with the ones f
13f40 6f 72 20 74 68 69 73 0d 0a 20 20 20 20 20 20 23  or this..      #
13f50 20 20 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f         connectio
13f60 6e 29 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  n)...      #..  
13f70 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
13f80 69 73 74 73 20 3a 3a 63 6f 6e 6e 65 63 74 69 6f  ists ::connectio
13f90 6e 5f 66 6c 61 67 73 5d 7d 20 74 68 65 6e 20 7b  n_flags]} then {
13fa0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
13fb0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 6f 6d       # NOTE: Com
13fc0 62 69 6e 65 20 61 6e 64 2f 6f 72 20 72 65 70 6c  bine and/or repl
13fd0 61 63 65 20 74 68 65 20 63 6f 6e 6e 65 63 74 69  ace the connecti
13fe0 6f 6e 20 66 6c 61 67 73 20 61 6e 64 20 74 68 65  on flags and the
13ff0 6e 20 73 68 6f 77 20 74 68 65 0d 0a 20 20 20 20  n show the..    
14000 20 20 20 20 23 20 20 20 20 20 20 20 6e 65 77 20      #       new 
14010 76 61 6c 75 65 2e 0d 0a 20 20 20 20 20 20 20 20  value...        
14020 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 66  #..        set f
14030 6c 61 67 73 20 5b 63 6f 6d 62 69 6e 65 46 6c 61  lags [combineFla
14040 67 73 20 24 66 6c 61 67 73 20 24 3a 3a 63 6f 6e  gs $flags $::con
14050 6e 65 63 74 69 6f 6e 5f 66 6c 61 67 73 5d 0d 0a  nection_flags]..
14060 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
14070 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f       # NOTE: Sho
14080 77 20 28 61 6e 64 20 6c 6f 67 29 20 74 68 65 20  w (and log) the 
14090 6e 65 77 20 65 66 66 65 63 74 69 76 65 20 63 6f  new effective co
140a0 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 2e 0d  nnection flags..
140b0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
140c0 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
140d0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
140e0 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
140f0 69 73 74 73 20 3a 3a 6e 6f 28 65 6d 69 74 43 6f  ists ::no(emitCo
14100 6d 62 69 6e 65 64 46 6c 61 67 73 29 5d 20 26 26  mbinedFlags)] &&
14110 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
14120 20 20 28 21 5b 69 6e 66 6f 20 65 78 69 73 74 73    (![info exists
14130 20 3a 3a 6e 6f 28 65 6d 69 74 43 6f 6d 62 69 6e   ::no(emitCombin
14140 65 64 46 6c 61 67 73 49 66 4e 6f 6e 65 29 5d 20  edFlagsIfNone)] 
14150 7c 7c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  || \..          
14160 20 20 20 20 20 21 5b 68 61 73 4e 6f 46 6c 61 67       ![hasNoFlag
14170 73 20 66 6c 61 67 73 20 66 61 6c 73 65 5d 29 7d  s flags false])}
14180 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
14190 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
141a0 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
141b0 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
141c0 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
141d0 63 6f 6d 62 69 6e 65 64 20 63 6f 6e 6e 65 63 74  combined connect
141e0 69 6f 6e 20 66 6c 61 67 73 20 66 6f 72 20 22 20  ion flags for " 
141f0 24 64 61 74 61 62 61 73 65 20 5c 0d 0a 20 20 20  $database \..   
14200 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 61               " a
14210 72 65 3a 20 22 20 5b 65 78 70 72 20 7b 21 5b 68  re: " [expr {![h
14220 61 73 4e 6f 46 6c 61 67 73 20 66 6c 61 67 73 20  asNoFlags flags 
14230 66 61 6c 73 65 5d 20 3f 20 5c 0d 0a 20 20 20 20  false] ? \..    
14240 20 20 20 20 20 20 20 20 20 20 20 20 5b 61 70 70              [app
14250 65 6e 64 41 72 67 73 20 5c 22 20 24 66 6c 61 67  endArgs \" $flag
14260 73 20 5c 22 5d 20 3a 20 22 3c 6e 6f 6e 65 3e 22  s \"] : "<none>"
14270 7d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  }] \n]..        
14280 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
14290 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
142a0 20 72 65 74 75 72 6e 20 24 66 6c 61 67 73 0d 0a   return $flags..
142b0 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
142c0 6f 63 20 67 65 74 46 6c 61 67 73 50 72 6f 70 65  oc getFlagsPrope
142d0 72 74 79 20 7b 20 7b 66 6c 61 67 73 20 22 22 7d  rty { {flags ""}
142e0 20 7b 71 75 69 65 74 20 66 61 6c 73 65 7d 20 7d   {quiet false} }
142f0 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
14300 20 20 20 23 20 4e 4f 54 45 3a 20 44 65 74 65 72     # NOTE: Deter
14310 6d 69 6e 65 20 77 68 61 74 20 74 68 65 20 63 6f  mine what the co
14320 6d 62 69 6e 65 64 20 28 67 6c 6f 62 61 6c 20 61  mbined (global a
14330 6e 64 20 6c 6f 63 61 6c 29 20 63 6f 6e 6e 65 63  nd local) connec
14340 74 69 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20 20  tion..      #   
14350 20 20 20 20 66 6c 61 67 73 20 73 68 6f 75 6c 64      flags should
14360 20 62 65 2c 20 70 6f 73 73 69 62 6c 79 20 71 75   be, possibly qu
14370 69 65 74 6c 79 2e 0d 0a 20 20 20 20 20 20 23 0d  ietly...      #.
14380 0a 20 20 20 20 20 20 73 65 74 20 66 6c 61 67 73  .      set flags
14390 20 5b 67 65 74 43 6f 6e 6e 65 63 74 69 6f 6e 46   [getConnectionF
143a0 6c 61 67 73 20 22 22 20 24 66 6c 61 67 73 20 24  lags "" $flags $
143b0 71 75 69 65 74 5d 0d 0a 0d 0a 20 20 20 20 20 20  quiet]....      
143c0 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
143d0 20 49 66 20 6e 6f 20 67 6c 6f 62 61 6c 20 6f 72   If no global or
143e0 20 6c 6f 63 61 6c 20 63 6f 6e 6e 65 63 74 69 6f   local connectio
143f0 6e 20 66 6c 61 67 73 20 77 65 72 65 20 73 70 65  n flags were spe
14400 63 69 66 69 65 64 2c 20 74 68 65 0d 0a 20 20 20  cified, the..   
14410 20 20 20 23 20 20 20 20 20 20 20 64 65 66 61 75     #       defau
14420 6c 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c  lt connection fl
14430 61 67 73 20 73 68 6f 75 6c 64 20 62 65 20 75 73  ags should be us
14440 65 64 3b 20 74 68 65 72 65 66 6f 72 65 2c 20 72  ed; therefore, r
14450 65 74 75 72 6e 0d 0a 20 20 20 20 20 20 23 20 20  eturn..      #  
14460 20 20 20 20 20 61 6e 20 65 6d 70 74 79 20 73 74       an empty st
14470 72 69 6e 67 20 69 6e 20 74 68 61 74 20 63 61 73  ring in that cas
14480 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  e...      #..   
14490 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
144a0 65 6e 67 74 68 20 24 66 6c 61 67 73 5d 20 3d 3d  ength $flags] ==
144b0 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
144c0 20 20 20 20 72 65 74 75 72 6e 20 22 22 0d 0a 20      return "".. 
144d0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
144e0 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
144f0 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 63 68 65   In order to che
14500 63 6b 20 69 66 20 74 68 65 20 64 65 66 61 75 6c  ck if the defaul
14510 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61  t connection fla
14520 67 73 20 61 72 65 20 62 65 69 6e 67 20 75 73 65  gs are being use
14530 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  d..      #      
14540 20 69 74 20 69 73 20 6e 65 63 65 73 73 61 72 79   it is necessary
14550 20 74 6f 20 61 74 74 65 6d 70 74 20 61 20 63 6f   to attempt a co
14560 6e 76 65 72 73 69 6f 6e 20 74 6f 20 74 68 65 20  nversion to the 
14570 61 63 74 75 61 6c 20 65 6e 75 6d 65 72 61 74 65  actual enumerate
14580 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  d..      #      
14590 20 74 79 70 65 2e 20 20 46 61 69 6c 69 6e 67 20   type.  Failing 
145a0 74 68 61 74 2c 20 74 68 65 20 63 68 65 63 6b 20  that, the check 
145b0 61 67 61 69 6e 73 74 20 74 68 65 20 64 65 66 61  against the defa
145c0 75 6c 74 20 76 61 6c 75 65 20 77 69 6c 6c 20 62  ult value will b
145d0 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
145e0 20 73 6b 69 70 70 65 64 2e 0d 0a 20 20 20 20 20   skipped...     
145f0 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63   #..      if {[c
14600 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
14610 73 65 74 20 65 72 72 6f 72 20 6e 75 6c 6c 3b 20  set error null; 
14620 23 20 49 47 4e 4f 52 45 44 0d 0a 0d 0a 20 20 20  # IGNORED....   
14630 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f       object invo
14640 6b 65 20 55 74 69 6c 69 74 79 20 54 72 79 50 61  ke Utility TryPa
14650 72 73 65 46 6c 61 67 73 45 6e 75 6d 20 22 22 20  rseFlagsEnum "" 
14660 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 53  \..            S
14670 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
14680 65 2e 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69  e.SQLiteConnecti
14690 6f 6e 46 6c 61 67 73 20 22 22 20 24 66 6c 61 67  onFlags "" $flag
146a0 73 20 6e 75 6c 6c 20 74 72 75 65 20 5c 0d 0a 20  s null true \.. 
146b0 20 20 20 20 20 20 20 20 20 20 20 74 72 75 65 20             true 
146c0 74 72 75 65 20 65 72 72 6f 72 0d 0a 20 20 20 20  true error..    
146d0 20 20 7d 20 76 61 6c 75 65 5d 7d 20 74 68 65 6e    } value]} then
146e0 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
146f0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41         # NOTE: A
14700 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 70 61 72  ttempting to par
14710 73 65 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  se the connectio
14720 6e 20 66 6c 61 67 73 20 63 61 75 73 65 64 20 61  n flags caused a
14730 20 73 63 72 69 70 74 0d 0a 20 20 20 20 20 20 20   script..       
14740 20 23 20 20 20 20 20 20 20 65 72 72 6f 72 2e 20   #       error. 
14750 20 45 6d 69 74 20 61 20 77 61 72 6e 69 6e 67 20   Emit a warning 
14760 74 6f 20 74 68 65 20 74 65 73 74 20 6c 6f 67 20  to the test log 
14770 66 69 6c 65 20 61 6e 64 20 63 6f 6e 74 69 6e 75  file and continu
14780 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
14790 20 20 20 75 73 69 6e 67 20 61 6e 20 65 6d 74 70     using an emtp
147a0 79 20 73 74 72 69 6e 67 20 69 6e 73 74 65 61 64  y string instead
147b0 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
147c0 20 20 20 20 20 20 74 6c 6f 67 20 5b 61 70 70 65        tlog [appe
147d0 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
147e0 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e        "==== WARN
147f0 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 70  ING: failed to p
14800 61 72 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  arse connection 
14810 66 6c 61 67 73 2c 20 65 72 72 6f 72 3a 20 22 20  flags, error: " 
14820 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5c  \..            \
14830 6e 5c 74 20 24 76 61 6c 75 65 20 5c 6e 5d 0d 0a  n\t $value \n]..
14840 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 76 61  ..        set va
14850 6c 75 65 20 22 22 0d 0a 20 20 20 20 20 20 7d 0d  lue ""..      }.
14860 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
14870 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 74 68 65    # NOTE: If the
14880 20 63 6f 6d 62 69 6e 65 64 20 66 6c 61 67 73 20   combined flags 
14890 73 74 72 69 6e 67 20 63 6f 75 6c 64 20 6e 6f 74  string could not
148a0 20 61 63 74 75 61 6c 6c 79 20 62 65 20 63 6f 6e   actually be con
148b0 76 65 72 74 65 64 0d 0a 20 20 20 20 20 20 23 20  verted..      # 
148c0 20 20 20 20 20 20 74 6f 20 74 68 65 20 65 6e 75        to the enu
148d0 6d 65 72 61 74 65 64 20 74 79 70 65 20 69 74 20  merated type it 
148e0 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 20 76  is the default v
148f0 61 6c 75 65 2c 20 74 68 65 6e 20 6a 75 73 74 20  alue, then just 
14900 75 73 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  use..      #    
14910 20 20 20 69 74 20 76 65 72 62 61 74 69 6d 3b 20     it verbatim; 
14920 6f 74 68 65 72 77 69 73 65 2c 20 6a 75 73 74 20  otherwise, just 
14930 72 65 74 75 72 6e 20 61 6e 20 65 6d 70 74 79 20  return an empty 
14940 73 74 72 69 6e 67 2e 20 20 49 6e 20 74 68 61 74  string.  In that
14950 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
14960 63 61 73 65 2c 20 74 68 65 20 64 65 66 61 75 6c  case, the defaul
14970 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61  t connection fla
14980 67 73 20 77 69 6c 6c 20 62 65 20 75 73 65 64 2e  gs will be used.
14990 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
149a0 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
149b0 67 74 68 20 24 76 61 6c 75 65 5d 20 3d 3d 20 30  gth $value] == 0
149c0 20 7c 7c 20 24 76 61 6c 75 65 20 6e 65 20 22 44   || $value ne "D
149d0 65 66 61 75 6c 74 22 7d 20 74 68 65 6e 20 7b 0d  efault"} then {.
149e0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
149f0 20 20 20 20 23 20 57 41 52 4e 49 4e 47 3a 20 54      # WARNING: T
14a00 68 69 73 20 72 65 74 75 72 6e 73 20 74 68 65 20  his returns the 
14a10 73 74 72 69 6e 67 20 76 61 6c 75 65 20 6f 66 20  string value of 
14a20 74 68 65 20 63 6f 6d 62 69 6e 65 64 20 66 6c 61  the combined fla
14a30 67 73 2c 20 6e 6f 74 0d 0a 20 20 20 20 20 20 20  gs, not..       
14a40 20 23 20 20 20 20 20 20 20 20 20 20 74 68 65 20   #          the 
14a50 65 6e 75 6d 65 72 61 74 65 64 20 76 61 6c 75 65  enumerated value
14a60 2e 20 20 54 68 69 73 20 69 73 20 62 79 20 64 65  .  This is by de
14a70 73 69 67 6e 20 61 6e 64 20 73 68 6f 75 6c 64 20  sign and should 
14a80 6e 6f 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20  not..        #  
14a90 20 20 20 20 20 20 20 20 62 65 20 63 68 61 6e 67          be chang
14aa0 65 64 20 77 69 74 68 6f 75 74 20 63 61 72 65 66  ed without caref
14ab0 75 6c 20 63 6f 6e 73 69 64 65 72 61 74 69 6f 6e  ul consideration
14ac0 20 28 65 2e 67 2e 20 69 74 20 77 6f 75 6c 64 0d   (e.g. it would.
14ad0 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
14ae0 20 20 20 20 70 72 65 76 65 6e 74 20 74 68 65 20      prevent the 
14af0 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e  SQLiteConnection
14b00 20 63 6c 61 73 73 20 66 72 6f 6d 20 61 6c 6c 6f   class from allo
14b10 77 69 6e 67 20 69 6e 76 61 6c 69 64 0d 0a 20 20  wing invalid..  
14b20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20        #         
14b30 20 5b 22 6d 61 67 69 63 61 6c 22 5d 20 6d 65 74   ["magical"] met
14b40 61 2d 66 6c 61 67 73 29 2e 0d 0a 20 20 20 20 20  a-flags)...     
14b50 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65     #..        re
14b60 74 75 72 6e 20 5b 61 70 70 65 6e 64 41 72 67 73  turn [appendArgs
14b70 20 22 46 6c 61 67 73 3d 22 20 24 66 6c 61 67 73   "Flags=" $flags
14b80 20 5c 3b 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d   \;]..      }...
14b90 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 22 22  .      return ""
14ba0 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
14bb0 70 72 6f 63 20 65 6e 61 62 6c 65 53 68 61 72 65  proc enableShare
14bc0 64 43 61 63 68 65 20 7b 20 63 68 61 6e 6e 65 6c  dCache { channel
14bd0 20 65 6e 61 62 6c 65 20 7b 71 75 69 65 74 20 66   enable {quiet f
14be0 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  alse} } {..     
14bf0 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
14c00 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e         object in
14c10 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e  voke -flags +Non
14c20 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20  Public \..      
14c30 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74        System.Dat
14c40 61 2e 53 51 4c 69 74 65 2e 55 6e 73 61 66 65 4e  a.SQLite.UnsafeN
14c50 61 74 69 76 65 4d 65 74 68 6f 64 73 20 5c 0d 0a  ativeMethods \..
14c60 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
14c70 74 65 33 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65  te3_enable_share
14c80 64 5f 63 61 63 68 65 20 5b 65 78 70 72 20 69 6e  d_cache [expr in
14c90 74 28 24 65 6e 61 62 6c 65 29 5d 0d 0a 20 20 20  t($enable)]..   
14ca0 20 20 20 7d 20 72 65 73 75 6c 74 5d 20 3d 3d 20     } result] == 
14cb0 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
14cc0 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
14cd0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
14ce0 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
14cf0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
14d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
14d10 2d 2d 2d 20 63 61 6c 6c 20 73 71 6c 69 74 65 33  --- call sqlite3
14d20 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f 63  _enable_shared_c
14d30 61 63 68 65 28 22 20 24 65 6e 61 62 6c 65 20 5c  ache(" $enable \
14d40 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
14d50 22 29 2e 2e 2e 20 6f 6b 3a 20 22 20 24 72 65 73  ")... ok: " $res
14d60 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ult \n]..       
14d70 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65   }..      } else
14d80 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   {..        if {
14d90 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
14da0 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
14db0 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
14dc0 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
14dd0 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 61 6c         "---- cal
14de0 6c 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65  l sqlite3_enable
14df0 5f 73 68 61 72 65 64 5f 63 61 63 68 65 28 22 20  _shared_cache(" 
14e00 24 65 6e 61 62 6c 65 20 5c 0d 0a 20 20 20 20 20  $enable \..     
14e10 20 20 20 20 20 20 20 20 20 22 29 2e 2e 2e 20 65           ")... e
14e20 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 72 65  rror: " \n\t $re
14e30 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  sult \n]..      
14e40 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20    }..      }..  
14e50 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
14e60 20 73 65 74 75 70 44 62 20 7b 0d 0a 20 20 20 20   setupDb {..    
14e70 20 20 20 20 20 20 20 20 66 69 6c 65 4e 61 6d 65          fileName
14e80 20 7b 6d 6f 64 65 20 22 22 7d 20 7b 64 61 74 65   {mode ""} {date
14e90 54 69 6d 65 46 6f 72 6d 61 74 20 22 22 7d 20 7b  TimeFormat ""} {
14ea0 64 61 74 65 54 69 6d 65 4b 69 6e 64 20 22 22 7d  dateTimeKind ""}
14eb0 20 7b 66 6c 61 67 73 20 22 22 7d 0d 0a 20 20 20   {flags ""}..   
14ec0 20 20 20 20 20 20 20 20 20 7b 65 78 74 72 61 20           {extra 
14ed0 22 22 7d 20 7b 71 75 61 6c 69 66 79 20 74 72 75  ""} {qualify tru
14ee0 65 7d 20 7b 64 65 6c 65 74 65 20 74 72 75 65 7d  e} {delete true}
14ef0 20 7b 75 72 69 20 66 61 6c 73 65 7d 0d 0a 20 20   {uri false}..  
14f00 20 20 20 20 20 20 20 20 20 20 7b 74 65 6d 70 6f            {tempo
14f10 72 61 72 79 20 74 72 75 65 7d 20 7b 76 61 72 4e  rary true} {varN
14f20 61 6d 65 20 64 62 7d 20 7b 71 75 69 65 74 20 66  ame db} {quiet f
14f30 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  alse} } {..     
14f40 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
14f50 3a 20 46 69 72 73 74 2c 20 73 65 65 20 69 66 20  : First, see if 
14f60 6f 75 72 20 63 61 6c 6c 65 72 20 68 61 73 20 72  our caller has r
14f70 65 71 75 65 73 74 65 64 20 61 6e 20 69 6e 2d 6d  equested an in-m
14f80 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0d  emory database..
14f90 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
14fa0 73 65 74 20 69 73 4d 65 6d 6f 72 79 20 5b 69 73  set isMemory [is
14fb0 4d 65 6d 6f 72 79 44 62 20 24 66 69 6c 65 4e 61  MemoryDb $fileNa
14fc0 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a  me]....      #..
14fd0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 6f        # NOTE: Fo
14fe0 72 20 6e 6f 77 2c 20 61 6c 6c 20 74 65 73 74 20  r now, all test 
14ff0 64 61 74 61 62 61 73 65 73 20 75 73 65 64 20 62  databases used b
15000 79 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65  y the test suite
15010 20 61 72 65 20 70 6c 61 63 65 64 0d 0a 20 20 20   are placed..   
15020 20 20 20 23 20 20 20 20 20 20 20 69 6e 74 6f 20     #       into 
15030 74 68 65 20 64 61 74 61 62 61 73 65 20 64 69 72  the database dir
15040 65 63 74 6f 72 79 2e 20 20 45 61 63 68 20 64 61  ectory.  Each da
15050 74 61 62 61 73 65 20 61 6e 64 20 72 65 6c 61 74  tabase and relat
15060 65 64 20 66 69 6c 65 73 0d 0a 20 20 20 20 20 20  ed files..      
15070 23 20 20 20 20 20 20 20 75 73 65 64 20 62 79 20  #       used by 
15080 61 20 74 65 73 74 20 73 68 6f 75 6c 64 20 62 65  a test should be
15090 20 63 6c 65 61 6e 65 64 20 75 70 20 62 79 20 74   cleaned up by t
150a0 68 61 74 20 74 65 73 74 20 75 73 69 6e 67 20 74  hat test using t
150b0 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  he..      #     
150c0 20 20 22 63 6c 65 61 6e 75 70 44 62 22 20 70 72    "cleanupDb" pr
150d0 6f 63 65 64 75 72 65 2c 20 62 65 6c 6f 77 2e 0d  ocedure, below..
150e0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
150f0 69 66 20 7b 21 24 69 73 4d 65 6d 6f 72 79 20 26  if {!$isMemory &
15100 26 20 24 71 75 61 6c 69 66 79 7d 20 74 68 65 6e  & $qualify} then
15110 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   {..        set 
15120 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6a  fileName [file j
15130 6f 69 6e 20 5b 67 65 74 44 61 74 61 62 61 73 65  oin [getDatabase
15140 44 69 72 65 63 74 6f 72 79 5d 20 5b 66 69 6c 65  Directory] [file
15150 20 74 61 69 6c 20 24 66 69 6c 65 4e 61 6d 65 5d   tail $fileName]
15160 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  ]..      }....  
15170 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
15180 4f 54 45 3a 20 42 79 20 64 65 66 61 75 6c 74 2c  OTE: By default,
15190 20 64 65 6c 65 74 65 20 61 6e 79 20 70 72 65 2d   delete any pre-
151a0 65 78 69 73 74 69 6e 67 20 64 61 74 61 62 61 73  existing databas
151b0 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  e with the same 
151c0 66 69 6c 65 0d 0a 20 20 20 20 20 20 23 20 20 20  file..      #   
151d0 20 20 20 20 6e 61 6d 65 20 69 66 20 69 74 20 63      name if it c
151e0 75 72 72 65 6e 74 6c 79 20 65 78 69 73 74 73 2e  urrently exists.
151f0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
15200 20 69 66 20 7b 21 24 69 73 4d 65 6d 6f 72 79 20   if {!$isMemory 
15210 26 26 20 24 64 65 6c 65 74 65 20 26 26 20 5b 66  && $delete && [f
15220 69 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c 65  ile exists $file
15230 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  Name]} then {.. 
15240 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
15250 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70    # NOTE: Attemp
15260 74 20 74 6f 20 64 65 6c 65 74 65 20 61 6e 79 20  t to delete any 
15270 70 72 65 2d 65 78 69 73 74 69 6e 67 20 64 61 74  pre-existing dat
15280 61 62 61 73 65 20 77 69 74 68 20 74 68 65 20 73  abase with the s
15290 61 6d 65 20 66 69 6c 65 0d 0a 20 20 20 20 20 20  ame file..      
152a0 20 20 23 20 20 20 20 20 20 20 6e 61 6d 65 2e 0d    #       name..
152b0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
152c0 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
152d0 66 69 6c 65 20 64 65 6c 65 74 65 20 24 66 69 6c  file delete $fil
152e0 65 4e 61 6d 65 7d 20 65 72 72 6f 72 5d 7d 20 74  eName} error]} t
152f0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
15300 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
15310 4e 4f 54 45 3a 20 57 65 20 73 6f 6d 65 68 6f 77  NOTE: We somehow
15320 20 66 61 69 6c 65 64 20 74 6f 20 64 65 6c 65 74   failed to delet
15330 65 20 74 68 65 20 66 69 6c 65 2c 20 72 65 70 6f  e the file, repo
15340 72 74 20 77 68 79 2e 0d 0a 20 20 20 20 20 20 20  rt why...       
15350 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
15360 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
15370 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
15380 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
15390 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
153a0 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
153b0 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e        "==== WARN
153c0 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 64  ING: failed to d
153d0 65 6c 65 74 65 20 64 61 74 61 62 61 73 65 20 66  elete database f
153e0 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d  ile \"" $fileNam
153f0 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
15400 20 20 20 20 20 22 5c 22 20 64 75 72 69 6e 67 20       "\" during 
15410 73 65 74 75 70 2c 20 65 72 72 6f 72 3a 20 22 20  setup, error: " 
15420 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d  \n\t $error \n].
15430 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
15440 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
15450 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
15460 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 66 65 72     # NOTE: Refer
15470 20 74 6f 20 74 68 65 20 73 70 65 63 69 66 69 65   to the specifie
15480 64 20 76 61 72 69 61 62 6c 65 20 28 65 2e 67 2e  d variable (e.g.
15490 20 22 64 62 22 29 20 69 6e 20 74 68 65 20 63 6f   "db") in the co
154a0 6e 74 65 78 74 20 6f 66 20 6f 75 72 0d 0a 20 20  ntext of our..  
154b0 20 20 20 20 23 20 20 20 20 20 20 20 63 61 6c 6c      #       call
154c0 65 72 2e 20 20 54 68 65 20 68 61 6e 64 6c 65 20  er.  The handle 
154d0 74 6f 20 74 68 65 20 6f 70 65 6e 65 64 20 64 61  to the opened da
154e0 74 61 62 61 73 65 20 77 69 6c 6c 20 62 65 20 73  tabase will be s
154f0 74 6f 72 65 64 20 74 68 65 72 65 2e 0d 0a 20 20  tored there...  
15500 20 20 20 20 23 0d 0a 20 20 20 20 20 20 75 70 76      #..      upv
15510 61 72 20 31 20 24 76 61 72 4e 61 6d 65 20 64 62  ar 1 $varName db
15520 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
15530 20 20 20 23 20 4e 4f 54 45 3a 20 53 74 61 72 74     # NOTE: Start
15540 20 62 75 69 6c 64 69 6e 67 20 74 68 65 20 63 6f   building the co
15550 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e 67 2e  nnection string.
15560 20 20 54 68 65 20 6f 6e 6c 79 20 72 65 71 75 69    The only requi
15570 72 65 64 20 70 6f 72 74 69 6f 6e 0d 0a 20 20 20  red portion..   
15580 20 20 20 23 20 20 20 20 20 20 20 6f 66 20 74 68     #       of th
15590 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72  e connection str
155a0 69 6e 67 20 69 73 20 74 68 65 20 64 61 74 61 20  ing is the data 
155b0 73 6f 75 72 63 65 2c 20 77 68 69 63 68 20 63 6f  source, which co
155c0 6e 74 61 69 6e 73 20 74 68 65 0d 0a 20 20 20 20  ntains the..    
155d0 20 20 23 20 20 20 20 20 20 20 64 61 74 61 62 61    #       databa
155e0 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 69 74 73  se file name its
155f0 65 6c 66 2e 20 20 49 66 20 6f 75 72 20 63 61 6c  elf.  If our cal
15600 6c 65 72 20 77 61 6e 74 73 20 74 6f 20 75 73 65  ler wants to use
15610 20 61 20 55 52 49 20 61 73 0d 0a 20 20 20 20 20   a URI as..     
15620 20 23 20 20 20 20 20 20 20 74 68 65 20 64 61 74   #       the dat
15630 61 20 73 6f 75 72 63 65 2c 20 75 73 65 20 74 68  a source, use th
15640 65 20 46 75 6c 6c 55 72 69 20 63 6f 6e 6e 65 63  e FullUri connec
15650 74 69 6f 6e 20 73 74 72 69 6e 67 20 70 72 6f 70  tion string prop
15660 65 72 74 79 20 74 6f 0d 0a 20 20 20 20 20 20 23  erty to..      #
15670 20 20 20 20 20 20 20 70 72 65 76 65 6e 74 20 74         prevent t
15680 68 65 20 64 61 74 61 20 73 6f 75 72 63 65 20 73  he data source s
15690 74 72 69 6e 67 20 66 72 6f 6d 20 62 65 69 6e 67  tring from being
156a0 20 6d 61 6e 67 6c 65 64 2e 0d 0a 20 20 20 20 20   mangled...     
156b0 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 75   #..      if {$u
156c0 72 69 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  ri} then {..    
156d0 20 20 20 20 73 65 74 20 63 6f 6e 6e 65 63 74 69      set connecti
156e0 6f 6e 20 7b 46 75 6c 6c 55 72 69 3d 24 7b 66 69  on {FullUri=${fi
156f0 6c 65 4e 61 6d 65 7d 7d 0d 0a 20 20 20 20 20 20  leName}}..      
15700 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
15710 20 20 73 65 74 20 63 6f 6e 6e 65 63 74 69 6f 6e    set connection
15720 20 7b 44 61 74 61 20 53 6f 75 72 63 65 3d 24 7b   {Data Source=${
15730 66 69 6c 65 4e 61 6d 65 7d 7d 0d 0a 20 20 20 20  fileName}}..    
15740 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
15750 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 69        # NOTE: Si
15760 6e 63 65 20 74 68 69 73 20 70 72 6f 63 65 64 75  nce this procedu
15770 72 65 20 68 61 73 20 6e 6f 20 73 70 65 63 69 61  re has no specia
15780 6c 20 6b 6e 6f 77 6c 65 64 67 65 20 6f 66 20 77  l knowledge of w
15790 68 61 74 20 74 68 65 20 64 65 66 61 75 6c 74 0d  hat the default.
157a0 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73  .      #       s
157b0 65 74 74 69 6e 67 20 69 73 20 66 6f 72 20 74 68  etting is for th
157c0 65 20 54 6f 46 75 6c 6c 50 61 74 68 20 63 6f 6e  e ToFullPath con
157d0 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e 67 20 70  nection string p
157e0 72 6f 70 65 72 79 2c 20 61 6c 77 61 79 73 0d 0a  ropery, always..
157f0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61 64        #       ad
15800 64 20 74 68 65 20 76 61 6c 75 65 20 77 65 20 6b  d the value we k
15810 6e 6f 77 20 61 62 6f 75 74 20 74 6f 20 74 68 65  now about to the
15820 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69   connection stri
15830 6e 67 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ng...      #..  
15840 20 20 20 20 61 70 70 65 6e 64 20 63 6f 6e 6e 65      append conne
15850 63 74 69 6f 6e 20 7b 3b 54 6f 46 75 6c 6c 50 61  ction {;ToFullPa
15860 74 68 3d 24 7b 71 75 61 6c 69 66 79 7d 7d 0d 0a  th=${qualify}}..
15870 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
15880 20 23 20 4e 4f 54 45 3a 20 49 66 20 6f 75 72 20   # NOTE: If our 
15890 63 61 6c 6c 65 72 20 73 70 65 63 69 66 69 65 64  caller specified
158a0 20 61 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2c   a journal mode,
158b0 20 61 64 64 20 74 68 65 20 6e 65 63 65 73 73 61   add the necessa
158c0 72 79 20 70 6f 72 74 69 6f 6e 0d 0a 20 20 20 20  ry portion..    
158d0 20 20 23 20 20 20 20 20 20 20 6f 66 20 74 68 65    #       of the
158e0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69   connection stri
158f0 6e 67 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 23  ng now...      #
15900 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72  ..      if {[str
15910 69 6e 67 20 6c 65 6e 67 74 68 20 24 6d 6f 64 65  ing length $mode
15920 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
15930 20 20 20 20 20 20 20 61 70 70 65 6e 64 20 63 6f         append co
15940 6e 6e 65 63 74 69 6f 6e 20 7b 3b 4a 6f 75 72 6e  nnection {;Journ
15950 61 6c 20 4d 6f 64 65 3d 24 7b 6d 6f 64 65 7d 7d  al Mode=${mode}}
15960 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
15970 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
15980 54 45 3a 20 49 66 20 6f 75 72 20 63 61 6c 6c 65  TE: If our calle
15990 72 20 73 70 65 63 69 66 69 65 64 20 61 20 44 61  r specified a Da
159a0 74 65 54 69 6d 65 20 66 6f 72 6d 61 74 2c 20 61  teTime format, a
159b0 64 64 20 74 68 65 20 6e 65 63 65 73 73 61 72 79  dd the necessary
159c0 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
159d0 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 63  portion of the c
159e0 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e 67  onnection string
159f0 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 23 0d 0a   now...      #..
15a00 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
15a10 67 20 6c 65 6e 67 74 68 20 24 64 61 74 65 54 69  g length $dateTi
15a20 6d 65 46 6f 72 6d 61 74 5d 20 3e 20 30 7d 20 74  meFormat] > 0} t
15a30 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 61  hen {..        a
15a40 70 70 65 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e  ppend connection
15a50 20 7b 3b 44 61 74 65 54 69 6d 65 46 6f 72 6d 61   {;DateTimeForma
15a60 74 3d 24 7b 64 61 74 65 54 69 6d 65 46 6f 72 6d  t=${dateTimeForm
15a70 61 74 7d 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  at}}..      }...
15a80 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
15a90 23 20 4e 4f 54 45 3a 20 49 66 20 6f 75 72 20 63  # NOTE: If our c
15aa0 61 6c 6c 65 72 20 73 70 65 63 69 66 69 65 64 20  aller specified 
15ab0 61 20 44 61 74 65 54 69 6d 65 4b 69 6e 64 2c 20  a DateTimeKind, 
15ac0 61 64 64 20 74 68 65 20 6e 65 63 65 73 73 61 72  add the necessar
15ad0 79 20 70 6f 72 74 69 6f 6e 0d 0a 20 20 20 20 20  y portion..     
15ae0 20 23 20 20 20 20 20 20 20 6f 66 20 74 68 65 20   #       of the 
15af0 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e  connection strin
15b00 67 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 23 0d  g now...      #.
15b10 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69  .      if {[stri
15b20 6e 67 20 6c 65 6e 67 74 68 20 24 64 61 74 65 54  ng length $dateT
15b30 69 6d 65 4b 69 6e 64 5d 20 3e 20 30 7d 20 74 68  imeKind] > 0} th
15b40 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 61 70  en {..        ap
15b50 70 65 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  pend connection 
15b60 7b 3b 44 61 74 65 54 69 6d 65 4b 69 6e 64 3d 24  {;DateTimeKind=$
15b70 7b 64 61 74 65 54 69 6d 65 4b 69 6e 64 7d 7d 0d  {dateTimeKind}}.
15b80 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
15b90 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
15ba0 45 3a 20 46 69 67 75 72 65 20 6f 75 74 20 77 68  E: Figure out wh
15bb0 61 74 20 74 68 65 20 66 69 6e 61 6c 20 66 6c 61  at the final fla
15bc0 67 73 20 66 6f 72 20 74 68 69 73 20 63 6f 6e 6e  gs for this conn
15bd0 65 63 74 69 6f 6e 20 6e 65 65 64 20 74 6f 20 62  ection need to b
15be0 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  e...      #..   
15bf0 20 20 20 73 65 74 20 66 6c 61 67 73 20 5b 67 65     set flags [ge
15c00 74 43 6f 6e 6e 65 63 74 69 6f 6e 46 6c 61 67 73  tConnectionFlags
15c10 20 24 66 69 6c 65 4e 61 6d 65 20 24 66 6c 61 67   $fileName $flag
15c20 73 20 24 71 75 69 65 74 5d 0d 0a 0d 0a 20 20 20  s $quiet]....   
15c30 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
15c40 54 45 3a 20 49 66 20 6f 75 72 20 63 61 6c 6c 65  TE: If our calle
15c50 72 20 73 70 65 63 69 66 69 65 64 20 73 6f 6d 65  r specified some
15c60 20 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f   SQLiteConnectio
15c70 6e 46 6c 61 67 73 2c 20 61 64 64 20 74 68 65 0d  nFlags, add the.
15c80 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6e  .      #       n
15c90 65 63 65 73 73 61 72 79 20 70 6f 72 74 69 6f 6e  ecessary portion
15ca0 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   of the connecti
15cb0 6f 6e 20 73 74 72 69 6e 67 20 6e 6f 77 2e 0d 0a  on string now...
15cc0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
15cd0 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  f {[string lengt
15ce0 68 20 24 66 6c 61 67 73 5d 20 3e 20 30 7d 20 74  h $flags] > 0} t
15cf0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 61  hen {..        a
15d00 70 70 65 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e  ppend connection
15d10 20 7b 3b 46 6c 61 67 73 3d 24 7b 66 6c 61 67 73   {;Flags=${flags
15d20 7d 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  }}..      }.... 
15d30 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
15d40 4e 4f 54 45 3a 20 49 66 20 6f 75 72 20 63 61 6c  NOTE: If our cal
15d50 6c 65 72 20 73 70 65 63 69 66 69 65 64 20 61 6e  ler specified an
15d60 20 65 78 74 72 61 20 70 61 79 6c 6f 61 64 20 74   extra payload t
15d70 6f 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  o the connection
15d80 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
15d90 73 74 72 69 6e 67 2c 20 61 70 70 65 6e 64 20 69  string, append i
15da0 74 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 23 0d  t now...      #.
15db0 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69  .      if {[stri
15dc0 6e 67 20 6c 65 6e 67 74 68 20 24 65 78 74 72 61  ng length $extra
15dd0 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
15de0 20 20 20 20 20 20 20 61 70 70 65 6e 64 20 63 6f         append co
15df0 6e 6e 65 63 74 69 6f 6e 20 5c 3b 20 24 65 78 74  nnection \; $ext
15e00 72 61 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ra..      }.... 
15e10 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
15e20 4e 4f 54 45 3a 20 46 6f 72 20 63 6c 61 72 69 74  NOTE: For clarit
15e30 79 2c 20 61 70 70 65 6e 64 20 61 20 66 69 6e 61  y, append a fina
15e40 6c 20 73 65 6d 69 63 6f 6c 6f 6e 20 74 6f 20 74  l semicolon to t
15e50 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74  he connection st
15e60 72 69 6e 67 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  ring...      #..
15e70 20 20 20 20 20 20 61 70 70 65 6e 64 20 63 6f 6e        append con
15e80 6e 65 63 74 69 6f 6e 20 5c 3b 0d 0a 0d 0a 20 20  nection \;....  
15e90 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
15ea0 4f 54 45 3a 20 4f 70 65 6e 20 74 68 65 20 64 61  OTE: Open the da
15eb0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
15ec0 6e 20 6e 6f 77 2c 20 70 6c 61 63 69 6e 67 20 74  n now, placing t
15ed0 68 65 20 6f 70 61 71 75 65 20 68 61 6e 64 6c 65  he opaque handle
15ee0 20 76 61 6c 75 65 0d 0a 20 20 20 20 20 20 23 20   value..      # 
15ef0 20 20 20 20 20 20 69 6e 74 6f 20 74 68 65 20 76        into the v
15f00 61 72 69 61 62 6c 65 20 73 70 65 63 69 66 69 65  ariable specifie
15f10 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 2e  d by our caller.
15f20 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
15f30 20 73 65 74 20 64 62 20 5b 73 71 6c 20 6f 70 65   set db [sql ope
15f40 6e 20 2d 74 79 70 65 20 53 51 4c 69 74 65 20 5b  n -type SQLite [
15f50 73 75 62 73 74 20 24 63 6f 6e 6e 65 63 74 69 6f  subst $connectio
15f60 6e 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a  n]]....      #..
15f70 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 6f        # NOTE: Co
15f80 6e 66 69 67 75 72 65 20 74 68 65 20 74 65 6d 70  nfigure the temp
15f90 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72 79 20  orary directory 
15fa0 66 6f 72 20 74 68 65 20 6e 65 77 6c 79 20 6f 70  for the newly op
15fb0 65 6e 65 64 20 64 61 74 61 62 61 73 65 0d 0a 20  ened database.. 
15fc0 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e       #       con
15fd0 6e 65 63 74 69 6f 6e 20 6e 6f 77 20 75 6e 6c 65  nection now unle
15fe0 73 73 20 6f 75 72 20 63 61 6c 6c 65 72 20 66 6f  ss our caller fo
15ff0 72 62 69 64 73 20 69 74 2e 0d 0a 20 20 20 20 20  rbids it...     
16000 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 74   #..      if {$t
16010 65 6d 70 6f 72 61 72 79 20 26 26 20 21 5b 69 6e  emporary && ![in
16020 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 73  fo exists ::no(s
16030 65 74 54 65 6d 70 6f 72 61 72 79 44 69 72 65 63  etTemporaryDirec
16040 74 6f 72 79 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  tory)]} then {..
16050 20 20 20 20 20 20 20 20 73 71 6c 20 65 78 65 63          sql exec
16060 75 74 65 20 24 64 62 20 5b 61 70 70 65 6e 64 41  ute $db [appendA
16070 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
16080 20 20 20 22 50 52 41 47 4d 41 20 74 65 6d 70 5f     "PRAGMA temp_
16090 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 20  store_directory 
160a0 3d 20 5c 22 22 20 5b 67 65 74 54 65 6d 70 6f 72  = \"" [getTempor
160b0 61 72 79 44 69 72 65 63 74 6f 72 79 5d 20 5c 22  aryDirectory] \"
160c0 5c 3b 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  \;]..      }....
160d0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
160e0 20 4e 4f 54 45 3a 20 50 65 72 66 6f 72 6d 20 61   NOTE: Perform a
160f0 6e 79 20 65 78 74 72 61 20 70 65 72 2d 63 6f 6e  ny extra per-con
16100 6e 65 63 74 69 6f 6e 20 73 65 74 75 70 20 66 6f  nection setup fo
16110 72 20 74 68 65 20 6e 65 77 6c 79 20 6f 70 65 6e  r the newly open
16120 65 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ed..      #     
16130 20 20 64 61 74 61 62 61 73 65 20 6e 6f 77 20 75    database now u
16140 6e 6c 65 73 73 20 6f 75 72 20 63 61 6c 6c 65 72  nless our caller
16150 20 66 6f 72 62 69 64 73 20 69 74 2e 0d 0a 20 20   forbids it...  
16160 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74      #..      set
16170 20 65 78 65 63 75 74 65 4f 6e 53 65 74 75 70 20   executeOnSetup 
16180 5b 67 65 74 45 78 65 63 75 74 65 4f 6e 53 65 74  [getExecuteOnSet
16190 75 70 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20  up]....      if 
161a0 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
161b0 24 65 78 65 63 75 74 65 4f 6e 53 65 74 75 70 5d  $executeOnSetup]
161c0 20 3e 20 30 20 26 26 20 5c 0d 0a 20 20 20 20 20   > 0 && \..     
161d0 20 20 20 20 20 21 5b 69 6e 66 6f 20 65 78 69 73       ![info exis
161e0 74 73 20 3a 3a 6e 6f 28 65 78 65 63 75 74 65 4f  ts ::no(executeO
161f0 6e 53 65 74 75 70 29 5d 7d 20 74 68 65 6e 20 7b  nSetup)]} then {
16200 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
16210 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69       # NOTE: Thi
16220 73 20 63 6f 6d 6d 61 6e 64 20 6d 61 79 20 72 61  s command may ra
16230 69 73 65 20 61 6e 20 65 72 72 6f 72 3b 20 69 66  ise an error; if
16240 20 73 6f 2c 20 74 68 61 74 20 69 73 20 66 69 6e   so, that is fin
16250 65 2c 20 61 73 0d 0a 20 20 20 20 20 20 20 20 23  e, as..        #
16260 20 20 20 20 20 20 20 74 68 65 20 65 6e 63 6c 6f         the enclo
16270 73 69 6e 67 20 74 65 73 74 20 77 69 6c 6c 20 74  sing test will t
16280 68 65 6e 20 66 61 69 6c 2e 20 20 54 68 65 20 5b  hen fail.  The [
16290 73 75 62 73 74 5d 20 63 6f 6d 6d 61 6e 64 20 69  subst] command i
162a0 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  s..        #    
162b0 20 20 20 75 73 65 64 20 6f 6e 20 74 68 65 20 53     used on the S
162c0 51 4c 20 69 6e 20 63 61 73 65 20 69 74 20 6e 65  QL in case it ne
162d0 65 64 73 20 74 6f 20 72 65 66 65 72 20 74 6f 20  eds to refer to 
162e0 73 74 61 74 65 20 69 6e 20 6f 75 72 0d 0a 20 20  state in our..  
162f0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f        #       co
16300 6e 74 65 78 74 2e 0d 0a 20 20 20 20 20 20 20 20  ntext...        
16310 23 0d 0a 20 20 20 20 20 20 20 20 73 71 6c 20 65  #..        sql e
16320 78 65 63 75 74 65 20 24 64 62 20 5b 73 75 62 73  xecute $db [subs
16330 74 20 24 65 78 65 63 75 74 65 4f 6e 53 65 74 75  t $executeOnSetu
16340 70 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  p]..      }.... 
16350 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
16360 4e 4f 54 45 3a 20 41 6c 77 61 79 73 20 72 65 74  NOTE: Always ret
16370 75 72 6e 20 74 68 65 20 63 6f 6e 6e 65 63 74 69  urn the connecti
16380 6f 6e 20 68 61 6e 64 6c 65 20 75 70 6f 6e 20 73  on handle upon s
16390 75 63 63 65 73 73 2e 0d 0a 20 20 20 20 20 20 23  uccess...      #
163a0 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 24  ..      return $
163b0 64 62 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  db..    }.....  
163c0 20 20 70 72 6f 63 20 67 65 74 44 62 43 6f 6e 6e    proc getDbConn
163d0 65 63 74 69 6f 6e 20 7b 20 7b 76 61 72 4e 61 6d  ection { {varNam
163e0 65 20 64 62 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  e db} } {..     
163f0 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
16400 3a 20 52 65 66 65 72 20 74 6f 20 74 68 65 20 73  : Refer to the s
16410 70 65 63 69 66 69 65 64 20 76 61 72 69 61 62 6c  pecified variabl
16420 65 20 28 65 2e 67 2e 20 22 64 62 22 29 20 69 6e  e (e.g. "db") in
16430 20 74 68 65 20 63 6f 6e 74 65 78 74 20 6f 66 20   the context of 
16440 6f 75 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20  our..      #    
16450 20 20 20 63 61 6c 6c 65 72 2e 20 20 54 68 65 20     caller.  The 
16460 68 61 6e 64 6c 65 20 74 6f 20 74 68 65 20 64 61  handle to the da
16470 74 61 62 61 73 65 20 70 72 65 76 69 6f 75 73 6c  tabase previousl
16480 79 20 6f 70 65 6e 65 64 20 76 69 61 20 74 68 65  y opened via the
16490 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
164a0 5b 73 65 74 75 70 44 62 5d 20 70 72 6f 63 65 64  [setupDb] proced
164b0 75 72 65 20 73 68 6f 75 6c 64 20 62 65 20 73 74  ure should be st
164c0 6f 72 65 64 20 74 68 65 72 65 2e 0d 0a 20 20 20  ored there...   
164d0 20 20 20 23 0d 0a 20 20 20 20 20 20 75 70 76 61     #..      upva
164e0 72 20 31 20 24 76 61 72 4e 61 6d 65 20 64 62 0d  r 1 $varName db.
164f0 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
16500 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 72    # NOTE: This r
16510 65 74 75 72 6e 73 20 74 68 65 20 41 44 4f 2e 4e  eturns the ADO.N
16520 45 54 20 49 44 62 43 6f 6e 6e 65 63 74 69 6f 6e  ET IDbConnection
16530 20 6f 62 6a 65 63 74 20 69 6e 73 74 61 6e 63 65   object instance
16540 20 66 6f 72 20 74 68 65 0d 0a 20 20 20 20 20 20   for the..      
16550 23 20 20 20 20 20 20 20 73 70 65 63 69 66 69 65  #       specifie
16560 64 20 64 61 74 61 62 73 65 20 68 61 6e 64 6c 65  d databse handle
16570 2e 20 20 53 69 6e 63 65 20 67 65 74 74 69 6e 67  .  Since getting
16580 20 74 68 69 73 20 6f 62 6a 65 63 74 20 72 65 6c   this object rel
16590 69 65 73 20 75 70 6f 6e 0d 0a 20 20 20 20 20 20  ies upon..      
165a0 23 20 20 20 20 20 20 20 45 61 67 6c 65 20 69 6e  #       Eagle in
165b0 74 65 72 6e 61 6c 73 2c 20 67 72 65 61 74 20 63  ternals, great c
165c0 61 72 65 20 73 68 6f 75 6c 64 20 62 65 20 74 61  are should be ta
165d0 6b 65 6e 20 74 6f 20 61 76 6f 69 64 20 64 69 73  ken to avoid dis
165e0 70 6f 73 69 6e 67 20 6f 66 0d 0a 20 20 20 20 20  posing of..     
165f0 20 23 20 20 20 20 20 20 20 74 68 69 73 20 6f 62   #       this ob
16600 6a 65 63 74 20 6f 72 20 6f 74 68 65 72 77 69 73  ject or otherwis
16610 65 20 70 75 74 74 69 6e 67 20 69 74 20 69 6e 74  e putting it int
16620 6f 20 61 6e 20 69 6e 76 61 6c 69 64 20 73 74 61  o an invalid sta
16630 74 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  te...      #..  
16640 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
16650 69 73 74 73 20 64 62 5d 7d 20 74 68 65 6e 20 7b  ists db]} then {
16660 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63  ..        if {[c
16670 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
16680 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20    object invoke 
16690 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69  -flags +NonPubli
166a0 63 20 2d 6f 62 6a 65 63 74 66 6c 61 67 73 20 2b  c -objectflags +
166b0 4e 6f 44 69 73 70 6f 73 65 20 2d 61 6c 69 61 73  NoDispose -alias
166c0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
166d0 20 20 49 6e 74 65 72 70 72 65 74 65 72 2e 47 65    Interpreter.Ge
166e0 74 41 63 74 69 76 65 2e 63 6f 6e 6e 65 63 74 69  tActive.connecti
166f0 6f 6e 73 20 49 74 65 6d 20 24 64 62 0d 0a 20 20  ons Item $db..  
16700 20 20 20 20 20 20 7d 20 72 65 73 75 6c 74 5d 20        } result] 
16710 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
16720 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
16730 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 75 63       # NOTE: Suc
16740 63 65 73 73 2c 20 72 65 74 75 72 6e 20 74 68 65  cess, return the
16750 20 6f 70 61 71 75 65 20 6f 62 6a 65 63 74 20 68   opaque object h
16760 61 6e 64 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20  andle...        
16770 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 72    #..          r
16780 65 74 75 72 6e 20 24 72 65 73 75 6c 74 0d 0a 20  eturn $result.. 
16790 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
167a0 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
167b0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
167c0 46 61 69 6c 75 72 65 2c 20 72 65 70 6f 72 74 20  Failure, report 
167d0 77 68 79 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  why...          
167e0 23 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75  #..          tpu
167f0 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
16800 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
16810 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
16820 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66  "==== WARNING: f
16830 61 69 6c 65 64 20 74 6f 20 67 65 74 20 63 6f 6e  ailed to get con
16840 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20 66  nection handle f
16850 6f 72 20 64 61 74 61 62 61 73 65 20 5c 22 22 20  or database \"" 
16860 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
16870 20 24 64 62 20 22 5c 22 2c 20 65 72 72 6f 72 3a   $db "\", error:
16880 20 22 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20   " \n\t $result 
16890 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  \n]..        }..
168a0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
168b0 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
168c0 3a 20 46 61 69 6c 75 72 65 2c 20 72 65 74 75 72  : Failure, retur
168d0 6e 20 61 6e 20 6f 62 76 69 6f 75 73 6c 79 20 69  n an obviously i
168e0 6e 76 61 6c 69 64 20 6f 70 61 71 75 65 20 6f 62  nvalid opaque ob
168f0 6a 65 63 74 20 68 61 6e 64 6c 65 2e 0d 0a 20 20  ject handle...  
16900 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74      #..      ret
16910 75 72 6e 20 22 22 0d 0a 20 20 20 20 7d 0d 0a 0c  urn ""..    }...
16920 0d 0a 20 20 20 20 70 72 6f 63 20 66 72 65 65 44  ..    proc freeD
16930 62 43 6f 6e 6e 65 63 74 69 6f 6e 20 7b 20 7b 76  bConnection { {v
16940 61 72 4e 61 6d 65 20 63 6f 6e 6e 65 63 74 69 6f  arName connectio
16950 6e 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  n} } {..      #.
16960 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52  .      # NOTE: R
16970 65 66 65 72 20 74 6f 20 74 68 65 20 73 70 65 63  efer to the spec
16980 69 66 69 65 64 20 76 61 72 69 61 62 6c 65 20 28  ified variable (
16990 65 2e 67 2e 20 22 63 6f 6e 6e 65 63 74 69 6f 6e  e.g. "connection
169a0 22 29 20 69 6e 20 74 68 65 0d 0a 20 20 20 20 20  ") in the..     
169b0 20 23 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74   #       context
169c0 20 6f 66 20 6f 75 72 20 63 61 6c 6c 65 72 2e 20   of our caller. 
169d0 20 54 68 65 20 6f 70 61 71 75 65 20 6f 62 6a 65   The opaque obje
169e0 63 74 20 68 61 6e 64 6c 65 20 66 6f 72 20 61 6e  ct handle for an
169f0 20 41 44 4f 2e 4e 45 54 0d 0a 20 20 20 20 20 20   ADO.NET..      
16a00 23 20 20 20 20 20 20 20 63 6f 6e 6e 65 63 74 69  #       connecti
16a10 6f 6e 20 70 72 65 76 69 6f 75 73 6c 79 20 72 65  on previously re
16a20 74 75 72 6e 65 64 20 62 79 20 5b 67 65 74 44 62  turned by [getDb
16a30 43 6f 6e 6e 65 63 74 69 6f 6e 5d 20 73 68 6f 75  Connection] shou
16a40 6c 64 20 62 65 0d 0a 20 20 20 20 20 20 23 20 20  ld be..      #  
16a50 20 20 20 20 20 73 74 6f 72 65 64 20 74 68 65 72       stored ther
16a60 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  e...      #..   
16a70 20 20 20 75 70 76 61 72 20 31 20 24 76 61 72 4e     upvar 1 $varN
16a80 61 6d 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0d 0a  ame connection..
16a90 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
16aa0 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74   # NOTE: Attempt
16ab0 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 6f   to remove the o
16ac0 70 61 71 75 65 20 6f 62 6a 65 63 74 20 68 61 6e  paque object han
16ad0 64 6c 65 20 66 72 6f 6d 20 74 68 65 20 69 6e 74  dle from the int
16ae0 65 72 70 72 65 74 65 72 0d 0a 20 20 20 20 20 20  erpreter..      
16af0 23 20 20 20 20 20 20 20 6e 6f 77 2e 20 20 54 68  #       now.  Th
16b00 69 73 20 5b 6f 62 6a 65 63 74 20 64 69 73 70 6f  is [object dispo
16b10 73 65 5d 20 63 61 6c 6c 20 77 69 6c 6c 20 6e 6f  se] call will no
16b20 74 20 61 63 74 75 61 6c 6c 79 20 64 69 73 70 6f  t actually dispo
16b30 73 65 20 6f 66 20 74 68 65 0d 0a 20 20 20 20 20  se of the..     
16b40 20 23 20 20 20 20 20 20 20 75 6e 64 65 72 6c 79   #       underly
16b50 69 6e 67 20 6f 62 6a 65 63 74 20 62 65 63 61 75  ing object becau
16b60 73 65 20 74 68 65 20 2b 4e 6f 44 69 73 70 6f 73  se the +NoDispos
16b70 65 20 66 6c 61 67 20 77 61 73 20 73 65 74 20 6f  e flag was set o
16b80 6e 20 69 74 0d 0a 20 20 20 20 20 20 23 20 20 20  n it..      #   
16b90 20 20 20 20 64 75 72 69 6e 67 20 63 72 65 61 74      during creat
16ba0 69 6f 6e 20 6f 66 20 74 68 65 20 6f 70 61 71 75  ion of the opaqu
16bb0 65 20 6f 62 6a 65 63 74 20 68 61 6e 64 6c 65 2e  e object handle.
16bc0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
16bd0 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
16be0 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 5d 20 26 26  s connection] &&
16bf0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 63   \..          [c
16c00 61 74 63 68 20 7b 6f 62 6a 65 63 74 20 64 69 73  atch {object dis
16c10 70 6f 73 65 20 24 63 6f 6e 6e 65 63 74 69 6f 6e  pose $connection
16c20 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b  } error]} then {
16c30 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
16c40 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 65 20       # NOTE: We 
16c50 73 6f 6d 65 68 6f 77 20 66 61 69 6c 65 64 20 74  somehow failed t
16c60 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 68 61 6e  o remove the han
16c70 64 6c 65 2c 20 72 65 70 6f 72 74 20 77 68 79 2e  dle, report why.
16c80 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
16c90 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
16ca0 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
16cb0 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
16cc0 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e        "==== WARN
16cd0 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 72  ING: failed to r
16ce0 65 6d 6f 76 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  emove connection
16cf0 20 68 61 6e 64 6c 65 20 5c 22 22 20 24 63 6f 6e   handle \"" $con
16d00 6e 65 63 74 69 6f 6e 20 5c 0d 0a 20 20 20 20 20  nection \..     
16d10 20 20 20 20 20 20 20 22 5c 22 2c 20 65 72 72 6f         "\", erro
16d20 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72  r: " \n\t $error
16d30 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20   \n]..      }.. 
16d40 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
16d50 63 20 61 64 64 44 62 43 6f 6e 6e 65 63 74 69 6f  c addDbConnectio
16d60 6e 20 7b 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b  n { connection {
16d70 76 61 72 4e 61 6d 65 20 64 62 7d 20 7d 20 7b 0d  varName db} } {.
16d80 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
16d90 23 20 4e 4f 54 45 3a 20 52 65 66 65 72 20 74 6f  # NOTE: Refer to
16da0 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 76   the specified v
16db0 61 72 69 61 62 6c 65 20 28 65 2e 67 2e 20 22 64  ariable (e.g. "d
16dc0 62 22 29 20 69 6e 20 74 68 65 20 63 6f 6e 74 65  b") in the conte
16dd0 78 74 20 6f 66 20 6f 75 72 0d 0a 20 20 20 20 20  xt of our..     
16de0 20 23 20 20 20 20 20 20 20 63 61 6c 6c 65 72 2e   #       caller.
16df0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
16e00 20 75 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d   upvar 1 $varNam
16e10 65 20 64 62 0d 0a 0d 0a 20 20 20 20 20 20 23 0d  e db....      #.
16e20 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43  .      # NOTE: C
16e30 72 65 61 74 65 20 61 20 63 6f 72 72 65 63 74 6c  reate a correctl
16e40 79 20 66 6f 72 6d 61 74 74 65 64 20 6e 61 6d 65  y formatted name
16e50 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73   for the databas
16e60 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 0d  e connection to.
16e70 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62  .      #       b
16e80 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 6c  e added to the l
16e90 69 73 74 20 6d 61 6e 61 67 65 64 20 62 79 20 74  ist managed by t
16ea0 68 65 20 45 61 67 6c 65 20 69 6e 74 65 72 70 72  he Eagle interpr
16eb0 65 74 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  eter...      #..
16ec0 20 20 20 20 20 20 73 65 74 20 64 62 20 5b 6f 62        set db [ob
16ed0 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61  ject invoke -fla
16ee0 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d  gs +NonPublic \.
16ef0 0a 20 20 20 20 20 20 20 20 20 20 45 61 67 6c 65  .          Eagle
16f00 2e 5f 43 6f 6d 70 6f 6e 65 6e 74 73 2e 50 72 69  ._Components.Pri
16f10 76 61 74 65 2e 46 6f 72 6d 61 74 4f 70 73 20 44  vate.FormatOps D
16f20 61 74 61 62 61 73 65 4f 62 6a 65 63 74 4e 61 6d  atabaseObjectNam
16f30 65 20 24 63 6f 6e 6e 65 63 74 69 6f 6e 20 5c 0d  e $connection \.
16f40 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 69 74  .          SQLit
16f50 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 5b 6f 62 6a  eConnection [obj
16f60 65 63 74 20 69 6e 76 6f 6b 65 20 49 6e 74 65 72  ect invoke Inter
16f70 70 72 65 74 65 72 2e 47 65 74 41 63 74 69 76 65  preter.GetActive
16f80 20 4e 65 78 74 49 64 5d 5d 0d 0a 0d 0a 20 20 20   NextId]]....   
16f90 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
16fa0 54 45 3a 20 41 64 64 20 74 68 65 20 64 61 74 61  TE: Add the data
16fb0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
16fc0 70 72 6f 76 69 64 65 64 20 62 79 20 6f 75 72 20  provided by our 
16fd0 63 61 6c 6c 65 72 20 74 6f 20 74 68 65 20 6c 69  caller to the li
16fe0 73 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  st..      #     
16ff0 20 20 6f 66 20 74 68 6f 73 65 20 6b 6e 6f 77 6e    of those known
17000 20 74 6f 20 74 68 65 20 45 61 67 6c 65 20 69 6e   to the Eagle in
17010 74 65 72 70 72 65 74 65 72 2e 0d 0a 20 20 20 20  terpreter...    
17020 20 20 23 0d 0a 20 20 20 20 20 20 6f 62 6a 65 63    #..      objec
17030 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20  t invoke -flags 
17040 2b 4e 6f 6e 50 75 62 6c 69 63 20 49 6e 74 65 72  +NonPublic Inter
17050 70 72 65 74 65 72 2e 47 65 74 41 63 74 69 76 65  preter.GetActive
17060 2e 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 41 64 64  .connections Add
17070 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 24 64   \..          $d
17080 62 20 24 63 6f 6e 6e 65 63 74 69 6f 6e 0d 0a 20  b $connection.. 
17090 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
170a0 63 20 72 65 6d 6f 76 65 44 62 54 72 61 6e 73 61  c removeDbTransa
170b0 63 74 69 6f 6e 20 7b 20 74 72 61 6e 73 61 63 74  ction { transact
170c0 69 6f 6e 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23  ion } {..      #
170d0 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
170e0 52 65 6d 6f 76 65 20 74 68 65 20 64 61 74 61 62  Remove the datab
170f0 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ase transaction 
17100 70 72 6f 76 69 64 65 64 20 62 79 20 6f 75 72 20  provided by our 
17110 63 61 6c 6c 65 72 20 66 72 6f 6d 20 74 68 65 0d  caller from the.
17120 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6c  .      #       l
17130 69 73 74 20 6f 66 20 74 68 6f 73 65 20 6b 6e 6f  ist of those kno
17140 77 6e 20 74 6f 20 74 68 65 20 45 61 67 6c 65 20  wn to the Eagle 
17150 69 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a 20 20  interpreter...  
17160 20 20 20 20 23 0d 0a 20 20 20 20 20 20 6f 62 6a      #..      obj
17170 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67  ect invoke -flag
17180 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 49 6e 74  s +NonPublic Int
17190 65 72 70 72 65 74 65 72 2e 47 65 74 41 63 74 69  erpreter.GetActi
171a0 76 65 2e 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  ve.transactions 
171b0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 52 65 6d  \..          Rem
171c0 6f 76 65 20 24 74 72 61 6e 73 61 63 74 69 6f 6e  ove $transaction
171d0 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
171e0 70 72 6f 63 20 67 65 74 52 6f 77 73 46 72 6f 6d  proc getRowsFrom
171f0 44 61 74 61 54 61 62 6c 65 20 7b 20 64 61 74 61  DataTable { data
17200 54 61 62 6c 65 20 7b 76 61 6c 75 65 43 61 6c 6c  Table {valueCall
17210 62 61 63 6b 20 22 22 7d 20 7d 20 7b 0d 0a 20 20  back ""} } {..  
17220 20 20 20 20 73 65 74 20 72 6f 77 73 20 5b 6c 69      set rows [li
17230 73 74 5d 0d 0a 20 20 20 20 20 20 73 65 74 20 63  st]..      set c
17240 6f 75 6e 74 20 5b 24 64 61 74 61 54 61 62 6c 65  ount [$dataTable
17250 20 43 6f 6c 75 6d 6e 73 2e 43 6f 75 6e 74 5d 0d   Columns.Count].
17260 0a 0d 0a 20 20 20 20 20 20 66 6f 72 20 7b 73 65  ...      for {se
17270 74 20 69 6e 64 65 78 20 30 7d 20 7b 24 69 6e 64  t index 0} {$ind
17280 65 78 20 3c 20 24 63 6f 75 6e 74 7d 20 7b 69 6e  ex < $count} {in
17290 63 72 20 69 6e 64 65 78 7d 20 7b 0d 0a 20 20 20  cr index} {..   
172a0 20 20 20 20 20 73 65 74 20 64 61 74 61 43 6f 6c       set dataCol
172b0 75 6d 6e 20 5b 24 64 61 74 61 54 61 62 6c 65 20  umn [$dataTable 
172c0 2d 61 6c 69 61 73 20 43 6f 6c 75 6d 6e 73 2e 67  -alias Columns.g
172d0 65 74 5f 49 74 65 6d 20 24 69 6e 64 65 78 5d 0d  et_Item $index].
172e0 0a 20 20 20 20 20 20 20 20 73 65 74 20 6e 61 6d  .        set nam
172f0 65 73 28 24 69 6e 64 65 78 29 20 5b 24 64 61 74  es($index) [$dat
17300 61 43 6f 6c 75 6d 6e 20 43 6f 6c 75 6d 6e 4e 61  aColumn ColumnNa
17310 6d 65 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  me]..      }....
17320 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
17330 20 4e 4f 54 45 3a 20 53 65 74 75 70 20 73 6f 6d   NOTE: Setup som
17340 65 20 54 63 6c 20 72 65 74 75 72 6e 20 63 6f 64  e Tcl return cod
17350 65 20 63 6f 6e 73 74 61 6e 74 73 2e 0d 0a 20 20  e constants...  
17360 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74      #..      set
17370 20 4f 6b 20 30 3b 20 73 65 74 20 45 72 72 6f 72   Ok 0; set Error
17380 20 31 3b 20 73 65 74 20 52 65 74 75 72 6e 20 32   1; set Return 2
17390 3b 20 73 65 74 20 42 72 65 61 6b 20 33 3b 20 73  ; set Break 3; s
173a0 65 74 20 43 6f 6e 74 69 6e 75 65 20 34 0d 0a 0d  et Continue 4...
173b0 0a 20 20 20 20 20 20 6f 62 6a 65 63 74 20 66 6f  .      object fo
173c0 72 65 61 63 68 20 2d 61 6c 69 61 73 20 64 61 74  reach -alias dat
173d0 61 52 6f 77 20 5b 73 65 74 20 64 61 74 61 52 6f  aRow [set dataRo
173e0 77 73 20 5b 24 64 61 74 61 54 61 62 6c 65 20 52  ws [$dataTable R
173f0 6f 77 73 5d 5d 20 7b 0d 0a 20 20 20 20 20 20 20  ows]] {..       
17400 20 73 65 74 20 72 6f 77 20 5b 6c 69 73 74 5d 0d   set row [list].
17410 0a 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 20 7b  ...        for {
17420 73 65 74 20 69 6e 64 65 78 20 30 7d 20 7b 24 69  set index 0} {$i
17430 6e 64 65 78 20 3c 20 24 63 6f 75 6e 74 7d 20 7b  ndex < $count} {
17440 69 6e 63 72 20 69 6e 64 65 78 7d 20 7b 0d 0a 20  incr index} {.. 
17450 20 20 20 20 20 20 20 20 20 73 65 74 20 76 61 6c           set val
17460 75 65 20 5b 24 64 61 74 61 52 6f 77 20 2d 63 72  ue [$dataRow -cr
17470 65 61 74 65 20 2d 61 6c 69 61 73 20 67 65 74 5f  eate -alias get_
17480 49 74 65 6d 20 24 69 6e 64 65 78 5d 0d 0a 0d 0a  Item $index]....
17490 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73            if {[s
174a0 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 61  tring length $va
174b0 6c 75 65 43 61 6c 6c 62 61 63 6b 5d 20 3e 20 30  lueCallback] > 0
174c0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
174d0 20 20 20 20 20 20 73 65 74 20 63 6f 64 65 20 5b        set code [
174e0 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
174f0 20 20 20 20 20 20 20 24 76 61 6c 75 65 43 61 6c         $valueCal
17500 6c 62 61 63 6b 20 24 64 61 74 61 54 61 62 6c 65  lback $dataTable
17510 20 24 64 61 74 61 52 6f 77 20 24 69 6e 64 65 78   $dataRow $index
17520 20 24 76 61 6c 75 65 0d 0a 20 20 20 20 20 20 20   $value..       
17530 20 20 20 20 20 7d 20 6e 65 77 56 61 6c 75 65 5d       } newValue]
17540 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
17550 69 66 20 7b 24 63 6f 64 65 20 3d 3d 20 24 4f 6b  if {$code == $Ok
17560 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
17570 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
17580 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
17590 20 55 73 65 20 74 68 65 20 73 70 65 63 69 66 69   Use the specifi
175a0 65 64 20 28 6e 65 77 3f 29 20 72 6f 77 20 76 61  ed (new?) row va
175b0 6c 75 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  lue...          
175c0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
175d0 20 20 20 20 20 6c 61 70 70 65 6e 64 20 72 6f 77       lappend row
175e0 20 5b 6c 69 73 74 20 24 6e 61 6d 65 73 28 24 69   [list $names($i
175f0 6e 64 65 78 29 20 24 6e 65 77 56 61 6c 75 65 5d  ndex) $newValue]
17600 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20  ..            } 
17610 65 6c 73 65 69 66 20 7b 24 63 6f 64 65 20 3d 3d  elseif {$code ==
17620 20 24 45 72 72 6f 72 7d 20 74 68 65 6e 20 7b 0d   $Error} then {.
17630 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
17640 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
17650 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20  # NOTE: Use the 
17660 28 6e 65 77 3f 29 20 4e 55 4c 4c 20 72 6f 77 20  (new?) NULL row 
17670 76 61 6c 75 65 2e 0d 0a 20 20 20 20 20 20 20 20  value...        
17680 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
17690 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 72         lappend r
176a0 6f 77 20 5b 6c 69 73 74 20 24 6e 61 6d 65 73 28  ow [list $names(
176b0 24 69 6e 64 65 78 29 5d 0d 0a 20 20 20 20 20 20  $index)]..      
176c0 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b        } elseif {
176d0 24 63 6f 64 65 20 3d 3d 20 24 52 65 74 75 72 6e  $code == $Return
176e0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
176f0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
17700 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
17710 20 53 6b 69 70 20 72 65 6d 61 69 6e 69 6e 67 20   Skip remaining 
17720 76 61 6c 75 65 73 20 66 6f 72 20 74 68 69 73 20  values for this 
17730 72 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  row...          
17740 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
17750 20 20 20 20 20 62 72 65 61 6b 0d 0a 20 20 20 20       break..    
17760 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66          } elseif
17770 20 7b 24 63 6f 64 65 20 3d 3d 20 24 42 72 65 61   {$code == $Brea
17780 6b 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  k} then {..     
17790 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
177a0 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
177b0 3a 20 53 6b 69 70 20 70 72 6f 63 65 73 73 69 6e  : Skip processin
177c0 67 20 74 68 69 73 20 72 6f 77 20 76 61 6c 75 65  g this row value
177d0 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
177e0 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
177f0 7d 20 65 6c 73 65 69 66 20 7b 24 63 6f 64 65 20  } elseif {$code 
17800 3d 3d 20 24 43 6f 6e 74 69 6e 75 65 7d 20 74 68  == $Continue} th
17810 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
17820 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
17830 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65       # NOTE: Use
17840 20 64 65 66 61 75 6c 74 20 72 6f 77 20 76 61 6c   default row val
17850 75 65 20 68 61 6e 64 6c 69 6e 67 2e 0d 0a 20 20  ue handling...  
17860 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
17870 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
17880 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
17890 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65  ..            se
178a0 74 20 63 6f 64 65 20 24 43 6f 6e 74 69 6e 75 65  t code $Continue
178b0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d  ..          }...
178c0 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 24  .          if {$
178d0 63 6f 64 65 20 3d 3d 20 24 43 6f 6e 74 69 6e 75  code == $Continu
178e0 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  e} then {..     
178f0 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69         if {[stri
17900 6e 67 20 6c 65 6e 67 74 68 20 24 76 61 6c 75 65  ng length $value
17910 5d 20 3e 20 30 20 26 26 20 5c 0d 0a 20 20 20 20  ] > 0 && \..    
17920 20 20 20 20 20 20 20 20 20 20 20 20 21 5b 6f 62              ![ob
17930 6a 65 63 74 20 69 6e 76 6f 6b 65 20 43 6f 6e 76  ject invoke Conv
17940 65 72 74 20 49 73 44 42 4e 75 6c 6c 20 24 76 61  ert IsDBNull $va
17950 6c 75 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  lue]} then {..  
17960 20 20 20 20 20 20 20 20 20 20 20 20 6c 61 70 70              lapp
17970 65 6e 64 20 72 6f 77 20 5b 6c 69 73 74 20 24 6e  end row [list $n
17980 61 6d 65 73 28 24 69 6e 64 65 78 29 20 5b 24 76  ames($index) [$v
17990 61 6c 75 65 20 54 6f 53 74 72 69 6e 67 5d 5d 0d  alue ToString]].
179a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65  .            } e
179b0 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
179c0 20 20 20 20 20 6c 61 70 70 65 6e 64 20 72 6f 77       lappend row
179d0 20 5b 6c 69 73 74 20 24 6e 61 6d 65 73 28 24 69   [list $names($i
179e0 6e 64 65 78 29 5d 0d 0a 20 20 20 20 20 20 20 20  ndex)]..        
179f0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
17a00 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d   }..        }...
17a10 0a 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64  .        lappend
17a20 20 72 6f 77 73 20 24 72 6f 77 0d 0a 20 20 20 20   rows $row..    
17a30 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74    }....      ret
17a40 75 72 6e 20 24 72 6f 77 73 0d 0a 20 20 20 20 7d  urn $rows..    }
17a50 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 64 75  .....    proc du
17a60 6d 70 52 6f 77 73 46 72 6f 6d 44 61 74 61 54 61  mpRowsFromDataTa
17a70 62 6c 65 20 7b 20 63 68 61 6e 6e 65 6c 20 72 6f  ble { channel ro
17a80 77 73 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65  ws } {..      se
17a90 74 20 73 65 71 75 65 6e 63 65 20 31 0d 0a 0d 0a  t sequence 1....
17aa0 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f        foreach ro
17ab0 77 20 24 72 6f 77 73 20 7b 0d 0a 20 20 20 20 20  w $rows {..     
17ac0 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
17ad0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
17ae0 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 65 78  .            [ex
17af0 70 72 20 7b 24 73 65 71 75 65 6e 63 65 20 3e 20  pr {$sequence > 
17b00 31 20 3f 20 22 5c 6e 22 20 3a 20 22 22 7d 5d 20  1 ? "\n" : ""}] 
17b10 22 2d 2d 2d 2d 20 52 4f 57 20 23 22 20 24 73 65  "---- ROW #" $se
17b20 71 75 65 6e 63 65 20 3a 5c 6e 5d 0d 0a 0d 0a 20  quence :\n].... 
17b30 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 70         foreach p
17b40 61 69 72 20 24 72 6f 77 20 7b 0d 0a 20 20 20 20  air $row {..    
17b50 20 20 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67        if {[lleng
17b60 74 68 20 24 70 61 69 72 5d 20 3e 3d 20 32 7d 20  th $pair] >= 2} 
17b70 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
17b80 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
17b90 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
17ba0 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  t \..           
17bb0 20 20 20 20 20 5b 6c 69 73 74 20 5b 6c 69 6e 64       [list [lind
17bc0 65 78 20 24 70 61 69 72 20 30 5d 5d 20 22 3a 20  ex $pair 0]] ": 
17bd0 22 20 5b 6c 69 73 74 20 5b 6c 69 6e 64 65 78 20  " [list [lindex 
17be0 24 70 61 69 72 20 31 5d 5d 20 5c 6e 5d 0d 0a 20  $pair 1]] \n].. 
17bf0 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 69           } elsei
17c00 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 70 61 69  f {[llength $pai
17c10 72 5d 20 3d 3d 20 31 7d 20 74 68 65 6e 20 7b 0d  r] == 1} then {.
17c20 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
17c30 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
17c40 65 6e 64 41 72 67 73 20 5c 74 20 5c 0d 0a 20 20  endArgs \t \..  
17c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 6c                [l
17c60 69 73 74 20 5b 6c 69 6e 64 65 78 20 24 70 61 69  ist [lindex $pai
17c70 72 20 30 5d 5d 20 22 3a 20 3c 6e 75 6c 6c 3e 5c  r 0]] ": <null>\
17c80 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  n"]..          }
17c90 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
17ca0 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
17cb0 6e 65 6c 20 5c 74 3c 65 6d 70 74 79 3e 5c 6e 3b  nel \t<empty>\n;
17cc0 20 23 20 4e 4f 54 45 3a 20 4e 6f 20 64 61 74 61   # NOTE: No data
17cd0 3f 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ?..          }..
17ce0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
17cf0 20 20 20 20 20 69 6e 63 72 20 73 65 71 75 65 6e       incr sequen
17d00 63 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  ce..      }..   
17d10 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
17d20 63 6c 65 61 6e 75 70 44 62 20 7b 20 66 69 6c 65  cleanupDb { file
17d30 4e 61 6d 65 20 7b 76 61 72 4e 61 6d 65 20 64 62  Name {varName db
17d40 7d 20 7b 63 6f 6c 6c 65 63 74 20 74 72 75 65 7d  } {collect true}
17d50 20 7b 71 75 61 6c 69 66 79 20 74 72 75 65 7d 0d   {qualify true}.
17d60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17d70 20 20 20 20 20 20 7b 64 65 6c 65 74 65 20 74 72        {delete tr
17d80 75 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23  ue} } {..      #
17d90 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
17da0 41 74 74 65 6d 70 74 20 74 6f 20 66 6f 72 63 65  Attempt to force
17db0 20 61 6c 6c 20 70 65 6e 64 69 6e 67 20 22 67 61   all pending "ga
17dc0 72 62 61 67 65 22 20 6f 62 6a 65 63 74 73 20 74  rbage" objects t
17dd0 6f 20 62 65 20 63 6f 6c 6c 65 63 74 65 64 2c 0d  o be collected,.
17de0 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69  .      #       i
17df0 6e 63 6c 75 64 69 6e 67 20 53 51 4c 69 74 65 20  ncluding SQLite 
17e00 73 74 61 74 65 6d 65 6e 74 73 20 61 6e 64 20 62  statements and b
17e10 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 3b 20 74  ackup objects; t
17e20 68 69 73 20 73 68 6f 75 6c 64 20 61 6c 6c 6f 77  his should allow
17e30 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
17e40 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64  the underlying d
17e50 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
17e60 62 65 20 64 65 6c 65 74 65 64 2e 0d 0a 20 20 20  be deleted...   
17e70 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
17e80 24 63 6f 6c 6c 65 63 74 7d 20 74 68 65 6e 20 7b  $collect} then {
17e90 0d 0a 20 20 20 20 20 20 20 20 63 6f 6c 6c 65 63  ..        collec
17ea0 74 47 61 72 62 61 67 65 20 24 3a 3a 74 65 73 74  tGarbage $::test
17eb0 5f 63 68 61 6e 6e 65 6c 0d 0a 20 20 20 20 20 20  _channel..      
17ec0 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
17ed0 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 66 65      # NOTE: Refe
17ee0 72 20 74 6f 20 74 68 65 20 73 70 65 63 69 66 69  r to the specifi
17ef0 65 64 20 76 61 72 69 61 62 6c 65 20 28 65 2e 67  ed variable (e.g
17f00 2e 20 22 64 62 22 29 20 69 6e 20 74 68 65 20 63  . "db") in the c
17f10 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72 0d 0a 20  ontext of our.. 
17f20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 61 6c       #       cal
17f30 6c 65 72 2e 20 20 54 68 65 20 68 61 6e 64 6c 65  ler.  The handle
17f40 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
17f50 20 70 72 65 76 69 6f 75 73 6c 79 20 6f 70 65 6e   previously open
17f60 65 64 20 76 69 61 20 74 68 65 0d 0a 20 20 20 20  ed via the..    
17f70 20 20 23 20 20 20 20 20 20 20 5b 73 65 74 75 70    #       [setup
17f80 44 62 5d 20 70 72 6f 63 65 64 75 72 65 20 73 68  Db] procedure sh
17f90 6f 75 6c 64 20 62 65 20 73 74 6f 72 65 64 20 74  ould be stored t
17fa0 68 65 72 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  here...      #..
17fb0 20 20 20 20 20 20 75 70 76 61 72 20 31 20 24 76        upvar 1 $v
17fc0 61 72 4e 61 6d 65 20 64 62 0d 0a 0d 0a 20 20 20  arName db....   
17fd0 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
17fe0 54 45 3a 20 43 6c 6f 73 65 20 74 68 65 20 63 6f  TE: Close the co
17ff0 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 74 68 65 20  nnection to the 
18000 64 61 74 61 62 61 73 65 20 6e 6f 77 2e 20 20 54  database now.  T
18010 68 69 73 20 73 68 6f 75 6c 64 20 61 6c 6c 6f 77  his should allow
18020 20 75 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20   us..      #    
18030 20 20 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65     to delete the
18040 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61   underlying data
18050 62 61 73 65 20 66 69 6c 65 2e 0d 0a 20 20 20 20  base file...    
18060 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
18070 69 6e 66 6f 20 65 78 69 73 74 73 20 64 62 5d 20  info exists db] 
18080 26 26 20 5b 63 61 74 63 68 20 7b 73 71 6c 20 63  && [catch {sql c
18090 6c 6f 73 65 20 24 64 62 7d 20 65 72 72 6f 72 5d  lose $db} error]
180a0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
180b0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
180c0 4f 54 45 3a 20 57 65 20 73 6f 6d 65 68 6f 77 20  OTE: We somehow 
180d0 66 61 69 6c 65 64 20 74 6f 20 63 6c 6f 73 65 20  failed to close 
180e0 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 72 65  the database, re
180f0 70 6f 72 74 20 77 68 79 2e 0d 0a 20 20 20 20 20  port why...     
18100 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70     #..        tp
18110 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
18120 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
18130 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  \..            "
18140 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61  ==== WARNING: fa
18150 69 6c 65 64 20 74 6f 20 63 6c 6f 73 65 20 64 61  iled to close da
18160 74 61 62 61 73 65 20 5c 22 22 20 24 64 62 20 22  tabase \"" $db "
18170 5c 22 2c 20 65 72 72 6f 72 3a 20 22 20 5c 0d 0a  \", error: " \..
18180 20 20 20 20 20 20 20 20 20 20 20 20 5c 6e 5c 74              \n\t
18190 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20   $error \n]..   
181a0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
181b0 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46  .      # NOTE: F
181c0 69 72 73 74 2c 20 73 65 65 20 69 66 20 6f 75 72  irst, see if our
181d0 20 63 61 6c 6c 65 72 20 68 61 73 20 72 65 71 75   caller has requ
181e0 65 73 74 65 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f  ested an in-memo
181f0 72 79 20 64 61 74 61 62 61 73 65 2e 0d 0a 20 20  ry database...  
18200 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74      #..      set
18210 20 69 73 4d 65 6d 6f 72 79 20 5b 69 73 4d 65 6d   isMemory [isMem
18220 6f 72 79 44 62 20 24 66 69 6c 65 4e 61 6d 65 5d  oryDb $fileName]
18230 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
18240 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64     # NOTE: Build
18250 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 20 74   the full path t
18260 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
18270 69 6c 65 20 6e 61 6d 65 2e 20 20 46 6f 72 20 6e  ile name.  For n
18280 6f 77 2c 20 61 6c 6c 20 74 65 73 74 0d 0a 20 20  ow, all test..  
18290 20 20 20 20 23 20 20 20 20 20 20 20 64 61 74 61      #       data
182a0 62 61 73 65 20 66 69 6c 65 73 20 61 72 65 20 73  base files are s
182b0 74 6f 72 65 64 20 69 6e 20 74 68 65 20 74 65 6d  tored in the tem
182c0 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72 79  porary directory
182d0 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
182e0 20 20 69 66 20 7b 21 24 69 73 4d 65 6d 6f 72 79    if {!$isMemory
182f0 20 26 26 20 24 71 75 61 6c 69 66 79 7d 20 74 68   && $qualify} th
18300 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65  en {..        se
18310 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65  t fileName [file
18320 20 6a 6f 69 6e 20 5b 67 65 74 44 61 74 61 62 61   join [getDataba
18330 73 65 44 69 72 65 63 74 6f 72 79 5d 20 5b 66 69  seDirectory] [fi
18340 6c 65 20 74 61 69 6c 20 24 66 69 6c 65 4e 61 6d  le tail $fileNam
18350 65 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  e]]..      }....
18360 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
18370 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20   NOTE: Check if 
18380 74 68 65 20 66 69 6c 65 20 73 74 69 6c 6c 20 65  the file still e
18390 78 69 73 74 73 2e 0d 0a 20 20 20 20 20 20 23 0d  xists...      #.
183a0 0a 20 20 20 20 20 20 69 66 20 7b 21 24 69 73 4d  .      if {!$isM
183b0 65 6d 6f 72 79 20 26 26 20 24 64 65 6c 65 74 65  emory && $delete
183c0 20 26 26 20 5b 66 69 6c 65 20 65 78 69 73 74 73   && [file exists
183d0 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65   $fileName]} the
183e0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
183f0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
18400 53 6b 69 70 20 64 65 6c 65 74 69 6e 67 20 64 61  Skip deleting da
18410 74 61 62 61 73 65 20 66 69 6c 65 73 20 69 66 20  tabase files if 
18420 73 6f 6d 65 62 6f 64 79 20 73 65 74 73 20 74 68  somebody sets th
18430 65 20 67 6c 6f 62 61 6c 0d 0a 20 20 20 20 20 20  e global..      
18440 20 20 23 20 20 20 20 20 20 20 76 61 72 69 61 62    #       variab
18450 6c 65 20 74 6f 20 70 72 65 76 65 6e 74 20 69 74  le to prevent it
18460 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
18470 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
18480 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6c 65   exists ::no(cle
18490 61 6e 75 70 44 62 46 69 6c 65 29 5d 7d 20 74 68  anupDbFile)]} th
184a0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
184b0 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e  #..          # N
184c0 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20  OTE: Attempt to 
184d0 64 65 6c 65 74 65 20 74 68 65 20 74 65 73 74 20  delete the test 
184e0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 6f  database file no
184f0 77 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  w...          #.
18500 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b  .          if {[
18510 73 65 74 20 63 6f 64 65 20 5b 63 61 74 63 68 20  set code [catch 
18520 7b 66 69 6c 65 20 64 65 6c 65 74 65 20 24 66 69  {file delete $fi
18530 6c 65 4e 61 6d 65 7d 20 65 72 72 6f 72 5d 5d 7d  leName} error]]}
18540 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
18550 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
18560 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 73      # NOTE: We s
18570 6f 6d 65 68 6f 77 20 66 61 69 6c 65 64 20 74 6f  omehow failed to
18580 20 64 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65   delete the file
18590 2c 20 72 65 70 6f 72 74 20 77 68 79 2e 0d 0a 20  , report why... 
185a0 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
185b0 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
185c0 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
185d0 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
185e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
185f0 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61  ==== WARNING: fa
18600 69 6c 65 64 20 74 6f 20 64 65 6c 65 74 65 20 64  iled to delete d
18610 61 74 61 62 61 73 65 20 66 69 6c 65 20 5c 22 22  atabase file \""
18620 20 24 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20   $fileName \..  
18630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 5c                "\
18640 22 20 64 75 72 69 6e 67 20 63 6c 65 61 6e 75 70  " during cleanup
18650 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20  , error: " \n\t 
18660 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20  $error \n]..    
18670 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
18680 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
18690 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
186a0 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20 74    # NOTE: Show t
186b0 68 61 74 20 77 65 20 73 6b 69 70 70 65 64 20 64  hat we skipped d
186c0 65 6c 65 74 69 6e 67 20 74 68 65 20 66 69 6c 65  eleting the file
186d0 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
186e0 20 20 20 20 20 20 20 20 20 20 73 65 74 20 63 6f            set co
186f0 64 65 20 30 0d 0a 0d 0a 20 20 20 20 20 20 20 20  de 0....        
18700 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
18710 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
18720 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
18730 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49       "==== WARNI
18740 4e 47 3a 20 73 6b 69 70 70 65 64 20 64 65 6c 65  NG: skipped dele
18750 74 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69  ting database fi
18760 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65  le \"" $fileName
18770 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
18780 20 20 22 5c 22 20 64 75 72 69 6e 67 20 63 6c 65    "\" during cle
18790 61 6e 75 70 5c 6e 22 5d 0d 0a 20 20 20 20 20 20  anup\n"]..      
187a0 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73    }..      } els
187b0 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  e {..        #..
187c0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
187d0 54 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  The file does no
187e0 74 20 65 78 69 73 74 2c 20 73 75 63 63 65 73 73  t exist, success
187f0 21 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  !..        #..  
18800 20 20 20 20 20 20 73 65 74 20 63 6f 64 65 20 30        set code 0
18810 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
18820 20 20 20 72 65 74 75 72 6e 20 24 63 6f 64 65 0d     return $code.
18830 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
18840 72 6f 63 20 73 61 76 65 45 6e 76 69 72 6f 6e 6d  roc saveEnvironm
18850 65 6e 74 56 61 72 69 61 62 6c 65 73 20 7b 20 6e  entVariables { n
18860 61 6d 65 73 20 7b 76 61 72 4e 61 6d 65 20 22 22  ames {varName ""
18870 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a  } } {..      #..
18880 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 6f        # NOTE: Fo
18890 72 20 65 61 63 68 20 6e 61 6d 65 2c 20 64 6f 65  r each name, doe
188a0 73 20 74 68 65 20 6c 69 76 65 20 65 6e 76 69 72  s the live envir
188b0 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 20  onment variable 
188c0 65 78 69 73 74 3f 20 20 49 66 0d 0a 20 20 20 20  exist?  If..    
188d0 20 20 23 20 20 20 20 20 20 20 73 6f 2c 20 73 61    #       so, sa
188e0 76 65 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72  ve the value for
188f0 20 6c 61 74 65 72 3b 20 6f 74 68 65 72 77 69 73   later; otherwis
18900 65 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  e, make sure the
18910 20 73 61 76 65 64 0d 0a 20 20 20 20 20 20 23 20   saved..      # 
18920 20 20 20 20 20 20 76 61 6c 75 65 20 64 6f 65 73        value does
18930 20 6e 6f 74 20 65 78 69 73 74 20 65 69 74 68 65   not exist eithe
18940 72 2e 20 20 54 68 65 20 6c 69 76 65 20 65 6e 76  r.  The live env
18950 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c  ironment variabl
18960 65 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  es..      #     
18970 20 20 41 52 45 20 4e 4f 54 20 63 68 61 6e 67 65    ARE NOT change
18980 64 20 62 79 20 74 68 69 73 20 70 72 6f 63 65 64  d by this proced
18990 75 72 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ure...      #.. 
189a0 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
189b0 20 6c 65 6e 67 74 68 20 24 76 61 72 4e 61 6d 65   length $varName
189c0 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
189d0 20 20 20 20 20 20 20 20 73 65 74 20 76 61 72 4e          set varN
189e0 61 6d 65 20 73 61 76 65 64 45 6e 76 0d 0a 20 20  ame savedEnv..  
189f0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 75      }....      u
18a00 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65 20  pvar 1 $varName 
18a10 73 61 76 65 64 45 6e 76 0d 0a 0d 0a 20 20 20 20  savedEnv....    
18a20 20 20 66 6f 72 65 61 63 68 20 6e 61 6d 65 20 24    foreach name $
18a30 6e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20  names {..       
18a40 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
18a50 73 20 3a 3a 65 6e 76 28 24 6e 61 6d 65 29 5d 7d  s ::env($name)]}
18a60 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
18a70 20 20 20 73 65 74 20 73 61 76 65 64 45 6e 76 28     set savedEnv(
18a80 24 6e 61 6d 65 29 20 24 3a 3a 65 6e 76 28 24 6e  $name) $::env($n
18a90 61 6d 65 29 0d 0a 20 20 20 20 20 20 20 20 7d 20  ame)..        } 
18aa0 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
18ab0 20 20 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c    unset -nocompl
18ac0 61 69 6e 20 73 61 76 65 64 45 6e 76 28 24 6e 61  ain savedEnv($na
18ad0 6d 65 29 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  me)..        }..
18ae0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
18af0 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
18b00 3a 20 54 68 69 73 20 69 73 20 73 65 6c 66 2d 63  : This is self-c
18b10 6c 65 61 6e 69 6e 67 2e 20 20 49 66 20 6e 6f 20  leaning.  If no 
18b20 73 61 76 65 64 20 65 6e 76 69 72 6f 6e 6d 65 6e  saved environmen
18b30 74 20 76 61 72 69 61 62 6c 65 73 20 6e 6f 77 0d  t variables now.
18b40 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 65  .      #       e
18b50 78 69 73 74 2c 20 72 65 6d 6f 76 65 20 74 68 65  xist, remove the
18b60 20 61 72 72 61 79 2e 0d 0a 20 20 20 20 20 20 23   array...      #
18b70 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 61 72 72  ..      if {[arr
18b80 61 79 20 73 69 7a 65 20 73 61 76 65 64 45 6e 76  ay size savedEnv
18b90 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
18ba0 20 20 20 20 20 20 20 20 75 6e 73 65 74 20 2d 6e          unset -n
18bb0 6f 63 6f 6d 70 6c 61 69 6e 20 73 61 76 65 64 45  ocomplain savedE
18bc0 6e 76 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  nv..      }..   
18bd0 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
18be0 72 65 73 74 6f 72 65 45 6e 76 69 72 6f 6e 6d 65  restoreEnvironme
18bf0 6e 74 56 61 72 69 61 62 6c 65 73 20 7b 20 6e 61  ntVariables { na
18c00 6d 65 73 20 7b 76 61 72 4e 61 6d 65 20 22 22 7d  mes {varName ""}
18c10 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20   } {..      #.. 
18c20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 6f 72       # NOTE: For
18c30 20 65 61 63 68 20 6e 61 6d 65 2c 20 64 6f 65 73   each name, does
18c40 20 74 68 65 20 73 61 76 65 64 20 65 6e 76 69 72   the saved envir
18c50 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 20  onment variable 
18c60 65 78 69 73 74 3f 20 20 49 66 0d 0a 20 20 20 20  exist?  If..    
18c70 20 20 23 20 20 20 20 20 20 20 73 6f 2c 20 72 65    #       so, re
18c80 73 74 6f 72 65 20 74 68 65 20 73 61 76 65 64 20  store the saved 
18c90 76 61 6c 75 65 20 61 6e 64 20 75 6e 73 65 74 20  value and unset 
18ca0 69 74 3b 20 6f 74 68 65 72 77 69 73 65 2c 20 6d  it; otherwise, m
18cb0 61 6b 65 20 73 75 72 65 0d 0a 20 20 20 20 20 20  ake sure..      
18cc0 23 20 20 20 20 20 20 20 74 68 65 20 6c 69 76 65  #       the live
18cd0 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72   environment var
18ce0 69 61 62 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65  iable does not e
18cf0 78 69 73 74 20 65 69 74 68 65 72 20 28 69 2e 65  xist either (i.e
18d00 2e 20 69 74 0d 0a 20 20 20 20 20 20 23 20 20 20  . it..      #   
18d10 20 20 20 20 77 61 73 20 6e 6f 74 20 73 65 74 20      was not set 
18d20 74 6f 20 62 65 67 69 6e 20 77 69 74 68 29 2e 20  to begin with). 
18d30 20 42 6f 74 68 20 73 61 76 65 64 20 61 6e 64 20   Both saved and 
18d40 6c 69 76 65 20 65 6e 76 69 72 6f 6e 6d 65 6e 74  live environment
18d50 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
18d60 76 61 72 69 61 62 6c 65 73 20 41 52 45 20 63 68  variables ARE ch
18d70 61 6e 67 65 64 20 62 79 20 74 68 69 73 20 70 72  anged by this pr
18d80 6f 63 65 64 75 72 65 2e 0d 0a 20 20 20 20 20 20  ocedure...      
18d90 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74  #..      if {[st
18da0 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 61 72  ring length $var
18db0 4e 61 6d 65 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  Name] == 0} then
18dc0 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   {..        set 
18dd0 76 61 72 4e 61 6d 65 20 73 61 76 65 64 45 6e 76  varName savedEnv
18de0 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
18df0 20 20 20 75 70 76 61 72 20 31 20 24 76 61 72 4e     upvar 1 $varN
18e00 61 6d 65 20 73 61 76 65 64 45 6e 76 0d 0a 0d 0a  ame savedEnv....
18e10 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 6e 61        foreach na
18e20 6d 65 20 24 6e 61 6d 65 73 20 7b 0d 0a 20 20 20  me $names {..   
18e30 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65       if {[info e
18e40 78 69 73 74 73 20 73 61 76 65 64 45 6e 76 28 24  xists savedEnv($
18e50 6e 61 6d 65 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  name)]} then {..
18e60 20 20 20 20 20 20 20 20 20 20 73 65 74 20 3a 3a            set ::
18e70 65 6e 76 28 24 6e 61 6d 65 29 20 24 73 61 76 65  env($name) $save
18e80 64 45 6e 76 28 24 6e 61 6d 65 29 0d 0a 20 20 20  dEnv($name)..   
18e90 20 20 20 20 20 20 20 75 6e 73 65 74 20 2d 6e 6f         unset -no
18ea0 63 6f 6d 70 6c 61 69 6e 20 73 61 76 65 64 45 6e  complain savedEn
18eb0 76 28 24 6e 61 6d 65 29 0d 0a 20 20 20 20 20 20  v($name)..      
18ec0 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
18ed0 20 20 20 20 20 20 75 6e 73 65 74 20 2d 6e 6f 63        unset -noc
18ee0 6f 6d 70 6c 61 69 6e 20 3a 3a 65 6e 76 28 24 6e  omplain ::env($n
18ef0 61 6d 65 29 0d 0a 20 20 20 20 20 20 20 20 7d 0d  ame)..        }.
18f00 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
18f10 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
18f20 45 3a 20 54 68 69 73 20 69 73 20 73 65 6c 66 2d  E: This is self-
18f30 63 6c 65 61 6e 69 6e 67 2e 20 20 49 66 20 6e 6f  cleaning.  If no
18f40 20 73 61 76 65 64 20 65 6e 76 69 72 6f 6e 6d 65   saved environme
18f50 6e 74 20 76 61 72 69 61 62 6c 65 73 20 6e 6f 77  nt variables now
18f60 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
18f70 65 78 69 73 74 2c 20 72 65 6d 6f 76 65 20 74 68  exist, remove th
18f80 65 20 61 72 72 61 79 2e 0d 0a 20 20 20 20 20 20  e array...      
18f90 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 61 72  #..      if {[ar
18fa0 72 61 79 20 73 69 7a 65 20 73 61 76 65 64 45 6e  ray size savedEn
18fb0 76 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  v] == 0} then {.
18fc0 0a 20 20 20 20 20 20 20 20 75 6e 73 65 74 20 2d  .        unset -
18fd0 6e 6f 63 6f 6d 70 6c 61 69 6e 20 73 61 76 65 64  nocomplain saved
18fe0 45 6e 76 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  Env..      }..  
18ff0 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
19000 20 73 61 76 65 47 65 74 53 65 74 74 69 6e 67 56   saveGetSettingV
19010 61 6c 75 65 45 6e 76 69 72 6f 6e 6d 65 6e 74 20  alueEnvironment 
19020 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 75 70 76 61  {} {..      upva
19030 72 20 31 20 73 61 76 65 64 45 6e 76 20 73 61 76  r 1 savedEnv sav
19040 65 64 45 6e 76 0d 0a 0d 0a 20 20 20 20 20 20 73  edEnv....      s
19050 61 76 65 45 6e 76 69 72 6f 6e 6d 65 6e 74 56 61  aveEnvironmentVa
19060 72 69 61 62 6c 65 73 20 5b 6c 69 73 74 20 5c 0d  riables [list \.
19070 0a 20 20 20 20 20 20 20 20 20 20 4e 6f 5f 45 78  .          No_Ex
19080 70 61 6e 64 20 4e 6f 5f 53 51 4c 69 74 65 47 65  pand No_SQLiteGe
19090 74 53 65 74 74 69 6e 67 56 61 6c 75 65 20 4e 6f  tSettingValue No
190a0 5f 53 51 4c 69 74 65 58 6d 6c 43 6f 6e 66 69 67  _SQLiteXmlConfig
190b0 46 69 6c 65 5d 20 5c 0d 0a 20 20 20 20 20 20 20  File] \..       
190c0 20 20 20 73 61 76 65 64 45 6e 76 0d 0a 20 20 20     savedEnv..   
190d0 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
190e0 72 65 73 74 6f 72 65 47 65 74 53 65 74 74 69 6e  restoreGetSettin
190f0 67 56 61 6c 75 65 45 6e 76 69 72 6f 6e 6d 65 6e  gValueEnvironmen
19100 74 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 75 70  t {} {..      up
19110 76 61 72 20 31 20 73 61 76 65 64 45 6e 76 20 73  var 1 savedEnv s
19120 61 76 65 64 45 6e 76 0d 0a 0d 0a 20 20 20 20 20  avedEnv....     
19130 20 72 65 73 74 6f 72 65 45 6e 76 69 72 6f 6e 6d   restoreEnvironm
19140 65 6e 74 56 61 72 69 61 62 6c 65 73 20 5b 6c 69  entVariables [li
19150 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  st \..          
19160 4e 6f 5f 45 78 70 61 6e 64 20 4e 6f 5f 53 51 4c  No_Expand No_SQL
19170 69 74 65 47 65 74 53 65 74 74 69 6e 67 56 61 6c  iteGetSettingVal
19180 75 65 20 4e 6f 5f 53 51 4c 69 74 65 58 6d 6c 43  ue No_SQLiteXmlC
19190 6f 6e 66 69 67 46 69 6c 65 5d 20 5c 0d 0a 20 20  onfigFile] \..  
191a0 20 20 20 20 20 20 20 20 73 61 76 65 64 45 6e 76          savedEnv
191b0 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
191c0 70 72 6f 63 20 73 61 76 65 53 51 4c 69 74 65 43  proc saveSQLiteC
191d0 6f 6e 6e 65 63 74 69 6f 6e 45 6e 76 69 72 6f 6e  onnectionEnviron
191e0 6d 65 6e 74 20 7b 7d 20 7b 0d 0a 20 20 20 20 20  ment {} {..     
191f0 20 75 70 76 61 72 20 31 20 73 61 76 65 64 45 6e   upvar 1 savedEn
19200 76 20 73 61 76 65 64 45 6e 76 0d 0a 0d 0a 20 20  v savedEnv....  
19210 20 20 20 20 73 61 76 65 45 6e 76 69 72 6f 6e 6d      saveEnvironm
19220 65 6e 74 56 61 72 69 61 62 6c 65 73 20 5b 6c 69  entVariables [li
19230 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  st \..          
19240 44 65 66 61 75 6c 74 46 6c 61 67 73 5f 53 51 4c  DefaultFlags_SQL
19250 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 4e 6f  iteConnection No
19260 5f 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f  _SQLiteConnectio
19270 6e 4e 65 77 50 61 72 73 65 72 5d 20 5c 0d 0a 20  nNewParser] \.. 
19280 20 20 20 20 20 20 20 20 20 73 61 76 65 64 45 6e           savedEn
19290 76 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  v..    }.....   
192a0 20 70 72 6f 63 20 72 65 73 74 6f 72 65 53 51 4c   proc restoreSQL
192b0 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 45 6e 76  iteConnectionEnv
192c0 69 72 6f 6e 6d 65 6e 74 20 7b 7d 20 7b 0d 0a 20  ironment {} {.. 
192d0 20 20 20 20 20 75 70 76 61 72 20 31 20 73 61 76       upvar 1 sav
192e0 65 64 45 6e 76 20 73 61 76 65 64 45 6e 76 0d 0a  edEnv savedEnv..
192f0 0d 0a 20 20 20 20 20 20 72 65 73 74 6f 72 65 45  ..      restoreE
19300 6e 76 69 72 6f 6e 6d 65 6e 74 56 61 72 69 61 62  nvironmentVariab
19310 6c 65 73 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20  les [list \..   
19320 20 20 20 20 20 20 20 44 65 66 61 75 6c 74 46 6c         DefaultFl
19330 61 67 73 5f 53 51 4c 69 74 65 43 6f 6e 6e 65 63  ags_SQLiteConnec
19340 74 69 6f 6e 20 4e 6f 5f 53 51 4c 69 74 65 43 6f  tion No_SQLiteCo
19350 6e 6e 65 63 74 69 6f 6e 4e 65 77 50 61 72 73 65  nnectionNewParse
19360 72 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  r] \..          
19370 73 61 76 65 64 45 6e 76 0d 0a 20 20 20 20 7d 0d  savedEnv..    }.
19380 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 73 61 76  ....    proc sav
19390 65 53 51 4c 69 74 65 43 6f 6e 76 65 72 74 45 6e  eSQLiteConvertEn
193a0 76 69 72 6f 6e 6d 65 6e 74 20 7b 7d 20 7b 0d 0a  vironment {} {..
193b0 20 20 20 20 20 20 75 70 76 61 72 20 31 20 73 61        upvar 1 sa
193c0 76 65 64 45 6e 76 20 73 61 76 65 64 45 6e 76 0d  vedEnv savedEnv.
193d0 0a 0d 0a 20 20 20 20 20 20 73 61 76 65 45 6e 76  ...      saveEnv
193e0 69 72 6f 6e 6d 65 6e 74 56 61 72 69 61 62 6c 65  ironmentVariable
193f0 73 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20  s [list \..     
19400 20 20 20 20 20 55 73 65 5f 53 51 4c 69 74 65 43       Use_SQLiteC
19410 6f 6e 76 65 72 74 5f 44 65 66 61 75 6c 74 44 62  onvert_DefaultDb
19420 54 79 70 65 20 55 73 65 5f 53 51 4c 69 74 65 43  Type Use_SQLiteC
19430 6f 6e 76 65 72 74 5f 44 65 66 61 75 6c 74 54 79  onvert_DefaultTy
19440 70 65 4e 61 6d 65 5d 20 5c 0d 0a 20 20 20 20 20  peName] \..     
19450 20 20 20 20 20 73 61 76 65 64 45 6e 76 0d 0a 20       savedEnv.. 
19460 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
19470 63 20 72 65 73 74 6f 72 65 53 51 4c 69 74 65 43  c restoreSQLiteC
19480 6f 6e 76 65 72 74 45 6e 76 69 72 6f 6e 6d 65 6e  onvertEnvironmen
19490 74 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 75 70  t {} {..      up
194a0 76 61 72 20 31 20 73 61 76 65 64 45 6e 76 20 73  var 1 savedEnv s
194b0 61 76 65 64 45 6e 76 0d 0a 0d 0a 20 20 20 20 20  avedEnv....     
194c0 20 72 65 73 74 6f 72 65 45 6e 76 69 72 6f 6e 6d   restoreEnvironm
194d0 65 6e 74 56 61 72 69 61 62 6c 65 73 20 5b 6c 69  entVariables [li
194e0 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  st \..          
194f0 55 73 65 5f 53 51 4c 69 74 65 43 6f 6e 76 65 72  Use_SQLiteConver
19500 74 5f 44 65 66 61 75 6c 74 44 62 54 79 70 65 20  t_DefaultDbType 
19510 55 73 65 5f 53 51 4c 69 74 65 43 6f 6e 76 65 72  Use_SQLiteConver
19520 74 5f 44 65 66 61 75 6c 74 54 79 70 65 4e 61 6d  t_DefaultTypeNam
19530 65 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  e] \..          
19540 73 61 76 65 64 45 6e 76 0d 0a 20 20 20 20 7d 0d  savedEnv..    }.
19550 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 73 65 74  ....    proc set
19560 75 70 44 62 49 6e 74 65 72 72 75 70 74 43 61 6c  upDbInterruptCal
19570 6c 62 61 63 6b 20 7b 20 63 68 61 6e 6e 65 6c 20  lback { channel 
19580 6c 6f 67 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74  log } {..      t
19590 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d  puts $channel "-
195a0 2d 2d 2d 20 73 65 74 74 69 6e 67 20 75 70 20 64  --- setting up d
195b0 65 62 75 67 67 65 72 20 69 6e 74 65 72 72 75 70  ebugger interrup
195c0 74 20 63 61 6c 6c 62 61 63 6b 2e 2e 2e 20 22 0d  t callback... ".
195d0 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61  ...      if {[ca
195e0 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 73  tch {..        s
195f0 61 76 65 45 6e 76 69 72 6f 6e 6d 65 6e 74 56 61  aveEnvironmentVa
19600 72 69 61 62 6c 65 73 20 5b 6c 69 73 74 20 5c 0d  riables [list \.
19610 0a 20 20 20 20 20 20 20 20 20 20 20 20 71 75 69  .            qui
19620 65 74 46 69 6e 64 49 6e 74 65 72 70 72 65 74 65  etFindInterprete
19630 72 54 65 73 74 50 61 74 68 20 71 75 69 65 74 53  rTestPath quietS
19640 65 74 75 70 49 6e 74 65 72 70 72 65 74 65 72 54  etupInterpreterT
19650 65 73 74 50 61 74 68 5d 0d 0a 0d 0a 20 20 20 20  estPath]....    
19660 20 20 20 20 74 72 79 20 7b 0d 0a 20 20 20 20 20      try {..     
19670 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
19680 20 20 23 20 4e 4f 54 45 3a 20 50 72 65 76 65 6e    # NOTE: Preven
19690 74 20 74 68 65 20 76 65 6e 64 6f 72 20 73 63 72  t the vendor scr
196a0 69 70 74 20 66 72 6f 6d 20 62 65 69 6e 67 20 6e  ipt from being n
196b0 6f 69 73 79 20 77 68 65 6e 20 63 72 65 61 74 69  oisy when creati
196c0 6e 67 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20  ng..          # 
196d0 20 20 20 20 20 20 74 68 65 20 69 73 6f 6c 61 74        the isolat
196e0 65 64 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0d  ed interpreter..
196f0 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
19700 20 20 20 20 20 20 20 20 73 65 74 20 3a 3a 65 6e          set ::en
19710 76 28 71 75 69 65 74 46 69 6e 64 49 6e 74 65 72  v(quietFindInter
19720 70 72 65 74 65 72 54 65 73 74 50 61 74 68 29 20  preterTestPath) 
19730 31 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  1..          set
19740 20 3a 3a 65 6e 76 28 71 75 69 65 74 53 65 74 75   ::env(quietSetu
19750 70 49 6e 74 65 72 70 72 65 74 65 72 54 65 73 74  pInterpreterTest
19760 50 61 74 68 29 20 31 0d 0a 0d 0a 20 20 20 20 20  Path) 1....     
19770 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
19780 20 20 23 20 4e 4f 54 45 3a 20 4d 61 6b 65 20 73    # NOTE: Make s
19790 75 72 65 20 74 68 65 20 73 63 72 69 70 74 20 64  ure the script d
197a0 65 62 75 67 67 65 72 20 61 6e 64 20 74 68 65 20  ebugger and the 
197b0 69 73 6f 6c 61 74 65 64 20 69 6e 74 65 72 70 72  isolated interpr
197c0 65 74 65 72 0d 0a 20 20 20 20 20 20 20 20 20 20  eter..          
197d0 23 20 20 20 20 20 20 20 61 72 65 20 73 65 74 75  #       are setu
197e0 70 20 61 6e 64 20 72 65 61 64 79 20 66 6f 72 20  p and ready for 
197f0 75 73 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  use...          
19800 23 0d 0a 20 20 20 20 20 20 20 20 20 20 64 65 62  #..          deb
19810 75 67 20 73 65 74 75 70 20 74 72 75 65 20 74 72  ug setup true tr
19820 75 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  ue....          
19830 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e  #..          # N
19840 4f 54 45 3a 20 4c 6f 61 64 20 74 68 65 20 6e 65  OTE: Load the ne
19850 63 65 73 73 61 72 79 20 70 61 63 6b 61 67 65 73  cessary packages
19860 20 69 6e 74 6f 20 74 68 65 20 69 73 6f 6c 61 74   into the isolat
19870 65 64 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0d  ed interpreter..
19880 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
19890 20 20 20 20 20 20 20 20 64 65 62 75 67 20 65 76          debug ev
198a0 61 6c 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  al {..          
198b0 20 20 70 61 63 6b 61 67 65 20 72 65 71 75 69 72    package requir
198c0 65 20 45 61 67 6c 65 0d 0a 20 20 20 20 20 20 20  e Eagle..       
198d0 20 20 20 20 20 70 61 63 6b 61 67 65 20 72 65 71       package req
198e0 75 69 72 65 20 45 61 67 6c 65 2e 4c 69 62 72 61  uire Eagle.Libra
198f0 72 79 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ry..            
19900 70 61 63 6b 61 67 65 20 72 65 71 75 69 72 65 20  package require 
19910 45 61 67 6c 65 2e 54 65 73 74 0d 0a 20 20 20 20  Eagle.Test..    
19920 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
19930 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
19940 20 20 23 20 4e 4f 54 45 3a 20 43 6f 70 79 20 74    # NOTE: Copy t
19950 68 65 20 6e 65 63 65 73 73 61 72 79 20 76 61 72  he necessary var
19960 69 61 62 6c 65 73 20 69 6e 74 6f 20 74 68 65 20  iables into the 
19970 69 73 6f 6c 61 74 65 64 20 69 6e 74 65 72 70 72  isolated interpr
19980 65 74 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 20  eter...         
19990 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 64 65   #..          de
199a0 62 75 67 20 69 6e 76 6f 6b 65 20 30 20 73 65 74  bug invoke 0 set
199b0 20 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20   ::test_channel 
199c0 24 63 68 61 6e 6e 65 6c 3b 20 23 20 4e 4f 54 45  $channel; # NOTE
199d0 3a 20 46 6f 72 20 5b 74 70 75 74 73 5d 2e 0d 0a  : For [tputs]...
199e0 20 20 20 20 20 20 20 20 20 20 64 65 62 75 67 20            debug 
199f0 69 6e 76 6f 6b 65 20 30 20 73 65 74 20 3a 3a 74  invoke 0 set ::t
19a00 65 73 74 5f 6c 6f 67 20 24 6c 6f 67 3b 20 23 20  est_log $log; # 
19a10 4e 4f 54 45 3a 20 46 6f 72 20 5b 74 6c 6f 67 5d  NOTE: For [tlog]
19a20 2e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23  .....          #
19a30 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
19a40 54 45 3a 20 49 6e 73 74 61 6c 6c 20 74 68 65 20  TE: Install the 
19a50 63 61 6c 6c 62 61 63 6b 20 73 63 72 69 70 74 20  callback script 
19a60 74 6f 20 62 65 20 65 76 61 6c 75 61 74 65 64 20  to be evaluated 
19a70 69 6e 20 74 68 65 20 69 73 6f 6c 61 74 65 64 0d  in the isolated.
19a80 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20  .          #    
19a90 20 20 20 69 6e 74 65 72 70 72 65 74 65 72 20 77     interpreter w
19aa0 68 65 6e 20 74 68 69 73 20 69 6e 74 65 72 70 72  hen this interpr
19ab0 65 74 65 72 20 69 73 20 69 6e 74 65 72 72 75 70  eter is interrup
19ac0 74 65 64 20 62 79 20 73 63 72 69 70 74 0d 0a 20  ted by script.. 
19ad0 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
19ae0 20 63 61 6e 63 65 6c 6c 61 74 69 6f 6e 2c 20 65   cancellation, e
19af0 74 63 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  tc...          #
19b00 0d 0a 20 20 20 20 20 20 20 20 20 20 64 65 62 75  ..          debu
19b10 67 20 63 61 6c 6c 62 61 63 6b 20 61 70 70 6c 79  g callback apply
19b20 20 7b 7b 73 65 6e 64 65 72 20 65 7d 20 7b 0d 0a   {{sender e} {..
19b30 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
19b40 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
19b50 45 3a 20 43 68 65 63 6b 20 69 66 20 74 68 69 73  E: Check if this
19b60 20 64 65 62 75 67 67 65 72 20 63 61 6c 6c 62 61   debugger callba
19b70 63 6b 20 69 73 20 6f 6e 65 20 74 68 61 74 20 77  ck is one that w
19b80 65 20 63 61 72 65 20 61 62 6f 75 74 2e 0d 0a 20  e care about... 
19b90 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
19ba0 20 20 20 20 20 20 20 20 20 20 73 65 74 20 69 6e            set in
19bb0 74 65 72 72 75 70 74 54 79 70 65 73 20 5b 73 70  terruptTypes [sp
19bc0 6c 69 74 20 5b 24 65 20 49 6e 74 65 72 72 75 70  lit [$e Interrup
19bd0 74 54 79 70 65 5d 20 22 2c 20 22 5d 0d 0a 0d 0a  tType] ", "]....
19be0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
19bf0 22 43 61 6e 63 65 6c 65 64 22 20 69 6e 20 24 69  "Canceled" in $i
19c00 6e 74 65 72 72 75 70 74 54 79 70 65 73 20 7c 7c  nterruptTypes ||
19c10 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
19c20 20 20 20 20 22 55 6e 77 6f 75 6e 64 22 20 69 6e      "Unwound" in
19c30 20 24 69 6e 74 65 72 72 75 70 74 54 79 70 65 73   $interruptTypes
19c40 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
19c50 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
19c60 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
19c70 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 5b   Make sure the [
19c80 6f 62 6a 65 63 74 5d 20 63 6f 6d 6d 61 6e 64 20  object] command 
19c90 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 53  is available.  S
19ca0 69 6e 63 65 0d 0a 20 20 20 20 20 20 20 20 20 20  ince..          
19cb0 20 20 20 20 23 20 20 20 20 20 20 20 74 68 69 73      #       this
19cc0 20 69 73 20 61 6e 20 69 73 6f 6c 61 74 65 64 20   is an isolated 
19cd0 69 6e 74 65 72 70 72 65 74 65 72 2c 20 63 68 65  interpreter, che
19ce0 63 6b 20 66 6f 72 20 69 74 20 74 68 65 20 68 61  ck for it the ha
19cf0 72 64 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  rd..            
19d00 20 20 23 20 20 20 20 20 20 20 77 61 79 2e 0d 0a    #       way...
19d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
19d20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
19d30 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 5b 69 6e 66  f {[llength [inf
19d40 6f 20 63 6f 6d 6d 61 6e 64 73 20 6f 62 6a 65 63  o commands objec
19d50 74 5d 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  t]] > 0} then {.
19d60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19d70 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
19d80 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 74 65 72      # NOTE: Iter
19d90 61 74 65 20 74 68 72 6f 75 67 68 20 61 6c 6c 20  ate through all 
19da0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
19db0 69 6f 6e 73 20 6b 6e 6f 77 6e 20 74 6f 20 74 68  ions known to th
19dc0 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e..             
19dd0 20 20 20 23 20 20 20 20 20 20 20 70 61 72 65 6e     #       paren
19de0 74 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a  t interpreter...
19df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e00 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  #..             
19e10 20 20 20 6f 62 6a 65 63 74 20 66 6f 72 65 61 63     object foreac
19e20 68 20 2d 61 6c 69 61 73 20 70 61 69 72 20 5b 6f  h -alias pair [o
19e30 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c  bject invoke -fl
19e40 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c  ags +NonPublic \
19e50 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
19e60 20 20 20 20 20 20 24 65 20 49 6e 74 65 72 70 72        $e Interpr
19e70 65 74 65 72 2e 63 6f 6e 6e 65 63 74 69 6f 6e 73  eter.connections
19e80 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ] {..           
19e90 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
19ea0 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f              # NO
19eb0 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 63  TE: Attempt to c
19ec0 61 6e 63 65 6c 20 61 6e 79 20 53 51 4c 20 71 75  ancel any SQL qu
19ed0 65 72 69 65 73 20 69 6e 20 70 72 6f 67 72 65 73  eries in progres
19ee0 73 20 6f 6e 0d 0a 20 20 20 20 20 20 20 20 20 20  s on..          
19ef0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
19f00 74 68 69 73 20 64 61 74 61 62 61 73 65 20 63 6f  this database co
19f10 6e 6e 65 63 74 69 6f 6e 2e 0d 0a 20 20 20 20 20  nnection...     
19f20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a               #..
19f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f40 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 24 70    if {[catch {$p
19f50 61 69 72 20 56 61 6c 75 65 2e 43 61 6e 63 65 6c  air Value.Cancel
19f60 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b  } error]} then {
19f70 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
19f80 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
19f90 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
19fa0 65 6e 64 41 72 67 73 20 5c 6e 20 5c 0d 0a 20 20  endArgs \n \..  
19fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19fc0 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e        "==== WARN
19fd0 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 63  ING: failed to c
19fe0 61 6e 63 65 6c 20 71 75 65 72 79 20 66 6f 72 20  ancel query for 
19ff0 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
1a000 20 20 20 20 20 20 20 20 20 20 20 20 20 22 63 6f               "co
1a010 6e 6e 65 63 74 69 6f 6e 20 5c 22 22 20 5b 24 70  nnection \"" [$p
1a020 61 69 72 20 4b 65 79 5d 20 22 5c 22 2c 20 65 72  air Key] "\", er
1a030 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 5c 0d 0a 20  ror: " \n\t \.. 
1a040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a050 20 20 20 20 20 20 20 24 65 72 72 6f 72 20 5c 6e         $error \n
1a060 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ]..             
1a070 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
1a080 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
1a090 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20           } else 
1a0a0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
1a0b0 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
1a0c0 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
1a0d0 41 72 67 73 20 5c 6e 20 5c 0d 0a 20 20 20 20 20  Args \n \..     
1a0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1a0f0 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 63 61  ==== WARNING: ca
1a100 6e 6e 6f 74 20 63 61 6e 63 65 6c 20 61 6e 79 20  nnot cancel any 
1a110 71 75 65 72 69 65 73 3a 20 22 20 5c 0d 0a 20 20  queries: " \..  
1a120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a130 20 20 22 74 68 65 20 5c 22 6f 62 6a 65 63 74 5c    "the \"object\
1a140 22 20 63 6f 6d 6d 61 6e 64 20 69 73 20 6e 6f 74  " command is not
1a150 20 61 76 61 69 6c 61 62 6c 65 5c 6e 22 5d 0d 0a   available\n"]..
1a160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
1a170 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
1a180 20 20 20 20 20 20 20 20 20 20 7d 7d 0d 0a 20 20            }}..  
1a190 20 20 20 20 20 20 7d 20 66 69 6e 61 6c 6c 79 20        } finally 
1a1a0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65 73  {..          res
1a1b0 74 6f 72 65 45 6e 76 69 72 6f 6e 6d 65 6e 74 56  toreEnvironmentV
1a1c0 61 72 69 61 62 6c 65 73 20 5b 6c 69 73 74 20 5c  ariables [list \
1a1d0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1a1e0 71 75 69 65 74 46 69 6e 64 49 6e 74 65 72 70 72  quietFindInterpr
1a1f0 65 74 65 72 54 65 73 74 50 61 74 68 20 71 75 69  eterTestPath qui
1a200 65 74 53 65 74 75 70 49 6e 74 65 72 70 72 65 74  etSetupInterpret
1a210 65 72 54 65 73 74 50 61 74 68 5d 0d 0a 20 20 20  erTestPath]..   
1a220 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20       }..      } 
1a230 65 72 72 6f 72 5d 20 3d 3d 20 30 7d 20 74 68 65  error] == 0} the
1a240 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 61 64 64  n {..        add
1a250 43 6f 6e 73 74 72 61 69 6e 74 20 69 6e 74 65 72  Constraint inter
1a260 72 75 70 74 43 61 6c 6c 62 61 63 6b 2e 73 71 6c  ruptCallback.sql
1a270 69 74 65 33 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ite3....        
1a280 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 79  tputs $channel y
1a290 65 73 5c 6e 0d 0a 20 20 20 20 20 20 7d 20 65 6c  es\n..      } el
1a2a0 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70  se {..        tp
1a2b0 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
1a2c0 70 65 6e 64 41 72 67 73 20 22 6e 6f 2c 20 65 72  pendArgs "no, er
1a2d0 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72  ror: " \n\t $err
1a2e0 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d  or \n]..      }.
1a2f0 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
1a300 72 6f 63 20 63 6c 65 61 6e 75 70 46 69 6c 65 20  roc cleanupFile 
1a310 7b 20 66 69 6c 65 4e 61 6d 65 20 7b 63 6f 6c 6c  { fileName {coll
1a320 65 63 74 20 74 72 75 65 7d 20 7b 66 6f 72 63 65  ect true} {force
1a330 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20   false} } {..   
1a340 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
1a350 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 66  TE: Attempt to f
1a360 6f 72 63 65 20 61 6c 6c 20 70 65 6e 64 69 6e 67  orce all pending
1a370 20 22 67 61 72 62 61 67 65 22 20 6f 62 6a 65 63   "garbage" objec
1a380 74 73 20 74 6f 20 62 65 20 63 6f 6c 6c 65 63 74  ts to be collect
1a390 65 64 2c 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ed,..      #    
1a3a0 20 20 20 69 6e 63 6c 75 64 69 6e 67 20 53 51 4c     including SQL
1a3b0 69 74 65 20 73 74 61 74 65 6d 65 6e 74 73 20 61  ite statements a
1a3c0 6e 64 20 62 61 63 6b 75 70 20 6f 62 6a 65 63 74  nd backup object
1a3d0 73 3b 20 74 68 69 73 20 73 68 6f 75 6c 64 20 61  s; this should a
1a3e0 6c 6c 6f 77 0d 0a 20 20 20 20 20 20 23 20 20 20  llow..      #   
1a3f0 20 20 20 20 74 68 65 20 75 6e 64 65 72 6c 79 69      the underlyi
1a400 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ng database file
1a410 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 2e 0d   to be deleted..
1a420 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
1a430 69 66 20 7b 24 63 6f 6c 6c 65 63 74 7d 20 74 68  if {$collect} th
1a440 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 63 6f  en {..        co
1a450 6c 6c 65 63 74 47 61 72 62 61 67 65 20 24 3a 3a  llectGarbage $::
1a460 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 20 20  test_channel..  
1a470 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
1a480 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
1a490 43 68 65 63 6b 20 69 66 20 74 68 65 20 66 69 6c  Check if the fil
1a4a0 65 20 73 74 69 6c 6c 20 65 78 69 73 74 73 2e 0d  e still exists..
1a4b0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
1a4c0 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73  if {[file exists
1a4d0 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65   $fileName]} the
1a4e0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
1a4f0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
1a500 53 6b 69 70 20 64 65 6c 65 74 69 6e 67 20 74 65  Skip deleting te
1a510 73 74 20 66 69 6c 65 73 20 69 66 20 73 6f 6d 65  st files if some
1a520 62 6f 64 79 20 73 65 74 73 20 74 68 65 20 67 6c  body sets the gl
1a530 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 0d 0a 20  obal variable.. 
1a540 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74         #       t
1a550 6f 20 70 72 65 76 65 6e 74 20 69 74 2e 0d 0a 20  o prevent it... 
1a560 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1a570 20 20 69 66 20 7b 24 66 6f 72 63 65 20 7c 7c 20    if {$force || 
1a580 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
1a590 6e 6f 28 63 6c 65 61 6e 75 70 46 69 6c 65 29 5d  no(cleanupFile)]
1a5a0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1a5b0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
1a5c0 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74   # NOTE: Attempt
1a5d0 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 74   to delete the t
1a5e0 65 73 74 20 66 69 6c 65 20 6e 6f 77 2e 0d 0a 20  est file now... 
1a5f0 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
1a600 20 20 20 20 20 20 69 66 20 7b 5b 73 65 74 20 63        if {[set c
1a610 6f 64 65 20 5b 63 61 74 63 68 20 7b 66 69 6c 65  ode [catch {file
1a620 20 64 65 6c 65 74 65 20 24 66 69 6c 65 4e 61 6d   delete $fileNam
1a630 65 7d 20 65 72 72 6f 72 5d 5d 7d 20 74 68 65 6e  e} error]]} then
1a640 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1a650 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  #..            #
1a660 20 4e 4f 54 45 3a 20 57 65 20 73 6f 6d 65 68 6f   NOTE: We someho
1a670 77 20 66 61 69 6c 65 64 20 74 6f 20 64 65 6c 65  w failed to dele
1a680 74 65 20 74 68 65 20 66 69 6c 65 2c 20 72 65 70  te the file, rep
1a690 6f 72 74 20 77 68 79 2e 0d 0a 20 20 20 20 20 20  ort why...      
1a6a0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1a6b0 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
1a6c0 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
1a6d0 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
1a6e0 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20            "==== 
1a6f0 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20  WARNING: failed 
1a700 74 6f 20 64 65 6c 65 74 65 20 74 65 73 74 20 66  to delete test f
1a710 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d  ile \"" $fileNam
1a720 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
1a730 20 20 20 20 20 22 5c 22 20 64 75 72 69 6e 67 20       "\" during 
1a740 63 6c 65 61 6e 75 70 2c 20 65 72 72 6f 72 3a 20  cleanup, error: 
1a750 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e  " \n\t $error \n
1a760 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ]..          }..
1a770 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
1a780 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
1a790 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
1a7a0 20 53 68 6f 77 20 74 68 61 74 20 77 65 20 73 6b   Show that we sk
1a7b0 69 70 70 65 64 20 64 65 6c 65 74 69 6e 67 20 74  ipped deleting t
1a7c0 68 65 20 66 69 6c 65 2e 0d 0a 20 20 20 20 20 20  he file...      
1a7d0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
1a7e0 20 73 65 74 20 63 6f 64 65 20 30 0d 0a 0d 0a 20   set code 0.... 
1a7f0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
1a800 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
1a810 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
1a820 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d              "===
1a830 3d 20 57 41 52 4e 49 4e 47 3a 20 73 6b 69 70 70  = WARNING: skipp
1a840 65 64 20 64 65 6c 65 74 69 6e 67 20 74 65 73 74  ed deleting test
1a850 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e   file \"" $fileN
1a860 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ame \..         
1a870 20 20 20 20 20 22 5c 22 20 64 75 72 69 6e 67 20       "\" during 
1a880 63 6c 65 61 6e 75 70 5c 6e 22 5d 0d 0a 20 20 20  cleanup\n"]..   
1a890 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20       }..      } 
1a8a0 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
1a8b0 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
1a8c0 45 3a 20 54 68 65 20 66 69 6c 65 20 64 6f 65 73  E: The file does
1a8d0 20 6e 6f 74 20 65 78 69 73 74 2c 20 73 75 63 63   not exist, succ
1a8e0 65 73 73 21 0d 0a 20 20 20 20 20 20 20 20 23 0d  ess!..        #.
1a8f0 0a 20 20 20 20 20 20 20 20 73 65 74 20 63 6f 64  .        set cod
1a900 65 20 30 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  e 0..      }....
1a910 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 63 6f        return $co
1a920 64 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  de..    }.....  
1a930 20 20 70 72 6f 63 20 63 6c 65 61 6e 75 70 4d 65    proc cleanupMe
1a940 6d 6f 72 79 20 7b 20 76 61 72 4e 61 6d 65 20 7b  mory { varName {
1a950 71 75 69 65 74 20 66 61 6c 73 65 7d 20 7d 20 7b  quiet false} } {
1a960 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76  ..      if {[hav
1a970 65 53 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d  eSQLiteObjectCom
1a980 6d 61 6e 64 5d 20 26 26 20 5c 0d 0a 20 20 20 20  mand] && \..    
1a990 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65        [string le
1a9a0 6e 67 74 68 20 24 76 61 72 4e 61 6d 65 5d 20 3e  ngth $varName] >
1a9b0 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
1a9c0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
1a9d0 20 4e 4f 54 45 3a 20 52 65 66 65 72 20 74 6f 20   NOTE: Refer to 
1a9e0 74 68 65 20 73 70 65 63 69 66 69 65 64 20 76 61  the specified va
1a9f0 72 69 61 62 6c 65 20 28 65 2e 67 2e 20 22 63 6f  riable (e.g. "co
1aa00 6e 6e 65 63 74 69 6f 6e 22 29 20 69 6e 20 74 68  nnection") in th
1aa10 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
1aa20 20 20 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75     context of ou
1aa30 72 20 63 61 6c 6c 65 72 2e 20 20 54 68 65 20 6f  r caller.  The o
1aa40 70 61 71 75 65 20 6f 62 6a 65 63 74 20 68 61 6e  paque object han
1aa50 64 6c 65 20 66 6f 72 20 61 6e 0d 0a 20 20 20 20  dle for an..    
1aa60 20 20 20 20 23 20 20 20 20 20 20 20 41 44 4f 2e      #       ADO.
1aa70 4e 45 54 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70  NET connection p
1aa80 72 65 76 69 6f 75 73 6c 79 20 72 65 74 75 72 6e  reviously return
1aa90 65 64 20 62 79 20 5b 67 65 74 44 62 43 6f 6e 6e  ed by [getDbConn
1aaa0 65 63 74 69 6f 6e 5d 0d 0a 20 20 20 20 20 20 20  ection]..       
1aab0 20 23 20 20 20 20 20 20 20 73 68 6f 75 6c 64 20   #       should 
1aac0 62 65 20 73 74 6f 72 65 64 20 74 68 65 72 65 2e  be stored there.
1aad0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1aae0 20 20 20 20 20 75 70 76 61 72 20 31 20 24 76 61       upvar 1 $va
1aaf0 72 4e 61 6d 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  rName connection
1ab00 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b  ....        if {
1ab10 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
1ab20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b      object invok
1ab30 65 20 24 63 6f 6e 6e 65 63 74 69 6f 6e 20 52 65  e $connection Re
1ab40 6c 65 61 73 65 4d 65 6d 6f 72 79 0d 0a 20 20 20  leaseMemory..   
1ab50 20 20 20 20 20 7d 20 72 65 73 75 6c 74 5d 7d 20       } result]} 
1ab60 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1ab70 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
1ab80 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1ab90 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
1aba0 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
1abb0 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
1abc0 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41          "==== WA
1abd0 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f  RNING: failed to
1abe0 20 72 65 6c 65 61 73 65 20 64 61 74 61 62 61 73   release databas
1abf0 65 20 6d 65 6d 6f 72 79 2c 20 65 72 72 6f 72 3a  e memory, error:
1ac00 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   " \..          
1ac10 20 20 20 20 20 20 5c 6e 5c 74 20 24 72 65 73 75        \n\t $resu
1ac20 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  lt \n]..        
1ac30 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
1ac40 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
1ac50 20 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 5b 69   if {[llength [i
1ac60 6e 66 6f 20 63 6f 6d 6d 61 6e 64 73 20 64 65 62  nfo commands deb
1ac70 75 67 5d 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ug]] > 0} then {
1ac80 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63  ..        if {[c
1ac90 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
1aca0 20 20 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73    uplevel 1 [lis
1acb0 74 20 64 65 62 75 67 20 70 75 72 67 65 5d 0d 0a  t debug purge]..
1acc0 20 20 20 20 20 20 20 20 7d 20 72 65 73 75 6c 74          } result
1acd0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
1ace0 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
1acf0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1ad00 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
1ad10 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
1ad20 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
1ad30 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d             "====
1ad40 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64   WARNING: failed
1ad50 20 74 6f 20 70 75 72 67 65 20 63 61 6c 6c 20 66   to purge call f
1ad60 72 61 6d 65 2c 20 65 72 72 6f 72 3a 20 22 20 5c  rame, error: " \
1ad70 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1ad80 20 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c    \n\t $result \
1ad90 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  n]..          }.
1ada0 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
1adb0 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
1adc0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 75 70   {..          up
1add0 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74 20 64 65  level 1 [list de
1ade0 62 75 67 20 63 6c 65 61 6e 75 70 5d 0d 0a 20 20  bug cleanup]..  
1adf0 20 20 20 20 20 20 7d 20 72 65 73 75 6c 74 5d 7d        } result]}
1ae00 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1ae10 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
1ae20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1ae30 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
1ae40 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
1ae50 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
1ae60 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57           "==== W
1ae70 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74  ARNING: failed t
1ae80 6f 20 63 6c 65 61 6e 75 70 20 69 6e 74 65 72 70  o cleanup interp
1ae90 72 65 74 65 72 2c 20 65 72 72 6f 72 3a 20 22 20  reter, error: " 
1aea0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1aeb0 20 20 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20     \n\t $result 
1aec0 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  \n]..          }
1aed0 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
1aee0 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
1aef0 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 75  h {..          u
1af00 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74 20 64  plevel 1 [list d
1af10 65 62 75 67 20 63 6f 6c 6c 65 63 74 5d 0d 0a 20  ebug collect].. 
1af20 20 20 20 20 20 20 20 7d 20 72 65 73 75 6c 74 5d         } result]
1af30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1af40 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
1af50 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1af60 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
1af70 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
1af80 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
1af90 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20            "==== 
1afa0 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20  WARNING: failed 
1afb0 74 6f 20 63 6f 6c 6c 65 63 74 20 67 61 72 62 61  to collect garba
1afc0 67 65 2c 20 65 72 72 6f 72 3a 20 22 20 5c 0d 0a  ge, error: " \..
1afd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1afe0 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d  \n\t $result \n]
1aff0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
1b000 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1b010 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
1b020 20 70 72 6f 63 20 73 65 74 75 70 4d 65 6d 6f 72   proc setupMemor
1b030 79 43 6f 75 6e 74 65 72 73 20 7b 20 76 61 72 4e  yCounters { varN
1b040 61 6d 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20 69  ame } {..      i
1b050 66 20 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f 62  f {[haveSQLiteOb
1b060 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68  jectCommand]} th
1b070 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 75 70  en {..        up
1b080 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65 20 63  var 1 $varName c
1b090 6f 75 6e 74 65 72 0d 0a 0d 0a 20 20 20 20 20 20  ounter....      
1b0a0 20 20 73 65 74 20 63 6f 75 6e 74 65 72 28 31 29    set counter(1)
1b0b0 20 5b 6f 62 6a 65 63 74 20 63 72 65 61 74 65 20   [object create 
1b0c0 2d 61 6c 69 61 73 20 5c 0d 0a 20 20 20 20 20 20  -alias \..      
1b0d0 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 69 61        System.Dia
1b0e0 67 6e 6f 73 74 69 63 73 2e 50 65 72 66 6f 72 6d  gnostics.Perform
1b0f0 61 6e 63 65 43 6f 75 6e 74 65 72 20 50 72 6f 63  anceCounter Proc
1b100 65 73 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ess \..         
1b110 20 20 20 22 57 6f 72 6b 69 6e 67 20 53 65 74 22     "Working Set"
1b120 20 5b 66 69 6c 65 20 72 6f 6f 74 6e 61 6d 65 20   [file rootname 
1b130 5b 66 69 6c 65 20 74 61 69 6c 20 24 3a 3a 62 69  [file tail $::bi
1b140 6e 5f 66 69 6c 65 5d 5d 5d 0d 0a 0d 0a 20 20 20  n_file]]]....   
1b150 20 20 20 20 20 73 65 74 20 63 6f 75 6e 74 65 72       set counter
1b160 28 32 29 20 5b 6f 62 6a 65 63 74 20 63 72 65 61  (2) [object crea
1b170 74 65 20 2d 61 6c 69 61 73 20 5c 0d 0a 20 20 20  te -alias \..   
1b180 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e           System.
1b190 44 69 61 67 6e 6f 73 74 69 63 73 2e 50 65 72 66  Diagnostics.Perf
1b1a0 6f 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72 20 50  ormanceCounter P
1b1b0 72 6f 63 65 73 73 20 5c 0d 0a 20 20 20 20 20 20  rocess \..      
1b1c0 20 20 20 20 20 20 22 57 6f 72 6b 69 6e 67 20 53        "Working S
1b1d0 65 74 20 50 65 61 6b 22 20 5b 66 69 6c 65 20 72  et Peak" [file r
1b1e0 6f 6f 74 6e 61 6d 65 20 5b 66 69 6c 65 20 74 61  ootname [file ta
1b1f0 69 6c 20 24 3a 3a 62 69 6e 5f 66 69 6c 65 5d 5d  il $::bin_file]]
1b200 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74  ]....        set
1b210 20 63 6f 75 6e 74 65 72 28 33 29 20 5b 6f 62 6a   counter(3) [obj
1b220 65 63 74 20 63 72 65 61 74 65 20 2d 61 6c 69 61  ect create -alia
1b230 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
1b240 20 53 79 73 74 65 6d 2e 44 69 61 67 6e 6f 73 74   System.Diagnost
1b250 69 63 73 2e 50 65 72 66 6f 72 6d 61 6e 63 65 43  ics.PerformanceC
1b260 6f 75 6e 74 65 72 20 50 72 6f 63 65 73 73 20 5c  ounter Process \
1b270 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 50  ..            "P
1b280 72 69 76 61 74 65 20 42 79 74 65 73 22 20 5b 66  rivate Bytes" [f
1b290 69 6c 65 20 72 6f 6f 74 6e 61 6d 65 20 5b 66 69  ile rootname [fi
1b2a0 6c 65 20 74 61 69 6c 20 24 3a 3a 62 69 6e 5f 66  le tail $::bin_f
1b2b0 69 6c 65 5d 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d  ile]]]..      }.
1b2c0 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ...      return 
1b2d0 22 22 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  ""..    }.....  
1b2e0 20 20 70 72 6f 63 20 72 65 70 6f 72 74 4d 65 6d    proc reportMem
1b2f0 6f 72 79 43 6f 75 6e 74 65 72 73 20 7b 20 63 68  oryCounters { ch
1b300 61 6e 6e 65 6c 20 76 61 72 4e 61 6d 65 20 70 72  annel varName pr
1b310 65 66 69 78 20 7d 20 7b 0d 0a 20 20 20 20 20 20  efix } {..      
1b320 69 66 20 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f  if {[haveSQLiteO
1b330 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74  bjectCommand]} t
1b340 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 75  hen {..        u
1b350 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65 20  pvar 1 $varName 
1b360 63 6f 75 6e 74 65 72 0d 0a 0d 0a 20 20 20 20 20  counter....     
1b370 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
1b380 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
1b390 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d  .            "--
1b3a0 2d 2d 20 22 20 24 70 72 65 66 69 78 20 22 20 63  -- " $prefix " c
1b3b0 6f 75 6e 74 65 72 20 5c 22 22 20 5c 0d 0a 20 20  ounter \"" \..  
1b3c0 20 20 20 20 20 20 20 20 20 20 5b 6f 62 6a 65 63            [objec
1b3d0 74 20 69 6e 76 6f 6b 65 20 24 63 6f 75 6e 74 65  t invoke $counte
1b3e0 72 28 31 29 20 43 6f 75 6e 74 65 72 4e 61 6d 65  r(1) CounterName
1b3f0 5d 20 22 5c 22 20 76 61 6c 75 65 20 69 73 20 22  ] "\" value is "
1b400 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1b410 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 24  [object invoke $
1b420 63 6f 75 6e 74 65 72 28 31 29 20 52 61 77 56 61  counter(1) RawVa
1b430 6c 75 65 5d 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20  lue] \n]....    
1b440 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
1b450 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
1b460 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d  ..            "-
1b470 2d 2d 2d 20 22 20 24 70 72 65 66 69 78 20 22 20  --- " $prefix " 
1b480 63 6f 75 6e 74 65 72 20 5c 22 22 20 5c 0d 0a 20  counter \"" \.. 
1b490 20 20 20 20 20 20 20 20 20 20 20 5b 6f 62 6a 65             [obje
1b4a0 63 74 20 69 6e 76 6f 6b 65 20 24 63 6f 75 6e 74  ct invoke $count
1b4b0 65 72 28 32 29 20 43 6f 75 6e 74 65 72 4e 61 6d  er(2) CounterNam
1b4c0 65 5d 20 22 5c 22 20 76 61 6c 75 65 20 69 73 20  e] "\" value is 
1b4d0 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
1b4e0 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20   [object invoke 
1b4f0 24 63 6f 75 6e 74 65 72 28 32 29 20 52 61 77 56  $counter(2) RawV
1b500 61 6c 75 65 5d 20 5c 6e 5d 0d 0a 0d 0a 20 20 20  alue] \n]....   
1b510 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
1b520 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
1b530 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  \..            "
1b540 2d 2d 2d 2d 20 22 20 24 70 72 65 66 69 78 20 22  ---- " $prefix "
1b550 20 63 6f 75 6e 74 65 72 20 5c 22 22 20 5c 0d 0a   counter \"" \..
1b560 20 20 20 20 20 20 20 20 20 20 20 20 5b 6f 62 6a              [obj
1b570 65 63 74 20 69 6e 76 6f 6b 65 20 24 63 6f 75 6e  ect invoke $coun
1b580 74 65 72 28 33 29 20 43 6f 75 6e 74 65 72 4e 61  ter(3) CounterNa
1b590 6d 65 5d 20 22 5c 22 20 76 61 6c 75 65 20 69 73  me] "\" value is
1b5a0 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   " \..          
1b5b0 20 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65    [object invoke
1b5c0 20 24 63 6f 75 6e 74 65 72 28 33 29 20 52 61 77   $counter(3) Raw
1b5d0 56 61 6c 75 65 5d 20 5c 6e 5d 0d 0a 20 20 20 20  Value] \n]..    
1b5e0 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
1b5f0 20 20 20 70 72 6f 63 20 63 6f 6c 6c 65 63 74 47     proc collectG
1b600 61 72 62 61 67 65 20 7b 20 63 68 61 6e 6e 65 6c  arbage { channel
1b610 20 7b 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 31   {milliseconds 1
1b620 30 30 30 7d 20 7b 71 75 69 65 74 20 74 72 75 65  000} {quiet true
1b630 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66 20  } } {..      if 
1b640 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f 62 6a 65  {[haveSQLiteObje
1b650 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65 6e  ctCommand]} then
1b660 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   {..        if {
1b670 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
1b680 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b      object invok
1b690 65 20 47 43 20 47 65 74 54 6f 74 61 6c 4d 65 6d  e GC GetTotalMem
1b6a0 6f 72 79 20 66 61 6c 73 65 0d 0a 20 20 20 20 20  ory false..     
1b6b0 20 20 20 7d 20 72 65 73 75 6c 74 5d 20 3d 3d 20     } result] == 
1b6c0 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
1b6d0 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
1b6e0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1b6f0 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
1b700 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
1b710 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1b720 20 20 20 20 22 2d 2d 2d 2d 20 6d 65 6d 6f 72 79      "---- memory
1b730 20 69 6e 20 75 73 65 20 62 79 20 74 68 65 20 43   in use by the C
1b740 4c 52 20 62 65 66 6f 72 65 20 63 6f 6c 6c 65 63  LR before collec
1b750 74 69 6f 6e 2e 2e 2e 20 22 20 5c 0d 0a 20 20 20  tion... " \..   
1b760 20 20 20 20 20 20 20 20 20 20 20 20 20 24 72 65               $re
1b770 73 75 6c 74 20 22 20 62 79 74 65 73 5c 6e 22 5d  sult " bytes\n"]
1b780 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
1b790 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
1b7a0 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21  .          if {!
1b7b0 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
1b7c0 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
1b7d0 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
1b7e0 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
1b7f0 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20            "==== 
1b800 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20  WARNING: failed 
1b810 74 6f 20 67 65 74 20 43 4c 52 20 6d 65 6d 6f 72  to get CLR memor
1b820 79 20 75 73 61 67 65 2c 20 65 72 72 6f 72 3a 20  y usage, error: 
1b830 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
1b840 20 20 20 20 20 5c 6e 5c 74 20 24 72 65 73 75 6c       \n\t $resul
1b850 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  t \n]..         
1b860 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20   }..        }.. 
1b870 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
1b880 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1b890 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1b8a0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1b8b0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1b8c0 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20 20  #########....   
1b8d0 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
1b8e0 54 45 3a 20 52 65 70 65 61 74 65 64 6c 79 20 61  TE: Repeatedly a
1b8f0 74 74 65 6d 70 74 20 74 6f 20 63 6f 6c 6c 65 63  ttempt to collec
1b900 74 20 67 61 72 62 61 67 65 20 75 6e 74 69 6c 20  t garbage until 
1b910 74 68 65 20 61 6c 6c 6f 74 74 65 64 20 6e 75 6d  the allotted num
1b920 62 65 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ber..      #    
1b930 20 20 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e     of millisecon
1b940 64 73 20 68 61 73 20 65 6c 61 70 73 65 64 2e 20  ds has elapsed. 
1b950 20 41 6c 77 61 79 73 20 61 74 74 65 6d 70 74 20   Always attempt 
1b960 74 6f 20 63 6f 6c 6c 65 63 74 20 67 61 72 62 61  to collect garba
1b970 67 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ge..      #     
1b980 20 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 2e    at least once.
1b990 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
1b9a0 20 69 66 20 7b 5b 68 61 76 65 53 51 4c 69 74 65   if {[haveSQLite
1b9b0 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20  ObjectCommand]} 
1b9c0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1b9d0 73 65 74 20 73 74 61 72 74 20 5b 63 6c 6f 63 6b  set start [clock
1b9e0 20 73 65 63 6f 6e 64 73 5d 0d 0a 20 20 20 20 20   seconds]..     
1b9f0 20 20 20 73 65 74 20 73 74 6f 70 20 5b 65 78 70     set stop [exp
1ba00 72 20 7b 24 73 74 61 72 74 20 2b 20 28 24 6d 69  r {$start + ($mi
1ba10 6c 6c 69 73 65 63 6f 6e 64 73 20 2f 20 31 30 30  lliseconds / 100
1ba20 30 29 7d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  0)}]....        
1ba30 64 6f 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  do {..          
1ba40 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e  #..          # N
1ba50 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20  OTE: Attempt to 
1ba60 66 6f 72 63 65 20 61 20 66 75 6c 6c 20 67 61 72  force a full gar
1ba70 62 61 67 65 20 63 6f 6c 6c 65 63 74 69 6f 6e 20  bage collection 
1ba80 6e 6f 77 2e 20 20 52 65 70 6f 72 74 20 61 6e 79  now.  Report any
1ba90 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20  ..          #   
1baa0 20 20 20 20 65 72 72 6f 72 20 74 68 61 74 20 69      error that i
1bab0 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 66  s encountered if
1bac0 20 77 65 20 66 61 69 6c 2e 0d 0a 20 20 20 20 20   we fail...     
1bad0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1bae0 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
1baf0 20 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65              obje
1bb00 63 74 20 69 6e 76 6f 6b 65 20 47 43 20 47 65 74  ct invoke GC Get
1bb10 54 6f 74 61 6c 4d 65 6d 6f 72 79 20 74 72 75 65  TotalMemory true
1bb20 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 72  ..          } er
1bb30 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ror]} then {..  
1bb40 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24            if {!$
1bb50 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
1bb60 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
1bb70 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
1bb80 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
1bb90 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d               "==
1bba0 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c  == WARNING: fail
1bbb0 65 64 20 66 75 6c 6c 20 67 61 72 62 61 67 65 20  ed full garbage 
1bbc0 63 6f 6c 6c 65 63 74 69 6f 6e 2c 20 65 72 72 6f  collection, erro
1bbd0 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20  r: " \..        
1bbe0 20 20 20 20 20 20 20 20 20 20 5c 6e 5c 74 20 24            \n\t $
1bbf0 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20  error \n]..     
1bc00 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1bc10 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
1bc20 20 20 20 73 65 74 20 6e 6f 77 20 5b 63 6c 6f 63     set now [cloc
1bc30 6b 20 73 65 63 6f 6e 64 73 5d 0d 0a 20 20 20 20  k seconds]..    
1bc40 20 20 20 20 7d 20 77 68 69 6c 65 20 7b 24 73 74      } while {$st
1bc50 61 72 74 20 3c 3d 20 24 6e 6f 77 20 26 26 20 24  art <= $now && $
1bc60 6e 6f 77 20 3c 20 24 73 74 6f 70 7d 0d 0a 20 20  now < $stop}..  
1bc70 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
1bc80 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1bc90 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1bca0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1bcb0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1bcc0 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20 20 20  ########....    
1bcd0 20 20 69 66 20 7b 5b 68 61 76 65 53 51 4c 69 74    if {[haveSQLit
1bce0 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d 7d  eObjectCommand]}
1bcf0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1bd00 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
1bd10 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20           object 
1bd20 69 6e 76 6f 6b 65 20 47 43 20 47 65 74 54 6f 74  invoke GC GetTot
1bd30 61 6c 4d 65 6d 6f 72 79 20 66 61 6c 73 65 0d 0a  alMemory false..
1bd40 20 20 20 20 20 20 20 20 7d 20 72 65 73 75 6c 74          } result
1bd50 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
1bd60 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24            if {!$
1bd70 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
1bd80 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
1bd90 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
1bda0 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
1bdb0 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6d           "---- m
1bdc0 65 6d 6f 72 79 20 69 6e 20 75 73 65 20 62 79 20  emory in use by 
1bdd0 74 68 65 20 43 4c 52 20 61 66 74 65 72 20 63 6f  the CLR after co
1bde0 6c 6c 65 63 74 69 6f 6e 2e 2e 2e 20 22 20 5c 0d  llection... " \.
1bdf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1be00 20 24 72 65 73 75 6c 74 20 22 20 62 79 74 65 73   $result " bytes
1be10 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  \n"]..          
1be20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73  }..        } els
1be30 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69  e {..          i
1be40 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
1be50 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1be60 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
1be70 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
1be80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d                "=
1be90 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69  === WARNING: fai
1bea0 6c 65 64 20 74 6f 20 67 65 74 20 43 4c 52 20 6d  led to get CLR m
1beb0 65 6d 6f 72 79 20 75 73 61 67 65 2c 20 65 72 72  emory usage, err
1bec0 6f 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20  or: " \..       
1bed0 20 20 20 20 20 20 20 20 20 5c 6e 5c 74 20 24 72           \n\t $r
1bee0 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20  esult \n]..     
1bef0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
1bf00 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  }..      }..    
1bf10 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67  }.....    proc g
1bf20 65 74 53 51 4c 69 74 65 48 61 6e 64 6c 65 43 6f  etSQLiteHandleCo
1bf30 75 6e 74 73 20 7b 20 63 68 61 6e 6e 65 6c 20 7b  unts { channel {
1bf40 71 75 69 65 74 20 66 61 6c 73 65 7d 20 7d 20 7b  quiet false} } {
1bf50 0d 0a 20 20 20 20 20 20 73 65 74 20 72 65 73 75  ..      set resu
1bf60 6c 74 20 5b 6c 69 73 74 5d 0d 0a 0d 0a 20 20 20  lt [list]....   
1bf70 20 20 20 69 66 20 7b 5b 68 61 76 65 53 51 4c 69     if {[haveSQLi
1bf80 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d  teObjectCommand]
1bf90 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
1bfa0 20 5b 68 61 76 65 53 51 4c 69 74 65 44 65 66 69   [haveSQLiteDefi
1bfb0 6e 65 43 6f 6e 73 74 61 6e 74 20 43 4f 55 4e 54  neConstant COUNT
1bfc0 5f 48 41 4e 44 4c 45 5d 7d 20 74 68 65 6e 20 7b  _HANDLE]} then {
1bfd0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1bfe0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 64 64       # NOTE: Add
1bff0 20 65 61 63 68 20 63 72 69 74 69 63 61 6c 20 68   each critical h
1c000 61 6e 64 6c 65 20 63 6f 75 6e 74 20 74 6f 20 74  andle count to t
1c010 68 65 20 72 65 73 75 6c 74 69 6e 67 20 6c 69 73  he resulting lis
1c020 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  t...        #.. 
1c030 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 6e         foreach n
1c040 61 6d 65 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20  ame [list \..   
1c050 20 20 20 20 20 20 20 20 20 63 6f 6e 6e 65 63 74           connect
1c060 69 6f 6e 43 6f 75 6e 74 20 73 74 61 74 65 6d 65  ionCount stateme
1c070 6e 74 43 6f 75 6e 74 20 62 61 63 6b 75 70 43 6f  ntCount backupCo
1c080 75 6e 74 20 62 6c 6f 62 43 6f 75 6e 74 5d 20 7b  unt blobCount] {
1c090 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
1c0a0 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
1c0b0 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76        object inv
1c0c0 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50  oke -flags +NonP
1c0d0 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20  ublic \..       
1c0e0 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e           System.
1c0f0 44 61 74 61 2e 53 51 4c 69 74 65 2e 44 65 62 75  Data.SQLite.Debu
1c100 67 44 61 74 61 20 24 6e 61 6d 65 0d 0a 20 20 20  gData $name..   
1c110 20 20 20 20 20 20 20 7d 20 76 61 6c 75 65 5d 20         } value] 
1c120 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
1c130 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24            if {!$
1c140 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
1c150 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
1c160 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
1c170 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
1c180 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
1c190 2d 2d 20 63 72 69 74 69 63 61 6c 20 68 61 6e 64  -- critical hand
1c1a0 6c 65 20 63 6f 75 6e 74 20 5c 22 22 20 24 6e 61  le count \"" $na
1c1b0 6d 65 20 22 5c 22 20 69 73 20 22 20 24 76 61 6c  me "\" is " $val
1c1c0 75 65 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  ue \n]..        
1c1d0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
1c1e0 20 20 20 20 20 6c 61 70 70 65 6e 64 20 72 65 73       lappend res
1c1f0 75 6c 74 20 24 76 61 6c 75 65 0d 0a 20 20 20 20  ult $value..    
1c200 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
1c210 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
1c220 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
1c230 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  .              t
1c240 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
1c250 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
1c260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1c270 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61  ==== WARNING: fa
1c280 69 6c 65 64 20 74 6f 20 67 65 74 20 63 72 69 74  iled to get crit
1c290 69 63 61 6c 20 68 61 6e 64 6c 65 20 63 6f 75 6e  ical handle coun
1c2a0 74 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20  t \"" \..       
1c2b0 20 20 20 20 20 20 20 20 20 20 20 24 6e 61 6d 65             $name
1c2c0 20 22 5c 22 2c 20 65 72 72 6f 72 3a 20 22 20 5c   "\", error: " \
1c2d0 6e 5c 74 20 24 76 61 6c 75 65 20 5c 6e 5d 0d 0a  n\t $value \n]..
1c2e0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
1c2f0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
1c300 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65      }..      } e
1c310 6c 73 65 69 66 20 7b 21 24 71 75 69 65 74 7d 20  lseif {!$quiet} 
1c320 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1c330 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
1c340 45 3a 20 54 68 65 20 61 63 74 75 61 6c 20 68 61  E: The actual ha
1c350 6e 64 6c 65 20 63 6f 75 6e 74 73 20 61 72 65 20  ndle counts are 
1c360 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 3b 20 74  not available; t
1c370 68 65 72 65 66 6f 72 65 2c 20 6a 75 73 74 0d 0a  herefore, just..
1c380 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
1c390 72 65 74 75 72 6e 20 61 6e 20 65 6d 70 74 79 20  return an empty 
1c3a0 6c 69 73 74 2e 0d 0a 20 20 20 20 20 20 20 20 23  list...        #
1c3b0 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
1c3c0 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63  $channel "---- c
1c3d0 72 69 74 69 63 61 6c 20 68 61 6e 64 6c 65 20 63  ritical handle c
1c3e0 6f 75 6e 74 73 20 75 6e 61 76 61 69 6c 61 62 6c  ounts unavailabl
1c3f0 65 5c 6e 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  e\n"..      }...
1c400 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 72  .      return $r
1c410 65 73 75 6c 74 0d 0a 20 20 20 20 7d 0d 0a 0c 0d  esult..    }....
1c420 0a 20 20 20 20 70 72 6f 63 20 73 68 75 74 64 6f  .    proc shutdo
1c430 77 6e 53 51 4c 69 74 65 20 7b 20 63 68 61 6e 6e  wnSQLite { chann
1c440 65 6c 20 7b 66 6f 72 63 65 20 66 61 6c 73 65 7d  el {force false}
1c450 20 7b 71 75 69 65 74 20 66 61 6c 73 65 7d 20 7d   {quiet false} }
1c460 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
1c470 20 20 20 23 20 4e 4f 54 45 3a 20 4d 61 6b 65 20     # NOTE: Make 
1c480 73 75 72 65 20 74 68 61 74 20 53 51 4c 69 74 65  sure that SQLite
1c490 20 63 6f 72 65 20 6c 69 62 72 61 72 79 20 69 73   core library is
1c4a0 20 63 6f 6d 70 6c 65 74 65 6c 79 20 73 68 75 74   completely shut
1c4b0 64 6f 77 6e 2e 20 20 54 68 69 73 0d 0a 20 20 20  down.  This..   
1c4c0 20 20 20 23 20 20 20 20 20 20 20 69 73 20 75 73     #       is us
1c4d0 65 64 20 62 79 20 74 65 73 74 73 20 74 68 61 74  ed by tests that
1c4e0 20 63 68 61 6e 67 65 20 63 6f 6e 66 69 67 75 72   change configur
1c4f0 61 74 69 6f 6e 20 6f 70 74 69 6f 6e 73 20 61 6e  ation options an
1c500 64 2f 6f 72 20 74 68 6f 73 65 0d 0a 20 20 20 20  d/or those..    
1c510 20 20 23 20 20 20 20 20 20 20 74 68 61 74 20 6e    #       that n
1c520 65 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  eed to make sure
1c530 20 6c 6f 67 67 69 6e 67 20 69 73 20 69 6e 69 74   logging is init
1c540 69 61 6c 69 7a 65 64 20 28 69 2e 65 2e 20 6a 75  ialized (i.e. ju
1c550 73 74 20 69 6e 20 63 61 73 65 0d 0a 20 20 20 20  st in case..    
1c560 20 20 23 20 20 20 20 20 20 20 74 68 65 20 53 51    #       the SQ
1c570 4c 69 74 65 20 63 6f 72 65 20 6c 69 62 72 61 72  Lite core librar
1c580 79 20 77 61 73 20 69 6e 69 74 69 61 6c 69 7a 65  y was initialize
1c590 64 20 69 6e 20 74 68 65 20 70 72 6f 63 65 73 73  d in the process
1c5a0 20 70 72 69 6f 72 20 74 6f 0d 0a 20 20 20 20 20   prior to..     
1c5b0 20 23 20 20 20 20 20 20 20 74 68 65 20 53 51 4c   #       the SQL
1c5c0 69 74 65 4c 6f 67 20 63 6c 61 73 73 20 62 65 69  iteLog class bei
1c5d0 6e 67 20 61 62 6c 65 20 74 6f 20 73 65 74 75 70  ng able to setup
1c5e0 20 69 74 73 20 6c 6f 67 67 69 6e 67 20 63 61 6c   its logging cal
1c5f0 6c 62 61 63 6b 29 2e 0d 0a 20 20 20 20 20 20 23  lback)...      #
1c600 20 20 20 20 20 20 20 4e 6f 72 6d 61 6c 6c 79 2c         Normally,
1c610 20 74 68 69 73 20 73 68 6f 75 6c 64 20 6f 6e 6c   this should onl
1c620 79 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20 69  y be performed i
1c630 66 20 53 51 4c 69 74 65 20 69 73 20 6c 6f 61 64  f SQLite is load
1c640 65 64 20 61 6e 64 0d 0a 20 20 20 20 20 20 23 20  ed and..      # 
1c650 20 20 20 20 20 20 72 65 61 64 79 20 66 6f 72 20        ready for 
1c660 75 73 65 20 62 79 20 74 68 65 20 74 65 73 74 20  use by the test 
1c670 73 75 69 74 65 2e 0d 0a 20 20 20 20 20 20 23 0d  suite...      #.
1c680 0a 20 20 20 20 20 20 69 66 20 7b 24 66 6f 72 63  .      if {$forc
1c690 65 20 7c 7c 20 5b 69 73 53 51 4c 69 74 65 52 65  e || [isSQLiteRe
1c6a0 61 64 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ady]} then {..  
1c6b0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1c6c0 20 23 20 42 55 47 46 49 58 3a 20 4d 61 6b 65 20   # BUGFIX: Make 
1c6d0 73 75 72 65 20 74 68 61 74 20 61 6e 79 20 22 6c  sure that any "l
1c6e0 65 61 6b 65 64 22 20 74 72 61 6e 73 61 63 74 69  eaked" transacti
1c6f0 6f 6e 73 20 61 6e 64 2f 6f 72 20 63 6f 6e 6e 65  ons and/or conne
1c700 63 74 69 6f 6e 73 0d 0a 20 20 20 20 20 20 20 20  ctions..        
1c710 23 20 20 20 20 20 20 20 20 20 61 72 65 20 63 6c  #         are cl
1c720 65 61 6e 65 64 20 75 70 20 62 65 66 6f 72 65 20  eaned up before 
1c730 63 61 6c 6c 69 6e 67 20 74 68 65 20 6e 61 74 69  calling the nati
1c740 76 65 20 73 68 75 74 64 6f 77 6e 20 66 75 6e 63  ve shutdown func
1c750 74 69 6f 6e 2e 0d 0a 20 20 20 20 20 20 20 20 23  tion...        #
1c760 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63  ..        foreac
1c770 68 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 5b 69  h transaction [i
1c780 6e 66 6f 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  nfo transactions
1c790 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69  ] {..          i
1c7a0 66 20 7b 5b 73 74 72 69 6e 67 20 6d 61 74 63 68  f {[string match
1c7b0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1c7c0 20 20 53 79 73 74 65 6d 23 44 61 74 61 23 53 51    System#Data#SQ
1c7d0 4c 69 74 65 23 53 51 4c 69 74 65 54 72 61 6e 73  Lite#SQLiteTrans
1c7e0 61 63 74 69 6f 6e 23 2a 20 24 74 72 61 6e 73 61  action#* $transa
1c7f0 63 74 69 6f 6e 5d 7d 20 74 68 65 6e 20 7b 0d 0a  ction]} then {..
1c800 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
1c810 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
1c820 20 20 20 20 20 20 20 20 73 71 6c 20 74 72 61 6e          sql tran
1c830 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b  saction rollback
1c840 20 24 74 72 61 6e 73 61 63 74 69 6f 6e 0d 0a 20   $transaction.. 
1c850 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 72 72             } err
1c860 6f 72 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  or] == 0} then {
1c870 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1c880 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
1c890 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
1c8a0 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
1c8b0 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
1c8c0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1c8d0 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 72 6f 6c         "---- rol
1c8e0 6c 65 64 20 62 61 63 6b 20 6c 65 61 6b 65 64 20  led back leaked 
1c8f0 74 72 61 6e 73 61 63 74 69 6f 6e 20 5c 22 22 20  transaction \"" 
1c900 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1c910 20 20 20 20 20 20 20 24 74 72 61 6e 73 61 63 74         $transact
1c920 69 6f 6e 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20  ion \"\n]..     
1c930 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
1c940 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
1c950 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1c960 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
1c970 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
1c980 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
1c990 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
1c9a0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1c9b0 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52         "==== WAR
1c9c0 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20  NING: failed to 
1c9d0 72 6f 6c 6c 62 61 63 6b 20 6c 65 61 6b 65 64 20  rollback leaked 
1c9e0 74 72 61 6e 73 61 63 74 69 6f 6e 20 5c 22 22 20  transaction \"" 
1c9f0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1ca00 20 20 20 20 20 20 20 24 74 72 61 6e 73 61 63 74         $transact
1ca10 69 6f 6e 20 22 5c 22 2c 20 65 72 72 6f 72 3a 20  ion "\", error: 
1ca20 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e  " \n\t $error \n
1ca30 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ]..             
1ca40 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
1ca50 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  }..          }..
1ca60 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
1ca70 20 20 20 20 20 66 6f 72 65 61 63 68 20 64 62 20       foreach db 
1ca80 5b 69 6e 66 6f 20 63 6f 6e 6e 65 63 74 69 6f 6e  [info connection
1ca90 73 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  s] {..          
1caa0 69 66 20 7b 5b 73 74 72 69 6e 67 20 6d 61 74 63  if {[string matc
1cab0 68 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  h \..           
1cac0 20 20 20 53 79 73 74 65 6d 23 44 61 74 61 23 53     System#Data#S
1cad0 51 4c 69 74 65 23 53 51 4c 69 74 65 43 6f 6e 6e  QLite#SQLiteConn
1cae0 65 63 74 69 6f 6e 23 2a 20 24 64 62 5d 7d 20 74  ection#* $db]} t
1caf0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1cb00 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 73     if {[catch {s
1cb10 71 6c 20 63 6c 6f 73 65 20 24 64 62 7d 20 65 72  ql close $db} er
1cb20 72 6f 72 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ror] == 0} then 
1cb30 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
1cb40 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
1cb50 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
1cb60 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
1cb70 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
1cb80 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1cb90 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6c          "---- cl
1cba0 6f 73 65 64 20 6c 65 61 6b 65 64 20 64 61 74 61  osed leaked data
1cbb0 62 61 73 65 20 5c 22 22 20 24 64 62 20 5c 22 5c  base \"" $db \"\
1cbc0 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  n]..            
1cbd0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
1cbe0 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
1cbf0 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71           if {!$q
1cc00 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
1cc10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70                tp
1cc20 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
1cc30 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
1cc40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc50 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66  "==== WARNING: f
1cc60 61 69 6c 65 64 20 74 6f 20 63 6c 6f 73 65 20 6c  ailed to close l
1cc70 65 61 6b 65 64 20 64 61 74 61 62 61 73 65 20 5c  eaked database \
1cc80 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  "" \..          
1cc90 20 20 20 20 20 20 20 20 20 20 24 64 62 20 22 5c            $db "\
1cca0 22 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74  ", error: " \n\t
1ccb0 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20   $error \n]..   
1ccc0 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
1ccd0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
1cce0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1ccf0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23    }....        #
1cd00 0d 0a 20 20 20 20 20 20 20 20 23 20 42 55 47 46  ..        # BUGF
1cd10 49 58 3a 20 42 65 66 6f 72 65 20 63 61 6c 6c 69  IX: Before calli
1cd20 6e 67 20 74 68 65 20 6e 61 74 69 76 65 20 73 68  ng the native sh
1cd30 75 74 64 6f 77 6e 20 66 75 6e 63 74 69 6f 6e 2c  utdown function,
1cd40 20 6d 61 6b 65 20 73 75 72 65 20 62 6f 74 68 0d   make sure both.
1cd50 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
1cd60 20 20 20 6f 66 20 74 68 65 20 50 52 41 47 4d 41     of the PRAGMA
1cd70 20 72 65 6c 61 74 65 64 20 64 69 72 65 63 74 6f   related directo
1cd80 72 79 20 6e 61 6d 65 73 20 61 72 65 20 66 72 65  ry names are fre
1cd90 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ed...        #..
1cda0 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72          checkFor
1cdb0 53 51 4c 69 74 65 44 69 72 65 63 74 6f 72 69 65  SQLiteDirectorie
1cdc0 73 20 24 63 68 61 6e 6e 65 6c 20 74 72 75 65 0d  s $channel true.
1cdd0 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  ...        if {[
1cde0 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
1cdf0 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65     object invoke
1ce00 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c   -flags +NonPubl
1ce10 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ic \..          
1ce20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e      System.Data.
1ce30 53 51 4c 69 74 65 2e 55 6e 73 61 66 65 4e 61 74  SQLite.UnsafeNat
1ce40 69 76 65 4d 65 74 68 6f 64 73 20 73 71 6c 69 74  iveMethods sqlit
1ce50 65 33 5f 73 68 75 74 64 6f 77 6e 0d 0a 20 20 20  e3_shutdown..   
1ce60 20 20 20 20 20 7d 20 72 65 73 75 6c 74 5d 20 3d       } result] =
1ce70 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
1ce80 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
1ce90 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
1cea0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
1ceb0 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
1cec0 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
1ced0 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 61 6c 6c        "---- call
1cee0 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77   sqlite3_shutdow
1cef0 6e 28 29 2e 2e 2e 20 6f 6b 3a 20 22 20 24 72 65  n()... ok: " $re
1cf00 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  sult \n]..      
1cf10 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
1cf20 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
1cf30 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
1cf40 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1cf50 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
1cf60 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
1cf70 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1cf80 20 20 22 2d 2d 2d 2d 20 63 61 6c 6c 20 73 71 6c    "---- call sql
1cf90 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 28 29 2e  ite3_shutdown().
1cfa0 2e 2e 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74  .. error: " \n\t
1cfb0 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20   $result \n]..  
1cfc0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
1cfd0 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20     }..      }.. 
1cfe0 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
1cff0 63 20 67 65 74 53 65 74 74 69 6e 67 52 65 61 64  c getSettingRead
1d000 43 6f 75 6e 74 20 7b 20 6e 61 6d 65 20 7b 76 69  Count { name {vi
1d010 61 46 69 6c 65 20 66 61 6c 73 65 7d 20 7d 20 7b  aFile false} } {
1d020 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76  ..      if {[hav
1d030 65 43 6f 6e 73 74 72 61 69 6e 74 20 62 75 69 6c  eConstraint buil
1d040 64 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 44  dConfiguration.D
1d050 65 62 75 67 5d 20 26 26 20 5b 63 61 74 63 68 20  ebug] && [catch 
1d060 7b 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a 65 63  {..        objec
1d070 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20  t invoke -flags 
1d080 2b 4e 6f 6e 50 75 62 6c 69 63 20 2d 61 6c 69 61  +NonPublic -alia
1d090 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
1d0a0 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
1d0b0 69 74 65 2e 44 65 62 75 67 44 61 74 61 20 5b 65  ite.DebugData [e
1d0c0 78 70 72 20 7b 24 76 69 61 46 69 6c 65 20 3f 20  xpr {$viaFile ? 
1d0d0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  \..            "
1d0e0 73 65 74 74 69 6e 67 46 69 6c 65 52 65 61 64 43  settingFileReadC
1d0f0 6f 75 6e 74 73 22 20 3a 20 22 73 65 74 74 69 6e  ounts" : "settin
1d100 67 52 65 61 64 43 6f 75 6e 74 73 22 7d 5d 0d 0a  gReadCounts"}]..
1d110 20 20 20 20 20 20 7d 20 73 65 74 74 69 6e 67 52        } settingR
1d120 65 61 64 43 6f 75 6e 74 73 5d 20 3d 3d 20 30 7d  eadCounts] == 0}
1d130 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1d140 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
1d150 67 74 68 20 24 6e 61 6d 65 5d 20 3e 20 30 7d 20  gth $name] > 0} 
1d160 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1d170 20 20 69 66 20 7b 5b 24 73 65 74 74 69 6e 67 52    if {[$settingR
1d180 65 61 64 43 6f 75 6e 74 73 20 54 72 79 47 65 74  eadCounts TryGet
1d190 56 61 6c 75 65 20 24 6e 61 6d 65 20 76 61 6c 75  Value $name valu
1d1a0 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  e]} then {..    
1d1b0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
1d1c0 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
1d1d0 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
1d1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
1d1f0 2d 2d 20 73 65 74 74 69 6e 67 20 5c 22 22 20 24  -- setting \"" $
1d200 6e 61 6d 65 20 22 5c 22 20 77 61 73 20 72 65 61  name "\" was rea
1d210 64 20 22 20 24 76 61 6c 75 65 20 22 20 74 69 6d  d " $value " tim
1d220 65 73 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  es" \..         
1d230 20 20 20 20 20 20 20 5b 65 78 70 72 20 7b 24 76         [expr {$v
1d240 69 61 46 69 6c 65 20 3f 20 22 20 66 72 6f 6d 20  iaFile ? " from 
1d250 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  the configuratio
1d260 6e 20 66 69 6c 65 22 20 3a 20 22 22 7d 5d 20 5c  n file" : ""}] \
1d270 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  n]....          
1d280 20 20 72 65 74 75 72 6e 20 24 76 61 6c 75 65 0d    return $value.
1d290 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
1d2a0 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
1d2b0 20 20 20 20 20 20 20 20 20 20 73 65 74 20 6e 61            set na
1d2c0 6d 65 43 6f 75 6e 74 20 5b 24 73 65 74 74 69 6e  meCount [$settin
1d2d0 67 52 65 61 64 43 6f 75 6e 74 73 20 43 6f 75 6e  gReadCounts Coun
1d2e0 74 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65  t]..          se
1d2f0 74 20 76 61 6c 75 65 43 6f 75 6e 74 20 30 0d 0a  t valueCount 0..
1d300 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65  ..          obje
1d310 63 74 20 66 6f 72 65 61 63 68 20 2d 61 6c 69 61  ct foreach -alia
1d320 73 20 70 61 69 72 20 24 73 65 74 74 69 6e 67 52  s pair $settingR
1d330 65 61 64 43 6f 75 6e 74 73 20 7b 0d 0a 20 20 20  eadCounts {..   
1d340 20 20 20 20 20 20 20 20 20 69 6e 63 72 20 76 61           incr va
1d350 6c 75 65 43 6f 75 6e 74 20 5b 24 70 61 69 72 20  lueCount [$pair 
1d360 56 61 6c 75 65 5d 0d 0a 0d 0a 20 20 20 20 20 20  Value]....      
1d370 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
1d380 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
1d390 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
1d3a0 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
1d3b0 20 73 65 74 74 69 6e 67 20 5c 22 22 20 5b 24 70   setting \"" [$p
1d3c0 61 69 72 20 4b 65 79 5d 20 22 5c 22 20 77 61 73  air Key] "\" was
1d3d0 20 72 65 61 64 20 22 20 5b 24 70 61 69 72 20 56   read " [$pair V
1d3e0 61 6c 75 65 5d 20 5c 0d 0a 20 20 20 20 20 20 20  alue] \..       
1d3f0 20 20 20 20 20 20 20 20 20 22 20 74 69 6d 65 73           " times
1d400 22 20 5b 65 78 70 72 20 7b 24 76 69 61 46 69 6c  " [expr {$viaFil
1d410 65 20 3f 20 22 20 66 72 6f 6d 20 74 68 65 20 63  e ? " from the c
1d420 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 66 69 6c  onfiguration fil
1d430 65 22 20 3a 20 5c 0d 0a 20 20 20 20 20 20 20 20  e" : \..        
1d440 20 20 20 20 20 20 20 20 22 22 7d 5d 20 5c 6e 5d          ""}] \n]
1d450 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d  ..          }...
1d460 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
1d470 6e 20 5b 6c 69 73 74 20 24 6e 61 6d 65 43 6f 75  n [list $nameCou
1d480 6e 74 20 24 76 61 6c 75 65 43 6f 75 6e 74 5d 0d  nt $valueCount].
1d490 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
1d4a0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20    }....      if 
1d4b0 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
1d4c0 24 6e 61 6d 65 5d 20 3e 20 30 7d 20 74 68 65 6e  $name] > 0} then
1d4d0 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   {..        tput
1d4e0 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
1d4f0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
1d500 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d  .            "--
1d510 2d 2d 20 73 65 74 74 69 6e 67 20 5c 22 22 20 24  -- setting \"" $
1d520 6e 61 6d 65 20 22 5c 22 20 77 61 73 20 6e 6f 74  name "\" was not
1d530 20 72 65 61 64 22 20 5b 65 78 70 72 20 7b 24 76   read" [expr {$v
1d540 69 61 46 69 6c 65 20 3f 20 5c 0d 0a 20 20 20 20  iaFile ? \..    
1d550 20 20 20 20 20 20 20 20 22 20 66 72 6f 6d 20 74          " from t
1d560 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  he configuration
1d570 20 66 69 6c 65 22 20 3a 20 22 22 7d 5d 20 5c 6e   file" : ""}] \n
1d580 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  ]..      } else 
1d590 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  {..        tputs
1d5a0 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
1d5b0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
1d5c0 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
1d5d0 2d 20 6e 6f 20 73 65 74 74 69 6e 67 73 20 77 65  - no settings we
1d5e0 72 65 20 72 65 61 64 22 20 5b 65 78 70 72 20 7b  re read" [expr {
1d5f0 24 76 69 61 46 69 6c 65 20 3f 20 5c 0d 0a 20 20  $viaFile ? \..  
1d600 20 20 20 20 20 20 20 20 20 20 22 20 66 72 6f 6d            " from
1d610 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69   the configurati
1d620 6f 6e 20 66 69 6c 65 22 20 3a 20 22 22 7d 5d 20  on file" : ""}] 
1d630 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  \n]..      }....
1d640 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 0d        return -1.
1d650 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
1d660 72 6f 63 20 67 65 74 4f 74 68 65 72 43 6f 75 6e  roc getOtherCoun
1d670 74 20 7b 20 6e 61 6d 65 20 7d 20 7b 0d 0a 20 20  t { name } {..  
1d680 20 20 20 20 69 66 20 7b 5b 68 61 76 65 43 6f 6e      if {[haveCon
1d690 73 74 72 61 69 6e 74 20 62 75 69 6c 64 43 6f 6e  straint buildCon
1d6a0 66 69 67 75 72 61 74 69 6f 6e 2e 44 65 62 75 67  figuration.Debug
1d6b0 5d 20 26 26 20 5b 63 61 74 63 68 20 7b 0d 0a 20  ] && [catch {.. 
1d6c0 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e         object in
1d6d0 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e  voke -flags +Non
1d6e0 50 75 62 6c 69 63 20 2d 61 6c 69 61 73 20 5c 0d  Public -alias \.
1d6f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73  .            Sys
1d700 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
1d710 44 65 62 75 67 44 61 74 61 20 6f 74 68 65 72 43  DebugData otherC
1d720 6f 75 6e 74 73 0d 0a 20 20 20 20 20 20 7d 20 6f  ounts..      } o
1d730 74 68 65 72 43 6f 75 6e 74 73 5d 20 3d 3d 20 30  therCounts] == 0
1d740 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1d750 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
1d760 6e 67 74 68 20 24 6e 61 6d 65 5d 20 3e 20 30 7d  ngth $name] > 0}
1d770 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1d780 20 20 20 69 66 20 7b 5b 24 6f 74 68 65 72 43 6f     if {[$otherCo
1d790 75 6e 74 73 20 54 72 79 47 65 74 56 61 6c 75 65  unts TryGetValue
1d7a0 20 24 6e 61 6d 65 20 76 61 6c 75 65 5d 7d 20 74   $name value]} t
1d7b0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1d7c0 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
1d7d0 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
1d7e0 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
1d7f0 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6f 74          "---- ot
1d800 68 65 72 20 63 6f 75 6e 74 65 72 20 5c 22 22 20  her counter \"" 
1d810 24 6e 61 6d 65 20 22 5c 22 20 68 61 73 20 76 61  $name "\" has va
1d820 6c 75 65 20 22 20 24 76 61 6c 75 65 20 5c 6e 5d  lue " $value \n]
1d830 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
1d840 72 65 74 75 72 6e 20 24 76 61 6c 75 65 0d 0a 20  return $value.. 
1d850 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
1d860 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
1d870 20 20 20 20 20 20 20 20 73 65 74 20 6e 61 6d 65          set name
1d880 43 6f 75 6e 74 20 5b 24 6f 74 68 65 72 43 6f 75  Count [$otherCou
1d890 6e 74 73 20 43 6f 75 6e 74 5d 0d 0a 20 20 20 20  nts Count]..    
1d8a0 20 20 20 20 20 20 73 65 74 20 76 61 6c 75 65 43        set valueC
1d8b0 6f 75 6e 74 20 30 0d 0a 0d 0a 20 20 20 20 20 20  ount 0....      
1d8c0 20 20 20 20 6f 62 6a 65 63 74 20 66 6f 72 65 61      object forea
1d8d0 63 68 20 2d 61 6c 69 61 73 20 70 61 69 72 20 24  ch -alias pair $
1d8e0 6f 74 68 65 72 43 6f 75 6e 74 73 20 7b 0d 0a 20  otherCounts {.. 
1d8f0 20 20 20 20 20 20 20 20 20 20 20 69 6e 63 72 20             incr 
1d900 76 61 6c 75 65 43 6f 75 6e 74 20 5b 24 70 61 69  valueCount [$pai
1d910 72 20 56 61 6c 75 65 5d 0d 0a 0d 0a 20 20 20 20  r Value]....    
1d920 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
1d930 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
1d940 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
1d950 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
1d960 2d 2d 20 6f 74 68 65 72 20 63 6f 75 6e 74 65 72  -- other counter
1d970 20 5c 22 22 20 5b 24 70 61 69 72 20 4b 65 79 5d   \"" [$pair Key]
1d980 20 22 5c 22 20 68 61 73 20 76 61 6c 75 65 20 22   "\" has value "
1d990 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1d9a0 20 20 20 20 5b 24 70 61 69 72 20 56 61 6c 75 65      [$pair Value
1d9b0 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  ] \n]..         
1d9c0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
1d9d0 72 65 74 75 72 6e 20 5b 6c 69 73 74 20 24 6e 61  return [list $na
1d9e0 6d 65 43 6f 75 6e 74 20 24 76 61 6c 75 65 43 6f  meCount $valueCo
1d9f0 75 6e 74 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d  unt]..        }.
1da00 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
1da10 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
1da20 6e 67 74 68 20 24 6e 61 6d 65 5d 20 3e 20 30 7d  ngth $name] > 0}
1da30 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1da40 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
1da50 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
1da60 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
1da70 20 20 22 2d 2d 2d 2d 20 6f 74 68 65 72 20 63 6f    "---- other co
1da80 75 6e 74 65 72 20 5c 22 22 20 24 6e 61 6d 65 20  unter \"" $name 
1da90 22 5c 22 20 68 61 73 20 6e 6f 20 76 61 6c 75 65  "\" has no value
1daa0 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c  \n"]..      } el
1dab0 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70  se {..        tp
1dac0 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
1dad0 6e 65 6c 20 22 2d 2d 2d 2d 20 74 68 65 72 65 20  nel "---- there 
1dae0 61 72 65 20 6e 6f 20 6f 74 68 65 72 20 63 6f 75  are no other cou
1daf0 6e 74 65 72 73 5c 6e 22 0d 0a 20 20 20 20 20 20  nters\n"..      
1db00 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72  }....      retur
1db10 6e 20 2d 31 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  n -1..    }.....
1db20 20 20 20 20 70 72 6f 63 20 72 65 70 6f 72 74 53      proc reportS
1db30 51 4c 69 74 65 52 65 73 6f 75 72 63 65 73 20 7b  QLiteResources {
1db40 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68  ..            ch
1db50 61 6e 6e 65 6c 20 7b 71 75 69 65 74 20 66 61 6c  annel {quiet fal
1db60 73 65 7d 20 7b 72 65 73 65 74 20 74 72 75 65 7d  se} {reset true}
1db70 20 7b 63 6f 6c 6c 65 63 74 20 74 72 75 65 7d 20   {collect true} 
1db80 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
1db90 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 70      # NOTE: If p
1dba0 6f 73 73 69 62 6c 65 2c 20 61 6c 77 61 79 73 20  ossible, always 
1dbb0 72 65 73 65 74 20 74 68 65 20 63 61 63 68 65 64  reset the cached
1dbc0 20 61 73 73 65 6d 62 6c 79 20 64 69 72 65 63 74   assembly direct
1dbd0 6f 72 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ory..      #    
1dbe0 20 20 20 61 6e 64 20 74 68 65 20 63 61 63 68 65     and the cache
1dbf0 64 20 58 4d 4c 20 63 6f 6e 66 69 67 75 72 61 74  d XML configurat
1dc00 69 6f 6e 20 66 69 6c 65 20 6e 61 6d 65 2e 0d 0a  ion file name...
1dc10 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
1dc20 66 20 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f 62  f {[haveSQLiteOb
1dc30 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68  jectCommand]} th
1dc40 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66  en {..        if
1dc50 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
1dc60 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76        object inv
1dc70 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50  oke -flags +NonP
1dc80 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20  ublic \..       
1dc90 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61         System.Da
1dca0 74 61 2e 53 51 4c 69 74 65 2e 55 6e 73 61 66 65  ta.SQLite.Unsafe
1dcb0 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 20 5c 0d  NativeMethods \.
1dcc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 52  .              R
1dcd0 65 73 65 74 43 61 63 68 65 64 41 73 73 65 6d 62  esetCachedAssemb
1dce0 6c 79 44 69 72 65 63 74 6f 72 79 0d 0a 20 20 20  lyDirectory..   
1dcf0 20 20 20 20 20 7d 20 65 72 72 6f 72 5d 20 3d 3d       } error] ==
1dd00 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
1dd10 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
1dd20 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
1dd30 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
1dd40 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 72 65 73 65  annel "---- rese
1dd50 74 20 63 61 63 68 65 64 20 61 73 73 65 6d 62 6c  t cached assembl
1dd60 79 20 64 69 72 65 63 74 6f 72 79 5c 6e 22 0d 0a  y directory\n"..
1dd70 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
1dd80 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
1dd90 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71           if {!$q
1dda0 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
1ddb0 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
1ddc0 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
1ddd0 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
1dde0 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41          "==== WA
1ddf0 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f  RNING: failed to
1de00 20 72 65 73 65 74 20 63 61 63 68 65 64 20 61 73   reset cached as
1de10 73 65 6d 62 6c 79 20 64 69 72 65 63 74 6f 72 79  sembly directory
1de20 2c 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  , " \..         
1de30 20 20 20 20 20 20 20 22 65 72 72 6f 72 3a 20 22         "error: "
1de40 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d   \n\t $error \n]
1de50 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
1de60 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
1de70 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
1de80 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65  ..          obje
1de90 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73  ct invoke -flags
1dea0 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20   +NonPublic \.. 
1deb0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73               Sys
1dec0 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
1ded0 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68  UnsafeNativeMeth
1dee0 6f 64 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ods \..         
1def0 20 20 20 20 20 52 65 73 65 74 43 61 63 68 65 64       ResetCached
1df00 58 6d 6c 43 6f 6e 66 69 67 46 69 6c 65 4e 61 6d  XmlConfigFileNam
1df10 65 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 72 72  e..        } err
1df20 6f 72 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  or] == 0} then {
1df30 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
1df40 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
1df50 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
1df60 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d  ts $channel "---
1df70 2d 20 72 65 73 65 74 20 63 61 63 68 65 64 20 58  - reset cached X
1df80 4d 4c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  ML configuration
1df90 20 66 69 6c 65 20 6e 61 6d 65 5c 6e 22 0d 0a 20   file name\n".. 
1dfa0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
1dfb0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
1dfc0 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
1dfd0 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
1dfe0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
1dff0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
1e000 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
1e010 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52         "==== WAR
1e020 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20  NING: failed to 
1e030 72 65 73 65 74 20 63 61 63 68 65 64 20 58 4d 4c  reset cached XML
1e040 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 22   configuration "
1e050 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1e060 20 20 20 20 22 66 69 6c 65 20 6e 61 6d 65 2c 20      "file name, 
1e070 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65  error: " \n\t $e
1e080 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  rror \n]..      
1e090 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
1e0a0 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
1e0b0 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
1e0c0 54 45 3a 20 49 66 20 61 76 61 69 6c 61 62 6c 65  TE: If available
1e0d0 2c 20 72 65 70 6f 72 74 20 6f 6e 20 28 61 6e 64  , report on (and
1e0e0 20 70 6f 73 73 69 62 6c 79 20 72 65 73 65 74 29   possibly reset)
1e0f0 20 74 68 65 20 72 75 6e 74 69 6d 65 0d 0a 20 20   the runtime..  
1e100 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e 66      #       conf
1e110 69 67 75 72 61 74 69 6f 6e 20 73 74 61 74 69 73  iguration statis
1e120 74 69 63 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  tics...      #..
1e130 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65 53        if {[haveS
1e140 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61  QLiteObjectComma
1e150 6e 64 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  nd] && \..      
1e160 20 20 20 20 5b 68 61 76 65 43 6f 6e 73 74 72 61      [haveConstra
1e170 69 6e 74 20 62 75 69 6c 64 43 6f 6e 66 69 67 75  int buildConfigu
1e180 72 61 74 69 6f 6e 2e 44 65 62 75 67 5d 7d 20 74  ration.Debug]} t
1e190 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69  hen {..        i
1e1a0 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  f {[catch {..   
1e1b0 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e         object in
1e1c0 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e  voke -flags +Non
1e1d0 50 75 62 6c 69 63 20 2d 61 6c 69 61 73 20 5c 0d  Public -alias \.
1e1e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53  .              S
1e1f0 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
1e200 65 2e 44 65 62 75 67 44 61 74 61 20 73 65 74 74  e.DebugData sett
1e210 69 6e 67 52 65 61 64 43 6f 75 6e 74 73 0d 0a 20  ingReadCounts.. 
1e220 20 20 20 20 20 20 20 7d 20 73 65 74 74 69 6e 67         } setting
1e230 52 65 61 64 43 6f 75 6e 74 73 5d 20 3d 3d 20 30  ReadCounts] == 0
1e240 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1e250 20 20 20 20 73 65 74 20 6e 61 6d 65 43 6f 75 6e      set nameCoun
1e260 74 20 5b 24 73 65 74 74 69 6e 67 52 65 61 64 43  t [$settingReadC
1e270 6f 75 6e 74 73 20 43 6f 75 6e 74 5d 0d 0a 20 20  ounts Count]..  
1e280 20 20 20 20 20 20 20 20 73 65 74 20 76 61 6c 75          set valu
1e290 65 43 6f 75 6e 74 20 30 0d 0a 0d 0a 20 20 20 20  eCount 0....    
1e2a0 20 20 20 20 20 20 6f 62 6a 65 63 74 20 66 6f 72        object for
1e2b0 65 61 63 68 20 2d 61 6c 69 61 73 20 70 61 69 72  each -alias pair
1e2c0 20 24 73 65 74 74 69 6e 67 52 65 61 64 43 6f 75   $settingReadCou
1e2d0 6e 74 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  nts {..         
1e2e0 20 20 20 69 6e 63 72 20 76 61 6c 75 65 43 6f 75     incr valueCou
1e2f0 6e 74 20 5b 24 70 61 69 72 20 56 61 6c 75 65 5d  nt [$pair Value]
1e300 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
1e310 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
1e320 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
1e330 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
1e340 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
1e350 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1e360 20 20 20 22 2d 2d 2d 2d 20 73 65 74 74 69 6e 67     "---- setting
1e370 20 5c 22 22 20 5b 24 70 61 69 72 20 4b 65 79 5d   \"" [$pair Key]
1e380 20 22 5c 22 20 77 61 73 20 72 65 61 64 20 22 20   "\" was read " 
1e390 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1e3a0 20 20 20 20 20 5b 24 70 61 69 72 20 56 61 6c 75       [$pair Valu
1e3b0 65 5d 20 22 20 74 69 6d 65 73 5c 6e 22 5d 0d 0a  e] " times\n"]..
1e3c0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
1e3d0 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
1e3e0 20 20 20 20 20 20 20 20 69 66 20 7b 24 72 65 73          if {$res
1e3f0 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
1e400 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
1e410 63 68 20 7b 24 73 65 74 74 69 6e 67 52 65 61 64  ch {$settingRead
1e420 43 6f 75 6e 74 73 20 43 6c 65 61 72 7d 20 65 72  Counts Clear} er
1e430 72 6f 72 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ror] == 0} then 
1e440 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
1e450 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
1e460 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
1e470 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
1e480 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
1e490 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1e4a0 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 72 65          "---- re
1e4b0 73 65 74 20 73 65 74 74 69 6e 67 20 73 74 61 74  set setting stat
1e4c0 69 73 74 69 63 73 20 66 6f 72 20 74 68 65 20 70  istics for the p
1e4d0 72 65 76 69 6f 75 73 20 22 20 5c 0d 0a 20 20 20  revious " \..   
1e4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e4f0 20 24 6e 61 6d 65 43 6f 75 6e 74 20 22 20 6e 61   $nameCount " na
1e500 6d 65 73 20 61 6e 64 20 22 20 24 76 61 6c 75 65  mes and " $value
1e510 43 6f 75 6e 74 20 22 20 76 61 6c 75 65 73 20 72  Count " values r
1e520 65 61 64 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20  ead\n"]..       
1e530 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1e540 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
1e550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
1e560 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
1e570 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
1e580 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
1e590 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
1e5a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1e5b0 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49       "==== WARNI
1e5c0 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 72 65  NG: failed to re
1e5d0 73 65 74 20 73 65 74 74 69 6e 67 20 73 74 61 74  set setting stat
1e5e0 69 73 74 69 63 73 20 66 6f 72 20 22 20 5c 0d 0a  istics for " \..
1e5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e600 20 20 20 20 22 74 68 65 20 70 72 65 76 69 6f 75      "the previou
1e610 73 20 22 20 24 6e 61 6d 65 43 6f 75 6e 74 20 22  s " $nameCount "
1e620 20 6e 61 6d 65 73 20 61 6e 64 20 22 20 24 76 61   names and " $va
1e630 6c 75 65 43 6f 75 6e 74 20 5c 0d 0a 20 20 20 20  lueCount \..    
1e640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e650 22 20 76 61 6c 75 65 73 20 72 65 61 64 2c 20 65  " values read, e
1e660 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72  rror: " \n\t $er
1e670 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ror \n]..       
1e680 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1e690 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
1e6a0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
1e6b0 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  ...        if {[
1e6c0 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
1e6d0 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65     object invoke
1e6e0 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c   -flags +NonPubl
1e6f0 69 63 20 2d 61 6c 69 61 73 20 5c 0d 0a 20 20 20  ic -alias \..   
1e700 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65             Syste
1e710 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 44 65  m.Data.SQLite.De
1e720 62 75 67 44 61 74 61 20 73 65 74 74 69 6e 67 46  bugData settingF
1e730 69 6c 65 52 65 61 64 43 6f 75 6e 74 73 0d 0a 20  ileReadCounts.. 
1e740 20 20 20 20 20 20 20 7d 20 73 65 74 74 69 6e 67         } setting
1e750 46 69 6c 65 52 65 61 64 43 6f 75 6e 74 73 5d 20  FileReadCounts] 
1e760 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
1e770 20 20 20 20 20 20 20 20 73 65 74 20 6e 61 6d 65          set name
1e780 43 6f 75 6e 74 20 5b 24 73 65 74 74 69 6e 67 46  Count [$settingF
1e790 69 6c 65 52 65 61 64 43 6f 75 6e 74 73 20 43 6f  ileReadCounts Co
1e7a0 75 6e 74 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  unt]..          
1e7b0 73 65 74 20 76 61 6c 75 65 43 6f 75 6e 74 20 30  set valueCount 0
1e7c0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62  ....          ob
1e7d0 6a 65 63 74 20 66 6f 72 65 61 63 68 20 2d 61 6c  ject foreach -al
1e7e0 69 61 73 20 70 61 69 72 20 24 73 65 74 74 69 6e  ias pair $settin
1e7f0 67 46 69 6c 65 52 65 61 64 43 6f 75 6e 74 73 20  gFileReadCounts 
1e800 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  {..            i
1e810 6e 63 72 20 76 61 6c 75 65 43 6f 75 6e 74 20 5b  ncr valueCount [
1e820 24 70 61 69 72 20 56 61 6c 75 65 5d 0d 0a 0d 0a  $pair Value]....
1e830 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
1e840 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
1e850 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  .              t
1e860 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
1e870 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
1e880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1e890 2d 2d 2d 2d 20 73 65 74 74 69 6e 67 20 5c 22 22  ---- setting \""
1e8a0 20 5b 24 70 61 69 72 20 4b 65 79 5d 20 22 5c 22   [$pair Key] "\"
1e8b0 20 77 61 73 20 72 65 61 64 20 22 20 5c 0d 0a 20   was read " \.. 
1e8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e8d0 20 5b 24 70 61 69 72 20 56 61 6c 75 65 5d 20 22   [$pair Value] "
1e8e0 20 74 69 6d 65 73 20 66 72 6f 6d 20 74 68 65 20   times from the 
1e8f0 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 66 69  configuration fi
1e900 6c 65 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20  le\n"]..        
1e910 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
1e920 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
1e930 69 66 20 7b 24 72 65 73 65 74 7d 20 74 68 65 6e  if {$reset} then
1e940 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1e950 69 66 20 7b 5b 63 61 74 63 68 20 7b 24 73 65 74  if {[catch {$set
1e960 74 69 6e 67 46 69 6c 65 52 65 61 64 43 6f 75 6e  tingFileReadCoun
1e970 74 73 20 43 6c 65 61 72 7d 20 65 72 72 6f 72 5d  ts Clear} error]
1e980 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
1e990 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
1e9a0 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
1e9b0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1e9c0 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
1e9d0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
1e9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e9f0 20 20 20 20 22 2d 2d 2d 2d 20 72 65 73 65 74 20      "---- reset 
1ea00 73 65 74 74 69 6e 67 20 73 74 61 74 69 73 74 69  setting statisti
1ea10 63 73 20 66 6f 72 20 74 68 65 20 70 72 65 76 69  cs for the previ
1ea20 6f 75 73 20 22 20 5c 0d 0a 20 20 20 20 20 20 20  ous " \..       
1ea30 20 20 20 20 20 20 20 20 20 20 20 20 20 24 6e 61               $na
1ea40 6d 65 43 6f 75 6e 74 20 22 20 6e 61 6d 65 73 20  meCount " names 
1ea50 61 6e 64 20 22 20 24 76 61 6c 75 65 43 6f 75 6e  and " $valueCoun
1ea60 74 20 22 20 76 61 6c 75 65 73 20 72 65 61 64 20  t " values read 
1ea70 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
1ea80 20 20 20 20 20 20 20 20 20 22 66 72 6f 6d 20 74           "from t
1ea90 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  he configuration
1eaa0 20 66 69 6c 65 5c 6e 22 5d 0d 0a 20 20 20 20 20   file\n"]..     
1eab0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
1eac0 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
1ead0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1eae0 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
1eaf0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
1eb00 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
1eb10 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
1eb20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1eb30 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52         "==== WAR
1eb40 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20  NING: failed to 
1eb50 72 65 73 65 74 20 73 65 74 74 69 6e 67 20 73 74  reset setting st
1eb60 61 74 69 73 74 69 63 73 20 66 6f 72 20 22 20 5c  atistics for " \
1eb70 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1eb80 20 20 20 20 20 20 22 74 68 65 20 70 72 65 76 69        "the previ
1eb90 6f 75 73 20 22 20 24 6e 61 6d 65 43 6f 75 6e 74  ous " $nameCount
1eba0 20 22 20 6e 61 6d 65 73 20 61 6e 64 20 22 20 24   " names and " $
1ebb0 76 61 6c 75 65 43 6f 75 6e 74 20 5c 0d 0a 20 20  valueCount \..  
1ebc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ebd0 20 20 22 20 76 61 6c 75 65 73 20 72 65 61 64 20    " values read 
1ebe0 66 72 6f 6d 20 74 68 65 20 63 6f 6e 66 69 67 75  from the configu
1ebf0 72 61 74 69 6f 6e 20 66 69 6c 65 2c 20 65 72 72  ration file, err
1ec00 6f 72 3a 20 22 20 5c 6e 5c 74 20 5c 0d 0a 20 20  or: " \n\t \..  
1ec10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec20 20 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20    $error \n]..  
1ec30 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
1ec40 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
1ec50 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
1ec60 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
1ec70 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20  if {[catch {..  
1ec80 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69          object i
1ec90 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f  nvoke -flags +No
1eca0 6e 50 75 62 6c 69 63 20 2d 61 6c 69 61 73 20 5c  nPublic -alias \
1ecb0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1ecc0 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
1ecd0 74 65 2e 44 65 62 75 67 44 61 74 61 20 6f 74 68  te.DebugData oth
1ece0 65 72 43 6f 75 6e 74 73 0d 0a 20 20 20 20 20 20  erCounts..      
1ecf0 20 20 7d 20 6f 74 68 65 72 43 6f 75 6e 74 73 5d    } otherCounts]
1ed00 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
1ed10 20 20 20 20 20 20 20 20 20 73 65 74 20 6e 61 6d           set nam
1ed20 65 43 6f 75 6e 74 20 5b 24 6f 74 68 65 72 43 6f  eCount [$otherCo
1ed30 75 6e 74 73 20 43 6f 75 6e 74 5d 0d 0a 20 20 20  unts Count]..   
1ed40 20 20 20 20 20 20 20 73 65 74 20 76 61 6c 75 65         set value
1ed50 43 6f 75 6e 74 20 30 0d 0a 0d 0a 20 20 20 20 20  Count 0....     
1ed60 20 20 20 20 20 6f 62 6a 65 63 74 20 66 6f 72 65       object fore
1ed70 61 63 68 20 2d 61 6c 69 61 73 20 70 61 69 72 20  ach -alias pair 
1ed80 24 6f 74 68 65 72 43 6f 75 6e 74 73 20 7b 0d 0a  $otherCounts {..
1ed90 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 63 72              incr
1eda0 20 76 61 6c 75 65 43 6f 75 6e 74 20 5b 24 70 61   valueCount [$pa
1edb0 69 72 20 56 61 6c 75 65 5d 0d 0a 0d 0a 20 20 20  ir Value]....   
1edc0 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71           if {!$q
1edd0 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
1ede0 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
1edf0 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
1ee00 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
1ee10 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
1ee20 2d 20 6f 74 68 65 72 20 63 6f 75 6e 74 65 72 20  - other counter 
1ee30 5c 22 22 20 5b 24 70 61 69 72 20 4b 65 79 5d 20  \"" [$pair Key] 
1ee40 22 5c 22 20 68 61 73 20 76 61 6c 75 65 20 22 20  "\" has value " 
1ee50 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1ee60 20 20 20 20 20 5b 24 70 61 69 72 20 56 61 6c 75       [$pair Valu
1ee70 65 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  e] \n]..        
1ee80 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
1ee90 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
1eea0 69 66 20 7b 24 72 65 73 65 74 7d 20 74 68 65 6e  if {$reset} then
1eeb0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1eec0 69 66 20 7b 5b 63 61 74 63 68 20 7b 24 6f 74 68  if {[catch {$oth
1eed0 65 72 43 6f 75 6e 74 73 20 43 6c 65 61 72 7d 20  erCounts Clear} 
1eee0 65 72 72 6f 72 5d 20 3d 3d 20 30 7d 20 74 68 65  error] == 0} the
1eef0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
1ef00 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
1ef10 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1ef20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
1ef30 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
1ef40 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
1ef50 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
1ef60 72 65 73 65 74 20 6f 74 68 65 72 20 63 6f 75 6e  reset other coun
1ef70 74 65 72 73 20 66 6f 72 20 74 68 65 20 70 72 65  ters for the pre
1ef80 76 69 6f 75 73 20 22 20 5c 0d 0a 20 20 20 20 20  vious " \..     
1ef90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24                 $
1efa0 6e 61 6d 65 43 6f 75 6e 74 20 22 20 6e 61 6d 65  nameCount " name
1efb0 73 20 61 6e 64 20 22 20 24 76 61 6c 75 65 43 6f  s and " $valueCo
1efc0 75 6e 74 20 22 20 76 61 6c 75 65 73 5c 6e 22 5d  unt " values\n"]
1efd0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1efe0 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  }..            }
1eff0 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
1f000 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
1f010 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
1f020 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
1f030 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
1f040 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
1f050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d                "=
1f060 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69  === WARNING: fai
1f070 6c 65 64 20 74 6f 20 72 65 73 65 74 20 6f 74 68  led to reset oth
1f080 65 72 20 63 6f 75 6e 74 65 72 73 20 66 6f 72 20  er counters for 
1f090 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
1f0a0 20 20 20 20 20 20 20 20 20 22 74 68 65 20 70 72           "the pr
1f0b0 65 76 69 6f 75 73 20 22 20 24 6e 61 6d 65 43 6f  evious " $nameCo
1f0c0 75 6e 74 20 22 20 6e 61 6d 65 73 20 61 6e 64 20  unt " names and 
1f0d0 22 20 24 76 61 6c 75 65 43 6f 75 6e 74 20 5c 0d  " $valueCount \.
1f0e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f0f0 20 20 20 20 20 22 20 76 61 6c 75 65 73 2c 20 65       " values, e
1f100 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72  rror: " \n\t $er
1f110 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ror \n]..       
1f120 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1f130 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
1f140 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
1f150 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
1f160 20 20 69 66 20 7b 5b 68 61 76 65 53 51 4c 69 74    if {[haveSQLit
1f170 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d 20  eObjectCommand] 
1f180 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
1f190 5b 68 61 76 65 53 51 4c 69 74 65 44 65 66 69 6e  [haveSQLiteDefin
1f1a0 65 43 6f 6e 73 74 61 6e 74 20 49 4e 54 45 52 4f  eConstant INTERO
1f1b0 50 5f 56 49 52 54 55 41 4c 5f 54 41 42 4c 45 5d  P_VIRTUAL_TABLE]
1f1c0 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
1f1d0 20 5b 68 61 76 65 53 51 4c 69 74 65 44 65 66 69   [haveSQLiteDefi
1f1e0 6e 65 43 6f 6e 73 74 61 6e 74 20 54 52 41 43 4b  neConstant TRACK
1f1f0 5f 4d 45 4d 4f 52 59 5f 42 59 54 45 53 5d 7d 20  _MEMORY_BYTES]} 
1f200 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1f210 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
1f220 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74  n {..          t
1f230 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d  puts $channel "-
1f240 2d 2d 2d 20 63 75 72 72 65 6e 74 20 6d 65 6d 6f  --- current memo
1f250 72 79 20 69 6e 20 75 73 65 20 62 79 20 53 51 4c  ry in use by SQL
1f260 69 74 65 4d 65 6d 6f 72 79 2e 2e 2e 20 22 0d 0a  iteMemory... "..
1f270 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
1f280 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
1f290 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a  {..          obj
1f2a0 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67  ect invoke -flag
1f2b0 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a  s +NonPublic \..
1f2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79                Sy
1f2d0 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
1f2e0 2e 53 51 4c 69 74 65 4d 65 6d 6f 72 79 20 62 79  .SQLiteMemory by
1f2f0 74 65 73 41 6c 6c 6f 63 61 74 65 64 0d 0a 20 20  tesAllocated..  
1f300 20 20 20 20 20 20 7d 20 6d 65 6d 6f 72 79 5d 20        } memory] 
1f310 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
1f320 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
1f330 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
1f340 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
1f350 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
1f360 72 67 73 20 24 6d 65 6d 6f 72 79 20 22 20 62 79  rgs $memory " by
1f370 74 65 73 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20  tes\n"]..       
1f380 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20     }..        } 
1f390 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
1f3a0 20 20 73 65 74 20 6d 65 6d 6f 72 79 20 75 6e 6b    set memory unk
1f3b0 6e 6f 77 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20  nown....        
1f3c0 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
1f3d0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1f3e0 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
1f3f0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d  l [appendArgs $m
1f400 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20 20 20  emory \n]..     
1f410 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
1f420 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20  }....        if 
1f430 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
1f440 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74  ..          tput
1f450 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d  s $channel "----
1f460 20 6d 61 78 69 6d 75 6d 20 6d 65 6d 6f 72 79 20   maximum memory 
1f470 69 6e 20 75 73 65 20 62 79 20 53 51 4c 69 74 65  in use by SQLite
1f480 4d 65 6d 6f 72 79 2e 2e 2e 20 22 0d 0a 20 20 20  Memory... "..   
1f490 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
1f4a0 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
1f4b0 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74            object
1f4c0 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b   invoke -flags +
1f4d0 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20  NonPublic \..   
1f4e0 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65             Syste
1f4f0 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51  m.Data.SQLite.SQ
1f500 4c 69 74 65 4d 65 6d 6f 72 79 20 6d 61 78 69 6d  LiteMemory maxim
1f510 75 6d 42 79 74 65 73 41 6c 6c 6f 63 61 74 65 64  umBytesAllocated
1f520 0d 0a 20 20 20 20 20 20 20 20 7d 20 6d 65 6d 6f  ..        } memo
1f530 72 79 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  ry] == 0} then {
1f540 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
1f550 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
1f560 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
1f570 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
1f580 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20  endArgs $memory 
1f590 22 20 62 79 74 65 73 5c 6e 22 5d 0d 0a 20 20 20  " bytes\n"]..   
1f5a0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1f5b0 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
1f5c0 20 20 20 20 20 20 73 65 74 20 6d 65 6d 6f 72 79        set memory
1f5d0 20 75 6e 6b 6e 6f 77 6e 0d 0a 0d 0a 20 20 20 20   unknown....    
1f5e0 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
1f5f0 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
1f600 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
1f610 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
1f620 73 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20  s $memory \n].. 
1f630 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
1f640 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
1f650 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 24 71 75  ..      if {!$qu
1f660 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
1f670 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
1f680 6e 65 6c 20 22 2d 2d 2d 2d 20 63 75 72 72 65 6e  nel "---- curren
1f690 74 20 6d 65 6d 6f 72 79 20 69 6e 20 75 73 65 20  t memory in use 
1f6a0 62 79 20 53 51 4c 69 74 65 2e 2e 2e 20 22 0d 0a  by SQLite... "..
1f6b0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
1f6c0 20 69 66 20 7b 5b 68 61 76 65 53 51 4c 69 74 65   if {[haveSQLite
1f6d0 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20  ObjectCommand]} 
1f6e0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1f6f0 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20  if {[catch {..  
1f700 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69          object i
1f710 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f  nvoke -flags +No
1f720 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20  nPublic \..     
1f730 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e           System.
1f740 44 61 74 61 2e 53 51 4c 69 74 65 2e 55 6e 73 61  Data.SQLite.Unsa
1f750 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 20  feNativeMethods 
1f760 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 75  sqlite3_memory_u
1f770 73 65 64 0d 0a 20 20 20 20 20 20 20 20 7d 20 6d  sed..        } m
1f780 65 6d 6f 72 79 5d 20 3d 3d 20 30 7d 20 74 68 65  emory] == 0} the
1f790 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69  n {..          i
1f7a0 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
1f7b0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1f7c0 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
1f7d0 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f  appendArgs $memo
1f7e0 72 79 20 22 20 62 79 74 65 73 5c 6e 22 5d 0d 0a  ry " bytes\n"]..
1f7f0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
1f800 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
1f810 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
1f820 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4d 61        # NOTE: Ma
1f830 79 62 65 20 74 68 65 20 53 51 4c 69 74 65 20 63  ybe the SQLite c
1f840 6f 72 65 20 6c 69 62 72 61 72 79 20 69 73 20 75  ore library is u
1f850 6e 61 76 61 69 6c 61 62 6c 65 3f 0d 0a 20 20 20  navailable?..   
1f860 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1f870 20 20 20 20 73 65 74 20 6d 65 6d 6f 72 79 20 75      set memory u
1f880 6e 6b 6e 6f 77 6e 0d 0a 0d 0a 20 20 20 20 20 20  nknown....      
1f890 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
1f8a0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1f8b0 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
1f8c0 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
1f8d0 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20  $memory \n]..   
1f8e0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1f8f0 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73    }..      } els
1f900 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74  e {..        set
1f910 20 6d 65 6d 6f 72 79 20 75 6e 61 76 61 69 6c 61   memory unavaila
1f920 62 6c 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69  ble....        i
1f930 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
1f940 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70   {..          tp
1f950 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
1f960 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79  pendArgs $memory
1f970 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d   \n]..        }.
1f980 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
1f990 20 20 73 65 74 20 72 65 73 75 6c 74 20 24 6d 65    set result $me
1f9a0 6d 6f 72 79 3b 20 23 20 4e 4f 54 45 3a 20 52 65  mory; # NOTE: Re
1f9b0 74 75 72 6e 20 6d 65 6d 6f 72 79 20 69 6e 2d 75  turn memory in-u
1f9c0 73 65 20 74 6f 20 6f 75 72 20 63 61 6c 6c 65 72  se to our caller
1f9d0 2e 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 21  .....      if {!
1f9e0 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
1f9f0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
1fa00 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 6d 61 78  hannel "---- max
1fa10 69 6d 75 6d 20 6d 65 6d 6f 72 79 20 69 6e 20 75  imum memory in u
1fa20 73 65 20 62 79 20 53 51 4c 69 74 65 2e 2e 2e 20  se by SQLite... 
1fa30 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  "..      }....  
1fa40 20 20 20 20 69 66 20 7b 5b 68 61 76 65 53 51 4c      if {[haveSQL
1fa50 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64  iteObjectCommand
1fa60 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
1fa70 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d     if {[catch {.
1fa80 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63  .          objec
1fa90 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20  t invoke -flags 
1faa0 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20  +NonPublic \..  
1fab0 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74              Syst
1fac0 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 55  em.Data.SQLite.U
1fad0 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f  nsafeNativeMetho
1fae0 64 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ds \..          
1faf0 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f      sqlite3_memo
1fb00 72 79 5f 68 69 67 68 77 61 74 65 72 20 30 0d 0a  ry_highwater 0..
1fb10 20 20 20 20 20 20 20 20 7d 20 6d 65 6d 6f 72 79          } memory
1fb20 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
1fb30 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24            if {!$
1fb40 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
1fb50 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
1fb60 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
1fb70 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 22 20  dArgs $memory " 
1fb80 62 79 74 65 73 5c 6e 22 5d 0d 0a 20 20 20 20 20  bytes\n"]..     
1fb90 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
1fba0 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
1fbb0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
1fbc0 20 23 20 4e 4f 54 45 3a 20 4d 61 79 62 65 20 74   # NOTE: Maybe t
1fbd0 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20 6c  he SQLite core l
1fbe0 69 62 72 61 72 79 20 69 73 20 75 6e 61 76 61 69  ibrary is unavai
1fbf0 6c 61 62 6c 65 3f 0d 0a 20 20 20 20 20 20 20 20  lable?..        
1fc00 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73    #..          s
1fc10 65 74 20 6d 65 6d 6f 72 79 20 75 6e 6b 6e 6f 77  et memory unknow
1fc20 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69  n....          i
1fc30 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
1fc40 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1fc50 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
1fc60 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f  appendArgs $memo
1fc70 72 79 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  ry \n]..        
1fc80 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
1fc90 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
1fca0 20 20 20 20 20 20 20 20 73 65 74 20 6d 65 6d 6f          set memo
1fcb0 72 79 20 75 6e 61 76 61 69 6c 61 62 6c 65 0d 0a  ry unavailable..
1fcc0 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 24  ..        if {!$
1fcd0 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
1fce0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
1fcf0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
1fd00 72 67 73 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d  rgs $memory \n].
1fd10 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
1fd20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20    }....      if 
1fd30 7b 24 63 6f 6c 6c 65 63 74 7d 20 74 68 65 6e 20  {$collect} then 
1fd40 7b 0d 0a 20 20 20 20 20 20 20 20 63 6f 6c 6c 65  {..        colle
1fd50 63 74 47 61 72 62 61 67 65 20 24 63 68 61 6e 6e  ctGarbage $chann
1fd60 65 6c 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  el..      }.... 
1fd70 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
1fd80 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1fd90 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
1fda0 20 22 2d 2d 2d 2d 20 63 75 72 72 65 6e 74 20 6d   "---- current m
1fdb0 65 6d 6f 72 79 20 69 6e 20 75 73 65 20 62 79 20  emory in use by 
1fdc0 74 68 65 20 43 4c 52 2e 2e 2e 20 22 0d 0a 20 20  the CLR... "..  
1fdd0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69      }....      i
1fde0 66 20 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f 62  f {[haveSQLiteOb
1fdf0 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68  jectCommand]} th
1fe00 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66  en {..        if
1fe10 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
1fe20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76        object inv
1fe30 6f 6b 65 20 47 43 20 47 65 74 54 6f 74 61 6c 4d  oke GC GetTotalM
1fe40 65 6d 6f 72 79 20 66 61 6c 73 65 0d 0a 20 20 20  emory false..   
1fe50 20 20 20 20 20 7d 20 6d 65 6d 6f 72 79 5d 20 3d       } memory] =
1fe60 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
1fe70 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69         if {[stri
1fe80 6e 67 20 69 73 20 69 6e 74 65 67 65 72 20 2d 73  ng is integer -s
1fe90 74 72 69 63 74 20 24 6d 65 6d 6f 72 79 5d 7d 20  trict $memory]} 
1fea0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1feb0 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
1fec0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1fed0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
1fee0 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
1fef0 73 20 24 6d 65 6d 6f 72 79 20 22 20 62 79 74 65  s $memory " byte
1ff00 73 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20  s\n"]..         
1ff10 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
1ff20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
1ff30 20 20 20 20 20 20 73 65 74 20 6d 65 6d 6f 72 79        set memory
1ff40 20 69 6e 76 61 6c 69 64 0d 0a 0d 0a 20 20 20 20   invalid....    
1ff50 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
1ff60 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
1ff70 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
1ff80 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
1ff90 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 5c 6e  dArgs $memory \n
1ffa0 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ]..            }
1ffb0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
1ffc0 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
1ffd0 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20 6d  .          set m
1ffe0 65 6d 6f 72 79 20 75 6e 6b 6e 6f 77 6e 0d 0a 0d  emory unknown...
1fff0 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21  .          if {!
20000 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
20010 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
20020 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
20030 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 5c  ndArgs $memory \
20040 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  n]..          }.
20050 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
20060 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
20070 20 20 20 20 73 65 74 20 6d 65 6d 6f 72 79 20 75      set memory u
20080 6e 61 76 61 69 6c 61 62 6c 65 0d 0a 0d 0a 20 20  navailable....  
20090 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
200a0 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
200b0 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
200c0 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
200d0 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20  $memory \n]..   
200e0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
200f0 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ...      return 
20100 24 72 65 73 75 6c 74 0d 0a 20 20 20 20 7d 0d 0a  $result..    }..
20110 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 68 65 63  ...    proc chec
20120 6b 46 6f 72 53 51 4c 69 74 65 44 69 72 65 63 74  kForSQLiteDirect
20130 6f 72 69 65 73 20 7b 20 63 68 61 6e 6e 65 6c 20  ories { channel 
20140 7b 72 65 73 65 74 20 66 61 6c 73 65 7d 20 7d 20  {reset false} } 
20150 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
20160 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20    # NOTE: Check 
20170 69 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f 77  if the sqlite3_w
20180 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f  in32_set_directo
20190 72 79 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  ry function is a
201a0 76 61 69 6c 61 62 6c 65 2e 0d 0a 20 20 20 20 20  vailable...     
201b0 20 23 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20   #..      tputs 
201c0 24 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20  $channel \..    
201d0 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65 63        "---- chec
201e0 6b 69 6e 67 20 66 6f 72 20 66 75 6e 63 74 69 6f  king for functio
201f0 6e 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  n sqlite3_win32_
20200 73 65 74 5f 64 69 72 65 63 74 6f 72 79 2e 2e 2e  set_directory...
20210 20 22 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   "....      #.. 
20220 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69       # NOTE: Thi
20230 73 20 63 61 6c 6c 20 74 6f 20 74 68 65 20 73 71  s call to the sq
20240 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f  lite3_win32_set_
20250 64 69 72 65 63 74 6f 72 79 20 66 75 6e 63 74 69  directory functi
20260 6f 6e 20 75 73 65 73 20 74 68 65 0d 0a 20 20 20  on uses the..   
20270 20 20 20 23 20 20 20 20 20 20 20 69 6e 76 61 6c     #       inval
20280 69 64 20 76 61 6c 75 65 20 30 20 66 6f 72 20 74  id value 0 for t
20290 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
202a0 74 2e 20 20 54 68 69 73 20 63 6f 64 65 20 69 73  t.  This code is
202b0 20 64 65 73 69 67 6e 65 64 0d 0a 20 20 20 20 20   designed..     
202c0 20 23 20 20 20 20 20 20 20 74 6f 20 63 68 65 63   #       to chec
202d0 6b 20 69 66 20 63 61 6c 6c 69 6e 67 20 74 68 65  k if calling the
202e0 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 72   function will r
202f0 61 69 73 65 20 61 6e 20 65 78 63 65 70 74 69 6f  aise an exceptio
20300 6e 20 28 69 2e 65 2e 0d 0a 20 20 20 20 20 20 23  n (i.e...      #
20310 20 20 20 20 20 20 20 74 68 65 20 61 63 74 75 61         the actua
20320 6c 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  l result of the 
20330 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  function does no
20340 74 20 6d 61 74 74 65 72 20 61 73 20 6c 6f 6e 67  t matter as long
20350 20 61 73 20 6e 6f 0d 0a 20 20 20 20 20 20 23 20   as no..      # 
20360 20 20 20 20 20 20 64 69 72 65 63 74 6f 72 79 20        directory 
20370 69 73 20 63 68 61 6e 67 65 64 29 2e 0d 0a 20 20  is changed)...  
20380 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
20390 7b 5b 69 73 57 69 6e 64 6f 77 73 5d 20 26 26 20  {[isWindows] && 
203a0 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
203b0 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20    object invoke 
203c0 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69  -flags +NonPubli
203d0 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  c \..           
203e0 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
203f0 69 74 65 2e 55 6e 73 61 66 65 4e 61 74 69 76 65  ite.UnsafeNative
20400 4d 65 74 68 6f 64 73 20 5c 0d 0a 20 20 20 20 20  Methods \..     
20410 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 77         sqlite3_w
20420 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f  in32_set_directo
20430 72 79 20 30 20 6e 75 6c 6c 0d 0a 20 20 20 20 20  ry 0 null..     
20440 20 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b   }] == 0} then {
20450 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
20460 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 61 6c       # NOTE: Cal
20470 6c 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33  ling the sqlite3
20480 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63  _win32_set_direc
20490 74 6f 72 79 20 66 75 6e 63 74 69 6f 6e 20 64 6f  tory function do
204a0 65 73 20 6e 6f 74 0d 0a 20 20 20 20 20 20 20 20  es not..        
204b0 23 20 20 20 20 20 20 20 63 61 75 73 65 20 61 6e  #       cause an
204c0 20 65 78 63 65 70 74 69 6f 6e 3b 20 74 68 65 72   exception; ther
204d0 65 66 6f 72 65 2c 20 69 74 20 6d 75 73 74 20 62  efore, it must b
204e0 65 20 61 76 61 69 6c 61 62 6c 65 20 28 69 2e 65  e available (i.e
204f0 2e 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  ...        #    
20500 20 20 20 65 76 65 6e 20 74 68 6f 75 67 68 20 69     even though i
20510 74 20 73 68 6f 75 6c 64 20 72 65 74 75 72 6e 20  t should return 
20520 61 20 66 61 69 6c 75 72 65 20 72 65 74 75 72 6e  a failure return
20530 20 63 6f 64 65 20 69 6e 20 74 68 69 73 0d 0a 20   code in this.. 
20540 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63         #       c
20550 61 73 65 29 2e 0d 0a 20 20 20 20 20 20 20 20 23  ase)...        #
20560 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e  ..        addCon
20570 73 74 72 61 69 6e 74 20 73 71 6c 69 74 65 33 5f  straint sqlite3_
20580 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74  win32_set_direct
20590 6f 72 79 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74  ory....        t
205a0 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 79 65  puts $channel ye
205b0 73 5c 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23  s\n....        #
205c0 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
205d0 3a 20 44 6f 65 73 20 6f 75 72 20 63 61 6c 6c 65  : Does our calle
205e0 72 20 77 61 6e 74 20 74 6f 20 72 65 73 65 74 20  r want to reset 
205f0 74 68 65 20 64 69 72 65 63 74 6f 72 69 65 73 3f  the directories?
20600 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
20610 20 20 20 20 20 69 66 20 7b 24 72 65 73 65 74 7d       if {$reset}
20620 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
20630 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
20640 23 20 4e 4f 54 45 3a 20 4e 6f 77 20 6d 61 6b 65  # NOTE: Now make
20650 20 73 75 72 65 20 74 68 65 20 64 61 74 61 62 61   sure the databa
20660 73 65 20 61 6e 64 20 74 65 6d 70 6f 72 61 72 79  se and temporary
20670 20 64 69 72 65 63 74 6f 72 69 65 73 20 61 72 65   directories are
20680 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20  ..          #   
20690 20 20 20 20 72 65 73 65 74 20 74 68 65 69 72 20      reset their 
206a0 64 65 66 61 75 6c 74 20 76 61 6c 75 65 73 2c 20  default values, 
206b0 77 68 69 63 68 20 73 68 6f 75 6c 64 20 62 65 20  which should be 
206c0 6e 75 6c 6c 20 66 6f 72 20 62 6f 74 68 2e 0d 0a  null for both...
206d0 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
206e0 20 20 53 69 6e 63 65 20 74 68 65 20 73 71 6c 69    Since the sqli
206f0 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69  te3_win32_set_di
20700 72 65 63 74 6f 72 79 20 66 75 6e 63 74 69 6f 6e  rectory function
20710 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 0d 0a   is available,..
20720 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
20730 20 20 75 73 65 20 69 74 2e 0d 0a 20 20 20 20 20    use it...     
20740 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
20750 20 20 66 6f 72 20 7b 73 65 74 20 69 6e 64 65 78    for {set index
20760 20 31 7d 20 7b 24 69 6e 64 65 78 20 3c 20 33 7d   1} {$index < 3}
20770 20 7b 69 6e 63 72 20 69 6e 64 65 78 7d 20 7b 0d   {incr index} {.
20780 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
20790 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
207a0 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20           object 
207b0 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e  invoke -flags +N
207c0 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20  onPublic \..    
207d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79                Sy
207e0 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
207f0 2e 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74  .UnsafeNativeMet
20800 68 6f 64 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  hods \..        
20810 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
20820 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65  3_win32_set_dire
20830 63 74 6f 72 79 20 24 69 6e 64 65 78 20 6e 75 6c  ctory $index nul
20840 6c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  l..            }
20850 20 72 65 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74   result] == 0} t
20860 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
20870 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
20880 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
20890 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
208a0 20 20 20 20 20 22 2d 2d 2d 2d 20 63 61 6c 6c 20       "---- call 
208b0 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65  sqlite3_win32_se
208c0 74 5f 64 69 72 65 63 74 6f 72 79 28 22 20 24 69  t_directory(" $i
208d0 6e 64 65 78 20 5c 0d 0a 20 20 20 20 20 20 20 20  ndex \..        
208e0 20 20 20 20 20 20 20 20 20 20 22 2c 20 6e 75 6c            ", nul
208f0 6c 29 2e 2e 2e 20 6f 6b 3a 20 22 20 24 72 65 73  l)... ok: " $res
20900 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ult \n]..       
20910 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
20920 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
20930 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
20940 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
20950 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
20960 2d 2d 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f  -- call sqlite3_
20970 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74  win32_set_direct
20980 6f 72 79 28 22 20 24 69 6e 64 65 78 20 5c 0d 0a  ory(" $index \..
20990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
209a0 20 20 22 2c 20 6e 75 6c 6c 29 2e 2e 2e 20 65 72    ", null)... er
209b0 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 72 65 73  ror: " \n\t $res
209c0 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ult \n]..       
209d0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
209e0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
209f0 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
20a00 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
20a10 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 0d 0a 20  hannel no\n.... 
20a20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
20a30 20 20 23 20 4e 4f 54 45 3a 20 44 6f 65 73 20 6f    # NOTE: Does o
20a40 75 72 20 63 61 6c 6c 65 72 20 77 61 6e 74 20 74  ur caller want t
20a50 6f 20 72 65 73 65 74 20 74 68 65 20 64 69 72 65  o reset the dire
20a60 63 74 6f 72 69 65 73 3f 20 20 54 68 69 73 20 63  ctories?  This c
20a70 61 6e 20 6f 6e 6c 79 0d 0a 20 20 20 20 20 20 20  an only..       
20a80 20 23 20 20 20 20 20 20 20 62 65 20 70 65 72 66   #       be perf
20a90 6f 72 6d 65 64 20 69 66 20 53 51 4c 69 74 65 20  ormed if SQLite 
20aa0 69 73 20 6c 6f 61 64 65 64 20 61 6e 64 20 72 65  is loaded and re
20ab0 61 64 79 20 66 6f 72 20 75 73 65 20 62 79 20 74  ady for use by t
20ac0 68 65 20 74 65 73 74 0d 0a 20 20 20 20 20 20 20  he test..       
20ad0 20 23 20 20 20 20 20 20 20 73 75 69 74 65 2e 0d   #       suite..
20ae0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
20af0 20 20 20 20 69 66 20 7b 24 72 65 73 65 74 20 26      if {$reset &
20b00 26 20 5b 69 73 53 51 4c 69 74 65 52 65 61 64 79  & [isSQLiteReady
20b10 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
20b20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
20b30 20 20 23 20 4e 4f 54 45 3a 20 4e 6f 77 20 6d 61    # NOTE: Now ma
20b40 6b 65 20 73 75 72 65 20 74 68 65 20 64 61 74 61  ke sure the data
20b50 62 61 73 65 20 61 6e 64 20 74 65 6d 70 6f 72 61  base and tempora
20b60 72 79 20 64 69 72 65 63 74 6f 72 69 65 73 20 61  ry directories a
20b70 72 65 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20  re..          # 
20b80 20 20 20 20 20 20 72 65 73 65 74 20 74 68 65 69        reset thei
20b90 72 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 73  r default values
20ba0 2c 20 77 68 69 63 68 20 73 68 6f 75 6c 64 20 62  , which should b
20bb0 65 20 6e 75 6c 6c 20 66 6f 72 20 62 6f 74 68 2e  e null for both.
20bc0 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20  ..          #   
20bd0 20 20 20 20 53 69 6e 63 65 20 74 68 65 20 73 71      Since the sq
20be0 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f  lite3_win32_set_
20bf0 64 69 72 65 63 74 6f 72 79 20 66 75 6e 63 74 69  directory functi
20c00 6f 6e 20 64 6f 65 73 20 6e 6f 74 0d 0a 20 20 20  on does not..   
20c10 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61         #       a
20c20 70 70 65 61 72 20 74 6f 20 62 65 20 61 76 61 69  ppear to be avai
20c30 6c 61 62 6c 65 2c 20 75 73 65 20 74 68 65 20 61  lable, use the a
20c40 73 73 6f 63 69 61 74 65 64 20 50 52 41 47 4d 41  ssociated PRAGMA
20c50 20 63 6f 6d 6d 61 6e 64 73 0d 0a 20 20 20 20 20   commands..     
20c60 20 20 20 20 20 23 20 20 20 20 20 20 20 69 6e 73       #       ins
20c70 74 65 61 64 2e 0d 0a 20 20 20 20 20 20 20 20 20  tead...         
20c80 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 66 6f   #..          fo
20c90 72 65 61 63 68 20 64 69 72 65 63 74 6f 72 79 20  reach directory 
20ca0 5b 6c 69 73 74 20 64 61 74 61 5f 73 74 6f 72 65  [list data_store
20cb0 5f 64 69 72 65 63 74 6f 72 79 20 74 65 6d 70 5f  _directory temp_
20cc0 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 5d  store_directory]
20cd0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
20ce0 73 65 74 20 73 71 6c 20 5b 61 70 70 65 6e 64 41  set sql [appendA
20cf0 72 67 73 20 22 50 52 41 47 4d 41 20 22 20 24 64  rgs "PRAGMA " $d
20d00 69 72 65 63 74 6f 72 79 20 22 20 3d 20 5c 22 5c  irectory " = \"\
20d10 22 3b 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ";"]....        
20d20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
20d30 65 78 65 63 75 74 65 53 71 6c 20 24 73 71 6c 7d  executeSql $sql}
20d40 20 72 65 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74   result] == 0} t
20d50 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
20d60 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
20d70 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
20d80 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
20d90 20 20 20 20 20 22 2d 2d 2d 2d 20 65 78 65 63 75       "---- execu
20da0 74 65 20 50 52 41 47 4d 41 20 22 20 24 64 69 72  te PRAGMA " $dir
20db0 65 63 74 6f 72 79 20 22 2e 2e 2e 20 6f 6b 3a 20  ectory "... ok: 
20dc0 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  \"" \..         
20dd0 20 20 20 20 20 20 20 20 20 24 72 65 73 75 6c 74           $result
20de0 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20   \"\n]..        
20df0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
20e00 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
20e10 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
20e20 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
20e30 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
20e40 2d 20 65 78 65 63 75 74 65 20 50 52 41 47 4d 41  - execute PRAGMA
20e50 20 22 20 24 64 69 72 65 63 74 6f 72 79 20 22 2e   " $directory ".
20e60 2e 2e 20 65 72 72 6f 72 3a 20 22 20 5c 0d 0a 20  .. error: " \.. 
20e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e80 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e   \n\t $result \n
20e90 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ]..            }
20ea0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
20eb0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
20ec0 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
20ed0 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69 6e 61      # NOTE: Fina
20ee0 6c 6c 79 2c 20 73 68 6f 77 20 74 68 65 20 63 75  lly, show the cu
20ef0 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 74  rrent value of t
20f00 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  he database and 
20f10 74 65 6d 70 6f 72 61 72 79 0d 0a 20 20 20 20 20  temporary..     
20f20 20 23 20 20 20 20 20 20 20 64 69 72 65 63 74 6f   #       directo
20f30 72 69 65 73 2e 20 20 54 68 69 73 20 63 61 6e 20  ries.  This can 
20f40 6f 6e 6c 79 20 62 65 20 70 65 72 66 6f 72 6d 65  only be performe
20f50 64 20 69 66 20 53 51 4c 69 74 65 20 69 73 20 6c  d if SQLite is l
20f60 6f 61 64 65 64 0d 0a 20 20 20 20 20 20 23 20 20  oaded..      #  
20f70 20 20 20 20 20 61 6e 64 20 72 65 61 64 79 20 66       and ready f
20f80 6f 72 20 75 73 65 20 62 79 20 74 68 65 20 74 65  or use by the te
20f90 73 74 20 73 75 69 74 65 2e 0d 0a 20 20 20 20 20  st suite...     
20fa0 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69   #..      if {[i
20fb0 73 53 51 4c 69 74 65 52 65 61 64 79 5d 7d 20 74  sSQLiteReady]} t
20fc0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 66  hen {..        f
20fd0 6f 72 65 61 63 68 20 64 69 72 65 63 74 6f 72 79  oreach directory
20fe0 20 5b 6c 69 73 74 20 64 61 74 61 5f 73 74 6f 72   [list data_stor
20ff0 65 5f 64 69 72 65 63 74 6f 72 79 20 74 65 6d 70  e_directory temp
21000 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79  _store_directory
21010 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74  ] {..          t
21020 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
21030 70 70 65 6e 64 41 72 67 73 20 22 2d 2d 2d 2d 20  ppendArgs "---- 
21040 63 68 65 63 6b 69 6e 67 20 22 20 24 64 69 72 65  checking " $dire
21050 63 74 6f 72 79 20 22 2e 2e 2e 20 22 5d 0d 0a 0d  ctory "... "]...
21060 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20 73  .          set s
21070 71 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22  ql [appendArgs "
21080 50 52 41 47 4d 41 20 22 20 24 64 69 72 65 63 74  PRAGMA " $direct
21090 6f 72 79 20 5c 3b 5d 0d 0a 0d 0a 20 20 20 20 20  ory \;]....     
210a0 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
210b0 7b 65 78 65 63 75 74 65 53 71 6c 20 24 73 71 6c  {executeSql $sql
210c0 20 73 63 61 6c 61 72 7d 20 72 65 73 75 6c 74 5d   scalar} result]
210d0 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
210e0 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
210f0 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
21100 64 41 72 67 73 20 22 6f 6b 3a 20 5c 22 22 20 24  dArgs "ok: \"" $
21110 72 65 73 75 6c 74 20 5c 22 5c 6e 5d 0d 0a 20 20  result \"\n]..  
21120 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
21130 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
21140 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
21150 70 65 6e 64 41 72 67 73 20 22 65 72 72 6f 72 3a  pendArgs "error:
21160 20 22 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20   " \n\t $result 
21170 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  \n]..          }
21180 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
21190 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
211a0 20 20 20 20 70 72 6f 63 20 6c 6f 61 64 53 51 4c      proc loadSQL
211b0 69 74 65 54 65 73 74 53 65 74 74 69 6e 67 73 20  iteTestSettings 
211c0 7b 20 63 68 61 6e 6e 65 6c 20 7b 73 75 66 66 69  { channel {suffi
211d0 78 20 22 22 7d 20 7b 71 75 69 65 74 20 66 61 6c  x ""} {quiet fal
211e0 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23  se} } {..      #
211f0 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
21200 53 6b 69 70 20 6c 6f 61 64 69 6e 67 20 74 68 65  Skip loading the
21210 20 73 65 74 74 69 6e 67 73 20 69 66 20 74 68 65   settings if the
21220 69 72 20 75 73 61 67 65 20 68 61 73 20 62 65 65  ir usage has bee
21230 6e 20 64 69 73 61 62 6c 65 64 2e 0d 0a 20 20 20  n disabled...   
21240 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
21250 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
21260 6e 6f 28 73 71 6c 69 74 65 54 65 73 74 53 65 74  no(sqliteTestSet
21270 74 69 6e 67 73 29 5d 7d 20 74 68 65 6e 20 7b 0d  tings)]} then {.
21280 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
21290 20 20 20 20 23 20 4e 4f 54 45 3a 20 4c 6f 61 64      # NOTE: Load
212a0 20 63 75 73 74 6f 6d 20 70 65 72 2d 75 73 65 72   custom per-user
212b0 20 61 6e 64 2f 6f 72 20 70 65 72 2d 68 6f 73 74   and/or per-host
212c0 20 74 65 73 74 20 73 65 74 74 69 6e 67 73 20 6e   test settings n
212d0 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ow...        #..
212e0 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66          if {[inf
212f0 6f 20 65 78 69 73 74 73 20 3a 3a 74 63 6c 5f 70  o exists ::tcl_p
21300 6c 61 74 66 6f 72 6d 28 75 73 65 72 29 5d 7d 20  latform(user)]} 
21310 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
21320 20 20 73 65 74 20 75 73 65 72 53 65 74 74 69 6e    set userSettin
21330 67 73 46 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65  gsFileName [file
21340 20 6a 6f 69 6e 20 5b 67 65 74 43 6f 6d 6d 6f 6e   join [getCommon
21350 44 69 72 65 63 74 6f 72 79 5d 20 5c 0d 0a 20 20  Directory] \..  
21360 20 20 20 20 20 20 20 20 20 20 20 20 5b 61 70 70              [app
21370 65 6e 64 41 72 67 73 20 73 65 74 74 69 6e 67 73  endArgs settings
21380 20 24 73 75 66 66 69 78 20 2e 20 24 3a 3a 74 63   $suffix . $::tc
21390 6c 5f 70 6c 61 74 66 6f 72 6d 28 75 73 65 72 29  l_platform(user)
213a0 20 2e 65 61 67 6c 65 5d 5d 0d 0a 0d 0a 20 20 20   .eagle]]....   
213b0 20 20 20 20 20 20 20 69 66 20 7b 5b 66 69 6c 65         if {[file
213c0 20 65 78 69 73 74 73 20 24 75 73 65 72 53 65 74   exists $userSet
213d0 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 5d 7d 20  tingsFileName]} 
213e0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
213f0 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
21400 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
21410 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
21420 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
21430 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
21440 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6c 6f 61         "---- loa
21450 64 69 6e 67 20 70 65 72 2d 75 73 65 72 20 74 65  ding per-user te
21460 73 74 20 73 65 74 74 69 6e 67 73 20 66 69 6c 65  st settings file
21470 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20   \"" \..        
21480 20 20 20 20 20 20 20 20 20 20 24 75 73 65 72 53            $userS
21490 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 20  ettingsFileName 
214a0 5c 22 2e 2e 2e 5c 6e 5d 0d 0a 20 20 20 20 20 20  \"...\n]..      
214b0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
214c0 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
214d0 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  h {..           
214e0 20 20 20 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69     uplevel 1 [li
214f0 73 74 20 73 6f 75 72 63 65 20 24 75 73 65 72 53  st source $userS
21500 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 5d  ettingsFileName]
21510 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20  ..            } 
21520 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a  error]} then {..
21530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
21540 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
21550 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
21560 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
21570 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
21580 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21590 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49       "==== WARNI
215a0 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 6c 6f  NG: failed to lo
215b0 61 64 20 70 65 72 2d 75 73 65 72 20 73 65 74 74  ad per-user sett
215c0 69 6e 67 73 20 66 69 6c 65 20 5c 22 22 20 5c 0d  ings file \"" \.
215d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
215e0 20 20 20 20 20 24 75 73 65 72 53 65 74 74 69 6e       $userSettin
215f0 67 73 46 69 6c 65 4e 61 6d 65 20 22 5c 22 2c 20  gsFileName "\", 
21600 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65  error: " \n\t $e
21610 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  rror \n]..      
21620 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
21630 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
21640 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
21650 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24            if {!$
21660 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
21670 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
21680 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
21690 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
216a0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
216b0 2d 2d 20 73 6b 69 70 70 65 64 20 6c 6f 61 64 69  -- skipped loadi
216c0 6e 67 20 70 65 72 2d 75 73 65 72 20 74 65 73 74  ng per-user test
216d0 20 73 65 74 74 69 6e 67 73 20 66 69 6c 65 20 5c   settings file \
216e0 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  "" \..          
216f0 20 20 20 20 20 20 20 20 24 75 73 65 72 53 65 74          $userSet
21700 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 20 22 5c  tingsFileName "\
21710 22 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65  ", it does not e
21720 78 69 73 74 5c 6e 22 5d 0d 0a 20 20 20 20 20 20  xist\n"]..      
21730 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
21740 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
21750 0a 0d 0a 20 20 20 20 20 20 20 20 23 23 23 23 23  ...        #####
21760 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
21770 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
21780 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
21790 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
217a0 23 23 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66  ##....        if
217b0 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
217c0 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 68 6f  :tcl_platform(ho
217d0 73 74 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  st)]} then {..  
217e0 20 20 20 20 20 20 20 20 73 65 74 20 68 6f 73 74          set host
217f0 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65  SettingsFileName
21800 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74   [file join [get
21810 43 6f 6d 6d 6f 6e 44 69 72 65 63 74 6f 72 79 5d  CommonDirectory]
21820 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
21830 20 20 5b 61 70 70 65 6e 64 41 72 67 73 20 73 65    [appendArgs se
21840 74 74 69 6e 67 73 20 24 73 75 66 66 69 78 20 2e  ttings $suffix .
21850 20 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d   $::tcl_platform
21860 28 68 6f 73 74 29 20 2e 65 61 67 6c 65 5d 5d 0d  (host) .eagle]].
21870 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  ...          if 
21880 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 68  {[file exists $h
21890 6f 73 74 53 65 74 74 69 6e 67 73 46 69 6c 65 4e  ostSettingsFileN
218a0 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ame]} then {..  
218b0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24            if {!$
218c0 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
218d0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
218e0 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
218f0 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
21900 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
21910 2d 2d 20 6c 6f 61 64 69 6e 67 20 70 65 72 2d 68  -- loading per-h
21920 6f 73 74 20 74 65 73 74 20 73 65 74 74 69 6e 67  ost test setting
21930 73 20 66 69 6c 65 20 5c 22 22 20 5c 0d 0a 20 20  s file \"" \..  
21940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21950 24 68 6f 73 74 53 65 74 74 69 6e 67 73 46 69 6c  $hostSettingsFil
21960 65 4e 61 6d 65 20 5c 22 2e 2e 2e 5c 6e 5d 0d 0a  eName \"...\n]..
21970 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
21980 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
21990 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
219a0 20 20 20 20 20 20 20 20 20 75 70 6c 65 76 65 6c           uplevel
219b0 20 31 20 5b 6c 69 73 74 20 73 6f 75 72 63 65 20   1 [list source 
219c0 24 68 6f 73 74 53 65 74 74 69 6e 67 73 46 69 6c  $hostSettingsFil
219d0 65 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20 20 20  eName]..        
219e0 20 20 20 20 7d 20 65 72 72 6f 72 5d 7d 20 74 68      } error]} th
219f0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
21a00 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
21a10 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
21a20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
21a30 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
21a40 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
21a50 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d             "====
21a60 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64   WARNING: failed
21a70 20 74 6f 20 6c 6f 61 64 20 70 65 72 2d 68 6f 73   to load per-hos
21a80 74 20 73 65 74 74 69 6e 67 73 20 66 69 6c 65 20  t settings file 
21a90 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  \"" \..         
21aa0 20 20 20 20 20 20 20 20 20 20 20 24 68 6f 73 74             $host
21ab0 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65  SettingsFileName
21ac0 20 22 5c 22 2c 20 65 72 72 6f 72 3a 20 22 20 5c   "\", error: " \
21ad0 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a  n\t $error \n]..
21ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
21af0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
21b00 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
21b10 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
21b20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
21b30 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
21b40 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
21b50 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
21b60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21b70 20 20 20 22 2d 2d 2d 2d 20 73 6b 69 70 70 65 64     "---- skipped
21b80 20 6c 6f 61 64 69 6e 67 20 70 65 72 2d 68 6f 73   loading per-hos
21b90 74 20 74 65 73 74 20 73 65 74 74 69 6e 67 73 20  t test settings 
21ba0 66 69 6c 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20  file \"" \..    
21bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24 68                $h
21bc0 6f 73 74 53 65 74 74 69 6e 67 73 46 69 6c 65 4e  ostSettingsFileN
21bd0 61 6d 65 20 22 5c 22 2c 20 69 74 20 64 6f 65 73  ame "\", it does
21be0 20 6e 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a   not exist\n"]..
21bf0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
21c00 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
21c10 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
21c20 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
21c30 6f 63 20 63 6f 70 79 53 61 6d 70 6c 65 44 61 74  oc copySampleDat
21c40 61 62 61 73 65 46 69 6c 65 73 20 7b 7d 20 7b 0d  abaseFiles {} {.
21c50 0a 20 20 20 20 20 20 75 70 6c 65 76 65 6c 20 31  .      uplevel 1
21c60 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
21c70 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43         # NOTE: C
21c80 6f 70 79 20 28 6f 72 20 72 65 2d 63 6f 70 79 29  opy (or re-copy)
21c90 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 64   the reference d
21ca0 61 74 61 62 61 73 65 20 66 69 6c 65 20 75 73 65  atabase file use
21cb0 64 20 66 6f 72 20 74 68 69 73 0d 0a 20 20 20 20  d for this..    
21cc0 20 20 20 20 23 20 20 20 20 20 20 20 75 6e 69 74      #       unit
21cd0 20 74 65 73 74 20 74 6f 20 74 68 65 20 62 75 69   test to the bui
21ce0 6c 64 20 64 69 72 65 63 74 6f 72 79 20 69 6e 20  ld directory in 
21cf0 63 61 73 65 20 69 74 20 68 61 73 20 62 65 65 6e  case it has been
21d00 20 63 68 61 6e 67 65 64 0d 0a 20 20 20 20 20 20   changed..      
21d10 20 20 23 20 20 20 20 20 20 20 62 79 20 61 20 70    #       by a p
21d20 72 65 76 69 6f 75 73 20 74 65 73 74 20 72 75 6e  revious test run
21d30 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
21d40 20 20 20 20 20 20 66 69 6c 65 20 63 6f 70 79 20        file copy 
21d50 2d 66 6f 72 63 65 20 24 6e 6f 72 74 68 77 69 6e  -force $northwin
21d60 64 45 66 44 62 46 69 6c 65 20 5c 0d 0a 20 20 20  dEfDbFile \..   
21d70 20 20 20 20 20 20 20 5b 66 69 6c 65 20 6a 6f 69         [file joi
21d80 6e 20 5b 67 65 74 42 75 69 6c 64 44 69 72 65 63  n [getBuildDirec
21d90 74 6f 72 79 20 66 61 6c 73 65 5d 20 5b 66 69 6c  tory false] [fil
21da0 65 20 74 61 69 6c 20 24 6e 6f 72 74 68 77 69 6e  e tail $northwin
21db0 64 45 66 44 62 46 69 6c 65 5d 5d 0d 0a 20 20 20  dEfDbFile]]..   
21dc0 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
21dd0 20 20 20 20 70 72 6f 63 20 72 75 6e 53 51 4c 69      proc runSQLi
21de0 74 65 54 65 73 74 50 72 6f 6c 6f 67 75 65 20 7b  teTestPrologue {
21df0 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
21e00 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70      # NOTE: Skip
21e10 20 72 75 6e 6e 69 6e 67 20 6f 75 72 20 63 75 73   running our cus
21e20 74 6f 6d 20 70 72 6f 6c 6f 67 75 65 20 69 66 20  tom prologue if 
21e30 74 68 65 20 6d 61 69 6e 20 6f 6e 65 20 68 61 73  the main one has
21e40 20 62 65 65 6e 0d 0a 20 20 20 20 20 20 23 20 20   been..      #  
21e50 20 20 20 20 20 73 6b 69 70 70 65 64 2e 0d 0a 20       skipped... 
21e60 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
21e70 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
21e80 3a 3a 6e 6f 28 70 72 6f 6c 6f 67 75 65 2e 65 61  ::no(prologue.ea
21e90 67 6c 65 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  gle)]} then {.. 
21ea0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
21eb0 20 20 23 20 4e 4f 54 45 3a 20 4c 6f 61 64 20 74    # NOTE: Load t
21ec0 68 65 20 22 62 65 66 6f 72 65 2d 63 6f 6e 73 74  he "before-const
21ed0 72 61 69 6e 74 73 22 20 63 75 73 74 6f 6d 20 70  raints" custom p
21ee0 65 72 2d 75 73 65 72 20 61 6e 64 2f 6f 72 20 70  er-user and/or p
21ef0 65 72 2d 68 6f 73 74 0d 0a 20 20 20 20 20 20 20  er-host..       
21f00 20 23 20 20 20 20 20 20 20 74 65 73 74 20 73 65   #       test se
21f10 74 74 69 6e 67 73 20 6e 6f 77 2e 0d 0a 20 20 20  ttings now...   
21f20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
21f30 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74 20  uplevel 1 [list 
21f40 6c 6f 61 64 53 51 4c 69 74 65 54 65 73 74 53 65  loadSQLiteTestSe
21f50 74 74 69 6e 67 73 20 24 3a 3a 74 65 73 74 5f 63  ttings $::test_c
21f60 68 61 6e 6e 65 6c 20 2e 62 65 66 6f 72 65 5d 0d  hannel .before].
21f70 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
21f80 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68        # NOTE: Ch
21f90 65 63 6b 20 69 66 20 74 68 65 20 5b 6f 62 6a 65  eck if the [obje
21fa0 63 74 5d 20 63 6f 6d 6d 61 6e 64 20 69 73 20 61  ct] command is a
21fb0 76 61 69 6c 61 62 6c 65 3b 20 69 66 20 6e 6f 74  vailable; if not
21fc0 2c 20 61 64 64 20 73 6f 6d 65 0d 0a 20 20 20 20  , add some..    
21fd0 20 20 20 20 23 20 20 20 20 20 20 20 73 68 69 6d      #       shim
21fe0 73 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 74 65  s to make the te
21ff0 73 74 20 73 75 69 74 65 20 72 75 6e 20 73 6d 6f  st suite run smo
22000 6f 74 68 65 72 2e 0d 0a 20 20 20 20 20 20 20 20  other...        
22010 23 0d 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b  #..        check
22020 46 6f 72 53 51 4c 69 74 65 4f 62 6a 65 63 74 43  ForSQLiteObjectC
22030 6f 6d 6d 61 6e 64 20 24 3a 3a 74 65 73 74 5f 63  ommand $::test_c
22040 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20 20  hannel....      
22050 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
22060 4f 54 45 3a 20 44 65 74 65 72 6d 69 6e 65 20 74  OTE: Determine t
22070 68 65 20 6e 61 6d 65 73 20 6f 66 20 74 68 65 20  he names of the 
22080 6e 61 74 69 76 65 20 70 6c 61 74 66 6f 72 6d 20  native platform 
22090 61 6e 64 20 61 72 63 68 69 74 65 63 74 75 72 65  and architecture
220a0 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
220b0 20 20 20 20 20 20 73 65 74 20 70 6c 61 74 66 6f        set platfo
220c0 72 6d 20 5b 67 65 74 42 75 69 6c 64 50 6c 61 74  rm [getBuildPlat
220d0 66 6f 72 6d 20 74 72 75 65 5d 0d 0a 20 20 20 20  form true]..    
220e0 20 20 20 20 73 65 74 20 61 72 63 68 69 74 65 63      set architec
220f0 74 75 72 65 20 5b 61 72 63 68 69 74 65 63 74 75  ture [architectu
22100 72 65 46 6f 72 50 6c 61 74 66 6f 72 6d 20 24 70  reForPlatform $p
22110 6c 61 74 66 6f 72 6d 5d 0d 0a 0d 0a 20 20 20 20  latform]....    
22120 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
22130 20 4e 4f 54 45 3a 20 53 68 6f 77 20 74 68 65 20   NOTE: Show the 
22140 70 6c 61 74 66 6f 72 6d 20 61 6e 64 20 61 72 63  platform and arc
22150 68 69 74 65 63 74 75 72 65 20 75 73 65 64 20 74  hitecture used t
22160 6f 20 68 65 6c 70 20 6c 6f 63 61 74 65 20 74 68  o help locate th
22170 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
22180 20 20 20 6e 61 74 69 76 65 20 62 75 69 6c 64 20     native build 
22190 66 69 6c 65 73 2e 0d 0a 20 20 20 20 20 20 20 20  files...        
221a0 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  #..        tputs
221b0 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
221c0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
221d0 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
221e0 2d 20 70 6c 61 74 66 6f 72 6d 20 66 6f 72 20 6c  - platform for l
221f0 6f 63 61 74 69 6e 67 20 6e 61 74 69 76 65 20 62  ocating native b
22200 75 69 6c 64 20 66 69 6c 65 73 20 69 73 20 5c 22  uild files is \"
22210 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
22220 20 24 70 6c 61 74 66 6f 72 6d 20 5c 22 5c 6e 5d   $platform \"\n]
22230 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74  ....        tput
22240 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
22250 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
22260 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d  .            "--
22270 2d 2d 20 61 72 63 68 69 74 65 63 74 75 72 65 20  -- architecture 
22280 66 6f 72 20 6c 6f 63 61 74 69 6e 67 20 6e 61 74  for locating nat
22290 69 76 65 20 62 75 69 6c 64 20 66 69 6c 65 73 20  ive build files 
222a0 69 73 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20  is \"" \..      
222b0 20 20 20 20 20 20 24 61 72 63 68 69 74 65 63 74        $architect
222c0 75 72 65 20 5c 22 5c 6e 5d 0d 0a 0d 0a 20 20 20  ure \"\n]....   
222d0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
222e0 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20 61 20  # NOTE: Build a 
222f0 6c 69 73 74 20 6f 66 20 63 6f 6e 66 69 67 75 72  list of configur
22300 61 74 69 6f 6e 20 66 69 6c 65 73 20 74 68 61 74  ation files that
22310 20 77 65 20 68 61 6e 64 6c 65 2e 0d 0a 20 20 20   we handle...   
22320 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
22330 73 65 74 20 63 6f 6e 66 69 67 46 69 6c 65 4e 61  set configFileNa
22340 6d 65 73 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20  mes [list \..   
22350 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e           System.
22360 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 2e  Data.SQLite.dll.
22370 63 6f 6e 66 69 67 5d 0d 0a 0d 0a 20 20 20 20 20  config]....     
22380 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
22390 4e 4f 54 45 3a 20 42 75 69 6c 64 20 61 20 6c 69  NOTE: Build a li
223a0 73 74 20 6f 66 20 61 75 78 69 6c 69 61 72 79 20  st of auxiliary 
223b0 4d 61 6e 61 67 65 64 20 44 65 62 75 67 67 69 6e  Managed Debuggin
223c0 67 20 41 73 73 69 73 74 61 6e 74 73 20 28 4d 44  g Assistants (MD
223d0 41 29 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  A)..        #   
223e0 20 20 20 20 63 6f 6e 66 69 67 75 72 61 74 69 6f      configuratio
223f0 6e 20 66 69 6c 65 73 20 74 68 61 74 20 77 65 20  n files that we 
22400 68 61 6e 64 6c 65 2e 0d 0a 20 20 20 20 20 20 20  handle...       
22410 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   #..        set 
22420 6d 64 61 43 6f 6e 66 69 67 46 69 6c 65 4e 61 6d  mdaConfigFileNam
22430 65 73 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20  es [list \..    
22440 20 20 20 20 20 20 20 20 45 61 67 6c 65 53 68 65          EagleShe
22450 6c 6c 33 32 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e  ll32.exe.mda.con
22460 66 69 67 20 49 6e 73 74 61 6c 6c 65 72 2e 65 78  fig Installer.ex
22470 65 2e 6d 64 61 2e 63 6f 6e 66 69 67 20 5c 0d 0a  e.mda.config \..
22480 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
22490 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e 66 69 67 20  .exe.mda.config 
224a0 74 65 73 74 6c 69 6e 71 2e 65 78 65 2e 6d 64 61  testlinq.exe.mda
224b0 2e 63 6f 6e 66 69 67 20 5c 0d 0a 20 20 20 20 20  .config \..     
224c0 20 20 20 20 20 20 20 74 65 73 74 65 66 36 2e 65         testef6.e
224d0 78 65 2e 6d 64 61 2e 63 6f 6e 66 69 67 5d 0d 0a  xe.mda.config]..
224e0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
224f0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69       # NOTE: Bui
22500 6c 64 20 74 68 65 20 6c 69 73 74 20 6f 66 20 65  ld the list of e
22510 78 74 65 72 6e 61 6c 20 66 69 6c 65 73 20 74 68  xternal files th
22520 61 74 20 77 65 20 68 61 6e 64 6c 65 2e 20 20 53  at we handle.  S
22530 6f 6d 65 20 6f 66 0d 0a 20 20 20 20 20 20 20 20  ome of..        
22540 23 20 20 20 20 20 20 20 74 68 65 73 65 20 66 69  #       these fi
22550 6c 65 73 20 6d 61 79 20 62 65 20 6e 61 74 69 76  les may be nativ
22560 65 20 61 6e 64 2f 6f 72 20 6d 61 6e 61 67 65 64  e and/or managed
22570 20 61 73 73 65 6d 62 6c 69 65 73 20 74 68 61 74   assemblies that
22580 20 61 72 65 0d 0a 20 20 20 20 20 20 20 20 23 20   are..        # 
22590 20 20 20 20 20 20 72 65 71 75 69 72 65 64 20 74        required t
225a0 6f 20 70 65 72 66 6f 72 6d 20 76 61 72 69 6f 75  o perform variou
225b0 73 20 74 65 73 74 73 2e 0d 0a 20 20 20 20 20 20  s tests...      
225c0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74    #..        set
225d0 20 65 78 74 65 72 6e 61 6c 46 69 6c 65 4e 61 6d   externalFileNam
225e0 65 73 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20  es [list \..    
225f0 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 6a 6f          [file jo
22600 69 6e 20 45 6e 74 69 74 79 46 72 61 6d 65 77 6f  in EntityFramewo
22610 72 6b 20 6c 69 62 20 5b 73 74 72 69 6e 67 20 6d  rk lib [string m
22620 61 70 20 5b 6c 69 73 74 20 46 78 20 22 22 5d 20  ap [list Fx ""] 
22630 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
22640 73 74 72 69 6e 67 20 6d 61 70 20 5b 6c 69 73 74  string map [list
22650 20 6e 65 74 46 78 34 35 31 20 6e 65 74 46 78 34   netFx451 netFx4
22660 35 20 6e 65 74 46 78 34 35 32 20 6e 65 74 46 78  5 netFx452 netFx
22670 34 35 20 6e 65 74 46 78 34 36 20 5c 0d 0a 20 20  45 netFx46 \..  
22680 20 20 20 20 20 20 20 20 20 20 6e 65 74 46 78 34            netFx4
22690 35 20 6e 65 74 46 78 34 36 31 20 6e 65 74 46 78  5 netFx461 netFx
226a0 34 35 20 6e 65 74 46 78 34 36 32 20 6e 65 74 46  45 netFx462 netF
226b0 78 34 35 20 6e 65 74 46 78 34 37 20 6e 65 74 46  x45 netFx47 netF
226c0 78 34 35 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20  x45] \..        
226d0 20 20 20 20 5b 67 65 74 42 75 69 6c 64 4e 65 74      [getBuildNet
226e0 46 78 5d 5d 5d 20 45 6e 74 69 74 79 46 72 61 6d  Fx]]] EntityFram
226f0 65 77 6f 72 6b 2e 64 6c 6c 5d 5d 0d 0a 0d 0a 20  ework.dll]].... 
22700 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
22710 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20    # NOTE: Build 
22720 74 68 65 20 6c 69 73 74 20 6f 66 20 6e 61 74 69  the list of nati
22730 76 65 20 61 73 73 65 6d 62 6c 79 20 66 69 6c 65  ve assembly file
22740 73 20 74 68 61 74 20 77 65 20 68 61 6e 64 6c 65  s that we handle
22750 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
22760 20 20 20 20 20 20 73 65 74 20 6e 61 74 69 76 65        set native
22770 46 69 6c 65 4e 61 6d 65 73 20 5b 6c 69 73 74 5d  FileNames [list]
22780 0d 0a 0d 0a 20 20 20 20 20 20 20 20 65 76 61 6c  ....        eval
22790 20 6c 61 70 70 65 6e 64 20 6e 61 74 69 76 65 46   lappend nativeF
227a0 69 6c 65 4e 61 6d 65 73 20 5b 67 65 74 4e 61 74  ileNames [getNat
227b0 69 76 65 4c 69 62 72 61 72 79 46 69 6c 65 4e 61  iveLibraryFileNa
227c0 6d 65 73 4f 6e 6c 79 5d 0d 0a 20 20 20 20 20 20  mesOnly]..      
227d0 20 20 65 76 61 6c 20 6c 61 70 70 65 6e 64 20 6e    eval lappend n
227e0 61 74 69 76 65 46 69 6c 65 4e 61 6d 65 73 20 5b  ativeFileNames [
227f0 67 65 74 49 6e 74 65 72 6f 70 41 73 73 65 6d 62  getInteropAssemb
22800 6c 79 46 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79 5d  lyFileNamesOnly]
22810 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
22820 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42         # NOTE: B
22830 75 69 6c 64 20 74 68 65 20 6c 69 73 74 20 6f 66  uild the list of
22840 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73 65   mixed-mode asse
22850 6d 62 6c 79 20 66 69 6c 65 73 20 74 68 61 74 20  mbly files that 
22860 77 65 20 68 61 6e 64 6c 65 2e 0d 0a 20 20 20 20  we handle...    
22870 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73      #..        s
22880 65 74 20 6d 69 78 65 64 46 69 6c 65 4e 61 6d 65  et mixedFileName
22890 73 20 5b 6c 69 73 74 5d 0d 0a 0d 0a 20 20 20 20  s [list]....    
228a0 20 20 20 20 69 66 20 7b 5b 68 61 73 52 75 6e 74      if {[hasRunt
228b0 69 6d 65 4f 70 74 69 6f 6e 20 6e 61 74 69 76 65  imeOption native
228c0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
228d0 20 20 20 20 20 6c 61 70 70 65 6e 64 20 6d 69 78       lappend mix
228e0 65 64 46 69 6c 65 4e 61 6d 65 73 20 53 79 73 74  edFileNames Syst
228f0 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64  em.Data.SQLite.d
22900 6c 6c 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  ll..        }...
22910 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
22920 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c      # NOTE: Buil
22930 64 20 74 68 65 20 6c 69 73 74 20 6f 66 20 6d 61  d the list of ma
22940 6e 61 67 65 64 20 61 73 73 65 6d 62 6c 79 20 66  naged assembly f
22950 69 6c 65 73 20 74 68 61 74 20 77 65 20 68 61 6e  iles that we han
22960 64 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  dle...        #.
22970 0a 20 20 20 20 20 20 20 20 73 65 74 20 6d 61 6e  .        set man
22980 61 67 65 64 46 69 6c 65 4e 61 6d 65 73 20 5b 6c  agedFileNames [l
22990 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ist \..         
229a0 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53     System.Data.S
229b0 51 4c 69 74 65 2e 4c 69 6e 71 2e 64 6c 6c 20 53  QLite.Linq.dll S
229c0 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
229d0 65 2e 45 46 36 2e 64 6c 6c 5d 0d 0a 0d 0a 20 20  e.EF6.dll]....  
229e0 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61 73 52        if {![hasR
229f0 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 6e 61 74  untimeOption nat
22a00 69 76 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ive]} then {..  
22a10 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20          lappend 
22a20 6d 61 6e 61 67 65 64 46 69 6c 65 4e 61 6d 65 73  managedFileNames
22a30 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
22a40 69 74 65 2e 64 6c 6c 0d 0a 20 20 20 20 20 20 20  ite.dll..       
22a50 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d   }....        #.
22a60 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
22a70 20 53 68 6f 77 20 74 68 65 20 76 61 72 69 6f 75   Show the variou
22a80 73 20 6c 69 73 74 73 20 6f 66 20 66 69 6c 65 20  s lists of file 
22a90 6e 61 6d 65 73 20 74 68 61 74 20 61 72 65 20 68  names that are h
22aa0 61 6e 64 6c 65 64 20 62 79 20 74 68 69 73 0d 0a  andled by this..
22ab0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
22ac0 70 72 6f 63 65 64 75 72 65 2e 0d 0a 20 20 20 20  procedure...    
22ad0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 74      #..        t
22ae0 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
22af0 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
22b00 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
22b10 22 2d 2d 2d 2d 20 6c 69 73 74 20 6f 66 20 5c 22  "---- list of \"
22b20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 5c 22 20  configuration\" 
22b30 66 69 6c 65 20 6e 61 6d 65 73 20 69 73 3a 20 22  file names is: "
22b40 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
22b50 24 63 6f 6e 66 69 67 46 69 6c 65 4e 61 6d 65 73  $configFileNames
22b60 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20   \n]....        
22b70 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
22b80 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
22b90 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
22ba0 20 22 2d 2d 2d 2d 20 6c 69 73 74 20 6f 66 20 5c   "---- list of \
22bb0 22 4d 44 41 20 63 6f 6e 66 69 67 75 72 61 74 69  "MDA configurati
22bc0 6f 6e 5c 22 20 66 69 6c 65 20 6e 61 6d 65 73 20  on\" file names 
22bd0 69 73 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20  is: " \..       
22be0 20 20 20 20 20 24 6d 64 61 43 6f 6e 66 69 67 46       $mdaConfigF
22bf0 69 6c 65 4e 61 6d 65 73 20 5c 6e 5d 0d 0a 0d 0a  ileNames \n]....
22c00 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
22c10 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
22c20 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
22c30 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6c           "---- l
22c40 69 73 74 20 6f 66 20 5c 22 65 78 74 65 72 6e 61  ist of \"externa
22c50 6c 5c 22 20 66 69 6c 65 20 6e 61 6d 65 73 20 69  l\" file names i
22c60 73 3a 20 22 20 24 65 78 74 65 72 6e 61 6c 46 69  s: " $externalFi
22c70 6c 65 4e 61 6d 65 73 20 5c 6e 5d 0d 0a 0d 0a 20  leNames \n].... 
22c80 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
22c90 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
22ca0 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
22cb0 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6c 69          "---- li
22cc0 73 74 20 6f 66 20 5c 22 6e 61 74 69 76 65 5c 22  st of \"native\"
22cd0 20 66 69 6c 65 20 6e 61 6d 65 73 20 69 73 3a 20   file names is: 
22ce0 22 20 24 6e 61 74 69 76 65 46 69 6c 65 4e 61 6d  " $nativeFileNam
22cf0 65 73 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20  es \n]....      
22d00 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
22d10 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
22d20 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
22d30 20 20 20 22 2d 2d 2d 2d 20 6c 69 73 74 20 6f 66     "---- list of
22d40 20 5c 22 6d 69 78 65 64 5c 22 20 66 69 6c 65 20   \"mixed\" file 
22d50 6e 61 6d 65 73 20 69 73 3a 20 22 20 24 6d 69 78  names is: " $mix
22d60 65 64 46 69 6c 65 4e 61 6d 65 73 20 5c 6e 5d 0d  edFileNames \n].
22d70 0a 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  ...        tputs
22d80 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
22d90 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
22da0 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
22db0 2d 20 6c 69 73 74 20 6f 66 20 5c 22 6d 61 6e 61  - list of \"mana
22dc0 67 65 64 5c 22 20 66 69 6c 65 20 6e 61 6d 65 73  ged\" file names
22dd0 20 69 73 3a 20 22 20 24 6d 61 6e 61 67 65 64 46   is: " $managedF
22de0 69 6c 65 4e 61 6d 65 73 20 5c 6e 5d 0d 0a 0d 0a  ileNames \n]....
22df0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
22e00 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 6d 6f 76     # NOTE: Remov
22e10 65 20 61 6e 79 20 74 65 73 74 20 63 6f 6e 73 74  e any test const
22e20 72 61 69 6e 74 73 20 74 68 61 74 20 72 65 66 65  raints that refe
22e30 72 20 74 6f 20 74 68 65 20 6e 61 74 69 76 65 20  r to the native 
22e40 61 6e 64 2f 6f 72 0d 0a 20 20 20 20 20 20 20 20  and/or..        
22e50 23 20 20 20 20 20 20 20 6d 61 6e 61 67 65 64 20  #       managed 
22e60 61 73 73 65 6d 62 6c 79 20 66 69 6c 65 73 20 74  assembly files t
22e70 68 61 74 20 77 65 20 68 61 6e 64 6c 65 20 75 6e  hat we handle un
22e80 6c 65 73 73 20 66 6f 72 62 69 64 64 65 6e 20 66  less forbidden f
22e90 72 6f 6d 0d 0a 20 20 20 20 20 20 20 20 23 20 20  rom..        #  
22ea0 20 20 20 20 20 64 6f 69 6e 67 20 73 6f 2e 0d 0a       doing so...
22eb0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
22ec0 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
22ed0 69 73 74 73 20 3a 3a 6e 6f 28 73 71 6c 69 74 65  ists ::no(sqlite
22ee0 52 65 6d 6f 76 65 43 6f 6e 73 74 72 61 69 6e 74  RemoveConstraint
22ef0 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  s)]} then {..   
22f00 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66         foreach f
22f10 69 6c 65 4e 61 6d 65 20 24 63 6f 6e 66 69 67 46  ileName $configF
22f20 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20  ileNames {..    
22f30 20 20 20 20 20 20 20 20 72 65 6d 6f 76 65 43 6f          removeCo
22f40 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64  nstraint [append
22f50 41 72 67 73 20 66 69 6c 65 5f 20 24 66 69 6c 65  Args file_ $file
22f60 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20 20 20 20  Name]..         
22f70 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
22f80 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65  foreach fileName
22f90 20 24 6d 64 61 43 6f 6e 66 69 67 46 69 6c 65 4e   $mdaConfigFileN
22fa0 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20  ames {..        
22fb0 20 20 20 20 72 65 6d 6f 76 65 43 6f 6e 73 74 72      removeConstr
22fc0 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
22fd0 20 66 69 6c 65 5f 20 24 66 69 6c 65 4e 61 6d 65   file_ $fileName
22fe0 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ]..          }..
22ff0 0d 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 65  ..          fore
23000 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 65 78  ach fileName $ex
23010 74 65 72 6e 61 6c 46 69 6c 65 4e 61 6d 65 73 20  ternalFileNames 
23020 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  {..            r
23030 65 6d 6f 76 65 43 6f 6e 73 74 72 61 69 6e 74 20  emoveConstraint 
23040 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65  [appendArgs file
23050 5f 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69  _ [file tail $fi
23060 6c 65 4e 61 6d 65 5d 5d 0d 0a 20 20 20 20 20 20  leName]]..      
23070 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
23080 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e     foreach fileN
23090 61 6d 65 20 24 6e 61 74 69 76 65 46 69 6c 65 4e  ame $nativeFileN
230a0 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20  ames {..        
230b0 20 20 20 20 72 65 6d 6f 76 65 43 6f 6e 73 74 72      removeConstr
230c0 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
230d0 20 66 69 6c 65 5f 20 24 66 69 6c 65 4e 61 6d 65   file_ $fileName
230e0 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ]..          }..
230f0 0d 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 65  ..          fore
23100 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6d 69  ach fileName $mi
23110 78 65 64 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a  xedFileNames {..
23120 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6d 6f              remo
23130 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70  veConstraint [ap
23140 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 24  pendArgs file_ $
23150 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20 20 20  fileName]..     
23160 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
23170 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65      foreach file
23180 4e 61 6d 65 20 24 6d 61 6e 61 67 65 64 46 69 6c  Name $managedFil
23190 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20  eNames {..      
231a0 20 20 20 20 20 20 72 65 6d 6f 76 65 43 6f 6e 73        removeCons
231b0 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
231c0 67 73 20 66 69 6c 65 5f 20 24 66 69 6c 65 4e 61  gs file_ $fileNa
231d0 6d 65 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  me]..          }
231e0 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
231f0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
23200 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20 61    # NOTE: Skip a
23210 6c 6c 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  ll System.Data.S
23220 51 4c 69 74 65 20 72 65 6c 61 74 65 64 20 66 69  QLite related fi
23230 6c 65 20 68 61 6e 64 6c 69 6e 67 20 28 64 65 6c  le handling (del
23240 65 74 69 6e 67 2c 0d 0a 20 20 20 20 20 20 20 20  eting,..        
23250 23 20 20 20 20 20 20 20 63 6f 70 79 69 6e 67 2c  #       copying,
23260 20 61 6e 64 20 6c 6f 61 64 69 6e 67 29 20 69 66   and loading) if
23270 20 69 6e 73 74 72 75 63 74 65 64 2e 0d 0a 20 20   instructed...  
23280 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
23290 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
232a0 74 73 20 3a 3a 6e 6f 28 73 71 6c 69 74 65 46 69  ts ::no(sqliteFi
232b0 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  les)]} then {.. 
232c0 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
232d0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b        # NOTE: Sk
232e0 69 70 20 74 72 79 69 6e 67 20 74 6f 20 64 65 6c  ip trying to del
232f0 65 74 65 20 61 6e 79 20 66 69 6c 65 73 20 69 66  ete any files if
23300 20 69 6e 73 74 72 75 63 74 65 64 2e 0d 0a 20 20   instructed...  
23310 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
23320 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
23330 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65  exists ::no(dele
23340 74 65 53 71 6c 69 74 65 46 69 6c 65 73 29 5d 7d  teSqliteFiles)]}
23350 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
23360 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
23370 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65  exists ::no(dele
23380 74 65 53 71 6c 69 74 65 43 6f 6e 66 69 67 46 69  teSqliteConfigFi
23390 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  les)]} then {.. 
233a0 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
233b0 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 63  each fileName $c
233c0 6f 6e 66 69 67 46 69 6c 65 4e 61 6d 65 73 20 7b  onfigFileNames {
233d0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
233e0 20 20 74 72 79 44 65 6c 65 74 65 42 69 6e 61 72    tryDeleteBinar
233f0 79 46 69 6c 65 20 24 66 69 6c 65 4e 61 6d 65 0d  yFile $fileName.
23400 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
23410 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
23420 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ...            i
23430 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
23440 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69   ::no(deleteSqli
23450 74 65 45 78 74 65 72 6e 61 6c 46 69 6c 65 73 29  teExternalFiles)
23460 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
23470 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
23480 20 66 69 6c 65 4e 61 6d 65 20 24 6d 64 61 43 6f   fileName $mdaCo
23490 6e 66 69 67 46 69 6c 65 4e 61 6d 65 73 20 7b 0d  nfigFileNames {.
234a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
234b0 20 74 72 79 44 65 6c 65 74 65 42 75 69 6c 64 46   tryDeleteBuildF
234c0 69 6c 65 20 24 66 69 6c 65 4e 61 6d 65 20 66 61  ile $fileName fa
234d0 6c 73 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  lse..           
234e0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
234f0 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69        foreach fi
23500 6c 65 4e 61 6d 65 20 24 65 78 74 65 72 6e 61 6c  leName $external
23510 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20  FileNames {..   
23520 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79               try
23530 44 65 6c 65 74 65 42 69 6e 61 72 79 46 69 6c 65  DeleteBinaryFile
23540 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20   $fileName..    
23550 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
23560 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
23570 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
23580 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
23590 28 64 65 6c 65 74 65 53 71 6c 69 74 65 4e 61 74  (deleteSqliteNat
235a0 69 76 65 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e  iveFiles)]} then
235b0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
235c0 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
235d0 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53  sts ::no(deleteS
235e0 71 6c 69 74 65 49 6d 70 6c 69 63 69 74 4e 61 74  qliteImplicitNat
235f0 69 76 65 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e  iveFiles)]} then
23600 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
23610 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65      foreach file
23620 4e 61 6d 65 20 24 6e 61 74 69 76 65 46 69 6c 65  Name $nativeFile
23630 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20  Names {..       
23640 20 20 20 20 20 20 20 20 20 20 20 74 72 79 44 65             tryDe
23650 6c 65 74 65 41 73 73 65 6d 62 6c 79 20 24 66 69  leteAssembly $fi
23660 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20  leName..        
23670 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
23680 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
23690 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
236a0 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
236b0 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69 74 65 4e  no(deleteSqliteN
236c0 6f 6e 49 6d 70 6c 69 63 69 74 46 69 6c 65 73 29  onImplicitFiles)
236d0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
236e0 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
236f0 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
23700 6f 28 64 65 6c 65 74 65 53 71 6c 69 74 65 50 6c  o(deleteSqlitePl
23710 61 74 66 6f 72 6d 46 69 6c 65 73 29 5d 20 26 26  atformFiles)] &&
23720 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
23730 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20          [string 
23740 6c 65 6e 67 74 68 20 24 70 6c 61 74 66 6f 72 6d  length $platform
23750 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
23760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23770 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d   foreach fileNam
23780 65 20 24 6e 61 74 69 76 65 46 69 6c 65 4e 61 6d  e $nativeFileNam
23790 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  es {..          
237a0 20 20 20 20 20 20 20 20 20 20 74 72 79 44 65 6c            tryDel
237b0 65 74 65 41 73 73 65 6d 62 6c 79 20 24 66 69 6c  eteAssembly $fil
237c0 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 0d  eName $platform.
237d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
237e0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
237f0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
23800 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
23810 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
23820 6f 28 64 65 6c 65 74 65 53 71 6c 69 74 65 41 72  o(deleteSqliteAr
23830 63 68 69 74 65 63 74 75 72 65 46 69 6c 65 73 29  chitectureFiles)
23840 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
23850 20 20 20 20 20 20 20 20 20 20 20 20 5b 73 74 72              [str
23860 69 6e 67 20 6c 65 6e 67 74 68 20 24 61 72 63 68  ing length $arch
23870 69 74 65 63 74 75 72 65 5d 20 3e 20 30 7d 20 74  itecture] > 0} t
23880 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
23890 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
238a0 20 66 69 6c 65 4e 61 6d 65 20 24 6e 61 74 69 76   fileName $nativ
238b0 65 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20  eFileNames {..  
238c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
238d0 20 20 74 72 79 44 65 6c 65 74 65 41 73 73 65 6d    tryDeleteAssem
238e0 62 6c 79 20 24 66 69 6c 65 4e 61 6d 65 20 24 61  bly $fileName $a
238f0 72 63 68 69 74 65 63 74 75 72 65 0d 0a 20 20 20  rchitecture..   
23900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
23910 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
23920 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
23930 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
23940 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
23950 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
23960 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74 65  ists ::no(delete
23970 53 71 6c 69 74 65 4d 69 78 65 64 46 69 6c 65 73  SqliteMixedFiles
23980 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
23990 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
239a0 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
239b0 45 3a 20 49 66 20 74 68 65 20 22 6e 61 74 69 76  E: If the "nativ
239c0 65 22 20 72 75 6e 74 69 6d 65 20 6f 70 74 69 6f  e" runtime optio
239d0 6e 20 69 73 20 73 65 74 2c 20 64 65 6c 65 74 65  n is set, delete
239e0 20 69 6d 70 6c 69 63 69 74 0d 0a 20 20 20 20 20   implicit..     
239f0 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
23a00 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73 65   mixed-mode asse
23a10 6d 62 6c 79 20 66 69 6c 65 73 20 61 73 20 77 65  mbly files as we
23a20 6c 6c 2e 20 20 54 68 69 73 20 72 75 6e 74 69 6d  ll.  This runtim
23a30 65 20 6f 70 74 69 6f 6e 0d 0a 20 20 20 20 20 20  e option..      
23a40 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
23a50 63 68 65 63 6b 20 69 73 20 68 61 6e 64 6c 65 64  check is handled
23a60 20 77 68 65 6e 20 62 75 69 6c 64 69 6e 67 20 74   when building t
23a70 68 65 20 6c 69 73 74 20 6f 66 20 6d 69 78 65 64  he list of mixed
23a80 2d 6d 6f 64 65 0d 0a 20 20 20 20 20 20 20 20 20  -mode..         
23a90 20 20 20 20 20 23 20 20 20 20 20 20 20 61 73 73       #       ass
23aa0 65 6d 62 6c 79 20 66 69 6c 65 20 6e 61 6d 65 73  embly file names
23ab0 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
23ac0 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
23ad0 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
23ae0 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53  sts ::no(deleteS
23af0 71 6c 69 74 65 49 6d 70 6c 69 63 69 74 4d 69 78  qliteImplicitMix
23b00 65 64 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20  edFiles)]} then 
23b10 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
23b20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e     foreach fileN
23b30 61 6d 65 20 24 6d 69 78 65 64 46 69 6c 65 4e 61  ame $mixedFileNa
23b40 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  mes {..         
23b50 20 20 20 20 20 20 20 20 20 74 72 79 44 65 6c 65           tryDele
23b60 74 65 41 73 73 65 6d 62 6c 79 20 24 66 69 6c 65  teAssembly $file
23b70 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20  Name..          
23b80 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
23b90 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
23ba0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
23bb0 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
23bc0 28 64 65 6c 65 74 65 53 71 6c 69 74 65 4e 6f 6e  (deleteSqliteNon
23bd0 49 6d 70 6c 69 63 69 74 46 69 6c 65 73 29 5d 7d  ImplicitFiles)]}
23be0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
23bf0 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69           if {![i
23c00 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
23c10 64 65 6c 65 74 65 53 71 6c 69 74 65 50 6c 61 74  deleteSqlitePlat
23c20 66 6f 72 6d 46 69 6c 65 73 29 5d 20 26 26 20 5c  formFiles)] && \
23c30 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
23c40 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65        [string le
23c50 6e 67 74 68 20 24 70 6c 61 74 66 6f 72 6d 5d 20  ngth $platform] 
23c60 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
23c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
23c80 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20  oreach fileName 
23c90 24 6d 69 78 65 64 46 69 6c 65 4e 61 6d 65 73 20  $mixedFileNames 
23ca0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
23cb0 20 20 20 20 20 20 20 74 72 79 44 65 6c 65 74 65         tryDelete
23cc0 41 73 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61  Assembly $fileNa
23cd0 6d 65 20 24 70 6c 61 74 66 6f 72 6d 0d 0a 20 20  me $platform..  
23ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23cf0 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  }..             
23d00 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
23d10 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
23d20 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64  fo exists ::no(d
23d30 65 6c 65 74 65 53 71 6c 69 74 65 41 72 63 68 69  eleteSqliteArchi
23d40 74 65 63 74 75 72 65 46 69 6c 65 73 29 5d 20 26  tectureFiles)] &
23d50 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  & \..           
23d60 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67           [string
23d70 20 6c 65 6e 67 74 68 20 24 61 72 63 68 69 74 65   length $archite
23d80 63 74 75 72 65 5d 20 3e 20 30 7d 20 74 68 65 6e  cture] > 0} then
23d90 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
23da0 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69        foreach fi
23db0 6c 65 4e 61 6d 65 20 24 6d 69 78 65 64 46 69 6c  leName $mixedFil
23dc0 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20  eNames {..      
23dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72                tr
23de0 79 44 65 6c 65 74 65 41 73 73 65 6d 62 6c 79 20  yDeleteAssembly 
23df0 24 66 69 6c 65 4e 61 6d 65 20 24 61 72 63 68 69  $fileName $archi
23e00 74 65 63 74 75 72 65 0d 0a 20 20 20 20 20 20 20  tecture..       
23e10 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
23e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
23e30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
23e40 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
23e50 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ...            i
23e60 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
23e70 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69   ::no(deleteSqli
23e80 74 65 4d 61 6e 61 67 65 64 46 69 6c 65 73 29 5d  teManagedFiles)]
23e90 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
23ea0 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
23eb0 66 69 6c 65 4e 61 6d 65 20 24 6d 61 6e 61 67 65  fileName $manage
23ec0 64 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20  dFileNames {..  
23ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72                tr
23ee0 79 44 65 6c 65 74 65 41 73 73 65 6d 62 6c 79 20  yDeleteAssembly 
23ef0 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20  $fileName..     
23f00 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
23f10 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
23f20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
23f30 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
23f40 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 66   # NOTE: Check f
23f50 6f 72 20 74 68 65 20 22 61 75 74 6f 53 65 6c 65  or the "autoSele
23f60 63 74 22 20 72 75 6e 74 69 6d 65 20 6f 70 74 69  ct" runtime opti
23f70 6f 6e 2e 20 20 49 66 20 70 72 65 73 65 6e 74 2c  on.  If present,
23f80 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20  ..          #   
23f90 20 20 20 20 61 74 74 65 6d 70 74 20 74 6f 20 61      attempt to a
23fa0 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 73 65 6c  utomatically sel
23fb0 65 63 74 20 74 68 65 20 66 69 72 73 74 20 61 76  ect the first av
23fc0 61 69 6c 61 62 6c 65 0d 0a 20 20 20 20 20 20 20  ailable..       
23fd0 20 20 20 23 20 20 20 20 20 20 20 62 75 69 6c 64     #       build
23fe0 20 28 6f 72 20 22 72 65 6c 65 61 73 65 22 29 20   (or "release") 
23ff0 6f 66 20 53 51 4c 69 74 65 20 61 6e 64 20 53 79  of SQLite and Sy
24000 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
24010 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20  ..          #   
24020 20 20 20 20 66 6f 72 20 75 73 65 20 77 69 74 68      for use with
24030 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65 2e   the test suite.
24040 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
24050 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 68 61           if {[ha
24060 73 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 61  sRuntimeOption a
24070 75 74 6f 53 65 6c 65 63 74 5d 7d 20 74 68 65 6e  utoSelect]} then
24080 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
24090 69 66 20 7b 21 5b 63 68 65 63 6b 46 6f 72 53 51  if {![checkForSQ
240a0 4c 69 74 65 42 75 69 6c 64 73 20 24 3a 3a 74 65  LiteBuilds $::te
240b0 73 74 5f 63 68 61 6e 6e 65 6c 20 74 72 75 65 5d  st_channel true]
240c0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
240d0 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72          checkFor
240e0 53 51 4c 69 74 65 52 65 6c 65 61 73 65 73 20 24  SQLiteReleases $
240f0 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 74  ::test_channel t
24100 72 75 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  rue..           
24110 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d   }..          }.
24120 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
24130 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
24140 3a 20 53 6b 69 70 20 74 72 79 69 6e 67 20 74 6f  : Skip trying to
24150 20 76 65 72 69 66 79 20 74 68 65 20 62 75 69 6c   verify the buil
24160 64 20 64 69 72 65 63 74 6f 72 79 20 69 66 20 69  d directory if i
24170 6e 73 74 72 75 63 74 65 64 3b 0d 0a 20 20 20 20  nstructed;..    
24180 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6f 74        #       ot
24190 68 65 72 77 69 73 65 2c 20 6d 61 6b 65 20 73 75  herwise, make su
241a0 72 65 20 69 74 20 61 63 74 75 61 6c 6c 79 20 65  re it actually e
241b0 78 69 73 74 73 20 6f 72 20 68 61 6c 74 20 74 68  xists or halt th
241c0 65 20 65 6e 74 69 72 65 0d 0a 20 20 20 20 20 20  e entire..      
241d0 20 20 20 20 23 20 20 20 20 20 20 20 74 65 73 74      #       test
241e0 69 6e 67 20 70 72 6f 63 65 73 73 20 69 66 20 69  ing process if i
241f0 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  t does not exist
24200 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
24210 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
24220 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
24230 28 76 65 72 69 66 79 42 75 69 6c 64 44 69 72 65  (verifyBuildDire
24240 63 74 6f 72 79 29 5d 7d 20 74 68 65 6e 20 7b 0d  ctory)]} then {.
24250 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a  .            #..
24260 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f              # NO
24270 54 45 3a 20 41 74 20 74 68 69 73 20 70 6f 69 6e  TE: At this poin
24280 74 2c 20 74 68 65 20 62 75 69 6c 64 20 64 69 72  t, the build dir
24290 65 63 74 6f 72 79 20 4d 55 53 54 20 65 78 69 73  ectory MUST exis
242a0 74 20 61 73 20 61 0d 0a 20 20 20 20 20 20 20 20  t as a..        
242b0 20 20 20 20 23 20 20 20 20 20 20 20 76 61 6c 69      #       vali
242c0 64 20 64 69 72 65 63 74 6f 72 79 20 66 6f 72 20  d directory for 
242d0 74 68 65 20 74 65 73 74 69 6e 67 20 70 72 6f 63  the testing proc
242e0 65 73 73 20 74 6f 20 63 6f 6e 74 69 6e 75 65 2e  ess to continue.
242f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d  ..            #.
24300 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74  .            set
24310 20 64 69 72 65 63 74 6f 72 79 20 5b 67 65 74 42   directory [getB
24320 75 69 6c 64 44 69 72 65 63 74 6f 72 79 20 66 61  uildDirectory fa
24330 6c 73 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  lse]....        
24340 20 20 20 20 69 66 20 7b 21 5b 66 69 6c 65 20 65      if {![file e
24350 78 69 73 74 73 20 24 64 69 72 65 63 74 6f 72 79  xists $directory
24360 5d 20 7c 7c 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] || \..        
24370 20 20 20 20 20 20 20 20 21 5b 66 69 6c 65 20 69          ![file i
24380 73 64 69 72 65 63 74 6f 72 79 20 24 64 69 72 65  sdirectory $dire
24390 63 74 6f 72 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a  ctory]} then {..
243a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
243b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
243c0 20 4e 4f 54 45 3a 20 4a 75 73 74 20 70 72 69 6f   NOTE: Just prio
243d0 72 20 74 6f 20 61 63 74 75 61 6c 6c 79 20 68 61  r to actually ha
243e0 6c 74 69 6e 67 20 74 68 65 20 74 65 73 74 69 6e  lting the testin
243f0 67 20 70 72 6f 63 65 73 73 2c 0d 0a 20 20 20 20  g process,..    
24400 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
24410 20 20 61 64 64 20 61 6e 20 65 72 72 6f 72 20 74    add an error t
24420 6f 20 74 68 65 20 74 65 73 74 20 6c 6f 67 20 66  o the test log f
24430 69 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ile...          
24440 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
24450 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
24460 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
24470 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
24480 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
24490 2d 20 63 6f 75 6c 64 20 6e 6f 74 20 76 65 72 69  - could not veri
244a0 66 79 20 62 75 69 6c 64 20 64 69 72 65 63 74 6f  fy build directo
244b0 72 79 20 5c 22 22 20 24 64 69 72 65 63 74 6f 72  ry \"" $director
244c0 79 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  y \..           
244d0 20 20 20 20 20 20 20 22 5c 22 2c 20 61 6c 6c 20         "\", all 
244e0 74 65 73 74 69 6e 67 20 68 61 6c 74 65 64 5c 6e  testing halted\n
244f0 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  "]....          
24500 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
24510 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 61 69       # NOTE: Rai
24520 73 69 6e 67 20 61 20 73 63 72 69 70 74 20 65 72  sing a script er
24530 72 6f 72 20 66 72 6f 6d 20 74 68 69 73 20 70 6f  ror from this po
24540 69 6e 74 20 73 68 6f 75 6c 64 20 68 61 6c 74 0d  int should halt.
24550 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
24560 20 20 20 20 20 20 20 74 68 65 20 74 65 73 74 69         the testi
24570 6e 67 20 70 72 6f 63 65 73 73 2e 0d 0a 20 20 20  ng process...   
24580 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
24590 20 20 20 20 20 20 20 20 20 20 20 20 65 72 72 6f              erro
245a0 72 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  r [appendArgs \.
245b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
245c0 20 20 20 22 63 6f 75 6c 64 20 6e 6f 74 20 76 65     "could not ve
245d0 72 69 66 79 20 62 75 69 6c 64 20 64 69 72 65 63  rify build direc
245e0 74 6f 72 79 20 5c 22 22 20 24 64 69 72 65 63 74  tory \"" $direct
245f0 6f 72 79 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ory \..         
24600 20 20 20 20 20 20 20 20 20 22 5c 22 2c 20 61 6c           "\", al
24610 6c 20 74 65 73 74 69 6e 67 20 68 61 6c 74 65 64  l testing halted
24620 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  "]..            
24630 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  }..          }..
24640 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
24650 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
24660 20 53 6b 69 70 20 74 72 79 69 6e 67 20 74 6f 20   Skip trying to 
24670 63 6f 70 79 20 61 6e 79 20 66 69 6c 65 73 20 69  copy any files i
24680 66 20 69 6e 73 74 72 75 63 74 65 64 2e 0d 0a 20  f instructed... 
24690 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
246a0 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
246b0 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70   exists ::no(cop
246c0 79 53 71 6c 69 74 65 46 69 6c 65 73 29 5d 7d 20  ySqliteFiles)]} 
246d0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
246e0 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
246f0 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53  xists ::no(copyS
24700 71 6c 69 74 65 43 6f 6e 66 69 67 46 69 6c 65 73  qliteConfigFiles
24710 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
24720 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
24730 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
24740 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
24750 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 70 79 69       "---- copyi
24760 6e 67 20 5c 22 63 6f 6e 66 69 67 75 72 61 74 69  ng \"configurati
24770 6f 6e 5c 22 20 66 69 6c 65 73 2e 2e 2e 5c 6e 22  on\" files...\n"
24780 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
24790 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61    foreach fileNa
247a0 6d 65 20 24 63 6f 6e 66 69 67 46 69 6c 65 4e 61  me $configFileNa
247b0 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  mes {..         
247c0 20 20 20 20 20 20 20 74 72 79 43 6f 70 79 42 75         tryCopyBu
247d0 69 6c 64 46 69 6c 65 20 24 66 69 6c 65 4e 61 6d  ildFile $fileNam
247e0 65 20 66 61 6c 73 65 0d 0a 20 20 20 20 20 20 20  e false..       
247f0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
24800 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
24810 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
24820 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f  o exists ::no(co
24830 70 79 53 71 6c 69 74 65 45 78 74 65 72 6e 61 6c  pySqliteExternal
24840 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d  Files)]} then {.
24850 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
24860 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
24870 23 20 4e 4f 54 45 3a 20 43 6f 70 79 20 74 68 65  # NOTE: Copy the
24880 20 4d 61 6e 61 67 65 64 20 44 65 62 75 67 67 69   Managed Debuggi
24890 6e 67 20 41 73 73 69 73 74 61 6e 74 73 20 28 4d  ng Assistants (M
248a0 44 41 29 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  DA) configuratio
248b0 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n..             
248c0 20 23 20 20 20 20 20 20 20 66 69 6c 65 20 66 6f   #       file fo
248d0 72 20 74 68 65 20 45 61 67 6c 65 20 73 68 65 6c  r the Eagle shel
248e0 6c 20 74 6f 20 74 68 65 20 62 75 69 6c 64 20 6f  l to the build o
248f0 75 74 70 75 74 20 64 69 72 65 63 74 6f 72 79 2c  utput directory,
24900 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
24910 23 20 20 20 20 20 20 20 77 68 69 6c 65 20 75 73  #       while us
24920 69 6e 67 20 65 61 63 68 20 6f 66 20 74 68 65 20  ing each of the 
24930 6e 61 6d 65 73 20 6f 66 20 74 68 65 20 76 61 72  names of the var
24940 69 6f 75 73 20 6c 65 67 61 63 79 20 74 65 73 74  ious legacy test
24950 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
24960 23 20 20 20 20 20 20 20 65 78 65 63 75 74 61 62  #       executab
24970 6c 65 73 2e 20 20 54 68 69 73 20 77 69 6c 6c 20  les.  This will 
24980 68 65 6c 70 20 74 6f 20 6d 61 6b 65 20 73 75 72  help to make sur
24990 65 20 74 68 61 74 20 61 6c 6c 20 74 68 65 0d 0a  e that all the..
249a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
249b0 20 20 20 20 20 20 6c 65 67 61 63 79 20 74 65 73        legacy tes
249c0 74 73 20 72 75 6e 20 77 69 74 68 20 65 78 61 63  ts run with exac
249d0 74 6c 79 20 74 68 65 20 73 61 6d 65 20 73 65 74  tly the same set
249e0 20 6f 66 20 4d 61 6e 61 67 65 64 0d 0a 20 20 20   of Managed..   
249f0 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20             #    
24a00 20 20 20 44 65 62 75 67 67 69 6e 67 20 41 73 73     Debugging Ass
24a10 69 73 74 61 6e 74 73 20 63 6f 6e 66 69 67 75 72  istants configur
24a20 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ed...           
24a30 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
24a40 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
24a50 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20  t_channel \..   
24a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
24a70 2d 2d 2d 2d 20 63 6f 70 79 69 6e 67 20 5c 22 4d  ---- copying \"M
24a80 44 41 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  DA configuration
24a90 5c 22 20 66 69 6c 65 73 2e 2e 2e 5c 6e 22 0d 0a  \" files...\n"..
24aa0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
24ab0 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65  foreach fileName
24ac0 20 24 6d 64 61 43 6f 6e 66 69 67 46 69 6c 65 4e   $mdaConfigFileN
24ad0 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20  ames {..        
24ae0 20 20 20 20 20 20 20 20 74 72 79 43 6f 70 79 42          tryCopyB
24af0 69 6e 61 72 79 46 69 6c 65 20 45 61 67 6c 65 53  inaryFile EagleS
24b00 68 65 6c 6c 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e  hell.exe.mda.con
24b10 66 69 67 20 74 72 75 65 20 22 22 20 24 66 69 6c  fig true "" $fil
24b20 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 20  eName..         
24b30 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
24b40 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
24b50 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
24b60 20 43 6f 70 79 20 74 68 65 20 65 78 74 65 72 6e   Copy the extern
24b70 61 6c 20 62 69 6e 61 72 69 65 73 2c 20 69 66 20  al binaries, if 
24b80 61 6e 79 2c 20 74 6f 20 74 68 65 20 64 69 72 65  any, to the dire
24b90 63 74 6f 72 79 20 74 68 61 74 0d 0a 20 20 20 20  ctory that..    
24ba0 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
24bb0 20 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 45    contains the E
24bc0 61 67 6c 65 20 73 68 65 6c 6c 2e 20 20 54 68 69  agle shell.  Thi
24bd0 73 20 69 73 20 74 79 70 69 63 61 6c 6c 79 20 75  s is typically u
24be0 73 65 64 20 74 6f 20 6d 61 6b 65 0d 0a 20 20 20  sed to make..   
24bf0 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20             #    
24c00 20 20 20 73 75 72 65 20 61 73 73 65 6d 62 6c 69     sure assembli
24c10 65 73 20 72 65 66 65 72 65 6e 63 65 64 20 62 79  es referenced by
24c20 20 74 68 65 20 6f 6e 65 73 20 62 65 69 6e 67 20   the ones being 
24c30 74 65 73 74 65 64 20 61 72 65 0d 0a 20 20 20 20  tested are..    
24c40 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
24c50 20 20 61 76 61 69 6c 61 62 6c 65 20 64 75 72 69    available duri
24c60 6e 67 20 74 68 65 20 74 65 73 74 69 6e 67 20 70  ng the testing p
24c70 72 6f 63 65 73 73 2e 0d 0a 20 20 20 20 20 20 20  rocess...       
24c80 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
24c90 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
24ca0 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 22 2d  :test_channel "-
24cb0 2d 2d 2d 20 63 6f 70 79 69 6e 67 20 5c 22 65 78  --- copying \"ex
24cc0 74 65 72 6e 61 6c 5c 22 20 66 69 6c 65 73 2e 2e  ternal\" files..
24cd0 2e 5c 6e 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20  .\n"....        
24ce0 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69        foreach fi
24cf0 6c 65 4e 61 6d 65 20 24 65 78 74 65 72 6e 61 6c  leName $external
24d00 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20  FileNames {..   
24d10 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79               try
24d20 43 6f 70 79 45 78 74 65 72 6e 61 6c 46 69 6c 65  CopyExternalFile
24d30 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20   $fileName..    
24d40 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
24d50 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
24d60 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
24d70 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
24d80 28 63 6f 70 79 53 71 6c 69 74 65 4e 61 74 69 76  (copySqliteNativ
24d90 65 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b  eFiles)]} then {
24da0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
24db0 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  #..             
24dc0 20 23 20 4e 4f 54 45 3a 20 49 66 20 74 68 65 20   # NOTE: If the 
24dd0 74 65 73 74 20 70 6c 61 74 66 6f 72 6d 20 69 73  test platform is
24de0 20 6c 69 6b 65 6c 79 20 74 68 65 20 64 65 66 61   likely the defa
24df0 75 6c 74 20 66 6f 72 20 74 68 69 73 0d 0a 20 20  ult for this..  
24e00 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20              #   
24e10 20 20 20 20 6d 61 63 68 69 6e 65 2c 20 61 6c 73      machine, als
24e20 6f 20 74 72 79 20 74 6f 20 63 6f 70 79 20 74 68  o try to copy th
24e30 65 20 6e 61 74 69 76 65 20 66 69 6c 65 73 20 74  e native files t
24e40 6f 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 20  o the..         
24e50 20 20 20 20 20 23 20 20 20 20 20 20 20 62 69 6e       #       bin
24e60 61 72 79 20 6c 6f 63 61 74 69 6f 6e 2e 0d 0a 20  ary location... 
24e70 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a               #..
24e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
24e90 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
24ea0 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65 49  ::no(copySqliteI
24eb0 6d 70 6c 69 63 69 74 4e 61 74 69 76 65 46 69 6c  mplicitNativeFil
24ec0 65 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  es)] && \..     
24ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 69 73               [is
24ee0 44 65 66 61 75 6c 74 42 75 69 6c 64 50 6c 61 74  DefaultBuildPlat
24ef0 66 6f 72 6d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  form]} then {.. 
24f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
24f10 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
24f20 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20  nnel \..        
24f30 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
24f40 2d 20 63 6f 70 79 69 6e 67 20 69 6d 70 6c 69 63  - copying implic
24f50 69 74 20 5c 22 6e 61 74 69 76 65 5c 22 20 66 69  it \"native\" fi
24f60 6c 65 73 2e 2e 2e 5c 6e 22 0d 0a 0d 0a 20 20 20  les...\n"....   
24f70 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
24f80 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6e  each fileName $n
24f90 61 74 69 76 65 46 69 6c 65 4e 61 6d 65 73 20 7b  ativeFileNames {
24fa0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
24fb0 20 20 20 20 74 72 79 43 6f 70 79 41 73 73 65 6d      tryCopyAssem
24fc0 62 6c 79 20 24 66 69 6c 65 4e 61 6d 65 20 66 61  bly $fileName fa
24fd0 6c 73 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  lse..           
24fe0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
24ff0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
25000 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69           if {![i
25010 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
25020 63 6f 70 79 53 71 6c 69 74 65 4e 6f 6e 49 6d 70  copySqliteNonImp
25030 6c 69 63 69 74 46 69 6c 65 73 29 5d 7d 20 74 68  licitFiles)]} th
25040 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
25050 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
25060 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70   exists ::no(cop
25070 79 53 71 6c 69 74 65 50 6c 61 74 66 6f 72 6d 46  ySqlitePlatformF
25080 69 6c 65 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20  iles)] && \..   
25090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
250a0 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20   [string length 
250b0 24 70 6c 61 74 66 6f 72 6d 5d 20 3e 20 30 7d 20  $platform] > 0} 
250c0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
250d0 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
250e0 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
250f0 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
25100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25110 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 70 79 69       "---- copyi
25120 6e 67 20 5c 22 6e 61 74 69 76 65 5c 22 20 66 69  ng \"native\" fi
25130 6c 65 73 20 66 6f 72 20 70 6c 61 74 66 6f 72 6d  les for platform
25140 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20   \"" \..        
25150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24 70                $p
25160 6c 61 74 66 6f 72 6d 20 5c 22 2e 2e 2e 5c 6e 5d  latform \"...\n]
25170 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
25180 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69        foreach fi
25190 6c 65 4e 61 6d 65 20 24 6e 61 74 69 76 65 46 69  leName $nativeFi
251a0 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20  leNames {..     
251b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
251c0 72 79 43 6f 70 79 41 73 73 65 6d 62 6c 79 20 24  ryCopyAssembly $
251d0 66 69 6c 65 4e 61 6d 65 20 66 61 6c 73 65 20 24  fileName false $
251e0 70 6c 61 74 66 6f 72 6d 0d 0a 20 20 20 20 20 20  platform..      
251f0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
25200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
25210 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
25220 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
25230 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53  xists ::no(copyS
25240 71 6c 69 74 65 41 72 63 68 69 74 65 63 74 75 72  qliteArchitectur
25250 65 46 69 6c 65 73 29 5d 20 26 26 20 5c 0d 0a 20  eFiles)] && \.. 
25260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25270 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74     [string lengt
25280 68 20 24 61 72 63 68 69 74 65 63 74 75 72 65 5d  h $architecture]
25290 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
252a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
252b0 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
252c0 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
252d0 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
252e0 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
252f0 20 63 6f 70 79 69 6e 67 20 5c 22 6e 61 74 69 76   copying \"nativ
25300 65 5c 22 20 66 69 6c 65 73 20 66 6f 72 20 61 72  e\" files for ar
25310 63 68 69 74 65 63 74 75 72 65 20 5c 22 22 20 5c  chitecture \"" \
25320 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
25330 20 20 20 20 20 20 20 20 24 61 72 63 68 69 74 65          $archite
25340 63 74 75 72 65 20 5c 22 2e 2e 2e 5c 6e 5d 0d 0a  cture \"...\n]..
25350 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
25360 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65      foreach file
25370 4e 61 6d 65 20 24 6e 61 74 69 76 65 46 69 6c 65  Name $nativeFile
25380 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20  Names {..       
25390 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79               try
253a0 43 6f 70 79 41 73 73 65 6d 62 6c 79 20 24 66 69  CopyAssembly $fi
253b0 6c 65 4e 61 6d 65 20 66 61 6c 73 65 20 24 61 72  leName false $ar
253c0 63 68 69 74 65 63 74 75 72 65 0d 0a 20 20 20 20  chitecture..    
253d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
253e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
253f0 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
25400 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
25410 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
25420 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
25430 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c  sts ::no(copySql
25440 69 74 65 4d 69 78 65 64 46 69 6c 65 73 29 5d 7d  iteMixedFiles)]}
25450 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
25460 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
25470 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
25480 49 66 20 74 68 65 20 22 6e 61 74 69 76 65 22 20  If the "native" 
25490 72 75 6e 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69  runtime option i
254a0 73 20 73 65 74 2c 20 63 6f 70 79 20 69 6d 70 6c  s set, copy impl
254b0 69 63 69 74 0d 0a 20 20 20 20 20 20 20 20 20 20  icit..          
254c0 20 20 20 20 23 20 20 20 20 20 20 20 6d 69 78 65      #       mixe
254d0 64 2d 6d 6f 64 65 20 61 73 73 65 6d 62 6c 79 20  d-mode assembly 
254e0 66 69 6c 65 73 20 61 73 20 77 65 6c 6c 2e 20 20  files as well.  
254f0 54 68 65 20 72 75 6e 74 69 6d 65 20 6f 70 74 69  The runtime opti
25500 6f 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  on..            
25510 20 20 23 20 20 20 20 20 20 20 63 68 65 63 6b 20    #       check 
25520 69 73 20 68 61 6e 64 6c 65 64 20 77 68 65 6e 20  is handled when 
25530 62 75 69 6c 64 69 6e 67 20 74 68 65 20 6c 69 73  building the lis
25540 74 20 6f 66 20 6d 69 78 65 64 2d 6d 6f 64 65 0d  t of mixed-mode.
25550 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
25560 20 20 20 20 20 20 20 61 73 73 65 6d 62 6c 79 20         assembly 
25570 66 69 6c 65 20 6e 61 6d 65 73 2e 0d 0a 20 20 20  file names...   
25580 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
25590 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
255a0 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
255b0 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65 49 6d 70  no(copySqliteImp
255c0 6c 69 63 69 74 4d 69 78 65 64 46 69 6c 65 73 29  licitMixedFiles)
255d0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
255e0 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
255f0 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
25600 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
25610 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6f          "---- co
25620 70 79 69 6e 67 20 69 6d 70 6c 69 63 69 74 20 5c  pying implicit \
25630 22 6d 69 78 65 64 5c 22 20 66 69 6c 65 73 2e 2e  "mixed\" files..
25640 2e 5c 6e 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20  .\n"....        
25650 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
25660 66 69 6c 65 4e 61 6d 65 20 24 6d 69 78 65 64 46  fileName $mixedF
25670 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20  ileNames {..    
25680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72                tr
25690 79 43 6f 70 79 41 73 73 65 6d 62 6c 79 20 24 66  yCopyAssembly $f
256a0 69 6c 65 4e 61 6d 65 20 66 61 6c 73 65 0d 0a 20  ileName false.. 
256b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
256c0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
256d0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
256e0 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
256f0 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71  ists ::no(copySq
25700 6c 69 74 65 4e 6f 6e 49 6d 70 6c 69 63 69 74 46  liteNonImplicitF
25710 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  iles)]} then {..
25720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25730 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
25740 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74  s ::no(copySqlit
25750 65 50 6c 61 74 66 6f 72 6d 46 69 6c 65 73 29 5d  ePlatformFiles)]
25760 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
25770 20 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69             [stri
25780 6e 67 20 6c 65 6e 67 74 68 20 24 70 6c 61 74 66  ng length $platf
25790 6f 72 6d 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  orm] > 0} then {
257a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
257b0 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
257c0 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
257d0 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
257e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
257f0 2d 2d 2d 2d 20 63 6f 70 79 69 6e 67 20 5c 22 6d  ---- copying \"m
25800 69 78 65 64 5c 22 20 66 69 6c 65 73 20 66 6f 72  ixed\" files for
25810 20 70 6c 61 74 66 6f 72 6d 20 5c 22 22 20 5c 0d   platform \"" \.
25820 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25830 20 20 20 20 20 20 20 24 70 6c 61 74 66 6f 72 6d         $platform
25840 20 5c 22 2e 2e 2e 5c 6e 5d 0d 0a 0d 0a 20 20 20   \"...\n]....   
25850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
25860 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20  oreach fileName 
25870 24 6d 69 78 65 64 46 69 6c 65 4e 61 6d 65 73 20  $mixedFileNames 
25880 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
25890 20 20 20 20 20 20 20 74 72 79 43 6f 70 79 41 73         tryCopyAs
258a0 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61 6d 65  sembly $fileName
258b0 20 66 61 6c 73 65 20 24 70 6c 61 74 66 6f 72 6d   false $platform
258c0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
258d0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
258e0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
258f0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
25900 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
25910 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65 41 72 63  no(copySqliteArc
25920 68 69 74 65 63 74 75 72 65 46 69 6c 65 73 29 5d  hitectureFiles)]
25930 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
25940 20 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69             [stri
25950 6e 67 20 6c 65 6e 67 74 68 20 24 61 72 63 68 69  ng length $archi
25960 74 65 63 74 75 72 65 5d 20 3e 20 30 7d 20 74 68  tecture] > 0} th
25970 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
25980 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
25990 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
259a0 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
259b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
259c0 20 20 20 22 2d 2d 2d 2d 20 63 6f 70 79 69 6e 67     "---- copying
259d0 20 5c 22 6d 69 78 65 64 5c 22 20 66 69 6c 65 73   \"mixed\" files
259e0 20 66 6f 72 20 61 72 63 68 69 74 65 63 74 75 72   for architectur
259f0 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20  e \"" \..       
25a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24                 $
25a10 61 72 63 68 69 74 65 63 74 75 72 65 20 5c 22 2e  architecture \".
25a20 2e 2e 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  ..\n]....       
25a30 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61             forea
25a40 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6d 69 78  ch fileName $mix
25a50 65 64 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20  edFileNames {.. 
25a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25a70 20 20 20 74 72 79 43 6f 70 79 41 73 73 65 6d 62     tryCopyAssemb
25a80 6c 79 20 24 66 69 6c 65 4e 61 6d 65 20 66 61 6c  ly $fileName fal
25a90 73 65 20 24 61 72 63 68 69 74 65 63 74 75 72 65  se $architecture
25aa0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
25ab0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
25ac0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
25ad0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
25ae0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
25af0 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
25b00 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63  fo exists ::no(c
25b10 6f 70 79 53 71 6c 69 74 65 4d 61 6e 61 67 65 64  opySqliteManaged
25b20 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d  Files)]} then {.
25b30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  .              t
25b40 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
25b50 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 6f 70 79 69  nnel "---- copyi
25b60 6e 67 20 5c 22 6d 61 6e 61 67 65 64 5c 22 20 66  ng \"managed\" f
25b70 69 6c 65 73 2e 2e 2e 5c 6e 22 0d 0a 0d 0a 20 20  iles...\n"....  
25b80 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65              fore
25b90 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6d 61  ach fileName $ma
25ba0 6e 61 67 65 64 46 69 6c 65 4e 61 6d 65 73 20 7b  nagedFileNames {
25bb0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
25bc0 20 20 74 72 79 43 6f 70 79 41 73 73 65 6d 62 6c    tryCopyAssembl
25bd0 79 20 24 66 69 6c 65 4e 61 6d 65 20 74 72 75 65  y $fileName true
25be0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
25bf0 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  }..            }
25c00 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d  ..          }...
25c10 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
25c20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
25c30 53 6b 69 70 20 74 72 79 69 6e 67 20 74 6f 20 6c  Skip trying to l
25c40 6f 61 64 20 61 6e 79 20 66 69 6c 65 73 20 69 66  oad any files if
25c50 20 69 6e 73 74 72 75 63 74 65 64 2e 0d 0a 20 20   instructed...  
25c60 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
25c70 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
25c80 65 78 69 73 74 73 20 3a 3a 6e 6f 28 6c 6f 61 64  exists ::no(load
25c90 53 71 6c 69 74 65 46 69 6c 65 73 29 5d 7d 20 74  SqliteFiles)]} t
25ca0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
25cb0 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
25cc0 69 73 74 73 20 3a 3a 6e 6f 28 6c 6f 61 64 53 71  ists ::no(loadSq
25cd0 6c 69 74 65 49 6d 70 6c 69 63 69 74 46 69 6c 65  liteImplicitFile
25ce0 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  s)]} then {..   
25cf0 20 20 20 20 20 20 20 20 20 20 20 74 72 79 4c 6f             tryLo
25d00 61 64 41 73 73 65 6d 62 6c 79 20 53 79 73 74 65  adAssembly Syste
25d10 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c  m.Data.SQLite.dl
25d20 6c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  l..            }
25d30 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
25d40 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
25d50 73 20 3a 3a 6e 6f 28 6c 6f 61 64 53 71 6c 69 74  s ::no(loadSqlit
25d60 65 4c 69 6e 71 46 69 6c 65 73 29 5d 7d 20 74 68  eLinqFiles)]} th
25d70 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
25d80 20 20 20 20 74 72 79 4c 6f 61 64 41 73 73 65 6d      tryLoadAssem
25d90 62 6c 79 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  bly System.Data.
25da0 53 51 4c 69 74 65 2e 4c 69 6e 71 2e 64 6c 6c 0d  SQLite.Linq.dll.
25db0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
25dc0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
25dd0 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
25de0 3a 3a 6e 6f 28 6c 6f 61 64 53 71 6c 69 74 65 45  ::no(loadSqliteE
25df0 66 36 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20  f6Files)]} then 
25e00 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
25e10 20 74 72 79 4c 6f 61 64 41 73 73 65 6d 62 6c 79   tryLoadAssembly
25e20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
25e30 69 74 65 2e 45 46 36 2e 64 6c 6c 0d 0a 20 20 20  ite.EF6.dll..   
25e40 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
25e50 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
25e60 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
25e70 28 6c 6f 61 64 53 71 6c 69 74 65 4e 6f 6e 49 6d  (loadSqliteNonIm
25e80 70 6c 69 63 69 74 46 69 6c 65 73 29 5d 7d 20 74  plicitFiles)]} t
25e90 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
25ea0 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
25eb0 65 78 69 73 74 73 20 3a 3a 6e 6f 28 6c 6f 61 64  exists ::no(load
25ec0 53 71 6c 69 74 65 50 6c 61 74 66 6f 72 6d 46 69  SqlitePlatformFi
25ed0 6c 65 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20  les)] && \..    
25ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 73                [s
25ef0 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 70 6c  tring length $pl
25f00 61 74 66 6f 72 6d 5d 20 3e 20 30 7d 20 74 68 65  atform] > 0} the
25f10 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
25f20 20 20 20 20 20 74 72 79 4c 6f 61 64 41 73 73 65       tryLoadAsse
25f30 6d 62 6c 79 20 53 79 73 74 65 6d 2e 44 61 74 61  mbly System.Data
25f40 2e 53 51 4c 69 74 65 2e 64 6c 6c 20 24 70 6c 61  .SQLite.dll $pla
25f50 74 66 6f 72 6d 0d 0a 20 20 20 20 20 20 20 20 20  tform..         
25f60 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
25f70 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
25f80 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 6c  fo exists ::no(l
25f90 6f 61 64 53 71 6c 69 74 65 41 72 63 68 69 74 65  oadSqliteArchite
25fa0 63 74 75 72 65 46 69 6c 65 73 29 5d 20 26 26 20  ctureFiles)] && 
25fb0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
25fc0 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
25fd0 67 74 68 20 24 61 72 63 68 69 74 65 63 74 75 72  gth $architectur
25fe0 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  e] > 0} then {..
25ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26000 74 72 79 4c 6f 61 64 41 73 73 65 6d 62 6c 79 20  tryLoadAssembly 
26010 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
26020 74 65 2e 64 6c 6c 20 24 61 72 63 68 69 74 65 63  te.dll $architec
26030 74 75 72 65 0d 0a 20 20 20 20 20 20 20 20 20 20  ture..          
26040 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
26050 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
26060 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  }..        }....
26070 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
26080 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 24 6e 61  fileNameOnly $na
26090 74 69 76 65 46 69 6c 65 4e 61 6d 65 73 20 7b 0d  tiveFileNames {.
260a0 0a 20 20 20 20 20 20 20 20 20 20 63 61 74 63 68  .          catch
260b0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
260c0 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
260d0 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
260e0 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
260f0 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20       "---- file 
26100 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22 22 20 24  version of \"" $
26110 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 22 5c 22  fileNameOnly "\"
26120 2e 2e 2e 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20  ... \"" \..     
26130 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65             [file
26140 20 76 65 72 73 69 6f 6e 20 5b 67 65 74 42 69 6e   version [getBin
26150 61 72 79 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c  aryFileName $fil
26160 65 4e 61 6d 65 4f 6e 6c 79 5d 5d 20 5c 22 5c 6e  eNameOnly]] \"\n
26170 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ]..          }..
26180 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
26190 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c       foreach fil
261a0 65 4e 61 6d 65 4f 6e 6c 79 20 24 6d 69 78 65 64  eNameOnly $mixed
261b0 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20  FileNames {..   
261c0 20 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a         catch {..
261d0 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
261e0 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
261f0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
26200 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26210 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73   "---- file vers
26220 69 6f 6e 20 6f 66 20 5c 22 22 20 24 66 69 6c 65  ion of \"" $file
26230 4e 61 6d 65 4f 6e 6c 79 20 22 5c 22 2e 2e 2e 20  NameOnly "\"... 
26240 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  \"" \..         
26250 20 20 20 20 20 20 20 5b 66 69 6c 65 20 76 65 72         [file ver
26260 73 69 6f 6e 20 5b 67 65 74 42 69 6e 61 72 79 46  sion [getBinaryF
26270 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d  ileName $fileNam
26280 65 4f 6e 6c 79 5d 5d 20 5c 22 5c 6e 5d 0d 0a 20  eOnly]] \"\n].. 
26290 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
262a0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
262b0 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d   foreach fileNam
262c0 65 4f 6e 6c 79 20 24 6d 61 6e 61 67 65 64 46 69  eOnly $managedFi
262d0 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20  leNames {..     
262e0 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20       catch {..  
262f0 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
26300 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
26310 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
26320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
26330 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73 69 6f  ---- file versio
26340 6e 20 6f 66 20 5c 22 22 20 24 66 69 6c 65 4e 61  n of \"" $fileNa
26350 6d 65 4f 6e 6c 79 20 22 5c 22 2e 2e 2e 20 5c 22  meOnly "\"... \"
26360 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
26370 20 20 20 20 20 5b 66 69 6c 65 20 76 65 72 73 69       [file versi
26380 6f 6e 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c  on [getBinaryFil
26390 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 4f  eName $fileNameO
263a0 6e 6c 79 5d 5d 20 5c 22 5c 6e 5d 0d 0a 20 20 20  nly]] \"\n]..   
263b0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
263c0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69    }....        i
263d0 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  f {[string lengt
263e0 68 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3e 20 30  h $platform] > 0
263f0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
26400 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65      foreach file
26410 4e 61 6d 65 4f 6e 6c 79 20 24 6e 61 74 69 76 65  NameOnly $native
26420 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20  FileNames {..   
26430 20 20 20 20 20 20 20 20 20 63 61 74 63 68 20 7b           catch {
26440 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
26450 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
26460 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
26470 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
26480 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c         "---- fil
26490 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22 22  e version of \""
264a0 20 24 70 6c 61 74 66 6f 72 6d 20 5c 0d 0a 20 20   $platform \..  
264b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
264c0 2f 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20  / $fileNameOnly 
264d0 22 5c 22 2e 2e 2e 20 5c 22 22 20 5b 66 69 6c 65  "\"... \"" [file
264e0 20 76 65 72 73 69 6f 6e 20 5c 0d 0a 20 20 20 20   version \..    
264f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 67                [g
26500 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65  etBinaryFileName
26510 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 24   $fileNameOnly $
26520 70 6c 61 74 66 6f 72 6d 5d 5d 20 5c 22 5c 6e 5d  platform]] \"\n]
26530 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
26540 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  .          }....
26550 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63            foreac
26560 68 20 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 24  h fileNameOnly $
26570 6d 69 78 65 64 46 69 6c 65 4e 61 6d 65 73 20 7b  mixedFileNames {
26580 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 61  ..            ca
26590 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
265a0 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
265b0 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
265c0 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
265d0 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
265e0 2d 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f  - file version o
265f0 66 20 5c 22 22 20 24 70 6c 61 74 66 6f 72 6d 20  f \"" $platform 
26600 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
26610 20 20 20 20 20 2f 20 24 66 69 6c 65 4e 61 6d 65       / $fileName
26620 4f 6e 6c 79 20 22 5c 22 2e 2e 2e 20 5c 22 22 20  Only "\"... \"" 
26630 5b 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 5c 0d  [file version \.
26640 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26650 20 20 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c     [getBinaryFil
26660 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 4f  eName $fileNameO
26670 6e 6c 79 20 24 70 6c 61 74 66 6f 72 6d 5d 5d 20  nly $platform]] 
26680 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  \"\n]..         
26690 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
266a0 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  }..        }....
266b0 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72          if {[str
266c0 69 6e 67 20 6c 65 6e 67 74 68 20 24 61 72 63 68  ing length $arch
266d0 69 74 65 63 74 75 72 65 5d 20 3e 20 30 7d 20 74  itecture] > 0} t
266e0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
266f0 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d   foreach fileNam
26700 65 4f 6e 6c 79 20 24 6e 61 74 69 76 65 46 69 6c  eOnly $nativeFil
26710 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20  eNames {..      
26720 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20        catch {.. 
26730 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
26740 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
26750 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
26760 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
26770 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76      "---- file v
26780 65 72 73 69 6f 6e 20 6f 66 20 5c 22 22 20 24 61  ersion of \"" $a
26790 72 63 68 69 74 65 63 74 75 72 65 20 5c 0d 0a 20  rchitecture \.. 
267a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
267b0 20 2f 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79   / $fileNameOnly
267c0 20 22 5c 22 2e 2e 2e 20 5c 22 22 20 5b 66 69 6c   "\"... \"" [fil
267d0 65 20 76 65 72 73 69 6f 6e 20 5c 0d 0a 20 20 20  e version \..   
267e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b                 [
267f0 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d  getBinaryFileNam
26800 65 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20  e $fileNameOnly 
26810 24 61 72 63 68 69 74 65 63 74 75 72 65 5d 5d 20  $architecture]] 
26820 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  \"\n]..         
26830 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
26840 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 66  }....          f
26850 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 4f  oreach fileNameO
26860 6e 6c 79 20 24 6d 69 78 65 64 46 69 6c 65 4e 61  nly $mixedFileNa
26870 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  mes {..         
26880 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20     catch {..    
26890 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
268a0 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
268b0 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
268c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
268d0 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73   "---- file vers
268e0 69 6f 6e 20 6f 66 20 5c 22 22 20 24 61 72 63 68  ion of \"" $arch
268f0 69 74 65 63 74 75 72 65 20 5c 0d 0a 20 20 20 20  itecture \..    
26900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 20                / 
26910 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 22 5c  $fileNameOnly "\
26920 22 2e 2e 2e 20 5c 22 22 20 5b 66 69 6c 65 20 76  "... \"" [file v
26930 65 72 73 69 6f 6e 20 5c 0d 0a 20 20 20 20 20 20  ersion \..      
26940 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74              [get
26950 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 24  BinaryFileName $
26960 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 24 61 72  fileNameOnly $ar
26970 63 68 69 74 65 63 74 75 72 65 5d 5d 20 5c 22 5c  chitecture]] \"\
26980 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  n]..            
26990 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  }..          }..
269a0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
269b0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
269c0 23 20 4e 4f 54 45 3a 20 47 72 61 62 20 74 68 65  # NOTE: Grab the
269d0 20 6c 69 73 74 20 6f 66 20 6d 61 6e 61 67 65 64   list of managed
269e0 20 61 73 73 65 6d 62 6c 69 65 73 20 66 6f 72 20   assemblies for 
269f0 74 68 65 20 63 75 72 72 65 6e 74 20 70 72 6f 63  the current proc
26a00 65 73 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ess..        #  
26a10 20 20 20 20 20 61 6e 64 20 72 65 70 6f 72 74 20       and report 
26a20 6f 6e 20 74 68 65 20 53 79 73 74 65 6d 2e 44 61  on the System.Da
26a30 74 61 2e 53 51 4c 69 74 65 20 72 65 6c 61 74 65  ta.SQLite relate
26a40 64 20 6f 6e 65 73 2e 0d 0a 20 20 20 20 20 20 20  d ones...       
26a50 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   #..        if {
26a60 5b 68 61 76 65 53 51 4c 69 74 65 4f 62 6a 65 63  [haveSQLiteObjec
26a70 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65 6e 20  tCommand]} then 
26a80 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  {..          set
26a90 20 61 73 73 65 6d 62 6c 69 65 73 20 5b 6f 62 6a   assemblies [obj
26aa0 65 63 74 20 69 6e 76 6f 6b 65 20 41 70 70 44 6f  ect invoke AppDo
26ab0 6d 61 69 6e 2e 43 75 72 72 65 6e 74 44 6f 6d 61  main.CurrentDoma
26ac0 69 6e 20 47 65 74 41 73 73 65 6d 62 6c 69 65 73  in GetAssemblies
26ad0 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 6f  ]....          o
26ae0 62 6a 65 63 74 20 66 6f 72 65 61 63 68 20 61 73  bject foreach as
26af0 73 65 6d 62 6c 79 20 24 61 73 73 65 6d 62 6c 69  sembly $assembli
26b00 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  es {..          
26b10 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6d 61    if {[string ma
26b20 74 63 68 20 5c 7b 53 79 73 74 65 6d 2e 44 61 74  tch \{System.Dat
26b30 61 2e 53 51 4c 69 74 65 2a 20 24 61 73 73 65 6d  a.SQLite* $assem
26b40 62 6c 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  bly]} then {..  
26b50 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
26b60 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
26b70 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
26b80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26b90 20 20 20 22 2d 2d 2d 2d 20 66 6f 75 6e 64 20 6c     "---- found l
26ba0 6f 61 64 65 64 20 61 73 73 65 6d 62 6c 79 3a 20  oaded assembly: 
26bb0 22 20 24 61 73 73 65 6d 62 6c 79 20 5c 6e 5d 0d  " $assembly \n].
26bc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
26bd0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
26be0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
26bf0 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20    catch {..     
26c00 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
26c10 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20  st_channel \..  
26c20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
26c30 2d 20 64 65 66 69 6e 65 20 63 6f 6e 73 74 61 6e  - define constan
26c40 74 73 20 66 6f 72 20 5c 22 53 79 73 74 65 6d 2e  ts for \"System.
26c50 44 61 74 61 2e 53 51 4c 69 74 65 5c 22 2e 2e 2e  Data.SQLite\"...
26c60 20 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   "....          
26c70 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20  if {[catch {..  
26c80 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74            object
26c90 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b   invoke -flags +
26ca0 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20  NonPublic \..   
26cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73               Sys
26cc0 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
26cd0 53 51 4c 69 74 65 33 20 44 65 66 69 6e 65 43 6f  SQLite3 DefineCo
26ce0 6e 73 74 61 6e 74 73 0d 0a 20 20 20 20 20 20 20  nstants..       
26cf0 20 20 20 7d 20 64 65 66 69 6e 65 43 6f 6e 73 74     } defineConst
26d00 61 6e 74 73 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  ants] == 0} then
26d10 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
26d20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
26d30 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
26d40 73 20 5b 66 6f 72 6d 61 74 4c 69 73 74 20 5b 6c  s [formatList [l
26d50 73 6f 72 74 20 5c 0d 0a 20 20 20 20 20 20 20 20  sort \..        
26d60 20 20 20 20 20 20 20 20 24 64 65 66 69 6e 65 43          $defineC
26d70 6f 6e 73 74 61 6e 74 73 5d 20 3c 6e 6f 6e 65 3e  onstants] <none>
26d80 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  ] \n]..         
26d90 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
26da0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
26db0 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 75 6e 6b  test_channel unk
26dc0 6e 6f 77 6e 5c 6e 0d 0a 20 20 20 20 20 20 20 20  nown\n..        
26dd0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
26de0 0d 0a 20 20 20 20 20 20 20 20 63 61 74 63 68 20  ..        catch 
26df0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75  {..          tpu
26e00 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
26e10 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  el \..          
26e20 20 20 20 20 22 2d 2d 2d 2d 20 73 6f 75 72 63 65      "---- source
26e30 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22 53 79   version of \"Sy
26e40 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
26e50 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 0d 0a 0d 0a 20  .dll\"... ".... 
26e60 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61           if {[ca
26e70 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
26e80 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65     object invoke
26e90 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c   -flags +NonPubl
26ea0 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ic \..          
26eb0 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74        System.Dat
26ec0 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 43  a.SQLite.SQLiteC
26ed0 6f 6e 6e 65 63 74 69 6f 6e 20 50 72 6f 76 69 64  onnection Provid
26ee0 65 72 56 65 72 73 69 6f 6e 0d 0a 20 20 20 20 20  erVersion..     
26ef0 20 20 20 20 20 7d 20 76 65 72 73 69 6f 6e 5d 20       } version] 
26f00 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
26f10 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73            if {[s
26f20 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 65  tring length $ve
26f30 72 73 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65  rsion] == 0} the
26f40 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
26f50 20 20 20 73 65 74 20 76 65 72 73 69 6f 6e 20 6e     set version n
26f60 75 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ull..           
26f70 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
26f80 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
26f90 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
26fa0 73 20 24 76 65 72 73 69 6f 6e 20 5c 6e 5d 0d 0a  s $version \n]..
26fb0 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
26fc0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
26fd0 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
26fe0 61 6e 6e 65 6c 20 75 6e 6b 6e 6f 77 6e 5c 6e 0d  annel unknown\n.
26ff0 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
27000 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
27010 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20     catch {..    
27020 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
27030 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20  est_channel \.. 
27040 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
27050 2d 2d 20 73 6f 75 72 63 65 20 63 68 65 63 6b 6f  -- source checko
27060 75 74 20 6f 66 20 5c 22 53 79 73 74 65 6d 2e 44  ut of \"System.D
27070 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 5c 22  ata.SQLite.dll\"
27080 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 20  ... "....       
27090 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d     if {[catch {.
270a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a  .            obj
270b0 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67  ect invoke -flag
270c0 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a  s +NonPublic \..
270d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
270e0 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
270f0 74 65 2e 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74  te.SQLiteConnect
27100 69 6f 6e 20 50 72 6f 76 69 64 65 72 53 6f 75 72  ion ProviderSour
27110 63 65 49 64 0d 0a 20 20 20 20 20 20 20 20 20 20  ceId..          
27120 7d 20 73 6f 75 72 63 65 49 64 5d 20 3d 3d 20 30  } sourceId] == 0
27130 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
27140 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
27150 67 20 6c 65 6e 67 74 68 20 24 73 6f 75 72 63 65  g length $source
27160 49 64 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  Id] == 0} then {
27170 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
27180 73 65 74 20 73 6f 75 72 63 65 49 64 20 6e 75 6c  set sourceId nul
27190 6c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  l..            }
271a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
271b0 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
271c0 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
271d0 24 73 6f 75 72 63 65 49 64 20 5c 6e 5d 0d 0a 20  $sourceId \n].. 
271e0 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20           } else 
271f0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
27200 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
27210 6e 6e 65 6c 20 75 6e 6b 6e 6f 77 6e 5c 6e 0d 0a  nnel unknown\n..
27220 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
27230 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
27240 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
27250 4f 54 45 3a 20 43 68 65 63 6b 20 74 68 65 20 61  OTE: Check the a
27260 76 61 69 6c 61 62 6c 65 20 62 75 69 6c 64 73 20  vailable builds 
27270 28 61 6e 64 20 22 72 65 6c 65 61 73 65 73 22 29  (and "releases")
27280 20 6f 66 20 53 51 4c 69 74 65 20 61 6e 64 0d 0a   of SQLite and..
27290 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
272a0 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
272b0 74 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  te...        #..
272c0 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72          checkFor
272d0 53 51 4c 69 74 65 42 75 69 6c 64 73 20 24 3a 3a  SQLiteBuilds $::
272e0 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 20 20  test_channel..  
272f0 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51        checkForSQ
27300 4c 69 74 65 52 65 6c 65 61 73 65 73 20 24 3a 3a  LiteReleases $::
27310 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a  test_channel....
27320 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
27330 20 20 20 23 20 4e 4f 54 45 3a 20 4e 6f 77 2c 20     # NOTE: Now, 
27340 77 65 20 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20  we need to know 
27350 69 66 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f  if the SQLite co
27360 72 65 20 6c 69 62 72 61 72 79 20 69 73 20 61 76  re library is av
27370 61 69 6c 61 62 6c 65 0d 0a 20 20 20 20 20 20 20  ailable..       
27380 20 23 20 20 20 20 20 20 20 28 69 2e 65 2e 20 62   #       (i.e. b
27390 65 63 61 75 73 65 20 74 68 65 20 6d 61 6e 61 67  ecause the manag
273a0 65 64 2d 6f 6e 6c 79 20 53 79 73 74 65 6d 2e 44  ed-only System.D
273b0 61 74 61 2e 53 51 4c 69 74 65 20 61 73 73 65 6d  ata.SQLite assem
273c0 62 6c 79 20 63 61 6e 0d 0a 20 20 20 20 20 20 20  bly can..       
273d0 20 23 20 20 20 20 20 20 20 6c 6f 61 64 20 77 69   #       load wi
273e0 74 68 6f 75 74 20 69 74 3b 20 68 6f 77 65 76 65  thout it; howeve
273f0 72 2c 20 69 74 20 63 61 6e 6e 6f 74 20 64 6f 20  r, it cannot do 
27400 61 6e 79 74 68 69 6e 67 20 75 73 65 66 75 6c 20  anything useful 
27410 77 69 74 68 6f 75 74 0d 0a 20 20 20 20 20 20 20  without..       
27420 20 23 20 20 20 20 20 20 20 69 74 29 2e 20 20 49   #       it).  I
27430 66 20 77 65 20 61 72 65 20 75 73 69 6e 67 20 74  f we are using t
27440 68 65 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73  he mixed-mode as
27450 73 65 6d 62 6c 79 20 61 6e 64 20 77 65 20 61 6c  sembly and we al
27460 72 65 61 64 79 0d 0a 20 20 20 20 20 20 20 20 23  ready..        #
27470 20 20 20 20 20 20 20 66 6f 75 6e 64 20 69 74 20         found it 
27480 28 61 62 6f 76 65 29 2c 20 74 68 69 73 20 73 68  (above), this sh
27490 6f 75 6c 64 20 61 6c 77 61 79 73 20 73 75 63 63  ould always succ
274a0 65 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  eed...        #.
274b0 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f  .        checkFo
274c0 72 53 51 4c 69 74 65 4c 69 62 72 61 72 79 20 24  rSQLiteLibrary $
274d0 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a  ::test_channel..
274e0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
274f0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65       # NOTE: Che
27500 63 6b 20 69 66 20 74 68 65 20 53 51 4c 69 74 65  ck if the SQLite
27510 20 69 6e 74 65 72 6f 70 20 61 73 73 65 6d 62 6c   interop assembl
27520 79 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0d  y is available..
27530 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
27540 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51 4c 69      checkForSQLi
27550 74 65 49 6e 74 65 72 6f 70 20 24 3a 3a 74 65 73  teInterop $::tes
27560 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20  t_channel....   
27570 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
27580 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 74 68  # NOTE: Check th
27590 65 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73  e SQLite databas
275a0 65 20 61 6e 64 20 74 65 6d 70 6f 72 61 72 79 20  e and temporary 
275b0 64 69 72 65 63 74 6f 72 69 65 73 2e 0d 0a 20 20  directories...  
275c0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
275d0 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 44   checkForSQLiteD
275e0 69 72 65 63 74 6f 72 69 65 73 20 24 3a 3a 74 65  irectories $::te
275f0 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20  st_channel....  
27600 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
27610 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74   # NOTE: Attempt
27620 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66   to determine if
27630 20 76 61 72 69 6f 75 73 20 63 6f 6d 70 69 6c 65   various compile
27640 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 73 20 6e 65  -time options ne
27650 65 64 65 64 20 66 6f 72 0d 0a 20 20 20 20 20 20  eded for..      
27660 20 20 23 20 20 20 20 20 20 20 74 65 73 74 20 63    #       test c
27670 6f 6e 73 74 72 61 69 6e 74 73 20 77 65 72 65 20  onstraints were 
27680 65 6e 61 62 6c 65 64 20 66 6f 72 20 74 68 65 20  enabled for the 
27690 6d 61 6e 61 67 65 64 20 61 73 73 65 6d 62 6c 79  managed assembly
276a0 2e 20 20 54 68 65 72 65 0d 0a 20 20 20 20 20 20  .  There..      
276b0 20 20 23 20 20 20 20 20 20 20 61 72 65 20 73 6f    #       are so
276c0 6d 65 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  me compile-time 
276d0 6f 70 74 69 6f 6e 73 20 74 68 61 74 20 6d 75 73  options that mus
276e0 74 20 61 6c 73 6f 20 68 61 76 65 20 62 65 65 6e  t also have been
276f0 20 65 6e 61 62 6c 65 64 0d 0a 20 20 20 20 20 20   enabled..      
27700 20 20 23 20 20 20 20 20 20 20 66 6f 72 20 74 68    #       for th
27710 65 20 69 6e 74 65 72 6f 70 20 61 73 73 65 6d 62  e interop assemb
27720 6c 79 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62  ly in order to b
27730 65 20 65 66 66 65 63 74 69 76 65 2e 20 20 46 6f  e effective.  Fo
27740 72 20 74 68 6f 73 65 0d 0a 20 20 20 20 20 20 20  r those..       
27750 20 23 20 20 20 20 20 20 20 6f 70 74 69 6f 6e 73   #       options
27760 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 61 73 73  , it will be ass
27770 75 6d 65 64 20 74 68 61 74 20 69 74 20 77 61 73  umed that it was
27780 20 65 6e 61 62 6c 65 64 20 66 6f 72 20 74 68 65   enabled for the
27790 20 69 6e 74 65 72 6f 70 0d 0a 20 20 20 20 20 20   interop..      
277a0 20 20 23 20 20 20 20 20 20 20 61 73 73 65 6d 62    #       assemb
277b0 6c 79 20 69 66 20 69 74 20 77 61 73 20 65 6e 61  ly if it was ena
277c0 62 6c 65 64 20 66 6f 72 20 74 68 65 20 6d 61 6e  bled for the man
277d0 61 67 65 64 20 61 73 73 65 6d 62 6c 79 2e 0d 0a  aged assembly...
277e0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
277f0 20 20 20 66 6f 72 65 61 63 68 20 64 65 66 69 6e     foreach defin
27800 65 43 6f 6e 73 74 61 6e 74 20 5b 6c 69 73 74 20  eConstant [list 
27810 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 43  \..            C
27820 48 45 43 4b 5f 53 54 41 54 45 20 43 4f 55 4e 54  HECK_STATE COUNT
27830 5f 48 41 4e 44 4c 45 20 44 45 42 55 47 20 49 4e  _HANDLE DEBUG IN
27840 54 45 52 4f 50 5f 43 4f 44 45 43 20 49 4e 54 45  TEROP_CODEC INTE
27850 52 4f 50 5f 44 45 42 55 47 20 5c 0d 0a 20 20 20  ROP_DEBUG \..   
27860 20 20 20 20 20 20 20 20 20 49 4e 54 45 52 4f 50           INTEROP
27870 5f 45 58 54 45 4e 53 49 4f 4e 5f 46 55 4e 43 54  _EXTENSION_FUNCT
27880 49 4f 4e 53 20 49 4e 54 45 52 4f 50 5f 46 54 53  IONS INTEROP_FTS
27890 35 5f 45 58 54 45 4e 53 49 4f 4e 20 5c 0d 0a 20  5_EXTENSION \.. 
278a0 20 20 20 20 20 20 20 20 20 20 20 49 4e 54 45 52             INTER
278b0 4f 50 5f 49 4e 43 4c 55 44 45 5f 43 45 52 4f 44  OP_INCLUDE_CEROD
278c0 20 49 4e 54 45 52 4f 50 5f 49 4e 43 4c 55 44 45   INTEROP_INCLUDE
278d0 5f 45 58 54 52 41 20 49 4e 54 45 52 4f 50 5f 49  _EXTRA INTEROP_I
278e0 4e 43 4c 55 44 45 5f 53 45 45 20 5c 0d 0a 20 20  NCLUDE_SEE \..  
278f0 20 20 20 20 20 20 20 20 20 20 49 4e 54 45 52 4f            INTERO
27900 50 5f 49 4e 43 4c 55 44 45 5f 5a 49 50 56 46 53  P_INCLUDE_ZIPVFS
27910 20 49 4e 54 45 52 4f 50 5f 4a 53 4f 4e 31 5f 45   INTEROP_JSON1_E
27920 58 54 45 4e 53 49 4f 4e 20 5c 0d 0a 20 20 20 20  XTENSION \..    
27930 20 20 20 20 20 20 20 20 49 4e 54 45 52 4f 50 5f          INTEROP_
27940 4c 45 47 41 43 59 5f 43 4c 4f 53 45 20 49 4e 54  LEGACY_CLOSE INT
27950 45 52 4f 50 5f 4c 4f 47 20 49 4e 54 45 52 4f 50  EROP_LOG INTEROP
27960 5f 50 45 52 43 45 4e 54 49 4c 45 5f 45 58 54 45  _PERCENTILE_EXTE
27970 4e 53 49 4f 4e 20 5c 0d 0a 20 20 20 20 20 20 20  NSION \..       
27980 20 20 20 20 20 49 4e 54 45 52 4f 50 5f 52 45 47       INTEROP_REG
27990 45 58 50 5f 45 58 54 45 4e 53 49 4f 4e 20 49 4e  EXP_EXTENSION IN
279a0 54 45 52 4f 50 5f 53 48 41 31 5f 45 58 54 45 4e  TEROP_SHA1_EXTEN
279b0 53 49 4f 4e 20 5c 0d 0a 20 20 20 20 20 20 20 20  SION \..        
279c0 20 20 20 20 49 4e 54 45 52 4f 50 5f 54 45 53 54      INTEROP_TEST
279d0 5f 45 58 54 45 4e 53 49 4f 4e 20 49 4e 54 45 52  _EXTENSION INTER
279e0 4f 50 5f 54 4f 54 59 50 45 5f 45 58 54 45 4e 53  OP_TOTYPE_EXTENS
279f0 49 4f 4e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ION \..         
27a00 20 20 20 49 4e 54 45 52 4f 50 5f 56 49 52 54 55     INTEROP_VIRTU
27a10 41 4c 5f 54 41 42 4c 45 20 5c 0d 0a 20 20 20 20  AL_TABLE \..    
27a20 20 20 20 20 20 20 20 20 4e 45 54 5f 32 30 20 4e          NET_20 N
27a30 45 54 5f 33 35 20 4e 45 54 5f 34 30 20 4e 45 54  ET_35 NET_40 NET
27a40 5f 34 35 20 4e 45 54 5f 34 35 31 20 4e 45 54 5f  _45 NET_451 NET_
27a50 34 35 32 20 4e 45 54 5f 34 36 20 4e 45 54 5f 34  452 NET_46 NET_4
27a60 36 31 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  61 \..          
27a70 20 20 4e 45 54 5f 34 36 32 20 4e 45 54 5f 34 37    NET_462 NET_47
27a80 20 4e 45 54 5f 43 4f 4d 50 41 43 54 5f 32 30 20   NET_COMPACT_20 
27a90 50 4c 41 54 46 4f 52 4d 5f 43 4f 4d 50 41 43 54  PLATFORM_COMPACT
27aa0 46 52 41 4d 45 57 4f 52 4b 20 5c 0d 0a 20 20 20  FRAMEWORK \..   
27ab0 20 20 20 20 20 20 20 20 20 50 52 45 4c 4f 41 44           PRELOAD
27ac0 5f 4e 41 54 49 56 45 5f 4c 49 42 52 41 52 59 20  _NATIVE_LIBRARY 
27ad0 52 45 54 41 52 47 45 54 41 42 4c 45 20 53 51 4c  RETARGETABLE SQL
27ae0 49 54 45 5f 53 54 41 4e 44 41 52 44 20 5c 0d 0a  ITE_STANDARD \..
27af0 20 20 20 20 20 20 20 20 20 20 20 20 54 48 52 4f              THRO
27b00 57 5f 4f 4e 5f 44 49 53 50 4f 53 45 44 20 54 52  W_ON_DISPOSED TR
27b10 41 43 45 20 54 52 41 43 45 5f 43 4f 4e 4e 45 43  ACE TRACE_CONNEC
27b20 54 49 4f 4e 20 54 52 41 43 45 5f 44 45 54 45 43  TION TRACE_DETEC
27b30 54 49 4f 4e 20 5c 0d 0a 20 20 20 20 20 20 20 20  TION \..        
27b40 20 20 20 20 54 52 41 43 45 5f 48 41 4e 44 4c 45      TRACE_HANDLE
27b50 20 54 52 41 43 45 5f 50 52 45 4c 4f 41 44 20 54   TRACE_PRELOAD T
27b60 52 41 43 45 5f 53 48 41 52 45 44 20 54 52 41 43  RACE_SHARED TRAC
27b70 45 5f 53 54 41 54 45 4d 45 4e 54 20 5c 0d 0a 20  E_STATEMENT \.. 
27b80 20 20 20 20 20 20 20 20 20 20 20 54 52 41 43 45             TRACE
27b90 5f 57 41 52 4e 49 4e 47 20 54 52 41 43 4b 5f 4d  _WARNING TRACK_M
27ba0 45 4d 4f 52 59 5f 42 59 54 45 53 20 55 53 45 5f  EMORY_BYTES USE_
27bb0 45 4e 54 49 54 59 5f 46 52 41 4d 45 57 4f 52 4b  ENTITY_FRAMEWORK
27bc0 5f 36 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  _6 \..          
27bd0 20 20 55 53 45 5f 49 4e 54 45 52 4f 50 5f 44 4c    USE_INTEROP_DL
27be0 4c 20 55 53 45 5f 50 52 45 50 41 52 45 5f 56 32  L USE_PREPARE_V2
27bf0 20 57 49 4e 44 4f 57 53 5d 20 7b 0d 0a 20 20 20   WINDOWS] {..   
27c00 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
27c10 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63      # NOTE: Chec
27c20 6b 20 69 66 20 74 68 65 20 63 6f 6d 70 69 6c 65  k if the compile
27c30 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20  -time option is 
27c40 6c 69 73 74 65 64 20 69 6e 20 74 68 65 20 6c 69  listed in the li
27c50 73 74 20 6f 66 0d 0a 20 20 20 20 20 20 20 20 20  st of..         
27c60 20 23 20 20 20 20 20 20 20 22 64 65 66 69 6e 65   #       "define
27c70 20 63 6f 6e 73 74 61 6e 74 73 22 20 6b 65 70 74   constants" kept
27c80 20 74 72 61 63 6b 20 6f 66 20 62 79 20 74 68 65   track of by the
27c90 20 6d 61 6e 61 67 65 64 20 61 73 73 65 6d 62 6c   managed assembl
27ca0 79 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  y...          #.
27cb0 0a 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b  .          check
27cc0 46 6f 72 53 51 4c 69 74 65 44 65 66 69 6e 65 43  ForSQLiteDefineC
27cd0 6f 6e 73 74 61 6e 74 20 24 3a 3a 74 65 73 74 5f  onstant $::test_
27ce0 63 68 61 6e 6e 65 6c 20 24 64 65 66 69 6e 65 43  channel $defineC
27cf0 6f 6e 73 74 61 6e 74 0d 0a 20 20 20 20 20 20 20  onstant..       
27d00 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d   }....        #.
27d10 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
27d20 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 53 79   Check if the Sy
27d30 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
27d40 20 70 72 6f 76 69 64 65 72 20 77 61 73 20 63 6f   provider was co
27d50 6d 70 69 6c 65 64 20 77 69 74 68 0d 0a 20 20 20  mpiled with..   
27d60 20 20 20 20 20 23 20 20 20 20 20 20 20 73 75 70       #       sup
27d70 70 6f 72 74 20 66 6f 72 20 61 6e 79 20 65 6e 63  port for any enc
27d80 72 79 70 74 65 64 20 64 61 74 61 62 61 73 65 73  rypted databases
27d90 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
27da0 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65 53        if {[haveS
27db0 51 4c 69 74 65 44 65 66 69 6e 65 43 6f 6e 73 74  QLiteDefineConst
27dc0 61 6e 74 20 49 4e 54 45 52 4f 50 5f 43 4f 44 45  ant INTEROP_CODE
27dd0 43 5d 20 7c 7c 20 5c 0d 0a 20 20 20 20 20 20 20  C] || \..       
27de0 20 20 20 20 20 5b 68 61 76 65 53 51 4c 69 74 65       [haveSQLite
27df0 44 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 20 49  DefineConstant I
27e00 4e 54 45 52 4f 50 5f 49 4e 43 4c 55 44 45 5f 53  NTEROP_INCLUDE_S
27e10 45 45 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  EE]} then {..   
27e20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
27e30 20 20 20 20 23 20 4e 4f 54 45 3a 20 59 65 73 2c      # NOTE: Yes,
27e40 20 61 64 64 20 67 65 6e 65 72 69 63 20 63 6f 6e   add generic con
27e50 73 74 72 61 69 6e 74 20 66 6f 72 20 75 73 65 20  straint for use 
27e60 62 79 20 74 68 65 20 74 65 73 74 20 73 75 69 74  by the test suit
27e70 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  e...          #.
27e80 0a 20 20 20 20 20 20 20 20 20 20 61 64 64 43 6f  .          addCo
27e90 6e 73 74 72 61 69 6e 74 20 53 79 73 74 65 6d 2e  nstraint System.
27ea0 44 61 74 61 2e 53 51 4c 69 74 65 2e 45 6e 63 72  Data.SQLite.Encr
27eb0 79 70 74 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20  yption..        
27ec0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  }....        #..
27ed0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
27ee0 43 68 65 63 6b 20 74 68 65 20 63 75 72 72 65 6e  Check the curren
27ef0 74 20 62 75 69 6c 64 20 79 65 61 72 2e 20 20 42  t build year.  B
27f00 61 73 69 63 61 6c 6c 79 2c 20 74 68 69 73 20 69  asically, this i
27f10 6e 64 69 63 61 74 65 73 0d 0a 20 20 20 20 20 20  ndicates..      
27f20 20 20 23 20 20 20 20 20 20 20 77 68 69 63 68 20    #       which 
27f30 76 65 72 73 69 6f 6e 20 6f 66 20 4d 53 42 75 69  version of MSBui
27f40 6c 64 20 61 6e 64 2f 6f 72 20 56 69 73 75 61 6c  ld and/or Visual
27f50 20 53 74 75 64 69 6f 20 77 61 73 20 75 73 65 64   Studio was used
27f60 20 74 6f 0d 0a 20 20 20 20 20 20 20 20 23 20 20   to..        #  
27f70 20 20 20 20 20 63 6f 6d 70 69 6c 65 20 74 68 65       compile the
27f80 20 61 73 73 65 6d 62 6c 79 20 62 69 6e 61 72 69   assembly binari
27f90 65 73 20 75 6e 64 65 72 20 74 65 73 74 2e 0d 0a  es under test...
27fa0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
27fb0 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
27fc0 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20  _channel \..    
27fd0 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68          "---- ch
27fe0 65 63 6b 69 6e 67 20 66 6f 72 20 53 79 73 74 65  ecking for Syste
27ff0 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 62 75  m.Data.SQLite bu
28000 69 6c 64 20 79 65 61 72 2e 2e 2e 20 22 0d 0a 0d  ild year... "...
28010 0a 20 20 20 20 20 20 20 20 73 65 74 20 79 65 61  .        set yea
28020 72 20 5b 67 65 74 42 75 69 6c 64 59 65 61 72 5d  r [getBuildYear]
28030 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e  ..        addCon
28040 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41  straint [appendA
28050 72 67 73 20 62 75 69 6c 64 59 65 61 72 2e 20 24  rgs buildYear. $
28060 79 65 61 72 5d 0d 0a 20 20 20 20 20 20 20 20 74  year]..        t
28070 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
28080 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
28090 20 5c 22 20 24 79 65 61 72 20 5c 22 5c 6e 5d 0d   \" $year \"\n].
280a0 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
280b0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68        # NOTE: Ch
280c0 65 63 6b 20 74 68 65 20 63 75 72 72 65 6e 74 20  eck the current 
280d0 62 75 69 6c 64 20 2e 4e 45 54 20 46 72 61 6d 65  build .NET Frame
280e0 77 6f 72 6b 2e 20 20 42 61 73 69 63 61 6c 6c 79  work.  Basically
280f0 2c 20 74 68 69 73 0d 0a 20 20 20 20 20 20 20 20  , this..        
28100 23 20 20 20 20 20 20 20 69 6e 64 69 63 61 74 65  #       indicate
28110 73 20 77 68 69 63 68 20 76 65 72 73 69 6f 6e 20  s which version 
28120 6f 66 20 74 68 65 20 2e 4e 45 54 20 46 72 61 6d  of the .NET Fram
28130 65 77 6f 72 6b 20 69 73 20 62 65 69 6e 67 0d 0a  ework is being..
28140 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
28150 75 73 65 64 20 62 79 20 74 68 65 20 61 73 73 65  used by the asse
28160 6d 62 6c 79 20 62 69 6e 61 72 69 65 73 20 75 6e  mbly binaries un
28170 64 65 72 20 74 65 73 74 2e 0d 0a 20 20 20 20 20  der test...     
28180 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70     #..        tp
28190 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
281a0 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  nel \..         
281b0 20 20 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e     "---- checkin
281c0 67 20 66 6f 72 20 53 79 73 74 65 6d 2e 44 61 74  g for System.Dat
281d0 61 2e 53 51 4c 69 74 65 20 62 75 69 6c 64 20 2e  a.SQLite build .
281e0 4e 45 54 20 46 72 61 6d 65 77 6f 72 6b 2e 2e 2e  NET Framework...
281f0 20 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65   "....        se
28200 74 20 6e 65 74 46 78 20 5b 67 65 74 42 75 69 6c  t netFx [getBuil
28210 64 4e 65 74 46 78 5d 0d 0a 20 20 20 20 20 20 20  dNetFx]..       
28220 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b   addConstraint [
28230 61 70 70 65 6e 64 41 72 67 73 20 62 75 69 6c 64  appendArgs build
28240 46 72 61 6d 65 77 6f 72 6b 2e 20 24 6e 65 74 46  Framework. $netF
28250 78 5d 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74  x]..        tput
28260 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
28270 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 22  l [appendArgs \"
28280 20 24 6e 65 74 46 78 20 5c 22 5c 6e 5d 0d 0a 0d   $netFx \"\n]...
28290 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
282a0 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63      # NOTE: Chec
282b0 6b 20 74 68 65 20 63 75 72 72 65 6e 74 20 62 75  k the current bu
282c0 69 6c 64 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  ild configuratio
282d0 6e 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20  n.  This should 
282e0 6e 6f 72 6d 61 6c 6c 79 0d 0a 20 20 20 20 20 20  normally..      
282f0 20 20 23 20 20 20 20 20 20 20 62 65 20 65 69 74    #       be eit
28300 68 65 72 20 22 44 65 62 75 67 22 20 6f 72 20 22  her "Debug" or "
28310 52 65 6c 65 61 73 65 22 2e 0d 0a 20 20 20 20 20  Release"...     
28320 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70     #..        tp
28330 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
28340 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  nel \..         
28350 20 20 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e     "---- checkin
28360 67 20 66 6f 72 20 53 79 73 74 65 6d 2e 44 61 74  g for System.Dat
28370 61 2e 53 51 4c 69 74 65 20 62 75 69 6c 64 20 63  a.SQLite build c
28380 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 2e 2e 20  onfiguration... 
28390 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74  "....        set
283a0 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 5b   configuration [
283b0 67 65 74 42 75 69 6c 64 43 6f 6e 66 69 67 75 72  getBuildConfigur
283c0 61 74 69 6f 6e 5d 0d 0a 20 20 20 20 20 20 20 20  ation]..        
283d0 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61  addConstraint [a
283e0 70 70 65 6e 64 41 72 67 73 20 62 75 69 6c 64 43  ppendArgs buildC
283f0 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 20 24 63  onfiguration. $c
28400 6f 6e 66 69 67 75 72 61 74 69 6f 6e 5d 0d 0a 20  onfiguration].. 
28410 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
28420 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
28430 70 65 6e 64 41 72 67 73 20 5c 22 20 24 63 6f 6e  pendArgs \" $con
28440 66 69 67 75 72 61 74 69 6f 6e 20 5c 22 5c 6e 5d  figuration \"\n]
28450 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
28460 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54         # NOTE: T
28470 72 79 20 74 6f 20 73 65 74 75 70 20 61 6e 20 69  ry to setup an i
28480 6e 74 65 72 72 75 70 74 20 63 61 6c 6c 62 61 63  nterrupt callbac
28490 6b 20 75 73 69 6e 67 20 74 68 65 20 73 63 72 69  k using the scri
284a0 70 74 20 64 65 62 75 67 67 65 72 0d 0a 20 20 20  pt debugger..   
284b0 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 61       #       tha
284c0 74 20 77 69 6c 6c 20 63 61 6e 63 65 6c 20 61 6c  t will cancel al
284d0 6c 20 53 51 4c 20 71 75 65 72 69 65 73 20 69 6e  l SQL queries in
284e0 20 70 72 6f 67 72 65 73 73 20 66 6f 72 20 61 6c   progress for al
284f0 6c 20 64 61 74 61 62 61 73 65 0d 0a 20 20 20 20  l database..    
28500 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e 6e      #       conn
28510 65 63 74 69 6f 6e 73 20 6b 6e 6f 77 6e 20 74 6f  ections known to
28520 20 74 68 69 73 20 69 6e 74 65 72 70 72 65 74 65   this interprete
28530 72 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  r...        #.. 
28540 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
28550 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 73 71  o exists ::no(sq
28560 6c 69 74 65 49 6e 74 65 72 72 75 70 74 43 61 6c  liteInterruptCal
28570 6c 62 61 63 6b 29 5d 7d 20 74 68 65 6e 20 7b 0d  lback)]} then {.
28580 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 75 70  .          setup
28590 44 62 49 6e 74 65 72 72 75 70 74 43 61 6c 6c 62  DbInterruptCallb
285a0 61 63 6b 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  ack $::test_chan
285b0 6e 65 6c 20 24 3a 3a 74 65 73 74 5f 6c 6f 67 0d  nel $::test_log.
285c0 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
285d0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
285e0 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 66   # NOTE: Check f
285f0 6f 72 20 74 68 65 20 6e 61 74 69 76 65 20 72 75  or the native ru
28600 6e 74 69 6d 65 20 6f 70 74 69 6f 6e 2c 20 77 68  ntime option, wh
28610 69 63 68 20 77 6f 75 6c 64 20 6d 65 61 6e 20 77  ich would mean w
28620 65 20 61 72 65 0d 0a 20 20 20 20 20 20 20 20 23  e are..        #
28630 20 20 20 20 20 20 20 75 73 69 6e 67 20 74 68 65         using the
28640 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73 65   mixed-mode asse
28650 6d 62 6c 79 2e 0d 0a 20 20 20 20 20 20 20 20 23  mbly...        #
28660 0d 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 46  ..        checkF
28670 6f 72 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20  orRuntimeOption 
28680 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
28690 6e 61 74 69 76 65 0d 0a 0d 0a 20 20 20 20 20 20  native....      
286a0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
286b0 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20 74 68  OTE: Check if th
286c0 65 20 74 65 73 74 20 73 75 69 74 65 20 73 68 6f  e test suite sho
286d0 75 6c 64 20 63 6f 75 6e 74 20 74 68 65 20 6e 75  uld count the nu
286e0 6d 62 65 72 20 6f 66 20 63 6f 6e 6e 65 63 74 69  mber of connecti
286f0 6f 6e 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ons..        #  
28700 20 20 20 20 20 22 6f 70 65 6e 65 64 22 20 61 6e       "opened" an
28710 64 20 22 63 6c 6f 73 65 64 22 20 66 72 6f 6d 20  d "closed" from 
28720 74 68 65 20 70 6f 6f 6c 20 77 68 65 6e 20 64 65  the pool when de
28730 74 65 72 6d 69 6e 69 6e 67 20 69 66 20 61 20 74  termining if a t
28740 65 73 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20  est..        #  
28750 20 20 20 20 20 70 61 73 73 65 64 2e 20 20 44 69       passed.  Di
28760 73 61 62 6c 69 6e 67 20 74 68 69 73 20 62 65 68  sabling this beh
28770 61 76 69 6f 72 20 69 73 20 73 6f 6d 65 74 69 6d  avior is sometim
28780 65 73 20 6e 65 63 65 73 73 61 72 79 20 28 65 2e  es necessary (e.
28790 67 2e 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  g...        #   
287a0 20 20 20 20 64 75 72 69 6e 67 20 74 68 65 20 72      during the r
287b0 65 6c 65 61 73 65 20 74 65 73 74 69 6e 67 20 70  elease testing p
287c0 72 6f 63 65 73 73 29 20 62 65 63 61 75 73 65 20  rocess) because 
287d0 74 68 65 72 65 20 61 72 65 20 73 65 76 65 72 61  there are severa
287e0 6c 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  l..        #    
287f0 20 20 20 74 65 73 74 73 20 74 68 61 74 20 72 65     tests that re
28800 6c 79 20 6f 6e 20 74 68 65 20 22 6f 70 65 6e 65  ly on the "opene
28810 64 20 66 72 6f 6d 20 70 6f 6f 6c 22 20 63 6f 75  d from pool" cou
28820 6e 74 20 62 65 69 6e 67 20 67 72 65 61 74 65 72  nt being greater
28830 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
28840 20 20 74 68 61 6e 20 7a 65 72 6f 2e 20 20 54 68    than zero.  Th
28850 65 73 65 20 74 65 73 74 73 20 6d 61 79 20 66 61  ese tests may fa
28860 69 6c 20 64 75 65 20 74 6f 20 74 68 65 20 6e 6f  il due to the no
28870 6e 2d 64 65 74 65 72 6d 69 6e 69 73 74 69 63 0d  n-deterministic.
28880 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
28890 20 62 65 68 61 76 69 6f 72 20 6f 66 20 74 68 65   behavior of the
288a0 20 43 4c 52 20 47 43 2c 20 65 76 65 6e 20 77 68   CLR GC, even wh
288b0 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 20 62  en there is no b
288c0 75 67 20 69 6e 20 74 68 65 20 63 6f 64 65 0d 0a  ug in the code..
288d0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
288e0 62 65 69 6e 67 20 74 65 73 74 65 64 2e 0d 0a 20  being tested... 
288f0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
28900 20 20 63 68 65 63 6b 46 6f 72 52 75 6e 74 69 6d    checkForRuntim
28910 65 4f 70 74 69 6f 6e 20 24 3a 3a 74 65 73 74 5f  eOption $::test_
28920 63 68 61 6e 6e 65 6c 20 6e 6f 50 6f 6f 6c 43 6f  channel noPoolCo
28930 75 6e 74 73 0d 0a 0d 0a 20 20 20 20 20 20 20 20  unts....        
28940 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
28950 45 3a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20  E: Check if the 
28960 74 65 73 74 20 73 75 69 74 65 20 73 68 6f 75 6c  test suite shoul
28970 64 20 75 73 65 20 73 68 61 72 65 64 2d 63 61 63  d use shared-cac
28980 68 65 20 6d 6f 64 65 2e 0d 0a 20 20 20 20 20 20  he mode...      
28990 20 20 23 0d 0a 20 20 20 20 20 20 20 20 63 68 65    #..        che
289a0 63 6b 46 6f 72 52 75 6e 74 69 6d 65 4f 70 74 69  ckForRuntimeOpti
289b0 6f 6e 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  on $::test_chann
289c0 65 6c 20 73 68 61 72 65 64 43 61 63 68 65 0d 0a  el sharedCache..
289d0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
289e0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 70       # NOTE: Rep
289f0 6f 72 74 20 74 68 65 20 72 65 73 6f 75 72 63 65  ort the resource
28a00 20 75 73 61 67 65 20 70 72 69 6f 72 20 74 6f 20   usage prior to 
28a10 72 75 6e 6e 69 6e 67 20 61 6e 79 20 74 65 73 74  running any test
28a20 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  s...        #.. 
28a30 20 20 20 20 20 20 20 72 65 70 6f 72 74 53 51 4c         reportSQL
28a40 69 74 65 52 65 73 6f 75 72 63 65 73 20 24 3a 3a  iteResources $::
28a50 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a  test_channel....
28a60 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
28a70 20 20 20 23 20 4e 4f 54 45 3a 20 47 72 61 62 20     # NOTE: Grab 
28a80 74 68 65 20 6c 69 73 74 20 6f 66 20 6e 61 74 69  the list of nati
28a90 76 65 20 6d 6f 64 75 6c 65 73 20 66 6f 72 20 74  ve modules for t
28aa0 68 65 20 63 75 72 72 65 6e 74 20 70 72 6f 63 65  he current proce
28ab0 73 73 20 61 6e 64 0d 0a 20 20 20 20 20 20 20 20  ss and..        
28ac0 23 20 20 20 20 20 20 20 72 65 70 6f 72 74 20 6f  #       report o
28ad0 6e 20 74 68 65 20 53 79 73 74 65 6d 2e 44 61 74  n the System.Dat
28ae0 61 2e 53 51 4c 69 74 65 20 72 65 6c 61 74 65 64  a.SQLite related
28af0 20 6f 6e 65 73 2e 0d 0a 20 20 20 20 20 20 20 20   ones...        
28b00 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  #..        if {[
28b10 68 61 76 65 53 51 4c 69 74 65 4f 62 6a 65 63 74  haveSQLiteObject
28b20 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65 6e 20 7b  Command]} then {
28b30 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
28b40 6d 6f 64 75 6c 65 73 20 5b 6f 62 6a 65 63 74 20  modules [object 
28b50 69 6e 76 6f 6b 65 20 5c 0d 0a 20 20 20 20 20 20  invoke \..      
28b60 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44          System.D
28b70 69 61 67 6e 6f 73 74 69 63 73 2e 50 72 6f 63 65  iagnostics.Proce
28b80 73 73 2e 47 65 74 43 75 72 72 65 6e 74 50 72 6f  ss.GetCurrentPro
28b90 63 65 73 73 20 4d 6f 64 75 6c 65 73 5d 0d 0a 0d  cess Modules]...
28ba0 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63  .          objec
28bb0 74 20 66 6f 72 65 61 63 68 20 2d 61 6c 69 61 73  t foreach -alias
28bc0 20 6d 6f 64 75 6c 65 20 24 6d 6f 64 75 6c 65 73   module $modules
28bd0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
28be0 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  #..            #
28bf0 20 4e 4f 54 45 3a 20 54 68 65 20 6d 6f 64 75 6c   NOTE: The modul
28c00 65 20 66 69 6c 65 20 6e 61 6d 65 20 68 65 72 65  e file name here
28c10 20 6d 75 73 74 20 62 65 20 6e 6f 72 6d 61 6c 69   must be normali
28c20 7a 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  zed...          
28c30 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
28c40 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66   set fileName [f
28c50 69 6c 65 20 6e 6f 72 6d 61 6c 69 7a 65 20 5b 24  ile normalize [$
28c60 6d 6f 64 75 6c 65 20 46 69 6c 65 4e 61 6d 65 5d  module FileName]
28c70 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ]..            s
28c80 65 74 20 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20  et fileNameOnly 
28c90 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69 6c 65  [file tail $file
28ca0 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  Name]....       
28cb0 20 20 20 20 20 69 66 20 7b 5b 6c 73 65 61 72 63       if {[lsearc
28cc0 68 20 2d 65 78 61 63 74 20 2d 6e 6f 63 61 73 65  h -exact -nocase
28cd0 20 2d 2d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   -- \..         
28ce0 20 20 20 20 20 20 20 5b 67 65 74 4e 61 74 69 76         [getNativ
28cf0 65 4c 69 62 72 61 72 79 46 69 6c 65 4e 61 6d 65  eLibraryFileName
28d00 73 4f 6e 6c 79 5d 20 24 66 69 6c 65 4e 61 6d 65  sOnly] $fileName
28d10 4f 6e 6c 79 5d 20 21 3d 20 2d 31 7d 20 74 68 65  Only] != -1} the
28d20 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
28d30 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
28d40 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
28d50 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
28d60 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
28d70 66 6f 75 6e 64 20 6c 6f 61 64 65 64 20 53 51 4c  found loaded SQL
28d80 69 74 65 20 6e 61 74 69 76 65 20 6c 69 62 72 61  ite native libra
28d90 72 79 20 6d 6f 64 75 6c 65 3a 20 22 20 5c 0d 0a  ry module: " \..
28da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28db0 20 20 24 66 69 6c 65 4e 61 6d 65 20 5c 6e 5d 0d    $fileName \n].
28dc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65  .            } e
28dd0 6c 73 65 69 66 20 7b 5b 6c 73 65 61 72 63 68 20  lseif {[lsearch 
28de0 2d 65 78 61 63 74 20 2d 6e 6f 63 61 73 65 20 2d  -exact -nocase -
28df0 2d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  - \..           
28e00 20 20 20 20 20 5b 67 65 74 49 6e 74 65 72 6f 70       [getInterop
28e10 41 73 73 65 6d 62 6c 79 46 69 6c 65 4e 61 6d 65  AssemblyFileName
28e20 73 4f 6e 6c 79 5d 20 24 66 69 6c 65 4e 61 6d 65  sOnly] $fileName
28e30 4f 6e 6c 79 5d 20 21 3d 20 2d 31 7d 20 74 68 65  Only] != -1} the
28e40 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
28e50 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
28e60 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
28e70 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
28e80 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
28e90 66 6f 75 6e 64 20 6c 6f 61 64 65 64 20 53 51 4c  found loaded SQL
28ea0 69 74 65 20 69 6e 74 65 72 6f 70 20 61 73 73 65  ite interop asse
28eb0 6d 62 6c 79 20 6d 6f 64 75 6c 65 3a 20 22 20 5c  mbly module: " \
28ec0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
28ed0 20 20 20 20 24 66 69 6c 65 4e 61 6d 65 20 5c 6e      $fileName \n
28ee0 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ]..            }
28ef0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
28f00 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
28f10 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20      catch {..   
28f20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
28f30 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a  test_channel \..
28f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
28f50 2d 2d 2d 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65  --- compile-time
28f60 20 6f 70 74 69 6f 6e 73 20 66 6f 72 20 53 51 4c   options for SQL
28f70 69 74 65 20 63 6f 72 65 20 6c 69 62 72 61 72 79  ite core library
28f80 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 20  ... "....       
28f90 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d     if {[catch {.
28fa0 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a  .            obj
28fb0 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67  ect invoke -flag
28fc0 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a  s +NonPublic \..
28fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28fe0 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
28ff0 74 65 2e 53 51 4c 69 74 65 33 20 53 51 4c 69 74  te.SQLite3 SQLit
29000 65 43 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 73 0d  eCompileOptions.
29010 0a 20 20 20 20 20 20 20 20 20 20 7d 20 63 6f 6d  .          } com
29020 70 69 6c 65 4f 70 74 69 6f 6e 73 5d 20 3d 3d 20  pileOptions] == 
29030 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
29040 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
29050 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
29060 70 65 6e 64 41 72 67 73 20 5b 66 6f 72 6d 61 74  pendArgs [format
29070 4c 69 73 74 20 5b 6c 73 6f 72 74 20 5c 0d 0a 20  List [lsort \.. 
29080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24                 $
29090 63 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 73 5d 20  compileOptions] 
290a0 3c 6e 6f 6e 65 3e 5d 20 5c 6e 5d 0d 0a 20 20 20  <none>] \n]..   
290b0 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
290c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
290d0 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
290e0 65 6c 20 75 6e 6b 6e 6f 77 6e 5c 6e 0d 0a 20 20  el unknown\n..  
290f0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
29100 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
29110 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
29120 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
29130 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20  _channel \..    
29140 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
29150 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74  compile-time opt
29160 69 6f 6e 73 20 66 6f 72 20 53 51 4c 69 74 65 20  ions for SQLite 
29170 69 6e 74 65 72 6f 70 20 61 73 73 65 6d 62 6c 79  interop assembly
29180 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 20  ... "....       
29190 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d     if {[catch {.
291a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a  .            obj
291b0 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67  ect invoke -flag
291c0 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a  s +NonPublic \..
291d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
291e0 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
291f0 74 65 2e 53 51 4c 69 74 65 33 20 49 6e 74 65 72  te.SQLite3 Inter
29200 6f 70 43 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 73  opCompileOptions
29210 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 63 6f  ..          } co
29220 6d 70 69 6c 65 4f 70 74 69 6f 6e 73 5d 20 3d 3d  mpileOptions] ==
29230 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
29240 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
29250 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
29260 70 70 65 6e 64 41 72 67 73 20 5b 66 6f 72 6d 61  ppendArgs [forma
29270 74 4c 69 73 74 20 5b 6c 73 6f 72 74 20 5c 0d 0a  tList [lsort \..
29280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29290 24 63 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 73 5d  $compileOptions]
292a0 20 3c 6e 6f 6e 65 3e 5d 20 5c 6e 5d 0d 0a 20 20   <none>] \n]..  
292b0 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
292c0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
292d0 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
292e0 6e 65 6c 20 75 6e 6b 6e 6f 77 6e 5c 6e 0d 0a 20  nel unknown\n.. 
292f0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
29300 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
29310 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
29320 54 45 3a 20 53 68 6f 77 20 74 68 65 20 61 63 74  TE: Show the act
29330 69 76 65 20 74 65 73 74 20 63 6f 6e 73 74 72 61  ive test constra
29340 69 6e 74 73 2e 0d 0a 20 20 20 20 20 20 20 20 23  ints...        #
29350 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
29360 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
29370 5b 61 70 70 65 6e 64 41 72 67 73 20 22 2d 2d 2d  [appendArgs "---
29380 2d 20 63 6f 6e 73 74 72 61 69 6e 74 73 3a 20 22  - constraints: "
29390 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
293a0 5b 66 6f 72 6d 61 74 4c 69 73 74 20 5b 6c 73 6f  [formatList [lso
293b0 72 74 20 5b 67 65 74 43 6f 6e 73 74 72 61 69 6e  rt [getConstrain
293c0 74 73 5d 5d 20 3c 6e 6f 6e 65 3e 5d 20 5c 6e 5d  ts]] <none>] \n]
293d0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
293e0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53         # NOTE: S
293f0 61 76 65 20 74 68 65 20 74 65 73 74 20 63 6f 6e  ave the test con
29400 73 74 72 61 69 6e 74 73 20 66 6f 72 20 75 73 65  straints for use
29410 20 62 79 20 74 68 72 65 61 64 73 20 63 72 65 61   by threads crea
29420 74 65 64 20 69 6e 20 74 68 69 73 0d 0a 20 20 20  ted in this..   
29430 20 20 20 20 20 23 20 20 20 20 20 20 20 61 70 70       #       app
29440 6c 69 63 61 74 69 6f 6e 20 64 6f 6d 61 69 6e 2e  lication domain.
29450 20 20 54 68 69 73 20 69 73 20 6e 65 63 65 73 73    This is necess
29460 61 72 79 20 62 65 63 61 75 73 65 20 61 6c 6c 20  ary because all 
29470 74 68 65 20 45 61 67 6c 65 0d 0a 20 20 20 20 20  the Eagle..     
29480 20 20 20 23 20 20 20 20 20 20 20 22 74 65 73 74     #       "test
29490 20 63 6f 6e 74 65 78 74 22 20 69 6e 66 6f 72 6d   context" inform
294a0 61 74 69 6f 6e 20 69 73 20 70 65 72 2d 74 68 72  ation is per-thr
294b0 65 61 64 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ead...        #.
294c0 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69  .        if {![i
294d0 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 73  nfo exists ::tes
294e0 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 5d 7d 20  t_constraints]} 
294f0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
29500 20 20 73 65 74 20 3a 3a 74 65 73 74 5f 63 6f 6e    set ::test_con
29510 73 74 72 61 69 6e 74 73 20 24 3a 3a 65 61 67 6c  straints $::eagl
29520 65 5f 74 65 73 74 73 28 63 6f 6e 73 74 72 61 69  e_tests(constrai
29530 6e 74 73 29 0d 0a 20 20 20 20 20 20 20 20 7d 0d  nts)..        }.
29540 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
29550 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4c 6f        # NOTE: Lo
29560 61 64 20 74 68 65 20 22 61 66 74 65 72 2d 63 6f  ad the "after-co
29570 6e 73 74 72 61 69 6e 74 73 22 20 63 75 73 74 6f  nstraints" custo
29580 6d 20 70 65 72 2d 75 73 65 72 20 61 6e 64 2f 6f  m per-user and/o
29590 72 20 70 65 72 2d 68 6f 73 74 0d 0a 20 20 20 20  r per-host..    
295a0 20 20 20 20 23 20 20 20 20 20 20 20 74 65 73 74      #       test
295b0 20 73 65 74 74 69 6e 67 73 20 6e 6f 77 2e 0d 0a   settings now...
295c0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
295d0 20 20 20 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69     uplevel 1 [li
295e0 73 74 20 6c 6f 61 64 53 51 4c 69 74 65 54 65 73  st loadSQLiteTes
295f0 74 53 65 74 74 69 6e 67 73 20 24 3a 3a 74 65 73  tSettings $::tes
29600 74 5f 63 68 61 6e 6e 65 6c 20 2e 61 66 74 65 72  t_channel .after
29610 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ]....        #..
29620 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
29630 49 66 20 6e 65 63 65 73 73 61 72 79 2c 20 65 6e  If necessary, en
29640 61 62 6c 65 20 73 68 61 72 65 64 2d 63 61 63 68  able shared-cach
29650 65 20 6d 6f 64 65 20 6e 6f 77 2e 0d 0a 20 20 20  e mode now...   
29660 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
29670 69 66 20 7b 5b 68 61 73 52 75 6e 74 69 6d 65 4f  if {[hasRuntimeO
29680 70 74 69 6f 6e 20 73 68 61 72 65 64 43 61 63 68  ption sharedCach
29690 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  e]} then {..    
296a0 20 20 20 20 20 20 65 6e 61 62 6c 65 53 68 61 72        enableShar
296b0 65 64 43 61 63 68 65 20 24 3a 3a 74 65 73 74 5f  edCache $::test_
296c0 63 68 61 6e 6e 65 6c 20 74 72 75 65 0d 0a 20 20  channel true..  
296d0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
296e0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
296f0 4e 4f 54 45 3a 20 53 68 6f 77 20 77 68 65 6e 20  NOTE: Show when 
29700 6f 75 72 20 74 65 73 74 73 20 61 63 74 75 61 6c  our tests actual
29710 6c 79 20 62 65 67 61 6e 20 28 6e 6f 77 29 2e 0d  ly began (now)..
29720 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
29730 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
29740 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
29750 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
29760 20 20 20 20 20 22 2d 2d 2d 2d 20 53 79 73 74 65       "---- Syste
29770 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 74 65  m.Data.SQLite te
29780 73 74 73 20 62 65 67 61 6e 20 61 74 20 22 20 5c  sts began at " \
29790 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 63  ..            [c
297a0 6c 6f 63 6b 20 66 6f 72 6d 61 74 20 5b 63 6c 6f  lock format [clo
297b0 63 6b 20 73 65 63 6f 6e 64 73 5d 5d 20 5c 6e 5d  ck seconds]] \n]
297c0 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
297d0 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 72 75  .....    proc ru
297e0 6e 53 51 4c 69 74 65 54 65 73 74 46 69 6c 65 73  nSQLiteTestFiles
297f0 50 72 6f 6c 6f 67 75 65 20 7b 7d 20 7b 0d 0a 20  Prologue {} {.. 
29800 20 20 20 20 20 75 70 6c 65 76 65 6c 20 31 20 7b       uplevel 1 {
29810 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
29820 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 65 74       # NOTE: Set
29830 75 70 20 74 68 65 20 76 61 72 69 61 62 6c 65 73  up the variables
29840 20 74 68 61 74 20 72 65 66 65 72 20 74 6f 20 74   that refer to t
29850 68 65 20 76 61 72 69 6f 75 73 20 6e 6f 6e 2d 64  he various non-d
29860 61 74 61 20 66 69 6c 65 73 0d 0a 20 20 20 20 20  ata files..     
29870 20 20 20 23 20 20 20 20 20 20 20 72 65 71 75 69     #       requi
29880 72 65 64 20 62 79 20 74 68 65 20 74 65 73 74 73  red by the tests
29890 20 69 6e 20 74 68 69 73 20 66 69 6c 65 2e 0d 0a   in this file...
298a0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
298b0 20 20 20 73 65 74 20 65 6e 74 69 74 79 46 72 61     set entityFra
298c0 6d 65 77 6f 72 6b 44 6c 6c 46 69 6c 65 20 5c 0d  meworkDllFile \.
298d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65  .            [ge
298e0 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20 45  tBuildFileName E
298f0 6e 74 69 74 79 46 72 61 6d 65 77 6f 72 6b 2e 64  ntityFramework.d
29900 6c 6c 20 66 61 6c 73 65 5d 0d 0a 0d 0a 20 20 20  ll false]....   
29910 20 20 20 20 20 73 65 74 20 69 6e 73 74 61 6c 6c       set install
29920 65 72 45 78 65 46 69 6c 65 20 5c 0d 0a 20 20 20  erExeFile \..   
29930 20 20 20 20 20 20 20 20 20 5b 67 65 74 42 75 69           [getBui
29940 6c 64 46 69 6c 65 4e 61 6d 65 20 49 6e 73 74 61  ldFileName Insta
29950 6c 6c 65 72 2e 65 78 65 20 66 61 6c 73 65 5d 0d  ller.exe false].
29960 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 73  ...        set s
29970 71 6c 69 74 65 44 65 73 69 67 6e 65 72 44 6c 6c  qliteDesignerDll
29980 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  File \..        
29990 20 20 20 20 5b 67 65 74 42 75 69 6c 64 46 69 6c      [getBuildFil
299a0 65 4e 61 6d 65 20 53 51 4c 69 74 65 2e 44 65 73  eName SQLite.Des
299b0 69 67 6e 65 72 2e 64 6c 6c 20 66 61 6c 73 65 5d  igner.dll false]
299c0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20  ....        set 
299d0 73 79 73 74 65 6d 44 61 74 61 53 51 4c 69 74 65  systemDataSQLite
299e0 44 6c 6c 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20  DllFile \..     
299f0 20 20 20 20 20 20 20 5b 67 65 74 42 75 69 6c 64         [getBuild
29a00 46 69 6c 65 4e 61 6d 65 20 53 79 73 74 65 6d 2e  FileName System.
29a10 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 20  Data.SQLite.dll 
29a20 66 61 6c 73 65 5d 0d 0a 0d 0a 20 20 20 20 20 20  false]....      
29a30 20 20 73 65 74 20 73 79 73 74 65 6d 44 61 74 61    set systemData
29a40 53 51 4c 69 74 65 4c 69 6e 71 44 6c 6c 46 69 6c  SQLiteLinqDllFil
29a50 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
29a60 20 5b 67 65 74 42 75 69 6c 64 46 69 6c 65 4e 61   [getBuildFileNa
29a70 6d 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  me System.Data.S
29a80 51 4c 69 74 65 2e 4c 69 6e 71 2e 64 6c 6c 20 66  QLite.Linq.dll f
29a90 61 6c 73 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  alse]....       
29aa0 20 73 65 74 20 73 79 73 74 65 6d 44 61 74 61 53   set systemDataS
29ab0 51 4c 69 74 65 45 66 36 44 6c 6c 46 69 6c 65 20  QLiteEf6DllFile 
29ac0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
29ad0 67 65 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65  getBuildFileName
29ae0 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
29af0 69 74 65 2e 45 46 36 2e 64 6c 6c 20 66 61 6c 73  ite.EF6.dll fals
29b00 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65  e]....        se
29b10 74 20 74 65 73 74 45 78 65 46 69 6c 65 20 5b 67  t testExeFile [g
29b20 65 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20  etBuildFileName 
29b30 74 65 73 74 2e 65 78 65 20 66 61 6c 73 65 5d 0d  test.exe false].
29b40 0a 20 20 20 20 20 20 20 20 73 65 74 20 74 65 73  .        set tes
29b50 74 4c 69 6e 71 45 78 65 46 69 6c 65 20 5b 67 65  tLinqExeFile [ge
29b60 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20 74  tBuildFileName t
29b70 65 73 74 6c 69 6e 71 2e 65 78 65 20 66 61 6c 73  estlinq.exe fals
29b80 65 5d 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20  e]..        set 
29b90 74 65 73 74 45 66 36 45 78 65 46 69 6c 65 20 5b  testEf6ExeFile [
29ba0 67 65 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65  getBuildFileName
29bb0 20 74 65 73 74 65 66 36 2e 65 78 65 20 66 61 6c   testef6.exe fal
29bc0 73 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23  se]....        #
29bd0 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
29be0 3a 20 53 65 74 75 70 20 74 68 65 20 76 61 72 69  : Setup the vari
29bf0 61 62 6c 65 73 20 74 68 61 74 20 72 65 66 65 72  ables that refer
29c00 20 74 6f 20 74 68 65 20 76 61 72 69 6f 75 73 20   to the various 
29c10 64 61 74 61 20 66 69 6c 65 73 0d 0a 20 20 20 20  data files..    
29c20 20 20 20 20 23 20 20 20 20 20 20 20 72 65 71 75      #       requ
29c30 69 72 65 64 20 62 79 20 74 68 65 20 74 65 73 74  ired by the test
29c40 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 2e 0d  s in this file..
29c50 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
29c60 20 20 20 20 73 65 74 20 74 65 73 74 4c 69 6e 71      set testLinq
29c70 4f 75 74 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61  OutFile [file na
29c80 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a  tivename [file j
29c90 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  oin \..         
29ca0 20 20 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73     [getSQLiteTes
29cb0 74 44 61 74 61 50 61 74 68 5d 20 74 65 73 74 6c  tDataPath] testl
29cc0 69 6e 71 2e 6f 75 74 5d 5d 0d 0a 0d 0a 20 20 20  inq.out]]....   
29cd0 20 20 20 20 20 73 65 74 20 6e 6f 72 74 68 77 69       set northwi
29ce0 6e 64 45 66 44 62 46 69 6c 65 20 5b 66 69 6c 65  ndEfDbFile [file
29cf0 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c   nativename [fil
29d00 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20  e join \..      
29d10 20 20 20 20 20 20 5b 66 69 6c 65 20 64 69 72 6e        [file dirn
29d20 61 6d 65 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d  ame [file dirnam
29d30 65 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73 74  e [getSQLiteTest
29d40 44 61 74 61 50 61 74 68 5d 5d 5d 20 5c 0d 0a 20  DataPath]]] \.. 
29d50 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 6c             testl
29d60 69 6e 71 20 6e 6f 72 74 68 77 69 6e 64 45 46 2e  inq northwindEF.
29d70 64 62 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  db]]....        
29d80 73 65 74 20 6e 6f 6e 57 61 6c 44 62 46 69 6c 65  set nonWalDbFile
29d90 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d   [file nativenam
29da0 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a  e [file join \..
29db0 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74              [get
29dc0 53 51 4c 69 74 65 54 65 73 74 44 61 74 61 50 61  SQLiteTestDataPa
29dd0 74 68 5d 20 6e 6f 6e 57 61 6c 2e 64 62 5d 5d 0d  th] nonWal.db]].
29de0 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 77  ...        set w
29df0 61 6c 44 62 46 69 6c 65 20 5b 66 69 6c 65 20 6e  alDbFile [file n
29e00 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20  ativename [file 
29e10 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20  join \..        
29e20 20 20 20 20 5b 67 65 74 53 51 4c 69 74 65 54 65      [getSQLiteTe
29e30 73 74 44 61 74 61 50 61 74 68 5d 20 77 61 6c 2e  stDataPath] wal.
29e40 64 62 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  db]]....        
29e50 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
29e60 45 3a 20 54 68 65 20 76 61 72 69 6f 75 73 20 69  E: The various i
29e70 6e 73 74 61 6c 6c 2f 75 6e 69 6e 73 74 61 6c 6c  nstall/uninstall
29e80 20 6c 6f 67 20 66 69 6c 65 73 20 75 73 65 64 20   log files used 
29e90 74 6f 20 74 65 73 74 20 74 68 65 0d 0a 20 20 20  to test the..   
29ea0 20 20 20 20 20 23 20 20 20 20 20 20 20 64 65 73       #       des
29eb0 69 67 6e 2d 74 69 6d 65 20 63 6f 6d 70 6f 6e 65  ign-time compone
29ec0 6e 74 20 69 6e 73 74 61 6c 6c 65 72 2e 0d 0a 20  nt installer... 
29ed0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
29ee0 20 20 73 65 74 20 74 65 73 74 49 6e 73 74 61 6c    set testInstal
29ef0 6c 56 73 32 30 30 35 4c 6f 67 46 69 6c 65 20 5b  lVs2005LogFile [
29f00 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20  file nativename 
29f10 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20  [file join \..  
29f20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 53 51            [getSQ
29f30 4c 69 74 65 54 65 73 74 44 61 74 61 50 61 74 68  LiteTestDataPath
29f40 5d 20 49 6e 73 74 61 6c 6c 65 72 5f 54 65 73 74  ] Installer_Test
29f50 5f 56 73 32 30 30 35 2e 6c 6f 67 5d 5d 0d 0a 0d  _Vs2005.log]]...
29f60 0a 20 20 20 20 20 20 20 20 73 65 74 20 74 65 73  .        set tes
29f70 74 49 6e 73 74 61 6c 6c 56 73 32 30 30 38 4c 6f  tInstallVs2008Lo
29f80 67 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69  gFile [file nati
29f90 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69  vename [file joi
29fa0 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n \..           
29fb0 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73 74 44   [getSQLiteTestD
29fc0 61 74 61 50 61 74 68 5d 20 49 6e 73 74 61 6c 6c  ataPath] Install
29fd0 65 72 5f 54 65 73 74 5f 56 73 32 30 30 38 2e 6c  er_Test_Vs2008.l
29fe0 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  og]]....        
29ff0 73 65 74 20 74 65 73 74 49 6e 73 74 61 6c 6c 56  set testInstallV
2a000 73 32 30 31 30 4c 6f 67 46 69 6c 65 20 5b 66 69  s2010LogFile [fi
2a010 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66  le nativename [f
2a020 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20  ile join \..    
2a030 20 20 20 20 20 20 20 20 5b 67 65 74 53 51 4c 69          [getSQLi
2a040 74 65 54 65 73 74 44 61 74 61 50 61 74 68 5d 20  teTestDataPath] 
2a050 49 6e 73 74 61 6c 6c 65 72 5f 54 65 73 74 5f 56  Installer_Test_V
2a060 73 32 30 31 30 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20  s2010.log]].... 
2a070 20 20 20 20 20 20 20 73 65 74 20 74 65 73 74 49         set testI
2a080 6e 73 74 61 6c 6c 56 73 32 30 31 32 4c 6f 67 46  nstallVs2012LogF
2a090 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65  ile [file native
2a0a0 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20  name [file join 
2a0b0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
2a0c0 67 65 74 53 51 4c 69 74 65 54 65 73 74 44 61 74  getSQLiteTestDat
2a0d0 61 50 61 74 68 5d 20 49 6e 73 74 61 6c 6c 65 72  aPath] Installer
2a0e0 5f 54 65 73 74 5f 56 73 32 30 31 32 2e 6c 6f 67  _Test_Vs2012.log
2a0f0 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65  ]]....        se
2a100 74 20 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32  t testInstallVs2
2a110 30 31 33 4c 6f 67 46 69 6c 65 20 5b 66 69 6c 65  013LogFile [file
2a120 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c   nativename [fil
2a130 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20  e join \..      
2a140 20 20 20 20 20 20 5b 67 65 74 53 51 4c 69 74 65        [getSQLite
2a150 54 65 73 74 44 61 74 61 50 61 74 68 5d 20 49 6e  TestDataPath] In
2a160 73 74 61 6c 6c 65 72 5f 54 65 73 74 5f 56 73 32  staller_Test_Vs2
2a170 30 31 33 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20  013.log]]....   
2a180 20 20 20 20 20 73 65 74 20 74 65 73 74 49 6e 73       set testIns
2a190 74 61 6c 6c 56 73 32 30 31 35 4c 6f 67 46 69 6c  tallVs2015LogFil
2a1a0 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61  e [file nativena
2a1b0 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d  me [file join \.
2a1c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65  .            [ge
2a1d0 74 53 51 4c 69 74 65 54 65 73 74 44 61 74 61 50  tSQLiteTestDataP
2a1e0 61 74 68 5d 20 49 6e 73 74 61 6c 6c 65 72 5f 54  ath] Installer_T
2a1f0 65 73 74 5f 56 73 32 30 31 35 2e 6c 6f 67 5d 5d  est_Vs2015.log]]
2a200 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20  ....        set 
2a210 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 31  testInstallVs201
2a220 37 4c 6f 67 46 69 6c 65 20 5b 66 69 6c 65 20 6e  7LogFile [file n
2a230 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20  ativename [file 
2a240 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20  join \..        
2a250 20 20 20 20 5b 67 65 74 53 51 4c 69 74 65 54 65      [getSQLiteTe
2a260 73 74 44 61 74 61 50 61 74 68 5d 20 49 6e 73 74  stDataPath] Inst
2a270 61 6c 6c 65 72 5f 54 65 73 74 5f 56 73 32 30 31  aller_Test_Vs201
2a280 37 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20  7.log]]....     
2a290 20 20 20 73 65 74 20 74 65 73 74 55 6e 69 6e 73     set testUnins
2a2a0 74 61 6c 6c 56 73 32 30 30 35 4c 6f 67 46 69 6c  tallVs2005LogFil
2a2b0 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61  e [file nativena
2a2c0 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d  me [file join \.
2a2d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65  .            [ge
2a2e0 74 53 51 4c 69 74 65 54 65 73 74 44 61 74 61 50  tSQLiteTestDataP
2a2f0 61 74 68 5d 20 55 6e 69 6e 73 74 61 6c 6c 65 72  ath] Uninstaller
2a300 5f 54 65 73 74 5f 56 73 32 30 30 35 2e 6c 6f 67  _Test_Vs2005.log
2a310 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65  ]]....        se
2a320 74 20 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56  t testUninstallV
2a330 73 32 30 30 38 4c 6f 67 46 69 6c 65 20 5b 66 69  s2008LogFile [fi
2a340 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66  le nativename [f
2a350 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20  ile join \..    
2a360 20 20 20 20 20 20 20 20 5b 67 65 74 53 51 4c 69          [getSQLi
2a370 74 65 54 65 73 74 44 61 74 61 50 61 74 68 5d 20  teTestDataPath] 
2a380 55 6e 69 6e 73 74 61 6c 6c 65 72 5f 54 65 73 74  Uninstaller_Test
2a390 5f 56 73 32 30 30 38 2e 6c 6f 67 5d 5d 0d 0a 0d  _Vs2008.log]]...
2a3a0 0a 20 20 20 20 20 20 20 20 73 65 74 20 74 65 73  .        set tes
2a3b0 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31 30  tUninstallVs2010
2a3c0 4c 6f 67 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61  LogFile [file na
2a3d0 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a  tivename [file j
2a3e0 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  oin \..         
2a3f0 20 20 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73     [getSQLiteTes
2a400 74 44 61 74 61 50 61 74 68 5d 20 55 6e 69 6e 73  tDataPath] Unins
2a410 74 61 6c 6c 65 72 5f 54 65 73 74 5f 56 73 32 30  taller_Test_Vs20
2a420 31 30 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20  10.log]]....    
2a430 20 20 20 20 73 65 74 20 74 65 73 74 55 6e 69 6e      set testUnin
2a440 73 74 61 6c 6c 56 73 32 30 31 32 4c 6f 67 46 69  stallVs2012LogFi
2a450 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e  le [file nativen
2a460 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c  ame [file join \
2a470 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 67  ..            [g
2a480 65 74 53 51 4c 69 74 65 54 65 73 74 44 61 74 61  etSQLiteTestData
2a490 50 61 74 68 5d 20 55 6e 69 6e 73 74 61 6c 6c 65  Path] Uninstalle
2a4a0 72 5f 54 65 73 74 5f 56 73 32 30 31 32 2e 6c 6f  r_Test_Vs2012.lo
2a4b0 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73  g]]....        s
2a4c0 65 74 20 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c  et testUninstall
2a4d0 56 73 32 30 31 33 4c 6f 67 46 69 6c 65 20 5b 66  Vs2013LogFile [f
2a4e0 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b  ile nativename [
2a4f0 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20  file join \..   
2a500 20 20 20 20 20 20 20 20 20 5b 67 65 74 53 51 4c           [getSQL
2a510 69 74 65 54 65 73 74 44 61 74 61 50 61 74 68 5d  iteTestDataPath]
2a520 20 55 6e 69 6e 73 74 61 6c 6c 65 72 5f 54 65 73   Uninstaller_Tes
2a530 74 5f 56 73 32 30 31 33 2e 6c 6f 67 5d 5d 0d 0a  t_Vs2013.log]]..
2a540 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 74 65  ..        set te
2a550 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31  stUninstallVs201
2a560 35 4c 6f 67 46 69 6c 65 20 5b 66 69 6c 65 20 6e  5LogFile [file n
2a570 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20  ativename [file 
2a580 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20  join \..        
2a590 20 20 20 20 5b 67 65 74 53 51 4c 69 74 65 54 65      [getSQLiteTe
2a5a0 73 74 44 61 74 61 50 61 74 68 5d 20 55 6e 69 6e  stDataPath] Unin
2a5b0 73 74 61 6c 6c 65 72 5f 54 65 73 74 5f 56 73 32  staller_Test_Vs2
2a5c0 30 31 35 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20  015.log]]....   
2a5d0 20 20 20 20 20 73 65 74 20 74 65 73 74 55 6e 69       set testUni
2a5e0 6e 73 74 61 6c 6c 56 73 32 30 31 37 4c 6f 67 46  nstallVs2017LogF
2a5f0 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65  ile [file native
2a600 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20  name [file join 
2a610 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
2a620 67 65 74 53 51 4c 69 74 65 54 65 73 74 44 61 74  getSQLiteTestDat
2a630 61 50 61 74 68 5d 20 55 6e 69 6e 73 74 61 6c 6c  aPath] Uninstall
2a640 65 72 5f 54 65 73 74 5f 56 73 32 30 31 37 2e 6c  er_Test_Vs2017.l
2a650 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  og]]....        
2a660 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2a670 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2a680 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2a690 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2a6a0 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20 20 20 20  #######....     
2a6b0 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e     if {![haveCon
2a6c0 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41  straint [appendA
2a6d0 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20  rgs file_ \..   
2a6e0 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74           [file t
2a6f0 61 69 6c 20 24 65 6e 74 69 74 79 46 72 61 6d 65  ail $entityFrame
2a700 77 6f 72 6b 44 6c 6c 46 69 6c 65 5d 5d 5d 7d 20  workDllFile]]]} 
2a710 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
2a720 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24    checkForFile $
2a730 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 65 6e  test_channel $en
2a740 74 69 74 79 46 72 61 6d 65 77 6f 72 6b 44 6c 6c  tityFrameworkDll
2a750 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d  File..        }.
2a760 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21  ...        if {!
2a770 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20  [haveConstraint 
2a780 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65  [appendArgs file
2a790 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  _ \..           
2a7a0 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 69 6e 73   [file tail $ins
2a7b0 74 61 6c 6c 65 72 45 78 65 46 69 6c 65 5d 5d 5d  tallerExeFile]]]
2a7c0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
2a7d0 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65      checkForFile
2a7e0 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24   $test_channel $
2a7f0 69 6e 73 74 61 6c 6c 65 72 45 78 65 46 69 6c 65  installerExeFile
2a800 20 49 6e 73 74 61 6c 6c 65 72 2e 65 78 65 0d 0a   Installer.exe..
2a810 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
2a820 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43       if {![haveC
2a830 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e  onstraint [appen
2a840 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20  dArgs file_ \.. 
2a850 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65             [file
2a860 20 74 61 69 6c 20 24 73 71 6c 69 74 65 44 65 73   tail $sqliteDes
2a870 69 67 6e 65 72 44 6c 6c 46 69 6c 65 5d 5d 5d 7d  ignerDllFile]]]}
2a880 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
2a890 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20     checkForFile 
2a8a0 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 73  $test_channel $s
2a8b0 71 6c 69 74 65 44 65 73 69 67 6e 65 72 44 6c 6c  qliteDesignerDll
2a8c0 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d  File..        }.
2a8d0 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21  ...        if {!
2a8e0 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20  [haveConstraint 
2a8f0 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65  [appendArgs file
2a900 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  _ \..           
2a910 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 73 79 73   [file tail $sys
2a920 74 65 6d 44 61 74 61 53 51 4c 69 74 65 44 6c 6c  temDataSQLiteDll
2a930 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d  File]]]} then {.
2a940 0a 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b  .          check
2a950 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68  ForFile $test_ch
2a960 61 6e 6e 65 6c 20 24 73 79 73 74 65 6d 44 61 74  annel $systemDat
2a970 61 53 51 4c 69 74 65 44 6c 6c 46 69 6c 65 0d 0a  aSQLiteDllFile..
2a980 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
2a990 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43       if {![haveC
2a9a0 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e  onstraint [appen
2a9b0 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20  dArgs file_ \.. 
2a9c0 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65             [file
2a9d0 20 74 61 69 6c 20 24 73 79 73 74 65 6d 44 61 74   tail $systemDat
2a9e0 61 53 51 4c 69 74 65 4c 69 6e 71 44 6c 6c 46 69  aSQLiteLinqDllFi
2a9f0 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  le]]]} then {.. 
2aa00 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f           checkFo
2aa10 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e  rFile $test_chan
2aa20 6e 65 6c 20 24 73 79 73 74 65 6d 44 61 74 61 53  nel $systemDataS
2aa30 51 4c 69 74 65 4c 69 6e 71 44 6c 6c 46 69 6c 65  QLiteLinqDllFile
2aa40 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
2aa50 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76         if {![hav
2aa60 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70  eConstraint [app
2aa70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d  endArgs file_ \.
2aa80 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69  .            [fi
2aa90 6c 65 20 74 61 69 6c 20 24 73 79 73 74 65 6d 44  le tail $systemD
2aaa0 61 74 61 53 51 4c 69 74 65 45 66 36 44 6c 6c 46  ataSQLiteEf6DllF
2aab0 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a  ile]]]} then {..
2aac0 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 46            checkF
2aad0 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61  orFile $test_cha
2aae0 6e 6e 65 6c 20 24 73 79 73 74 65 6d 44 61 74 61  nnel $systemData
2aaf0 53 51 4c 69 74 65 45 66 36 44 6c 6c 46 69 6c 65  SQLiteEf6DllFile
2ab00 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
2ab10 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76         if {![hav
2ab20 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70  eConstraint [app
2ab30 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d  endArgs file_ \.
2ab40 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69  .            [fi
2ab50 6c 65 20 74 61 69 6c 20 24 74 65 73 74 45 78 65  le tail $testExe
2ab60 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d  File]]]} then {.
2ab70 0a 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b  .          check
2ab80 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68  ForFile $test_ch
2ab90 61 6e 6e 65 6c 20 24 74 65 73 74 45 78 65 46 69  annel $testExeFi
2aba0 6c 65 20 74 65 73 74 2e 65 78 65 0d 0a 20 20 20  le test.exe..   
2abb0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
2abc0 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73    if {![haveCons
2abd0 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
2abe0 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20  gs file_ \..    
2abf0 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61          [file ta
2ac00 69 6c 20 24 74 65 73 74 4c 69 6e 71 45 78 65 46  il $testLinqExeF
2ac10 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a  ile]]]} then {..
2ac20 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 46            checkF
2ac30 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61  orFile $test_cha
2ac40 6e 6e 65 6c 20 24 74 65 73 74 4c 69 6e 71 45 78  nnel $testLinqEx
2ac50 65 46 69 6c 65 20 74 65 73 74 6c 69 6e 71 2e 65  eFile testlinq.e
2ac60 78 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  xe..        }...
2ac70 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68  .        if {![h
2ac80 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61  aveConstraint [a
2ac90 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20  ppendArgs file_ 
2aca0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
2acb0 66 69 6c 65 20 74 61 69 6c 20 24 74 65 73 74 45  file tail $testE
2acc0 66 36 45 78 65 46 69 6c 65 5d 5d 5d 7d 20 74 68  f6ExeFile]]]} th
2acd0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
2ace0 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65  checkForFile $te
2acf0 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73 74  st_channel $test
2ad00 45 66 36 45 78 65 46 69 6c 65 20 74 65 73 74 65  Ef6ExeFile teste
2ad10 66 36 2e 65 78 65 0d 0a 20 20 20 20 20 20 20 20  f6.exe..        
2ad20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20  }....        if 
2ad30 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e  {![haveConstrain
2ad40 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69  t [appendArgs fi
2ad50 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  le_ \..         
2ad60 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 74     [file tail $t
2ad70 65 73 74 4c 69 6e 71 4f 75 74 46 69 6c 65 5d 5d  estLinqOutFile]]
2ad80 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
2ad90 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c       checkForFil
2ada0 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  e $test_channel 
2adb0 24 74 65 73 74 4c 69 6e 71 4f 75 74 46 69 6c 65  $testLinqOutFile
2adc0 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
2add0 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76         if {![hav
2ade0 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70  eConstraint [app
2adf0 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d  endArgs file_ \.
2ae00 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69  .            [fi
2ae10 6c 65 20 74 61 69 6c 20 24 6e 6f 72 74 68 77 69  le tail $northwi
2ae20 6e 64 45 66 44 62 46 69 6c 65 5d 5d 5d 7d 20 74  ndEfDbFile]]]} t
2ae30 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
2ae40 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74   checkForFile $t
2ae50 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 6e 6f 72  est_channel $nor
2ae60 74 68 77 69 6e 64 45 66 44 62 46 69 6c 65 0d 0a  thwindEfDbFile..
2ae70 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
2ae80 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43       if {![haveC
2ae90 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e  onstraint [appen
2aea0 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20  dArgs file_ \.. 
2aeb0 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65             [file
2aec0 20 74 61 69 6c 20 24 6e 6f 6e 57 61 6c 44 62 46   tail $nonWalDbF
2aed0 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a  ile]]]} then {..
2aee0 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 46            checkF
2aef0 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61  orFile $test_cha
2af00 6e 6e 65 6c 20 24 6e 6f 6e 57 61 6c 44 62 46 69  nnel $nonWalDbFi
2af10 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  le..        }...
2af20 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68  .        if {![h
2af30 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61  aveConstraint [a
2af40 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20  ppendArgs file_ 
2af50 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
2af60 66 69 6c 65 20 74 61 69 6c 20 24 77 61 6c 44 62  file tail $walDb
2af70 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d  File]]]} then {.
2af80 0a 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b  .          check
2af90 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68  ForFile $test_ch
2afa0 61 6e 6e 65 6c 20 24 77 61 6c 44 62 46 69 6c 65  annel $walDbFile
2afb0 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
2afc0 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76         if {![hav
2afd0 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70  eConstraint [app
2afe0 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d  endArgs file_ \.
2aff0 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69  .            [fi
2b000 6c 65 20 74 61 69 6c 20 24 74 65 73 74 49 6e 73  le tail $testIns
2b010 74 61 6c 6c 56 73 32 30 30 35 4c 6f 67 46 69 6c  tallVs2005LogFil
2b020 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  e]]]} then {..  
2b030 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72          checkFor
2b040 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e  File $test_chann
2b050 65 6c 20 24 74 65 73 74 49 6e 73 74 61 6c 6c 56  el $testInstallV
2b060 73 32 30 30 35 4c 6f 67 46 69 6c 65 0d 0a 20 20  s2005LogFile..  
2b070 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
2b080 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e     if {![haveCon
2b090 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41  straint [appendA
2b0a0 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20  rgs file_ \..   
2b0b0 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74           [file t
2b0c0 61 69 6c 20 24 74 65 73 74 49 6e 73 74 61 6c 6c  ail $testInstall
2b0d0 56 73 32 30 30 38 4c 6f 67 46 69 6c 65 5d 5d 5d  Vs2008LogFile]]]
2b0e0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
2b0f0 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65      checkForFile
2b100 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24   $test_channel $
2b110 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 30  testInstallVs200
2b120 38 4c 6f 67 46 69 6c 65 0d 0a 20 20 20 20 20 20  8LogFile..      
2b130 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69    }....        i
2b140 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61  f {![haveConstra
2b150 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20  int [appendArgs 
2b160 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20  file_ \..       
2b170 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20       [file tail 
2b180 24 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30  $testInstallVs20
2b190 31 30 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74 68  10LogFile]]]} th
2b1a0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
2b1b0 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65  checkForFile $te
2b1c0 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73 74  st_channel $test
2b1d0 49 6e 73 74 61 6c 6c 56 73 32 30 31 30 4c 6f 67  InstallVs2010Log
2b1e0 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d  File..        }.
2b1f0 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21  ...        if {!
2b200 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20  [haveConstraint 
2b210 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65  [appendArgs file
2b220 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  _ \..           
2b230 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 74 65 73   [file tail $tes
2b240 74 49 6e 73 74 61 6c 6c 56 73 32 30 31 32 4c 6f  tInstallVs2012Lo
2b250 67 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b  gFile]]]} then {
2b260 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68 65 63  ..          chec
2b270 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63  kForFile $test_c
2b280 68 61 6e 6e 65 6c 20 24 74 65 73 74 49 6e 73 74  hannel $testInst
2b290 61 6c 6c 56 73 32 30 31 32 4c 6f 67 46 69 6c 65  allVs2012LogFile
2b2a0 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
2b2b0 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76         if {![hav
2b2c0 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70  eConstraint [app
2b2d0 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d  endArgs file_ \.
2b2e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69  .            [fi
2b2f0 6c 65 20 74 61 69 6c 20 24 74 65 73 74 49 6e 73  le tail $testIns
2b300 74 61 6c 6c 56 73 32 30 31 33 4c 6f 67 46 69 6c  tallVs2013LogFil
2b310 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  e]]]} then {..  
2b320 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72          checkFor
2b330 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e  File $test_chann
2b340 65 6c 20 24 74 65 73 74 49 6e 73 74 61 6c 6c 56  el $testInstallV
2b350 73 32 30 31 33 4c 6f 67 46 69 6c 65 0d 0a 20 20  s2013LogFile..  
2b360 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
2b370 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e     if {![haveCon
2b380 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41  straint [appendA
2b390 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20  rgs file_ \..   
2b3a0 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74           [file t
2b3b0 61 69 6c 20 24 74 65 73 74 49 6e 73 74 61 6c 6c  ail $testInstall
2b3c0 56 73 32 30 31 35 4c 6f 67 46 69 6c 65 5d 5d 5d  Vs2015LogFile]]]
2b3d0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
2b3e0 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65      checkForFile
2b3f0 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24   $test_channel $
2b400 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 31  testInstallVs201
2b410 35 4c 6f 67 46 69 6c 65 0d 0a 20 20 20 20 20 20  5LogFile..      
2b420 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69    }....        i
2b430 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61  f {![haveConstra
2b440 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20  int [appendArgs 
2b450 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20  file_ \..       
2b460 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20       [file tail 
2b470 24 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30  $testInstallVs20
2b480 31 37 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74 68  17LogFile]]]} th
2b490 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
2b4a0 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65  checkForFile $te
2b4b0 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73 74  st_channel $test
2b4c0 49 6e 73 74 61 6c 6c 56 73 32 30 31 37 4c 6f 67  InstallVs2017Log
2b4d0 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d  File..        }.
2b4e0 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21  ...        if {!
2b4f0 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20  [haveConstraint 
2b500 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65  [appendArgs file
2b510 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  _ \..           
2b520 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 74 65 73   [file tail $tes
2b530 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 30 35  tUninstallVs2005
2b540 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e  LogFile]]]} then
2b550 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68   {..          ch
2b560 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74  eckForFile $test
2b570 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73 74 55 6e  _channel $testUn
2b580 69 6e 73 74 61 6c 6c 56 73 32 30 30 35 4c 6f 67  installVs2005Log
2b590 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d  File..        }.
2b5a0 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21  ...        if {!
2b5b0 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20  [haveConstraint 
2b5c0 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65  [appendArgs file
2b5d0 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  _ \..           
2b5e0 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 74 65 73   [file tail $tes
2b5f0 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 30 38  tUninstallVs2008
2b600 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e  LogFile]]]} then
2b610 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68   {..          ch
2b620 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74  eckForFile $test
2b630 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73 74 55 6e  _channel $testUn
2b640 69 6e 73 74 61 6c 6c 56 73 32 30 30 38 4c 6f 67  installVs2008Log
2b650 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d  File..        }.
2b660 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21  ...        if {!
2b670 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20  [haveConstraint 
2b680 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65  [appendArgs file
2b690 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  _ \..           
2b6a0 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 74 65 73   [file tail $tes
2b6b0 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31 30  tUninstallVs2010
2b6c0 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e  LogFile]]]} then
2b6d0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68   {..          ch
2b6e0 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74  eckForFile $test
2b6f0 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73 74 55 6e  _channel $testUn
2b700 69 6e 73 74 61 6c 6c 56 73 32 30 31 30 4c 6f 67  installVs2010Log
2b710 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d  File..        }.
2b720 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21  ...        if {!
2b730 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20  [haveConstraint 
2b740 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65  [appendArgs file
2b750 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  _ \..           
2b760 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 74 65 73   [file tail $tes
2b770 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31 32  tUninstallVs2012
2b780 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e  LogFile]]]} then
2b790 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68   {..          ch
2b7a0 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74  eckForFile $test
2b7b0 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73 74 55 6e  _channel $testUn
2b7c0 69 6e 73 74 61 6c 6c 56 73 32 30 31 32 4c 6f 67  installVs2012Log
2b7d0 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d  File..        }.
2b7e0 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21  ...        if {!
2b7f0 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20  [haveConstraint 
2b800 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65  [appendArgs file
2b810 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  _ \..           
2b820 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 74 65 73   [file tail $tes
2b830 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31 33  tUninstallVs2013
2b840 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e  LogFile]]]} then
2b850 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68   {..          ch
2b860 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74  eckForFile $test
2b870 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73 74 55 6e  _channel $testUn
2b880 69 6e 73 74 61 6c 6c 56 73 32 30 31 33 4c 6f 67  installVs2013Log
2b890 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d  File..        }.
2b8a0 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21  ...        if {!
2b8b0 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20  [haveConstraint 
2b8c0 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65  [appendArgs file
2b8d0 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  _ \..           
2b8e0 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 74 65 73   [file tail $tes
2b8f0 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31 35  tUninstallVs2015
2b900 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e  LogFile]]]} then
2b910 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68   {..          ch
2b920 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74  eckForFile $test
2b930 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73 74 55 6e  _channel $testUn
2b940 69 6e 73 74 61 6c 6c 56 73 32 30 31 35 4c 6f 67  installVs2015Log
2b950 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d  File..        }.
2b960 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21  ...        if {!
2b970 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20  [haveConstraint 
2b980 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65  [appendArgs file
2b990 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  _ \..           
2b9a0 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 74 65 73   [file tail $tes
2b9b0 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31 37  tUninstallVs2017
2b9c0 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e  LogFile]]]} then
2b9d0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68   {..          ch
2b9e0 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74  eckForFile $test
2b9f0 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73 74 55 6e  _channel $testUn
2ba00 69 6e 73 74 61 6c 6c 56 73 32 30 31 37 4c 6f 67  installVs2017Log
2ba10 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d  File..        }.
2ba20 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
2ba30 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 72 75 6e  ....    proc run
2ba40 53 51 4c 69 74 65 54 65 73 74 46 69 6c 65 73 45  SQLiteTestFilesE
2ba50 70 69 6c 6f 67 75 65 20 7b 7d 20 7b 0d 0a 20 20  pilogue {} {..  
2ba60 20 20 20 20 75 70 6c 65 76 65 6c 20 31 20 7b 0d      uplevel 1 {.
2ba70 0a 20 20 20 20 20 20 20 20 75 6e 73 65 74 20 2d  .        unset -
2ba80 6e 6f 63 6f 6d 70 6c 61 69 6e 20 5c 0d 0a 20 20  nocomplain \..  
2ba90 20 20 20 20 20 20 20 20 20 20 74 65 73 74 55 6e            testUn
2baa0 69 6e 73 74 61 6c 6c 56 73 32 30 31 37 4c 6f 67  installVs2017Log
2bab0 46 69 6c 65 20 74 65 73 74 55 6e 69 6e 73 74 61  File testUninsta
2bac0 6c 6c 56 73 32 30 31 35 4c 6f 67 46 69 6c 65 20  llVs2015LogFile 
2bad0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  \..            t
2bae0 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30  estUninstallVs20
2baf0 31 33 4c 6f 67 46 69 6c 65 20 74 65 73 74 55 6e  13LogFile testUn
2bb00 69 6e 73 74 61 6c 6c 56 73 32 30 31 32 4c 6f 67  installVs2012Log
2bb10 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  File \..        
2bb20 20 20 20 20 74 65 73 74 55 6e 69 6e 73 74 61 6c      testUninstal
2bb30 6c 56 73 32 30 31 30 4c 6f 67 46 69 6c 65 20 74  lVs2010LogFile t
2bb40 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30  estUninstallVs20
2bb50 30 38 4c 6f 67 46 69 6c 65 20 5c 0d 0a 20 20 20  08LogFile \..   
2bb60 20 20 20 20 20 20 20 20 20 74 65 73 74 55 6e 69           testUni
2bb70 6e 73 74 61 6c 6c 56 73 32 30 30 35 4c 6f 67 46  nstallVs2005LogF
2bb80 69 6c 65 20 74 65 73 74 49 6e 73 74 61 6c 6c 56  ile testInstallV
2bb90 73 32 30 31 37 4c 6f 67 46 69 6c 65 20 5c 0d 0a  s2017LogFile \..
2bba0 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
2bbb0 49 6e 73 74 61 6c 6c 56 73 32 30 31 35 4c 6f 67  InstallVs2015Log
2bbc0 46 69 6c 65 20 74 65 73 74 49 6e 73 74 61 6c 6c  File testInstall
2bbd0 56 73 32 30 31 33 4c 6f 67 46 69 6c 65 20 5c 0d  Vs2013LogFile \.
2bbe0 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  .            tes
2bbf0 74 49 6e 73 74 61 6c 6c 56 73 32 30 31 32 4c 6f  tInstallVs2012Lo
2bc00 67 46 69 6c 65 20 74 65 73 74 49 6e 73 74 61 6c  gFile testInstal
2bc10 6c 56 73 32 30 31 30 4c 6f 67 46 69 6c 65 20 5c  lVs2010LogFile \
2bc20 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65  ..            te
2bc30 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 30 38 4c  stInstallVs2008L
2bc40 6f 67 46 69 6c 65 20 74 65 73 74 49 6e 73 74 61  ogFile testInsta
2bc50 6c 6c 56 73 32 30 30 35 4c 6f 67 46 69 6c 65 0d  llVs2005LogFile.
2bc60 0a 0d 0a 20 20 20 20 20 20 20 20 75 6e 73 65 74  ...        unset
2bc70 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 5c 0d 0a   -nocomplain \..
2bc80 20 20 20 20 20 20 20 20 20 20 20 20 6e 6f 72 74              nort
2bc90 68 77 69 6e 64 45 66 44 62 46 69 6c 65 20 74 65  hwindEfDbFile te
2bca0 73 74 4c 69 6e 71 4f 75 74 46 69 6c 65 20 5c 0d  stLinqOutFile \.
2bcb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 77 61 6c  .            wal
2bcc0 44 62 46 69 6c 65 20 6e 6f 6e 57 61 6c 44 62 46  DbFile nonWalDbF
2bcd0 69 6c 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20 75  ile....        u
2bce0 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e  nset -nocomplain
2bcf0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
2bd00 74 65 73 74 45 66 36 45 78 65 46 69 6c 65 20 74  testEf6ExeFile t
2bd10 65 73 74 4c 69 6e 71 45 78 65 46 69 6c 65 20 5c  estLinqExeFile \
2bd20 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65  ..            te
2bd30 73 74 45 78 65 46 69 6c 65 20 73 79 73 74 65 6d  stExeFile system
2bd40 44 61 74 61 53 51 4c 69 74 65 45 66 36 44 6c 6c  DataSQLiteEf6Dll
2bd50 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  File \..        
2bd60 20 20 20 20 73 79 73 74 65 6d 44 61 74 61 53 51      systemDataSQ
2bd70 4c 69 74 65 4c 69 6e 71 44 6c 6c 46 69 6c 65 20  LiteLinqDllFile 
2bd80 73 79 73 74 65 6d 44 61 74 61 53 51 4c 69 74 65  systemDataSQLite
2bd90 44 6c 6c 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20  DllFile \..     
2bda0 20 20 20 20 20 20 20 73 71 6c 69 74 65 44 65 73         sqliteDes
2bdb0 69 67 6e 65 72 44 6c 6c 46 69 6c 65 20 69 6e 73  ignerDllFile ins
2bdc0 74 61 6c 6c 65 72 45 78 65 46 69 6c 65 20 5c 0d  tallerExeFile \.
2bdd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 6e 74  .            ent
2bde0 69 74 79 46 72 61 6d 65 77 6f 72 6b 44 6c 6c 46  ityFrameworkDllF
2bdf0 69 6c 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  ile..      }..  
2be00 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
2be10 20 72 75 6e 53 51 4c 69 74 65 54 65 73 74 45 70   runSQLiteTestEp
2be20 69 6c 6f 67 75 65 20 7b 7d 20 7b 0d 0a 20 20 20  ilogue {} {..   
2be30 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
2be40 54 45 3a 20 53 6b 69 70 20 72 75 6e 6e 69 6e 67  TE: Skip running
2be50 20 6f 75 72 20 63 75 73 74 6f 6d 20 65 70 69 6c   our custom epil
2be60 6f 67 75 65 20 69 66 20 74 68 65 20 6d 61 69 6e  ogue if the main
2be70 20 6f 6e 65 20 68 61 73 20 62 65 65 6e 0d 0a 20   one has been.. 
2be80 20 20 20 20 20 23 20 20 20 20 20 20 20 73 6b 69       #       ski
2be90 70 70 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  pped...      #..
2bea0 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
2beb0 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 65 70 69   exists ::no(epi
2bec0 6c 6f 67 75 65 2e 65 61 67 6c 65 29 5d 7d 20 74  logue.eagle)]} t
2bed0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
2bee0 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
2bef0 3a 20 53 68 6f 77 20 77 68 65 6e 20 6f 75 72 20  : Show when our 
2bf00 74 65 73 74 73 20 61 63 74 75 61 6c 6c 79 20 65  tests actually e
2bf10 6e 64 65 64 20 28 6e 6f 77 29 2e 0d 0a 20 20 20  nded (now)...   
2bf20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
2bf30 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
2bf40 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
2bf50 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
2bf60 20 22 2d 2d 2d 2d 20 53 79 73 74 65 6d 2e 44 61   "---- System.Da
2bf70 74 61 2e 53 51 4c 69 74 65 20 74 65 73 74 73 20  ta.SQLite tests 
2bf80 65 6e 64 65 64 20 61 74 20 22 20 5c 0d 0a 20 20  ended at " \..  
2bf90 20 20 20 20 20 20 20 20 20 20 5b 63 6c 6f 63 6b            [clock
2bfa0 20 66 6f 72 6d 61 74 20 5b 63 6c 6f 63 6b 20 73   format [clock s
2bfb0 65 63 6f 6e 64 73 5d 5d 20 5c 6e 5d 0d 0a 0d 0a  econds]] \n]....
2bfc0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
2bfd0 20 20 20 23 20 4e 4f 54 45 3a 20 4c 6f 61 64 20     # NOTE: Load 
2bfe0 74 68 65 20 22 65 70 69 6c 6f 67 75 65 22 20 63  the "epilogue" c
2bff0 75 73 74 6f 6d 20 70 65 72 2d 75 73 65 72 20 61  ustom per-user a
2c000 6e 64 2f 6f 72 20 70 65 72 2d 68 6f 73 74 20 74  nd/or per-host t
2c010 65 73 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20  est..        #  
2c020 20 20 20 20 20 73 65 74 74 69 6e 67 73 20 6e 6f       settings no
2c030 77 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  w...        #.. 
2c040 20 20 20 20 20 20 20 75 70 6c 65 76 65 6c 20 31         uplevel 1
2c050 20 5b 6c 69 73 74 20 6c 6f 61 64 53 51 4c 69 74   [list loadSQLit
2c060 65 54 65 73 74 53 65 74 74 69 6e 67 73 20 24 3a  eTestSettings $:
2c070 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 2e 65  :test_channel .e
2c080 70 69 6c 6f 67 75 65 5d 0d 0a 0d 0a 20 20 20 20  pilogue]....    
2c090 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
2c0a0 20 42 55 47 46 49 58 3a 20 42 65 66 6f 72 65 20   BUGFIX: Before 
2c0b0 63 68 65 63 6b 69 6e 67 20 74 68 65 20 66 69 6e  checking the fin
2c0c0 61 6c 20 72 65 73 6f 75 72 63 65 73 20 69 6e 20  al resources in 
2c0d0 75 73 65 20 62 79 20 53 51 4c 69 74 65 2c 20 6d  use by SQLite, m
2c0e0 61 6b 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ake..        #  
2c0f0 20 20 20 20 20 20 20 73 75 72 65 20 62 6f 74 68         sure both
2c100 20 6f 66 20 74 68 65 20 50 52 41 47 4d 41 20 72   of the PRAGMA r
2c110 65 6c 61 74 65 64 20 64 69 72 65 63 74 6f 72 79  elated directory
2c120 20 6e 61 6d 65 73 20 61 72 65 20 66 72 65 65 64   names are freed
2c130 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
2c140 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51        checkForSQ
2c150 4c 69 74 65 44 69 72 65 63 74 6f 72 69 65 73 20  LiteDirectories 
2c160 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
2c170 74 72 75 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20  true....        
2c180 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
2c190 45 3a 20 41 6c 73 6f 20 72 65 70 6f 72 74 20 74  E: Also report t
2c1a0 68 65 20 72 65 73 6f 75 72 63 65 20 75 73 61 67  he resource usag
2c1b0 65 20 61 66 74 65 72 20 72 75 6e 6e 69 6e 67 20  e after running 
2c1c0 74 68 65 20 74 65 73 74 73 2e 0d 0a 20 20 20 20  the tests...    
2c1d0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
2c1e0 65 70 6f 72 74 53 51 4c 69 74 65 52 65 73 6f 75  eportSQLiteResou
2c1f0 72 63 65 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  rces $::test_cha
2c200 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20 20 20 20  nnel....        
2c210 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
2c220 45 3a 20 52 65 70 6f 72 74 20 74 68 65 20 63 72  E: Report the cr
2c230 69 74 69 63 61 6c 20 68 61 6e 64 6c 65 20 63 6f  itical handle co
2c240 75 6e 74 73 20 61 66 74 65 72 20 72 75 6e 6e 69  unts after runni
2c250 6e 67 20 74 68 65 20 74 65 73 74 73 2e 0d 0a 20  ng the tests... 
2c260 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
2c270 20 20 67 65 74 53 51 4c 69 74 65 48 61 6e 64 6c    getSQLiteHandl
2c280 65 43 6f 75 6e 74 73 20 24 3a 3a 74 65 73 74 5f  eCounts $::test_
2c290 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20  channel....     
2c2a0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
2c2b0 4e 4f 54 45 3a 20 49 66 20 6e 65 63 65 73 73 61  NOTE: If necessa
2c2c0 72 79 2c 20 64 69 73 61 62 6c 65 20 73 68 61 72  ry, disable shar
2c2d0 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 20 6e 6f  ed-cache mode no
2c2e0 77 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  w...        #.. 
2c2f0 20 20 20 20 20 20 20 69 66 20 7b 5b 68 61 73 52         if {[hasR
2c300 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 73 68 61  untimeOption sha
2c310 72 65 64 43 61 63 68 65 5d 7d 20 74 68 65 6e 20  redCache]} then 
2c320 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 65 6e 61  {..          ena
2c330 62 6c 65 53 68 61 72 65 64 43 61 63 68 65 20 24  bleSharedCache $
2c340 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 66  ::test_channel f
2c350 61 6c 73 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d  alse..        }.
2c360 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
2c370 0a 0c 0d 0a 20 20 20 20 23 23 23 23 23 23 23 23  ....    ########
2c380 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2c390 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2c3a0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2c3b0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2c3c0 23 23 23 0d 0a 20 20 20 20 23 23 23 23 23 23 23  ###..    #######
2c3d0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2c3e0 23 23 23 23 23 23 20 45 4e 44 20 45 61 67 6c 65  ###### END Eagle
2c3f0 20 4f 4e 4c 59 20 23 23 23 23 23 23 23 23 23 23   ONLY ##########
2c400 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2c410 23 23 23 23 0d 0a 20 20 20 20 23 23 23 23 23 23  ####..    ######
2c420 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2c430 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2c440 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2c450 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2c460 23 23 23 23 23 0d 0a 20 20 7d 0d 0a 0d 0a 20 20  #####..  }....  
2c470 23 0d 0a 20 20 23 20 4e 4f 54 45 3a 20 53 61 76  #..  # NOTE: Sav
2c480 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  e the name of th
2c490 65 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 74  e directory cont
2c4a0 61 69 6e 69 6e 67 20 74 68 69 73 20 66 69 6c 65  aining this file
2c4b0 2e 0d 0a 20 20 23 0d 0a 20 20 69 66 20 7b 21 5b  ...  #..  if {![
2c4c0 69 6e 66 6f 20 65 78 69 73 74 73 20 63 6f 6d 6d  info exists comm
2c4d0 6f 6e 5f 64 69 72 65 63 74 6f 72 79 5d 7d 20 74  on_directory]} t
2c4e0 68 65 6e 20 7b 0d 0a 20 20 20 20 73 65 74 20 63  hen {..    set c
2c4f0 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79 20  ommon_directory 
2c500 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20 5b 69  [file dirname [i
2c510 6e 66 6f 20 73 63 72 69 70 74 5d 5d 0d 0a 20 20  nfo script]]..  
2c520 7d 0d 0a 0d 0a 20 20 23 0d 0a 20 20 23 20 4e 4f  }....  #..  # NO
2c530 54 45 3a 20 50 72 6f 76 69 64 65 20 74 68 65 20  TE: Provide the 
2c540 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
2c550 74 65 20 74 65 73 74 20 70 61 63 6b 61 67 65 20  te test package 
2c560 74 6f 20 74 68 65 20 69 6e 74 65 72 70 72 65 74  to the interpret
2c570 65 72 2e 0d 0a 20 20 23 0d 0a 20 20 70 61 63 6b  er...  #..  pack
2c580 61 67 65 20 70 72 6f 76 69 64 65 20 53 79 73 74  age provide Syst
2c590 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 54  em.Data.SQLite.T
2c5a0 65 73 74 20 31 2e 30 0d 0a 7d 0d 0a              est 1.0..}..