System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact 1c23c889fab154154ae4aca6e2bf2fd4c7022705:


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 6f 72 20 32 30 31 35 20 62 75 69  013, or 2015 bui
0760: 6c 64 20 73 79 73 74 65 6d 73 2e 20 20 54 6f 20  ld systems.  To 
0770: 6f 76 65 72 72 69 64 65 0d 0a 20 20 20 20 20 20  override..      
0780: 23 20 20 20 20 20 20 20 74 68 69 73 20 76 61 6c  #       this val
0790: 75 65 20 76 69 61 20 74 68 65 20 63 6f 6d 6d 61  ue via the comma
07a0: 6e 64 20 6c 69 6e 65 2c 20 65 6e 74 65 72 20 61  nd line, enter a
07b0: 20 63 6f 6d 6d 61 6e 64 20 73 69 6d 69 6c 61 72   command similar
07c0: 20 74 6f 20 6f 6e 65 0d 0a 20 20 20 20 20 20 23   to one..      #
07d0: 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 66 6f         of the fo
07e0: 6c 6c 6f 77 69 6e 67 20 28 61 6c 6c 20 6f 6e 20  llowing (all on 
07f0: 6f 6e 65 20 6c 69 6e 65 29 3a 0d 0a 20 20 20 20  one line):..    
0800: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 20 20 20    #..      #    
0810: 20 20 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78     EagleShell.ex
0820: 65 20 2d 61 6e 79 49 6e 69 74 69 61 6c 69 7a 65  e -anyInitialize
0830: 20 22 73 65 74 20 74 65 73 74 5f 79 65 61 72 20   "set test_year 
0840: 32 30 30 35 22 0d 0a 20 20 20 20 20 20 23 20 20  2005"..      #  
0850: 20 20 20 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70         -file .\p
0860: 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65  ath\to\all.eagle
0870: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
0880: 20 23 20 20 20 20 20 20 20 45 61 67 6c 65 53 68   #       EagleSh
0890: 65 6c 6c 2e 65 78 65 20 2d 61 6e 79 49 6e 69 74  ell.exe -anyInit
08a0: 69 61 6c 69 7a 65 20 22 73 65 74 20 74 65 73 74  ialize "set test
08b0: 5f 79 65 61 72 20 32 30 30 38 22 0d 0a 20 20 20  _year 2008"..   
08c0: 20 20 20 23 20 20 20 20 20 20 20 20 20 2d 66 69     #         -fi
08d0: 6c 65 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c  le .\path\to\all
08e0: 2e 65 61 67 6c 65 0d 0a 20 20 20 20 20 20 23 0d  .eagle..      #.
08f0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 45  .      #       E
0900: 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65 20 2d 61  agleShell.exe -a
0910: 6e 79 49 6e 69 74 69 61 6c 69 7a 65 20 22 73 65  nyInitialize "se
0920: 74 20 74 65 73 74 5f 79 65 61 72 20 32 30 31 30  t test_year 2010
0930: 22 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  "..      #      
0940: 20 20 20 2d 66 69 6c 65 20 2e 5c 70 61 74 68 5c     -file .\path\
0950: 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a 20 20  to\all.eagle..  
0960: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 20      #..      #  
0970: 20 20 20 20 20 45 61 67 6c 65 53 68 65 6c 6c 2e       EagleShell.
0980: 65 78 65 20 2d 61 6e 79 49 6e 69 74 69 61 6c 69  exe -anyInitiali
0990: 7a 65 20 22 73 65 74 20 74 65 73 74 5f 79 65 61  ze "set test_yea
09a0: 72 20 32 30 31 32 22 0d 0a 20 20 20 20 20 20 23  r 2012"..      #
09b0: 20 20 20 20 20 20 20 20 20 2d 66 69 6c 65 20 2e           -file .
09c0: 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67  \path\to\all.eag
09d0: 6c 65 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  le..      #..   
09e0: 20 20 20 23 20 20 20 20 20 20 20 45 61 67 6c 65     #       Eagle
09f0: 53 68 65 6c 6c 2e 65 78 65 20 2d 61 6e 79 49 6e  Shell.exe -anyIn
0a00: 69 74 69 61 6c 69 7a 65 20 22 73 65 74 20 74 65  itialize "set te
0a10: 73 74 5f 79 65 61 72 20 32 30 31 33 22 0d 0a 20  st_year 2013".. 
0a20: 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20 2d       #         -
0a30: 66 69 6c 65 20 2e 5c 70 61 74 68 5c 74 6f 5c 61  file .\path\to\a
0a40: 6c 6c 2e 65 61 67 6c 65 0d 0a 20 20 20 20 20 20  ll.eagle..      
0a50: 23 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  #..      #      
0a60: 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65 20   EagleShell.exe 
0a70: 2d 61 6e 79 49 6e 69 74 69 61 6c 69 7a 65 20 22  -anyInitialize "
0a80: 73 65 74 20 74 65 73 74 5f 79 65 61 72 20 32 30  set test_year 20
0a90: 31 35 22 0d 0a 20 20 20 20 20 20 23 20 20 20 20  15"..      #    
0aa0: 20 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70 61 74       -file .\pat
0ab0: 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a  h\to\all.eagle..
0ac0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
0ad0: 20 20 20 20 20 20 20 45 61 67 6c 65 53 68 65 6c         EagleShel
0ae0: 6c 2e 65 78 65 20 2d 61 6e 79 49 6e 69 74 69 61  l.exe -anyInitia
0af0: 6c 69 7a 65 20 22 75 6e 73 65 74 20 2d 6e 6f 63  lize "unset -noc
0b00: 6f 6d 70 6c 61 69 6e 20 74 65 73 74 5f 79 65 61  omplain test_yea
0b10: 72 22 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  r"..      #     
0b20: 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70 61 74 68      -file .\path
0b30: 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a 20  \to\all.eagle.. 
0b40: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
0b50: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
0b60: 3a 74 65 73 74 5f 79 65 61 72 5d 20 26 26 20 5b  :test_year] && [
0b70: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a  string length $:
0b80: 3a 74 65 73 74 5f 79 65 61 72 5d 20 3e 20 30 7d  :test_year] > 0}
0b90: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
0ba0: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
0bb0: 54 45 3a 20 55 73 65 20 74 68 65 20 73 70 65 63  TE: Use the spec
0bc0: 69 66 69 65 64 20 74 65 73 74 20 79 65 61 72 2e  ified test year.
0bd0: 20 20 49 66 20 74 68 69 73 20 76 61 72 69 61 62    If this variab
0be0: 6c 65 20 69 73 20 6e 6f 74 20 73 65 74 2c 20 74  le is not set, t
0bf0: 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  he..        #   
0c00: 20 20 20 20 64 65 66 61 75 6c 74 20 76 61 6c 75      default valu
0c10: 65 20 77 69 6c 6c 20 62 65 20 62 61 73 65 64 20  e will be based 
0c20: 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  on whether or no
0c30: 74 20 45 61 67 6c 65 20 68 61 73 20 62 65 65 6e  t Eagle has been
0c40: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
0c50: 20 20 63 6f 6d 70 69 6c 65 64 20 61 67 61 69 6e    compiled again
0c60: 73 74 20 74 68 65 20 43 4c 52 20 76 32 2e 30 20  st the CLR v2.0 
0c70: 6f 72 20 43 4c 52 20 76 34 2e 30 2e 0d 0a 20 20  or CLR v4.0...  
0c80: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
0c90: 20 72 65 74 75 72 6e 20 24 3a 3a 74 65 73 74 5f   return $::test_
0ca0: 79 65 61 72 0d 0a 20 20 20 20 20 20 7d 20 65 6c  year..      } el
0cb0: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  se {..        #.
0cc0: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
0cd0: 20 49 66 20 45 61 67 6c 65 20 68 61 73 20 62 65   If Eagle has be
0ce0: 65 6e 20 63 6f 6d 70 69 6c 65 64 20 61 67 61 69  en compiled agai
0cf0: 6e 73 74 20 74 68 65 20 43 4c 52 20 76 34 2e 30  nst the CLR v4.0
0d00: 2c 20 75 73 65 20 22 32 30 31 30 22 20 62 79 0d  , use "2010" by.
0d10: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
0d20: 20 64 65 66 61 75 6c 74 20 28 77 65 20 63 6f 75   default (we cou
0d30: 6c 64 20 75 73 65 20 22 32 30 31 32 22 2c 20 22  ld use "2012", "
0d40: 32 30 31 33 22 2c 20 6f 72 20 22 32 30 31 35 22  2013", or "2015"
0d50: 20 69 6e 20 74 68 61 74 20 63 61 73 65 20 61 73   in that case as
0d60: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
0d70: 20 20 77 65 6c 6c 29 20 61 73 20 74 68 65 20 74    well) as the t
0d80: 65 73 74 20 79 65 61 72 3b 20 6f 74 68 65 72 77  est year; otherw
0d90: 69 73 65 2c 20 75 73 65 20 22 32 30 30 38 22 20  ise, use "2008" 
0da0: 62 79 20 64 65 66 61 75 6c 74 20 28 77 65 0d 0a  by default (we..
0db0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
0dc0: 63 6f 75 6c 64 20 75 73 65 20 22 32 30 30 35 22  could use "2005"
0dd0: 20 69 6e 20 74 68 61 74 20 63 61 73 65 20 61 73   in that case as
0de0: 20 77 65 6c 6c 29 2e 20 20 49 66 20 61 6e 6f 74   well).  If anot
0df0: 68 65 72 20 6d 61 6a 6f 72 0d 0a 20 20 20 20 20  her major..     
0e00: 20 20 20 23 20 20 20 20 20 20 20 5b 69 6e 63 6f     #       [inco
0e10: 6d 70 61 74 69 62 6c 65 5d 20 76 65 72 73 69 6f  mpatible] versio
0e20: 6e 20 6f 66 20 74 68 65 20 43 4c 52 20 69 73 20  n of the CLR is 
0e30: 72 65 6c 65 61 73 65 64 2c 20 74 68 69 73 20 63  released, this c
0e40: 68 65 63 6b 20 77 69 6c 6c 0d 0a 20 20 20 20 20  heck will..     
0e50: 20 20 20 23 20 20 20 20 20 20 20 68 61 76 65 20     #       have 
0e60: 74 6f 20 62 65 20 63 68 61 6e 67 65 64 2e 20 20  to be changed.  
0e70: 54 68 65 20 64 65 66 61 75 6c 74 20 74 65 73 74  The default test
0e80: 20 79 65 61 72 20 74 6f 20 75 73 65 20 66 6f 72   year to use for
0e90: 20 61 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20   a..        #   
0ea0: 20 20 20 20 70 61 72 74 69 63 75 6c 61 72 20 43      particular C
0eb0: 4c 52 20 76 65 72 73 69 6f 6e 20 6d 61 79 20 62  LR version may b
0ec0: 65 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20  e overridden by 
0ed0: 73 65 74 74 69 6e 67 20 74 68 65 20 67 6c 6f 62  setting the glob
0ee0: 61 6c 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  al..        #   
0ef0: 20 20 20 20 76 61 72 69 61 62 6c 65 20 22 74 65      variable "te
0f00: 73 74 5f 79 65 61 72 5f 63 6c 72 5f 76 24 58 22  st_year_clr_v$X"
0f10: 2c 20 77 68 65 72 65 20 22 24 58 22 20 6d 61 79  , where "$X" may
0f20: 20 5b 63 75 72 72 65 6e 74 6c 79 5d 20 62 65 0d   [currently] be.
0f30: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
0f40: 20 65 69 74 68 65 72 20 22 32 22 20 6f 72 20 22   either "2" or "
0f50: 34 22 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  4"...        #..
0f60: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76          if {[hav
0f70: 65 43 6f 6e 73 74 72 61 69 6e 74 20 69 6d 61 67  eConstraint imag
0f80: 65 52 75 6e 74 69 6d 65 34 30 5d 7d 20 74 68 65  eRuntime40]} the
0f90: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69  n {..          i
0fa0: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
0fb0: 3a 3a 74 65 73 74 5f 79 65 61 72 5f 63 6c 72 5f  ::test_year_clr_
0fc0: 76 34 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  v4] && \..      
0fd0: 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20          [string 
0fe0: 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f 79  length $::test_y
0ff0: 65 61 72 5f 63 6c 72 5f 76 34 5d 20 3e 20 30 7d  ear_clr_v4] > 0}
1000: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1010: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1020: 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20      # NOTE: Use 
1030: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 74 65  the specified te
1040: 73 74 20 79 65 61 72 20 66 6f 72 20 74 68 65 20  st year for the 
1050: 43 4c 52 20 76 34 2e 30 2e 0d 0a 20 20 20 20 20  CLR v4.0...     
1060: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1070: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a        return $::
1080: 74 65 73 74 5f 79 65 61 72 5f 63 6c 72 5f 76 34  test_year_clr_v4
1090: 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c  ..          } el
10a0: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
10b0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
10c0: 20 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65   # NOTE: Use the
10d0: 20 64 65 66 61 75 6c 74 20 74 65 73 74 20 79 65   default test ye
10e0: 61 72 20 66 6f 72 20 74 68 65 20 43 4c 52 20 76  ar for the CLR v
10f0: 34 2e 30 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  4.0...          
1100: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
1110: 20 72 65 74 75 72 6e 20 32 30 31 30 3b 20 23 20   return 2010; # 
1120: 54 4f 44 4f 3a 20 47 6f 6f 64 20 22 66 61 6c 6c  TODO: Good "fall
1130: 62 61 63 6b 22 20 64 65 66 61 75 6c 74 3f 0d 0a  back" default?..
1140: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
1150: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
1160: 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69 6e           if {[in
1170: 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 73 74  fo exists ::test
1180: 5f 79 65 61 72 5f 63 6c 72 5f 76 32 5d 20 26 26  _year_clr_v2] &&
1190: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
11a0: 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
11b0: 20 24 3a 3a 74 65 73 74 5f 79 65 61 72 5f 63 6c   $::test_year_cl
11c0: 72 5f 76 32 5d 20 3e 20 30 7d 20 74 68 65 6e 20  r_v2] > 0} then 
11d0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  {..            #
11e0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20  ..            # 
11f0: 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20 73 70  NOTE: Use the sp
1200: 65 63 69 66 69 65 64 20 74 65 73 74 20 79 65 61  ecified test yea
1210: 72 20 66 6f 72 20 74 68 65 20 43 4c 52 20 76 32  r for the CLR v2
1220: 2e 30 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  .0...           
1230: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
1240: 72 65 74 75 72 6e 20 24 3a 3a 74 65 73 74 5f 79  return $::test_y
1250: 65 61 72 5f 63 6c 72 5f 76 32 0d 0a 20 20 20 20  ear_clr_v2..    
1260: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
1270: 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
1280: 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
1290: 45 3a 20 55 73 65 20 74 68 65 20 64 65 66 61 75  E: Use the defau
12a0: 6c 74 20 74 65 73 74 20 79 65 61 72 20 66 6f 72  lt test year for
12b0: 20 74 68 65 20 43 4c 52 20 76 32 2e 30 2e 0d 0a   the CLR v2.0...
12c0: 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
12d0: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
12e0: 6e 20 32 30 30 38 3b 20 23 20 54 4f 44 4f 3a 20  n 2008; # TODO: 
12f0: 47 6f 6f 64 20 22 66 61 6c 6c 62 61 63 6b 22 20  Good "fallback" 
1300: 64 65 66 61 75 6c 74 3f 0d 0a 20 20 20 20 20 20  default?..      
1310: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
1320: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
1330: 0d 0a 0c 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20  .....    #..    
1340: 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 70 72 6f  # NOTE: This pro
1350: 63 65 64 75 72 65 20 69 73 20 6f 6e 6c 79 20 75  cedure is only u
1360: 73 65 64 20 77 68 65 6e 20 61 64 64 69 6e 67 20  sed when adding 
1370: 73 68 69 6d 6d 65 64 20 74 65 73 74 20 63 6f 6e  shimmed test con
1380: 73 74 72 61 69 6e 74 73 2e 0d 0a 20 20 20 20 23  straints...    #
1390: 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 42 75  ..    proc getBu
13a0: 69 6c 64 43 6c 72 56 65 72 73 69 6f 6e 20 7b 7d  ildClrVersion {}
13b0: 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69   {..      if {[i
13c0: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 73  nfo exists ::tes
13d0: 74 5f 63 6c 72 5d 20 26 26 20 5b 73 74 72 69 6e  t_clr] && [strin
13e0: 67 20 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73 74  g length $::test
13f0: 5f 63 6c 72 5d 20 3e 20 30 7d 20 74 68 65 6e 20  _clr] > 0} then 
1400: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
1410: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73        # NOTE: Us
1420: 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  e the specified 
1430: 74 65 73 74 20 76 65 72 73 69 6f 6e 20 66 6f 72  test version for
1440: 20 74 68 65 20 43 4c 52 2e 20 20 49 66 20 74 68   the CLR.  If th
1450: 69 73 20 76 61 72 69 61 62 6c 65 0d 0a 20 20 20  is variable..   
1460: 20 20 20 20 20 23 20 20 20 20 20 20 20 69 73 20       #       is 
1470: 6e 6f 74 20 73 65 74 2c 20 74 68 65 20 64 65 66  not set, the def
1480: 61 75 6c 74 20 76 61 6c 75 65 20 77 69 6c 6c 20  ault value will 
1490: 62 65 20 62 61 73 65 64 20 6f 6e 20 77 68 65 74  be based on whet
14a0: 68 65 72 20 6f 72 20 6e 6f 74 0d 0a 20 20 20 20  her or not..    
14b0: 20 20 20 20 23 20 20 20 20 20 20 20 45 61 67 6c      #       Eagl
14c0: 65 20 68 61 73 20 62 65 65 6e 20 63 6f 6d 70 69  e has been compi
14d0: 6c 65 64 20 61 67 61 69 6e 73 74 20 74 68 65 20  led against the 
14e0: 43 4c 52 20 76 32 2e 30 20 6f 72 20 43 4c 52 20  CLR v2.0 or CLR 
14f0: 76 34 2e 30 2e 0d 0a 20 20 20 20 20 20 20 20 23  v4.0...        #
1500: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
1510: 20 24 3a 3a 74 65 73 74 5f 63 6c 72 0d 0a 20 20   $::test_clr..  
1520: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
1530: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1540: 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69   # NOTE: Check i
1550: 66 20 45 61 67 6c 65 20 68 61 73 20 62 65 65 6e  f Eagle has been
1560: 20 63 6f 6d 70 69 6c 65 64 20 61 67 61 69 6e 73   compiled agains
1570: 74 20 74 68 65 20 43 4c 52 20 76 34 2e 30 2e 20  t the CLR v4.0. 
1580: 20 49 66 20 73 6f 2c 0d 0a 20 20 20 20 20 20 20   If so,..       
1590: 20 23 20 20 20 20 20 20 20 6a 75 73 74 20 75 73   #       just us
15a0: 65 20 74 68 61 74 20 43 4c 52 20 76 65 72 73 69  e that CLR versi
15b0: 6f 6e 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20  on.  Otherwise, 
15c0: 75 73 65 20 74 68 65 20 76 65 72 73 69 6f 6e 20  use the version 
15d0: 66 6f 72 20 74 68 65 0d 0a 20 20 20 20 20 20 20  for the..       
15e0: 20 23 20 20 20 20 20 20 20 43 4c 52 20 76 32 2e   #       CLR v2.
15f0: 30 2e 20 20 49 66 20 61 6e 6f 74 68 65 72 20 6d  0.  If another m
1600: 61 6a 6f 72 20 5b 69 6e 63 6f 6d 70 61 74 69 62  ajor [incompatib
1610: 6c 65 5d 20 76 65 72 73 69 6f 6e 20 6f 66 20 74  le] version of t
1620: 68 65 20 43 4c 52 0d 0a 20 20 20 20 20 20 20 20  he CLR..        
1630: 23 20 20 20 20 20 20 20 69 73 20 72 65 6c 65 61  #       is relea
1640: 73 65 64 2c 20 74 68 69 73 20 63 68 65 63 6b 20  sed, this check 
1650: 77 69 6c 6c 20 68 61 76 65 20 74 6f 20 62 65 20  will have to be 
1660: 63 68 61 6e 67 65 64 2e 20 20 54 68 65 20 64 65  changed.  The de
1670: 66 61 75 6c 74 0d 0a 20 20 20 20 20 20 20 20 23  fault..        #
1680: 20 20 20 20 20 20 20 76 65 72 73 69 6f 6e 20 76         version v
1690: 61 6c 75 65 20 66 6f 72 20 61 20 70 61 72 74 69  alue for a parti
16a0: 63 75 6c 61 72 20 43 4c 52 20 76 65 72 73 69 6f  cular CLR versio
16b0: 6e 20 6d 61 79 20 62 65 20 6f 76 65 72 72 69 64  n may be overrid
16c0: 64 65 6e 0d 0a 20 20 20 20 20 20 20 20 23 20 20  den..        #  
16d0: 20 20 20 20 20 62 79 20 73 65 74 74 69 6e 67 20       by setting 
16e0: 74 68 65 20 67 6c 6f 62 61 6c 20 76 61 72 69 61  the global varia
16f0: 62 6c 65 20 22 74 65 73 74 5f 63 6c 72 5f 76 24  ble "test_clr_v$
1700: 58 22 2c 20 77 68 65 72 65 20 22 24 58 22 20 6d  X", where "$X" m
1710: 61 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ay..        #   
1720: 20 20 20 20 5b 63 75 72 72 65 6e 74 6c 79 5d 20      [currently] 
1730: 62 65 20 65 69 74 68 65 72 20 22 32 22 20 6f 72  be either "2" or
1740: 20 22 34 22 2e 0d 0a 20 20 20 20 20 20 20 20 23   "4"...        #
1750: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 68  ..        if {[h
1760: 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 69 6d  aveConstraint im
1770: 61 67 65 52 75 6e 74 69 6d 65 34 30 5d 7d 20 74  ageRuntime40]} t
1780: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1790: 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
17a0: 73 20 3a 3a 74 65 73 74 5f 63 6c 72 5f 76 34 5d  s ::test_clr_v4]
17b0: 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
17c0: 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
17d0: 67 74 68 20 24 3a 3a 74 65 73 74 5f 63 6c 72 5f  gth $::test_clr_
17e0: 76 34 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  v4] > 0} then {.
17f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a  .            #..
1800: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f              # NO
1810: 54 45 3a 20 55 73 65 20 74 68 65 20 73 70 65 63  TE: Use the spec
1820: 69 66 69 65 64 20 74 65 73 74 20 76 65 72 73 69  ified test versi
1830: 6f 6e 20 66 6f 72 20 74 68 65 20 43 4c 52 20 76  on for the CLR v
1840: 34 2e 30 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  4.0...          
1850: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
1860: 20 72 65 74 75 72 6e 20 24 3a 3a 74 65 73 74 5f   return $::test_
1870: 63 6c 72 5f 76 34 0d 0a 20 20 20 20 20 20 20 20  clr_v4..        
1880: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
1890: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
18a0: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55         # NOTE: U
18b0: 73 65 20 74 68 65 20 64 65 66 61 75 6c 74 20 74  se the default t
18c0: 65 73 74 20 76 65 72 73 69 6f 6e 20 66 6f 72 20  est version for 
18d0: 74 68 65 20 43 4c 52 20 76 34 2e 30 2e 0d 0a 20  the CLR v4.0... 
18e0: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
18f0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1900: 20 34 2e 30 2e 33 30 33 31 39 3b 20 23 20 54 4f   4.0.30319; # TO
1910: 44 4f 3a 20 47 6f 6f 64 20 22 66 61 6c 6c 62 61  DO: Good "fallba
1920: 63 6b 22 20 64 65 66 61 75 6c 74 3f 0d 0a 20 20  ck" default?..  
1930: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
1940: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
1950: 20 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f         if {[info
1960: 20 65 78 69 73 74 73 20 3a 3a 74 65 73 74 5f 63   exists ::test_c
1970: 6c 72 5f 76 32 5d 20 26 26 20 5c 0d 0a 20 20 20  lr_v2] && \..   
1980: 20 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69             [stri
1990: 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73  ng length $::tes
19a0: 74 5f 63 6c 72 5f 76 32 5d 20 3e 20 30 7d 20 74  t_clr_v2] > 0} t
19b0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
19c0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
19d0: 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68    # NOTE: Use th
19e0: 65 20 73 70 65 63 69 66 69 65 64 20 74 65 73 74  e specified test
19f0: 20 76 65 72 73 69 6f 6e 20 66 6f 72 20 74 68 65   version for the
1a00: 20 43 4c 52 20 76 32 2e 30 2e 0d 0a 20 20 20 20   CLR v2.0...    
1a10: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1a20: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a         return $:
1a30: 3a 74 65 73 74 5f 63 6c 72 5f 76 32 0d 0a 20 20  :test_clr_v2..  
1a40: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
1a50: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d  ..            #.
1a60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e  .            # N
1a70: 4f 54 45 3a 20 55 73 65 20 74 68 65 20 64 65 66  OTE: Use the def
1a80: 61 75 6c 74 20 74 65 73 74 20 76 65 72 73 69 6f  ault test versio
1a90: 6e 20 66 6f 72 20 74 68 65 20 43 4c 52 20 76 32  n for the CLR v2
1aa0: 2e 30 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  .0...           
1ab0: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
1ac0: 72 65 74 75 72 6e 20 32 2e 30 2e 35 30 37 32 37  return 2.0.50727
1ad0: 3b 20 23 20 54 4f 44 4f 3a 20 47 6f 6f 64 20 22  ; # TODO: Good "
1ae0: 66 61 6c 6c 62 61 63 6b 22 20 64 65 66 61 75 6c  fallback" defaul
1af0: 74 3f 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  t?..          }.
1b00: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
1b10: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
1b20: 20 20 20 70 72 6f 63 20 67 65 74 42 75 69 6c 64     proc getBuild
1b30: 59 65 61 72 73 20 7b 7d 20 7b 0d 0a 20 20 20 20  Years {} {..    
1b40: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
1b50: 45 3a 20 53 65 65 20 69 66 20 74 68 65 20 6c 69  E: See if the li
1b60: 73 74 20 6f 66 20 74 65 73 74 20 79 65 61 72 73  st of test years
1b70: 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72 69   has been overri
1b80: 64 64 65 6e 20 62 79 20 74 68 65 20 75 73 65 72  dden by the user
1b90: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
1ba0: 28 65 2e 67 2e 20 6f 6e 20 74 68 65 20 63 6f 6d  (e.g. on the com
1bb0: 6d 61 6e 64 20 6c 69 6e 65 29 2e 0d 0a 20 20 20  mand line)...   
1bc0: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
1bd0: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74  [info exists ::t
1be0: 65 73 74 5f 79 65 61 72 73 5d 20 26 26 20 5b 6c  est_years] && [l
1bf0: 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f 79  length $::test_y
1c00: 65 61 72 73 5d 20 3e 20 30 7d 20 74 68 65 6e 20  ears] > 0} then 
1c10: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
1c20: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73        # NOTE: Us
1c30: 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  e the specified 
1c40: 6c 69 73 74 20 6f 66 20 74 65 73 74 20 79 65 61  list of test yea
1c50: 72 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  rs...        #..
1c60: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24          return $
1c70: 3a 3a 74 65 73 74 5f 79 65 61 72 73 0d 0a 20 20  ::test_years..  
1c80: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
1c90: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1ca0: 20 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65   # NOTE: Use the
1cb0: 20 64 65 66 61 75 6c 74 20 6c 69 73 74 20 6f 66   default list of
1cc0: 20 74 65 73 74 20 79 65 61 72 73 20 28 69 2e 65   test years (i.e
1cd0: 2e 20 61 6c 6c 29 2e 0d 0a 20 20 20 20 20 20 20  . all)...       
1ce0: 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   #..        retu
1cf0: 72 6e 20 5b 6c 69 73 74 20 32 30 30 35 20 32 30  rn [list 2005 20
1d00: 30 38 20 32 30 31 30 20 32 30 31 32 20 32 30 31  08 2010 2012 201
1d10: 33 20 32 30 31 35 5d 0d 0a 20 20 20 20 20 20 7d  3 2015]..      }
1d20: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
1d30: 70 72 6f 63 20 67 65 74 42 75 69 6c 64 4e 65 74  proc getBuildNet
1d40: 46 78 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23  Fx {} {..      #
1d50: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
1d60: 53 65 65 20 69 66 20 74 68 65 20 74 65 73 74 20  See if the test 
1d70: 2e 4e 45 54 20 46 72 61 6d 65 77 6f 72 6b 20 73  .NET Framework s
1d80: 65 74 74 69 6e 67 20 68 61 73 20 62 65 65 6e 20  etting has been 
1d90: 6f 76 65 72 72 69 64 64 65 6e 20 62 79 0d 0a 20  overridden by.. 
1da0: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
1db0: 20 75 73 65 72 20 28 65 2e 67 2e 20 6f 6e 20 74   user (e.g. on t
1dc0: 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 29  he command line)
1dd0: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
1de0: 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73    if {[info exis
1df0: 74 73 20 3a 3a 74 65 73 74 5f 6e 65 74 5f 66 78  ts ::test_net_fx
1e00: 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
1e10: 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
1e20: 20 24 3a 3a 74 65 73 74 5f 6e 65 74 5f 66 78 5d   $::test_net_fx]
1e30: 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
1e40: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1e50: 20 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65   # NOTE: Use the
1e60: 20 73 70 65 63 69 66 69 65 64 20 74 65 73 74 20   specified test 
1e70: 2e 4e 45 54 20 46 72 61 6d 65 77 6f 72 6b 2e 0d  .NET Framework..
1e80: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
1e90: 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 74 65      return $::te
1ea0: 73 74 5f 6e 65 74 5f 66 78 0d 0a 20 20 20 20 20  st_net_fx..     
1eb0: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
1ec0: 20 20 20 73 65 74 20 79 65 61 72 20 5b 67 65 74     set year [get
1ed0: 42 75 69 6c 64 59 65 61 72 5d 0d 0a 20 20 20 20  BuildYear]..    
1ee0: 20 20 20 20 73 65 74 20 79 65 61 72 56 61 72 4e      set yearVarN
1ef0: 61 6d 65 20 5b 61 70 70 65 6e 64 41 72 67 73 20  ame [appendArgs 
1f00: 3a 3a 74 65 73 74 5f 6e 65 74 5f 66 78 5f 20 24  ::test_net_fx_ $
1f10: 79 65 61 72 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  year]....       
1f20: 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
1f30: 73 20 24 79 65 61 72 56 61 72 4e 61 6d 65 5d 20  s $yearVarName] 
1f40: 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
1f50: 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
1f60: 20 5b 73 65 74 20 24 79 65 61 72 56 61 72 4e 61   [set $yearVarNa
1f70: 6d 65 5d 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  me]] > 0} then {
1f80: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
1f90: 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
1fa0: 20 55 73 65 20 74 68 65 20 73 70 65 63 69 66 69   Use the specifi
1fb0: 65 64 20 74 65 73 74 20 2e 4e 45 54 20 46 72 61  ed test .NET Fra
1fc0: 6d 65 77 6f 72 6b 2c 20 62 61 73 65 64 20 6f 6e  mework, based on
1fd0: 20 74 68 65 20 62 75 69 6c 64 0d 0a 20 20 20 20   the build..    
1fe0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 79 65        #       ye
1ff0: 61 72 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  ar...          #
2000: 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ..          retu
2010: 72 6e 20 5b 73 65 74 20 24 79 65 61 72 56 61 72  rn [set $yearVar
2020: 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20 20 20 7d  Name]..        }
2030: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
2040: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
2050: 23 20 4e 4f 54 45 3a 20 46 61 6c 6c 62 61 63 6b  # NOTE: Fallback
2060: 20 74 6f 20 74 68 65 20 22 77 65 6c 6c 20 6b 6e   to the "well kn
2070: 6f 77 6e 22 20 2e 4e 45 54 20 46 72 61 6d 65 77  own" .NET Framew
2080: 6f 72 6b 20 76 65 72 73 69 6f 6e 20 74 68 61 74  ork version that
2090: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20  ..          #   
20a0: 20 20 20 20 69 73 20 6d 6f 73 74 20 63 6c 6f 73      is most clos
20b0: 65 6c 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  ely associated w
20c0: 69 74 68 20 61 20 70 61 72 74 69 63 75 6c 61 72  ith a particular
20d0: 20 76 65 72 73 69 6f 6e 20 6f 66 0d 0a 20 20 20   version of..   
20e0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 56         #       V
20f0: 69 73 75 61 6c 20 53 74 75 64 69 6f 2e 0d 0a 20  isual Studio... 
2100: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
2110: 20 20 20 20 20 20 73 77 69 74 63 68 20 2d 65 78        switch -ex
2120: 61 63 74 20 2d 2d 20 24 79 65 61 72 20 7b 0d 0a  act -- $year {..
2130: 20 20 20 20 20 20 20 20 20 20 20 20 32 30 30 35              2005
2140: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
2150: 20 20 72 65 74 75 72 6e 20 6e 65 74 46 78 32 30    return netFx20
2160: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
2170: 0a 20 20 20 20 20 20 20 20 20 20 20 20 32 30 30  .            200
2180: 38 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  8 {..           
2190: 20 20 20 72 65 74 75 72 6e 20 6e 65 74 46 78 33     return netFx3
21a0: 35 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  5..            }
21b0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 32 30  ..            20
21c0: 31 30 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  10 {..          
21d0: 20 20 20 20 72 65 74 75 72 6e 20 6e 65 74 46 78      return netFx
21e0: 34 30 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  40..            
21f0: 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 32  }..            2
2200: 30 31 32 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  012 {..         
2210: 20 20 20 20 20 72 65 74 75 72 6e 20 6e 65 74 46       return netF
2220: 78 34 35 0d 0a 20 20 20 20 20 20 20 20 20 20 20  x45..           
2230: 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
2240: 32 30 31 33 20 7b 0d 0a 20 20 20 20 20 20 20 20  2013 {..        
2250: 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e 65 74        return net
2260: 46 78 34 35 31 3b 20 23 20 54 4f 44 4f 3a 20 4f  Fx451; # TODO: O
2270: 72 20 22 6e 65 74 46 78 34 35 32 22 3f 0d 0a 20  r "netFx452"?.. 
2280: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
2290: 20 20 20 20 20 20 20 20 20 20 32 30 31 35 20 7b            2015 {
22a0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
22b0: 72 65 74 75 72 6e 20 6e 65 74 46 78 34 36 3b 20  return netFx46; 
22c0: 23 20 54 4f 44 4f 3a 20 4f 72 20 22 6e 65 74 46  # TODO: Or "netF
22d0: 78 34 36 31 22 3f 0d 0a 20 20 20 20 20 20 20 20  x461"?..        
22e0: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
22f0: 20 20 20 64 65 66 61 75 6c 74 20 7b 0d 0a 20 20     default {..  
2300: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
2310: 72 6e 20 6e 65 74 46 78 33 35 3b 20 23 20 54 4f  rn netFx35; # TO
2320: 44 4f 3a 20 47 6f 6f 64 20 22 66 61 6c 6c 62 61  DO: Good "fallba
2330: 63 6b 22 20 64 65 66 61 75 6c 74 3f 0d 0a 20 20  ck" default?..  
2340: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
2350: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
2360: 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20    }..      }..  
2370: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 23 0d 0a 20    }.....    #.. 
2380: 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20     # NOTE: This 
2390: 70 72 6f 63 65 64 75 72 65 20 73 68 6f 75 6c 64  procedure should
23a0: 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f   return non-zero
23b0: 20 69 66 20 74 68 65 20 63 6f 6e 66 69 67 75 72   if the configur
23c0: 65 64 20 74 65 73 74 0d 0a 20 20 20 20 23 20 20  ed test..    #  
23d0: 20 20 20 20 20 70 6c 61 74 66 6f 72 6d 20 69 73       platform is
23e0: 20 6d 6f 73 74 20 6c 69 6b 65 6c 79 20 74 68 65   most likely the
23f0: 20 64 65 66 61 75 6c 74 20 66 6f 72 20 74 68 69   default for thi
2400: 73 20 6d 61 63 68 69 6e 65 2e 0d 0a 20 20 20 20  s machine...    
2410: 23 0d 0a 20 20 20 20 70 72 6f 63 20 69 73 44 65  #..    proc isDe
2420: 66 61 75 6c 74 42 75 69 6c 64 50 6c 61 74 66 6f  faultBuildPlatfo
2430: 72 6d 20 7b 20 7b 76 65 72 62 6f 73 65 20 66 61  rm { {verbose fa
2440: 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20  lse} } {..      
2450: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
2460: 20 52 75 6e 6e 69 6e 67 20 6f 6e 20 57 6f 57 36   Running on WoW6
2470: 34 20 69 73 20 6e 65 76 65 72 20 74 68 65 20 64  4 is never the d
2480: 65 66 61 75 6c 74 20 70 6c 61 74 66 6f 72 6d 2e  efault platform.
2490: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
24a0: 20 69 66 20 7b 5b 69 73 52 75 6e 6e 69 6e 67 57   if {[isRunningW
24b0: 6f 57 36 34 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  oW64]} then {.. 
24c0: 20 20 20 20 20 20 20 69 66 20 7b 24 76 65 72 62         if {$verb
24d0: 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ose} then {..   
24e0: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
24f0: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a  test_channel \..
2500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
2510: 2d 2d 2d 20 64 65 74 65 63 74 65 64 20 6e 6f 6e  --- detected non
2520: 2d 64 65 66 61 75 6c 74 20 70 6c 61 74 66 6f 72  -default platfor
2530: 6d 20 28 57 6f 57 36 34 29 5c 6e 22 0d 0a 20 20  m (WoW64)\n"..  
2540: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
2550: 20 72 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20   return false.. 
2560: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
2570: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
2580: 20 54 68 69 73 20 68 61 73 20 61 20 67 6f 6f 64   This has a good
2590: 20 63 68 61 6e 63 65 20 6f 66 20 62 65 69 6e 67   chance of being
25a0: 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 6c 61   the default pla
25b0: 74 66 6f 72 6d 2e 0d 0a 20 20 20 20 20 20 23 0d  tform...      #.
25c0: 0a 20 20 20 20 20 20 69 66 20 7b 24 76 65 72 62  .      if {$verb
25d0: 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ose} then {..   
25e0: 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
25f0: 73 74 5f 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d  st_channel "----
2600: 20 64 65 74 65 63 74 65 64 20 64 65 66 61 75 6c   detected defaul
2610: 74 20 70 6c 61 74 66 6f 72 6d 5c 6e 22 0d 0a 20  t platform\n".. 
2620: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 72 65       }..      re
2630: 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 7d  turn true..    }
2640: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65  .....    proc ge
2650: 74 42 75 69 6c 64 50 6c 61 74 66 6f 72 6d 20 7b  tBuildPlatform {
2660: 20 6e 61 74 69 76 65 20 7d 20 7b 0d 0a 20 20 20   native } {..   
2670: 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69     if {[info exi
2680: 73 74 73 20 3a 3a 74 65 73 74 5f 70 6c 61 74 66  sts ::test_platf
2690: 6f 72 6d 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  orm] && \..     
26a0: 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
26b0: 67 74 68 20 24 3a 3a 74 65 73 74 5f 70 6c 61 74  gth $::test_plat
26c0: 66 6f 72 6d 5d 20 3e 20 30 7d 20 74 68 65 6e 20  form] > 0} then 
26d0: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
26e0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73        # NOTE: Us
26f0: 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  e the specified 
2700: 74 65 73 74 20 70 6c 61 74 66 6f 72 6d 2e 20 20  test platform.  
2710: 49 66 20 74 68 69 73 20 76 61 72 69 61 62 6c 65  If this variable
2720: 20 69 73 20 6e 6f 74 20 73 65 74 2c 0d 0a 20 20   is not set,..  
2730: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68        #       th
2740: 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20  e default value 
2750: 77 69 6c 6c 20 62 65 20 62 61 73 65 64 20 6f 6e  will be based on
2760: 20 74 68 65 20 6d 61 63 68 69 6e 65 20 61 72 63   the machine arc
2770: 68 69 74 65 63 74 75 72 65 2e 0d 0a 20 20 20 20  hitecture...    
2780: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
2790: 65 74 75 72 6e 20 5b 65 78 70 72 20 7b 24 6e 61  eturn [expr {$na
27a0: 74 69 76 65 20 3f 20 24 3a 3a 74 65 73 74 5f 70  tive ? $::test_p
27b0: 6c 61 74 66 6f 72 6d 20 3a 20 22 22 7d 5d 0d 0a  latform : ""}]..
27c0: 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b        } elseif {
27d0: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74  [info exists ::t
27e0: 65 73 74 5f 6d 61 63 68 69 6e 65 5d 20 26 26 20  est_machine] && 
27f0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74  \..          [st
2800: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 74  ring length $::t
2810: 65 73 74 5f 6d 61 63 68 69 6e 65 5d 20 3e 20 30  est_machine] > 0
2820: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
2830: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
2840: 4f 54 45 3a 20 46 6f 72 20 6e 61 74 69 76 65 20  OTE: For native 
2850: 62 75 69 6c 64 73 2c 20 72 65 74 75 72 6e 20 74  builds, return t
2860: 68 65 20 70 6c 61 74 66 6f 72 6d 20 6e 61 6d 65  he platform name
2870: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
2880: 6f 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  o..        #    
2890: 20 20 20 74 68 65 20 74 65 73 74 20 6d 61 63 68     the test mach
28a0: 69 6e 65 20 61 72 63 68 69 74 65 63 74 75 72 65  ine architecture
28b0: 3b 20 6f 74 68 65 72 77 69 73 65 2c 20 72 65 74  ; otherwise, ret
28c0: 75 72 6e 20 61 6e 20 65 6d 70 74 79 0d 0a 20 20  urn an empty..  
28d0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73 74        #       st
28e0: 72 69 6e 67 2e 0d 0a 20 20 20 20 20 20 20 20 23  ring...        #
28f0: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
2900: 20 5b 65 78 70 72 20 7b 0d 0a 20 20 20 20 20 20   [expr {..      
2910: 20 20 20 20 24 6e 61 74 69 76 65 20 3f 20 5b 6d      $native ? [m
2920: 61 63 68 69 6e 65 54 6f 50 6c 61 74 66 6f 72 6d  achineToPlatform
2930: 20 24 3a 3a 74 65 73 74 5f 6d 61 63 68 69 6e 65   $::test_machine
2940: 5d 20 3a 20 22 22 0d 0a 20 20 20 20 20 20 20 20  ] : ""..        
2950: 7d 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  }]..      } else
2960: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
2970: 20 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28   ::tcl_platform(
2980: 6d 61 63 68 69 6e 65 29 5d 7d 20 74 68 65 6e 20  machine)]} then 
2990: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
29a0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 6f        # NOTE: Fo
29b0: 72 20 6e 61 74 69 76 65 20 62 75 69 6c 64 73 2c  r native builds,
29c0: 20 72 65 74 75 72 6e 20 74 68 65 20 70 6c 61 74   return the plat
29d0: 66 6f 72 6d 20 6e 61 6d 65 20 63 6f 72 72 65 73  form name corres
29e0: 70 6f 6e 64 69 6e 67 20 74 6f 0d 0a 20 20 20 20  ponding to..    
29f0: 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20      #       the 
2a00: 6d 61 63 68 69 6e 65 20 61 72 63 68 69 74 65 63  machine architec
2a10: 74 75 72 65 3b 20 6f 74 68 65 72 77 69 73 65 2c  ture; otherwise,
2a20: 20 72 65 74 75 72 6e 20 61 6e 20 65 6d 70 74 79   return an empty
2a30: 20 73 74 72 69 6e 67 2e 0d 0a 20 20 20 20 20 20   string...      
2a40: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
2a50: 75 72 6e 20 5b 65 78 70 72 20 7b 0d 0a 20 20 20  urn [expr {..   
2a60: 20 20 20 20 20 20 20 24 6e 61 74 69 76 65 20 3f         $native ?
2a70: 20 5b 6d 61 63 68 69 6e 65 54 6f 50 6c 61 74 66   [machineToPlatf
2a80: 6f 72 6d 20 24 3a 3a 74 63 6c 5f 70 6c 61 74 66  orm $::tcl_platf
2a90: 6f 72 6d 28 6d 61 63 68 69 6e 65 29 5d 20 3a 20  orm(machine)] : 
2aa0: 22 22 0d 0a 20 20 20 20 20 20 20 20 7d 5d 0d 0a  ""..        }]..
2ab0: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
2ac0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
2ad0: 20 20 20 23 20 4e 4f 54 45 3a 20 4e 6f 20 6d 61     # NOTE: No ma
2ae0: 63 68 69 6e 65 20 61 72 63 68 69 74 65 63 74 75  chine architectu
2af0: 72 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c  re is available,
2b00: 20 72 65 74 75 72 6e 20 61 6e 20 65 6d 70 74 79   return an empty
2b10: 20 73 74 72 69 6e 67 2e 0d 0a 20 20 20 20 20 20   string...      
2b20: 20 20 23 20 20 20 20 20 20 20 49 74 20 69 73 20    #       It is 
2b30: 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 72 65 74  important to ret
2b40: 75 72 6e 20 61 6e 20 65 6d 70 74 79 20 73 74 72  urn an empty str
2b50: 69 6e 67 20 68 65 72 65 20 62 65 63 61 75 73 65  ing here because
2b60: 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20   the..        # 
2b70: 20 20 20 20 20 20 72 65 73 75 6c 74 20 6f 66 20        result of 
2b80: 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 6d  this procedure m
2b90: 61 79 20 62 65 20 75 73 65 64 20 77 69 74 68 20  ay be used with 
2ba0: 5b 66 69 6c 65 20 6a 6f 69 6e 5d 2e 0d 0a 20 20  [file join]...  
2bb0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
2bc0: 20 72 65 74 75 72 6e 20 22 22 0d 0a 20 20 20 20   return ""..    
2bd0: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
2be0: 20 20 20 70 72 6f 63 20 67 65 74 42 75 69 6c 64     proc getBuild
2bf0: 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 7b 7d  Configuration {}
2c00: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
2c10: 20 20 20 23 20 4e 4f 54 45 3a 20 53 65 65 20 69     # NOTE: See i
2c20: 66 20 74 68 65 20 22 63 6f 6e 66 69 67 75 72 61  f the "configura
2c30: 74 69 6f 6e 22 20 73 65 74 74 69 6e 67 20 68 61  tion" setting ha
2c40: 73 20 62 65 65 6e 20 6f 76 65 72 72 69 64 64 65  s been overridde
2c50: 6e 20 62 79 20 74 68 65 0d 0a 20 20 20 20 20 20  n by the..      
2c60: 23 20 20 20 20 20 20 20 75 73 65 72 20 28 65 2e  #       user (e.
2c70: 67 2e 20 6f 6e 20 74 68 65 20 63 6f 6d 6d 61 6e  g. on the comman
2c80: 64 20 6c 69 6e 65 29 2e 20 20 54 68 69 73 20 68  d line).  This h
2c90: 65 6c 70 73 20 63 6f 6e 74 72 6f 6c 20 65 78 61  elps control exa
2ca0: 63 74 6c 79 0d 0a 20 20 20 20 20 20 23 20 20 20  ctly..      #   
2cb0: 20 20 20 20 77 68 69 63 68 20 73 65 74 20 6f 66      which set of
2cc0: 20 62 69 6e 61 72 69 65 73 20 77 65 20 61 72 65   binaries we are
2cd0: 20 74 65 73 74 69 6e 67 20 28 69 2e 65 2e 20 74   testing (i.e. t
2ce0: 68 6f 73 65 20 62 75 69 6c 74 20 69 6e 20 74 68  hose built in th
2cf0: 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
2d00: 20 22 44 65 62 75 67 22 20 6f 72 20 22 52 65 6c   "Debug" or "Rel
2d10: 65 61 73 65 22 20 62 75 69 6c 64 20 63 6f 6e 66  ease" build conf
2d20: 69 67 75 72 61 74 69 6f 6e 73 29 2e 20 20 54 6f  igurations).  To
2d30: 20 6f 76 65 72 72 69 64 65 20 74 68 69 73 0d 0a   override this..
2d40: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 76 61        #       va
2d50: 6c 75 65 20 76 69 61 20 74 68 65 20 63 6f 6d 6d  lue via the comm
2d60: 61 6e 64 20 6c 69 6e 65 2c 20 65 6e 74 65 72 20  and line, enter 
2d70: 61 20 63 6f 6d 6d 61 6e 64 20 73 69 6d 69 6c 61  a command simila
2d80: 72 20 74 6f 20 6f 6e 65 20 6f 66 0d 0a 20 20 20  r to one of..   
2d90: 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20 66     #       the f
2da0: 6f 6c 6c 6f 77 69 6e 67 20 28 61 6c 6c 20 6f 6e  ollowing (all on
2db0: 20 6f 6e 65 20 6c 69 6e 65 29 3a 0d 0a 20 20 20   one line):..   
2dc0: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 20 20     #..      #   
2dd0: 20 20 20 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65      EagleShell.e
2de0: 78 65 20 2d 61 6e 79 49 6e 69 74 69 61 6c 69 7a  xe -anyInitializ
2df0: 65 20 22 73 65 74 20 74 65 73 74 5f 63 6f 6e 66  e "set test_conf
2e00: 69 67 75 72 61 74 69 6f 6e 20 44 65 62 75 67 22  iguration Debug"
2e10: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
2e20: 20 20 2d 66 69 6c 65 20 2e 5c 70 61 74 68 5c 74    -file .\path\t
2e30: 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a 20 20 20  o\all.eagle..   
2e40: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 20 20     #..      #   
2e50: 20 20 20 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65      EagleShell.e
2e60: 78 65 20 2d 61 6e 79 49 6e 69 74 69 61 6c 69 7a  xe -anyInitializ
2e70: 65 20 22 73 65 74 20 74 65 73 74 5f 63 6f 6e 66  e "set test_conf
2e80: 69 67 75 72 61 74 69 6f 6e 20 52 65 6c 65 61 73  iguration Releas
2e90: 65 22 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  e"..      #     
2ea0: 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70 61 74 68      -file .\path
2eb0: 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a 20  \to\all.eagle.. 
2ec0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
2ed0: 20 20 20 20 20 20 45 61 67 6c 65 53 68 65 6c 6c        EagleShell
2ee0: 2e 65 78 65 20 2d 66 69 6c 65 20 2e 5c 70 61 74  .exe -file .\pat
2ef0: 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 20 2d  h\to\all.eagle -
2f00: 70 72 65 54 65 73 74 0d 0a 20 20 20 20 20 20 23  preTest..      #
2f10: 20 20 20 20 20 20 20 20 20 22 75 6e 73 65 74 20           "unset 
2f20: 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 74 65 73 74  -nocomplain test
2f30: 5f 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 22 0d  _configuration".
2f40: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
2f50: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
2f60: 20 3a 3a 74 65 73 74 5f 63 6f 6e 66 69 67 75 72   ::test_configur
2f70: 61 74 69 6f 6e 5d 20 26 26 20 5c 0d 0a 20 20 20  ation] && \..   
2f80: 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c         [string l
2f90: 65 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f 63 6f  ength $::test_co
2fa0: 6e 66 69 67 75 72 61 74 69 6f 6e 5d 20 3e 20 30  nfiguration] > 0
2fb0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
2fc0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
2fd0: 4f 54 45 3a 20 55 73 65 20 74 68 65 20 73 70 65  OTE: Use the spe
2fe0: 63 69 66 69 65 64 20 74 65 73 74 20 63 6f 6e 66  cified test conf
2ff0: 69 67 75 72 61 74 69 6f 6e 2e 20 20 54 68 65 20  iguration.  The 
3000: 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 75 73  default value us
3010: 65 64 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ed..        #   
3020: 20 20 20 20 66 6f 72 20 74 68 69 73 20 76 61 72      for this var
3030: 69 61 62 6c 65 20 69 73 20 74 79 70 69 63 61 6c  iable is typical
3040: 6c 79 20 22 52 65 6c 65 61 73 65 22 2c 20 61 73  ly "Release", as
3050: 20 73 65 74 20 62 79 20 74 68 65 20 74 65 73 74   set by the test
3060: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
3070: 20 20 73 75 69 74 65 20 69 74 73 65 6c 66 2e 0d    suite itself..
3080: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
3090: 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 74 65      return $::te
30a0: 73 74 5f 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  st_configuration
30b0: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
30c0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
30d0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e 6f 72       # NOTE: Nor
30e0: 6d 61 6c 6c 79 2c 20 77 65 20 77 69 6c 6c 20 6e  mally, we will n
30f0: 65 76 65 72 20 68 69 74 20 74 68 69 73 20 63 61  ever hit this ca
3100: 73 65 20 62 65 63 61 75 73 65 20 74 68 65 20 76  se because the v
3110: 61 6c 75 65 20 6f 66 20 74 68 65 0d 0a 20 20 20  alue of the..   
3120: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 65 73       #       tes
3130: 74 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  t configuration 
3140: 76 61 72 69 61 62 6c 65 20 69 73 20 61 6c 77 61  variable is alwa
3150: 79 73 20 73 65 74 20 62 79 20 74 68 65 20 74 65  ys set by the te
3160: 73 74 20 73 75 69 74 65 0d 0a 20 20 20 20 20 20  st suite..      
3170: 20 20 23 20 20 20 20 20 20 20 69 74 73 65 6c 66    #       itself
3180: 3b 20 68 6f 77 65 76 65 72 2c 20 69 74 20 63 61  ; however, it ca
3190: 6e 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e 20  n be overridden 
31a0: 75 73 69 6e 67 20 74 68 65 20 75 6e 73 65 74 20  using the unset 
31b0: 63 6f 6d 6d 61 6e 64 0d 0a 20 20 20 20 20 20 20  command..       
31c0: 20 23 20 20 20 20 20 20 20 66 72 6f 6d 20 74 68   #       from th
31d0: 65 20 2d 70 72 65 54 65 73 74 20 6f 70 74 69 6f  e -preTest optio
31e0: 6e 20 74 6f 20 74 68 65 20 74 65 73 74 20 73 75  n to the test su
31f0: 69 74 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ite...        #.
3200: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
3210: 24 3a 3a 65 61 67 6c 65 5f 70 6c 61 74 66 6f 72  $::eagle_platfor
3220: 6d 28 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 29  m(configuration)
3230: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
3240: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65  .....    proc ge
3250: 74 42 75 69 6c 64 43 6f 6e 66 69 67 75 72 61 74  tBuildConfigurat
3260: 69 6f 6e 73 20 7b 7d 20 7b 0d 0a 20 20 20 20 20  ions {} {..     
3270: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
3280: 3a 20 53 65 65 20 69 66 20 74 68 65 20 6c 69 73  : See if the lis
3290: 74 20 6f 66 20 74 65 73 74 20 63 6f 6e 66 69 67  t of test config
32a0: 75 72 61 74 69 6f 6e 73 20 68 61 73 20 62 65 65  urations has bee
32b0: 6e 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79 0d  n overridden by.
32c0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74  .      #       t
32d0: 68 65 20 75 73 65 72 20 28 65 2e 67 2e 20 6f 6e  he user (e.g. on
32e0: 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e   the command lin
32f0: 65 29 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  e)...      #..  
3300: 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
3310: 69 73 74 73 20 3a 3a 74 65 73 74 5f 63 6f 6e 66  ists ::test_conf
3320: 69 67 75 72 61 74 69 6f 6e 73 5d 20 26 26 20 5c  igurations] && \
3330: 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 6c 6c 65  ..          [lle
3340: 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f 63 6f 6e  ngth $::test_con
3350: 66 69 67 75 72 61 74 69 6f 6e 73 5d 20 3e 20 30  figurations] > 0
3360: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
3370: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
3380: 4f 54 45 3a 20 55 73 65 20 74 68 65 20 73 70 65  OTE: Use the spe
3390: 63 69 66 69 65 64 20 6c 69 73 74 20 6f 66 20 74  cified list of t
33a0: 65 73 74 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  est configuratio
33b0: 6e 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ns...        #..
33c0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24          return $
33d0: 3a 3a 74 65 73 74 5f 63 6f 6e 66 69 67 75 72 61  ::test_configura
33e0: 74 69 6f 6e 73 0d 0a 20 20 20 20 20 20 7d 20 65  tions..      } e
33f0: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  lse {..        #
3400: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
3410: 3a 20 55 73 65 20 74 68 65 20 64 65 66 61 75 6c  : Use the defaul
3420: 74 20 6c 69 73 74 20 6f 66 20 74 65 73 74 20 63  t list of test c
3430: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 2e 0d 0a  onfigurations...
3440: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
3450: 20 20 20 72 65 74 75 72 6e 20 5b 6c 69 73 74 20     return [list 
3460: 44 65 62 75 67 20 52 65 6c 65 61 73 65 5d 0d 0a  Debug Release]..
3470: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
3480: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 42  ...    proc getB
3490: 75 69 6c 64 42 61 73 65 44 69 72 65 63 74 6f 72  uildBaseDirector
34a0: 79 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  y {} {..      #.
34b0: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46  .      # NOTE: F
34c0: 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 62 61  igure out the ba
34d0: 73 65 20 64 69 72 65 63 74 6f 72 79 20 77 68 65  se directory whe
34e0: 72 65 20 61 6c 6c 20 74 68 65 20 62 75 69 6c 64  re all the build
34f0: 73 20 73 68 6f 75 6c 64 20 62 65 0d 0a 20 20 20  s should be..   
3500: 20 20 20 23 20 20 20 20 20 20 20 6c 6f 63 61 74     #       locat
3510: 65 64 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 62  ed.  This will b
3520: 65 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  e the directory 
3530: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
3540: 65 20 61 63 74 75 61 6c 0d 0a 20 20 20 20 20 20  e actual..      
3550: 23 20 20 20 20 20 20 20 62 75 69 6c 64 20 6f 75  #       build ou
3560: 74 70 75 74 20 64 69 72 65 63 74 6f 72 79 20 28  tput directory (
3570: 65 2e 67 2e 20 70 61 72 65 6e 74 20 6f 66 20 22  e.g. parent of "
3580: 62 69 6e 22 29 2e 0d 0a 20 20 20 20 20 20 23 0d  bin")...      #.
3590: 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f  .      if {[info
35a0: 20 65 78 69 73 74 73 20 3a 3a 62 75 69 6c 64 5f   exists ::build_
35b0: 62 61 73 65 5f 64 69 72 65 63 74 6f 72 79 5d 20  base_directory] 
35c0: 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
35d0: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
35e0: 3a 3a 62 75 69 6c 64 5f 62 61 73 65 5f 64 69 72  ::build_base_dir
35f0: 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65  ectory] > 0} the
3600: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
3610: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
3620: 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20  The location of 
3630: 74 68 65 20 62 75 69 6c 64 20 62 61 73 65 20 64  the build base d
3640: 69 72 65 63 74 6f 72 79 20 68 61 73 20 62 65 65  irectory has bee
3650: 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b 0d 0a 20  n overridden;.. 
3660: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74         #       t
3670: 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74  herefore, use it
3680: 20 76 65 72 62 61 74 69 6d 2e 0d 0a 20 20 20 20   verbatim...    
3690: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
36a0: 65 74 75 72 6e 20 24 3a 3a 62 75 69 6c 64 5f 62  eturn $::build_b
36b0: 61 73 65 5f 64 69 72 65 63 74 6f 72 79 0d 0a 20  ase_directory.. 
36c0: 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b       } elseif {[
36d0: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 63 6f  info exists ::co
36e0: 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79 5d 20  mmon_directory] 
36f0: 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
3700: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
3710: 3a 3a 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f  ::common_directo
3720: 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  ry] > 0} then {.
3730: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
3740: 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e 65 78 74      # NOTE: Next
3750: 2c 20 66 61 6c 6c 62 61 63 6b 20 74 6f 20 74 68  , fallback to th
3760: 65 20 67 72 61 6e 64 70 61 72 65 6e 74 20 64 69  e grandparent di
3770: 72 65 63 74 6f 72 79 20 6f 66 20 74 68 65 20 6f  rectory of the o
3780: 6e 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ne..        #   
3790: 20 20 20 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74      containing t
37a0: 68 69 73 20 66 69 6c 65 20 28 69 2e 65 2e 20 22  his file (i.e. "
37b0: 63 6f 6d 6d 6f 6e 2e 65 61 67 6c 65 22 29 2c 20  common.eagle"), 
37c0: 69 66 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0a 20  if available... 
37d0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
37e0: 20 20 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 64    return [file d
37f0: 69 72 6e 61 6d 65 20 5b 66 69 6c 65 20 64 69 72  irname [file dir
3800: 6e 61 6d 65 20 24 3a 3a 63 6f 6d 6d 6f 6e 5f 64  name $::common_d
3810: 69 72 65 63 74 6f 72 79 5d 5d 0d 0a 20 20 20 20  irectory]]..    
3820: 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66    } elseif {[inf
3830: 6f 20 65 78 69 73 74 73 20 3a 3a 70 61 74 68 5d  o exists ::path]
3840: 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
3850: 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20   [string length 
3860: 24 3a 3a 70 61 74 68 5d 20 3e 20 30 7d 20 74 68  $::path] > 0} th
3870: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
3880: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
3890: 20 46 69 6e 61 6c 6c 79 2c 20 66 61 6c 6c 62 61   Finally, fallba
38a0: 63 6b 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74  ck to the parent
38b0: 20 64 69 72 65 63 74 6f 72 79 20 6f 66 20 74 68   directory of th
38c0: 65 20 45 61 67 6c 65 54 65 73 74 0d 0a 20 20 20  e EagleTest..   
38d0: 20 20 20 20 20 23 20 20 20 20 20 20 20 70 61 74       #       pat
38e0: 68 2e 20 20 54 68 65 20 45 61 67 6c 65 54 65 73  h.  The EagleTes
38f0: 74 20 70 61 63 6b 61 67 65 20 67 75 61 72 61 6e  t package guaran
3900: 74 65 65 73 20 74 68 61 74 20 74 68 69 73 20 76  tees that this v
3910: 61 72 69 61 62 6c 65 0d 0a 20 20 20 20 20 20 20  ariable..       
3920: 20 23 20 20 20 20 20 20 20 77 69 6c 6c 20 62 65   #       will be
3930: 20 73 65 74 20 74 6f 20 74 68 65 20 64 69 72 65   set to the dire
3940: 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67  ctory containing
3950: 20 74 68 65 20 66 69 72 73 74 20 66 69 6c 65 20   the first file 
3960: 74 6f 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  to..        #   
3970: 20 20 20 20 65 78 65 63 75 74 65 20 74 68 65 20      execute the 
3980: 5b 72 75 6e 54 65 73 74 50 72 6f 6c 6f 67 75 65  [runTestPrologue
3990: 5d 20 73 63 72 69 70 74 20 6c 69 62 72 61 72 79  ] script library
39a0: 20 70 72 6f 63 65 64 75 72 65 2e 0d 0a 20 20 20   procedure...   
39b0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
39c0: 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 64 69 72  return [file dir
39d0: 6e 61 6d 65 20 24 3a 3a 70 61 74 68 5d 0d 0a 20  name $::path].. 
39e0: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
39f0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
3a00: 20 20 23 20 4e 4f 54 45 3a 20 4e 6f 20 70 61 74    # NOTE: No pat
3a10: 68 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20  h is available, 
3a20: 72 65 74 75 72 6e 20 61 6e 20 65 6d 70 74 79 20  return an empty 
3a30: 73 74 72 69 6e 67 2e 20 20 54 68 69 73 20 70 6f  string.  This po
3a40: 69 6e 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20  int..        #  
3a50: 20 20 20 20 20 73 68 6f 75 6c 64 20 6e 6f 74 20       should not 
3a60: 62 65 20 72 65 61 63 68 65 64 2e 0d 0a 20 20 20  be reached...   
3a70: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
3a80: 72 65 74 75 72 6e 20 22 22 0d 0a 20 20 20 20 20  return ""..     
3a90: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
3aa0: 20 20 70 72 6f 63 20 67 65 74 53 51 4c 69 74 65    proc getSQLite
3ab0: 54 65 73 74 44 61 74 61 50 61 74 68 20 7b 7d 20  TestDataPath {} 
3ac0: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
3ad0: 20 20 23 20 4e 4f 54 45 3a 20 46 69 67 75 72 65    # NOTE: Figure
3ae0: 20 6f 75 74 20 74 68 65 20 64 69 72 65 63 74 6f   out the directo
3af0: 72 79 20 77 68 65 72 65 20 61 6c 6c 20 74 68 65  ry where all the
3b00: 20 74 65 73 74 20 64 61 74 61 20 66 69 6c 65 73   test data files
3b10: 20 73 68 6f 75 6c 64 0d 0a 20 20 20 20 20 20 23   should..      #
3b20: 20 20 20 20 20 20 20 62 65 20 6c 6f 63 61 74 65         be locate
3b30: 64 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20  d.  This should 
3b40: 62 65 20 74 68 65 20 22 64 61 74 61 22 20 64 69  be the "data" di
3b50: 72 65 63 74 6f 72 79 20 62 65 6e 65 61 74 68 20  rectory beneath 
3b60: 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  the..      #    
3b70: 20 20 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e     directory con
3b80: 74 61 69 6e 69 6e 67 20 74 68 65 20 61 63 74 75  taining the actu
3b90: 61 6c 20 74 65 73 74 20 73 63 72 69 70 74 73 2e  al test scripts.
3ba0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
3bb0: 20 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 6a 6f   return [file jo
3bc0: 69 6e 20 24 3a 3a 70 61 74 68 20 64 61 74 61 5d  in $::path data]
3bd0: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
3be0: 70 72 6f 63 20 69 73 52 75 6e 6e 69 6e 67 57 6f  proc isRunningWo
3bf0: 57 36 34 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20  W64 {} {..      
3c00: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
3c10: 20 46 6f 72 20 6e 6f 77 2c 20 6a 75 73 74 20 75   For now, just u
3c20: 73 65 20 74 68 65 20 65 78 69 73 74 69 6e 67 20  se the existing 
3c30: 74 65 73 74 20 63 6f 6e 73 74 72 61 69 6e 74 20  test constraint 
3c40: 66 6f 72 20 64 65 74 65 63 74 69 6e 67 0d 0a 20  for detecting.. 
3c50: 20 20 20 20 20 23 20 20 20 20 20 20 20 61 20 57       #       a W
3c60: 6f 57 36 34 20 70 72 6f 63 65 73 73 2e 0d 0a 20  oW64 process... 
3c70: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65       #..      re
3c80: 74 75 72 6e 20 5b 68 61 76 65 43 6f 6e 73 74 72  turn [haveConstr
3c90: 61 69 6e 74 20 77 6f 77 36 34 5d 0d 0a 20 20 20  aint wow64]..   
3ca0: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
3cb0: 69 73 4d 69 78 65 64 4d 6f 64 65 41 73 73 65 6d  isMixedModeAssem
3cc0: 62 6c 79 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7b  bly { fileName {
3cd0: 76 61 72 4e 61 6d 65 20 22 22 7d 20 7d 20 7b 0d  varName ""} } {.
3ce0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
3cf0: 23 20 4e 4f 54 45 3a 20 46 69 72 73 74 2c 20 6d  # NOTE: First, m
3d00: 61 6b 65 20 73 75 72 65 20 74 68 65 20 74 65 73  ake sure the tes
3d10: 74 20 73 75 69 74 65 20 69 6e 66 72 61 73 74 72  t suite infrastr
3d20: 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 77 65  ucture is allowe
3d30: 64 20 74 6f 0d 0a 20 20 20 20 20 20 23 20 20 20  d to..      #   
3d40: 20 20 20 20 75 73 65 20 74 68 65 20 5b 65 78 65      use the [exe
3d50: 63 5d 20 63 6f 6d 6d 61 6e 64 2e 0d 0a 20 20 20  c] command...   
3d60: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
3d70: 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
3d80: 6e 6f 28 65 78 65 63 29 5d 20 26 26 20 21 5b 69  no(exec)] && ![i
3d90: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
3da0: 63 6f 72 46 6c 61 67 73 29 5d 7d 20 74 68 65 6e  corFlags)]} then
3db0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
3dc0: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49         # NOTE: I
3dd0: 66 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f  f the location o
3de0: 66 20 43 6f 72 46 6c 61 67 73 20 69 73 20 70 72  f CorFlags is pr
3df0: 65 73 65 6e 74 20 69 6e 20 74 68 65 20 65 6e 76  esent in the env
3e00: 69 72 6f 6e 6d 65 6e 74 2c 0d 0a 20 20 20 20 20  ironment,..     
3e10: 20 20 20 23 20 20 20 20 20 20 20 75 73 65 20 69     #       use i
3e20: 74 3b 20 6f 74 68 65 72 77 69 73 65 20 61 73 73  t; otherwise ass
3e30: 75 6d 65 20 69 74 20 69 73 20 69 6e 20 74 68 65  ume it is in the
3e40: 20 50 41 54 48 2e 0d 0a 20 20 20 20 20 20 20 20   PATH...        
3e50: 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 63  #..        set c
3e60: 6f 72 46 6c 61 67 73 20 5b 65 78 70 72 20 7b 0d  orFlags [expr {.
3e70: 0a 20 20 20 20 20 20 20 20 20 20 5b 69 6e 66 6f  .          [info
3e80: 20 65 78 69 73 74 73 20 3a 3a 65 6e 76 28 43 6f   exists ::env(Co
3e90: 72 46 6c 61 67 73 29 5d 20 3f 20 24 3a 3a 65 6e  rFlags)] ? $::en
3ea0: 76 28 43 6f 72 46 6c 61 67 73 29 20 3a 20 22 43  v(CorFlags) : "C
3eb0: 6f 72 46 6c 61 67 73 22 0d 0a 20 20 20 20 20 20  orFlags"..      
3ec0: 20 20 7d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20    }]....        
3ed0: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
3ee0: 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 65 78  E: Attempt to ex
3ef0: 65 63 75 74 65 20 43 6f 72 46 6c 61 67 73 20 6f  ecute CorFlags o
3f00: 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  n the specified 
3f10: 66 69 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 23  file...        #
3f20: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63  ..        if {[c
3f30: 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
3f40: 20 20 65 78 65 63 20 2d 2d 20 24 63 6f 72 46 6c    exec -- $corFl
3f50: 61 67 73 20 5b 66 69 6c 65 20 6e 61 74 69 76 65  ags [file native
3f60: 6e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 5d 0d  name $fileName].
3f70: 0a 20 20 20 20 20 20 20 20 7d 20 65 78 65 63 5d  .        } exec]
3f80: 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
3f90: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
3fa0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66        # NOTE: If
3fb0: 20 72 65 71 75 65 73 74 65 64 20 62 79 20 6f 75   requested by ou
3fc0: 72 20 63 61 6c 6c 65 72 2c 20 61 74 74 65 6d 70  r caller, attemp
3fd0: 74 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  t to determine t
3fe0: 68 65 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20  he..          # 
3ff0: 20 20 20 20 20 20 70 6c 61 74 66 6f 72 6d 20 66        platform f
4000: 6f 72 20 74 68 65 20 73 70 65 63 69 66 69 65 64  or the specified
4010: 20 66 69 6c 65 20 61 73 20 77 65 6c 6c 2e 0d 0a   file as well...
4020: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
4030: 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69         if {[stri
4040: 6e 67 20 6c 65 6e 67 74 68 20 24 76 61 72 4e 61  ng length $varNa
4050: 6d 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  me] > 0} then {.
4060: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a  .            #..
4070: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f              # NO
4080: 54 45 3a 20 53 74 6f 72 65 20 74 68 65 20 70 6c  TE: Store the pl
4090: 61 74 66 6f 72 6d 20 69 6e 20 74 68 65 20 6e 61  atform in the na
40a0: 6d 65 64 20 76 61 72 69 61 62 6c 65 20 69 6e 20  med variable in 
40b0: 74 68 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  the..           
40c0: 20 23 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74   #       context
40d0: 20 6f 66 20 6f 75 72 20 63 61 6c 6c 65 72 2e 0d   of our caller..
40e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a  .            #..
40f0: 20 20 20 20 20 20 20 20 20 20 20 20 75 70 76 61              upva
4100: 72 20 31 20 24 76 61 72 4e 61 6d 65 20 70 6c 61  r 1 $varName pla
4110: 74 66 6f 72 6d 0d 0a 0d 0a 20 20 20 20 20 20 20  tform....       
4120: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
4130: 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65      # NOTE: Atte
4140: 6d 70 74 20 74 6f 20 65 78 74 72 61 63 74 20 74  mpt to extract t
4150: 68 65 20 50 45 20 6c 69 6e 65 20 66 72 6f 6d 20  he PE line from 
4160: 74 68 65 20 63 61 70 74 75 72 65 64 0d 0a 20 20  the captured..  
4170: 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
4180: 20 20 6f 75 74 70 75 74 2e 20 20 49 66 20 74 68    output.  If th
4190: 69 73 20 76 61 6c 75 65 20 69 73 20 22 50 45 33  is value is "PE3
41a0: 32 22 20 6f 72 20 22 50 45 33 32 2b 22 2c 20 74  2" or "PE32+", t
41b0: 68 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  he..            
41c0: 23 20 20 20 20 20 20 20 61 73 73 65 6d 62 6c 79  #       assembly
41d0: 20 66 69 6c 65 20 69 73 20 33 32 2d 62 69 74 20   file is 32-bit 
41e0: 6f 72 20 36 34 2d 62 69 74 2c 20 72 65 73 70 65  or 64-bit, respe
41f0: 63 74 69 76 65 6c 79 3b 0d 0a 20 20 20 20 20 20  ctively;..      
4200: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6f 74        #       ot
4210: 68 65 72 77 69 73 65 2c 20 69 74 73 20 74 79 70  herwise, its typ
4220: 65 20 69 73 20 75 6e 6b 6e 6f 77 6e 2e 0d 0a 20  e is unknown... 
4230: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
4240: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 70 61            set pa
4250: 74 74 65 72 6e 20 7b 5e 50 45 20 20 20 20 20 20  ttern {^PE      
4260: 20 20 3a 20 28 50 45 33 32 7c 50 45 33 32 5c 2b    : (PE32|PE32\+
4270: 29 5c 73 2b 24 7d 0d 0a 0d 0a 20 20 20 20 20 20  )\s+$}....      
4280: 20 20 20 20 20 20 69 66 20 7b 5b 72 65 67 65 78        if {[regex
4290: 70 20 2d 6c 69 6e 65 20 2d 2d 20 24 70 61 74 74  p -line -- $patt
42a0: 65 72 6e 20 24 65 78 65 63 20 64 75 6d 6d 79 20  ern $exec dummy 
42b0: 70 65 33 32 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  pe32]} then {.. 
42c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a               #..
42d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
42e0: 48 41 43 4b 3a 20 54 68 69 73 20 5b 73 77 69 74  HACK: This [swit
42f0: 63 68 5d 20 61 73 73 75 6d 65 73 20 74 68 61 74  ch] assumes that
4300: 20 33 32 2d 62 69 74 20 65 78 65 63 75 74 61 62   32-bit executab
4310: 6c 65 73 20 61 72 65 0d 0a 20 20 20 20 20 20 20  les are..       
4320: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61         #       a
4330: 6c 77 61 79 73 20 78 38 36 20 61 6e 64 20 74 68  lways x86 and th
4340: 61 74 20 36 34 2d 62 69 74 20 65 78 65 63 75 74  at 64-bit execut
4350: 61 62 6c 65 73 20 61 72 65 20 61 6c 77 61 79 73  ables are always
4360: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
4370: 23 20 20 20 20 20 20 20 78 36 34 2e 0d 0a 20 20  #       x64...  
4380: 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
4390: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 77 69               swi
43a0: 74 63 68 20 2d 65 78 61 63 74 20 2d 2d 20 24 70  tch -exact -- $p
43b0: 65 33 32 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  e32 {..         
43c0: 20 20 20 20 20 20 20 50 45 33 32 20 7b 0d 0a 20         PE32 {.. 
43d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
43e0: 20 73 65 74 20 70 6c 61 74 66 6f 72 6d 20 57 69   set platform Wi
43f0: 6e 33 32 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n32..           
4400: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
4410: 20 20 20 20 20 20 20 20 50 45 33 32 2b 20 7b 0d          PE32+ {.
4420: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4430: 20 20 20 73 65 74 20 70 6c 61 74 66 6f 72 6d 20     set platform 
4440: 78 36 34 0d 0a 20 20 20 20 20 20 20 20 20 20 20  x64..           
4450: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
4460: 20 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 20          default 
4470: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
4480: 20 20 20 20 20 73 65 74 20 70 6c 61 74 66 6f 72       set platfor
4490: 6d 20 22 22 0d 0a 20 20 20 20 20 20 20 20 20 20  m ""..          
44a0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
44b0: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
44c0: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
44d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
44e0: 74 20 70 6c 61 74 66 6f 72 6d 20 22 22 0d 0a 20  t platform "".. 
44f0: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
4500: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
4510: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
4520: 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65      # NOTE: Atte
4530: 6d 70 74 20 74 6f 20 65 78 74 72 61 63 74 20 74  mpt to extract t
4540: 68 65 20 49 4c 4f 4e 4c 59 20 6c 69 6e 65 20 66  he ILONLY line f
4550: 72 6f 6d 20 74 68 65 20 63 61 70 74 75 72 65 64  rom the captured
4560: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20  ..          #   
4570: 20 20 20 20 6f 75 74 70 75 74 2e 20 20 49 66 20      output.  If 
4580: 74 68 69 73 20 76 61 6c 75 65 20 69 73 20 7a 65  this value is ze
4590: 72 6f 2c 20 74 68 65 20 73 70 65 63 69 66 69 65  ro, the specifie
45a0: 64 20 66 69 6c 65 20 6d 75 73 74 0d 0a 20 20 20  d file must..   
45b0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62         #       b
45c0: 65 20 61 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61  e a mixed-mode a
45d0: 73 73 65 6d 62 6c 79 3b 20 6f 74 68 65 72 77 69  ssembly; otherwi
45e0: 73 65 2c 20 69 74 20 63 6f 6e 74 61 69 6e 73 20  se, it contains 
45f0: 6f 6e 6c 79 0d 0a 20 20 20 20 20 20 20 20 20 20  only..          
4600: 23 20 20 20 20 20 20 20 6d 61 6e 61 67 65 64 20  #       managed 
4610: 63 6f 6d 70 6f 6e 65 6e 74 73 2e 0d 0a 20 20 20  components...   
4620: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
4630: 20 20 20 20 73 65 74 20 70 61 74 74 65 72 6e 20      set pattern 
4640: 7b 5e 49 4c 4f 4e 4c 59 20 20 20 20 3a 20 28 30  {^ILONLY    : (0
4650: 7c 31 29 5c 73 2b 24 7d 0d 0a 0d 0a 20 20 20 20  |1)\s+$}....    
4660: 20 20 20 20 20 20 69 66 20 7b 21 5b 72 65 67 65        if {![rege
4670: 78 70 20 2d 6c 69 6e 65 20 2d 2d 20 24 70 61 74  xp -line -- $pat
4680: 74 65 72 6e 20 24 65 78 65 63 20 64 75 6d 6d 79  tern $exec dummy
4690: 20 69 6c 4f 6e 6c 79 5d 7d 20 74 68 65 6e 20 7b   ilOnly]} then {
46a0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ..            re
46b0: 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20  turn false..    
46c0: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
46d0: 20 20 20 20 20 69 66 20 7b 21 24 69 6c 4f 6e 6c       if {!$ilOnl
46e0: 79 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  y} then {..     
46f0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72         return tr
4700: 75 65 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  ue..          }.
4710: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
4720: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
4730: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66        # NOTE: If
4740: 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65 20   the test suite 
4750: 63 61 6e 6e 6f 74 20 75 73 65 20 5b 65 78 65 63  cannot use [exec
4760: 5d 20 6f 72 20 65 78 65 63 75 74 69 6f 6e 20 6f  ] or execution o
4770: 66 20 43 6f 72 46 6c 61 67 73 0d 0a 20 20 20 20  f CorFlags..    
4780: 20 20 23 20 20 20 20 20 20 20 66 61 69 6c 65 64    #       failed
4790: 2c 20 72 65 74 75 72 6e 20 66 61 6c 73 65 2e 0d  , return false..
47a0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
47b0: 72 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20  return false..  
47c0: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
47d0: 20 67 65 74 4e 61 74 69 76 65 4c 69 62 72 61 72   getNativeLibrar
47e0: 79 46 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79 20 7b  yFileNamesOnly {
47f0: 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
4800: 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69 72 73      # NOTE: Firs
4810: 74 2c 20 63 68 65 63 6b 20 69 66 20 74 68 65 20  t, check if the 
4820: 6c 69 73 74 20 6f 66 20 6e 61 74 69 76 65 20 6c  list of native l
4830: 69 62 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65  ibrary file name
4840: 73 20 68 61 73 20 62 65 65 6e 0d 0a 20 20 20 20  s has been..    
4850: 20 20 23 20 20 20 20 20 20 20 6d 61 6e 75 61 6c    #       manual
4860: 6c 79 20 6f 76 65 72 72 69 64 64 65 6e 2e 0d 0a  ly overridden...
4870: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
4880: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
4890: 3a 3a 6e 61 74 69 76 65 5f 6c 69 62 72 61 72 79  ::native_library
48a0: 5f 66 69 6c 65 5f 6e 61 6d 65 73 5d 20 26 26 20  _file_names] && 
48b0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 6c 6c  \..          [ll
48c0: 65 6e 67 74 68 20 24 3a 3a 6e 61 74 69 76 65 5f  ength $::native_
48d0: 6c 69 62 72 61 72 79 5f 66 69 6c 65 5f 6e 61 6d  library_file_nam
48e0: 65 73 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  es] > 0} then {.
48f0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
4900: 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20      # NOTE: The 
4910: 6c 69 73 74 20 6f 66 20 6e 61 74 69 76 65 20 6c  list of native l
4920: 69 62 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65  ibrary file name
4930: 73 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72  s has been overr
4940: 69 64 64 65 6e 3b 0d 0a 20 20 20 20 20 20 20 20  idden;..        
4950: 23 20 20 20 20 20 20 20 74 68 65 72 65 66 6f 72  #       therefor
4960: 65 2c 20 75 73 65 20 69 74 20 76 65 72 62 61 74  e, use it verbat
4970: 69 6d 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  im...        #..
4980: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24          return $
4990: 3a 3a 6e 61 74 69 76 65 5f 6c 69 62 72 61 72 79  ::native_library
49a0: 5f 66 69 6c 65 5f 6e 61 6d 65 73 0d 0a 20 20 20  _file_names..   
49b0: 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69 73     } elseif {[is
49c0: 57 69 6e 64 6f 77 73 5d 7d 20 74 68 65 6e 20 7b  Windows]} then {
49d0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
49e0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4f 74 68       # NOTE: Oth
49f0: 65 72 77 69 73 65 2c 20 6f 6e 20 57 69 6e 64 6f  erwise, on Windo
4a00: 77 73 2c 20 61 6c 77 61 79 73 20 75 73 65 20 74  ws, always use t
4a10: 68 65 20 64 65 66 61 75 6c 74 20 66 69 6c 65 20  he default file 
4a20: 6e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 23 20  name..        # 
4a30: 20 20 20 20 20 20 22 73 71 6c 69 74 65 33 2e 64        "sqlite3.d
4a40: 6c 6c 22 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ll"...        #.
4a50: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
4a60: 5b 6c 69 73 74 20 73 71 6c 69 74 65 33 2e 64 6c  [list sqlite3.dl
4a70: 6c 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  l]..      } else
4a80: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
4a90: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4f         # NOTE: O
4aa0: 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e  therwise, return
4ab0: 20 62 6f 74 68 20 74 68 65 20 67 65 6e 65 72 69   both the generi
4ac0: 63 20 50 4f 53 49 58 20 66 69 6c 65 20 6e 61 6d  c POSIX file nam
4ad0: 65 20 61 6e 64 20 74 68 65 0d 0a 20 20 20 20 20  e and the..     
4ae0: 20 20 20 23 20 20 20 20 20 20 20 4d 61 63 20 4f     #       Mac O
4af0: 53 20 58 20 66 69 6c 65 20 6e 61 6d 65 2c 20 73  S X file name, s
4b00: 69 6e 63 65 20 77 65 20 64 6f 20 6e 6f 74 20 63  ince we do not c
4b10: 75 72 72 65 6e 74 6c 79 20 68 61 76 65 20 61 6e  urrently have an
4b20: 20 65 61 73 79 0d 0a 20 20 20 20 20 20 20 20 23   easy..        #
4b30: 20 20 20 20 20 20 20 77 61 79 20 74 6f 20 64 65         way to de
4b40: 74 65 63 74 20 77 68 69 63 68 20 6f 66 20 74 68  tect which of th
4b50: 6f 73 65 20 70 6c 61 74 66 6f 72 6d 73 20 77 65  ose platforms we
4b60: 20 61 72 65 20 72 75 6e 6e 69 6e 67 20 6f 6e 2e   are running on.
4b70: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
4b80: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6c 69 73       return [lis
4b90: 74 20 6c 69 62 73 71 6c 69 74 65 33 2e 64 79 6c  t libsqlite3.dyl
4ba0: 69 62 20 6c 69 62 73 71 6c 69 74 65 33 2e 73 6f  ib libsqlite3.so
4bb0: 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  ]..      }..    
4bc0: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67  }.....    proc g
4bd0: 65 74 49 6e 74 65 72 6f 70 41 73 73 65 6d 62 6c  etInteropAssembl
4be0: 79 46 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79 20 7b  yFileNamesOnly {
4bf0: 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
4c00: 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69 72 73      # NOTE: Firs
4c10: 74 2c 20 63 68 65 63 6b 20 69 66 20 74 68 65 20  t, check if the 
4c20: 6c 69 73 74 20 6f 66 20 69 6e 74 65 72 6f 70 20  list of interop 
4c30: 61 73 73 65 6d 62 6c 79 20 66 69 6c 65 20 6e 61  assembly file na
4c40: 6d 65 73 20 68 61 73 20 62 65 65 6e 0d 0a 20 20  mes has been..  
4c50: 20 20 20 20 23 20 20 20 20 20 20 20 6d 61 6e 75      #       manu
4c60: 61 6c 6c 79 20 6f 76 65 72 72 69 64 64 65 6e 2e  ally overridden.
4c70: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
4c80: 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
4c90: 73 20 3a 3a 69 6e 74 65 72 6f 70 5f 61 73 73 65  s ::interop_asse
4ca0: 6d 62 6c 79 5f 66 69 6c 65 5f 6e 61 6d 65 73 5d  mbly_file_names]
4cb0: 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
4cc0: 20 5b 6c 6c 65 6e 67 74 68 20 24 3a 3a 69 6e 74   [llength $::int
4cd0: 65 72 6f 70 5f 61 73 73 65 6d 62 6c 79 5f 66 69  erop_assembly_fi
4ce0: 6c 65 5f 6e 61 6d 65 73 5d 20 3e 20 30 7d 20 74  le_names] > 0} t
4cf0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
4d00: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
4d10: 3a 20 54 68 65 20 6c 69 73 74 20 6f 66 20 69 6e  : The list of in
4d20: 74 65 72 6f 70 20 61 73 73 65 6d 62 6c 79 20 66  terop assembly f
4d30: 69 6c 65 20 6e 61 6d 65 73 20 68 61 73 20 62 65  ile names has be
4d40: 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b 0d 0a  en overridden;..
4d50: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
4d60: 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69  therefore, use i
4d70: 74 20 76 65 72 62 61 74 69 6d 2e 0d 0a 20 20 20  t verbatim...   
4d80: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
4d90: 72 65 74 75 72 6e 20 24 3a 3a 69 6e 74 65 72 6f  return $::intero
4da0: 70 5f 61 73 73 65 6d 62 6c 79 5f 66 69 6c 65 5f  p_assembly_file_
4db0: 6e 61 6d 65 73 0d 0a 20 20 20 20 20 20 7d 20 65  names..      } e
4dc0: 6c 73 65 69 66 20 7b 5b 69 73 57 69 6e 64 6f 77  lseif {[isWindow
4dd0: 73 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  s]} then {..    
4de0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
4df0: 20 4e 4f 54 45 3a 20 4f 74 68 65 72 77 69 73 65   NOTE: Otherwise
4e00: 2c 20 6f 6e 20 57 69 6e 64 6f 77 73 2c 20 61 6c  , on Windows, al
4e10: 77 61 79 73 20 75 73 65 20 74 68 65 20 64 65 66  ways use the def
4e20: 61 75 6c 74 20 66 69 6c 65 20 6e 61 6d 65 0d 0a  ault file name..
4e30: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
4e40: 22 53 51 4c 69 74 65 2e 49 6e 74 65 72 6f 70 2e  "SQLite.Interop.
4e50: 64 6c 6c 22 2e 0d 0a 20 20 20 20 20 20 20 20 23  dll"...        #
4e60: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
4e70: 20 5b 6c 69 73 74 20 53 51 4c 69 74 65 2e 49 6e   [list SQLite.In
4e80: 74 65 72 6f 70 2e 64 6c 6c 5d 0d 0a 20 20 20 20  terop.dll]..    
4e90: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
4ea0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
4eb0: 20 4e 4f 54 45 3a 20 4f 74 68 65 72 77 69 73 65   NOTE: Otherwise
4ec0: 2c 20 72 65 74 75 72 6e 20 62 6f 74 68 20 74 68  , return both th
4ed0: 65 20 67 65 6e 65 72 69 63 20 50 4f 53 49 58 20  e generic POSIX 
4ee0: 66 69 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68  file name and th
4ef0: 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
4f00: 20 20 20 4d 61 63 20 4f 53 20 58 20 66 69 6c 65     Mac OS X file
4f10: 20 6e 61 6d 65 2c 20 73 69 6e 63 65 20 77 65 20   name, since we 
4f20: 64 6f 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  do not currently
4f30: 20 68 61 76 65 20 61 6e 20 65 61 73 79 0d 0a 20   have an easy.. 
4f40: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 77         #       w
4f50: 61 79 20 74 6f 20 64 65 74 65 63 74 20 77 68 69  ay to detect whi
4f60: 63 68 20 6f 66 20 74 68 6f 73 65 20 70 6c 61 74  ch of those plat
4f70: 66 6f 72 6d 73 20 77 65 20 61 72 65 20 72 75 6e  forms we are run
4f80: 6e 69 6e 67 20 6f 6e 2e 0d 0a 20 20 20 20 20 20  ning on...      
4f90: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
4fa0: 75 72 6e 20 5b 6c 69 73 74 20 6c 69 62 53 51 4c  urn [list libSQL
4fb0: 69 74 65 2e 49 6e 74 65 72 6f 70 2e 64 79 6c 69  ite.Interop.dyli
4fc0: 62 20 6c 69 62 53 51 4c 69 74 65 2e 49 6e 74 65  b libSQLite.Inte
4fd0: 72 6f 70 2e 73 6f 5d 0d 0a 20 20 20 20 20 20 7d  rop.so]..      }
4fe0: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
4ff0: 70 72 6f 63 20 67 65 74 43 6f 72 65 45 78 74 65  proc getCoreExte
5000: 6e 73 69 6f 6e 42 69 6e 61 72 79 46 69 6c 65 4e  nsionBinaryFileN
5010: 61 6d 65 20 7b 20 7b 64 65 66 61 75 6c 74 20 22  ame { {default "
5020: 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65  "} } {..      se
5030: 74 20 66 69 6c 65 4e 61 6d 65 20 5b 67 65 74 43  t fileName [getC
5040: 6f 72 65 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d  oreBinaryFileNam
5050: 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b  e]....      if {
5060: 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 66 69  [file exists $fi
5070: 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d  leName]} then {.
5080: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
5090: 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20  $fileName..     
50a0: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75   }....      retu
50b0: 72 6e 20 24 64 65 66 61 75 6c 74 0d 0a 20 20 20  rn $default..   
50c0: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
50d0: 69 73 42 75 69 6c 64 41 76 61 69 6c 61 62 6c 65  isBuildAvailable
50e0: 20 7b 20 6e 61 74 69 76 65 20 64 69 72 65 63 74   { native direct
50f0: 6f 72 79 20 7b 76 61 72 4e 61 6d 65 20 22 22 7d  ory {varName ""}
5100: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20   } {..      #.. 
5110: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69       # NOTE: Bui
5120: 6c 64 20 74 68 65 20 66 75 6c 6c 79 20 71 75 61  ld the fully qua
5130: 6c 69 66 69 65 64 20 66 69 6c 65 20 6e 61 6d 65  lified file name
5140: 20 66 6f 72 20 74 68 65 20 70 72 69 6d 61 72 79   for the primary
5150: 20 61 73 73 65 6d 62 6c 79 0d 0a 20 20 20 20 20   assembly..     
5160: 20 23 20 20 20 20 20 20 20 63 6f 6e 74 61 69 6e   #       contain
5170: 69 6e 67 20 74 68 65 20 53 79 73 74 65 6d 2e 44  ing the System.D
5180: 61 74 61 2e 53 51 4c 69 74 65 20 6d 61 6e 61 67  ata.SQLite manag
5190: 65 64 20 63 6f 6d 70 6f 6e 65 6e 74 73 2e 20 20  ed components.  
51a0: 49 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  It..      #     
51b0: 20 20 73 68 6f 75 6c 64 20 62 65 20 6e 6f 74 65    should be note
51c0: 64 20 74 68 61 74 20 74 68 69 73 20 61 73 73 65  d that this asse
51d0: 6d 62 6c 79 20 66 69 6c 65 20 6d 61 79 20 61 6c  mbly file may al
51e0: 73 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 0d 0a  so contain the..
51f0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6e 61        #       na
5200: 74 69 76 65 20 63 6f 6d 70 6f 6e 65 6e 74 73 2c  tive components,
5210: 20 69 66 20 61 20 6e 61 74 69 76 65 20 62 75 69   if a native bui
5220: 6c 64 20 69 73 20 69 6e 20 75 73 65 2e 0d 0a 20  ld is in use... 
5230: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65       #..      se
5240: 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65  t fileName [file
5250: 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c   nativename [fil
5260: 65 20 6a 6f 69 6e 20 24 64 69 72 65 63 74 6f 72  e join $director
5270: 79 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 53  y \..          S
5280: 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
5290: 65 2e 64 6c 6c 5d 5d 0d 0a 0d 0a 20 20 20 20 20  e.dll]]....     
52a0: 20 69 66 20 7b 21 5b 66 69 6c 65 20 65 78 69 73   if {![file exis
52b0: 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74  ts $fileName]} t
52c0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72  hen {..        r
52d0: 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20  eturn false..   
52e0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
52f0: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41  .      # NOTE: A
5300: 74 74 65 6d 70 74 20 74 6f 20 61 75 74 6f 6d 61  ttempt to automa
5310: 74 69 63 61 6c 6c 79 20 64 65 74 65 63 74 20 69  tically detect i
5320: 66 20 74 68 65 20 70 72 69 6d 61 72 79 20 61 73  f the primary as
5330: 73 65 6d 62 6c 79 0d 0a 20 20 20 20 20 20 23 20  sembly..      # 
5340: 20 20 20 20 20 20 63 6f 6e 74 61 69 6e 73 20 61        contains a
5350: 6e 79 20 6e 61 74 69 76 65 20 63 6f 6d 70 6f 6e  ny native compon
5360: 65 6e 74 73 2c 20 69 66 20 6e 65 63 65 73 73 61  ents, if necessa
5370: 72 79 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ry...      #..  
5380: 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
5390: 6c 65 6e 67 74 68 20 24 6e 61 74 69 76 65 5d 20  length $native] 
53a0: 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
53b0: 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
53c0: 67 20 6c 65 6e 67 74 68 20 24 76 61 72 4e 61 6d  g length $varNam
53d0: 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  e] > 0} then {..
53e0: 20 20 20 20 20 20 20 20 20 20 75 70 76 61 72 20            upvar 
53f0: 31 20 24 76 61 72 4e 61 6d 65 20 24 76 61 72 4e  1 $varName $varN
5400: 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  ame..        }..
5410: 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 6e 61  ..        set na
5420: 74 69 76 65 20 5b 69 73 4d 69 78 65 64 4d 6f 64  tive [isMixedMod
5430: 65 41 73 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e  eAssembly $fileN
5440: 61 6d 65 20 24 76 61 72 4e 61 6d 65 5d 0d 0a 20  ame $varName].. 
5450: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
5460: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
5470: 20 49 66 20 74 68 65 20 70 72 69 6d 61 72 79 20   If the primary 
5480: 61 73 73 65 6d 62 6c 79 20 61 6c 73 6f 20 63 6f  assembly also co
5490: 6e 74 61 69 6e 73 20 74 68 65 20 6e 61 74 69 76  ntains the nativ
54a0: 65 20 63 6f 6d 70 6f 6e 65 6e 74 73 2c 0d 0a 20  e components,.. 
54b0: 20 20 20 20 20 23 20 20 20 20 20 20 20 77 65 20       #       we 
54c0: 68 61 76 65 20 65 76 65 72 79 74 68 69 6e 67 20  have everything 
54d0: 77 65 20 6e 65 65 64 2e 0d 0a 20 20 20 20 20 20  we need...      
54e0: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 6e 61  #..      if {$na
54f0: 74 69 76 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  tive} then {..  
5500: 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75        return tru
5510: 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  e..      }....  
5520: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
5530: 4f 54 45 3a 20 57 68 61 74 20 69 73 20 74 68 65  OTE: What is the
5540: 20 61 72 63 68 69 74 65 63 74 75 72 65 20 66 6f   architecture fo
5550: 72 20 74 68 69 73 20 6d 61 63 68 69 6e 65 3f 0d  r this machine?.
5560: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
5570: 73 65 74 20 61 72 63 68 69 74 65 63 74 75 72 65  set architecture
5580: 20 5b 6d 61 63 68 69 6e 65 54 6f 50 6c 61 74 66   [machineToPlatf
5590: 6f 72 6d 20 24 3a 3a 74 63 6c 5f 70 6c 61 74 66  orm $::tcl_platf
55a0: 6f 72 6d 28 6d 61 63 68 69 6e 65 29 20 74 72 75  orm(machine) tru
55b0: 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20  e]....      #.. 
55c0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 68 61       # NOTE: Wha
55d0: 74 20 69 73 20 74 68 65 20 70 6c 61 74 66 6f 72  t is the platfor
55e0: 6d 20 66 6f 72 20 74 68 69 73 20 6d 61 63 68 69  m for this machi
55f0: 6e 65 3f 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ne?..      #..  
5600: 20 20 20 20 73 65 74 20 70 6c 61 74 66 6f 72 6d      set platform
5610: 20 5b 6d 61 63 68 69 6e 65 54 6f 50 6c 61 74 66   [machineToPlatf
5620: 6f 72 6d 20 24 3a 3a 74 63 6c 5f 70 6c 61 74 66  orm $::tcl_platf
5630: 6f 72 6d 28 6d 61 63 68 69 6e 65 29 5d 0d 0a 0d  orm(machine)]...
5640: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
5650: 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74 68  # NOTE: Build th
5660: 65 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65  e fully qualifie
5670: 64 20 66 69 6c 65 20 6e 61 6d 65 20 66 6f 72 20  d file name for 
5680: 74 68 65 20 69 6e 74 65 72 6f 70 20 61 73 73 65  the interop asse
5690: 6d 62 6c 79 0d 0a 20 20 20 20 20 20 23 20 20 20  mbly..      #   
56a0: 20 20 20 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74      containing t
56b0: 68 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  he System.Data.S
56c0: 51 4c 69 74 65 20 6e 61 74 69 76 65 20 63 6f 6d  QLite native com
56d0: 70 6f 6e 65 6e 74 73 2e 20 20 49 66 20 74 68 69  ponents.  If thi
56e0: 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  s..      #      
56f0: 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 77 65   file exists, we
5700: 20 73 68 6f 75 6c 64 20 68 61 76 65 20 65 76 65   should have eve
5710: 72 79 74 68 69 6e 67 20 77 65 20 6e 65 65 64 2e  rything we need.
5720: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
5730: 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d   foreach fileNam
5740: 65 4f 6e 6c 79 20 5b 67 65 74 49 6e 74 65 72 6f  eOnly [getIntero
5750: 70 41 73 73 65 6d 62 6c 79 46 69 6c 65 4e 61 6d  pAssemblyFileNam
5760: 65 73 4f 6e 6c 79 5d 20 7b 0d 0a 20 20 20 20 20  esOnly] {..     
5770: 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 20     set fileName 
5780: 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65  [file nativename
5790: 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 64 69 72   [file join $dir
57a0: 65 63 74 6f 72 79 20 5c 0d 0a 20 20 20 20 20 20  ectory \..      
57b0: 20 20 20 20 20 20 24 61 72 63 68 69 74 65 63 74        $architect
57c0: 75 72 65 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c  ure $fileNameOnl
57d0: 79 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69  y]]....        i
57e0: 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20  f {[file exists 
57f0: 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e  $fileName]} then
5800: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65   {..          re
5810: 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20  turn true..     
5820: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
5830: 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69  set fileName [fi
5840: 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66  le nativename [f
5850: 69 6c 65 20 6a 6f 69 6e 20 24 64 69 72 65 63 74  ile join $direct
5860: 6f 72 79 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ory \..         
5870: 20 20 20 24 70 6c 61 74 66 6f 72 6d 20 24 66 69     $platform $fi
5880: 6c 65 4e 61 6d 65 4f 6e 6c 79 5d 5d 0d 0a 0d 0a  leNameOnly]]....
5890: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 66 69 6c          if {[fil
58a0: 65 20 65 78 69 73 74 73 20 24 66 69 6c 65 4e 61  e exists $fileNa
58b0: 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  me]} then {..   
58c0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72         return tr
58d0: 75 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  ue..        }...
58e0: 0a 20 20 20 20 20 20 20 20 73 65 74 20 66 69 6c  .        set fil
58f0: 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6e 61 74 69  eName [file nati
5900: 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69  vename [file joi
5910: 6e 20 24 64 69 72 65 63 74 6f 72 79 20 5c 0d 0a  n $directory \..
5920: 20 20 20 20 20 20 20 20 20 20 20 20 24 66 69 6c              $fil
5930: 65 4e 61 6d 65 4f 6e 6c 79 5d 5d 0d 0a 0d 0a 20  eNameOnly]].... 
5940: 20 20 20 20 20 20 20 69 66 20 7b 5b 66 69 6c 65         if {[file
5950: 20 65 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d   exists $fileNam
5960: 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  e]} then {..    
5970: 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75        return tru
5980: 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  e..        }..  
5990: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
59a0: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
59b0: 42 75 69 6c 64 20 74 68 65 20 66 75 6c 6c 79 20  Build the fully 
59c0: 71 75 61 6c 69 66 69 65 64 20 66 69 6c 65 20 6e  qualified file n
59d0: 61 6d 65 20 66 6f 72 20 74 68 65 20 53 51 4c 69  ame for the SQLi
59e0: 74 65 20 63 6f 72 65 0d 0a 20 20 20 20 20 20 23  te core..      #
59f0: 20 20 20 20 20 20 20 6c 69 62 72 61 72 79 2e 20         library. 
5a00: 20 49 66 20 74 68 69 73 20 66 69 6c 65 20 65 78   If this file ex
5a10: 69 73 74 73 2c 20 77 65 20 73 68 6f 75 6c 64 20  ists, we should 
5a20: 68 61 76 65 20 65 76 65 72 79 74 68 69 6e 67 20  have everything 
5a30: 77 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  we..      #     
5a40: 20 20 6e 65 65 64 2e 0d 0a 20 20 20 20 20 20 23    need...      #
5a50: 0d 0a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20  ..      foreach 
5a60: 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 5b 67 65  fileNameOnly [ge
5a70: 74 4e 61 74 69 76 65 4c 69 62 72 61 72 79 46 69  tNativeLibraryFi
5a80: 6c 65 4e 61 6d 65 73 4f 6e 6c 79 5d 20 7b 0d 0a  leNamesOnly] {..
5a90: 20 20 20 20 20 20 20 20 73 65 74 20 66 69 6c 65          set file
5aa0: 4e 61 6d 65 20 5b 66 69 6c 65 20 6e 61 74 69 76  Name [file nativ
5ab0: 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e  ename [file join
5ac0: 20 24 64 69 72 65 63 74 6f 72 79 20 5c 0d 0a 20   $directory \.. 
5ad0: 20 20 20 20 20 20 20 20 20 20 20 24 61 72 63 68             $arch
5ae0: 69 74 65 63 74 75 72 65 20 24 66 69 6c 65 4e 61  itecture $fileNa
5af0: 6d 65 4f 6e 6c 79 5d 5d 0d 0a 0d 0a 20 20 20 20  meOnly]]....    
5b00: 20 20 20 20 69 66 20 7b 5b 66 69 6c 65 20 65 78      if {[file ex
5b10: 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d  ists $fileName]}
5b20: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
5b30: 20 20 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a     return true..
5b40: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
5b50: 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d       set fileNam
5b60: 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61  e [file nativena
5b70: 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 64  me [file join $d
5b80: 69 72 65 63 74 6f 72 79 20 5c 0d 0a 20 20 20 20  irectory \..    
5b90: 20 20 20 20 20 20 20 20 24 70 6c 61 74 66 6f 72          $platfor
5ba0: 6d 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 5d  m $fileNameOnly]
5bb0: 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20  ]....        if 
5bc0: 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 66  {[file exists $f
5bd0: 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b  ileName]} then {
5be0: 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ..          retu
5bf0: 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20 20  rn true..       
5c00: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65   }....        se
5c10: 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65  t fileName [file
5c20: 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c   nativename [fil
5c30: 65 20 6a 6f 69 6e 20 24 64 69 72 65 63 74 6f 72  e join $director
5c40: 79 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  y \..           
5c50: 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 5d 5d   $fileNameOnly]]
5c60: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b  ....        if {
5c70: 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 66 69  [file exists $fi
5c80: 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d  leName]} then {.
5c90: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
5ca0: 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20 20 20  n true..        
5cb0: 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  }..      }....  
5cc0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
5cd0: 4f 54 45 3a 20 4f 6e 65 20 6f 72 20 6d 6f 72 65  OTE: One or more
5ce0: 20 6e 61 74 69 76 65 20 63 6f 6d 70 6f 6e 65 6e   native componen
5cf0: 74 73 20 6e 65 65 64 65 64 20 62 79 20 53 79 73  ts needed by Sys
5d00: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 0d  tem.Data.SQLite.
5d10: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61  .      #       a
5d20: 72 65 20 6d 69 73 73 69 6e 67 2e 0d 0a 20 20 20  re missing...   
5d30: 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75     #..      retu
5d40: 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20 7d 0d  rn false..    }.
5d50: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 69 73 52  ....    proc isR
5d60: 65 6c 65 61 73 65 41 76 61 69 6c 61 62 6c 65 20  eleaseAvailable 
5d70: 7b 20 64 69 72 65 63 74 6f 72 79 20 7b 76 61 72  { directory {var
5d80: 4e 61 6d 65 20 22 22 7d 20 7d 20 7b 0d 0a 20 20  Name ""} } {..  
5d90: 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
5da0: 6c 65 6e 67 74 68 20 24 76 61 72 4e 61 6d 65 5d  length $varName]
5db0: 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
5dc0: 20 20 20 20 20 20 75 70 76 61 72 20 31 20 24 76        upvar 1 $v
5dd0: 61 72 4e 61 6d 65 20 24 76 61 72 4e 61 6d 65 0d  arName $varName.
5de0: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
5df0: 20 20 72 65 74 75 72 6e 20 5b 69 73 42 75 69 6c    return [isBuil
5e00: 64 41 76 61 69 6c 61 62 6c 65 20 22 22 20 24 64  dAvailable "" $d
5e10: 69 72 65 63 74 6f 72 79 20 24 76 61 72 4e 61 6d  irectory $varNam
5e20: 65 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  e]..    }.....  
5e30: 20 20 70 72 6f 63 20 6a 6f 69 6e 42 75 69 6c 64    proc joinBuild
5e40: 44 69 72 65 63 74 6f 72 79 20 7b 20 6e 61 74 69  Directory { nati
5e50: 76 65 20 70 61 74 68 20 79 65 61 72 20 70 6c 61  ve path year pla
5e60: 74 66 6f 72 6d 20 63 6f 6e 66 69 67 75 72 61 74  tform configurat
5e70: 69 6f 6e 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23  ion } {..      #
5e80: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
5e90: 46 69 67 75 72 65 20 6f 75 74 20 61 6e 64 20 74  Figure out and t
5ea0: 68 65 6e 20 72 65 74 75 72 6e 20 74 68 65 20 66  hen return the f
5eb0: 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 20 70  ully qualified p
5ec0: 61 74 68 20 74 6f 20 74 68 65 20 62 75 69 6c 64  ath to the build
5ed0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
5ee0: 64 69 72 65 63 74 6f 72 79 20 62 61 73 65 64 20  directory based 
5ef0: 6f 6e 20 61 6c 6c 20 74 68 65 20 61 72 67 75 6d  on all the argum
5f00: 65 6e 74 73 20 70 72 6f 76 69 64 65 64 20 62 79  ents provided by
5f10: 20 6f 75 72 20 63 61 6c 6c 65 72 2e 0d 0a 20 20   our caller...  
5f20: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
5f30: 7b 24 6e 61 74 69 76 65 7d 20 74 68 65 6e 20 7b  {$native} then {
5f40: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
5f50: 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 70 61 74   [file join $pat
5f60: 68 20 62 69 6e 20 24 79 65 61 72 20 24 70 6c 61  h bin $year $pla
5f70: 74 66 6f 72 6d 20 24 63 6f 6e 66 69 67 75 72 61  tform $configura
5f80: 74 69 6f 6e 5d 0d 0a 20 20 20 20 20 20 7d 20 65  tion]..      } e
5f90: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 72  lse {..        r
5fa0: 65 74 75 72 6e 20 5b 66 69 6c 65 20 6a 6f 69 6e  eturn [file join
5fb0: 20 24 70 61 74 68 20 62 69 6e 20 24 79 65 61 72   $path bin $year
5fc0: 20 24 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20   $configuration 
5fd0: 62 69 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  bin]..      }.. 
5fe0: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
5ff0: 63 20 67 65 74 42 75 69 6c 64 44 69 72 65 63 74  c getBuildDirect
6000: 6f 72 79 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20  ory {} {..      
6010: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
6020: 20 53 65 65 20 69 66 20 74 68 65 20 22 6e 61 74   See if the "nat
6030: 69 76 65 22 20 72 75 6e 74 69 6d 65 20 6f 70 74  ive" runtime opt
6040: 69 6f 6e 20 68 61 73 20 62 65 65 6e 20 73 65 74  ion has been set
6050: 2e 20 20 49 66 20 73 6f 2c 20 75 73 65 20 74 68  .  If so, use th
6060: 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
6070: 20 64 69 72 65 63 74 6f 72 79 20 66 6f 72 20 74   directory for t
6080: 68 65 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73  he mixed-mode as
6090: 73 65 6d 62 6c 79 20 28 61 2e 6b 2e 61 2e 20 74  sembly (a.k.a. t
60a0: 68 65 20 6e 61 74 69 76 65 20 69 6e 74 65 72 6f  he native intero
60b0: 70 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  p..      #      
60c0: 20 61 73 73 65 6d 62 6c 79 29 2e 20 20 54 6f 20   assembly).  To 
60d0: 65 6e 61 62 6c 65 20 74 68 69 73 20 6f 70 74 69  enable this opti
60e0: 6f 6e 20 76 69 61 20 74 68 65 20 63 6f 6d 6d 61  on via the comma
60f0: 6e 64 20 6c 69 6e 65 2c 20 65 6e 74 65 72 20 61  nd line, enter a
6100: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
6110: 63 6f 6d 6d 61 6e 64 20 73 69 6d 69 6c 61 72 20  command similar 
6120: 74 6f 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f  to one of the fo
6130: 6c 6c 6f 77 69 6e 67 20 28 61 6c 6c 20 6f 6e 20  llowing (all on 
6140: 6f 6e 65 20 6c 69 6e 65 29 3a 0d 0a 20 20 20 20  one line):..    
6150: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 20 20 20    #..      #    
6160: 20 20 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78     EagleShell.ex
6170: 65 20 2d 69 6e 69 74 69 61 6c 69 7a 65 20 2d 72  e -initialize -r
6180: 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 6e 61 74  untimeOption nat
6190: 69 76 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ive..      #    
61a0: 20 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70 61 74       -file .\pat
61b0: 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a  h\to\all.eagle..
61c0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
61d0: 20 20 20 20 20 20 20 54 6f 20 65 6e 61 62 6c 65         To enable
61e0: 20 74 68 69 73 20 6f 70 74 69 6f 6e 20 76 69 61   this option via
61f0: 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e   the command lin
6200: 65 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 22  e prior to the "
6210: 62 65 74 61 20 31 36 22 0d 0a 20 20 20 20 20 20  beta 16"..      
6220: 23 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 20  #       release 
6230: 6f 66 20 45 61 67 6c 65 2c 20 74 68 65 20 66 6f  of Eagle, the fo
6240: 6c 6c 6f 77 69 6e 67 20 63 6f 6d 6d 61 6e 64 20  llowing command 
6250: 6d 75 73 74 20 62 65 20 75 73 65 64 20 69 6e 73  must be used ins
6260: 74 65 61 64 0d 0a 20 20 20 20 20 20 23 20 20 20  tead..      #   
6270: 20 20 20 20 28 61 6c 73 6f 20 61 6c 6c 20 6f 6e      (also all on
6280: 20 6f 6e 65 20 6c 69 6e 65 29 3a 0d 0a 20 20 20   one line):..   
6290: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 20 20     #..      #   
62a0: 20 20 20 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65      EagleShell.e
62b0: 78 65 20 2d 69 6e 69 74 69 61 6c 69 7a 65 20 2d  xe -initialize -
62c0: 70 6f 73 74 49 6e 69 74 69 61 6c 69 7a 65 0d 0a  postInitialize..
62d0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20        #         
62e0: 22 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 49  "object invoke I
62f0: 6e 74 65 72 70 72 65 74 65 72 2e 47 65 74 41 63  nterpreter.GetAc
6300: 74 69 76 65 20 41 64 64 52 75 6e 74 69 6d 65 4f  tive AddRuntimeO
6310: 70 74 69 6f 6e 20 6e 61 74 69 76 65 22 0d 0a 20  ption native".. 
6320: 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20 2d       #         -
6330: 66 69 6c 65 20 2e 5c 70 61 74 68 5c 74 6f 5c 61  file .\path\to\a
6340: 6c 6c 2e 65 61 67 6c 65 0d 0a 20 20 20 20 20 20  ll.eagle..      
6350: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e  #..      if {[in
6360: 66 6f 20 65 78 69 73 74 73 20 3a 3a 62 75 69 6c  fo exists ::buil
6370: 64 5f 64 69 72 65 63 74 6f 72 79 5d 20 26 26 20  d_directory] && 
6380: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74  \..          [st
6390: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 62  ring length $::b
63a0: 75 69 6c 64 5f 64 69 72 65 63 74 6f 72 79 5d 20  uild_directory] 
63b0: 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
63c0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
63d0: 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c 6f 63 61  # NOTE: The loca
63e0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 62 75 69 6c  tion of the buil
63f0: 64 20 64 69 72 65 63 74 6f 72 79 20 68 61 73 20  d directory has 
6400: 62 65 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b  been overridden;
6410: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
6420: 20 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65    therefore, use
6430: 20 69 74 20 76 65 72 62 61 74 69 6d 2e 0d 0a 20   it verbatim... 
6440: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
6450: 20 20 72 65 74 75 72 6e 20 24 3a 3a 62 75 69 6c    return $::buil
6460: 64 5f 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20  d_directory..   
6470: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
6480: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
6490: 23 20 4e 4f 54 45 3a 20 49 66 20 74 68 65 20 22  # NOTE: If the "
64a0: 6e 61 74 69 76 65 22 20 72 75 6e 74 69 6d 65 20  native" runtime 
64b0: 6f 70 74 69 6f 6e 20 69 73 20 73 65 74 2c 20 74  option is set, t
64c0: 68 65 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73  he mixed-mode as
64d0: 73 65 6d 62 6c 79 0d 0a 20 20 20 20 20 20 20 20  sembly..        
64e0: 23 20 20 20 20 20 20 20 69 73 20 62 65 69 6e 67  #       is being
64f0: 20 74 65 73 74 65 64 2e 20 20 49 6e 20 74 68 61   tested.  In tha
6500: 74 20 63 61 73 65 2c 20 74 68 65 20 70 61 74 68  t case, the path
6510: 20 74 6f 20 74 68 65 20 62 75 69 6c 64 20 64 69   to the build di
6520: 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 20  rectory..       
6530: 20 23 20 20 20 20 20 20 20 77 69 6c 6c 20 63 6f   #       will co
6540: 6e 74 61 69 6e 20 74 68 65 20 70 6c 61 74 66 6f  ntain the platfo
6550: 72 6d 20 6e 61 6d 65 20 61 6e 64 20 61 6c 6c 20  rm name and all 
6560: 74 68 65 20 62 69 6e 61 72 69 65 73 20 75 6e 64  the binaries und
6570: 65 72 20 74 65 73 74 0d 0a 20 20 20 20 20 20 20  er test..       
6580: 20 23 20 20 20 20 20 20 20 73 68 6f 75 6c 64 20   #       should 
6590: 62 65 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68  be present in th
65a0: 61 74 20 64 69 72 65 63 74 6f 72 79 2e 20 20 49  at directory.  I
65b0: 66 20 74 68 65 20 22 6e 61 74 69 76 65 22 20 72  f the "native" r
65c0: 75 6e 74 69 6d 65 0d 0a 20 20 20 20 20 20 20 20  untime..        
65d0: 23 20 20 20 20 20 20 20 6f 70 74 69 6f 6e 20 69  #       option i
65e0: 73 20 6e 6f 74 20 73 65 74 2c 20 74 68 65 20 62  s not set, the b
65f0: 75 69 6c 64 20 64 69 72 65 63 74 6f 72 79 20 77  uild directory w
6600: 69 6c 6c 20 62 65 20 63 6f 6e 73 69 64 65 72 65  ill be considere
6610: 64 20 74 6f 20 62 65 0d 0a 20 20 20 20 20 20 20  d to be..       
6620: 20 23 20 20 20 20 20 20 20 22 70 6c 61 74 66 6f   #       "platfo
6630: 72 6d 2d 6e 65 75 74 72 61 6c 22 2c 20 77 69 74  rm-neutral", wit
6640: 68 20 74 68 65 20 6e 6f 74 61 62 6c 65 20 65 78  h the notable ex
6650: 63 65 70 74 69 6f 6e 20 6f 66 20 61 6e 79 20 6e  ception of any n
6660: 61 74 69 76 65 0d 0a 20 20 20 20 20 20 20 20 23  ative..        #
6670: 20 20 20 20 20 20 20 61 73 73 65 6d 62 6c 79 20         assembly 
6680: 28 65 2e 67 2e 20 22 53 51 4c 69 74 65 2e 49 6e  (e.g. "SQLite.In
6690: 74 65 72 6f 70 2e 64 6c 6c 22 29 20 63 6f 70 69  terop.dll") copi
66a0: 65 64 20 74 68 65 72 65 20 64 75 72 69 6e 67 20  ed there during 
66b0: 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  the..        #  
66c0: 20 20 20 20 20 62 75 69 6c 64 20 70 72 6f 63 65       build proce
66d0: 73 73 20 69 74 73 65 6c 66 2e 20 20 49 66 20 74  ss itself.  If t
66e0: 68 65 20 62 75 69 6c 64 20 70 72 6f 63 65 73 73  he build process
66f0: 20 73 6f 6d 65 68 6f 77 20 64 6f 65 73 20 6e 6f   somehow does no
6700: 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  t..        #    
6710: 20 20 20 63 6f 70 79 20 74 68 65 20 6e 61 74 69     copy the nati
6720: 76 65 20 61 73 73 65 6d 62 6c 79 20 66 6f 72 20  ve assembly for 
6730: 74 68 69 73 20 70 6c 61 74 66 6f 72 6d 2c 20 6d  this platform, m
6740: 6f 73 74 20 6f 66 20 74 68 65 20 74 65 73 74 73  ost of the tests
6750: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
6760: 20 20 69 6e 20 74 68 65 20 73 75 69 74 65 20 77    in the suite w
6770: 69 6c 6c 20 73 69 6d 70 6c 79 20 62 65 20 73 6b  ill simply be sk
6780: 69 70 70 65 64 2e 20 20 47 65 6e 65 72 61 6c 6c  ipped.  Generall
6790: 79 20 73 70 65 61 6b 69 6e 67 2c 20 74 68 65 72  y speaking, ther
67a0: 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
67b0: 20 20 20 61 72 65 20 74 77 6f 20 77 61 79 73 20     are two ways 
67c0: 74 6f 20 62 75 69 6c 64 20 74 68 65 20 62 69 6e  to build the bin
67d0: 61 72 69 65 73 20 77 68 65 6e 20 70 72 65 70 61  aries when prepa
67e0: 72 69 6e 67 20 74 6f 20 72 75 6e 20 74 68 65 0d  ring to run the.
67f0: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
6800: 20 74 65 73 74 20 73 75 69 74 65 3a 0d 0a 20 20   test suite:..  
6810: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
6820: 20 23 20 20 20 20 20 20 20 31 2e 20 42 75 69 6c   #       1. Buil
6830: 64 20 74 68 65 20 73 65 70 61 72 61 74 65 20 6d  d the separate m
6840: 61 6e 61 67 65 64 20 61 6e 64 20 6e 61 74 69 76  anaged and nativ
6850: 65 20 61 73 73 65 6d 62 6c 69 65 73 20 75 73 69  e assemblies usi
6860: 6e 67 20 73 6f 6d 65 0d 0a 20 20 20 20 20 20 20  ng some..       
6870: 20 23 20 20 20 20 20 20 20 20 20 20 63 6f 6d 6d   #          comm
6880: 61 6e 64 73 20 73 69 6d 69 6c 61 72 20 74 6f 3a  ands similar to:
6890: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
68a0: 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20 20       #          
68b0: 62 75 69 6c 64 2e 62 61 74 20 24 7b 43 6f 6e 66  build.bat ${Conf
68c0: 69 67 75 72 61 74 69 6f 6e 7d 4d 61 6e 61 67 65  iguration}Manage
68d0: 64 4f 6e 6c 79 20 24 7b 50 6c 61 74 66 6f 72 6d  dOnly ${Platform
68e0: 7d 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  }..        #    
68f0: 20 20 20 20 20 20 62 75 69 6c 64 2e 62 61 74 20        build.bat 
6900: 24 7b 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 7d  ${Configuration}
6910: 4e 61 74 69 76 65 4f 6e 6c 79 20 24 7b 50 6c 61  NativeOnly ${Pla
6920: 74 66 6f 72 6d 7d 0d 0a 20 20 20 20 20 20 20 20  tform}..        
6930: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  #..        #    
6940: 20 20 20 20 20 20 57 68 65 72 65 20 24 7b 43 6f        Where ${Co
6950: 6e 66 69 67 75 72 61 74 69 6f 6e 7d 20 69 73 20  nfiguration} is 
6960: 65 69 74 68 65 72 20 22 44 65 62 75 67 22 20 6f  either "Debug" o
6970: 72 20 22 52 65 6c 65 61 73 65 22 20 61 6e 64 0d  r "Release" and.
6980: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
6990: 20 20 20 20 24 7b 50 6c 61 74 66 6f 72 6d 7d 20      ${Platform} 
69a0: 69 73 20 65 69 74 68 65 72 20 22 57 69 6e 33 32  is either "Win32
69b0: 22 20 6f 72 20 22 78 36 34 22 2e 0d 0a 20 20 20  " or "x64"...   
69c0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
69d0: 23 20 20 20 20 20 20 20 32 2e 20 42 75 69 6c 64  #       2. Build
69e0: 20 74 68 65 20 6d 69 78 65 64 2d 6d 6f 64 65 20   the mixed-mode 
69f0: 61 73 73 65 6d 62 6c 79 20 75 73 69 6e 67 20 61  assembly using a
6a00: 20 63 6f 6d 6d 61 6e 64 20 73 69 6d 69 6c 61 72   command similar
6a10: 20 74 6f 3a 0d 0a 20 20 20 20 20 20 20 20 23 0d   to:..        #.
6a20: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
6a30: 20 20 20 20 62 75 69 6c 64 2e 62 61 74 20 24 7b      build.bat ${
6a40: 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 7d 20 24  Configuration} $
6a50: 7b 50 6c 61 74 66 6f 72 6d 7d 0d 0a 20 20 20 20  {Platform}..    
6a60: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
6a70: 20 20 20 20 20 20 20 20 20 20 57 68 65 72 65 20            Where 
6a80: 24 7b 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 7d  ${Configuration}
6a90: 20 69 73 20 65 69 74 68 65 72 20 22 44 65 62 75   is either "Debu
6aa0: 67 22 20 6f 72 20 22 52 65 6c 65 61 73 65 22 20  g" or "Release" 
6ab0: 61 6e 64 0d 0a 20 20 20 20 20 20 20 20 23 20 20  and..        #  
6ac0: 20 20 20 20 20 20 20 20 24 7b 50 6c 61 74 66 6f          ${Platfo
6ad0: 72 6d 7d 20 69 73 20 65 69 74 68 65 72 20 22 57  rm} is either "W
6ae0: 69 6e 33 32 22 20 6f 72 20 22 78 36 34 22 2e 20  in32" or "x64". 
6af0: 20 49 66 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64   If this command
6b00: 20 69 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20   is..        #  
6b10: 20 20 20 20 20 20 20 20 75 73 65 64 2c 20 76 61          used, va
6b20: 72 69 6f 75 73 20 74 65 73 74 73 20 74 68 61 74  rious tests that
6b30: 20 72 65 71 75 69 72 65 20 73 75 70 70 6c 65 6d   require supplem
6b40: 65 6e 74 61 72 79 20 6d 61 6e 61 67 65 64 0d 0a  entary managed..
6b50: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
6b60: 20 20 20 61 73 73 65 6d 62 6c 69 65 73 20 28 65     assemblies (e
6b70: 2e 67 2e 20 4c 49 4e 51 29 20 6d 61 79 20 62 65  .g. LINQ) may be
6b80: 20 73 6b 69 70 70 65 64 20 75 6e 6c 65 73 73 20   skipped unless 
6b90: 74 68 6f 73 65 20 62 69 6e 61 72 69 65 73 0d 0a  those binaries..
6ba0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
6bb0: 20 20 20 61 72 65 20 73 75 62 73 65 71 75 65 6e     are subsequen
6bc0: 74 6c 79 20 63 6f 70 69 65 64 20 69 6e 74 6f 20  tly copied into 
6bd0: 74 68 65 20 63 6f 72 72 65 63 74 20 64 69 72 65  the correct dire
6be0: 63 74 6f 72 79 20 28 69 2e 65 2e 20 62 79 0d 0a  ctory (i.e. by..
6bf0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
6c00: 20 20 20 22 74 65 73 74 5f 61 6c 6c 2e 62 61 74     "test_all.bat
6c10: 22 29 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ")...        #..
6c20: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
6c30: 4e 6f 74 65 20 74 68 61 74 20 61 6c 6c 20 6f 66  Note that all of
6c40: 20 74 68 65 20 62 75 69 6c 64 20 63 6f 6d 6d 61   the build comma
6c50: 6e 64 73 20 61 62 6f 76 65 20 77 69 6c 6c 20 64  nds above will d
6c60: 65 66 61 75 6c 74 20 74 6f 20 75 73 69 6e 67 0d  efault to using.
6c70: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
6c80: 20 74 68 65 20 6c 61 74 65 73 74 20 76 65 72 73   the latest vers
6c90: 69 6f 6e 20 6f 66 20 4d 53 42 75 69 6c 64 20 61  ion of MSBuild a
6ca0: 76 61 69 6c 61 62 6c 65 20 61 6e 64 20 74 68 65  vailable and the
6cb0: 20 22 74 65 73 74 5f 79 65 61 72 22 20 6d 61 79   "test_year" may
6cc0: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
6cd0: 20 20 6e 65 65 64 20 74 6f 20 62 65 20 61 64 6a    need to be adj
6ce0: 75 73 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c  usted accordingl
6cf0: 79 20 74 6f 20 61 63 74 75 61 6c 6c 79 20 72 75  y to actually ru
6d00: 6e 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65  n the test suite
6d10: 2e 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  ...        #    
6d20: 20 20 20 52 65 66 65 72 20 74 6f 20 74 68 65 20     Refer to the 
6d30: 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 5b 67 65 74  comments in [get
6d40: 42 75 69 6c 64 59 65 61 72 5d 20 66 6f 72 20 6d  BuildYear] for m
6d50: 6f 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ore information 
6d60: 6f 6e 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  on..        #   
6d70: 20 20 20 20 68 6f 77 20 74 6f 20 73 65 74 20 74      how to set t
6d80: 68 69 73 20 76 61 72 69 61 62 6c 65 2e 0d 0a 20  his variable... 
6d90: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
6da0: 20 20 73 65 74 20 6e 61 74 69 76 65 20 5b 68 61    set native [ha
6db0: 73 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 6e  sRuntimeOption n
6dc0: 61 74 69 76 65 5d 0d 0a 0d 0a 20 20 20 20 20 20  ative]....      
6dd0: 20 20 72 65 74 75 72 6e 20 5b 6a 6f 69 6e 42 75    return [joinBu
6de0: 69 6c 64 44 69 72 65 63 74 6f 72 79 20 24 6e 61  ildDirectory $na
6df0: 74 69 76 65 20 5b 67 65 74 42 75 69 6c 64 42 61  tive [getBuildBa
6e00: 73 65 44 69 72 65 63 74 6f 72 79 5d 20 5c 0d 0a  seDirectory] \..
6e10: 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74              [get
6e20: 42 75 69 6c 64 59 65 61 72 5d 20 5b 67 65 74 42  BuildYear] [getB
6e30: 75 69 6c 64 50 6c 61 74 66 6f 72 6d 20 24 6e 61  uildPlatform $na
6e40: 74 69 76 65 5d 20 5b 67 65 74 42 75 69 6c 64 43  tive] [getBuildC
6e50: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 5d 5d 0d 0a  onfiguration]]..
6e60: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
6e70: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 52  ...    proc getR
6e80: 65 6c 65 61 73 65 56 65 72 73 69 6f 6e 20 7b 7d  eleaseVersion {}
6e90: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
6ea0: 20 20 20 23 20 4e 4f 54 45 3a 20 46 69 67 75 72     # NOTE: Figur
6eb0: 65 20 6f 75 74 20 74 68 65 20 72 65 6c 65 61 73  e out the releas
6ec0: 65 20 76 65 72 73 69 6f 6e 20 66 6f 72 20 75 73  e version for us
6ed0: 65 20 77 69 74 68 20 74 68 65 20 62 75 69 6c 64  e with the build
6ee0: 20 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20   directory..    
6ef0: 20 20 23 20 20 20 20 20 20 20 77 68 65 6e 20 63    #       when c
6f00: 68 65 63 6b 69 6e 67 20 66 6f 72 20 61 76 61 69  hecking for avai
6f10: 6c 61 62 6c 65 20 72 65 6c 65 61 73 65 73 2e 0d  lable releases..
6f20: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
6f30: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
6f40: 20 3a 3a 72 65 6c 65 61 73 65 5f 76 65 72 73 69   ::release_versi
6f50: 6f 6e 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  on] && \..      
6f60: 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67      [string leng
6f70: 74 68 20 24 3a 3a 72 65 6c 65 61 73 65 5f 76 65  th $::release_ve
6f80: 72 73 69 6f 6e 5d 20 3e 20 30 7d 20 74 68 65 6e  rsion] > 0} then
6f90: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
6fa0: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54         # NOTE: T
6fb0: 68 65 20 72 65 6c 65 61 73 65 20 76 65 72 73 69  he release versi
6fc0: 6f 6e 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72  on has been over
6fd0: 72 69 64 64 65 6e 3b 20 74 68 65 72 65 66 6f 72  ridden; therefor
6fe0: 65 2c 20 75 73 65 20 69 74 0d 0a 20 20 20 20 20  e, use it..     
6ff0: 20 20 20 23 20 20 20 20 20 20 20 76 65 72 62 61     #       verba
7000: 74 69 6d 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  tim...        #.
7010: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
7020: 24 3a 3a 72 65 6c 65 61 73 65 5f 76 65 72 73 69  $::release_versi
7030: 6f 6e 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  on..      } else
7040: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
7050: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e         # NOTE: N
7060: 6f 20 72 65 6c 65 61 73 65 20 76 65 72 73 69 6f  o release versio
7070: 6e 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20  n is available, 
7080: 72 65 74 75 72 6e 20 61 6e 20 65 6d 70 74 79 20  return an empty 
7090: 73 74 72 69 6e 67 2e 0d 0a 20 20 20 20 20 20 20  string...       
70a0: 20 23 20 20 20 20 20 20 20 49 74 20 69 73 20 69   #       It is i
70b0: 6d 70 6f 72 74 61 6e 74 20 74 6f 20 72 65 74 75  mportant to retu
70c0: 72 6e 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69  rn an empty stri
70d0: 6e 67 20 68 65 72 65 20 62 65 63 61 75 73 65 20  ng here because 
70e0: 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  the..        #  
70f0: 20 20 20 20 20 72 65 73 75 6c 74 20 6f 66 20 74       result of t
7100: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 6d 61  his procedure ma
7110: 79 20 62 65 20 75 73 65 64 20 77 69 74 68 20 5b  y be used with [
7120: 66 69 6c 65 20 6a 6f 69 6e 5d 2e 0d 0a 20 20 20  file join]...   
7130: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
7140: 72 65 74 75 72 6e 20 22 22 0d 0a 20 20 20 20 20  return ""..     
7150: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
7160: 20 20 70 72 6f 63 20 67 65 74 42 75 69 6c 64 46    proc getBuildF
7170: 69 6c 65 4e 61 6d 65 20 7b 20 66 69 6c 65 4e 61  ileName { fileNa
7180: 6d 65 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d  me {platform ""}
7190: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20   } {..      #.. 
71a0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 74       # NOTE: Ret
71b0: 75 72 6e 73 20 74 68 65 20 73 70 65 63 69 66 69  urns the specifi
71c0: 65 64 20 66 69 6c 65 20 6e 61 6d 65 20 61 73 20  ed file name as 
71d0: 69 66 20 69 74 20 77 65 72 65 20 6c 6f 63 61 74  if it were locat
71e0: 65 64 20 69 6e 20 74 68 65 0d 0a 20 20 20 20 20  ed in the..     
71f0: 20 23 20 20 20 20 20 20 20 62 75 69 6c 64 20 64   #       build d
7200: 69 72 65 63 74 6f 72 79 2c 20 64 69 73 63 61 72  irectory, discar
7210: 64 69 6e 67 20 61 6e 79 20 64 69 72 65 63 74 6f  ding any directo
7220: 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 70  ry information p
7230: 72 65 73 65 6e 74 0d 0a 20 20 20 20 20 20 23 20  resent..      # 
7240: 20 20 20 20 20 20 69 6e 20 74 68 65 20 66 69 6c        in the fil
7250: 65 20 6e 61 6d 65 20 61 73 20 70 72 6f 76 69 64  e name as provid
7260: 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72  ed by our caller
7270: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
7280: 20 20 73 65 74 20 72 65 73 75 6c 74 20 5b 66 69    set result [fi
7290: 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5c 0d  le nativename \.
72a0: 0a 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65  .          [file
72b0: 20 6a 6f 69 6e 20 5b 67 65 74 42 75 69 6c 64 44   join [getBuildD
72c0: 69 72 65 63 74 6f 72 79 5d 20 24 70 6c 61 74 66  irectory] $platf
72d0: 6f 72 6d 20 5b 66 69 6c 65 20 74 61 69 6c 20 24  orm [file tail $
72e0: 66 69 6c 65 4e 61 6d 65 5d 5d 5d 0d 0a 0d 0a 20  fileName]]].... 
72f0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
7300: 48 41 43 4b 3a 20 57 68 65 6e 20 72 75 6e 6e 69  HACK: When runni
7310: 6e 67 20 6f 6e 20 57 6f 57 36 34 2c 20 61 73 73  ng on WoW64, ass
7320: 75 6d 65 20 74 68 65 20 74 65 73 74 20 65 78 65  ume the test exe
7330: 63 75 74 61 62 6c 65 73 20 61 72 65 20 70 72 65  cutables are pre
7340: 73 65 6e 74 0d 0a 20 20 20 20 20 20 23 20 20 20  sent..      #   
7350: 20 20 20 20 77 69 74 68 20 74 68 65 20 22 33 32      with the "32
7360: 22 20 73 75 66 66 69 78 20 6f 6e 20 74 68 65 6d  " suffix on them
7370: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
7380: 20 20 69 66 20 7b 5b 69 73 52 75 6e 6e 69 6e 67    if {[isRunning
7390: 57 6f 57 36 34 5d 20 26 26 20 5b 66 69 6c 65 20  WoW64] && [file 
73a0: 65 78 74 65 6e 73 69 6f 6e 20 24 72 65 73 75 6c  extension $resul
73b0: 74 5d 20 65 71 20 22 2e 65 78 65 22 7d 20 74 68  t] eq ".exe"} th
73c0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65  en {..        se
73d0: 74 20 72 65 73 75 6c 74 20 5b 61 70 70 65 6e 64  t result [append
73e0: 41 72 67 73 20 5b 66 69 6c 65 20 72 6f 6f 74 6e  Args [file rootn
73f0: 61 6d 65 20 24 72 65 73 75 6c 74 5d 20 33 32 2e  ame $result] 32.
7400: 65 78 65 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  exe]..      }...
7410: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 72  .      return $r
7420: 65 73 75 6c 74 0d 0a 20 20 20 20 7d 0d 0a 0c 0d  esult..    }....
7430: 0a 20 20 20 20 70 72 6f 63 20 67 65 74 45 78 74  .    proc getExt
7440: 65 72 6e 61 6c 44 69 72 65 63 74 6f 72 79 20 7b  ernalDirectory {
7450: 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
7460: 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73      # NOTE: This
7470: 20 70 72 6f 63 65 64 75 72 65 20 72 65 74 75 72   procedure retur
7480: 6e 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  ns the directory
7490: 20 77 68 65 72 65 20 74 68 65 20 65 78 74 65 72   where the exter
74a0: 6e 61 6c 20 62 69 6e 61 72 79 0d 0a 20 20 20 20  nal binary..    
74b0: 20 20 23 20 20 20 20 20 20 20 66 69 6c 65 73 20    #       files 
74c0: 61 72 65 20 6c 6f 63 61 74 65 64 2e 0d 0a 20 20  are located...  
74d0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74      #..      ret
74e0: 75 72 6e 20 5b 66 69 6c 65 20 6e 61 74 69 76 65  urn [file native
74f0: 6e 61 6d 65 20 5b 66 69 6c 65 20 64 69 72 6e 61  name [file dirna
7500: 6d 65 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65  me [file dirname
7510: 20 5b 69 6e 66 6f 20 62 69 6e 61 72 79 5d 5d 5d   [info binary]]]
7520: 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  ]..    }.....   
7530: 20 70 72 6f 63 20 67 65 74 42 69 6e 61 72 79 44   proc getBinaryD
7540: 69 72 65 63 74 6f 72 79 20 7b 7d 20 7b 0d 0a 20  irectory {} {.. 
7550: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
7560: 4e 4f 54 45 3a 20 54 68 69 73 20 70 72 6f 63 65  NOTE: This proce
7570: 64 75 72 65 20 72 65 74 75 72 6e 73 20 74 68 65  dure returns the
7580: 20 64 69 72 65 63 74 6f 72 79 20 77 68 65 72 65   directory where
7590: 20 74 68 65 20 74 65 73 74 20 61 70 70 6c 69 63   the test applic
75a0: 61 74 69 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20  ation..      #  
75b0: 20 20 20 20 20 69 74 73 65 6c 66 20 28 69 2e 65       itself (i.e
75c0: 2e 20 74 68 65 20 45 61 67 6c 65 20 73 68 65 6c  . the Eagle shel
75d0: 6c 29 20 69 73 20 6c 6f 63 61 74 65 64 2e 20 20  l) is located.  
75e0: 54 68 69 73 20 77 69 6c 6c 20 62 65 20 75 73 65  This will be use
75f0: 64 20 61 73 0d 0a 20 20 20 20 20 20 23 20 20 20  d as..      #   
7600: 20 20 20 20 74 68 65 20 64 65 73 74 69 6e 61 74      the destinat
7610: 69 6f 6e 20 66 6f 72 20 74 68 65 20 63 6f 70 69  ion for the copi
7620: 65 64 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  ed System.Data.S
7630: 51 4c 69 74 65 20 6e 61 74 69 76 65 20 61 6e 64  QLite native and
7640: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
7650: 6d 61 6e 61 67 65 64 20 61 73 73 65 6d 62 6c 69  managed assembli
7660: 65 73 20 28 69 2e 65 2e 20 62 65 63 61 75 73 65  es (i.e. because
7670: 20 74 68 69 73 20 69 73 20 6f 6e 65 20 6f 66 20   this is one of 
7680: 74 68 65 20 66 65 77 20 70 6c 61 63 65 73 0d 0a  the few places..
7690: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 77 68        #       wh
76a0: 65 72 65 20 74 68 65 20 43 4c 52 20 77 69 6c 6c  ere the CLR will
76b0: 20 61 63 74 75 61 6c 6c 79 20 66 69 6e 64 20 61   actually find a
76c0: 6e 64 20 6c 6f 61 64 20 74 68 65 6d 20 70 72 6f  nd load them pro
76d0: 70 65 72 6c 79 29 2e 0d 0a 20 20 20 20 20 20 23  perly)...      #
76e0: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66  ..      if {[inf
76f0: 6f 20 65 78 69 73 74 73 20 3a 3a 62 69 6e 61 72  o exists ::binar
7700: 79 5f 64 69 72 65 63 74 6f 72 79 5d 20 26 26 20  y_directory] && 
7710: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74  \..          [st
7720: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 62  ring length $::b
7730: 69 6e 61 72 79 5f 64 69 72 65 63 74 6f 72 79 5d  inary_directory]
7740: 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
7750: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
7760: 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c 6f 63   # NOTE: The loc
7770: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 62 69 6e  ation of the bin
7780: 61 72 79 20 64 69 72 65 63 74 6f 72 79 20 68 61  ary directory ha
7790: 73 20 62 65 65 6e 20 6f 76 65 72 72 69 64 64 65  s been overridde
77a0: 6e 3b 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  n;..        #   
77b0: 20 20 20 20 74 68 65 72 65 66 6f 72 65 2c 20 75      therefore, u
77c0: 73 65 20 69 74 20 76 65 72 62 61 74 69 6d 2e 0d  se it verbatim..
77d0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
77e0: 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 62 69      return $::bi
77f0: 6e 61 72 79 5f 64 69 72 65 63 74 6f 72 79 0d 0a  nary_directory..
7800: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
7810: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b          return [
7820: 69 6e 66 6f 20 62 69 6e 61 72 79 5d 0d 0a 20 20  info binary]..  
7830: 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
7840: 0a 20 20 20 20 70 72 6f 63 20 67 65 74 45 78 74  .    proc getExt
7850: 65 72 6e 61 6c 46 69 6c 65 4e 61 6d 65 20 7b 20  ernalFileName { 
7860: 66 69 6c 65 4e 61 6d 65 20 7d 20 7b 0d 0a 20 20  fileName } {..  
7870: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
7880: 4f 54 45 3a 20 52 65 74 75 72 6e 73 20 74 68 65  OTE: Returns the
7890: 20 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 20   specified file 
78a0: 6e 61 6d 65 20 61 73 20 69 66 20 69 74 20 77 65  name as if it we
78b0: 72 65 20 6c 6f 63 61 74 65 64 20 69 6e 20 74 68  re located in th
78c0: 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
78d0: 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 74 61   directory conta
78e0: 69 6e 69 6e 67 20 74 68 65 20 65 78 74 65 72 6e  ining the extern
78f0: 61 6c 20 62 69 6e 61 72 69 65 73 2e 0d 0a 20 20  al binaries...  
7900: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74      #..      ret
7910: 75 72 6e 20 5b 66 69 6c 65 20 6e 61 74 69 76 65  urn [file native
7920: 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20  name [file join 
7930: 5b 67 65 74 45 78 74 65 72 6e 61 6c 44 69 72 65  [getExternalDire
7940: 63 74 6f 72 79 5d 20 24 66 69 6c 65 4e 61 6d 65  ctory] $fileName
7950: 5d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  ]]..    }.....  
7960: 20 20 70 72 6f 63 20 67 65 74 42 69 6e 61 72 79    proc getBinary
7970: 46 69 6c 65 4e 61 6d 65 20 7b 20 66 69 6c 65 4e  FileName { fileN
7980: 61 6d 65 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22  ame {platform ""
7990: 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a  } } {..      #..
79a0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65        # NOTE: Re
79b0: 74 75 72 6e 73 20 74 68 65 20 73 70 65 63 69 66  turns the specif
79c0: 69 65 64 20 66 69 6c 65 20 6e 61 6d 65 20 61 73  ied file name as
79d0: 20 69 66 20 69 74 20 77 65 72 65 20 6c 6f 63 61   if it were loca
79e0: 74 65 64 20 69 6e 20 74 68 65 0d 0a 20 20 20 20  ted in the..    
79f0: 20 20 23 20 20 20 20 20 20 20 62 69 6e 61 72 79    #       binary
7a00: 20 64 69 72 65 63 74 6f 72 79 2c 20 64 69 73 63   directory, disc
7a10: 61 72 64 69 6e 67 20 61 6e 79 20 64 69 72 65 63  arding any direc
7a20: 74 6f 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  tory information
7a30: 20 70 72 65 73 65 6e 74 0d 0a 20 20 20 20 20 20   present..      
7a40: 23 20 20 20 20 20 20 20 69 6e 20 74 68 65 20 66  #       in the f
7a50: 69 6c 65 20 6e 61 6d 65 20 61 73 20 70 72 6f 76  ile name as prov
7a60: 69 64 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c  ided by our call
7a70: 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  er...      #..  
7a80: 20 20 20 20 72 65 74 75 72 6e 20 5b 66 69 6c 65      return [file
7a90: 20 6e 61 74 69 76 65 6e 61 6d 65 20 5c 0d 0a 20   nativename \.. 
7aa0: 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 6a           [file j
7ab0: 6f 69 6e 20 5b 67 65 74 42 69 6e 61 72 79 44 69  oin [getBinaryDi
7ac0: 72 65 63 74 6f 72 79 5d 20 24 70 6c 61 74 66 6f  rectory] $platfo
7ad0: 72 6d 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66  rm [file tail $f
7ae0: 69 6c 65 4e 61 6d 65 5d 5d 5d 0d 0a 20 20 20 20  ileName]]]..    
7af0: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67  }.....    proc g
7b00: 65 74 43 6f 72 65 42 69 6e 61 72 79 46 69 6c 65  etCoreBinaryFile
7b10: 4e 61 6d 65 20 7b 20 7b 70 6c 61 74 66 6f 72 6d  Name { {platform
7b20: 20 22 22 7d 20 7b 73 74 61 6e 64 61 72 64 20 22   ""} {standard "
7b30: 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  "} } {..      #.
7b40: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52  .      # NOTE: R
7b50: 65 74 75 72 6e 73 20 74 68 65 20 66 75 6c 6c 20  eturns the full 
7b60: 70 61 74 68 20 66 6f 72 20 74 68 65 20 66 69 6c  path for the fil
7b70: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
7b80: 20 53 51 4c 69 74 65 20 63 6f 72 65 0d 0a 20 20   SQLite core..  
7b90: 20 20 20 20 23 20 20 20 20 20 20 20 6e 61 74 69      #       nati
7ba0: 76 65 20 6c 69 62 72 61 72 79 20 63 6f 64 65 20  ve library code 
7bb0: 66 6f 72 20 74 68 69 73 20 70 6c 61 74 66 6f 72  for this platfor
7bc0: 6d 2e 20 20 46 69 72 73 74 2c 20 63 68 65 63 6b  m.  First, check
7bd0: 20 61 6e 64 20 73 65 65 20 69 66 0d 0a 20 20 20   and see if..   
7be0: 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20 53     #       the S
7bf0: 51 4c 69 74 65 20 63 6f 72 65 20 6e 61 74 69 76  QLite core nativ
7c00: 65 20 6c 69 62 72 61 72 79 20 68 61 73 20 61 6c  e library has al
7c10: 72 65 61 64 79 20 62 65 65 6e 20 6c 6f 61 64 65  ready been loade
7c20: 64 2e 20 20 4e 65 78 74 2c 0d 0a 20 20 20 20 20  d.  Next,..     
7c30: 20 23 20 20 20 20 20 20 20 66 61 6c 6c 62 61 63   #       fallbac
7c40: 6b 20 74 6f 20 77 68 61 74 20 74 68 65 20 66 75  k to what the fu
7c50: 6c 6c 20 70 61 74 68 20 73 68 6f 75 6c 64 20 62  ll path should b
7c60: 65 2c 20 62 61 73 65 64 20 6f 6e 20 77 68 65 74  e, based on whet
7c70: 68 65 72 20 74 68 65 0d 0a 20 20 20 20 20 20 23  her the..      #
7c80: 20 20 20 20 20 20 20 6d 69 78 65 64 2d 6d 6f 64         mixed-mod
7c90: 65 20 61 73 73 65 6d 62 6c 79 20 69 73 20 62 65  e assembly is be
7ca0: 69 6e 67 20 75 73 65 64 20 61 6e 64 20 74 68 65  ing used and the
7cb0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 63 75 72   name of the cur
7cc0: 72 65 6e 74 0d 0a 20 20 20 20 20 20 23 20 20 20  rent..      #   
7cd0: 20 20 20 20 70 6c 61 74 66 6f 72 6d 2e 0d 0a 20      platform... 
7ce0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
7cf0: 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
7d00: 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b      object invok
7d10: 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62  e -flags +NonPub
7d20: 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  lic \..         
7d30: 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53     System.Data.S
7d40: 51 4c 69 74 65 2e 55 6e 73 61 66 65 4e 61 74 69  QLite.UnsafeNati
7d50: 76 65 4d 65 74 68 6f 64 73 20 5f 53 51 4c 69 74  veMethods _SQLit
7d60: 65 4e 61 74 69 76 65 4d 6f 64 75 6c 65 46 69 6c  eNativeModuleFil
7d70: 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 7d 20 66  eName..      } f
7d80: 69 6c 65 4e 61 6d 65 5d 20 3d 3d 20 30 20 26 26  ileName] == 0 &&
7d90: 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20   [string length 
7da0: 24 66 69 6c 65 4e 61 6d 65 5d 20 3e 20 30 7d 20  $fileName] > 0} 
7db0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
7dc0: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
7dd0: 45 3a 20 54 68 65 20 53 51 4c 69 74 65 20 63 6f  E: The SQLite co
7de0: 72 65 20 6e 61 74 69 76 65 20 6c 69 62 72 61 72  re native librar
7df0: 79 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  y has already be
7e00: 65 6e 20 6c 6f 61 64 65 64 20 76 69 61 0d 0a 20  en loaded via.. 
7e10: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74         #       t
7e20: 68 65 20 6e 61 74 69 76 65 20 6c 69 62 72 61 72  he native librar
7e30: 79 20 70 72 65 2d 6c 6f 61 64 65 72 2e 20 20 52  y pre-loader.  R
7e40: 65 74 75 72 6e 20 74 68 61 74 20 66 69 6c 65 20  eturn that file 
7e50: 6e 61 6d 65 20 6e 6f 77 2e 0d 0a 20 20 20 20 20  name now...     
7e60: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65     #..        re
7e70: 74 75 72 6e 20 24 66 69 6c 65 4e 61 6d 65 0d 0a  turn $fileName..
7e80: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
7e90: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
7ea0: 3a 20 49 66 20 74 68 65 20 22 6e 61 74 69 76 65  : If the "native
7eb0: 22 20 72 75 6e 74 69 6d 65 20 6f 70 74 69 6f 6e  " runtime option
7ec0: 20 68 61 73 20 62 65 65 6e 20 73 65 74 2c 20 61   has been set, a
7ed0: 6c 77 61 79 73 20 72 65 74 75 72 6e 20 74 68 65  lways return the
7ee0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
7ef0: 66 69 6c 65 20 6e 61 6d 65 20 66 6f 72 20 74 68  file name for th
7f00: 65 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73  e mixed-mode ass
7f10: 65 6d 62 6c 79 2e 0d 0a 20 20 20 20 20 20 23 0d  embly...      #.
7f20: 0a 20 20 20 20 20 20 69 66 20 7b 5b 68 61 73 52  .      if {[hasR
7f30: 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 6e 61 74  untimeOption nat
7f40: 69 76 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ive]} then {..  
7f50: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
7f60: 20 23 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e 20   # NOTE: Return 
7f70: 74 68 65 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61  the mixed-mode a
7f80: 73 73 65 6d 62 6c 79 20 66 69 6c 65 20 6e 61 6d  ssembly file nam
7f90: 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  e...        #.. 
7fa0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 66         return [f
7fb0: 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5c  ile nativename \
7fc0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 66  ..            [f
7fd0: 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 42 69 6e  ile join [getBin
7fe0: 61 72 79 44 69 72 65 63 74 6f 72 79 5d 20 24 70  aryDirectory] $p
7ff0: 6c 61 74 66 6f 72 6d 20 53 79 73 74 65 6d 2e 44  latform System.D
8000: 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 5d 5d  ata.SQLite.dll]]
8010: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
8020: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
8030: 54 45 3a 20 41 72 65 20 77 65 20 61 74 74 65 6d  TE: Are we attem
8040: 70 74 69 6e 67 20 74 6f 20 61 75 74 6f 6d 61 74  pting to automat
8050: 69 63 61 6c 6c 79 20 64 65 74 65 63 74 20 77 68  ically detect wh
8060: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
8070: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
8080: 69 6e 74 65 72 6f 70 20 61 73 73 65 6d 62 6c 79  interop assembly
8090: 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 3f   should be used?
80a0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
80b0: 20 73 65 74 20 61 75 74 6f 6d 61 74 69 63 20 5b   set automatic [
80c0: 65 78 70 72 20 7b 5b 73 74 72 69 6e 67 20 6c 65  expr {[string le
80d0: 6e 67 74 68 20 24 73 74 61 6e 64 61 72 64 5d 20  ngth $standard] 
80e0: 3d 3d 20 30 7d 5d 0d 0a 0d 0a 20 20 20 20 20 20  == 0}]....      
80f0: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
8100: 20 46 69 72 73 74 2c 20 69 6e 20 65 69 74 68 65   First, in eithe
8110: 72 20 22 61 75 74 6f 6d 61 74 69 63 22 20 6f 72  r "automatic" or
8120: 20 22 6e 6f 6e 2d 73 74 61 6e 64 61 72 64 22 20   "non-standard" 
8130: 6d 6f 64 65 73 2c 20 61 74 74 65 6d 70 74 0d 0a  modes, attempt..
8140: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 6f        #       to
8150: 20 66 69 6e 64 20 74 68 65 20 6e 61 74 69 76 65   find the native
8160: 2d 6f 6e 6c 79 20 69 6e 74 65 72 6f 70 20 61 73  -only interop as
8170: 73 65 6d 62 6c 79 2e 0d 0a 20 20 20 20 20 20 23  sembly...      #
8180: 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 61 75 74  ..      if {$aut
8190: 6f 6d 61 74 69 63 20 7c 7c 20 21 24 73 74 61 6e  omatic || !$stan
81a0: 64 61 72 64 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  dard} then {..  
81b0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
81c0: 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74   # NOTE: Attempt
81d0: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
81e0: 65 20 6e 61 74 69 76 65 2d 6f 6e 6c 79 20 69 6e  e native-only in
81f0: 74 65 72 6f 70 20 61 73 73 65 6d 62 6c 79 20 66  terop assembly f
8200: 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ile..        #  
8210: 20 20 20 20 20 6e 61 6d 65 20 66 6f 72 20 74 68       name for th
8220: 69 73 20 70 6c 61 74 66 6f 72 6d 20 61 6e 64 20  is platform and 
8230: 74 68 65 6e 20 72 65 74 75 72 6e 20 69 74 2e 0d  then return it..
8240: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
8250: 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65      foreach file
8260: 4e 61 6d 65 4f 6e 6c 79 20 5b 67 65 74 49 6e 74  NameOnly [getInt
8270: 65 72 6f 70 41 73 73 65 6d 62 6c 79 46 69 6c 65  eropAssemblyFile
8280: 4e 61 6d 65 73 4f 6e 6c 79 5d 20 7b 0d 0a 20 20  NamesOnly] {..  
8290: 20 20 20 20 20 20 20 20 73 65 74 20 66 69 6c 65          set file
82a0: 4e 61 6d 65 20 5b 66 69 6c 65 20 6e 61 74 69 76  Name [file nativ
82b0: 65 6e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20  ename \..       
82c0: 20 20 20 20 20 20 20 5b 66 69 6c 65 20 6a 6f 69         [file joi
82d0: 6e 20 5b 67 65 74 42 69 6e 61 72 79 44 69 72 65  n [getBinaryDire
82e0: 63 74 6f 72 79 5d 20 24 70 6c 61 74 66 6f 72 6d  ctory] $platform
82f0: 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 5d 5d   $fileNameOnly]]
8300: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66  ....          if
8310: 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24   {[file exists $
8320: 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20  fileName]} then 
8330: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  {..            r
8340: 65 74 75 72 6e 20 24 66 69 6c 65 4e 61 6d 65 0d  eturn $fileName.
8350: 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
8360: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
8370: 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
8380: 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 6e 2c     # NOTE: Then,
8390: 20 69 6e 20 65 69 74 68 65 72 20 22 61 75 74 6f   in either "auto
83a0: 6d 61 74 69 63 22 20 6f 72 20 22 73 74 61 6e 64  matic" or "stand
83b0: 61 72 64 22 20 6d 6f 64 65 73 2c 20 61 74 74 65  ard" modes, atte
83c0: 6d 70 74 20 74 6f 0d 0a 20 20 20 20 20 20 23 20  mpt to..      # 
83d0: 20 20 20 20 20 20 66 69 6e 64 20 74 68 65 20 73        find the s
83e0: 74 61 6e 64 61 72 64 20 53 51 4c 69 74 65 20 6c  tandard SQLite l
83f0: 69 62 72 61 72 79 2e 0d 0a 20 20 20 20 20 20 23  ibrary...      #
8400: 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 61 75 74  ..      if {$aut
8410: 6f 6d 61 74 69 63 20 7c 7c 20 24 73 74 61 6e 64  omatic || $stand
8420: 61 72 64 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ard} then {..   
8430: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
8440: 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20  # NOTE: Attempt 
8450: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
8460: 20 6e 61 74 69 76 65 2d 6f 6e 6c 79 20 73 74 61   native-only sta
8470: 6e 64 61 72 64 20 53 51 4c 69 74 65 20 6c 69 62  ndard SQLite lib
8480: 72 61 72 79 0d 0a 20 20 20 20 20 20 20 20 23 20  rary..        # 
8490: 20 20 20 20 20 20 66 69 6c 65 20 6e 61 6d 65 20        file name 
84a0: 66 6f 72 20 74 68 69 73 20 70 6c 61 74 66 6f 72  for this platfor
84b0: 6d 20 61 6e 64 20 74 68 65 6e 20 72 65 74 75 72  m and then retur
84c0: 6e 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23  n it...        #
84d0: 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63  ..        foreac
84e0: 68 20 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 5b  h fileNameOnly [
84f0: 67 65 74 4e 61 74 69 76 65 4c 69 62 72 61 72 79  getNativeLibrary
8500: 46 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79 5d 20 7b  FileNamesOnly] {
8510: 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
8520: 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6e  fileName [file n
8530: 61 74 69 76 65 6e 61 6d 65 20 5c 0d 0a 20 20 20  ativename \..   
8540: 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65             [file
8550: 20 6a 6f 69 6e 20 5b 67 65 74 42 69 6e 61 72 79   join [getBinary
8560: 44 69 72 65 63 74 6f 72 79 5d 20 24 70 6c 61 74  Directory] $plat
8570: 66 6f 72 6d 20 24 66 69 6c 65 4e 61 6d 65 4f 6e  form $fileNameOn
8580: 6c 79 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ly]]....        
8590: 20 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73    if {[file exis
85a0: 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74  ts $fileName]} t
85b0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
85c0: 20 20 20 72 65 74 75 72 6e 20 24 66 69 6c 65 4e     return $fileN
85d0: 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  ame..          }
85e0: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
85f0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
8600: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57  .      # NOTE: W
8610: 61 73 20 74 68 65 20 6d 61 6e 61 67 65 64 20 61  as the managed a
8620: 73 73 65 6d 62 6c 79 20 63 6f 6d 70 69 6c 65 64  ssembly compiled
8630: 20 65 78 70 65 63 74 69 6e 67 20 74 6f 20 64 65   expecting to de
8640: 61 6c 20 77 69 74 68 20 74 68 65 0d 0a 20 20 20  al with the..   
8650: 20 20 20 23 20 20 20 20 20 20 20 73 74 61 6e 64     #       stand
8660: 61 72 64 20 63 6f 72 65 20 6c 69 62 72 61 72 79  ard core library
8670: 3f 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ?..      #..    
8680: 20 20 69 66 20 7b 5b 68 61 76 65 53 51 4c 69 74    if {[haveSQLit
8690: 65 44 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 20  eDefineConstant 
86a0: 53 51 4c 49 54 45 5f 53 54 41 4e 44 41 52 44 5d  SQLITE_STANDARD]
86b0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
86c0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
86d0: 4f 54 45 3a 20 46 61 6c 6c 62 61 63 6b 20 74 6f  OTE: Fallback to
86e0: 20 72 65 74 75 72 6e 69 6e 67 20 74 68 65 20 6e   returning the n
86f0: 61 74 69 76 65 2d 6f 6e 6c 79 20 73 74 61 6e 64  ative-only stand
8700: 61 72 64 20 53 51 4c 69 74 65 20 6c 69 62 72 61  ard SQLite libra
8710: 72 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ry..        #   
8720: 20 20 20 20 66 69 6c 65 20 6e 61 6d 65 20 66 6f      file name fo
8730: 72 20 74 68 65 20 70 6c 61 74 66 6f 72 6d 2e 0d  r the platform..
8740: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
8750: 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65      set fileName
8760: 73 4f 6e 6c 79 20 5b 67 65 74 4e 61 74 69 76 65  sOnly [getNative
8770: 4c 69 62 72 61 72 79 46 69 6c 65 4e 61 6d 65 73  LibraryFileNames
8780: 4f 6e 6c 79 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  Only]....       
8790: 20 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 66   if {[llength $f
87a0: 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79 5d 20 3d 3d  ileNamesOnly] ==
87b0: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
87c0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 22 22 0d        return "".
87d0: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
87e0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 66 69        return [fi
87f0: 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66  le nativename [f
8800: 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20  ile join \..    
8810: 20 20 20 20 20 20 20 20 5b 67 65 74 42 69 6e 61          [getBina
8820: 72 79 44 69 72 65 63 74 6f 72 79 5d 20 24 70 6c  ryDirectory] $pl
8830: 61 74 66 6f 72 6d 20 5b 6c 69 6e 64 65 78 20 24  atform [lindex $
8840: 66 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79 20 30 5d  fileNamesOnly 0]
8850: 5d 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  ]]..      } else
8860: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
8870: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46         # NOTE: F
8880: 61 6c 6c 62 61 63 6b 20 74 6f 20 72 65 74 75 72  allback to retur
8890: 6e 69 6e 67 20 74 68 65 20 6e 61 74 69 76 65 2d  ning the native-
88a0: 6f 6e 6c 79 20 69 6e 74 65 72 6f 70 20 61 73 73  only interop ass
88b0: 65 6d 62 6c 79 20 66 69 6c 65 0d 0a 20 20 20 20  embly file..    
88c0: 20 20 20 20 23 20 20 20 20 20 20 20 6e 61 6d 65      #       name
88d0: 20 66 6f 72 20 74 68 65 20 70 6c 61 74 66 6f 72   for the platfor
88e0: 6d 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  m...        #.. 
88f0: 20 20 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e         set fileN
8900: 61 6d 65 73 4f 6e 6c 79 20 5b 67 65 74 49 6e 74  amesOnly [getInt
8910: 65 72 6f 70 41 73 73 65 6d 62 6c 79 46 69 6c 65  eropAssemblyFile
8920: 4e 61 6d 65 73 4f 6e 6c 79 5d 0d 0a 0d 0a 20 20  NamesOnly]....  
8930: 20 20 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67        if {[lleng
8940: 74 68 20 24 66 69 6c 65 4e 61 6d 65 73 4f 6e 6c  th $fileNamesOnl
8950: 79 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  y] == 0} then {.
8960: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
8970: 6e 20 22 22 0d 0a 20 20 20 20 20 20 20 20 7d 0d  n ""..        }.
8980: 0a 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ...        retur
8990: 6e 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61  n [file nativena
89a0: 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d  me [file join \.
89b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65  .            [ge
89c0: 74 42 69 6e 61 72 79 44 69 72 65 63 74 6f 72 79  tBinaryDirectory
89d0: 5d 20 24 70 6c 61 74 66 6f 72 6d 20 5b 6c 69 6e  ] $platform [lin
89e0: 64 65 78 20 24 66 69 6c 65 4e 61 6d 65 73 4f 6e  dex $fileNamesOn
89f0: 6c 79 20 30 5d 5d 5d 0d 0a 20 20 20 20 20 20 7d  ly 0]]]..      }
8a00: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
8a10: 70 72 6f 63 20 67 65 74 43 6f 6d 6d 6f 6e 44 69  proc getCommonDi
8a20: 72 65 63 74 6f 72 79 20 7b 7d 20 7b 0d 0a 20 20  rectory {} {..  
8a30: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
8a40: 4f 54 45 3a 20 54 68 69 73 20 70 72 6f 63 65 64  OTE: This proced
8a50: 75 72 65 20 72 65 74 75 72 6e 73 20 74 68 65 20  ure returns the 
8a60: 64 69 72 65 63 74 6f 72 79 20 77 68 65 72 65 20  directory where 
8a70: 74 68 65 20 74 65 73 74 20 73 63 72 69 70 74 73  the test scripts
8a80: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
8a90: 73 68 6f 75 6c 64 20 62 65 20 6c 6f 63 61 74 65  should be locate
8aa0: 64 2e 20 20 42 79 20 64 65 66 61 75 6c 74 2c 20  d.  By default, 
8ab0: 74 68 69 73 20 6a 75 73 74 20 72 65 74 75 72 6e  this just return
8ac0: 73 20 74 68 65 20 45 61 67 6c 65 0d 0a 20 20 20  s the Eagle..   
8ad0: 20 20 20 23 20 20 20 20 20 20 20 62 69 6e 61 72     #       binar
8ae0: 79 20 64 69 72 65 63 74 6f 72 79 2e 0d 0a 20 20  y directory...  
8af0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
8b00: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
8b10: 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79  common_directory
8b20: 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
8b30: 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
8b40: 20 24 3a 3a 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63   $::common_direc
8b50: 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20  tory] > 0} then 
8b60: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
8b70: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68        # NOTE: Th
8b80: 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68  e location of th
8b90: 65 20 63 6f 6d 6d 6f 6e 20 64 69 72 65 63 74 6f  e common directo
8ba0: 72 79 20 68 61 73 20 62 65 65 6e 20 73 65 74 3b  ry has been set;
8bb0: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
8bc0: 20 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65    therefore, use
8bd0: 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d   it...        #.
8be0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
8bf0: 24 3a 3a 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74  $::common_direct
8c00: 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  ory..      } els
8c10: 65 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74  eif {[info exist
8c20: 73 20 3a 3a 76 65 6e 64 6f 72 5f 64 69 72 65 63  s ::vendor_direc
8c30: 74 6f 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20  tory] && \..    
8c40: 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65        [string le
8c50: 6e 67 74 68 20 24 3a 3a 76 65 6e 64 6f 72 5f 64  ngth $::vendor_d
8c60: 69 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74  irectory] > 0} t
8c70: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
8c80: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
8c90: 3a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f  : The location o
8ca0: 66 20 74 68 65 20 76 65 6e 64 6f 72 20 64 69 72  f the vendor dir
8cb0: 65 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20  ectory has been 
8cc0: 73 65 74 3b 0d 0a 20 20 20 20 20 20 20 20 23 20  set;..        # 
8cd0: 20 20 20 20 20 20 74 68 65 72 65 66 6f 72 65 2c        therefore,
8ce0: 20 75 73 65 20 69 74 2e 0d 0a 20 20 20 20 20 20   use it...      
8cf0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
8d00: 75 72 6e 20 24 3a 3a 76 65 6e 64 6f 72 5f 64 69  urn $::vendor_di
8d10: 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d  rectory..      }
8d20: 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20 65   elseif {[info e
8d30: 78 69 73 74 73 20 3a 3a 74 63 6c 5f 6c 69 62 72  xists ::tcl_libr
8d40: 61 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  ary] && \..     
8d50: 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
8d60: 67 74 68 20 24 3a 3a 74 63 6c 5f 6c 69 62 72 61  gth $::tcl_libra
8d70: 72 79 5d 20 3e 20 30 20 26 26 20 5c 0d 0a 20 20  ry] > 0 && \..  
8d80: 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 69 73          [file is
8d90: 64 69 72 65 63 74 6f 72 79 20 24 3a 3a 74 63 6c  directory $::tcl
8da0: 5f 6c 69 62 72 61 72 79 5d 7d 20 74 68 65 6e 20  _library]} then 
8db0: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
8dc0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68        # NOTE: Th
8dd0: 65 20 76 61 72 69 61 62 6c 65 20 77 69 74 68 20  e variable with 
8de0: 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20  the location of 
8df0: 74 68 65 20 73 63 72 69 70 74 20 6c 69 62 72 61  the script libra
8e00: 72 79 20 69 73 0d 0a 20 20 20 20 20 20 20 20 23  ry is..        #
8e10: 20 20 20 20 20 20 20 73 65 74 20 61 6e 64 20 61         set and a
8e20: 70 70 65 61 72 73 20 74 6f 20 62 65 20 61 20 72  ppears to be a r
8e30: 65 61 6c 20 64 69 72 65 63 74 6f 72 79 20 28 69  eal directory (i
8e40: 2e 65 2e 20 6e 6f 74 20 65 6d 62 65 64 64 65 64  .e. not embedded
8e50: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
8e60: 20 20 77 69 74 68 69 6e 20 61 20 66 69 6c 65 29    within a file)
8e70: 3b 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65  ; therefore, use
8e80: 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d   it...        #.
8e90: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
8ea0: 24 3a 3a 74 63 6c 5f 6c 69 62 72 61 72 79 0d 0a  $::tcl_library..
8eb0: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
8ec0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
8ed0: 20 20 20 23 20 4e 4f 54 45 3a 20 46 61 6c 6c 62     # NOTE: Fallb
8ee0: 61 63 6b 20 74 6f 20 74 68 65 20 64 69 72 65 63  ack to the direc
8ef0: 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20  tory containing 
8f00: 74 68 65 20 65 78 65 63 75 74 61 62 6c 65 2e 0d  the executable..
8f10: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
8f20: 20 20 20 20 72 65 74 75 72 6e 20 5b 69 6e 66 6f      return [info
8f30: 20 62 69 6e 61 72 79 5d 0d 0a 20 20 20 20 20 20   binary]..      
8f40: 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
8f50: 20 70 72 6f 63 20 67 65 74 44 61 74 61 62 61 73   proc getDatabas
8f60: 65 44 69 72 65 63 74 6f 72 79 20 7b 7d 20 7b 0d  eDirectory {} {.
8f70: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
8f80: 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 70 72 6f  # NOTE: This pro
8f90: 63 65 64 75 72 65 20 72 65 74 75 72 6e 73 20 74  cedure returns t
8fa0: 68 65 20 64 69 72 65 63 74 6f 72 79 20 77 68 65  he directory whe
8fb0: 72 65 20 74 68 65 20 74 65 73 74 20 64 61 74 61  re the test data
8fc0: 62 61 73 65 73 0d 0a 20 20 20 20 20 20 23 20 20  bases..      #  
8fd0: 20 20 20 20 20 73 68 6f 75 6c 64 20 62 65 20 6c       should be l
8fe0: 6f 63 61 74 65 64 2e 20 20 42 79 20 64 65 66 61  ocated.  By defa
8ff0: 75 6c 74 2c 20 74 68 69 73 20 6a 75 73 74 20 75  ult, this just u
9000: 73 65 73 20 74 68 65 20 74 65 6d 70 6f 72 61 72  ses the temporar
9010: 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  y..      #      
9020: 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 66 69   directory confi
9030: 67 75 72 65 64 20 66 6f 72 20 74 68 69 73 20 73  gured for this s
9040: 79 73 74 65 6d 2e 0d 0a 20 20 20 20 20 20 23 0d  ystem...      #.
9050: 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f  .      if {[info
9060: 20 65 78 69 73 74 73 20 3a 3a 64 61 74 61 62 61   exists ::databa
9070: 73 65 5f 64 69 72 65 63 74 6f 72 79 5d 20 26 26  se_directory] &&
9080: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73   \..          [s
9090: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a  tring length $::
90a0: 64 61 74 61 62 61 73 65 5f 64 69 72 65 63 74 6f  database_directo
90b0: 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  ry] > 0} then {.
90c0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
90d0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20      # NOTE: The 
90e0: 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  location of the 
90f0: 64 61 74 61 62 61 73 65 20 64 69 72 65 63 74 6f  database directo
9100: 72 79 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72  ry has been over
9110: 72 69 64 64 65 6e 3b 0d 0a 20 20 20 20 20 20 20  ridden;..       
9120: 20 23 20 20 20 20 20 20 20 74 68 65 72 65 66 6f   #       therefo
9130: 72 65 2c 20 75 73 65 20 69 74 2e 0d 0a 20 20 20  re, use it...   
9140: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
9150: 72 65 74 75 72 6e 20 24 3a 3a 64 61 74 61 62 61  return $::databa
9160: 73 65 5f 64 69 72 65 63 74 6f 72 79 0d 0a 20 20  se_directory..  
9170: 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69      } elseif {[i
9180: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 73 63 72  nfo exists ::scr
9190: 61 74 63 68 5f 64 69 72 65 63 74 6f 72 79 5d 20  atch_directory] 
91a0: 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
91b0: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
91c0: 3a 3a 73 63 72 61 74 63 68 5f 64 69 72 65 63 74  ::scratch_direct
91d0: 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ory] > 0} then {
91e0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
91f0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65       # NOTE: The
9200: 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65   location of the
9210: 20 73 63 72 61 74 63 68 20 64 69 72 65 63 74 6f   scratch directo
9220: 72 79 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72  ry has been over
9230: 72 69 64 64 65 6e 3b 0d 0a 20 20 20 20 20 20 20  ridden;..       
9240: 20 23 20 20 20 20 20 20 20 74 68 65 72 65 66 6f   #       therefo
9250: 72 65 2c 20 75 73 65 20 69 74 2e 0d 0a 20 20 20  re, use it...   
9260: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
9270: 72 65 74 75 72 6e 20 24 3a 3a 73 63 72 61 74 63  return $::scratc
9280: 68 5f 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20  h_directory..   
9290: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
92a0: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 67 65 74       return [get
92b0: 54 65 6d 70 6f 72 61 72 79 50 61 74 68 5d 0d 0a  TemporaryPath]..
92c0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
92d0: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 54  ...    proc getT
92e0: 65 6d 70 6f 72 61 72 79 44 69 72 65 63 74 6f 72  emporaryDirector
92f0: 79 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  y {} {..      #.
9300: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54  .      # NOTE: T
9310: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 72 65  his procedure re
9320: 74 75 72 6e 73 20 74 68 65 20 64 69 72 65 63 74  turns the direct
9330: 6f 72 79 20 77 68 65 72 65 20 74 68 65 20 74 65  ory where the te
9340: 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 0d 0a 20  mporary files.. 
9350: 20 20 20 20 20 23 20 20 20 20 20 20 20 73 68 6f       #       sho
9360: 75 6c 64 20 62 65 20 6c 6f 63 61 74 65 64 2e 20  uld be located. 
9370: 20 42 79 20 64 65 66 61 75 6c 74 2c 20 74 68 69   By default, thi
9380: 73 20 6a 75 73 74 20 75 73 65 73 20 74 68 65 20  s just uses the 
9390: 74 65 6d 70 6f 72 61 72 79 0d 0a 20 20 20 20 20  temporary..     
93a0: 20 23 20 20 20 20 20 20 20 64 69 72 65 63 74 6f   #       directo
93b0: 72 79 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f  ry configured fo
93c0: 72 20 74 68 69 73 20 73 79 73 74 65 6d 2e 0d 0a  r this system...
93d0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
93e0: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
93f0: 3a 3a 74 65 6d 70 6f 72 61 72 79 5f 64 69 72 65  ::temporary_dire
9400: 63 74 6f 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20  ctory] && \..   
9410: 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c         [string l
9420: 65 6e 67 74 68 20 24 3a 3a 74 65 6d 70 6f 72 61  ength $::tempora
9430: 72 79 5f 64 69 72 65 63 74 6f 72 79 5d 20 3e 20  ry_directory] > 
9440: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
9450: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
9460: 4e 4f 54 45 3a 20 54 68 65 20 6c 6f 63 61 74 69  NOTE: The locati
9470: 6f 6e 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72  on of the tempor
9480: 61 72 79 20 64 69 72 65 63 74 6f 72 79 20 68 61  ary directory ha
9490: 73 20 62 65 65 6e 20 6f 76 65 72 72 69 64 64 65  s been overridde
94a0: 6e 3b 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  n;..        #   
94b0: 20 20 20 20 74 68 65 72 65 66 6f 72 65 2c 20 75      therefore, u
94c0: 73 65 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20  se it...        
94d0: 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  #..        retur
94e0: 6e 20 24 3a 3a 74 65 6d 70 6f 72 61 72 79 5f 64  n $::temporary_d
94f0: 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20  irectory..      
9500: 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20  } elseif {[info 
9510: 65 78 69 73 74 73 20 3a 3a 73 63 72 61 74 63 68  exists ::scratch
9520: 5f 64 69 72 65 63 74 6f 72 79 5d 20 26 26 20 5c  _directory] && \
9530: 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72  ..          [str
9540: 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 73 63  ing length $::sc
9550: 72 61 74 63 68 5f 64 69 72 65 63 74 6f 72 79 5d  ratch_directory]
9560: 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
9570: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
9580: 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c 6f 63   # NOTE: The loc
9590: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 63 72  ation of the scr
95a0: 61 74 63 68 20 64 69 72 65 63 74 6f 72 79 20 68  atch directory h
95b0: 61 73 20 62 65 65 6e 20 6f 76 65 72 72 69 64 64  as been overridd
95c0: 65 6e 3b 0d 0a 20 20 20 20 20 20 20 20 23 20 20  en;..        #  
95d0: 20 20 20 20 20 74 68 65 72 65 66 6f 72 65 2c 20       therefore, 
95e0: 75 73 65 20 69 74 2e 0d 0a 20 20 20 20 20 20 20  use it...       
95f0: 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   #..        retu
9600: 72 6e 20 24 3a 3a 73 63 72 61 74 63 68 5f 64 69  rn $::scratch_di
9610: 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d  rectory..      }
9620: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
9630: 20 72 65 74 75 72 6e 20 5b 67 65 74 54 65 6d 70   return [getTemp
9640: 6f 72 61 72 79 50 61 74 68 5d 0d 0a 20 20 20 20  oraryPath]..    
9650: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
9660: 20 20 20 70 72 6f 63 20 67 65 74 45 78 65 63 75     proc getExecu
9670: 74 65 4f 6e 53 65 74 75 70 20 7b 7d 20 7b 0d 0a  teOnSetup {} {..
9680: 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20        if {[info 
9690: 65 78 69 73 74 73 20 3a 3a 65 78 65 63 75 74 65  exists ::execute
96a0: 5f 6f 6e 5f 73 65 74 75 70 5d 20 26 26 20 5c 0d  _on_setup] && \.
96b0: 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69  .          [stri
96c0: 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 65 78 65  ng length $::exe
96d0: 63 75 74 65 5f 6f 6e 5f 73 65 74 75 70 5d 20 3e  cute_on_setup] >
96e0: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
96f0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
9700: 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e 20 74 68   NOTE: Return th
9710: 65 20 63 6f 6e 66 69 67 75 72 65 64 20 53 51 4c  e configured SQL
9720: 20 74 6f 20 65 78 65 63 75 74 65 20 64 75 72 69   to execute duri
9730: 6e 67 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  ng the connectio
9740: 6e 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  n..        #    
9750: 20 20 20 73 65 74 75 70 20 70 72 6f 63 65 64 75     setup procedu
9760: 72 65 20 28 69 2e 65 2e 20 66 6f 72 20 65 76 65  re (i.e. for eve
9770: 72 79 20 74 65 73 74 20 64 61 74 61 62 61 73 65  ry test database
9780: 20 63 6f 6e 6e 65 63 74 69 6f 6e 29 2e 0d 0a 20   connection)... 
9790: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
97a0: 20 20 72 65 74 75 72 6e 20 24 3a 3a 65 78 65 63    return $::exec
97b0: 75 74 65 5f 6f 6e 5f 73 65 74 75 70 0d 0a 20 20  ute_on_setup..  
97c0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
97d0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
97e0: 20 23 20 4e 4f 54 45 3a 20 42 79 20 64 65 66 61   # NOTE: By defa
97f0: 75 6c 74 2c 20 74 68 65 72 65 20 69 73 20 6e 6f  ult, there is no
9800: 20 53 51 4c 20 74 6f 20 65 78 65 63 75 74 65 20   SQL to execute 
9810: 64 75 72 69 6e 67 20 74 68 65 20 63 6f 6e 6e 65  during the conne
9820: 63 74 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20 23  ction..        #
9830: 20 20 20 20 20 20 20 73 65 74 75 70 20 70 72 6f         setup pro
9840: 63 65 64 75 72 65 20 28 69 2e 65 2e 20 66 6f 72  cedure (i.e. for
9850: 20 65 76 65 72 79 20 74 65 73 74 20 64 61 74 61   every test data
9860: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 29  base connection)
9870: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
9880: 20 20 20 20 20 20 72 65 74 75 72 6e 20 22 22 0d        return "".
9890: 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
98a0: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74  ....    proc get
98b0: 54 65 73 74 4f 76 65 72 72 69 64 65 73 50 72 65  TestOverridesPre
98c0: 61 6d 62 6c 65 20 7b 20 7b 65 78 74 72 61 56 61  amble { {extraVa
98d0: 72 4e 61 6d 65 73 20 22 22 7d 20 7d 20 7b 0d 0a  rNames ""} } {..
98e0: 20 20 20 20 20 20 73 65 74 20 76 61 72 4e 61 6d        set varNam
98f0: 65 73 20 5b 6c 69 73 74 5d 0d 0a 0d 0a 20 20 20  es [list]....   
9900: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
9910: 54 45 3a 20 49 66 20 61 76 61 69 6c 61 62 6c 65  TE: If available
9920: 2c 20 73 74 61 72 74 20 77 69 74 68 20 74 68 65  , start with the
9930: 20 6d 61 73 74 65 72 20 6c 69 73 74 20 6f 66 20   master list of 
9940: 74 65 73 74 20 6f 76 65 72 72 69 64 65 0d 0a 20  test override.. 
9950: 20 20 20 20 20 23 20 20 20 20 20 20 20 76 61 72       #       var
9960: 69 61 62 6c 65 73 2e 0d 0a 20 20 20 20 20 20 23  iables...      #
9970: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66  ..      if {[inf
9980: 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 73 74 5f  o exists ::test_
9990: 6f 76 65 72 72 69 64 65 73 5d 20 26 26 20 5c 0d  overrides] && \.
99a0: 0a 20 20 20 20 20 20 20 20 20 20 5b 6c 6c 65 6e  .          [llen
99b0: 67 74 68 20 24 3a 3a 74 65 73 74 5f 6f 76 65 72  gth $::test_over
99c0: 72 69 64 65 73 5d 20 3e 20 30 7d 20 74 68 65 6e  rides] > 0} then
99d0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 65 76 61 6c   {..        eval
99e0: 20 6c 61 70 70 65 6e 64 20 76 61 72 4e 61 6d 65   lappend varName
99f0: 73 20 24 3a 3a 74 65 73 74 5f 6f 76 65 72 72 69  s $::test_overri
9a00: 64 65 73 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  des..      }....
9a10: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
9a20: 20 4e 4f 54 45 3a 20 49 66 20 72 65 71 75 65 73   NOTE: If reques
9a30: 74 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65  ted by our calle
9a40: 72 2c 20 61 64 64 20 61 6e 79 20 61 64 64 69 74  r, add any addit
9a50: 69 6f 6e 61 6c 20 76 61 72 69 61 62 6c 65 0d 0a  ional variable..
9a60: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6e 61        #       na
9a70: 6d 65 73 20 74 6f 20 63 6f 70 79 20 6e 6f 77 2e  mes to copy now.
9a80: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
9a90: 20 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 65   if {[llength $e
9aa0: 78 74 72 61 56 61 72 4e 61 6d 65 73 5d 20 3e 20  xtraVarNames] > 
9ab0: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
9ac0: 20 20 20 65 76 61 6c 20 6c 61 70 70 65 6e 64 20     eval lappend 
9ad0: 76 61 72 4e 61 6d 65 73 20 24 65 78 74 72 61 56  varNames $extraV
9ae0: 61 72 4e 61 6d 65 73 0d 0a 20 20 20 20 20 20 7d  arNames..      }
9af0: 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
9b00: 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64     # NOTE: Build
9b10: 20 74 68 65 20 73 63 72 69 70 74 20 66 72 61 67   the script frag
9b20: 6d 65 6e 74 20 74 6f 20 62 65 20 72 65 74 75 72  ment to be retur
9b30: 6e 65 64 20 62 79 20 70 72 6f 63 65 73 73 69 6e  ned by processin
9b40: 67 20 65 61 63 68 0d 0a 20 20 20 20 20 20 23 20  g each..      # 
9b50: 20 20 20 20 20 20 76 61 72 69 61 62 6c 65 20 6e        variable n
9b60: 61 6d 65 20 61 6e 64 20 61 64 64 69 6e 67 20 74  ame and adding t
9b70: 68 65 20 6e 65 63 65 63 65 73 73 61 72 79 20 73  he nececessary s
9b80: 63 72 69 70 74 20 66 72 61 67 6d 65 6e 74 73 20  cript fragments 
9b90: 66 6f 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20  for..      #    
9ba0: 20 20 20 65 61 63 68 20 6f 6e 65 2e 0d 0a 20 20     each one...  
9bb0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74      #..      set
9bc0: 20 72 65 73 75 6c 74 20 22 22 0d 0a 0d 0a 20 20   result ""....  
9bd0: 20 20 20 20 66 6f 72 65 61 63 68 20 76 61 72 4e      foreach varN
9be0: 61 6d 65 20 24 76 61 72 4e 61 6d 65 73 20 7b 0d  ame $varNames {.
9bf0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
9c00: 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c      # NOTE: Buil
9c10: 64 20 74 68 65 20 71 75 61 6c 69 66 69 65 64 20  d the qualified 
9c20: 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20  global variable 
9c30: 6e 61 6d 65 2e 0d 0a 20 20 20 20 20 20 20 20 23  name...        #
9c40: 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 66 75  ..        set fu
9c50: 6c 6c 56 61 72 4e 61 6d 65 20 5b 61 70 70 65 6e  llVarName [appen
9c60: 64 41 72 67 73 20 3a 3a 20 24 76 61 72 4e 61 6d  dArgs :: $varNam
9c70: 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d  e]....        #.
9c80: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
9c90: 20 44 6f 65 73 20 74 68 65 20 76 61 72 69 61 62   Does the variab
9ca0: 6c 65 20 65 78 69 73 74 20 69 6e 20 74 68 69 73  le exist in this
9cb0: 20 69 6e 74 65 72 70 72 65 74 65 72 20 63 6f 6e   interpreter con
9cc0: 74 65 78 74 3f 0d 0a 20 20 20 20 20 20 20 20 23  text?..        #
9cd0: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69  ..        if {[i
9ce0: 6e 66 6f 20 65 78 69 73 74 73 20 24 66 75 6c 6c  nfo exists $full
9cf0: 56 61 72 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b  VarName]} then {
9d00: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
9d10: 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
9d20: 20 41 70 70 65 6e 64 20 61 20 73 63 72 69 70 74   Append a script
9d30: 20 66 72 61 67 6d 65 6e 74 20 74 6f 20 74 68 65   fragment to the
9d40: 20 72 65 73 75 6c 74 20 74 68 61 74 20 77 69 6c   result that wil
9d50: 6c 20 63 6f 72 72 65 63 74 6c 79 0d 0a 20 20 20  l correctly..   
9d60: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63         #       c
9d70: 6f 70 79 20 61 6e 79 20 63 6f 6e 74 61 69 6e 65  opy any containe
9d80: 64 20 76 61 6c 75 65 20 74 6f 20 61 6e 6f 74 68  d value to anoth
9d90: 65 72 20 69 6e 74 65 72 70 72 65 74 65 72 20 63  er interpreter c
9da0: 6f 6e 74 65 78 74 2e 0d 0a 20 20 20 20 20 20 20  ontext...       
9db0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
9dc0: 61 70 70 65 6e 64 20 72 65 73 75 6c 74 20 5c 6e  append result \n
9dd0: 20 22 73 65 74 20 22 20 24 66 75 6c 6c 56 61 72   "set " $fullVar
9de0: 4e 61 6d 65 20 22 20 5c 7b 22 20 5b 73 65 74 20  Name " \{" [set 
9df0: 24 66 75 6c 6c 56 61 72 4e 61 6d 65 5d 20 5c 7d  $fullVarName] \}
9e00: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
9e10: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
9e20: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49  .      # NOTE: I
9e30: 66 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 6e  f the result con
9e40: 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72  tains one or mor
9e50: 65 20 73 63 72 69 70 74 20 66 72 61 67 6d 65 6e  e script fragmen
9e60: 74 73 2c 20 61 70 70 65 6e 64 20 61 0d 0a 20 20  ts, append a..  
9e70: 20 20 20 20 23 20 20 20 20 20 20 20 6e 65 77 6c      #       newl
9e80: 69 6e 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ine...      #.. 
9e90: 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
9ea0: 20 6c 65 6e 67 74 68 20 24 72 65 73 75 6c 74 5d   length $result]
9eb0: 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
9ec0: 20 20 20 20 20 20 61 70 70 65 6e 64 20 72 65 73        append res
9ed0: 75 6c 74 20 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d  ult \n..      }.
9ee0: 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ...      return 
9ef0: 24 72 65 73 75 6c 74 0d 0a 20 20 20 20 7d 0d 0a  $result..    }..
9f00: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 6d 6f 76 65  ...    proc move
9f10: 53 79 73 74 65 6d 44 61 74 61 53 51 4c 69 74 65  SystemDataSQLite
9f20: 44 6c 6c 43 6f 6e 66 69 67 20 7b 20 7b 72 65 73  DllConfig { {res
9f30: 74 6f 72 65 20 66 61 6c 73 65 7d 20 7b 76 65 72  tore false} {ver
9f40: 62 6f 73 65 20 66 61 6c 73 65 7d 20 7d 20 7b 0d  bose false} } {.
9f50: 0a 20 20 20 20 20 20 73 65 74 20 64 69 72 65 63  .      set direc
9f60: 74 6f 72 79 20 5b 6f 62 6a 65 63 74 20 69 6e 76  tory [object inv
9f70: 6f 6b 65 20 41 70 70 44 6f 6d 61 69 6e 20 43 75  oke AppDomain Cu
9f80: 72 72 65 6e 74 44 6f 6d 61 69 6e 2e 42 61 73 65  rrentDomain.Base
9f90: 44 69 72 65 63 74 6f 72 79 5d 0d 0a 0d 0a 20 20  Directory]....  
9fa0: 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
9fb0: 6c 65 6e 67 74 68 20 24 64 69 72 65 63 74 6f 72  length $director
9fc0: 79 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  y] == 0} then {.
9fd0: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 24 76 65  .        if {$ve
9fe0: 72 62 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20  rbose} then {.. 
9ff0: 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
a000: 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
a010: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
a020: 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
a030: 2d 20 73 6b 69 70 70 65 64 20 6d 6f 76 69 6e 67  - skipped moving
a040: 20 5c 22 53 79 73 74 65 6d 2e 44 61 74 61 2e 53   \"System.Data.S
a050: 51 4c 69 74 65 2e 64 6c 6c 2e 63 6f 6e 66 69 67  QLite.dll.config
a060: 5c 22 2c 20 22 20 5c 0d 0a 20 20 20 20 20 20 20  \", " \..       
a070: 20 20 20 20 20 20 20 22 6e 6f 20 62 61 73 65 20         "no base 
a080: 64 69 72 65 63 74 6f 72 79 5c 6e 22 5d 0d 0a 20  directory\n"].. 
a090: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
a0a0: 20 20 72 65 74 75 72 6e 0d 0a 20 20 20 20 20 20    return..      
a0b0: 7d 0d 0a 0d 0a 20 20 20 20 20 20 73 65 74 20 66  }....      set f
a0c0: 69 6c 65 4e 61 6d 65 28 31 29 20 5b 66 69 6c 65  ileName(1) [file
a0d0: 20 6e 6f 72 6d 61 6c 69 7a 65 20 5c 0d 0a 20 20   normalize \..  
a0e0: 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 6a 6f          [file jo
a0f0: 69 6e 20 24 64 69 72 65 63 74 6f 72 79 20 53 79  in $directory Sy
a100: 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
a110: 2e 64 6c 6c 2e 63 6f 6e 66 69 67 5d 5d 0d 0a 0d  .dll.config]]...
a120: 0a 20 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e  .      set fileN
a130: 61 6d 65 28 32 29 20 5b 61 70 70 65 6e 64 41 72  ame(2) [appendAr
a140: 67 73 20 24 66 69 6c 65 4e 61 6d 65 28 31 29 20  gs $fileName(1) 
a150: 2e 6d 6f 76 65 64 5d 0d 0a 0d 0a 20 20 20 20 20  .moved]....     
a160: 20 69 66 20 7b 24 72 65 73 74 6f 72 65 7d 20 74   if {$restore} t
a170: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69  hen {..        i
a180: 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20  f {[file exists 
a190: 24 66 69 6c 65 4e 61 6d 65 28 32 29 5d 7d 20 74  $fileName(2)]} t
a1a0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
a1b0: 20 66 69 6c 65 20 72 65 6e 61 6d 65 20 24 66 69   file rename $fi
a1c0: 6c 65 4e 61 6d 65 28 32 29 20 24 66 69 6c 65 4e  leName(2) $fileN
a1d0: 61 6d 65 28 31 29 0d 0a 0d 0a 20 20 20 20 20 20  ame(1)....      
a1e0: 20 20 20 20 69 66 20 7b 24 76 65 72 62 6f 73 65      if {$verbose
a1f0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
a200: 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
a210: 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
a220: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
a230: 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
a240: 20 6d 6f 76 65 64 20 5c 22 22 20 24 66 69 6c 65   moved \"" $file
a250: 4e 61 6d 65 28 32 29 20 22 5c 22 20 74 6f 20 5c  Name(2) "\" to \
a260: 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  "" \..          
a270: 20 20 20 20 20 20 24 66 69 6c 65 4e 61 6d 65 28        $fileName(
a280: 31 29 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20  1) \"\n]..      
a290: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
a2a0: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
a2b0: 20 20 20 69 66 20 7b 24 76 65 72 62 6f 73 65 7d     if {$verbose}
a2c0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
a2d0: 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
a2e0: 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
a2f0: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
a300: 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
a310: 73 6b 69 70 70 65 64 20 6d 6f 76 69 6e 67 20 5c  skipped moving \
a320: 22 22 20 24 66 69 6c 65 4e 61 6d 65 28 32 29 20  "" $fileName(2) 
a330: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
a340: 20 20 20 22 5c 22 2c 20 69 74 20 64 6f 65 73 20     "\", it does 
a350: 6e 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a 20  not exist\n"].. 
a360: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
a370: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65      }..      } e
a380: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 69  lse {..        i
a390: 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20  f {[file exists 
a3a0: 24 66 69 6c 65 4e 61 6d 65 28 31 29 5d 7d 20 74  $fileName(1)]} t
a3b0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
a3c0: 20 66 69 6c 65 20 72 65 6e 61 6d 65 20 24 66 69   file rename $fi
a3d0: 6c 65 4e 61 6d 65 28 31 29 20 24 66 69 6c 65 4e  leName(1) $fileN
a3e0: 61 6d 65 28 32 29 0d 0a 0d 0a 20 20 20 20 20 20  ame(2)....      
a3f0: 20 20 20 20 69 66 20 7b 24 76 65 72 62 6f 73 65      if {$verbose
a400: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
a410: 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
a420: 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
a430: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
a440: 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
a450: 20 6d 6f 76 65 64 20 5c 22 22 20 24 66 69 6c 65   moved \"" $file
a460: 4e 61 6d 65 28 31 29 20 22 5c 22 20 74 6f 20 5c  Name(1) "\" to \
a470: 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  "" \..          
a480: 20 20 20 20 20 20 24 66 69 6c 65 4e 61 6d 65 28        $fileName(
a490: 32 29 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20  2) \"\n]..      
a4a0: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
a4b0: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
a4c0: 20 20 20 69 66 20 7b 24 76 65 72 62 6f 73 65 7d     if {$verbose}
a4d0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
a4e0: 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
a4f0: 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
a500: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
a510: 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
a520: 73 6b 69 70 70 65 64 20 6d 6f 76 69 6e 67 20 5c  skipped moving \
a530: 22 22 20 24 66 69 6c 65 4e 61 6d 65 28 31 29 20  "" $fileName(1) 
a540: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
a550: 20 20 20 22 5c 22 2c 20 69 74 20 64 6f 65 73 20     "\", it does 
a560: 6e 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a 20  not exist\n"].. 
a570: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
a580: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
a590: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
a5a0: 6f 63 20 67 65 74 41 70 70 44 6f 6d 61 69 6e 50  oc getAppDomainP
a5b0: 72 65 61 6d 62 6c 65 20 7b 20 7b 70 72 65 66 69  reamble { {prefi
a5c0: 78 20 22 22 7d 20 7b 73 75 66 66 69 78 20 22 22  x ""} {suffix ""
a5d0: 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a  } } {..      #..
a5e0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68        # NOTE: Th
a5f0: 69 73 20 70 72 6f 63 65 64 75 72 65 20 72 65 74  is procedure ret
a600: 75 72 6e 73 20 61 20 74 65 73 74 20 73 65 74 75  urns a test setu
a610: 70 20 73 63 72 69 70 74 20 66 72 61 67 6d 65 6e  p script fragmen
a620: 74 20 73 75 69 74 61 62 6c 65 20 66 6f 72 0d 0a  t suitable for..
a630: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 65 76        #       ev
a640: 61 6c 75 61 74 69 6f 6e 20 62 79 20 61 6e 20 69  aluation by an i
a650: 6e 74 65 72 70 72 65 74 65 72 20 63 72 65 61 74  nterpreter creat
a660: 65 64 20 69 6e 20 61 6e 20 69 73 6f 6c 61 74 65  ed in an isolate
a670: 64 20 61 70 70 6c 69 63 61 74 69 6f 6e 0d 0a 20  d application.. 
a680: 20 20 20 20 20 23 20 20 20 20 20 20 20 64 6f 6d       #       dom
a690: 61 69 6e 2e 20 20 54 68 65 20 73 63 72 69 70 74  ain.  The script
a6a0: 20 66 72 61 67 6d 65 6e 74 20 62 65 69 6e 67 20   fragment being 
a6b0: 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 62 65  returned will be
a6c0: 20 73 75 72 72 6f 75 6e 64 65 64 20 62 79 0d 0a   surrounded by..
a6d0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68        #       th
a6e0: 65 20 70 72 65 66 69 78 20 61 6e 64 20 73 75 66  e prefix and suf
a6f0: 66 69 78 20 22 73 63 72 69 70 74 20 66 72 61 67  fix "script frag
a700: 6d 65 6e 74 73 22 20 73 70 65 63 69 66 69 65 64  ments" specified
a710: 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 2c 0d   by our caller,.
a720: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69  .      #       i
a730: 66 20 61 6e 79 2e 20 20 54 68 65 20 65 6e 74 69  f any.  The enti
a740: 72 65 20 73 63 72 69 70 74 20 62 65 69 6e 67 20  re script being 
a750: 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 62 65  returned will be
a760: 20 73 75 62 73 74 69 74 75 74 65 64 20 76 69 61   substituted via
a770: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
a780: 5b 73 75 62 73 74 5d 2c 20 69 6e 20 74 68 65 20  [subst], in the 
a790: 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72 20 63  context of our c
a7a0: 61 6c 6c 65 72 2c 20 62 65 66 6f 72 65 20 62 65  aller, before be
a7b0: 69 6e 67 20 72 65 74 75 72 6e 65 64 2e 0d 0a 20  ing returned... 
a7c0: 20 20 20 20 20 23 20 20 20 20 20 20 20 54 68 69       #       Thi
a7d0: 73 20 73 74 65 70 20 69 73 20 6e 65 63 65 73 73  s step is necess
a7e0: 61 72 79 20 73 6f 20 74 68 61 74 20 73 6f 6d 65  ary so that some
a7f0: 20 6c 69 6d 69 74 65 64 20 63 6f 6e 74 65 78 74   limited context
a800: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2c 0d 0a 20   information,.. 
a810: 20 20 20 20 20 23 20 20 20 20 20 20 20 70 72 69       #       pri
a820: 6d 61 72 69 6c 79 20 72 65 6c 61 74 65 64 20 74  marily related t
a830: 6f 20 74 68 65 20 74 65 73 74 69 6e 67 20 64 69  o the testing di
a840: 72 65 63 74 6f 72 69 65 73 2c 20 63 61 6e 20 62  rectories, can b
a850: 65 20 74 72 61 6e 73 66 65 72 72 65 64 0d 0a 20  e transferred.. 
a860: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 6f 20       #       to 
a870: 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 20  the interpreter 
a880: 69 6e 20 74 68 65 20 69 73 6f 6c 61 74 65 64 20  in the isolated 
a890: 61 70 70 6c 69 63 61 74 69 6f 6e 20 64 6f 6d 61  application doma
a8a0: 69 6e 2c 20 6d 61 6b 69 6e 67 20 69 74 0d 0a 20  in, making it.. 
a8b0: 20 20 20 20 20 23 20 20 20 20 20 20 20 61 62 6c       #       abl
a8c0: 65 20 74 6f 20 73 75 63 63 65 73 73 66 75 6c 6c  e to successfull
a8d0: 79 20 72 75 6e 20 74 65 73 74 73 20 74 68 61 74  y run tests that
a8e0: 20 72 65 71 75 69 72 65 20 6f 6e 65 20 6f 72 20   require one or 
a8f0: 6d 6f 72 65 20 6f 66 20 74 68 65 0d 0a 20 20 20  more of the..   
a900: 20 20 20 23 20 20 20 20 20 20 20 66 69 6c 65 73     #       files
a910: 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 74   in one of the t
a920: 65 73 74 69 6e 67 20 64 69 72 65 63 74 6f 72 69  esting directori
a930: 65 73 2e 20 20 43 61 6c 6c 65 72 73 20 73 68 6f  es.  Callers sho
a940: 75 6c 64 20 6b 65 65 70 20 69 6e 0d 0a 20 20 20  uld keep in..   
a950: 20 20 20 23 20 20 20 20 20 20 20 6d 69 6e 64 20     #       mind 
a960: 74 68 61 74 20 74 68 65 20 74 65 73 74 20 73 63  that the test sc
a970: 72 69 70 74 20 66 72 61 67 6d 65 6e 74 20 62 65  ript fragment be
a980: 69 6e 67 20 72 65 74 75 72 6e 65 64 20 63 61 6e  ing returned can
a990: 6e 6f 74 20 72 65 6c 79 20 6f 6e 0d 0a 20 20 20  not rely on..   
a9a0: 20 20 20 23 20 20 20 20 20 20 20 61 6e 79 20 73     #       any s
a9b0: 63 72 69 70 74 20 6c 69 62 72 61 72 79 20 70 72  cript library pr
a9c0: 6f 63 65 64 75 72 65 73 20 74 68 61 74 20 61 72  ocedures that ar
a9d0: 65 20 6e 6f 74 20 70 72 6f 76 69 64 65 64 20 62  e not provided b
a9e0: 79 20 74 68 65 20 45 61 67 6c 65 0d 0a 20 20 20  y the Eagle..   
a9f0: 20 20 20 23 20 20 20 20 20 20 20 6c 69 62 72 61     #       libra
aa00: 72 79 20 70 61 63 6b 61 67 65 20 28 69 2e 65 2e  ry package (i.e.
aa10: 20 22 69 6e 69 74 2e 65 61 67 6c 65 22 29 2c 20   "init.eagle"), 
aa20: 69 6e 63 6c 75 64 69 6e 67 20 74 68 6f 73 65 20  including those 
aa30: 70 72 6f 76 69 64 65 64 20 62 79 0d 0a 20 20 20  provided by..   
aa40: 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20 45     #       the E
aa50: 61 67 6c 65 20 74 65 73 74 20 70 61 63 6b 61 67  agle test packag
aa60: 65 2c 20 75 6e 6c 65 73 73 20 74 68 65 20 66 69  e, unless the fi
aa70: 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  le containing th
aa80: 65 6d 20 69 73 20 6c 6f 61 64 65 64 0d 0a 20 20  em is loaded..  
aa90: 20 20 20 20 23 20 20 20 20 20 20 20 6d 61 6e 75      #       manu
aaa0: 61 6c 6c 79 20 76 69 61 20 73 6f 6d 65 20 6f 74  ally via some ot
aab0: 68 65 72 20 6d 65 63 68 61 6e 69 73 6d 20 28 65  her mechanism (e
aac0: 2e 67 2e 20 62 79 20 69 6e 63 6c 75 64 69 6e 67  .g. by including
aad0: 20 61 70 70 72 6f 70 72 69 61 74 65 0d 0a 20 20   appropriate..  
aae0: 20 20 20 20 23 20 20 20 20 20 20 20 5b 70 61 63      #       [pac
aaf0: 6b 61 67 65 20 72 65 71 75 69 72 65 5d 20 6f 72  kage require] or
ab00: 20 5b 73 6f 75 72 63 65 5d 20 63 6f 6d 6d 61 6e   [source] comman
ab10: 64 73 20 69 6e 20 74 68 65 20 70 72 65 66 69 78  ds in the prefix
ab20: 20 6f 72 20 73 75 66 66 69 78 0d 0a 20 20 20 20   or suffix..    
ab30: 20 20 23 20 20 20 20 20 20 20 73 63 72 69 70 74    #       script
ab40: 20 66 72 61 67 6d 65 6e 74 73 29 2e 20 20 41 6c   fragments).  Al
ab50: 73 6f 2c 20 61 6c 6c 20 76 61 72 69 61 62 6c 65  so, all variable
ab60: 20 72 65 66 65 72 65 6e 63 65 73 20 61 6e 64 20   references and 
ab70: 61 6c 6c 20 6e 65 73 74 65 64 0d 0a 20 20 20 20  all nested..    
ab80: 20 20 23 20 20 20 20 20 20 20 63 6f 6d 6d 61 6e    #       comman
ab90: 64 73 20 28 69 2e 65 2e 20 74 68 6f 73 65 20 69  ds (i.e. those i
aba0: 6e 20 73 71 75 61 72 65 20 62 72 61 63 6b 65 74  n square bracket
abb0: 73 29 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  s) contained in 
abc0: 74 68 65 20 66 69 6e 61 6c 0d 0a 20 20 20 20 20  the final..     
abd0: 20 23 20 20 20 20 20 20 20 73 63 72 69 70 74 20   #       script 
abe0: 66 72 61 67 6d 65 6e 74 20 77 69 6c 6c 20 65 6e  fragment will en
abf0: 64 20 75 70 20 62 65 69 6e 67 20 65 76 61 6c 75  d up being evalu
ac00: 61 74 65 64 20 69 6e 20 74 68 65 20 63 6f 6e 74  ated in the cont
ac10: 65 78 74 20 6f 66 20 74 68 65 0d 0a 20 20 20 20  ext of the..    
ac20: 20 20 23 20 20 20 20 20 20 20 63 61 6c 6c 69 6e    #       callin
ac30: 67 20 69 6e 74 65 72 70 72 65 74 65 72 20 61 6e  g interpreter an
ac40: 64 20 6e 6f 74 20 74 68 65 20 74 61 72 67 65 74  d not the target
ac50: 20 69 6e 74 65 72 70 72 65 74 65 72 20 63 72 65   interpreter cre
ac60: 61 74 65 64 20 69 6e 20 74 68 65 0d 0a 20 20 20  ated in the..   
ac70: 20 20 20 23 20 20 20 20 20 20 20 69 73 6f 6c 61     #       isola
ac80: 74 65 64 20 61 70 70 6c 69 63 61 74 69 6f 6e 20  ted application 
ac90: 64 6f 6d 61 69 6e 20 75 6e 6c 65 73 73 20 74 68  domain unless th
aca0: 65 20 64 6f 6c 6c 61 72 20 73 69 67 6e 73 20 61  e dollar signs a
acb0: 6e 64 2f 6f 72 20 73 71 75 61 72 65 0d 0a 20 20  nd/or square..  
acc0: 20 20 20 20 23 20 20 20 20 20 20 20 62 72 61 63      #       brac
acd0: 6b 65 74 73 20 61 72 65 20 73 70 65 63 69 61 6c  kets are special
ace0: 6c 79 20 71 75 6f 74 65 64 20 77 69 74 68 20 62  ly quoted with b
acf0: 61 63 6b 73 6c 61 73 68 65 73 2e 0d 0a 20 20 20  ackslashes...   
ad00: 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75     #..      retu
ad10: 72 6e 20 5b 75 70 6c 65 76 65 6c 20 31 20 5b 6c  rn [uplevel 1 [l
ad20: 69 73 74 20 73 75 62 73 74 20 5b 61 70 70 65 6e  ist subst [appen
ad30: 64 41 72 67 73 20 24 70 72 65 66 69 78 20 7b 0d  dArgs $prefix {.
ad40: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
ad50: 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20      # NOTE: The 
ad60: 5c 5b 6f 62 6a 65 63 74 5c 5d 20 63 6f 6d 6d 61  \[object\] comma
ad70: 6e 64 20 6d 61 79 20 62 65 20 6d 69 73 73 69 6e  nd may be missin
ad80: 67 20 69 6e 20 73 6f 6d 65 20 45 61 67 6c 65 20  g in some Eagle 
ad90: 63 6f 72 65 0d 0a 20 20 20 20 20 20 20 20 23 20  core..        # 
ada0: 20 20 20 20 20 20 6c 69 62 72 61 72 79 20 63 6f        library co
adb0: 6e 66 69 67 75 72 61 74 69 6f 6e 73 2e 20 20 43  nfigurations.  C
adc0: 6c 6f 6e 69 6e 67 20 61 6e 64 20 75 73 69 6e 67  loning and using
add0: 20 74 68 65 20 70 72 6f 63 65 64 75 72 65 0d 0a   the procedure..
ade0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
adf0: 5c 5b 63 68 61 6e 67 65 4e 61 74 69 76 65 52 75  \[changeNativeRu
ae00: 6e 74 69 6d 65 4f 70 74 69 6f 6e 5c 5d 20 6d 61  ntimeOption\] ma
ae10: 79 20 68 65 6c 70 20 74 6f 20 6d 69 74 69 67 61  y help to mitiga
ae20: 74 65 20 74 68 69 73 2e 0d 0a 20 20 20 20 20 20  te this...      
ae30: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 70 72 6f    #..        pro
ae40: 63 20 63 68 61 6e 67 65 4e 61 74 69 76 65 52 75  c changeNativeRu
ae50: 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 5c 0d 0a 20  ntimeOption \.. 
ae60: 20 20 20 20 20 20 20 20 20 20 20 7b 5b 69 6e 66             {[inf
ae70: 6f 20 61 72 67 73 20 63 68 61 6e 67 65 4e 61 74  o args changeNat
ae80: 69 76 65 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e  iveRuntimeOption
ae90: 5d 7d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ]} \..          
aea0: 20 20 7b 5b 69 6e 66 6f 20 62 6f 64 79 20 63 68    {[info body ch
aeb0: 61 6e 67 65 4e 61 74 69 76 65 52 75 6e 74 69 6d  angeNativeRuntim
aec0: 65 4f 70 74 69 6f 6e 5d 7d 0d 0a 0d 0a 20 20 20  eOption]}....   
aed0: 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20       catch {..  
aee0: 20 20 20 20 20 20 20 20 63 68 61 6e 67 65 4e 61          changeNa
aef0: 74 69 76 65 52 75 6e 74 69 6d 65 4f 70 74 69 6f  tiveRuntimeOptio
af00: 6e 20 5b 68 61 73 52 75 6e 74 69 6d 65 4f 70 74  n [hasRuntimeOpt
af10: 69 6f 6e 20 6e 61 74 69 76 65 5d 0d 0a 20 20 20  ion native]..   
af20: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20       }..      } 
af30: 5b 67 65 74 54 65 73 74 4f 76 65 72 72 69 64 65  [getTestOverride
af40: 73 50 72 65 61 6d 62 6c 65 20 5b 6c 69 73 74 20  sPreamble [list 
af50: 70 61 74 68 20 74 65 73 74 5f 63 68 61 6e 6e 65  path test_channe
af60: 6c 5d 5d 20 24 73 75 66 66 69 78 5d 5d 5d 0d 0a  l]] $suffix]]]..
af70: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
af80: 6f 63 20 74 72 79 43 6f 70 79 45 78 74 65 72 6e  oc tryCopyExtern
af90: 61 6c 46 69 6c 65 20 7b 0d 0a 20 20 20 20 20 20  alFile {..      
afa0: 20 20 20 20 20 20 66 69 6c 65 4e 61 6d 65 20 7b        fileName {
afb0: 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20 7b 6e 65  platform ""} {ne
afc0: 77 46 69 6c 65 4e 61 6d 65 20 22 22 7d 20 7b 76  wFileName ""} {v
afd0: 65 72 62 6f 73 65 20 66 61 6c 73 65 7d 20 7d 20  erbose false} } 
afe0: 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 73 6f 75  {..      set sou
aff0: 72 63 65 46 69 6c 65 4e 61 6d 65 20 5b 67 65 74  rceFileName [get
b000: 45 78 74 65 72 6e 61 6c 46 69 6c 65 4e 61 6d 65  ExternalFileName
b010: 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20   $fileName].... 
b020: 20 20 20 20 20 69 66 20 7b 21 5b 66 69 6c 65 20       if {![file 
b030: 65 78 69 73 74 73 20 24 73 6f 75 72 63 65 46 69  exists $sourceFi
b040: 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d  leName]} then {.
b050: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 24 76 65  .        if {$ve
b060: 72 62 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20  rbose} then {.. 
b070: 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
b080: 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
b090: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
b0a0: 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
b0b0: 2d 20 73 6b 69 70 70 65 64 20 63 6f 70 79 69 6e  - skipped copyin
b0c0: 67 20 65 78 74 65 72 6e 61 6c 20 66 69 6c 65 20  g external file 
b0d0: 5c 22 22 20 24 73 6f 75 72 63 65 46 69 6c 65 4e  \"" $sourceFileN
b0e0: 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ame \..         
b0f0: 20 20 20 20 20 22 5c 22 2c 20 69 74 20 64 6f 65       "\", it doe
b100: 73 20 6e 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d  s not exist\n"].
b110: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
b120: 20 20 20 20 72 65 74 75 72 6e 0d 0a 20 20 20 20      return..    
b130: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20    }....      if 
b140: 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
b150: 24 6e 65 77 46 69 6c 65 4e 61 6d 65 5d 20 3e 20  $newFileName] > 
b160: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
b170: 20 20 20 73 65 74 20 74 61 72 67 65 74 46 69 6c     set targetFil
b180: 65 4e 61 6d 65 20 5b 67 65 74 42 69 6e 61 72 79  eName [getBinary
b190: 46 69 6c 65 4e 61 6d 65 20 24 6e 65 77 46 69 6c  FileName $newFil
b1a0: 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 5d  eName $platform]
b1b0: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
b1c0: 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 74 61  ..        set ta
b1d0: 72 67 65 74 46 69 6c 65 4e 61 6d 65 20 5b 67 65  rgetFileName [ge
b1e0: 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20  tBinaryFileName 
b1f0: 24 66 69 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66  $fileName $platf
b200: 6f 72 6d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  orm]..      }...
b210: 0a 20 20 20 20 20 20 73 65 74 20 74 61 72 67 65  .      set targe
b220: 74 44 69 72 65 63 74 6f 72 79 20 5b 66 69 6c 65  tDirectory [file
b230: 20 64 69 72 6e 61 6d 65 20 24 74 61 72 67 65 74   dirname $target
b240: 46 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20  FileName]....   
b250: 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d     if {[catch {.
b260: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 66  .        if {![f
b270: 69 6c 65 20 65 78 69 73 74 73 20 24 74 61 72 67  ile exists $targ
b280: 65 74 44 69 72 65 63 74 6f 72 79 5d 7d 20 74 68  etDirectory]} th
b290: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
b2a0: 66 69 6c 65 20 6d 6b 64 69 72 20 24 74 61 72 67  file mkdir $targ
b2b0: 65 74 44 69 72 65 63 74 6f 72 79 0d 0a 20 20 20  etDirectory..   
b2c0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
b2d0: 66 69 6c 65 20 63 6f 70 79 20 2d 66 6f 72 63 65  file copy -force
b2e0: 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65   $sourceFileName
b2f0: 20 24 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65   $targetFileName
b300: 0d 0a 20 20 20 20 20 20 7d 5d 20 3d 3d 20 30 7d  ..      }] == 0}
b310: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
b320: 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
b330: 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
b340: 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
b350: 20 20 22 2d 2d 2d 2d 20 63 6f 70 69 65 64 20 65    "---- copied e
b360: 78 74 65 72 6e 61 6c 20 66 69 6c 65 20 66 72 6f  xternal file fro
b370: 6d 20 5c 22 22 20 24 73 6f 75 72 63 65 46 69 6c  m \"" $sourceFil
b380: 65 4e 61 6d 65 20 22 5c 22 20 74 6f 20 5c 22 22  eName "\" to \""
b390: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
b3a0: 24 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 20  $targetFileName 
b3b0: 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 20 65  \"\n]..      } e
b3c0: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74  lse {..        t
b3d0: 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
b3e0: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
b3f0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
b400: 22 2d 2d 2d 2d 20 66 61 69 6c 65 64 20 74 6f 20  "---- failed to 
b410: 63 6f 70 79 20 65 78 74 65 72 6e 61 6c 20 66 69  copy external fi
b420: 6c 65 20 66 72 6f 6d 20 5c 22 22 20 24 73 6f 75  le from \"" $sou
b430: 72 63 65 46 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20  rceFileName \.. 
b440: 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 20 74             "\" t
b450: 6f 20 5c 22 22 20 24 74 61 72 67 65 74 46 69 6c  o \"" $targetFil
b460: 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20  eName \"\n]..   
b470: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
b480: 20 20 20 20 70 72 6f 63 20 74 72 79 43 6f 70 79      proc tryCopy
b490: 42 69 6e 61 72 79 46 69 6c 65 20 7b 0d 0a 20 20  BinaryFile {..  
b4a0: 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 4e 61            fileNa
b4b0: 6d 65 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d  me {platform ""}
b4c0: 20 7b 6e 65 77 46 69 6c 65 4e 61 6d 65 20 22 22   {newFileName ""
b4d0: 7d 20 7b 76 65 72 62 6f 73 65 20 66 61 6c 73 65  } {verbose false
b4e0: 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74  } } {..      set
b4f0: 20 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20   sourceFileName 
b500: 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61  [getBinaryFileNa
b510: 6d 65 20 24 66 69 6c 65 4e 61 6d 65 20 24 70 6c  me $fileName $pl
b520: 61 74 66 6f 72 6d 5d 0d 0a 0d 0a 20 20 20 20 20  atform]....     
b530: 20 69 66 20 7b 21 5b 66 69 6c 65 20 65 78 69 73   if {![file exis
b540: 74 73 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61  ts $sourceFileNa
b550: 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  me]} then {..   
b560: 20 20 20 20 20 69 66 20 7b 24 76 65 72 62 6f 73       if {$verbos
b570: 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  e} then {..     
b580: 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
b590: 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
b5a0: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
b5b0: 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6b          "---- sk
b5c0: 69 70 70 65 64 20 63 6f 70 79 69 6e 67 20 62 69  ipped copying bi
b5d0: 6e 61 72 79 20 66 69 6c 65 20 5c 22 22 20 24 73  nary file \"" $s
b5e0: 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 5c 0d  ourceFileName \.
b5f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
b600: 5c 22 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20  \", it does not 
b610: 65 78 69 73 74 5c 6e 22 5d 0d 0a 20 20 20 20 20  exist\n"]..     
b620: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 72 65     }..        re
b630: 74 75 72 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  turn..      }...
b640: 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69  .      if {[stri
b650: 6e 67 20 6c 65 6e 67 74 68 20 24 6e 65 77 46 69  ng length $newFi
b660: 6c 65 4e 61 6d 65 5d 20 3e 20 30 7d 20 74 68 65  leName] > 0} the
b670: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74  n {..        set
b680: 20 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 20   targetFileName 
b690: 5b 67 65 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d  [getBuildFileNam
b6a0: 65 20 24 6e 65 77 46 69 6c 65 4e 61 6d 65 20 24  e $newFileName $
b6b0: 70 6c 61 74 66 6f 72 6d 5d 0d 0a 20 20 20 20 20  platform]..     
b6c0: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
b6d0: 20 20 20 73 65 74 20 74 61 72 67 65 74 46 69 6c     set targetFil
b6e0: 65 4e 61 6d 65 20 5b 67 65 74 42 75 69 6c 64 46  eName [getBuildF
b6f0: 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d  ileName $fileNam
b700: 65 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a 20 20  e $platform]..  
b710: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 73      }....      s
b720: 65 74 20 74 61 72 67 65 74 44 69 72 65 63 74 6f  et targetDirecto
b730: 72 79 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65  ry [file dirname
b740: 20 24 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65   $targetFileName
b750: 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  ]....      if {[
b760: 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
b770: 20 69 66 20 7b 21 5b 66 69 6c 65 20 65 78 69 73   if {![file exis
b780: 74 73 20 24 74 61 72 67 65 74 44 69 72 65 63 74  ts $targetDirect
b790: 6f 72 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ory]} then {..  
b7a0: 20 20 20 20 20 20 20 20 66 69 6c 65 20 6d 6b 64          file mkd
b7b0: 69 72 20 24 74 61 72 67 65 74 44 69 72 65 63 74  ir $targetDirect
b7c0: 6f 72 79 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  ory..        }..
b7d0: 20 20 20 20 20 20 20 20 66 69 6c 65 20 63 6f 70          file cop
b7e0: 79 20 2d 66 6f 72 63 65 20 24 73 6f 75 72 63 65  y -force $source
b7f0: 46 69 6c 65 4e 61 6d 65 20 24 74 61 72 67 65 74  FileName $target
b800: 46 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20  FileName..      
b810: 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  }] == 0} then {.
b820: 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
b830: 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
b840: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
b850: 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
b860: 63 6f 70 69 65 64 20 62 69 6e 61 72 79 20 66 69  copied binary fi
b870: 6c 65 20 66 72 6f 6d 20 5c 22 22 20 24 73 6f 75  le from \"" $sou
b880: 72 63 65 46 69 6c 65 4e 61 6d 65 20 22 5c 22 20  rceFileName "\" 
b890: 74 6f 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20  to \"" \..      
b8a0: 20 20 20 20 20 20 24 74 61 72 67 65 74 46 69 6c        $targetFil
b8b0: 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20  eName \"\n]..   
b8c0: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
b8d0: 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
b8e0: 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
b8f0: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
b900: 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 61 69 6c        "---- fail
b910: 65 64 20 74 6f 20 63 6f 70 79 20 62 69 6e 61 72  ed to copy binar
b920: 79 20 66 69 6c 65 20 66 72 6f 6d 20 5c 22 22 20  y file from \"" 
b930: 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20  $sourceFileName 
b940: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  \..            "
b950: 5c 22 20 74 6f 20 5c 22 22 20 24 74 61 72 67 65  \" to \"" $targe
b960: 74 46 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d  tFileName \"\n].
b970: 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
b980: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 74 72 79  ....    proc try
b990: 43 6f 70 79 42 75 69 6c 64 46 69 6c 65 20 7b 0d  CopyBuildFile {.
b9a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c  .            fil
b9b0: 65 4e 61 6d 65 20 7b 70 6c 61 74 66 6f 72 6d 20  eName {platform 
b9c0: 22 22 7d 20 7b 6e 65 77 46 69 6c 65 4e 61 6d 65  ""} {newFileName
b9d0: 20 22 22 7d 20 7b 76 65 72 62 6f 73 65 20 66 61   ""} {verbose fa
b9e0: 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20  lse} } {..      
b9f0: 73 65 74 20 73 6f 75 72 63 65 46 69 6c 65 4e 61  set sourceFileNa
ba00: 6d 65 20 5b 67 65 74 42 75 69 6c 64 46 69 6c 65  me [getBuildFile
ba10: 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 20 24  Name $fileName $
ba20: 70 6c 61 74 66 6f 72 6d 5d 0d 0a 0d 0a 20 20 20  platform]....   
ba30: 20 20 20 69 66 20 7b 21 5b 66 69 6c 65 20 65 78     if {![file ex
ba40: 69 73 74 73 20 24 73 6f 75 72 63 65 46 69 6c 65  ists $sourceFile
ba50: 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  Name]} then {.. 
ba60: 20 20 20 20 20 20 20 69 66 20 7b 24 76 65 72 62         if {$verb
ba70: 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ose} then {..   
ba80: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
ba90: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
baa0: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
bab0: 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
bac0: 73 6b 69 70 70 65 64 20 63 6f 70 79 69 6e 67 20  skipped copying 
bad0: 62 75 69 6c 64 20 66 69 6c 65 20 5c 22 22 20 24  build file \"" $
bae0: 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 5c  sourceFileName \
baf0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
bb00: 22 5c 22 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74  "\", it does not
bb10: 20 65 78 69 73 74 5c 6e 22 5d 0d 0a 20 20 20 20   exist\n"]..    
bb20: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 72      }..        r
bb30: 65 74 75 72 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a  eturn..      }..
bb40: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72  ..      if {[str
bb50: 69 6e 67 20 6c 65 6e 67 74 68 20 24 6e 65 77 46  ing length $newF
bb60: 69 6c 65 4e 61 6d 65 5d 20 3e 20 30 7d 20 74 68  ileName] > 0} th
bb70: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65  en {..        se
bb80: 74 20 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65  t targetFileName
bb90: 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e   [getBinaryFileN
bba0: 61 6d 65 20 24 6e 65 77 46 69 6c 65 4e 61 6d 65  ame $newFileName
bbb0: 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a 20 20 20   $platform]..   
bbc0: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
bbd0: 20 20 20 20 20 73 65 74 20 74 61 72 67 65 74 46       set targetF
bbe0: 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42 69 6e 61  ileName [getBina
bbf0: 72 79 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65  ryFileName $file
bc00: 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 5d 0d  Name $platform].
bc10: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
bc20: 20 20 73 65 74 20 74 61 72 67 65 74 44 69 72 65    set targetDire
bc30: 63 74 6f 72 79 20 5b 66 69 6c 65 20 64 69 72 6e  ctory [file dirn
bc40: 61 6d 65 20 24 74 61 72 67 65 74 46 69 6c 65 4e  ame $targetFileN
bc50: 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66  ame]....      if
bc60: 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
bc70: 20 20 20 20 69 66 20 7b 21 5b 66 69 6c 65 20 65      if {![file e
bc80: 78 69 73 74 73 20 24 74 61 72 67 65 74 44 69 72  xists $targetDir
bc90: 65 63 74 6f 72 79 5d 7d 20 74 68 65 6e 20 7b 0d  ectory]} then {.
bca0: 0a 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20  .          file 
bcb0: 6d 6b 64 69 72 20 24 74 61 72 67 65 74 44 69 72  mkdir $targetDir
bcc0: 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 20 20  ectory..        
bcd0: 7d 0d 0a 20 20 20 20 20 20 20 20 66 69 6c 65 20  }..        file 
bce0: 63 6f 70 79 20 2d 66 6f 72 63 65 20 24 73 6f 75  copy -force $sou
bcf0: 72 63 65 46 69 6c 65 4e 61 6d 65 20 24 74 61 72  rceFileName $tar
bd00: 67 65 74 46 69 6c 65 4e 61 6d 65 0d 0a 20 20 20  getFileName..   
bd10: 20 20 20 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e     }] == 0} then
bd20: 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   {..        tput
bd30: 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
bd40: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
bd50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d  .            "--
bd60: 2d 2d 20 63 6f 70 69 65 64 20 62 75 69 6c 64 20  -- copied build 
bd70: 66 69 6c 65 20 66 72 6f 6d 20 5c 22 22 20 24 73  file from \"" $s
bd80: 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 22 5c  ourceFileName "\
bd90: 22 20 74 6f 20 5c 22 22 20 5c 0d 0a 20 20 20 20  " to \"" \..    
bda0: 20 20 20 20 20 20 20 20 24 74 61 72 67 65 74 46          $targetF
bdb0: 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20  ileName \"\n].. 
bdc0: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
bdd0: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
bde0: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
bdf0: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
be00: 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 61          "---- fa
be10: 69 6c 65 64 20 74 6f 20 63 6f 70 79 20 62 75 69  iled to copy bui
be20: 6c 64 20 66 69 6c 65 20 66 72 6f 6d 20 5c 22 22  ld file from \""
be30: 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65   $sourceFileName
be40: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
be50: 22 5c 22 20 74 6f 20 5c 22 22 20 24 74 61 72 67  "\" to \"" $targ
be60: 65 74 46 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d  etFileName \"\n]
be70: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
be80: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 74 72  .....    proc tr
be90: 79 44 65 6c 65 74 65 42 69 6e 61 72 79 46 69 6c  yDeleteBinaryFil
bea0: 65 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7b 70 6c  e { fileName {pl
beb0: 61 74 66 6f 72 6d 20 22 22 7d 20 7b 76 65 72 62  atform ""} {verb
bec0: 6f 73 65 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a  ose false} } {..
bed0: 20 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61        set fileNa
bee0: 6d 65 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c  me [getBinaryFil
bef0: 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 20  eName $fileName 
bf00: 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a 0d 0a 20 20  $platform]....  
bf10: 20 20 20 20 69 66 20 7b 21 5b 66 69 6c 65 20 65      if {![file e
bf20: 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d  xists $fileName]
bf30: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
bf40: 20 20 69 66 20 7b 24 76 65 72 62 6f 73 65 7d 20    if {$verbose} 
bf50: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
bf60: 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
bf70: 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
bf80: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
bf90: 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6b 69 70 70       "---- skipp
bfa0: 65 64 20 64 65 6c 65 74 69 6e 67 20 62 69 6e 61  ed deleting bina
bfb0: 72 79 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c  ry file \"" $fil
bfc0: 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20  eName \..       
bfd0: 20 20 20 20 20 20 20 22 5c 22 2c 20 69 74 20 64         "\", it d
bfe0: 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 5c 6e 22  oes not exist\n"
bff0: 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  ]..        }..  
c000: 20 20 20 20 20 20 72 65 74 75 72 6e 0d 0a 20 20        return..  
c010: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69      }....      i
c020: 66 20 7b 5b 63 61 74 63 68 20 7b 66 69 6c 65 20  f {[catch {file 
c030: 64 65 6c 65 74 65 20 24 66 69 6c 65 4e 61 6d 65  delete $fileName
c040: 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  }] == 0} then {.
c050: 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
c060: 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
c070: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
c080: 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
c090: 64 65 6c 65 74 65 64 20 62 69 6e 61 72 79 20 66  deleted binary f
c0a0: 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d  ile \"" $fileNam
c0b0: 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d  e \"\n]..      }
c0c0: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
c0d0: 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
c0e0: 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
c0f0: 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
c100: 20 20 22 2d 2d 2d 2d 20 66 61 69 6c 65 64 20 74    "---- failed t
c110: 6f 20 64 65 6c 65 74 65 20 62 69 6e 61 72 79 20  o delete binary 
c120: 66 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e 61  file \"" $fileNa
c130: 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20  me \"\n]..      
c140: 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
c150: 20 70 72 6f 63 20 74 72 79 44 65 6c 65 74 65 42   proc tryDeleteB
c160: 75 69 6c 64 46 69 6c 65 20 7b 20 66 69 6c 65 4e  uildFile { fileN
c170: 61 6d 65 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22  ame {platform ""
c180: 7d 20 7b 76 65 72 62 6f 73 65 20 66 61 6c 73 65  } {verbose false
c190: 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74  } } {..      set
c1a0: 20 66 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42 75   fileName [getBu
c1b0: 69 6c 64 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c  ildFileName $fil
c1c0: 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 5d  eName $platform]
c1d0: 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b  ....      if {![
c1e0: 66 69 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c  file exists $fil
c1f0: 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a  eName]} then {..
c200: 20 20 20 20 20 20 20 20 69 66 20 7b 24 76 65 72          if {$ver
c210: 62 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  bose} then {..  
c220: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
c230: 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
c240: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
c250: 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
c260: 20 73 6b 69 70 70 65 64 20 64 65 6c 65 74 69 6e   skipped deletin
c270: 67 20 62 75 69 6c 64 20 66 69 6c 65 20 5c 22 22  g build file \""
c280: 20 24 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20   $fileName \..  
c290: 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c              "\",
c2a0: 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69   it does not exi
c2b0: 73 74 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20  st\n"]..        
c2c0: 7d 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  }..        retur
c2d0: 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  n..      }....  
c2e0: 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
c2f0: 66 69 6c 65 20 64 65 6c 65 74 65 20 24 66 69 6c  file delete $fil
c300: 65 4e 61 6d 65 7d 5d 20 3d 3d 20 30 7d 20 74 68  eName}] == 0} th
c310: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70  en {..        tp
c320: 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
c330: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
c340: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  \..            "
c350: 2d 2d 2d 2d 20 64 65 6c 65 74 65 64 20 62 75 69  ---- deleted bui
c360: 6c 64 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c  ld file \"" $fil
c370: 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20  eName \"\n]..   
c380: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
c390: 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
c3a0: 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
c3b0: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
c3c0: 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 61 69 6c        "---- fail
c3d0: 65 64 20 74 6f 20 64 65 6c 65 74 65 20 62 75 69  ed to delete bui
c3e0: 6c 64 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c  ld file \"" $fil
c3f0: 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20  eName \"\n]..   
c400: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
c410: 20 20 20 20 70 72 6f 63 20 74 72 79 43 6f 70 79      proc tryCopy
c420: 41 73 73 65 6d 62 6c 79 20 7b 0d 0a 20 20 20 20  Assembly {..    
c430: 20 20 20 20 20 20 20 20 66 69 6c 65 4e 61 6d 65          fileName
c440: 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20 7b   {platform ""} {
c450: 70 64 62 20 74 72 75 65 7d 20 7b 76 65 72 62 6f  pdb true} {verbo
c460: 73 65 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20  se false} } {.. 
c470: 20 20 20 20 20 74 72 79 43 6f 70 79 42 75 69 6c       tryCopyBuil
c480: 64 46 69 6c 65 20 24 66 69 6c 65 4e 61 6d 65 20  dFile $fileName 
c490: 24 70 6c 61 74 66 6f 72 6d 20 22 22 20 24 76 65  $platform "" $ve
c4a0: 72 62 6f 73 65 0d 0a 0d 0a 20 20 20 20 20 20 69  rbose....      i
c4b0: 66 20 7b 24 70 64 62 7d 20 74 68 65 6e 20 7b 0d  f {$pdb} then {.
c4c0: 0a 20 20 20 20 20 20 20 20 74 72 79 43 6f 70 79  .        tryCopy
c4d0: 42 75 69 6c 64 46 69 6c 65 20 5b 61 70 70 65 6e  BuildFile [appen
c4e0: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
c4f0: 20 20 20 20 20 5b 66 69 6c 65 20 72 6f 6f 74 6e       [file rootn
c500: 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 5d 20 2e  ame $fileName] .
c510: 70 64 62 5d 20 24 70 6c 61 74 66 6f 72 6d 20 22  pdb] $platform "
c520: 22 20 24 76 65 72 62 6f 73 65 0d 0a 20 20 20 20  " $verbose..    
c530: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
c540: 20 20 20 70 72 6f 63 20 74 72 79 44 65 6c 65 74     proc tryDelet
c550: 65 41 73 73 65 6d 62 6c 79 20 7b 0d 0a 20 20 20  eAssembly {..   
c560: 20 20 20 20 20 20 20 20 20 66 69 6c 65 4e 61 6d           fileNam
c570: 65 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20  e {platform ""} 
c580: 7b 70 64 62 20 74 72 75 65 7d 20 7b 76 65 72 62  {pdb true} {verb
c590: 6f 73 65 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a  ose false} } {..
c5a0: 20 20 20 20 20 20 74 72 79 44 65 6c 65 74 65 42        tryDeleteB
c5b0: 69 6e 61 72 79 46 69 6c 65 20 24 66 69 6c 65 4e  inaryFile $fileN
c5c0: 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 20 24 76  ame $platform $v
c5d0: 65 72 62 6f 73 65 0d 0a 0d 0a 20 20 20 20 20 20  erbose....      
c5e0: 69 66 20 7b 24 70 64 62 7d 20 74 68 65 6e 20 7b  if {$pdb} then {
c5f0: 0d 0a 20 20 20 20 20 20 20 20 74 72 79 44 65 6c  ..        tryDel
c600: 65 74 65 42 69 6e 61 72 79 46 69 6c 65 20 5b 61  eteBinaryFile [a
c610: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
c620: 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 72           [file r
c630: 6f 6f 74 6e 61 6d 65 20 24 66 69 6c 65 4e 61 6d  ootname $fileNam
c640: 65 5d 20 2e 70 64 62 5d 20 24 70 6c 61 74 66 6f  e] .pdb] $platfo
c650: 72 6d 20 24 76 65 72 62 6f 73 65 0d 0a 20 20 20  rm $verbose..   
c660: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
c670: 20 20 20 20 70 72 6f 63 20 74 72 79 4c 6f 61 64      proc tryLoad
c680: 41 73 73 65 6d 62 6c 79 20 7b 20 66 69 6c 65 4e  Assembly { fileN
c690: 61 6d 65 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22  ame {platform ""
c6a0: 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74  } } {..      set
c6b0: 20 66 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42 69   fileName [getBi
c6c0: 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 24 66 69  naryFileName $fi
c6d0: 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d  leName $platform
c6e0: 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  ]....      if {[
c6f0: 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
c700: 20 73 65 74 20 61 73 73 65 6d 62 6c 79 20 5b 6f   set assembly [o
c710: 62 6a 65 63 74 20 6c 6f 61 64 20 2d 6c 6f 61 64  bject load -load
c720: 74 79 70 65 20 46 69 6c 65 20 2d 61 6c 69 61 73  type File -alias
c730: 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20   $fileName]..   
c740: 20 20 20 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e     }] == 0} then
c750: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
c760: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e         # NOTE: N
c770: 6f 77 2c 20 61 64 64 20 74 68 65 20 6e 65 63 65  ow, add the nece
c780: 73 73 61 72 79 20 74 65 73 74 20 63 6f 6e 73 74  ssary test const
c790: 72 61 69 6e 74 2e 0d 0a 20 20 20 20 20 20 20 20  raint...        
c7a0: 23 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f  #..        addCo
c7b0: 6e 73 74 72 61 69 6e 74 20 5b 66 69 6c 65 20 72  nstraint [file r
c7c0: 6f 6f 74 6e 61 6d 65 20 5b 66 69 6c 65 20 74 61  ootname [file ta
c7d0: 69 6c 20 24 66 69 6c 65 4e 61 6d 65 5d 5d 0d 0a  il $fileName]]..
c7e0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
c7f0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 47 72 61       # NOTE: Gra
c800: 62 20 74 68 65 20 69 6d 61 67 65 20 72 75 6e 74  b the image runt
c810: 69 6d 65 20 76 65 72 73 69 6f 6e 20 66 72 6f 6d  ime version from
c820: 20 74 68 65 20 61 73 73 65 6d 62 6c 79 20 62 65   the assembly be
c830: 63 61 75 73 65 0d 0a 20 20 20 20 20 20 20 20 23  cause..        #
c840: 20 20 20 20 20 20 20 73 65 76 65 72 61 6c 20 74         several t
c850: 65 73 74 73 20 72 65 6c 79 20 6f 6e 20 69 74 20  ests rely on it 
c860: 68 61 76 69 6e 67 20 61 20 63 65 72 74 61 69 6e  having a certain
c870: 20 76 61 6c 75 65 2e 0d 0a 20 20 20 20 20 20 20   value...       
c880: 20 23 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43   #..        addC
c890: 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e  onstraint [appen
c8a0: 64 41 72 67 73 20 5b 66 69 6c 65 20 74 61 69 6c  dArgs [file tail
c8b0: 20 24 66 69 6c 65 4e 61 6d 65 5d 20 5f 20 5c 0d   $fileName] _ \.
c8c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 24 61  .            [$a
c8d0: 73 73 65 6d 62 6c 79 20 49 6d 61 67 65 52 75 6e  ssembly ImageRun
c8e0: 74 69 6d 65 56 65 72 73 69 6f 6e 5d 5d 0d 0a 0d  timeVersion]]...
c8f0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
c900: 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 74 75      # NOTE: Retu
c910: 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68  rn the full path
c920: 20 6f 66 20 74 68 65 20 6c 6f 61 64 65 64 20 66   of the loaded f
c930: 69 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ile...        #.
c940: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
c950: 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20  $fileName..     
c960: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75   }....      retu
c970: 72 6e 20 22 22 0d 0a 20 20 20 20 7d 0d 0a 0c 0d  rn ""..    }....
c980: 0a 20 20 20 20 70 72 6f 63 20 69 73 53 51 4c 69  .    proc isSQLi
c990: 74 65 52 65 61 64 79 20 7b 7d 20 7b 0d 0a 20 20  teReady {} {..  
c9a0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
c9b0: 4f 54 45 3a 20 54 68 69 73 20 70 72 6f 63 65 64  OTE: This proced
c9c0: 75 72 65 20 6d 75 73 74 20 72 65 74 75 72 6e 20  ure must return 
c9d0: 6e 6f 6e 2d 7a 65 72 6f 20 6f 6e 6c 79 20 69 66  non-zero only if
c9e0: 20 74 68 65 20 53 51 4c 69 74 65 20 6e 61 74 69   the SQLite nati
c9f0: 76 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ve..      #     
ca00: 20 20 6c 69 62 72 61 72 79 20 61 6e 64 20 74 68    library and th
ca10: 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  e System.Data.SQ
ca20: 4c 69 74 65 20 6d 61 6e 61 67 65 64 20 61 73 73  Lite managed ass
ca30: 65 6d 62 6c 79 20 61 72 65 20 6c 6f 61 64 65 64  embly are loaded
ca40: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
ca50: 61 6e 64 20 72 65 61 64 79 20 66 6f 72 20 75 73  and ready for us
ca60: 65 20 62 79 20 74 68 65 20 74 65 73 74 20 73 75  e by the test su
ca70: 69 74 65 2e 20 20 43 75 72 72 65 6e 74 6c 79 2c  ite.  Currently,
ca80: 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 0d   this procedure.
ca90: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73  .      #       s
caa0: 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20  hould be called 
cab0: 6f 6e 6c 79 20 61 66 74 65 72 20 74 68 65 20 5b  only after the [
cac0: 74 72 79 4c 6f 61 64 41 73 73 65 6d 62 6c 79 5d  tryLoadAssembly]
cad0: 20 70 72 6f 63 65 64 75 72 65 20 68 61 73 0d 0a   procedure has..
cae0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62 65        #       be
caf0: 65 6e 20 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f  en called to pro
cb00: 62 65 20 66 6f 72 20 74 68 65 20 53 79 73 74 65  be for the Syste
cb10: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 6d 61  m.Data.SQLite ma
cb20: 6e 61 67 65 64 20 61 73 73 65 6d 62 6c 79 0d 0a  naged assembly..
cb30: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61 6e        #       an
cb40: 64 20 74 68 65 20 5b 63 68 65 63 6b 46 6f 72 53  d the [checkForS
cb50: 51 4c 69 74 65 5d 20 70 72 6f 63 65 64 75 72 65  QLite] procedure
cb60: 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64   has been called
cb70: 20 74 6f 20 70 72 6f 62 65 20 66 6f 72 0d 0a 20   to probe for.. 
cb80: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
cb90: 20 53 51 4c 69 74 65 20 6e 61 74 69 76 65 20 6c   SQLite native l
cba0: 69 62 72 61 72 79 3b 20 6f 74 68 65 72 77 69 73  ibrary; otherwis
cbb0: 65 2c 20 74 68 69 73 20 70 72 6f 63 65 64 75 72  e, this procedur
cbc0: 65 20 77 69 6c 6c 20 73 69 6d 70 6c 79 0d 0a 20  e will simply.. 
cbd0: 20 20 20 20 20 23 20 20 20 20 20 20 20 61 6c 77       #       alw
cbe0: 61 79 73 20 72 65 74 75 72 6e 20 7a 65 72 6f 2e  ays return zero.
cbf0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
cc00: 20 72 65 74 75 72 6e 20 5b 65 78 70 72 20 7b 0d   return [expr {.
cc10: 0a 20 20 20 20 20 20 20 20 5b 68 61 76 65 43 6f  .        [haveCo
cc20: 6e 73 74 72 61 69 6e 74 20 53 79 73 74 65 6d 2e  nstraint System.
cc30: 44 61 74 61 2e 53 51 4c 69 74 65 5d 20 26 26 20  Data.SQLite] && 
cc40: 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20  [haveConstraint 
cc50: 53 51 4c 69 74 65 5d 0d 0a 20 20 20 20 20 20 7d  SQLite]..      }
cc60: 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  ]..    }.....   
cc70: 20 70 72 6f 63 20 6d 61 74 63 68 50 6c 61 74 66   proc matchPlatf
cc80: 6f 72 6d 20 7b 20 70 6c 61 74 66 6f 72 6d 20 7d  orm { platform }
cc90: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
cca0: 20 20 20 23 20 4e 4f 54 45 3a 20 41 6e 20 65 6d     # NOTE: An em
ccb0: 70 74 79 20 73 74 72 69 6e 67 20 66 6f 72 20 74  pty string for t
ccc0: 68 65 20 70 6c 61 74 66 6f 72 6d 20 6d 65 61 6e  he platform mean
ccd0: 73 20 74 68 61 74 20 74 68 65 20 62 75 69 6c 64  s that the build
cce0: 20 69 73 20 6e 6f 74 0d 0a 20 20 20 20 20 20 23   is not..      #
ccf0: 20 20 20 20 20 20 20 5b 70 72 69 6d 61 72 69 6c         [primaril
cd00: 79 5d 20 61 20 6e 61 74 69 76 65 20 62 75 69 6c  y] a native buil
cd10: 64 3b 20 74 68 65 72 65 66 6f 72 65 2c 20 69 74  d; therefore, it
cd20: 20 61 6c 77 61 79 73 20 6d 61 74 63 68 65 73 2e   always matches.
cd30: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
cd40: 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
cd50: 67 74 68 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3d  gth $platform] =
cd60: 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
cd70: 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65       return true
cd80: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
cd90: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
cda0: 54 45 3a 20 44 6f 65 73 20 74 68 65 20 73 70 65  TE: Does the spe
cdb0: 63 69 66 69 65 64 20 70 6c 61 74 66 6f 72 6d 20  cified platform 
cdc0: 6d 61 74 63 68 20 75 70 20 74 6f 20 74 68 65 20  match up to the 
cdd0: 63 75 72 72 65 6e 74 20 70 72 6f 63 65 73 73 3f  current process?
cde0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
cdf0: 20 69 66 20 7b 24 70 6c 61 74 66 6f 72 6d 20 65   if {$platform e
ce00: 71 20 5b 6d 61 63 68 69 6e 65 54 6f 50 6c 61 74  q [machineToPlat
ce10: 66 6f 72 6d 20 24 3a 3a 74 63 6c 5f 70 6c 61 74  form $::tcl_plat
ce20: 66 6f 72 6d 28 6d 61 63 68 69 6e 65 29 5d 7d 20  form(machine)]} 
ce30: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
ce40: 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20  return true..   
ce50: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
ce60: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54  .      # NOTE: T
ce70: 68 65 20 73 70 65 63 69 66 69 65 64 20 70 6c 61  he specified pla
ce80: 74 66 6f 72 6d 20 64 6f 65 73 20 6e 6f 74 20 6d  tform does not m
ce90: 61 74 63 68 20 75 70 20 77 69 74 68 20 74 68 65  atch up with the
cea0: 20 70 6c 61 74 66 6f 72 6d 0d 0a 20 20 20 20 20   platform..     
ceb0: 20 23 20 20 20 20 20 20 20 66 6f 72 20 74 68 65   #       for the
cec0: 20 63 75 72 72 65 6e 74 20 70 72 6f 63 65 73 73   current process
ced0: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
cee0: 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a    return false..
cef0: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
cf00: 6f 63 20 68 61 76 65 53 51 4c 69 74 65 4f 62 6a  oc haveSQLiteObj
cf10: 65 63 74 43 6f 6d 6d 61 6e 64 20 7b 7d 20 7b 0d  ectCommand {} {.
cf20: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
cf30: 23 20 4e 4f 54 45 3a 20 49 73 20 74 68 65 20 5b  # NOTE: Is the [
cf40: 6f 62 6a 65 63 74 5d 20 63 6f 6d 6d 61 6e 64 20  object] command 
cf50: 63 75 72 72 65 6e 74 6c 79 20 61 76 61 69 6c 61  currently availa
cf60: 62 6c 65 3f 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ble?..      #.. 
cf70: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 65 78 70       return [exp
cf80: 72 20 7b 5b 6c 6c 65 6e 67 74 68 20 5b 69 6e 66  r {[llength [inf
cf90: 6f 20 63 6f 6d 6d 61 6e 64 73 20 6f 62 6a 65 63  o commands objec
cfa0: 74 5d 5d 20 3e 20 30 7d 5d 0d 0a 20 20 20 20 7d  t]] > 0}]..    }
cfb0: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 68  .....    proc ch
cfc0: 65 63 6b 46 6f 72 53 51 4c 69 74 65 4f 62 6a 65  eckForSQLiteObje
cfd0: 63 74 43 6f 6d 6d 61 6e 64 20 7b 20 63 68 61 6e  ctCommand { chan
cfe0: 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74  nel } {..      t
cff0: 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d  puts $channel "-
d000: 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72  --- checking for
d010: 20 5c 22 6f 62 6a 65 63 74 5c 22 20 63 6f 6d 6d   \"object\" comm
d020: 61 6e 64 20 75 73 61 67 65 2e 2e 2e 20 22 0d 0a  and usage... "..
d030: 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e  ..      if {![in
d040: 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 73  fo exists ::no(s
d050: 71 6c 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61  qliteObjectComma
d060: 6e 64 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  nd)] && \..     
d070: 20 20 20 20 20 5b 68 61 76 65 53 51 4c 69 74 65       [haveSQLite
d080: 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20  ObjectCommand]} 
d090: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
d0a0: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 79  tputs $channel y
d0b0: 65 73 5c 6e 0d 0a 20 20 20 20 20 20 7d 20 65 6c  es\n..      } el
d0c0: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  se {..        #.
d0d0: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
d0e0: 20 55 6e 6c 65 73 73 20 77 65 20 61 72 65 20 66   Unless we are f
d0f0: 6f 72 62 69 64 64 65 6e 20 66 72 6f 6d 20 64 6f  orbidden from do
d100: 69 6e 67 20 73 6f 2c 20 61 64 64 20 73 6f 6d 65  ing so, add some
d110: 20 63 6f 6e 73 74 72 61 69 6e 74 73 0d 0a 20 20   constraints..  
d120: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68        #       th
d130: 61 74 20 77 69 6c 6c 20 61 6c 6c 6f 77 20 6d 6f  at will allow mo
d140: 73 74 20 6f 66 20 74 68 65 20 74 65 73 74 20 73  st of the test s
d150: 75 69 74 65 20 74 6f 20 72 75 6e 20 28 69 2e 65  uite to run (i.e
d160: 2e 20 74 68 6f 73 65 0d 0a 20 20 20 20 20 20 20  . those..       
d170: 20 23 20 20 20 20 20 20 20 74 65 73 74 73 20 74   #       tests t
d180: 68 61 74 20 64 6f 20 6e 6f 74 20 64 69 72 65 63  hat do not direc
d190: 74 6c 79 20 72 65 6c 79 20 75 70 6f 6e 20 74 68  tly rely upon th
d1a0: 65 20 5b 6f 62 6a 65 63 74 5d 20 63 6f 6d 6d 61  e [object] comma
d1b0: 6e 64 29 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  nd)...        #.
d1c0: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69  .        if {![i
d1d0: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
d1e0: 73 68 69 6d 53 51 4c 69 74 65 41 73 73 65 6d 62  shimSQLiteAssemb
d1f0: 6c 79 43 6f 6e 73 74 72 61 69 6e 74 73 29 5d 7d  lyConstraints)]}
d200: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
d210: 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74     addConstraint
d220: 20 53 51 4c 69 74 65 0d 0a 20 20 20 20 20 20 20   SQLite..       
d230: 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74     addConstraint
d240: 20 53 51 4c 69 74 65 49 6e 74 65 72 6f 70 0d 0a   SQLiteInterop..
d250: 20 20 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e            addCon
d260: 73 74 72 61 69 6e 74 20 53 79 73 74 65 6d 2e 44  straint System.D
d270: 61 74 61 2e 53 51 4c 69 74 65 0d 0a 20 20 20 20  ata.SQLite..    
d280: 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61        addConstra
d290: 69 6e 74 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  int System.Data.
d2a0: 53 51 4c 69 74 65 2e 45 6e 63 72 79 70 74 69 6f  SQLite.Encryptio
d2b0: 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 61 64 64  n..          add
d2c0: 43 6f 6e 73 74 72 61 69 6e 74 20 53 79 73 74 65  Constraint Syste
d2d0: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 4c 69  m.Data.SQLite.Li
d2e0: 6e 71 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  nq....          
d2f0: 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61  addConstraint [a
d300: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
d310: 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65             Syste
d320: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c  m.Data.SQLite.dl
d330: 6c 5f 76 20 5b 67 65 74 42 75 69 6c 64 43 6c 72  l_v [getBuildClr
d340: 56 65 72 73 69 6f 6e 5d 5d 0d 0a 20 20 20 20 20  Version]]..     
d350: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
d360: 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
d370: 73 20 3a 3a 6e 6f 28 73 68 69 6d 53 51 4c 69 74  s ::no(shimSQLit
d380: 65 44 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 43  eDefineConstantC
d390: 6f 6e 73 74 72 61 69 6e 74 73 29 5d 7d 20 74 68  onstraints)]} th
d3a0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
d3b0: 66 6f 72 65 61 63 68 20 64 65 66 69 6e 65 43 6f  foreach defineCo
d3c0: 6e 73 74 61 6e 74 20 5b 6c 69 73 74 20 5c 0d 0a  nstant [list \..
d3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 49 4e                IN
d3e0: 54 45 52 4f 50 5f 45 58 54 45 4e 53 49 4f 4e 5f  TEROP_EXTENSION_
d3f0: 46 55 4e 43 54 49 4f 4e 53 20 49 4e 54 45 52 4f  FUNCTIONS INTERO
d400: 50 5f 46 54 53 35 5f 45 58 54 45 4e 53 49 4f 4e  P_FTS5_EXTENSION
d410: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
d420: 20 20 49 4e 54 45 52 4f 50 5f 4a 53 4f 4e 31 5f    INTEROP_JSON1_
d430: 45 58 54 45 4e 53 49 4f 4e 20 49 4e 54 45 52 4f  EXTENSION INTERO
d440: 50 5f 50 45 52 43 45 4e 54 49 4c 45 5f 45 58 54  P_PERCENTILE_EXT
d450: 45 4e 53 49 4f 4e 20 5c 0d 0a 20 20 20 20 20 20  ENSION \..      
d460: 20 20 20 20 20 20 20 20 49 4e 54 45 52 4f 50 5f          INTEROP_
d470: 52 45 47 45 58 50 5f 45 58 54 45 4e 53 49 4f 4e  REGEXP_EXTENSION
d480: 20 49 4e 54 45 52 4f 50 5f 54 45 53 54 5f 45 58   INTEROP_TEST_EX
d490: 54 45 4e 53 49 4f 4e 20 5c 0d 0a 20 20 20 20 20  TENSION \..     
d4a0: 20 20 20 20 20 20 20 20 20 49 4e 54 45 52 4f 50           INTEROP
d4b0: 5f 54 4f 54 59 50 45 5f 45 58 54 45 4e 53 49 4f  _TOTYPE_EXTENSIO
d4c0: 4e 20 49 4e 54 45 52 4f 50 5f 56 49 52 54 55 41  N INTEROP_VIRTUA
d4d0: 4c 5f 54 41 42 4c 45 20 5c 0d 0a 20 20 20 20 20  L_TABLE \..     
d4e0: 20 20 20 20 20 20 20 20 20 55 53 45 5f 49 4e 54           USE_INT
d4f0: 45 52 4f 50 5f 44 4c 4c 5d 20 7b 0d 0a 20 20 20  EROP_DLL] {..   
d500: 20 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73           addCons
d510: 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
d520: 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
d530: 20 20 20 20 20 20 5b 67 65 74 53 51 4c 69 74 65        [getSQLite
d540: 44 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 50 72  DefineConstantPr
d550: 65 66 69 78 5d 20 24 64 65 66 69 6e 65 43 6f 6e  efix] $defineCon
d560: 73 74 61 6e 74 5d 0d 0a 20 20 20 20 20 20 20 20  stant]..        
d570: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
d580: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b  ..        if {![
d590: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
d5a0: 28 73 68 69 6d 53 51 4c 69 74 65 56 69 73 75 61  (shimSQLiteVisua
d5b0: 6c 53 74 75 64 69 6f 43 6f 6e 73 74 72 61 69 6e  lStudioConstrain
d5c0: 74 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ts)]} then {..  
d5d0: 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74          addConst
d5e0: 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67  raint [appendArg
d5f0: 73 20 76 69 73 75 61 6c 53 74 75 64 69 6f 20 5b  s visualStudio [
d600: 67 65 74 42 75 69 6c 64 59 65 61 72 5d 5d 0d 0a  getBuildYear]]..
d610: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
d620: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
d630: 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20  nel no\n..      
d640: 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
d650: 20 70 72 6f 63 20 63 68 61 6e 67 65 4e 61 74 69   proc changeNati
d660: 76 65 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20  veRuntimeOption 
d670: 7b 20 6e 61 74 69 76 65 20 7d 20 7b 0d 0a 20 20  { native } {..  
d680: 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67 74 68      if {[llength
d690: 20 5b 69 6e 66 6f 20 63 6f 6d 6d 61 6e 64 73 20   [info commands 
d6a0: 64 65 62 75 67 5d 5d 20 3e 20 30 20 26 26 20 5c  debug]] > 0 && \
d6b0: 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 6c 6c 65  ..          [lle
d6c0: 6e 67 74 68 20 5b 69 6e 66 6f 20 73 75 62 63 6f  ngth [info subco
d6d0: 6d 6d 61 6e 64 73 20 64 65 62 75 67 20 72 75 6e  mmands debug run
d6e0: 74 69 6d 65 6f 70 74 69 6f 6e 5d 5d 20 3e 20 30  timeoption]] > 0
d6f0: 20 26 26 20 5b 63 61 74 63 68 20 7b 0d 0a 20 20   && [catch {..  
d700: 20 20 20 20 20 20 64 65 62 75 67 20 72 75 6e 74        debug runt
d710: 69 6d 65 6f 70 74 69 6f 6e 20 5b 65 78 70 72 20  imeoption [expr 
d720: 7b 24 6e 61 74 69 76 65 20 3f 20 22 61 64 64 22  {$native ? "add"
d730: 20 3a 20 22 72 65 6d 6f 76 65 22 7d 5d 20 6e 61   : "remove"}] na
d740: 74 69 76 65 0d 0a 20 20 20 20 20 20 7d 5d 20 3d  tive..      }] =
d750: 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
d760: 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65       return true
d770: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
d780: 20 20 20 69 66 20 7b 5b 68 61 76 65 53 51 4c 69     if {[haveSQLi
d790: 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d  teObjectCommand]
d7a0: 20 26 26 20 5b 63 61 74 63 68 20 7b 0d 0a 20 20   && [catch {..  
d7b0: 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76        object inv
d7c0: 6f 6b 65 20 49 6e 74 65 72 70 72 65 74 65 72 2e  oke Interpreter.
d7d0: 47 65 74 41 63 74 69 76 65 20 5b 65 78 70 72 20  GetActive [expr 
d7e0: 7b 24 6e 61 74 69 76 65 20 3f 20 5c 0d 0a 20 20  {$native ? \..  
d7f0: 20 20 20 20 20 20 20 20 20 20 22 41 64 64 52 75            "AddRu
d800: 6e 74 69 6d 65 4f 70 74 69 6f 6e 22 20 3a 20 22  ntimeOption" : "
d810: 52 65 6d 6f 76 65 52 75 6e 74 69 6d 65 4f 70 74  RemoveRuntimeOpt
d820: 69 6f 6e 22 7d 5d 20 6e 61 74 69 76 65 0d 0a 20  ion"}] native.. 
d830: 20 20 20 20 20 7d 5d 20 3d 3d 20 30 7d 20 74 68       }] == 0} th
d840: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65  en {..        re
d850: 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20  turn true..     
d860: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75   }....      retu
d870: 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20 7d 0d  rn false..    }.
d880: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 68 65  ....    proc che
d890: 63 6b 46 6f 72 53 51 4c 69 74 65 42 75 69 6c 64  ckForSQLiteBuild
d8a0: 73 20 7b 20 63 68 61 6e 6e 65 6c 20 7b 73 65 6c  s { channel {sel
d8b0: 65 63 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a  ect false} } {..
d8c0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
d8d0: 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 66 6f 72   NOTE: Check for
d8e0: 20 65 76 65 72 79 20 70 6f 73 73 69 62 6c 65 20   every possible 
d8f0: 76 61 6c 69 64 20 63 6f 6d 62 69 6e 61 74 69 6f  valid combinatio
d900: 6e 20 6f 66 20 76 61 6c 75 65 73 20 75 73 65 64  n of values used
d910: 20 77 68 65 6e 0d 0a 20 20 20 20 20 20 23 20 20   when..      #  
d920: 20 20 20 20 20 6c 6f 63 61 74 69 6e 67 20 6f 75       locating ou
d930: 74 20 74 68 65 20 62 75 69 6c 64 20 6f 75 74 70  t the build outp
d940: 75 74 20 64 69 72 65 63 74 6f 72 79 2c 20 73 68  ut directory, sh
d950: 6f 77 69 6e 67 20 65 61 63 68 20 61 76 61 69 6c  owing each avail
d960: 61 62 6c 65 0d 0a 20 20 20 20 20 20 23 20 20 20  able..      #   
d970: 20 20 20 20 62 75 69 6c 64 20 76 61 72 69 61 74      build variat
d980: 69 6f 6e 20 61 6c 6f 6e 67 20 74 68 65 20 77 61  ion along the wa
d990: 79 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  y...      #..   
d9a0: 20 20 20 66 6f 72 65 61 63 68 20 6e 61 74 69 76     foreach nativ
d9b0: 65 20 5b 6c 69 73 74 20 66 61 6c 73 65 20 74 72  e [list false tr
d9c0: 75 65 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 66  ue] {..        f
d9d0: 6f 72 65 61 63 68 20 79 65 61 72 20 5b 67 65 74  oreach year [get
d9e0: 42 75 69 6c 64 59 65 61 72 73 5d 20 7b 0d 0a 20  BuildYears] {.. 
d9f0: 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
da00: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 5b   configuration [
da10: 67 65 74 42 75 69 6c 64 43 6f 6e 66 69 67 75 72  getBuildConfigur
da20: 61 74 69 6f 6e 73 5d 20 7b 0d 0a 20 20 20 20 20  ations] {..     
da30: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
da40: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69        # NOTE: Fi
da50: 67 75 72 65 20 6f 75 74 20 74 68 65 20 65 66 66  gure out the eff
da60: 65 63 74 69 76 65 20 62 75 69 6c 64 20 70 6c 61  ective build pla
da70: 74 66 6f 72 6d 2e 20 20 54 68 69 73 20 69 73 0d  tform.  This is.
da80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20  .            #  
da90: 20 20 20 20 20 62 61 73 65 64 20 6f 6e 20 77 68       based on wh
daa0: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 5b  ether or not a [
dab0: 70 72 69 6d 61 72 69 6c 79 5d 20 6e 61 74 69 76  primarily] nativ
dac0: 65 20 62 75 69 6c 64 0d 0a 20 20 20 20 20 20 20  e build..       
dad0: 20 20 20 20 20 23 20 20 20 20 20 20 20 69 73 20       #       is 
dae0: 62 65 69 6e 67 20 75 73 65 64 2e 20 20 46 6f 72  being used.  For
daf0: 20 5b 70 72 69 6d 61 72 69 6c 79 5d 20 6e 6f 6e   [primarily] non
db00: 2d 6e 61 74 69 76 65 20 62 75 69 6c 64 73 2c 0d  -native builds,.
db10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20  .            #  
db20: 20 20 20 20 20 74 68 69 73 20 77 69 6c 6c 20 62       this will b
db30: 65 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e  e an empty strin
db40: 67 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  g...            
db50: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  #..            s
db60: 65 74 20 70 6c 61 74 66 6f 72 6d 20 5b 67 65 74  et platform [get
db70: 42 75 69 6c 64 50 6c 61 74 66 6f 72 6d 20 24 6e  BuildPlatform $n
db80: 61 74 69 76 65 5d 0d 0a 0d 0a 20 20 20 20 20 20  ative]....      
db90: 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
dba0: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
dbb0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
dbc0: 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69      "---- checki
dbd0: 6e 67 20 66 6f 72 20 53 79 73 74 65 6d 2e 44 61  ng for System.Da
dbe0: 74 61 2e 53 51 4c 69 74 65 20 62 75 69 6c 64 20  ta.SQLite build 
dbf0: 5c 22 22 20 5b 65 78 70 72 20 5c 0d 0a 20 20 20  \"" [expr \..   
dc00: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 24 6e               {$n
dc10: 61 74 69 76 65 20 3f 20 22 6e 61 74 69 76 65 2f  ative ? "native/
dc20: 22 20 3a 20 22 22 7d 5d 20 5b 65 78 70 72 20 7b  " : ""}] [expr {
dc30: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 5c  [string length \
dc40: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
dc50: 20 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3e 20 30    $platform] > 0
dc60: 20 3f 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24   ? [appendArgs $
dc70: 70 6c 61 74 66 6f 72 6d 20 2f 5d 20 3a 20 22 22  platform /] : ""
dc80: 7d 5d 20 24 79 65 61 72 20 5c 0d 0a 20 20 20 20  }] $year \..    
dc90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 20 24 63              / $c
dca0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 22 5c 22  onfiguration "\"
dcb0: 2e 2e 2e 20 22 5d 0d 0a 0d 0a 20 20 20 20 20 20  ... "]....      
dcc0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
dcd0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69       # NOTE: Bui
dce0: 6c 64 20 74 68 65 20 66 75 6c 6c 79 20 71 75 61  ld the fully qua
dcf0: 6c 69 66 69 65 64 20 64 69 72 65 63 74 6f 72 79  lified directory
dd00: 20 77 68 65 72 65 20 74 68 65 20 6e 65 63 65 73   where the neces
dd10: 73 61 72 79 0d 0a 20 20 20 20 20 20 20 20 20 20  sary..          
dd20: 20 20 23 20 20 20 20 20 20 20 63 6f 6d 70 6f 6e    #       compon
dd30: 65 6e 74 73 20 66 6f 72 20 53 79 73 74 65 6d 2e  ents for System.
dd40: 44 61 74 61 2e 53 51 4c 69 74 65 20 73 68 6f 75  Data.SQLite shou
dd50: 6c 64 20 62 65 20 66 6f 75 6e 64 2e 0d 0a 20 20  ld be found...  
dd60: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
dd70: 20 20 20 20 20 20 20 20 20 73 65 74 20 64 69 72           set dir
dd80: 65 63 74 6f 72 79 20 5b 6a 6f 69 6e 42 75 69 6c  ectory [joinBuil
dd90: 64 44 69 72 65 63 74 6f 72 79 20 24 6e 61 74 69  dDirectory $nati
dda0: 76 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ve \..          
ddb0: 20 20 20 20 20 20 5b 67 65 74 42 75 69 6c 64 42        [getBuildB
ddc0: 61 73 65 44 69 72 65 63 74 6f 72 79 5d 20 24 79  aseDirectory] $y
ddd0: 65 61 72 20 24 70 6c 61 74 66 6f 72 6d 20 24 63  ear $platform $c
dde0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 5d 0d 0a 0d  onfiguration]...
ddf0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a  .            #..
de00: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f              # NO
de10: 54 45 3a 20 44 6f 20 74 68 65 20 6e 65 63 65 73  TE: Do the neces
de20: 73 61 72 79 20 66 69 6c 65 73 20 65 78 69 73 74  sary files exist
de30: 3f 20 20 43 75 72 72 65 6e 74 6c 79 2c 20 6e 6f  ?  Currently, no
de40: 20 6f 74 68 65 72 20 73 74 65 70 73 0d 0a 20 20   other steps..  
de50: 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
de60: 20 20 61 72 65 20 74 61 6b 65 6e 20 74 6f 20 76    are taken to v
de70: 65 72 69 66 79 20 74 68 69 73 20 62 75 69 6c 64  erify this build
de80: 20 69 73 20 61 63 74 75 61 6c 6c 79 20 76 69 61   is actually via
de90: 62 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ble...          
dea0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
deb0: 20 69 66 20 7b 5b 69 73 42 75 69 6c 64 41 76 61   if {[isBuildAva
dec0: 69 6c 61 62 6c 65 20 24 6e 61 74 69 76 65 20 24  ilable $native $
ded0: 64 69 72 65 63 74 6f 72 79 5d 7d 20 74 68 65 6e  directory]} then
dee0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
def0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
df00: 20 20 20 23 20 4e 4f 54 45 3a 20 57 68 65 6e 20     # NOTE: When 
df10: 69 6e 20 22 73 65 6c 65 63 74 22 20 6d 6f 64 65  in "select" mode
df20: 2c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  , automatically 
df30: 73 65 6c 65 63 74 20 74 68 65 20 66 69 72 73 74  select the first
df40: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
df50: 23 20 20 20 20 20 20 20 61 76 61 69 6c 61 62 6c  #       availabl
df60: 65 20 62 75 69 6c 64 20 6f 66 20 53 79 73 74 65  e build of Syste
df70: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 61 6e  m.Data.SQLite an
df80: 64 20 74 68 65 6e 20 72 65 74 75 72 6e 0d 0a 20  d then return.. 
df90: 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20               #  
dfa0: 20 20 20 20 20 69 6d 6d 65 64 69 61 74 65 6c 79       immediately
dfb0: 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
dfc0: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
dfd0: 20 20 69 66 20 7b 24 73 65 6c 65 63 74 20 26 26    if {$select &&
dfe0: 20 5b 6d 61 74 63 68 50 6c 61 74 66 6f 72 6d 20   [matchPlatform 
dff0: 24 70 6c 61 74 66 6f 72 6d 5d 7d 20 74 68 65 6e  $platform]} then
e000: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
e010: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
e020: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4d         # NOTE: M
e030: 61 6e 75 61 6c 6c 79 20 6f 76 65 72 72 69 64 65  anually override
e040: 20 61 6c 6c 20 74 68 65 20 62 75 69 6c 64 20 64   all the build d
e050: 69 72 65 63 74 6f 72 79 20 73 65 6c 65 63 74 69  irectory selecti
e060: 6f 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  on..            
e070: 20 20 20 20 23 20 20 20 20 20 20 20 72 65 6c 61      #       rela
e080: 74 65 64 20 74 65 73 74 20 73 65 74 74 69 6e 67  ted test setting
e090: 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 6f  s in order to fo
e0a0: 72 63 65 20 74 68 69 73 20 62 75 69 6c 64 0d 0a  rce this build..
e0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e0c0: 23 20 20 20 20 20 20 20 6f 66 20 53 79 73 74 65  #       of Syste
e0d0: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 74 6f  m.Data.SQLite to
e0e0: 20 62 65 20 75 73 65 64 2e 0d 0a 20 20 20 20 20   be used...     
e0f0: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
e100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
e110: 20 7b 21 5b 63 68 61 6e 67 65 4e 61 74 69 76 65   {![changeNative
e120: 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 24 6e  RuntimeOption $n
e130: 61 74 69 76 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a  ative]} then {..
e140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e150: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
e160: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
e170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e180: 20 20 20 20 20 20 22 6e 6f 2c 20 66 61 69 6c 65        "no, faile
e190: 64 20 74 6f 20 22 20 5b 65 78 70 72 20 7b 24 6e  d to " [expr {$n
e1a0: 61 74 69 76 65 20 3f 20 22 61 64 64 22 20 3a 20  ative ? "add" : 
e1b0: 22 72 65 6d 6f 76 65 22 7d 5d 20 5c 0d 0a 20 20  "remove"}] \..  
e1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1d0: 20 20 20 20 22 20 74 68 65 20 5c 22 6e 61 74 69      " the \"nati
e1e0: 76 65 5c 22 20 72 75 6e 74 69 6d 65 20 6f 70 74  ve\" runtime opt
e1f0: 69 6f 6e 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20  ion\n"]....     
e200: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
e210: 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20 20  urn false..     
e220: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
e230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e240: 73 65 74 20 3a 3a 74 65 73 74 5f 79 65 61 72 20  set ::test_year 
e250: 24 79 65 61 72 0d 0a 20 20 20 20 20 20 20 20 20  $year..         
e260: 20 20 20 20 20 20 20 73 65 74 20 3a 3a 74 65 73         set ::tes
e270: 74 5f 70 6c 61 74 66 6f 72 6d 20 24 70 6c 61 74  t_platform $plat
e280: 66 6f 72 6d 0d 0a 20 20 20 20 20 20 20 20 20 20  form..          
e290: 20 20 20 20 20 20 73 65 74 20 3a 3a 74 65 73 74        set ::test
e2a0: 5f 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 24  _configuration $
e2b0: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 0d 0a 0d  configuration...
e2c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e2d0: 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
e2e0: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
e2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e300: 20 20 20 22 79 65 73 2c 20 73 65 6c 65 63 74 65     "yes, selecte
e310: 64 20 28 22 20 5b 65 78 70 72 20 7b 24 6e 61 74  d (" [expr {$nat
e320: 69 76 65 20 3f 20 22 6e 61 74 69 76 65 2f 22 20  ive ? "native/" 
e330: 3a 20 22 22 7d 5d 20 5c 0d 0a 20 20 20 20 20 20  : ""}] \..      
e340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 65                [e
e350: 78 70 72 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e  xpr {[string len
e360: 67 74 68 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3e  gth $platform] >
e370: 20 30 20 3f 20 5b 61 70 70 65 6e 64 41 72 67 73   0 ? [appendArgs
e380: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
e390: 20 20 20 20 20 20 20 20 24 70 6c 61 74 66 6f 72          $platfor
e3a0: 6d 20 2f 5d 20 3a 20 22 22 7d 5d 20 24 79 65 61  m /] : ""}] $yea
e3b0: 72 20 2f 20 24 63 6f 6e 66 69 67 75 72 61 74 69  r / $configurati
e3c0: 6f 6e 20 22 29 5c 6e 22 5d 0d 0a 0d 0a 20 20 20  on ")\n"]....   
e3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
e3e0: 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20  urn true..      
e3f0: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
e400: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
e410: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
e420: 20 79 65 73 5c 6e 0d 0a 20 20 20 20 20 20 20 20   yes\n..        
e430: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
e440: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
e450: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
e460: 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e  ts $channel no\n
e470: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
e480: 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
e490: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
e4a0: 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ....      return
e4b0: 20 66 61 6c 73 65 0d 0a 20 20 20 20 7d 0d 0a 0c   false..    }...
e4c0: 0d 0a 20 20 20 20 70 72 6f 63 20 63 68 65 63 6b  ..    proc check
e4d0: 46 6f 72 53 51 4c 69 74 65 52 65 6c 65 61 73 65  ForSQLiteRelease
e4e0: 73 20 7b 20 63 68 61 6e 6e 65 6c 20 7b 73 65 6c  s { channel {sel
e4f0: 65 63 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a  ect false} } {..
e500: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
e510: 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 66 6f 72   NOTE: Check for
e520: 20 70 61 73 74 20 72 65 6c 65 61 73 65 73 20 6f   past releases o
e530: 66 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  f System.Data.SQ
e540: 4c 69 74 65 20 69 6e 20 74 68 65 20 64 69 72 65  Lite in the dire
e550: 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 23 20 20  ctory..      #  
e560: 20 20 20 20 20 63 6f 6e 74 61 69 6e 65 64 20 69       contained i
e570: 6e 20 74 68 65 20 22 53 79 73 74 65 6d 2e 44 61  n the "System.Da
e580: 74 61 2e 53 51 4c 69 74 65 22 20 65 6e 76 69 72  ta.SQLite" envir
e590: 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 2c  onment variable,
e5a0: 20 69 66 0d 0a 20 20 20 20 20 20 23 20 20 20 20   if..      #    
e5b0: 20 20 20 70 72 65 73 65 6e 74 2e 0d 0a 20 20 20     present...   
e5c0: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
e5d0: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 65  [info exists ::e
e5e0: 6e 76 28 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  nv(System.Data.S
e5f0: 51 4c 69 74 65 29 5d 20 26 26 20 5c 0d 0a 20 20  QLite)] && \..  
e600: 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20          [string 
e610: 6c 65 6e 67 74 68 20 24 3a 3a 65 6e 76 28 53 79  length $::env(Sy
e620: 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
e630: 29 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  )] > 0} then {..
e640: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
e650: 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64     # NOTE: Build
e660: 20 74 68 65 20 66 75 6c 6c 79 20 71 75 61 6c 69   the fully quali
e670: 66 69 65 64 20 64 69 72 65 63 74 6f 72 79 20 77  fied directory w
e680: 68 65 72 65 20 74 68 65 20 6e 65 63 65 73 73 61  here the necessa
e690: 72 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ry..        #   
e6a0: 20 20 20 20 63 6f 6d 70 6f 6e 65 6e 74 73 20 66      components f
e6b0: 6f 72 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  or System.Data.S
e6c0: 51 4c 69 74 65 20 73 68 6f 75 6c 64 20 62 65 20  QLite should be 
e6d0: 66 6f 75 6e 64 2e 0d 0a 20 20 20 20 20 20 20 20  found...        
e6e0: 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 64  #..        set d
e6f0: 69 72 65 63 74 6f 72 79 20 5b 66 69 6c 65 20 6e  irectory [file n
e700: 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20  ativename [file 
e710: 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20  join \..        
e720: 20 20 20 20 24 3a 3a 65 6e 76 28 53 79 73 74 65      $::env(Syste
e730: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 29 20 5b  m.Data.SQLite) [
e740: 67 65 74 52 65 6c 65 61 73 65 56 65 72 73 69 6f  getReleaseVersio
e750: 6e 5d 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  n]]]....        
e760: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
e770: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
e780: 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
e790: 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 53 79 73  checking for Sys
e7a0: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20  tem.Data.SQLite 
e7b0: 72 65 6c 65 61 73 65 20 5c 22 22 20 5c 0d 0a 20  release \"" \.. 
e7c0: 20 20 20 20 20 20 20 20 20 20 20 24 64 69 72 65             $dire
e7d0: 63 74 6f 72 79 20 22 5c 22 2e 2e 2e 20 22 5d 0d  ctory "\"... "].
e7e0: 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  ...        if {[
e7f0: 69 73 52 65 6c 65 61 73 65 41 76 61 69 6c 61 62  isReleaseAvailab
e800: 6c 65 20 24 64 69 72 65 63 74 6f 72 79 20 70 6c  le $directory pl
e810: 61 74 66 6f 72 6d 5d 7d 20 74 68 65 6e 20 7b 0d  atform]} then {.
e820: 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b  .          if {[
e830: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 70  string length $p
e840: 6c 61 74 66 6f 72 6d 5d 20 3d 3d 20 30 7d 20 74  latform] == 0} t
e850: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
e860: 20 20 20 73 65 74 20 70 6c 61 74 66 6f 72 6d 20     set platform 
e870: 75 6e 6b 6e 6f 77 6e 0d 0a 20 20 20 20 20 20 20  unknown..       
e880: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
e890: 20 20 69 66 20 7b 24 73 65 6c 65 63 74 20 26 26    if {$select &&
e8a0: 20 5b 6d 61 74 63 68 50 6c 61 74 66 6f 72 6d 20   [matchPlatform 
e8b0: 24 70 6c 61 74 66 6f 72 6d 5d 7d 20 74 68 65 6e  $platform]} then
e8c0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
e8d0: 73 65 74 20 3a 3a 62 75 69 6c 64 5f 64 69 72 65  set ::build_dire
e8e0: 63 74 6f 72 79 20 24 64 69 72 65 63 74 6f 72 79  ctory $directory
e8f0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
e900: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
e910: 61 70 70 65 6e 64 41 72 67 73 20 22 79 65 73 2c  appendArgs "yes,
e920: 20 73 65 6c 65 63 74 65 64 20 28 22 20 24 70 6c   selected (" $pl
e930: 61 74 66 6f 72 6d 20 22 29 5c 6e 22 5d 0d 0a 0d  atform ")\n"]...
e940: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
e950: 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20  urn true..      
e960: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
e970: 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
e980: 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
e990: 41 72 67 73 20 22 79 65 73 20 28 22 20 24 70 6c  Args "yes (" $pl
e9a0: 61 74 66 6f 72 6d 20 22 29 5c 6e 22 5d 0d 0a 20  atform ")\n"].. 
e9b0: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
e9c0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
e9d0: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
e9e0: 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 0d 0a 20  hannel no\n.... 
e9f0: 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
ea00: 20 70 61 74 68 20 5b 6c 73 6f 72 74 20 2d 64 65   path [lsort -de
ea10: 63 72 65 61 73 69 6e 67 20 5b 66 69 6c 65 20 6c  creasing [file l
ea20: 69 73 74 20 24 64 69 72 65 63 74 6f 72 79 20 2a  ist $directory *
ea30: 5d 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ]] {..          
ea40: 20 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73    if {[file exis
ea50: 74 73 20 24 70 61 74 68 5d 20 26 26 20 5b 66 69  ts $path] && [fi
ea60: 6c 65 20 69 73 64 69 72 65 63 74 6f 72 79 20 24  le isdirectory $
ea70: 70 61 74 68 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  path]} then {.. 
ea80: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
ea90: 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
eaa0: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
eab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
eac0: 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20  -- checking for 
ead0: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
eae0: 74 65 20 72 65 6c 65 61 73 65 20 5c 22 22 20 5c  te release \"" \
eaf0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
eb00: 20 20 20 20 24 70 61 74 68 20 22 5c 22 2e 2e 2e      $path "\"...
eb10: 20 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20   "]....         
eb20: 20 20 20 20 20 69 66 20 7b 5b 69 73 52 65 6c 65       if {[isRele
eb30: 61 73 65 41 76 61 69 6c 61 62 6c 65 20 24 70 61  aseAvailable $pa
eb40: 74 68 20 70 6c 61 74 66 6f 72 6d 5d 7d 20 74 68  th platform]} th
eb50: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
eb60: 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
eb70: 67 20 6c 65 6e 67 74 68 20 24 70 6c 61 74 66 6f  g length $platfo
eb80: 72 6d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  rm] == 0} then {
eb90: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
eba0: 20 20 20 20 73 65 74 20 70 6c 61 74 66 6f 72 6d      set platform
ebb0: 20 75 6e 6b 6e 6f 77 6e 0d 0a 20 20 20 20 20 20   unknown..      
ebc0: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
ebd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
ebe0: 66 20 7b 24 73 65 6c 65 63 74 20 26 26 20 5b 6d  f {$select && [m
ebf0: 61 74 63 68 50 6c 61 74 66 6f 72 6d 20 24 70 6c  atchPlatform $pl
ec00: 61 74 66 6f 72 6d 5d 7d 20 74 68 65 6e 20 7b 0d  atform]} then {.
ec10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ec20: 20 20 20 73 65 74 20 3a 3a 62 75 69 6c 64 5f 64     set ::build_d
ec30: 69 72 65 63 74 6f 72 79 20 24 70 61 74 68 0d 0a  irectory $path..
ec40: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
ec50: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
ec60: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22  el [appendArgs "
ec70: 79 65 73 2c 20 73 65 6c 65 63 74 65 64 20 28 22  yes, selected ("
ec80: 20 24 70 6c 61 74 66 6f 72 6d 20 22 29 5c 6e 22   $platform ")\n"
ec90: 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ]....           
eca0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72         return tr
ecb0: 75 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue..            
ecc0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
ecd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ece0: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
ecf0: 61 70 70 65 6e 64 41 72 67 73 20 22 79 65 73 20  appendArgs "yes 
ed00: 28 22 20 24 70 6c 61 74 66 6f 72 6d 20 22 29 5c  (" $platform ")\
ed10: 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n"]..           
ed20: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
ed30: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
ed40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed50: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e  tputs $channel n
ed60: 6f 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  o\n..           
ed70: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
ed80: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d    }..          }
ed90: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
eda0: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
edb0: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
edc0: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
edd0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  \..            "
ede0: 2d 2d 2d 2d 20 65 6e 76 69 72 6f 6e 6d 65 6e 74  ---- environment
edf0: 20 76 61 72 69 61 62 6c 65 20 5c 22 53 79 73 74   variable \"Syst
ee00: 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 5c 22  em.Data.SQLite\"
ee10: 20 69 73 20 6e 6f 74 20 22 20 5c 0d 0a 20 20 20   is not " \..   
ee20: 20 20 20 20 20 20 20 20 20 22 73 65 74 2c 20 73           "set, s
ee30: 6b 69 70 70 69 6e 67 20 63 68 65 63 6b 20 66 6f  kipping check fo
ee40: 72 20 72 65 6c 65 61 73 65 73 2e 2e 2e 5c 6e 22  r releases...\n"
ee50: 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  ]..      }....  
ee60: 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65      return false
ee70: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
ee80: 70 72 6f 63 20 63 68 65 63 6b 46 6f 72 53 51 4c  proc checkForSQL
ee90: 69 74 65 4c 69 62 72 61 72 79 20 7b 20 63 68 61  iteLibrary { cha
eea0: 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20 20 20 20  nnel } {..      
eeb0: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22  tputs $channel "
eec0: 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f  ---- checking fo
eed0: 72 20 53 51 4c 69 74 65 20 63 6f 72 65 20 6c 69  r SQLite core li
eee0: 62 72 61 72 79 2e 2e 2e 20 22 0d 0a 0d 0a 20 20  brary... "....  
eef0: 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
ef00: 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74  ..        object
ef10: 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b   invoke -flags +
ef20: 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20  NonPublic \..   
ef30: 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e           System.
ef40: 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69  Data.SQLite.SQLi
ef50: 74 65 33 20 53 51 4c 69 74 65 56 65 72 73 69 6f  te3 SQLiteVersio
ef60: 6e 0d 0a 20 20 20 20 20 20 7d 20 76 65 72 73 69  n..      } versi
ef70: 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  on] == 0} then {
ef80: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
ef90: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65       # NOTE: Che
efa0: 63 6b 20 69 66 20 74 68 65 20 72 65 74 75 72 6e  ck if the return
efb0: 65 64 20 76 65 72 73 69 6f 6e 20 77 61 73 20 6e  ed version was n
efc0: 75 6c 6c 2e 20 20 49 66 20 73 6f 2c 20 6d 61 6b  ull.  If so, mak
efd0: 65 20 69 74 20 65 61 73 79 0d 0a 20 20 20 20 20  e it easy..     
efe0: 20 20 20 23 20 20 20 20 20 20 20 74 6f 20 73 70     #       to sp
eff0: 6f 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ot...        #..
f000: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72          if {[str
f010: 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 65 72 73  ing length $vers
f020: 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ion] == 0} then 
f030: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  {..          set
f040: 20 76 65 72 73 69 6f 6e 20 6e 75 6c 6c 0d 0a 20   version null.. 
f050: 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
f060: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
f070: 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74   NOTE: Attempt t
f080: 6f 20 71 75 65 72 79 20 74 68 65 20 46 6f 73 73  o query the Foss
f090: 69 6c 20 73 6f 75 72 63 65 20 69 64 65 6e 74 69  il source identi
f0a0: 66 69 65 72 20 66 6f 72 20 74 68 65 20 53 51 4c  fier for the SQL
f0b0: 69 74 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ite..        #  
f0c0: 20 20 20 20 20 63 6f 72 65 20 6c 69 62 72 61 72       core librar
f0d0: 79 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  y...        #.. 
f0e0: 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
f0f0: 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6f  h {..          o
f100: 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c  bject invoke -fl
f110: 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c  ags +NonPublic \
f120: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
f130: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
f140: 74 65 2e 53 51 4c 69 74 65 33 20 53 51 4c 69 74  te.SQLite3 SQLit
f150: 65 53 6f 75 72 63 65 49 64 0d 0a 20 20 20 20 20  eSourceId..     
f160: 20 20 20 7d 20 73 6f 75 72 63 65 49 64 5d 7d 20     } sourceId]} 
f170: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
f180: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23    #..          #
f190: 20 4e 4f 54 45 3a 20 57 65 20 66 61 69 6c 65 64   NOTE: We failed
f1a0: 20 74 6f 20 71 75 65 72 79 20 74 68 65 20 46 6f   to query the Fo
f1b0: 73 73 69 6c 20 73 6f 75 72 63 65 20 69 64 65 6e  ssil source iden
f1c0: 74 69 66 69 65 72 2e 0d 0a 20 20 20 20 20 20 20  tifier...       
f1d0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
f1e0: 73 65 74 20 73 6f 75 72 63 65 49 64 20 75 6e 6b  set sourceId unk
f1f0: 6e 6f 77 6e 0d 0a 20 20 20 20 20 20 20 20 7d 0d  nown..        }.
f200: 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
f210: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68        # NOTE: Ch
f220: 65 63 6b 20 69 66 20 74 68 65 20 72 65 74 75 72  eck if the retur
f230: 6e 65 64 20 46 6f 73 73 69 6c 20 73 6f 75 72 63  ned Fossil sourc
f240: 65 20 69 64 65 6e 74 69 66 69 65 72 20 77 61 73  e identifier was
f250: 20 6e 75 6c 6c 2e 20 20 49 66 0d 0a 20 20 20 20   null.  If..    
f260: 20 20 20 20 23 20 20 20 20 20 20 20 73 6f 2c 20      #       so, 
f270: 6d 61 6b 65 20 69 74 20 65 61 73 79 20 74 6f 20  make it easy to 
f280: 73 70 6f 74 2e 0d 0a 20 20 20 20 20 20 20 20 23  spot...        #
f290: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73  ..        if {[s
f2a0: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 73 6f  tring length $so
f2b0: 75 72 63 65 49 64 5d 20 3d 3d 20 30 7d 20 74 68  urceId] == 0} th
f2c0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
f2d0: 73 65 74 20 73 6f 75 72 63 65 49 64 20 6e 75 6c  set sourceId nul
f2e0: 6c 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  l..        }....
f2f0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
f300: 20 20 20 23 20 4e 4f 54 45 3a 20 59 65 73 2c 20     # NOTE: Yes, 
f310: 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20  the SQLite core 
f320: 6c 69 62 72 61 72 79 20 61 70 70 65 61 72 73 20  library appears 
f330: 74 6f 20 62 65 20 61 76 61 69 6c 61 62 6c 65 2e  to be available.
f340: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
f350: 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
f360: 6e 74 20 53 51 4c 69 74 65 0d 0a 0d 0a 20 20 20  nt SQLite....   
f370: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
f380: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
f390: 22 79 65 73 20 28 22 20 24 76 65 72 73 69 6f 6e  "yes (" $version
f3a0: 20 22 20 22 20 24 73 6f 75 72 63 65 49 64 20 22   " " $sourceId "
f3b0: 29 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 7d 20 65  )\n"]..      } e
f3c0: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74  lse {..        t
f3d0: 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f  puts $channel no
f3e0: 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  \n..      }..   
f3f0: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
f400: 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 49 6e  checkForSQLiteIn
f410: 74 65 72 6f 70 20 7b 20 63 68 61 6e 6e 65 6c 20  terop { channel 
f420: 7d 20 7b 0d 0a 20 20 20 20 20 20 74 70 75 74 73  } {..      tputs
f430: 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20   $channel "---- 
f440: 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 53 51 4c  checking for SQL
f450: 69 74 65 20 69 6e 74 65 72 6f 70 20 61 73 73 65  ite interop asse
f460: 6d 62 6c 79 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20  mbly... "....   
f470: 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d     if {[catch {.
f480: 0a 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20  .        object 
f490: 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e  invoke -flags +N
f4a0: 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20  onPublic \..    
f4b0: 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44          System.D
f4c0: 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74  ata.SQLite.SQLit
f4d0: 65 33 20 49 6e 74 65 72 6f 70 56 65 72 73 69 6f  e3 InteropVersio
f4e0: 6e 0d 0a 20 20 20 20 20 20 7d 20 76 65 72 73 69  n..      } versi
f4f0: 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  on] == 0} then {
f500: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
f510: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65       # NOTE: Che
f520: 63 6b 20 69 66 20 74 68 65 20 72 65 74 75 72 6e  ck if the return
f530: 65 64 20 76 65 72 73 69 6f 6e 20 77 61 73 20 6e  ed version was n
f540: 75 6c 6c 2e 20 20 49 66 20 73 6f 2c 20 6d 61 6b  ull.  If so, mak
f550: 65 20 69 74 20 65 61 73 79 0d 0a 20 20 20 20 20  e it easy..     
f560: 20 20 20 23 20 20 20 20 20 20 20 74 6f 20 73 70     #       to sp
f570: 6f 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ot...        #..
f580: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72          if {[str
f590: 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 65 72 73  ing length $vers
f5a0: 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ion] == 0} then 
f5b0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  {..          set
f5c0: 20 76 65 72 73 69 6f 6e 20 6e 75 6c 6c 0d 0a 20   version null.. 
f5d0: 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
f5e0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
f5f0: 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74   NOTE: Attempt t
f600: 6f 20 71 75 65 72 79 20 74 68 65 20 46 6f 73 73  o query the Foss
f610: 69 6c 20 73 6f 75 72 63 65 20 69 64 65 6e 74 69  il source identi
f620: 66 69 65 72 20 66 6f 72 20 74 68 65 20 53 51 4c  fier for the SQL
f630: 69 74 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ite..        #  
f640: 20 20 20 20 20 63 6f 72 65 20 6c 69 62 72 61 72       core librar
f650: 79 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  y...        #.. 
f660: 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
f670: 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6f  h {..          o
f680: 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c  bject invoke -fl
f690: 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c  ags +NonPublic \
f6a0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
f6b0: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
f6c0: 74 65 2e 53 51 4c 69 74 65 33 20 49 6e 74 65 72  te.SQLite3 Inter
f6d0: 6f 70 53 6f 75 72 63 65 49 64 0d 0a 20 20 20 20  opSourceId..    
f6e0: 20 20 20 20 7d 20 73 6f 75 72 63 65 49 64 5d 7d      } sourceId]}
f6f0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
f700: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
f710: 23 20 4e 4f 54 45 3a 20 57 65 20 66 61 69 6c 65  # NOTE: We faile
f720: 64 20 74 6f 20 71 75 65 72 79 20 74 68 65 20 46  d to query the F
f730: 6f 73 73 69 6c 20 73 6f 75 72 63 65 20 69 64 65  ossil source ide
f740: 6e 74 69 66 69 65 72 2e 0d 0a 20 20 20 20 20 20  ntifier...      
f750: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
f760: 20 73 65 74 20 73 6f 75 72 63 65 49 64 20 75 6e   set sourceId un
f770: 6b 6e 6f 77 6e 0d 0a 20 20 20 20 20 20 20 20 7d  known..        }
f780: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
f790: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43         # NOTE: C
f7a0: 68 65 63 6b 20 69 66 20 74 68 65 20 72 65 74 75  heck if the retu
f7b0: 72 6e 65 64 20 46 6f 73 73 69 6c 20 73 6f 75 72  rned Fossil sour
f7c0: 63 65 20 69 64 65 6e 74 69 66 69 65 72 20 77 61  ce identifier wa
f7d0: 73 20 6e 75 6c 6c 2e 20 20 49 66 0d 0a 20 20 20  s null.  If..   
f7e0: 20 20 20 20 20 23 20 20 20 20 20 20 20 73 6f 2c       #       so,
f7f0: 20 6d 61 6b 65 20 69 74 20 65 61 73 79 20 74 6f   make it easy to
f800: 20 73 70 6f 74 2e 0d 0a 20 20 20 20 20 20 20 20   spot...        
f810: 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  #..        if {[
f820: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 73  string length $s
f830: 6f 75 72 63 65 49 64 5d 20 3d 3d 20 30 7d 20 74  ourceId] == 0} t
f840: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
f850: 20 73 65 74 20 73 6f 75 72 63 65 49 64 20 6e 75   set sourceId nu
f860: 6c 6c 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  ll..        }...
f870: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
f880: 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 65 66 6f      # NOTE: Befo
f890: 72 65 20 61 63 74 75 61 6c 6c 79 20 61 64 64 69  re actually addi
f8a0: 6e 67 20 74 68 65 20 74 65 73 74 20 63 6f 6e 73  ng the test cons
f8b0: 74 72 61 69 6e 74 2c 20 6d 61 6b 65 20 73 75 72  traint, make sur
f8c0: 65 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23  e the..        #
f8d0: 20 20 20 20 20 20 20 76 65 72 73 69 6f 6e 20 69         version i
f8e0: 73 20 76 61 6c 69 64 20 28 69 2e 65 2e 20 6e 6f  s valid (i.e. no
f8f0: 74 20 6a 75 73 74 20 74 68 61 74 20 77 65 20 63  t just that we c
f900: 6f 75 6c 64 20 71 75 65 72 79 20 69 74 29 2e 0d  ould query it)..
f910: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
f920: 20 20 20 20 69 66 20 7b 24 76 65 72 73 69 6f 6e      if {$version
f930: 20 6e 65 20 22 6e 75 6c 6c 22 7d 20 74 68 65 6e   ne "null"} then
f940: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d   {..          #.
f950: 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
f960: 45 3a 20 59 65 73 2c 20 74 68 65 20 53 51 4c 69  E: Yes, the SQLi
f970: 74 65 20 69 6e 74 65 72 6f 70 20 61 73 73 65 6d  te interop assem
f980: 62 6c 79 20 61 70 70 65 61 72 73 20 74 6f 20 62  bly appears to b
f990: 65 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0a 20 20  e available...  
f9a0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
f9b0: 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
f9c0: 6e 74 20 53 51 4c 69 74 65 49 6e 74 65 72 6f 70  nt SQLiteInterop
f9d0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65  ....          se
f9e0: 74 20 61 6e 73 77 65 72 20 79 65 73 0d 0a 20 20  t answer yes..  
f9f0: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
fa00: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 61 6e            set an
fa10: 73 77 65 72 20 6e 6f 0d 0a 20 20 20 20 20 20 20  swer no..       
fa20: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 70   }....        tp
fa30: 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
fa40: 70 65 6e 64 41 72 67 73 20 24 61 6e 73 77 65 72  pendArgs $answer
fa50: 20 22 20 28 22 20 24 76 65 72 73 69 6f 6e 20 22   " (" $version "
fa60: 20 22 20 24 73 6f 75 72 63 65 49 64 20 22 29 5c   " $sourceId ")\
fa70: 6e 22 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  n"]..      } els
fa80: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75  e {..        tpu
fa90: 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e  ts $channel no\n
faa0: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
fab0: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 68  .....    proc ch
fac0: 65 63 6b 46 6f 72 53 51 4c 69 74 65 44 65 66 69  eckForSQLiteDefi
fad0: 6e 65 43 6f 6e 73 74 61 6e 74 20 7b 20 63 68 61  neConstant { cha
fae0: 6e 6e 65 6c 20 6e 61 6d 65 20 7d 20 7b 0d 0a 20  nnel name } {.. 
faf0: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
fb00: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
fb10: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 22 2d 2d  \..          "--
fb20: 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20  -- checking for 
fb30: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
fb40: 74 65 20 64 65 66 69 6e 65 20 63 6f 6e 73 74 61  te define consta
fb50: 6e 74 20 5c 22 22 20 24 6e 61 6d 65 20 5c 0d 0a  nt \"" $name \..
fb60: 20 20 20 20 20 20 20 20 20 20 22 5c 22 2e 2e 2e            "\"...
fb70: 20 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20   "]....      if 
fb80: 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
fb90: 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65     object invoke
fba0: 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c   -flags +NonPubl
fbb0: 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ic \..          
fbc0: 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51    System.Data.SQ
fbd0: 4c 69 74 65 2e 53 51 4c 69 74 65 33 20 44 65 66  Lite.SQLite3 Def
fbe0: 69 6e 65 43 6f 6e 73 74 61 6e 74 73 0d 0a 20 20  ineConstants..  
fbf0: 20 20 20 20 7d 20 64 65 66 69 6e 65 43 6f 6e 73      } defineCons
fc00: 74 61 6e 74 73 5d 20 3d 3d 20 30 7d 20 74 68 65  tants] == 0} the
fc10: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20  n {..        if 
fc20: 7b 5b 6c 73 65 61 72 63 68 20 2d 65 78 61 63 74  {[lsearch -exact
fc30: 20 2d 6e 6f 63 61 73 65 20 24 64 65 66 69 6e 65   -nocase $define
fc40: 43 6f 6e 73 74 61 6e 74 73 20 24 6e 61 6d 65 5d  Constants $name]
fc50: 20 21 3d 20 2d 31 7d 20 74 68 65 6e 20 7b 0d 0a   != -1} then {..
fc60: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
fc70: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 59         # NOTE: Y
fc80: 65 73 2c 20 74 68 69 73 20 64 65 66 69 6e 65 20  es, this define 
fc90: 63 6f 6e 73 74 61 6e 74 20 77 61 73 20 65 6e 61  constant was ena
fca0: 62 6c 65 64 20 77 68 65 6e 20 74 68 65 20 6d 61  bled when the ma
fcb0: 6e 61 67 65 64 0d 0a 20 20 20 20 20 20 20 20 20  naged..         
fcc0: 20 23 20 20 20 20 20 20 20 61 73 73 65 6d 62 6c   #       assembl
fcd0: 79 20 77 61 73 20 63 6f 6d 70 69 6c 65 64 2e 0d  y was compiled..
fce0: 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
fcf0: 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74          addConst
fd00: 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67  raint [appendArg
fd10: 73 20 5b 67 65 74 53 51 4c 69 74 65 44 65 66 69  s [getSQLiteDefi
fd20: 6e 65 43 6f 6e 73 74 61 6e 74 50 72 65 66 69 78  neConstantPrefix
fd30: 5d 20 24 6e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20  ] $name]....    
fd40: 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
fd50: 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20 20 20 20  nnel yes\n..    
fd60: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
fd70: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
fd80: 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20  hannel no\n..   
fd90: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20       }..      } 
fda0: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
fdb0: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 65  tputs $channel e
fdc0: 72 72 6f 72 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d  rror\n..      }.
fdd0: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
fde0: 72 6f 63 20 67 65 74 44 61 74 65 54 69 6d 65 46  roc getDateTimeF
fdf0: 6f 72 6d 61 74 20 7b 20 7b 74 69 6d 65 5a 6f 6e  ormat { {timeZon
fe00: 65 20 74 72 75 65 7d 20 7d 20 7b 0d 0a 20 20 20  e true} } {..   
fe10: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
fe20: 54 45 3a 20 54 68 69 73 20 70 72 6f 63 65 64 75  TE: This procedu
fe30: 72 65 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e  re simply return
fe40: 73 20 74 68 65 20 22 64 65 66 61 75 6c 74 22 20  s the "default" 
fe50: 44 61 74 65 54 69 6d 65 20 66 6f 72 6d 61 74 20  DateTime format 
fe60: 75 73 65 64 0d 0a 20 20 20 20 20 20 23 20 20 20  used..      #   
fe70: 20 20 20 20 62 79 20 74 68 65 20 74 65 73 74 20      by the test 
fe80: 73 75 69 74 65 2e 0d 0a 20 20 20 20 20 20 23 0d  suite...      #.
fe90: 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f  .      if {[info
fea0: 20 65 78 69 73 74 73 20 3a 3a 64 61 74 65 74 69   exists ::dateti
feb0: 6d 65 5f 66 6f 72 6d 61 74 5d 20 26 26 20 5c 0d  me_format] && \.
fec0: 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69  .          [stri
fed0: 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 64 61 74  ng length $::dat
fee0: 65 74 69 6d 65 5f 66 6f 72 6d 61 74 5d 20 3e 20  etime_format] > 
fef0: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
ff00: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
ff10: 4e 4f 54 45 3a 20 52 65 74 75 72 6e 20 74 68 65  NOTE: Return the
ff20: 20 6d 61 6e 75 61 6c 6c 79 20 6f 76 65 72 72 69   manually overri
ff30: 64 64 65 6e 20 76 61 6c 75 65 20 66 6f 72 20 74  dden value for t
ff40: 68 65 20 44 61 74 65 54 69 6d 65 20 66 6f 72 6d  he DateTime form
ff50: 61 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  at...        #..
ff60: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24          return $
ff70: 3a 3a 64 61 74 65 74 69 6d 65 5f 66 6f 72 6d 61  ::datetime_forma
ff80: 74 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  t..      } else 
ff90: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
ffa0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65        # NOTE: Re
ffb0: 74 75 72 6e 20 61 6e 20 49 53 4f 38 36 30 31 20  turn an ISO8601 
ffc0: 44 61 74 65 54 69 6d 65 20 66 6f 72 6d 61 74 20  DateTime format 
ffd0: 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20  compatible with 
ffe0: 53 51 4c 69 74 65 2c 0d 0a 20 20 20 20 20 20 20  SQLite,..       
fff0: 20 23 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e   #       System.
10000 44 61 74 61 2e 53 51 4c 69 74 65 2c 20 61 6e 64  Data.SQLite, and
10010 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20 72 6f   suitable for ro
10020 75 6e 64 2d 74 72 69 70 70 69 6e 67 20 77 69 74  und-tripping wit
10030 68 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23  h the..        #
10040 20 20 20 20 20 20 20 44 61 74 65 54 69 6d 65 20         DateTime 
10050 63 6c 61 73 73 20 6f 66 20 74 68 65 20 66 72 61  class of the fra
10060 6d 65 77 6f 72 6b 2e 20 20 49 66 20 74 68 69 73  mework.  If this
10070 20 76 61 6c 75 65 20 69 73 20 63 68 61 6e 67 65   value is change
10080 64 2c 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  d,..        #   
10090 20 20 20 20 76 61 72 69 6f 75 73 20 74 65 73 74      various test
100a0 73 20 6d 61 79 20 66 61 69 6c 2e 0d 0a 20 20 20  s may fail...   
100b0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
100c0 72 65 74 75 72 6e 20 5b 61 70 70 65 6e 64 41 72  return [appendAr
100d0 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
100e0 20 20 22 79 79 79 79 2d 4d 4d 2d 64 64 20 48 48    "yyyy-MM-dd HH
100f0 3a 6d 6d 3a 73 73 2e 46 46 46 46 46 46 46 22 20  :mm:ss.FFFFFFF" 
10100 5b 65 78 70 72 20 7b 24 74 69 6d 65 5a 6f 6e 65  [expr {$timeZone
10110 20 3f 20 22 4b 22 20 3a 20 22 22 7d 5d 5d 0d 0a   ? "K" : ""}]]..
10120 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
10130 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 44  ...    proc getD
10140 61 74 65 54 69 6d 65 54 69 63 6b 73 20 7b 20 76  ateTimeTicks { v
10150 61 6c 75 65 20 7b 6c 6f 63 61 6c 20 22 22 7d 20  alue {local ""} 
10160 7b 64 65 66 61 75 6c 74 20 22 22 7d 20 7d 20 7b  {default ""} } {
10170 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72  ..      if {[str
10180 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 61 6c 75  ing length $valu
10190 65 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  e] == 0} then {.
101a0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
101b0 24 64 65 66 61 75 6c 74 0d 0a 20 20 20 20 20 20  $default..      
101c0 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  }....      if {[
101d0 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
101e0 20 73 65 74 20 64 61 74 65 54 69 6d 65 20 5b 6f   set dateTime [o
101f0 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 63 72  bject invoke -cr
10200 65 61 74 65 20 44 61 74 65 54 69 6d 65 20 50 61  eate DateTime Pa
10210 72 73 65 45 78 61 63 74 20 5c 0d 0a 20 20 20 20  rseExact \..    
10220 20 20 20 20 20 20 20 20 24 76 61 6c 75 65 20 5b          $value [
10230 67 65 74 44 61 74 65 54 69 6d 65 46 6f 72 6d 61  getDateTimeForma
10240 74 5d 20 6e 75 6c 6c 20 41 64 6a 75 73 74 54 6f  t] null AdjustTo
10250 55 6e 69 76 65 72 73 61 6c 5d 0d 0a 20 20 20 20  Universal]..    
10260 20 20 7d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20    }]} then {..  
10270 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 64 65        return $de
10280 66 61 75 6c 74 0d 0a 20 20 20 20 20 20 7d 0d 0a  fault..      }..
10290 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72  ..      if {[str
102a0 69 6e 67 20 69 73 20 62 6f 6f 6c 65 61 6e 20 2d  ing is boolean -
102b0 73 74 72 69 63 74 20 24 6c 6f 63 61 6c 5d 7d 20  strict $local]} 
102c0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
102d0 73 65 74 20 64 61 74 65 54 69 6d 65 20 5b 6f 62  set dateTime [ob
102e0 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 63 72 65  ject invoke -cre
102f0 61 74 65 20 44 61 74 65 54 69 6d 65 20 53 70 65  ate DateTime Spe
10300 63 69 66 79 4b 69 6e 64 20 5c 0d 0a 20 20 20 20  cifyKind \..    
10310 20 20 20 20 20 20 20 20 24 64 61 74 65 54 69 6d          $dateTim
10320 65 20 55 74 63 5d 0d 0a 20 20 20 20 20 20 7d 20  e Utc]..      } 
10330 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
10340 72 65 74 75 72 6e 20 5b 6f 62 6a 65 63 74 20 69  return [object i
10350 6e 76 6f 6b 65 20 24 64 61 74 65 54 69 6d 65 20  nvoke $dateTime 
10360 54 69 63 6b 73 5d 0d 0a 20 20 20 20 20 20 7d 0d  Ticks]..      }.
10370 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 6c 6f  ...      if {$lo
10380 63 61 6c 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  cal} then {..   
10390 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6f 62 6a       return [obj
103a0 65 63 74 20 69 6e 76 6f 6b 65 20 24 64 61 74 65  ect invoke $date
103b0 54 69 6d 65 20 54 6f 4c 6f 63 61 6c 54 69 6d 65  Time ToLocalTime
103c0 2e 54 69 63 6b 73 5d 0d 0a 20 20 20 20 20 20 7d  .Ticks]..      }
103d0 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
103e0 20 72 65 74 75 72 6e 20 5b 6f 62 6a 65 63 74 20   return [object 
103f0 69 6e 76 6f 6b 65 20 24 64 61 74 65 54 69 6d 65  invoke $dateTime
10400 20 54 6f 55 6e 69 76 65 72 73 61 6c 54 69 6d 65   ToUniversalTime
10410 2e 54 69 63 6b 73 5d 0d 0a 20 20 20 20 20 20 7d  .Ticks]..      }
10420 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
10430 70 72 6f 63 20 67 65 74 50 72 6f 70 65 72 74 69  proc getProperti
10440 65 73 20 7b 20 6f 62 6a 65 63 74 20 76 61 72 4e  es { object varN
10450 61 6d 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20 75  ame } {..      u
10460 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65 20  pvar 1 $varName 
10470 70 72 6f 70 65 72 74 69 65 73 0d 0a 0d 0a 20 20  properties....  
10480 20 20 20 20 73 65 74 20 63 6f 75 6e 74 20 30 0d      set count 0.
10490 0a 20 20 20 20 20 20 73 65 74 20 6e 61 6d 65 73  .      set names
104a0 20 5b 6c 69 73 74 5d 0d 0a 0d 0a 20 20 20 20 20   [list]....     
104b0 20 69 66 20 7b 5b 69 73 4f 62 6a 65 63 74 48 61   if {[isObjectHa
104c0 6e 64 6c 65 20 24 6f 62 6a 65 63 74 5d 20 26 26  ndle $object] &&
104d0 20 24 6f 62 6a 65 63 74 20 6e 65 20 22 6e 75 6c   $object ne "nul
104e0 6c 22 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  l"} then {..    
104f0 20 20 20 20 65 76 61 6c 20 6c 61 70 70 65 6e 64      eval lappend
10500 20 6e 61 6d 65 73 20 5b 6f 62 6a 65 63 74 20 6d   names [object m
10510 65 6d 62 65 72 73 20 5c 0d 0a 20 20 20 20 20 20  embers \..      
10520 20 20 20 20 20 20 2d 6d 65 6d 62 65 72 74 79 70        -membertyp
10530 65 73 20 50 72 6f 70 65 72 74 79 20 2d 6e 61 6d  es Property -nam
10540 65 6f 6e 6c 79 20 24 6f 62 6a 65 63 74 5d 0d 0a  eonly $object]..
10550 0d 0a 20 20 20 20 20 20 20 20 65 76 61 6c 20 6c  ..        eval l
10560 61 70 70 65 6e 64 20 6e 61 6d 65 73 20 5b 6f 62  append names [ob
10570 6a 65 63 74 20 6d 65 6d 62 65 72 73 20 5c 0d 0a  ject members \..
10580 20 20 20 20 20 20 20 20 20 20 20 20 2d 6d 65 6d              -mem
10590 62 65 72 74 79 70 65 73 20 46 69 65 6c 64 20 2d  bertypes Field -
105a0 6e 61 6d 65 6f 6e 6c 79 20 24 6f 62 6a 65 63 74  nameonly $object
105b0 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  ]..      }....  
105c0 20 20 20 20 66 6f 72 65 61 63 68 20 6e 61 6d 65      foreach name
105d0 20 24 6e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20   $names {..     
105e0 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d     if {[catch {.
105f0 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63  .          objec
10600 74 20 69 6e 76 6f 6b 65 20 2d 6f 62 6a 65 63 74  t invoke -object
10610 66 6c 61 67 73 20 2b 4e 6f 44 69 73 70 6f 73 65  flags +NoDispose
10620 20 24 6f 62 6a 65 63 74 20 24 6e 61 6d 65 0d 0a   $object $name..
10630 20 20 20 20 20 20 20 20 7d 20 76 61 6c 75 65 5d          } value]
10640 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
10650 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69 73           if {[is
10660 4f 62 6a 65 63 74 48 61 6e 64 6c 65 20 24 76 61  ObjectHandle $va
10670 6c 75 65 5d 20 26 26 20 24 76 61 6c 75 65 20 6e  lue] && $value n
10680 65 20 22 6e 75 6c 6c 22 7d 20 74 68 65 6e 20 7b  e "null"} then {
10690 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65  ..            se
106a0 74 20 65 72 72 6f 72 20 6e 75 6c 6c 3b 20 6f 62  t error null; ob
106b0 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61  ject invoke -fla
106c0 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d  gs +NonPublic \.
106d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
106e0 20 2d 6d 61 72 73 68 61 6c 66 6c 61 67 73 20 2b   -marshalflags +
106f0 4e 6f 48 61 6e 64 6c 65 20 49 6e 74 65 72 70 72  NoHandle Interpr
10700 65 74 65 72 2e 47 65 74 41 63 74 69 76 65 20 5c  eter.GetActive \
10710 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
10720 20 20 41 64 64 4f 62 6a 65 63 74 52 65 66 65 72    AddObjectRefer
10730 65 6e 63 65 20 4f 6b 20 24 76 61 6c 75 65 20 65  ence Ok $value e
10740 72 72 6f 72 0d 0a 0d 0a 20 20 20 20 20 20 20 20  rror....        
10750 20 20 20 20 6c 61 70 70 65 6e 64 20 70 72 6f 70      lappend prop
10760 65 72 74 69 65 73 28 6f 62 6a 65 63 74 73 29 20  erties(objects) 
10770 5b 6c 69 73 74 20 24 6e 61 6d 65 20 24 76 61 6c  [list $name $val
10780 75 65 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  ue]..          }
10790 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
107a0 20 20 20 20 20 6c 61 70 70 65 6e 64 20 70 72 6f       lappend pro
107b0 70 65 72 74 69 65 73 28 76 61 6c 75 65 73 29 20  perties(values) 
107c0 5b 6c 69 73 74 20 24 6e 61 6d 65 20 24 76 61 6c  [list $name $val
107d0 75 65 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  ue]..          }
107e0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 6e  ....          in
107f0 63 72 20 63 6f 75 6e 74 0d 0a 20 20 20 20 20 20  cr count..      
10800 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
10810 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 70 72        lappend pr
10820 6f 70 65 72 74 69 65 73 28 65 72 72 6f 72 73 29  operties(errors)
10830 20 5b 6c 69 73 74 20 24 6e 61 6d 65 20 24 3a 3a   [list $name $::
10840 65 72 72 6f 72 43 6f 64 65 5d 0d 0a 20 20 20 20  errorCode]..    
10850 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
10860 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 24  ..      return $
10870 63 6f 75 6e 74 0d 0a 20 20 20 20 7d 0d 0a 0c 0d  count..    }....
10880 0a 20 20 20 20 70 72 6f 63 20 67 65 74 41 6c 6c  .    proc getAll
10890 50 72 6f 70 65 72 74 69 65 73 20 7b 20 6f 62 6a  Properties { obj
108a0 65 63 74 20 76 61 72 4e 61 6d 65 20 7d 20 7b 0d  ect varName } {.
108b0 0a 20 20 20 20 20 20 75 70 76 61 72 20 31 20 24  .      upvar 1 $
108c0 76 61 72 4e 61 6d 65 20 70 72 6f 70 65 72 74 69  varName properti
108d0 65 73 0d 0a 20 20 20 20 20 20 73 65 74 20 76 61  es..      set va
108e0 6c 75 65 20 24 6f 62 6a 65 63 74 0d 0a 0d 0a 20  lue $object.... 
108f0 20 20 20 20 20 77 68 69 6c 65 20 7b 74 72 75 65       while {true
10900 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20  } {..        if 
10910 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 70  {![info exists p
10920 72 6f 70 65 72 74 69 65 73 28 73 65 65 6e 4f 62  roperties(seenOb
10930 6a 65 63 74 73 29 5d 20 7c 7c 20 5c 0d 0a 20 20  jects)] || \..  
10940 20 20 20 20 20 20 20 20 20 20 24 76 61 6c 75 65            $value
10950 20 6e 69 20 24 70 72 6f 70 65 72 74 69 65 73 28   ni $properties(
10960 73 65 65 6e 4f 62 6a 65 63 74 73 29 7d 20 74 68  seenObjects)} th
10970 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
10980 67 65 74 50 72 6f 70 65 72 74 69 65 73 20 24 76  getProperties $v
10990 61 6c 75 65 20 70 72 6f 70 65 72 74 69 65 73 0d  alue properties.
109a0 0a 20 20 20 20 20 20 20 20 20 20 6c 61 70 70 65  .          lappe
109b0 6e 64 20 70 72 6f 70 65 72 74 69 65 73 28 73 65  nd properties(se
109c0 65 6e 4f 62 6a 65 63 74 73 29 20 24 76 61 6c 75  enObjects) $valu
109d0 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  e..        }....
109e0 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
109f0 66 6f 20 65 78 69 73 74 73 20 70 72 6f 70 65 72  fo exists proper
10a00 74 69 65 73 28 6f 62 6a 65 63 74 73 29 5d 7d 20  ties(objects)]} 
10a10 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
10a20 20 20 62 72 65 61 6b 0d 0a 20 20 20 20 20 20 20    break..       
10a30 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66   }....        if
10a40 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 70 72 6f 70   {[llength $prop
10a50 65 72 74 69 65 73 28 6f 62 6a 65 63 74 73 29 5d  erties(objects)]
10a60 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
10a70 20 20 20 20 20 20 20 20 20 75 6e 73 65 74 20 70           unset p
10a80 72 6f 70 65 72 74 69 65 73 28 6f 62 6a 65 63 74  roperties(object
10a90 73 29 3b 20 62 72 65 61 6b 0d 0a 20 20 20 20 20  s); break..     
10aa0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
10ab0 73 65 74 20 76 61 6c 75 65 20 5b 6c 69 6e 64 65  set value [linde
10ac0 78 20 5b 6c 69 6e 64 65 78 20 24 70 72 6f 70 65  x [lindex $prope
10ad0 72 74 69 65 73 28 6f 62 6a 65 63 74 73 29 20 30  rties(objects) 0
10ae0 5d 20 65 6e 64 5d 0d 0a 20 20 20 20 20 20 20 20  ] end]..        
10af0 73 65 74 20 70 72 6f 70 65 72 74 69 65 73 28 6f  set properties(o
10b00 62 6a 65 63 74 73 29 20 5b 6c 72 61 6e 67 65 20  bjects) [lrange 
10b10 24 70 72 6f 70 65 72 74 69 65 73 28 6f 62 6a 65  $properties(obje
10b20 63 74 73 29 20 31 20 65 6e 64 5d 0d 0a 20 20 20  cts) 1 end]..   
10b30 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66     }....      if
10b40 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 70   {[info exists p
10b50 72 6f 70 65 72 74 69 65 73 28 73 65 65 6e 4f 62  roperties(seenOb
10b60 6a 65 63 74 73 29 5d 7d 20 74 68 65 6e 20 7b 0d  jects)]} then {.
10b70 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68  .        foreach
10b80 20 76 61 6c 75 65 20 24 70 72 6f 70 65 72 74 69   value $properti
10b90 65 73 28 73 65 65 6e 4f 62 6a 65 63 74 73 29 20  es(seenObjects) 
10ba0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  {..          if 
10bb0 7b 24 76 61 6c 75 65 20 65 71 20 24 6f 62 6a 65  {$value eq $obje
10bc0 63 74 7d 20 63 6f 6e 74 69 6e 75 65 0d 0a 20 20  ct} continue..  
10bd0 20 20 20 20 20 20 20 20 63 61 74 63 68 20 7b 6f          catch {o
10be0 62 6a 65 63 74 20 64 69 73 70 6f 73 65 20 24 76  bject dispose $v
10bf0 61 6c 75 65 7d 0d 0a 20 20 20 20 20 20 20 20 7d  alue}..        }
10c00 0d 0a 0d 0a 20 20 20 20 20 20 20 20 75 6e 73 65  ....        unse
10c10 74 20 70 72 6f 70 65 72 74 69 65 73 28 73 65 65  t properties(see
10c20 6e 4f 62 6a 65 63 74 73 29 0d 0a 20 20 20 20 20  nObjects)..     
10c30 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
10c40 20 20 70 72 6f 63 20 67 65 74 56 61 72 69 61 62    proc getVariab
10c50 6c 65 73 20 7b 20 76 61 72 4e 61 6d 65 73 20 7b  les { varNames {
10c60 6f 62 6a 65 63 74 73 20 66 61 6c 73 65 7d 20 7d  objects false} }
10c70 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 72 65   {..      set re
10c80 73 75 6c 74 20 5b 6c 69 73 74 5d 0d 0a 0d 0a 20  sult [list].... 
10c90 20 20 20 20 20 66 6f 72 65 61 63 68 20 76 61 72       foreach var
10ca0 4e 61 6d 65 20 24 76 61 72 4e 61 6d 65 73 20 7b  Name $varNames {
10cb0 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 75  ..        if {[u
10cc0 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74 20 61  plevel 1 [list a
10cd0 72 72 61 79 20 65 78 69 73 74 73 20 24 76 61 72  rray exists $var
10ce0 4e 61 6d 65 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a  Name]]} then {..
10cf0 20 20 20 20 20 20 20 20 20 20 73 65 74 20 61 72            set ar
10d00 72 61 79 4e 61 6d 65 20 24 76 61 72 4e 61 6d 65  rayName $varName
10d10 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 66 6f  ....          fo
10d20 72 65 61 63 68 20 65 6c 65 6d 65 6e 74 4e 61 6d  reach elementNam
10d30 65 20 5b 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69  e [uplevel 1 [li
10d40 73 74 20 61 72 72 61 79 20 6e 61 6d 65 73 20 24  st array names $
10d50 61 72 72 61 79 4e 61 6d 65 5d 5d 20 7b 0d 0a 20  arrayName]] {.. 
10d60 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 6e             set n
10d70 61 6d 65 20 5b 61 70 70 65 6e 64 41 72 67 73 20  ame [appendArgs 
10d80 24 61 72 72 61 79 4e 61 6d 65 20 28 20 24 65 6c  $arrayName ( $el
10d90 65 6d 65 6e 74 4e 61 6d 65 20 29 5d 0d 0a 20 20  ementName )]..  
10da0 20 20 20 20 20 20 20 20 20 20 73 65 74 20 76 61            set va
10db0 72 56 61 6c 75 65 20 5b 75 70 6c 65 76 65 6c 20  rValue [uplevel 
10dc0 31 20 5b 6c 69 73 74 20 73 65 74 20 24 6e 61 6d  1 [list set $nam
10dd0 65 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  e]]....         
10de0 20 20 20 69 66 20 7b 24 6f 62 6a 65 63 74 73 20     if {$objects 
10df0 26 26 20 5b 69 73 4f 62 6a 65 63 74 48 61 6e 64  && [isObjectHand
10e00 6c 65 20 24 76 61 72 56 61 6c 75 65 5d 7d 20 74  le $varValue]} t
10e10 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
10e20 20 20 20 20 20 75 6e 73 65 74 20 2d 6e 6f 63 6f       unset -noco
10e30 6d 70 6c 61 69 6e 20 70 72 6f 70 65 72 74 69 65  mplain propertie
10e40 73 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s..             
10e50 20 67 65 74 41 6c 6c 50 72 6f 70 65 72 74 69 65   getAllPropertie
10e60 73 20 24 76 61 72 56 61 6c 75 65 20 70 72 6f 70  s $varValue prop
10e70 65 72 74 69 65 73 0d 0a 0d 0a 20 20 20 20 20 20  erties....      
10e80 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20          lappend 
10e90 72 65 73 75 6c 74 20 5b 6c 69 73 74 20 24 6e 61  result [list $na
10ea0 6d 65 20 5b 61 72 72 61 79 20 67 65 74 20 70 72  me [array get pr
10eb0 6f 70 65 72 74 69 65 73 5d 5d 0d 0a 20 20 20 20  operties]]..    
10ec0 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
10ed0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
10ee0 6c 61 70 70 65 6e 64 20 72 65 73 75 6c 74 20 5b  lappend result [
10ef0 6c 69 73 74 20 24 6e 61 6d 65 20 24 76 61 72 56  list $name $varV
10f00 61 6c 75 65 5d 0d 0a 20 20 20 20 20 20 20 20 20  alue]..         
10f10 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
10f20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73  }..        } els
10f30 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73  e {..          s
10f40 65 74 20 76 61 72 56 61 6c 75 65 20 5b 75 70 6c  et varValue [upl
10f50 65 76 65 6c 20 31 20 5b 6c 69 73 74 20 73 65 74  evel 1 [list set
10f60 20 24 76 61 72 4e 61 6d 65 5d 5d 0d 0a 0d 0a 20   $varName]].... 
10f70 20 20 20 20 20 20 20 20 20 69 66 20 7b 24 6f 62           if {$ob
10f80 6a 65 63 74 73 20 26 26 20 5b 69 73 4f 62 6a 65  jects && [isObje
10f90 63 74 48 61 6e 64 6c 65 20 24 76 61 72 56 61 6c  ctHandle $varVal
10fa0 75 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ue]} then {..   
10fb0 20 20 20 20 20 20 20 20 20 75 6e 73 65 74 20 2d           unset -
10fc0 6e 6f 63 6f 6d 70 6c 61 69 6e 20 70 72 6f 70 65  nocomplain prope
10fd0 72 74 69 65 73 0d 0a 20 20 20 20 20 20 20 20 20  rties..         
10fe0 20 20 20 67 65 74 41 6c 6c 50 72 6f 70 65 72 74     getAllPropert
10ff0 69 65 73 20 24 76 61 72 56 61 6c 75 65 20 70 72  ies $varValue pr
11000 6f 70 65 72 74 69 65 73 0d 0a 0d 0a 20 20 20 20  operties....    
11010 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20          lappend 
11020 72 65 73 75 6c 74 20 5b 6c 69 73 74 20 24 76 61  result [list $va
11030 72 4e 61 6d 65 20 5b 61 72 72 61 79 20 67 65 74  rName [array get
11040 20 70 72 6f 70 65 72 74 69 65 73 5d 5d 0d 0a 20   properties]].. 
11050 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20           } else 
11060 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c  {..            l
11070 61 70 70 65 6e 64 20 72 65 73 75 6c 74 20 5b 6c  append result [l
11080 69 73 74 20 24 76 61 72 4e 61 6d 65 20 24 76 61  ist $varName $va
11090 72 56 61 6c 75 65 5d 0d 0a 20 20 20 20 20 20 20  rValue]..       
110a0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
110b0 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
110c0 20 20 72 65 74 75 72 6e 20 24 72 65 73 75 6c 74    return $result
110d0 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
110e0 70 72 6f 63 20 65 6e 75 6d 65 72 61 62 6c 65 54  proc enumerableT
110f0 6f 4c 69 73 74 20 7b 20 65 6e 75 6d 65 72 61 62  oList { enumerab
11100 6c 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65  le } {..      se
11110 74 20 72 65 73 75 6c 74 20 5b 6c 69 73 74 5d 0d  t result [list].
11120 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74  ...      if {[st
11130 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 65 6e 75  ring length $enu
11140 6d 65 72 61 62 6c 65 5d 20 3d 3d 20 30 20 7c 7c  merable] == 0 ||
11150 20 24 65 6e 75 6d 65 72 61 62 6c 65 20 65 71 20   $enumerable eq 
11160 22 6e 75 6c 6c 22 7d 20 74 68 65 6e 20 7b 0d 0a  "null"} then {..
11170 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24          return $
11180 72 65 73 75 6c 74 0d 0a 20 20 20 20 20 20 7d 0d  result..      }.
11190 0a 0d 0a 20 20 20 20 20 20 6f 62 6a 65 63 74 20  ...      object 
111a0 66 6f 72 65 61 63 68 20 2d 61 6c 69 61 73 20 69  foreach -alias i
111b0 74 65 6d 20 24 65 6e 75 6d 65 72 61 62 6c 65 20  tem $enumerable 
111c0 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  {..        if {[
111d0 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 69  string length $i
111e0 74 65 6d 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  tem] > 0} then {
111f0 0d 0a 20 20 20 20 20 20 20 20 20 20 6c 61 70 70  ..          lapp
11200 65 6e 64 20 72 65 73 75 6c 74 20 5b 24 69 74 65  end result [$ite
11210 6d 20 54 6f 53 74 72 69 6e 67 5d 0d 0a 20 20 20  m ToString]..   
11220 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
11230 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ...      return 
11240 24 72 65 73 75 6c 74 0d 0a 20 20 20 20 7d 0d 0a  $result..    }..
11250 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 61 74 63  ...    proc catc
11260 68 41 6e 64 52 65 74 75 72 6e 20 7b 20 73 63 72  hAndReturn { scr
11270 69 70 74 20 7b 73 74 61 63 6b 54 72 61 63 65 20  ipt {stackTrace 
11280 66 61 6c 73 65 7d 20 7b 73 74 72 69 63 74 20 74  false} {strict t
11290 72 75 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20  rue} } {..      
112a0 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
112b0 20 45 76 61 6c 75 61 74 65 20 74 68 65 20 73 63   Evaluate the sc
112c0 72 69 70 74 20 70 72 6f 76 69 64 65 64 20 62 79  ript provided by
112d0 20 6f 75 72 20 63 61 6c 6c 65 72 20 69 6e 20 74   our caller in t
112e0 68 65 69 72 20 63 6f 6e 74 65 78 74 2c 0d 0a 20  heir context,.. 
112f0 20 20 20 20 20 23 20 20 20 20 20 20 20 63 61 70       #       cap
11300 74 75 72 69 6e 67 20 62 6f 74 68 20 74 68 65 20  turing both the 
11310 72 65 73 75 6c 74 20 61 6e 64 20 74 68 65 20 72  result and the r
11320 65 74 75 72 6e 20 63 6f 64 65 2e 0d 0a 20 20 20  eturn code...   
11330 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20     #..      set 
11340 63 6f 64 65 20 5b 63 61 74 63 68 20 7b 75 70 6c  code [catch {upl
11350 65 76 65 6c 20 31 20 24 73 63 72 69 70 74 7d 20  evel 1 $script} 
11360 72 65 73 75 6c 74 5d 0d 0a 0d 0a 20 20 20 20 20  result]....     
11370 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
11380 3a 20 44 69 64 20 74 68 65 20 73 63 72 69 70 74  : Did the script
11390 20 70 72 6f 76 69 64 65 64 20 62 79 20 6f 75 72   provided by our
113a0 20 63 61 6c 6c 65 72 20 4e 4f 54 20 72 61 69 73   caller NOT rais
113b0 65 20 61 6e 20 65 72 72 6f 72 3f 0d 0a 20 20 20  e an error?..   
113c0 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
113d0 24 73 74 72 69 63 74 20 26 26 20 24 63 6f 64 65  $strict && $code
113e0 20 3d 3d 20 30 20 7c 7c 20 21 24 73 74 72 69 63   == 0 || !$stric
113f0 74 20 26 26 20 24 63 6f 64 65 20 21 3d 20 31 7d  t && $code != 1}
11400 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
11410 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
11420 54 45 3a 20 53 75 63 63 65 73 73 2e 20 20 52 65  TE: Success.  Re
11430 74 75 72 6e 20 61 20 6c 69 73 74 20 77 69 74 68  turn a list with
11440 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   the return code
11450 20 61 6e 64 20 74 68 65 20 72 65 73 75 6c 74 2e   and the result.
11460 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
11470 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6c 69 73       return [lis
11480 74 20 24 63 6f 64 65 20 24 72 65 73 75 6c 74 5d  t $code $result]
11490 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66  ..      } elseif
114a0 20 7b 24 73 74 61 63 6b 54 72 61 63 65 7d 20 74   {$stackTrace} t
114b0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
114c0 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
114d0 3a 20 46 61 69 6c 75 72 65 2e 20 20 4f 75 72 20  : Failure.  Our 
114e0 63 61 6c 6c 65 72 20 77 61 6e 74 73 20 61 20 66  caller wants a f
114f0 75 6c 6c 20 73 74 61 63 6b 20 74 72 61 63 65 20  ull stack trace 
11500 28 69 66 20 61 70 70 6c 69 63 61 62 6c 65 29 2c  (if applicable),
11510 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
11520 20 20 72 65 74 75 72 6e 20 61 20 6c 69 73 74 20    return a list 
11530 77 69 74 68 20 74 68 65 20 72 65 74 75 72 6e 20  with the return 
11540 63 6f 64 65 20 61 6e 64 20 74 68 65 20 72 65 73  code and the res
11550 75 6c 74 20 76 65 72 62 61 74 69 6d 2e 0d 0a 20  ult verbatim... 
11560 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
11570 20 20 72 65 74 75 72 6e 20 5b 6c 69 73 74 20 24    return [list $
11580 63 6f 64 65 20 24 72 65 73 75 6c 74 5d 0d 0a 20  code $result].. 
11590 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
115a0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
115b0 20 20 23 20 4e 4f 54 45 3a 20 46 61 69 6c 75 72    # NOTE: Failur
115c0 65 2e 20 20 4f 75 72 20 63 61 6c 6c 65 72 20 64  e.  Our caller d
115d0 6f 65 73 20 6e 6f 74 20 77 61 6e 74 20 61 20 66  oes not want a f
115e0 75 6c 6c 20 73 74 61 63 6b 20 74 72 61 63 65 20  ull stack trace 
115f0 28 69 66 0d 0a 20 20 20 20 20 20 20 20 23 20 20  (if..        #  
11600 20 20 20 20 20 61 70 70 6c 69 63 61 62 6c 65 29       applicable)
11610 2c 20 72 65 74 75 72 6e 20 61 20 6c 69 73 74 20  , return a list 
11620 77 69 74 68 20 74 68 65 20 72 65 74 75 72 6e 20  with the return 
11630 63 6f 64 65 2c 20 74 68 65 20 65 72 72 6f 72 0d  code, the error.
11640 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
11650 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 69 6e   code for the in
11660 74 65 72 70 72 65 74 65 72 2c 20 61 6e 64 20 74  terpreter, and t
11670 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  he error message
11680 20 75 70 20 74 6f 20 74 68 65 0d 0a 20 20 20 20   up to the..    
11690 20 20 20 20 23 20 20 20 20 20 20 20 70 6f 69 6e      #       poin
116a0 74 20 77 68 65 72 65 20 74 68 65 20 73 74 61 63  t where the stac
116b0 6b 20 74 72 61 63 65 20 73 68 6f 75 6c 64 20 73  k trace should s
116c0 74 61 72 74 2e 0d 0a 20 20 20 20 20 20 20 20 23  tart...        #
116d0 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
116e0 20 5b 6c 69 73 74 20 24 63 6f 64 65 20 24 3a 3a   [list $code $::
116f0 65 72 72 6f 72 43 6f 64 65 20 5c 0d 0a 20 20 20  errorCode \..   
11700 20 20 20 20 20 20 20 20 20 5b 65 78 74 72 61 63           [extrac
11710 74 53 79 73 74 65 6d 44 61 74 61 53 51 4c 69 74  tSystemDataSQLit
11720 65 45 78 63 65 70 74 69 6f 6e 4d 65 73 73 61 67  eExceptionMessag
11730 65 20 24 72 65 73 75 6c 74 5d 5d 0d 0a 20 20 20  e $result]]..   
11740 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
11750 20 20 20 20 70 72 6f 63 20 63 6f 6d 70 69 6c 65      proc compile
11760 43 53 68 61 72 70 57 69 74 68 20 7b 0d 0a 20 20  CSharpWith {..  
11770 20 20 20 20 20 20 20 20 20 20 74 65 78 74 20 6d            text m
11780 65 6d 6f 72 79 20 73 79 6d 62 6f 6c 73 20 73 74  emory symbols st
11790 72 69 63 74 20 72 65 73 75 6c 74 73 56 61 72 4e  rict resultsVarN
117a0 61 6d 65 20 65 72 72 6f 72 73 56 61 72 4e 61 6d  ame errorsVarNam
117b0 65 20 66 69 6c 65 4e 61 6d 65 73 0d 0a 20 20 20  e fileNames..   
117c0 20 20 20 20 20 20 20 20 20 61 72 67 73 20 7d 20           args } 
117d0 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
117e0 20 20 23 20 4e 4f 54 45 3a 20 53 69 6e 63 65 20    # NOTE: Since 
117f0 77 65 20 61 72 65 20 67 6f 69 6e 67 20 74 6f 20  we are going to 
11800 75 73 65 20 74 68 69 73 20 6d 65 74 68 6f 64 20  use this method 
11810 6e 61 6d 65 20 61 20 6c 6f 74 2c 20 61 73 73 69  name a lot, assi
11820 67 6e 20 69 74 20 74 6f 20 61 0d 0a 20 20 20 20  gn it to a..    
11830 20 20 23 20 20 20 20 20 20 20 76 61 72 69 61 62    #       variab
11840 6c 65 20 66 69 72 73 74 2e 0d 0a 20 20 20 20 20  le first...     
11850 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 61 64   #..      set ad
11860 64 20 52 65 66 65 72 65 6e 63 65 64 41 73 73 65  d ReferencedAsse
11870 6d 62 6c 69 65 73 2e 41 64 64 0d 0a 0d 0a 20 20  mblies.Add....  
11880 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
11890 4f 54 45 3a 20 43 72 65 61 74 65 20 74 68 65 20  OTE: Create the 
118a0 62 61 73 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20  base command to 
118b0 65 76 61 6c 75 61 74 65 20 61 6e 64 20 61 64 64  evaluate and add
118c0 20 74 68 65 20 70 72 6f 70 65 72 74 79 20 73 65   the property se
118d0 74 74 69 6e 67 73 0d 0a 20 20 20 20 20 20 23 20  ttings..      # 
118e0 20 20 20 20 20 20 74 68 61 74 20 61 72 65 20 61        that are a
118f0 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 6e 65 65  lmost always nee
11900 64 65 64 20 62 79 20 6f 75 72 20 75 6e 69 74 20  ded by our unit 
11910 74 65 73 74 73 20 28 69 2e 65 2e 20 74 68 65 20  tests (i.e. the 
11920 53 79 73 74 65 6d 0d 0a 20 20 20 20 20 20 23 20  System..      # 
11930 20 20 20 20 20 20 61 6e 64 20 53 79 73 74 65 6d        and System
11940 2e 44 61 74 61 20 61 73 73 65 6d 62 6c 79 20 72  .Data assembly r
11950 65 66 65 72 65 6e 63 65 73 29 2e 0d 0a 20 20 20  eferences)...   
11960 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20     #..      set 
11970 63 6f 6d 6d 61 6e 64 20 5b 6c 69 73 74 20 5c 0d  command [list \.
11980 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6d 70 69  .          compi
11990 6c 65 43 53 68 61 72 70 20 24 74 65 78 74 20 24  leCSharp $text $
119a0 6d 65 6d 6f 72 79 20 24 73 79 6d 62 6f 6c 73 20  memory $symbols 
119b0 24 73 74 72 69 63 74 20 72 65 73 75 6c 74 73 20  $strict results 
119c0 65 72 72 6f 72 73 20 5c 0d 0a 20 20 20 20 20 20  errors \..      
119d0 20 20 20 20 24 61 64 64 20 53 79 73 74 65 6d 2e      $add System.
119e0 64 6c 6c 20 24 61 64 64 20 53 79 73 74 65 6d 2e  dll $add System.
119f0 44 61 74 61 2e 64 6c 6c 20 24 61 64 64 20 53 79  Data.dll $add Sy
11a00 73 74 65 6d 2e 54 72 61 6e 73 61 63 74 69 6f 6e  stem.Transaction
11a10 73 2e 64 6c 6c 20 5c 0d 0a 20 20 20 20 20 20 20  s.dll \..       
11a20 20 20 20 24 61 64 64 20 53 79 73 74 65 6d 2e 58     $add System.X
11a30 6d 6c 2e 64 6c 6c 5d 0d 0a 0d 0a 20 20 20 20 20  ml.dll]....     
11a40 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
11a50 3a 20 41 64 64 20 61 6c 6c 20 74 68 65 20 70 72  : Add all the pr
11a60 6f 76 69 64 65 64 20 66 69 6c 65 20 6e 61 6d 65  ovided file name
11a70 73 20 61 73 20 61 73 73 65 6d 62 6c 79 20 72 65  s as assembly re
11a80 66 65 72 65 6e 63 65 73 2e 0d 0a 20 20 20 20 20  ferences...     
11a90 20 23 0d 0a 20 20 20 20 20 20 66 6f 72 65 61 63   #..      foreac
11aa0 68 20 66 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65  h fileName $file
11ab0 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20  Names {..       
11ac0 20 6c 61 70 70 65 6e 64 20 63 6f 6d 6d 61 6e 64   lappend command
11ad0 20 24 61 64 64 20 5b 67 65 74 42 69 6e 61 72 79   $add [getBinary
11ae0 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61  FileName $fileNa
11af0 6d 65 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  me]..      }....
11b00 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
11b10 20 4e 4f 54 45 3a 20 41 64 64 20 74 68 65 20 65   NOTE: Add the e
11b20 78 74 72 61 20 61 72 67 75 6d 65 6e 74 73 2c 20  xtra arguments, 
11b30 69 66 20 61 6e 79 2c 20 74 6f 20 74 68 65 20 63  if any, to the c
11b40 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 75 61  ommand to evalua
11b50 74 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  te...      #..  
11b60 20 20 20 20 65 76 61 6c 20 6c 61 70 70 65 6e 64      eval lappend
11b70 20 63 6f 6d 6d 61 6e 64 20 24 61 72 67 73 0d 0a   command $args..
11b80 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
11b90 20 23 20 4e 4f 54 45 3a 20 41 6c 69 61 73 20 74   # NOTE: Alias t
11ba0 68 65 20 63 6f 6d 70 69 6c 65 72 20 6c 6f 63 61  he compiler loca
11bb0 6c 20 72 65 73 75 6c 74 73 20 61 6e 64 20 65 72  l results and er
11bc0 72 6f 72 73 20 76 61 72 69 61 62 6c 65 73 20 74  rors variables t
11bd0 6f 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20  o the..      #  
11be0 20 20 20 20 20 76 61 72 69 61 62 6c 65 20 6e 61       variable na
11bf0 6d 65 73 20 70 72 6f 76 69 64 65 64 20 62 79 20  mes provided by 
11c00 6f 75 72 20 63 61 6c 6c 65 72 2e 0d 0a 20 20 20  our caller...   
11c10 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
11c20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
11c30 72 65 73 75 6c 74 73 56 61 72 4e 61 6d 65 5d 20  resultsVarName] 
11c40 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
11c50 20 20 20 20 20 75 70 76 61 72 20 31 20 24 72 65       upvar 1 $re
11c60 73 75 6c 74 73 56 61 72 4e 61 6d 65 20 72 65 73  sultsVarName res
11c70 75 6c 74 73 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  ults..      }...
11c80 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69  .      if {[stri
11c90 6e 67 20 6c 65 6e 67 74 68 20 24 65 72 72 6f 72  ng length $error
11ca0 73 56 61 72 4e 61 6d 65 5d 20 3e 20 30 7d 20 74  sVarName] > 0} t
11cb0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 75  hen {..        u
11cc0 70 76 61 72 20 31 20 24 65 72 72 6f 72 73 56 61  pvar 1 $errorsVa
11cd0 72 4e 61 6d 65 20 65 72 72 6f 72 73 0d 0a 20 20  rName errors..  
11ce0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
11cf0 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
11d00 45 76 61 6c 75 61 74 65 20 74 68 65 20 63 6f 6e  Evaluate the con
11d10 73 74 72 75 63 74 65 64 20 5b 63 6f 6d 70 69 6c  structed [compil
11d20 65 43 53 68 61 72 70 5d 20 63 6f 6d 6d 61 6e 64  eCSharp] command
11d30 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 0d   and return the.
11d40 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 72  .      #       r
11d50 65 73 75 6c 74 2e 0d 0a 20 20 20 20 20 20 23 0d  esult...      #.
11d60 0a 20 20 20 20 20 20 65 76 61 6c 20 24 63 6f 6d  .      eval $com
11d70 6d 61 6e 64 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  mand..    }.....
11d80 20 20 20 20 70 72 6f 63 20 69 73 4d 65 6d 6f 72      proc isMemor
11d90 79 44 62 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7d  yDb { fileName }
11da0 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
11db0 20 20 20 23 20 4e 4f 54 45 3a 20 49 73 20 74 68     # NOTE: Is th
11dc0 65 20 73 70 65 63 69 66 69 65 64 20 64 61 74 61  e specified data
11dd0 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 72  base file name r
11de0 65 61 6c 6c 79 20 61 6e 20 69 6e 2d 6d 65 6d 6f  eally an in-memo
11df0 72 79 20 64 61 74 61 62 61 73 65 3f 0d 0a 20 20  ry database?..  
11e00 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74      #..      ret
11e10 75 72 6e 20 5b 65 78 70 72 20 7b 24 66 69 6c 65  urn [expr {$file
11e20 4e 61 6d 65 20 65 71 20 22 3a 6d 65 6d 6f 72 79  Name eq ":memory
11e30 3a 22 20 7c 7c 20 5c 0d 0a 20 20 20 20 20 20 20  :" || \..       
11e40 20 20 20 5b 73 74 72 69 6e 67 20 72 61 6e 67 65     [string range
11e50 20 24 66 69 6c 65 4e 61 6d 65 20 30 20 31 32 5d   $fileName 0 12]
11e60 20 65 71 20 22 66 69 6c 65 3a 3a 6d 65 6d 6f 72   eq "file::memor
11e70 79 3a 22 7d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d  y:"}]..    }....
11e80 0a 20 20 20 20 70 72 6f 63 20 69 73 54 61 62 6c  .    proc isTabl
11e90 65 49 6e 44 62 20 7b 20 6e 61 6d 65 20 7b 76 61  eInDb { name {va
11ea0 72 4e 61 6d 65 20 64 62 7d 20 7d 20 7b 0d 0a 20  rName db} } {.. 
11eb0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
11ec0 4e 4f 54 45 3a 20 52 65 66 65 72 20 74 6f 20 74  NOTE: Refer to t
11ed0 68 65 20 73 70 65 63 69 66 69 65 64 20 76 61 72  he specified var
11ee0 69 61 62 6c 65 20 28 65 2e 67 2e 20 22 64 62 22  iable (e.g. "db"
11ef0 29 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 78 74  ) in the context
11f00 20 6f 66 20 6f 75 72 0d 0a 20 20 20 20 20 20 23   of our..      #
11f10 20 20 20 20 20 20 20 63 61 6c 6c 65 72 2e 20 20         caller.  
11f20 49 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  It contains the 
11f30 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
11f40 69 6f 6e 20 68 61 6e 64 6c 65 20 74 68 61 74 20  ion handle that 
11f50 77 69 6c 6c 20 62 65 0d 0a 20 20 20 20 20 20 23  will be..      #
11f60 20 20 20 20 20 20 20 75 73 65 64 20 74 6f 20 65         used to e
11f70 78 65 63 75 74 65 20 74 68 65 20 71 75 65 72 79  xecute the query
11f80 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69   used to determi
11f90 6e 65 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20  ne if the named 
11fa0 74 61 62 6c 65 20 69 73 0d 0a 20 20 20 20 20 20  table is..      
11fb0 23 20 20 20 20 20 20 20 70 72 65 73 65 6e 74 20  #       present 
11fc0 69 6e 20 74 68 61 74 20 64 61 74 61 62 61 73 65  in that database
11fd0 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
11fe0 20 20 75 70 76 61 72 20 31 20 24 76 61 72 4e 61    upvar 1 $varNa
11ff0 6d 65 20 64 62 0d 0a 0d 0a 20 20 20 20 20 20 23  me db....      #
12000 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
12010 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  Use the sqlite_m
12020 61 73 74 65 72 20 74 61 62 6c 65 20 74 6f 20 64  aster table to d
12030 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20  etermine if the 
12040 6e 61 6d 65 64 20 74 61 62 6c 65 20 69 73 0d 0a  named table is..
12050 20 20 20 20 20 20 23 20 20 20 20 20 20 20 70 72        #       pr
12060 65 73 65 6e 74 20 69 6e 20 74 68 65 20 64 61 74  esent in the dat
12070 61 62 61 73 65 2e 0d 0a 20 20 20 20 20 20 23 0d  abase...      #.
12080 0a 20 20 20 20 20 20 73 65 74 20 73 71 6c 20 7b  .      set sql {
12090 0d 0a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54  ..        SELECT
120a0 20 43 4f 55 4e 54 28 2a 29 20 46 52 4f 4d 20 73   COUNT(*) FROM s
120b0 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 57 48 45  qlite_master WHE
120c0 52 45 20 74 79 70 65 20 3d 20 27 74 61 62 6c 65  RE type = 'table
120d0 27 20 41 4e 44 20 6e 61 6d 65 20 3d 20 3f 3b 0d  ' AND name = ?;.
120e0 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
120f0 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
12100 45 3a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  E: Return non-ze
12110 72 6f 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20  ro if the named 
12120 74 61 62 6c 65 20 69 73 20 70 72 65 73 65 6e 74  table is present
12130 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
12140 20 20 72 65 74 75 72 6e 20 5b 65 78 70 72 20 7b    return [expr {
12150 0d 0a 20 20 20 20 20 20 20 20 5b 73 71 6c 20 65  ..        [sql e
12160 78 65 63 75 74 65 20 2d 65 78 65 63 75 74 65 20  xecute -execute 
12170 73 63 61 6c 61 72 20 24 64 62 20 24 73 71 6c 20  scalar $db $sql 
12180 5b 6c 69 73 74 20 70 61 72 61 6d 31 20 53 74 72  [list param1 Str
12190 69 6e 67 20 24 6e 61 6d 65 5d 5d 20 3e 20 30 0d  ing $name]] > 0.
121a0 0a 20 20 20 20 20 20 7d 5d 0d 0a 20 20 20 20 7d  .      }]..    }
121b0 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65  .....    proc ge
121c0 74 44 62 44 65 66 61 75 6c 74 50 61 67 65 53 69  tDbDefaultPageSi
121d0 7a 65 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 74  ze {} {..      t
121e0 72 79 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65  ry {..        se
121f0 74 20 64 62 20 5b 73 71 6c 20 6f 70 65 6e 20 2d  t db [sql open -
12200 74 79 70 65 20 53 51 4c 69 74 65 20 7b 44 61 74  type SQLite {Dat
12210 61 20 53 6f 75 72 63 65 3d 3a 6d 65 6d 6f 72 79  a Source=:memory
12220 3a 3b 7d 5d 0d 0a 20 20 20 20 20 20 20 20 72 65  :;}]..        re
12230 74 75 72 6e 20 5b 73 71 6c 20 65 78 65 63 75 74  turn [sql execut
12240 65 20 2d 65 78 65 63 75 74 65 20 73 63 61 6c 61  e -execute scala
12250 72 20 24 64 62 20 22 50 52 41 47 4d 41 20 70 61  r $db "PRAGMA pa
12260 67 65 5f 73 69 7a 65 3b 22 5d 0d 0a 20 20 20 20  ge_size;"]..    
12270 20 20 7d 20 66 69 6e 61 6c 6c 79 20 7b 0d 0a 20    } finally {.. 
12280 20 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f         if {[info
12290 20 65 78 69 73 74 73 20 64 62 5d 7d 20 74 68 65   exists db]} the
122a0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63  n {..          c
122b0 61 74 63 68 20 7b 73 71 6c 20 63 6c 6f 73 65 20  atch {sql close 
122c0 24 64 62 7d 0d 0a 20 20 20 20 20 20 20 20 20 20  $db}..          
122d0 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69  unset -nocomplai
122e0 6e 20 64 62 0d 0a 20 20 20 20 20 20 20 20 7d 0d  n db..        }.
122f0 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
12300 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74  ....    proc get
12310 44 62 44 65 66 61 75 6c 74 43 61 63 68 65 53 69  DbDefaultCacheSi
12320 7a 65 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 74  ze {} {..      t
12330 72 79 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65  ry {..        se
12340 74 20 64 62 20 5b 73 71 6c 20 6f 70 65 6e 20 2d  t db [sql open -
12350 74 79 70 65 20 53 51 4c 69 74 65 20 7b 44 61 74  type SQLite {Dat
12360 61 20 53 6f 75 72 63 65 3d 3a 6d 65 6d 6f 72 79  a Source=:memory
12370 3a 3b 7d 5d 0d 0a 20 20 20 20 20 20 20 20 72 65  :;}]..        re
12380 74 75 72 6e 20 5b 73 71 6c 20 65 78 65 63 75 74  turn [sql execut
12390 65 20 2d 65 78 65 63 75 74 65 20 73 63 61 6c 61  e -execute scala
123a0 72 20 24 64 62 20 22 50 52 41 47 4d 41 20 63 61  r $db "PRAGMA ca
123b0 63 68 65 5f 73 69 7a 65 3b 22 5d 0d 0a 20 20 20  che_size;"]..   
123c0 20 20 20 7d 20 66 69 6e 61 6c 6c 79 20 7b 0d 0a     } finally {..
123d0 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66          if {[inf
123e0 6f 20 65 78 69 73 74 73 20 64 62 5d 7d 20 74 68  o exists db]} th
123f0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
12400 63 61 74 63 68 20 7b 73 71 6c 20 63 6c 6f 73 65  catch {sql close
12410 20 24 64 62 7d 0d 0a 20 20 20 20 20 20 20 20 20   $db}..         
12420 20 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61   unset -nocompla
12430 69 6e 20 64 62 0d 0a 20 20 20 20 20 20 20 20 7d  in db..        }
12440 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
12450 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 75 73  .....    proc us
12460 65 4c 65 67 61 63 79 44 62 50 61 67 65 41 6e 64  eLegacyDbPageAnd
12470 43 61 63 68 65 53 69 7a 65 73 20 7b 20 76 61 72  CacheSizes { var
12480 4e 61 6d 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20  Name } {..      
12490 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
124a0 20 52 65 66 65 72 20 74 6f 20 74 68 65 20 73 70   Refer to the sp
124b0 65 63 69 66 69 65 64 20 76 61 72 69 61 62 6c 65  ecified variable
124c0 20 28 65 2e 67 2e 20 22 64 62 22 29 20 69 6e 20   (e.g. "db") in 
124d0 74 68 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f  the context of o
124e0 75 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ur..      #     
124f0 20 20 63 61 6c 6c 65 72 2e 20 20 49 74 20 63 6f    caller.  It co
12500 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74 61 62  ntains the datab
12510 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68  ase connection h
12520 61 6e 64 6c 65 20 74 68 61 74 20 77 69 6c 6c 20  andle that will 
12530 62 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  be..      #     
12540 20 20 75 73 65 64 20 74 6f 20 65 78 65 63 75 74    used to execut
12550 65 20 71 75 65 72 69 65 73 20 75 73 65 64 20 74  e queries used t
12560 6f 20 73 65 74 20 74 68 65 20 70 61 67 65 20 61  o set the page a
12570 6e 64 20 63 61 63 68 65 20 73 69 7a 65 73 2e 0d  nd cache sizes..
12580 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
12590 75 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65  upvar 1 $varName
125a0 20 64 62 0d 0a 0d 0a 20 20 20 20 20 20 73 71 6c   db....      sql
125b0 20 65 78 65 63 75 74 65 20 24 64 62 20 7b 0d 0a   execute $db {..
125c0 20 20 20 20 20 20 20 20 50 52 41 47 4d 41 20 70          PRAGMA p
125d0 61 67 65 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b  age_size = 1024;
125e0 0d 0a 20 20 20 20 20 20 20 20 50 52 41 47 4d 41  ..        PRAGMA
125f0 20 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 32 30   cache_size = 20
12600 30 30 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  00;..      }....
12610 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6c 69        return [li
12620 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  st \..          
12630 5b 73 71 6c 20 65 78 65 63 75 74 65 20 2d 65 78  [sql execute -ex
12640 65 63 75 74 65 20 73 63 61 6c 61 72 20 24 64 62  ecute scalar $db
12650 20 22 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69   "PRAGMA page_si
12660 7a 65 3b 22 5d 20 5c 0d 0a 20 20 20 20 20 20 20  ze;"] \..       
12670 20 20 20 5b 73 71 6c 20 65 78 65 63 75 74 65 20     [sql execute 
12680 2d 65 78 65 63 75 74 65 20 73 63 61 6c 61 72 20  -execute scalar 
12690 24 64 62 20 22 50 52 41 47 4d 41 20 63 61 63 68  $db "PRAGMA cach
126a0 65 5f 73 69 7a 65 3b 22 5d 5d 0d 0a 20 20 20 20  e_size;"]]..    
126b0 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 65  }.....    proc e
126c0 78 74 72 61 63 74 53 79 73 74 65 6d 44 61 74 61  xtractSystemData
126d0 53 51 4c 69 74 65 45 78 63 65 70 74 69 6f 6e 4d  SQLiteExceptionM
126e0 65 73 73 61 67 65 20 7b 20 76 61 6c 75 65 20 7d  essage { value }
126f0 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
12700 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 74 68     # NOTE: If th
12710 65 20 73 74 72 69 6e 67 20 63 6f 6e 66 6f 72 6d  e string conform
12720 73 20 74 6f 20 66 6f 72 6d 61 74 20 6f 66 20 74  s to format of t
12730 68 65 20 6e 6f 72 6d 61 6c 20 65 78 63 65 70 74  he normal except
12740 69 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ion..      #    
12750 20 20 20 65 72 72 6f 72 20 73 74 72 69 6e 67 73     error strings
12760 2c 20 65 78 74 72 61 63 74 20 61 6e 64 20 72 65  , extract and re
12770 74 75 72 6e 20 6f 6e 6c 79 20 74 68 65 20 65 72  turn only the er
12780 72 6f 72 20 6d 65 73 73 61 67 65 0d 0a 20 20 20  ror message..   
12790 20 20 20 23 20 20 20 20 20 20 20 70 6f 72 74 69     #       porti
127a0 6f 6e 20 69 74 73 65 6c 66 2e 0d 0a 20 20 20 20  on itself...    
127b0 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 70    #..      set p
127c0 61 74 74 65 72 6e 73 20 5b 6c 69 73 74 20 5c 0d  atterns [list \.
127d0 0a 20 20 20 20 20 20 7b 53 79 73 74 65 6d 5c 2e  .      {System\.
127e0 44 61 74 61 5c 2e 53 51 4c 69 74 65 5c 2e 53 51  Data\.SQLite\.SQ
127f0 4c 69 74 65 45 78 63 65 70 74 69 6f 6e 20 5c 28  LiteException \(
12800 30 78 38 30 30 30 34 30 30 35 5c 29 3a 20 28 2e  0x80004005\): (.
12810 2b 3f 29 20 20 28 3f 3a 20 29 3f 61 74 7d 20 5c  +?)  (?: )?at} \
12820 0d 0a 20 20 20 20 20 20 7b 53 79 73 74 65 6d 5c  ..      {System\
12830 2e 44 61 74 61 5c 2e 53 51 4c 69 74 65 5c 2e 53  .Data\.SQLite\.S
12840 51 4c 69 74 65 45 78 63 65 70 74 69 6f 6e 3a 20  QLiteException: 
12850 28 2e 2b 3f 29 20 20 28 3f 3a 20 29 3f 61 74 7d  (.+?)  (?: )?at}
12860 20 5c 0d 0a 20 20 20 20 20 20 7b 45 61 67 6c 65   \..      {Eagle
12870 5c 2e 5f 43 6f 6d 70 6f 6e 65 6e 74 73 5c 2e 50  \._Components\.P
12880 75 62 6c 69 63 5c 2e 53 63 72 69 70 74 45 78 63  ublic\.ScriptExc
12890 65 70 74 69 6f 6e 3a 20 28 2e 2b 3f 29 20 20 28  eption: (.+?)  (
128a0 3f 3a 20 29 3f 61 74 7d 5d 0d 0a 0d 0a 20 20 20  ?: )?at}]....   
128b0 20 20 20 66 6f 72 65 61 63 68 20 70 61 74 74 65     foreach patte
128c0 72 6e 20 24 70 61 74 74 65 72 6e 73 20 7b 0d 0a  rn $patterns {..
128d0 20 20 20 20 20 20 20 20 69 66 20 7b 5b 72 65 67          if {[reg
128e0 65 78 70 20 2d 2d 20 24 70 61 74 74 65 72 6e 20  exp -- $pattern 
128f0 24 76 61 6c 75 65 20 64 75 6d 6d 79 20 6d 65 73  $value dummy mes
12900 73 61 67 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  sage]} then {.. 
12910 20 20 20 20 20 20 20 20 20 73 65 74 20 6d 65 73           set mes
12920 73 61 67 65 20 5b 73 74 72 69 6e 67 20 6d 61 70  sage [string map
12930 20 5b 6c 69 73 74 20 5c 72 5c 6e 20 5c 6e 5d 20   [list \r\n \n] 
12940 5b 73 74 72 69 6e 67 20 74 72 69 6d 20 24 6d 65  [string trim $me
12950 73 73 61 67 65 5d 5d 0d 0a 20 20 20 20 20 20 20  ssage]]..       
12960 20 20 20 73 65 74 20 6c 69 6e 65 73 20 5b 73 70     set lines [sp
12970 6c 69 74 20 24 6d 65 73 73 61 67 65 20 5c 6e 5d  lit $message \n]
12980 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66  ....          if
12990 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 6c 69 6e 65   {[llength $line
129a0 73 5d 20 3d 3d 20 32 7d 20 74 68 65 6e 20 7b 0d  s] == 2} then {.
129b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
129c0 7b 5b 6c 69 6e 64 65 78 20 24 6c 69 6e 65 73 20  {[lindex $lines 
129d0 30 5d 20 65 71 20 5b 6c 69 6e 64 65 78 20 24 6c  0] eq [lindex $l
129e0 69 6e 65 73 20 31 5d 7d 20 74 68 65 6e 20 7b 0d  ines 1]} then {.
129f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
12a00 65 74 75 72 6e 20 5b 6c 69 6e 64 65 78 20 24 6c  eturn [lindex $l
12a10 69 6e 65 73 20 30 5d 0d 0a 20 20 20 20 20 20 20  ines 0]..       
12a20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
12a30 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 61 70        return [ap
12a40 70 65 6e 64 41 72 67 73 20 5b 6c 69 6e 64 65 78  pendArgs [lindex
12a50 20 24 6c 69 6e 65 73 20 30 5d 20 22 20 2d 2d 20   $lines 0] " -- 
12a60 22 20 5b 6c 69 6e 64 65 78 20 24 6c 69 6e 65 73  " [lindex $lines
12a70 20 31 5d 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   1]]..          
12a80 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 72  }....          r
12a90 65 74 75 72 6e 20 24 6d 65 73 73 61 67 65 0d 0a  eturn $message..
12aa0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
12ab0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75   }....      retu
12ac0 72 6e 20 24 76 61 6c 75 65 0d 0a 20 20 20 20 7d  rn $value..    }
12ad0 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 74 72  .....    proc tr
12ae0 69 6d 53 71 6c 20 7b 20 73 71 6c 20 7d 20 7b 0d  imSql { sql } {.
12af0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 72  .      return [r
12b00 65 67 73 75 62 20 2d 61 6c 6c 20 2d 2d 20 7b 5c  egsub -all -- {\
12b10 73 2b 7d 20 5b 73 74 72 69 6e 67 20 74 72 69 6d  s+} [string trim
12b20 20 24 73 71 6c 5d 20 22 20 22 5d 0d 0a 20 20 20   $sql] " "]..   
12b30 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
12b40 65 78 65 63 75 74 65 53 71 6c 20 7b 20 73 71 6c  executeSql { sql
12b50 20 7b 65 78 65 63 75 74 65 20 6e 6f 6e 65 7d 20   {execute none} 
12b60 7b 66 6f 72 6d 61 74 20 6e 6f 6e 65 7d 20 7b 66  {format none} {f
12b70 69 6c 65 4e 61 6d 65 20 22 22 7d 20 7d 20 7b 0d  ileName ""} } {.
12b80 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69  .      if {[stri
12b90 6e 67 20 6c 65 6e 67 74 68 20 24 66 69 6c 65 4e  ng length $fileN
12ba0 61 6d 65 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ame] == 0} then 
12bb0 7b 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 3a 6d  {set fileName :m
12bc0 65 6d 6f 72 79 3a 7d 0d 0a 20 20 20 20 20 20 73  emory:}..      s
12bd0 65 74 75 70 44 62 20 24 66 69 6c 65 4e 61 6d 65  etupDb $fileName
12be0 20 22 22 20 22 22 20 22 22 20 22 22 20 22 22 20   "" "" "" "" "" 
12bf0 66 61 6c 73 65 20 66 61 6c 73 65 20 66 61 6c 73  false false fals
12c00 65 20 66 61 6c 73 65 20 64 62 20 74 72 75 65 0d  e false db true.
12c10 0a 0d 0a 20 20 20 20 20 20 74 72 79 20 7b 0d 0a  ...      try {..
12c20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b          return [
12c30 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74 20  uplevel 1 [list 
12c40 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  \..            s
12c50 71 6c 20 65 78 65 63 75 74 65 20 2d 65 78 65 63  ql execute -exec
12c60 75 74 65 20 24 65 78 65 63 75 74 65 20 2d 66 6f  ute $execute -fo
12c70 72 6d 61 74 20 24 66 6f 72 6d 61 74 20 24 64 62  rmat $format $db
12c80 20 24 73 71 6c 5d 5d 0d 0a 20 20 20 20 20 20 7d   $sql]]..      }
12c90 20 66 69 6e 61 6c 6c 79 20 7b 0d 0a 20 20 20 20   finally {..    
12ca0 20 20 20 20 63 6c 65 61 6e 75 70 44 62 20 24 66      cleanupDb $f
12cb0 69 6c 65 4e 61 6d 65 20 64 62 20 66 61 6c 73 65  ileName db false
12cc0 20 66 61 6c 73 65 20 66 61 6c 73 65 0d 0a 20 20   false false..  
12cd0 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
12ce0 0a 20 20 20 20 70 72 6f 63 20 68 61 73 4e 6f 46  .    proc hasNoF
12cf0 6c 61 67 73 20 7b 20 76 61 72 4e 61 6d 65 20 6e  lags { varName n
12d00 6f 6e 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20 75  one } {..      u
12d10 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65 20  pvar 1 $varName 
12d20 66 6c 61 67 73 0d 0a 0d 0a 20 20 20 20 20 20 69  flags....      i
12d30 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
12d40 20 66 6c 61 67 73 5d 7d 20 74 68 65 6e 20 7b 0d   flags]} then {.
12d50 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
12d60 74 72 75 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  true..      }...
12d70 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69  .      if {[stri
12d80 6e 67 20 6c 65 6e 67 74 68 20 24 66 6c 61 67 73  ng length $flags
12d90 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
12da0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74          return t
12db0 72 75 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  rue..      }....
12dc0 20 20 20 20 20 20 69 66 20 7b 24 6e 6f 6e 65 20        if {$none 
12dd0 26 26 20 24 66 6c 61 67 73 20 65 71 20 22 4e 6f  && $flags eq "No
12de0 6e 65 22 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ne"} then {..   
12df0 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65       return true
12e00 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
12e10 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 0d     return false.
12e20 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
12e30 72 6f 63 20 67 65 74 43 6f 6e 6e 65 63 74 69 6f  roc getConnectio
12e40 6e 46 6c 61 67 73 20 7b 20 66 69 6c 65 4e 61 6d  nFlags { fileNam
12e50 65 20 66 6c 61 67 73 20 7b 71 75 69 65 74 20 66  e flags {quiet f
12e60 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  alse} } {..     
12e70 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
12e80 3a 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 69  : Figure out whi
12e90 63 68 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ch database file
12ea0 20 6e 61 6d 65 20 6f 72 20 63 6f 6e 6e 65 63 74   name or connect
12eb0 69 6f 6e 20 73 74 72 69 6e 67 20 74 68 65 73 65  ion string these
12ec0 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
12ed0 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73  connection flags
12ee0 20 77 69 6c 6c 20 61 63 74 75 61 6c 6c 79 20 61   will actually a
12ef0 70 70 6c 79 20 74 6f 2e 20 20 54 68 69 73 20 69  pply to.  This i
12f00 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 0d  s not necessary.
12f10 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69  .      #       i
12f20 6e 20 71 75 69 65 74 20 6d 6f 64 65 20 62 65 63  n quiet mode bec
12f30 61 75 73 65 20 74 68 69 73 20 69 6e 66 6f 72 6d  ause this inform
12f40 61 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73  ation is only us
12f50 65 64 20 66 6f 72 20 6c 6f 67 67 69 6e 67 0d 0a  ed for logging..
12f60 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61 6e        #       an
12f70 64 20 72 65 70 6f 72 74 69 6e 67 20 70 75 72 70  d reporting purp
12f80 6f 73 65 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  oses...      #..
12f90 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
12fa0 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
12fb0 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
12fc0 65 6e 67 74 68 20 24 66 69 6c 65 4e 61 6d 65 5d  ength $fileName]
12fd0 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
12fe0 20 20 20 20 20 20 20 20 73 65 74 20 64 61 74 61          set data
12ff0 62 61 73 65 20 5b 61 70 70 65 6e 64 41 72 67 73  base [appendArgs
13000 20 22 66 69 6c 65 20 6e 61 6d 65 20 5c 22 22 20   "file name \"" 
13010 24 66 69 6c 65 4e 61 6d 65 20 5c 22 5d 0d 0a 20  $fileName \"].. 
13020 20 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20         } elseif 
13030 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
13040 64 61 74 61 53 6f 75 72 63 65 5d 20 26 26 20 5c  dataSource] && \
13050 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 21 5b  ..            ![
13060 61 72 72 61 79 20 65 78 69 73 74 73 20 3a 3a 64  array exists ::d
13070 61 74 61 53 6f 75 72 63 65 5d 7d 20 74 68 65 6e  ataSource]} then
13080 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   {..          se
13090 74 20 64 61 74 61 62 61 73 65 20 5b 61 70 70 65  t database [appe
130a0 6e 64 41 72 67 73 20 22 64 61 74 61 20 73 6f 75  ndArgs "data sou
130b0 72 63 65 20 5c 22 22 20 24 3a 3a 64 61 74 61 53  rce \"" $::dataS
130c0 6f 75 72 63 65 20 5c 22 5d 0d 0a 20 20 20 20 20  ource \"]..     
130d0 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
130e0 20 20 20 20 20 20 20 73 65 74 20 64 61 74 61 62         set datab
130f0 61 73 65 20 3c 75 6e 6b 6e 6f 77 6e 3e 0d 0a 20  ase <unknown>.. 
13100 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
13110 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
13120 20 20 20 20 23 20 4e 4f 54 45 3a 20 45 76 65 6e      # NOTE: Even
13130 20 74 68 6f 75 67 68 20 74 68 65 72 65 20 69 73   though there is
13140 20 6f 6e 6c 79 20 6f 6e 65 20 73 6f 75 72 63 65   only one source
13150 20 6f 66 20 66 6c 61 67 73 20 73 6f 20 66 61 72   of flags so far
13160 2c 20 74 68 65 79 0d 0a 20 20 20 20 20 20 23 20  , they..      # 
13170 20 20 20 20 20 20 6d 75 73 74 20 62 65 20 63 6f        must be co
13180 6d 62 69 6e 65 64 20 75 73 69 6e 67 20 74 68 65  mbined using the
13190 20 63 6f 72 72 65 63 74 20 73 79 6e 74 61 78 20   correct syntax 
131a0 66 6f 72 20 65 6e 75 6d 65 72 61 74 65 64 0d 0a  for enumerated..
131b0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 66 6c        #       fl
131c0 61 67 20 76 61 6c 75 65 73 20 66 6f 72 20 74 68  ag values for th
131d0 65 20 2e 4e 45 54 20 46 72 61 6d 65 77 6f 72 6b  e .NET Framework
131e0 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
131f0 20 20 73 65 74 20 66 6c 61 67 73 20 5b 63 6f 6d    set flags [com
13200 62 69 6e 65 46 6c 61 67 73 20 24 66 6c 61 67 73  bineFlags $flags
13210 20 22 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d   ""]....      #.
13220 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53  .      # NOTE: S
13230 68 6f 77 20 28 61 6e 64 20 6c 6f 67 29 20 74 68  how (and log) th
13240 65 20 6c 6f 63 61 6c 20 63 6f 6e 6e 65 63 74 69  e local connecti
13250 6f 6e 20 66 6c 61 67 73 20 61 6e 64 20 74 68 65  on flags and the
13260 20 61 73 73 6f 63 69 61 74 65 64 0d 0a 20 20 20   associated..   
13270 20 20 20 23 20 20 20 20 20 20 20 64 61 74 61 20     #       data 
13280 73 6f 75 72 63 65 20 6f 72 20 66 69 6c 65 20 6e  source or file n
13290 61 6d 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ame...      #.. 
132a0 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
132b0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
132c0 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
132d0 73 74 73 20 3a 3a 6e 6f 28 65 6d 69 74 4c 6f 63  sts ::no(emitLoc
132e0 61 6c 46 6c 61 67 73 29 5d 20 26 26 20 5c 0d 0a  alFlags)] && \..
132f0 20 20 20 20 20 20 20 20 20 20 20 20 28 21 5b 69              (![i
13300 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
13310 65 6d 69 74 4c 6f 63 61 6c 46 6c 61 67 73 49 66  emitLocalFlagsIf
13320 4e 6f 6e 65 29 5d 20 7c 7c 20 5c 0d 0a 20 20 20  None)] || \..   
13330 20 20 20 20 20 20 20 20 20 20 21 5b 68 61 73 4e            ![hasN
13340 6f 46 6c 61 67 73 20 66 6c 61 67 73 20 66 61 6c  oFlags flags fal
13350 73 65 5d 29 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  se])} then {..  
13360 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
13370 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
13380 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
13390 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
133a0 20 6c 6f 63 61 6c 20 63 6f 6e 6e 65 63 74 69 6f   local connectio
133b0 6e 20 66 6c 61 67 73 20 66 6f 72 20 22 20 24 64  n flags for " $d
133c0 61 74 61 62 61 73 65 20 5c 0d 0a 20 20 20 20 20  atabase \..     
133d0 20 20 20 20 20 20 20 20 20 22 20 61 72 65 3a 20           " are: 
133e0 22 20 5b 65 78 70 72 20 7b 21 5b 68 61 73 4e 6f  " [expr {![hasNo
133f0 46 6c 61 67 73 20 66 6c 61 67 73 20 66 61 6c 73  Flags flags fals
13400 65 5d 20 3f 20 5c 0d 0a 20 20 20 20 20 20 20 20  e] ? \..        
13410 20 20 20 20 20 20 5b 61 70 70 65 6e 64 41 72 67        [appendArg
13420 73 20 5c 22 20 24 66 6c 61 67 73 20 5c 22 5d 20  s \" $flags \"] 
13430 3a 20 22 3c 6e 6f 6e 65 3e 22 7d 5d 20 5c 6e 5d  : "<none>"}] \n]
13440 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
13450 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
13460 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53  .      # NOTE: S
13470 68 6f 77 20 28 61 6e 64 20 6c 6f 67 29 20 74 68  how (and log) th
13480 65 20 73 68 61 72 65 64 20 63 6f 6e 6e 65 63 74  e shared connect
13490 69 6f 6e 20 66 6c 61 67 73 2e 0d 0a 20 20 20 20  ion flags...    
134a0 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 21    #..      if {!
134b0 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
134c0 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
134d0 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
134e0 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 53 79  object invoke Sy
134f0 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
13500 2e 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f  .SQLiteConnectio
13510 6e 20 53 68 61 72 65 64 46 6c 61 67 73 0d 0a 20  n SharedFlags.. 
13520 20 20 20 20 20 20 20 7d 20 73 68 61 72 65 64 46         } sharedF
13530 6c 61 67 73 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  lags] == 0} then
13540 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   {..          if
13550 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
13560 3a 3a 6e 6f 28 65 6d 69 74 53 68 61 72 65 64 46  ::no(emitSharedF
13570 6c 61 67 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20  lags)] && \..   
13580 20 20 20 20 20 20 20 20 20 20 20 28 21 5b 69 6e             (![in
13590 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 65  fo exists ::no(e
135a0 6d 69 74 53 68 61 72 65 64 46 6c 61 67 73 49 66  mitSharedFlagsIf
135b0 4e 6f 6e 65 29 5d 20 7c 7c 20 5c 0d 0a 20 20 20  None)] || \..   
135c0 20 20 20 20 20 20 20 20 20 20 20 20 21 5b 68 61              ![ha
135d0 73 4e 6f 46 6c 61 67 73 20 73 68 61 72 65 64 46  sNoFlags sharedF
135e0 6c 61 67 73 20 74 72 75 65 5d 29 7d 20 74 68 65  lags true])} the
135f0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
13600 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
13610 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
13620 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
13630 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 68 61 72        "---- shar
13640 65 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c  ed connection fl
13650 61 67 73 20 66 6f 72 20 22 20 24 64 61 74 61 62  ags for " $datab
13660 61 73 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ase \..         
13670 20 20 20 20 20 20 20 22 20 61 72 65 3a 20 22 20         " are: " 
13680 5b 65 78 70 72 20 7b 21 5b 68 61 73 4e 6f 46 6c  [expr {![hasNoFl
13690 61 67 73 20 73 68 61 72 65 64 46 6c 61 67 73 20  ags sharedFlags 
136a0 74 72 75 65 5d 20 3f 20 5c 0d 0a 20 20 20 20 20  true] ? \..     
136b0 20 20 20 20 20 20 20 20 20 20 20 5b 61 70 70 65             [appe
136c0 6e 64 41 72 67 73 20 5c 22 20 24 73 68 61 72 65  ndArgs \" $share
136d0 64 46 6c 61 67 73 20 5c 22 5d 20 3a 20 22 3c 6e  dFlags \"] : "<n
136e0 6f 6e 65 3e 22 7d 5d 20 5c 6e 5d 0d 0a 20 20 20  one>"}] \n]..   
136f0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
13700 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
13710 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
13720 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 65 6d 69   exists ::no(emi
13730 74 53 68 61 72 65 64 46 6c 61 67 73 29 5d 20 26  tSharedFlags)] &
13740 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  & \..           
13750 20 20 20 21 5b 69 6e 66 6f 20 65 78 69 73 74 73     ![info exists
13760 20 3a 3a 6e 6f 28 65 6d 69 74 53 68 61 72 65 64   ::no(emitShared
13770 46 6c 61 67 73 49 66 55 6e 61 76 61 69 6c 61 62  FlagsIfUnavailab
13780 6c 65 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  le)]} then {..  
13790 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
137a0 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
137b0 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
137c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
137d0 2d 2d 2d 2d 20 73 68 61 72 65 64 20 63 6f 6e 6e  ---- shared conn
137e0 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 66 6f 72  ection flags for
137f0 20 22 20 24 64 61 74 61 62 61 73 65 20 5c 0d 0a   " $database \..
13800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13810 22 20 61 72 65 3a 20 3c 75 6e 61 76 61 69 6c 61  " are: <unavaila
13820 62 6c 65 3e 5c 6e 22 5d 0d 0a 20 20 20 20 20 20  ble>\n"]..      
13830 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
13840 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
13850 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
13860 54 45 3a 20 53 68 6f 77 20 28 61 6e 64 20 6c 6f  TE: Show (and lo
13870 67 29 20 74 68 65 20 64 65 74 65 63 74 65 64 20  g) the detected 
13880 67 6c 6f 62 61 6c 20 63 6f 6e 6e 65 63 74 69 6f  global connectio
13890 6e 20 66 6c 61 67 73 2c 20 69 66 20 61 6e 79 2e  n flags, if any.
138a0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
138b0 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
138c0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66  en {..        if
138d0 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
138e0 3a 3a 6e 6f 28 65 6d 69 74 47 6c 6f 62 61 6c 46  ::no(emitGlobalF
138f0 6c 61 67 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20  lags)] && \..   
13900 20 20 20 20 20 20 20 20 20 28 21 5b 69 6e 66 6f           (![info
13910 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 65 6d 69   exists ::no(emi
13920 74 47 6c 6f 62 61 6c 46 6c 61 67 73 49 66 4e 6f  tGlobalFlagsIfNo
13930 6e 65 29 5d 20 7c 7c 20 5c 0d 0a 20 20 20 20 20  ne)] || \..     
13940 20 20 20 20 20 20 20 20 21 5b 68 61 73 4e 6f 46          ![hasNoF
13950 6c 61 67 73 20 3a 3a 63 6f 6e 6e 65 63 74 69 6f  lags ::connectio
13960 6e 5f 66 6c 61 67 73 20 66 61 6c 73 65 5d 29 7d  n_flags false])}
13970 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
13980 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
13990 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
139a0 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
139b0 20 20 20 20 20 20 22 2d 2d 2d 2d 20 67 6c 6f 62        "---- glob
139c0 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c  al connection fl
139d0 61 67 73 20 61 72 65 3a 20 22 20 5c 0d 0a 20 20  ags are: " \..  
139e0 20 20 20 20 20 20 20 20 20 20 20 20 5b 65 78 70              [exp
139f0 72 20 7b 21 5b 68 61 73 4e 6f 46 6c 61 67 73 20  r {![hasNoFlags 
13a00 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e 5f 66 6c 61  ::connection_fla
13a10 67 73 20 66 61 6c 73 65 5d 20 3f 20 5c 0d 0a 20  gs false] ? \.. 
13a20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 61 70               [ap
13a30 70 65 6e 64 41 72 67 73 20 5c 22 20 24 3a 3a 63  pendArgs \" $::c
13a40 6f 6e 6e 65 63 74 69 6f 6e 5f 66 6c 61 67 73 20  onnection_flags 
13a50 5c 22 5d 20 3a 20 22 3c 6e 6f 6e 65 3e 22 7d 5d  \"] : "<none>"}]
13a60 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d   \n]..        }.
13a70 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
13a80 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
13a90 45 3a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  E: If there are 
13aa0 61 6e 79 20 67 6c 6f 62 61 6c 20 28 70 65 72 20  any global (per 
13ab0 74 65 73 74 20 72 75 6e 29 20 63 6f 6e 6e 65 63  test run) connec
13ac0 74 69 6f 6e 20 66 6c 61 67 73 20 63 75 72 72 65  tion flags curre
13ad0 6e 74 6c 79 0d 0a 20 20 20 20 20 20 23 20 20 20  ntly..      #   
13ae0 20 20 20 20 73 65 74 2c 20 75 73 65 20 74 68 65      set, use the
13af0 6d 20 6e 6f 77 20 28 69 2e 65 2e 20 62 79 20 63  m now (i.e. by c
13b00 6f 6d 62 69 6e 69 6e 67 20 74 68 65 6d 20 77 69  ombining them wi
13b10 74 68 20 74 68 65 20 6f 6e 65 73 20 66 6f 72 20  th the ones for 
13b20 74 68 69 73 0d 0a 20 20 20 20 20 20 23 20 20 20  this..      #   
13b30 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 29 2e      connection).
13b40 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
13b50 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
13b60 73 20 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e 5f 66  s ::connection_f
13b70 6c 61 67 73 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  lags]} then {.. 
13b80 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
13b90 20 20 23 20 4e 4f 54 45 3a 20 43 6f 6d 62 69 6e    # NOTE: Combin
13ba0 65 20 61 6e 64 2f 6f 72 20 72 65 70 6c 61 63 65  e and/or replace
13bb0 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
13bc0 66 6c 61 67 73 20 61 6e 64 20 74 68 65 6e 20 73  flags and then s
13bd0 68 6f 77 20 74 68 65 0d 0a 20 20 20 20 20 20 20  how the..       
13be0 20 23 20 20 20 20 20 20 20 6e 65 77 20 76 61 6c   #       new val
13bf0 75 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ue...        #..
13c00 20 20 20 20 20 20 20 20 73 65 74 20 66 6c 61 67          set flag
13c10 73 20 5b 63 6f 6d 62 69 6e 65 46 6c 61 67 73 20  s [combineFlags 
13c20 24 66 6c 61 67 73 20 24 3a 3a 63 6f 6e 6e 65 63  $flags $::connec
13c30 74 69 6f 6e 5f 66 6c 61 67 73 5d 0d 0a 0d 0a 20  tion_flags].... 
13c40 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
13c50 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20 28    # NOTE: Show (
13c60 61 6e 64 20 6c 6f 67 29 20 74 68 65 20 6e 65 77  and log) the new
13c70 20 65 66 66 65 63 74 69 76 65 20 63 6f 6e 6e 65   effective conne
13c80 63 74 69 6f 6e 20 66 6c 61 67 73 2e 0d 0a 20 20  ction flags...  
13c90 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
13ca0 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
13cb0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
13cc0 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
13cd0 73 20 3a 3a 6e 6f 28 65 6d 69 74 43 6f 6d 62 69  s ::no(emitCombi
13ce0 6e 65 64 46 6c 61 67 73 29 5d 20 26 26 20 5c 0d  nedFlags)] && \.
13cf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  .              (
13d00 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
13d10 6e 6f 28 65 6d 69 74 43 6f 6d 62 69 6e 65 64 46  no(emitCombinedF
13d20 6c 61 67 73 49 66 4e 6f 6e 65 29 5d 20 7c 7c 20  lagsIfNone)] || 
13d30 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
13d40 20 20 21 5b 68 61 73 4e 6f 46 6c 61 67 73 20 66    ![hasNoFlags f
13d50 6c 61 67 73 20 66 61 6c 73 65 5d 29 7d 20 74 68  lags false])} th
13d60 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
13d70 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
13d80 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
13d90 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
13da0 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 6d         "---- com
13db0 62 69 6e 65 64 20 63 6f 6e 6e 65 63 74 69 6f 6e  bined connection
13dc0 20 66 6c 61 67 73 20 66 6f 72 20 22 20 24 64 61   flags for " $da
13dd0 74 61 62 61 73 65 20 5c 0d 0a 20 20 20 20 20 20  tabase \..      
13de0 20 20 20 20 20 20 20 20 20 20 22 20 61 72 65 3a            " are:
13df0 20 22 20 5b 65 78 70 72 20 7b 21 5b 68 61 73 4e   " [expr {![hasN
13e00 6f 46 6c 61 67 73 20 66 6c 61 67 73 20 66 61 6c  oFlags flags fal
13e10 73 65 5d 20 3f 20 5c 0d 0a 20 20 20 20 20 20 20  se] ? \..       
13e20 20 20 20 20 20 20 20 20 20 5b 61 70 70 65 6e 64           [append
13e30 41 72 67 73 20 5c 22 20 24 66 6c 61 67 73 20 5c  Args \" $flags \
13e40 22 5d 20 3a 20 22 3c 6e 6f 6e 65 3e 22 7d 5d 20  "] : "<none>"}] 
13e50 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  \n]..          }
13e60 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
13e70 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65     }....      re
13e80 74 75 72 6e 20 24 66 6c 61 67 73 0d 0a 20 20 20  turn $flags..   
13e90 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
13ea0 67 65 74 46 6c 61 67 73 50 72 6f 70 65 72 74 79  getFlagsProperty
13eb0 20 7b 20 7b 66 6c 61 67 73 20 22 22 7d 20 7b 71   { {flags ""} {q
13ec0 75 69 65 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d  uiet false} } {.
13ed0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
13ee0 23 20 4e 4f 54 45 3a 20 44 65 74 65 72 6d 69 6e  # NOTE: Determin
13ef0 65 20 77 68 61 74 20 74 68 65 20 63 6f 6d 62 69  e what the combi
13f00 6e 65 64 20 28 67 6c 6f 62 61 6c 20 61 6e 64 20  ned (global and 
13f10 6c 6f 63 61 6c 29 20 63 6f 6e 6e 65 63 74 69 6f  local) connectio
13f20 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  n..      #      
13f30 20 66 6c 61 67 73 20 73 68 6f 75 6c 64 20 62 65   flags should be
13f40 2c 20 70 6f 73 73 69 62 6c 79 20 71 75 69 65 74  , possibly quiet
13f50 6c 79 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ly...      #..  
13f60 20 20 20 20 73 65 74 20 66 6c 61 67 73 20 5b 67      set flags [g
13f70 65 74 43 6f 6e 6e 65 63 74 69 6f 6e 46 6c 61 67  etConnectionFlag
13f80 73 20 22 22 20 24 66 6c 61 67 73 20 24 71 75 69  s "" $flags $qui
13f90 65 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a  et]....      #..
13fa0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66        # NOTE: If
13fb0 20 6e 6f 20 67 6c 6f 62 61 6c 20 6f 72 20 6c 6f   no global or lo
13fc0 63 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66  cal connection f
13fd0 6c 61 67 73 20 77 65 72 65 20 73 70 65 63 69 66  lags were specif
13fe0 69 65 64 2c 20 74 68 65 0d 0a 20 20 20 20 20 20  ied, the..      
13ff0 23 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 20  #       default 
14000 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73  connection flags
14010 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 3b   should be used;
14020 20 74 68 65 72 65 66 6f 72 65 2c 20 72 65 74 75   therefore, retu
14030 72 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  rn..      #     
14040 20 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e    an empty strin
14050 67 20 69 6e 20 74 68 61 74 20 63 61 73 65 2e 0d  g in that case..
14060 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
14070 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
14080 74 68 20 24 66 6c 61 67 73 5d 20 3d 3d 20 30 7d  th $flags] == 0}
14090 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
140a0 20 72 65 74 75 72 6e 20 22 22 0d 0a 20 20 20 20   return ""..    
140b0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
140c0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 6e        # NOTE: In
140d0 20 6f 72 64 65 72 20 74 6f 20 63 68 65 63 6b 20   order to check 
140e0 69 66 20 74 68 65 20 64 65 66 61 75 6c 74 20 63  if the default c
140f0 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 20  onnection flags 
14100 61 72 65 20 62 65 69 6e 67 20 75 73 65 64 0d 0a  are being used..
14110 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69 74        #       it
14120 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f   is necessary to
14130 20 61 74 74 65 6d 70 74 20 61 20 63 6f 6e 76 65   attempt a conve
14140 72 73 69 6f 6e 20 74 6f 20 74 68 65 20 61 63 74  rsion to the act
14150 75 61 6c 20 65 6e 75 6d 65 72 61 74 65 64 0d 0a  ual enumerated..
14160 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 79        #       ty
14170 70 65 2e 20 20 46 61 69 6c 69 6e 67 20 74 68 61  pe.  Failing tha
14180 74 2c 20 74 68 65 20 63 68 65 63 6b 20 61 67 61  t, the check aga
14190 69 6e 73 74 20 74 68 65 20 64 65 66 61 75 6c 74  inst the default
141a0 20 76 61 6c 75 65 20 77 69 6c 6c 20 62 65 0d 0a   value will be..
141b0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73 6b        #       sk
141c0 69 70 70 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d  ipped...      #.
141d0 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63  .      if {[catc
141e0 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74  h {..        set
141f0 20 65 72 72 6f 72 20 6e 75 6c 6c 3b 20 23 20 49   error null; # I
14200 47 4e 4f 52 45 44 0d 0a 0d 0a 20 20 20 20 20 20  GNORED....      
14210 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20    object invoke 
14220 55 74 69 6c 69 74 79 20 54 72 79 50 61 72 73 65  Utility TryParse
14230 46 6c 61 67 73 45 6e 75 6d 20 22 22 20 5c 0d 0a  FlagsEnum "" \..
14240 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74              Syst
14250 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53  em.Data.SQLite.S
14260 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 46  QLiteConnectionF
14270 6c 61 67 73 20 22 22 20 24 66 6c 61 67 73 20 6e  lags "" $flags n
14280 75 6c 6c 20 74 72 75 65 20 5c 0d 0a 20 20 20 20  ull true \..    
14290 20 20 20 20 20 20 20 20 74 72 75 65 20 74 72 75          true tru
142a0 65 20 65 72 72 6f 72 0d 0a 20 20 20 20 20 20 7d  e error..      }
142b0 20 76 61 6c 75 65 5d 7d 20 74 68 65 6e 20 7b 0d   value]} then {.
142c0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
142d0 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65      # NOTE: Atte
142e0 6d 70 74 69 6e 67 20 74 6f 20 70 61 72 73 65 20  mpting to parse 
142f0 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66  the connection f
14300 6c 61 67 73 20 63 61 75 73 65 64 20 61 20 73 63  lags caused a sc
14310 72 69 70 74 0d 0a 20 20 20 20 20 20 20 20 23 20  ript..        # 
14320 20 20 20 20 20 20 65 72 72 6f 72 2e 20 20 45 6d        error.  Em
14330 69 74 20 61 20 77 61 72 6e 69 6e 67 20 74 6f 20  it a warning to 
14340 74 68 65 20 74 65 73 74 20 6c 6f 67 20 66 69 6c  the test log fil
14350 65 20 61 6e 64 20 63 6f 6e 74 69 6e 75 65 0d 0a  e and continue..
14360 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
14370 75 73 69 6e 67 20 61 6e 20 65 6d 74 70 79 20 73  using an emtpy s
14380 74 72 69 6e 67 20 69 6e 73 74 65 61 64 2e 0d 0a  tring instead...
14390 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
143a0 20 20 20 74 6c 6f 67 20 5b 61 70 70 65 6e 64 41     tlog [appendA
143b0 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
143c0 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47     "==== WARNING
143d0 3a 20 66 61 69 6c 65 64 20 74 6f 20 70 61 72 73  : failed to pars
143e0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61  e connection fla
143f0 67 73 2c 20 65 72 72 6f 72 3a 20 22 20 5c 0d 0a  gs, error: " \..
14400 20 20 20 20 20 20 20 20 20 20 20 20 5c 6e 5c 74              \n\t
14410 20 24 76 61 6c 75 65 20 5c 6e 5d 0d 0a 0d 0a 20   $value \n].... 
14420 20 20 20 20 20 20 20 73 65 74 20 76 61 6c 75 65         set value
14430 20 22 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a   ""..      }....
14440 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
14450 20 4e 4f 54 45 3a 20 49 66 20 74 68 65 20 63 6f   NOTE: If the co
14460 6d 62 69 6e 65 64 20 66 6c 61 67 73 20 73 74 72  mbined flags str
14470 69 6e 67 20 63 6f 75 6c 64 20 6e 6f 74 20 61 63  ing could not ac
14480 74 75 61 6c 6c 79 20 62 65 20 63 6f 6e 76 65 72  tually be conver
14490 74 65 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ted..      #    
144a0 20 20 20 74 6f 20 74 68 65 20 65 6e 75 6d 65 72     to the enumer
144b0 61 74 65 64 20 74 79 70 65 20 69 74 20 69 73 20  ated type it is 
144c0 74 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75  the default valu
144d0 65 2c 20 74 68 65 6e 20 6a 75 73 74 20 75 73 65  e, then just use
144e0 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
144f0 69 74 20 76 65 72 62 61 74 69 6d 3b 20 6f 74 68  it verbatim; oth
14500 65 72 77 69 73 65 2c 20 6a 75 73 74 20 72 65 74  erwise, just ret
14510 75 72 6e 20 61 6e 20 65 6d 70 74 79 20 73 74 72  urn an empty str
14520 69 6e 67 2e 20 20 49 6e 20 74 68 61 74 0d 0a 20  ing.  In that.. 
14530 20 20 20 20 20 23 20 20 20 20 20 20 20 63 61 73       #       cas
14540 65 2c 20 74 68 65 20 64 65 66 61 75 6c 74 20 63  e, the default c
14550 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 20  onnection flags 
14560 77 69 6c 6c 20 62 65 20 75 73 65 64 2e 0d 0a 20  will be used... 
14570 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
14580 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   {[string length
14590 20 24 76 61 6c 75 65 5d 20 3d 3d 20 30 20 7c 7c   $value] == 0 ||
145a0 20 24 76 61 6c 75 65 20 6e 65 20 22 44 65 66 61   $value ne "Defa
145b0 75 6c 74 22 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ult"} then {..  
145c0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
145d0 20 23 20 57 41 52 4e 49 4e 47 3a 20 54 68 69 73   # WARNING: This
145e0 20 72 65 74 75 72 6e 73 20 74 68 65 20 73 74 72   returns the str
145f0 69 6e 67 20 76 61 6c 75 65 20 6f 66 20 74 68 65  ing value of the
14600 20 63 6f 6d 62 69 6e 65 64 20 66 6c 61 67 73 2c   combined flags,
14610 20 6e 6f 74 0d 0a 20 20 20 20 20 20 20 20 23 20   not..        # 
14620 20 20 20 20 20 20 20 20 20 74 68 65 20 65 6e 75           the enu
14630 6d 65 72 61 74 65 64 20 76 61 6c 75 65 2e 20 20  merated value.  
14640 54 68 69 73 20 69 73 20 62 79 20 64 65 73 69 67  This is by desig
14650 6e 20 61 6e 64 20 73 68 6f 75 6c 64 20 6e 6f 74  n and should not
14660 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
14670 20 20 20 20 20 62 65 20 63 68 61 6e 67 65 64 20       be changed 
14680 77 69 74 68 6f 75 74 20 63 61 72 65 66 75 6c 20  without careful 
14690 63 6f 6e 73 69 64 65 72 61 74 69 6f 6e 20 28 65  consideration (e
146a0 2e 67 2e 20 69 74 20 77 6f 75 6c 64 0d 0a 20 20  .g. it would..  
146b0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20        #         
146c0 20 70 72 65 76 65 6e 74 20 74 68 65 20 53 51 4c   prevent the SQL
146d0 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 63 6c  iteConnection cl
146e0 61 73 73 20 66 72 6f 6d 20 61 6c 6c 6f 77 69 6e  ass from allowin
146f0 67 20 69 6e 76 61 6c 69 64 0d 0a 20 20 20 20 20  g invalid..     
14700 20 20 20 23 20 20 20 20 20 20 20 20 20 20 5b 22     #          ["
14710 6d 61 67 69 63 61 6c 22 5d 20 6d 65 74 61 2d 66  magical"] meta-f
14720 6c 61 67 73 29 2e 0d 0a 20 20 20 20 20 20 20 20  lags)...        
14730 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  #..        retur
14740 6e 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 46  n [appendArgs "F
14750 6c 61 67 73 3d 22 20 24 66 6c 61 67 73 20 5c 3b  lags=" $flags \;
14760 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  ]..      }....  
14770 20 20 20 20 72 65 74 75 72 6e 20 22 22 0d 0a 20      return "".. 
14780 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
14790 63 20 65 6e 61 62 6c 65 53 68 61 72 65 64 43 61  c enableSharedCa
147a0 63 68 65 20 7b 20 63 68 61 6e 6e 65 6c 20 65 6e  che { channel en
147b0 61 62 6c 65 20 7b 71 75 69 65 74 20 66 61 6c 73  able {quiet fals
147c0 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66  e} } {..      if
147d0 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
147e0 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b      object invok
147f0 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62  e -flags +NonPub
14800 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  lic \..         
14810 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53     System.Data.S
14820 51 4c 69 74 65 2e 55 6e 73 61 66 65 4e 61 74 69  QLite.UnsafeNati
14830 76 65 4d 65 74 68 6f 64 73 20 5c 0d 0a 20 20 20  veMethods \..   
14840 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
14850 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f 63  _enable_shared_c
14860 61 63 68 65 20 5b 65 78 70 72 20 69 6e 74 28 24  ache [expr int($
14870 65 6e 61 62 6c 65 29 5d 0d 0a 20 20 20 20 20 20  enable)]..      
14880 7d 20 72 65 73 75 6c 74 5d 20 3d 3d 20 30 7d 20  } result] == 0} 
14890 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
148a0 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
148b0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74  n {..          t
148c0 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
148d0 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
148e0 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
148f0 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f 65 6e   call sqlite3_en
14900 61 62 6c 65 5f 73 68 61 72 65 64 5f 63 61 63 68  able_shared_cach
14910 65 28 22 20 24 65 6e 61 62 6c 65 20 5c 0d 0a 20  e(" $enable \.. 
14920 20 20 20 20 20 20 20 20 20 20 20 20 20 22 29 2e               ").
14930 2e 2e 20 6f 6b 3a 20 22 20 24 72 65 73 75 6c 74  .. ok: " $result
14940 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d   \n]..        }.
14950 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
14960 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71  .        if {!$q
14970 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
14980 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
14990 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
149a0 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
149b0 20 20 20 20 22 2d 2d 2d 2d 20 63 61 6c 6c 20 73      "---- call s
149c0 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 73 68  qlite3_enable_sh
149d0 61 72 65 64 5f 63 61 63 68 65 28 22 20 24 65 6e  ared_cache(" $en
149e0 61 62 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  able \..        
149f0 20 20 20 20 20 20 22 29 2e 2e 2e 20 65 72 72 6f        ")... erro
14a00 72 3a 20 22 20 5c 6e 5c 74 20 24 72 65 73 75 6c  r: " \n\t $resul
14a10 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d  t \n]..        }
14a20 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
14a30 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 73 65  .....    proc se
14a40 74 75 70 44 62 20 7b 0d 0a 20 20 20 20 20 20 20  tupDb {..       
14a50 20 20 20 20 20 66 69 6c 65 4e 61 6d 65 20 7b 6d       fileName {m
14a60 6f 64 65 20 22 22 7d 20 7b 64 61 74 65 54 69 6d  ode ""} {dateTim
14a70 65 46 6f 72 6d 61 74 20 22 22 7d 20 7b 64 61 74  eFormat ""} {dat
14a80 65 54 69 6d 65 4b 69 6e 64 20 22 22 7d 20 7b 66  eTimeKind ""} {f
14a90 6c 61 67 73 20 22 22 7d 0d 0a 20 20 20 20 20 20  lags ""}..      
14aa0 20 20 20 20 20 20 7b 65 78 74 72 61 20 22 22 7d        {extra ""}
14ab0 20 7b 71 75 61 6c 69 66 79 20 74 72 75 65 7d 20   {qualify true} 
14ac0 7b 64 65 6c 65 74 65 20 74 72 75 65 7d 20 7b 75  {delete true} {u
14ad0 72 69 20 66 61 6c 73 65 7d 0d 0a 20 20 20 20 20  ri false}..     
14ae0 20 20 20 20 20 20 20 7b 74 65 6d 70 6f 72 61 72         {temporar
14af0 79 20 74 72 75 65 7d 20 7b 76 61 72 4e 61 6d 65  y true} {varName
14b00 20 64 62 7d 20 7b 71 75 69 65 74 20 66 61 6c 73   db} {quiet fals
14b10 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  e} } {..      #.
14b20 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46  .      # NOTE: F
14b30 69 72 73 74 2c 20 73 65 65 20 69 66 20 6f 75 72  irst, see if our
14b40 20 63 61 6c 6c 65 72 20 68 61 73 20 72 65 71 75   caller has requ
14b50 65 73 74 65 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f  ested an in-memo
14b60 72 79 20 64 61 74 61 62 61 73 65 2e 0d 0a 20 20  ry database...  
14b70 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74      #..      set
14b80 20 69 73 4d 65 6d 6f 72 79 20 5b 69 73 4d 65 6d   isMemory [isMem
14b90 6f 72 79 44 62 20 24 66 69 6c 65 4e 61 6d 65 5d  oryDb $fileName]
14ba0 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
14bb0 20 20 20 23 20 4e 4f 54 45 3a 20 46 6f 72 20 6e     # NOTE: For n
14bc0 6f 77 2c 20 61 6c 6c 20 74 65 73 74 20 64 61 74  ow, all test dat
14bd0 61 62 61 73 65 73 20 75 73 65 64 20 62 79 20 74  abases used by t
14be0 68 65 20 74 65 73 74 20 73 75 69 74 65 20 61 72  he test suite ar
14bf0 65 20 70 6c 61 63 65 64 0d 0a 20 20 20 20 20 20  e placed..      
14c00 23 20 20 20 20 20 20 20 69 6e 74 6f 20 74 68 65  #       into the
14c10 20 64 61 74 61 62 61 73 65 20 64 69 72 65 63 74   database direct
14c20 6f 72 79 2e 20 20 45 61 63 68 20 64 61 74 61 62  ory.  Each datab
14c30 61 73 65 20 61 6e 64 20 72 65 6c 61 74 65 64 20  ase and related 
14c40 66 69 6c 65 73 0d 0a 20 20 20 20 20 20 23 20 20  files..      #  
14c50 20 20 20 20 20 75 73 65 64 20 62 79 20 61 20 74       used by a t
14c60 65 73 74 20 73 68 6f 75 6c 64 20 62 65 20 63 6c  est should be cl
14c70 65 61 6e 65 64 20 75 70 20 62 79 20 74 68 61 74  eaned up by that
14c80 20 74 65 73 74 20 75 73 69 6e 67 20 74 68 65 0d   test using the.
14c90 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 22  .      #       "
14ca0 63 6c 65 61 6e 75 70 44 62 22 20 70 72 6f 63 65  cleanupDb" proce
14cb0 64 75 72 65 2c 20 62 65 6c 6f 77 2e 0d 0a 20 20  dure, below...  
14cc0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
14cd0 7b 21 24 69 73 4d 65 6d 6f 72 79 20 26 26 20 24  {!$isMemory && $
14ce0 71 75 61 6c 69 66 79 7d 20 74 68 65 6e 20 7b 0d  qualify} then {.
14cf0 0a 20 20 20 20 20 20 20 20 73 65 74 20 66 69 6c  .        set fil
14d00 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e  eName [file join
14d10 20 5b 67 65 74 44 61 74 61 62 61 73 65 44 69 72   [getDatabaseDir
14d20 65 63 74 6f 72 79 5d 20 5b 66 69 6c 65 20 74 61  ectory] [file ta
14d30 69 6c 20 24 66 69 6c 65 4e 61 6d 65 5d 5d 0d 0a  il $fileName]]..
14d40 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
14d50 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
14d60 3a 20 42 79 20 64 65 66 61 75 6c 74 2c 20 64 65  : By default, de
14d70 6c 65 74 65 20 61 6e 79 20 70 72 65 2d 65 78 69  lete any pre-exi
14d80 73 74 69 6e 67 20 64 61 74 61 62 61 73 65 20 77  sting database w
14d90 69 74 68 20 74 68 65 20 73 61 6d 65 20 66 69 6c  ith the same fil
14da0 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
14db0 20 6e 61 6d 65 20 69 66 20 69 74 20 63 75 72 72   name if it curr
14dc0 65 6e 74 6c 79 20 65 78 69 73 74 73 2e 0d 0a 20  ently exists... 
14dd0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
14de0 20 7b 21 24 69 73 4d 65 6d 6f 72 79 20 26 26 20   {!$isMemory && 
14df0 24 64 65 6c 65 74 65 20 26 26 20 5b 66 69 6c 65  $delete && [file
14e00 20 65 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d   exists $fileNam
14e10 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  e]} then {..    
14e20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
14e30 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74   NOTE: Attempt t
14e40 6f 20 64 65 6c 65 74 65 20 61 6e 79 20 70 72 65  o delete any pre
14e50 2d 65 78 69 73 74 69 6e 67 20 64 61 74 61 62 61  -existing databa
14e60 73 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  se with the same
14e70 20 66 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 23   file..        #
14e80 20 20 20 20 20 20 20 6e 61 6d 65 2e 0d 0a 20 20         name...  
14e90 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
14ea0 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 66 69 6c   if {[catch {fil
14eb0 65 20 64 65 6c 65 74 65 20 24 66 69 6c 65 4e 61  e delete $fileNa
14ec0 6d 65 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e  me} error]} then
14ed0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d   {..          #.
14ee0 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
14ef0 45 3a 20 57 65 20 73 6f 6d 65 68 6f 77 20 66 61  E: We somehow fa
14f00 69 6c 65 64 20 74 6f 20 64 65 6c 65 74 65 20 74  iled to delete t
14f10 68 65 20 66 69 6c 65 2c 20 72 65 70 6f 72 74 20  he file, report 
14f20 77 68 79 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  why...          
14f30 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  #..          if 
14f40 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
14f50 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
14f60 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
14f70 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
14f80 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
14f90 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47     "==== WARNING
14fa0 3a 20 66 61 69 6c 65 64 20 74 6f 20 64 65 6c 65  : failed to dele
14fb0 74 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  te database file
14fc0 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c   \"" $fileName \
14fd0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
14fe0 20 20 22 5c 22 20 64 75 72 69 6e 67 20 73 65 74    "\" during set
14ff0 75 70 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c  up, error: " \n\
15000 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20  t $error \n]..  
15010 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
15020 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d     }..      }...
15030 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
15040 23 20 4e 4f 54 45 3a 20 52 65 66 65 72 20 74 6f  # NOTE: Refer to
15050 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 76   the specified v
15060 61 72 69 61 62 6c 65 20 28 65 2e 67 2e 20 22 64  ariable (e.g. "d
15070 62 22 29 20 69 6e 20 74 68 65 20 63 6f 6e 74 65  b") in the conte
15080 78 74 20 6f 66 20 6f 75 72 0d 0a 20 20 20 20 20  xt of our..     
15090 20 23 20 20 20 20 20 20 20 63 61 6c 6c 65 72 2e   #       caller.
150a0 20 20 54 68 65 20 68 61 6e 64 6c 65 20 74 6f 20    The handle to 
150b0 74 68 65 20 6f 70 65 6e 65 64 20 64 61 74 61 62  the opened datab
150c0 61 73 65 20 77 69 6c 6c 20 62 65 20 73 74 6f 72  ase will be stor
150d0 65 64 20 74 68 65 72 65 2e 0d 0a 20 20 20 20 20  ed there...     
150e0 20 23 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20   #..      upvar 
150f0 31 20 24 76 61 72 4e 61 6d 65 20 64 62 0d 0a 0d  1 $varName db...
15100 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
15110 23 20 4e 4f 54 45 3a 20 53 74 61 72 74 20 62 75  # NOTE: Start bu
15120 69 6c 64 69 6e 67 20 74 68 65 20 63 6f 6e 6e 65  ilding the conne
15130 63 74 69 6f 6e 20 73 74 72 69 6e 67 2e 20 20 54  ction string.  T
15140 68 65 20 6f 6e 6c 79 20 72 65 71 75 69 72 65 64  he only required
15150 20 70 6f 72 74 69 6f 6e 0d 0a 20 20 20 20 20 20   portion..      
15160 23 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 63  #       of the c
15170 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e 67  onnection string
15180 20 69 73 20 74 68 65 20 64 61 74 61 20 73 6f 75   is the data sou
15190 72 63 65 2c 20 77 68 69 63 68 20 63 6f 6e 74 61  rce, which conta
151a0 69 6e 73 20 74 68 65 0d 0a 20 20 20 20 20 20 23  ins the..      #
151b0 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20         database 
151c0 66 69 6c 65 20 6e 61 6d 65 20 69 74 73 65 6c 66  file name itself
151d0 2e 20 20 49 66 20 6f 75 72 20 63 61 6c 6c 65 72  .  If our caller
151e0 20 77 61 6e 74 73 20 74 6f 20 75 73 65 20 61 20   wants to use a 
151f0 55 52 49 20 61 73 0d 0a 20 20 20 20 20 20 23 20  URI as..      # 
15200 20 20 20 20 20 20 74 68 65 20 64 61 74 61 20 73        the data s
15210 6f 75 72 63 65 2c 20 75 73 65 20 74 68 65 20 46  ource, use the F
15220 75 6c 6c 55 72 69 20 63 6f 6e 6e 65 63 74 69 6f  ullUri connectio
15230 6e 20 73 74 72 69 6e 67 20 70 72 6f 70 65 72 74  n string propert
15240 79 20 74 6f 0d 0a 20 20 20 20 20 20 23 20 20 20  y to..      #   
15250 20 20 20 20 70 72 65 76 65 6e 74 20 74 68 65 20      prevent the 
15260 64 61 74 61 20 73 6f 75 72 63 65 20 73 74 72 69  data source stri
15270 6e 67 20 66 72 6f 6d 20 62 65 69 6e 67 20 6d 61  ng from being ma
15280 6e 67 6c 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d  ngled...      #.
15290 0a 20 20 20 20 20 20 69 66 20 7b 24 75 72 69 7d  .      if {$uri}
152a0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
152b0 20 73 65 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   set connection 
152c0 7b 46 75 6c 6c 55 72 69 3d 24 7b 66 69 6c 65 4e  {FullUri=${fileN
152d0 61 6d 65 7d 7d 0d 0a 20 20 20 20 20 20 7d 20 65  ame}}..      } e
152e0 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 73  lse {..        s
152f0 65 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 44  et connection {D
15300 61 74 61 20 53 6f 75 72 63 65 3d 24 7b 66 69 6c  ata Source=${fil
15310 65 4e 61 6d 65 7d 7d 0d 0a 20 20 20 20 20 20 7d  eName}}..      }
15320 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
15330 20 20 20 23 20 4e 4f 54 45 3a 20 53 69 6e 63 65     # NOTE: Since
15340 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 20   this procedure 
15350 68 61 73 20 6e 6f 20 73 70 65 63 69 61 6c 20 6b  has no special k
15360 6e 6f 77 6c 65 64 67 65 20 6f 66 20 77 68 61 74  nowledge of what
15370 20 74 68 65 20 64 65 66 61 75 6c 74 0d 0a 20 20   the default..  
15380 20 20 20 20 23 20 20 20 20 20 20 20 73 65 74 74      #       sett
15390 69 6e 67 20 69 73 20 66 6f 72 20 74 68 65 20 54  ing is for the T
153a0 6f 46 75 6c 6c 50 61 74 68 20 63 6f 6e 6e 65 63  oFullPath connec
153b0 74 69 6f 6e 20 73 74 72 69 6e 67 20 70 72 6f 70  tion string prop
153c0 65 72 79 2c 20 61 6c 77 61 79 73 0d 0a 20 20 20  ery, always..   
153d0 20 20 20 23 20 20 20 20 20 20 20 61 64 64 20 74     #       add t
153e0 68 65 20 76 61 6c 75 65 20 77 65 20 6b 6e 6f 77  he value we know
153f0 20 61 62 6f 75 74 20 74 6f 20 74 68 65 20 63 6f   about to the co
15400 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e 67 2e  nnection string.
15410 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
15420 20 61 70 70 65 6e 64 20 63 6f 6e 6e 65 63 74 69   append connecti
15430 6f 6e 20 7b 3b 54 6f 46 75 6c 6c 50 61 74 68 3d  on {;ToFullPath=
15440 24 7b 71 75 61 6c 69 66 79 7d 7d 0d 0a 0d 0a 20  ${qualify}}.... 
15450 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
15460 4e 4f 54 45 3a 20 49 66 20 6f 75 72 20 63 61 6c  NOTE: If our cal
15470 6c 65 72 20 73 70 65 63 69 66 69 65 64 20 61 20  ler specified a 
15480 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2c 20 61 64  journal mode, ad
15490 64 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20  d the necessary 
154a0 70 6f 72 74 69 6f 6e 0d 0a 20 20 20 20 20 20 23  portion..      #
154b0 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f         of the co
154c0 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e 67 20  nnection string 
154d0 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  now...      #.. 
154e0 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
154f0 20 6c 65 6e 67 74 68 20 24 6d 6f 64 65 5d 20 3e   length $mode] >
15500 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
15510 20 20 20 20 61 70 70 65 6e 64 20 63 6f 6e 6e 65      append conne
15520 63 74 69 6f 6e 20 7b 3b 4a 6f 75 72 6e 61 6c 20  ction {;Journal 
15530 4d 6f 64 65 3d 24 7b 6d 6f 64 65 7d 7d 0d 0a 20  Mode=${mode}}.. 
15540 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
15550 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
15560 20 49 66 20 6f 75 72 20 63 61 6c 6c 65 72 20 73   If our caller s
15570 70 65 63 69 66 69 65 64 20 61 20 44 61 74 65 54  pecified a DateT
15580 69 6d 65 20 66 6f 72 6d 61 74 2c 20 61 64 64 20  ime format, add 
15590 74 68 65 20 6e 65 63 65 73 73 61 72 79 0d 0a 20  the necessary.. 
155a0 20 20 20 20 20 23 20 20 20 20 20 20 20 70 6f 72       #       por
155b0 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6e 6e  tion of the conn
155c0 65 63 74 69 6f 6e 20 73 74 72 69 6e 67 20 6e 6f  ection string no
155d0 77 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  w...      #..   
155e0 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
155f0 65 6e 67 74 68 20 24 64 61 74 65 54 69 6d 65 46  ength $dateTimeF
15600 6f 72 6d 61 74 5d 20 3e 20 30 7d 20 74 68 65 6e  ormat] > 0} then
15610 20 7b 0d 0a 20 20 20 20 20 20 20 20 61 70 70 65   {..        appe
15620 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 3b  nd connection {;
15630 44 61 74 65 54 69 6d 65 46 6f 72 6d 61 74 3d 24  DateTimeFormat=$
15640 7b 64 61 74 65 54 69 6d 65 46 6f 72 6d 61 74 7d  {dateTimeFormat}
15650 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  }..      }....  
15660 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
15670 4f 54 45 3a 20 49 66 20 6f 75 72 20 63 61 6c 6c  OTE: If our call
15680 65 72 20 73 70 65 63 69 66 69 65 64 20 61 20 44  er specified a D
15690 61 74 65 54 69 6d 65 4b 69 6e 64 2c 20 61 64 64  ateTimeKind, add
156a0 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 70   the necessary p
156b0 6f 72 74 69 6f 6e 0d 0a 20 20 20 20 20 20 23 20  ortion..      # 
156c0 20 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6e        of the con
156d0 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e 67 20 6e  nection string n
156e0 6f 77 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ow...      #..  
156f0 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
15700 6c 65 6e 67 74 68 20 24 64 61 74 65 54 69 6d 65  length $dateTime
15710 4b 69 6e 64 5d 20 3e 20 30 7d 20 74 68 65 6e 20  Kind] > 0} then 
15720 7b 0d 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e  {..        appen
15730 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 3b 44  d connection {;D
15740 61 74 65 54 69 6d 65 4b 69 6e 64 3d 24 7b 64 61  ateTimeKind=${da
15750 74 65 54 69 6d 65 4b 69 6e 64 7d 7d 0d 0a 20 20  teTimeKind}}..  
15760 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
15770 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
15780 46 69 67 75 72 65 20 6f 75 74 20 77 68 61 74 20  Figure out what 
15790 74 68 65 20 66 69 6e 61 6c 20 66 6c 61 67 73 20  the final flags 
157a0 66 6f 72 20 74 68 69 73 20 63 6f 6e 6e 65 63 74  for this connect
157b0 69 6f 6e 20 6e 65 65 64 20 74 6f 20 62 65 2e 0d  ion need to be..
157c0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
157d0 73 65 74 20 66 6c 61 67 73 20 5b 67 65 74 43 6f  set flags [getCo
157e0 6e 6e 65 63 74 69 6f 6e 46 6c 61 67 73 20 24 66  nnectionFlags $f
157f0 69 6c 65 4e 61 6d 65 20 24 66 6c 61 67 73 20 24  ileName $flags $
15800 71 75 69 65 74 5d 0d 0a 0d 0a 20 20 20 20 20 20  quiet]....      
15810 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
15820 20 49 66 20 6f 75 72 20 63 61 6c 6c 65 72 20 73   If our caller s
15830 70 65 63 69 66 69 65 64 20 73 6f 6d 65 20 53 51  pecified some SQ
15840 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 46 6c  LiteConnectionFl
15850 61 67 73 2c 20 61 64 64 20 74 68 65 0d 0a 20 20  ags, add the..  
15860 20 20 20 20 23 20 20 20 20 20 20 20 6e 65 63 65      #       nece
15870 73 73 61 72 79 20 70 6f 72 74 69 6f 6e 20 6f 66  ssary portion of
15880 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
15890 73 74 72 69 6e 67 20 6e 6f 77 2e 0d 0a 20 20 20  string now...   
158a0 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
158b0 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
158c0 66 6c 61 67 73 5d 20 3e 20 30 7d 20 74 68 65 6e  flags] > 0} then
158d0 20 7b 0d 0a 20 20 20 20 20 20 20 20 61 70 70 65   {..        appe
158e0 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 3b  nd connection {;
158f0 46 6c 61 67 73 3d 24 7b 66 6c 61 67 73 7d 7d 0d  Flags=${flags}}.
15900 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
15910 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
15920 45 3a 20 49 66 20 6f 75 72 20 63 61 6c 6c 65 72  E: If our caller
15930 20 73 70 65 63 69 66 69 65 64 20 61 6e 20 65 78   specified an ex
15940 74 72 61 20 70 61 79 6c 6f 61 64 20 74 6f 20 74  tra payload to t
15950 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0d 0a 20  he connection.. 
15960 20 20 20 20 20 23 20 20 20 20 20 20 20 73 74 72       #       str
15970 69 6e 67 2c 20 61 70 70 65 6e 64 20 69 74 20 6e  ing, append it n
15980 6f 77 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ow...      #..  
15990 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
159a0 6c 65 6e 67 74 68 20 24 65 78 74 72 61 5d 20 3e  length $extra] >
159b0 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
159c0 20 20 20 20 61 70 70 65 6e 64 20 63 6f 6e 6e 65      append conne
159d0 63 74 69 6f 6e 20 5c 3b 20 24 65 78 74 72 61 0d  ction \; $extra.
159e0 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
159f0 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
15a00 45 3a 20 4f 70 65 6e 20 74 68 65 20 64 61 74 61  E: Open the data
15a10 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
15a20 6e 6f 77 2c 20 70 6c 61 63 69 6e 67 20 74 68 65  now, placing the
15a30 20 6f 70 61 71 75 65 20 68 61 6e 64 6c 65 20 76   opaque handle v
15a40 61 6c 75 65 0d 0a 20 20 20 20 20 20 23 20 20 20  alue..      #   
15a50 20 20 20 20 69 6e 74 6f 20 74 68 65 20 76 61 72      into the var
15a60 69 61 62 6c 65 20 73 70 65 63 69 66 69 65 64 20  iable specified 
15a70 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 2e 0d 0a  by our caller...
15a80 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73        #..      s
15a90 65 74 20 64 62 20 5b 73 71 6c 20 6f 70 65 6e 20  et db [sql open 
15aa0 2d 74 79 70 65 20 53 51 4c 69 74 65 20 5b 73 75  -type SQLite [su
15ab0 62 73 74 20 24 63 6f 6e 6e 65 63 74 69 6f 6e 5d  bst $connection]
15ac0 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ]....      #..  
15ad0 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 6f 6e 66      # NOTE: Conf
15ae0 69 67 75 72 65 20 74 68 65 20 74 65 6d 70 6f 72  igure the tempor
15af0 61 72 79 20 64 69 72 65 63 74 6f 72 79 20 66 6f  ary directory fo
15b00 72 20 74 68 65 20 6e 65 77 6c 79 20 6f 70 65 6e  r the newly open
15b10 65 64 20 64 61 74 61 62 61 73 65 0d 0a 20 20 20  ed database..   
15b20 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e 6e 65     #       conne
15b30 63 74 69 6f 6e 20 6e 6f 77 20 75 6e 6c 65 73 73  ction now unless
15b40 20 6f 75 72 20 63 61 6c 6c 65 72 20 66 6f 72 62   our caller forb
15b50 69 64 73 20 69 74 2e 0d 0a 20 20 20 20 20 20 23  ids it...      #
15b60 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 74 65 6d  ..      if {$tem
15b70 70 6f 72 61 72 79 20 26 26 20 21 5b 69 6e 66 6f  porary && ![info
15b80 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 73 65 74   exists ::no(set
15b90 54 65 6d 70 6f 72 61 72 79 44 69 72 65 63 74 6f  TemporaryDirecto
15ba0 72 79 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ry)]} then {..  
15bb0 20 20 20 20 20 20 73 71 6c 20 65 78 65 63 75 74        sql execut
15bc0 65 20 24 64 62 20 5b 61 70 70 65 6e 64 41 72 67  e $db [appendArg
15bd0 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
15be0 20 22 50 52 41 47 4d 41 20 74 65 6d 70 5f 73 74   "PRAGMA temp_st
15bf0 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 20 3d 20  ore_directory = 
15c00 5c 22 22 20 5b 67 65 74 54 65 6d 70 6f 72 61 72  \"" [getTemporar
15c10 79 44 69 72 65 63 74 6f 72 79 5d 20 5c 22 5c 3b  yDirectory] \"\;
15c20 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  ]..      }....  
15c30 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
15c40 4f 54 45 3a 20 50 65 72 66 6f 72 6d 20 61 6e 79  OTE: Perform any
15c50 20 65 78 74 72 61 20 70 65 72 2d 63 6f 6e 6e 65   extra per-conne
15c60 63 74 69 6f 6e 20 73 65 74 75 70 20 66 6f 72 20  ction setup for 
15c70 74 68 65 20 6e 65 77 6c 79 20 6f 70 65 6e 65 64  the newly opened
15c80 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
15c90 64 61 74 61 62 61 73 65 20 6e 6f 77 20 75 6e 6c  database now unl
15ca0 65 73 73 20 6f 75 72 20 63 61 6c 6c 65 72 20 66  ess our caller f
15cb0 6f 72 62 69 64 73 20 69 74 2e 0d 0a 20 20 20 20  orbids it...    
15cc0 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 65    #..      set e
15cd0 78 65 63 75 74 65 4f 6e 53 65 74 75 70 20 5b 67  xecuteOnSetup [g
15ce0 65 74 45 78 65 63 75 74 65 4f 6e 53 65 74 75 70  etExecuteOnSetup
15cf0 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  ]....      if {[
15d00 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 65  string length $e
15d10 78 65 63 75 74 65 4f 6e 53 65 74 75 70 5d 20 3e  xecuteOnSetup] >
15d20 20 30 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20   0 && \..       
15d30 20 20 20 21 5b 69 6e 66 6f 20 65 78 69 73 74 73     ![info exists
15d40 20 3a 3a 6e 6f 28 65 78 65 63 75 74 65 4f 6e 53   ::no(executeOnS
15d50 65 74 75 70 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  etup)]} then {..
15d60 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
15d70 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20     # NOTE: This 
15d80 63 6f 6d 6d 61 6e 64 20 6d 61 79 20 72 61 69 73  command may rais
15d90 65 20 61 6e 20 65 72 72 6f 72 3b 20 69 66 20 73  e an error; if s
15da0 6f 2c 20 74 68 61 74 20 69 73 20 66 69 6e 65 2c  o, that is fine,
15db0 20 61 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20   as..        #  
15dc0 20 20 20 20 20 74 68 65 20 65 6e 63 6c 6f 73 69       the enclosi
15dd0 6e 67 20 74 65 73 74 20 77 69 6c 6c 20 74 68 65  ng test will the
15de0 6e 20 66 61 69 6c 2e 20 20 54 68 65 20 5b 73 75  n fail.  The [su
15df0 62 73 74 5d 20 63 6f 6d 6d 61 6e 64 20 69 73 0d  bst] command is.
15e00 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
15e10 20 75 73 65 64 20 6f 6e 20 74 68 65 20 53 51 4c   used on the SQL
15e20 20 69 6e 20 63 61 73 65 20 69 74 20 6e 65 65 64   in case it need
15e30 73 20 74 6f 20 72 65 66 65 72 20 74 6f 20 73 74  s to refer to st
15e40 61 74 65 20 69 6e 20 6f 75 72 0d 0a 20 20 20 20  ate in our..    
15e50 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e 74      #       cont
15e60 65 78 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ext...        #.
15e70 0a 20 20 20 20 20 20 20 20 73 71 6c 20 65 78 65  .        sql exe
15e80 63 75 74 65 20 24 64 62 20 5b 73 75 62 73 74 20  cute $db [subst 
15e90 24 65 78 65 63 75 74 65 4f 6e 53 65 74 75 70 5d  $executeOnSetup]
15ea0 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
15eb0 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
15ec0 54 45 3a 20 41 6c 77 61 79 73 20 72 65 74 75 72  TE: Always retur
15ed0 6e 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  n the connection
15ee0 20 68 61 6e 64 6c 65 20 75 70 6f 6e 20 73 75 63   handle upon suc
15ef0 63 65 73 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  cess...      #..
15f00 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 64 62        return $db
15f10 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
15f20 70 72 6f 63 20 67 65 74 44 62 43 6f 6e 6e 65 63  proc getDbConnec
15f30 74 69 6f 6e 20 7b 20 7b 76 61 72 4e 61 6d 65 20  tion { {varName 
15f40 64 62 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23  db} } {..      #
15f50 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
15f60 52 65 66 65 72 20 74 6f 20 74 68 65 20 73 70 65  Refer to the spe
15f70 63 69 66 69 65 64 20 76 61 72 69 61 62 6c 65 20  cified variable 
15f80 28 65 2e 67 2e 20 22 64 62 22 29 20 69 6e 20 74  (e.g. "db") in t
15f90 68 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75  he context of ou
15fa0 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  r..      #      
15fb0 20 63 61 6c 6c 65 72 2e 20 20 54 68 65 20 68 61   caller.  The ha
15fc0 6e 64 6c 65 20 74 6f 20 74 68 65 20 64 61 74 61  ndle to the data
15fd0 62 61 73 65 20 70 72 65 76 69 6f 75 73 6c 79 20  base previously 
15fe0 6f 70 65 6e 65 64 20 76 69 61 20 74 68 65 0d 0a  opened via the..
15ff0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 5b 73        #       [s
16000 65 74 75 70 44 62 5d 20 70 72 6f 63 65 64 75 72  etupDb] procedur
16010 65 20 73 68 6f 75 6c 64 20 62 65 20 73 74 6f 72  e should be stor
16020 65 64 20 74 68 65 72 65 2e 0d 0a 20 20 20 20 20  ed there...     
16030 20 23 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20   #..      upvar 
16040 31 20 24 76 61 72 4e 61 6d 65 20 64 62 0d 0a 0d  1 $varName db...
16050 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
16060 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 72 65 74  # NOTE: This ret
16070 75 72 6e 73 20 74 68 65 20 41 44 4f 2e 4e 45 54  urns the ADO.NET
16080 20 49 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 20 6f   IDbConnection o
16090 62 6a 65 63 74 20 69 6e 73 74 61 6e 63 65 20 66  bject instance f
160a0 6f 72 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20  or the..      # 
160b0 20 20 20 20 20 20 73 70 65 63 69 66 69 65 64 20        specified 
160c0 64 61 74 61 62 73 65 20 68 61 6e 64 6c 65 2e 20  databse handle. 
160d0 20 53 69 6e 63 65 20 67 65 74 74 69 6e 67 20 74   Since getting t
160e0 68 69 73 20 6f 62 6a 65 63 74 20 72 65 6c 69 65  his object relie
160f0 73 20 75 70 6f 6e 0d 0a 20 20 20 20 20 20 23 20  s upon..      # 
16100 20 20 20 20 20 20 45 61 67 6c 65 20 69 6e 74 65        Eagle inte
16110 72 6e 61 6c 73 2c 20 67 72 65 61 74 20 63 61 72  rnals, great car
16120 65 20 73 68 6f 75 6c 64 20 62 65 20 74 61 6b 65  e should be take
16130 6e 20 74 6f 20 61 76 6f 69 64 20 64 69 73 70 6f  n to avoid dispo
16140 73 69 6e 67 20 6f 66 0d 0a 20 20 20 20 20 20 23  sing of..      #
16150 20 20 20 20 20 20 20 74 68 69 73 20 6f 62 6a 65         this obje
16160 63 74 20 6f 72 20 6f 74 68 65 72 77 69 73 65 20  ct or otherwise 
16170 70 75 74 74 69 6e 67 20 69 74 20 69 6e 74 6f 20  putting it into 
16180 61 6e 20 69 6e 76 61 6c 69 64 20 73 74 61 74 65  an invalid state
16190 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
161a0 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73    if {[info exis
161b0 74 73 20 64 62 5d 7d 20 74 68 65 6e 20 7b 0d 0a  ts db]} then {..
161c0 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
161d0 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
161e0 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66  object invoke -f
161f0 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20  lags +NonPublic 
16200 2d 6f 62 6a 65 63 74 66 6c 61 67 73 20 2b 4e 6f  -objectflags +No
16210 44 69 73 70 6f 73 65 20 2d 61 6c 69 61 73 20 5c  Dispose -alias \
16220 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
16230 49 6e 74 65 72 70 72 65 74 65 72 2e 47 65 74 41  Interpreter.GetA
16240 63 74 69 76 65 2e 63 6f 6e 6e 65 63 74 69 6f 6e  ctive.connection
16250 73 20 49 74 65 6d 20 24 64 62 0d 0a 20 20 20 20  s Item $db..    
16260 20 20 20 20 7d 20 72 65 73 75 6c 74 5d 20 3d 3d      } result] ==
16270 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
16280 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
16290 20 20 20 23 20 4e 4f 54 45 3a 20 53 75 63 63 65     # NOTE: Succe
162a0 73 73 2c 20 72 65 74 75 72 6e 20 74 68 65 20 6f  ss, return the o
162b0 70 61 71 75 65 20 6f 62 6a 65 63 74 20 68 61 6e  paque object han
162c0 64 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  dle...          
162d0 23 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  #..          ret
162e0 75 72 6e 20 24 72 65 73 75 6c 74 0d 0a 20 20 20  urn $result..   
162f0 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
16300 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
16310 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 61        # NOTE: Fa
16320 69 6c 75 72 65 2c 20 72 65 70 6f 72 74 20 77 68  ilure, report wh
16330 79 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  y...          #.
16340 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
16350 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
16360 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
16370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d                "=
16380 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69  === WARNING: fai
16390 6c 65 64 20 74 6f 20 67 65 74 20 63 6f 6e 6e 65  led to get conne
163a0 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20 66 6f 72  ction handle for
163b0 20 64 61 74 61 62 61 73 65 20 5c 22 22 20 5c 0d   database \"" \.
163c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24  .              $
163d0 64 62 20 22 5c 22 2c 20 65 72 72 6f 72 3a 20 22  db "\", error: "
163e0 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e   \n\t $result \n
163f0 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  ]..        }..  
16400 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
16410 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
16420 46 61 69 6c 75 72 65 2c 20 72 65 74 75 72 6e 20  Failure, return 
16430 61 6e 20 6f 62 76 69 6f 75 73 6c 79 20 69 6e 76  an obviously inv
16440 61 6c 69 64 20 6f 70 61 71 75 65 20 6f 62 6a 65  alid opaque obje
16450 63 74 20 68 61 6e 64 6c 65 2e 0d 0a 20 20 20 20  ct handle...    
16460 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75 72    #..      retur
16470 6e 20 22 22 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  n ""..    }.....
16480 20 20 20 20 70 72 6f 63 20 66 72 65 65 44 62 43      proc freeDbC
16490 6f 6e 6e 65 63 74 69 6f 6e 20 7b 20 7b 76 61 72  onnection { {var
164a0 4e 61 6d 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 7d  Name connection}
164b0 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20   } {..      #.. 
164c0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 66       # NOTE: Ref
164d0 65 72 20 74 6f 20 74 68 65 20 73 70 65 63 69 66  er to the specif
164e0 69 65 64 20 76 61 72 69 61 62 6c 65 20 28 65 2e  ied variable (e.
164f0 67 2e 20 22 63 6f 6e 6e 65 63 74 69 6f 6e 22 29  g. "connection")
16500 20 69 6e 20 74 68 65 0d 0a 20 20 20 20 20 20 23   in the..      #
16510 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74 20 6f         context o
16520 66 20 6f 75 72 20 63 61 6c 6c 65 72 2e 20 20 54  f our caller.  T
16530 68 65 20 6f 70 61 71 75 65 20 6f 62 6a 65 63 74  he opaque object
16540 20 68 61 6e 64 6c 65 20 66 6f 72 20 61 6e 20 41   handle for an A
16550 44 4f 2e 4e 45 54 0d 0a 20 20 20 20 20 20 23 20  DO.NET..      # 
16560 20 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e        connection
16570 20 70 72 65 76 69 6f 75 73 6c 79 20 72 65 74 75   previously retu
16580 72 6e 65 64 20 62 79 20 5b 67 65 74 44 62 43 6f  rned by [getDbCo
16590 6e 6e 65 63 74 69 6f 6e 5d 20 73 68 6f 75 6c 64  nnection] should
165a0 20 62 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20   be..      #    
165b0 20 20 20 73 74 6f 72 65 64 20 74 68 65 72 65 2e     stored there.
165c0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
165d0 20 75 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d   upvar 1 $varNam
165e0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0d 0a 0d 0a  e connection....
165f0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
16600 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74   NOTE: Attempt t
16610 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 6f 70 61  o remove the opa
16620 71 75 65 20 6f 62 6a 65 63 74 20 68 61 6e 64 6c  que object handl
16630 65 20 66 72 6f 6d 20 74 68 65 20 69 6e 74 65 72  e from the inter
16640 70 72 65 74 65 72 0d 0a 20 20 20 20 20 20 23 20  preter..      # 
16650 20 20 20 20 20 20 6e 6f 77 2e 20 20 54 68 69 73        now.  This
16660 20 5b 6f 62 6a 65 63 74 20 64 69 73 70 6f 73 65   [object dispose
16670 5d 20 63 61 6c 6c 20 77 69 6c 6c 20 6e 6f 74 20  ] call will not 
16680 61 63 74 75 61 6c 6c 79 20 64 69 73 70 6f 73 65  actually dispose
16690 20 6f 66 20 74 68 65 0d 0a 20 20 20 20 20 20 23   of the..      #
166a0 20 20 20 20 20 20 20 75 6e 64 65 72 6c 79 69 6e         underlyin
166b0 67 20 6f 62 6a 65 63 74 20 62 65 63 61 75 73 65  g object because
166c0 20 74 68 65 20 2b 4e 6f 44 69 73 70 6f 73 65 20   the +NoDispose 
166d0 66 6c 61 67 20 77 61 73 20 73 65 74 20 6f 6e 20  flag was set on 
166e0 69 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  it..      #     
166f0 20 20 64 75 72 69 6e 67 20 63 72 65 61 74 69 6f    during creatio
16700 6e 20 6f 66 20 74 68 65 20 6f 70 61 71 75 65 20  n of the opaque 
16710 6f 62 6a 65 63 74 20 68 61 6e 64 6c 65 2e 0d 0a  object handle...
16720 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
16730 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
16740 63 6f 6e 6e 65 63 74 69 6f 6e 5d 20 26 26 20 5c  connection] && \
16750 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 63 61 74  ..          [cat
16760 63 68 20 7b 6f 62 6a 65 63 74 20 64 69 73 70 6f  ch {object dispo
16770 73 65 20 24 63 6f 6e 6e 65 63 74 69 6f 6e 7d 20  se $connection} 
16780 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a  error]} then {..
16790 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
167a0 20 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 73 6f     # NOTE: We so
167b0 6d 65 68 6f 77 20 66 61 69 6c 65 64 20 74 6f 20  mehow failed to 
167c0 72 65 6d 6f 76 65 20 74 68 65 20 68 61 6e 64 6c  remove the handl
167d0 65 2c 20 72 65 70 6f 72 74 20 77 68 79 2e 0d 0a  e, report why...
167e0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
167f0 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
16800 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
16810 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
16820 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e      "==== WARNIN
16830 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 72 65 6d  G: failed to rem
16840 6f 76 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68  ove connection h
16850 61 6e 64 6c 65 20 5c 22 22 20 24 63 6f 6e 6e 65  andle \"" $conne
16860 63 74 69 6f 6e 20 5c 0d 0a 20 20 20 20 20 20 20  ction \..       
16870 20 20 20 20 20 22 5c 22 2c 20 65 72 72 6f 72 3a       "\", error:
16880 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c   " \n\t $error \
16890 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  n]..      }..   
168a0 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
168b0 61 64 64 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 20  addDbConnection 
168c0 7b 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 76 61  { connection {va
168d0 72 4e 61 6d 65 20 64 62 7d 20 7d 20 7b 0d 0a 20  rName db} } {.. 
168e0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
168f0 4e 4f 54 45 3a 20 52 65 66 65 72 20 74 6f 20 74  NOTE: Refer to t
16900 68 65 20 73 70 65 63 69 66 69 65 64 20 76 61 72  he specified var
16910 69 61 62 6c 65 20 28 65 2e 67 2e 20 22 64 62 22  iable (e.g. "db"
16920 29 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 78 74  ) in the context
16930 20 6f 66 20 6f 75 72 0d 0a 20 20 20 20 20 20 23   of our..      #
16940 20 20 20 20 20 20 20 63 61 6c 6c 65 72 2e 0d 0a         caller...
16950 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 75        #..      u
16960 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65 20  pvar 1 $varName 
16970 64 62 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20  db....      #.. 
16980 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 72 65       # NOTE: Cre
16990 61 74 65 20 61 20 63 6f 72 72 65 63 74 6c 79 20  ate a correctly 
169a0 66 6f 72 6d 61 74 74 65 64 20 6e 61 6d 65 20 66  formatted name f
169b0 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20  or the database 
169c0 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 0d 0a 20  connection to.. 
169d0 20 20 20 20 20 23 20 20 20 20 20 20 20 62 65 20       #       be 
169e0 61 64 64 65 64 20 74 6f 20 74 68 65 20 6c 69 73  added to the lis
169f0 74 20 6d 61 6e 61 67 65 64 20 62 79 20 74 68 65  t managed by the
16a00 20 45 61 67 6c 65 20 69 6e 74 65 72 70 72 65 74   Eagle interpret
16a10 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  er...      #..  
16a20 20 20 20 20 73 65 74 20 64 62 20 5b 6f 62 6a 65      set db [obje
16a30 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73  ct invoke -flags
16a40 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20   +NonPublic \.. 
16a50 20 20 20 20 20 20 20 20 20 45 61 67 6c 65 2e 5f           Eagle._
16a60 43 6f 6d 70 6f 6e 65 6e 74 73 2e 50 72 69 76 61  Components.Priva
16a70 74 65 2e 46 6f 72 6d 61 74 4f 70 73 20 44 61 74  te.FormatOps Dat
16a80 61 62 61 73 65 4f 62 6a 65 63 74 4e 61 6d 65 20  abaseObjectName 
16a90 24 63 6f 6e 6e 65 63 74 69 6f 6e 20 5c 0d 0a 20  $connection \.. 
16aa0 20 20 20 20 20 20 20 20 20 53 51 4c 69 74 65 43           SQLiteC
16ab0 6f 6e 6e 65 63 74 69 6f 6e 20 5b 6f 62 6a 65 63  onnection [objec
16ac0 74 20 69 6e 76 6f 6b 65 20 49 6e 74 65 72 70 72  t invoke Interpr
16ad0 65 74 65 72 2e 47 65 74 41 63 74 69 76 65 20 4e  eter.GetActive N
16ae0 65 78 74 49 64 5d 5d 0d 0a 0d 0a 20 20 20 20 20  extId]]....     
16af0 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
16b00 3a 20 41 64 64 20 74 68 65 20 64 61 74 61 62 61  : Add the databa
16b10 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 72  se connection pr
16b20 6f 76 69 64 65 64 20 62 79 20 6f 75 72 20 63 61  ovided by our ca
16b30 6c 6c 65 72 20 74 6f 20 74 68 65 20 6c 69 73 74  ller to the list
16b40 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
16b50 6f 66 20 74 68 6f 73 65 20 6b 6e 6f 77 6e 20 74  of those known t
16b60 6f 20 74 68 65 20 45 61 67 6c 65 20 69 6e 74 65  o the Eagle inte
16b70 72 70 72 65 74 65 72 2e 0d 0a 20 20 20 20 20 20  rpreter...      
16b80 23 0d 0a 20 20 20 20 20 20 6f 62 6a 65 63 74 20  #..      object 
16b90 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e  invoke -flags +N
16ba0 6f 6e 50 75 62 6c 69 63 20 49 6e 74 65 72 70 72  onPublic Interpr
16bb0 65 74 65 72 2e 47 65 74 41 63 74 69 76 65 2e 63  eter.GetActive.c
16bc0 6f 6e 6e 65 63 74 69 6f 6e 73 20 41 64 64 20 5c  onnections Add \
16bd0 0d 0a 20 20 20 20 20 20 20 20 20 20 24 64 62 20  ..          $db 
16be0 24 63 6f 6e 6e 65 63 74 69 6f 6e 0d 0a 20 20 20  $connection..   
16bf0 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
16c00 67 65 74 52 6f 77 73 46 72 6f 6d 44 61 74 61 54  getRowsFromDataT
16c10 61 62 6c 65 20 7b 20 64 61 74 61 54 61 62 6c 65  able { dataTable
16c20 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20   } {..      set 
16c30 72 6f 77 73 20 5b 6c 69 73 74 5d 0d 0a 20 20 20  rows [list]..   
16c40 20 20 20 73 65 74 20 63 6f 75 6e 74 20 5b 24 64     set count [$d
16c50 61 74 61 54 61 62 6c 65 20 43 6f 6c 75 6d 6e 73  ataTable Columns
16c60 2e 43 6f 75 6e 74 5d 0d 0a 0d 0a 20 20 20 20 20  .Count]....     
16c70 20 66 6f 72 20 7b 73 65 74 20 69 6e 64 65 78 20   for {set index 
16c80 30 7d 20 7b 24 69 6e 64 65 78 20 3c 20 24 63 6f  0} {$index < $co
16c90 75 6e 74 7d 20 7b 69 6e 63 72 20 69 6e 64 65 78  unt} {incr index
16ca0 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74  } {..        set
16cb0 20 64 61 74 61 43 6f 6c 75 6d 6e 20 5b 24 64 61   dataColumn [$da
16cc0 74 61 54 61 62 6c 65 20 2d 61 6c 69 61 73 20 43  taTable -alias C
16cd0 6f 6c 75 6d 6e 73 2e 67 65 74 5f 49 74 65 6d 20  olumns.get_Item 
16ce0 24 69 6e 64 65 78 5d 0d 0a 20 20 20 20 20 20 20  $index]..       
16cf0 20 73 65 74 20 6e 61 6d 65 73 28 24 69 6e 64 65   set names($inde
16d00 78 29 20 5b 24 64 61 74 61 43 6f 6c 75 6d 6e 20  x) [$dataColumn 
16d10 43 6f 6c 75 6d 6e 4e 61 6d 65 5d 0d 0a 20 20 20  ColumnName]..   
16d20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 6f 62     }....      ob
16d30 6a 65 63 74 20 66 6f 72 65 61 63 68 20 2d 61 6c  ject foreach -al
16d40 69 61 73 20 64 61 74 61 52 6f 77 20 5b 73 65 74  ias dataRow [set
16d50 20 64 61 74 61 52 6f 77 73 20 5b 24 64 61 74 61   dataRows [$data
16d60 54 61 62 6c 65 20 52 6f 77 73 5d 5d 20 7b 0d 0a  Table Rows]] {..
16d70 20 20 20 20 20 20 20 20 73 65 74 20 72 6f 77 20          set row 
16d80 5b 6c 69 73 74 5d 0d 0a 0d 0a 20 20 20 20 20 20  [list]....      
16d90 20 20 66 6f 72 20 7b 73 65 74 20 69 6e 64 65 78    for {set index
16da0 20 30 7d 20 7b 24 69 6e 64 65 78 20 3c 20 24 63   0} {$index < $c
16db0 6f 75 6e 74 7d 20 7b 69 6e 63 72 20 69 6e 64 65  ount} {incr inde
16dc0 78 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  x} {..          
16dd0 73 65 74 20 76 61 6c 75 65 20 5b 24 64 61 74 61  set value [$data
16de0 52 6f 77 20 2d 63 72 65 61 74 65 20 2d 61 6c 69  Row -create -ali
16df0 61 73 20 67 65 74 5f 49 74 65 6d 20 24 69 6e 64  as get_Item $ind
16e00 65 78 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ex]....         
16e10 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
16e20 67 74 68 20 24 76 61 6c 75 65 5d 20 3e 20 30 20  gth $value] > 0 
16e30 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
16e40 20 20 20 20 21 5b 6f 62 6a 65 63 74 20 69 6e 76      ![object inv
16e50 6f 6b 65 20 43 6f 6e 76 65 72 74 20 49 73 44 42  oke Convert IsDB
16e60 4e 75 6c 6c 20 24 76 61 6c 75 65 5d 7d 20 74 68  Null $value]} th
16e70 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
16e80 20 20 6c 61 70 70 65 6e 64 20 72 6f 77 20 5b 6c    lappend row [l
16e90 69 73 74 20 24 6e 61 6d 65 73 28 24 69 6e 64 65  ist $names($inde
16ea0 78 29 20 5b 24 76 61 6c 75 65 20 54 6f 53 74 72  x) [$value ToStr
16eb0 69 6e 67 5d 5d 0d 0a 20 20 20 20 20 20 20 20 20  ing]]..         
16ec0 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
16ed0 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 72         lappend r
16ee0 6f 77 20 5b 6c 69 73 74 20 24 6e 61 6d 65 73 28  ow [list $names(
16ef0 24 69 6e 64 65 78 29 5d 0d 0a 20 20 20 20 20 20  $index)]..      
16f00 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
16f10 0d 0a 0d 0a 20 20 20 20 20 20 20 20 6c 61 70 70  ....        lapp
16f20 65 6e 64 20 72 6f 77 73 20 24 72 6f 77 0d 0a 20  end rows $row.. 
16f30 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
16f40 72 65 74 75 72 6e 20 24 72 6f 77 73 0d 0a 20 20  return $rows..  
16f50 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
16f60 20 64 75 6d 70 52 6f 77 73 46 72 6f 6d 44 61 74   dumpRowsFromDat
16f70 61 54 61 62 6c 65 20 7b 20 63 68 61 6e 6e 65 6c  aTable { channel
16f80 20 72 6f 77 73 20 7d 20 7b 0d 0a 20 20 20 20 20   rows } {..     
16f90 20 73 65 74 20 73 65 71 75 65 6e 63 65 20 31 0d   set sequence 1.
16fa0 0a 0d 0a 20 20 20 20 20 20 66 6f 72 65 61 63 68  ...      foreach
16fb0 20 72 6f 77 20 24 72 6f 77 73 20 7b 0d 0a 20 20   row $rows {..  
16fc0 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
16fd0 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
16fe0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
16ff0 5b 65 78 70 72 20 7b 24 73 65 71 75 65 6e 63 65  [expr {$sequence
17000 20 3e 20 31 20 3f 20 22 5c 6e 22 20 3a 20 22 22   > 1 ? "\n" : ""
17010 7d 5d 20 22 2d 2d 2d 2d 20 52 4f 57 20 23 22 20  }] "---- ROW #" 
17020 24 73 65 71 75 65 6e 63 65 20 3a 5c 6e 5d 0d 0a  $sequence :\n]..
17030 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63  ..        foreac
17040 68 20 70 61 69 72 20 24 72 6f 77 20 7b 0d 0a 20  h pair $row {.. 
17050 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 6c 6c           if {[ll
17060 65 6e 67 74 68 20 24 70 61 69 72 5d 20 3e 3d 20  ength $pair] >= 
17070 32 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  2} then {..     
17080 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
17090 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
170a0 73 20 5c 74 20 5c 0d 0a 20 20 20 20 20 20 20 20  s \t \..        
170b0 20 20 20 20 20 20 20 20 5b 6c 69 73 74 20 5b 6c          [list [l
170c0 69 6e 64 65 78 20 24 70 61 69 72 20 30 5d 5d 20  index $pair 0]] 
170d0 22 3a 20 22 20 5b 6c 69 73 74 20 5b 6c 69 6e 64  ": " [list [lind
170e0 65 78 20 24 70 61 69 72 20 31 5d 5d 20 5c 6e 5d  ex $pair 1]] \n]
170f0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c  ..          } el
17100 73 65 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24  seif {[llength $
17110 70 61 69 72 5d 20 3d 3d 20 31 7d 20 74 68 65 6e  pair] == 1} then
17120 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
17130 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
17140 61 70 70 65 6e 64 41 72 67 73 20 5c 74 20 5c 0d  appendArgs \t \.
17150 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17160 20 5b 6c 69 73 74 20 5b 6c 69 6e 64 65 78 20 24   [list [lindex $
17170 70 61 69 72 20 30 5d 5d 20 22 3a 20 3c 6e 75 6c  pair 0]] ": <nul
17180 6c 3e 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20  l>\n"]..        
17190 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
171a0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
171b0 68 61 6e 6e 65 6c 20 5c 74 3c 65 6d 70 74 79 3e  hannel \t<empty>
171c0 5c 6e 3b 20 23 20 4e 4f 54 45 3a 20 4e 6f 20 64  \n; # NOTE: No d
171d0 61 74 61 3f 0d 0a 20 20 20 20 20 20 20 20 20 20  ata?..          
171e0 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  }..        }....
171f0 20 20 20 20 20 20 20 20 69 6e 63 72 20 73 65 71          incr seq
17200 75 65 6e 63 65 0d 0a 20 20 20 20 20 20 7d 0d 0a  uence..      }..
17210 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
17220 6f 63 20 63 6c 65 61 6e 75 70 44 62 20 7b 20 66  oc cleanupDb { f
17230 69 6c 65 4e 61 6d 65 20 7b 76 61 72 4e 61 6d 65  ileName {varName
17240 20 64 62 7d 20 7b 63 6f 6c 6c 65 63 74 20 74 72   db} {collect tr
17250 75 65 7d 20 7b 71 75 61 6c 69 66 79 20 74 72 75  ue} {qualify tru
17260 65 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e}..            
17270 20 20 20 20 20 20 20 20 20 7b 64 65 6c 65 74 65           {delete
17280 20 74 72 75 65 7d 20 7d 20 7b 0d 0a 20 20 20 20   true} } {..    
17290 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
172a0 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 66 6f  E: Attempt to fo
172b0 72 63 65 20 61 6c 6c 20 70 65 6e 64 69 6e 67 20  rce all pending 
172c0 22 67 61 72 62 61 67 65 22 20 6f 62 6a 65 63 74  "garbage" object
172d0 73 20 74 6f 20 62 65 20 63 6f 6c 6c 65 63 74 65  s to be collecte
172e0 64 2c 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  d,..      #     
172f0 20 20 69 6e 63 6c 75 64 69 6e 67 20 53 51 4c 69    including SQLi
17300 74 65 20 73 74 61 74 65 6d 65 6e 74 73 20 61 6e  te statements an
17310 64 20 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73  d backup objects
17320 3b 20 74 68 69 73 20 73 68 6f 75 6c 64 20 61 6c  ; this should al
17330 6c 6f 77 0d 0a 20 20 20 20 20 20 23 20 20 20 20  low..      #    
17340 20 20 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e     the underlyin
17350 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  g database file 
17360 74 6f 20 62 65 20 64 65 6c 65 74 65 64 2e 0d 0a  to be deleted...
17370 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
17380 66 20 7b 24 63 6f 6c 6c 65 63 74 7d 20 74 68 65  f {$collect} the
17390 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 63 6f 6c  n {..        col
173a0 6c 65 63 74 47 61 72 62 61 67 65 20 24 3a 3a 74  lectGarbage $::t
173b0 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 20 20 20  est_channel..   
173c0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
173d0 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52  .      # NOTE: R
173e0 65 66 65 72 20 74 6f 20 74 68 65 20 73 70 65 63  efer to the spec
173f0 69 66 69 65 64 20 76 61 72 69 61 62 6c 65 20 28  ified variable (
17400 65 2e 67 2e 20 22 64 62 22 29 20 69 6e 20 74 68  e.g. "db") in th
17410 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72  e context of our
17420 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
17430 63 61 6c 6c 65 72 2e 20 20 54 68 65 20 68 61 6e  caller.  The han
17440 64 6c 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  dle to the datab
17450 61 73 65 20 70 72 65 76 69 6f 75 73 6c 79 20 6f  ase previously o
17460 70 65 6e 65 64 20 76 69 61 20 74 68 65 0d 0a 20  pened via the.. 
17470 20 20 20 20 20 23 20 20 20 20 20 20 20 5b 73 65       #       [se
17480 74 75 70 44 62 5d 20 70 72 6f 63 65 64 75 72 65  tupDb] procedure
17490 20 73 68 6f 75 6c 64 20 62 65 20 73 74 6f 72 65   should be store
174a0 64 20 74 68 65 72 65 2e 0d 0a 20 20 20 20 20 20  d there...      
174b0 23 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20 31  #..      upvar 1
174c0 20 24 76 61 72 4e 61 6d 65 20 64 62 0d 0a 0d 0a   $varName db....
174d0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
174e0 20 4e 4f 54 45 3a 20 43 6c 6f 73 65 20 74 68 65   NOTE: Close the
174f0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 74   connection to t
17500 68 65 20 64 61 74 61 62 61 73 65 20 6e 6f 77 2e  he database now.
17510 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20 61 6c    This should al
17520 6c 6f 77 20 75 73 0d 0a 20 20 20 20 20 20 23 20  low us..      # 
17530 20 20 20 20 20 20 74 6f 20 64 65 6c 65 74 65 20        to delete 
17540 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64  the underlying d
17550 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0d 0a 20  atabase file... 
17560 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
17570 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 64   {[info exists d
17580 62 5d 20 26 26 20 5b 63 61 74 63 68 20 7b 73 71  b] && [catch {sq
17590 6c 20 63 6c 6f 73 65 20 24 64 62 7d 20 65 72 72  l close $db} err
175a0 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  or]} then {..   
175b0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
175c0 23 20 4e 4f 54 45 3a 20 57 65 20 73 6f 6d 65 68  # NOTE: We someh
175d0 6f 77 20 66 61 69 6c 65 64 20 74 6f 20 63 6c 6f  ow failed to clo
175e0 73 65 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  se the database,
175f0 20 72 65 70 6f 72 74 20 77 68 79 2e 0d 0a 20 20   report why...  
17600 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
17610 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
17620 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
17630 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
17640 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a    "==== WARNING:
17650 20 66 61 69 6c 65 64 20 74 6f 20 63 6c 6f 73 65   failed to close
17660 20 64 61 74 61 62 61 73 65 20 5c 22 22 20 24 64   database \"" $d
17670 62 20 22 5c 22 2c 20 65 72 72 6f 72 3a 20 22 20  b "\", error: " 
17680 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5c  \..            \
17690 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a  n\t $error \n]..
176a0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
176b0 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
176c0 3a 20 46 69 72 73 74 2c 20 73 65 65 20 69 66 20  : First, see if 
176d0 6f 75 72 20 63 61 6c 6c 65 72 20 68 61 73 20 72  our caller has r
176e0 65 71 75 65 73 74 65 64 20 61 6e 20 69 6e 2d 6d  equested an in-m
176f0 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0d  emory database..
17700 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
17710 73 65 74 20 69 73 4d 65 6d 6f 72 79 20 5b 69 73  set isMemory [is
17720 4d 65 6d 6f 72 79 44 62 20 24 66 69 6c 65 4e 61  MemoryDb $fileNa
17730 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a  me]....      #..
17740 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75        # NOTE: Bu
17750 69 6c 64 20 74 68 65 20 66 75 6c 6c 20 70 61 74  ild the full pat
17760 68 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  h to the databas
17770 65 20 66 69 6c 65 20 6e 61 6d 65 2e 20 20 46 6f  e file name.  Fo
17780 72 20 6e 6f 77 2c 20 61 6c 6c 20 74 65 73 74 0d  r now, all test.
17790 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64  .      #       d
177a0 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 61 72  atabase files ar
177b0 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  e stored in the 
177c0 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74  temporary direct
177d0 6f 72 79 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ory...      #.. 
177e0 20 20 20 20 20 69 66 20 7b 21 24 69 73 4d 65 6d       if {!$isMem
177f0 6f 72 79 20 26 26 20 24 71 75 61 6c 69 66 79 7d  ory && $qualify}
17800 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
17810 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66   set fileName [f
17820 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 44 61 74  ile join [getDat
17830 61 62 61 73 65 44 69 72 65 63 74 6f 72 79 5d 20  abaseDirectory] 
17840 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69 6c 65  [file tail $file
17850 4e 61 6d 65 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d  Name]]..      }.
17860 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
17870 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20    # NOTE: Check 
17880 69 66 20 74 68 65 20 66 69 6c 65 20 73 74 69 6c  if the file stil
17890 6c 20 65 78 69 73 74 73 2e 0d 0a 20 20 20 20 20  l exists...     
178a0 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 24   #..      if {!$
178b0 69 73 4d 65 6d 6f 72 79 20 26 26 20 24 64 65 6c  isMemory && $del
178c0 65 74 65 20 26 26 20 5b 66 69 6c 65 20 65 78 69  ete && [file exi
178d0 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20  sts $fileName]} 
178e0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
178f0 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
17900 45 3a 20 53 6b 69 70 20 64 65 6c 65 74 69 6e 67  E: Skip deleting
17910 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
17920 69 66 20 73 6f 6d 65 62 6f 64 79 20 73 65 74 73  if somebody sets
17930 20 74 68 65 20 67 6c 6f 62 61 6c 0d 0a 20 20 20   the global..   
17940 20 20 20 20 20 23 20 20 20 20 20 20 20 76 61 72       #       var
17950 69 61 62 6c 65 20 74 6f 20 70 72 65 76 65 6e 74  iable to prevent
17960 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d   it...        #.
17970 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69  .        if {![i
17980 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
17990 63 6c 65 61 6e 75 70 44 62 46 69 6c 65 29 5d 7d  cleanupDbFile)]}
179a0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
179b0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
179c0 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20  # NOTE: Attempt 
179d0 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 74 65  to delete the te
179e0 73 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  st database file
179f0 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 20   now...         
17a00 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   #..          if
17a10 20 7b 5b 73 65 74 20 63 6f 64 65 20 5b 63 61 74   {[set code [cat
17a20 63 68 20 7b 66 69 6c 65 20 64 65 6c 65 74 65 20  ch {file delete 
17a30 24 66 69 6c 65 4e 61 6d 65 7d 20 65 72 72 6f 72  $fileName} error
17a40 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  ]]} then {..    
17a50 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
17a60 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57         # NOTE: W
17a70 65 20 73 6f 6d 65 68 6f 77 20 66 61 69 6c 65 64  e somehow failed
17a80 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 66   to delete the f
17a90 69 6c 65 2c 20 72 65 70 6f 72 74 20 77 68 79 2e  ile, report why.
17aa0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d  ..            #.
17ab0 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
17ac0 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
17ad0 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
17ae0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
17af0 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a    "==== WARNING:
17b00 20 66 61 69 6c 65 64 20 74 6f 20 64 65 6c 65 74   failed to delet
17b10 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
17b20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c 0d  \"" $fileName \.
17b30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17b40 20 22 5c 22 20 64 75 72 69 6e 67 20 63 6c 65 61   "\" during clea
17b50 6e 75 70 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e  nup, error: " \n
17b60 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20  \t $error \n].. 
17b70 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
17b80 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
17b90 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
17ba0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f       # NOTE: Sho
17bb0 77 20 74 68 61 74 20 77 65 20 73 6b 69 70 70 65  w that we skippe
17bc0 64 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 66  d deleting the f
17bd0 69 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ile...          
17be0 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  #..          set
17bf0 20 63 6f 64 65 20 30 0d 0a 0d 0a 20 20 20 20 20   code 0....     
17c00 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
17c10 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
17c20 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
17c30 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41          "==== WA
17c40 52 4e 49 4e 47 3a 20 73 6b 69 70 70 65 64 20 64  RNING: skipped d
17c50 65 6c 65 74 69 6e 67 20 64 61 74 61 62 61 73 65  eleting database
17c60 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e   file \"" $fileN
17c70 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ame \..         
17c80 20 20 20 20 20 22 5c 22 20 64 75 72 69 6e 67 20       "\" during 
17c90 63 6c 65 61 6e 75 70 5c 6e 22 5d 0d 0a 20 20 20  cleanup\n"]..   
17ca0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20       }..      } 
17cb0 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
17cc0 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
17cd0 45 3a 20 54 68 65 20 66 69 6c 65 20 64 6f 65 73  E: The file does
17ce0 20 6e 6f 74 20 65 78 69 73 74 2c 20 73 75 63 63   not exist, succ
17cf0 65 73 73 21 0d 0a 20 20 20 20 20 20 20 20 23 0d  ess!..        #.
17d00 0a 20 20 20 20 20 20 20 20 73 65 74 20 63 6f 64  .        set cod
17d10 65 20 30 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  e 0..      }....
17d20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 63 6f        return $co
17d30 64 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  de..    }.....  
17d40 20 20 70 72 6f 63 20 73 61 76 65 45 6e 76 69 72    proc saveEnvir
17d50 6f 6e 6d 65 6e 74 56 61 72 69 61 62 6c 65 73 20  onmentVariables 
17d60 7b 20 6e 61 6d 65 73 20 7b 76 61 72 4e 61 6d 65  { names {varName
17d70 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20   ""} } {..      
17d80 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
17d90 20 46 6f 72 20 65 61 63 68 20 6e 61 6d 65 2c 20   For each name, 
17da0 64 6f 65 73 20 74 68 65 20 6c 69 76 65 20 65 6e  does the live en
17db0 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62  vironment variab
17dc0 6c 65 20 65 78 69 73 74 3f 20 20 49 66 0d 0a 20  le exist?  If.. 
17dd0 20 20 20 20 20 23 20 20 20 20 20 20 20 73 6f 2c       #       so,
17de0 20 73 61 76 65 20 74 68 65 20 76 61 6c 75 65 20   save the value 
17df0 66 6f 72 20 6c 61 74 65 72 3b 20 6f 74 68 65 72  for later; other
17e00 77 69 73 65 2c 20 6d 61 6b 65 20 73 75 72 65 20  wise, make sure 
17e10 74 68 65 20 73 61 76 65 64 0d 0a 20 20 20 20 20  the saved..     
17e20 20 23 20 20 20 20 20 20 20 76 61 6c 75 65 20 64   #       value d
17e30 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 20 65 69  oes not exist ei
17e40 74 68 65 72 2e 20 20 54 68 65 20 6c 69 76 65 20  ther.  The live 
17e50 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69  environment vari
17e60 61 62 6c 65 73 0d 0a 20 20 20 20 20 20 23 20 20  ables..      #  
17e70 20 20 20 20 20 41 52 45 20 4e 4f 54 20 63 68 61       ARE NOT cha
17e80 6e 67 65 64 20 62 79 20 74 68 69 73 20 70 72 6f  nged by this pro
17e90 63 65 64 75 72 65 2e 0d 0a 20 20 20 20 20 20 23  cedure...      #
17ea0 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72  ..      if {[str
17eb0 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 61 72 4e  ing length $varN
17ec0 61 6d 65 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ame] == 0} then 
17ed0 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 76  {..        set v
17ee0 61 72 4e 61 6d 65 20 73 61 76 65 64 45 6e 76 0d  arName savedEnv.
17ef0 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
17f00 20 20 75 70 76 61 72 20 31 20 24 76 61 72 4e 61    upvar 1 $varNa
17f10 6d 65 20 73 61 76 65 64 45 6e 76 0d 0a 0d 0a 20  me savedEnv.... 
17f20 20 20 20 20 20 66 6f 72 65 61 63 68 20 6e 61 6d       foreach nam
17f30 65 20 24 6e 61 6d 65 73 20 7b 0d 0a 20 20 20 20  e $names {..    
17f40 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
17f50 69 73 74 73 20 3a 3a 65 6e 76 28 24 6e 61 6d 65  ists ::env($name
17f60 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
17f70 20 20 20 20 20 20 73 65 74 20 73 61 76 65 64 45        set savedE
17f80 6e 76 28 24 6e 61 6d 65 29 20 24 3a 3a 65 6e 76  nv($name) $::env
17f90 28 24 6e 61 6d 65 29 0d 0a 20 20 20 20 20 20 20  ($name)..       
17fa0 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
17fb0 20 20 20 20 20 75 6e 73 65 74 20 2d 6e 6f 63 6f       unset -noco
17fc0 6d 70 6c 61 69 6e 20 73 61 76 65 64 45 6e 76 28  mplain savedEnv(
17fd0 24 6e 61 6d 65 29 0d 0a 20 20 20 20 20 20 20 20  $name)..        
17fe0 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  }..      }....  
17ff0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
18000 4f 54 45 3a 20 54 68 69 73 20 69 73 20 73 65 6c  OTE: This is sel
18010 66 2d 63 6c 65 61 6e 69 6e 67 2e 20 20 49 66 20  f-cleaning.  If 
18020 6e 6f 20 73 61 76 65 64 20 65 6e 76 69 72 6f 6e  no saved environ
18030 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 73 20 6e  ment variables n
18040 6f 77 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ow..      #     
18050 20 20 65 78 69 73 74 2c 20 72 65 6d 6f 76 65 20    exist, remove 
18060 74 68 65 20 61 72 72 61 79 2e 0d 0a 20 20 20 20  the array...    
18070 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
18080 61 72 72 61 79 20 73 69 7a 65 20 73 61 76 65 64  array size saved
18090 45 6e 76 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  Env] == 0} then 
180a0 7b 0d 0a 20 20 20 20 20 20 20 20 75 6e 73 65 74  {..        unset
180b0 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 73 61 76   -nocomplain sav
180c0 65 64 45 6e 76 0d 0a 20 20 20 20 20 20 7d 0d 0a  edEnv..      }..
180d0 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
180e0 6f 63 20 72 65 73 74 6f 72 65 45 6e 76 69 72 6f  oc restoreEnviro
180f0 6e 6d 65 6e 74 56 61 72 69 61 62 6c 65 73 20 7b  nmentVariables {
18100 20 6e 61 6d 65 73 20 7b 76 61 72 4e 61 6d 65 20   names {varName 
18110 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23  ""} } {..      #
18120 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
18130 46 6f 72 20 65 61 63 68 20 6e 61 6d 65 2c 20 64  For each name, d
18140 6f 65 73 20 74 68 65 20 73 61 76 65 64 20 65 6e  oes the saved en
18150 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62  vironment variab
18160 6c 65 20 65 78 69 73 74 3f 20 20 49 66 0d 0a 20  le exist?  If.. 
18170 20 20 20 20 20 23 20 20 20 20 20 20 20 73 6f 2c       #       so,
18180 20 72 65 73 74 6f 72 65 20 74 68 65 20 73 61 76   restore the sav
18190 65 64 20 76 61 6c 75 65 20 61 6e 64 20 75 6e 73  ed value and uns
181a0 65 74 20 69 74 3b 20 6f 74 68 65 72 77 69 73 65  et it; otherwise
181b0 2c 20 6d 61 6b 65 20 73 75 72 65 0d 0a 20 20 20  , make sure..   
181c0 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20 6c     #       the l
181d0 69 76 65 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20  ive environment 
181e0 76 61 72 69 61 62 6c 65 20 64 6f 65 73 20 6e 6f  variable does no
181f0 74 20 65 78 69 73 74 20 65 69 74 68 65 72 20 28  t exist either (
18200 69 2e 65 2e 20 69 74 0d 0a 20 20 20 20 20 20 23  i.e. it..      #
18210 20 20 20 20 20 20 20 77 61 73 20 6e 6f 74 20 73         was not s
18220 65 74 20 74 6f 20 62 65 67 69 6e 20 77 69 74 68  et to begin with
18230 29 2e 20 20 42 6f 74 68 20 73 61 76 65 64 20 61  ).  Both saved a
18240 6e 64 20 6c 69 76 65 20 65 6e 76 69 72 6f 6e 6d  nd live environm
18250 65 6e 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ent..      #    
18260 20 20 20 76 61 72 69 61 62 6c 65 73 20 41 52 45     variables ARE
18270 20 63 68 61 6e 67 65 64 20 62 79 20 74 68 69 73   changed by this
18280 20 70 72 6f 63 65 64 75 72 65 2e 0d 0a 20 20 20   procedure...   
18290 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
182a0 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
182b0 76 61 72 4e 61 6d 65 5d 20 3d 3d 20 30 7d 20 74  varName] == 0} t
182c0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 73  hen {..        s
182d0 65 74 20 76 61 72 4e 61 6d 65 20 73 61 76 65 64  et varName saved
182e0 45 6e 76 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  Env..      }....
182f0 20 20 20 20 20 20 75 70 76 61 72 20 31 20 24 76        upvar 1 $v
18300 61 72 4e 61 6d 65 20 73 61 76 65 64 45 6e 76 0d  arName savedEnv.
18310 0a 0d 0a 20 20 20 20 20 20 66 6f 72 65 61 63 68  ...      foreach
18320 20 6e 61 6d 65 20 24 6e 61 6d 65 73 20 7b 0d 0a   name $names {..
18330 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66          if {[inf
18340 6f 20 65 78 69 73 74 73 20 73 61 76 65 64 45 6e  o exists savedEn
18350 76 28 24 6e 61 6d 65 29 5d 7d 20 74 68 65 6e 20  v($name)]} then 
18360 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  {..          set
18370 20 3a 3a 65 6e 76 28 24 6e 61 6d 65 29 20 24 73   ::env($name) $s
18380 61 76 65 64 45 6e 76 28 24 6e 61 6d 65 29 0d 0a  avedEnv($name)..
18390 20 20 20 20 20 20 20 20 20 20 75 6e 73 65 74 20            unset 
183a0 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 73 61 76 65  -nocomplain save
183b0 64 45 6e 76 28 24 6e 61 6d 65 29 0d 0a 20 20 20  dEnv($name)..   
183c0 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
183d0 20 20 20 20 20 20 20 20 20 75 6e 73 65 74 20 2d           unset -
183e0 6e 6f 63 6f 6d 70 6c 61 69 6e 20 3a 3a 65 6e 76  nocomplain ::env
183f0 28 24 6e 61 6d 65 29 0d 0a 20 20 20 20 20 20 20  ($name)..       
18400 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20   }..      }.... 
18410 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
18420 4e 4f 54 45 3a 20 54 68 69 73 20 69 73 20 73 65  NOTE: This is se
18430 6c 66 2d 63 6c 65 61 6e 69 6e 67 2e 20 20 49 66  lf-cleaning.  If
18440 20 6e 6f 20 73 61 76 65 64 20 65 6e 76 69 72 6f   no saved enviro
18450 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 73 20  nment variables 
18460 6e 6f 77 0d 0a 20 20 20 20 20 20 23 20 20 20 20  now..      #    
18470 20 20 20 65 78 69 73 74 2c 20 72 65 6d 6f 76 65     exist, remove
18480 20 74 68 65 20 61 72 72 61 79 2e 0d 0a 20 20 20   the array...   
18490 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
184a0 5b 61 72 72 61 79 20 73 69 7a 65 20 73 61 76 65  [array size save
184b0 64 45 6e 76 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  dEnv] == 0} then
184c0 20 7b 0d 0a 20 20 20 20 20 20 20 20 75 6e 73 65   {..        unse
184d0 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 73 61  t -nocomplain sa
184e0 76 65 64 45 6e 76 0d 0a 20 20 20 20 20 20 7d 0d  vedEnv..      }.
184f0 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
18500 72 6f 63 20 73 61 76 65 47 65 74 53 65 74 74 69  roc saveGetSetti
18510 6e 67 56 61 6c 75 65 45 6e 76 69 72 6f 6e 6d 65  ngValueEnvironme
18520 6e 74 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 75  nt {} {..      u
18530 70 76 61 72 20 31 20 73 61 76 65 64 45 6e 76 20  pvar 1 savedEnv 
18540 73 61 76 65 64 45 6e 76 0d 0a 0d 0a 20 20 20 20  savedEnv....    
18550 20 20 73 61 76 65 45 6e 76 69 72 6f 6e 6d 65 6e    saveEnvironmen
18560 74 56 61 72 69 61 62 6c 65 73 20 5b 6c 69 73 74  tVariables [list
18570 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 4e 6f   \..          No
18580 5f 45 78 70 61 6e 64 20 4e 6f 5f 53 51 4c 69 74  _Expand No_SQLit
18590 65 47 65 74 53 65 74 74 69 6e 67 56 61 6c 75 65  eGetSettingValue
185a0 20 4e 6f 5f 53 51 4c 69 74 65 58 6d 6c 43 6f 6e   No_SQLiteXmlCon
185b0 66 69 67 46 69 6c 65 5d 20 5c 0d 0a 20 20 20 20  figFile] \..    
185c0 20 20 20 20 20 20 73 61 76 65 64 45 6e 76 0d 0a        savedEnv..
185d0 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
185e0 6f 63 20 72 65 73 74 6f 72 65 47 65 74 53 65 74  oc restoreGetSet
185f0 74 69 6e 67 56 61 6c 75 65 45 6e 76 69 72 6f 6e  tingValueEnviron
18600 6d 65 6e 74 20 7b 7d 20 7b 0d 0a 20 20 20 20 20  ment {} {..     
18610 20 75 70 76 61 72 20 31 20 73 61 76 65 64 45 6e   upvar 1 savedEn
18620 76 20 73 61 76 65 64 45 6e 76 0d 0a 0d 0a 20 20  v savedEnv....  
18630 20 20 20 20 72 65 73 74 6f 72 65 45 6e 76 69 72      restoreEnvir
18640 6f 6e 6d 65 6e 74 56 61 72 69 61 62 6c 65 73 20  onmentVariables 
18650 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 20  [list \..       
18660 20 20 20 4e 6f 5f 45 78 70 61 6e 64 20 4e 6f 5f     No_Expand No_
18670 53 51 4c 69 74 65 47 65 74 53 65 74 74 69 6e 67  SQLiteGetSetting
18680 56 61 6c 75 65 20 4e 6f 5f 53 51 4c 69 74 65 58  Value No_SQLiteX
18690 6d 6c 43 6f 6e 66 69 67 46 69 6c 65 5d 20 5c 0d  mlConfigFile] \.
186a0 0a 20 20 20 20 20 20 20 20 20 20 73 61 76 65 64  .          saved
186b0 45 6e 76 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20  Env..    }..... 
186c0 20 20 20 70 72 6f 63 20 73 61 76 65 53 51 4c 69     proc saveSQLi
186d0 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 45 6e 76 69  teConnectionEnvi
186e0 72 6f 6e 6d 65 6e 74 20 7b 7d 20 7b 0d 0a 20 20  ronment {} {..  
186f0 20 20 20 20 75 70 76 61 72 20 31 20 73 61 76 65      upvar 1 save
18700 64 45 6e 76 20 73 61 76 65 64 45 6e 76 0d 0a 0d  dEnv savedEnv...
18710 0a 20 20 20 20 20 20 73 61 76 65 45 6e 76 69 72  .      saveEnvir
18720 6f 6e 6d 65 6e 74 56 61 72 69 61 62 6c 65 73 20  onmentVariables 
18730 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 20  [list \..       
18740 20 20 20 44 65 66 61 75 6c 74 46 6c 61 67 73 5f     DefaultFlags_
18750 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e  SQLiteConnection
18760 20 4e 6f 5f 53 51 4c 69 74 65 43 6f 6e 6e 65 63   No_SQLiteConnec
18770 74 69 6f 6e 4e 65 77 50 61 72 73 65 72 5d 20 5c  tionNewParser] \
18780 0d 0a 20 20 20 20 20 20 20 20 20 20 73 61 76 65  ..          save
18790 64 45 6e 76 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  dEnv..    }.....
187a0 20 20 20 20 70 72 6f 63 20 72 65 73 74 6f 72 65      proc restore
187b0 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e  SQLiteConnection
187c0 45 6e 76 69 72 6f 6e 6d 65 6e 74 20 7b 7d 20 7b  Environment {} {
187d0 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20 31 20  ..      upvar 1 
187e0 73 61 76 65 64 45 6e 76 20 73 61 76 65 64 45 6e  savedEnv savedEn
187f0 76 0d 0a 0d 0a 20 20 20 20 20 20 72 65 73 74 6f  v....      resto
18800 72 65 45 6e 76 69 72 6f 6e 6d 65 6e 74 56 61 72  reEnvironmentVar
18810 69 61 62 6c 65 73 20 5b 6c 69 73 74 20 5c 0d 0a  iables [list \..
18820 20 20 20 20 20 20 20 20 20 20 44 65 66 61 75 6c            Defaul
18830 74 46 6c 61 67 73 5f 53 51 4c 69 74 65 43 6f 6e  tFlags_SQLiteCon
18840 6e 65 63 74 69 6f 6e 20 4e 6f 5f 53 51 4c 69 74  nection No_SQLit
18850 65 43 6f 6e 6e 65 63 74 69 6f 6e 4e 65 77 50 61  eConnectionNewPa
18860 72 73 65 72 5d 20 5c 0d 0a 20 20 20 20 20 20 20  rser] \..       
18870 20 20 20 73 61 76 65 64 45 6e 76 0d 0a 20 20 20     savedEnv..   
18880 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
18890 73 61 76 65 53 51 4c 69 74 65 43 6f 6e 76 65 72  saveSQLiteConver
188a0 74 45 6e 76 69 72 6f 6e 6d 65 6e 74 20 7b 7d 20  tEnvironment {} 
188b0 7b 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20 31  {..      upvar 1
188c0 20 73 61 76 65 64 45 6e 76 20 73 61 76 65 64 45   savedEnv savedE
188d0 6e 76 0d 0a 0d 0a 20 20 20 20 20 20 73 61 76 65  nv....      save
188e0 45 6e 76 69 72 6f 6e 6d 65 6e 74 56 61 72 69 61  EnvironmentVaria
188f0 62 6c 65 73 20 5b 6c 69 73 74 20 5c 0d 0a 20 20  bles [list \..  
18900 20 20 20 20 20 20 20 20 55 73 65 5f 53 51 4c 69          Use_SQLi
18910 74 65 43 6f 6e 76 65 72 74 5f 44 65 66 61 75 6c  teConvert_Defaul
18920 74 44 62 54 79 70 65 20 55 73 65 5f 53 51 4c 69  tDbType Use_SQLi
18930 74 65 43 6f 6e 76 65 72 74 5f 44 65 66 61 75 6c  teConvert_Defaul
18940 74 54 79 70 65 4e 61 6d 65 5d 20 5c 0d 0a 20 20  tTypeName] \..  
18950 20 20 20 20 20 20 20 20 73 61 76 65 64 45 6e 76          savedEnv
18960 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
18970 70 72 6f 63 20 72 65 73 74 6f 72 65 53 51 4c 69  proc restoreSQLi
18980 74 65 43 6f 6e 76 65 72 74 45 6e 76 69 72 6f 6e  teConvertEnviron
18990 6d 65 6e 74 20 7b 7d 20 7b 0d 0a 20 20 20 20 20  ment {} {..     
189a0 20 75 70 76 61 72 20 31 20 73 61 76 65 64 45 6e   upvar 1 savedEn
189b0 76 20 73 61 76 65 64 45 6e 76 0d 0a 0d 0a 20 20  v savedEnv....  
189c0 20 20 20 20 72 65 73 74 6f 72 65 45 6e 76 69 72      restoreEnvir
189d0 6f 6e 6d 65 6e 74 56 61 72 69 61 62 6c 65 73 20  onmentVariables 
189e0 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 20  [list \..       
189f0 20 20 20 55 73 65 5f 53 51 4c 69 74 65 43 6f 6e     Use_SQLiteCon
18a00 76 65 72 74 5f 44 65 66 61 75 6c 74 44 62 54 79  vert_DefaultDbTy
18a10 70 65 20 55 73 65 5f 53 51 4c 69 74 65 43 6f 6e  pe Use_SQLiteCon
18a20 76 65 72 74 5f 44 65 66 61 75 6c 74 54 79 70 65  vert_DefaultType
18a30 4e 61 6d 65 5d 20 5c 0d 0a 20 20 20 20 20 20 20  Name] \..       
18a40 20 20 20 73 61 76 65 64 45 6e 76 0d 0a 20 20 20     savedEnv..   
18a50 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
18a60 73 65 74 75 70 44 62 49 6e 74 65 72 72 75 70 74  setupDbInterrupt
18a70 43 61 6c 6c 62 61 63 6b 20 7b 20 63 68 61 6e 6e  Callback { chann
18a80 65 6c 20 6c 6f 67 20 7d 20 7b 0d 0a 20 20 20 20  el log } {..    
18a90 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
18aa0 20 22 2d 2d 2d 2d 20 73 65 74 74 69 6e 67 20 75   "---- setting u
18ab0 70 20 64 65 62 75 67 67 65 72 20 69 6e 74 65 72  p debugger inter
18ac0 72 75 70 74 20 63 61 6c 6c 62 61 63 6b 2e 2e 2e  rupt callback...
18ad0 20 22 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b   "....      if {
18ae0 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
18af0 20 20 73 61 76 65 45 6e 76 69 72 6f 6e 6d 65 6e    saveEnvironmen
18b00 74 56 61 72 69 61 62 6c 65 73 20 5b 6c 69 73 74  tVariables [list
18b10 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
18b20 71 75 69 65 74 46 69 6e 64 49 6e 74 65 72 70 72  quietFindInterpr
18b30 65 74 65 72 54 65 73 74 50 61 74 68 20 71 75 69  eterTestPath qui
18b40 65 74 53 65 74 75 70 49 6e 74 65 72 70 72 65 74  etSetupInterpret
18b50 65 72 54 65 73 74 50 61 74 68 5d 0d 0a 0d 0a 20  erTestPath].... 
18b60 20 20 20 20 20 20 20 74 72 79 20 7b 0d 0a 20 20         try {..  
18b70 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
18b80 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 50 72 65       # NOTE: Pre
18b90 76 65 6e 74 20 74 68 65 20 76 65 6e 64 6f 72 20  vent the vendor 
18ba0 73 63 72 69 70 74 20 66 72 6f 6d 20 62 65 69 6e  script from bein
18bb0 67 20 6e 6f 69 73 79 20 77 68 65 6e 20 63 72 65  g noisy when cre
18bc0 61 74 69 6e 67 0d 0a 20 20 20 20 20 20 20 20 20  ating..         
18bd0 20 23 20 20 20 20 20 20 20 74 68 65 20 69 73 6f   #       the iso
18be0 6c 61 74 65 64 20 69 6e 74 65 72 70 72 65 74 65  lated interprete
18bf0 72 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  r...          #.
18c00 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20 3a  .          set :
18c10 3a 65 6e 76 28 71 75 69 65 74 46 69 6e 64 49 6e  :env(quietFindIn
18c20 74 65 72 70 72 65 74 65 72 54 65 73 74 50 61 74  terpreterTestPat
18c30 68 29 20 31 0d 0a 20 20 20 20 20 20 20 20 20 20  h) 1..          
18c40 73 65 74 20 3a 3a 65 6e 76 28 71 75 69 65 74 53  set ::env(quietS
18c50 65 74 75 70 49 6e 74 65 72 70 72 65 74 65 72 54  etupInterpreterT
18c60 65 73 74 50 61 74 68 29 20 31 0d 0a 0d 0a 20 20  estPath) 1....  
18c70 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
18c80 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4d 61 6b       # NOTE: Mak
18c90 65 20 73 75 72 65 20 74 68 65 20 73 63 72 69 70  e sure the scrip
18ca0 74 20 64 65 62 75 67 67 65 72 20 61 6e 64 20 74  t debugger and t
18cb0 68 65 20 69 73 6f 6c 61 74 65 64 20 69 6e 74 65  he isolated inte
18cc0 72 70 72 65 74 65 72 0d 0a 20 20 20 20 20 20 20  rpreter..       
18cd0 20 20 20 23 20 20 20 20 20 20 20 61 72 65 20 73     #       are s
18ce0 65 74 75 70 20 61 6e 64 20 72 65 61 64 79 20 66  etup and ready f
18cf0 6f 72 20 75 73 65 2e 0d 0a 20 20 20 20 20 20 20  or use...       
18d00 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
18d10 64 65 62 75 67 20 73 65 74 75 70 20 74 72 75 65  debug setup true
18d20 20 74 72 75 65 0d 0a 0d 0a 20 20 20 20 20 20 20   true....       
18d30 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
18d40 23 20 4e 4f 54 45 3a 20 4c 6f 61 64 20 74 68 65  # NOTE: Load the
18d50 20 6e 65 63 65 73 73 61 72 79 20 70 61 63 6b 61   necessary packa
18d60 67 65 73 20 69 6e 74 6f 20 74 68 65 20 69 73 6f  ges into the iso
18d70 6c 61 74 65 64 20 69 6e 74 65 72 70 72 65 74 65  lated interprete
18d80 72 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  r...          #.
18d90 0a 20 20 20 20 20 20 20 20 20 20 64 65 62 75 67  .          debug
18da0 20 65 76 61 6c 20 7b 0d 0a 20 20 20 20 20 20 20   eval {..       
18db0 20 20 20 20 20 70 61 63 6b 61 67 65 20 72 65 71       package req
18dc0 75 69 72 65 20 45 61 67 6c 65 0d 0a 20 20 20 20  uire Eagle..    
18dd0 20 20 20 20 20 20 20 20 70 61 63 6b 61 67 65 20          package 
18de0 72 65 71 75 69 72 65 20 45 61 67 6c 65 2e 4c 69  require Eagle.Li
18df0 62 72 61 72 79 0d 0a 20 20 20 20 20 20 20 20 20  brary..         
18e00 20 20 20 70 61 63 6b 61 67 65 20 72 65 71 75 69     package requi
18e10 72 65 20 45 61 67 6c 65 2e 54 65 73 74 0d 0a 20  re Eagle.Test.. 
18e20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
18e30 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
18e40 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 6f 70       # NOTE: Cop
18e50 79 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20  y the necessary 
18e60 76 61 72 69 61 62 6c 65 73 20 69 6e 74 6f 20 74  variables into t
18e70 68 65 20 69 73 6f 6c 61 74 65 64 20 69 6e 74 65  he isolated inte
18e80 72 70 72 65 74 65 72 2e 0d 0a 20 20 20 20 20 20  rpreter...      
18e90 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
18ea0 20 64 65 62 75 67 20 69 6e 76 6f 6b 65 20 30 20   debug invoke 0 
18eb0 73 65 74 20 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  set ::test_chann
18ec0 65 6c 20 24 63 68 61 6e 6e 65 6c 3b 20 23 20 4e  el $channel; # N
18ed0 4f 54 45 3a 20 46 6f 72 20 5b 74 70 75 74 73 5d  OTE: For [tputs]
18ee0 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 64 65 62  ...          deb
18ef0 75 67 20 69 6e 76 6f 6b 65 20 30 20 73 65 74 20  ug invoke 0 set 
18f00 3a 3a 74 65 73 74 5f 6c 6f 67 20 24 6c 6f 67 3b  ::test_log $log;
18f10 20 23 20 4e 4f 54 45 3a 20 46 6f 72 20 5b 74 6c   # NOTE: For [tl
18f20 6f 67 5d 2e 0d 0a 0d 0a 20 20 20 20 20 20 20 20  og].....        
18f30 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23    #..          #
18f40 20 4e 4f 54 45 3a 20 49 6e 73 74 61 6c 6c 20 74   NOTE: Install t
18f50 68 65 20 63 61 6c 6c 62 61 63 6b 20 73 63 72 69  he callback scri
18f60 70 74 20 74 6f 20 62 65 20 65 76 61 6c 75 61 74  pt to be evaluat
18f70 65 64 20 69 6e 20 74 68 65 20 69 73 6f 6c 61 74  ed in the isolat
18f80 65 64 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20  ed..          # 
18f90 20 20 20 20 20 20 69 6e 74 65 72 70 72 65 74 65        interprete
18fa0 72 20 77 68 65 6e 20 74 68 69 73 20 69 6e 74 65  r when this inte
18fb0 72 70 72 65 74 65 72 20 69 73 20 69 6e 74 65 72  rpreter is inter
18fc0 72 75 70 74 65 64 20 62 79 20 73 63 72 69 70 74  rupted by script
18fd0 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20  ..          #   
18fe0 20 20 20 20 63 61 6e 63 65 6c 6c 61 74 69 6f 6e      cancellation
18ff0 2c 20 65 74 63 2e 0d 0a 20 20 20 20 20 20 20 20  , etc...        
19000 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 64    #..          d
19010 65 62 75 67 20 63 61 6c 6c 62 61 63 6b 20 61 70  ebug callback ap
19020 70 6c 79 20 7b 7b 73 65 6e 64 65 72 20 65 7d 20  ply {{sender e} 
19030 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  {..            #
19040 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20  ..            # 
19050 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20 74  NOTE: Check if t
19060 68 69 73 20 64 65 62 75 67 67 65 72 20 63 61 6c  his debugger cal
19070 6c 62 61 63 6b 20 69 73 20 6f 6e 65 20 74 68 61  lback is one tha
19080 74 20 77 65 20 63 61 72 65 20 61 62 6f 75 74 2e  t we care about.
19090 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d  ..            #.
190a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74  .            set
190b0 20 69 6e 74 65 72 72 75 70 74 54 79 70 65 73 20   interruptTypes 
190c0 5b 73 70 6c 69 74 20 5b 24 65 20 49 6e 74 65 72  [split [$e Inter
190d0 72 75 70 74 54 79 70 65 5d 20 22 2c 20 22 5d 0d  ruptType] ", "].
190e0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ...            i
190f0 66 20 7b 22 43 61 6e 63 65 6c 65 64 22 20 69 6e  f {"Canceled" in
19100 20 24 69 6e 74 65 72 72 75 70 74 54 79 70 65 73   $interruptTypes
19110 20 7c 7c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   || \..         
19120 20 20 20 20 20 20 20 22 55 6e 77 6f 75 6e 64 22         "Unwound"
19130 20 69 6e 20 24 69 6e 74 65 72 72 75 70 74 54 79   in $interruptTy
19140 70 65 73 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  pes} then {..   
19150 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
19160 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f              # NO
19170 54 45 3a 20 4d 61 6b 65 20 73 75 72 65 20 74 68  TE: Make sure th
19180 65 20 5b 6f 62 6a 65 63 74 5d 20 63 6f 6d 6d 61  e [object] comma
19190 6e 64 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e  nd is available.
191a0 20 20 53 69 6e 63 65 0d 0a 20 20 20 20 20 20 20    Since..       
191b0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74         #       t
191c0 68 69 73 20 69 73 20 61 6e 20 69 73 6f 6c 61 74  his is an isolat
191d0 65 64 20 69 6e 74 65 72 70 72 65 74 65 72 2c 20  ed interpreter, 
191e0 63 68 65 63 6b 20 66 6f 72 20 69 74 20 74 68 65  check for it the
191f0 20 68 61 72 64 0d 0a 20 20 20 20 20 20 20 20 20   hard..         
19200 20 20 20 20 20 23 20 20 20 20 20 20 20 77 61 79       #       way
19210 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
19220 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
19230 20 20 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 5b    if {[llength [
19240 69 6e 66 6f 20 63 6f 6d 6d 61 6e 64 73 20 6f 62  info commands ob
19250 6a 65 63 74 5d 5d 20 3e 20 30 7d 20 74 68 65 6e  ject]] > 0} then
19260 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
19270 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
19280 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49         # NOTE: I
19290 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 61  terate through a
192a0 6c 6c 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  ll database conn
192b0 65 63 74 69 6f 6e 73 20 6b 6e 6f 77 6e 20 74 6f  ections known to
192c0 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 20 20   the..          
192d0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 70 61        #       pa
192e0 72 65 6e 74 20 69 6e 74 65 72 70 72 65 74 65 72  rent interpreter
192f0 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
19300 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
19310 20 20 20 20 20 20 6f 62 6a 65 63 74 20 66 6f 72        object for
19320 65 61 63 68 20 2d 61 6c 69 61 73 20 70 61 69 72  each -alias pair
19330 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20   [object invoke 
19340 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69  -flags +NonPubli
19350 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  c \..           
19360 20 20 20 20 20 20 20 20 20 24 65 20 49 6e 74 65           $e Inte
19370 72 70 72 65 74 65 72 2e 63 6f 6e 6e 65 63 74 69  rpreter.connecti
19380 6f 6e 73 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20  ons] {..        
19390 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
193a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
193b0 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74   NOTE: Attempt t
193c0 6f 20 63 61 6e 63 65 6c 20 61 6e 79 20 53 51 4c  o cancel any SQL
193d0 20 71 75 65 72 69 65 73 20 69 6e 20 70 72 6f 67   queries in prog
193e0 72 65 73 73 20 6f 6e 0d 0a 20 20 20 20 20 20 20  ress on..       
193f0 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20             #    
19400 20 20 20 74 68 69 73 20 64 61 74 61 62 61 73 65     this database
19410 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0d 0a 20 20   connection...  
19420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19430 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  #..             
19440 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
19450 7b 24 70 61 69 72 20 56 61 6c 75 65 2e 43 61 6e  {$pair Value.Can
19460 63 65 6c 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65  cel} error]} the
19470 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
19480 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
19490 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
194a0 61 70 70 65 6e 64 41 72 67 73 20 5c 6e 20 5c 0d  appendArgs \n \.
194b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
194c0 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57           "==== W
194d0 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74  ARNING: failed t
194e0 6f 20 63 61 6e 63 65 6c 20 71 75 65 72 79 20 66  o cancel query f
194f0 6f 72 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20  or " \..        
19500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19510 22 63 6f 6e 6e 65 63 74 69 6f 6e 20 5c 22 22 20  "connection \"" 
19520 5b 24 70 61 69 72 20 4b 65 79 5d 20 22 5c 22 2c  [$pair Key] "\",
19530 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 5c   error: " \n\t \
19540 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
19550 20 20 20 20 20 20 20 20 20 20 24 65 72 72 6f 72            $error
19560 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \n]..          
19570 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
19580 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
19590 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c              } el
195a0 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
195b0 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
195c0 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
195d0 65 6e 64 41 72 67 73 20 5c 6e 20 5c 0d 0a 20 20  endArgs \n \..  
195e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
195f0 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a    "==== WARNING:
19600 20 63 61 6e 6e 6f 74 20 63 61 6e 63 65 6c 20 61   cannot cancel a
19610 6e 79 20 71 75 65 72 69 65 73 3a 20 22 20 5c 0d  ny queries: " \.
19620 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19630 20 20 20 20 20 22 74 68 65 20 5c 22 6f 62 6a 65       "the \"obje
19640 63 74 5c 22 20 63 6f 6d 6d 61 6e 64 20 69 73 20  ct\" command is 
19650 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 5c 6e 22  not available\n"
19660 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ]..             
19670 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
19680 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 7d 0d  }..          }}.
19690 0a 20 20 20 20 20 20 20 20 7d 20 66 69 6e 61 6c  .        } final
196a0 6c 79 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ly {..          
196b0 72 65 73 74 6f 72 65 45 6e 76 69 72 6f 6e 6d 65  restoreEnvironme
196c0 6e 74 56 61 72 69 61 62 6c 65 73 20 5b 6c 69 73  ntVariables [lis
196d0 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  t \..           
196e0 20 20 20 71 75 69 65 74 46 69 6e 64 49 6e 74 65     quietFindInte
196f0 72 70 72 65 74 65 72 54 65 73 74 50 61 74 68 20  rpreterTestPath 
19700 71 75 69 65 74 53 65 74 75 70 49 6e 74 65 72 70  quietSetupInterp
19710 72 65 74 65 72 54 65 73 74 50 61 74 68 5d 0d 0a  reterTestPath]..
19720 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
19730 20 7d 20 65 72 72 6f 72 5d 20 3d 3d 20 30 7d 20   } error] == 0} 
19740 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
19750 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 69 6e  addConstraint in
19760 74 65 72 72 75 70 74 43 61 6c 6c 62 61 63 6b 2e  terruptCallback.
19770 73 71 6c 69 74 65 33 0d 0a 0d 0a 20 20 20 20 20  sqlite3....     
19780 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
19790 6c 20 79 65 73 5c 6e 0d 0a 20 20 20 20 20 20 7d  l yes\n..      }
197a0 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
197b0 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
197c0 5b 61 70 70 65 6e 64 41 72 67 73 20 22 6e 6f 2c  [appendArgs "no,
197d0 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24   error: " \n\t $
197e0 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20  error \n]..     
197f0 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
19800 20 20 70 72 6f 63 20 63 6c 65 61 6e 75 70 46 69    proc cleanupFi
19810 6c 65 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7b 63  le { fileName {c
19820 6f 6c 6c 65 63 74 20 74 72 75 65 7d 20 7b 66 6f  ollect true} {fo
19830 72 63 65 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a  rce false} } {..
19840 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
19850 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74   NOTE: Attempt t
19860 6f 20 66 6f 72 63 65 20 61 6c 6c 20 70 65 6e 64  o force all pend
19870 69 6e 67 20 22 67 61 72 62 61 67 65 22 20 6f 62  ing "garbage" ob
19880 6a 65 63 74 73 20 74 6f 20 62 65 20 63 6f 6c 6c  jects to be coll
19890 65 63 74 65 64 2c 0d 0a 20 20 20 20 20 20 23 20  ected,..      # 
198a0 20 20 20 20 20 20 69 6e 63 6c 75 64 69 6e 67 20        including 
198b0 53 51 4c 69 74 65 20 73 74 61 74 65 6d 65 6e 74  SQLite statement
198c0 73 20 61 6e 64 20 62 61 63 6b 75 70 20 6f 62 6a  s and backup obj
198d0 65 63 74 73 3b 20 74 68 69 73 20 73 68 6f 75 6c  ects; this shoul
198e0 64 20 61 6c 6c 6f 77 0d 0a 20 20 20 20 20 20 23  d allow..      #
198f0 20 20 20 20 20 20 20 74 68 65 20 75 6e 64 65 72         the under
19900 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65 20 66  lying database f
19910 69 6c 65 20 74 6f 20 62 65 20 64 65 6c 65 74 65  ile to be delete
19920 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  d...      #..   
19930 20 20 20 69 66 20 7b 24 63 6f 6c 6c 65 63 74 7d     if {$collect}
19940 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
19950 20 63 6f 6c 6c 65 63 74 47 61 72 62 61 67 65 20   collectGarbage 
19960 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d  $::test_channel.
19970 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
19980 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
19990 45 3a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20  E: Check if the 
199a0 66 69 6c 65 20 73 74 69 6c 6c 20 65 78 69 73 74  file still exist
199b0 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  s...      #..   
199c0 20 20 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69     if {[file exi
199d0 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20  sts $fileName]} 
199e0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
199f0 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
19a00 45 3a 20 53 6b 69 70 20 64 65 6c 65 74 69 6e 67  E: Skip deleting
19a10 20 74 65 73 74 20 66 69 6c 65 73 20 69 66 20 73   test files if s
19a20 6f 6d 65 62 6f 64 79 20 73 65 74 73 20 74 68 65  omebody sets the
19a30 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
19a40 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
19a50 20 20 74 6f 20 70 72 65 76 65 6e 74 20 69 74 2e    to prevent it.
19a60 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
19a70 20 20 20 20 20 69 66 20 7b 24 66 6f 72 63 65 20       if {$force 
19a80 7c 7c 20 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  || ![info exists
19a90 20 3a 3a 6e 6f 28 63 6c 65 61 6e 75 70 46 69 6c   ::no(cleanupFil
19aa0 65 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  e)]} then {..   
19ab0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
19ac0 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65      # NOTE: Atte
19ad0 6d 70 74 20 74 6f 20 64 65 6c 65 74 65 20 74 68  mpt to delete th
19ae0 65 20 74 65 73 74 20 66 69 6c 65 20 6e 6f 77 2e  e test file now.
19af0 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
19b00 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 65           if {[se
19b10 74 20 63 6f 64 65 20 5b 63 61 74 63 68 20 7b 66  t code [catch {f
19b20 69 6c 65 20 64 65 6c 65 74 65 20 24 66 69 6c 65  ile delete $file
19b30 4e 61 6d 65 7d 20 65 72 72 6f 72 5d 5d 7d 20 74  Name} error]]} t
19b40 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
19b50 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
19b60 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 73 6f 6d    # NOTE: We som
19b70 65 68 6f 77 20 66 61 69 6c 65 64 20 74 6f 20 64  ehow failed to d
19b80 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65 2c 20  elete the file, 
19b90 72 65 70 6f 72 74 20 77 68 79 2e 0d 0a 20 20 20  report why...   
19ba0 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
19bb0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
19bc0 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
19bd0 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
19be0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d               "==
19bf0 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c  == WARNING: fail
19c00 65 64 20 74 6f 20 64 65 6c 65 74 65 20 74 65 73  ed to delete tes
19c10 74 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c 65  t file \"" $file
19c20 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  Name \..        
19c30 20 20 20 20 20 20 20 20 22 5c 22 20 64 75 72 69          "\" duri
19c40 6e 67 20 63 6c 65 61 6e 75 70 2c 20 65 72 72 6f  ng cleanup, erro
19c50 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72  r: " \n\t $error
19c60 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \n]..          
19c70 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73  }..        } els
19c80 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23  e {..          #
19c90 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
19ca0 54 45 3a 20 53 68 6f 77 20 74 68 61 74 20 77 65  TE: Show that we
19cb0 20 73 6b 69 70 70 65 64 20 64 65 6c 65 74 69 6e   skipped deletin
19cc0 67 20 74 68 65 20 66 69 6c 65 2e 0d 0a 20 20 20  g the file...   
19cd0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
19ce0 20 20 20 20 73 65 74 20 63 6f 64 65 20 30 0d 0a      set code 0..
19cf0 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74  ..          tput
19d00 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
19d10 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
19d20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
19d30 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 73 6b  ==== WARNING: sk
19d40 69 70 70 65 64 20 64 65 6c 65 74 69 6e 67 20 74  ipped deleting t
19d50 65 73 74 20 66 69 6c 65 20 5c 22 22 20 24 66 69  est file \"" $fi
19d60 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20  leName \..      
19d70 20 20 20 20 20 20 20 20 22 5c 22 20 64 75 72 69          "\" duri
19d80 6e 67 20 63 6c 65 61 6e 75 70 5c 6e 22 5d 0d 0a  ng cleanup\n"]..
19d90 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
19da0 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
19db0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
19dc0 4e 4f 54 45 3a 20 54 68 65 20 66 69 6c 65 20 64  NOTE: The file d
19dd0 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 73  oes not exist, s
19de0 75 63 63 65 73 73 21 0d 0a 20 20 20 20 20 20 20  uccess!..       
19df0 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   #..        set 
19e00 63 6f 64 65 20 30 0d 0a 20 20 20 20 20 20 7d 0d  code 0..      }.
19e10 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ...      return 
19e20 24 63 6f 64 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d  $code..    }....
19e30 0a 20 20 20 20 70 72 6f 63 20 63 6c 65 61 6e 75  .    proc cleanu
19e40 70 4d 65 6d 6f 72 79 20 7b 20 76 61 72 4e 61 6d  pMemory { varNam
19e50 65 20 7b 71 75 69 65 74 20 66 61 6c 73 65 7d 20  e {quiet false} 
19e60 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  } {..      if {[
19e70 68 61 76 65 53 51 4c 69 74 65 4f 62 6a 65 63 74  haveSQLiteObject
19e80 43 6f 6d 6d 61 6e 64 5d 20 26 26 20 5c 0d 0a 20  Command] && \.. 
19e90 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67           [string
19ea0 20 6c 65 6e 67 74 68 20 24 76 61 72 4e 61 6d 65   length $varName
19eb0 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
19ec0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
19ed0 20 20 23 20 4e 4f 54 45 3a 20 52 65 66 65 72 20    # NOTE: Refer 
19ee0 74 6f 20 74 68 65 20 73 70 65 63 69 66 69 65 64  to the specified
19ef0 20 76 61 72 69 61 62 6c 65 20 28 65 2e 67 2e 20   variable (e.g. 
19f00 22 63 6f 6e 6e 65 63 74 69 6f 6e 22 29 20 69 6e  "connection") in
19f10 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20   the..        # 
19f20 20 20 20 20 20 20 63 6f 6e 74 65 78 74 20 6f 66        context of
19f30 20 6f 75 72 20 63 61 6c 6c 65 72 2e 20 20 54 68   our caller.  Th
19f40 65 20 6f 70 61 71 75 65 20 6f 62 6a 65 63 74 20  e opaque object 
19f50 68 61 6e 64 6c 65 20 66 6f 72 20 61 6e 0d 0a 20  handle for an.. 
19f60 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 41         #       A
19f70 44 4f 2e 4e 45 54 20 63 6f 6e 6e 65 63 74 69 6f  DO.NET connectio
19f80 6e 20 70 72 65 76 69 6f 75 73 6c 79 20 72 65 74  n previously ret
19f90 75 72 6e 65 64 20 62 79 20 5b 67 65 74 44 62 43  urned by [getDbC
19fa0 6f 6e 6e 65 63 74 69 6f 6e 5d 0d 0a 20 20 20 20  onnection]..    
19fb0 20 20 20 20 23 20 20 20 20 20 20 20 73 68 6f 75      #       shou
19fc0 6c 64 20 62 65 20 73 74 6f 72 65 64 20 74 68 65  ld be stored the
19fd0 72 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  re...        #..
19fe0 20 20 20 20 20 20 20 20 75 70 76 61 72 20 31 20          upvar 1 
19ff0 24 76 61 72 4e 61 6d 65 20 63 6f 6e 6e 65 63 74  $varName connect
1a000 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69  ion....        i
1a010 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  f {[catch {..   
1a020 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e         object in
1a030 76 6f 6b 65 20 24 63 6f 6e 6e 65 63 74 69 6f 6e  voke $connection
1a040 20 52 65 6c 65 61 73 65 4d 65 6d 6f 72 79 0d 0a   ReleaseMemory..
1a050 20 20 20 20 20 20 20 20 7d 20 72 65 73 75 6c 74          } result
1a060 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
1a070 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
1a080 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1a090 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
1a0a0 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
1a0b0 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
1a0c0 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d             "====
1a0d0 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64   WARNING: failed
1a0e0 20 74 6f 20 72 65 6c 65 61 73 65 20 64 61 74 61   to release data
1a0f0 62 61 73 65 20 6d 65 6d 6f 72 79 2c 20 65 72 72  base memory, err
1a100 6f 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20  or: " \..       
1a110 20 20 20 20 20 20 20 20 20 5c 6e 5c 74 20 24 72           \n\t $r
1a120 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20  esult \n]..     
1a130 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
1a140 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  }..      }....  
1a150 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67 74 68      if {[llength
1a160 20 5b 69 6e 66 6f 20 63 6f 6d 6d 61 6e 64 73 20   [info commands 
1a170 64 65 62 75 67 5d 5d 20 3e 20 30 7d 20 74 68 65  debug]] > 0} the
1a180 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20  n {..        if 
1a190 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
1a1a0 20 20 20 20 20 75 70 6c 65 76 65 6c 20 31 20 5b       uplevel 1 [
1a1b0 6c 69 73 74 20 64 65 62 75 67 20 70 75 72 67 65  list debug purge
1a1c0 5d 0d 0a 20 20 20 20 20 20 20 20 7d 20 72 65 73  ]..        } res
1a1d0 75 6c 74 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ult]} then {..  
1a1e0 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
1a1f0 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
1a200 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
1a210 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
1a220 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
1a230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d                "=
1a240 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69  === WARNING: fai
1a250 6c 65 64 20 74 6f 20 70 75 72 67 65 20 63 61 6c  led to purge cal
1a260 6c 20 66 72 61 6d 65 2c 20 65 72 72 6f 72 3a 20  l frame, error: 
1a270 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
1a280 20 20 20 20 20 5c 6e 5c 74 20 24 72 65 73 75 6c       \n\t $resul
1a290 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  t \n]..         
1a2a0 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d   }..        }...
1a2b0 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61  .        if {[ca
1a2c0 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
1a2d0 20 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74   uplevel 1 [list
1a2e0 20 64 65 62 75 67 20 63 6c 65 61 6e 75 70 5d 0d   debug cleanup].
1a2f0 0a 20 20 20 20 20 20 20 20 7d 20 72 65 73 75 6c  .        } resul
1a300 74 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  t]} then {..    
1a310 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
1a320 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
1a330 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
1a340 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
1a350 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
1a360 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d              "===
1a370 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65  = WARNING: faile
1a380 64 20 74 6f 20 63 6c 65 61 6e 75 70 20 69 6e 74  d to cleanup int
1a390 65 72 70 72 65 74 65 72 2c 20 65 72 72 6f 72 3a  erpreter, error:
1a3a0 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   " \..          
1a3b0 20 20 20 20 20 20 5c 6e 5c 74 20 24 72 65 73 75        \n\t $resu
1a3c0 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  lt \n]..        
1a3d0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
1a3e0 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63  ..        if {[c
1a3f0 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
1a400 20 20 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73    uplevel 1 [lis
1a410 74 20 64 65 62 75 67 20 63 6f 6c 6c 65 63 74 5d  t debug collect]
1a420 0d 0a 20 20 20 20 20 20 20 20 7d 20 72 65 73 75  ..        } resu
1a430 6c 74 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  lt]} then {..   
1a440 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
1a450 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
1a460 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
1a470 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
1a480 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
1a490 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d               "==
1a4a0 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c  == WARNING: fail
1a4b0 65 64 20 74 6f 20 63 6f 6c 6c 65 63 74 20 67 61  ed to collect ga
1a4c0 72 62 61 67 65 2c 20 65 72 72 6f 72 3a 20 22 20  rbage, error: " 
1a4d0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1a4e0 20 20 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20     \n\t $result 
1a4f0 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  \n]..          }
1a500 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
1a510 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
1a520 20 20 20 20 70 72 6f 63 20 73 65 74 75 70 4d 65      proc setupMe
1a530 6d 6f 72 79 43 6f 75 6e 74 65 72 73 20 7b 20 76  moryCounters { v
1a540 61 72 4e 61 6d 65 20 7d 20 7b 0d 0a 20 20 20 20  arName } {..    
1a550 20 20 69 66 20 7b 5b 68 61 76 65 53 51 4c 69 74    if {[haveSQLit
1a560 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d 7d  eObjectCommand]}
1a570 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1a580 20 75 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d   upvar 1 $varNam
1a590 65 20 63 6f 75 6e 74 65 72 0d 0a 0d 0a 20 20 20  e counter....   
1a5a0 20 20 20 20 20 73 65 74 20 63 6f 75 6e 74 65 72       set counter
1a5b0 28 31 29 20 5b 6f 62 6a 65 63 74 20 63 72 65 61  (1) [object crea
1a5c0 74 65 20 2d 61 6c 69 61 73 20 5c 0d 0a 20 20 20  te -alias \..   
1a5d0 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e           System.
1a5e0 44 69 61 67 6e 6f 73 74 69 63 73 2e 50 65 72 66  Diagnostics.Perf
1a5f0 6f 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72 20 50  ormanceCounter P
1a600 72 6f 63 65 73 73 20 5c 0d 0a 20 20 20 20 20 20  rocess \..      
1a610 20 20 20 20 20 20 22 57 6f 72 6b 69 6e 67 20 53        "Working S
1a620 65 74 22 20 5b 66 69 6c 65 20 72 6f 6f 74 6e 61  et" [file rootna
1a630 6d 65 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 3a  me [file tail $:
1a640 3a 62 69 6e 5f 66 69 6c 65 5d 5d 5d 0d 0a 0d 0a  :bin_file]]]....
1a650 20 20 20 20 20 20 20 20 73 65 74 20 63 6f 75 6e          set coun
1a660 74 65 72 28 32 29 20 5b 6f 62 6a 65 63 74 20 63  ter(2) [object c
1a670 72 65 61 74 65 20 2d 61 6c 69 61 73 20 5c 0d 0a  reate -alias \..
1a680 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74              Syst
1a690 65 6d 2e 44 69 61 67 6e 6f 73 74 69 63 73 2e 50  em.Diagnostics.P
1a6a0 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74 65  erformanceCounte
1a6b0 72 20 50 72 6f 63 65 73 73 20 5c 0d 0a 20 20 20  r Process \..   
1a6c0 20 20 20 20 20 20 20 20 20 22 57 6f 72 6b 69 6e           "Workin
1a6d0 67 20 53 65 74 20 50 65 61 6b 22 20 5b 66 69 6c  g Set Peak" [fil
1a6e0 65 20 72 6f 6f 74 6e 61 6d 65 20 5b 66 69 6c 65  e rootname [file
1a6f0 20 74 61 69 6c 20 24 3a 3a 62 69 6e 5f 66 69 6c   tail $::bin_fil
1a700 65 5d 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  e]]]....        
1a710 73 65 74 20 63 6f 75 6e 74 65 72 28 33 29 20 5b  set counter(3) [
1a720 6f 62 6a 65 63 74 20 63 72 65 61 74 65 20 2d 61  object create -a
1a730 6c 69 61 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  lias \..        
1a740 20 20 20 20 53 79 73 74 65 6d 2e 44 69 61 67 6e      System.Diagn
1a750 6f 73 74 69 63 73 2e 50 65 72 66 6f 72 6d 61 6e  ostics.Performan
1a760 63 65 43 6f 75 6e 74 65 72 20 50 72 6f 63 65 73  ceCounter Proces
1a770 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
1a780 20 22 50 72 69 76 61 74 65 20 42 79 74 65 73 22   "Private Bytes"
1a790 20 5b 66 69 6c 65 20 72 6f 6f 74 6e 61 6d 65 20   [file rootname 
1a7a0 5b 66 69 6c 65 20 74 61 69 6c 20 24 3a 3a 62 69  [file tail $::bi
1a7b0 6e 5f 66 69 6c 65 5d 5d 5d 0d 0a 20 20 20 20 20  n_file]]]..     
1a7c0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75   }....      retu
1a7d0 72 6e 20 22 22 0d 0a 20 20 20 20 7d 0d 0a 0c 0d  rn ""..    }....
1a7e0 0a 20 20 20 20 70 72 6f 63 20 72 65 70 6f 72 74  .    proc report
1a7f0 4d 65 6d 6f 72 79 43 6f 75 6e 74 65 72 73 20 7b  MemoryCounters {
1a800 20 63 68 61 6e 6e 65 6c 20 76 61 72 4e 61 6d 65   channel varName
1a810 20 70 72 65 66 69 78 20 7d 20 7b 0d 0a 20 20 20   prefix } {..   
1a820 20 20 20 69 66 20 7b 5b 68 61 76 65 53 51 4c 69     if {[haveSQLi
1a830 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d  teObjectCommand]
1a840 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1a850 20 20 75 70 76 61 72 20 31 20 24 76 61 72 4e 61    upvar 1 $varNa
1a860 6d 65 20 63 6f 75 6e 74 65 72 0d 0a 0d 0a 20 20  me counter....  
1a870 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
1a880 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
1a890 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1a8a0 22 2d 2d 2d 2d 20 22 20 24 70 72 65 66 69 78 20  "---- " $prefix 
1a8b0 22 20 63 6f 75 6e 74 65 72 20 5c 22 22 20 5c 0d  " counter \"" \.
1a8c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 6f 62  .            [ob
1a8d0 6a 65 63 74 20 69 6e 76 6f 6b 65 20 24 63 6f 75  ject invoke $cou
1a8e0 6e 74 65 72 28 31 29 20 43 6f 75 6e 74 65 72 4e  nter(1) CounterN
1a8f0 61 6d 65 5d 20 22 5c 22 20 76 61 6c 75 65 20 69  ame] "\" value i
1a900 73 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  s " \..         
1a910 20 20 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b     [object invok
1a920 65 20 24 63 6f 75 6e 74 65 72 28 31 29 20 52 61  e $counter(1) Ra
1a930 77 56 61 6c 75 65 5d 20 5c 6e 5d 0d 0a 0d 0a 20  wValue] \n].... 
1a940 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
1a950 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
1a960 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
1a970 20 22 2d 2d 2d 2d 20 22 20 24 70 72 65 66 69 78   "---- " $prefix
1a980 20 22 20 63 6f 75 6e 74 65 72 20 5c 22 22 20 5c   " counter \"" \
1a990 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 6f  ..            [o
1a9a0 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 24 63 6f  bject invoke $co
1a9b0 75 6e 74 65 72 28 32 29 20 43 6f 75 6e 74 65 72  unter(2) Counter
1a9c0 4e 61 6d 65 5d 20 22 5c 22 20 76 61 6c 75 65 20  Name] "\" value 
1a9d0 69 73 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20  is " \..        
1a9e0 20 20 20 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f      [object invo
1a9f0 6b 65 20 24 63 6f 75 6e 74 65 72 28 32 29 20 52  ke $counter(2) R
1aa00 61 77 56 61 6c 75 65 5d 20 5c 6e 5d 0d 0a 0d 0a  awValue] \n]....
1aa10 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
1aa20 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
1aa30 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
1aa40 20 20 22 2d 2d 2d 2d 20 22 20 24 70 72 65 66 69    "---- " $prefi
1aa50 78 20 22 20 63 6f 75 6e 74 65 72 20 5c 22 22 20  x " counter \"" 
1aa60 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
1aa70 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 24 63  object invoke $c
1aa80 6f 75 6e 74 65 72 28 33 29 20 43 6f 75 6e 74 65  ounter(3) Counte
1aa90 72 4e 61 6d 65 5d 20 22 5c 22 20 76 61 6c 75 65  rName] "\" value
1aaa0 20 69 73 20 22 20 5c 0d 0a 20 20 20 20 20 20 20   is " \..       
1aab0 20 20 20 20 20 5b 6f 62 6a 65 63 74 20 69 6e 76       [object inv
1aac0 6f 6b 65 20 24 63 6f 75 6e 74 65 72 28 33 29 20  oke $counter(3) 
1aad0 52 61 77 56 61 6c 75 65 5d 20 5c 6e 5d 0d 0a 20  RawValue] \n].. 
1aae0 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
1aaf0 0d 0a 20 20 20 20 70 72 6f 63 20 63 6f 6c 6c 65  ..    proc colle
1ab00 63 74 47 61 72 62 61 67 65 20 7b 20 63 68 61 6e  ctGarbage { chan
1ab10 6e 65 6c 20 7b 6d 69 6c 6c 69 73 65 63 6f 6e 64  nel {millisecond
1ab20 73 20 31 30 30 30 7d 20 7b 71 75 69 65 74 20 74  s 1000} {quiet t
1ab30 72 75 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20  rue} } {..      
1ab40 69 66 20 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f  if {[haveSQLiteO
1ab50 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74  bjectCommand]} t
1ab60 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69  hen {..        i
1ab70 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  f {[catch {..   
1ab80 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e         object in
1ab90 76 6f 6b 65 20 47 43 20 47 65 74 54 6f 74 61 6c  voke GC GetTotal
1aba0 4d 65 6d 6f 72 79 20 66 61 6c 73 65 0d 0a 20 20  Memory false..  
1abb0 20 20 20 20 20 20 7d 20 72 65 73 75 6c 74 5d 20        } result] 
1abc0 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
1abd0 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
1abe0 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
1abf0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
1ac00 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
1ac10 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
1ac20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6d 65 6d         "---- mem
1ac30 6f 72 79 20 69 6e 20 75 73 65 20 62 79 20 74 68  ory in use by th
1ac40 65 20 43 4c 52 20 62 65 66 6f 72 65 20 63 6f 6c  e CLR before col
1ac50 6c 65 63 74 69 6f 6e 2e 2e 2e 20 22 20 5c 0d 0a  lection... " \..
1ac60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac70 24 72 65 73 75 6c 74 20 22 20 62 79 74 65 73 5c  $result " bytes\
1ac80 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  n"]..          }
1ac90 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65  ..        } else
1aca0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70   {..          tp
1acb0 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
1acc0 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
1acd0 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20            "==== 
1ace0 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20  WARNING: failed 
1acf0 74 6f 20 67 65 74 20 43 4c 52 20 6d 65 6d 6f 72  to get CLR memor
1ad00 79 20 75 73 61 67 65 2c 20 65 72 72 6f 72 3a 20  y usage, error: 
1ad10 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
1ad20 20 20 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20     \n\t $result 
1ad30 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  \n]..        }..
1ad40 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
1ad50 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23   ###############
1ad60 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1ad70 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1ad80 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1ad90 23 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20  ##########....  
1ada0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
1adb0 4f 54 45 3a 20 52 65 70 65 61 74 65 64 6c 79 20  OTE: Repeatedly 
1adc0 61 74 74 65 6d 70 74 20 74 6f 20 63 6f 6c 6c 65  attempt to colle
1add0 63 74 20 67 61 72 62 61 67 65 20 75 6e 74 69 6c  ct garbage until
1ade0 20 74 68 65 20 61 6c 6c 6f 74 74 65 64 20 6e 75   the allotted nu
1adf0 6d 62 65 72 0d 0a 20 20 20 20 20 20 23 20 20 20  mber..      #   
1ae00 20 20 20 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f      of milliseco
1ae10 6e 64 73 20 68 61 73 20 65 6c 61 70 73 65 64 2e  nds has elapsed.
1ae20 20 20 41 6c 77 61 79 73 20 61 74 74 65 6d 70 74    Always attempt
1ae30 20 74 6f 20 63 6f 6c 6c 65 63 74 20 67 61 72 62   to collect garb
1ae40 61 67 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  age..      #    
1ae50 20 20 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65     at least once
1ae60 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
1ae70 20 20 69 66 20 7b 5b 68 61 76 65 53 51 4c 69 74    if {[haveSQLit
1ae80 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d 7d  eObjectCommand]}
1ae90 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1aea0 20 73 65 74 20 73 74 61 72 74 20 5b 63 6c 6f 63   set start [cloc
1aeb0 6b 20 73 65 63 6f 6e 64 73 5d 0d 0a 20 20 20 20  k seconds]..    
1aec0 20 20 20 20 73 65 74 20 73 74 6f 70 20 5b 65 78      set stop [ex
1aed0 70 72 20 7b 24 73 74 61 72 74 20 2b 20 28 24 6d  pr {$start + ($m
1aee0 69 6c 6c 69 73 65 63 6f 6e 64 73 20 2f 20 31 30  illiseconds / 10
1aef0 30 30 29 7d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  00)}]....       
1af00 20 64 6f 20 7b 0d 0a 20 20 20 20 20 20 20 20 20   do {..         
1af10 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
1af20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f  NOTE: Attempt to
1af30 20 66 6f 72 63 65 20 61 20 66 75 6c 6c 20 67 61   force a full ga
1af40 72 62 61 67 65 20 63 6f 6c 6c 65 63 74 69 6f 6e  rbage collection
1af50 20 6e 6f 77 2e 20 20 52 65 70 6f 72 74 20 61 6e   now.  Report an
1af60 79 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20  y..          #  
1af70 20 20 20 20 20 65 72 72 6f 72 20 74 68 61 74 20       error that 
1af80 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69  is encountered i
1af90 66 20 77 65 20 66 61 69 6c 2e 0d 0a 20 20 20 20  f we fail...    
1afa0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1afb0 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d     if {[catch {.
1afc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a  .            obj
1afd0 65 63 74 20 69 6e 76 6f 6b 65 20 47 43 20 47 65  ect invoke GC Ge
1afe0 74 54 6f 74 61 6c 4d 65 6d 6f 72 79 20 74 72 75  tTotalMemory tru
1aff0 65 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65  e..          } e
1b000 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  rror]} then {.. 
1b010 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
1b020 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
1b030 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
1b040 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57           "==== W
1b050 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 66  ARNING: failed f
1b060 75 6c 6c 20 67 61 72 62 61 67 65 20 63 6f 6c 6c  ull garbage coll
1b070 65 63 74 69 6f 6e 2c 20 65 72 72 6f 72 3a 20 22  ection, error: "
1b080 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1b090 20 20 20 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20      \n\t $error 
1b0a0 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  \n]..          }
1b0b0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65  ....          se
1b0c0 74 20 6e 6f 77 20 5b 63 6c 6f 63 6b 20 73 65 63  t now [clock sec
1b0d0 6f 6e 64 73 5d 0d 0a 20 20 20 20 20 20 20 20 7d  onds]..        }
1b0e0 20 77 68 69 6c 65 20 7b 24 73 74 61 72 74 20 3c   while {$start <
1b0f0 3d 20 24 6e 6f 77 20 26 26 20 24 6e 6f 77 20 3c  = $now && $now <
1b100 20 24 73 74 6f 70 7d 0d 0a 20 20 20 20 20 20 7d   $stop}..      }
1b110 0d 0a 0d 0a 20 20 20 20 20 20 23 23 23 23 23 23  ....      ######
1b120 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1b130 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1b140 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1b150 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1b160 23 23 23 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20  ###....      if 
1b170 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f 62 6a 65  {[haveSQLiteObje
1b180 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65 6e  ctCommand]} then
1b190 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   {..        if {
1b1a0 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
1b1b0 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b      object invok
1b1c0 65 20 47 43 20 47 65 74 54 6f 74 61 6c 4d 65 6d  e GC GetTotalMem
1b1d0 6f 72 79 20 66 61 6c 73 65 0d 0a 20 20 20 20 20  ory false..     
1b1e0 20 20 20 7d 20 72 65 73 75 6c 74 5d 20 3d 3d 20     } result] == 
1b1f0 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
1b200 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
1b210 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1b220 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
1b230 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
1b240 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1b250 20 20 20 20 22 2d 2d 2d 2d 20 6d 65 6d 6f 72 79      "---- memory
1b260 20 69 6e 20 75 73 65 20 62 79 20 74 68 65 20 43   in use by the C
1b270 4c 52 20 61 66 74 65 72 20 63 6f 6c 6c 65 63 74  LR after collect
1b280 69 6f 6e 2e 2e 2e 20 22 20 5c 0d 0a 20 20 20 20  ion... " \..    
1b290 20 20 20 20 20 20 20 20 20 20 20 20 24 72 65 73              $res
1b2a0 75 6c 74 20 22 20 62 79 74 65 73 5c 6e 22 5d 0d  ult " bytes\n"].
1b2b0 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
1b2c0 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
1b2d0 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
1b2e0 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
1b2f0 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
1b300 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e        "==== WARN
1b310 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 67  ING: failed to g
1b320 65 74 20 43 4c 52 20 6d 65 6d 6f 72 79 20 75 73  et CLR memory us
1b330 61 67 65 2c 20 65 72 72 6f 72 3a 20 22 20 5c 0d  age, error: " \.
1b340 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c  .              \
1b350 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d  n\t $result \n].
1b360 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
1b370 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
1b380 20 20 20 70 72 6f 63 20 67 65 74 53 51 4c 69 74     proc getSQLit
1b390 65 48 61 6e 64 6c 65 43 6f 75 6e 74 73 20 7b 20  eHandleCounts { 
1b3a0 63 68 61 6e 6e 65 6c 20 7b 71 75 69 65 74 20 66  channel {quiet f
1b3b0 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  alse} } {..     
1b3c0 20 73 65 74 20 72 65 73 75 6c 74 20 5b 6c 69 73   set result [lis
1b3d0 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b  t]....      if {
1b3e0 5b 68 61 76 65 53 51 4c 69 74 65 4f 62 6a 65 63  [haveSQLiteObjec
1b3f0 74 43 6f 6d 6d 61 6e 64 5d 20 26 26 20 5c 0d 0a  tCommand] && \..
1b400 20 20 20 20 20 20 20 20 20 20 5b 68 61 76 65 53            [haveS
1b410 51 4c 69 74 65 44 65 66 69 6e 65 43 6f 6e 73 74  QLiteDefineConst
1b420 61 6e 74 20 43 4f 55 4e 54 5f 48 41 4e 44 4c 45  ant COUNT_HANDLE
1b430 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
1b440 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
1b450 4e 4f 54 45 3a 20 41 64 64 20 65 61 63 68 20 63  NOTE: Add each c
1b460 72 69 74 69 63 61 6c 20 68 61 6e 64 6c 65 20 63  ritical handle c
1b470 6f 75 6e 74 20 74 6f 20 74 68 65 20 72 65 73 75  ount to the resu
1b480 6c 74 69 6e 67 20 6c 69 73 74 2e 0d 0a 20 20 20  lting list...   
1b490 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1b4a0 66 6f 72 65 61 63 68 20 6e 61 6d 65 20 5b 6c 69  foreach name [li
1b4b0 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  st \..          
1b4c0 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 43 6f 75 6e    connectionCoun
1b4d0 74 20 73 74 61 74 65 6d 65 6e 74 43 6f 75 6e 74  t statementCount
1b4e0 20 62 61 63 6b 75 70 43 6f 75 6e 74 20 62 6c 6f   backupCount blo
1b4f0 62 43 6f 75 6e 74 5d 20 7b 0d 0a 20 20 20 20 20  bCount] {..     
1b500 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
1b510 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f  {..            o
1b520 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c  bject invoke -fl
1b530 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c  ags +NonPublic \
1b540 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1b550 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51    System.Data.SQ
1b560 4c 69 74 65 2e 44 65 62 75 67 44 61 74 61 20 24  Lite.DebugData $
1b570 6e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20  name..          
1b580 7d 20 76 61 6c 75 65 5d 20 3d 3d 20 30 7d 20 74  } value] == 0} t
1b590 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1b5a0 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
1b5b0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1b5c0 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
1b5d0 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
1b5e0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1b5f0 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 72 69 74        "---- crit
1b600 69 63 61 6c 20 68 61 6e 64 6c 65 20 63 6f 75 6e  ical handle coun
1b610 74 20 5c 22 22 20 24 6e 61 6d 65 20 22 5c 22 20  t \"" $name "\" 
1b620 69 73 20 22 20 24 76 61 6c 75 65 20 5c 6e 5d 0d  is " $value \n].
1b630 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
1b640 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 61  ..            la
1b650 70 70 65 6e 64 20 72 65 73 75 6c 74 20 24 76 61  ppend result $va
1b660 6c 75 65 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  lue..          }
1b670 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
1b680 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
1b690 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
1b6a0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1b6b0 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47     "==== WARNING
1b6c0 3a 20 66 61 69 6c 65 64 20 74 6f 20 67 65 74 20  : failed to get 
1b6d0 63 72 69 74 69 63 61 6c 20 68 61 6e 64 6c 65 20  critical handle 
1b6e0 63 6f 75 6e 74 20 5c 22 22 20 5c 0d 0a 20 20 20  count \"" \..   
1b6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 24 6e 61               $na
1b700 6d 65 20 22 5c 22 2c 20 65 72 72 6f 72 3a 20 22  me "\", error: "
1b710 20 5c 6e 5c 74 20 24 76 61 6c 75 65 20 5c 6e 5d   \n\t $value \n]
1b720 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
1b730 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1b740 7d 20 65 6c 73 65 69 66 20 7b 21 24 71 75 69 65  } elseif {!$quie
1b750 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
1b760 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
1b770 4e 4f 54 45 3a 20 54 68 65 20 61 63 74 75 61 6c  NOTE: The actual
1b780 20 68 61 6e 64 6c 65 20 63 6f 75 6e 74 73 20 61   handle counts a
1b790 72 65 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  re not available
1b7a0 3b 20 74 68 65 72 65 66 6f 72 65 2c 20 6a 75 73  ; therefore, jus
1b7b0 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  t..        #    
1b7c0 20 20 20 72 65 74 75 72 6e 20 61 6e 20 65 6d 70     return an emp
1b7d0 74 79 20 6c 69 73 74 2e 0d 0a 20 20 20 20 20 20  ty list...      
1b7e0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75    #..        tpu
1b7f0 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d  ts $channel "---
1b800 2d 20 63 72 69 74 69 63 61 6c 20 68 61 6e 64 6c  - critical handl
1b810 65 20 63 6f 75 6e 74 73 20 75 6e 61 76 61 69 6c  e counts unavail
1b820 61 62 6c 65 5c 6e 22 0d 0a 20 20 20 20 20 20 7d  able\n"..      }
1b830 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ....      return
1b840 20 24 72 65 73 75 6c 74 0d 0a 20 20 20 20 7d 0d   $result..    }.
1b850 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 73 68 75  ....    proc shu
1b860 74 64 6f 77 6e 53 51 4c 69 74 65 20 7b 20 63 68  tdownSQLite { ch
1b870 61 6e 6e 65 6c 20 7b 66 6f 72 63 65 20 66 61 6c  annel {force fal
1b880 73 65 7d 20 7b 71 75 69 65 74 20 66 61 6c 73 65  se} {quiet false
1b890 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a  } } {..      #..
1b8a0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4d 61        # NOTE: Ma
1b8b0 6b 65 20 73 75 72 65 20 74 68 61 74 20 53 51 4c  ke sure that SQL
1b8c0 69 74 65 20 63 6f 72 65 20 6c 69 62 72 61 72 79  ite core library
1b8d0 20 69 73 20 63 6f 6d 70 6c 65 74 65 6c 79 20 73   is completely s
1b8e0 68 75 74 64 6f 77 6e 2e 20 20 54 68 69 73 0d 0a  hutdown.  This..
1b8f0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69 73        #       is
1b900 20 75 73 65 64 20 62 79 20 74 65 73 74 73 20 74   used by tests t
1b910 68 61 74 20 63 68 61 6e 67 65 20 63 6f 6e 66 69  hat change confi
1b920 67 75 72 61 74 69 6f 6e 20 6f 70 74 69 6f 6e 73  guration options
1b930 20 61 6e 64 2f 6f 72 20 74 68 6f 73 65 0d 0a 20   and/or those.. 
1b940 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 61       #       tha
1b950 74 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20 73  t need to make s
1b960 75 72 65 20 6c 6f 67 67 69 6e 67 20 69 73 20 69  ure logging is i
1b970 6e 69 74 69 61 6c 69 7a 65 64 20 28 69 2e 65 2e  nitialized (i.e.
1b980 20 6a 75 73 74 20 69 6e 20 63 61 73 65 0d 0a 20   just in case.. 
1b990 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
1b9a0 20 53 51 4c 69 74 65 20 63 6f 72 65 20 6c 69 62   SQLite core lib
1b9b0 72 61 72 79 20 77 61 73 20 69 6e 69 74 69 61 6c  rary was initial
1b9c0 69 7a 65 64 20 69 6e 20 74 68 65 20 70 72 6f 63  ized in the proc
1b9d0 65 73 73 20 70 72 69 6f 72 20 74 6f 0d 0a 20 20  ess prior to..  
1b9e0 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20      #       the 
1b9f0 53 51 4c 69 74 65 4c 6f 67 20 63 6c 61 73 73 20  SQLiteLog class 
1ba00 62 65 69 6e 67 20 61 62 6c 65 20 74 6f 20 73 65  being able to se
1ba10 74 75 70 20 69 74 73 20 6c 6f 67 67 69 6e 67 20  tup its logging 
1ba20 63 61 6c 6c 62 61 63 6b 29 2e 0d 0a 20 20 20 20  callback)...    
1ba30 20 20 23 20 20 20 20 20 20 20 4e 6f 72 6d 61 6c    #       Normal
1ba40 6c 79 2c 20 74 68 69 73 20 73 68 6f 75 6c 64 20  ly, this should 
1ba50 6f 6e 6c 79 20 62 65 20 70 65 72 66 6f 72 6d 65  only be performe
1ba60 64 20 69 66 20 53 51 4c 69 74 65 20 69 73 20 6c  d if SQLite is l
1ba70 6f 61 64 65 64 20 61 6e 64 0d 0a 20 20 20 20 20  oaded and..     
1ba80 20 23 20 20 20 20 20 20 20 72 65 61 64 79 20 66   #       ready f
1ba90 6f 72 20 75 73 65 20 62 79 20 74 68 65 20 74 65  or use by the te
1baa0 73 74 20 73 75 69 74 65 2e 0d 0a 20 20 20 20 20  st suite...     
1bab0 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 66   #..      if {$f
1bac0 6f 72 63 65 20 7c 7c 20 5b 69 73 53 51 4c 69 74  orce || [isSQLit
1bad0 65 52 65 61 64 79 5d 7d 20 74 68 65 6e 20 7b 0d  eReady]} then {.
1bae0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
1baf0 20 20 20 20 23 20 42 55 47 46 49 58 3a 20 4d 61      # BUGFIX: Ma
1bb00 6b 65 20 73 75 72 65 20 74 68 61 74 20 61 6e 79  ke sure that any
1bb10 20 22 6c 65 61 6b 65 64 22 20 74 72 61 6e 73 61   "leaked" transa
1bb20 63 74 69 6f 6e 73 20 61 6e 64 2f 6f 72 20 63 6f  ctions and/or co
1bb30 6e 6e 65 63 74 69 6f 6e 73 0d 0a 20 20 20 20 20  nnections..     
1bb40 20 20 20 23 20 20 20 20 20 20 20 20 20 61 72 65     #         are
1bb50 20 63 6c 65 61 6e 65 64 20 75 70 20 62 65 66 6f   cleaned up befo
1bb60 72 65 20 63 61 6c 6c 69 6e 67 20 74 68 65 20 6e  re calling the n
1bb70 61 74 69 76 65 20 73 68 75 74 64 6f 77 6e 20 66  ative shutdown f
1bb80 75 6e 63 74 69 6f 6e 2e 0d 0a 20 20 20 20 20 20  unction...      
1bb90 20 20 23 0d 0a 20 20 20 20 20 20 20 20 66 6f 72    #..        for
1bba0 65 61 63 68 20 74 72 61 6e 73 61 63 74 69 6f 6e  each transaction
1bbb0 20 5b 69 6e 66 6f 20 74 72 61 6e 73 61 63 74 69   [info transacti
1bbc0 6f 6e 73 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20  ons] {..        
1bbd0 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6d 61    if {[string ma
1bbe0 74 63 68 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  tch \..         
1bbf0 20 20 20 20 20 53 79 73 74 65 6d 23 44 61 74 61       System#Data
1bc00 23 53 51 4c 69 74 65 23 53 51 4c 69 74 65 54 72  #SQLite#SQLiteTr
1bc10 61 6e 73 61 63 74 69 6f 6e 23 2a 20 24 74 72 61  ansaction#* $tra
1bc20 6e 73 61 63 74 69 6f 6e 5d 7d 20 74 68 65 6e 20  nsaction]} then 
1bc30 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  {..            i
1bc40 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  f {[catch {..   
1bc50 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 20 74             sql t
1bc60 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62  ransaction rollb
1bc70 61 63 6b 20 24 74 72 61 6e 73 61 63 74 69 6f 6e  ack $transaction
1bc80 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20  ..            } 
1bc90 65 72 72 6f 72 5d 20 3d 3d 20 30 7d 20 74 68 65  error] == 0} the
1bca0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
1bcb0 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
1bcc0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1bcd0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
1bce0 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
1bcf0 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
1bd00 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
1bd10 72 6f 6c 6c 65 64 20 62 61 63 6b 20 6c 65 61 6b  rolled back leak
1bd20 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 5c  ed transaction \
1bd30 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  "" \..          
1bd40 20 20 20 20 20 20 20 20 20 20 24 74 72 61 6e 73            $trans
1bd50 61 63 74 69 6f 6e 20 5c 22 5c 6e 5d 0d 0a 20 20  action \"\n]..  
1bd60 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
1bd70 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73             } els
1bd80 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e {..           
1bd90 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
1bda0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1bdb0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
1bdc0 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
1bdd0 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
1bde0 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20            "==== 
1bdf0 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20  WARNING: failed 
1be00 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 6c 65 61 6b  to rollback leak
1be10 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 5c  ed transaction \
1be20 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  "" \..          
1be30 20 20 20 20 20 20 20 20 20 20 24 74 72 61 6e 73            $trans
1be40 61 63 74 69 6f 6e 20 22 5c 22 2c 20 65 72 72 6f  action "\", erro
1be50 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72  r: " \n\t $error
1be60 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \n]..          
1be70 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
1be80 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
1be90 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  }..        }....
1bea0 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
1beb0 64 62 20 5b 69 6e 66 6f 20 63 6f 6e 6e 65 63 74  db [info connect
1bec0 69 6f 6e 73 5d 20 7b 0d 0a 20 20 20 20 20 20 20  ions] {..       
1bed0 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6d     if {[string m
1bee0 61 74 63 68 20 5c 0d 0a 20 20 20 20 20 20 20 20  atch \..        
1bef0 20 20 20 20 20 20 53 79 73 74 65 6d 23 44 61 74        System#Dat
1bf00 61 23 53 51 4c 69 74 65 23 53 51 4c 69 74 65 43  a#SQLite#SQLiteC
1bf10 6f 6e 6e 65 63 74 69 6f 6e 23 2a 20 24 64 62 5d  onnection#* $db]
1bf20 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1bf30 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
1bf40 20 7b 73 71 6c 20 63 6c 6f 73 65 20 24 64 62 7d   {sql close $db}
1bf50 20 65 72 72 6f 72 5d 20 3d 3d 20 30 7d 20 74 68   error] == 0} th
1bf60 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
1bf70 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
1bf80 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1bf90 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
1bfa0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
1bfb0 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
1bfc0 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
1bfd0 20 63 6c 6f 73 65 64 20 6c 65 61 6b 65 64 20 64   closed leaked d
1bfe0 61 74 61 62 61 73 65 20 5c 22 22 20 24 64 62 20  atabase \"" $db 
1bff0 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  \"\n]..         
1c000 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
1c010 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
1c020 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
1c030 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
1c040 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1c050 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
1c060 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
1c070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c080 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47     "==== WARNING
1c090 3a 20 66 61 69 6c 65 64 20 74 6f 20 63 6c 6f 73  : failed to clos
1c0a0 65 20 6c 65 61 6b 65 64 20 64 61 74 61 62 61 73  e leaked databas
1c0b0 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20  e \"" \..       
1c0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 24 64 62               $db
1c0d0 20 22 5c 22 2c 20 65 72 72 6f 72 3a 20 22 20 5c   "\", error: " \
1c0e0 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a  n\t $error \n]..
1c0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
1c100 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
1c110 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
1c120 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
1c130 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 42    #..        # B
1c140 55 47 46 49 58 3a 20 42 65 66 6f 72 65 20 63 61  UGFIX: Before ca
1c150 6c 6c 69 6e 67 20 74 68 65 20 6e 61 74 69 76 65  lling the native
1c160 20 73 68 75 74 64 6f 77 6e 20 66 75 6e 63 74 69   shutdown functi
1c170 6f 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 62 6f  on, make sure bo
1c180 74 68 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  th..        #   
1c190 20 20 20 20 20 20 6f 66 20 74 68 65 20 50 52 41        of the PRA
1c1a0 47 4d 41 20 72 65 6c 61 74 65 64 20 64 69 72 65  GMA related dire
1c1b0 63 74 6f 72 79 20 6e 61 6d 65 73 20 61 72 65 20  ctory names are 
1c1c0 66 72 65 65 64 2e 0d 0a 20 20 20 20 20 20 20 20  freed...        
1c1d0 23 0d 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b  #..        check
1c1e0 46 6f 72 53 51 4c 69 74 65 44 69 72 65 63 74 6f  ForSQLiteDirecto
1c1f0 72 69 65 73 20 24 63 68 61 6e 6e 65 6c 20 74 72  ries $channel tr
1c200 75 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66  ue....        if
1c210 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
1c220 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76        object inv
1c230 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50  oke -flags +NonP
1c240 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20  ublic \..       
1c250 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61         System.Da
1c260 74 61 2e 53 51 4c 69 74 65 2e 55 6e 73 61 66 65  ta.SQLite.Unsafe
1c270 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 20 73 71  NativeMethods sq
1c280 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 0d 0a  lite3_shutdown..
1c290 20 20 20 20 20 20 20 20 7d 20 72 65 73 75 6c 74          } result
1c2a0 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
1c2b0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24            if {!$
1c2c0 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
1c2d0 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
1c2e0 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
1c2f0 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
1c300 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63           "---- c
1c310 61 6c 6c 20 73 71 6c 69 74 65 33 5f 73 68 75 74  all sqlite3_shut
1c320 64 6f 77 6e 28 29 2e 2e 2e 20 6f 6b 3a 20 22 20  down()... ok: " 
1c330 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20  $result \n]..   
1c340 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1c350 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
1c360 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
1c370 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
1c380 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
1c390 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
1c3a0 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
1c3b0 20 20 20 20 20 22 2d 2d 2d 2d 20 63 61 6c 6c 20       "---- call 
1c3c0 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e  sqlite3_shutdown
1c3d0 28 29 2e 2e 2e 20 65 72 72 6f 72 3a 20 22 20 5c  ()... error: " \
1c3e0 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d  n\t $result \n].
1c3f0 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
1c400 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
1c410 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
1c420 70 72 6f 63 20 72 65 70 6f 72 74 53 51 4c 69 74  proc reportSQLit
1c430 65 52 65 73 6f 75 72 63 65 73 20 7b 0d 0a 20 20  eResources {..  
1c440 20 20 20 20 20 20 20 20 20 20 63 68 61 6e 6e 65            channe
1c450 6c 20 7b 71 75 69 65 74 20 66 61 6c 73 65 7d 20  l {quiet false} 
1c460 7b 72 65 73 65 74 20 74 72 75 65 7d 20 7b 63 6f  {reset true} {co
1c470 6c 6c 65 63 74 20 74 72 75 65 7d 20 7d 20 7b 0d  llect true} } {.
1c480 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
1c490 23 20 4e 4f 54 45 3a 20 49 66 20 61 76 61 69 6c  # NOTE: If avail
1c4a0 61 62 6c 65 2c 20 72 65 70 6f 72 74 20 6f 6e 20  able, report on 
1c4b0 28 61 6e 64 20 70 6f 73 73 69 62 6c 79 20 72 65  (and possibly re
1c4c0 73 65 74 29 20 74 68 65 20 72 75 6e 74 69 6d 65  set) the runtime
1c4d0 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
1c4e0 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 73 74  configuration st
1c4f0 61 74 69 73 74 69 63 73 2e 0d 0a 20 20 20 20 20  atistics...     
1c500 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 68   #..      if {[h
1c510 61 76 65 53 51 4c 69 74 65 4f 62 6a 65 63 74 43  aveSQLiteObjectC
1c520 6f 6d 6d 61 6e 64 5d 20 26 26 20 5c 0d 0a 20 20  ommand] && \..  
1c530 20 20 20 20 20 20 20 20 5b 68 61 76 65 43 6f 6e          [haveCon
1c540 73 74 72 61 69 6e 74 20 62 75 69 6c 64 43 6f 6e  straint buildCon
1c550 66 69 67 75 72 61 74 69 6f 6e 2e 44 65 62 75 67  figuration.Debug
1c560 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
1c570 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d     if {[catch {.
1c580 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63  .          objec
1c590 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20  t invoke -flags 
1c5a0 2b 4e 6f 6e 50 75 62 6c 69 63 20 2d 61 6c 69 61  +NonPublic -alia
1c5b0 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
1c5c0 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53     System.Data.S
1c5d0 51 4c 69 74 65 2e 44 65 62 75 67 44 61 74 61 20  QLite.DebugData 
1c5e0 73 65 74 74 69 6e 67 52 65 61 64 43 6f 75 6e 74  settingReadCount
1c5f0 73 0d 0a 20 20 20 20 20 20 20 20 7d 20 73 65 74  s..        } set
1c600 74 69 6e 67 52 65 61 64 43 6f 75 6e 74 73 5d 20  tingReadCounts] 
1c610 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
1c620 20 20 20 20 20 20 20 20 73 65 74 20 6e 61 6d 65          set name
1c630 43 6f 75 6e 74 20 5b 24 73 65 74 74 69 6e 67 52  Count [$settingR
1c640 65 61 64 43 6f 75 6e 74 73 20 43 6f 75 6e 74 5d  eadCounts Count]
1c650 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
1c660 76 61 6c 75 65 43 6f 75 6e 74 20 30 0d 0a 0d 0a  valueCount 0....
1c670 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74            object
1c680 20 66 6f 72 65 61 63 68 20 2d 61 6c 69 61 73 20   foreach -alias 
1c690 70 61 69 72 20 24 73 65 74 74 69 6e 67 52 65 61  pair $settingRea
1c6a0 64 43 6f 75 6e 74 73 20 7b 0d 0a 20 20 20 20 20  dCounts {..     
1c6b0 20 20 20 20 20 20 20 69 6e 63 72 20 76 61 6c 75         incr valu
1c6c0 65 43 6f 75 6e 74 20 5b 24 70 61 69 72 20 56 61  eCount [$pair Va
1c6d0 6c 75 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  lue]....        
1c6e0 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
1c6f0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1c700 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
1c710 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
1c720 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
1c730 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 65 74         "---- set
1c740 74 69 6e 67 20 5c 22 22 20 5b 24 70 61 69 72 20  ting \"" [$pair 
1c750 4b 65 79 5d 20 22 5c 22 20 77 61 73 20 72 65 61  Key] "\" was rea
1c760 64 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  d " \..         
1c770 20 20 20 20 20 20 20 20 20 5b 24 70 61 69 72 20           [$pair 
1c780 56 61 6c 75 65 5d 20 22 20 74 69 6d 65 73 5c 6e  Value] " times\n
1c790 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  "]..            
1c7a0 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  }..          }..
1c7b0 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
1c7c0 24 72 65 73 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $reset} then {..
1c7d0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
1c7e0 5b 63 61 74 63 68 20 7b 24 73 65 74 74 69 6e 67  [catch {$setting
1c7f0 52 65 61 64 43 6f 75 6e 74 73 20 43 6c 65 61 72  ReadCounts Clear
1c800 7d 20 65 72 72 6f 72 5d 20 3d 3d 20 30 7d 20 74  } error] == 0} t
1c810 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1c820 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
1c830 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1c840 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
1c850 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
1c860 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
1c870 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
1c880 2d 20 72 65 73 65 74 20 73 65 74 74 69 6e 67 20  - reset setting 
1c890 73 74 61 74 69 73 74 69 63 73 20 66 6f 72 20 74  statistics for t
1c8a0 68 65 20 70 72 65 76 69 6f 75 73 20 22 20 5c 0d  he previous " \.
1c8b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1c8c0 20 20 20 20 20 24 6e 61 6d 65 43 6f 75 6e 74 20       $nameCount 
1c8d0 22 20 6e 61 6d 65 73 20 61 6e 64 20 22 20 24 76  " names and " $v
1c8e0 61 6c 75 65 43 6f 75 6e 74 20 22 20 76 61 6c 75  alueCount " valu
1c8f0 65 73 20 72 65 61 64 5c 6e 22 5d 0d 0a 20 20 20  es read\n"]..   
1c900 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
1c910 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
1c920 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1c930 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
1c940 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
1c950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c960 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a    "==== WARNING:
1c970 20 66 61 69 6c 65 64 20 74 6f 20 72 65 73 65 74   failed to reset
1c980 20 73 65 74 74 69 6e 67 20 73 74 61 74 69 73 74   setting statist
1c990 69 63 73 20 66 6f 72 20 22 20 5c 0d 0a 20 20 20  ics for " \..   
1c9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1c9b0 74 68 65 20 70 72 65 76 69 6f 75 73 20 22 20 24  the previous " $
1c9c0 6e 61 6d 65 43 6f 75 6e 74 20 22 20 6e 61 6d 65  nameCount " name
1c9d0 73 20 61 6e 64 20 22 20 24 76 61 6c 75 65 43 6f  s and " $valueCo
1c9e0 75 6e 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  unt \..         
1c9f0 20 20 20 20 20 20 20 20 20 22 20 76 61 6c 75 65           " value
1ca00 73 20 72 65 61 64 2c 20 65 72 72 6f 72 3a 20 22  s read, error: "
1ca10 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d   \n\t $error \n]
1ca20 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
1ca30 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
1ca40 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
1ca50 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d     if {[catch {.
1ca60 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63  .          objec
1ca70 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20  t invoke -flags 
1ca80 2b 4e 6f 6e 50 75 62 6c 69 63 20 2d 61 6c 69 61  +NonPublic -alia
1ca90 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
1caa0 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53     System.Data.S
1cab0 51 4c 69 74 65 2e 44 65 62 75 67 44 61 74 61 20  QLite.DebugData 
1cac0 73 65 74 74 69 6e 67 46 69 6c 65 52 65 61 64 43  settingFileReadC
1cad0 6f 75 6e 74 73 0d 0a 20 20 20 20 20 20 20 20 7d  ounts..        }
1cae0 20 73 65 74 74 69 6e 67 46 69 6c 65 52 65 61 64   settingFileRead
1caf0 43 6f 75 6e 74 73 5d 20 3d 3d 20 30 7d 20 74 68  Counts] == 0} th
1cb00 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
1cb10 73 65 74 20 6e 61 6d 65 43 6f 75 6e 74 20 5b 24  set nameCount [$
1cb20 73 65 74 74 69 6e 67 46 69 6c 65 52 65 61 64 43  settingFileReadC
1cb30 6f 75 6e 74 73 20 43 6f 75 6e 74 5d 0d 0a 20 20  ounts Count]..  
1cb40 20 20 20 20 20 20 20 20 73 65 74 20 76 61 6c 75          set valu
1cb50 65 43 6f 75 6e 74 20 30 0d 0a 0d 0a 20 20 20 20  eCount 0....    
1cb60 20 20 20 20 20 20 6f 62 6a 65 63 74 20 66 6f 72        object for
1cb70 65 61 63 68 20 2d 61 6c 69 61 73 20 70 61 69 72  each -alias pair
1cb80 20 24 73 65 74 74 69 6e 67 46 69 6c 65 52 65 61   $settingFileRea
1cb90 64 43 6f 75 6e 74 73 20 7b 0d 0a 20 20 20 20 20  dCounts {..     
1cba0 20 20 20 20 20 20 20 69 6e 63 72 20 76 61 6c 75         incr valu
1cbb0 65 43 6f 75 6e 74 20 5b 24 70 61 69 72 20 56 61  eCount [$pair Va
1cbc0 6c 75 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  lue]....        
1cbd0 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
1cbe0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1cbf0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
1cc00 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
1cc10 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
1cc20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 65 74         "---- set
1cc30 74 69 6e 67 20 5c 22 22 20 5b 24 70 61 69 72 20  ting \"" [$pair 
1cc40 4b 65 79 5d 20 22 5c 22 20 77 61 73 20 72 65 61  Key] "\" was rea
1cc50 64 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  d " \..         
1cc60 20 20 20 20 20 20 20 20 20 5b 24 70 61 69 72 20           [$pair 
1cc70 56 61 6c 75 65 5d 20 22 20 74 69 6d 65 73 20 66  Value] " times f
1cc80 72 6f 6d 20 74 68 65 20 63 6f 6e 66 69 67 75 72  rom the configur
1cc90 61 74 69 6f 6e 20 66 69 6c 65 5c 6e 22 5d 0d 0a  ation file\n"]..
1cca0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
1ccb0 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
1ccc0 20 20 20 20 20 20 20 20 69 66 20 7b 24 72 65 73          if {$res
1ccd0 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
1cce0 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
1ccf0 63 68 20 7b 24 73 65 74 74 69 6e 67 46 69 6c 65  ch {$settingFile
1cd00 52 65 61 64 43 6f 75 6e 74 73 20 43 6c 65 61 72  ReadCounts Clear
1cd10 7d 20 65 72 72 6f 72 5d 20 3d 3d 20 30 7d 20 74  } error] == 0} t
1cd20 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1cd30 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
1cd40 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1cd50 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
1cd60 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
1cd70 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
1cd80 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
1cd90 2d 20 72 65 73 65 74 20 73 65 74 74 69 6e 67 20  - reset setting 
1cda0 73 74 61 74 69 73 74 69 63 73 20 66 6f 72 20 74  statistics for t
1cdb0 68 65 20 70 72 65 76 69 6f 75 73 20 22 20 5c 0d  he previous " \.
1cdc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1cdd0 20 20 20 20 20 24 6e 61 6d 65 43 6f 75 6e 74 20       $nameCount 
1cde0 22 20 6e 61 6d 65 73 20 61 6e 64 20 22 20 24 76  " names and " $v
1cdf0 61 6c 75 65 43 6f 75 6e 74 20 22 20 76 61 6c 75  alueCount " valu
1ce00 65 73 20 72 65 61 64 20 22 20 5c 0d 0a 20 20 20  es read " \..   
1ce10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce20 20 22 66 72 6f 6d 20 74 68 65 20 63 6f 6e 66 69   "from the confi
1ce30 67 75 72 61 74 69 6f 6e 20 66 69 6c 65 5c 6e 22  guration file\n"
1ce40 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ]..             
1ce50 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
1ce60 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
1ce70 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
1ce80 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
1ce90 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
1cea0 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41          "==== WA
1ceb0 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f  RNING: failed to
1cec0 20 72 65 73 65 74 20 73 65 74 74 69 6e 67 20 73   reset setting s
1ced0 74 61 74 69 73 74 69 63 73 20 66 6f 72 20 22 20  tatistics for " 
1cee0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1cef0 20 20 20 20 20 22 74 68 65 20 70 72 65 76 69 6f       "the previo
1cf00 75 73 20 22 20 24 6e 61 6d 65 43 6f 75 6e 74 20  us " $nameCount 
1cf10 22 20 6e 61 6d 65 73 20 61 6e 64 20 22 20 24 76  " names and " $v
1cf20 61 6c 75 65 43 6f 75 6e 74 20 5c 0d 0a 20 20 20  alueCount \..   
1cf30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1cf40 20 76 61 6c 75 65 73 20 72 65 61 64 20 66 72 6f   values read fro
1cf50 6d 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74  m the configurat
1cf60 69 6f 6e 20 66 69 6c 65 2c 20 65 72 72 6f 72 3a  ion file, error:
1cf70 20 22 20 5c 6e 5c 74 20 5c 0d 0a 20 20 20 20 20   " \n\t \..     
1cf80 20 20 20 20 20 20 20 20 20 20 20 20 20 24 65 72               $er
1cf90 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ror \n]..       
1cfa0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
1cfb0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
1cfc0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
1cfd0 20 69 66 20 7b 5b 68 61 76 65 53 51 4c 69 74 65   if {[haveSQLite
1cfe0 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d 20 26  ObjectCommand] &
1cff0 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b  & \..          [
1d000 68 61 76 65 53 51 4c 69 74 65 44 65 66 69 6e 65  haveSQLiteDefine
1d010 43 6f 6e 73 74 61 6e 74 20 49 4e 54 45 52 4f 50  Constant INTEROP
1d020 5f 56 49 52 54 55 41 4c 5f 54 41 42 4c 45 5d 20  _VIRTUAL_TABLE] 
1d030 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
1d040 5b 68 61 76 65 53 51 4c 69 74 65 44 65 66 69 6e  [haveSQLiteDefin
1d050 65 43 6f 6e 73 74 61 6e 74 20 54 52 41 43 4b 5f  eConstant TRACK_
1d060 4d 45 4d 4f 52 59 5f 42 59 54 45 53 5d 7d 20 74  MEMORY_BYTES]} t
1d070 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69  hen {..        i
1d080 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
1d090 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70   {..          tp
1d0a0 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d  uts $channel "--
1d0b0 2d 2d 20 63 75 72 72 65 6e 74 20 6d 65 6d 6f 72  -- current memor
1d0c0 79 20 69 6e 20 75 73 65 20 62 79 20 53 51 4c 69  y in use by SQLi
1d0d0 74 65 4d 65 6d 6f 72 79 2e 2e 2e 20 22 0d 0a 20  teMemory... ".. 
1d0e0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
1d0f0 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
1d100 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65  ..          obje
1d110 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73  ct invoke -flags
1d120 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20   +NonPublic \.. 
1d130 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73               Sys
1d140 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
1d150 53 51 4c 69 74 65 4d 65 6d 6f 72 79 20 62 79 74  SQLiteMemory byt
1d160 65 73 41 6c 6c 6f 63 61 74 65 64 0d 0a 20 20 20  esAllocated..   
1d170 20 20 20 20 20 7d 20 6d 65 6d 6f 72 79 5d 20 3d       } memory] =
1d180 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
1d190 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
1d1a0 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
1d1b0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
1d1c0 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
1d1d0 67 73 20 24 6d 65 6d 6f 72 79 20 22 20 62 79 74  gs $memory " byt
1d1e0 65 73 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20  es\n"]..        
1d1f0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65    }..        } e
1d200 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
1d210 20 73 65 74 20 6d 65 6d 6f 72 79 20 75 6e 6b 6e   set memory unkn
1d220 6f 77 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  own....         
1d230 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
1d240 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
1d250 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
1d260 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65   [appendArgs $me
1d270 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  mory \n]..      
1d280 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
1d290 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b  ....        if {
1d2a0 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
1d2b0 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
1d2c0 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20   $channel "---- 
1d2d0 6d 61 78 69 6d 75 6d 20 6d 65 6d 6f 72 79 20 69  maximum memory i
1d2e0 6e 20 75 73 65 20 62 79 20 53 51 4c 69 74 65 4d  n use by SQLiteM
1d2f0 65 6d 6f 72 79 2e 2e 2e 20 22 0d 0a 20 20 20 20  emory... "..    
1d300 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
1d310 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
1d320 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20           object 
1d330 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e  invoke -flags +N
1d340 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20  onPublic \..    
1d350 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d            System
1d360 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c  .Data.SQLite.SQL
1d370 69 74 65 4d 65 6d 6f 72 79 20 6d 61 78 69 6d 75  iteMemory maximu
1d380 6d 42 79 74 65 73 41 6c 6c 6f 63 61 74 65 64 0d  mBytesAllocated.
1d390 0a 20 20 20 20 20 20 20 20 7d 20 6d 65 6d 6f 72  .        } memor
1d3a0 79 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  y] == 0} then {.
1d3b0 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21  .          if {!
1d3c0 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
1d3d0 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
1d3e0 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
1d3f0 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 22  ndArgs $memory "
1d400 20 62 79 74 65 73 5c 6e 22 5d 0d 0a 20 20 20 20   bytes\n"]..    
1d410 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
1d420 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
1d430 20 20 20 20 20 73 65 74 20 6d 65 6d 6f 72 79 20       set memory 
1d440 75 6e 6b 6e 6f 77 6e 0d 0a 0d 0a 20 20 20 20 20  unknown....     
1d450 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
1d460 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1d470 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
1d480 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
1d490 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20   $memory \n]..  
1d4a0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
1d4b0 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d     }..      }...
1d4c0 0a 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69  .      if {!$qui
1d4d0 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
1d4e0 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
1d4f0 65 6c 20 22 2d 2d 2d 2d 20 63 75 72 72 65 6e 74  el "---- current
1d500 20 6d 65 6d 6f 72 79 20 69 6e 20 75 73 65 20 62   memory in use b
1d510 79 20 53 51 4c 69 74 65 2e 2e 2e 20 22 0d 0a 20  y SQLite... ".. 
1d520 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
1d530 69 66 20 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f  if {[haveSQLiteO
1d540 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74  bjectCommand]} t
1d550 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69  hen {..        i
1d560 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  f {[catch {..   
1d570 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e         object in
1d580 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e  voke -flags +Non
1d590 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20  Public \..      
1d5a0 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44          System.D
1d5b0 61 74 61 2e 53 51 4c 69 74 65 2e 55 6e 73 61 66  ata.SQLite.Unsaf
1d5c0 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 20 73  eNativeMethods s
1d5d0 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 75 73  qlite3_memory_us
1d5e0 65 64 0d 0a 20 20 20 20 20 20 20 20 7d 20 6d 65  ed..        } me
1d5f0 6d 6f 72 79 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  mory] == 0} then
1d600 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   {..          if
1d610 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
1d620 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
1d630 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
1d640 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72  ppendArgs $memor
1d650 79 20 22 20 62 79 74 65 73 5c 6e 22 5d 0d 0a 20  y " bytes\n"].. 
1d660 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
1d670 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
1d680 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1d690 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4d 61 79       # NOTE: May
1d6a0 62 65 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f  be the SQLite co
1d6b0 72 65 20 6c 69 62 72 61 72 79 20 69 73 20 75 6e  re library is un
1d6c0 61 76 61 69 6c 61 62 6c 65 3f 0d 0a 20 20 20 20  available?..    
1d6d0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1d6e0 20 20 20 73 65 74 20 6d 65 6d 6f 72 79 20 75 6e     set memory un
1d6f0 6b 6e 6f 77 6e 0d 0a 0d 0a 20 20 20 20 20 20 20  known....       
1d700 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
1d710 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1d720 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
1d730 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24  el [appendArgs $
1d740 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20 20  memory \n]..    
1d750 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
1d760 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65   }..      } else
1d770 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   {..        set 
1d780 6d 65 6d 6f 72 79 20 75 6e 61 76 61 69 6c 61 62  memory unavailab
1d790 6c 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66  le....        if
1d7a0 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
1d7b0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75  {..          tpu
1d7c0 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
1d7d0 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20  endArgs $memory 
1d7e0 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  \n]..        }..
1d7f0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
1d800 20 73 65 74 20 72 65 73 75 6c 74 20 24 6d 65 6d   set result $mem
1d810 6f 72 79 3b 20 23 20 4e 4f 54 45 3a 20 52 65 74  ory; # NOTE: Ret
1d820 75 72 6e 20 6d 65 6d 6f 72 79 20 69 6e 2d 75 73  urn memory in-us
1d830 65 20 74 6f 20 6f 75 72 20 63 61 6c 6c 65 72 2e  e to our caller.
1d840 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 24  ....      if {!$
1d850 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
1d860 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
1d870 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 6d 61 78 69  annel "---- maxi
1d880 6d 75 6d 20 6d 65 6d 6f 72 79 20 69 6e 20 75 73  mum memory in us
1d890 65 20 62 79 20 53 51 4c 69 74 65 2e 2e 2e 20 22  e by SQLite... "
1d8a0 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
1d8b0 20 20 20 69 66 20 7b 5b 68 61 76 65 53 51 4c 69     if {[haveSQLi
1d8c0 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d  teObjectCommand]
1d8d0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1d8e0 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
1d8f0 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74            object
1d900 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b   invoke -flags +
1d910 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20  NonPublic \..   
1d920 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65             Syste
1d930 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 55 6e  m.Data.SQLite.Un
1d940 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64  safeNativeMethod
1d950 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
1d960 20 20 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72     sqlite3_memor
1d970 79 5f 68 69 67 68 77 61 74 65 72 20 30 0d 0a 20  y_highwater 0.. 
1d980 20 20 20 20 20 20 20 7d 20 6d 65 6d 6f 72 79 5d         } memory]
1d990 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
1d9a0 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71           if {!$q
1d9b0 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
1d9c0 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
1d9d0 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
1d9e0 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 22 20 62  Args $memory " b
1d9f0 79 74 65 73 5c 6e 22 5d 0d 0a 20 20 20 20 20 20  ytes\n"]..      
1da00 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
1da10 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
1da20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
1da30 23 20 4e 4f 54 45 3a 20 4d 61 79 62 65 20 74 68  # NOTE: Maybe th
1da40 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20 6c 69  e SQLite core li
1da50 62 72 61 72 79 20 69 73 20 75 6e 61 76 61 69 6c  brary is unavail
1da60 61 62 6c 65 3f 0d 0a 20 20 20 20 20 20 20 20 20  able?..         
1da70 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   #..          se
1da80 74 20 6d 65 6d 6f 72 79 20 75 6e 6b 6e 6f 77 6e  t memory unknown
1da90 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66  ....          if
1daa0 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
1dab0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
1dac0 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
1dad0 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72  ppendArgs $memor
1dae0 79 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  y \n]..         
1daf0 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20   }..        }.. 
1db00 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
1db10 20 20 20 20 20 20 20 73 65 74 20 6d 65 6d 6f 72         set memor
1db20 79 20 75 6e 61 76 61 69 6c 61 62 6c 65 0d 0a 0d  y unavailable...
1db30 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71  .        if {!$q
1db40 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
1db50 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
1db60 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
1db70 67 73 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a  gs $memory \n]..
1db80 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
1db90 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b   }....      if {
1dba0 24 63 6f 6c 6c 65 63 74 7d 20 74 68 65 6e 20 7b  $collect} then {
1dbb0 0d 0a 20 20 20 20 20 20 20 20 63 6f 6c 6c 65 63  ..        collec
1dbc0 74 47 61 72 62 61 67 65 20 24 63 68 61 6e 6e 65  tGarbage $channe
1dbd0 6c 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  l..      }....  
1dbe0 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
1dbf0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1dc00 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
1dc10 22 2d 2d 2d 2d 20 63 75 72 72 65 6e 74 20 6d 65  "---- current me
1dc20 6d 6f 72 79 20 69 6e 20 75 73 65 20 62 79 20 74  mory in use by t
1dc30 68 65 20 43 4c 52 2e 2e 2e 20 22 0d 0a 20 20 20  he CLR... "..   
1dc40 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66     }....      if
1dc50 20 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f 62 6a   {[haveSQLiteObj
1dc60 65 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65  ectCommand]} the
1dc70 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20  n {..        if 
1dc80 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
1dc90 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f       object invo
1dca0 6b 65 20 47 43 20 47 65 74 54 6f 74 61 6c 4d 65  ke GC GetTotalMe
1dcb0 6d 6f 72 79 20 66 61 6c 73 65 0d 0a 20 20 20 20  mory false..    
1dcc0 20 20 20 20 7d 20 6d 65 6d 6f 72 79 5d 20 3d 3d      } memory] ==
1dcd0 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
1dce0 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
1dcf0 67 20 69 73 20 69 6e 74 65 67 65 72 20 2d 73 74  g is integer -st
1dd00 72 69 63 74 20 24 6d 65 6d 6f 72 79 5d 7d 20 74  rict $memory]} t
1dd10 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1dd20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
1dd30 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1dd40 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
1dd50 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
1dd60 20 24 6d 65 6d 6f 72 79 20 22 20 62 79 74 65 73   $memory " bytes
1dd70 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  \n"]..          
1dd80 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d    }..          }
1dd90 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
1dda0 20 20 20 20 20 73 65 74 20 6d 65 6d 6f 72 79 20       set memory 
1ddb0 69 6e 76 61 6c 69 64 0d 0a 0d 0a 20 20 20 20 20  invalid....     
1ddc0 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
1ddd0 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
1dde0 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
1ddf0 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
1de00 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d  Args $memory \n]
1de10 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
1de20 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
1de30 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
1de40 20 20 20 20 20 20 20 20 20 20 73 65 74 20 6d 65            set me
1de50 6d 6f 72 79 20 75 6e 6b 6e 6f 77 6e 0d 0a 0d 0a  mory unknown....
1de60 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24            if {!$
1de70 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
1de80 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
1de90 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
1dea0 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 5c 6e  dArgs $memory \n
1deb0 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ]..          }..
1dec0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
1ded0 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
1dee0 20 20 20 73 65 74 20 6d 65 6d 6f 72 79 20 75 6e     set memory un
1def0 61 76 61 69 6c 61 62 6c 65 0d 0a 0d 0a 20 20 20  available....   
1df00 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
1df10 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1df20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
1df30 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24  el [appendArgs $
1df40 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20 20  memory \n]..    
1df50 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
1df60 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 24  ..      return $
1df70 72 65 73 75 6c 74 0d 0a 20 20 20 20 7d 0d 0a 0c  result..    }...
1df80 0d 0a 20 20 20 20 70 72 6f 63 20 63 68 65 63 6b  ..    proc check
1df90 46 6f 72 53 51 4c 69 74 65 44 69 72 65 63 74 6f  ForSQLiteDirecto
1dfa0 72 69 65 73 20 7b 20 63 68 61 6e 6e 65 6c 20 7b  ries { channel {
1dfb0 72 65 73 65 74 20 66 61 6c 73 65 7d 20 7d 20 7b  reset false} } {
1dfc0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
1dfd0 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69   # NOTE: Check i
1dfe0 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f 77 69  f the sqlite3_wi
1dff0 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72  n32_set_director
1e000 79 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 76  y function is av
1e010 61 69 6c 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20  ailable...      
1e020 23 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20 24  #..      tputs $
1e030 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20  channel \..     
1e040 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65 63 6b       "---- check
1e050 69 6e 67 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e  ing for function
1e060 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73   sqlite3_win32_s
1e070 65 74 5f 64 69 72 65 63 74 6f 72 79 2e 2e 2e 20  et_directory... 
1e080 22 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  "....      #..  
1e090 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73      # NOTE: This
1e0a0 20 63 61 6c 6c 20 74 6f 20 74 68 65 20 73 71 6c   call to the sql
1e0b0 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64  ite3_win32_set_d
1e0c0 69 72 65 63 74 6f 72 79 20 66 75 6e 63 74 69 6f  irectory functio
1e0d0 6e 20 75 73 65 73 20 74 68 65 0d 0a 20 20 20 20  n uses the..    
1e0e0 20 20 23 20 20 20 20 20 20 20 69 6e 76 61 6c 69    #       invali
1e0f0 64 20 76 61 6c 75 65 20 30 20 66 6f 72 20 74 68  d value 0 for th
1e100 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
1e110 2e 20 20 54 68 69 73 20 63 6f 64 65 20 69 73 20  .  This code is 
1e120 64 65 73 69 67 6e 65 64 0d 0a 20 20 20 20 20 20  designed..      
1e130 23 20 20 20 20 20 20 20 74 6f 20 63 68 65 63 6b  #       to check
1e140 20 69 66 20 63 61 6c 6c 69 6e 67 20 74 68 65 20   if calling the 
1e150 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 72 61  function will ra
1e160 69 73 65 20 61 6e 20 65 78 63 65 70 74 69 6f 6e  ise an exception
1e170 20 28 69 2e 65 2e 0d 0a 20 20 20 20 20 20 23 20   (i.e...      # 
1e180 20 20 20 20 20 20 74 68 65 20 61 63 74 75 61 6c        the actual
1e190 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 66   result of the f
1e1a0 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  unction does not
1e1b0 20 6d 61 74 74 65 72 20 61 73 20 6c 6f 6e 67 20   matter as long 
1e1c0 61 73 20 6e 6f 0d 0a 20 20 20 20 20 20 23 20 20  as no..      #  
1e1d0 20 20 20 20 20 64 69 72 65 63 74 6f 72 79 20 69       directory i
1e1e0 73 20 63 68 61 6e 67 65 64 29 2e 0d 0a 20 20 20  s changed)...   
1e1f0 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
1e200 5b 69 73 57 69 6e 64 6f 77 73 5d 20 26 26 20 5b  [isWindows] && [
1e210 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
1e220 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d   object invoke -
1e230 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63  flags +NonPublic
1e240 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1e250 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
1e260 74 65 2e 55 6e 73 61 66 65 4e 61 74 69 76 65 4d  te.UnsafeNativeM
1e270 65 74 68 6f 64 73 20 5c 0d 0a 20 20 20 20 20 20  ethods \..      
1e280 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 77 69        sqlite3_wi
1e290 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72  n32_set_director
1e2a0 79 20 30 20 6e 75 6c 6c 0d 0a 20 20 20 20 20 20  y 0 null..      
1e2b0 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  }] == 0} then {.
1e2c0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
1e2d0 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 61 6c 6c      # NOTE: Call
1e2e0 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33 5f  ing the sqlite3_
1e2f0 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74  win32_set_direct
1e300 6f 72 79 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  ory function doe
1e310 73 20 6e 6f 74 0d 0a 20 20 20 20 20 20 20 20 23  s not..        #
1e320 20 20 20 20 20 20 20 63 61 75 73 65 20 61 6e 20         cause an 
1e330 65 78 63 65 70 74 69 6f 6e 3b 20 74 68 65 72 65  exception; there
1e340 66 6f 72 65 2c 20 69 74 20 6d 75 73 74 20 62 65  fore, it must be
1e350 20 61 76 61 69 6c 61 62 6c 65 20 28 69 2e 65 2e   available (i.e.
1e360 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
1e370 20 20 65 76 65 6e 20 74 68 6f 75 67 68 20 69 74    even though it
1e380 20 73 68 6f 75 6c 64 20 72 65 74 75 72 6e 20 61   should return a
1e390 20 66 61 69 6c 75 72 65 20 72 65 74 75 72 6e 20   failure return 
1e3a0 63 6f 64 65 20 69 6e 20 74 68 69 73 0d 0a 20 20  code in this..  
1e3b0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 61        #       ca
1e3c0 73 65 29 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  se)...        #.
1e3d0 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73  .        addCons
1e3e0 74 72 61 69 6e 74 20 73 71 6c 69 74 65 33 5f 77  traint sqlite3_w
1e3f0 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f  in32_set_directo
1e400 72 79 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 70  ry....        tp
1e410 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 79 65 73  uts $channel yes
1e420 5c 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d  \n....        #.
1e430 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
1e440 20 44 6f 65 73 20 6f 75 72 20 63 61 6c 6c 65 72   Does our caller
1e450 20 77 61 6e 74 20 74 6f 20 72 65 73 65 74 20 74   want to reset t
1e460 68 65 20 64 69 72 65 63 74 6f 72 69 65 73 3f 0d  he directories?.
1e470 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
1e480 20 20 20 20 69 66 20 7b 24 72 65 73 65 74 7d 20      if {$reset} 
1e490 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1e4a0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23    #..          #
1e4b0 20 4e 4f 54 45 3a 20 4e 6f 77 20 6d 61 6b 65 20   NOTE: Now make 
1e4c0 73 75 72 65 20 74 68 65 20 64 61 74 61 62 61 73  sure the databas
1e4d0 65 20 61 6e 64 20 74 65 6d 70 6f 72 61 72 79 20  e and temporary 
1e4e0 64 69 72 65 63 74 6f 72 69 65 73 20 61 72 65 0d  directories are.
1e4f0 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20  .          #    
1e500 20 20 20 72 65 73 65 74 20 74 68 65 69 72 20 64     reset their d
1e510 65 66 61 75 6c 74 20 76 61 6c 75 65 73 2c 20 77  efault values, w
1e520 68 69 63 68 20 73 68 6f 75 6c 64 20 62 65 20 6e  hich should be n
1e530 75 6c 6c 20 66 6f 72 20 62 6f 74 68 2e 0d 0a 20  ull for both... 
1e540 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
1e550 20 53 69 6e 63 65 20 74 68 65 20 73 71 6c 69 74   Since the sqlit
1e560 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72  e3_win32_set_dir
1e570 65 63 74 6f 72 79 20 66 75 6e 63 74 69 6f 6e 20  ectory function 
1e580 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 0d 0a 20  is available,.. 
1e590 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
1e5a0 20 75 73 65 20 69 74 2e 0d 0a 20 20 20 20 20 20   use it...      
1e5b0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
1e5c0 20 66 6f 72 20 7b 73 65 74 20 69 6e 64 65 78 20   for {set index 
1e5d0 31 7d 20 7b 24 69 6e 64 65 78 20 3c 20 33 7d 20  1} {$index < 3} 
1e5e0 7b 69 6e 63 72 20 69 6e 64 65 78 7d 20 7b 0d 0a  {incr index} {..
1e5f0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
1e600 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
1e610 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69          object i
1e620 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f  nvoke -flags +No
1e630 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20  nPublic \..     
1e640 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73               Sys
1e650 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
1e660 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68  UnsafeNativeMeth
1e670 6f 64 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ods \..         
1e680 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1e690 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63  _win32_set_direc
1e6a0 74 6f 72 79 20 24 69 6e 64 65 78 20 6e 75 6c 6c  tory $index null
1e6b0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20  ..            } 
1e6c0 72 65 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68  result] == 0} th
1e6d0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
1e6e0 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
1e6f0 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
1e700 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1e710 20 20 20 20 22 2d 2d 2d 2d 20 63 61 6c 6c 20 73      "---- call s
1e720 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74  qlite3_win32_set
1e730 5f 64 69 72 65 63 74 6f 72 79 28 22 20 24 69 6e  _directory(" $in
1e740 64 65 78 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  dex \..         
1e750 20 20 20 20 20 20 20 20 20 22 2c 20 6e 75 6c 6c           ", null
1e760 29 2e 2e 2e 20 6f 6b 3a 20 22 20 24 72 65 73 75  )... ok: " $resu
1e770 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  lt \n]..        
1e780 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
1e790 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
1e7a0 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
1e7b0 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
1e7c0 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
1e7d0 2d 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f 77  - call sqlite3_w
1e7e0 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f  in32_set_directo
1e7f0 72 79 28 22 20 24 69 6e 64 65 78 20 5c 0d 0a 20  ry(" $index \.. 
1e800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e810 20 22 2c 20 6e 75 6c 6c 29 2e 2e 2e 20 65 72 72   ", null)... err
1e820 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 72 65 73 75  or: " \n\t $resu
1e830 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  lt \n]..        
1e840 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
1e850 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20   }..        }.. 
1e860 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
1e870 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
1e880 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 0d 0a 20 20  annel no\n....  
1e890 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1e8a0 20 23 20 4e 4f 54 45 3a 20 44 6f 65 73 20 6f 75   # NOTE: Does ou
1e8b0 72 20 63 61 6c 6c 65 72 20 77 61 6e 74 20 74 6f  r caller want to
1e8c0 20 72 65 73 65 74 20 74 68 65 20 64 69 72 65 63   reset the direc
1e8d0 74 6f 72 69 65 73 3f 20 20 54 68 69 73 20 63 61  tories?  This ca
1e8e0 6e 20 6f 6e 6c 79 0d 0a 20 20 20 20 20 20 20 20  n only..        
1e8f0 23 20 20 20 20 20 20 20 62 65 20 70 65 72 66 6f  #       be perfo
1e900 72 6d 65 64 20 69 66 20 53 51 4c 69 74 65 20 69  rmed if SQLite i
1e910 73 20 6c 6f 61 64 65 64 20 61 6e 64 20 72 65 61  s loaded and rea
1e920 64 79 20 66 6f 72 20 75 73 65 20 62 79 20 74 68  dy for use by th
1e930 65 20 74 65 73 74 0d 0a 20 20 20 20 20 20 20 20  e test..        
1e940 23 20 20 20 20 20 20 20 73 75 69 74 65 2e 0d 0a  #       suite...
1e950 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1e960 20 20 20 69 66 20 7b 24 72 65 73 65 74 20 26 26     if {$reset &&
1e970 20 5b 69 73 53 51 4c 69 74 65 52 65 61 64 79 5d   [isSQLiteReady]
1e980 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1e990 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
1e9a0 20 23 20 4e 4f 54 45 3a 20 4e 6f 77 20 6d 61 6b   # NOTE: Now mak
1e9b0 65 20 73 75 72 65 20 74 68 65 20 64 61 74 61 62  e sure the datab
1e9c0 61 73 65 20 61 6e 64 20 74 65 6d 70 6f 72 61 72  ase and temporar
1e9d0 79 20 64 69 72 65 63 74 6f 72 69 65 73 20 61 72  y directories ar
1e9e0 65 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20  e..          #  
1e9f0 20 20 20 20 20 72 65 73 65 74 20 74 68 65 69 72       reset their
1ea00 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 73 2c   default values,
1ea10 20 77 68 69 63 68 20 73 68 6f 75 6c 64 20 62 65   which should be
1ea20 20 6e 75 6c 6c 20 66 6f 72 20 62 6f 74 68 2e 0d   null for both..
1ea30 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20  .          #    
1ea40 20 20 20 53 69 6e 63 65 20 74 68 65 20 73 71 6c     Since the sql
1ea50 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64  ite3_win32_set_d
1ea60 69 72 65 63 74 6f 72 79 20 66 75 6e 63 74 69 6f  irectory functio
1ea70 6e 20 64 6f 65 73 20 6e 6f 74 0d 0a 20 20 20 20  n does not..    
1ea80 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61 70        #       ap
1ea90 70 65 61 72 20 74 6f 20 62 65 20 61 76 61 69 6c  pear to be avail
1eaa0 61 62 6c 65 2c 20 75 73 65 20 74 68 65 20 61 73  able, use the as
1eab0 73 6f 63 69 61 74 65 64 20 50 52 41 47 4d 41 20  sociated PRAGMA 
1eac0 63 6f 6d 6d 61 6e 64 73 0d 0a 20 20 20 20 20 20  commands..      
1ead0 20 20 20 20 23 20 20 20 20 20 20 20 69 6e 73 74      #       inst
1eae0 65 61 64 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ead...          
1eaf0 23 0d 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  #..          for
1eb00 65 61 63 68 20 64 69 72 65 63 74 6f 72 79 20 5b  each directory [
1eb10 6c 69 73 74 20 64 61 74 61 5f 73 74 6f 72 65 5f  list data_store_
1eb20 64 69 72 65 63 74 6f 72 79 20 74 65 6d 70 5f 73  directory temp_s
1eb30 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 5d 20  tore_directory] 
1eb40 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  {..            s
1eb50 65 74 20 73 71 6c 20 5b 61 70 70 65 6e 64 41 72  et sql [appendAr
1eb60 67 73 20 22 50 52 41 47 4d 41 20 22 20 24 64 69  gs "PRAGMA " $di
1eb70 72 65 63 74 6f 72 79 20 22 20 3d 20 5c 22 5c 22  rectory " = \"\"
1eb80 3b 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ;"]....         
1eb90 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 65     if {[catch {e
1eba0 78 65 63 75 74 65 53 71 6c 20 24 73 71 6c 7d 20  xecuteSql $sql} 
1ebb0 72 65 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68  result] == 0} th
1ebc0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
1ebd0 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
1ebe0 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
1ebf0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1ec00 20 20 20 20 22 2d 2d 2d 2d 20 65 78 65 63 75 74      "---- execut
1ec10 65 20 50 52 41 47 4d 41 20 22 20 24 64 69 72 65  e PRAGMA " $dire
1ec20 63 74 6f 72 79 20 22 2e 2e 2e 20 6f 6b 3a 20 5c  ctory "... ok: \
1ec30 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  "" \..          
1ec40 20 20 20 20 20 20 20 20 24 72 65 73 75 6c 74 20          $result 
1ec50 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  \"\n]..         
1ec60 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
1ec70 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
1ec80 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
1ec90 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
1eca0 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
1ecb0 20 65 78 65 63 75 74 65 20 50 52 41 47 4d 41 20   execute PRAGMA 
1ecc0 22 20 24 64 69 72 65 63 74 6f 72 79 20 22 2e 2e  " $directory "..
1ecd0 2e 20 65 72 72 6f 72 3a 20 22 20 5c 0d 0a 20 20  . error: " \..  
1ece0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ecf0 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d  \n\t $result \n]
1ed00 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
1ed10 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
1ed20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
1ed30 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
1ed40 20 20 20 23 20 4e 4f 54 45 3a 20 46 69 6e 61 6c     # NOTE: Final
1ed50 6c 79 2c 20 73 68 6f 77 20 74 68 65 20 63 75 72  ly, show the cur
1ed60 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 74 68  rent value of th
1ed70 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 74  e database and t
1ed80 65 6d 70 6f 72 61 72 79 0d 0a 20 20 20 20 20 20  emporary..      
1ed90 23 20 20 20 20 20 20 20 64 69 72 65 63 74 6f 72  #       director
1eda0 69 65 73 2e 20 20 54 68 69 73 20 63 61 6e 20 6f  ies.  This can o
1edb0 6e 6c 79 20 62 65 20 70 65 72 66 6f 72 6d 65 64  nly be performed
1edc0 20 69 66 20 53 51 4c 69 74 65 20 69 73 20 6c 6f   if SQLite is lo
1edd0 61 64 65 64 0d 0a 20 20 20 20 20 20 23 20 20 20  aded..      #   
1ede0 20 20 20 20 61 6e 64 20 72 65 61 64 79 20 66 6f      and ready fo
1edf0 72 20 75 73 65 20 62 79 20 74 68 65 20 74 65 73  r use by the tes
1ee00 74 20 73 75 69 74 65 2e 0d 0a 20 20 20 20 20 20  t suite...      
1ee10 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 73  #..      if {[is
1ee20 53 51 4c 69 74 65 52 65 61 64 79 5d 7d 20 74 68  SQLiteReady]} th
1ee30 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 66 6f  en {..        fo
1ee40 72 65 61 63 68 20 64 69 72 65 63 74 6f 72 79 20  reach directory 
1ee50 5b 6c 69 73 74 20 64 61 74 61 5f 73 74 6f 72 65  [list data_store
1ee60 5f 64 69 72 65 63 74 6f 72 79 20 74 65 6d 70 5f  _directory temp_
1ee70 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 5d  store_directory]
1ee80 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70   {..          tp
1ee90 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
1eea0 70 65 6e 64 41 72 67 73 20 22 2d 2d 2d 2d 20 63  pendArgs "---- c
1eeb0 68 65 63 6b 69 6e 67 20 22 20 24 64 69 72 65 63  hecking " $direc
1eec0 74 6f 72 79 20 22 2e 2e 2e 20 22 5d 0d 0a 0d 0a  tory "... "]....
1eed0 20 20 20 20 20 20 20 20 20 20 73 65 74 20 73 71            set sq
1eee0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 50  l [appendArgs "P
1eef0 52 41 47 4d 41 20 22 20 24 64 69 72 65 63 74 6f  RAGMA " $directo
1ef00 72 79 20 5c 3b 5d 0d 0a 0d 0a 20 20 20 20 20 20  ry \;]....      
1ef10 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
1ef20 65 78 65 63 75 74 65 53 71 6c 20 24 73 71 6c 20  executeSql $sql 
1ef30 73 63 61 6c 61 72 7d 20 72 65 73 75 6c 74 5d 20  scalar} result] 
1ef40 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
1ef50 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
1ef60 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
1ef70 41 72 67 73 20 22 6f 6b 3a 20 5c 22 22 20 24 72  Args "ok: \"" $r
1ef80 65 73 75 6c 74 20 5c 22 5c 6e 5d 0d 0a 20 20 20  esult \"\n]..   
1ef90 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
1efa0 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
1efb0 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
1efc0 65 6e 64 41 72 67 73 20 22 65 72 72 6f 72 3a 20  endArgs "error: 
1efd0 22 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c  " \n\t $result \
1efe0 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  n]..          }.
1eff0 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
1f000 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
1f010 20 20 20 70 72 6f 63 20 6c 6f 61 64 53 51 4c 69     proc loadSQLi
1f020 74 65 54 65 73 74 53 65 74 74 69 6e 67 73 20 7b  teTestSettings {
1f030 20 63 68 61 6e 6e 65 6c 20 7b 73 75 66 66 69 78   channel {suffix
1f040 20 22 22 7d 20 7b 71 75 69 65 74 20 66 61 6c 73   ""} {quiet fals
1f050 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  e} } {..      #.
1f060 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53  .      # NOTE: S
1f070 6b 69 70 20 6c 6f 61 64 69 6e 67 20 74 68 65 20  kip loading the 
1f080 73 65 74 74 69 6e 67 73 20 69 66 20 74 68 65 69  settings if thei
1f090 72 20 75 73 61 67 65 20 68 61 73 20 62 65 65 6e  r usage has been
1f0a0 20 64 69 73 61 62 6c 65 64 2e 0d 0a 20 20 20 20   disabled...    
1f0b0 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 21    #..      if {!
1f0c0 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
1f0d0 6f 28 73 71 6c 69 74 65 54 65 73 74 53 65 74 74  o(sqliteTestSett
1f0e0 69 6e 67 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  ings)]} then {..
1f0f0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1f100 20 20 20 23 20 4e 4f 54 45 3a 20 4c 6f 61 64 20     # NOTE: Load 
1f110 63 75 73 74 6f 6d 20 70 65 72 2d 75 73 65 72 20  custom per-user 
1f120 61 6e 64 2f 6f 72 20 70 65 72 2d 68 6f 73 74 20  and/or per-host 
1f130 74 65 73 74 20 73 65 74 74 69 6e 67 73 20 6e 6f  test settings no
1f140 77 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  w...        #.. 
1f150 20 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f         if {[info
1f160 20 65 78 69 73 74 73 20 3a 3a 74 63 6c 5f 70 6c   exists ::tcl_pl
1f170 61 74 66 6f 72 6d 28 75 73 65 72 29 5d 7d 20 74  atform(user)]} t
1f180 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1f190 20 73 65 74 20 75 73 65 72 53 65 74 74 69 6e 67   set userSetting
1f1a0 73 46 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20  sFileName [file 
1f1b0 6a 6f 69 6e 20 5b 67 65 74 43 6f 6d 6d 6f 6e 44  join [getCommonD
1f1c0 69 72 65 63 74 6f 72 79 5d 20 5c 0d 0a 20 20 20  irectory] \..   
1f1d0 20 20 20 20 20 20 20 20 20 20 20 5b 61 70 70 65             [appe
1f1e0 6e 64 41 72 67 73 20 73 65 74 74 69 6e 67 73 20  ndArgs settings 
1f1f0 24 73 75 66 66 69 78 20 2e 20 24 3a 3a 74 63 6c  $suffix . $::tcl
1f200 5f 70 6c 61 74 66 6f 72 6d 28 75 73 65 72 29 20  _platform(user) 
1f210 2e 65 61 67 6c 65 5d 5d 0d 0a 0d 0a 20 20 20 20  .eagle]]....    
1f220 20 20 20 20 20 20 69 66 20 7b 5b 66 69 6c 65 20        if {[file 
1f230 65 78 69 73 74 73 20 24 75 73 65 72 53 65 74 74  exists $userSett
1f240 69 6e 67 73 46 69 6c 65 4e 61 6d 65 5d 7d 20 74  ingsFileName]} t
1f250 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1f260 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
1f270 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1f280 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
1f290 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
1f2a0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1f2b0 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6c 6f 61 64        "---- load
1f2c0 69 6e 67 20 70 65 72 2d 75 73 65 72 20 74 65 73  ing per-user tes
1f2d0 74 20 73 65 74 74 69 6e 67 73 20 66 69 6c 65 20  t settings file 
1f2e0 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  \"" \..         
1f2f0 20 20 20 20 20 20 20 20 20 24 75 73 65 72 53 65           $userSe
1f300 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 20 5c  ttingsFileName \
1f310 22 2e 2e 2e 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  "...\n]..       
1f320 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
1f330 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
1f340 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1f350 20 20 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73    uplevel 1 [lis
1f360 74 20 73 6f 75 72 63 65 20 24 75 73 65 72 53 65  t source $userSe
1f370 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 5d 0d  ttingsFileName].
1f380 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65  .            } e
1f390 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  rror]} then {.. 
1f3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
1f3b0 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
1f3c0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1f3d0 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
1f3e0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
1f3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f400 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e      "==== WARNIN
1f410 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 6c 6f 61  G: failed to loa
1f420 64 20 70 65 72 2d 75 73 65 72 20 73 65 74 74 69  d per-user setti
1f430 6e 67 73 20 66 69 6c 65 20 5c 22 22 20 5c 0d 0a  ngs file \"" \..
1f440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f450 20 20 20 20 24 75 73 65 72 53 65 74 74 69 6e 67      $userSetting
1f460 73 46 69 6c 65 4e 61 6d 65 20 22 5c 22 2c 20 65  sFileName "\", e
1f470 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72  rror: " \n\t $er
1f480 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ror \n]..       
1f490 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1f4a0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
1f4b0 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
1f4c0 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71           if {!$q
1f4d0 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
1f4e0 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
1f4f0 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
1f500 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
1f510 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
1f520 2d 20 73 6b 69 70 70 65 64 20 6c 6f 61 64 69 6e  - skipped loadin
1f530 67 20 70 65 72 2d 75 73 65 72 20 74 65 73 74 20  g per-user test 
1f540 73 65 74 74 69 6e 67 73 20 66 69 6c 65 20 5c 22  settings file \"
1f550 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
1f560 20 20 20 20 20 20 20 24 75 73 65 72 53 65 74 74         $userSett
1f570 69 6e 67 73 46 69 6c 65 4e 61 6d 65 20 22 5c 22  ingsFileName "\"
1f580 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78  , it does not ex
1f590 69 73 74 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20  ist\n"]..       
1f5a0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
1f5b0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
1f5c0 0d 0a 20 20 20 20 20 20 20 20 23 23 23 23 23 23  ..        ######
1f5d0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1f5e0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1f5f0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1f600 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1f610 23 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20  #....        if 
1f620 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
1f630 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 68 6f 73  tcl_platform(hos
1f640 74 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  t)]} then {..   
1f650 20 20 20 20 20 20 20 73 65 74 20 68 6f 73 74 53         set hostS
1f660 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 20  ettingsFileName 
1f670 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 43  [file join [getC
1f680 6f 6d 6d 6f 6e 44 69 72 65 63 74 6f 72 79 5d 20  ommonDirectory] 
1f690 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1f6a0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 73 65 74   [appendArgs set
1f6b0 74 69 6e 67 73 20 24 73 75 66 66 69 78 20 2e 20  tings $suffix . 
1f6c0 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28  $::tcl_platform(
1f6d0 68 6f 73 74 29 20 2e 65 61 67 6c 65 5d 5d 0d 0a  host) .eagle]]..
1f6e0 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
1f6f0 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 68 6f  [file exists $ho
1f700 73 74 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61  stSettingsFileNa
1f710 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  me]} then {..   
1f720 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71           if {!$q
1f730 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
1f740 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
1f750 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
1f760 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
1f770 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
1f780 2d 20 6c 6f 61 64 69 6e 67 20 70 65 72 2d 68 6f  - loading per-ho
1f790 73 74 20 74 65 73 74 20 73 65 74 74 69 6e 67 73  st test settings
1f7a0 20 66 69 6c 65 20 5c 22 22 20 5c 0d 0a 20 20 20   file \"" \..   
1f7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24                 $
1f7c0 68 6f 73 74 53 65 74 74 69 6e 67 73 46 69 6c 65  hostSettingsFile
1f7d0 4e 61 6d 65 20 5c 22 2e 2e 2e 5c 6e 5d 0d 0a 20  Name \"...\n].. 
1f7e0 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
1f7f0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
1f800 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
1f810 20 20 20 20 20 20 20 20 75 70 6c 65 76 65 6c 20          uplevel 
1f820 31 20 5b 6c 69 73 74 20 73 6f 75 72 63 65 20 24  1 [list source $
1f830 68 6f 73 74 53 65 74 74 69 6e 67 73 46 69 6c 65  hostSettingsFile
1f840 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20 20 20 20  Name]..         
1f850 20 20 20 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65     } error]} the
1f860 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
1f870 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
1f880 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1f890 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
1f8a0 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
1f8b0 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
1f8c0 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20            "==== 
1f8d0 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20  WARNING: failed 
1f8e0 74 6f 20 6c 6f 61 64 20 70 65 72 2d 68 6f 73 74  to load per-host
1f8f0 20 73 65 74 74 69 6e 67 73 20 66 69 6c 65 20 5c   settings file \
1f900 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  "" \..          
1f910 20 20 20 20 20 20 20 20 20 20 24 68 6f 73 74 53            $hostS
1f920 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 20  ettingsFileName 
1f930 22 5c 22 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e  "\", error: " \n
1f940 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20  \t $error \n].. 
1f950 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
1f960 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
1f970 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20           } else 
1f980 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  {..            i
1f990 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
1f9a0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1f9b0 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
1f9c0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
1f9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f9e0 20 20 22 2d 2d 2d 2d 20 73 6b 69 70 70 65 64 20    "---- skipped 
1f9f0 6c 6f 61 64 69 6e 67 20 70 65 72 2d 68 6f 73 74  loading per-host
1fa00 20 74 65 73 74 20 73 65 74 74 69 6e 67 73 20 66   test settings f
1fa10 69 6c 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20  ile \"" \..     
1fa20 20 20 20 20 20 20 20 20 20 20 20 20 20 24 68 6f               $ho
1fa30 73 74 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61  stSettingsFileNa
1fa40 6d 65 20 22 5c 22 2c 20 69 74 20 64 6f 65 73 20  me "\", it does 
1fa50 6e 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a 20  not exist\n"].. 
1fa60 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
1fa70 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
1fa80 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20     }..      }.. 
1fa90 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
1faa0 63 20 72 75 6e 53 51 4c 69 74 65 54 65 73 74 50  c runSQLiteTestP
1fab0 72 6f 6c 6f 67 75 65 20 7b 7d 20 7b 0d 0a 20 20  rologue {} {..  
1fac0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
1fad0 4f 54 45 3a 20 53 6b 69 70 20 72 75 6e 6e 69 6e  OTE: Skip runnin
1fae0 67 20 6f 75 72 20 63 75 73 74 6f 6d 20 70 72 6f  g our custom pro
1faf0 6c 6f 67 75 65 20 69 66 20 74 68 65 20 6d 61 69  logue if the mai
1fb00 6e 20 6f 6e 65 20 68 61 73 20 62 65 65 6e 0d 0a  n one has been..
1fb10 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73 6b        #       sk
1fb20 69 70 70 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d  ipped...      #.
1fb30 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66  .      if {![inf
1fb40 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 70 72  o exists ::no(pr
1fb50 6f 6c 6f 67 75 65 2e 65 61 67 6c 65 29 5d 7d 20  ologue.eagle)]} 
1fb60 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1fb70 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
1fb80 45 3a 20 4c 6f 61 64 20 74 68 65 20 22 62 65 66  E: Load the "bef
1fb90 6f 72 65 2d 63 6f 6e 73 74 72 61 69 6e 74 73 22  ore-constraints"
1fba0 20 63 75 73 74 6f 6d 20 70 65 72 2d 75 73 65 72   custom per-user
1fbb0 20 61 6e 64 2f 6f 72 20 70 65 72 2d 68 6f 73 74   and/or per-host
1fbc0 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
1fbd0 20 20 74 65 73 74 20 73 65 74 74 69 6e 67 73 20    test settings 
1fbe0 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  now...        #.
1fbf0 0a 20 20 20 20 20 20 20 20 75 70 6c 65 76 65 6c  .        uplevel
1fc00 20 31 20 5b 6c 69 73 74 20 6c 6f 61 64 53 51 4c   1 [list loadSQL
1fc10 69 74 65 54 65 73 74 53 65 74 74 69 6e 67 73 20  iteTestSettings 
1fc20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
1fc30 2e 62 65 66 6f 72 65 5d 0d 0a 0d 0a 20 20 20 20  .before]....    
1fc40 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
1fc50 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20   NOTE: Check if 
1fc60 74 68 65 20 5b 6f 62 6a 65 63 74 5d 20 63 6f 6d  the [object] com
1fc70 6d 61 6e 64 20 69 73 20 61 76 61 69 6c 61 62 6c  mand is availabl
1fc80 65 3b 20 69 66 20 6e 6f 74 2c 20 61 64 64 20 73  e; if not, add s
1fc90 6f 6d 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ome..        #  
1fca0 20 20 20 20 20 73 68 69 6d 73 20 74 6f 20 6d 61       shims to ma
1fcb0 6b 65 20 74 68 65 20 74 65 73 74 20 73 75 69 74  ke the test suit
1fcc0 65 20 72 75 6e 20 73 6d 6f 6f 74 68 65 72 2e 0d  e run smoother..
1fcd0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
1fce0 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51 4c 69      checkForSQLi
1fcf0 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 20  teObjectCommand 
1fd00 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d  $::test_channel.
1fd10 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
1fd20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 44 65        # NOTE: De
1fd30 74 65 72 6d 69 6e 65 20 74 68 65 20 6e 61 6d 65  termine the name
1fd40 73 20 6f 66 20 74 68 65 20 6e 61 74 69 76 65 20  s of the native 
1fd50 70 6c 61 74 66 6f 72 6d 20 61 6e 64 20 61 72 63  platform and arc
1fd60 68 69 74 65 63 74 75 72 65 2e 0d 0a 20 20 20 20  hitecture...    
1fd70 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73      #..        s
1fd80 65 74 20 70 6c 61 74 66 6f 72 6d 20 5b 67 65 74  et platform [get
1fd90 42 75 69 6c 64 50 6c 61 74 66 6f 72 6d 20 74 72  BuildPlatform tr
1fda0 75 65 5d 0d 0a 20 20 20 20 20 20 20 20 73 65 74  ue]..        set
1fdb0 20 61 72 63 68 69 74 65 63 74 75 72 65 20 5b 61   architecture [a
1fdc0 72 63 68 69 74 65 63 74 75 72 65 46 6f 72 50 6c  rchitectureForPl
1fdd0 61 74 66 6f 72 6d 20 24 70 6c 61 74 66 6f 72 6d  atform $platform
1fde0 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ]....        #..
1fdf0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
1fe00 53 68 6f 77 20 74 68 65 20 70 6c 61 74 66 6f 72  Show the platfor
1fe10 6d 20 61 6e 64 20 61 72 63 68 69 74 65 63 74 75  m and architectu
1fe20 72 65 20 75 73 65 64 20 74 6f 20 68 65 6c 70 20  re used to help 
1fe30 6c 6f 63 61 74 65 20 74 68 65 0d 0a 20 20 20 20  locate the..    
1fe40 20 20 20 20 23 20 20 20 20 20 20 20 6e 61 74 69      #       nati
1fe50 76 65 20 62 75 69 6c 64 20 66 69 6c 65 73 2e 0d  ve build files..
1fe60 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
1fe70 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
1fe80 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
1fe90 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
1fea0 20 20 20 20 20 22 2d 2d 2d 2d 20 70 6c 61 74 66       "---- platf
1feb0 6f 72 6d 20 66 6f 72 20 6c 6f 63 61 74 69 6e 67  orm for locating
1fec0 20 6e 61 74 69 76 65 20 62 75 69 6c 64 20 66 69   native build fi
1fed0 6c 65 73 20 69 73 20 5c 22 22 20 5c 0d 0a 20 20  les is \"" \..  
1fee0 20 20 20 20 20 20 20 20 20 20 24 70 6c 61 74 66            $platf
1fef0 6f 72 6d 20 5c 22 5c 6e 5d 0d 0a 0d 0a 20 20 20  orm \"\n]....   
1ff00 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
1ff10 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
1ff20 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
1ff30 20 20 20 20 20 20 22 2d 2d 2d 2d 20 61 72 63 68        "---- arch
1ff40 69 74 65 63 74 75 72 65 20 66 6f 72 20 6c 6f 63  itecture for loc
1ff50 61 74 69 6e 67 20 6e 61 74 69 76 65 20 62 75 69  ating native bui
1ff60 6c 64 20 66 69 6c 65 73 20 69 73 20 5c 22 22 20  ld files is \"" 
1ff70 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 24  \..            $
1ff80 61 72 63 68 69 74 65 63 74 75 72 65 20 5c 22 5c  architecture \"\
1ff90 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d  n]....        #.
1ffa0 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
1ffb0 20 42 75 69 6c 64 20 61 20 6c 69 73 74 20 6f 66   Build a list of
1ffc0 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 66   configuration f
1ffd0 69 6c 65 73 20 74 68 61 74 20 77 65 20 68 61 6e  iles that we han
1ffe0 64 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  dle...        #.
1fff0 0a 20 20 20 20 20 20 20 20 73 65 74 20 63 6f 6e  .        set con
20000 66 69 67 46 69 6c 65 4e 61 6d 65 73 20 5b 6c 69  figFileNames [li
20010 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  st \..          
20020 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51    System.Data.SQ
20030 4c 69 74 65 2e 64 6c 6c 2e 63 6f 6e 66 69 67 5d  Lite.dll.config]
20040 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
20050 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42         # NOTE: B
20060 75 69 6c 64 20 61 20 6c 69 73 74 20 6f 66 20 61  uild a list of a
20070 75 78 69 6c 69 61 72 79 20 4d 61 6e 61 67 65 64  uxiliary Managed
20080 20 44 65 62 75 67 67 69 6e 67 20 41 73 73 69 73   Debugging Assis
20090 74 61 6e 74 73 20 28 4d 44 41 29 0d 0a 20 20 20  tants (MDA)..   
200a0 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e       #       con
200b0 66 69 67 75 72 61 74 69 6f 6e 20 66 69 6c 65 73  figuration files
200c0 20 74 68 61 74 20 77 65 20 68 61 6e 64 6c 65 2e   that we handle.
200d0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
200e0 20 20 20 20 20 73 65 74 20 6d 64 61 43 6f 6e 66       set mdaConf
200f0 69 67 46 69 6c 65 4e 61 6d 65 73 20 5b 6c 69 73  igFileNames [lis
20100 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  t \..           
20110 20 45 61 67 6c 65 53 68 65 6c 6c 33 32 2e 65 78   EagleShell32.ex
20120 65 2e 6d 64 61 2e 63 6f 6e 66 69 67 20 49 6e 73  e.mda.config Ins
20130 74 61 6c 6c 65 72 2e 65 78 65 2e 6d 64 61 2e 63  taller.exe.mda.c
20140 6f 6e 66 69 67 20 5c 0d 0a 20 20 20 20 20 20 20  onfig \..       
20150 20 20 20 20 20 74 65 73 74 2e 65 78 65 2e 6d 64       test.exe.md
20160 61 2e 63 6f 6e 66 69 67 20 74 65 73 74 6c 69 6e  a.config testlin
20170 71 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e 66 69 67  q.exe.mda.config
20180 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
20190 74 65 73 74 65 66 36 2e 65 78 65 2e 6d 64 61 2e  testef6.exe.mda.
201a0 63 6f 6e 66 69 67 5d 0d 0a 0d 0a 20 20 20 20 20  config]....     
201b0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
201c0 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74 68 65 20  NOTE: Build the 
201d0 6c 69 73 74 20 6f 66 20 65 78 74 65 72 6e 61 6c  list of external
201e0 20 66 69 6c 65 73 20 74 68 61 74 20 77 65 20 68   files that we h
201f0 61 6e 64 6c 65 2e 20 20 53 6f 6d 65 20 6f 66 0d  andle.  Some of.
20200 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
20210 20 74 68 65 73 65 20 66 69 6c 65 73 20 6d 61 79   these files may
20220 20 62 65 20 6e 61 74 69 76 65 20 61 6e 64 2f 6f   be native and/o
20230 72 20 6d 61 6e 61 67 65 64 20 61 73 73 65 6d 62  r managed assemb
20240 6c 69 65 73 20 74 68 61 74 20 61 72 65 0d 0a 20  lies that are.. 
20250 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 72         #       r
20260 65 71 75 69 72 65 64 20 74 6f 20 70 65 72 66 6f  equired to perfo
20270 72 6d 20 76 61 72 69 6f 75 73 20 74 65 73 74 73  rm various tests
20280 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
20290 20 20 20 20 20 20 73 65 74 20 65 78 74 65 72 6e        set extern
202a0 61 6c 46 69 6c 65 4e 61 6d 65 73 20 5b 6c 69 73  alFileNames [lis
202b0 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  t \..           
202c0 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 45 6e 74 69   [file join Enti
202d0 74 79 46 72 61 6d 65 77 6f 72 6b 20 6c 69 62 20  tyFramework lib 
202e0 5b 73 74 72 69 6e 67 20 6d 61 70 20 5b 6c 69 73  [string map [lis
202f0 74 20 46 78 20 22 22 5d 20 5b 73 74 72 69 6e 67  t Fx ""] [string
20300 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
20310 6d 61 70 20 5b 6c 69 73 74 20 6e 65 74 46 78 34  map [list netFx4
20320 35 31 20 6e 65 74 46 78 34 35 20 6e 65 74 46 78  51 netFx45 netFx
20330 34 35 32 20 6e 65 74 46 78 34 35 20 6e 65 74 46  452 netFx45 netF
20340 78 34 36 20 6e 65 74 46 78 34 35 20 5c 0d 0a 20  x46 netFx45 \.. 
20350 20 20 20 20 20 20 20 20 20 20 20 6e 65 74 46 78             netFx
20360 34 36 31 20 6e 65 74 46 78 34 35 5d 20 5b 67 65  461 netFx45] [ge
20370 74 42 75 69 6c 64 4e 65 74 46 78 5d 5d 5d 20 45  tBuildNetFx]]] E
20380 6e 74 69 74 79 46 72 61 6d 65 77 6f 72 6b 2e 64  ntityFramework.d
20390 6c 6c 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ll]]....        
203a0 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
203b0 45 3a 20 42 75 69 6c 64 20 74 68 65 20 6c 69 73  E: Build the lis
203c0 74 20 6f 66 20 6e 61 74 69 76 65 20 61 73 73 65  t of native asse
203d0 6d 62 6c 79 20 66 69 6c 65 73 20 74 68 61 74 20  mbly files that 
203e0 77 65 20 68 61 6e 64 6c 65 2e 20 20 54 68 65 0d  we handle.  The.
203f0 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
20400 20 72 65 61 73 6f 6e 20 74 68 65 20 22 53 79 73   reason the "Sys
20410 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
20420 64 6c 6c 22 20 66 69 6c 65 20 69 73 20 69 6e 63  dll" file is inc
20430 6c 75 64 65 64 20 68 65 72 65 20 69 73 0d 0a 20  luded here is.. 
20440 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62         #       b
20450 65 63 61 75 73 65 20 69 74 20 63 6f 75 6c 64 20  ecause it could 
20460 62 65 20 74 68 65 20 6d 69 78 65 64 2d 6d 6f 64  be the mixed-mod
20470 65 20 61 73 73 65 6d 62 6c 79 2e 0d 0a 20 20 20  e assembly...   
20480 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
20490 73 65 74 20 6e 61 74 69 76 65 46 69 6c 65 4e 61  set nativeFileNa
204a0 6d 65 73 20 5b 6c 69 73 74 5d 0d 0a 0d 0a 20 20  mes [list]....  
204b0 20 20 20 20 20 20 65 76 61 6c 20 6c 61 70 70 65        eval lappe
204c0 6e 64 20 6e 61 74 69 76 65 46 69 6c 65 4e 61 6d  nd nativeFileNam
204d0 65 73 20 5b 67 65 74 4e 61 74 69 76 65 4c 69 62  es [getNativeLib
204e0 72 61 72 79 46 69 6c 65 4e 61 6d 65 73 4f 6e 6c  raryFileNamesOnl
204f0 79 5d 0d 0a 20 20 20 20 20 20 20 20 65 76 61 6c  y]..        eval
20500 20 6c 61 70 70 65 6e 64 20 6e 61 74 69 76 65 46   lappend nativeF
20510 69 6c 65 4e 61 6d 65 73 20 5b 67 65 74 49 6e 74  ileNames [getInt
20520 65 72 6f 70 41 73 73 65 6d 62 6c 79 46 69 6c 65  eropAssemblyFile
20530 4e 61 6d 65 73 4f 6e 6c 79 5d 0d 0a 0d 0a 20 20  NamesOnly]....  
20540 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 6e 61        lappend na
20550 74 69 76 65 46 69 6c 65 4e 61 6d 65 73 20 53 79  tiveFileNames Sy
20560 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
20570 2e 64 6c 6c 0d 0a 0d 0a 20 20 20 20 20 20 20 20  .dll....        
20580 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
20590 45 3a 20 42 75 69 6c 64 20 74 68 65 20 6c 69 73  E: Build the lis
205a0 74 20 6f 66 20 6d 61 6e 61 67 65 64 20 61 73 73  t of managed ass
205b0 65 6d 62 6c 79 20 66 69 6c 65 73 20 74 68 61 74  embly files that
205c0 20 77 65 20 68 61 6e 64 6c 65 2e 0d 0a 20 20 20   we handle...   
205d0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
205e0 73 65 74 20 6d 61 6e 61 67 65 64 46 69 6c 65 4e  set managedFileN
205f0 61 6d 65 73 20 5b 6c 69 73 74 20 5c 0d 0a 20 20  ames [list \..  
20600 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d            System
20610 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c  .Data.SQLite.dll
20620 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
20630 69 74 65 2e 4c 69 6e 71 2e 64 6c 6c 20 5c 0d 0a  ite.Linq.dll \..
20640 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74              Syst
20650 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 45  em.Data.SQLite.E
20660 46 36 2e 64 6c 6c 5d 0d 0a 0d 0a 20 20 20 20 20  F6.dll]....     
20670 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
20680 4e 4f 54 45 3a 20 52 65 6d 6f 76 65 20 61 6e 79  NOTE: Remove any
20690 20 74 65 73 74 20 63 6f 6e 73 74 72 61 69 6e 74   test constraint
206a0 73 20 74 68 61 74 20 72 65 66 65 72 20 74 6f 20  s that refer to 
206b0 74 68 65 20 6e 61 74 69 76 65 20 61 6e 64 2f 6f  the native and/o
206c0 72 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  r..        #    
206d0 20 20 20 6d 61 6e 61 67 65 64 20 61 73 73 65 6d     managed assem
206e0 62 6c 79 20 66 69 6c 65 73 20 74 68 61 74 20 77  bly files that w
206f0 65 20 68 61 6e 64 6c 65 20 75 6e 6c 65 73 73 20  e handle unless 
20700 66 6f 72 62 69 64 64 65 6e 20 66 72 6f 6d 0d 0a  forbidden from..
20710 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
20720 64 6f 69 6e 67 20 73 6f 2e 0d 0a 20 20 20 20 20  doing so...     
20730 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66     #..        if
20740 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
20750 3a 3a 6e 6f 28 73 71 6c 69 74 65 52 65 6d 6f 76  ::no(sqliteRemov
20760 65 43 6f 6e 73 74 72 61 69 6e 74 73 29 5d 7d 20  eConstraints)]} 
20770 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
20780 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61    foreach fileNa
20790 6d 65 20 24 63 6f 6e 66 69 67 46 69 6c 65 4e 61  me $configFileNa
207a0 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  mes {..         
207b0 20 20 20 72 65 6d 6f 76 65 43 6f 6e 73 74 72 61     removeConstra
207c0 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20  int [appendArgs 
207d0 66 69 6c 65 5f 20 24 66 69 6c 65 4e 61 6d 65 5d  file_ $fileName]
207e0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d  ..          }...
207f0 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61  .          forea
20800 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6d 64 61  ch fileName $mda
20810 43 6f 6e 66 69 67 46 69 6c 65 4e 61 6d 65 73 20  ConfigFileNames 
20820 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  {..            r
20830 65 6d 6f 76 65 43 6f 6e 73 74 72 61 69 6e 74 20  emoveConstraint 
20840 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65  [appendArgs file
20850 5f 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20  _ $fileName]..  
20860 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
20870 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66         foreach f
20880 69 6c 65 4e 61 6d 65 20 24 65 78 74 65 72 6e 61  ileName $externa
20890 6c 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20  lFileNames {..  
208a0 20 20 20 20 20 20 20 20 20 20 72 65 6d 6f 76 65            remove
208b0 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65  Constraint [appe
208c0 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5b 66 69  ndArgs file_ [fi
208d0 6c 65 20 74 61 69 6c 20 24 66 69 6c 65 4e 61 6d  le tail $fileNam
208e0 65 5d 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  e]]..          }
208f0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 66 6f  ....          fo
20900 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24  reach fileName $
20910 6e 61 74 69 76 65 46 69 6c 65 4e 61 6d 65 73 20  nativeFileNames 
20920 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  {..            r
20930 65 6d 6f 76 65 43 6f 6e 73 74 72 61 69 6e 74 20  emoveConstraint 
20940 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65  [appendArgs file
20950 5f 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20  _ $fileName]..  
20960 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
20970 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66         foreach f
20980 69 6c 65 4e 61 6d 65 20 24 6d 61 6e 61 67 65 64  ileName $managed
20990 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20  FileNames {..   
209a0 20 20 20 20 20 20 20 20 20 72 65 6d 6f 76 65 43           removeC
209b0 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e  onstraint [appen
209c0 64 41 72 67 73 20 66 69 6c 65 5f 20 24 66 69 6c  dArgs file_ $fil
209d0 65 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20 20 20  eName]..        
209e0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
209f0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
20a00 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69       # NOTE: Ski
20a10 70 20 61 6c 6c 20 53 79 73 74 65 6d 2e 44 61 74  p all System.Dat
20a20 61 2e 53 51 4c 69 74 65 20 72 65 6c 61 74 65 64  a.SQLite related
20a30 20 66 69 6c 65 20 68 61 6e 64 6c 69 6e 67 20 28   file handling (
20a40 64 65 6c 65 74 69 6e 67 2c 0d 0a 20 20 20 20 20  deleting,..     
20a50 20 20 20 23 20 20 20 20 20 20 20 63 6f 70 79 69     #       copyi
20a60 6e 67 2c 20 61 6e 64 20 6c 6f 61 64 69 6e 67 29  ng, and loading)
20a70 20 69 66 20 69 6e 73 74 72 75 63 74 65 64 2e 0d   if instructed..
20a80 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
20a90 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
20aa0 78 69 73 74 73 20 3a 3a 6e 6f 28 73 71 6c 69 74  xists ::no(sqlit
20ab0 65 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b  eFiles)]} then {
20ac0 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
20ad0 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
20ae0 20 53 6b 69 70 20 74 72 79 69 6e 67 20 74 6f 20   Skip trying to 
20af0 64 65 6c 65 74 65 20 61 6e 79 20 66 69 6c 65 73  delete any files
20b00 20 69 66 20 69 6e 73 74 72 75 63 74 65 64 2e 0d   if instructed..
20b10 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
20b20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
20b30 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64  fo exists ::no(d
20b40 65 6c 65 74 65 53 71 6c 69 74 65 46 69 6c 65 73  eleteSqliteFiles
20b50 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
20b60 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
20b70 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64  fo exists ::no(d
20b80 65 6c 65 74 65 53 71 6c 69 74 65 43 6f 6e 66 69  eleteSqliteConfi
20b90 67 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b  gFiles)]} then {
20ba0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
20bb0 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65  foreach fileName
20bc0 20 24 63 6f 6e 66 69 67 46 69 6c 65 4e 61 6d 65   $configFileName
20bd0 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s {..           
20be0 20 20 20 20 20 74 72 79 44 65 6c 65 74 65 42 69       tryDeleteBi
20bf0 6e 61 72 79 46 69 6c 65 20 24 66 69 6c 65 4e 61  naryFile $fileNa
20c00 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  me..            
20c10 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
20c20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
20c30 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
20c40 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53  sts ::no(deleteS
20c50 71 6c 69 74 65 45 78 74 65 72 6e 61 6c 46 69 6c  qliteExternalFil
20c60 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  es)]} then {..  
20c70 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65              fore
20c80 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6d 64  ach fileName $md
20c90 61 43 6f 6e 66 69 67 46 69 6c 65 4e 61 6d 65 73  aConfigFileNames
20ca0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
20cb0 20 20 20 20 74 72 79 44 65 6c 65 74 65 42 75 69      tryDeleteBui
20cc0 6c 64 46 69 6c 65 20 24 66 69 6c 65 4e 61 6d 65  ldFile $fileName
20cd0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
20ce0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
20cf0 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e     foreach fileN
20d00 61 6d 65 20 24 65 78 74 65 72 6e 61 6c 46 69 6c  ame $externalFil
20d10 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20  eNames {..      
20d20 20 20 20 20 20 20 20 20 20 20 74 72 79 44 65 6c            tryDel
20d30 65 74 65 42 69 6e 61 72 79 46 69 6c 65 20 24 66  eteBinaryFile $f
20d40 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20  ileName..       
20d50 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
20d60 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
20d70 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
20d80 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65  o exists ::no(de
20d90 6c 65 74 65 53 71 6c 69 74 65 4e 61 74 69 76 65  leteSqliteNative
20da0 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d  Files)]} then {.
20db0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
20dc0 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
20dd0 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69   ::no(deleteSqli
20de0 74 65 49 6d 70 6c 69 63 69 74 46 69 6c 65 73 29  teImplicitFiles)
20df0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
20e00 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61             forea
20e10 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6e 61 74  ch fileName $nat
20e20 69 76 65 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a  iveFileNames {..
20e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e40 20 20 74 72 79 44 65 6c 65 74 65 41 73 73 65 6d    tryDeleteAssem
20e50 62 6c 79 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20  bly $fileName.. 
20e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
20e70 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
20e80 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
20e90 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
20ea0 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74 65  ists ::no(delete
20eb0 53 71 6c 69 74 65 4e 6f 6e 49 6d 70 6c 69 63 69  SqliteNonImplici
20ec0 74 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b  tFiles)]} then {
20ed0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
20ee0 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
20ef0 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53  sts ::no(deleteS
20f00 71 6c 69 74 65 50 6c 61 74 66 6f 72 6d 46 69 6c  qlitePlatformFil
20f10 65 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  es)] && \..     
20f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b                 [
20f30 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 70  string length $p
20f40 6c 61 74 66 6f 72 6d 5d 20 3e 20 30 7d 20 74 68  latform] > 0} th
20f50 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
20f60 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
20f70 66 69 6c 65 4e 61 6d 65 20 24 6e 61 74 69 76 65  fileName $native
20f80 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20  FileNames {..   
20f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20fa0 20 74 72 79 44 65 6c 65 74 65 41 73 73 65 6d 62   tryDeleteAssemb
20fb0 6c 79 20 24 66 69 6c 65 4e 61 6d 65 20 24 70 6c  ly $fileName $pl
20fc0 61 74 66 6f 72 6d 0d 0a 20 20 20 20 20 20 20 20  atform..        
20fd0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
20fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
20ff0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
21000 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
21010 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53  sts ::no(deleteS
21020 71 6c 69 74 65 41 72 63 68 69 74 65 63 74 75 72  qliteArchitectur
21030 65 46 69 6c 65 73 29 5d 20 26 26 20 5c 0d 0a 20  eFiles)] && \.. 
21040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21050 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74     [string lengt
21060 68 20 24 61 72 63 68 69 74 65 63 74 75 72 65 5d  h $architecture]
21070 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
21080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21090 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65  foreach fileName
210a0 20 24 6e 61 74 69 76 65 46 69 6c 65 4e 61 6d 65   $nativeFileName
210b0 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s {..           
210c0 20 20 20 20 20 20 20 20 20 74 72 79 44 65 6c 65           tryDele
210d0 74 65 41 73 73 65 6d 62 6c 79 20 24 66 69 6c 65  teAssembly $file
210e0 4e 61 6d 65 20 24 61 72 63 68 69 74 65 63 74 75  Name $architectu
210f0 72 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  re..            
21100 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
21110 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
21120 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
21130 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
21140 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
21150 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
21160 28 64 65 6c 65 74 65 53 71 6c 69 74 65 4d 61 6e  (deleteSqliteMan
21170 61 67 65 64 46 69 6c 65 73 29 5d 7d 20 74 68 65  agedFiles)]} the
21180 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
21190 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e     foreach fileN
211a0 61 6d 65 20 24 6d 61 6e 61 67 65 64 46 69 6c 65  ame $managedFile
211b0 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20  Names {..       
211c0 20 20 20 20 20 20 20 20 20 74 72 79 44 65 6c 65           tryDele
211d0 74 65 41 73 73 65 6d 62 6c 79 20 24 66 69 6c 65  teAssembly $file
211e0 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20  Name..          
211f0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
21200 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
21210 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23  }....          #
21220 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
21230 54 45 3a 20 43 68 65 63 6b 20 66 6f 72 20 74 68  TE: Check for th
21240 65 20 22 61 75 74 6f 53 65 6c 65 63 74 22 20 72  e "autoSelect" r
21250 75 6e 74 69 6d 65 20 6f 70 74 69 6f 6e 2e 20 20  untime option.  
21260 49 66 20 70 72 65 73 65 6e 74 2c 0d 0a 20 20 20  If present,..   
21270 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61         #       a
21280 74 74 65 6d 70 74 20 74 6f 20 61 75 74 6f 6d 61  ttempt to automa
21290 74 69 63 61 6c 6c 79 20 73 65 6c 65 63 74 20 74  tically select t
212a0 68 65 20 66 69 72 73 74 20 61 76 61 69 6c 61 62  he first availab
212b0 6c 65 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20  le..          # 
212c0 20 20 20 20 20 20 62 75 69 6c 64 20 28 6f 72 20        build (or 
212d0 22 72 65 6c 65 61 73 65 22 29 20 6f 66 20 53 51  "release") of SQ
212e0 4c 69 74 65 20 61 6e 64 20 53 79 73 74 65 6d 2e  Lite and System.
212f0 44 61 74 61 2e 53 51 4c 69 74 65 0d 0a 20 20 20  Data.SQLite..   
21300 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 66         #       f
21310 6f 72 20 75 73 65 20 77 69 74 68 20 74 68 65 20  or use with the 
21320 74 65 73 74 20 73 75 69 74 65 2e 0d 0a 20 20 20  test suite...   
21330 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
21340 20 20 20 20 69 66 20 7b 5b 68 61 73 52 75 6e 74      if {[hasRunt
21350 69 6d 65 4f 70 74 69 6f 6e 20 61 75 74 6f 53 65  imeOption autoSe
21360 6c 65 63 74 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  lect]} then {.. 
21370 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
21380 5b 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 42  [checkForSQLiteB
21390 75 69 6c 64 73 20 24 3a 3a 74 65 73 74 5f 63 68  uilds $::test_ch
213a0 61 6e 6e 65 6c 20 74 72 75 65 5d 7d 20 74 68 65  annel true]} the
213b0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
213c0 20 20 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74     checkForSQLit
213d0 65 52 65 6c 65 61 73 65 73 20 24 3a 3a 74 65 73  eReleases $::tes
213e0 74 5f 63 68 61 6e 6e 65 6c 20 74 72 75 65 0d 0a  t_channel true..
213f0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
21400 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
21410 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
21420 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69       # NOTE: Ski
21430 70 20 74 72 79 69 6e 67 20 74 6f 20 76 65 72 69  p trying to veri
21440 66 79 20 74 68 65 20 62 75 69 6c 64 20 64 69 72  fy the build dir
21450 65 63 74 6f 72 79 20 69 66 20 69 6e 73 74 72 75  ectory if instru
21460 63 74 65 64 3b 0d 0a 20 20 20 20 20 20 20 20 20  cted;..         
21470 20 23 20 20 20 20 20 20 20 6f 74 68 65 72 77 69   #       otherwi
21480 73 65 2c 20 6d 61 6b 65 20 73 75 72 65 20 69 74  se, make sure it
21490 20 61 63 74 75 61 6c 6c 79 20 65 78 69 73 74 73   actually exists
214a0 20 6f 72 20 68 61 6c 74 20 74 68 65 20 65 6e 74   or halt the ent
214b0 69 72 65 0d 0a 20 20 20 20 20 20 20 20 20 20 23  ire..          #
214c0 20 20 20 20 20 20 20 74 65 73 74 69 6e 67 20 70         testing p
214d0 72 6f 63 65 73 73 20 69 66 20 69 74 20 64 6f 65  rocess if it doe
214e0 73 20 6e 6f 74 20 65 78 69 73 74 2e 0d 0a 20 20  s not exist...  
214f0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
21500 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
21510 65 78 69 73 74 73 20 3a 3a 6e 6f 28 76 65 72 69  exists ::no(veri
21520 66 79 42 75 69 6c 64 44 69 72 65 63 74 6f 72 79  fyBuildDirectory
21530 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
21540 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
21550 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41         # NOTE: A
21560 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68  t this point, th
21570 65 20 62 75 69 6c 64 20 64 69 72 65 63 74 6f 72  e build director
21580 79 20 4d 55 53 54 20 65 78 69 73 74 20 61 73 20  y MUST exist as 
21590 61 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  a..            #
215a0 20 20 20 20 20 20 20 76 61 6c 69 64 20 64 69 72         valid dir
215b0 65 63 74 6f 72 79 20 66 6f 72 20 74 68 65 20 74  ectory for the t
215c0 65 73 74 69 6e 67 20 70 72 6f 63 65 73 73 20 74  esting process t
215d0 6f 20 63 6f 6e 74 69 6e 75 65 2e 0d 0a 20 20 20  o continue...   
215e0 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
215f0 20 20 20 20 20 20 20 20 73 65 74 20 64 69 72 65          set dire
21600 63 74 6f 72 79 20 5b 67 65 74 42 75 69 6c 64 44  ctory [getBuildD
21610 69 72 65 63 74 6f 72 79 5d 0d 0a 0d 0a 20 20 20  irectory]....   
21620 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 66           if {![f
21630 69 6c 65 20 65 78 69 73 74 73 20 24 64 69 72 65  ile exists $dire
21640 63 74 6f 72 79 5d 20 7c 7c 20 5c 0d 0a 20 20 20  ctory] || \..   
21650 20 20 20 20 20 20 20 20 20 20 20 20 20 21 5b 66               ![f
21660 69 6c 65 20 69 73 64 69 72 65 63 74 6f 72 79 20  ile isdirectory 
21670 24 64 69 72 65 63 74 6f 72 79 5d 7d 20 74 68 65  $directory]} the
21680 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
21690 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
216a0 20 20 20 20 23 20 4e 4f 54 45 3a 20 4a 75 73 74      # NOTE: Just
216b0 20 70 72 69 6f 72 20 74 6f 20 61 63 74 75 61 6c   prior to actual
216c0 6c 79 20 68 61 6c 74 69 6e 67 20 74 68 65 20 74  ly halting the t
216d0 65 73 74 69 6e 67 20 70 72 6f 63 65 73 73 2c 0d  esting process,.
216e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
216f0 20 20 20 20 20 20 20 61 64 64 20 61 6e 20 65 72         add an er
21700 72 6f 72 20 74 6f 20 74 68 65 20 74 65 73 74 20  ror to the test 
21710 6c 6f 67 20 66 69 6c 65 2e 0d 0a 20 20 20 20 20  log file...     
21720 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
21730 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
21740 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
21750 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
21760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21770 20 22 2d 2d 2d 2d 20 63 6f 75 6c 64 20 6e 6f 74   "---- could not
21780 20 76 65 72 69 66 79 20 62 75 69 6c 64 20 64 69   verify build di
21790 72 65 63 74 6f 72 79 20 5c 22 22 20 24 64 69 72  rectory \"" $dir
217a0 65 63 74 6f 72 79 20 5c 0d 0a 20 20 20 20 20 20  ectory \..      
217b0 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c              "\",
217c0 20 61 6c 6c 20 74 65 73 74 69 6e 67 20 68 61 6c   all testing hal
217d0 74 65 64 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20  ted\n"]....     
217e0 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
217f0 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
21800 3a 20 52 61 69 73 69 6e 67 20 61 20 73 63 72 69  : Raising a scri
21810 70 74 20 65 72 72 6f 72 20 66 72 6f 6d 20 74 68  pt error from th
21820 69 73 20 70 6f 69 6e 74 20 73 68 6f 75 6c 64 20  is point should 
21830 68 61 6c 74 0d 0a 20 20 20 20 20 20 20 20 20 20  halt..          
21840 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20      #       the 
21850 74 65 73 74 69 6e 67 20 70 72 6f 63 65 73 73 2e  testing process.
21860 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
21870 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  #..             
21880 20 65 72 72 6f 72 20 5b 61 70 70 65 6e 64 41 72   error [appendAr
21890 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
218a0 20 20 20 20 20 20 20 20 22 63 6f 75 6c 64 20 6e          "could n
218b0 6f 74 20 76 65 72 69 66 79 20 62 75 69 6c 64 20  ot verify build 
218c0 64 69 72 65 63 74 6f 72 79 20 5c 22 22 20 24 64  directory \"" $d
218d0 69 72 65 63 74 6f 72 79 20 5c 0d 0a 20 20 20 20  irectory \..    
218e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 5c                "\
218f0 22 2c 20 61 6c 6c 20 74 65 73 74 69 6e 67 20 68  ", all testing h
21900 61 6c 74 65 64 22 5d 0d 0a 20 20 20 20 20 20 20  alted"]..       
21910 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
21920 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
21930 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
21940 4e 4f 54 45 3a 20 53 6b 69 70 20 74 72 79 69 6e  NOTE: Skip tryin
21950 67 20 74 6f 20 63 6f 70 79 20 61 6e 79 20 66 69  g to copy any fi
21960 6c 65 73 20 69 66 20 69 6e 73 74 72 75 63 74 65  les if instructe
21970 64 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  d...          #.
21980 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21  .          if {!
21990 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
219a0 6f 28 63 6f 70 79 53 71 6c 69 74 65 46 69 6c 65  o(copySqliteFile
219b0 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  s)]} then {..   
219c0 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69           if {![i
219d0 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
219e0 63 6f 70 79 53 71 6c 69 74 65 43 6f 6e 66 69 67  copySqliteConfig
219f0 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d  Files)]} then {.
21a00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66  .              f
21a10 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20  oreach fileName 
21a20 24 63 6f 6e 66 69 67 46 69 6c 65 4e 61 6d 65 73  $configFileNames
21a30 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
21a40 20 20 20 20 74 72 79 43 6f 70 79 42 75 69 6c 64      tryCopyBuild
21a50 46 69 6c 65 20 24 66 69 6c 65 4e 61 6d 65 0d 0a  File $fileName..
21a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
21a70 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
21a80 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
21a90 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
21aa0 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65 45  ::no(copySqliteE
21ab0 78 74 65 72 6e 61 6c 46 69 6c 65 73 29 5d 7d 20  xternalFiles)]} 
21ac0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
21ad0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
21ae0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43         # NOTE: C
21af0 6f 70 79 20 74 68 65 20 4d 61 6e 61 67 65 64 20  opy the Managed 
21b00 44 65 62 75 67 67 69 6e 67 20 41 73 73 69 73 74  Debugging Assist
21b10 61 6e 74 73 20 28 4d 44 41 29 20 63 6f 6e 66 69  ants (MDA) confi
21b20 67 75 72 61 74 69 6f 6e 0d 0a 20 20 20 20 20 20  guration..      
21b30 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
21b40 66 69 6c 65 20 66 6f 72 20 74 68 65 20 45 61 67  file for the Eag
21b50 6c 65 20 73 68 65 6c 6c 20 74 6f 20 74 68 65 20  le shell to the 
21b60 62 75 69 6c 64 20 6f 75 74 70 75 74 20 64 69 72  build output dir
21b70 65 63 74 6f 72 79 2c 0d 0a 20 20 20 20 20 20 20  ectory,..       
21b80 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 77         #       w
21b90 68 69 6c 65 20 75 73 69 6e 67 20 65 61 63 68 20  hile using each 
21ba0 6f 66 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20  of the names of 
21bb0 74 68 65 20 76 61 72 69 6f 75 73 20 6c 65 67 61  the various lega
21bc0 63 79 20 74 65 73 74 0d 0a 20 20 20 20 20 20 20  cy test..       
21bd0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 65         #       e
21be0 78 65 63 75 74 61 62 6c 65 73 2e 20 20 54 68 69  xecutables.  Thi
21bf0 73 20 77 69 6c 6c 20 68 65 6c 70 20 74 6f 20 6d  s will help to m
21c00 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 61 6c  ake sure that al
21c10 6c 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 20  l the..         
21c20 20 20 20 20 20 23 20 20 20 20 20 20 20 6c 65 67       #       leg
21c30 61 63 79 20 74 65 73 74 73 20 72 75 6e 20 77 69  acy tests run wi
21c40 74 68 20 65 78 61 63 74 6c 79 20 74 68 65 20 73  th exactly the s
21c50 61 6d 65 20 73 65 74 20 6f 66 20 4d 61 6e 61 67  ame set of Manag
21c60 65 64 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ed..            
21c70 20 20 23 20 20 20 20 20 20 20 44 65 62 75 67 67    #       Debugg
21c80 69 6e 67 20 41 73 73 69 73 74 61 6e 74 73 20 63  ing Assistants c
21c90 6f 6e 66 69 67 75 72 65 64 2e 0d 0a 20 20 20 20  onfigured...    
21ca0 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
21cb0 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61             forea
21cc0 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6d 64 61  ch fileName $mda
21cd0 43 6f 6e 66 69 67 46 69 6c 65 4e 61 6d 65 73 20  ConfigFileNames 
21ce0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
21cf0 20 20 20 74 72 79 43 6f 70 79 42 69 6e 61 72 79     tryCopyBinary
21d00 46 69 6c 65 20 45 61 67 6c 65 53 68 65 6c 6c 2e  File EagleShell.
21d10 65 78 65 2e 6d 64 61 2e 63 6f 6e 66 69 67 20 22  exe.mda.config "
21d20 22 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20  " $fileName..   
21d30 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
21d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
21d50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
21d60 20 4e 4f 54 45 3a 20 43 6f 70 79 20 74 68 65 20   NOTE: Copy the 
21d70 65 78 74 65 72 6e 61 6c 20 62 69 6e 61 72 69 65  external binarie
21d80 73 2c 20 69 66 20 61 6e 79 2c 20 74 6f 20 74 68  s, if any, to th
21d90 65 20 64 69 72 65 63 74 6f 72 79 20 74 68 61 74  e directory that
21da0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
21db0 23 20 20 20 20 20 20 20 63 6f 6e 74 61 69 6e 73  #       contains
21dc0 20 74 68 65 20 45 61 67 6c 65 20 73 68 65 6c 6c   the Eagle shell
21dd0 2e 20 20 54 68 69 73 20 69 73 20 74 79 70 69 63  .  This is typic
21de0 61 6c 6c 79 20 75 73 65 64 20 74 6f 20 6d 61 6b  ally used to mak
21df0 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e..             
21e00 20 23 20 20 20 20 20 20 20 73 75 72 65 20 61 73   #       sure as
21e10 73 65 6d 62 6c 69 65 73 20 72 65 66 65 72 65 6e  semblies referen
21e20 63 65 64 20 62 79 20 74 68 65 20 6f 6e 65 73 20  ced by the ones 
21e30 62 65 69 6e 67 20 74 65 73 74 65 64 20 61 72 65  being tested are
21e40 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
21e50 23 20 20 20 20 20 20 20 61 76 61 69 6c 61 62 6c  #       availabl
21e60 65 20 64 75 72 69 6e 67 20 74 68 65 20 74 65 73  e during the tes
21e70 74 69 6e 67 20 70 72 6f 63 65 73 73 2e 0d 0a 20  ting process... 
21e80 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a               #..
21e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f                fo
21ea0 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24  reach fileName $
21eb0 65 78 74 65 72 6e 61 6c 46 69 6c 65 4e 61 6d 65  externalFileName
21ec0 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s {..           
21ed0 20 20 20 20 20 74 72 79 43 6f 70 79 45 78 74 65       tryCopyExte
21ee0 72 6e 61 6c 46 69 6c 65 20 24 66 69 6c 65 4e 61  rnalFile $fileNa
21ef0 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  me..            
21f00 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
21f10 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
21f20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
21f30 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c  sts ::no(copySql
21f40 69 74 65 4e 61 74 69 76 65 46 69 6c 65 73 29 5d  iteNativeFiles)]
21f50 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
21f60 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
21f70 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
21f80 20 49 66 20 74 68 65 20 74 65 73 74 20 70 6c 61   If the test pla
21f90 74 66 6f 72 6d 20 69 73 20 6c 69 6b 65 6c 79 20  tform is likely 
21fa0 74 68 65 20 64 65 66 61 75 6c 74 20 66 6f 72 20  the default for 
21fb0 74 68 69 73 0d 0a 20 20 20 20 20 20 20 20 20 20  this..          
21fc0 20 20 20 20 23 20 20 20 20 20 20 20 6d 61 63 68      #       mach
21fd0 69 6e 65 2c 20 61 6c 73 6f 20 74 72 79 20 74 6f  ine, also try to
21fe0 20 63 6f 70 79 20 74 68 65 20 6e 61 74 69 76 65   copy the native
21ff0 20 66 69 6c 65 73 20 74 6f 20 74 68 65 0d 0a 20   files to the.. 
22000 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20               #  
22010 20 20 20 20 20 62 69 6e 61 72 79 20 6c 6f 63 61       binary loca
22020 74 69 6f 6e 2e 0d 0a 20 20 20 20 20 20 20 20 20  tion...         
22030 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
22040 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
22050 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70   exists ::no(cop
22060 79 53 71 6c 69 74 65 49 6d 70 6c 69 63 69 74 46  ySqliteImplicitF
22070 69 6c 65 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20  iles)] && \..   
22080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b                 [
22090 69 73 44 65 66 61 75 6c 74 42 75 69 6c 64 50 6c  isDefaultBuildPl
220a0 61 74 66 6f 72 6d 20 74 72 75 65 5d 7d 20 74 68  atform true]} th
220b0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
220c0 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69        foreach fi
220d0 6c 65 4e 61 6d 65 20 24 6e 61 74 69 76 65 46 69  leName $nativeFi
220e0 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20  leNames {..     
220f0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79               try
22100 43 6f 70 79 41 73 73 65 6d 62 6c 79 20 24 66 69  CopyAssembly $fi
22110 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20  leName..        
22120 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
22130 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
22140 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
22150 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
22160 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65 4e 6f 6e  no(copySqliteNon
22170 49 6d 70 6c 69 63 69 74 46 69 6c 65 73 29 5d 7d  ImplicitFiles)]}
22180 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
22190 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69           if {![i
221a0 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
221b0 63 6f 70 79 53 71 6c 69 74 65 50 6c 61 74 66 6f  copySqlitePlatfo
221c0 72 6d 46 69 6c 65 73 29 5d 20 26 26 20 5c 0d 0a  rmFiles)] && \..
221d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
221e0 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67      [string leng
221f0 74 68 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3e 20  th $platform] > 
22200 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
22210 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
22220 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6e  each fileName $n
22230 61 74 69 76 65 46 69 6c 65 4e 61 6d 65 73 20 7b  ativeFileNames {
22240 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
22250 20 20 20 20 20 20 74 72 79 43 6f 70 79 41 73 73        tryCopyAss
22260 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61 6d 65 20  embly $fileName 
22270 24 70 6c 61 74 66 6f 72 6d 0d 0a 20 20 20 20 20  $platform..     
22280 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
22290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
222a0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
222b0 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
222c0 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79  exists ::no(copy
222d0 53 71 6c 69 74 65 41 72 63 68 69 74 65 63 74 75  SqliteArchitectu
222e0 72 65 46 69 6c 65 73 29 5d 20 26 26 20 5c 0d 0a  reFiles)] && \..
222f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22300 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67      [string leng
22310 74 68 20 24 61 72 63 68 69 74 65 63 74 75 72 65  th $architecture
22320 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
22330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22340 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d   foreach fileNam
22350 65 20 24 6e 61 74 69 76 65 46 69 6c 65 4e 61 6d  e $nativeFileNam
22360 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  es {..          
22370 20 20 20 20 20 20 20 20 20 20 74 72 79 43 6f 70            tryCop
22380 79 41 73 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e  yAssembly $fileN
22390 61 6d 65 20 24 61 72 63 68 69 74 65 63 74 75 72  ame $architectur
223a0 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e..             
223b0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
223c0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
223d0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
223e0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
223f0 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69           if {![i
22400 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
22410 63 6f 70 79 53 71 6c 69 74 65 4d 61 6e 61 67 65  copySqliteManage
22420 64 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b  dFiles)]} then {
22430 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
22440 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65  foreach fileName
22450 20 24 6d 61 6e 61 67 65 64 46 69 6c 65 4e 61 6d   $managedFileNam
22460 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  es {..          
22470 20 20 20 20 20 20 74 72 79 43 6f 70 79 41 73 73        tryCopyAss
22480 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61 6d 65 0d  embly $fileName.
22490 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
224a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
224b0 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  .          }....
224c0 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
224d0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53         # NOTE: S
224e0 6b 69 70 20 74 72 79 69 6e 67 20 74 6f 20 6c 6f  kip trying to lo
224f0 61 64 20 61 6e 79 20 66 69 6c 65 73 20 69 66 20  ad any files if 
22500 69 6e 73 74 72 75 63 74 65 64 2e 0d 0a 20 20 20  instructed...   
22510 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
22520 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
22530 78 69 73 74 73 20 3a 3a 6e 6f 28 6c 6f 61 64 53  xists ::no(loadS
22540 71 6c 69 74 65 46 69 6c 65 73 29 5d 7d 20 74 68  qliteFiles)]} th
22550 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
22560 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
22570 73 74 73 20 3a 3a 6e 6f 28 6c 6f 61 64 53 71 6c  sts ::no(loadSql
22580 69 74 65 49 6d 70 6c 69 63 69 74 46 69 6c 65 73  iteImplicitFiles
22590 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
225a0 20 20 20 20 20 20 20 20 20 20 74 72 79 4c 6f 61            tryLoa
225b0 64 41 73 73 65 6d 62 6c 79 20 53 79 73 74 65 6d  dAssembly System
225c0 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c  .Data.SQLite.dll
225d0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
225e0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ...            i
225f0 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
22600 20 3a 3a 6e 6f 28 6c 6f 61 64 53 71 6c 69 74 65   ::no(loadSqlite
22610 4c 69 6e 71 46 69 6c 65 73 29 5d 7d 20 74 68 65  LinqFiles)]} the
22620 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
22630 20 20 20 74 72 79 4c 6f 61 64 41 73 73 65 6d 62     tryLoadAssemb
22640 6c 79 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  ly System.Data.S
22650 51 4c 69 74 65 2e 4c 69 6e 71 2e 64 6c 6c 0d 0a  QLite.Linq.dll..
22660 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
22670 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
22680 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
22690 3a 6e 6f 28 6c 6f 61 64 53 71 6c 69 74 65 45 66  :no(loadSqliteEf
226a0 36 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b  6Files)]} then {
226b0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
226c0 74 72 79 4c 6f 61 64 41 73 73 65 6d 62 6c 79 20  tryLoadAssembly 
226d0 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
226e0 74 65 2e 45 46 36 2e 64 6c 6c 0d 0a 20 20 20 20  te.EF6.dll..    
226f0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
22700 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69           if {![i
22710 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
22720 6c 6f 61 64 53 71 6c 69 74 65 4e 6f 6e 49 6d 70  loadSqliteNonImp
22730 6c 69 63 69 74 46 69 6c 65 73 29 5d 7d 20 74 68  licitFiles)]} th
22740 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
22750 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
22760 78 69 73 74 73 20 3a 3a 6e 6f 28 6c 6f 61 64 53  xists ::no(loadS
22770 71 6c 69 74 65 50 6c 61 74 66 6f 72 6d 46 69 6c  qlitePlatformFil
22780 65 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  es)] && \..     
22790 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 73 74               [st
227a0 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 70 6c 61  ring length $pla
227b0 74 66 6f 72 6d 5d 20 3e 20 30 7d 20 74 68 65 6e  tform] > 0} then
227c0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
227d0 20 20 20 20 74 72 79 4c 6f 61 64 41 73 73 65 6d      tryLoadAssem
227e0 62 6c 79 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  bly System.Data.
227f0 53 51 4c 69 74 65 2e 64 6c 6c 20 24 70 6c 61 74  SQLite.dll $plat
22800 66 6f 72 6d 0d 0a 20 20 20 20 20 20 20 20 20 20  form..          
22810 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
22820 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
22830 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 6c 6f  o exists ::no(lo
22840 61 64 53 71 6c 69 74 65 41 72 63 68 69 74 65 63  adSqliteArchitec
22850 74 75 72 65 46 69 6c 65 73 29 5d 20 26 26 20 5c  tureFiles)] && \
22860 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
22870 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67      [string leng
22880 74 68 20 24 61 72 63 68 69 74 65 63 74 75 72 65  th $architecture
22890 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
228a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
228b0 72 79 4c 6f 61 64 41 73 73 65 6d 62 6c 79 20 53  ryLoadAssembly S
228c0 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
228d0 65 2e 64 6c 6c 20 24 61 72 63 68 69 74 65 63 74  e.dll $architect
228e0 75 72 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ure..           
228f0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
22900 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d    }..          }
22910 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
22920 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66         foreach f
22930 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 5b 67 65 74  ileNameOnly [get
22940 4e 61 74 69 76 65 4c 69 62 72 61 72 79 46 69 6c  NativeLibraryFil
22950 65 4e 61 6d 65 73 4f 6e 6c 79 5d 20 7b 0d 0a 20  eNamesOnly] {.. 
22960 20 20 20 20 20 20 20 20 20 63 61 74 63 68 20 7b           catch {
22970 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
22980 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
22990 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
229a0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
229b0 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65     "---- file ve
229c0 72 73 69 6f 6e 20 6f 66 20 5c 22 22 20 24 66 69  rsion of \"" $fi
229d0 6c 65 4e 61 6d 65 4f 6e 6c 79 20 22 5c 22 2e 2e  leNameOnly "\"..
229e0 2e 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20  . \"" \..       
229f0 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 76           [file v
22a00 65 72 73 69 6f 6e 20 5b 67 65 74 42 69 6e 61 72  ersion [getBinar
22a10 79 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e  yFileName $fileN
22a20 61 6d 65 4f 6e 6c 79 5d 5d 20 5c 22 5c 6e 5d 0d  ameOnly]] \"\n].
22a30 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
22a40 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
22a50 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e     foreach fileN
22a60 61 6d 65 4f 6e 6c 79 20 5b 67 65 74 49 6e 74 65  ameOnly [getInte
22a70 72 6f 70 41 73 73 65 6d 62 6c 79 46 69 6c 65 4e  ropAssemblyFileN
22a80 61 6d 65 73 4f 6e 6c 79 5d 20 7b 0d 0a 20 20 20  amesOnly] {..   
22a90 20 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a         catch {..
22aa0 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
22ab0 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
22ac0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
22ad0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22ae0 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73   "---- file vers
22af0 69 6f 6e 20 6f 66 20 5c 22 22 20 24 66 69 6c 65  ion of \"" $file
22b00 4e 61 6d 65 4f 6e 6c 79 20 22 5c 22 2e 2e 2e 20  NameOnly "\"... 
22b10 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  \"" \..         
22b20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 76 65 72         [file ver
22b30 73 69 6f 6e 20 5b 67 65 74 42 69 6e 61 72 79 46  sion [getBinaryF
22b40 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d  ileName $fileNam
22b50 65 4f 6e 6c 79 5d 5d 20 5c 22 5c 6e 5d 0d 0a 20  eOnly]] \"\n].. 
22b60 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
22b70 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
22b80 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20   catch {..      
22b90 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
22ba0 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
22bb0 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
22bc0 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c         "---- fil
22bd0 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22 53  e version of \"S
22be0 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
22bf0 65 2e 64 6c 6c 5c 22 2e 2e 2e 20 5c 22 22 20 5c  e.dll\"... \"" \
22c00 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
22c10 5b 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 5b 67  [file version [g
22c20 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65  etBinaryFileName
22c30 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
22c40 69 74 65 2e 64 6c 6c 5d 5d 20 5c 22 5c 6e 5d 0d  ite.dll]] \"\n].
22c50 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
22c60 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20        catch {.. 
22c70 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
22c80 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
22c90 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
22ca0 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
22cb0 2d 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f  - file version o
22cc0 66 20 5c 22 53 79 73 74 65 6d 2e 44 61 74 61 2e  f \"System.Data.
22cd0 53 51 4c 69 74 65 2e 4c 69 6e 71 2e 64 6c 6c 5c  SQLite.Linq.dll\
22ce0 22 2e 2e 2e 20 5c 22 22 20 5c 0d 0a 20 20 20 20  "... \"" \..    
22cf0 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20            [file 
22d00 76 65 72 73 69 6f 6e 20 5b 67 65 74 42 69 6e 61  version [getBina
22d10 72 79 46 69 6c 65 4e 61 6d 65 20 53 79 73 74 65  ryFileName Syste
22d20 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 4c 69  m.Data.SQLite.Li
22d30 6e 71 2e 64 6c 6c 5d 5d 20 5c 0d 0a 20 20 20 20  nq.dll]] \..    
22d40 20 20 20 20 20 20 20 20 20 20 5c 22 5c 6e 5d 0d            \"\n].
22d50 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
22d60 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20        catch {.. 
22d70 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
22d80 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
22d90 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
22da0 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
22db0 2d 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f  - file version o
22dc0 66 20 5c 22 53 79 73 74 65 6d 2e 44 61 74 61 2e  f \"System.Data.
22dd0 53 51 4c 69 74 65 2e 45 46 36 2e 64 6c 6c 5c 22  SQLite.EF6.dll\"
22de0 2e 2e 2e 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20  ... \"" \..     
22df0 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 76           [file v
22e00 65 72 73 69 6f 6e 20 5b 67 65 74 42 69 6e 61 72  ersion [getBinar
22e10 79 46 69 6c 65 4e 61 6d 65 20 53 79 73 74 65 6d  yFileName System
22e20 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 45 46 36  .Data.SQLite.EF6
22e30 2e 64 6c 6c 5d 5d 20 5c 0d 0a 20 20 20 20 20 20  .dll]] \..      
22e40 20 20 20 20 20 20 20 20 5c 22 5c 6e 5d 0d 0a 20          \"\n].. 
22e50 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
22e60 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
22e70 6c 65 6e 67 74 68 20 24 70 6c 61 74 66 6f 72 6d  length $platform
22e80 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
22e90 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
22ea0 20 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 5b 67   fileNameOnly [g
22eb0 65 74 4e 61 74 69 76 65 4c 69 62 72 61 72 79 46  etNativeLibraryF
22ec0 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79 5d 20 7b 0d  ileNamesOnly] {.
22ed0 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 61 74  .            cat
22ee0 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
22ef0 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
22f00 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
22f10 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
22f20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
22f30 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66   file version of
22f40 20 5c 22 22 20 24 70 6c 61 74 66 6f 72 6d 20 5c   \"" $platform \
22f50 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
22f60 20 20 20 20 2f 20 24 66 69 6c 65 4e 61 6d 65 4f      / $fileNameO
22f70 6e 6c 79 20 22 5c 22 2e 2e 2e 20 5c 22 22 20 5b  nly "\"... \"" [
22f80 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 5c 0d 0a  file version \..
22f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22fa0 20 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65    [getBinaryFile
22fb0 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 4f 6e  Name $fileNameOn
22fc0 6c 79 20 24 70 6c 61 74 66 6f 72 6d 5d 5d 20 5c  ly $platform]] \
22fd0 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  "\n]..          
22fe0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d    }..          }
22ff0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 66 6f  ....          fo
23000 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 4f 6e  reach fileNameOn
23010 6c 79 20 5b 67 65 74 49 6e 74 65 72 6f 70 41 73  ly [getInteropAs
23020 73 65 6d 62 6c 79 46 69 6c 65 4e 61 6d 65 73 4f  semblyFileNamesO
23030 6e 6c 79 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20  nly] {..        
23040 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20      catch {..   
23050 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
23060 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
23070 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
23080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23090 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72    "---- file ver
230a0 73 69 6f 6e 20 6f 66 20 5c 22 22 20 24 70 6c 61  sion of \"" $pla
230b0 74 66 6f 72 6d 20 5c 0d 0a 20 20 20 20 20 20 20  tform \..       
230c0 20 20 20 20 20 20 20 20 20 20 20 2f 20 24 66 69             / $fi
230d0 6c 65 4e 61 6d 65 4f 6e 6c 79 20 22 5c 22 2e 2e  leNameOnly "\"..
230e0 2e 20 5c 22 22 20 5b 66 69 6c 65 20 76 65 72 73  . \"" [file vers
230f0 69 6f 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ion \..         
23100 20 20 20 20 20 20 20 20 20 5b 67 65 74 42 69 6e           [getBin
23110 61 72 79 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c  aryFileName $fil
23120 65 4e 61 6d 65 4f 6e 6c 79 20 24 70 6c 61 74 66  eNameOnly $platf
23130 6f 72 6d 5d 5d 20 5c 22 5c 6e 5d 0d 0a 20 20 20  orm]] \"\n]..   
23140 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
23150 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
23160 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20       catch {..  
23170 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
23180 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
23190 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
231a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
231b0 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73 69 6f  ---- file versio
231c0 6e 20 6f 66 20 5c 22 22 20 24 70 6c 61 74 66 6f  n of \"" $platfo
231d0 72 6d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  rm \..          
231e0 20 20 20 20 20 20 22 2f 53 79 73 74 65 6d 2e 44        "/System.D
231f0 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 5c 22  ata.SQLite.dll\"
23200 2e 2e 2e 20 5c 22 22 20 5b 66 69 6c 65 20 76 65  ... \"" [file ve
23210 72 73 69 6f 6e 20 5c 0d 0a 20 20 20 20 20 20 20  rsion \..       
23220 20 20 20 20 20 20 20 20 20 5b 67 65 74 42 69 6e           [getBin
23230 61 72 79 46 69 6c 65 4e 61 6d 65 20 53 79 73 74  aryFileName Syst
23240 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64  em.Data.SQLite.d
23250 6c 6c 20 24 70 6c 61 74 66 6f 72 6d 5d 5d 20 5c  ll $platform]] \
23260 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  "\n]..          
23270 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  }..        }....
23280 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72          if {[str
23290 69 6e 67 20 6c 65 6e 67 74 68 20 24 61 72 63 68  ing length $arch
232a0 69 74 65 63 74 75 72 65 5d 20 3e 20 30 7d 20 74  itecture] > 0} t
232b0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
232c0 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d   foreach fileNam
232d0 65 4f 6e 6c 79 20 5b 67 65 74 4e 61 74 69 76 65  eOnly [getNative
232e0 4c 69 62 72 61 72 79 46 69 6c 65 4e 61 6d 65 73  LibraryFileNames
232f0 4f 6e 6c 79 5d 20 7b 0d 0a 20 20 20 20 20 20 20  Only] {..       
23300 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20       catch {..  
23310 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
23320 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
23330 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
23340 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23350 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65     "---- file ve
23360 72 73 69 6f 6e 20 6f 66 20 5c 22 22 20 24 61 72  rsion of \"" $ar
23370 63 68 69 74 65 63 74 75 72 65 20 5c 0d 0a 20 20  chitecture \..  
23380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23390 2f 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20  / $fileNameOnly 
233a0 22 5c 22 2e 2e 2e 20 5c 22 22 20 5b 66 69 6c 65  "\"... \"" [file
233b0 20 76 65 72 73 69 6f 6e 20 5c 0d 0a 20 20 20 20   version \..    
233c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 67                [g
233d0 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65  etBinaryFileName
233e0 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 24   $fileNameOnly $
233f0 61 72 63 68 69 74 65 63 74 75 72 65 5d 5d 20 5c  architecture]] \
23400 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  "\n]..          
23410 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d    }..          }
23420 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 63 61  ....          ca
23430 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
23440 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
23450 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
23460 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
23470 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69          "---- fi
23480 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22  le version of \"
23490 22 20 24 61 72 63 68 69 74 65 63 74 75 72 65 20  " $architecture 
234a0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
234b0 20 20 20 2f 20 24 66 69 6c 65 4e 61 6d 65 4f 6e     / $fileNameOn
234c0 6c 79 20 22 5c 22 2e 2e 2e 20 5c 22 22 20 5b 66  ly "\"... \"" [f
234d0 69 6c 65 20 76 65 72 73 69 6f 6e 20 5c 0d 0a 20  ile version \.. 
234e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b                 [
234f0 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d  getBinaryFileNam
23500 65 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20  e $fileNameOnly 
23510 24 61 72 63 68 69 74 65 63 74 75 72 65 5d 5d 20  $architecture]] 
23520 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  \"\n]..         
23530 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
23540 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
23550 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
23560 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
23570 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
23580 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
23590 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66 20  file version of 
235a0 5c 22 22 20 24 61 72 63 68 69 74 65 63 74 75 72  \"" $architectur
235b0 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
235c0 20 20 20 20 20 22 2f 53 79 73 74 65 6d 2e 44 61       "/System.Da
235d0 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 5c 22 2e  ta.SQLite.dll\".
235e0 2e 2e 20 5c 22 22 20 5b 66 69 6c 65 20 76 65 72  .. \"" [file ver
235f0 73 69 6f 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20  sion \..        
23600 20 20 20 20 20 20 20 20 5b 67 65 74 42 69 6e 61          [getBina
23610 72 79 46 69 6c 65 4e 61 6d 65 20 53 79 73 74 65  ryFileName Syste
23620 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c  m.Data.SQLite.dl
23630 6c 20 24 61 72 63 68 69 74 65 63 74 75 72 65 5d  l $architecture]
23640 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ] \..           
23650 20 20 20 20 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20       \"\n]..    
23660 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
23670 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d   }....        #.
23680 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
23690 20 47 72 61 62 20 74 68 65 20 6c 69 73 74 20 6f   Grab the list o
236a0 66 20 6d 61 6e 61 67 65 64 20 61 73 73 65 6d 62  f managed assemb
236b0 6c 69 65 73 20 66 6f 72 20 74 68 65 20 63 75 72  lies for the cur
236c0 72 65 6e 74 20 70 72 6f 63 65 73 73 0d 0a 20 20  rent process..  
236d0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61 6e        #       an
236e0 64 20 72 65 70 6f 72 74 20 6f 6e 20 74 68 65 20  d report on the 
236f0 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
23700 74 65 20 72 65 6c 61 74 65 64 20 6f 6e 65 73 2e  te related ones.
23710 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
23720 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65 53 51       if {[haveSQ
23730 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e  LiteObjectComman
23740 64 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  d]} then {..    
23750 20 20 20 20 20 20 73 65 74 20 61 73 73 65 6d 62        set assemb
23760 6c 69 65 73 20 5b 6f 62 6a 65 63 74 20 69 6e 76  lies [object inv
23770 6f 6b 65 20 41 70 70 44 6f 6d 61 69 6e 2e 43 75  oke AppDomain.Cu
23780 72 72 65 6e 74 44 6f 6d 61 69 6e 20 47 65 74 41  rrentDomain GetA
23790 73 73 65 6d 62 6c 69 65 73 5d 0d 0a 0d 0a 20 20  ssemblies]....  
237a0 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 66          object f
237b0 6f 72 65 61 63 68 20 61 73 73 65 6d 62 6c 79 20  oreach assembly 
237c0 24 61 73 73 65 6d 62 6c 69 65 73 20 7b 0d 0a 20  $assemblies {.. 
237d0 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b             if {[
237e0 73 74 72 69 6e 67 20 6d 61 74 63 68 20 5c 7b 53  string match \{S
237f0 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
23800 65 2a 20 24 61 73 73 65 6d 62 6c 79 5d 7d 20 74  e* $assembly]} t
23810 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
23820 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
23830 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
23840 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
23850 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
23860 2d 20 66 6f 75 6e 64 20 6c 6f 61 64 65 64 20 61  - found loaded a
23870 73 73 65 6d 62 6c 79 3a 20 22 20 24 61 73 73 65  ssembly: " $asse
23880 6d 62 6c 79 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  mbly \n]..      
23890 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
238a0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
238b0 0a 0d 0a 20 20 20 20 20 20 20 20 63 61 74 63 68  ...        catch
238c0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70   {..          tp
238d0 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
238e0 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  nel \..         
238f0 20 20 20 20 20 22 2d 2d 2d 2d 20 64 65 66 69 6e       "---- defin
23900 65 20 63 6f 6e 73 74 61 6e 74 73 20 66 6f 72 20  e constants for 
23910 5c 22 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  \"System.Data.SQ
23920 4c 69 74 65 5c 22 2e 2e 2e 20 22 0d 0a 0d 0a 20  Lite\"... ".... 
23930 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61           if {[ca
23940 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
23950 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65     object invoke
23960 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c   -flags +NonPubl
23970 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ic \..          
23980 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74        System.Dat
23990 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 33  a.SQLite.SQLite3
239a0 20 44 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 73   DefineConstants
239b0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 64 65  ..          } de
239c0 66 69 6e 65 43 6f 6e 73 74 61 6e 74 73 5d 20 3d  fineConstants] =
239d0 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
239e0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
239f0 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
23a00 61 70 70 65 6e 64 41 72 67 73 20 5b 66 6f 72 6d  appendArgs [form
23a10 61 74 4c 69 73 74 20 5b 6c 73 6f 72 74 20 5c 0d  atList [lsort \.
23a20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23a30 20 24 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74   $defineConstant
23a40 73 5d 20 3c 6e 6f 6e 65 3e 5d 20 5c 6e 5d 0d 0a  s] <none>] \n]..
23a50 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
23a60 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
23a70 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
23a80 61 6e 6e 65 6c 20 75 6e 6b 6e 6f 77 6e 5c 6e 0d  annel unknown\n.
23a90 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
23aa0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
23ab0 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20     catch {..    
23ac0 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
23ad0 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20  est_channel \.. 
23ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
23af0 2d 2d 20 73 6f 75 72 63 65 20 76 65 72 73 69 6f  -- source versio
23b00 6e 20 6f 66 20 5c 22 53 79 73 74 65 6d 2e 44 61  n of \"System.Da
23b10 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 5c 22 2e  ta.SQLite.dll\".
23b20 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20  .. "....        
23b30 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
23b40 20 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65              obje
23b50 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73  ct invoke -flags
23b60 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20   +NonPublic \.. 
23b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
23b80 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
23b90 65 2e 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69  e.SQLiteConnecti
23ba0 6f 6e 20 50 72 6f 76 69 64 65 72 56 65 72 73 69  on ProviderVersi
23bb0 6f 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20  on..          } 
23bc0 76 65 72 73 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74  version] == 0} t
23bd0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
23be0 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
23bf0 65 6e 67 74 68 20 24 76 65 72 73 69 6f 6e 5d 20  ength $version] 
23c00 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
23c10 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
23c20 76 65 72 73 69 6f 6e 20 6e 75 6c 6c 0d 0a 20 20  version null..  
23c30 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
23c40 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
23c50 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
23c60 61 70 70 65 6e 64 41 72 67 73 20 24 76 65 72 73  appendArgs $vers
23c70 69 6f 6e 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ion \n]..       
23c80 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
23c90 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
23ca0 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 75  ::test_channel u
23cb0 6e 6b 6e 6f 77 6e 5c 6e 0d 0a 20 20 20 20 20 20  nknown\n..      
23cc0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
23cd0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63 61 74 63  ....        catc
23ce0 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74  h {..          t
23cf0 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
23d00 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20  nnel \..        
23d10 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6f 75 72        "---- sour
23d20 63 65 20 63 68 65 63 6b 6f 75 74 20 6f 66 20 5c  ce checkout of \
23d30 22 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c  "System.Data.SQL
23d40 69 74 65 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 0d 0a  ite.dll\"... "..
23d50 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
23d60 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
23d70 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76        object inv
23d80 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50  oke -flags +NonP
23d90 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20  ublic \..       
23da0 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e           System.
23db0 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69  Data.SQLite.SQLi
23dc0 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 50 72 6f  teConnection Pro
23dd0 76 69 64 65 72 53 6f 75 72 63 65 49 64 0d 0a 20  viderSourceId.. 
23de0 20 20 20 20 20 20 20 20 20 7d 20 73 6f 75 72 63           } sourc
23df0 65 49 64 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  eId] == 0} then 
23e00 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  {..            i
23e10 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  f {[string lengt
23e20 68 20 24 73 6f 75 72 63 65 49 64 5d 20 3d 3d 20  h $sourceId] == 
23e30 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
23e40 20 20 20 20 20 20 20 20 20 73 65 74 20 73 6f 75           set sou
23e50 72 63 65 49 64 20 6e 75 6c 6c 0d 0a 20 20 20 20  rceId null..    
23e60 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
23e70 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
23e80 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
23e90 70 65 6e 64 41 72 67 73 20 24 73 6f 75 72 63 65  pendArgs $source
23ea0 49 64 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  Id \n]..        
23eb0 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
23ec0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
23ed0 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 75 6e  :test_channel un
23ee0 6b 6e 6f 77 6e 5c 6e 0d 0a 20 20 20 20 20 20 20  known\n..       
23ef0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
23f00 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
23f10 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68        # NOTE: Ch
23f20 65 63 6b 20 74 68 65 20 61 76 61 69 6c 61 62 6c  eck the availabl
23f30 65 20 62 75 69 6c 64 73 20 28 61 6e 64 20 22 72  e builds (and "r
23f40 65 6c 65 61 73 65 73 22 29 20 6f 66 20 53 51 4c  eleases") of SQL
23f50 69 74 65 20 61 6e 64 0d 0a 20 20 20 20 20 20 20  ite and..       
23f60 20 23 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e   #       System.
23f70 44 61 74 61 2e 53 51 4c 69 74 65 2e 0d 0a 20 20  Data.SQLite...  
23f80 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
23f90 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 42   checkForSQLiteB
23fa0 75 69 6c 64 73 20 24 3a 3a 74 65 73 74 5f 63 68  uilds $::test_ch
23fb0 61 6e 6e 65 6c 0d 0a 20 20 20 20 20 20 20 20 63  annel..        c
23fc0 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 52 65 6c  heckForSQLiteRel
23fd0 65 61 73 65 73 20 24 3a 3a 74 65 73 74 5f 63 68  eases $::test_ch
23fe0 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20 20 20  annel....       
23ff0 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
24000 54 45 3a 20 4e 6f 77 2c 20 77 65 20 6e 65 65 64  TE: Now, we need
24010 20 74 6f 20 6b 6e 6f 77 20 69 66 20 74 68 65 20   to know if the 
24020 53 51 4c 69 74 65 20 63 6f 72 65 20 6c 69 62 72  SQLite core libr
24030 61 72 79 20 69 73 20 61 76 61 69 6c 61 62 6c 65  ary is available
24040 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
24050 20 20 28 69 2e 65 2e 20 62 65 63 61 75 73 65 20    (i.e. because 
24060 74 68 65 20 6d 61 6e 61 67 65 64 2d 6f 6e 6c 79  the managed-only
24070 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
24080 69 74 65 20 61 73 73 65 6d 62 6c 79 20 63 61 6e  ite assembly can
24090 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
240a0 20 20 6c 6f 61 64 20 77 69 74 68 6f 75 74 20 69    load without i
240b0 74 3b 20 68 6f 77 65 76 65 72 2c 20 69 74 20 63  t; however, it c
240c0 61 6e 6e 6f 74 20 64 6f 20 61 6e 79 74 68 69 6e  annot do anythin
240d0 67 20 75 73 65 66 75 6c 20 77 69 74 68 6f 75 74  g useful without
240e0 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
240f0 20 20 69 74 29 2e 20 20 49 66 20 77 65 20 61 72    it).  If we ar
24100 65 20 75 73 69 6e 67 20 74 68 65 20 6d 69 78 65  e using the mixe
24110 64 2d 6d 6f 64 65 20 61 73 73 65 6d 62 6c 79 20  d-mode assembly 
24120 61 6e 64 20 77 65 20 61 6c 72 65 61 64 79 0d 0a  and we already..
24130 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
24140 66 6f 75 6e 64 20 69 74 20 28 61 62 6f 76 65 29  found it (above)
24150 2c 20 74 68 69 73 20 73 68 6f 75 6c 64 20 61 6c  , this should al
24160 77 61 79 73 20 73 75 63 63 65 65 64 2e 0d 0a 20  ways succeed... 
24170 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
24180 20 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65    checkForSQLite
24190 4c 69 62 72 61 72 79 20 24 3a 3a 74 65 73 74 5f  Library $::test_
241a0 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20  channel....     
241b0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
241c0 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20 74  NOTE: Check if t
241d0 68 65 20 53 51 4c 69 74 65 20 69 6e 74 65 72 6f  he SQLite intero
241e0 70 20 61 73 73 65 6d 62 6c 79 20 69 73 20 61 76  p assembly is av
241f0 61 69 6c 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20  ailable...      
24200 20 20 23 0d 0a 20 20 20 20 20 20 20 20 63 68 65    #..        che
24210 63 6b 46 6f 72 53 51 4c 69 74 65 49 6e 74 65 72  ckForSQLiteInter
24220 6f 70 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  op $::test_chann
24230 65 6c 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d  el....        #.
24240 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
24250 20 43 68 65 63 6b 20 74 68 65 20 53 51 4c 69 74   Check the SQLit
24260 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 74  e database and t
24270 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f  emporary directo
24280 72 69 65 73 2e 0d 0a 20 20 20 20 20 20 20 20 23  ries...        #
24290 0d 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 46  ..        checkF
242a0 6f 72 53 51 4c 69 74 65 44 69 72 65 63 74 6f 72  orSQLiteDirector
242b0 69 65 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  ies $::test_chan
242c0 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23  nel....        #
242d0 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
242e0 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 64 65 74  : Attempt to det
242f0 65 72 6d 69 6e 65 20 69 66 20 76 61 72 69 6f 75  ermine if variou
24300 73 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f  s compile-time o
24310 70 74 69 6f 6e 73 20 6e 65 65 64 65 64 20 66 6f  ptions needed fo
24320 72 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  r..        #    
24330 20 20 20 74 65 73 74 20 63 6f 6e 73 74 72 61 69     test constrai
24340 6e 74 73 20 77 65 72 65 20 65 6e 61 62 6c 65 64  nts were enabled
24350 20 66 6f 72 20 74 68 65 20 6d 61 6e 61 67 65 64   for the managed
24360 20 61 73 73 65 6d 62 6c 79 2e 20 20 54 68 65 72   assembly.  Ther
24370 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
24380 20 20 20 61 72 65 20 73 6f 6d 65 20 63 6f 6d 70     are some comp
24390 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 73  ile-time options
243a0 20 74 68 61 74 20 6d 75 73 74 20 61 6c 73 6f 20   that must also 
243b0 68 61 76 65 20 62 65 65 6e 20 65 6e 61 62 6c 65  have been enable
243c0 64 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  d..        #    
243d0 20 20 20 66 6f 72 20 74 68 65 20 69 6e 74 65 72     for the inter
243e0 6f 70 20 61 73 73 65 6d 62 6c 79 20 69 6e 20 6f  op assembly in o
243f0 72 64 65 72 20 74 6f 20 62 65 20 65 66 66 65 63  rder to be effec
24400 74 69 76 65 2e 20 20 46 6f 72 20 74 68 6f 73 65  tive.  For those
24410 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
24420 20 20 6f 70 74 69 6f 6e 73 2c 20 69 74 20 77 69    options, it wi
24430 6c 6c 20 62 65 20 61 73 73 75 6d 65 64 20 74 68  ll be assumed th
24440 61 74 20 69 74 20 77 61 73 20 65 6e 61 62 6c 65  at it was enable
24450 64 20 66 6f 72 20 74 68 65 20 69 6e 74 65 72 6f  d for the intero
24460 70 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  p..        #    
24470 20 20 20 61 73 73 65 6d 62 6c 79 20 69 66 20 69     assembly if i
24480 74 20 77 61 73 20 65 6e 61 62 6c 65 64 20 66 6f  t was enabled fo
24490 72 20 74 68 65 20 6d 61 6e 61 67 65 64 20 61 73  r the managed as
244a0 73 65 6d 62 6c 79 2e 0d 0a 20 20 20 20 20 20 20  sembly...       
244b0 20 23 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 65   #..        fore
244c0 61 63 68 20 64 65 66 69 6e 65 43 6f 6e 73 74 61  ach defineConsta
244d0 6e 74 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20  nt [list \..    
244e0 20 20 20 20 20 20 20 20 43 48 45 43 4b 5f 53 54          CHECK_ST
244f0 41 54 45 20 43 4f 55 4e 54 5f 48 41 4e 44 4c 45  ATE COUNT_HANDLE
24500 20 44 45 42 55 47 20 49 4e 54 45 52 4f 50 5f 43   DEBUG INTEROP_C
24510 4f 44 45 43 20 49 4e 54 45 52 4f 50 5f 44 45 42  ODEC INTEROP_DEB
24520 55 47 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  UG \..          
24530 20 20 49 4e 54 45 52 4f 50 5f 45 58 54 45 4e 53    INTEROP_EXTENS
24540 49 4f 4e 5f 46 55 4e 43 54 49 4f 4e 53 20 49 4e  ION_FUNCTIONS IN
24550 54 45 52 4f 50 5f 46 54 53 35 5f 45 58 54 45 4e  TEROP_FTS5_EXTEN
24560 53 49 4f 4e 20 5c 0d 0a 20 20 20 20 20 20 20 20  SION \..        
24570 20 20 20 20 49 4e 54 45 52 4f 50 5f 49 4e 43 4c      INTEROP_INCL
24580 55 44 45 5f 43 45 52 4f 44 20 49 4e 54 45 52 4f  UDE_CEROD INTERO
24590 50 5f 49 4e 43 4c 55 44 45 5f 45 58 54 52 41 20  P_INCLUDE_EXTRA 
245a0 49 4e 54 45 52 4f 50 5f 49 4e 43 4c 55 44 45 5f  INTEROP_INCLUDE_
245b0 53 45 45 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  SEE \..         
245c0 20 20 20 49 4e 54 45 52 4f 50 5f 49 4e 43 4c 55     INTEROP_INCLU
245d0 44 45 5f 5a 49 50 56 46 53 20 49 4e 54 45 52 4f  DE_ZIPVFS INTERO
245e0 50 5f 4a 53 4f 4e 31 5f 45 58 54 45 4e 53 49 4f  P_JSON1_EXTENSIO
245f0 4e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  N \..           
24600 20 49 4e 54 45 52 4f 50 5f 4c 45 47 41 43 59 5f   INTEROP_LEGACY_
24610 43 4c 4f 53 45 20 49 4e 54 45 52 4f 50 5f 4c 4f  CLOSE INTEROP_LO
24620 47 20 49 4e 54 45 52 4f 50 5f 50 45 52 43 45 4e  G INTEROP_PERCEN
24630 54 49 4c 45 5f 45 58 54 45 4e 53 49 4f 4e 20 5c  TILE_EXTENSION \
24640 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 49 4e  ..            IN
24650 54 45 52 4f 50 5f 52 45 47 45 58 50 5f 45 58 54  TEROP_REGEXP_EXT
24660 45 4e 53 49 4f 4e 20 49 4e 54 45 52 4f 50 5f 54  ENSION INTEROP_T
24670 45 53 54 5f 45 58 54 45 4e 53 49 4f 4e 20 5c 0d  EST_EXTENSION \.
24680 0a 20 20 20 20 20 20 20 20 20 20 20 20 49 4e 54  .            INT
24690 45 52 4f 50 5f 54 4f 54 59 50 45 5f 45 58 54 45  EROP_TOTYPE_EXTE
246a0 4e 53 49 4f 4e 20 49 4e 54 45 52 4f 50 5f 56 49  NSION INTEROP_VI
246b0 52 54 55 41 4c 5f 54 41 42 4c 45 20 4e 45 54 5f  RTUAL_TABLE NET_
246c0 32 30 20 4e 45 54 5f 33 35 20 5c 0d 0a 20 20 20  20 NET_35 \..   
246d0 20 20 20 20 20 20 20 20 20 4e 45 54 5f 34 30 20           NET_40 
246e0 4e 45 54 5f 34 35 20 4e 45 54 5f 34 35 31 20 4e  NET_45 NET_451 N
246f0 45 54 5f 34 35 32 20 4e 45 54 5f 34 36 20 4e 45  ET_452 NET_46 NE
24700 54 5f 34 36 31 20 4e 45 54 5f 43 4f 4d 50 41 43  T_461 NET_COMPAC
24710 54 5f 32 30 20 5c 0d 0a 20 20 20 20 20 20 20 20  T_20 \..        
24720 20 20 20 20 50 4c 41 54 46 4f 52 4d 5f 43 4f 4d      PLATFORM_COM
24730 50 41 43 54 46 52 41 4d 45 57 4f 52 4b 20 50 52  PACTFRAMEWORK PR
24740 45 4c 4f 41 44 5f 4e 41 54 49 56 45 5f 4c 49 42  ELOAD_NATIVE_LIB
24750 52 41 52 59 20 52 45 54 41 52 47 45 54 41 42 4c  RARY RETARGETABL
24760 45 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  E \..           
24770 20 53 51 4c 49 54 45 5f 53 54 41 4e 44 41 52 44   SQLITE_STANDARD
24780 20 54 48 52 4f 57 5f 4f 4e 5f 44 49 53 50 4f 53   THROW_ON_DISPOS
24790 45 44 20 54 52 41 43 45 20 54 52 41 43 45 5f 43  ED TRACE TRACE_C
247a0 4f 4e 4e 45 43 54 49 4f 4e 20 5c 0d 0a 20 20 20  ONNECTION \..   
247b0 20 20 20 20 20 20 20 20 20 54 52 41 43 45 5f 44           TRACE_D
247c0 45 54 45 43 54 49 4f 4e 20 54 52 41 43 45 5f 48  ETECTION TRACE_H
247d0 41 4e 44 4c 45 20 54 52 41 43 45 5f 50 52 45 4c  ANDLE TRACE_PREL
247e0 4f 41 44 20 54 52 41 43 45 5f 53 48 41 52 45 44  OAD TRACE_SHARED
247f0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
24800 54 52 41 43 45 5f 53 54 41 54 45 4d 45 4e 54 20  TRACE_STATEMENT 
24810 54 52 41 43 45 5f 57 41 52 4e 49 4e 47 20 54 52  TRACE_WARNING TR
24820 41 43 4b 5f 4d 45 4d 4f 52 59 5f 42 59 54 45 53  ACK_MEMORY_BYTES
24830 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
24840 55 53 45 5f 45 4e 54 49 54 59 5f 46 52 41 4d 45  USE_ENTITY_FRAME
24850 57 4f 52 4b 5f 36 20 55 53 45 5f 49 4e 54 45 52  WORK_6 USE_INTER
24860 4f 50 5f 44 4c 4c 20 55 53 45 5f 50 52 45 50 41  OP_DLL USE_PREPA
24870 52 45 5f 56 32 20 57 49 4e 44 4f 57 53 5d 20 7b  RE_V2 WINDOWS] {
24880 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
24890 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
248a0 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 63 6f   Check if the co
248b0 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f  mpile-time optio
248c0 6e 20 69 73 20 6c 69 73 74 65 64 20 69 6e 20 74  n is listed in t
248d0 68 65 20 6c 69 73 74 20 6f 66 0d 0a 20 20 20 20  he list of..    
248e0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 22 64        #       "d
248f0 65 66 69 6e 65 20 63 6f 6e 73 74 61 6e 74 73 22  efine constants"
24900 20 6b 65 70 74 20 74 72 61 63 6b 20 6f 66 20 62   kept track of b
24910 79 20 74 68 65 20 6d 61 6e 61 67 65 64 20 61 73  y the managed as
24920 73 65 6d 62 6c 79 2e 0d 0a 20 20 20 20 20 20 20  sembly...       
24930 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
24940 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 44 65  checkForSQLiteDe
24950 66 69 6e 65 43 6f 6e 73 74 61 6e 74 20 24 3a 3a  fineConstant $::
24960 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 64 65  test_channel $de
24970 66 69 6e 65 43 6f 6e 73 74 61 6e 74 0d 0a 20 20  fineConstant..  
24980 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
24990 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
249a0 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20 74  NOTE: Check if t
249b0 68 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  he System.Data.S
249c0 51 4c 69 74 65 20 70 72 6f 76 69 64 65 72 20 77  QLite provider w
249d0 61 73 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68  as compiled with
249e0 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
249f0 20 20 73 75 70 70 6f 72 74 20 66 6f 72 20 61 6e    support for an
24a00 79 20 65 6e 63 72 79 70 74 65 64 20 64 61 74 61  y encrypted data
24a10 62 61 73 65 73 2e 0d 0a 20 20 20 20 20 20 20 20  bases...        
24a20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  #..        if {[
24a30 68 61 76 65 53 51 4c 69 74 65 44 65 66 69 6e 65  haveSQLiteDefine
24a40 43 6f 6e 73 74 61 6e 74 20 49 4e 54 45 52 4f 50  Constant INTEROP
24a50 5f 43 4f 44 45 43 5d 20 7c 7c 20 5c 0d 0a 20 20  _CODEC] || \..  
24a60 20 20 20 20 20 20 20 20 20 20 5b 68 61 76 65 53            [haveS
24a70 51 4c 69 74 65 44 65 66 69 6e 65 43 6f 6e 73 74  QLiteDefineConst
24a80 61 6e 74 20 49 4e 54 45 52 4f 50 5f 49 4e 43 4c  ant INTEROP_INCL
24a90 55 44 45 5f 53 45 45 5d 7d 20 74 68 65 6e 20 7b  UDE_SEE]} then {
24aa0 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
24ab0 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
24ac0 20 59 65 73 2c 20 61 64 64 20 67 65 6e 65 72 69   Yes, add generi
24ad0 63 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 6f 72  c constraint for
24ae0 20 75 73 65 20 62 79 20 74 68 65 20 74 65 73 74   use by the test
24af0 20 73 75 69 74 65 2e 0d 0a 20 20 20 20 20 20 20   suite...       
24b00 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
24b10 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 53 79  addConstraint Sy
24b20 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
24b30 2e 45 6e 63 72 79 70 74 69 6f 6e 0d 0a 20 20 20  .Encryption..   
24b40 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
24b50 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
24b60 4f 54 45 3a 20 43 68 65 63 6b 20 74 68 65 20 63  OTE: Check the c
24b70 75 72 72 65 6e 74 20 62 75 69 6c 64 20 79 65 61  urrent build yea
24b80 72 2e 20 20 42 61 73 69 63 61 6c 6c 79 2c 20 74  r.  Basically, t
24b90 68 69 73 20 69 6e 64 69 63 61 74 65 73 0d 0a 20  his indicates.. 
24ba0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 77         #       w
24bb0 68 69 63 68 20 76 65 72 73 69 6f 6e 20 6f 66 20  hich version of 
24bc0 4d 53 42 75 69 6c 64 20 61 6e 64 2f 6f 72 20 56  MSBuild and/or V
24bd0 69 73 75 61 6c 20 53 74 75 64 69 6f 20 77 61 73  isual Studio was
24be0 20 75 73 65 64 20 74 6f 0d 0a 20 20 20 20 20 20   used to..      
24bf0 20 20 23 20 20 20 20 20 20 20 63 6f 6d 70 69 6c    #       compil
24c00 65 20 74 68 65 20 61 73 73 65 6d 62 6c 79 20 62  e the assembly b
24c10 69 6e 61 72 69 65 73 20 75 6e 64 65 72 20 74 65  inaries under te
24c20 73 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  st...        #..
24c30 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
24c40 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d  :test_channel \.
24c50 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d  .            "--
24c60 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20  -- checking for 
24c70 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
24c80 74 65 20 62 75 69 6c 64 20 79 65 61 72 2e 2e 2e  te build year...
24c90 20 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65   "....        se
24ca0 74 20 79 65 61 72 20 5b 67 65 74 42 75 69 6c 64  t year [getBuild
24cb0 59 65 61 72 5d 0d 0a 20 20 20 20 20 20 20 20 61  Year]..        a
24cc0 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70  ddConstraint [ap
24cd0 70 65 6e 64 41 72 67 73 20 62 75 69 6c 64 59 65  pendArgs buildYe
24ce0 61 72 2e 20 24 79 65 61 72 5d 0d 0a 20 20 20 20  ar. $year]..    
24cf0 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
24d00 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
24d10 64 41 72 67 73 20 5c 22 20 24 79 65 61 72 20 5c  dArgs \" $year \
24d20 22 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  "\n]....        
24d30 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
24d40 45 3a 20 43 68 65 63 6b 20 74 68 65 20 63 75 72  E: Check the cur
24d50 72 65 6e 74 20 62 75 69 6c 64 20 2e 4e 45 54 20  rent build .NET 
24d60 46 72 61 6d 65 77 6f 72 6b 2e 20 20 42 61 73 69  Framework.  Basi
24d70 63 61 6c 6c 79 2c 20 74 68 69 73 0d 0a 20 20 20  cally, this..   
24d80 20 20 20 20 20 23 20 20 20 20 20 20 20 69 6e 64       #       ind
24d90 69 63 61 74 65 73 20 77 68 69 63 68 20 76 65 72  icates which ver
24da0 73 69 6f 6e 20 6f 66 20 74 68 65 20 2e 4e 45 54  sion of the .NET
24db0 20 46 72 61 6d 65 77 6f 72 6b 20 69 73 20 62 65   Framework is be
24dc0 69 6e 67 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ing..        #  
24dd0 20 20 20 20 20 75 73 65 64 20 62 79 20 74 68 65       used by the
24de0 20 61 73 73 65 6d 62 6c 79 20 62 69 6e 61 72 69   assembly binari
24df0 65 73 20 75 6e 64 65 72 20 74 65 73 74 2e 0d 0a  es under test...
24e00 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
24e10 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
24e20 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20  _channel \..    
24e30 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68          "---- ch
24e40 65 63 6b 69 6e 67 20 66 6f 72 20 53 79 73 74 65  ecking for Syste
24e50 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 62 75  m.Data.SQLite bu
24e60 69 6c 64 20 2e 4e 45 54 20 46 72 61 6d 65 77 6f  ild .NET Framewo
24e70 72 6b 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20  rk... "....     
24e80 20 20 20 73 65 74 20 6e 65 74 46 78 20 5b 67 65     set netFx [ge
24e90 74 42 75 69 6c 64 4e 65 74 46 78 5d 0d 0a 20 20  tBuildNetFx]..  
24ea0 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61        addConstra
24eb0 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20  int [appendArgs 
24ec0 62 75 69 6c 64 46 72 61 6d 65 77 6f 72 6b 2e 20  buildFramework. 
24ed0 24 6e 65 74 46 78 5d 0d 0a 20 20 20 20 20 20 20  $netFx]..       
24ee0 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
24ef0 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
24f00 67 73 20 5c 22 20 24 6e 65 74 46 78 20 5c 22 5c  gs \" $netFx \"\
24f10 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d  n]....        #.
24f20 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
24f30 20 43 68 65 63 6b 20 74 68 65 20 63 75 72 72 65   Check the curre
24f40 6e 74 20 62 75 69 6c 64 20 63 6f 6e 66 69 67 75  nt build configu
24f50 72 61 74 69 6f 6e 2e 20 20 54 68 69 73 20 73 68  ration.  This sh
24f60 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79 0d 0a 20  ould normally.. 
24f70 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62         #       b
24f80 65 20 65 69 74 68 65 72 20 22 44 65 62 75 67 22  e either "Debug"
24f90 20 6f 72 20 22 52 65 6c 65 61 73 65 22 2e 0d 0a   or "Release"...
24fa0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
24fb0 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
24fc0 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20  _channel \..    
24fd0 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68          "---- ch
24fe0 65 63 6b 69 6e 67 20 66 6f 72 20 53 79 73 74 65  ecking for Syste
24ff0 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 62 75  m.Data.SQLite bu
25000 69 6c 64 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  ild configuratio
25010 6e 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20  n... "....      
25020 20 20 73 65 74 20 63 6f 6e 66 69 67 75 72 61 74    set configurat
25030 69 6f 6e 20 5b 67 65 74 42 75 69 6c 64 43 6f 6e  ion [getBuildCon
25040 66 69 67 75 72 61 74 69 6f 6e 5d 0d 0a 20 20 20  figuration]..   
25050 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
25060 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 62  nt [appendArgs b
25070 75 69 6c 64 43 6f 6e 66 69 67 75 72 61 74 69 6f  uildConfiguratio
25080 6e 2e 20 24 63 6f 6e 66 69 67 75 72 61 74 69 6f  n. $configuratio
25090 6e 5d 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74  n]..        tput
250a0 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
250b0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 22  l [appendArgs \"
250c0 20 24 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20   $configuration 
250d0 5c 22 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  \"\n]....       
250e0 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
250f0 54 45 3a 20 54 72 79 20 74 6f 20 73 65 74 75 70  TE: Try to setup
25100 20 61 6e 20 69 6e 74 65 72 72 75 70 74 20 63 61   an interrupt ca
25110 6c 6c 62 61 63 6b 20 75 73 69 6e 67 20 74 68 65  llback using the
25120 20 73 63 72 69 70 74 20 64 65 62 75 67 67 65 72   script debugger
25130 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
25140 20 20 74 68 61 74 20 77 69 6c 6c 20 63 61 6e 63    that will canc
25150 65 6c 20 61 6c 6c 20 53 51 4c 20 71 75 65 72 69  el all SQL queri
25160 65 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20 66  es in progress f
25170 6f 72 20 61 6c 6c 20 64 61 74 61 62 61 73 65 0d  or all database.
25180 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
25190 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6b 6e 6f   connections kno
251a0 77 6e 20 74 6f 20 74 68 69 73 20 69 6e 74 65 72  wn to this inter
251b0 70 72 65 74 65 72 2e 0d 0a 20 20 20 20 20 20 20  preter...       
251c0 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   #..        if {
251d0 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
251e0 6e 6f 28 73 71 6c 69 74 65 49 6e 74 65 72 72 75  no(sqliteInterru
251f0 70 74 43 61 6c 6c 62 61 63 6b 29 5d 7d 20 74 68  ptCallback)]} th
25200 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
25210 73 65 74 75 70 44 62 49 6e 74 65 72 72 75 70 74  setupDbInterrupt
25220 43 61 6c 6c 62 61 63 6b 20 24 3a 3a 74 65 73 74  Callback $::test
25230 5f 63 68 61 6e 6e 65 6c 20 24 3a 3a 74 65 73 74  _channel $::test
25240 5f 6c 6f 67 0d 0a 20 20 20 20 20 20 20 20 7d 0d  _log..        }.
25250 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
25260 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68        # NOTE: Ch
25270 65 63 6b 20 66 6f 72 20 74 68 65 20 6e 61 74 69  eck for the nati
25280 76 65 20 72 75 6e 74 69 6d 65 20 6f 70 74 69 6f  ve runtime optio
25290 6e 2c 20 77 68 69 63 68 20 77 6f 75 6c 64 20 6d  n, which would m
252a0 65 61 6e 20 77 65 20 61 72 65 0d 0a 20 20 20 20  ean we are..    
252b0 20 20 20 20 23 20 20 20 20 20 20 20 75 73 69 6e      #       usin
252c0 67 20 74 68 65 20 6d 69 78 65 64 2d 6d 6f 64 65  g the mixed-mode
252d0 20 61 73 73 65 6d 62 6c 79 2e 0d 0a 20 20 20 20   assembly...    
252e0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 63      #..        c
252f0 68 65 63 6b 46 6f 72 52 75 6e 74 69 6d 65 4f 70  heckForRuntimeOp
25300 74 69 6f 6e 20 24 3a 3a 74 65 73 74 5f 63 68 61  tion $::test_cha
25310 6e 6e 65 6c 20 6e 61 74 69 76 65 0d 0a 0d 0a 20  nnel native.... 
25320 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
25330 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20    # NOTE: Check 
25340 69 66 20 74 68 65 20 74 65 73 74 20 73 75 69 74  if the test suit
25350 65 20 73 68 6f 75 6c 64 20 63 6f 75 6e 74 20 74  e should count t
25360 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6e  he number of con
25370 6e 65 63 74 69 6f 6e 73 0d 0a 20 20 20 20 20 20  nections..      
25380 20 20 23 20 20 20 20 20 20 20 22 6f 70 65 6e 65    #       "opene
25390 64 22 20 61 6e 64 20 22 63 6c 6f 73 65 64 22 20  d" and "closed" 
253a0 66 72 6f 6d 20 74 68 65 20 70 6f 6f 6c 20 77 68  from the pool wh
253b0 65 6e 20 64 65 74 65 72 6d 69 6e 69 6e 67 20 69  en determining i
253c0 66 20 61 20 74 65 73 74 0d 0a 20 20 20 20 20 20  f a test..      
253d0 20 20 23 20 20 20 20 20 20 20 70 61 73 73 65 64    #       passed
253e0 2e 20 20 44 69 73 61 62 6c 69 6e 67 20 74 68 69  .  Disabling thi
253f0 73 20 62 65 68 61 76 69 6f 72 20 69 73 20 73 6f  s behavior is so
25400 6d 65 74 69 6d 65 73 20 6e 65 63 65 73 73 61 72  metimes necessar
25410 79 20 28 65 2e 67 2e 0d 0a 20 20 20 20 20 20 20  y (e.g...       
25420 20 23 20 20 20 20 20 20 20 64 75 72 69 6e 67 20   #       during 
25430 74 68 65 20 72 65 6c 65 61 73 65 20 74 65 73 74  the release test
25440 69 6e 67 20 70 72 6f 63 65 73 73 29 20 62 65 63  ing process) bec
25450 61 75 73 65 20 74 68 65 72 65 20 61 72 65 20 73  ause there are s
25460 65 76 65 72 61 6c 0d 0a 20 20 20 20 20 20 20 20  everal..        
25470 23 20 20 20 20 20 20 20 74 65 73 74 73 20 74 68  #       tests th
25480 61 74 20 72 65 6c 79 20 6f 6e 20 74 68 65 20 22  at rely on the "
25490 6f 70 65 6e 65 64 20 66 72 6f 6d 20 70 6f 6f 6c  opened from pool
254a0 22 20 63 6f 75 6e 74 20 62 65 69 6e 67 20 67 72  " count being gr
254b0 65 61 74 65 72 0d 0a 20 20 20 20 20 20 20 20 23  eater..        #
254c0 20 20 20 20 20 20 20 74 68 61 6e 20 7a 65 72 6f         than zero
254d0 2e 20 20 54 68 65 73 65 20 74 65 73 74 73 20 6d  .  These tests m
254e0 61 79 20 66 61 69 6c 20 64 75 65 20 74 6f 20 74  ay fail due to t
254f0 68 65 20 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e 69  he non-determini
25500 73 74 69 63 0d 0a 20 20 20 20 20 20 20 20 23 20  stic..        # 
25510 20 20 20 20 20 20 62 65 68 61 76 69 6f 72 20 6f        behavior o
25520 66 20 74 68 65 20 43 4c 52 20 47 43 2c 20 65 76  f the CLR GC, ev
25530 65 6e 20 77 68 65 6e 20 74 68 65 72 65 20 69 73  en when there is
25540 20 6e 6f 20 62 75 67 20 69 6e 20 74 68 65 20 63   no bug in the c
25550 6f 64 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ode..        #  
25560 20 20 20 20 20 62 65 69 6e 67 20 74 65 73 74 65       being teste
25570 64 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  d...        #.. 
25580 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 52         checkForR
25590 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 24 3a 3a  untimeOption $::
255a0 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 6e 6f 50  test_channel noP
255b0 6f 6f 6c 43 6f 75 6e 74 73 0d 0a 0d 0a 20 20 20  oolCounts....   
255c0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
255d0 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66  # NOTE: Check if
255e0 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65 20   the test suite 
255f0 73 68 6f 75 6c 64 20 75 73 65 20 73 68 61 72 65  should use share
25600 64 2d 63 61 63 68 65 20 6d 6f 64 65 2e 0d 0a 20  d-cache mode... 
25610 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
25620 20 20 63 68 65 63 6b 46 6f 72 52 75 6e 74 69 6d    checkForRuntim
25630 65 4f 70 74 69 6f 6e 20 24 3a 3a 74 65 73 74 5f  eOption $::test_
25640 63 68 61 6e 6e 65 6c 20 73 68 61 72 65 64 43 61  channel sharedCa
25650 63 68 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23  che....        #
25660 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
25670 3a 20 52 65 70 6f 72 74 20 74 68 65 20 72 65 73  : Report the res
25680 6f 75 72 63 65 20 75 73 61 67 65 20 70 72 69 6f  ource usage prio
25690 72 20 74 6f 20 72 75 6e 6e 69 6e 67 20 61 6e 79  r to running any
256a0 20 74 65 73 74 73 2e 0d 0a 20 20 20 20 20 20 20   tests...       
256b0 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 70 6f   #..        repo
256c0 72 74 53 51 4c 69 74 65 52 65 73 6f 75 72 63 65  rtSQLiteResource
256d0 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
256e0 6c 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  l....        #..
256f0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
25700 47 72 61 62 20 74 68 65 20 6c 69 73 74 20 6f 66  Grab the list of
25710 20 6e 61 74 69 76 65 20 6d 6f 64 75 6c 65 73 20   native modules 
25720 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
25730 70 72 6f 63 65 73 73 20 61 6e 64 0d 0a 20 20 20  process and..   
25740 20 20 20 20 20 23 20 20 20 20 20 20 20 72 65 70       #       rep
25750 6f 72 74 20 6f 6e 20 74 68 65 20 53 79 73 74 65  ort on the Syste
25760 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 72 65  m.Data.SQLite re
25770 6c 61 74 65 64 20 6f 6e 65 73 2e 0d 0a 20 20 20  lated ones...   
25780 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
25790 69 66 20 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f  if {[haveSQLiteO
257a0 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74  bjectCommand]} t
257b0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
257c0 20 73 65 74 20 6d 6f 64 75 6c 65 73 20 5b 6f 62   set modules [ob
257d0 6a 65 63 74 20 69 6e 76 6f 6b 65 20 5c 0d 0a 20  ject invoke \.. 
257e0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73               Sys
257f0 74 65 6d 2e 44 69 61 67 6e 6f 73 74 69 63 73 2e  tem.Diagnostics.
25800 50 72 6f 63 65 73 73 2e 47 65 74 43 75 72 72 65  Process.GetCurre
25810 6e 74 50 72 6f 63 65 73 73 20 4d 6f 64 75 6c 65  ntProcess Module
25820 73 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  s]....          
25830 6f 62 6a 65 63 74 20 66 6f 72 65 61 63 68 20 2d  object foreach -
25840 61 6c 69 61 73 20 6d 6f 64 75 6c 65 20 24 6d 6f  alias module $mo
25850 64 75 6c 65 73 20 7b 0d 0a 20 20 20 20 20 20 20  dules {..       
25860 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
25870 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20      # NOTE: The 
25880 6d 6f 64 75 6c 65 20 66 69 6c 65 20 6e 61 6d 65  module file name
25890 20 68 65 72 65 20 6d 75 73 74 20 62 65 20 6e 6f   here must be no
258a0 72 6d 61 6c 69 7a 65 64 2e 0d 0a 20 20 20 20 20  rmalized...     
258b0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
258c0 20 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61        set fileNa
258d0 6d 65 20 5b 66 69 6c 65 20 6e 6f 72 6d 61 6c 69  me [file normali
258e0 7a 65 20 5b 24 6d 6f 64 75 6c 65 20 46 69 6c 65  ze [$module File
258f0 4e 61 6d 65 5d 5d 0d 0a 20 20 20 20 20 20 20 20  Name]]..        
25900 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65      set fileName
25910 4f 6e 6c 79 20 5b 66 69 6c 65 20 74 61 69 6c 20  Only [file tail 
25920 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20 20  $fileName]....  
25930 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 6c            if {[l
25940 73 65 61 72 63 68 20 2d 65 78 61 63 74 20 2d 6e  search -exact -n
25950 6f 63 61 73 65 20 2d 2d 20 5c 0d 0a 20 20 20 20  ocase -- \..    
25960 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74              [get
25970 4e 61 74 69 76 65 4c 69 62 72 61 72 79 46 69 6c  NativeLibraryFil
25980 65 4e 61 6d 65 73 4f 6e 6c 79 5d 20 24 66 69 6c  eNamesOnly] $fil
25990 65 4e 61 6d 65 4f 6e 6c 79 5d 20 21 3d 20 2d 31  eNameOnly] != -1
259a0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
259b0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
259c0 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
259d0 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
259e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
259f0 2d 2d 2d 2d 20 66 6f 75 6e 64 20 6c 6f 61 64 65  ---- found loade
25a00 64 20 53 51 4c 69 74 65 20 6e 61 74 69 76 65 20  d SQLite native 
25a10 6c 69 62 72 61 72 79 20 6d 6f 64 75 6c 65 3a 20  library module: 
25a20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
25a30 20 20 20 20 20 20 20 24 66 69 6c 65 4e 61 6d 65         $fileName
25a40 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \n]..          
25a50 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 6c 73 65    } elseif {[lse
25a60 61 72 63 68 20 2d 65 78 61 63 74 20 2d 6e 6f 63  arch -exact -noc
25a70 61 73 65 20 2d 2d 20 5c 0d 0a 20 20 20 20 20 20  ase -- \..      
25a80 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 49 6e            [getIn
25a90 74 65 72 6f 70 41 73 73 65 6d 62 6c 79 46 69 6c  teropAssemblyFil
25aa0 65 4e 61 6d 65 73 4f 6e 6c 79 5d 20 24 66 69 6c  eNamesOnly] $fil
25ab0 65 4e 61 6d 65 4f 6e 6c 79 5d 20 21 3d 20 2d 31  eNameOnly] != -1
25ac0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
25ad0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
25ae0 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
25af0 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
25b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
25b10 2d 2d 2d 2d 20 66 6f 75 6e 64 20 6c 6f 61 64 65  ---- found loade
25b20 64 20 53 51 4c 69 74 65 20 69 6e 74 65 72 6f 70  d SQLite interop
25b30 20 61 73 73 65 6d 62 6c 79 20 6d 6f 64 75 6c 65   assembly module
25b40 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  : " \..         
25b50 20 20 20 20 20 20 20 20 20 24 66 69 6c 65 4e 61           $fileNa
25b60 6d 65 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  me \n]..        
25b70 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
25b80 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d   }..        }...
25b90 0a 20 20 20 20 20 20 20 20 63 61 74 63 68 20 7b  .        catch {
25ba0 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74  ..          tput
25bb0 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
25bc0 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  l \..           
25bd0 20 20 20 22 2d 2d 2d 2d 20 63 6f 6d 70 69 6c 65     "---- compile
25be0 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 73 20 66 6f  -time options fo
25bf0 72 20 53 51 4c 69 74 65 20 63 6f 72 65 20 6c 69  r SQLite core li
25c00 62 72 61 72 79 2e 2e 2e 20 22 0d 0a 0d 0a 20 20  brary... "....  
25c10 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
25c20 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
25c30 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20    object invoke 
25c40 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69  -flags +NonPubli
25c50 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  c \..           
25c60 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61       System.Data
25c70 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 33 20  .SQLite.SQLite3 
25c80 53 51 4c 69 74 65 43 6f 6d 70 69 6c 65 4f 70 74  SQLiteCompileOpt
25c90 69 6f 6e 73 0d 0a 20 20 20 20 20 20 20 20 20 20  ions..          
25ca0 7d 20 63 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 73  } compileOptions
25cb0 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
25cc0 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
25cd0 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
25ce0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5b 66  l [appendArgs [f
25cf0 6f 72 6d 61 74 4c 69 73 74 20 5b 6c 73 6f 72 74  ormatList [lsort
25d00 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
25d10 20 20 20 20 24 63 6f 6d 70 69 6c 65 4f 70 74 69      $compileOpti
25d20 6f 6e 73 5d 20 3c 6e 6f 6e 65 3e 5d 20 5c 6e 5d  ons] <none>] \n]
25d30 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c  ..          } el
25d40 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
25d50 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
25d60 63 68 61 6e 6e 65 6c 20 75 6e 6b 6e 6f 77 6e 5c  channel unknown\
25d70 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  n..          }..
25d80 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
25d90 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20       catch {..  
25da0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
25db0 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d  :test_channel \.
25dc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
25dd0 2d 2d 2d 2d 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  ---- compile-tim
25de0 65 20 6f 70 74 69 6f 6e 73 20 66 6f 72 20 53 51  e options for SQ
25df0 4c 69 74 65 20 69 6e 74 65 72 6f 70 20 61 73 73  Lite interop ass
25e00 65 6d 62 6c 79 2e 2e 2e 20 22 0d 0a 0d 0a 20 20  embly... "....  
25e10 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
25e20 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
25e30 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20    object invoke 
25e40 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69  -flags +NonPubli
25e50 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  c \..           
25e60 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61       System.Data
25e70 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 33 20  .SQLite.SQLite3 
25e80 49 6e 74 65 72 6f 70 43 6f 6d 70 69 6c 65 4f 70  InteropCompileOp
25e90 74 69 6f 6e 73 0d 0a 20 20 20 20 20 20 20 20 20  tions..         
25ea0 20 7d 20 63 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e   } compileOption
25eb0 73 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  s] == 0} then {.
25ec0 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
25ed0 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
25ee0 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5b  el [appendArgs [
25ef0 66 6f 72 6d 61 74 4c 69 73 74 20 5b 6c 73 6f 72  formatList [lsor
25f00 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  t \..           
25f10 20 20 20 20 20 24 63 6f 6d 70 69 6c 65 4f 70 74       $compileOpt
25f20 69 6f 6e 73 5d 20 3c 6e 6f 6e 65 3e 5d 20 5c 6e  ions] <none>] \n
25f30 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65  ]..          } e
25f40 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
25f50 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
25f60 5f 63 68 61 6e 6e 65 6c 20 75 6e 6b 6e 6f 77 6e  _channel unknown
25f70 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  \n..          }.
25f80 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
25f90 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
25fa0 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20 74 68   # NOTE: Show th
25fb0 65 20 61 63 74 69 76 65 20 74 65 73 74 20 63 6f  e active test co
25fc0 6e 73 74 72 61 69 6e 74 73 2e 0d 0a 20 20 20 20  nstraints...    
25fd0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 74      #..        t
25fe0 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
25ff0 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
26000 20 22 2d 2d 2d 2d 20 63 6f 6e 73 74 72 61 69 6e   "---- constrain
26010 74 73 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20  ts: " \..       
26020 20 20 20 20 20 5b 66 6f 72 6d 61 74 4c 69 73 74       [formatList
26030 20 5b 6c 73 6f 72 74 20 5b 67 65 74 43 6f 6e 73   [lsort [getCons
26040 74 72 61 69 6e 74 73 5d 5d 20 3c 6e 6f 6e 65 3e  traints]] <none>
26050 5d 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  ] \n]....       
26060 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
26070 54 45 3a 20 53 61 76 65 20 74 68 65 20 74 65 73  TE: Save the tes
26080 74 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 66 6f  t constraints fo
26090 72 20 75 73 65 20 62 79 20 74 68 72 65 61 64 73  r use by threads
260a0 20 63 72 65 61 74 65 64 20 69 6e 20 74 68 69 73   created in this
260b0 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
260c0 20 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 64 6f    application do
260d0 6d 61 69 6e 2e 20 20 54 68 69 73 20 69 73 20 6e  main.  This is n
260e0 65 63 65 73 73 61 72 79 20 62 65 63 61 75 73 65  ecessary because
260f0 20 61 6c 6c 20 74 68 65 20 45 61 67 6c 65 0d 0a   all the Eagle..
26100 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
26110 22 74 65 73 74 20 63 6f 6e 74 65 78 74 22 20 69  "test context" i
26120 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 70 65  nformation is pe
26130 72 2d 74 68 72 65 61 64 2e 0d 0a 20 20 20 20 20  r-thread...     
26140 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66     #..        if
26150 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
26160 3a 3a 74 65 73 74 5f 63 6f 6e 73 74 72 61 69 6e  ::test_constrain
26170 74 73 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ts]} then {..   
26180 20 20 20 20 20 20 20 73 65 74 20 3a 3a 74 65 73         set ::tes
26190 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 24 3a  t_constraints $:
261a0 3a 65 61 67 6c 65 5f 74 65 73 74 73 28 63 6f 6e  :eagle_tests(con
261b0 73 74 72 61 69 6e 74 73 29 0d 0a 20 20 20 20 20  straints)..     
261c0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
261d0 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
261e0 45 3a 20 4c 6f 61 64 20 74 68 65 20 22 61 66 74  E: Load the "aft
261f0 65 72 2d 63 6f 6e 73 74 72 61 69 6e 74 73 22 20  er-constraints" 
26200 63 75 73 74 6f 6d 20 70 65 72 2d 75 73 65 72 20  custom per-user 
26210 61 6e 64 2f 6f 72 20 70 65 72 2d 68 6f 73 74 0d  and/or per-host.
26220 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
26230 20 74 65 73 74 20 73 65 74 74 69 6e 67 73 20 6e   test settings n
26240 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ow...        #..
26250 20 20 20 20 20 20 20 20 75 70 6c 65 76 65 6c 20          uplevel 
26260 31 20 5b 6c 69 73 74 20 6c 6f 61 64 53 51 4c 69  1 [list loadSQLi
26270 74 65 54 65 73 74 53 65 74 74 69 6e 67 73 20 24  teTestSettings $
26280 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 2e  ::test_channel .
26290 61 66 74 65 72 5d 0d 0a 0d 0a 20 20 20 20 20 20  after]....      
262a0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
262b0 4f 54 45 3a 20 49 66 20 6e 65 63 65 73 73 61 72  OTE: If necessar
262c0 79 2c 20 65 6e 61 62 6c 65 20 73 68 61 72 65 64  y, enable shared
262d0 2d 63 61 63 68 65 20 6d 6f 64 65 20 6e 6f 77 2e  -cache mode now.
262e0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
262f0 20 20 20 20 20 69 66 20 7b 5b 68 61 73 52 75 6e       if {[hasRun
26300 74 69 6d 65 4f 70 74 69 6f 6e 20 73 68 61 72 65  timeOption share
26310 64 43 61 63 68 65 5d 7d 20 74 68 65 6e 20 7b 0d  dCache]} then {.
26320 0a 20 20 20 20 20 20 20 20 20 20 65 6e 61 62 6c  .          enabl
26330 65 53 68 61 72 65 64 43 61 63 68 65 20 24 3a 3a  eSharedCache $::
26340 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 74 72 75  test_channel tru
26350 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  e..        }....
26360 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
26370 20 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20     # NOTE: Show 
26380 77 68 65 6e 20 6f 75 72 20 74 65 73 74 73 20 61  when our tests a
26390 63 74 75 61 6c 6c 79 20 62 65 67 61 6e 20 28 6e  ctually began (n
263a0 6f 77 29 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ow)...        #.
263b0 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
263c0 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
263d0 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
263e0 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
263f0 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
26400 74 65 20 74 65 73 74 73 20 62 65 67 61 6e 20 61  te tests began a
26410 74 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  t " \..         
26420 20 20 20 5b 63 6c 6f 63 6b 20 66 6f 72 6d 61 74     [clock format
26430 20 5b 63 6c 6f 63 6b 20 73 65 63 6f 6e 64 73 5d   [clock seconds]
26440 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a  ] \n]..      }..
26450 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
26460 6f 63 20 72 75 6e 53 51 4c 69 74 65 54 65 73 74  oc runSQLiteTest
26470 46 69 6c 65 73 50 72 6f 6c 6f 67 75 65 20 7b 7d  FilesPrologue {}
26480 20 7b 0d 0a 20 20 20 20 20 20 75 70 6c 65 76 65   {..      upleve
26490 6c 20 31 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  l 1 {..        #
264a0 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
264b0 3a 20 53 65 74 75 70 20 74 68 65 20 76 61 72 69  : Setup the vari
264c0 61 62 6c 65 73 20 74 68 61 74 20 72 65 66 65 72  ables that refer
264d0 20 74 6f 20 74 68 65 20 76 61 72 69 6f 75 73 20   to the various 
264e0 6e 6f 6e 2d 64 61 74 61 20 66 69 6c 65 73 0d 0a  non-data files..
264f0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
26500 72 65 71 75 69 72 65 64 20 62 79 20 74 68 65 20  required by the 
26510 74 65 73 74 73 20 69 6e 20 74 68 69 73 20 66 69  tests in this fi
26520 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  le...        #..
26530 20 20 20 20 20 20 20 20 73 65 74 20 65 6e 74 69          set enti
26540 74 79 46 72 61 6d 65 77 6f 72 6b 44 6c 6c 46 69  tyFrameworkDllFi
26550 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  le \..          
26560 20 20 5b 67 65 74 42 75 69 6c 64 46 69 6c 65 4e    [getBuildFileN
26570 61 6d 65 20 45 6e 74 69 74 79 46 72 61 6d 65 77  ame EntityFramew
26580 6f 72 6b 2e 64 6c 6c 5d 0d 0a 0d 0a 20 20 20 20  ork.dll]....    
26590 20 20 20 20 73 65 74 20 69 6e 73 74 61 6c 6c 65      set installe
265a0 72 45 78 65 46 69 6c 65 20 5b 67 65 74 42 75 69  rExeFile [getBui
265b0 6c 64 46 69 6c 65 4e 61 6d 65 20 49 6e 73 74 61  ldFileName Insta
265c0 6c 6c 65 72 2e 65 78 65 5d 0d 0a 20 20 20 20 20  ller.exe]..     
265d0 20 20 20 73 65 74 20 73 71 6c 69 74 65 44 65 73     set sqliteDes
265e0 69 67 6e 65 72 44 6c 6c 46 69 6c 65 20 5b 67 65  ignerDllFile [ge
265f0 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20 53  tBuildFileName S
26600 51 4c 69 74 65 2e 44 65 73 69 67 6e 65 72 2e 64  QLite.Designer.d
26610 6c 6c 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73  ll]....        s
26620 65 74 20 73 79 73 74 65 6d 44 61 74 61 53 51 4c  et systemDataSQL
26630 69 74 65 44 6c 6c 46 69 6c 65 20 5c 0d 0a 20 20  iteDllFile \..  
26640 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 42 75            [getBu
26650 69 6c 64 46 69 6c 65 4e 61 6d 65 20 53 79 73 74  ildFileName Syst
26660 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64  em.Data.SQLite.d
26670 6c 6c 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73  ll]....        s
26680 65 74 20 73 79 73 74 65 6d 44 61 74 61 53 51 4c  et systemDataSQL
26690 69 74 65 4c 69 6e 71 44 6c 6c 46 69 6c 65 20 5c  iteLinqDllFile \
266a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 67  ..            [g
266b0 65 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20  etBuildFileName 
266c0 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
266d0 74 65 2e 4c 69 6e 71 2e 64 6c 6c 5d 0d 0a 0d 0a  te.Linq.dll]....
266e0 20 20 20 20 20 20 20 20 73 65 74 20 73 79 73 74          set syst
266f0 65 6d 44 61 74 61 53 51 4c 69 74 65 45 66 36 44  emDataSQLiteEf6D
26700 6c 6c 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20  llFile \..      
26710 20 20 20 20 20 20 5b 67 65 74 42 75 69 6c 64 46        [getBuildF
26720 69 6c 65 4e 61 6d 65 20 53 79 73 74 65 6d 2e 44  ileName System.D
26730 61 74 61 2e 53 51 4c 69 74 65 2e 45 46 36 2e 64  ata.SQLite.EF6.d
26740 6c 6c 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73  ll]....        s
26750 65 74 20 74 65 73 74 45 78 65 46 69 6c 65 20 5b  et testExeFile [
26760 67 65 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65  getBuildFileName
26770 20 74 65 73 74 2e 65 78 65 5d 0d 0a 20 20 20 20   test.exe]..    
26780 20 20 20 20 73 65 74 20 74 65 73 74 4c 69 6e 71      set testLinq
26790 45 78 65 46 69 6c 65 20 5b 67 65 74 42 75 69 6c  ExeFile [getBuil
267a0 64 46 69 6c 65 4e 61 6d 65 20 74 65 73 74 6c 69  dFileName testli
267b0 6e 71 2e 65 78 65 5d 0d 0a 20 20 20 20 20 20 20  nq.exe]..       
267c0 20 73 65 74 20 74 65 73 74 45 66 36 45 78 65 46   set testEf6ExeF
267d0 69 6c 65 20 5b 67 65 74 42 75 69 6c 64 46 69 6c  ile [getBuildFil
267e0 65 4e 61 6d 65 20 74 65 73 74 65 66 36 2e 65 78  eName testef6.ex
267f0 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d  e]....        #.
26800 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
26810 20 53 65 74 75 70 20 74 68 65 20 76 61 72 69 61   Setup the varia
26820 62 6c 65 73 20 74 68 61 74 20 72 65 66 65 72 20  bles that refer 
26830 74 6f 20 74 68 65 20 76 61 72 69 6f 75 73 20 64  to the various d
26840 61 74 61 20 66 69 6c 65 73 0d 0a 20 20 20 20 20  ata files..     
26850 20 20 20 23 20 20 20 20 20 20 20 72 65 71 75 69     #       requi
26860 72 65 64 20 62 79 20 74 68 65 20 74 65 73 74 73  red by the tests
26870 20 69 6e 20 74 68 69 73 20 66 69 6c 65 2e 0d 0a   in this file...
26880 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
26890 20 20 20 73 65 74 20 74 65 73 74 4c 69 6e 71 4f     set testLinqO
268a0 75 74 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74  utFile [file nat
268b0 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f  ivename [file jo
268c0 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  in \..          
268d0 20 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73 74    [getSQLiteTest
268e0 44 61 74 61 50 61 74 68 5d 20 74 65 73 74 6c 69  DataPath] testli
268f0 6e 71 2e 6f 75 74 5d 5d 0d 0a 0d 0a 20 20 20 20  nq.out]]....    
26900 20 20 20 20 73 65 74 20 6e 6f 72 74 68 77 69 6e      set northwin
26910 64 45 66 44 62 46 69 6c 65 20 5b 66 69 6c 65 20  dEfDbFile [file 
26920 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65  nativename [file
26930 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20   join \..       
26940 20 20 20 20 20 5b 66 69 6c 65 20 64 69 72 6e 61       [file dirna
26950 6d 65 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65  me [file dirname
26960 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73 74 44   [getSQLiteTestD
26970 61 74 61 50 61 74 68 5d 5d 5d 20 5c 0d 0a 20 20  ataPath]]] \..  
26980 20 20 20 20 20 20 20 20 20 20 74 65 73 74 6c 69            testli
26990 6e 71 20 6e 6f 72 74 68 77 69 6e 64 45 46 2e 64  nq northwindEF.d
269a0 62 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73  b]]....        s
269b0 65 74 20 6e 6f 6e 57 61 6c 44 62 46 69 6c 65 20  et nonWalDbFile 
269c0 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65  [file nativename
269d0 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20   [file join \.. 
269e0 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 53             [getS
269f0 51 4c 69 74 65 54 65 73 74 44 61 74 61 50 61 74  QLiteTestDataPat
26a00 68 5d 20 6e 6f 6e 57 61 6c 2e 64 62 5d 5d 0d 0a  h] nonWal.db]]..
26a10 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 77 61  ..        set wa
26a20 6c 44 62 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61  lDbFile [file na
26a30 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a  tivename [file j
26a40 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  oin \..         
26a50 20 20 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73     [getSQLiteTes
26a60 74 44 61 74 61 50 61 74 68 5d 20 77 61 6c 2e 64  tDataPath] wal.d
26a70 62 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23  b]]....        #
26a80 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
26a90 3a 20 54 68 65 20 76 61 72 69 6f 75 73 20 69 6e  : The various in
26aa0 73 74 61 6c 6c 2f 75 6e 69 6e 73 74 61 6c 6c 20  stall/uninstall 
26ab0 6c 6f 67 20 66 69 6c 65 73 20 75 73 65 64 20 74  log files used t
26ac0 6f 20 74 65 73 74 20 74 68 65 0d 0a 20 20 20 20  o test the..    
26ad0 20 20 20 20 23 20 20 20 20 20 20 20 64 65 73 69      #       desi
26ae0 67 6e 2d 74 69 6d 65 20 63 6f 6d 70 6f 6e 65 6e  gn-time componen
26af0 74 20 69 6e 73 74 61 6c 6c 65 72 2e 0d 0a 20 20  t installer...  
26b00 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
26b10 20 73 65 74 20 74 65 73 74 49 6e 73 74 61 6c 6c   set testInstall
26b20 56 73 32 30 30 35 4c 6f 67 46 69 6c 65 20 5b 66  Vs2005LogFile [f
26b30 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b  ile nativename [
26b40 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20  file join \..   
26b50 20 20 20 20 20 20 20 20 20 5b 67 65 74 53 51 4c           [getSQL
26b60 69 74 65 54 65 73 74 44 61 74 61 50 61 74 68 5d  iteTestDataPath]
26b70 20 49 6e 73 74 61 6c 6c 65 72 5f 54 65 73 74 5f   Installer_Test_
26b80 56 73 32 30 30 35 2e 6c 6f 67 5d 5d 0d 0a 0d 0a  Vs2005.log]]....
26b90 20 20 20 20 20 20 20 20 73 65 74 20 74 65 73 74          set test
26ba0 49 6e 73 74 61 6c 6c 56 73 32 30 30 38 4c 6f 67  InstallVs2008Log
26bb0 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69 76  File [file nativ
26bc0 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e  ename [file join
26bd0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
26be0 5b 67 65 74 53 51 4c 69 74 65 54 65 73 74 44 61  [getSQLiteTestDa
26bf0 74 61 50 61 74 68 5d 20 49 6e 73 74 61 6c 6c 65  taPath] Installe
26c00 72 5f 54 65 73 74 5f 56 73 32 30 30 38 2e 6c 6f  r_Test_Vs2008.lo
26c10 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73  g]]....        s
26c20 65 74 20 74 65 73 74 49 6e 73 74 61 6c 6c 56 73  et testInstallVs
26c30 32 30 31 30 4c 6f 67 46 69 6c 65 20 5b 66 69 6c  2010LogFile [fil
26c40 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69  e nativename [fi
26c50 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20  le join \..     
26c60 20 20 20 20 20 20 20 5b 67 65 74 53 51 4c 69 74         [getSQLit
26c70 65 54 65 73 74 44 61 74 61 50 61 74 68 5d 20 49  eTestDataPath] I
26c80 6e 73 74 61 6c 6c 65 72 5f 54 65 73 74 5f 56 73  nstaller_Test_Vs
26c90 32 30 31 30 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20  2010.log]]....  
26ca0 20 20 20 20 20 20 73 65 74 20 74 65 73 74 49 6e        set testIn
26cb0 73 74 61 6c 6c 56 73 32 30 31 32 4c 6f 67 46 69  stallVs2012LogFi
26cc0 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e  le [file nativen
26cd0 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c  ame [file join \
26ce0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 67  ..            [g
26cf0 65 74 53 51 4c 69 74 65 54 65 73 74 44 61 74 61  etSQLiteTestData
26d00 50 61 74 68 5d 20 49 6e 73 74 61 6c 6c 65 72 5f  Path] Installer_
26d10 54 65 73 74 5f 56 73 32 30 31 32 2e 6c 6f 67 5d  Test_Vs2012.log]
26d20 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74  ]....        set
26d30 20 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30   testInstallVs20
26d40 31 33 4c 6f 67 46 69 6c 65 20 5b 66 69 6c 65 20  13LogFile [file 
26d50 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65  nativename [file
26d60 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20   join \..       
26d70 20 20 20 20 20 5b 67 65 74 53 51 4c 69 74 65 54       [getSQLiteT
26d80 65 73 74 44 61 74 61 50 61 74 68 5d 20 49 6e 73  estDataPath] Ins
26d90 74 61 6c 6c 65 72 5f 54 65 73 74 5f 56 73 32 30  taller_Test_Vs20
26da0 31 33 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20  13.log]]....    
26db0 20 20 20 20 73 65 74 20 74 65 73 74 49 6e 73 74      set testInst
26dc0 61 6c 6c 56 73 32 30 31 35 4c 6f 67 46 69 6c 65  allVs2015LogFile
26dd0 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d   [file nativenam
26de0 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a  e [file join \..
26df0 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74              [get
26e00 53 51 4c 69 74 65 54 65 73 74 44 61 74 61 50 61  SQLiteTestDataPa
26e10 74 68 5d 20 49 6e 73 74 61 6c 6c 65 72 5f 54 65  th] Installer_Te
26e20 73 74 5f 56 73 32 30 31 35 2e 6c 6f 67 5d 5d 0d  st_Vs2015.log]].
26e30 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 74  ...        set t
26e40 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30  estUninstallVs20
26e50 30 35 4c 6f 67 46 69 6c 65 20 5b 66 69 6c 65 20  05LogFile [file 
26e60 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65  nativename [file
26e70 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20   join \..       
26e80 20 20 20 20 20 5b 67 65 74 53 51 4c 69 74 65 54       [getSQLiteT
26e90 65 73 74 44 61 74 61 50 61 74 68 5d 20 55 6e 69  estDataPath] Uni
26ea0 6e 73 74 61 6c 6c 65 72 5f 54 65 73 74 5f 56 73  nstaller_Test_Vs
26eb0 32 30 30 35 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20  2005.log]]....  
26ec0 20 20 20 20 20 20 73 65 74 20 74 65 73 74 55 6e        set testUn
26ed0 69 6e 73 74 61 6c 6c 56 73 32 30 30 38 4c 6f 67  installVs2008Log
26ee0 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69 76  File [file nativ
26ef0 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e  ename [file join
26f00 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
26f10 5b 67 65 74 53 51 4c 69 74 65 54 65 73 74 44 61  [getSQLiteTestDa
26f20 74 61 50 61 74 68 5d 20 55 6e 69 6e 73 74 61 6c  taPath] Uninstal
26f30 6c 65 72 5f 54 65 73 74 5f 56 73 32 30 30 38 2e  ler_Test_Vs2008.
26f40 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  log]]....       
26f50 20 73 65 74 20 74 65 73 74 55 6e 69 6e 73 74 61   set testUninsta
26f60 6c 6c 56 73 32 30 31 30 4c 6f 67 46 69 6c 65 20  llVs2010LogFile 
26f70 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65  [file nativename
26f80 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20   [file join \.. 
26f90 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 53             [getS
26fa0 51 4c 69 74 65 54 65 73 74 44 61 74 61 50 61 74  QLiteTestDataPat
26fb0 68 5d 20 55 6e 69 6e 73 74 61 6c 6c 65 72 5f 54  h] Uninstaller_T
26fc0 65 73 74 5f 56 73 32 30 31 30 2e 6c 6f 67 5d 5d  est_Vs2010.log]]
26fd0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20  ....        set 
26fe0 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32  testUninstallVs2
26ff0 30 31 32 4c 6f 67 46 69 6c 65 20 5b 66 69 6c 65  012LogFile [file
27000 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c   nativename [fil
27010 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20  e join \..      
27020 20 20 20 20 20 20 5b 67 65 74 53 51 4c 69 74 65        [getSQLite
27030 54 65 73 74 44 61 74 61 50 61 74 68 5d 20 55 6e  TestDataPath] Un
27040 69 6e 73 74 61 6c 6c 65 72 5f 54 65 73 74 5f 56  installer_Test_V
27050 73 32 30 31 32 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20  s2012.log]].... 
27060 20 20 20 20 20 20 20 73 65 74 20 74 65 73 74 55         set testU
27070 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31 33 4c 6f  ninstallVs2013Lo
27080 67 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69  gFile [file nati
27090 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69  vename [file joi
270a0 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n \..           
270b0 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73 74 44   [getSQLiteTestD
270c0 61 74 61 50 61 74 68 5d 20 55 6e 69 6e 73 74 61  ataPath] Uninsta
270d0 6c 6c 65 72 5f 54 65 73 74 5f 56 73 32 30 31 33  ller_Test_Vs2013
270e0 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20  .log]]....      
270f0 20 20 73 65 74 20 74 65 73 74 55 6e 69 6e 73 74    set testUninst
27100 61 6c 6c 56 73 32 30 31 35 4c 6f 67 46 69 6c 65  allVs2015LogFile
27110 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d   [file nativenam
27120 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a  e [file join \..
27130 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74              [get
27140 53 51 4c 69 74 65 54 65 73 74 44 61 74 61 50 61  SQLiteTestDataPa
27150 74 68 5d 20 55 6e 69 6e 73 74 61 6c 6c 65 72 5f  th] Uninstaller_
27160 54 65 73 74 5f 56 73 32 30 31 35 2e 6c 6f 67 5d  Test_Vs2015.log]
27170 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 23 23  ]....        ###
27180 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
27190 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
271a0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
271b0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
271c0 23 23 23 23 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ####....        
271d0 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72  if {![haveConstr
271e0 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
271f0 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20   file_ \..      
27200 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c        [file tail
27210 20 24 65 6e 74 69 74 79 46 72 61 6d 65 77 6f 72   $entityFramewor
27220 6b 44 6c 6c 46 69 6c 65 5d 5d 5d 7d 20 74 68 65  kDllFile]]]} the
27230 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63  n {..          c
27240 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73  heckForFile $tes
27250 74 5f 63 68 61 6e 6e 65 6c 20 24 65 6e 74 69 74  t_channel $entit
27260 79 46 72 61 6d 65 77 6f 72 6b 44 6c 6c 46 69 6c  yFrameworkDllFil
27270 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  e..        }....
27280 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61          if {![ha
27290 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70  veConstraint [ap
272a0 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c  pendArgs file_ \
272b0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 66  ..            [f
272c0 69 6c 65 20 74 61 69 6c 20 24 69 6e 73 74 61 6c  ile tail $instal
272d0 6c 65 72 45 78 65 46 69 6c 65 5d 5d 5d 7d 20 74  lerExeFile]]]} t
272e0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
272f0 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74   checkForFile $t
27300 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 69 6e 73  est_channel $ins
27310 74 61 6c 6c 65 72 45 78 65 46 69 6c 65 20 49 6e  tallerExeFile In
27320 73 74 61 6c 6c 65 72 2e 65 78 65 0d 0a 20 20 20  staller.exe..   
27330 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
27340 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73    if {![haveCons
27350 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
27360 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20  gs file_ \..    
27370 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61          [file ta
27380 69 6c 20 24 73 71 6c 69 74 65 44 65 73 69 67 6e  il $sqliteDesign
27390 65 72 44 6c 6c 46 69 6c 65 5d 5d 5d 7d 20 74 68  erDllFile]]]} th
273a0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
273b0 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65  checkForFile $te
273c0 73 74 5f 63 68 61 6e 6e 65 6c 20 24 73 71 6c 69  st_channel $sqli
273d0 74 65 44 65 73 69 67 6e 65 72 44 6c 6c 46 69 6c  teDesignerDllFil
273e0 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  e..        }....
273f0 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61          if {![ha
27400 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70  veConstraint [ap
27410 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c  pendArgs file_ \
27420 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 66  ..            [f
27430 69 6c 65 20 74 61 69 6c 20 24 73 79 73 74 65 6d  ile tail $system
27440 44 61 74 61 53 51 4c 69 74 65 44 6c 6c 46 69 6c  DataSQLiteDllFil
27450 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  e]]]} then {..  
27460 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72          checkFor
27470 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e  File $test_chann
27480 65 6c 20 24 73 79 73 74 65 6d 44 61 74 61 53 51  el $systemDataSQ
27490 4c 69 74 65 44 6c 6c 46 69 6c 65 0d 0a 20 20 20  LiteDllFile..   
274a0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
274b0 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73    if {![haveCons
274c0 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
274d0 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20  gs file_ \..    
274e0 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61          [file ta
274f0 69 6c 20 24 73 79 73 74 65 6d 44 61 74 61 53 51  il $systemDataSQ
27500 4c 69 74 65 4c 69 6e 71 44 6c 6c 46 69 6c 65 5d  LiteLinqDllFile]
27510 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  ]]} then {..    
27520 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69        checkForFi
27530 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c  le $test_channel
27540 20 24 73 79 73 74 65 6d 44 61 74 61 53 51 4c 69   $systemDataSQLi
27550 74 65 4c 69 6e 71 44 6c 6c 46 69 6c 65 0d 0a 20  teLinqDllFile.. 
27560 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
27570 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f      if {![haveCo
27580 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64  nstraint [append
27590 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20  Args file_ \..  
275a0 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20            [file 
275b0 74 61 69 6c 20 24 73 79 73 74 65 6d 44 61 74 61  tail $systemData
275c0 53 51 4c 69 74 65 45 66 36 44 6c 6c 46 69 6c 65  SQLiteEf6DllFile
275d0 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ]]]} then {..   
275e0 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46         checkForF
275f0 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65  ile $test_channe
27600 6c 20 24 73 79 73 74 65 6d 44 61 74 61 53 51 4c  l $systemDataSQL
27610 69 74 65 45 66 36 44 6c 6c 46 69 6c 65 0d 0a 20  iteEf6DllFile.. 
27620 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
27630 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f      if {![haveCo
27640 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64  nstraint [append
27650 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20  Args file_ \..  
27660 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20            [file 
27670 74 61 69 6c 20 24 74 65 73 74 45 78 65 46 69 6c  tail $testExeFil
27680 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  e]]]} then {..  
27690 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72          checkFor
276a0 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e  File $test_chann
276b0 65 6c 20 24 74 65 73 74 45 78 65 46 69 6c 65 20  el $testExeFile 
276c0 74 65 73 74 2e 65 78 65 0d 0a 20 20 20 20 20 20  test.exe..      
276d0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69    }....        i
276e0 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61  f {![haveConstra
276f0 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20  int [appendArgs 
27700 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20  file_ \..       
27710 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20       [file tail 
27720 24 74 65 73 74 4c 69 6e 71 45 78 65 46 69 6c 65  $testLinqExeFile
27730 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ]]]} then {..   
27740 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46         checkForF
27750 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65  ile $test_channe
27760 6c 20 24 74 65 73 74 4c 69 6e 71 45 78 65 46 69  l $testLinqExeFi
27770 6c 65 20 74 65 73 74 6c 69 6e 71 2e 65 78 65 0d  le testlinq.exe.
27780 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
27790 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65        if {![have
277a0 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65  Constraint [appe
277b0 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a  ndArgs file_ \..
277c0 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c              [fil
277d0 65 20 74 61 69 6c 20 24 74 65 73 74 45 66 36 45  e tail $testEf6E
277e0 78 65 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20  xeFile]]]} then 
277f0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68 65  {..          che
27800 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f  ckForFile $test_
27810 63 68 61 6e 6e 65 6c 20 24 74 65 73 74 45 66 36  channel $testEf6
27820 45 78 65 46 69 6c 65 20 74 65 73 74 65 66 36 2e  ExeFile testef6.
27830 65 78 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  exe..        }..
27840 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b  ..        if {![
27850 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b  haveConstraint [
27860 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f  appendArgs file_
27870 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
27880 5b 66 69 6c 65 20 74 61 69 6c 20 24 74 65 73 74  [file tail $test
27890 4c 69 6e 71 4f 75 74 46 69 6c 65 5d 5d 5d 7d 20  LinqOutFile]]]} 
278a0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
278b0 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24    checkForFile $
278c0 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65  test_channel $te
278d0 73 74 4c 69 6e 71 4f 75 74 46 69 6c 65 0d 0a 20  stLinqOutFile.. 
278e0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
278f0 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f      if {![haveCo
27900 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64  nstraint [append
27910 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20  Args file_ \..  
27920 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20            [file 
27930 74 61 69 6c 20 24 6e 6f 72 74 68 77 69 6e 64 45  tail $northwindE
27940 66 44 62 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e  fDbFile]]]} then
27950 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68   {..          ch
27960 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74  eckForFile $test
27970 5f 63 68 61 6e 6e 65 6c 20 24 6e 6f 72 74 68 77  _channel $northw
27980 69 6e 64 45 66 44 62 46 69 6c 65 0d 0a 20 20 20  indEfDbFile..   
27990 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
279a0 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73    if {![haveCons
279b0 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
279c0 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20  gs file_ \..    
279d0 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61          [file ta
279e0 69 6c 20 24 6e 6f 6e 57 61 6c 44 62 46 69 6c 65  il $nonWalDbFile
279f0 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ]]]} then {..   
27a00 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46         checkForF
27a10 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65  ile $test_channe
27a20 6c 20 24 6e 6f 6e 57 61 6c 44 62 46 69 6c 65 0d  l $nonWalDbFile.
27a30 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
27a40 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65        if {![have
27a50 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65  Constraint [appe
27a60 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a  ndArgs file_ \..
27a70 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c              [fil
27a80 65 20 74 61 69 6c 20 24 77 61 6c 44 62 46 69 6c  e tail $walDbFil
27a90 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  e]]]} then {..  
27aa0 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72          checkFor
27ab0 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e  File $test_chann
27ac0 65 6c 20 24 77 61 6c 44 62 46 69 6c 65 0d 0a 20  el $walDbFile.. 
27ad0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
27ae0 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f      if {![haveCo
27af0 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64  nstraint [append
27b00 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20  Args file_ \..  
27b10 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20            [file 
27b20 74 61 69 6c 20 24 74 65 73 74 49 6e 73 74 61 6c  tail $testInstal
27b30 6c 56 73 32 30 30 35 4c 6f 67 46 69 6c 65 5d 5d  lVs2005LogFile]]
27b40 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
27b50 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c       checkForFil
27b60 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  e $test_channel 
27b70 24 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30  $testInstallVs20
27b80 30 35 4c 6f 67 46 69 6c 65 0d 0a 20 20 20 20 20  05LogFile..     
27b90 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
27ba0 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72  if {![haveConstr
27bb0 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
27bc0 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20   file_ \..      
27bd0 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c        [file tail
27be0 20 24 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32   $testInstallVs2
27bf0 30 30 38 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74  008LogFile]]]} t
27c00 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
27c10 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74   checkForFile $t
27c20 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73  est_channel $tes
27c30 74 49 6e 73 74 61 6c 6c 56 73 32 30 30 38 4c 6f  tInstallVs2008Lo
27c40 67 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d  gFile..        }
27c50 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b  ....        if {
27c60 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74  ![haveConstraint
27c70 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c   [appendArgs fil
27c80 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  e_ \..          
27c90 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 74 65    [file tail $te
27ca0 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 31 30 4c  stInstallVs2010L
27cb0 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20  ogFile]]]} then 
27cc0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68 65  {..          che
27cd0 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f  ckForFile $test_
27ce0 63 68 61 6e 6e 65 6c 20 24 74 65 73 74 49 6e 73  channel $testIns
27cf0 74 61 6c 6c 56 73 32 30 31 30 4c 6f 67 46 69 6c  tallVs2010LogFil
27d00 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  e..        }....
27d10 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61          if {![ha
27d20 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70  veConstraint [ap
27d30 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c  pendArgs file_ \
27d40 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 66  ..            [f
27d50 69 6c 65 20 74 61 69 6c 20 24 74 65 73 74 49 6e  ile tail $testIn
27d60 73 74 61 6c 6c 56 73 32 30 31 32 4c 6f 67 46 69  stallVs2012LogFi
27d70 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  le]]]} then {.. 
27d80 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f           checkFo
27d90 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e  rFile $test_chan
27da0 6e 65 6c 20 24 74 65 73 74 49 6e 73 74 61 6c 6c  nel $testInstall
27db0 56 73 32 30 31 32 4c 6f 67 46 69 6c 65 0d 0a 20  Vs2012LogFile.. 
27dc0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
27dd0 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f      if {![haveCo
27de0 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64  nstraint [append
27df0 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20  Args file_ \..  
27e00 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20            [file 
27e10 74 61 69 6c 20 24 74 65 73 74 49 6e 73 74 61 6c  tail $testInstal
27e20 6c 56 73 32 30 31 33 4c 6f 67 46 69 6c 65 5d 5d  lVs2013LogFile]]
27e30 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
27e40 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c       checkForFil
27e50 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  e $test_channel 
27e60 24 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30  $testInstallVs20
27e70 31 33 4c 6f 67 46 69 6c 65 0d 0a 20 20 20 20 20  13LogFile..     
27e80 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
27e90 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72  if {![haveConstr
27ea0 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
27eb0 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20   file_ \..      
27ec0 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c        [file tail
27ed0 20 24 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32   $testInstallVs2
27ee0 30 31 35 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74  015LogFile]]]} t
27ef0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
27f00 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74   checkForFile $t
27f10 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73  est_channel $tes
27f20 74 49 6e 73 74 61 6c 6c 56 73 32 30 31 35 4c 6f  tInstallVs2015Lo
27f30 67 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d  gFile..        }
27f40 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b  ....        if {
27f50 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74  ![haveConstraint
27f60 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c   [appendArgs fil
27f70 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  e_ \..          
27f80 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 74 65    [file tail $te
27f90 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 30  stUninstallVs200
27fa0 35 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74 68 65  5LogFile]]]} the
27fb0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63  n {..          c
27fc0 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73  heckForFile $tes
27fd0 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73 74 55  t_channel $testU
27fe0 6e 69 6e 73 74 61 6c 6c 56 73 32 30 30 35 4c 6f  ninstallVs2005Lo
27ff0 67 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d  gFile..        }
28000 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b  ....        if {
28010 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74  ![haveConstraint
28020 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c   [appendArgs fil
28030 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  e_ \..          
28040 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 74 65    [file tail $te
28050 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 30  stUninstallVs200
28060 38 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74 68 65  8LogFile]]]} the
28070 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63  n {..          c
28080 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73  heckForFile $tes
28090 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73 74 55  t_channel $testU
280a0 6e 69 6e 73 74 61 6c 6c 56 73 32 30 30 38 4c 6f  ninstallVs2008Lo
280b0 67 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d  gFile..        }
280c0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b  ....        if {
280d0 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74  ![haveConstraint
280e0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c   [appendArgs fil
280f0 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  e_ \..          
28100 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 74 65    [file tail $te
28110 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31  stUninstallVs201
28120 30 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74 68 65  0LogFile]]]} the
28130 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63  n {..          c
28140 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73  heckForFile $tes
28150 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73 74 55  t_channel $testU
28160 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31 30 4c 6f  ninstallVs2010Lo
28170 67 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d  gFile..        }
28180 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b  ....        if {
28190 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74  ![haveConstraint
281a0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c   [appendArgs fil
281b0 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  e_ \..          
281c0 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 74 65    [file tail $te
281d0 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31  stUninstallVs201
281e0 32 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74 68 65  2LogFile]]]} the
281f0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63  n {..          c
28200 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73  heckForFile $tes
28210 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73 74 55  t_channel $testU
28220 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31 32 4c 6f  ninstallVs2012Lo
28230 67 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d  gFile..        }
28240 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b  ....        if {
28250 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74  ![haveConstraint
28260 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c   [appendArgs fil
28270 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  e_ \..          
28280 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 74 65    [file tail $te
28290 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31  stUninstallVs201
282a0 33 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74 68 65  3LogFile]]]} the
282b0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63  n {..          c
282c0 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73  heckForFile $tes
282d0 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73 74 55  t_channel $testU
282e0 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31 33 4c 6f  ninstallVs2013Lo
282f0 67 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d  gFile..        }
28300 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b  ....        if {
28310 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74  ![haveConstraint
28320 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c   [appendArgs fil
28330 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  e_ \..          
28340 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 74 65    [file tail $te
28350 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31  stUninstallVs201
28360 35 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74 68 65  5LogFile]]]} the
28370 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63  n {..          c
28380 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73  heckForFile $tes
28390 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73 74 55  t_channel $testU
283a0 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31 35 4c 6f  ninstallVs2015Lo
283b0 67 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d  gFile..        }
283c0 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
283d0 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 72 75  .....    proc ru
283e0 6e 53 51 4c 69 74 65 54 65 73 74 46 69 6c 65 73  nSQLiteTestFiles
283f0 45 70 69 6c 6f 67 75 65 20 7b 7d 20 7b 0d 0a 20  Epilogue {} {.. 
28400 20 20 20 20 20 75 70 6c 65 76 65 6c 20 31 20 7b       uplevel 1 {
28410 0d 0a 20 20 20 20 20 20 20 20 75 6e 73 65 74 20  ..        unset 
28420 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 5c 0d 0a 20  -nocomplain \.. 
28430 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 55             testU
28440 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31 35 4c 6f  ninstallVs2015Lo
28450 67 46 69 6c 65 20 74 65 73 74 55 6e 69 6e 73 74  gFile testUninst
28460 61 6c 6c 56 73 32 30 31 33 4c 6f 67 46 69 6c 65  allVs2013LogFile
28470 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
28480 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32  testUninstallVs2
28490 30 31 32 4c 6f 67 46 69 6c 65 20 74 65 73 74 55  012LogFile testU
284a0 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31 30 4c 6f  ninstallVs2010Lo
284b0 67 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20  gFile \..       
284c0 20 20 20 20 20 74 65 73 74 55 6e 69 6e 73 74 61       testUninsta
284d0 6c 6c 56 73 32 30 30 38 4c 6f 67 46 69 6c 65 20  llVs2008LogFile 
284e0 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32  testUninstallVs2
284f0 30 30 35 4c 6f 67 46 69 6c 65 20 5c 0d 0a 20 20  005LogFile \..  
28500 20 20 20 20 20 20 20 20 20 20 74 65 73 74 49 6e            testIn
28510 73 74 61 6c 6c 56 73 32 30 31 35 4c 6f 67 46 69  stallVs2015LogFi
28520 6c 65 20 74 65 73 74 49 6e 73 74 61 6c 6c 56 73  le testInstallVs
28530 32 30 31 33 4c 6f 67 46 69 6c 65 20 5c 0d 0a 20  2013LogFile \.. 
28540 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 49             testI
28550 6e 73 74 61 6c 6c 56 73 32 30 31 32 4c 6f 67 46  nstallVs2012LogF
28560 69 6c 65 20 74 65 73 74 49 6e 73 74 61 6c 6c 56  ile testInstallV
28570 73 32 30 31 30 4c 6f 67 46 69 6c 65 20 5c 0d 0a  s2010LogFile \..
28580 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
28590 49 6e 73 74 61 6c 6c 56 73 32 30 30 38 4c 6f 67  InstallVs2008Log
285a0 46 69 6c 65 20 74 65 73 74 49 6e 73 74 61 6c 6c  File testInstall
285b0 56 73 32 30 30 35 4c 6f 67 46 69 6c 65 0d 0a 0d  Vs2005LogFile...
285c0 0a 20 20 20 20 20 20 20 20 75 6e 73 65 74 20 2d  .        unset -
285d0 6e 6f 63 6f 6d 70 6c 61 69 6e 20 5c 0d 0a 20 20  nocomplain \..  
285e0 20 20 20 20 20 20 20 20 20 20 6e 6f 72 74 68 77            northw
285f0 69 6e 64 45 66 44 62 46 69 6c 65 20 74 65 73 74  indEfDbFile test
28600 4c 69 6e 71 4f 75 74 46 69 6c 65 20 5c 0d 0a 20  LinqOutFile \.. 
28610 20 20 20 20 20 20 20 20 20 20 20 77 61 6c 44 62             walDb
28620 46 69 6c 65 20 6e 6f 6e 57 61 6c 44 62 46 69 6c  File nonWalDbFil
28630 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20 75 6e 73  e....        uns
28640 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 5c  et -nocomplain \
28650 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65  ..            te
28660 73 74 45 66 36 45 78 65 46 69 6c 65 20 74 65 73  stEf6ExeFile tes
28670 74 4c 69 6e 71 45 78 65 46 69 6c 65 20 5c 0d 0a  tLinqExeFile \..
28680 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
28690 45 78 65 46 69 6c 65 20 73 79 73 74 65 6d 44 61  ExeFile systemDa
286a0 74 61 53 51 4c 69 74 65 45 66 36 44 6c 6c 46 69  taSQLiteEf6DllFi
286b0 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  le \..          
286c0 20 20 73 79 73 74 65 6d 44 61 74 61 53 51 4c 69    systemDataSQLi
286d0 74 65 4c 69 6e 71 44 6c 6c 46 69 6c 65 20 73 79  teLinqDllFile sy
286e0 73 74 65 6d 44 61 74 61 53 51 4c 69 74 65 44 6c  stemDataSQLiteDl
286f0 6c 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20  lFile \..       
28700 20 20 20 20 20 73 71 6c 69 74 65 44 65 73 69 67       sqliteDesig
28710 6e 65 72 44 6c 6c 46 69 6c 65 20 69 6e 73 74 61  nerDllFile insta
28720 6c 6c 65 72 45 78 65 46 69 6c 65 20 5c 0d 0a 20  llerExeFile \.. 
28730 20 20 20 20 20 20 20 20 20 20 20 65 6e 74 69 74             entit
28740 79 46 72 61 6d 65 77 6f 72 6b 44 6c 6c 46 69 6c  yFrameworkDllFil
28750 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  e..      }..    
28760 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 72  }.....    proc r
28770 75 6e 53 51 4c 69 74 65 54 65 73 74 45 70 69 6c  unSQLiteTestEpil
28780 6f 67 75 65 20 7b 7d 20 7b 0d 0a 20 20 20 20 20  ogue {} {..     
28790 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
287a0 3a 20 53 6b 69 70 20 72 75 6e 6e 69 6e 67 20 6f  : Skip running o
287b0 75 72 20 63 75 73 74 6f 6d 20 65 70 69 6c 6f 67  ur custom epilog
287c0 75 65 20 69 66 20 74 68 65 20 6d 61 69 6e 20 6f  ue if the main o
287d0 6e 65 20 68 61 73 20 62 65 65 6e 0d 0a 20 20 20  ne has been..   
287e0 20 20 20 23 20 20 20 20 20 20 20 73 6b 69 70 70     #       skipp
287f0 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ed...      #..  
28800 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
28810 78 69 73 74 73 20 3a 3a 6e 6f 28 65 70 69 6c 6f  xists ::no(epilo
28820 67 75 65 2e 65 61 67 6c 65 29 5d 7d 20 74 68 65  gue.eagle)]} the
28830 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
28840 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
28850 53 68 6f 77 20 77 68 65 6e 20 6f 75 72 20 74 65  Show when our te
28860 73 74 73 20 61 63 74 75 61 6c 6c 79 20 65 6e 64  sts actually end
28870 65 64 20 28 6e 6f 77 29 2e 0d 0a 20 20 20 20 20  ed (now)...     
28880 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70     #..        tp
28890 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
288a0 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
288b0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  \..            "
288c0 2d 2d 2d 2d 20 53 79 73 74 65 6d 2e 44 61 74 61  ---- System.Data
288d0 2e 53 51 4c 69 74 65 20 74 65 73 74 73 20 65 6e  .SQLite tests en
288e0 64 65 64 20 61 74 20 22 20 5c 0d 0a 20 20 20 20  ded at " \..    
288f0 20 20 20 20 20 20 20 20 5b 63 6c 6f 63 6b 20 66          [clock f
28900 6f 72 6d 61 74 20 5b 63 6c 6f 63 6b 20 73 65 63  ormat [clock sec
28910 6f 6e 64 73 5d 5d 20 5c 6e 5d 0d 0a 0d 0a 20 20  onds]] \n]....  
28920 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
28930 20 23 20 4e 4f 54 45 3a 20 4c 6f 61 64 20 74 68   # NOTE: Load th
28940 65 20 22 65 70 69 6c 6f 67 75 65 22 20 63 75 73  e "epilogue" cus
28950 74 6f 6d 20 70 65 72 2d 75 73 65 72 20 61 6e 64  tom per-user and
28960 2f 6f 72 20 70 65 72 2d 68 6f 73 74 20 74 65 73  /or per-host tes
28970 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  t..        #    
28980 20 20 20 73 65 74 74 69 6e 67 73 20 6e 6f 77 2e     settings now.
28990 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
289a0 20 20 20 20 20 75 70 6c 65 76 65 6c 20 31 20 5b       uplevel 1 [
289b0 6c 69 73 74 20 6c 6f 61 64 53 51 4c 69 74 65 54  list loadSQLiteT
289c0 65 73 74 53 65 74 74 69 6e 67 73 20 24 3a 3a 74  estSettings $::t
289d0 65 73 74 5f 63 68 61 6e 6e 65 6c 20 2e 65 70 69  est_channel .epi
289e0 6c 6f 67 75 65 5d 0d 0a 0d 0a 20 20 20 20 20 20  logue]....      
289f0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 42    #..        # B
28a00 55 47 46 49 58 3a 20 42 65 66 6f 72 65 20 63 68  UGFIX: Before ch
28a10 65 63 6b 69 6e 67 20 74 68 65 20 66 69 6e 61 6c  ecking the final
28a20 20 72 65 73 6f 75 72 63 65 73 20 69 6e 20 75 73   resources in us
28a30 65 20 62 79 20 53 51 4c 69 74 65 2c 20 6d 61 6b  e by SQLite, mak
28a40 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
28a50 20 20 20 20 20 73 75 72 65 20 62 6f 74 68 20 6f       sure both o
28a60 66 20 74 68 65 20 50 52 41 47 4d 41 20 72 65 6c  f the PRAGMA rel
28a70 61 74 65 64 20 64 69 72 65 63 74 6f 72 79 20 6e  ated directory n
28a80 61 6d 65 73 20 61 72 65 20 66 72 65 65 64 2e 0d  ames are freed..
28a90 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
28aa0 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51 4c 69      checkForSQLi
28ab0 74 65 44 69 72 65 63 74 6f 72 69 65 73 20 24 3a  teDirectories $:
28ac0 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 74 72  :test_channel tr
28ad0 75 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d  ue....        #.
28ae0 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
28af0 20 41 6c 73 6f 20 72 65 70 6f 72 74 20 74 68 65   Also report the
28b00 20 72 65 73 6f 75 72 63 65 20 75 73 61 67 65 20   resource usage 
28b10 61 66 74 65 72 20 72 75 6e 6e 69 6e 67 20 74 68  after running th
28b20 65 20 74 65 73 74 73 2e 0d 0a 20 20 20 20 20 20  e tests...      
28b30 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 70    #..        rep
28b40 6f 72 74 53 51 4c 69 74 65 52 65 73 6f 75 72 63  ortSQLiteResourc
28b50 65 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  es $::test_chann
28b60 65 6c 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d  el....        #.
28b70 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
28b80 20 52 65 70 6f 72 74 20 74 68 65 20 63 72 69 74   Report the crit
28b90 69 63 61 6c 20 68 61 6e 64 6c 65 20 63 6f 75 6e  ical handle coun
28ba0 74 73 20 61 66 74 65 72 20 72 75 6e 6e 69 6e 67  ts after running
28bb0 20 74 68 65 20 74 65 73 74 73 2e 0d 0a 20 20 20   the tests...   
28bc0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
28bd0 67 65 74 53 51 4c 69 74 65 48 61 6e 64 6c 65 43  getSQLiteHandleC
28be0 6f 75 6e 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  ounts $::test_ch
28bf0 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20 20 20  annel....       
28c00 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
28c10 54 45 3a 20 49 66 20 6e 65 63 65 73 73 61 72 79  TE: If necessary
28c20 2c 20 64 69 73 61 62 6c 65 20 73 68 61 72 65 64  , disable shared
28c30 2d 63 61 63 68 65 20 6d 6f 64 65 20 6e 6f 77 2e  -cache mode now.
28c40 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
28c50 20 20 20 20 20 69 66 20 7b 5b 68 61 73 52 75 6e       if {[hasRun
28c60 74 69 6d 65 4f 70 74 69 6f 6e 20 73 68 61 72 65  timeOption share
28c70 64 43 61 63 68 65 5d 7d 20 74 68 65 6e 20 7b 0d  dCache]} then {.
28c80 0a 20 20 20 20 20 20 20 20 20 20 65 6e 61 62 6c  .          enabl
28c90 65 53 68 61 72 65 64 43 61 63 68 65 20 24 3a 3a  eSharedCache $::
28ca0 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 66 61 6c  test_channel fal
28cb0 73 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  se..        }.. 
28cc0 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
28cd0 0d 0a 20 20 20 20 23 23 23 23 23 23 23 23 23 23  ..    ##########
28ce0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
28cf0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
28d00 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
28d10 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
28d20 23 0d 0a 20 20 20 20 23 23 23 23 23 23 23 23 23  #..    #########
28d30 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
28d40 23 23 23 23 20 45 4e 44 20 45 61 67 6c 65 20 4f  #### END Eagle O
28d50 4e 4c 59 20 23 23 23 23 23 23 23 23 23 23 23 23  NLY ############
28d60 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
28d70 23 23 0d 0a 20 20 20 20 23 23 23 23 23 23 23 23  ##..    ########
28d80 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
28d90 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
28da0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
28db0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
28dc0 23 23 23 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 23 0d  ###..  }....  #.
28dd0 0a 20 20 23 20 4e 4f 54 45 3a 20 53 61 76 65 20  .  # NOTE: Save 
28de0 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
28df0 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 74 61 69  directory contai
28e00 6e 69 6e 67 20 74 68 69 73 20 66 69 6c 65 2e 0d  ning this file..
28e10 0a 20 20 23 0d 0a 20 20 69 66 20 7b 21 5b 69 6e  .  #..  if {![in
28e20 66 6f 20 65 78 69 73 74 73 20 63 6f 6d 6d 6f 6e  fo exists common
28e30 5f 64 69 72 65 63 74 6f 72 79 5d 7d 20 74 68 65  _directory]} the
28e40 6e 20 7b 0d 0a 20 20 20 20 73 65 74 20 63 6f 6d  n {..    set com
28e50 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79 20 5b 66  mon_directory [f
28e60 69 6c 65 20 64 69 72 6e 61 6d 65 20 5b 69 6e 66  ile dirname [inf
28e70 6f 20 73 63 72 69 70 74 5d 5d 0d 0a 20 20 7d 0d  o script]]..  }.
28e80 0a 0d 0a 20 20 23 0d 0a 20 20 23 20 4e 4f 54 45  ...  #..  # NOTE
28e90 3a 20 50 72 6f 76 69 64 65 20 74 68 65 20 53 79  : Provide the Sy
28ea0 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
28eb0 20 74 65 73 74 20 70 61 63 6b 61 67 65 20 74 6f   test package to
28ec0 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72   the interpreter
28ed0 2e 0d 0a 20 20 23 0d 0a 20 20 70 61 63 6b 61 67  ...  #..  packag
28ee0 65 20 70 72 6f 76 69 64 65 20 53 79 73 74 65 6d  e provide System
28ef0 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 54 65 73  .Data.SQLite.Tes
28f00 74 20 31 2e 30 0d 0a 7d 0d 0a                    t 1.0..}..