System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact 606764c006e5cda5ab35342ec8a675892e940d7c:


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 20 2f 20 22 6e 65 74 46 78 34 36  x461" / "netFx46
22e0: 32 22 3f 0d 0a 20 20 20 20 20 20 20 20 20 20 20  2"?..           
22f0: 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
2300: 64 65 66 61 75 6c 74 20 7b 0d 0a 20 20 20 20 20  default {..     
2310: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
2320: 6e 65 74 46 78 33 35 3b 20 23 20 54 4f 44 4f 3a  netFx35; # TODO:
2330: 20 47 6f 6f 64 20 22 66 61 6c 6c 62 61 63 6b 22   Good "fallback"
2340: 20 64 65 66 61 75 6c 74 3f 0d 0a 20 20 20 20 20   default?..     
2350: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
2360: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
2370: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
2380: 0d 0a 0c 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20  .....    #..    
2390: 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 70 72 6f  # NOTE: This pro
23a0: 63 65 64 75 72 65 20 73 68 6f 75 6c 64 20 72 65  cedure should re
23b0: 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66  turn non-zero if
23c0: 20 74 68 65 20 63 6f 6e 66 69 67 75 72 65 64 20   the configured 
23d0: 74 65 73 74 0d 0a 20 20 20 20 23 20 20 20 20 20  test..    #     
23e0: 20 20 70 6c 61 74 66 6f 72 6d 20 69 73 20 6d 6f    platform is mo
23f0: 73 74 20 6c 69 6b 65 6c 79 20 74 68 65 20 64 65  st likely the de
2400: 66 61 75 6c 74 20 66 6f 72 20 74 68 69 73 20 6d  fault for this m
2410: 61 63 68 69 6e 65 2e 0d 0a 20 20 20 20 23 0d 0a  achine...    #..
2420: 20 20 20 20 70 72 6f 63 20 69 73 44 65 66 61 75      proc isDefau
2430: 6c 74 42 75 69 6c 64 50 6c 61 74 66 6f 72 6d 20  ltBuildPlatform 
2440: 7b 20 7b 76 65 72 62 6f 73 65 20 74 72 75 65 7d  { {verbose true}
2450: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20   } {..      #.. 
2460: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 75 6e       # NOTE: Run
2470: 6e 69 6e 67 20 6f 6e 20 57 6f 57 36 34 20 69 73  ning on WoW64 is
2480: 20 6e 65 76 65 72 20 74 68 65 20 64 65 66 61 75   never the defau
2490: 6c 74 20 70 6c 61 74 66 6f 72 6d 2e 0d 0a 20 20  lt platform...  
24a0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
24b0: 7b 5b 69 73 52 75 6e 6e 69 6e 67 57 6f 57 36 34  {[isRunningWoW64
24c0: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
24d0: 20 20 20 69 66 20 7b 24 76 65 72 62 6f 73 65 7d     if {$verbose}
24e0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
24f0: 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
2500: 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20  _channel \..    
2510: 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
2520: 64 65 74 65 63 74 65 64 20 6e 6f 6e 2d 64 65 66  detected non-def
2530: 61 75 6c 74 20 70 6c 61 74 66 6f 72 6d 20 28 57  ault platform (W
2540: 6f 57 36 34 29 5c 6e 22 0d 0a 20 20 20 20 20 20  oW64)\n"..      
2550: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 72    }....        r
2560: 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20  eturn false..   
2570: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
2580: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54  .      # NOTE: T
2590: 68 69 73 20 68 61 73 20 61 20 67 6f 6f 64 20 63  his has a good c
25a0: 68 61 6e 63 65 20 6f 66 20 62 65 69 6e 67 20 74  hance of being t
25b0: 68 65 20 64 65 66 61 75 6c 74 20 70 6c 61 74 66  he default platf
25c0: 6f 72 6d 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  orm...      #.. 
25d0: 20 20 20 20 20 69 66 20 7b 24 76 65 72 62 6f 73       if {$verbos
25e0: 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  e} then {..     
25f0: 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
2600: 5f 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 64  _channel "---- d
2610: 65 74 65 63 74 65 64 20 64 65 66 61 75 6c 74 20  etected default 
2620: 70 6c 61 74 66 6f 72 6d 5c 6e 22 0d 0a 20 20 20  platform\n"..   
2630: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65     }....      re
2640: 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 7d  turn true..    }
2650: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65  .....    proc ge
2660: 74 42 75 69 6c 64 50 6c 61 74 66 6f 72 6d 20 7b  tBuildPlatform {
2670: 20 6e 61 74 69 76 65 20 7d 20 7b 0d 0a 20 20 20   native } {..   
2680: 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69     if {[info exi
2690: 73 74 73 20 3a 3a 74 65 73 74 5f 70 6c 61 74 66  sts ::test_platf
26a0: 6f 72 6d 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  orm] && \..     
26b0: 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
26c0: 67 74 68 20 24 3a 3a 74 65 73 74 5f 70 6c 61 74  gth $::test_plat
26d0: 66 6f 72 6d 5d 20 3e 20 30 7d 20 74 68 65 6e 20  form] > 0} then 
26e0: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
26f0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73        # NOTE: Us
2700: 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  e the specified 
2710: 74 65 73 74 20 70 6c 61 74 66 6f 72 6d 2e 20 20  test platform.  
2720: 49 66 20 74 68 69 73 20 76 61 72 69 61 62 6c 65  If this variable
2730: 20 69 73 20 6e 6f 74 20 73 65 74 2c 0d 0a 20 20   is not set,..  
2740: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68        #       th
2750: 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20  e default value 
2760: 77 69 6c 6c 20 62 65 20 62 61 73 65 64 20 6f 6e  will be based on
2770: 20 74 68 65 20 6d 61 63 68 69 6e 65 20 61 72 63   the machine arc
2780: 68 69 74 65 63 74 75 72 65 2e 0d 0a 20 20 20 20  hitecture...    
2790: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
27a0: 65 74 75 72 6e 20 5b 65 78 70 72 20 7b 24 6e 61  eturn [expr {$na
27b0: 74 69 76 65 20 3f 20 24 3a 3a 74 65 73 74 5f 70  tive ? $::test_p
27c0: 6c 61 74 66 6f 72 6d 20 3a 20 22 22 7d 5d 0d 0a  latform : ""}]..
27d0: 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b        } elseif {
27e0: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74  [info exists ::t
27f0: 65 73 74 5f 6d 61 63 68 69 6e 65 5d 20 26 26 20  est_machine] && 
2800: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74  \..          [st
2810: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 74  ring length $::t
2820: 65 73 74 5f 6d 61 63 68 69 6e 65 5d 20 3e 20 30  est_machine] > 0
2830: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
2840: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
2850: 4f 54 45 3a 20 46 6f 72 20 6e 61 74 69 76 65 20  OTE: For native 
2860: 62 75 69 6c 64 73 2c 20 72 65 74 75 72 6e 20 74  builds, return t
2870: 68 65 20 70 6c 61 74 66 6f 72 6d 20 6e 61 6d 65  he platform name
2880: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
2890: 6f 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  o..        #    
28a0: 20 20 20 74 68 65 20 74 65 73 74 20 6d 61 63 68     the test mach
28b0: 69 6e 65 20 61 72 63 68 69 74 65 63 74 75 72 65  ine architecture
28c0: 3b 20 6f 74 68 65 72 77 69 73 65 2c 20 72 65 74  ; otherwise, ret
28d0: 75 72 6e 20 61 6e 20 65 6d 70 74 79 0d 0a 20 20  urn an empty..  
28e0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73 74        #       st
28f0: 72 69 6e 67 2e 0d 0a 20 20 20 20 20 20 20 20 23  ring...        #
2900: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
2910: 20 5b 65 78 70 72 20 7b 0d 0a 20 20 20 20 20 20   [expr {..      
2920: 20 20 20 20 24 6e 61 74 69 76 65 20 3f 20 5b 6d      $native ? [m
2930: 61 63 68 69 6e 65 54 6f 50 6c 61 74 66 6f 72 6d  achineToPlatform
2940: 20 24 3a 3a 74 65 73 74 5f 6d 61 63 68 69 6e 65   $::test_machine
2950: 5d 20 3a 20 22 22 0d 0a 20 20 20 20 20 20 20 20  ] : ""..        
2960: 7d 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  }]..      } else
2970: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
2980: 20 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28   ::tcl_platform(
2990: 6d 61 63 68 69 6e 65 29 5d 7d 20 74 68 65 6e 20  machine)]} then 
29a0: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
29b0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 6f        # NOTE: Fo
29c0: 72 20 6e 61 74 69 76 65 20 62 75 69 6c 64 73 2c  r native builds,
29d0: 20 72 65 74 75 72 6e 20 74 68 65 20 70 6c 61 74   return the plat
29e0: 66 6f 72 6d 20 6e 61 6d 65 20 63 6f 72 72 65 73  form name corres
29f0: 70 6f 6e 64 69 6e 67 20 74 6f 0d 0a 20 20 20 20  ponding to..    
2a00: 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20      #       the 
2a10: 6d 61 63 68 69 6e 65 20 61 72 63 68 69 74 65 63  machine architec
2a20: 74 75 72 65 3b 20 6f 74 68 65 72 77 69 73 65 2c  ture; otherwise,
2a30: 20 72 65 74 75 72 6e 20 61 6e 20 65 6d 70 74 79   return an empty
2a40: 20 73 74 72 69 6e 67 2e 0d 0a 20 20 20 20 20 20   string...      
2a50: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
2a60: 75 72 6e 20 5b 65 78 70 72 20 7b 0d 0a 20 20 20  urn [expr {..   
2a70: 20 20 20 20 20 20 20 24 6e 61 74 69 76 65 20 3f         $native ?
2a80: 20 5b 6d 61 63 68 69 6e 65 54 6f 50 6c 61 74 66   [machineToPlatf
2a90: 6f 72 6d 20 24 3a 3a 74 63 6c 5f 70 6c 61 74 66  orm $::tcl_platf
2aa0: 6f 72 6d 28 6d 61 63 68 69 6e 65 29 5d 20 3a 20  orm(machine)] : 
2ab0: 22 22 0d 0a 20 20 20 20 20 20 20 20 7d 5d 0d 0a  ""..        }]..
2ac0: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
2ad0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
2ae0: 20 20 20 23 20 4e 4f 54 45 3a 20 4e 6f 20 6d 61     # NOTE: No ma
2af0: 63 68 69 6e 65 20 61 72 63 68 69 74 65 63 74 75  chine architectu
2b00: 72 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c  re is available,
2b10: 20 72 65 74 75 72 6e 20 61 6e 20 65 6d 70 74 79   return an empty
2b20: 20 73 74 72 69 6e 67 2e 0d 0a 20 20 20 20 20 20   string...      
2b30: 20 20 23 20 20 20 20 20 20 20 49 74 20 69 73 20    #       It is 
2b40: 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 72 65 74  important to ret
2b50: 75 72 6e 20 61 6e 20 65 6d 70 74 79 20 73 74 72  urn an empty str
2b60: 69 6e 67 20 68 65 72 65 20 62 65 63 61 75 73 65  ing here because
2b70: 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20   the..        # 
2b80: 20 20 20 20 20 20 72 65 73 75 6c 74 20 6f 66 20        result of 
2b90: 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 6d  this procedure m
2ba0: 61 79 20 62 65 20 75 73 65 64 20 77 69 74 68 20  ay be used with 
2bb0: 5b 66 69 6c 65 20 6a 6f 69 6e 5d 2e 0d 0a 20 20  [file join]...  
2bc0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
2bd0: 20 72 65 74 75 72 6e 20 22 22 0d 0a 20 20 20 20   return ""..    
2be0: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
2bf0: 20 20 20 70 72 6f 63 20 67 65 74 42 75 69 6c 64     proc getBuild
2c00: 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 7b 7d  Configuration {}
2c10: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
2c20: 20 20 20 23 20 4e 4f 54 45 3a 20 53 65 65 20 69     # NOTE: See i
2c30: 66 20 74 68 65 20 22 63 6f 6e 66 69 67 75 72 61  f the "configura
2c40: 74 69 6f 6e 22 20 73 65 74 74 69 6e 67 20 68 61  tion" setting ha
2c50: 73 20 62 65 65 6e 20 6f 76 65 72 72 69 64 64 65  s been overridde
2c60: 6e 20 62 79 20 74 68 65 0d 0a 20 20 20 20 20 20  n by the..      
2c70: 23 20 20 20 20 20 20 20 75 73 65 72 20 28 65 2e  #       user (e.
2c80: 67 2e 20 6f 6e 20 74 68 65 20 63 6f 6d 6d 61 6e  g. on the comman
2c90: 64 20 6c 69 6e 65 29 2e 20 20 54 68 69 73 20 68  d line).  This h
2ca0: 65 6c 70 73 20 63 6f 6e 74 72 6f 6c 20 65 78 61  elps control exa
2cb0: 63 74 6c 79 0d 0a 20 20 20 20 20 20 23 20 20 20  ctly..      #   
2cc0: 20 20 20 20 77 68 69 63 68 20 73 65 74 20 6f 66      which set of
2cd0: 20 62 69 6e 61 72 69 65 73 20 77 65 20 61 72 65   binaries we are
2ce0: 20 74 65 73 74 69 6e 67 20 28 69 2e 65 2e 20 74   testing (i.e. t
2cf0: 68 6f 73 65 20 62 75 69 6c 74 20 69 6e 20 74 68  hose built in th
2d00: 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
2d10: 20 22 44 65 62 75 67 22 20 6f 72 20 22 52 65 6c   "Debug" or "Rel
2d20: 65 61 73 65 22 20 62 75 69 6c 64 20 63 6f 6e 66  ease" build conf
2d30: 69 67 75 72 61 74 69 6f 6e 73 29 2e 20 20 54 6f  igurations).  To
2d40: 20 6f 76 65 72 72 69 64 65 20 74 68 69 73 0d 0a   override this..
2d50: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 76 61        #       va
2d60: 6c 75 65 20 76 69 61 20 74 68 65 20 63 6f 6d 6d  lue via the comm
2d70: 61 6e 64 20 6c 69 6e 65 2c 20 65 6e 74 65 72 20  and line, enter 
2d80: 61 20 63 6f 6d 6d 61 6e 64 20 73 69 6d 69 6c 61  a command simila
2d90: 72 20 74 6f 20 6f 6e 65 20 6f 66 0d 0a 20 20 20  r to one of..   
2da0: 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20 66     #       the f
2db0: 6f 6c 6c 6f 77 69 6e 67 20 28 61 6c 6c 20 6f 6e  ollowing (all on
2dc0: 20 6f 6e 65 20 6c 69 6e 65 29 3a 0d 0a 20 20 20   one line):..   
2dd0: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 20 20     #..      #   
2de0: 20 20 20 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65      EagleShell.e
2df0: 78 65 20 2d 61 6e 79 49 6e 69 74 69 61 6c 69 7a  xe -anyInitializ
2e00: 65 20 22 73 65 74 20 74 65 73 74 5f 63 6f 6e 66  e "set test_conf
2e10: 69 67 75 72 61 74 69 6f 6e 20 44 65 62 75 67 22  iguration Debug"
2e20: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
2e30: 20 20 2d 66 69 6c 65 20 2e 5c 70 61 74 68 5c 74    -file .\path\t
2e40: 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a 20 20 20  o\all.eagle..   
2e50: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 20 20     #..      #   
2e60: 20 20 20 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65      EagleShell.e
2e70: 78 65 20 2d 61 6e 79 49 6e 69 74 69 61 6c 69 7a  xe -anyInitializ
2e80: 65 20 22 73 65 74 20 74 65 73 74 5f 63 6f 6e 66  e "set test_conf
2e90: 69 67 75 72 61 74 69 6f 6e 20 52 65 6c 65 61 73  iguration Releas
2ea0: 65 22 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  e"..      #     
2eb0: 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70 61 74 68      -file .\path
2ec0: 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a 20  \to\all.eagle.. 
2ed0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
2ee0: 20 20 20 20 20 20 45 61 67 6c 65 53 68 65 6c 6c        EagleShell
2ef0: 2e 65 78 65 20 2d 66 69 6c 65 20 2e 5c 70 61 74  .exe -file .\pat
2f00: 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 20 2d  h\to\all.eagle -
2f10: 70 72 65 54 65 73 74 0d 0a 20 20 20 20 20 20 23  preTest..      #
2f20: 20 20 20 20 20 20 20 20 20 22 75 6e 73 65 74 20           "unset 
2f30: 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 74 65 73 74  -nocomplain test
2f40: 5f 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 22 0d  _configuration".
2f50: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
2f60: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
2f70: 20 3a 3a 74 65 73 74 5f 63 6f 6e 66 69 67 75 72   ::test_configur
2f80: 61 74 69 6f 6e 5d 20 26 26 20 5c 0d 0a 20 20 20  ation] && \..   
2f90: 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c         [string l
2fa0: 65 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f 63 6f  ength $::test_co
2fb0: 6e 66 69 67 75 72 61 74 69 6f 6e 5d 20 3e 20 30  nfiguration] > 0
2fc0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
2fd0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
2fe0: 4f 54 45 3a 20 55 73 65 20 74 68 65 20 73 70 65  OTE: Use the spe
2ff0: 63 69 66 69 65 64 20 74 65 73 74 20 63 6f 6e 66  cified test conf
3000: 69 67 75 72 61 74 69 6f 6e 2e 20 20 54 68 65 20  iguration.  The 
3010: 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 75 73  default value us
3020: 65 64 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ed..        #   
3030: 20 20 20 20 66 6f 72 20 74 68 69 73 20 76 61 72      for this var
3040: 69 61 62 6c 65 20 69 73 20 74 79 70 69 63 61 6c  iable is typical
3050: 6c 79 20 22 52 65 6c 65 61 73 65 22 2c 20 61 73  ly "Release", as
3060: 20 73 65 74 20 62 79 20 74 68 65 20 74 65 73 74   set by the test
3070: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
3080: 20 20 73 75 69 74 65 20 69 74 73 65 6c 66 2e 0d    suite itself..
3090: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
30a0: 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 74 65      return $::te
30b0: 73 74 5f 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  st_configuration
30c0: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
30d0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
30e0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e 6f 72       # NOTE: Nor
30f0: 6d 61 6c 6c 79 2c 20 77 65 20 77 69 6c 6c 20 6e  mally, we will n
3100: 65 76 65 72 20 68 69 74 20 74 68 69 73 20 63 61  ever hit this ca
3110: 73 65 20 62 65 63 61 75 73 65 20 74 68 65 20 76  se because the v
3120: 61 6c 75 65 20 6f 66 20 74 68 65 0d 0a 20 20 20  alue of the..   
3130: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 65 73       #       tes
3140: 74 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  t configuration 
3150: 76 61 72 69 61 62 6c 65 20 69 73 20 61 6c 77 61  variable is alwa
3160: 79 73 20 73 65 74 20 62 79 20 74 68 65 20 74 65  ys set by the te
3170: 73 74 20 73 75 69 74 65 0d 0a 20 20 20 20 20 20  st suite..      
3180: 20 20 23 20 20 20 20 20 20 20 69 74 73 65 6c 66    #       itself
3190: 3b 20 68 6f 77 65 76 65 72 2c 20 69 74 20 63 61  ; however, it ca
31a0: 6e 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e 20  n be overridden 
31b0: 75 73 69 6e 67 20 74 68 65 20 75 6e 73 65 74 20  using the unset 
31c0: 63 6f 6d 6d 61 6e 64 0d 0a 20 20 20 20 20 20 20  command..       
31d0: 20 23 20 20 20 20 20 20 20 66 72 6f 6d 20 74 68   #       from th
31e0: 65 20 2d 70 72 65 54 65 73 74 20 6f 70 74 69 6f  e -preTest optio
31f0: 6e 20 74 6f 20 74 68 65 20 74 65 73 74 20 73 75  n to the test su
3200: 69 74 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ite...        #.
3210: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
3220: 24 3a 3a 65 61 67 6c 65 5f 70 6c 61 74 66 6f 72  $::eagle_platfor
3230: 6d 28 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 29  m(configuration)
3240: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
3250: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65  .....    proc ge
3260: 74 42 75 69 6c 64 43 6f 6e 66 69 67 75 72 61 74  tBuildConfigurat
3270: 69 6f 6e 73 20 7b 7d 20 7b 0d 0a 20 20 20 20 20  ions {} {..     
3280: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
3290: 3a 20 53 65 65 20 69 66 20 74 68 65 20 6c 69 73  : See if the lis
32a0: 74 20 6f 66 20 74 65 73 74 20 63 6f 6e 66 69 67  t of test config
32b0: 75 72 61 74 69 6f 6e 73 20 68 61 73 20 62 65 65  urations has bee
32c0: 6e 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79 0d  n overridden by.
32d0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74  .      #       t
32e0: 68 65 20 75 73 65 72 20 28 65 2e 67 2e 20 6f 6e  he user (e.g. on
32f0: 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e   the command lin
3300: 65 29 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  e)...      #..  
3310: 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
3320: 69 73 74 73 20 3a 3a 74 65 73 74 5f 63 6f 6e 66  ists ::test_conf
3330: 69 67 75 72 61 74 69 6f 6e 73 5d 20 26 26 20 5c  igurations] && \
3340: 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 6c 6c 65  ..          [lle
3350: 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f 63 6f 6e  ngth $::test_con
3360: 66 69 67 75 72 61 74 69 6f 6e 73 5d 20 3e 20 30  figurations] > 0
3370: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
3380: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
3390: 4f 54 45 3a 20 55 73 65 20 74 68 65 20 73 70 65  OTE: Use the spe
33a0: 63 69 66 69 65 64 20 6c 69 73 74 20 6f 66 20 74  cified list of t
33b0: 65 73 74 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  est configuratio
33c0: 6e 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ns...        #..
33d0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24          return $
33e0: 3a 3a 74 65 73 74 5f 63 6f 6e 66 69 67 75 72 61  ::test_configura
33f0: 74 69 6f 6e 73 0d 0a 20 20 20 20 20 20 7d 20 65  tions..      } e
3400: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  lse {..        #
3410: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
3420: 3a 20 55 73 65 20 74 68 65 20 64 65 66 61 75 6c  : Use the defaul
3430: 74 20 6c 69 73 74 20 6f 66 20 74 65 73 74 20 63  t list of test c
3440: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 2e 0d 0a  onfigurations...
3450: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
3460: 20 20 20 72 65 74 75 72 6e 20 5b 6c 69 73 74 20     return [list 
3470: 44 65 62 75 67 20 52 65 6c 65 61 73 65 5d 0d 0a  Debug Release]..
3480: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
3490: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 42  ...    proc getB
34a0: 75 69 6c 64 42 61 73 65 44 69 72 65 63 74 6f 72  uildBaseDirector
34b0: 79 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  y {} {..      #.
34c0: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46  .      # NOTE: F
34d0: 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 62 61  igure out the ba
34e0: 73 65 20 64 69 72 65 63 74 6f 72 79 20 77 68 65  se directory whe
34f0: 72 65 20 61 6c 6c 20 74 68 65 20 62 75 69 6c 64  re all the build
3500: 73 20 73 68 6f 75 6c 64 20 62 65 0d 0a 20 20 20  s should be..   
3510: 20 20 20 23 20 20 20 20 20 20 20 6c 6f 63 61 74     #       locat
3520: 65 64 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 62  ed.  This will b
3530: 65 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  e the directory 
3540: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
3550: 65 20 61 63 74 75 61 6c 0d 0a 20 20 20 20 20 20  e actual..      
3560: 23 20 20 20 20 20 20 20 62 75 69 6c 64 20 6f 75  #       build ou
3570: 74 70 75 74 20 64 69 72 65 63 74 6f 72 79 20 28  tput directory (
3580: 65 2e 67 2e 20 70 61 72 65 6e 74 20 6f 66 20 22  e.g. parent of "
3590: 62 69 6e 22 29 2e 0d 0a 20 20 20 20 20 20 23 0d  bin")...      #.
35a0: 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f  .      if {[info
35b0: 20 65 78 69 73 74 73 20 3a 3a 62 75 69 6c 64 5f   exists ::build_
35c0: 62 61 73 65 5f 64 69 72 65 63 74 6f 72 79 5d 20  base_directory] 
35d0: 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
35e0: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
35f0: 3a 3a 62 75 69 6c 64 5f 62 61 73 65 5f 64 69 72  ::build_base_dir
3600: 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65  ectory] > 0} the
3610: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
3620: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
3630: 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20  The location of 
3640: 74 68 65 20 62 75 69 6c 64 20 62 61 73 65 20 64  the build base d
3650: 69 72 65 63 74 6f 72 79 20 68 61 73 20 62 65 65  irectory has bee
3660: 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b 0d 0a 20  n overridden;.. 
3670: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74         #       t
3680: 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74  herefore, use it
3690: 20 76 65 72 62 61 74 69 6d 2e 0d 0a 20 20 20 20   verbatim...    
36a0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
36b0: 65 74 75 72 6e 20 24 3a 3a 62 75 69 6c 64 5f 62  eturn $::build_b
36c0: 61 73 65 5f 64 69 72 65 63 74 6f 72 79 0d 0a 20  ase_directory.. 
36d0: 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b       } elseif {[
36e0: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 63 6f  info exists ::co
36f0: 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79 5d 20  mmon_directory] 
3700: 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
3710: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
3720: 3a 3a 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f  ::common_directo
3730: 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  ry] > 0} then {.
3740: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
3750: 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e 65 78 74      # NOTE: Next
3760: 2c 20 66 61 6c 6c 62 61 63 6b 20 74 6f 20 74 68  , fallback to th
3770: 65 20 67 72 61 6e 64 70 61 72 65 6e 74 20 64 69  e grandparent di
3780: 72 65 63 74 6f 72 79 20 6f 66 20 74 68 65 20 6f  rectory of the o
3790: 6e 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ne..        #   
37a0: 20 20 20 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74      containing t
37b0: 68 69 73 20 66 69 6c 65 20 28 69 2e 65 2e 20 22  his file (i.e. "
37c0: 63 6f 6d 6d 6f 6e 2e 65 61 67 6c 65 22 29 2c 20  common.eagle"), 
37d0: 69 66 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0a 20  if available... 
37e0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
37f0: 20 20 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 64    return [file d
3800: 69 72 6e 61 6d 65 20 5b 66 69 6c 65 20 64 69 72  irname [file dir
3810: 6e 61 6d 65 20 24 3a 3a 63 6f 6d 6d 6f 6e 5f 64  name $::common_d
3820: 69 72 65 63 74 6f 72 79 5d 5d 0d 0a 20 20 20 20  irectory]]..    
3830: 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66    } elseif {[inf
3840: 6f 20 65 78 69 73 74 73 20 3a 3a 70 61 74 68 5d  o exists ::path]
3850: 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
3860: 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20   [string length 
3870: 24 3a 3a 70 61 74 68 5d 20 3e 20 30 7d 20 74 68  $::path] > 0} th
3880: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
3890: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
38a0: 20 46 69 6e 61 6c 6c 79 2c 20 66 61 6c 6c 62 61   Finally, fallba
38b0: 63 6b 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74  ck to the parent
38c0: 20 64 69 72 65 63 74 6f 72 79 20 6f 66 20 74 68   directory of th
38d0: 65 20 45 61 67 6c 65 54 65 73 74 0d 0a 20 20 20  e EagleTest..   
38e0: 20 20 20 20 20 23 20 20 20 20 20 20 20 70 61 74       #       pat
38f0: 68 2e 20 20 54 68 65 20 45 61 67 6c 65 54 65 73  h.  The EagleTes
3900: 74 20 70 61 63 6b 61 67 65 20 67 75 61 72 61 6e  t package guaran
3910: 74 65 65 73 20 74 68 61 74 20 74 68 69 73 20 76  tees that this v
3920: 61 72 69 61 62 6c 65 0d 0a 20 20 20 20 20 20 20  ariable..       
3930: 20 23 20 20 20 20 20 20 20 77 69 6c 6c 20 62 65   #       will be
3940: 20 73 65 74 20 74 6f 20 74 68 65 20 64 69 72 65   set to the dire
3950: 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67  ctory containing
3960: 20 74 68 65 20 66 69 72 73 74 20 66 69 6c 65 20   the first file 
3970: 74 6f 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  to..        #   
3980: 20 20 20 20 65 78 65 63 75 74 65 20 74 68 65 20      execute the 
3990: 5b 72 75 6e 54 65 73 74 50 72 6f 6c 6f 67 75 65  [runTestPrologue
39a0: 5d 20 73 63 72 69 70 74 20 6c 69 62 72 61 72 79  ] script library
39b0: 20 70 72 6f 63 65 64 75 72 65 2e 0d 0a 20 20 20   procedure...   
39c0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
39d0: 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 64 69 72  return [file dir
39e0: 6e 61 6d 65 20 24 3a 3a 70 61 74 68 5d 0d 0a 20  name $::path].. 
39f0: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
3a00: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
3a10: 20 20 23 20 4e 4f 54 45 3a 20 4e 6f 20 70 61 74    # NOTE: No pat
3a20: 68 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20  h is available, 
3a30: 72 65 74 75 72 6e 20 61 6e 20 65 6d 70 74 79 20  return an empty 
3a40: 73 74 72 69 6e 67 2e 20 20 54 68 69 73 20 70 6f  string.  This po
3a50: 69 6e 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20  int..        #  
3a60: 20 20 20 20 20 73 68 6f 75 6c 64 20 6e 6f 74 20       should not 
3a70: 62 65 20 72 65 61 63 68 65 64 2e 0d 0a 20 20 20  be reached...   
3a80: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
3a90: 72 65 74 75 72 6e 20 22 22 0d 0a 20 20 20 20 20  return ""..     
3aa0: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
3ab0: 20 20 70 72 6f 63 20 67 65 74 53 51 4c 69 74 65    proc getSQLite
3ac0: 54 65 73 74 44 61 74 61 50 61 74 68 20 7b 7d 20  TestDataPath {} 
3ad0: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
3ae0: 20 20 23 20 4e 4f 54 45 3a 20 46 69 67 75 72 65    # NOTE: Figure
3af0: 20 6f 75 74 20 74 68 65 20 64 69 72 65 63 74 6f   out the directo
3b00: 72 79 20 77 68 65 72 65 20 61 6c 6c 20 74 68 65  ry where all the
3b10: 20 74 65 73 74 20 64 61 74 61 20 66 69 6c 65 73   test data files
3b20: 20 73 68 6f 75 6c 64 0d 0a 20 20 20 20 20 20 23   should..      #
3b30: 20 20 20 20 20 20 20 62 65 20 6c 6f 63 61 74 65         be locate
3b40: 64 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20  d.  This should 
3b50: 62 65 20 74 68 65 20 22 64 61 74 61 22 20 64 69  be the "data" di
3b60: 72 65 63 74 6f 72 79 20 62 65 6e 65 61 74 68 20  rectory beneath 
3b70: 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  the..      #    
3b80: 20 20 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e     directory con
3b90: 74 61 69 6e 69 6e 67 20 74 68 65 20 61 63 74 75  taining the actu
3ba0: 61 6c 20 74 65 73 74 20 73 63 72 69 70 74 73 2e  al test scripts.
3bb0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
3bc0: 20 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 6a 6f   return [file jo
3bd0: 69 6e 20 24 3a 3a 70 61 74 68 20 64 61 74 61 5d  in $::path data]
3be0: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
3bf0: 70 72 6f 63 20 69 73 52 75 6e 6e 69 6e 67 57 6f  proc isRunningWo
3c00: 57 36 34 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20  W64 {} {..      
3c10: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
3c20: 20 46 6f 72 20 6e 6f 77 2c 20 6a 75 73 74 20 75   For now, just u
3c30: 73 65 20 74 68 65 20 65 78 69 73 74 69 6e 67 20  se the existing 
3c40: 74 65 73 74 20 63 6f 6e 73 74 72 61 69 6e 74 20  test constraint 
3c50: 66 6f 72 20 64 65 74 65 63 74 69 6e 67 0d 0a 20  for detecting.. 
3c60: 20 20 20 20 20 23 20 20 20 20 20 20 20 61 20 57       #       a W
3c70: 6f 57 36 34 20 70 72 6f 63 65 73 73 2e 0d 0a 20  oW64 process... 
3c80: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65       #..      re
3c90: 74 75 72 6e 20 5b 68 61 76 65 43 6f 6e 73 74 72  turn [haveConstr
3ca0: 61 69 6e 74 20 77 6f 77 36 34 5d 0d 0a 20 20 20  aint wow64]..   
3cb0: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
3cc0: 69 73 4d 69 78 65 64 4d 6f 64 65 41 73 73 65 6d  isMixedModeAssem
3cd0: 62 6c 79 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7b  bly { fileName {
3ce0: 76 61 72 4e 61 6d 65 20 22 22 7d 20 7d 20 7b 0d  varName ""} } {.
3cf0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
3d00: 23 20 4e 4f 54 45 3a 20 46 69 72 73 74 2c 20 6d  # NOTE: First, m
3d10: 61 6b 65 20 73 75 72 65 20 74 68 65 20 74 65 73  ake sure the tes
3d20: 74 20 73 75 69 74 65 20 69 6e 66 72 61 73 74 72  t suite infrastr
3d30: 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 77 65  ucture is allowe
3d40: 64 20 74 6f 0d 0a 20 20 20 20 20 20 23 20 20 20  d to..      #   
3d50: 20 20 20 20 75 73 65 20 74 68 65 20 5b 65 78 65      use the [exe
3d60: 63 5d 20 63 6f 6d 6d 61 6e 64 2e 0d 0a 20 20 20  c] command...   
3d70: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
3d80: 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
3d90: 6e 6f 28 65 78 65 63 29 5d 20 26 26 20 21 5b 69  no(exec)] && ![i
3da0: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
3db0: 63 6f 72 46 6c 61 67 73 29 5d 7d 20 74 68 65 6e  corFlags)]} then
3dc0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
3dd0: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49         # NOTE: I
3de0: 66 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f  f the location o
3df0: 66 20 43 6f 72 46 6c 61 67 73 20 69 73 20 70 72  f CorFlags is pr
3e00: 65 73 65 6e 74 20 69 6e 20 74 68 65 20 65 6e 76  esent in the env
3e10: 69 72 6f 6e 6d 65 6e 74 2c 0d 0a 20 20 20 20 20  ironment,..     
3e20: 20 20 20 23 20 20 20 20 20 20 20 75 73 65 20 69     #       use i
3e30: 74 3b 20 6f 74 68 65 72 77 69 73 65 20 61 73 73  t; otherwise ass
3e40: 75 6d 65 20 69 74 20 69 73 20 69 6e 20 74 68 65  ume it is in the
3e50: 20 50 41 54 48 2e 0d 0a 20 20 20 20 20 20 20 20   PATH...        
3e60: 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 63  #..        set c
3e70: 6f 72 46 6c 61 67 73 20 5b 65 78 70 72 20 7b 0d  orFlags [expr {.
3e80: 0a 20 20 20 20 20 20 20 20 20 20 5b 69 6e 66 6f  .          [info
3e90: 20 65 78 69 73 74 73 20 3a 3a 65 6e 76 28 43 6f   exists ::env(Co
3ea0: 72 46 6c 61 67 73 29 5d 20 3f 20 24 3a 3a 65 6e  rFlags)] ? $::en
3eb0: 76 28 43 6f 72 46 6c 61 67 73 29 20 3a 20 22 43  v(CorFlags) : "C
3ec0: 6f 72 46 6c 61 67 73 22 0d 0a 20 20 20 20 20 20  orFlags"..      
3ed0: 20 20 7d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20    }]....        
3ee0: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
3ef0: 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 65 78  E: Attempt to ex
3f00: 65 63 75 74 65 20 43 6f 72 46 6c 61 67 73 20 6f  ecute CorFlags o
3f10: 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  n the specified 
3f20: 66 69 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 23  file...        #
3f30: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63  ..        if {[c
3f40: 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
3f50: 20 20 65 78 65 63 20 2d 2d 20 24 63 6f 72 46 6c    exec -- $corFl
3f60: 61 67 73 20 5b 66 69 6c 65 20 6e 61 74 69 76 65  ags [file native
3f70: 6e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 5d 0d  name $fileName].
3f80: 0a 20 20 20 20 20 20 20 20 7d 20 65 78 65 63 5d  .        } exec]
3f90: 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
3fa0: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
3fb0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66        # NOTE: If
3fc0: 20 72 65 71 75 65 73 74 65 64 20 62 79 20 6f 75   requested by ou
3fd0: 72 20 63 61 6c 6c 65 72 2c 20 61 74 74 65 6d 70  r caller, attemp
3fe0: 74 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  t to determine t
3ff0: 68 65 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20  he..          # 
4000: 20 20 20 20 20 20 70 6c 61 74 66 6f 72 6d 20 66        platform f
4010: 6f 72 20 74 68 65 20 73 70 65 63 69 66 69 65 64  or the specified
4020: 20 66 69 6c 65 20 61 73 20 77 65 6c 6c 2e 0d 0a   file as well...
4030: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
4040: 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69         if {[stri
4050: 6e 67 20 6c 65 6e 67 74 68 20 24 76 61 72 4e 61  ng length $varNa
4060: 6d 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  me] > 0} then {.
4070: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a  .            #..
4080: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f              # NO
4090: 54 45 3a 20 53 74 6f 72 65 20 74 68 65 20 70 6c  TE: Store the pl
40a0: 61 74 66 6f 72 6d 20 69 6e 20 74 68 65 20 6e 61  atform in the na
40b0: 6d 65 64 20 76 61 72 69 61 62 6c 65 20 69 6e 20  med variable in 
40c0: 74 68 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  the..           
40d0: 20 23 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74   #       context
40e0: 20 6f 66 20 6f 75 72 20 63 61 6c 6c 65 72 2e 0d   of our caller..
40f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a  .            #..
4100: 20 20 20 20 20 20 20 20 20 20 20 20 75 70 76 61              upva
4110: 72 20 31 20 24 76 61 72 4e 61 6d 65 20 70 6c 61  r 1 $varName pla
4120: 74 66 6f 72 6d 0d 0a 0d 0a 20 20 20 20 20 20 20  tform....       
4130: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
4140: 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65      # NOTE: Atte
4150: 6d 70 74 20 74 6f 20 65 78 74 72 61 63 74 20 74  mpt to extract t
4160: 68 65 20 50 45 20 6c 69 6e 65 20 66 72 6f 6d 20  he PE line from 
4170: 74 68 65 20 63 61 70 74 75 72 65 64 0d 0a 20 20  the captured..  
4180: 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
4190: 20 20 6f 75 74 70 75 74 2e 20 20 49 66 20 74 68    output.  If th
41a0: 69 73 20 76 61 6c 75 65 20 69 73 20 22 50 45 33  is value is "PE3
41b0: 32 22 20 6f 72 20 22 50 45 33 32 2b 22 2c 20 74  2" or "PE32+", t
41c0: 68 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  he..            
41d0: 23 20 20 20 20 20 20 20 61 73 73 65 6d 62 6c 79  #       assembly
41e0: 20 66 69 6c 65 20 69 73 20 33 32 2d 62 69 74 20   file is 32-bit 
41f0: 6f 72 20 36 34 2d 62 69 74 2c 20 72 65 73 70 65  or 64-bit, respe
4200: 63 74 69 76 65 6c 79 3b 0d 0a 20 20 20 20 20 20  ctively;..      
4210: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6f 74        #       ot
4220: 68 65 72 77 69 73 65 2c 20 69 74 73 20 74 79 70  herwise, its typ
4230: 65 20 69 73 20 75 6e 6b 6e 6f 77 6e 2e 0d 0a 20  e is unknown... 
4240: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
4250: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 70 61            set pa
4260: 74 74 65 72 6e 20 7b 5e 50 45 20 20 20 20 20 20  ttern {^PE      
4270: 20 20 3a 20 28 50 45 33 32 7c 50 45 33 32 5c 2b    : (PE32|PE32\+
4280: 29 5c 73 2b 24 7d 0d 0a 0d 0a 20 20 20 20 20 20  )\s+$}....      
4290: 20 20 20 20 20 20 69 66 20 7b 5b 72 65 67 65 78        if {[regex
42a0: 70 20 2d 6c 69 6e 65 20 2d 2d 20 24 70 61 74 74  p -line -- $patt
42b0: 65 72 6e 20 24 65 78 65 63 20 64 75 6d 6d 79 20  ern $exec dummy 
42c0: 70 65 33 32 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  pe32]} then {.. 
42d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a               #..
42e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
42f0: 48 41 43 4b 3a 20 54 68 69 73 20 5b 73 77 69 74  HACK: This [swit
4300: 63 68 5d 20 61 73 73 75 6d 65 73 20 74 68 61 74  ch] assumes that
4310: 20 33 32 2d 62 69 74 20 65 78 65 63 75 74 61 62   32-bit executab
4320: 6c 65 73 20 61 72 65 0d 0a 20 20 20 20 20 20 20  les are..       
4330: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61         #       a
4340: 6c 77 61 79 73 20 78 38 36 20 61 6e 64 20 74 68  lways x86 and th
4350: 61 74 20 36 34 2d 62 69 74 20 65 78 65 63 75 74  at 64-bit execut
4360: 61 62 6c 65 73 20 61 72 65 20 61 6c 77 61 79 73  ables are always
4370: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
4380: 23 20 20 20 20 20 20 20 78 36 34 2e 0d 0a 20 20  #       x64...  
4390: 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
43a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 77 69               swi
43b0: 74 63 68 20 2d 65 78 61 63 74 20 2d 2d 20 24 70  tch -exact -- $p
43c0: 65 33 32 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  e32 {..         
43d0: 20 20 20 20 20 20 20 50 45 33 32 20 7b 0d 0a 20         PE32 {.. 
43e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
43f0: 20 73 65 74 20 70 6c 61 74 66 6f 72 6d 20 57 69   set platform Wi
4400: 6e 33 32 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n32..           
4410: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
4420: 20 20 20 20 20 20 20 20 50 45 33 32 2b 20 7b 0d          PE32+ {.
4430: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4440: 20 20 20 73 65 74 20 70 6c 61 74 66 6f 72 6d 20     set platform 
4450: 78 36 34 0d 0a 20 20 20 20 20 20 20 20 20 20 20  x64..           
4460: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
4470: 20 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 20          default 
4480: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
4490: 20 20 20 20 20 73 65 74 20 70 6c 61 74 66 6f 72       set platfor
44a0: 6d 20 22 22 0d 0a 20 20 20 20 20 20 20 20 20 20  m ""..          
44b0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
44c0: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
44d0: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
44e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
44f0: 74 20 70 6c 61 74 66 6f 72 6d 20 22 22 0d 0a 20  t platform "".. 
4500: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
4510: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
4520: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
4530: 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65      # NOTE: Atte
4540: 6d 70 74 20 74 6f 20 65 78 74 72 61 63 74 20 74  mpt to extract t
4550: 68 65 20 49 4c 4f 4e 4c 59 20 6c 69 6e 65 20 66  he ILONLY line f
4560: 72 6f 6d 20 74 68 65 20 63 61 70 74 75 72 65 64  rom the captured
4570: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20  ..          #   
4580: 20 20 20 20 6f 75 74 70 75 74 2e 20 20 49 66 20      output.  If 
4590: 74 68 69 73 20 76 61 6c 75 65 20 69 73 20 7a 65  this value is ze
45a0: 72 6f 2c 20 74 68 65 20 73 70 65 63 69 66 69 65  ro, the specifie
45b0: 64 20 66 69 6c 65 20 6d 75 73 74 0d 0a 20 20 20  d file must..   
45c0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62         #       b
45d0: 65 20 61 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61  e a mixed-mode a
45e0: 73 73 65 6d 62 6c 79 3b 20 6f 74 68 65 72 77 69  ssembly; otherwi
45f0: 73 65 2c 20 69 74 20 63 6f 6e 74 61 69 6e 73 20  se, it contains 
4600: 6f 6e 6c 79 0d 0a 20 20 20 20 20 20 20 20 20 20  only..          
4610: 23 20 20 20 20 20 20 20 6d 61 6e 61 67 65 64 20  #       managed 
4620: 63 6f 6d 70 6f 6e 65 6e 74 73 2e 0d 0a 20 20 20  components...   
4630: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
4640: 20 20 20 20 73 65 74 20 70 61 74 74 65 72 6e 20      set pattern 
4650: 7b 5e 49 4c 4f 4e 4c 59 20 20 20 20 3a 20 28 30  {^ILONLY    : (0
4660: 7c 31 29 5c 73 2b 24 7d 0d 0a 0d 0a 20 20 20 20  |1)\s+$}....    
4670: 20 20 20 20 20 20 69 66 20 7b 21 5b 72 65 67 65        if {![rege
4680: 78 70 20 2d 6c 69 6e 65 20 2d 2d 20 24 70 61 74  xp -line -- $pat
4690: 74 65 72 6e 20 24 65 78 65 63 20 64 75 6d 6d 79  tern $exec dummy
46a0: 20 69 6c 4f 6e 6c 79 5d 7d 20 74 68 65 6e 20 7b   ilOnly]} then {
46b0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ..            re
46c0: 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20  turn false..    
46d0: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
46e0: 20 20 20 20 20 69 66 20 7b 21 24 69 6c 4f 6e 6c       if {!$ilOnl
46f0: 79 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  y} then {..     
4700: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72         return tr
4710: 75 65 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  ue..          }.
4720: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
4730: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
4740: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66        # NOTE: If
4750: 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65 20   the test suite 
4760: 63 61 6e 6e 6f 74 20 75 73 65 20 5b 65 78 65 63  cannot use [exec
4770: 5d 20 6f 72 20 65 78 65 63 75 74 69 6f 6e 20 6f  ] or execution o
4780: 66 20 43 6f 72 46 6c 61 67 73 0d 0a 20 20 20 20  f CorFlags..    
4790: 20 20 23 20 20 20 20 20 20 20 66 61 69 6c 65 64    #       failed
47a0: 2c 20 72 65 74 75 72 6e 20 66 61 6c 73 65 2e 0d  , return false..
47b0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
47c0: 72 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20  return false..  
47d0: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
47e0: 20 67 65 74 4e 61 74 69 76 65 4c 69 62 72 61 72   getNativeLibrar
47f0: 79 46 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79 20 7b  yFileNamesOnly {
4800: 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
4810: 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69 72 73      # NOTE: Firs
4820: 74 2c 20 63 68 65 63 6b 20 69 66 20 74 68 65 20  t, check if the 
4830: 6c 69 73 74 20 6f 66 20 6e 61 74 69 76 65 20 6c  list of native l
4840: 69 62 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65  ibrary file name
4850: 73 20 68 61 73 20 62 65 65 6e 0d 0a 20 20 20 20  s has been..    
4860: 20 20 23 20 20 20 20 20 20 20 6d 61 6e 75 61 6c    #       manual
4870: 6c 79 20 6f 76 65 72 72 69 64 64 65 6e 2e 0d 0a  ly overridden...
4880: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
4890: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
48a0: 3a 3a 6e 61 74 69 76 65 5f 6c 69 62 72 61 72 79  ::native_library
48b0: 5f 66 69 6c 65 5f 6e 61 6d 65 73 5d 20 26 26 20  _file_names] && 
48c0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 6c 6c  \..          [ll
48d0: 65 6e 67 74 68 20 24 3a 3a 6e 61 74 69 76 65 5f  ength $::native_
48e0: 6c 69 62 72 61 72 79 5f 66 69 6c 65 5f 6e 61 6d  library_file_nam
48f0: 65 73 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  es] > 0} then {.
4900: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
4910: 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20      # NOTE: The 
4920: 6c 69 73 74 20 6f 66 20 6e 61 74 69 76 65 20 6c  list of native l
4930: 69 62 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65  ibrary file name
4940: 73 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72  s has been overr
4950: 69 64 64 65 6e 3b 0d 0a 20 20 20 20 20 20 20 20  idden;..        
4960: 23 20 20 20 20 20 20 20 74 68 65 72 65 66 6f 72  #       therefor
4970: 65 2c 20 75 73 65 20 69 74 20 76 65 72 62 61 74  e, use it verbat
4980: 69 6d 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  im...        #..
4990: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24          return $
49a0: 3a 3a 6e 61 74 69 76 65 5f 6c 69 62 72 61 72 79  ::native_library
49b0: 5f 66 69 6c 65 5f 6e 61 6d 65 73 0d 0a 20 20 20  _file_names..   
49c0: 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69 73     } elseif {[is
49d0: 57 69 6e 64 6f 77 73 5d 7d 20 74 68 65 6e 20 7b  Windows]} then {
49e0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
49f0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4f 74 68       # NOTE: Oth
4a00: 65 72 77 69 73 65 2c 20 6f 6e 20 57 69 6e 64 6f  erwise, on Windo
4a10: 77 73 2c 20 61 6c 77 61 79 73 20 75 73 65 20 74  ws, always use t
4a20: 68 65 20 64 65 66 61 75 6c 74 20 66 69 6c 65 20  he default file 
4a30: 6e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 23 20  name..        # 
4a40: 20 20 20 20 20 20 22 73 71 6c 69 74 65 33 2e 64        "sqlite3.d
4a50: 6c 6c 22 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ll"...        #.
4a60: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
4a70: 5b 6c 69 73 74 20 73 71 6c 69 74 65 33 2e 64 6c  [list sqlite3.dl
4a80: 6c 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  l]..      } else
4a90: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
4aa0: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4f         # NOTE: O
4ab0: 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e  therwise, return
4ac0: 20 62 6f 74 68 20 74 68 65 20 67 65 6e 65 72 69   both the generi
4ad0: 63 20 50 4f 53 49 58 20 66 69 6c 65 20 6e 61 6d  c POSIX file nam
4ae0: 65 20 61 6e 64 20 74 68 65 0d 0a 20 20 20 20 20  e and the..     
4af0: 20 20 20 23 20 20 20 20 20 20 20 4d 61 63 20 4f     #       Mac O
4b00: 53 20 58 20 66 69 6c 65 20 6e 61 6d 65 2c 20 73  S X file name, s
4b10: 69 6e 63 65 20 77 65 20 64 6f 20 6e 6f 74 20 63  ince we do not c
4b20: 75 72 72 65 6e 74 6c 79 20 68 61 76 65 20 61 6e  urrently have an
4b30: 20 65 61 73 79 0d 0a 20 20 20 20 20 20 20 20 23   easy..        #
4b40: 20 20 20 20 20 20 20 77 61 79 20 74 6f 20 64 65         way to de
4b50: 74 65 63 74 20 77 68 69 63 68 20 6f 66 20 74 68  tect which of th
4b60: 6f 73 65 20 70 6c 61 74 66 6f 72 6d 73 20 77 65  ose platforms we
4b70: 20 61 72 65 20 72 75 6e 6e 69 6e 67 20 6f 6e 2e   are running on.
4b80: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
4b90: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6c 69 73       return [lis
4ba0: 74 20 6c 69 62 73 71 6c 69 74 65 33 2e 64 79 6c  t libsqlite3.dyl
4bb0: 69 62 20 6c 69 62 73 71 6c 69 74 65 33 2e 73 6f  ib libsqlite3.so
4bc0: 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  ]..      }..    
4bd0: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67  }.....    proc g
4be0: 65 74 49 6e 74 65 72 6f 70 41 73 73 65 6d 62 6c  etInteropAssembl
4bf0: 79 46 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79 20 7b  yFileNamesOnly {
4c00: 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
4c10: 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69 72 73      # NOTE: Firs
4c20: 74 2c 20 63 68 65 63 6b 20 69 66 20 74 68 65 20  t, check if the 
4c30: 6c 69 73 74 20 6f 66 20 69 6e 74 65 72 6f 70 20  list of interop 
4c40: 61 73 73 65 6d 62 6c 79 20 66 69 6c 65 20 6e 61  assembly file na
4c50: 6d 65 73 20 68 61 73 20 62 65 65 6e 0d 0a 20 20  mes has been..  
4c60: 20 20 20 20 23 20 20 20 20 20 20 20 6d 61 6e 75      #       manu
4c70: 61 6c 6c 79 20 6f 76 65 72 72 69 64 64 65 6e 2e  ally overridden.
4c80: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
4c90: 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
4ca0: 73 20 3a 3a 69 6e 74 65 72 6f 70 5f 61 73 73 65  s ::interop_asse
4cb0: 6d 62 6c 79 5f 66 69 6c 65 5f 6e 61 6d 65 73 5d  mbly_file_names]
4cc0: 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
4cd0: 20 5b 6c 6c 65 6e 67 74 68 20 24 3a 3a 69 6e 74   [llength $::int
4ce0: 65 72 6f 70 5f 61 73 73 65 6d 62 6c 79 5f 66 69  erop_assembly_fi
4cf0: 6c 65 5f 6e 61 6d 65 73 5d 20 3e 20 30 7d 20 74  le_names] > 0} t
4d00: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
4d10: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
4d20: 3a 20 54 68 65 20 6c 69 73 74 20 6f 66 20 69 6e  : The list of in
4d30: 74 65 72 6f 70 20 61 73 73 65 6d 62 6c 79 20 66  terop assembly f
4d40: 69 6c 65 20 6e 61 6d 65 73 20 68 61 73 20 62 65  ile names has be
4d50: 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b 0d 0a  en overridden;..
4d60: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
4d70: 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69  therefore, use i
4d80: 74 20 76 65 72 62 61 74 69 6d 2e 0d 0a 20 20 20  t verbatim...   
4d90: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
4da0: 72 65 74 75 72 6e 20 24 3a 3a 69 6e 74 65 72 6f  return $::intero
4db0: 70 5f 61 73 73 65 6d 62 6c 79 5f 66 69 6c 65 5f  p_assembly_file_
4dc0: 6e 61 6d 65 73 0d 0a 20 20 20 20 20 20 7d 20 65  names..      } e
4dd0: 6c 73 65 69 66 20 7b 5b 69 73 57 69 6e 64 6f 77  lseif {[isWindow
4de0: 73 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  s]} then {..    
4df0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
4e00: 20 4e 4f 54 45 3a 20 4f 74 68 65 72 77 69 73 65   NOTE: Otherwise
4e10: 2c 20 6f 6e 20 57 69 6e 64 6f 77 73 2c 20 61 6c  , on Windows, al
4e20: 77 61 79 73 20 75 73 65 20 74 68 65 20 64 65 66  ways use the def
4e30: 61 75 6c 74 20 66 69 6c 65 20 6e 61 6d 65 0d 0a  ault file name..
4e40: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
4e50: 22 53 51 4c 69 74 65 2e 49 6e 74 65 72 6f 70 2e  "SQLite.Interop.
4e60: 64 6c 6c 22 2e 0d 0a 20 20 20 20 20 20 20 20 23  dll"...        #
4e70: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
4e80: 20 5b 6c 69 73 74 20 53 51 4c 69 74 65 2e 49 6e   [list SQLite.In
4e90: 74 65 72 6f 70 2e 64 6c 6c 5d 0d 0a 20 20 20 20  terop.dll]..    
4ea0: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
4eb0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
4ec0: 20 4e 4f 54 45 3a 20 4f 74 68 65 72 77 69 73 65   NOTE: Otherwise
4ed0: 2c 20 72 65 74 75 72 6e 20 62 6f 74 68 20 74 68  , return both th
4ee0: 65 20 67 65 6e 65 72 69 63 20 50 4f 53 49 58 20  e generic POSIX 
4ef0: 66 69 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68  file name and th
4f00: 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
4f10: 20 20 20 4d 61 63 20 4f 53 20 58 20 66 69 6c 65     Mac OS X file
4f20: 20 6e 61 6d 65 2c 20 73 69 6e 63 65 20 77 65 20   name, since we 
4f30: 64 6f 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  do not currently
4f40: 20 68 61 76 65 20 61 6e 20 65 61 73 79 0d 0a 20   have an easy.. 
4f50: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 77         #       w
4f60: 61 79 20 74 6f 20 64 65 74 65 63 74 20 77 68 69  ay to detect whi
4f70: 63 68 20 6f 66 20 74 68 6f 73 65 20 70 6c 61 74  ch of those plat
4f80: 66 6f 72 6d 73 20 77 65 20 61 72 65 20 72 75 6e  forms we are run
4f90: 6e 69 6e 67 20 6f 6e 2e 0d 0a 20 20 20 20 20 20  ning on...      
4fa0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
4fb0: 75 72 6e 20 5b 6c 69 73 74 20 6c 69 62 53 51 4c  urn [list libSQL
4fc0: 69 74 65 2e 49 6e 74 65 72 6f 70 2e 64 79 6c 69  ite.Interop.dyli
4fd0: 62 20 6c 69 62 53 51 4c 69 74 65 2e 49 6e 74 65  b libSQLite.Inte
4fe0: 72 6f 70 2e 73 6f 5d 0d 0a 20 20 20 20 20 20 7d  rop.so]..      }
4ff0: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
5000: 70 72 6f 63 20 67 65 74 43 6f 72 65 45 78 74 65  proc getCoreExte
5010: 6e 73 69 6f 6e 42 69 6e 61 72 79 46 69 6c 65 4e  nsionBinaryFileN
5020: 61 6d 65 20 7b 20 7b 64 65 66 61 75 6c 74 20 22  ame { {default "
5030: 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65  "} } {..      se
5040: 74 20 66 69 6c 65 4e 61 6d 65 20 5b 67 65 74 43  t fileName [getC
5050: 6f 72 65 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d  oreBinaryFileNam
5060: 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b  e]....      if {
5070: 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 66 69  [file exists $fi
5080: 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d  leName]} then {.
5090: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
50a0: 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20  $fileName..     
50b0: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75   }....      retu
50c0: 72 6e 20 24 64 65 66 61 75 6c 74 0d 0a 20 20 20  rn $default..   
50d0: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
50e0: 69 73 42 75 69 6c 64 41 76 61 69 6c 61 62 6c 65  isBuildAvailable
50f0: 20 7b 20 6e 61 74 69 76 65 20 64 69 72 65 63 74   { native direct
5100: 6f 72 79 20 7b 76 61 72 4e 61 6d 65 20 22 22 7d  ory {varName ""}
5110: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20   } {..      #.. 
5120: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69       # NOTE: Bui
5130: 6c 64 20 74 68 65 20 66 75 6c 6c 79 20 71 75 61  ld the fully qua
5140: 6c 69 66 69 65 64 20 66 69 6c 65 20 6e 61 6d 65  lified file name
5150: 20 66 6f 72 20 74 68 65 20 70 72 69 6d 61 72 79   for the primary
5160: 20 61 73 73 65 6d 62 6c 79 0d 0a 20 20 20 20 20   assembly..     
5170: 20 23 20 20 20 20 20 20 20 63 6f 6e 74 61 69 6e   #       contain
5180: 69 6e 67 20 74 68 65 20 53 79 73 74 65 6d 2e 44  ing the System.D
5190: 61 74 61 2e 53 51 4c 69 74 65 20 6d 61 6e 61 67  ata.SQLite manag
51a0: 65 64 20 63 6f 6d 70 6f 6e 65 6e 74 73 2e 20 20  ed components.  
51b0: 49 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  It..      #     
51c0: 20 20 73 68 6f 75 6c 64 20 62 65 20 6e 6f 74 65    should be note
51d0: 64 20 74 68 61 74 20 74 68 69 73 20 61 73 73 65  d that this asse
51e0: 6d 62 6c 79 20 66 69 6c 65 20 6d 61 79 20 61 6c  mbly file may al
51f0: 73 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 0d 0a  so contain the..
5200: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6e 61        #       na
5210: 74 69 76 65 20 63 6f 6d 70 6f 6e 65 6e 74 73 2c  tive components,
5220: 20 69 66 20 61 20 6e 61 74 69 76 65 20 62 75 69   if a native bui
5230: 6c 64 20 69 73 20 69 6e 20 75 73 65 2e 0d 0a 20  ld is in use... 
5240: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65       #..      se
5250: 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65  t fileName [file
5260: 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c   nativename [fil
5270: 65 20 6a 6f 69 6e 20 24 64 69 72 65 63 74 6f 72  e join $director
5280: 79 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 53  y \..          S
5290: 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
52a0: 65 2e 64 6c 6c 5d 5d 0d 0a 0d 0a 20 20 20 20 20  e.dll]]....     
52b0: 20 69 66 20 7b 21 5b 66 69 6c 65 20 65 78 69 73   if {![file exis
52c0: 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74  ts $fileName]} t
52d0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72  hen {..        r
52e0: 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20  eturn false..   
52f0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
5300: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41  .      # NOTE: A
5310: 74 74 65 6d 70 74 20 74 6f 20 61 75 74 6f 6d 61  ttempt to automa
5320: 74 69 63 61 6c 6c 79 20 64 65 74 65 63 74 20 69  tically detect i
5330: 66 20 74 68 65 20 70 72 69 6d 61 72 79 20 61 73  f the primary as
5340: 73 65 6d 62 6c 79 0d 0a 20 20 20 20 20 20 23 20  sembly..      # 
5350: 20 20 20 20 20 20 63 6f 6e 74 61 69 6e 73 20 61        contains a
5360: 6e 79 20 6e 61 74 69 76 65 20 63 6f 6d 70 6f 6e  ny native compon
5370: 65 6e 74 73 2c 20 69 66 20 6e 65 63 65 73 73 61  ents, if necessa
5380: 72 79 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ry...      #..  
5390: 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
53a0: 6c 65 6e 67 74 68 20 24 6e 61 74 69 76 65 5d 20  length $native] 
53b0: 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
53c0: 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
53d0: 67 20 6c 65 6e 67 74 68 20 24 76 61 72 4e 61 6d  g length $varNam
53e0: 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  e] > 0} then {..
53f0: 20 20 20 20 20 20 20 20 20 20 75 70 76 61 72 20            upvar 
5400: 31 20 24 76 61 72 4e 61 6d 65 20 24 76 61 72 4e  1 $varName $varN
5410: 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  ame..        }..
5420: 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 6e 61  ..        set na
5430: 74 69 76 65 20 5b 69 73 4d 69 78 65 64 4d 6f 64  tive [isMixedMod
5440: 65 41 73 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e  eAssembly $fileN
5450: 61 6d 65 20 24 76 61 72 4e 61 6d 65 5d 0d 0a 20  ame $varName].. 
5460: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
5470: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
5480: 20 49 66 20 74 68 65 20 70 72 69 6d 61 72 79 20   If the primary 
5490: 61 73 73 65 6d 62 6c 79 20 61 6c 73 6f 20 63 6f  assembly also co
54a0: 6e 74 61 69 6e 73 20 74 68 65 20 6e 61 74 69 76  ntains the nativ
54b0: 65 20 63 6f 6d 70 6f 6e 65 6e 74 73 2c 0d 0a 20  e components,.. 
54c0: 20 20 20 20 20 23 20 20 20 20 20 20 20 77 65 20       #       we 
54d0: 68 61 76 65 20 65 76 65 72 79 74 68 69 6e 67 20  have everything 
54e0: 77 65 20 6e 65 65 64 2e 0d 0a 20 20 20 20 20 20  we need...      
54f0: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 6e 61  #..      if {$na
5500: 74 69 76 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  tive} then {..  
5510: 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75        return tru
5520: 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  e..      }....  
5530: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
5540: 4f 54 45 3a 20 49 66 20 74 68 65 20 6d 61 63 68  OTE: If the mach
5550: 69 6e 65 20 6e 61 6d 65 20 69 73 20 75 6e 61 76  ine name is unav
5560: 61 69 6c 61 62 6c 65 2c 20 74 68 65 72 65 20 69  ailable, there i
5570: 73 20 6e 6f 74 68 69 67 6e 20 65 6c 73 65 20 77  s nothign else w
5580: 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
5590: 20 63 61 6e 20 64 6f 2e 0d 0a 20 20 20 20 20 20   can do...      
55a0: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 69  #..      if {![i
55b0: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 63 6c  nfo exists ::tcl
55c0: 5f 70 6c 61 74 66 6f 72 6d 28 6d 61 63 68 69 6e  _platform(machin
55d0: 65 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  e)]} then {..   
55e0: 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73       return fals
55f0: 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  e..      }....  
5600: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
5610: 4f 54 45 3a 20 57 68 61 74 20 69 73 20 74 68 65  OTE: What is the
5620: 20 61 72 63 68 69 74 65 63 74 75 72 65 20 66 6f   architecture fo
5630: 72 20 74 68 69 73 20 6d 61 63 68 69 6e 65 3f 0d  r this machine?.
5640: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
5650: 73 65 74 20 61 72 63 68 69 74 65 63 74 75 72 65  set architecture
5660: 20 5b 6d 61 63 68 69 6e 65 54 6f 50 6c 61 74 66   [machineToPlatf
5670: 6f 72 6d 20 24 3a 3a 74 63 6c 5f 70 6c 61 74 66  orm $::tcl_platf
5680: 6f 72 6d 28 6d 61 63 68 69 6e 65 29 20 74 72 75  orm(machine) tru
5690: 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20  e]....      #.. 
56a0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 68 61       # NOTE: Wha
56b0: 74 20 69 73 20 74 68 65 20 70 6c 61 74 66 6f 72  t is the platfor
56c0: 6d 20 66 6f 72 20 74 68 69 73 20 6d 61 63 68 69  m for this machi
56d0: 6e 65 3f 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ne?..      #..  
56e0: 20 20 20 20 73 65 74 20 70 6c 61 74 66 6f 72 6d      set platform
56f0: 20 5b 6d 61 63 68 69 6e 65 54 6f 50 6c 61 74 66   [machineToPlatf
5700: 6f 72 6d 20 24 3a 3a 74 63 6c 5f 70 6c 61 74 66  orm $::tcl_platf
5710: 6f 72 6d 28 6d 61 63 68 69 6e 65 29 5d 0d 0a 0d  orm(machine)]...
5720: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
5730: 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74 68  # NOTE: Build th
5740: 65 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65  e fully qualifie
5750: 64 20 66 69 6c 65 20 6e 61 6d 65 20 66 6f 72 20  d file name for 
5760: 74 68 65 20 69 6e 74 65 72 6f 70 20 61 73 73 65  the interop asse
5770: 6d 62 6c 79 0d 0a 20 20 20 20 20 20 23 20 20 20  mbly..      #   
5780: 20 20 20 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74      containing t
5790: 68 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  he System.Data.S
57a0: 51 4c 69 74 65 20 6e 61 74 69 76 65 20 63 6f 6d  QLite native com
57b0: 70 6f 6e 65 6e 74 73 2e 20 20 49 66 20 74 68 69  ponents.  If thi
57c0: 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  s..      #      
57d0: 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 77 65   file exists, we
57e0: 20 73 68 6f 75 6c 64 20 68 61 76 65 20 65 76 65   should have eve
57f0: 72 79 74 68 69 6e 67 20 77 65 20 6e 65 65 64 2e  rything we need.
5800: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
5810: 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d   foreach fileNam
5820: 65 4f 6e 6c 79 20 5b 67 65 74 49 6e 74 65 72 6f  eOnly [getIntero
5830: 70 41 73 73 65 6d 62 6c 79 46 69 6c 65 4e 61 6d  pAssemblyFileNam
5840: 65 73 4f 6e 6c 79 5d 20 7b 0d 0a 20 20 20 20 20  esOnly] {..     
5850: 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 20     set fileName 
5860: 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65  [file nativename
5870: 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 64 69 72   [file join $dir
5880: 65 63 74 6f 72 79 20 5c 0d 0a 20 20 20 20 20 20  ectory \..      
5890: 20 20 20 20 20 20 24 61 72 63 68 69 74 65 63 74        $architect
58a0: 75 72 65 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c  ure $fileNameOnl
58b0: 79 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69  y]]....        i
58c0: 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20  f {[file exists 
58d0: 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e  $fileName]} then
58e0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65   {..          re
58f0: 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20  turn true..     
5900: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
5910: 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69  set fileName [fi
5920: 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66  le nativename [f
5930: 69 6c 65 20 6a 6f 69 6e 20 24 64 69 72 65 63 74  ile join $direct
5940: 6f 72 79 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ory \..         
5950: 20 20 20 24 70 6c 61 74 66 6f 72 6d 20 24 66 69     $platform $fi
5960: 6c 65 4e 61 6d 65 4f 6e 6c 79 5d 5d 0d 0a 0d 0a  leNameOnly]]....
5970: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 66 69 6c          if {[fil
5980: 65 20 65 78 69 73 74 73 20 24 66 69 6c 65 4e 61  e exists $fileNa
5990: 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  me]} then {..   
59a0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72         return tr
59b0: 75 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  ue..        }...
59c0: 0a 20 20 20 20 20 20 20 20 73 65 74 20 66 69 6c  .        set fil
59d0: 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6e 61 74 69  eName [file nati
59e0: 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69  vename [file joi
59f0: 6e 20 24 64 69 72 65 63 74 6f 72 79 20 5c 0d 0a  n $directory \..
5a00: 20 20 20 20 20 20 20 20 20 20 20 20 24 66 69 6c              $fil
5a10: 65 4e 61 6d 65 4f 6e 6c 79 5d 5d 0d 0a 0d 0a 20  eNameOnly]].... 
5a20: 20 20 20 20 20 20 20 69 66 20 7b 5b 66 69 6c 65         if {[file
5a30: 20 65 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d   exists $fileNam
5a40: 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  e]} then {..    
5a50: 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75        return tru
5a60: 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  e..        }..  
5a70: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
5a80: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
5a90: 42 75 69 6c 64 20 74 68 65 20 66 75 6c 6c 79 20  Build the fully 
5aa0: 71 75 61 6c 69 66 69 65 64 20 66 69 6c 65 20 6e  qualified file n
5ab0: 61 6d 65 20 66 6f 72 20 74 68 65 20 53 51 4c 69  ame for the SQLi
5ac0: 74 65 20 63 6f 72 65 0d 0a 20 20 20 20 20 20 23  te core..      #
5ad0: 20 20 20 20 20 20 20 6c 69 62 72 61 72 79 2e 20         library. 
5ae0: 20 49 66 20 74 68 69 73 20 66 69 6c 65 20 65 78   If this file ex
5af0: 69 73 74 73 2c 20 77 65 20 73 68 6f 75 6c 64 20  ists, we should 
5b00: 68 61 76 65 20 65 76 65 72 79 74 68 69 6e 67 20  have everything 
5b10: 77 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  we..      #     
5b20: 20 20 6e 65 65 64 2e 0d 0a 20 20 20 20 20 20 23    need...      #
5b30: 0d 0a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20  ..      foreach 
5b40: 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 5b 67 65  fileNameOnly [ge
5b50: 74 4e 61 74 69 76 65 4c 69 62 72 61 72 79 46 69  tNativeLibraryFi
5b60: 6c 65 4e 61 6d 65 73 4f 6e 6c 79 5d 20 7b 0d 0a  leNamesOnly] {..
5b70: 20 20 20 20 20 20 20 20 73 65 74 20 66 69 6c 65          set file
5b80: 4e 61 6d 65 20 5b 66 69 6c 65 20 6e 61 74 69 76  Name [file nativ
5b90: 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e  ename [file join
5ba0: 20 24 64 69 72 65 63 74 6f 72 79 20 5c 0d 0a 20   $directory \.. 
5bb0: 20 20 20 20 20 20 20 20 20 20 20 24 61 72 63 68             $arch
5bc0: 69 74 65 63 74 75 72 65 20 24 66 69 6c 65 4e 61  itecture $fileNa
5bd0: 6d 65 4f 6e 6c 79 5d 5d 0d 0a 0d 0a 20 20 20 20  meOnly]]....    
5be0: 20 20 20 20 69 66 20 7b 5b 66 69 6c 65 20 65 78      if {[file ex
5bf0: 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d  ists $fileName]}
5c00: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
5c10: 20 20 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a     return true..
5c20: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
5c30: 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d       set fileNam
5c40: 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61  e [file nativena
5c50: 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 64  me [file join $d
5c60: 69 72 65 63 74 6f 72 79 20 5c 0d 0a 20 20 20 20  irectory \..    
5c70: 20 20 20 20 20 20 20 20 24 70 6c 61 74 66 6f 72          $platfor
5c80: 6d 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 5d  m $fileNameOnly]
5c90: 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20  ]....        if 
5ca0: 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 66  {[file exists $f
5cb0: 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b  ileName]} then {
5cc0: 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ..          retu
5cd0: 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20 20  rn true..       
5ce0: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65   }....        se
5cf0: 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65  t fileName [file
5d00: 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c   nativename [fil
5d10: 65 20 6a 6f 69 6e 20 24 64 69 72 65 63 74 6f 72  e join $director
5d20: 79 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  y \..           
5d30: 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 5d 5d   $fileNameOnly]]
5d40: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b  ....        if {
5d50: 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 66 69  [file exists $fi
5d60: 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d  leName]} then {.
5d70: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
5d80: 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20 20 20  n true..        
5d90: 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  }..      }....  
5da0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
5db0: 4f 54 45 3a 20 4f 6e 65 20 6f 72 20 6d 6f 72 65  OTE: One or more
5dc0: 20 6e 61 74 69 76 65 20 63 6f 6d 70 6f 6e 65 6e   native componen
5dd0: 74 73 20 6e 65 65 64 65 64 20 62 79 20 53 79 73  ts needed by Sys
5de0: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 0d  tem.Data.SQLite.
5df0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61  .      #       a
5e00: 72 65 20 6d 69 73 73 69 6e 67 2e 0d 0a 20 20 20  re missing...   
5e10: 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75     #..      retu
5e20: 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20 7d 0d  rn false..    }.
5e30: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 69 73 52  ....    proc isR
5e40: 65 6c 65 61 73 65 41 76 61 69 6c 61 62 6c 65 20  eleaseAvailable 
5e50: 7b 20 64 69 72 65 63 74 6f 72 79 20 7b 76 61 72  { directory {var
5e60: 4e 61 6d 65 20 22 22 7d 20 7d 20 7b 0d 0a 20 20  Name ""} } {..  
5e70: 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
5e80: 6c 65 6e 67 74 68 20 24 76 61 72 4e 61 6d 65 5d  length $varName]
5e90: 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
5ea0: 20 20 20 20 20 20 75 70 76 61 72 20 31 20 24 76        upvar 1 $v
5eb0: 61 72 4e 61 6d 65 20 24 76 61 72 4e 61 6d 65 0d  arName $varName.
5ec0: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
5ed0: 20 20 72 65 74 75 72 6e 20 5b 69 73 42 75 69 6c    return [isBuil
5ee0: 64 41 76 61 69 6c 61 62 6c 65 20 22 22 20 24 64  dAvailable "" $d
5ef0: 69 72 65 63 74 6f 72 79 20 24 76 61 72 4e 61 6d  irectory $varNam
5f00: 65 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  e]..    }.....  
5f10: 20 20 70 72 6f 63 20 6a 6f 69 6e 42 75 69 6c 64    proc joinBuild
5f20: 44 69 72 65 63 74 6f 72 79 20 7b 20 6e 61 74 69  Directory { nati
5f30: 76 65 20 70 61 74 68 20 79 65 61 72 20 70 6c 61  ve path year pla
5f40: 74 66 6f 72 6d 20 63 6f 6e 66 69 67 75 72 61 74  tform configurat
5f50: 69 6f 6e 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23  ion } {..      #
5f60: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
5f70: 46 69 67 75 72 65 20 6f 75 74 20 61 6e 64 20 74  Figure out and t
5f80: 68 65 6e 20 72 65 74 75 72 6e 20 74 68 65 20 66  hen return the f
5f90: 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 20 70  ully qualified p
5fa0: 61 74 68 20 74 6f 20 74 68 65 20 62 75 69 6c 64  ath to the build
5fb0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
5fc0: 64 69 72 65 63 74 6f 72 79 20 62 61 73 65 64 20  directory based 
5fd0: 6f 6e 20 61 6c 6c 20 74 68 65 20 61 72 67 75 6d  on all the argum
5fe0: 65 6e 74 73 20 70 72 6f 76 69 64 65 64 20 62 79  ents provided by
5ff0: 20 6f 75 72 20 63 61 6c 6c 65 72 2e 0d 0a 20 20   our caller...  
6000: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
6010: 7b 24 6e 61 74 69 76 65 7d 20 74 68 65 6e 20 7b  {$native} then {
6020: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
6030: 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 70 61 74   [file join $pat
6040: 68 20 62 69 6e 20 24 79 65 61 72 20 24 70 6c 61  h bin $year $pla
6050: 74 66 6f 72 6d 20 24 63 6f 6e 66 69 67 75 72 61  tform $configura
6060: 74 69 6f 6e 5d 0d 0a 20 20 20 20 20 20 7d 20 65  tion]..      } e
6070: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 72  lse {..        r
6080: 65 74 75 72 6e 20 5b 66 69 6c 65 20 6a 6f 69 6e  eturn [file join
6090: 20 24 70 61 74 68 20 62 69 6e 20 24 79 65 61 72   $path bin $year
60a0: 20 24 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20   $configuration 
60b0: 62 69 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  bin]..      }.. 
60c0: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
60d0: 63 20 67 65 74 42 75 69 6c 64 44 69 72 65 63 74  c getBuildDirect
60e0: 6f 72 79 20 7b 20 6d 61 6e 61 67 65 64 4f 6e 6c  ory { managedOnl
60f0: 79 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a  y } {..      #..
6100: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 65        # NOTE: Se
6110: 65 20 69 66 20 74 68 65 20 22 6e 61 74 69 76 65  e if the "native
6120: 22 20 72 75 6e 74 69 6d 65 20 6f 70 74 69 6f 6e  " runtime option
6130: 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 20   has been set.  
6140: 49 66 20 73 6f 2c 20 75 73 65 20 74 68 65 0d 0a  If so, use the..
6150: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64 69        #       di
6160: 72 65 63 74 6f 72 79 20 66 6f 72 20 74 68 65 20  rectory for the 
6170: 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73 65 6d  mixed-mode assem
6180: 62 6c 79 20 28 61 2e 6b 2e 61 2e 20 74 68 65 20  bly (a.k.a. the 
6190: 6e 61 74 69 76 65 20 69 6e 74 65 72 6f 70 0d 0a  native interop..
61a0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61 73        #       as
61b0: 73 65 6d 62 6c 79 29 2e 20 20 54 6f 20 65 6e 61  sembly).  To ena
61c0: 62 6c 65 20 74 68 69 73 20 6f 70 74 69 6f 6e 20  ble this option 
61d0: 76 69 61 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20  via the command 
61e0: 6c 69 6e 65 2c 20 65 6e 74 65 72 20 61 0d 0a 20  line, enter a.. 
61f0: 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 6d       #       com
6200: 6d 61 6e 64 20 73 69 6d 69 6c 61 72 20 74 6f 20  mand similar to 
6210: 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  one of the follo
6220: 77 69 6e 67 20 28 61 6c 6c 20 6f 6e 20 6f 6e 65  wing (all on one
6230: 20 6c 69 6e 65 29 3a 0d 0a 20 20 20 20 20 20 23   line):..      #
6240: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
6250: 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65 20 2d  EagleShell.exe -
6260: 69 6e 69 74 69 61 6c 69 7a 65 20 2d 72 75 6e 74  initialize -runt
6270: 69 6d 65 4f 70 74 69 6f 6e 20 6e 61 74 69 76 65  imeOption native
6280: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
6290: 20 20 2d 66 69 6c 65 20 2e 5c 70 61 74 68 5c 74    -file .\path\t
62a0: 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a 20 20 20  o\all.eagle..   
62b0: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 20 20     #..      #   
62c0: 20 20 20 20 54 6f 20 65 6e 61 62 6c 65 20 74 68      To enable th
62d0: 69 73 20 6f 70 74 69 6f 6e 20 76 69 61 20 74 68  is option via th
62e0: 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 70  e command line p
62f0: 72 69 6f 72 20 74 6f 20 74 68 65 20 22 62 65 74  rior to the "bet
6300: 61 20 31 36 22 0d 0a 20 20 20 20 20 20 23 20 20  a 16"..      #  
6310: 20 20 20 20 20 72 65 6c 65 61 73 65 20 6f 66 20       release of 
6320: 45 61 67 6c 65 2c 20 74 68 65 20 66 6f 6c 6c 6f  Eagle, the follo
6330: 77 69 6e 67 20 63 6f 6d 6d 61 6e 64 20 6d 75 73  wing command mus
6340: 74 20 62 65 20 75 73 65 64 20 69 6e 73 74 65 61  t be used instea
6350: 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  d..      #      
6360: 20 28 61 6c 73 6f 20 61 6c 6c 20 6f 6e 20 6f 6e   (also all on on
6370: 65 20 6c 69 6e 65 29 3a 0d 0a 20 20 20 20 20 20  e line):..      
6380: 23 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  #..      #      
6390: 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65 20   EagleShell.exe 
63a0: 2d 69 6e 69 74 69 61 6c 69 7a 65 20 2d 70 6f 73  -initialize -pos
63b0: 74 49 6e 69 74 69 61 6c 69 7a 65 0d 0a 20 20 20  tInitialize..   
63c0: 20 20 20 23 20 20 20 20 20 20 20 20 20 22 6f 62     #         "ob
63d0: 6a 65 63 74 20 69 6e 76 6f 6b 65 20 49 6e 74 65  ject invoke Inte
63e0: 72 70 72 65 74 65 72 2e 47 65 74 41 63 74 69 76  rpreter.GetActiv
63f0: 65 20 41 64 64 52 75 6e 74 69 6d 65 4f 70 74 69  e AddRuntimeOpti
6400: 6f 6e 20 6e 61 74 69 76 65 22 0d 0a 20 20 20 20  on native"..    
6410: 20 20 23 20 20 20 20 20 20 20 20 20 2d 66 69 6c    #         -fil
6420: 65 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e  e .\path\to\all.
6430: 65 61 67 6c 65 0d 0a 20 20 20 20 20 20 23 0d 0a  eagle..      #..
6440: 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20        if {[info 
6450: 65 78 69 73 74 73 20 3a 3a 62 75 69 6c 64 5f 64  exists ::build_d
6460: 69 72 65 63 74 6f 72 79 5d 20 26 26 20 5c 0d 0a  irectory] && \..
6470: 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e            [strin
6480: 67 20 6c 65 6e 67 74 68 20 24 3a 3a 62 75 69 6c  g length $::buil
6490: 64 5f 64 69 72 65 63 74 6f 72 79 5d 20 3e 20 30  d_directory] > 0
64a0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
64b0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
64c0: 4f 54 45 3a 20 54 68 65 20 6c 6f 63 61 74 69 6f  OTE: The locatio
64d0: 6e 20 6f 66 20 74 68 65 20 62 75 69 6c 64 20 64  n of the build d
64e0: 69 72 65 63 74 6f 72 79 20 68 61 73 20 62 65 65  irectory has bee
64f0: 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b 0d 0a 20  n overridden;.. 
6500: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74         #       t
6510: 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74  herefore, use it
6520: 20 76 65 72 62 61 74 69 6d 2e 0d 0a 20 20 20 20   verbatim...    
6530: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
6540: 65 74 75 72 6e 20 24 3a 3a 62 75 69 6c 64 5f 64  eturn $::build_d
6550: 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20  irectory..      
6560: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
6570: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
6580: 4f 54 45 3a 20 49 66 20 74 68 65 20 22 6e 61 74  OTE: If the "nat
6590: 69 76 65 22 20 72 75 6e 74 69 6d 65 20 6f 70 74  ive" runtime opt
65a0: 69 6f 6e 20 69 73 20 73 65 74 2c 20 74 68 65 20  ion is set, the 
65b0: 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73 65 6d  mixed-mode assem
65c0: 62 6c 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20  bly..        #  
65d0: 20 20 20 20 20 69 73 20 62 65 69 6e 67 20 74 65       is being te
65e0: 73 74 65 64 2e 20 20 49 6e 20 74 68 61 74 20 63  sted.  In that c
65f0: 61 73 65 2c 20 74 68 65 20 70 61 74 68 20 74 6f  ase, the path to
6600: 20 74 68 65 20 62 75 69 6c 64 20 64 69 72 65 63   the build direc
6610: 74 6f 72 79 0d 0a 20 20 20 20 20 20 20 20 23 20  tory..        # 
6620: 20 20 20 20 20 20 77 69 6c 6c 20 63 6f 6e 74 61        will conta
6630: 69 6e 20 74 68 65 20 70 6c 61 74 66 6f 72 6d 20  in the platform 
6640: 6e 61 6d 65 20 61 6e 64 20 61 6c 6c 20 74 68 65  name and all the
6650: 20 62 69 6e 61 72 69 65 73 20 75 6e 64 65 72 20   binaries under 
6660: 74 65 73 74 0d 0a 20 20 20 20 20 20 20 20 23 20  test..        # 
6670: 20 20 20 20 20 20 73 68 6f 75 6c 64 20 62 65 20        should be 
6680: 70 72 65 73 65 6e 74 20 69 6e 20 74 68 61 74 20  present in that 
6690: 64 69 72 65 63 74 6f 72 79 2e 20 20 49 66 20 74  directory.  If t
66a0: 68 65 20 22 6e 61 74 69 76 65 22 20 72 75 6e 74  he "native" runt
66b0: 69 6d 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ime..        #  
66c0: 20 20 20 20 20 6f 70 74 69 6f 6e 20 69 73 20 6e       option is n
66d0: 6f 74 20 73 65 74 2c 20 74 68 65 20 62 75 69 6c  ot set, the buil
66e0: 64 20 64 69 72 65 63 74 6f 72 79 20 77 69 6c 6c  d directory will
66f0: 20 62 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74   be considered t
6700: 6f 20 62 65 0d 0a 20 20 20 20 20 20 20 20 23 20  o be..        # 
6710: 20 20 20 20 20 20 22 70 6c 61 74 66 6f 72 6d 2d        "platform-
6720: 6e 65 75 74 72 61 6c 22 2c 20 77 69 74 68 20 74  neutral", with t
6730: 68 65 20 6e 6f 74 61 62 6c 65 20 65 78 63 65 70  he notable excep
6740: 74 69 6f 6e 20 6f 66 20 61 6e 79 20 6e 61 74 69  tion of any nati
6750: 76 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ve..        #   
6760: 20 20 20 20 61 73 73 65 6d 62 6c 79 20 28 65 2e      assembly (e.
6770: 67 2e 20 22 53 51 4c 69 74 65 2e 49 6e 74 65 72  g. "SQLite.Inter
6780: 6f 70 2e 64 6c 6c 22 29 20 63 6f 70 69 65 64 20  op.dll") copied 
6790: 74 68 65 72 65 20 64 75 72 69 6e 67 20 74 68 65  there during the
67a0: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
67b0: 20 20 62 75 69 6c 64 20 70 72 6f 63 65 73 73 20    build process 
67c0: 69 74 73 65 6c 66 2e 20 20 49 66 20 74 68 65 20  itself.  If the 
67d0: 62 75 69 6c 64 20 70 72 6f 63 65 73 73 20 73 6f  build process so
67e0: 6d 65 68 6f 77 20 64 6f 65 73 20 6e 6f 74 0d 0a  mehow does not..
67f0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
6800: 63 6f 70 79 20 74 68 65 20 6e 61 74 69 76 65 20  copy the native 
6810: 61 73 73 65 6d 62 6c 79 20 66 6f 72 20 74 68 69  assembly for thi
6820: 73 20 70 6c 61 74 66 6f 72 6d 2c 20 6d 6f 73 74  s platform, most
6830: 20 6f 66 20 74 68 65 20 74 65 73 74 73 0d 0a 20   of the tests.. 
6840: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69         #       i
6850: 6e 20 74 68 65 20 73 75 69 74 65 20 77 69 6c 6c  n the suite will
6860: 20 73 69 6d 70 6c 79 20 62 65 20 73 6b 69 70 70   simply be skipp
6870: 65 64 2e 20 20 47 65 6e 65 72 61 6c 6c 79 20 73  ed.  Generally s
6880: 70 65 61 6b 69 6e 67 2c 20 74 68 65 72 65 0d 0a  peaking, there..
6890: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
68a0: 61 72 65 20 74 77 6f 20 77 61 79 73 20 74 6f 20  are two ways to 
68b0: 62 75 69 6c 64 20 74 68 65 20 62 69 6e 61 72 69  build the binari
68c0: 65 73 20 77 68 65 6e 20 70 72 65 70 61 72 69 6e  es when preparin
68d0: 67 20 74 6f 20 72 75 6e 20 74 68 65 0d 0a 20 20  g to run the..  
68e0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 65        #       te
68f0: 73 74 20 73 75 69 74 65 3a 0d 0a 20 20 20 20 20  st suite:..     
6900: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
6910: 20 20 20 20 20 20 31 2e 20 42 75 69 6c 64 20 74        1. Build t
6920: 68 65 20 73 65 70 61 72 61 74 65 20 6d 61 6e 61  he separate mana
6930: 67 65 64 20 61 6e 64 20 6e 61 74 69 76 65 20 61  ged and native a
6940: 73 73 65 6d 62 6c 69 65 73 20 75 73 69 6e 67 20  ssemblies using 
6950: 73 6f 6d 65 0d 0a 20 20 20 20 20 20 20 20 23 20  some..        # 
6960: 20 20 20 20 20 20 20 20 20 63 6f 6d 6d 61 6e 64           command
6970: 73 20 73 69 6d 69 6c 61 72 20 74 6f 3a 0d 0a 20  s similar to:.. 
6980: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
6990: 20 20 23 20 20 20 20 20 20 20 20 20 20 62 75 69    #          bui
69a0: 6c 64 2e 62 61 74 20 24 7b 43 6f 6e 66 69 67 75  ld.bat ${Configu
69b0: 72 61 74 69 6f 6e 7d 4d 61 6e 61 67 65 64 4f 6e  ration}ManagedOn
69c0: 6c 79 20 24 7b 50 6c 61 74 66 6f 72 6d 7d 0d 0a  ly ${Platform}..
69d0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
69e0: 20 20 20 62 75 69 6c 64 2e 62 61 74 20 24 7b 43     build.bat ${C
69f0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 7d 4e 61 74  onfiguration}Nat
6a00: 69 76 65 4f 6e 6c 79 20 24 7b 50 6c 61 74 66 6f  iveOnly ${Platfo
6a10: 72 6d 7d 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  rm}..        #..
6a20: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
6a30: 20 20 20 57 68 65 72 65 20 24 7b 43 6f 6e 66 69     Where ${Confi
6a40: 67 75 72 61 74 69 6f 6e 7d 20 69 73 20 65 69 74  guration} is eit
6a50: 68 65 72 20 22 44 65 62 75 67 22 20 6f 72 20 22  her "Debug" or "
6a60: 52 65 6c 65 61 73 65 22 20 61 6e 64 0d 0a 20 20  Release" and..  
6a70: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20        #         
6a80: 20 24 7b 50 6c 61 74 66 6f 72 6d 7d 20 69 73 20   ${Platform} is 
6a90: 65 69 74 68 65 72 20 22 57 69 6e 33 32 22 20 6f  either "Win32" o
6aa0: 72 20 22 78 36 34 22 2e 0d 0a 20 20 20 20 20 20  r "x64"...      
6ab0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 20    #..        #  
6ac0: 20 20 20 20 20 32 2e 20 42 75 69 6c 64 20 74 68       2. Build th
6ad0: 65 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73  e mixed-mode ass
6ae0: 65 6d 62 6c 79 20 75 73 69 6e 67 20 61 20 63 6f  embly using a co
6af0: 6d 6d 61 6e 64 20 73 69 6d 69 6c 61 72 20 74 6f  mmand similar to
6b00: 3a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  :..        #..  
6b10: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20        #         
6b20: 20 62 75 69 6c 64 2e 62 61 74 20 24 7b 43 6f 6e   build.bat ${Con
6b30: 66 69 67 75 72 61 74 69 6f 6e 7d 20 24 7b 50 6c  figuration} ${Pl
6b40: 61 74 66 6f 72 6d 7d 0d 0a 20 20 20 20 20 20 20  atform}..       
6b50: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20   #..        #   
6b60: 20 20 20 20 20 20 20 57 68 65 72 65 20 24 7b 43         Where ${C
6b70: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 7d 20 69 73  onfiguration} is
6b80: 20 65 69 74 68 65 72 20 22 44 65 62 75 67 22 20   either "Debug" 
6b90: 6f 72 20 22 52 65 6c 65 61 73 65 22 20 61 6e 64  or "Release" and
6ba0: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
6bb0: 20 20 20 20 20 24 7b 50 6c 61 74 66 6f 72 6d 7d       ${Platform}
6bc0: 20 69 73 20 65 69 74 68 65 72 20 22 57 69 6e 33   is either "Win3
6bd0: 32 22 20 6f 72 20 22 78 36 34 22 2e 20 20 49 66  2" or "x64".  If
6be0: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 69 73   this command is
6bf0: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
6c00: 20 20 20 20 20 75 73 65 64 2c 20 76 61 72 69 6f       used, vario
6c10: 75 73 20 74 65 73 74 73 20 74 68 61 74 20 72 65  us tests that re
6c20: 71 75 69 72 65 20 73 75 70 70 6c 65 6d 65 6e 74  quire supplement
6c30: 61 72 79 20 6d 61 6e 61 67 65 64 0d 0a 20 20 20  ary managed..   
6c40: 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20 20       #          
6c50: 61 73 73 65 6d 62 6c 69 65 73 20 28 65 2e 67 2e  assemblies (e.g.
6c60: 20 4c 49 4e 51 29 20 6d 61 79 20 62 65 20 73 6b   LINQ) may be sk
6c70: 69 70 70 65 64 20 75 6e 6c 65 73 73 20 74 68 6f  ipped unless tho
6c80: 73 65 20 62 69 6e 61 72 69 65 73 0d 0a 20 20 20  se binaries..   
6c90: 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20 20       #          
6ca0: 61 72 65 20 73 75 62 73 65 71 75 65 6e 74 6c 79  are subsequently
6cb0: 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65   copied into the
6cc0: 20 63 6f 72 72 65 63 74 20 64 69 72 65 63 74 6f   correct directo
6cd0: 72 79 20 28 69 2e 65 2e 20 62 79 0d 0a 20 20 20  ry (i.e. by..   
6ce0: 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20 20       #          
6cf0: 22 74 65 73 74 5f 61 6c 6c 2e 62 61 74 22 29 2e  "test_all.bat").
6d00: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
6d10: 20 20 20 20 20 23 20 20 20 20 20 20 20 4e 6f 74       #       Not
6d20: 65 20 74 68 61 74 20 61 6c 6c 20 6f 66 20 74 68  e that all of th
6d30: 65 20 62 75 69 6c 64 20 63 6f 6d 6d 61 6e 64 73  e build commands
6d40: 20 61 62 6f 76 65 20 77 69 6c 6c 20 64 65 66 61   above will defa
6d50: 75 6c 74 20 74 6f 20 75 73 69 6e 67 0d 0a 20 20  ult to using..  
6d60: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68        #       th
6d70: 65 20 6c 61 74 65 73 74 20 76 65 72 73 69 6f 6e  e latest version
6d80: 20 6f 66 20 4d 53 42 75 69 6c 64 20 61 76 61 69   of MSBuild avai
6d90: 6c 61 62 6c 65 20 61 6e 64 20 74 68 65 20 22 74  lable and the "t
6da0: 65 73 74 5f 79 65 61 72 22 20 6d 61 79 0d 0a 20  est_year" may.. 
6db0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6e         #       n
6dc0: 65 65 64 20 74 6f 20 62 65 20 61 64 6a 75 73 74  eed to be adjust
6dd0: 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 20 74  ed accordingly t
6de0: 6f 20 61 63 74 75 61 6c 6c 79 20 72 75 6e 20 74  o actually run t
6df0: 68 65 20 74 65 73 74 20 73 75 69 74 65 2e 0d 0a  he test suite...
6e00: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
6e10: 52 65 66 65 72 20 74 6f 20 74 68 65 20 63 6f 6d  Refer to the com
6e20: 6d 65 6e 74 73 20 69 6e 20 5b 67 65 74 42 75 69  ments in [getBui
6e30: 6c 64 59 65 61 72 5d 20 66 6f 72 20 6d 6f 72 65  ldYear] for more
6e40: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 0d   information on.
6e50: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
6e60: 20 68 6f 77 20 74 6f 20 73 65 74 20 74 68 69 73   how to set this
6e70: 20 76 61 72 69 61 62 6c 65 2e 0d 0a 20 20 20 20   variable...    
6e80: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73      #..        s
6e90: 65 74 20 6e 61 74 69 76 65 20 5b 65 78 70 72 20  et native [expr 
6ea0: 7b 21 24 6d 61 6e 61 67 65 64 4f 6e 6c 79 20 26  {!$managedOnly &
6eb0: 26 20 5b 68 61 73 52 75 6e 74 69 6d 65 4f 70 74  & [hasRuntimeOpt
6ec0: 69 6f 6e 20 6e 61 74 69 76 65 5d 7d 5d 0d 0a 0d  ion native]}]...
6ed0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
6ee0: 5b 6a 6f 69 6e 42 75 69 6c 64 44 69 72 65 63 74  [joinBuildDirect
6ef0: 6f 72 79 20 24 6e 61 74 69 76 65 20 5b 67 65 74  ory $native [get
6f00: 42 75 69 6c 64 42 61 73 65 44 69 72 65 63 74 6f  BuildBaseDirecto
6f10: 72 79 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ry] \..         
6f20: 20 20 20 5b 67 65 74 42 75 69 6c 64 59 65 61 72     [getBuildYear
6f30: 5d 20 5b 67 65 74 42 75 69 6c 64 50 6c 61 74 66  ] [getBuildPlatf
6f40: 6f 72 6d 20 24 6e 61 74 69 76 65 5d 20 5b 67 65  orm $native] [ge
6f50: 74 42 75 69 6c 64 43 6f 6e 66 69 67 75 72 61 74  tBuildConfigurat
6f60: 69 6f 6e 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a  ion]]..      }..
6f70: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
6f80: 6f 63 20 67 65 74 52 65 6c 65 61 73 65 56 65 72  oc getReleaseVer
6f90: 73 69 6f 6e 20 7b 7d 20 7b 0d 0a 20 20 20 20 20  sion {} {..     
6fa0: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
6fb0: 3a 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65  : Figure out the
6fc0: 20 72 65 6c 65 61 73 65 20 76 65 72 73 69 6f 6e   release version
6fd0: 20 66 6f 72 20 75 73 65 20 77 69 74 68 20 74 68   for use with th
6fe0: 65 20 62 75 69 6c 64 20 64 69 72 65 63 74 6f 72  e build director
6ff0: 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  y..      #      
7000: 20 77 68 65 6e 20 63 68 65 63 6b 69 6e 67 20 66   when checking f
7010: 6f 72 20 61 76 61 69 6c 61 62 6c 65 20 72 65 6c  or available rel
7020: 65 61 73 65 73 2e 0d 0a 20 20 20 20 20 20 23 0d  eases...      #.
7030: 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f  .      if {[info
7040: 20 65 78 69 73 74 73 20 3a 3a 72 65 6c 65 61 73   exists ::releas
7050: 65 5f 76 65 72 73 69 6f 6e 5d 20 26 26 20 5c 0d  e_version] && \.
7060: 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69  .          [stri
7070: 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 72 65 6c  ng length $::rel
7080: 65 61 73 65 5f 76 65 72 73 69 6f 6e 5d 20 3e 20  ease_version] > 
7090: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
70a0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
70b0: 4e 4f 54 45 3a 20 54 68 65 20 72 65 6c 65 61 73  NOTE: The releas
70c0: 65 20 76 65 72 73 69 6f 6e 20 68 61 73 20 62 65  e version has be
70d0: 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b 20 74  en overridden; t
70e0: 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74  herefore, use it
70f0: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
7100: 20 20 76 65 72 62 61 74 69 6d 2e 0d 0a 20 20 20    verbatim...   
7110: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
7120: 72 65 74 75 72 6e 20 24 3a 3a 72 65 6c 65 61 73  return $::releas
7130: 65 5f 76 65 72 73 69 6f 6e 0d 0a 20 20 20 20 20  e_version..     
7140: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
7150: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
7160: 4e 4f 54 45 3a 20 4e 6f 20 72 65 6c 65 61 73 65  NOTE: No release
7170: 20 76 65 72 73 69 6f 6e 20 69 73 20 61 76 61 69   version is avai
7180: 6c 61 62 6c 65 2c 20 72 65 74 75 72 6e 20 61 6e  lable, return an
7190: 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e 0d 0a   empty string...
71a0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
71b0: 49 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20  It is important 
71c0: 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 65 6d 70  to return an emp
71d0: 74 79 20 73 74 72 69 6e 67 20 68 65 72 65 20 62  ty string here b
71e0: 65 63 61 75 73 65 20 74 68 65 0d 0a 20 20 20 20  ecause the..    
71f0: 20 20 20 20 23 20 20 20 20 20 20 20 72 65 73 75      #       resu
7200: 6c 74 20 6f 66 20 74 68 69 73 20 70 72 6f 63 65  lt of this proce
7210: 64 75 72 65 20 6d 61 79 20 62 65 20 75 73 65 64  dure may be used
7220: 20 77 69 74 68 20 5b 66 69 6c 65 20 6a 6f 69 6e   with [file join
7230: 5d 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ]...        #.. 
7240: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 22 22         return ""
7250: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
7260: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65  .....    proc ge
7270: 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20 7b  tBuildFileName {
7280: 20 66 69 6c 65 4e 61 6d 65 20 6d 61 6e 61 67 65   fileName manage
7290: 64 4f 6e 6c 79 20 7b 70 6c 61 74 66 6f 72 6d 20  dOnly {platform 
72a0: 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23  ""} } {..      #
72b0: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
72c0: 52 65 74 75 72 6e 73 20 74 68 65 20 73 70 65 63  Returns the spec
72d0: 69 66 69 65 64 20 66 69 6c 65 20 6e 61 6d 65 20  ified file name 
72e0: 61 73 20 69 66 20 69 74 20 77 65 72 65 20 6c 6f  as if it were lo
72f0: 63 61 74 65 64 20 69 6e 20 74 68 65 0d 0a 20 20  cated in the..  
7300: 20 20 20 20 23 20 20 20 20 20 20 20 62 75 69 6c      #       buil
7310: 64 20 64 69 72 65 63 74 6f 72 79 2c 20 64 69 73  d directory, dis
7320: 63 61 72 64 69 6e 67 20 61 6e 79 20 64 69 72 65  carding any dire
7330: 63 74 6f 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f  ctory informatio
7340: 6e 20 70 72 65 73 65 6e 74 0d 0a 20 20 20 20 20  n present..     
7350: 20 23 20 20 20 20 20 20 20 69 6e 20 74 68 65 20   #       in the 
7360: 66 69 6c 65 20 6e 61 6d 65 20 61 73 20 70 72 6f  file name as pro
7370: 76 69 64 65 64 20 62 79 20 6f 75 72 20 63 61 6c  vided by our cal
7380: 6c 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ler...      #.. 
7390: 20 20 20 20 20 73 65 74 20 72 65 73 75 6c 74 20       set result 
73a0: 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65  [file nativename
73b0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 66   \..          [f
73c0: 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 42 75 69  ile join [getBui
73d0: 6c 64 44 69 72 65 63 74 6f 72 79 20 24 6d 61 6e  ldDirectory $man
73e0: 61 67 65 64 4f 6e 6c 79 5d 20 24 70 6c 61 74 66  agedOnly] $platf
73f0: 6f 72 6d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  orm \..         
7400: 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69 6c   [file tail $fil
7410: 65 4e 61 6d 65 5d 5d 5d 0d 0a 0d 0a 20 20 20 20  eName]]]....    
7420: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 48 41 43    #..      # HAC
7430: 4b 3a 20 57 68 65 6e 20 72 75 6e 6e 69 6e 67 20  K: When running 
7440: 6f 6e 20 57 6f 57 36 34 2c 20 61 73 73 75 6d 65  on WoW64, assume
7450: 20 74 68 65 20 74 65 73 74 20 65 78 65 63 75 74   the test execut
7460: 61 62 6c 65 73 20 61 72 65 20 70 72 65 73 65 6e  ables are presen
7470: 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  t..      #      
7480: 20 77 69 74 68 20 74 68 65 20 22 33 32 22 20 73   with the "32" s
7490: 75 66 66 69 78 20 6f 6e 20 74 68 65 6d 2e 0d 0a  uffix on them...
74a0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
74b0: 66 20 7b 5b 69 73 52 75 6e 6e 69 6e 67 57 6f 57  f {[isRunningWoW
74c0: 36 34 5d 20 26 26 20 5b 66 69 6c 65 20 65 78 74  64] && [file ext
74d0: 65 6e 73 69 6f 6e 20 24 72 65 73 75 6c 74 5d 20  ension $result] 
74e0: 65 71 20 22 2e 65 78 65 22 7d 20 74 68 65 6e 20  eq ".exe"} then 
74f0: 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 72  {..        set r
7500: 65 73 75 6c 74 20 5b 61 70 70 65 6e 64 41 72 67  esult [appendArg
7510: 73 20 5b 66 69 6c 65 20 72 6f 6f 74 6e 61 6d 65  s [file rootname
7520: 20 24 72 65 73 75 6c 74 5d 20 33 32 2e 65 78 65   $result] 32.exe
7530: 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  ]..      }....  
7540: 20 20 20 20 72 65 74 75 72 6e 20 24 72 65 73 75      return $resu
7550: 6c 74 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  lt..    }.....  
7560: 20 20 70 72 6f 63 20 67 65 74 45 78 74 65 72 6e    proc getExtern
7570: 61 6c 44 69 72 65 63 74 6f 72 79 20 7b 7d 20 7b  alDirectory {} {
7580: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
7590: 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 70 72   # NOTE: This pr
75a0: 6f 63 65 64 75 72 65 20 72 65 74 75 72 6e 73 20  ocedure returns 
75b0: 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 77 68  the directory wh
75c0: 65 72 65 20 74 68 65 20 65 78 74 65 72 6e 61 6c  ere the external
75d0: 20 62 69 6e 61 72 79 0d 0a 20 20 20 20 20 20 23   binary..      #
75e0: 20 20 20 20 20 20 20 66 69 6c 65 73 20 61 72 65         files are
75f0: 20 6c 6f 63 61 74 65 64 2e 0d 0a 20 20 20 20 20   located...     
7600: 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e   #..      return
7610: 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d   [file nativenam
7620: 65 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20  e [file dirname 
7630: 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20 5b 69  [file dirname [i
7640: 6e 66 6f 20 62 69 6e 61 72 79 5d 5d 5d 5d 0d 0a  nfo binary]]]]..
7650: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
7660: 6f 63 20 67 65 74 42 69 6e 61 72 79 44 69 72 65  oc getBinaryDire
7670: 63 74 6f 72 79 20 7b 7d 20 7b 0d 0a 20 20 20 20  ctory {} {..    
7680: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
7690: 45 3a 20 54 68 69 73 20 70 72 6f 63 65 64 75 72  E: This procedur
76a0: 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 64 69  e returns the di
76b0: 72 65 63 74 6f 72 79 20 77 68 65 72 65 20 74 68  rectory where th
76c0: 65 20 74 65 73 74 20 61 70 70 6c 69 63 61 74 69  e test applicati
76d0: 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  on..      #     
76e0: 20 20 69 74 73 65 6c 66 20 28 69 2e 65 2e 20 74    itself (i.e. t
76f0: 68 65 20 45 61 67 6c 65 20 73 68 65 6c 6c 29 20  he Eagle shell) 
7700: 69 73 20 6c 6f 63 61 74 65 64 2e 20 20 54 68 69  is located.  Thi
7710: 73 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 61  s will be used a
7720: 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  s..      #      
7730: 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e   the destination
7740: 20 66 6f 72 20 74 68 65 20 63 6f 70 69 65 64 20   for the copied 
7750: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
7760: 74 65 20 6e 61 74 69 76 65 20 61 6e 64 0d 0a 20  te native and.. 
7770: 20 20 20 20 20 23 20 20 20 20 20 20 20 6d 61 6e       #       man
7780: 61 67 65 64 20 61 73 73 65 6d 62 6c 69 65 73 20  aged assemblies 
7790: 28 69 2e 65 2e 20 62 65 63 61 75 73 65 20 74 68  (i.e. because th
77a0: 69 73 20 69 73 20 6f 6e 65 20 6f 66 20 74 68 65  is is one of the
77b0: 20 66 65 77 20 70 6c 61 63 65 73 0d 0a 20 20 20   few places..   
77c0: 20 20 20 23 20 20 20 20 20 20 20 77 68 65 72 65     #       where
77d0: 20 74 68 65 20 43 4c 52 20 77 69 6c 6c 20 61 63   the CLR will ac
77e0: 74 75 61 6c 6c 79 20 66 69 6e 64 20 61 6e 64 20  tually find and 
77f0: 6c 6f 61 64 20 74 68 65 6d 20 70 72 6f 70 65 72  load them proper
7800: 6c 79 29 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ly)...      #.. 
7810: 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65       if {[info e
7820: 78 69 73 74 73 20 3a 3a 62 69 6e 61 72 79 5f 64  xists ::binary_d
7830: 69 72 65 63 74 6f 72 79 5d 20 26 26 20 5c 0d 0a  irectory] && \..
7840: 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e            [strin
7850: 67 20 6c 65 6e 67 74 68 20 24 3a 3a 62 69 6e 61  g length $::bina
7860: 72 79 5f 64 69 72 65 63 74 6f 72 79 5d 20 3e 20  ry_directory] > 
7870: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
7880: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
7890: 4e 4f 54 45 3a 20 54 68 65 20 6c 6f 63 61 74 69  NOTE: The locati
78a0: 6f 6e 20 6f 66 20 74 68 65 20 62 69 6e 61 72 79  on of the binary
78b0: 20 64 69 72 65 63 74 6f 72 79 20 68 61 73 20 62   directory has b
78c0: 65 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b 0d  een overridden;.
78d0: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
78e0: 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20   therefore, use 
78f0: 69 74 20 76 65 72 62 61 74 69 6d 2e 0d 0a 20 20  it verbatim...  
7900: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
7910: 20 72 65 74 75 72 6e 20 24 3a 3a 62 69 6e 61 72   return $::binar
7920: 79 5f 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20  y_directory..   
7930: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
7940: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 69 6e 66       return [inf
7950: 6f 20 62 69 6e 61 72 79 5d 0d 0a 20 20 20 20 20  o binary]..     
7960: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
7970: 20 20 70 72 6f 63 20 67 65 74 45 78 74 65 72 6e    proc getExtern
7980: 61 6c 46 69 6c 65 4e 61 6d 65 20 7b 20 66 69 6c  alFileName { fil
7990: 65 4e 61 6d 65 20 7d 20 7b 0d 0a 20 20 20 20 20  eName } {..     
79a0: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
79b0: 3a 20 52 65 74 75 72 6e 73 20 74 68 65 20 73 70  : Returns the sp
79c0: 65 63 69 66 69 65 64 20 66 69 6c 65 20 6e 61 6d  ecified file nam
79d0: 65 20 61 73 20 69 66 20 69 74 20 77 65 72 65 20  e as if it were 
79e0: 6c 6f 63 61 74 65 64 20 69 6e 20 74 68 65 0d 0a  located in the..
79f0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64 69        #       di
7a00: 72 65 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69  rectory containi
7a10: 6e 67 20 74 68 65 20 65 78 74 65 72 6e 61 6c 20  ng the external 
7a20: 62 69 6e 61 72 69 65 73 2e 0d 0a 20 20 20 20 20  binaries...     
7a30: 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e   #..      return
7a40: 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d   [file nativenam
7a50: 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65  e [file join [ge
7a60: 74 45 78 74 65 72 6e 61 6c 44 69 72 65 63 74 6f  tExternalDirecto
7a70: 72 79 5d 20 24 66 69 6c 65 4e 61 6d 65 5d 5d 0d  ry] $fileName]].
7a80: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
7a90: 72 6f 63 20 67 65 74 42 69 6e 61 72 79 46 69 6c  roc getBinaryFil
7aa0: 65 4e 61 6d 65 20 7b 20 66 69 6c 65 4e 61 6d 65  eName { fileName
7ab0: 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20 7d   {platform ""} }
7ac0: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
7ad0: 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 74 75 72     # NOTE: Retur
7ae0: 6e 73 20 74 68 65 20 73 70 65 63 69 66 69 65 64  ns the specified
7af0: 20 66 69 6c 65 20 6e 61 6d 65 20 61 73 20 69 66   file name as if
7b00: 20 69 74 20 77 65 72 65 20 6c 6f 63 61 74 65 64   it were located
7b10: 20 69 6e 20 74 68 65 0d 0a 20 20 20 20 20 20 23   in the..      #
7b20: 20 20 20 20 20 20 20 62 69 6e 61 72 79 20 64 69         binary di
7b30: 72 65 63 74 6f 72 79 2c 20 64 69 73 63 61 72 64  rectory, discard
7b40: 69 6e 67 20 61 6e 79 20 64 69 72 65 63 74 6f 72  ing any director
7b50: 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 70 72  y information pr
7b60: 65 73 65 6e 74 0d 0a 20 20 20 20 20 20 23 20 20  esent..      #  
7b70: 20 20 20 20 20 69 6e 20 74 68 65 20 66 69 6c 65       in the file
7b80: 20 6e 61 6d 65 20 61 73 20 70 72 6f 76 69 64 65   name as provide
7b90: 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 2e  d by our caller.
7ba0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
7bb0: 20 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 6e 61   return [file na
7bc0: 74 69 76 65 6e 61 6d 65 20 5c 0d 0a 20 20 20 20  tivename \..    
7bd0: 20 20 20 20 20 20 5b 66 69 6c 65 20 6a 6f 69 6e        [file join
7be0: 20 5b 67 65 74 42 69 6e 61 72 79 44 69 72 65 63   [getBinaryDirec
7bf0: 74 6f 72 79 5d 20 24 70 6c 61 74 66 6f 72 6d 20  tory] $platform 
7c00: 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69 6c 65  [file tail $file
7c10: 4e 61 6d 65 5d 5d 5d 0d 0a 20 20 20 20 7d 0d 0a  Name]]]..    }..
7c20: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 43  ...    proc getC
7c30: 6f 72 65 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d  oreBinaryFileNam
7c40: 65 20 7b 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22  e { {platform ""
7c50: 7d 20 7b 73 74 61 6e 64 61 72 64 20 22 22 7d 20  } {standard ""} 
7c60: 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
7c70: 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 74 75      # NOTE: Retu
7c80: 72 6e 73 20 74 68 65 20 66 75 6c 6c 20 70 61 74  rns the full pat
7c90: 68 20 66 6f 72 20 74 68 65 20 66 69 6c 65 20 63  h for the file c
7ca0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 53 51  ontaining the SQ
7cb0: 4c 69 74 65 20 63 6f 72 65 0d 0a 20 20 20 20 20  Lite core..     
7cc0: 20 23 20 20 20 20 20 20 20 6e 61 74 69 76 65 20   #       native 
7cd0: 6c 69 62 72 61 72 79 20 63 6f 64 65 20 66 6f 72  library code for
7ce0: 20 74 68 69 73 20 70 6c 61 74 66 6f 72 6d 2e 20   this platform. 
7cf0: 20 46 69 72 73 74 2c 20 63 68 65 63 6b 20 61 6e   First, check an
7d00: 64 20 73 65 65 20 69 66 0d 0a 20 20 20 20 20 20  d see if..      
7d10: 23 20 20 20 20 20 20 20 74 68 65 20 53 51 4c 69  #       the SQLi
7d20: 74 65 20 63 6f 72 65 20 6e 61 74 69 76 65 20 6c  te core native l
7d30: 69 62 72 61 72 79 20 68 61 73 20 61 6c 72 65 61  ibrary has alrea
7d40: 64 79 20 62 65 65 6e 20 6c 6f 61 64 65 64 2e 20  dy been loaded. 
7d50: 20 4e 65 78 74 2c 0d 0a 20 20 20 20 20 20 23 20   Next,..      # 
7d60: 20 20 20 20 20 20 66 61 6c 6c 62 61 63 6b 20 74        fallback t
7d70: 6f 20 77 68 61 74 20 74 68 65 20 66 75 6c 6c 20  o what the full 
7d80: 70 61 74 68 20 73 68 6f 75 6c 64 20 62 65 2c 20  path should be, 
7d90: 62 61 73 65 64 20 6f 6e 20 77 68 65 74 68 65 72  based on whether
7da0: 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20   the..      #   
7db0: 20 20 20 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61      mixed-mode a
7dc0: 73 73 65 6d 62 6c 79 20 69 73 20 62 65 69 6e 67  ssembly is being
7dd0: 20 75 73 65 64 20 61 6e 64 20 74 68 65 20 6e 61   used and the na
7de0: 6d 65 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  me of the curren
7df0: 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  t..      #      
7e00: 20 70 6c 61 74 66 6f 72 6d 2e 0d 0a 20 20 20 20   platform...    
7e10: 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
7e20: 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
7e30: 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d   object invoke -
7e40: 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63  flags +NonPublic
7e50: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
7e60: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
7e70: 74 65 2e 55 6e 73 61 66 65 4e 61 74 69 76 65 4d  te.UnsafeNativeM
7e80: 65 74 68 6f 64 73 20 5f 53 51 4c 69 74 65 4e 61  ethods _SQLiteNa
7e90: 74 69 76 65 4d 6f 64 75 6c 65 46 69 6c 65 4e 61  tiveModuleFileNa
7ea0: 6d 65 0d 0a 20 20 20 20 20 20 7d 20 66 69 6c 65  me..      } file
7eb0: 4e 61 6d 65 5d 20 3d 3d 20 30 20 26 26 20 5b 73  Name] == 0 && [s
7ec0: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 66 69  tring length $fi
7ed0: 6c 65 4e 61 6d 65 5d 20 3e 20 30 7d 20 74 68 65  leName] > 0} the
7ee0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
7ef0: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
7f00: 54 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20  The SQLite core 
7f10: 6e 61 74 69 76 65 20 6c 69 62 72 61 72 79 20 68  native library h
7f20: 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
7f30: 6c 6f 61 64 65 64 20 76 69 61 0d 0a 20 20 20 20  loaded via..    
7f40: 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20      #       the 
7f50: 6e 61 74 69 76 65 20 6c 69 62 72 61 72 79 20 70  native library p
7f60: 72 65 2d 6c 6f 61 64 65 72 2e 20 20 52 65 74 75  re-loader.  Retu
7f70: 72 6e 20 74 68 61 74 20 66 69 6c 65 20 6e 61 6d  rn that file nam
7f80: 65 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20  e now...        
7f90: 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  #..        retur
7fa0: 6e 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20  n $fileName..   
7fb0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
7fc0: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49  .      # NOTE: I
7fd0: 66 20 74 68 65 20 22 6e 61 74 69 76 65 22 20 72  f the "native" r
7fe0: 75 6e 74 69 6d 65 20 6f 70 74 69 6f 6e 20 68 61  untime option ha
7ff0: 73 20 62 65 65 6e 20 73 65 74 2c 20 61 6c 77 61  s been set, alwa
8000: 79 73 20 72 65 74 75 72 6e 20 74 68 65 0d 0a 20  ys return the.. 
8010: 20 20 20 20 20 23 20 20 20 20 20 20 20 66 69 6c       #       fil
8020: 65 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 6d  e name for the m
8030: 69 78 65 64 2d 6d 6f 64 65 20 61 73 73 65 6d 62  ixed-mode assemb
8040: 6c 79 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ly...      #..  
8050: 20 20 20 20 69 66 20 7b 5b 68 61 73 52 75 6e 74      if {[hasRunt
8060: 69 6d 65 4f 70 74 69 6f 6e 20 6e 61 74 69 76 65  imeOption native
8070: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
8080: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
8090: 4e 4f 54 45 3a 20 52 65 74 75 72 6e 20 74 68 65  NOTE: Return the
80a0: 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73 65   mixed-mode asse
80b0: 6d 62 6c 79 20 66 69 6c 65 20 6e 61 6d 65 2e 0d  mbly file name..
80c0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
80d0: 20 20 20 20 72 65 74 75 72 6e 20 5b 66 69 6c 65      return [file
80e0: 20 6e 61 74 69 76 65 6e 61 6d 65 20 5c 0d 0a 20   nativename \.. 
80f0: 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65             [file
8100: 20 6a 6f 69 6e 20 5b 67 65 74 42 69 6e 61 72 79   join [getBinary
8110: 44 69 72 65 63 74 6f 72 79 5d 20 24 70 6c 61 74  Directory] $plat
8120: 66 6f 72 6d 20 53 79 73 74 65 6d 2e 44 61 74 61  form System.Data
8130: 2e 53 51 4c 69 74 65 2e 64 6c 6c 5d 5d 0d 0a 20  .SQLite.dll]].. 
8140: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
8150: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
8160: 20 41 72 65 20 77 65 20 61 74 74 65 6d 70 74 69   Are we attempti
8170: 6e 67 20 74 6f 20 61 75 74 6f 6d 61 74 69 63 61  ng to automatica
8180: 6c 6c 79 20 64 65 74 65 63 74 20 77 68 65 74 68  lly detect wheth
8190: 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 0d 0a 20  er or not the.. 
81a0: 20 20 20 20 20 23 20 20 20 20 20 20 20 69 6e 74       #       int
81b0: 65 72 6f 70 20 61 73 73 65 6d 62 6c 79 20 73 68  erop assembly sh
81c0: 6f 75 6c 64 20 62 65 20 75 73 65 64 3f 0d 0a 20  ould be used?.. 
81d0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65       #..      se
81e0: 74 20 61 75 74 6f 6d 61 74 69 63 20 5b 65 78 70  t automatic [exp
81f0: 72 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  r {[string lengt
8200: 68 20 24 73 74 61 6e 64 61 72 64 5d 20 3d 3d 20  h $standard] == 
8210: 30 7d 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a  0}]....      #..
8220: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69        # NOTE: Fi
8230: 72 73 74 2c 20 69 6e 20 65 69 74 68 65 72 20 22  rst, in either "
8240: 61 75 74 6f 6d 61 74 69 63 22 20 6f 72 20 22 6e  automatic" or "n
8250: 6f 6e 2d 73 74 61 6e 64 61 72 64 22 20 6d 6f 64  on-standard" mod
8260: 65 73 2c 20 61 74 74 65 6d 70 74 0d 0a 20 20 20  es, attempt..   
8270: 20 20 20 23 20 20 20 20 20 20 20 74 6f 20 66 69     #       to fi
8280: 6e 64 20 74 68 65 20 6e 61 74 69 76 65 2d 6f 6e  nd the native-on
8290: 6c 79 20 69 6e 74 65 72 6f 70 20 61 73 73 65 6d  ly interop assem
82a0: 62 6c 79 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  bly...      #.. 
82b0: 20 20 20 20 20 69 66 20 7b 24 61 75 74 6f 6d 61       if {$automa
82c0: 74 69 63 20 7c 7c 20 21 24 73 74 61 6e 64 61 72  tic || !$standar
82d0: 64 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  d} then {..     
82e0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
82f0: 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f  NOTE: Attempt to
8300: 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6e   determine the n
8310: 61 74 69 76 65 2d 6f 6e 6c 79 20 69 6e 74 65 72  ative-only inter
8320: 6f 70 20 61 73 73 65 6d 62 6c 79 20 66 69 6c 65  op assembly file
8330: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
8340: 20 20 6e 61 6d 65 20 66 6f 72 20 74 68 69 73 20    name for this 
8350: 70 6c 61 74 66 6f 72 6d 20 61 6e 64 20 74 68 65  platform and the
8360: 6e 20 72 65 74 75 72 6e 20 69 74 2e 0d 0a 20 20  n return it...  
8370: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
8380: 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d   foreach fileNam
8390: 65 4f 6e 6c 79 20 5b 67 65 74 49 6e 74 65 72 6f  eOnly [getIntero
83a0: 70 41 73 73 65 6d 62 6c 79 46 69 6c 65 4e 61 6d  pAssemblyFileNam
83b0: 65 73 4f 6e 6c 79 5d 20 7b 0d 0a 20 20 20 20 20  esOnly] {..     
83c0: 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d       set fileNam
83d0: 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61  e [file nativena
83e0: 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  me \..          
83f0: 20 20 20 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b      [file join [
8400: 67 65 74 42 69 6e 61 72 79 44 69 72 65 63 74 6f  getBinaryDirecto
8410: 72 79 5d 20 24 70 6c 61 74 66 6f 72 6d 20 24 66  ry] $platform $f
8420: 69 6c 65 4e 61 6d 65 4f 6e 6c 79 5d 5d 0d 0a 0d  ileNameOnly]]...
8430: 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b  .          if {[
8440: 66 69 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c  file exists $fil
8450: 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a  eName]} then {..
8460: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
8470: 72 6e 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20  rn $fileName..  
8480: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
8490: 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d     }..      }...
84a0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
84b0: 23 20 4e 4f 54 45 3a 20 54 68 65 6e 2c 20 69 6e  # NOTE: Then, in
84c0: 20 65 69 74 68 65 72 20 22 61 75 74 6f 6d 61 74   either "automat
84d0: 69 63 22 20 6f 72 20 22 73 74 61 6e 64 61 72 64  ic" or "standard
84e0: 22 20 6d 6f 64 65 73 2c 20 61 74 74 65 6d 70 74  " modes, attempt
84f0: 20 74 6f 0d 0a 20 20 20 20 20 20 23 20 20 20 20   to..      #    
8500: 20 20 20 66 69 6e 64 20 74 68 65 20 73 74 61 6e     find the stan
8510: 64 61 72 64 20 53 51 4c 69 74 65 20 6c 69 62 72  dard SQLite libr
8520: 61 72 79 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ary...      #.. 
8530: 20 20 20 20 20 69 66 20 7b 24 61 75 74 6f 6d 61       if {$automa
8540: 74 69 63 20 7c 7c 20 24 73 74 61 6e 64 61 72 64  tic || $standard
8550: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
8560: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
8570: 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20  OTE: Attempt to 
8580: 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6e 61  determine the na
8590: 74 69 76 65 2d 6f 6e 6c 79 20 73 74 61 6e 64 61  tive-only standa
85a0: 72 64 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72  rd SQLite librar
85b0: 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  y..        #    
85c0: 20 20 20 66 69 6c 65 20 6e 61 6d 65 20 66 6f 72     file name for
85d0: 20 74 68 69 73 20 70 6c 61 74 66 6f 72 6d 20 61   this platform a
85e0: 6e 64 20 74 68 65 6e 20 72 65 74 75 72 6e 20 69  nd then return i
85f0: 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  t...        #.. 
8600: 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66         foreach f
8610: 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 5b 67 65 74  ileNameOnly [get
8620: 4e 61 74 69 76 65 4c 69 62 72 61 72 79 46 69 6c  NativeLibraryFil
8630: 65 4e 61 6d 65 73 4f 6e 6c 79 5d 20 7b 0d 0a 20  eNamesOnly] {.. 
8640: 20 20 20 20 20 20 20 20 20 73 65 74 20 66 69 6c           set fil
8650: 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6e 61 74 69  eName [file nati
8660: 76 65 6e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20  vename \..      
8670: 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 6a 6f          [file jo
8680: 69 6e 20 5b 67 65 74 42 69 6e 61 72 79 44 69 72  in [getBinaryDir
8690: 65 63 74 6f 72 79 5d 20 24 70 6c 61 74 66 6f 72  ectory] $platfor
86a0: 6d 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 5d  m $fileNameOnly]
86b0: 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69  ]....          i
86c0: 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20  f {[file exists 
86d0: 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e  $fileName]} then
86e0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
86f0: 72 65 74 75 72 6e 20 24 66 69 6c 65 4e 61 6d 65  return $fileName
8700: 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
8710: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
8720: 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
8730: 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 61 73 20      # NOTE: Was 
8740: 74 68 65 20 6d 61 6e 61 67 65 64 20 61 73 73 65  the managed asse
8750: 6d 62 6c 79 20 63 6f 6d 70 69 6c 65 64 20 65 78  mbly compiled ex
8760: 70 65 63 74 69 6e 67 20 74 6f 20 64 65 61 6c 20  pecting to deal 
8770: 77 69 74 68 20 74 68 65 0d 0a 20 20 20 20 20 20  with the..      
8780: 23 20 20 20 20 20 20 20 73 74 61 6e 64 61 72 64  #       standard
8790: 20 63 6f 72 65 20 6c 69 62 72 61 72 79 3f 0d 0a   core library?..
87a0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
87b0: 66 20 7b 5b 68 61 76 65 53 51 4c 69 74 65 44 65  f {[haveSQLiteDe
87c0: 66 69 6e 65 43 6f 6e 73 74 61 6e 74 20 53 51 4c  fineConstant SQL
87d0: 49 54 45 5f 53 54 41 4e 44 41 52 44 5d 7d 20 74  ITE_STANDARD]} t
87e0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
87f0: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
8800: 3a 20 46 61 6c 6c 62 61 63 6b 20 74 6f 20 72 65  : Fallback to re
8810: 74 75 72 6e 69 6e 67 20 74 68 65 20 6e 61 74 69  turning the nati
8820: 76 65 2d 6f 6e 6c 79 20 73 74 61 6e 64 61 72 64  ve-only standard
8830: 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79 0d   SQLite library.
8840: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
8850: 20 66 69 6c 65 20 6e 61 6d 65 20 66 6f 72 20 74   file name for t
8860: 68 65 20 70 6c 61 74 66 6f 72 6d 2e 0d 0a 20 20  he platform...  
8870: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
8880: 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 73 4f 6e   set fileNamesOn
8890: 6c 79 20 5b 67 65 74 4e 61 74 69 76 65 4c 69 62  ly [getNativeLib
88a0: 72 61 72 79 46 69 6c 65 4e 61 6d 65 73 4f 6e 6c  raryFileNamesOnl
88b0: 79 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66  y]....        if
88c0: 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 66 69 6c 65   {[llength $file
88d0: 4e 61 6d 65 73 4f 6e 6c 79 5d 20 3d 3d 20 30 7d  NamesOnly] == 0}
88e0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
88f0: 20 20 20 72 65 74 75 72 6e 20 22 22 0d 0a 20 20     return ""..  
8900: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
8910: 20 20 20 72 65 74 75 72 6e 20 5b 66 69 6c 65 20     return [file 
8920: 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65  nativename [file
8930: 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20   join \..       
8940: 20 20 20 20 20 5b 67 65 74 42 69 6e 61 72 79 44       [getBinaryD
8950: 69 72 65 63 74 6f 72 79 5d 20 24 70 6c 61 74 66  irectory] $platf
8960: 6f 72 6d 20 5b 6c 69 6e 64 65 78 20 24 66 69 6c  orm [lindex $fil
8970: 65 4e 61 6d 65 73 4f 6e 6c 79 20 30 5d 5d 5d 0d  eNamesOnly 0]]].
8980: 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
8990: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
89a0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 61 6c 6c      # NOTE: Fall
89b0: 62 61 63 6b 20 74 6f 20 72 65 74 75 72 6e 69 6e  back to returnin
89c0: 67 20 74 68 65 20 6e 61 74 69 76 65 2d 6f 6e 6c  g the native-onl
89d0: 79 20 69 6e 74 65 72 6f 70 20 61 73 73 65 6d 62  y interop assemb
89e0: 6c 79 20 66 69 6c 65 0d 0a 20 20 20 20 20 20 20  ly file..       
89f0: 20 23 20 20 20 20 20 20 20 6e 61 6d 65 20 66 6f   #       name fo
8a00: 72 20 74 68 65 20 70 6c 61 74 66 6f 72 6d 2e 0d  r the platform..
8a10: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
8a20: 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65      set fileName
8a30: 73 4f 6e 6c 79 20 5b 67 65 74 49 6e 74 65 72 6f  sOnly [getIntero
8a40: 70 41 73 73 65 6d 62 6c 79 46 69 6c 65 4e 61 6d  pAssemblyFileNam
8a50: 65 73 4f 6e 6c 79 5d 0d 0a 0d 0a 20 20 20 20 20  esOnly]....     
8a60: 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20     if {[llength 
8a70: 24 66 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79 5d 20  $fileNamesOnly] 
8a80: 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
8a90: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 22          return "
8aa0: 22 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  "..        }....
8ab0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b          return [
8ac0: 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20  file nativename 
8ad0: 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20  [file join \..  
8ae0: 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 42 69            [getBi
8af0: 6e 61 72 79 44 69 72 65 63 74 6f 72 79 5d 20 24  naryDirectory] $
8b00: 70 6c 61 74 66 6f 72 6d 20 5b 6c 69 6e 64 65 78  platform [lindex
8b10: 20 24 66 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79 20   $fileNamesOnly 
8b20: 30 5d 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  0]]]..      }.. 
8b30: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
8b40: 63 20 67 65 74 43 6f 6d 6d 6f 6e 44 69 72 65 63  c getCommonDirec
8b50: 74 6f 72 79 20 7b 7d 20 7b 0d 0a 20 20 20 20 20  tory {} {..     
8b60: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
8b70: 3a 20 54 68 69 73 20 70 72 6f 63 65 64 75 72 65  : This procedure
8b80: 20 72 65 74 75 72 6e 73 20 74 68 65 20 64 69 72   returns the dir
8b90: 65 63 74 6f 72 79 20 77 68 65 72 65 20 74 68 65  ectory where the
8ba0: 20 74 65 73 74 20 73 63 72 69 70 74 73 0d 0a 20   test scripts.. 
8bb0: 20 20 20 20 20 23 20 20 20 20 20 20 20 73 68 6f       #       sho
8bc0: 75 6c 64 20 62 65 20 6c 6f 63 61 74 65 64 2e 20  uld be located. 
8bd0: 20 42 79 20 64 65 66 61 75 6c 74 2c 20 74 68 69   By default, thi
8be0: 73 20 6a 75 73 74 20 72 65 74 75 72 6e 73 20 74  s just returns t
8bf0: 68 65 20 45 61 67 6c 65 0d 0a 20 20 20 20 20 20  he Eagle..      
8c00: 23 20 20 20 20 20 20 20 62 69 6e 61 72 79 20 64  #       binary d
8c10: 69 72 65 63 74 6f 72 79 2e 0d 0a 20 20 20 20 20  irectory...     
8c20: 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69   #..      if {[i
8c30: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 63 6f 6d  nfo exists ::com
8c40: 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79 5d 20 26  mon_directory] &
8c50: 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b  & \..          [
8c60: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a  string length $:
8c70: 3a 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f 72  :common_director
8c80: 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  y] > 0} then {..
8c90: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
8ca0: 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c     # NOTE: The l
8cb0: 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 63  ocation of the c
8cc0: 6f 6d 6d 6f 6e 20 64 69 72 65 63 74 6f 72 79 20  ommon directory 
8cd0: 68 61 73 20 62 65 65 6e 20 73 65 74 3b 0d 0a 20  has been set;.. 
8ce0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74         #       t
8cf0: 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74  herefore, use it
8d00: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
8d10: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a        return $::
8d20: 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79  common_directory
8d30: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66  ..      } elseif
8d40: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
8d50: 3a 76 65 6e 64 6f 72 5f 64 69 72 65 63 74 6f 72  :vendor_director
8d60: 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  y] && \..       
8d70: 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74     [string lengt
8d80: 68 20 24 3a 3a 76 65 6e 64 6f 72 5f 64 69 72 65  h $::vendor_dire
8d90: 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e  ctory] > 0} then
8da0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
8db0: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54         # NOTE: T
8dc0: 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74  he location of t
8dd0: 68 65 20 76 65 6e 64 6f 72 20 64 69 72 65 63 74  he vendor direct
8de0: 6f 72 79 20 68 61 73 20 62 65 65 6e 20 73 65 74  ory has been set
8df0: 3b 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  ;..        #    
8e00: 20 20 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73     therefore, us
8e10: 65 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23  e it...        #
8e20: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
8e30: 20 24 3a 3a 76 65 6e 64 6f 72 5f 64 69 72 65 63   $::vendor_direc
8e40: 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20 65 6c  tory..      } el
8e50: 73 65 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73  seif {[info exis
8e60: 74 73 20 3a 3a 74 63 6c 5f 6c 69 62 72 61 72 79  ts ::tcl_library
8e70: 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
8e80: 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
8e90: 20 24 3a 3a 74 63 6c 5f 6c 69 62 72 61 72 79 5d   $::tcl_library]
8ea0: 20 3e 20 30 20 26 26 20 5c 0d 0a 20 20 20 20 20   > 0 && \..     
8eb0: 20 20 20 20 20 5b 66 69 6c 65 20 69 73 64 69 72       [file isdir
8ec0: 65 63 74 6f 72 79 20 24 3a 3a 74 63 6c 5f 6c 69  ectory $::tcl_li
8ed0: 62 72 61 72 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a  brary]} then {..
8ee0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
8ef0: 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 76     # NOTE: The v
8f00: 61 72 69 61 62 6c 65 20 77 69 74 68 20 74 68 65  ariable with the
8f10: 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65   location of the
8f20: 20 73 63 72 69 70 74 20 6c 69 62 72 61 72 79 20   script library 
8f30: 69 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  is..        #   
8f40: 20 20 20 20 73 65 74 20 61 6e 64 20 61 70 70 65      set and appe
8f50: 61 72 73 20 74 6f 20 62 65 20 61 20 72 65 61 6c  ars to be a real
8f60: 20 64 69 72 65 63 74 6f 72 79 20 28 69 2e 65 2e   directory (i.e.
8f70: 20 6e 6f 74 20 65 6d 62 65 64 64 65 64 0d 0a 20   not embedded.. 
8f80: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 77         #       w
8f90: 69 74 68 69 6e 20 61 20 66 69 6c 65 29 3b 20 74  ithin a file); t
8fa0: 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74  herefore, use it
8fb0: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
8fc0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a        return $::
8fd0: 74 63 6c 5f 6c 69 62 72 61 72 79 0d 0a 20 20 20  tcl_library..   
8fe0: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
8ff0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
9000: 23 20 4e 4f 54 45 3a 20 46 61 6c 6c 62 61 63 6b  # NOTE: Fallback
9010: 20 74 6f 20 74 68 65 20 64 69 72 65 63 74 6f 72   to the director
9020: 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  y containing the
9030: 20 65 78 65 63 75 74 61 62 6c 65 2e 0d 0a 20 20   executable...  
9040: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
9050: 20 72 65 74 75 72 6e 20 5b 69 6e 66 6f 20 62 69   return [info bi
9060: 6e 61 72 79 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a  nary]..      }..
9070: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
9080: 6f 63 20 67 65 74 44 61 74 61 62 61 73 65 44 69  oc getDatabaseDi
9090: 72 65 63 74 6f 72 79 20 7b 7d 20 7b 0d 0a 20 20  rectory {} {..  
90a0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
90b0: 4f 54 45 3a 20 54 68 69 73 20 70 72 6f 63 65 64  OTE: This proced
90c0: 75 72 65 20 72 65 74 75 72 6e 73 20 74 68 65 20  ure returns the 
90d0: 64 69 72 65 63 74 6f 72 79 20 77 68 65 72 65 20  directory where 
90e0: 74 68 65 20 74 65 73 74 20 64 61 74 61 62 61 73  the test databas
90f0: 65 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  es..      #     
9100: 20 20 73 68 6f 75 6c 64 20 62 65 20 6c 6f 63 61    should be loca
9110: 74 65 64 2e 20 20 42 79 20 64 65 66 61 75 6c 74  ted.  By default
9120: 2c 20 74 68 69 73 20 6a 75 73 74 20 75 73 65 73  , this just uses
9130: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0d 0a   the temporary..
9140: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64 69        #       di
9150: 72 65 63 74 6f 72 79 20 63 6f 6e 66 69 67 75 72  rectory configur
9160: 65 64 20 66 6f 72 20 74 68 69 73 20 73 79 73 74  ed for this syst
9170: 65 6d 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  em...      #..  
9180: 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
9190: 69 73 74 73 20 3a 3a 64 61 74 61 62 61 73 65 5f  ists ::database_
91a0: 64 69 72 65 63 74 6f 72 79 5d 20 26 26 20 5c 0d  directory] && \.
91b0: 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69  .          [stri
91c0: 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 64 61 74  ng length $::dat
91d0: 61 62 61 73 65 5f 64 69 72 65 63 74 6f 72 79 5d  abase_directory]
91e0: 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
91f0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
9200: 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c 6f 63   # NOTE: The loc
9210: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 61 74  ation of the dat
9220: 61 62 61 73 65 20 64 69 72 65 63 74 6f 72 79 20  abase directory 
9230: 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72 69 64  has been overrid
9240: 64 65 6e 3b 0d 0a 20 20 20 20 20 20 20 20 23 20  den;..        # 
9250: 20 20 20 20 20 20 74 68 65 72 65 66 6f 72 65 2c        therefore,
9260: 20 75 73 65 20 69 74 2e 0d 0a 20 20 20 20 20 20   use it...      
9270: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
9280: 75 72 6e 20 24 3a 3a 64 61 74 61 62 61 73 65 5f  urn $::database_
9290: 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20  directory..     
92a0: 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f   } elseif {[info
92b0: 20 65 78 69 73 74 73 20 3a 3a 73 63 72 61 74 63   exists ::scratc
92c0: 68 5f 64 69 72 65 63 74 6f 72 79 5d 20 26 26 20  h_directory] && 
92d0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74  \..          [st
92e0: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 73  ring length $::s
92f0: 63 72 61 74 63 68 5f 64 69 72 65 63 74 6f 72 79  cratch_directory
9300: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
9310: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
9320: 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c 6f    # NOTE: The lo
9330: 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 63  cation of the sc
9340: 72 61 74 63 68 20 64 69 72 65 63 74 6f 72 79 20  ratch directory 
9350: 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72 69 64  has been overrid
9360: 64 65 6e 3b 0d 0a 20 20 20 20 20 20 20 20 23 20  den;..        # 
9370: 20 20 20 20 20 20 74 68 65 72 65 66 6f 72 65 2c        therefore,
9380: 20 75 73 65 20 69 74 2e 0d 0a 20 20 20 20 20 20   use it...      
9390: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
93a0: 75 72 6e 20 24 3a 3a 73 63 72 61 74 63 68 5f 64  urn $::scratch_d
93b0: 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20  irectory..      
93c0: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
93d0: 20 20 72 65 74 75 72 6e 20 5b 67 65 74 54 65 6d    return [getTem
93e0: 70 6f 72 61 72 79 50 61 74 68 5d 0d 0a 20 20 20  poraryPath]..   
93f0: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
9400: 20 20 20 20 70 72 6f 63 20 67 65 74 54 65 6d 70      proc getTemp
9410: 6f 72 61 72 79 44 69 72 65 63 74 6f 72 79 20 7b  oraryDirectory {
9420: 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
9430: 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73      # NOTE: This
9440: 20 70 72 6f 63 65 64 75 72 65 20 72 65 74 75 72   procedure retur
9450: 6e 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  ns the directory
9460: 20 77 68 65 72 65 20 74 68 65 20 74 65 6d 70 6f   where the tempo
9470: 72 61 72 79 20 66 69 6c 65 73 0d 0a 20 20 20 20  rary files..    
9480: 20 20 23 20 20 20 20 20 20 20 73 68 6f 75 6c 64    #       should
9490: 20 62 65 20 6c 6f 63 61 74 65 64 2e 20 20 42 79   be located.  By
94a0: 20 64 65 66 61 75 6c 74 2c 20 74 68 69 73 20 6a   default, this j
94b0: 75 73 74 20 75 73 65 73 20 74 68 65 20 74 65 6d  ust uses the tem
94c0: 70 6f 72 61 72 79 0d 0a 20 20 20 20 20 20 23 20  porary..      # 
94d0: 20 20 20 20 20 20 64 69 72 65 63 74 6f 72 79 20        directory 
94e0: 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20 74  configured for t
94f0: 68 69 73 20 73 79 73 74 65 6d 2e 0d 0a 20 20 20  his system...   
9500: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
9510: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74  [info exists ::t
9520: 65 6d 70 6f 72 61 72 79 5f 64 69 72 65 63 74 6f  emporary_directo
9530: 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  ry] && \..      
9540: 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67      [string leng
9550: 74 68 20 24 3a 3a 74 65 6d 70 6f 72 61 72 79 5f  th $::temporary_
9560: 64 69 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20  directory] > 0} 
9570: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
9580: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
9590: 45 3a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20  E: The location 
95a0: 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  of the temporary
95b0: 20 64 69 72 65 63 74 6f 72 79 20 68 61 73 20 62   directory has b
95c0: 65 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b 0d  een overridden;.
95d0: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
95e0: 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20   therefore, use 
95f0: 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  it...        #..
9600: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24          return $
9610: 3a 3a 74 65 6d 70 6f 72 61 72 79 5f 64 69 72 65  ::temporary_dire
9620: 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20 65  ctory..      } e
9630: 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69  lseif {[info exi
9640: 73 74 73 20 3a 3a 73 63 72 61 74 63 68 5f 64 69  sts ::scratch_di
9650: 72 65 63 74 6f 72 79 5d 20 26 26 20 5c 0d 0a 20  rectory] && \.. 
9660: 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67           [string
9670: 20 6c 65 6e 67 74 68 20 24 3a 3a 73 63 72 61 74   length $::scrat
9680: 63 68 5f 64 69 72 65 63 74 6f 72 79 5d 20 3e 20  ch_directory] > 
9690: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
96a0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
96b0: 4e 4f 54 45 3a 20 54 68 65 20 6c 6f 63 61 74 69  NOTE: The locati
96c0: 6f 6e 20 6f 66 20 74 68 65 20 73 63 72 61 74 63  on of the scratc
96d0: 68 20 64 69 72 65 63 74 6f 72 79 20 68 61 73 20  h directory has 
96e0: 62 65 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b  been overridden;
96f0: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
9700: 20 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65    therefore, use
9710: 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d   it...        #.
9720: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
9730: 24 3a 3a 73 63 72 61 74 63 68 5f 64 69 72 65 63  $::scratch_direc
9740: 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20 65 6c  tory..      } el
9750: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65  se {..        re
9760: 74 75 72 6e 20 5b 67 65 74 54 65 6d 70 6f 72 61  turn [getTempora
9770: 72 79 50 61 74 68 5d 0d 0a 20 20 20 20 20 20 7d  ryPath]..      }
9780: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
9790: 70 72 6f 63 20 67 65 74 45 78 65 63 75 74 65 4f  proc getExecuteO
97a0: 6e 53 65 74 75 70 20 7b 7d 20 7b 0d 0a 20 20 20  nSetup {} {..   
97b0: 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69     if {[info exi
97c0: 73 74 73 20 3a 3a 65 78 65 63 75 74 65 5f 6f 6e  sts ::execute_on
97d0: 5f 73 65 74 75 70 5d 20 26 26 20 5c 0d 0a 20 20  _setup] && \..  
97e0: 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20          [string 
97f0: 6c 65 6e 67 74 68 20 24 3a 3a 65 78 65 63 75 74  length $::execut
9800: 65 5f 6f 6e 5f 73 65 74 75 70 5d 20 3e 20 30 7d  e_on_setup] > 0}
9810: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
9820: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
9830: 54 45 3a 20 52 65 74 75 72 6e 20 74 68 65 20 63  TE: Return the c
9840: 6f 6e 66 69 67 75 72 65 64 20 53 51 4c 20 74 6f  onfigured SQL to
9850: 20 65 78 65 63 75 74 65 20 64 75 72 69 6e 67 20   execute during 
9860: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0d 0a  the connection..
9870: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
9880: 73 65 74 75 70 20 70 72 6f 63 65 64 75 72 65 20  setup procedure 
9890: 28 69 2e 65 2e 20 66 6f 72 20 65 76 65 72 79 20  (i.e. for every 
98a0: 74 65 73 74 20 64 61 74 61 62 61 73 65 20 63 6f  test database co
98b0: 6e 6e 65 63 74 69 6f 6e 29 2e 0d 0a 20 20 20 20  nnection)...    
98c0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
98d0: 65 74 75 72 6e 20 24 3a 3a 65 78 65 63 75 74 65  eturn $::execute
98e0: 5f 6f 6e 5f 73 65 74 75 70 0d 0a 20 20 20 20 20  _on_setup..     
98f0: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
9900: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
9910: 4e 4f 54 45 3a 20 42 79 20 64 65 66 61 75 6c 74  NOTE: By default
9920: 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20 53 51  , there is no SQ
9930: 4c 20 74 6f 20 65 78 65 63 75 74 65 20 64 75 72  L to execute dur
9940: 69 6e 67 20 74 68 65 20 63 6f 6e 6e 65 63 74 69  ing the connecti
9950: 6f 6e 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  on..        #   
9960: 20 20 20 20 73 65 74 75 70 20 70 72 6f 63 65 64      setup proced
9970: 75 72 65 20 28 69 2e 65 2e 20 66 6f 72 20 65 76  ure (i.e. for ev
9980: 65 72 79 20 74 65 73 74 20 64 61 74 61 62 61 73  ery test databas
9990: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 29 2e 0d 0a  e connection)...
99a0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
99b0: 20 20 20 72 65 74 75 72 6e 20 22 22 0d 0a 20 20     return ""..  
99c0: 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
99d0: 0a 20 20 20 20 70 72 6f 63 20 67 65 74 53 74 72  .    proc getStr
99e0: 69 6e 67 4d 61 70 46 6f 72 54 63 6c 45 73 63 61  ingMapForTclEsca
99f0: 70 65 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 72  pe {} {..      r
9a00: 65 74 75 72 6e 20 5b 6c 69 73 74 20 5c 5c 20 5c  eturn [list \\ \
9a10: 5c 5c 5c 20 5c 5b 20 5c 5c 5c 5b 20 5c 5d 20 5c  \\\ \[ \\\[ \] \
9a20: 5c 5c 5d 20 5c 24 20 5c 5c 5c 24 5d 0d 0a 20 20  \\] \$ \\\$]..  
9a30: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
9a40: 20 67 65 74 54 65 73 74 4f 76 65 72 72 69 64 65   getTestOverride
9a50: 73 50 72 65 61 6d 62 6c 65 20 7b 20 7b 65 78 74  sPreamble { {ext
9a60: 72 61 56 61 72 4e 61 6d 65 73 20 22 22 7d 20 7d  raVarNames ""} }
9a70: 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 76 61   {..      set va
9a80: 72 4e 61 6d 65 73 20 5b 6c 69 73 74 5d 0d 0a 0d  rNames [list]...
9a90: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
9aa0: 23 20 4e 4f 54 45 3a 20 49 66 20 61 76 61 69 6c  # NOTE: If avail
9ab0: 61 62 6c 65 2c 20 73 74 61 72 74 20 77 69 74 68  able, start with
9ac0: 20 74 68 65 20 6d 61 73 74 65 72 20 6c 69 73 74   the master list
9ad0: 20 6f 66 20 74 65 73 74 20 6f 76 65 72 72 69 64   of test overrid
9ae0: 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
9af0: 20 76 61 72 69 61 62 6c 65 73 2e 0d 0a 20 20 20   variables...   
9b00: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
9b10: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74  [info exists ::t
9b20: 65 73 74 5f 6f 76 65 72 72 69 64 65 73 5d 20 26  est_overrides] &
9b30: 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b  & \..          [
9b40: 6c 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f  llength $::test_
9b50: 6f 76 65 72 72 69 64 65 73 5d 20 3e 20 30 7d 20  overrides] > 0} 
9b60: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
9b70: 65 76 61 6c 20 6c 61 70 70 65 6e 64 20 76 61 72  eval lappend var
9b80: 4e 61 6d 65 73 20 24 3a 3a 74 65 73 74 5f 6f 76  Names $::test_ov
9b90: 65 72 72 69 64 65 73 0d 0a 20 20 20 20 20 20 7d  errides..      }
9ba0: 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
9bb0: 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 72 65     # NOTE: If re
9bc0: 71 75 65 73 74 65 64 20 62 79 20 6f 75 72 20 63  quested by our c
9bd0: 61 6c 6c 65 72 2c 20 61 64 64 20 61 6e 79 20 61  aller, add any a
9be0: 64 64 69 74 69 6f 6e 61 6c 20 76 61 72 69 61 62  dditional variab
9bf0: 6c 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  le..      #     
9c00: 20 20 6e 61 6d 65 73 20 74 6f 20 63 6f 70 79 20    names to copy 
9c10: 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  now...      #.. 
9c20: 20 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67 74       if {[llengt
9c30: 68 20 24 65 78 74 72 61 56 61 72 4e 61 6d 65 73  h $extraVarNames
9c40: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
9c50: 20 20 20 20 20 20 20 65 76 61 6c 20 6c 61 70 70         eval lapp
9c60: 65 6e 64 20 76 61 72 4e 61 6d 65 73 20 24 65 78  end varNames $ex
9c70: 74 72 61 56 61 72 4e 61 6d 65 73 0d 0a 20 20 20  traVarNames..   
9c80: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
9c90: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42  .      # NOTE: B
9ca0: 75 69 6c 64 20 74 68 65 20 73 63 72 69 70 74 20  uild the script 
9cb0: 66 72 61 67 6d 65 6e 74 20 74 6f 20 62 65 20 72  fragment to be r
9cc0: 65 74 75 72 6e 65 64 20 62 79 20 70 72 6f 63 65  eturned by proce
9cd0: 73 73 69 6e 67 20 65 61 63 68 0d 0a 20 20 20 20  ssing each..    
9ce0: 20 20 23 20 20 20 20 20 20 20 76 61 72 69 61 62    #       variab
9cf0: 6c 65 20 6e 61 6d 65 20 61 6e 64 20 61 64 64 69  le name and addi
9d00: 6e 67 20 74 68 65 20 6e 65 63 65 63 65 73 73 61  ng the nececessa
9d10: 72 79 20 73 63 72 69 70 74 20 66 72 61 67 6d 65  ry script fragme
9d20: 6e 74 73 20 66 6f 72 0d 0a 20 20 20 20 20 20 23  nts for..      #
9d30: 20 20 20 20 20 20 20 65 61 63 68 20 6f 6e 65 2e         each one.
9d40: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
9d50: 20 73 65 74 20 72 65 73 75 6c 74 20 22 22 0d 0a   set result ""..
9d60: 0d 0a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20  ..      foreach 
9d70: 76 61 72 4e 61 6d 65 20 24 76 61 72 4e 61 6d 65  varName $varName
9d80: 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  s {..        #..
9d90: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
9da0: 42 75 69 6c 64 20 74 68 65 20 71 75 61 6c 69 66  Build the qualif
9db0: 69 65 64 20 67 6c 6f 62 61 6c 20 76 61 72 69 61  ied global varia
9dc0: 62 6c 65 20 6e 61 6d 65 2e 0d 0a 20 20 20 20 20  ble name...     
9dd0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65     #..        se
9de0: 74 20 66 75 6c 6c 56 61 72 4e 61 6d 65 20 5b 61  t fullVarName [a
9df0: 70 70 65 6e 64 41 72 67 73 20 3a 3a 20 24 76 61  ppendArgs :: $va
9e00: 72 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20  rName]....      
9e10: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
9e20: 4f 54 45 3a 20 44 6f 65 73 20 74 68 65 20 76 61  OTE: Does the va
9e30: 72 69 61 62 6c 65 20 65 78 69 73 74 20 69 6e 20  riable exist in 
9e40: 74 68 69 73 20 69 6e 74 65 72 70 72 65 74 65 72  this interpreter
9e50: 20 63 6f 6e 74 65 78 74 3f 0d 0a 20 20 20 20 20   context?..     
9e60: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66     #..        if
9e70: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 24   {[info exists $
9e80: 66 75 6c 6c 56 61 72 4e 61 6d 65 5d 7d 20 74 68  fullVarName]} th
9e90: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
9ea0: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e  #..          # N
9eb0: 4f 54 45 3a 20 41 70 70 65 6e 64 20 61 20 73 63  OTE: Append a sc
9ec0: 72 69 70 74 20 66 72 61 67 6d 65 6e 74 20 74 6f  ript fragment to
9ed0: 20 74 68 65 20 72 65 73 75 6c 74 20 74 68 61 74   the result that
9ee0: 20 77 69 6c 6c 20 63 6f 72 72 65 63 74 6c 79 0d   will correctly.
9ef0: 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20  .          #    
9f00: 20 20 20 63 6f 70 79 20 61 6e 79 20 63 6f 6e 74     copy any cont
9f10: 61 69 6e 65 64 20 76 61 6c 75 65 20 74 6f 20 61  ained value to a
9f20: 6e 6f 74 68 65 72 20 69 6e 74 65 72 70 72 65 74  nother interpret
9f30: 65 72 20 63 6f 6e 74 65 78 74 2e 0d 0a 20 20 20  er context...   
9f40: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
9f50: 20 20 20 20 61 70 70 65 6e 64 20 72 65 73 75 6c      append resul
9f60: 74 20 5c 6e 20 22 73 65 74 20 22 20 24 66 75 6c  t \n "set " $ful
9f70: 6c 56 61 72 4e 61 6d 65 20 22 20 5c 7b 22 20 5b  lVarName " \{" [
9f80: 73 74 72 69 6e 67 20 6d 61 70 20 5c 0d 0a 20 20  string map \..  
9f90: 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74              [get
9fa0: 53 74 72 69 6e 67 4d 61 70 46 6f 72 54 63 6c 45  StringMapForTclE
9fb0: 73 63 61 70 65 5d 20 5b 73 65 74 20 24 66 75 6c  scape] [set $ful
9fc0: 6c 56 61 72 4e 61 6d 65 5d 5d 20 5c 7d 0d 0a 20  lVarName]] \}.. 
9fd0: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
9fe0: 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
9ff0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 74      # NOTE: If t
a000: 68 65 20 72 65 73 75 6c 74 20 63 6f 6e 74 61 69  he result contai
a010: 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73  ns one or more s
a020: 63 72 69 70 74 20 66 72 61 67 6d 65 6e 74 73 2c  cript fragments,
a030: 20 61 70 70 65 6e 64 20 61 0d 0a 20 20 20 20 20   append a..     
a040: 20 23 20 20 20 20 20 20 20 6e 65 77 6c 69 6e 65   #       newline
a050: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
a060: 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
a070: 6e 67 74 68 20 24 72 65 73 75 6c 74 5d 20 3e 20  ngth $result] > 
a080: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
a090: 20 20 20 61 70 70 65 6e 64 20 72 65 73 75 6c 74     append result
a0a0: 20 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a   \n..      }....
a0b0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 72 65        return $re
a0c0: 73 75 6c 74 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  sult..    }.....
a0d0: 20 20 20 20 70 72 6f 63 20 6d 6f 76 65 53 79 73      proc moveSys
a0e0: 74 65 6d 44 61 74 61 53 51 4c 69 74 65 44 6c 6c  temDataSQLiteDll
a0f0: 43 6f 6e 66 69 67 20 7b 20 7b 72 65 73 74 6f 72  Config { {restor
a100: 65 20 66 61 6c 73 65 7d 20 7b 76 65 72 62 6f 73  e false} {verbos
a110: 65 20 74 72 75 65 7d 20 7d 20 7b 0d 0a 20 20 20  e true} } {..   
a120: 20 20 20 73 65 74 20 64 69 72 65 63 74 6f 72 79     set directory
a130: 20 5b 67 65 74 42 69 6e 61 72 79 44 69 72 65 63   [getBinaryDirec
a140: 74 6f 72 79 5d 0d 0a 0d 0a 20 20 20 20 20 20 69  tory]....      i
a150: 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  f {[string lengt
a160: 68 20 24 64 69 72 65 63 74 6f 72 79 5d 20 3d 3d  h $directory] ==
a170: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
a180: 20 20 20 20 69 66 20 7b 24 76 65 72 62 6f 73 65      if {$verbose
a190: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
a1a0: 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
a1b0: 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
a1c0: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
a1d0: 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6b 69         "---- ski
a1e0: 70 70 65 64 20 6d 6f 76 69 6e 67 20 5c 22 53 79  pped moving \"Sy
a1f0: 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
a200: 2e 64 6c 6c 2e 63 6f 6e 66 69 67 5c 22 2c 20 22  .dll.config\", "
a210: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
a220: 20 20 22 6e 6f 20 62 69 6e 61 72 79 20 64 69 72    "no binary dir
a230: 65 63 74 6f 72 79 5c 6e 22 5d 0d 0a 20 20 20 20  ectory\n"]..    
a240: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
a250: 20 72 65 74 75 72 6e 0d 0a 20 20 20 20 20 20 7d   return..      }
a260: 0d 0a 0d 0a 20 20 20 20 20 20 73 65 74 20 66 69  ....      set fi
a270: 6c 65 4e 61 6d 65 28 31 29 20 5b 66 69 6c 65 20  leName(1) [file 
a280: 6e 6f 72 6d 61 6c 69 7a 65 20 5c 0d 0a 20 20 20  normalize \..   
a290: 20 20 20 20 20 20 20 5b 66 69 6c 65 20 6a 6f 69         [file joi
a2a0: 6e 20 24 64 69 72 65 63 74 6f 72 79 20 53 79 73  n $directory Sys
a2b0: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
a2c0: 64 6c 6c 2e 63 6f 6e 66 69 67 5d 5d 0d 0a 0d 0a  dll.config]]....
a2d0: 20 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61        set fileNa
a2e0: 6d 65 28 32 29 20 5b 61 70 70 65 6e 64 41 72 67  me(2) [appendArg
a2f0: 73 20 24 66 69 6c 65 4e 61 6d 65 28 31 29 20 2e  s $fileName(1) .
a300: 6d 6f 76 65 64 5d 0d 0a 0d 0a 20 20 20 20 20 20  moved]....      
a310: 69 66 20 7b 24 72 65 73 74 6f 72 65 7d 20 74 68  if {$restore} th
a320: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66  en {..        if
a330: 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24   {[file exists $
a340: 66 69 6c 65 4e 61 6d 65 28 32 29 5d 7d 20 74 68  fileName(2)]} th
a350: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
a360: 66 69 6c 65 20 72 65 6e 61 6d 65 20 24 66 69 6c  file rename $fil
a370: 65 4e 61 6d 65 28 32 29 20 24 66 69 6c 65 4e 61  eName(2) $fileNa
a380: 6d 65 28 31 29 0d 0a 0d 0a 20 20 20 20 20 20 20  me(1)....       
a390: 20 20 20 69 66 20 7b 24 76 65 72 62 6f 73 65 7d     if {$verbose}
a3a0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
a3b0: 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
a3c0: 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
a3d0: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
a3e0: 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
a3f0: 6d 6f 76 65 64 20 5c 22 22 20 24 66 69 6c 65 4e  moved \"" $fileN
a400: 61 6d 65 28 32 29 20 22 5c 22 20 74 6f 20 5c 22  ame(2) "\" to \"
a410: 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
a420: 20 20 20 20 20 24 66 69 6c 65 4e 61 6d 65 28 31       $fileName(1
a430: 29 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ) \"\n]..       
a440: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20     }..        } 
a450: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
a460: 20 20 69 66 20 7b 24 76 65 72 62 6f 73 65 7d 20    if {$verbose} 
a470: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
a480: 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
a490: 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
a4a0: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
a4b0: 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73           "---- s
a4c0: 6b 69 70 70 65 64 20 6d 6f 76 69 6e 67 20 5c 22  kipped moving \"
a4d0: 22 20 24 66 69 6c 65 4e 61 6d 65 28 32 29 20 5c  " $fileName(2) \
a4e0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
a4f0: 20 20 22 5c 22 2c 20 69 74 20 64 6f 65 73 20 6e    "\", it does n
a500: 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a 20 20  ot exist\n"]..  
a510: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
a520: 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c     }..      } el
a530: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66  se {..        if
a540: 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24   {[file exists $
a550: 66 69 6c 65 4e 61 6d 65 28 31 29 5d 7d 20 74 68  fileName(1)]} th
a560: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
a570: 66 69 6c 65 20 72 65 6e 61 6d 65 20 24 66 69 6c  file rename $fil
a580: 65 4e 61 6d 65 28 31 29 20 24 66 69 6c 65 4e 61  eName(1) $fileNa
a590: 6d 65 28 32 29 0d 0a 0d 0a 20 20 20 20 20 20 20  me(2)....       
a5a0: 20 20 20 69 66 20 7b 24 76 65 72 62 6f 73 65 7d     if {$verbose}
a5b0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
a5c0: 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
a5d0: 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
a5e0: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
a5f0: 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
a600: 6d 6f 76 65 64 20 5c 22 22 20 24 66 69 6c 65 4e  moved \"" $fileN
a610: 61 6d 65 28 31 29 20 22 5c 22 20 74 6f 20 5c 22  ame(1) "\" to \"
a620: 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
a630: 20 20 20 20 20 24 66 69 6c 65 4e 61 6d 65 28 32       $fileName(2
a640: 29 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ) \"\n]..       
a650: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20     }..        } 
a660: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
a670: 20 20 69 66 20 7b 24 76 65 72 62 6f 73 65 7d 20    if {$verbose} 
a680: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
a690: 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
a6a0: 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
a6b0: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
a6c0: 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73           "---- s
a6d0: 6b 69 70 70 65 64 20 6d 6f 76 69 6e 67 20 5c 22  kipped moving \"
a6e0: 22 20 24 66 69 6c 65 4e 61 6d 65 28 31 29 20 5c  " $fileName(1) \
a6f0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
a700: 20 20 22 5c 22 2c 20 69 74 20 64 6f 65 73 20 6e    "\", it does n
a710: 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a 20 20  ot exist\n"]..  
a720: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
a730: 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20     }..      }.. 
a740: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
a750: 63 20 67 65 74 41 70 70 44 6f 6d 61 69 6e 50 72  c getAppDomainPr
a760: 65 61 6d 62 6c 65 20 7b 20 7b 70 72 65 66 69 78  eamble { {prefix
a770: 20 22 22 7d 20 7b 73 75 66 66 69 78 20 22 22 7d   ""} {suffix ""}
a780: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20   } {..      #.. 
a790: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69       # NOTE: Thi
a7a0: 73 20 70 72 6f 63 65 64 75 72 65 20 72 65 74 75  s procedure retu
a7b0: 72 6e 73 20 61 20 74 65 73 74 20 73 65 74 75 70  rns a test setup
a7c0: 20 73 63 72 69 70 74 20 66 72 61 67 6d 65 6e 74   script fragment
a7d0: 20 73 75 69 74 61 62 6c 65 20 66 6f 72 0d 0a 20   suitable for.. 
a7e0: 20 20 20 20 20 23 20 20 20 20 20 20 20 65 76 61       #       eva
a7f0: 6c 75 61 74 69 6f 6e 20 62 79 20 61 6e 20 69 6e  luation by an in
a800: 74 65 72 70 72 65 74 65 72 20 63 72 65 61 74 65  terpreter create
a810: 64 20 69 6e 20 61 6e 20 69 73 6f 6c 61 74 65 64  d in an isolated
a820: 20 61 70 70 6c 69 63 61 74 69 6f 6e 0d 0a 20 20   application..  
a830: 20 20 20 20 23 20 20 20 20 20 20 20 64 6f 6d 61      #       doma
a840: 69 6e 2e 20 20 54 68 65 20 73 63 72 69 70 74 20  in.  The script 
a850: 66 72 61 67 6d 65 6e 74 20 62 65 69 6e 67 20 72  fragment being r
a860: 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 62 65 20  eturned will be 
a870: 73 75 72 72 6f 75 6e 64 65 64 20 62 79 0d 0a 20  surrounded by.. 
a880: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
a890: 20 70 72 65 66 69 78 20 61 6e 64 20 73 75 66 66   prefix and suff
a8a0: 69 78 20 22 73 63 72 69 70 74 20 66 72 61 67 6d  ix "script fragm
a8b0: 65 6e 74 73 22 20 73 70 65 63 69 66 69 65 64 20  ents" specified 
a8c0: 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 2c 0d 0a  by our caller,..
a8d0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69 66        #       if
a8e0: 20 61 6e 79 2e 20 20 54 68 65 20 65 6e 74 69 72   any.  The entir
a8f0: 65 20 73 63 72 69 70 74 20 62 65 69 6e 67 20 72  e script being r
a900: 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 62 65 20  eturned will be 
a910: 73 75 62 73 74 69 74 75 74 65 64 20 76 69 61 0d  substituted via.
a920: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 5b  .      #       [
a930: 73 75 62 73 74 5d 2c 20 69 6e 20 74 68 65 20 63  subst], in the c
a940: 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72 20 63 61  ontext of our ca
a950: 6c 6c 65 72 2c 20 62 65 66 6f 72 65 20 62 65 69  ller, before bei
a960: 6e 67 20 72 65 74 75 72 6e 65 64 2e 0d 0a 20 20  ng returned...  
a970: 20 20 20 20 23 20 20 20 20 20 20 20 54 68 69 73      #       This
a980: 20 73 74 65 70 20 69 73 20 6e 65 63 65 73 73 61   step is necessa
a990: 72 79 20 73 6f 20 74 68 61 74 20 73 6f 6d 65 20  ry so that some 
a9a0: 6c 69 6d 69 74 65 64 20 63 6f 6e 74 65 78 74 20  limited context 
a9b0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 2c 0d 0a 20 20  information,..  
a9c0: 20 20 20 20 23 20 20 20 20 20 20 20 70 72 69 6d      #       prim
a9d0: 61 72 69 6c 79 20 72 65 6c 61 74 65 64 20 74 6f  arily related to
a9e0: 20 74 68 65 20 74 65 73 74 69 6e 67 20 64 69 72   the testing dir
a9f0: 65 63 74 6f 72 69 65 73 2c 20 63 61 6e 20 62 65  ectories, can be
aa00: 20 74 72 61 6e 73 66 65 72 72 65 64 0d 0a 20 20   transferred..  
aa10: 20 20 20 20 23 20 20 20 20 20 20 20 74 6f 20 74      #       to t
aa20: 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 20 69  he interpreter i
aa30: 6e 20 74 68 65 20 69 73 6f 6c 61 74 65 64 20 61  n the isolated a
aa40: 70 70 6c 69 63 61 74 69 6f 6e 20 64 6f 6d 61 69  pplication domai
aa50: 6e 2c 20 6d 61 6b 69 6e 67 20 69 74 0d 0a 20 20  n, making it..  
aa60: 20 20 20 20 23 20 20 20 20 20 20 20 61 62 6c 65      #       able
aa70: 20 74 6f 20 73 75 63 63 65 73 73 66 75 6c 6c 79   to successfully
aa80: 20 72 75 6e 20 74 65 73 74 73 20 74 68 61 74 20   run tests that 
aa90: 72 65 71 75 69 72 65 20 6f 6e 65 20 6f 72 20 6d  require one or m
aaa0: 6f 72 65 20 6f 66 20 74 68 65 0d 0a 20 20 20 20  ore of the..    
aab0: 20 20 23 20 20 20 20 20 20 20 66 69 6c 65 73 20    #       files 
aac0: 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 65  in one of the te
aad0: 73 74 69 6e 67 20 64 69 72 65 63 74 6f 72 69 65  sting directorie
aae0: 73 2e 20 20 43 61 6c 6c 65 72 73 20 73 68 6f 75  s.  Callers shou
aaf0: 6c 64 20 6b 65 65 70 20 69 6e 0d 0a 20 20 20 20  ld keep in..    
ab00: 20 20 23 20 20 20 20 20 20 20 6d 69 6e 64 20 74    #       mind t
ab10: 68 61 74 20 74 68 65 20 74 65 73 74 20 73 63 72  hat the test scr
ab20: 69 70 74 20 66 72 61 67 6d 65 6e 74 20 62 65 69  ipt fragment bei
ab30: 6e 67 20 72 65 74 75 72 6e 65 64 20 63 61 6e 6e  ng returned cann
ab40: 6f 74 20 72 65 6c 79 20 6f 6e 0d 0a 20 20 20 20  ot rely on..    
ab50: 20 20 23 20 20 20 20 20 20 20 61 6e 79 20 73 63    #       any sc
ab60: 72 69 70 74 20 6c 69 62 72 61 72 79 20 70 72 6f  ript library pro
ab70: 63 65 64 75 72 65 73 20 74 68 61 74 20 61 72 65  cedures that are
ab80: 20 6e 6f 74 20 70 72 6f 76 69 64 65 64 20 62 79   not provided by
ab90: 20 74 68 65 20 45 61 67 6c 65 0d 0a 20 20 20 20   the Eagle..    
aba0: 20 20 23 20 20 20 20 20 20 20 6c 69 62 72 61 72    #       librar
abb0: 79 20 70 61 63 6b 61 67 65 20 28 69 2e 65 2e 20  y package (i.e. 
abc0: 22 69 6e 69 74 2e 65 61 67 6c 65 22 29 2c 20 69  "init.eagle"), i
abd0: 6e 63 6c 75 64 69 6e 67 20 74 68 6f 73 65 20 70  ncluding those p
abe0: 72 6f 76 69 64 65 64 20 62 79 0d 0a 20 20 20 20  rovided by..    
abf0: 20 20 23 20 20 20 20 20 20 20 74 68 65 20 45 61    #       the Ea
ac00: 67 6c 65 20 74 65 73 74 20 70 61 63 6b 61 67 65  gle test package
ac10: 2c 20 75 6e 6c 65 73 73 20 74 68 65 20 66 69 6c  , unless the fil
ac20: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
ac30: 6d 20 69 73 20 6c 6f 61 64 65 64 0d 0a 20 20 20  m is loaded..   
ac40: 20 20 20 23 20 20 20 20 20 20 20 6d 61 6e 75 61     #       manua
ac50: 6c 6c 79 20 76 69 61 20 73 6f 6d 65 20 6f 74 68  lly via some oth
ac60: 65 72 20 6d 65 63 68 61 6e 69 73 6d 20 28 65 2e  er mechanism (e.
ac70: 67 2e 20 62 79 20 69 6e 63 6c 75 64 69 6e 67 20  g. by including 
ac80: 61 70 70 72 6f 70 72 69 61 74 65 0d 0a 20 20 20  appropriate..   
ac90: 20 20 20 23 20 20 20 20 20 20 20 5b 70 61 63 6b     #       [pack
aca0: 61 67 65 20 72 65 71 75 69 72 65 5d 20 6f 72 20  age require] or 
acb0: 5b 73 6f 75 72 63 65 5d 20 63 6f 6d 6d 61 6e 64  [source] command
acc0: 73 20 69 6e 20 74 68 65 20 70 72 65 66 69 78 20  s in the prefix 
acd0: 6f 72 20 73 75 66 66 69 78 0d 0a 20 20 20 20 20  or suffix..     
ace0: 20 23 20 20 20 20 20 20 20 73 63 72 69 70 74 20   #       script 
acf0: 66 72 61 67 6d 65 6e 74 73 29 2e 20 20 41 6c 73  fragments).  Als
ad00: 6f 2c 20 61 6c 6c 20 76 61 72 69 61 62 6c 65 20  o, all variable 
ad10: 72 65 66 65 72 65 6e 63 65 73 20 61 6e 64 20 61  references and a
ad20: 6c 6c 20 6e 65 73 74 65 64 0d 0a 20 20 20 20 20  ll nested..     
ad30: 20 23 20 20 20 20 20 20 20 63 6f 6d 6d 61 6e 64   #       command
ad40: 73 20 28 69 2e 65 2e 20 74 68 6f 73 65 20 69 6e  s (i.e. those in
ad50: 20 73 71 75 61 72 65 20 62 72 61 63 6b 65 74 73   square brackets
ad60: 29 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74  ) contained in t
ad70: 68 65 20 66 69 6e 61 6c 0d 0a 20 20 20 20 20 20  he final..      
ad80: 23 20 20 20 20 20 20 20 73 63 72 69 70 74 20 66  #       script f
ad90: 72 61 67 6d 65 6e 74 20 77 69 6c 6c 20 65 6e 64  ragment will end
ada0: 20 75 70 20 62 65 69 6e 67 20 65 76 61 6c 75 61   up being evalua
adb0: 74 65 64 20 69 6e 20 74 68 65 20 63 6f 6e 74 65  ted in the conte
adc0: 78 74 20 6f 66 20 74 68 65 0d 0a 20 20 20 20 20  xt of the..     
add0: 20 23 20 20 20 20 20 20 20 63 61 6c 6c 69 6e 67   #       calling
ade0: 20 69 6e 74 65 72 70 72 65 74 65 72 20 61 6e 64   interpreter and
adf0: 20 6e 6f 74 20 74 68 65 20 74 61 72 67 65 74 20   not the target 
ae00: 69 6e 74 65 72 70 72 65 74 65 72 20 63 72 65 61  interpreter crea
ae10: 74 65 64 20 69 6e 20 74 68 65 0d 0a 20 20 20 20  ted in the..    
ae20: 20 20 23 20 20 20 20 20 20 20 69 73 6f 6c 61 74    #       isolat
ae30: 65 64 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 64  ed application d
ae40: 6f 6d 61 69 6e 20 75 6e 6c 65 73 73 20 74 68 65  omain unless the
ae50: 20 64 6f 6c 6c 61 72 20 73 69 67 6e 73 20 61 6e   dollar signs an
ae60: 64 2f 6f 72 20 73 71 75 61 72 65 0d 0a 20 20 20  d/or square..   
ae70: 20 20 20 23 20 20 20 20 20 20 20 62 72 61 63 6b     #       brack
ae80: 65 74 73 20 61 72 65 20 73 70 65 63 69 61 6c 6c  ets are speciall
ae90: 79 20 71 75 6f 74 65 64 20 77 69 74 68 20 62 61  y quoted with ba
aea0: 63 6b 73 6c 61 73 68 65 73 2e 0d 0a 20 20 20 20  ckslashes...    
aeb0: 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75 72    #..      retur
aec0: 6e 20 5b 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69  n [uplevel 1 [li
aed0: 73 74 20 73 75 62 73 74 20 5b 61 70 70 65 6e 64  st subst [append
aee0: 41 72 67 73 20 24 70 72 65 66 69 78 20 7b 0d 0a  Args $prefix {..
aef0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
af00: 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 5c     # NOTE: The \
af10: 5b 6f 62 6a 65 63 74 5c 5d 20 63 6f 6d 6d 61 6e  [object\] comman
af20: 64 20 6d 61 79 20 62 65 20 6d 69 73 73 69 6e 67  d may be missing
af30: 20 69 6e 20 73 6f 6d 65 20 45 61 67 6c 65 20 63   in some Eagle c
af40: 6f 72 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ore..        #  
af50: 20 20 20 20 20 6c 69 62 72 61 72 79 20 63 6f 6e       library con
af60: 66 69 67 75 72 61 74 69 6f 6e 73 2e 20 20 43 6c  figurations.  Cl
af70: 6f 6e 69 6e 67 20 61 6e 64 20 75 73 69 6e 67 20  oning and using 
af80: 74 68 65 20 70 72 6f 63 65 64 75 72 65 0d 0a 20  the procedure.. 
af90: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 5c         #       \
afa0: 5b 63 68 61 6e 67 65 4e 61 74 69 76 65 52 75 6e  [changeNativeRun
afb0: 74 69 6d 65 4f 70 74 69 6f 6e 5c 5d 20 6d 61 79  timeOption\] may
afc0: 20 68 65 6c 70 20 74 6f 20 6d 69 74 69 67 61 74   help to mitigat
afd0: 65 20 74 68 69 73 2e 0d 0a 20 20 20 20 20 20 20  e this...       
afe0: 20 23 0d 0a 20 20 20 20 20 20 20 20 70 72 6f 63   #..        proc
aff0: 20 63 68 61 6e 67 65 4e 61 74 69 76 65 52 75 6e   changeNativeRun
b000: 74 69 6d 65 4f 70 74 69 6f 6e 20 5c 0d 0a 20 20  timeOption \..  
b010: 20 20 20 20 20 20 20 20 20 20 7b 5b 69 6e 66 6f            {[info
b020: 20 61 72 67 73 20 63 68 61 6e 67 65 4e 61 74 69   args changeNati
b030: 76 65 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 5d  veRuntimeOption]
b040: 7d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  } \..           
b050: 20 7b 5b 69 6e 66 6f 20 62 6f 64 79 20 63 68 61   {[info body cha
b060: 6e 67 65 4e 61 74 69 76 65 52 75 6e 74 69 6d 65  ngeNativeRuntime
b070: 4f 70 74 69 6f 6e 5d 7d 0d 0a 0d 0a 20 20 20 20  Option]}....    
b080: 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20      catch {..   
b090: 20 20 20 20 20 20 20 63 68 61 6e 67 65 4e 61 74         changeNat
b0a0: 69 76 65 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e  iveRuntimeOption
b0b0: 20 5b 68 61 73 52 75 6e 74 69 6d 65 4f 70 74 69   [hasRuntimeOpti
b0c0: 6f 6e 20 6e 61 74 69 76 65 5d 0d 0a 20 20 20 20  on native]..    
b0d0: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 5b      }..      } [
b0e0: 67 65 74 54 65 73 74 4f 76 65 72 72 69 64 65 73  getTestOverrides
b0f0: 50 72 65 61 6d 62 6c 65 20 5b 6c 69 73 74 20 70  Preamble [list p
b100: 61 74 68 20 74 65 73 74 5f 63 68 61 6e 6e 65 6c  ath test_channel
b110: 5d 5d 20 24 73 75 66 66 69 78 5d 5d 5d 0d 0a 20  ]] $suffix]]].. 
b120: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
b130: 63 20 74 72 79 43 6f 70 79 45 78 74 65 72 6e 61  c tryCopyExterna
b140: 6c 46 69 6c 65 20 7b 0d 0a 20 20 20 20 20 20 20  lFile {..       
b150: 20 20 20 20 20 66 69 6c 65 4e 61 6d 65 20 7b 70       fileName {p
b160: 6c 61 74 66 6f 72 6d 20 22 22 7d 20 7b 6e 65 77  latform ""} {new
b170: 46 69 6c 65 4e 61 6d 65 20 22 22 7d 20 7b 76 65  FileName ""} {ve
b180: 72 62 6f 73 65 20 74 72 75 65 7d 20 7d 20 7b 0d  rbose true} } {.
b190: 0a 20 20 20 20 20 20 73 65 74 20 73 6f 75 72 63  .      set sourc
b1a0: 65 46 69 6c 65 4e 61 6d 65 20 5b 67 65 74 45 78  eFileName [getEx
b1b0: 74 65 72 6e 61 6c 46 69 6c 65 4e 61 6d 65 20 24  ternalFileName $
b1c0: 66 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20  fileName]....   
b1d0: 20 20 20 69 66 20 7b 21 5b 66 69 6c 65 20 65 78     if {![file ex
b1e0: 69 73 74 73 20 24 73 6f 75 72 63 65 46 69 6c 65  ists $sourceFile
b1f0: 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  Name]} then {.. 
b200: 20 20 20 20 20 20 20 69 66 20 7b 24 76 65 72 62         if {$verb
b210: 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ose} then {..   
b220: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
b230: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
b240: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
b250: 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
b260: 73 6b 69 70 70 65 64 20 63 6f 70 79 69 6e 67 20  skipped copying 
b270: 65 78 74 65 72 6e 61 6c 20 66 69 6c 65 20 5c 22  external file \"
b280: 22 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d  " $sourceFileNam
b290: 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
b2a0: 20 20 20 22 5c 22 2c 20 69 74 20 64 6f 65 73 20     "\", it does 
b2b0: 6e 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a 20  not exist\n"].. 
b2c0: 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
b2d0: 20 20 20 20 72 65 74 75 72 6e 0d 0a 20 20 20 20      return..    
b2e0: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20    }....      if 
b2f0: 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
b300: 24 6e 65 77 46 69 6c 65 4e 61 6d 65 5d 20 3e 20  $newFileName] > 
b310: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
b320: 20 20 20 73 65 74 20 74 61 72 67 65 74 46 69 6c     set targetFil
b330: 65 4e 61 6d 65 20 5b 67 65 74 42 69 6e 61 72 79  eName [getBinary
b340: 46 69 6c 65 4e 61 6d 65 20 24 6e 65 77 46 69 6c  FileName $newFil
b350: 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 5d  eName $platform]
b360: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
b370: 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 74 61  ..        set ta
b380: 72 67 65 74 46 69 6c 65 4e 61 6d 65 20 5b 67 65  rgetFileName [ge
b390: 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20  tBinaryFileName 
b3a0: 24 66 69 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66  $fileName $platf
b3b0: 6f 72 6d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  orm]..      }...
b3c0: 0a 20 20 20 20 20 20 73 65 74 20 74 61 72 67 65  .      set targe
b3d0: 74 44 69 72 65 63 74 6f 72 79 20 5b 66 69 6c 65  tDirectory [file
b3e0: 20 64 69 72 6e 61 6d 65 20 24 74 61 72 67 65 74   dirname $target
b3f0: 46 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20  FileName]....   
b400: 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d     if {[catch {.
b410: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 66  .        if {![f
b420: 69 6c 65 20 65 78 69 73 74 73 20 24 74 61 72 67  ile exists $targ
b430: 65 74 44 69 72 65 63 74 6f 72 79 5d 7d 20 74 68  etDirectory]} th
b440: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
b450: 66 69 6c 65 20 6d 6b 64 69 72 20 24 74 61 72 67  file mkdir $targ
b460: 65 74 44 69 72 65 63 74 6f 72 79 0d 0a 20 20 20  etDirectory..   
b470: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
b480: 20 20 66 69 6c 65 20 63 6f 70 79 20 2d 66 6f 72    file copy -for
b490: 63 65 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61  ce $sourceFileNa
b4a0: 6d 65 20 24 74 61 72 67 65 74 46 69 6c 65 4e 61  me $targetFileNa
b4b0: 6d 65 0d 0a 20 20 20 20 20 20 7d 5d 20 3d 3d 20  me..      }] == 
b4c0: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
b4d0: 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
b4e0: 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
b4f0: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
b500: 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 70 69 65 64      "---- copied
b510: 20 65 78 74 65 72 6e 61 6c 20 66 69 6c 65 20 66   external file f
b520: 72 6f 6d 20 5c 22 22 20 24 73 6f 75 72 63 65 46  rom \"" $sourceF
b530: 69 6c 65 4e 61 6d 65 20 22 5c 22 20 74 6f 20 5c  ileName "\" to \
b540: 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  "" \..          
b550: 20 20 24 74 61 72 67 65 74 46 69 6c 65 4e 61 6d    $targetFileNam
b560: 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d  e \"\n]..      }
b570: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
b580: 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
b590: 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
b5a0: 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
b5b0: 20 20 22 2d 2d 2d 2d 20 66 61 69 6c 65 64 20 74    "---- failed t
b5c0: 6f 20 63 6f 70 79 20 65 78 74 65 72 6e 61 6c 20  o copy external 
b5d0: 66 69 6c 65 20 66 72 6f 6d 20 5c 22 22 20 24 73  file from \"" $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 22 5c 22  .            "\"
b600: 20 74 6f 20 5c 22 22 20 24 74 61 72 67 65 74 46   to \"" $targetF
b610: 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20  ileName \"\n].. 
b620: 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
b630: 0d 0a 20 20 20 20 70 72 6f 63 20 74 72 79 43 6f  ..    proc tryCo
b640: 70 79 42 69 6e 61 72 79 46 69 6c 65 20 7b 0d 0a  pyBinaryFile {..
b650: 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65              file
b660: 4e 61 6d 65 20 6d 61 6e 61 67 65 64 4f 6e 6c 79  Name managedOnly
b670: 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20 7b   {platform ""} {
b680: 6e 65 77 46 69 6c 65 4e 61 6d 65 20 22 22 7d 0d  newFileName ""}.
b690: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 76 65  .            {ve
b6a0: 72 62 6f 73 65 20 74 72 75 65 7d 20 7d 20 7b 0d  rbose true} } {.
b6b0: 0a 20 20 20 20 20 20 73 65 74 20 73 6f 75 72 63  .      set sourc
b6c0: 65 46 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42 69  eFileName [getBi
b6d0: 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 24 66 69  naryFileName $fi
b6e0: 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d  leName $platform
b6f0: 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 21  ]....      if {!
b700: 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 73 6f  [file exists $so
b710: 75 72 63 65 46 69 6c 65 4e 61 6d 65 5d 7d 20 74  urceFileName]} t
b720: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69  hen {..        i
b730: 66 20 7b 24 76 65 72 62 6f 73 65 7d 20 74 68 65  f {$verbose} the
b740: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74  n {..          t
b750: 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
b760: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
b770: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
b780: 20 20 22 2d 2d 2d 2d 20 73 6b 69 70 70 65 64 20    "---- skipped 
b790: 63 6f 70 79 69 6e 67 20 62 69 6e 61 72 79 20 66  copying binary f
b7a0: 69 6c 65 20 5c 22 22 20 24 73 6f 75 72 63 65 46  ile \"" $sourceF
b7b0: 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20  ileName \..     
b7c0: 20 20 20 20 20 20 20 20 20 22 5c 22 2c 20 69 74           "\", it
b7d0: 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 5c   does not exist\
b7e0: 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  n"]..        }..
b7f0: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
b800: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
b810: 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
b820: 65 6e 67 74 68 20 24 6e 65 77 46 69 6c 65 4e 61  ength $newFileNa
b830: 6d 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  me] > 0} then {.
b840: 0a 20 20 20 20 20 20 20 20 73 65 74 20 74 61 72  .        set tar
b850: 67 65 74 46 69 6c 65 4e 61 6d 65 20 5b 67 65 74  getFileName [get
b860: 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20 5c 0d  BuildFileName \.
b870: 0a 20 20 20 20 20 20 20 20 20 20 20 20 24 6e 65  .            $ne
b880: 77 46 69 6c 65 4e 61 6d 65 20 24 6d 61 6e 61 67  wFileName $manag
b890: 65 64 4f 6e 6c 79 20 24 70 6c 61 74 66 6f 72 6d  edOnly $platform
b8a0: 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  ]..      } else 
b8b0: 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 74  {..        set t
b8c0: 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 20 5b 67  argetFileName [g
b8d0: 65 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20  etBuildFileName 
b8e0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 24  \..            $
b8f0: 66 69 6c 65 4e 61 6d 65 20 24 6d 61 6e 61 67 65  fileName $manage
b900: 64 4f 6e 6c 79 20 24 70 6c 61 74 66 6f 72 6d 5d  dOnly $platform]
b910: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
b920: 20 20 20 73 65 74 20 74 61 72 67 65 74 44 69 72     set targetDir
b930: 65 63 74 6f 72 79 20 5b 66 69 6c 65 20 64 69 72  ectory [file dir
b940: 6e 61 6d 65 20 24 74 61 72 67 65 74 46 69 6c 65  name $targetFile
b950: 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 69  Name]....      i
b960: 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  f {[catch {..   
b970: 20 20 20 20 20 69 66 20 7b 21 5b 66 69 6c 65 20       if {![file 
b980: 65 78 69 73 74 73 20 24 74 61 72 67 65 74 44 69  exists $targetDi
b990: 72 65 63 74 6f 72 79 5d 7d 20 74 68 65 6e 20 7b  rectory]} then {
b9a0: 0d 0a 20 20 20 20 20 20 20 20 20 20 66 69 6c 65  ..          file
b9b0: 20 6d 6b 64 69 72 20 24 74 61 72 67 65 74 44 69   mkdir $targetDi
b9c0: 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 20  rectory..       
b9d0: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 66 69   }....        fi
b9e0: 6c 65 20 63 6f 70 79 20 2d 66 6f 72 63 65 20 24  le copy -force $
b9f0: 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 24  sourceFileName $
ba00: 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 0d 0a  targetFileName..
ba10: 20 20 20 20 20 20 7d 5d 20 3d 3d 20 30 7d 20 74        }] == 0} t
ba20: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74  hen {..        t
ba30: 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
ba40: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
ba50: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
ba60: 22 2d 2d 2d 2d 20 63 6f 70 69 65 64 20 62 69 6e  "---- copied bin
ba70: 61 72 79 20 66 69 6c 65 20 66 72 6f 6d 20 5c 22  ary file from \"
ba80: 22 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d  " $sourceFileNam
ba90: 65 20 22 5c 22 20 74 6f 20 5c 22 22 20 5c 0d 0a  e "\" to \"" \..
baa0: 20 20 20 20 20 20 20 20 20 20 20 20 24 74 61 72              $tar
bab0: 67 65 74 46 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e  getFileName \"\n
bac0: 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  ]..      } else 
bad0: 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  {..        tputs
bae0: 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
baf0: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
bb00: 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
bb10: 2d 20 66 61 69 6c 65 64 20 74 6f 20 63 6f 70 79  - failed to copy
bb20: 20 62 69 6e 61 72 79 20 66 69 6c 65 20 66 72 6f   binary file fro
bb30: 6d 20 5c 22 22 20 24 73 6f 75 72 63 65 46 69 6c  m \"" $sourceFil
bb40: 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20  eName \..       
bb50: 20 20 20 20 20 22 5c 22 20 74 6f 20 5c 22 22 20       "\" to \"" 
bb60: 24 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 20  $targetFileName 
bb70: 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a  \"\n]..      }..
bb80: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
bb90: 6f 63 20 74 72 79 43 6f 70 79 42 75 69 6c 64 46  oc tryCopyBuildF
bba0: 69 6c 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  ile {..         
bbb0: 20 20 20 66 69 6c 65 4e 61 6d 65 20 6d 61 6e 61     fileName mana
bbc0: 67 65 64 4f 6e 6c 79 20 7b 70 6c 61 74 66 6f 72  gedOnly {platfor
bbd0: 6d 20 22 22 7d 20 7b 6e 65 77 46 69 6c 65 4e 61  m ""} {newFileNa
bbe0: 6d 65 20 22 22 7d 0d 0a 20 20 20 20 20 20 20 20  me ""}..        
bbf0: 20 20 20 20 7b 76 65 72 62 6f 73 65 20 74 72 75      {verbose tru
bc00: 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65  e} } {..      se
bc10: 74 20 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65  t sourceFileName
bc20: 20 5b 67 65 74 42 75 69 6c 64 46 69 6c 65 4e 61   [getBuildFileNa
bc30: 6d 65 20 24 66 69 6c 65 4e 61 6d 65 20 24 6d 61  me $fileName $ma
bc40: 6e 61 67 65 64 4f 6e 6c 79 20 24 70 6c 61 74 66  nagedOnly $platf
bc50: 6f 72 6d 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66  orm]....      if
bc60: 20 7b 21 5b 66 69 6c 65 20 65 78 69 73 74 73 20   {![file exists 
bc70: 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 5d  $sourceFileName]
bc80: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
bc90: 20 20 69 66 20 7b 24 76 65 72 62 6f 73 65 7d 20    if {$verbose} 
bca0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
bcb0: 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
bcc0: 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
bcd0: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
bce0: 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6b 69 70 70       "---- skipp
bcf0: 65 64 20 63 6f 70 79 69 6e 67 20 62 75 69 6c 64  ed copying build
bd00: 20 66 69 6c 65 20 5c 22 22 20 24 73 6f 75 72 63   file \"" $sourc
bd10: 65 46 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20  eFileName \..   
bd20: 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c 20             "\", 
bd30: 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  it does not exis
bd40: 74 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d  t\n"]..        }
bd50: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75  ....        retu
bd60: 72 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  rn..      }.... 
bd70: 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
bd80: 20 6c 65 6e 67 74 68 20 24 6e 65 77 46 69 6c 65   length $newFile
bd90: 4e 61 6d 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20  Name] > 0} then 
bda0: 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 74  {..        set t
bdb0: 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 20 5b 67  argetFileName [g
bdc0: 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65  etBinaryFileName
bdd0: 20 24 6e 65 77 46 69 6c 65 4e 61 6d 65 20 24 70   $newFileName $p
bde0: 6c 61 74 66 6f 72 6d 5d 0d 0a 20 20 20 20 20 20  latform]..      
bdf0: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
be00: 20 20 73 65 74 20 74 61 72 67 65 74 46 69 6c 65    set targetFile
be10: 4e 61 6d 65 20 5b 67 65 74 42 69 6e 61 72 79 46  Name [getBinaryF
be20: 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d  ileName $fileNam
be30: 65 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a 20 20  e $platform]..  
be40: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 73      }....      s
be50: 65 74 20 74 61 72 67 65 74 44 69 72 65 63 74 6f  et targetDirecto
be60: 72 79 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65  ry [file dirname
be70: 20 24 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65   $targetFileName
be80: 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  ]....      if {[
be90: 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
bea0: 20 69 66 20 7b 21 5b 66 69 6c 65 20 65 78 69 73   if {![file exis
beb0: 74 73 20 24 74 61 72 67 65 74 44 69 72 65 63 74  ts $targetDirect
bec0: 6f 72 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ory]} then {..  
bed0: 20 20 20 20 20 20 20 20 66 69 6c 65 20 6d 6b 64          file mkd
bee0: 69 72 20 24 74 61 72 67 65 74 44 69 72 65 63 74  ir $targetDirect
bef0: 6f 72 79 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  ory..        }..
bf00: 0d 0a 20 20 20 20 20 20 20 20 66 69 6c 65 20 63  ..        file c
bf10: 6f 70 79 20 2d 66 6f 72 63 65 20 24 73 6f 75 72  opy -force $sour
bf20: 63 65 46 69 6c 65 4e 61 6d 65 20 24 74 61 72 67  ceFileName $targ
bf30: 65 74 46 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20  etFileName..    
bf40: 20 20 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20    }] == 0} then 
bf50: 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  {..        tputs
bf60: 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
bf70: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
bf80: 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
bf90: 2d 20 63 6f 70 69 65 64 20 62 75 69 6c 64 20 66  - copied build f
bfa0: 69 6c 65 20 66 72 6f 6d 20 5c 22 22 20 24 73 6f  ile from \"" $so
bfb0: 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 22 5c 22  urceFileName "\"
bfc0: 20 74 6f 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20   to \"" \..     
bfd0: 20 20 20 20 20 20 20 24 74 61 72 67 65 74 46 69         $targetFi
bfe0: 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20  leName \"\n]..  
bff0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
c000: 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
c010: 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
c020: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
c030: 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 61 69         "---- fai
c040: 6c 65 64 20 74 6f 20 63 6f 70 79 20 62 75 69 6c  led to copy buil
c050: 64 20 66 69 6c 65 20 66 72 6f 6d 20 5c 22 22 20  d file from \"" 
c060: 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20  $sourceFileName 
c070: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  \..            "
c080: 5c 22 20 74 6f 20 5c 22 22 20 24 74 61 72 67 65  \" to \"" $targe
c090: 74 46 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d  tFileName \"\n].
c0a0: 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
c0b0: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 74 72 79  ....    proc try
c0c0: 44 65 6c 65 74 65 42 69 6e 61 72 79 46 69 6c 65  DeleteBinaryFile
c0d0: 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7b 70 6c 61   { fileName {pla
c0e0: 74 66 6f 72 6d 20 22 22 7d 20 7b 76 65 72 62 6f  tform ""} {verbo
c0f0: 73 65 20 74 72 75 65 7d 20 7d 20 7b 0d 0a 20 20  se true} } {..  
c100: 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65      set fileName
c110: 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e   [getBinaryFileN
c120: 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 20 24 70  ame $fileName $p
c130: 6c 61 74 66 6f 72 6d 5d 0d 0a 0d 0a 20 20 20 20  latform]....    
c140: 20 20 69 66 20 7b 21 5b 66 69 6c 65 20 65 78 69    if {![file exi
c150: 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20  sts $fileName]} 
c160: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
c170: 69 66 20 7b 24 76 65 72 62 6f 73 65 7d 20 74 68  if {$verbose} th
c180: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
c190: 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
c1a0: 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
c1b0: 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
c1c0: 20 20 20 22 2d 2d 2d 2d 20 73 6b 69 70 70 65 64     "---- skipped
c1d0: 20 64 65 6c 65 74 69 6e 67 20 62 69 6e 61 72 79   deleting binary
c1e0: 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e   file \"" $fileN
c1f0: 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ame \..         
c200: 20 20 20 20 20 22 5c 22 2c 20 69 74 20 64 6f 65       "\", it doe
c210: 73 20 6e 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d  s not exist\n"].
c220: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
c230: 20 20 20 20 20 20 72 65 74 75 72 6e 0d 0a 20 20        return..  
c240: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69      }....      i
c250: 66 20 7b 5b 63 61 74 63 68 20 7b 66 69 6c 65 20  f {[catch {file 
c260: 64 65 6c 65 74 65 20 24 66 69 6c 65 4e 61 6d 65  delete $fileName
c270: 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  }] == 0} then {.
c280: 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
c290: 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
c2a0: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
c2b0: 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
c2c0: 64 65 6c 65 74 65 64 20 62 69 6e 61 72 79 20 66  deleted binary f
c2d0: 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d  ile \"" $fileNam
c2e0: 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d  e \"\n]..      }
c2f0: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
c300: 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
c310: 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
c320: 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
c330: 20 20 22 2d 2d 2d 2d 20 66 61 69 6c 65 64 20 74    "---- failed t
c340: 6f 20 64 65 6c 65 74 65 20 62 69 6e 61 72 79 20  o delete binary 
c350: 66 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e 61  file \"" $fileNa
c360: 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20  me \"\n]..      
c370: 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
c380: 20 70 72 6f 63 20 74 72 79 44 65 6c 65 74 65 42   proc tryDeleteB
c390: 75 69 6c 64 46 69 6c 65 20 7b 0d 0a 20 20 20 20  uildFile {..    
c3a0: 20 20 20 20 20 20 20 20 66 69 6c 65 4e 61 6d 65          fileName
c3b0: 20 6d 61 6e 61 67 65 64 4f 6e 6c 79 20 7b 70 6c   managedOnly {pl
c3c0: 61 74 66 6f 72 6d 20 22 22 7d 20 7b 76 65 72 62  atform ""} {verb
c3d0: 6f 73 65 20 74 72 75 65 7d 20 7d 20 7b 0d 0a 20  ose true} } {.. 
c3e0: 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d       set fileNam
c3f0: 65 20 5b 67 65 74 42 75 69 6c 64 46 69 6c 65 4e  e [getBuildFileN
c400: 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 20 24 6d  ame $fileName $m
c410: 61 6e 61 67 65 64 4f 6e 6c 79 20 24 70 6c 61 74  anagedOnly $plat
c420: 66 6f 72 6d 5d 0d 0a 0d 0a 20 20 20 20 20 20 69  form]....      i
c430: 66 20 7b 21 5b 66 69 6c 65 20 65 78 69 73 74 73  f {![file exists
c440: 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65   $fileName]} the
c450: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20  n {..        if 
c460: 7b 24 76 65 72 62 6f 73 65 7d 20 74 68 65 6e 20  {$verbose} then 
c470: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75  {..          tpu
c480: 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
c490: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
c4a0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
c4b0: 22 2d 2d 2d 2d 20 73 6b 69 70 70 65 64 20 64 65  "---- skipped de
c4c0: 6c 65 74 69 6e 67 20 62 75 69 6c 64 20 66 69 6c  leting build fil
c4d0: 65 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 20  e \"" $fileName 
c4e0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
c4f0: 20 22 5c 22 2c 20 69 74 20 64 6f 65 73 20 6e 6f   "\", it does no
c500: 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a 20 20 20  t exist\n"]..   
c510: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
c520: 20 20 72 65 74 75 72 6e 0d 0a 20 20 20 20 20 20    return..      
c530: 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  }....      if {[
c540: 63 61 74 63 68 20 7b 66 69 6c 65 20 64 65 6c 65  catch {file dele
c550: 74 65 20 24 66 69 6c 65 4e 61 6d 65 7d 5d 20 3d  te $fileName}] =
c560: 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
c570: 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
c580: 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
c590: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
c5a0: 20 20 20 20 20 20 22 2d 2d 2d 2d 20 64 65 6c 65        "---- dele
c5b0: 74 65 64 20 62 75 69 6c 64 20 66 69 6c 65 20 5c  ted build file \
c5c0: 22 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c 22 5c  "" $fileName \"\
c5d0: 6e 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  n]..      } else
c5e0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   {..        tput
c5f0: 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
c600: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
c610: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d  .            "--
c620: 2d 2d 20 66 61 69 6c 65 64 20 74 6f 20 64 65 6c  -- failed to del
c630: 65 74 65 20 62 75 69 6c 64 20 66 69 6c 65 20 5c  ete build file \
c640: 22 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c 22 5c  "" $fileName \"\
c650: 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  n]..      }..   
c660: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
c670: 74 72 79 43 6f 70 79 41 73 73 65 6d 62 6c 79 20  tryCopyAssembly 
c680: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  {..            f
c690: 69 6c 65 4e 61 6d 65 20 6d 61 6e 61 67 65 64 4f  ileName managedO
c6a0: 6e 6c 79 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22  nly {platform ""
c6b0: 7d 20 7b 70 64 62 20 74 72 75 65 7d 20 7b 76 65  } {pdb true} {ve
c6c0: 72 62 6f 73 65 20 74 72 75 65 7d 20 7d 20 7b 0d  rbose true} } {.
c6d0: 0a 20 20 20 20 20 20 74 72 79 43 6f 70 79 42 75  .      tryCopyBu
c6e0: 69 6c 64 46 69 6c 65 20 24 66 69 6c 65 4e 61 6d  ildFile $fileNam
c6f0: 65 20 24 6d 61 6e 61 67 65 64 4f 6e 6c 79 20 24  e $managedOnly $
c700: 70 6c 61 74 66 6f 72 6d 20 22 22 20 24 76 65 72  platform "" $ver
c710: 62 6f 73 65 0d 0a 0d 0a 20 20 20 20 20 20 69 66  bose....      if
c720: 20 7b 24 70 64 62 7d 20 74 68 65 6e 20 7b 0d 0a   {$pdb} then {..
c730: 20 20 20 20 20 20 20 20 74 72 79 43 6f 70 79 42          tryCopyB
c740: 75 69 6c 64 46 69 6c 65 20 5b 61 70 70 65 6e 64  uildFile [append
c750: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
c760: 20 20 20 20 5b 66 69 6c 65 20 72 6f 6f 74 6e 61      [file rootna
c770: 6d 65 20 24 66 69 6c 65 4e 61 6d 65 5d 20 2e 70  me $fileName] .p
c780: 64 62 5d 20 24 6d 61 6e 61 67 65 64 4f 6e 6c 79  db] $managedOnly
c790: 20 24 70 6c 61 74 66 6f 72 6d 20 22 22 20 24 76   $platform "" $v
c7a0: 65 72 62 6f 73 65 0d 0a 20 20 20 20 20 20 7d 0d  erbose..      }.
c7b0: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
c7c0: 72 6f 63 20 74 72 79 44 65 6c 65 74 65 41 73 73  roc tryDeleteAss
c7d0: 65 6d 62 6c 79 20 7b 0d 0a 20 20 20 20 20 20 20  embly {..       
c7e0: 20 20 20 20 20 66 69 6c 65 4e 61 6d 65 20 7b 70       fileName {p
c7f0: 6c 61 74 66 6f 72 6d 20 22 22 7d 20 7b 70 64 62  latform ""} {pdb
c800: 20 74 72 75 65 7d 20 7b 76 65 72 62 6f 73 65 20   true} {verbose 
c810: 74 72 75 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  true} } {..     
c820: 20 74 72 79 44 65 6c 65 74 65 42 69 6e 61 72 79   tryDeleteBinary
c830: 46 69 6c 65 20 24 66 69 6c 65 4e 61 6d 65 20 24  File $fileName $
c840: 70 6c 61 74 66 6f 72 6d 20 24 76 65 72 62 6f 73  platform $verbos
c850: 65 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 24  e....      if {$
c860: 70 64 62 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  pdb} then {..   
c870: 20 20 20 20 20 74 72 79 44 65 6c 65 74 65 42 69       tryDeleteBi
c880: 6e 61 72 79 46 69 6c 65 20 5b 61 70 70 65 6e 64  naryFile [append
c890: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
c8a0: 20 20 20 20 5b 66 69 6c 65 20 72 6f 6f 74 6e 61      [file rootna
c8b0: 6d 65 20 24 66 69 6c 65 4e 61 6d 65 5d 20 2e 70  me $fileName] .p
c8c0: 64 62 5d 20 24 70 6c 61 74 66 6f 72 6d 20 24 76  db] $platform $v
c8d0: 65 72 62 6f 73 65 0d 0a 20 20 20 20 20 20 7d 0d  erbose..      }.
c8e0: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
c8f0: 72 6f 63 20 74 72 79 4c 6f 61 64 41 73 73 65 6d  roc tryLoadAssem
c900: 62 6c 79 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7b  bly { fileName {
c910: 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20 7d 20 7b  platform ""} } {
c920: 0d 0a 20 20 20 20 20 20 73 65 74 20 66 69 6c 65  ..      set file
c930: 4e 61 6d 65 20 5b 67 65 74 42 69 6e 61 72 79 46  Name [getBinaryF
c940: 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d  ileName $fileNam
c950: 65 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a 0d 0a  e $platform]....
c960: 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
c970: 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   {..        set 
c980: 61 73 73 65 6d 62 6c 79 20 5b 6f 62 6a 65 63 74  assembly [object
c990: 20 6c 6f 61 64 20 2d 6c 6f 61 64 74 79 70 65 20   load -loadtype 
c9a0: 46 69 6c 65 20 2d 61 6c 69 61 73 20 24 66 69 6c  File -alias $fil
c9b0: 65 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20 7d 5d  eName]..      }]
c9c0: 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
c9d0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
c9e0: 20 20 23 20 4e 4f 54 45 3a 20 4e 6f 77 2c 20 61    # NOTE: Now, a
c9f0: 64 64 20 74 68 65 20 6e 65 63 65 73 73 61 72 79  dd the necessary
ca00: 20 74 65 73 74 20 63 6f 6e 73 74 72 61 69 6e 74   test constraint
ca10: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
ca20: 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61        addConstra
ca30: 69 6e 74 20 5b 66 69 6c 65 20 72 6f 6f 74 6e 61  int [file rootna
ca40: 6d 65 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66  me [file tail $f
ca50: 69 6c 65 4e 61 6d 65 5d 5d 0d 0a 0d 0a 20 20 20  ileName]]....   
ca60: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
ca70: 23 20 4e 4f 54 45 3a 20 47 72 61 62 20 74 68 65  # NOTE: Grab the
ca80: 20 69 6d 61 67 65 20 72 75 6e 74 69 6d 65 20 76   image runtime v
ca90: 65 72 73 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20  ersion from the 
caa0: 61 73 73 65 6d 62 6c 79 20 62 65 63 61 75 73 65  assembly because
cab0: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
cac0: 20 20 73 65 76 65 72 61 6c 20 74 65 73 74 73 20    several tests 
cad0: 72 65 6c 79 20 6f 6e 20 69 74 20 68 61 76 69 6e  rely on it havin
cae0: 67 20 61 20 63 65 72 74 61 69 6e 20 76 61 6c 75  g a certain valu
caf0: 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  e...        #.. 
cb00: 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72         addConstr
cb10: 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
cb20: 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69 6c   [file tail $fil
cb30: 65 4e 61 6d 65 5d 20 5f 20 5c 0d 0a 20 20 20 20  eName] _ \..    
cb40: 20 20 20 20 20 20 20 20 5b 24 61 73 73 65 6d 62          [$assemb
cb50: 6c 79 20 49 6d 61 67 65 52 75 6e 74 69 6d 65 56  ly ImageRuntimeV
cb60: 65 72 73 69 6f 6e 5d 5d 0d 0a 0d 0a 20 20 20 20  ersion]]....    
cb70: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
cb80: 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e 20 74 68   NOTE: Return th
cb90: 65 20 66 75 6c 6c 20 70 61 74 68 20 6f 66 20 74  e full path of t
cba0: 68 65 20 6c 6f 61 64 65 64 20 66 69 6c 65 2e 0d  he loaded file..
cbb0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
cbc0: 20 20 20 20 72 65 74 75 72 6e 20 24 66 69 6c 65      return $file
cbd0: 4e 61 6d 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  Name..      }...
cbe0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 22 22  .      return ""
cbf0: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
cc00: 70 72 6f 63 20 69 73 53 51 4c 69 74 65 52 65 61  proc isSQLiteRea
cc10: 64 79 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23  dy {} {..      #
cc20: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
cc30: 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 6d  This procedure m
cc40: 75 73 74 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a  ust return non-z
cc50: 65 72 6f 20 6f 6e 6c 79 20 69 66 20 74 68 65 20  ero only if the 
cc60: 53 51 4c 69 74 65 20 6e 61 74 69 76 65 0d 0a 20  SQLite native.. 
cc70: 20 20 20 20 20 23 20 20 20 20 20 20 20 6c 69 62       #       lib
cc80: 72 61 72 79 20 61 6e 64 20 74 68 65 20 53 79 73  rary and the Sys
cc90: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20  tem.Data.SQLite 
cca0: 6d 61 6e 61 67 65 64 20 61 73 73 65 6d 62 6c 79  managed assembly
ccb0: 20 61 72 65 20 6c 6f 61 64 65 64 0d 0a 20 20 20   are loaded..   
ccc0: 20 20 20 23 20 20 20 20 20 20 20 61 6e 64 20 72     #       and r
ccd0: 65 61 64 79 20 66 6f 72 20 75 73 65 20 62 79 20  eady for use by 
cce0: 74 68 65 20 74 65 73 74 20 73 75 69 74 65 2e 20  the test suite. 
ccf0: 20 43 75 72 72 65 6e 74 6c 79 2c 20 74 68 69 73   Currently, this
cd00: 20 70 72 6f 63 65 64 75 72 65 0d 0a 20 20 20 20   procedure..    
cd10: 20 20 23 20 20 20 20 20 20 20 73 68 6f 75 6c 64    #       should
cd20: 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 6c 79 20   be called only 
cd30: 61 66 74 65 72 20 74 68 65 20 5b 74 72 79 4c 6f  after the [tryLo
cd40: 61 64 41 73 73 65 6d 62 6c 79 5d 20 70 72 6f 63  adAssembly] proc
cd50: 65 64 75 72 65 20 68 61 73 0d 0a 20 20 20 20 20  edure has..     
cd60: 20 23 20 20 20 20 20 20 20 62 65 65 6e 20 63 61   #       been ca
cd70: 6c 6c 65 64 20 74 6f 20 70 72 6f 62 65 20 66 6f  lled to probe fo
cd80: 72 20 74 68 65 20 53 79 73 74 65 6d 2e 44 61 74  r the System.Dat
cd90: 61 2e 53 51 4c 69 74 65 20 6d 61 6e 61 67 65 64  a.SQLite managed
cda0: 20 61 73 73 65 6d 62 6c 79 0d 0a 20 20 20 20 20   assembly..     
cdb0: 20 23 20 20 20 20 20 20 20 61 6e 64 20 74 68 65   #       and the
cdc0: 20 5b 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65   [checkForSQLite
cdd0: 5d 20 70 72 6f 63 65 64 75 72 65 20 68 61 73 20  ] procedure has 
cde0: 62 65 65 6e 20 63 61 6c 6c 65 64 20 74 6f 20 70  been called to p
cdf0: 72 6f 62 65 20 66 6f 72 0d 0a 20 20 20 20 20 20  robe for..      
ce00: 23 20 20 20 20 20 20 20 74 68 65 20 53 51 4c 69  #       the SQLi
ce10: 74 65 20 6e 61 74 69 76 65 20 6c 69 62 72 61 72  te native librar
ce20: 79 3b 20 6f 74 68 65 72 77 69 73 65 2c 20 74 68  y; otherwise, th
ce30: 69 73 20 70 72 6f 63 65 64 75 72 65 20 77 69 6c  is procedure wil
ce40: 6c 20 73 69 6d 70 6c 79 0d 0a 20 20 20 20 20 20  l simply..      
ce50: 23 20 20 20 20 20 20 20 61 6c 77 61 79 73 20 72  #       always r
ce60: 65 74 75 72 6e 20 7a 65 72 6f 2e 0d 0a 20 20 20  eturn zero...   
ce70: 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75     #..      retu
ce80: 72 6e 20 5b 65 78 70 72 20 7b 0d 0a 20 20 20 20  rn [expr {..    
ce90: 20 20 20 20 5b 68 61 76 65 43 6f 6e 73 74 72 61      [haveConstra
cea0: 69 6e 74 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  int System.Data.
ceb0: 53 51 4c 69 74 65 5d 20 26 26 20 5b 68 61 76 65  SQLite] && [have
cec0: 43 6f 6e 73 74 72 61 69 6e 74 20 53 51 4c 69 74  Constraint SQLit
ced0: 65 5d 0d 0a 20 20 20 20 20 20 7d 5d 0d 0a 20 20  e]..      }]..  
cee0: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
cef0: 20 6d 61 74 63 68 50 6c 61 74 66 6f 72 6d 20 7b   matchPlatform {
cf00: 20 70 6c 61 74 66 6f 72 6d 20 7d 20 7b 0d 0a 20   platform } {.. 
cf10: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
cf20: 4e 4f 54 45 3a 20 41 6e 20 65 6d 70 74 79 20 73  NOTE: An empty s
cf30: 74 72 69 6e 67 20 66 6f 72 20 74 68 65 20 70 6c  tring for the pl
cf40: 61 74 66 6f 72 6d 20 6d 65 61 6e 73 20 74 68 61  atform means tha
cf50: 74 20 74 68 65 20 62 75 69 6c 64 20 69 73 20 6e  t the build is n
cf60: 6f 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ot..      #     
cf70: 20 20 5b 70 72 69 6d 61 72 69 6c 79 5d 20 61 20    [primarily] a 
cf80: 6e 61 74 69 76 65 20 62 75 69 6c 64 3b 20 74 68  native build; th
cf90: 65 72 65 66 6f 72 65 2c 20 69 74 20 61 6c 77 61  erefore, it alwa
cfa0: 79 73 20 6d 61 74 63 68 65 73 2e 0d 0a 20 20 20  ys matches...   
cfb0: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
cfc0: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
cfd0: 70 6c 61 74 66 6f 72 6d 5d 20 3d 3d 20 30 7d 20  platform] == 0} 
cfe0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
cff0: 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20  return true..   
d000: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
d010: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49  .      # NOTE: I
d020: 66 20 74 68 65 20 6d 61 63 68 69 6e 65 20 6e 61  f the machine na
d030: 6d 65 20 69 73 20 75 6e 61 76 61 69 6c 61 62 6c  me is unavailabl
d040: 65 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 74 68  e, there is noth
d050: 69 67 6e 20 65 6c 73 65 20 77 65 0d 0a 20 20 20  ign else we..   
d060: 20 20 20 23 20 20 20 20 20 20 20 63 61 6e 20 64     #       can d
d070: 6f 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  o...      #..   
d080: 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
d090: 69 73 74 73 20 3a 3a 74 63 6c 5f 70 6c 61 74 66  ists ::tcl_platf
d0a0: 6f 72 6d 28 6d 61 63 68 69 6e 65 29 5d 7d 20 74  orm(machine)]} t
d0b0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72  hen {..        r
d0c0: 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20  eturn false..   
d0d0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
d0e0: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 44  .      # NOTE: D
d0f0: 6f 65 73 20 74 68 65 20 73 70 65 63 69 66 69 65  oes the specifie
d100: 64 20 70 6c 61 74 66 6f 72 6d 20 6d 61 74 63 68  d platform match
d110: 20 75 70 20 74 6f 20 74 68 65 20 63 75 72 72 65   up to the curre
d120: 6e 74 20 70 72 6f 63 65 73 73 3f 0d 0a 20 20 20  nt process?..   
d130: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
d140: 24 70 6c 61 74 66 6f 72 6d 20 65 71 20 5b 6d 61  $platform eq [ma
d150: 63 68 69 6e 65 54 6f 50 6c 61 74 66 6f 72 6d 20  chineToPlatform 
d160: 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28  $::tcl_platform(
d170: 6d 61 63 68 69 6e 65 29 5d 7d 20 74 68 65 6e 20  machine)]} then 
d180: 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  {..        retur
d190: 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20 7d 0d  n true..      }.
d1a0: 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
d1b0: 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 73 70    # NOTE: The sp
d1c0: 65 63 69 66 69 65 64 20 70 6c 61 74 66 6f 72 6d  ecified platform
d1d0: 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20   does not match 
d1e0: 75 70 20 77 69 74 68 20 74 68 65 20 70 6c 61 74  up with the plat
d1f0: 66 6f 72 6d 0d 0a 20 20 20 20 20 20 23 20 20 20  form..      #   
d200: 20 20 20 20 66 6f 72 20 74 68 65 20 63 75 72 72      for the curr
d210: 65 6e 74 20 70 72 6f 63 65 73 73 2e 0d 0a 20 20  ent process...  
d220: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74      #..      ret
d230: 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20 7d  urn false..    }
d240: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 68 61  .....    proc ha
d250: 76 65 53 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f  veSQLiteObjectCo
d260: 6d 6d 61 6e 64 20 7b 7d 20 7b 0d 0a 20 20 20 20  mmand {} {..    
d270: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
d280: 45 3a 20 49 73 20 74 68 65 20 5b 6f 62 6a 65 63  E: Is the [objec
d290: 74 5d 20 63 6f 6d 6d 61 6e 64 20 63 75 72 72 65  t] command curre
d2a0: 6e 74 6c 79 20 61 76 61 69 6c 61 62 6c 65 3f 0d  ntly available?.
d2b0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
d2c0: 72 65 74 75 72 6e 20 5b 65 78 70 72 20 7b 5b 6c  return [expr {[l
d2d0: 6c 65 6e 67 74 68 20 5b 69 6e 66 6f 20 63 6f 6d  length [info com
d2e0: 6d 61 6e 64 73 20 6f 62 6a 65 63 74 5d 5d 20 3e  mands object]] >
d2f0: 20 30 7d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a   0}]..    }.....
d300: 20 20 20 20 70 72 6f 63 20 63 68 65 63 6b 46 6f      proc checkFo
d310: 72 53 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d  rSQLiteObjectCom
d320: 6d 61 6e 64 20 7b 20 63 68 61 6e 6e 65 6c 20 7d  mand { channel }
d330: 20 7b 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20   {..      tputs 
d340: 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63  $channel "---- c
d350: 68 65 63 6b 69 6e 67 20 66 6f 72 20 5c 22 6f 62  hecking for \"ob
d360: 6a 65 63 74 5c 22 20 63 6f 6d 6d 61 6e 64 20 75  ject\" command u
d370: 73 61 67 65 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20  sage... "....   
d380: 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
d390: 69 73 74 73 20 3a 3a 6e 6f 28 73 71 6c 69 74 65  ists ::no(sqlite
d3a0: 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 29 5d 20  ObjectCommand)] 
d3b0: 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
d3c0: 5b 68 61 76 65 53 51 4c 69 74 65 4f 62 6a 65 63  [haveSQLiteObjec
d3d0: 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65 6e 20  tCommand]} then 
d3e0: 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  {..        tputs
d3f0: 20 24 63 68 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d   $channel yes\n.
d400: 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
d410: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
d420: 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 6e 6c 65      # NOTE: Unle
d430: 73 73 20 77 65 20 61 72 65 20 66 6f 72 62 69 64  ss we are forbid
d440: 64 65 6e 20 66 72 6f 6d 20 64 6f 69 6e 67 20 73  den from doing s
d450: 6f 2c 20 61 64 64 20 73 6f 6d 65 20 63 6f 6e 73  o, add some cons
d460: 74 72 61 69 6e 74 73 0d 0a 20 20 20 20 20 20 20  traints..       
d470: 20 23 20 20 20 20 20 20 20 74 68 61 74 20 77 69   #       that wi
d480: 6c 6c 20 61 6c 6c 6f 77 20 6d 6f 73 74 20 6f 66  ll allow most of
d490: 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65 20   the test suite 
d4a0: 74 6f 20 72 75 6e 20 28 69 2e 65 2e 20 74 68 6f  to run (i.e. tho
d4b0: 73 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  se..        #   
d4c0: 20 20 20 20 74 65 73 74 73 20 74 68 61 74 20 64      tests that d
d4d0: 6f 20 6e 6f 74 20 64 69 72 65 63 74 6c 79 20 72  o not directly r
d4e0: 65 6c 79 20 75 70 6f 6e 20 74 68 65 20 5b 6f 62  ely upon the [ob
d4f0: 6a 65 63 74 5d 20 63 6f 6d 6d 61 6e 64 29 2e 0d  ject] command)..
d500: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
d510: 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
d520: 78 69 73 74 73 20 3a 3a 6e 6f 28 73 68 69 6d 53  xists ::no(shimS
d530: 51 4c 69 74 65 41 73 73 65 6d 62 6c 79 43 6f 6e  QLiteAssemblyCon
d540: 73 74 72 61 69 6e 74 73 29 5d 7d 20 74 68 65 6e  straints)]} then
d550: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 61 64   {..          ad
d560: 64 43 6f 6e 73 74 72 61 69 6e 74 20 53 51 4c 69  dConstraint SQLi
d570: 74 65 0d 0a 20 20 20 20 20 20 20 20 20 20 61 64  te..          ad
d580: 64 43 6f 6e 73 74 72 61 69 6e 74 20 53 51 4c 69  dConstraint SQLi
d590: 74 65 49 6e 74 65 72 6f 70 0d 0a 20 20 20 20 20  teInterop..     
d5a0: 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
d5b0: 6e 74 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  nt System.Data.S
d5c0: 51 4c 69 74 65 0d 0a 20 20 20 20 20 20 20 20 20  QLite..         
d5d0: 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 53   addConstraint S
d5e0: 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
d5f0: 65 2e 45 6e 63 72 79 70 74 69 6f 6e 0d 0a 20 20  e.Encryption..  
d600: 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74          addConst
d610: 72 61 69 6e 74 20 53 79 73 74 65 6d 2e 44 61 74  raint System.Dat
d620: 61 2e 53 51 4c 69 74 65 2e 4c 69 6e 71 0d 0a 0d  a.SQLite.Linq...
d630: 0a 20 20 20 20 20 20 20 20 20 20 61 64 64 43 6f  .          addCo
d640: 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64  nstraint [append
d650: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
d660: 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74        System.Dat
d670: 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 5f 76 20 5b  a.SQLite.dll_v [
d680: 67 65 74 42 75 69 6c 64 43 6c 72 56 65 72 73 69  getBuildClrVersi
d690: 6f 6e 5d 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d  on]]..        }.
d6a0: 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21  ...        if {!
d6b0: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
d6c0: 6f 28 73 68 69 6d 53 51 4c 69 74 65 44 65 66 69  o(shimSQLiteDefi
d6d0: 6e 65 43 6f 6e 73 74 61 6e 74 43 6f 6e 73 74 72  neConstantConstr
d6e0: 61 69 6e 74 73 29 5d 7d 20 74 68 65 6e 20 7b 0d  aints)]} then {.
d6f0: 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61  .          forea
d700: 63 68 20 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e  ch defineConstan
d710: 74 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20  t [list \..     
d720: 20 20 20 20 20 20 20 20 20 49 4e 54 45 52 4f 50           INTEROP
d730: 5f 45 58 54 45 4e 53 49 4f 4e 5f 46 55 4e 43 54  _EXTENSION_FUNCT
d740: 49 4f 4e 53 20 49 4e 54 45 52 4f 50 5f 46 54 53  IONS INTEROP_FTS
d750: 35 5f 45 58 54 45 4e 53 49 4f 4e 20 5c 0d 0a 20  5_EXTENSION \.. 
d760: 20 20 20 20 20 20 20 20 20 20 20 20 20 49 4e 54               INT
d770: 45 52 4f 50 5f 4a 53 4f 4e 31 5f 45 58 54 45 4e  EROP_JSON1_EXTEN
d780: 53 49 4f 4e 20 49 4e 54 45 52 4f 50 5f 50 45 52  SION INTEROP_PER
d790: 43 45 4e 54 49 4c 45 5f 45 58 54 45 4e 53 49 4f  CENTILE_EXTENSIO
d7a0: 4e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  N \..           
d7b0: 20 20 20 49 4e 54 45 52 4f 50 5f 52 45 47 45 58     INTEROP_REGEX
d7c0: 50 5f 45 58 54 45 4e 53 49 4f 4e 20 49 4e 54 45  P_EXTENSION INTE
d7d0: 52 4f 50 5f 54 45 53 54 5f 45 58 54 45 4e 53 49  ROP_TEST_EXTENSI
d7e0: 4f 4e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ON \..          
d7f0: 20 20 20 20 49 4e 54 45 52 4f 50 5f 54 4f 54 59      INTEROP_TOTY
d800: 50 45 5f 45 58 54 45 4e 53 49 4f 4e 20 49 4e 54  PE_EXTENSION INT
d810: 45 52 4f 50 5f 56 49 52 54 55 41 4c 5f 54 41 42  EROP_VIRTUAL_TAB
d820: 4c 45 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  LE \..          
d830: 20 20 20 20 55 53 45 5f 49 4e 54 45 52 4f 50 5f      USE_INTEROP_
d840: 44 4c 4c 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20  DLL] {..        
d850: 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e      addConstrain
d860: 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  t [appendArgs \.
d870: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d880: 20 5b 67 65 74 53 51 4c 69 74 65 44 65 66 69 6e   [getSQLiteDefin
d890: 65 43 6f 6e 73 74 61 6e 74 50 72 65 66 69 78 5d  eConstantPrefix]
d8a0: 20 24 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74   $defineConstant
d8b0: 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ]..          }..
d8c0: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
d8d0: 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
d8e0: 65 78 69 73 74 73 20 3a 3a 6e 6f 28 73 68 69 6d  exists ::no(shim
d8f0: 53 51 4c 69 74 65 56 69 73 75 61 6c 53 74 75 64  SQLiteVisualStud
d900: 69 6f 43 6f 6e 73 74 72 61 69 6e 74 73 29 5d 7d  ioConstraints)]}
d910: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
d920: 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74     addConstraint
d930: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 76 69 73   [appendArgs vis
d940: 75 61 6c 53 74 75 64 69 6f 20 5b 67 65 74 42 75  ualStudio [getBu
d950: 69 6c 64 59 65 61 72 5d 5d 0d 0a 20 20 20 20 20  ildYear]]..     
d960: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
d970: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e  tputs $channel n
d980: 6f 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  o\n..      }..  
d990: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
d9a0: 20 63 68 61 6e 67 65 4e 61 74 69 76 65 52 75 6e   changeNativeRun
d9b0: 74 69 6d 65 4f 70 74 69 6f 6e 20 7b 20 6e 61 74  timeOption { nat
d9c0: 69 76 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20 69  ive } {..      i
d9d0: 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 5b 69 6e 66  f {[llength [inf
d9e0: 6f 20 63 6f 6d 6d 61 6e 64 73 20 64 65 62 75 67  o commands debug
d9f0: 5d 5d 20 3e 20 30 20 26 26 20 5c 0d 0a 20 20 20  ]] > 0 && \..   
da00: 20 20 20 20 20 20 20 5b 6c 6c 65 6e 67 74 68 20         [llength 
da10: 5b 69 6e 66 6f 20 73 75 62 63 6f 6d 6d 61 6e 64  [info subcommand
da20: 73 20 64 65 62 75 67 20 72 75 6e 74 69 6d 65 6f  s debug runtimeo
da30: 70 74 69 6f 6e 5d 5d 20 3e 20 30 20 26 26 20 5b  ption]] > 0 && [
da40: 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
da50: 20 64 65 62 75 67 20 72 75 6e 74 69 6d 65 6f 70   debug runtimeop
da60: 74 69 6f 6e 20 5b 65 78 70 72 20 7b 24 6e 61 74  tion [expr {$nat
da70: 69 76 65 20 3f 20 22 61 64 64 22 20 3a 20 22 72  ive ? "add" : "r
da80: 65 6d 6f 76 65 22 7d 5d 20 6e 61 74 69 76 65 0d  emove"}] native.
da90: 0a 20 20 20 20 20 20 7d 5d 20 3d 3d 20 30 7d 20  .      }] == 0} 
daa0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
dab0: 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20  return true..   
dac0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66     }....      if
dad0: 20 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f 62 6a   {[haveSQLiteObj
dae0: 65 63 74 43 6f 6d 6d 61 6e 64 5d 20 26 26 20 5b  ectCommand] && [
daf0: 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
db00: 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 49   object invoke I
db10: 6e 74 65 72 70 72 65 74 65 72 2e 47 65 74 41 63  nterpreter.GetAc
db20: 74 69 76 65 20 5b 65 78 70 72 20 7b 24 6e 61 74  tive [expr {$nat
db30: 69 76 65 20 3f 20 5c 0d 0a 20 20 20 20 20 20 20  ive ? \..       
db40: 20 20 20 20 20 22 41 64 64 52 75 6e 74 69 6d 65       "AddRuntime
db50: 4f 70 74 69 6f 6e 22 20 3a 20 22 52 65 6d 6f 76  Option" : "Remov
db60: 65 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 22 7d  eRuntimeOption"}
db70: 5d 20 6e 61 74 69 76 65 0d 0a 20 20 20 20 20 20  ] native..      
db80: 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  }] == 0} then {.
db90: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
dba0: 74 72 75 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  true..      }...
dbb0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61  .      return fa
dbc0: 6c 73 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20  lse..    }..... 
dbd0: 20 20 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72     proc checkFor
dbe0: 53 51 4c 69 74 65 42 75 69 6c 64 73 20 7b 20 63  SQLiteBuilds { c
dbf0: 68 61 6e 6e 65 6c 20 7b 73 65 6c 65 63 74 20 66  hannel {select f
dc00: 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  alse} } {..     
dc10: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
dc20: 3a 20 43 68 65 63 6b 20 66 6f 72 20 65 76 65 72  : Check for ever
dc30: 79 20 70 6f 73 73 69 62 6c 65 20 76 61 6c 69 64  y possible valid
dc40: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20   combination of 
dc50: 76 61 6c 75 65 73 20 75 73 65 64 20 77 68 65 6e  values used when
dc60: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
dc70: 6c 6f 63 61 74 69 6e 67 20 6f 75 74 20 74 68 65  locating out the
dc80: 20 62 75 69 6c 64 20 6f 75 74 70 75 74 20 64 69   build output di
dc90: 72 65 63 74 6f 72 79 2c 20 73 68 6f 77 69 6e 67  rectory, showing
dca0: 20 65 61 63 68 20 61 76 61 69 6c 61 62 6c 65 0d   each available.
dcb0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62  .      #       b
dcc0: 75 69 6c 64 20 76 61 72 69 61 74 69 6f 6e 20 61  uild variation a
dcd0: 6c 6f 6e 67 20 74 68 65 20 77 61 79 2e 0d 0a 20  long the way... 
dce0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 66 6f       #..      fo
dcf0: 72 65 61 63 68 20 6e 61 74 69 76 65 20 5b 6c 69  reach native [li
dd00: 73 74 20 66 61 6c 73 65 20 74 72 75 65 5d 20 7b  st false true] {
dd10: 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63  ..        foreac
dd20: 68 20 79 65 61 72 20 5b 67 65 74 42 75 69 6c 64  h year [getBuild
dd30: 59 65 61 72 73 5d 20 7b 0d 0a 20 20 20 20 20 20  Years] {..      
dd40: 20 20 20 20 66 6f 72 65 61 63 68 20 63 6f 6e 66      foreach conf
dd50: 69 67 75 72 61 74 69 6f 6e 20 5b 67 65 74 42 75  iguration [getBu
dd60: 69 6c 64 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e  ildConfiguration
dd70: 73 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  s] {..          
dd80: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
dd90: 20 23 20 4e 4f 54 45 3a 20 46 69 67 75 72 65 20   # NOTE: Figure 
dda0: 6f 75 74 20 74 68 65 20 65 66 66 65 63 74 69 76  out the effectiv
ddb0: 65 20 62 75 69 6c 64 20 70 6c 61 74 66 6f 72 6d  e build platform
ddc0: 2e 20 20 54 68 69 73 20 69 73 0d 0a 20 20 20 20  .  This is..    
ddd0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
dde0: 62 61 73 65 64 20 6f 6e 20 77 68 65 74 68 65 72  based on whether
ddf0: 20 6f 72 20 6e 6f 74 20 61 20 5b 70 72 69 6d 61   or not a [prima
de00: 72 69 6c 79 5d 20 6e 61 74 69 76 65 20 62 75 69  rily] native bui
de10: 6c 64 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ld..            
de20: 23 20 20 20 20 20 20 20 69 73 20 62 65 69 6e 67  #       is being
de30: 20 75 73 65 64 2e 20 20 46 6f 72 20 5b 70 72 69   used.  For [pri
de40: 6d 61 72 69 6c 79 5d 20 6e 6f 6e 2d 6e 61 74 69  marily] non-nati
de50: 76 65 20 62 75 69 6c 64 73 2c 0d 0a 20 20 20 20  ve builds,..    
de60: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
de70: 74 68 69 73 20 77 69 6c 6c 20 62 65 20 61 6e 20  this will be an 
de80: 65 6d 70 74 79 20 73 74 72 69 6e 67 2e 0d 0a 20  empty string... 
de90: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
dea0: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 70 6c            set pl
deb0: 61 74 66 6f 72 6d 20 5b 67 65 74 42 75 69 6c 64  atform [getBuild
dec0: 50 6c 61 74 66 6f 72 6d 20 24 6e 61 74 69 76 65  Platform $native
ded0: 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ]....           
dee0: 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
def0: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
df00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
df10: 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f  ---- checking fo
df20: 72 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  r System.Data.SQ
df30: 4c 69 74 65 20 62 75 69 6c 64 20 5c 22 22 20 5b  Lite build \"" [
df40: 65 78 70 72 20 5c 0d 0a 20 20 20 20 20 20 20 20  expr \..        
df50: 20 20 20 20 20 20 20 20 7b 24 6e 61 74 69 76 65          {$native
df60: 20 3f 20 22 6e 61 74 69 76 65 2f 22 20 3a 20 22   ? "native/" : "
df70: 22 7d 5d 20 5b 65 78 70 72 20 7b 5b 73 74 72 69  "}] [expr {[stri
df80: 6e 67 20 6c 65 6e 67 74 68 20 5c 0d 0a 20 20 20  ng length \..   
df90: 20 20 20 20 20 20 20 20 20 20 20 20 20 24 70 6c               $pl
dfa0: 61 74 66 6f 72 6d 5d 20 3e 20 30 20 3f 20 5b 61  atform] > 0 ? [a
dfb0: 70 70 65 6e 64 41 72 67 73 20 24 70 6c 61 74 66  ppendArgs $platf
dfc0: 6f 72 6d 20 2f 5d 20 3a 20 22 22 7d 5d 20 24 79  orm /] : ""}] $y
dfd0: 65 61 72 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ear \..         
dfe0: 20 20 20 20 20 20 20 2f 20 24 63 6f 6e 66 69 67         / $config
dff0: 75 72 61 74 69 6f 6e 20 22 5c 22 2e 2e 2e 20 22  uration "\"... "
e000: 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ]....           
e010: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
e020: 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74 68  # NOTE: Build th
e030: 65 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65  e fully qualifie
e040: 64 20 64 69 72 65 63 74 6f 72 79 20 77 68 65 72  d directory wher
e050: 65 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 0d  e the necessary.
e060: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20  .            #  
e070: 20 20 20 20 20 63 6f 6d 70 6f 6e 65 6e 74 73 20       components 
e080: 66 6f 72 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  for System.Data.
e090: 53 51 4c 69 74 65 20 73 68 6f 75 6c 64 20 62 65  SQLite should be
e0a0: 20 66 6f 75 6e 64 2e 0d 0a 20 20 20 20 20 20 20   found...       
e0b0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
e0c0: 20 20 20 20 73 65 74 20 64 69 72 65 63 74 6f 72      set director
e0d0: 79 20 5b 6a 6f 69 6e 42 75 69 6c 64 44 69 72 65  y [joinBuildDire
e0e0: 63 74 6f 72 79 20 24 6e 61 74 69 76 65 20 5c 0d  ctory $native \.
e0f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e100: 20 5b 67 65 74 42 75 69 6c 64 42 61 73 65 44 69   [getBuildBaseDi
e110: 72 65 63 74 6f 72 79 5d 20 24 79 65 61 72 20 24  rectory] $year $
e120: 70 6c 61 74 66 6f 72 6d 20 24 63 6f 6e 66 69 67  platform $config
e130: 75 72 61 74 69 6f 6e 5d 0d 0a 0d 0a 20 20 20 20  uration]....    
e140: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
e150: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 44         # NOTE: D
e160: 6f 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20  o the necessary 
e170: 66 69 6c 65 73 20 65 78 69 73 74 3f 20 20 43 75  files exist?  Cu
e180: 72 72 65 6e 74 6c 79 2c 20 6e 6f 20 6f 74 68 65  rrently, no othe
e190: 72 20 73 74 65 70 73 0d 0a 20 20 20 20 20 20 20  r steps..       
e1a0: 20 20 20 20 20 23 20 20 20 20 20 20 20 61 72 65       #       are
e1b0: 20 74 61 6b 65 6e 20 74 6f 20 76 65 72 69 66 79   taken to verify
e1c0: 20 74 68 69 73 20 62 75 69 6c 64 20 69 73 20 61   this build is a
e1d0: 63 74 75 61 6c 6c 79 20 76 69 61 62 6c 65 2e 0d  ctually viable..
e1e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a  .            #..
e1f0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
e200: 5b 69 73 42 75 69 6c 64 41 76 61 69 6c 61 62 6c  [isBuildAvailabl
e210: 65 20 24 6e 61 74 69 76 65 20 24 64 69 72 65 63  e $native $direc
e220: 74 6f 72 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  tory]} then {.. 
e230: 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a               #..
e240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
e250: 4e 4f 54 45 3a 20 57 68 65 6e 20 69 6e 20 22 73  NOTE: When in "s
e260: 65 6c 65 63 74 22 20 6d 6f 64 65 2c 20 61 75 74  elect" mode, aut
e270: 6f 6d 61 74 69 63 61 6c 6c 79 20 73 65 6c 65 63  omatically selec
e280: 74 20 74 68 65 20 66 69 72 73 74 0d 0a 20 20 20  t the first..   
e290: 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20             #    
e2a0: 20 20 20 61 76 61 69 6c 61 62 6c 65 20 62 75 69     available bui
e2b0: 6c 64 20 6f 66 20 53 79 73 74 65 6d 2e 44 61 74  ld of System.Dat
e2c0: 61 2e 53 51 4c 69 74 65 20 61 6e 64 20 74 68 65  a.SQLite and the
e2d0: 6e 20 72 65 74 75 72 6e 0d 0a 20 20 20 20 20 20  n return..      
e2e0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
e2f0: 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0d 0a 20 20  immediately...  
e300: 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
e310: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
e320: 7b 24 73 65 6c 65 63 74 20 26 26 20 5b 6d 61 74  {$select && [mat
e330: 63 68 50 6c 61 74 66 6f 72 6d 20 24 70 6c 61 74  chPlatform $plat
e340: 66 6f 72 6d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  form]} then {.. 
e350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
e360: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
e370: 20 20 23 20 4e 4f 54 45 3a 20 4d 61 6e 75 61 6c    # NOTE: Manual
e380: 6c 79 20 6f 76 65 72 72 69 64 65 20 61 6c 6c 20  ly override all 
e390: 74 68 65 20 62 75 69 6c 64 20 64 69 72 65 63 74  the build direct
e3a0: 6f 72 79 20 73 65 6c 65 63 74 69 6f 6e 0d 0a 20  ory selection.. 
e3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
e3c0: 20 20 20 20 20 20 20 72 65 6c 61 74 65 64 20 74         related t
e3d0: 65 73 74 20 73 65 74 74 69 6e 67 73 20 69 6e 20  est settings in 
e3e0: 6f 72 64 65 72 20 74 6f 20 66 6f 72 63 65 20 74  order to force t
e3f0: 68 69 73 20 62 75 69 6c 64 0d 0a 20 20 20 20 20  his build..     
e400: 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20             #    
e410: 20 20 20 6f 66 20 53 79 73 74 65 6d 2e 44 61 74     of System.Dat
e420: 61 2e 53 51 4c 69 74 65 20 74 6f 20 62 65 20 75  a.SQLite to be u
e430: 73 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  sed...          
e440: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
e450: 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 63           if {![c
e460: 68 61 6e 67 65 4e 61 74 69 76 65 52 75 6e 74 69  hangeNativeRunti
e470: 6d 65 4f 70 74 69 6f 6e 20 24 6e 61 74 69 76 65  meOption $native
e480: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
e490: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
e4a0: 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
e4b0: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
e4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e4d0: 20 22 6e 6f 2c 20 66 61 69 6c 65 64 20 74 6f 20   "no, failed to 
e4e0: 22 20 5b 65 78 70 72 20 7b 24 6e 61 74 69 76 65  " [expr {$native
e4f0: 20 3f 20 22 61 64 64 22 20 3a 20 22 72 65 6d 6f   ? "add" : "remo
e500: 76 65 22 7d 5d 20 5c 0d 0a 20 20 20 20 20 20 20  ve"}] \..       
e510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
e520: 20 74 68 65 20 5c 22 6e 61 74 69 76 65 5c 22 20   the \"native\" 
e530: 72 75 6e 74 69 6d 65 20 6f 70 74 69 6f 6e 5c 6e  runtime option\n
e540: 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  "]....          
e550: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 66          return f
e560: 61 6c 73 65 0d 0a 20 20 20 20 20 20 20 20 20 20  alse..          
e570: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
e580: 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 3a             set :
e590: 3a 74 65 73 74 5f 79 65 61 72 20 24 79 65 61 72  :test_year $year
e5a0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
e5b0: 20 20 73 65 74 20 3a 3a 74 65 73 74 5f 70 6c 61    set ::test_pla
e5c0: 74 66 6f 72 6d 20 24 70 6c 61 74 66 6f 72 6d 0d  tform $platform.
e5d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e5e0: 20 73 65 74 20 3a 3a 74 65 73 74 5f 63 6f 6e 66   set ::test_conf
e5f0: 69 67 75 72 61 74 69 6f 6e 20 24 63 6f 6e 66 69  iguration $confi
e600: 67 75 72 61 74 69 6f 6e 0d 0a 0d 0a 20 20 20 20  guration....    
e610: 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
e620: 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
e630: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
e640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 79                "y
e650: 65 73 2c 20 73 65 6c 65 63 74 65 64 20 28 22 20  es, selected (" 
e660: 5b 65 78 70 72 20 7b 24 6e 61 74 69 76 65 20 3f  [expr {$native ?
e670: 20 22 6e 61 74 69 76 65 2f 22 20 3a 20 22 22 7d   "native/" : ""}
e680: 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ] \..           
e690: 20 20 20 20 20 20 20 20 20 5b 65 78 70 72 20 7b           [expr {
e6a0: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
e6b0: 70 6c 61 74 66 6f 72 6d 5d 20 3e 20 30 20 3f 20  platform] > 0 ? 
e6c0: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
e6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e6e0: 20 20 20 24 70 6c 61 74 66 6f 72 6d 20 2f 5d 20     $platform /] 
e6f0: 3a 20 22 22 7d 5d 20 24 79 65 61 72 20 2f 20 24  : ""}] $year / $
e700: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 22 29  configuration ")
e710: 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  \n"]....        
e720: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74          return t
e730: 72 75 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  rue..           
e740: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
e750: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
e760: 74 73 20 24 63 68 61 6e 6e 65 6c 20 79 65 73 5c  ts $channel yes\
e770: 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n..             
e780: 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
e790: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
e7a0: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
e7b0: 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20  hannel no\n..   
e7c0: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
e7d0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
e7e0: 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20   }..      }.... 
e7f0: 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73       return fals
e800: 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  e..    }.....   
e810: 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72 53 51   proc checkForSQ
e820: 4c 69 74 65 52 65 6c 65 61 73 65 73 20 7b 20 63  LiteReleases { c
e830: 68 61 6e 6e 65 6c 20 7b 73 65 6c 65 63 74 20 66  hannel {select f
e840: 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  alse} } {..     
e850: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
e860: 3a 20 43 68 65 63 6b 20 66 6f 72 20 70 61 73 74  : Check for past
e870: 20 72 65 6c 65 61 73 65 73 20 6f 66 20 53 79 73   releases of Sys
e880: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20  tem.Data.SQLite 
e890: 69 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  in the directory
e8a0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
e8b0: 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65  contained in the
e8c0: 20 22 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51   "System.Data.SQ
e8d0: 4c 69 74 65 22 20 65 6e 76 69 72 6f 6e 6d 65 6e  Lite" environmen
e8e0: 74 20 76 61 72 69 61 62 6c 65 2c 20 69 66 0d 0a  t variable, if..
e8f0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 70 72        #       pr
e900: 65 73 65 6e 74 2e 0d 0a 20 20 20 20 20 20 23 0d  esent...      #.
e910: 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f  .      if {[info
e920: 20 65 78 69 73 74 73 20 3a 3a 65 6e 76 28 53 79   exists ::env(Sy
e930: 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
e940: 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  )] && \..       
e950: 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74     [string lengt
e960: 68 20 24 3a 3a 65 6e 76 28 53 79 73 74 65 6d 2e  h $::env(System.
e970: 44 61 74 61 2e 53 51 4c 69 74 65 29 5d 20 3e 20  Data.SQLite)] > 
e980: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
e990: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
e9a0: 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74 68 65 20  NOTE: Build the 
e9b0: 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 20  fully qualified 
e9c0: 64 69 72 65 63 74 6f 72 79 20 77 68 65 72 65 20  directory where 
e9d0: 74 68 65 20 6e 65 63 65 73 73 61 72 79 0d 0a 20  the necessary.. 
e9e0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63         #       c
e9f0: 6f 6d 70 6f 6e 65 6e 74 73 20 66 6f 72 20 53 79  omponents for Sy
ea00: 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
ea10: 20 73 68 6f 75 6c 64 20 62 65 20 66 6f 75 6e 64   should be found
ea20: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
ea30: 20 20 20 20 20 20 73 65 74 20 64 69 72 65 63 74        set direct
ea40: 6f 72 79 20 5b 66 69 6c 65 20 6e 61 74 69 76 65  ory [file native
ea50: 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20  name [file join 
ea60: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 24  \..            $
ea70: 3a 3a 65 6e 76 28 53 79 73 74 65 6d 2e 44 61 74  ::env(System.Dat
ea80: 61 2e 53 51 4c 69 74 65 29 20 5b 67 65 74 52 65  a.SQLite) [getRe
ea90: 6c 65 61 73 65 56 65 72 73 69 6f 6e 5d 5d 5d 0d  leaseVersion]]].
eaa0: 0a 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  ...        tputs
eab0: 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
eac0: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
ead0: 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65 63 6b       "---- check
eae0: 69 6e 67 20 66 6f 72 20 53 79 73 74 65 6d 2e 44  ing for System.D
eaf0: 61 74 61 2e 53 51 4c 69 74 65 20 72 65 6c 65 61  ata.SQLite relea
eb00: 73 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20  se \"" \..      
eb10: 20 20 20 20 20 20 24 64 69 72 65 63 74 6f 72 79        $directory
eb20: 20 22 5c 22 2e 2e 2e 20 22 5d 0d 0a 0d 0a 20 20   "\"... "]....  
eb30: 20 20 20 20 20 20 69 66 20 7b 5b 69 73 52 65 6c        if {[isRel
eb40: 65 61 73 65 41 76 61 69 6c 61 62 6c 65 20 24 64  easeAvailable $d
eb50: 69 72 65 63 74 6f 72 79 20 70 6c 61 74 66 6f 72  irectory platfor
eb60: 6d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  m]} then {..    
eb70: 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
eb80: 67 20 6c 65 6e 67 74 68 20 24 70 6c 61 74 66 6f  g length $platfo
eb90: 72 6d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  rm] == 0} then {
eba0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65  ..            se
ebb0: 74 20 70 6c 61 74 66 6f 72 6d 20 75 6e 6b 6e 6f  t platform unkno
ebc0: 77 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  wn..          }.
ebd0: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  ...          if 
ebe0: 7b 24 73 65 6c 65 63 74 20 26 26 20 5b 6d 61 74  {$select && [mat
ebf0: 63 68 50 6c 61 74 66 6f 72 6d 20 24 70 6c 61 74  chPlatform $plat
ec00: 66 6f 72 6d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  form]} then {.. 
ec10: 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 3a             set :
ec20: 3a 62 75 69 6c 64 5f 64 69 72 65 63 74 6f 72 79  :build_directory
ec30: 20 24 64 69 72 65 63 74 6f 72 79 0d 0a 0d 0a 20   $directory.... 
ec40: 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
ec50: 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
ec60: 64 41 72 67 73 20 22 79 65 73 2c 20 73 65 6c 65  dArgs "yes, sele
ec70: 63 74 65 64 20 28 22 20 24 70 6c 61 74 66 6f 72  cted (" $platfor
ec80: 6d 20 22 29 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20  m ")\n"]....    
ec90: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74          return t
eca0: 72 75 65 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  rue..          }
ecb0: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
ecc0: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
ecd0: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
ece0: 22 79 65 73 20 28 22 20 24 70 6c 61 74 66 6f 72  "yes (" $platfor
ecf0: 6d 20 22 29 5c 6e 22 5d 0d 0a 20 20 20 20 20 20  m ")\n"]..      
ed00: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
ed10: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
ed20: 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
ed30: 6c 20 6e 6f 5c 6e 0d 0a 0d 0a 20 20 20 20 20 20  l no\n....      
ed40: 20 20 20 20 66 6f 72 65 61 63 68 20 70 61 74 68      foreach path
ed50: 20 5b 6c 73 6f 72 74 20 2d 64 65 63 72 65 61 73   [lsort -decreas
ed60: 69 6e 67 20 5b 66 69 6c 65 20 6c 69 73 74 20 24  ing [file list $
ed70: 64 69 72 65 63 74 6f 72 79 20 2a 5d 5d 20 7b 0d  directory *]] {.
ed80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
ed90: 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 70  {[file exists $p
eda0: 61 74 68 5d 20 26 26 20 5b 66 69 6c 65 20 69 73  ath] && [file is
edb0: 64 69 72 65 63 74 6f 72 79 20 24 70 61 74 68 5d  directory $path]
edc0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
edd0: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
ede0: 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
edf0: 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
ee00: 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68          "---- ch
ee10: 65 63 6b 69 6e 67 20 66 6f 72 20 53 79 73 74 65  ecking for Syste
ee20: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 72 65  m.Data.SQLite re
ee30: 6c 65 61 73 65 20 5c 22 22 20 5c 0d 0a 20 20 20  lease \"" \..   
ee40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24                 $
ee50: 70 61 74 68 20 22 5c 22 2e 2e 2e 20 22 5d 0d 0a  path "\"... "]..
ee60: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
ee70: 69 66 20 7b 5b 69 73 52 65 6c 65 61 73 65 41 76  if {[isReleaseAv
ee80: 61 69 6c 61 62 6c 65 20 24 70 61 74 68 20 70 6c  ailable $path pl
ee90: 61 74 66 6f 72 6d 5d 7d 20 74 68 65 6e 20 7b 0d  atform]} then {.
eea0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
eeb0: 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
eec0: 67 74 68 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3d  gth $platform] =
eed0: 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
eee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
eef0: 65 74 20 70 6c 61 74 66 6f 72 6d 20 75 6e 6b 6e  et platform unkn
ef00: 6f 77 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  own..           
ef10: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
ef20: 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 24 73            if {$s
ef30: 65 6c 65 63 74 20 26 26 20 5b 6d 61 74 63 68 50  elect && [matchP
ef40: 6c 61 74 66 6f 72 6d 20 24 70 6c 61 74 66 6f 72  latform $platfor
ef50: 6d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  m]} then {..    
ef60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
ef70: 74 20 3a 3a 62 75 69 6c 64 5f 64 69 72 65 63 74  t ::build_direct
ef80: 6f 72 79 20 24 70 61 74 68 0d 0a 0d 0a 20 20 20  ory $path....   
ef90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
efa0: 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
efb0: 70 70 65 6e 64 41 72 67 73 20 22 79 65 73 2c 20  ppendArgs "yes, 
efc0: 73 65 6c 65 63 74 65 64 20 28 22 20 24 70 6c 61  selected (" $pla
efd0: 74 66 6f 72 6d 20 22 29 5c 6e 22 5d 0d 0a 0d 0a  tform ")\n"]....
efe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eff0: 20 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20    return true.. 
f000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
f010: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
f020: 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
f030: 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
f040: 64 41 72 67 73 20 22 79 65 73 20 28 22 20 24 70  dArgs "yes (" $p
f050: 6c 61 74 66 6f 72 6d 20 22 29 5c 6e 22 5d 0d 0a  latform ")\n"]..
f060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f070: 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  }..             
f080: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
f090: 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
f0a0: 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a   $channel no\n..
f0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
f0c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
f0d0: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
f0e0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20       }..      } 
f0f0: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
f100: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
f110: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
f120: 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
f130: 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69  environment vari
f140: 61 62 6c 65 20 5c 22 53 79 73 74 65 6d 2e 44 61  able \"System.Da
f150: 74 61 2e 53 51 4c 69 74 65 5c 22 20 69 73 20 6e  ta.SQLite\" is n
f160: 6f 74 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20  ot " \..        
f170: 20 20 20 20 22 73 65 74 2c 20 73 6b 69 70 70 69      "set, skippi
f180: 6e 67 20 63 68 65 63 6b 20 66 6f 72 20 72 65 6c  ng check for rel
f190: 65 61 73 65 73 2e 2e 2e 5c 6e 22 5d 0d 0a 20 20  eases...\n"]..  
f1a0: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72      }....      r
f1b0: 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20  eturn false..   
f1c0: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
f1d0: 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 4c 69  checkForSQLiteLi
f1e0: 62 72 61 72 79 20 7b 20 63 68 61 6e 6e 65 6c 20  brary { channel 
f1f0: 7d 20 7b 0d 0a 20 20 20 20 20 20 74 70 75 74 73  } {..      tputs
f200: 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20   $channel "---- 
f210: 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 53 51 4c  checking for SQL
f220: 69 74 65 20 63 6f 72 65 20 6c 69 62 72 61 72 79  ite core library
f230: 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 69  ... "....      i
f240: 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  f {[catch {..   
f250: 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f       object invo
f260: 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75  ke -flags +NonPu
f270: 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20  blic \..        
f280: 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e      System.Data.
f290: 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 33 20 53  SQLite.SQLite3 S
f2a0: 51 4c 69 74 65 56 65 72 73 69 6f 6e 0d 0a 20 20  QLiteVersion..  
f2b0: 20 20 20 20 7d 20 76 65 72 73 69 6f 6e 5d 20 3d      } version] =
f2c0: 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
f2d0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
f2e0: 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66  # NOTE: Check if
f2f0: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 76 65   the returned ve
f300: 72 73 69 6f 6e 20 77 61 73 20 6e 75 6c 6c 2e 20  rsion was null. 
f310: 20 49 66 20 73 6f 2c 20 6d 61 6b 65 20 69 74 20   If so, make it 
f320: 65 61 73 79 0d 0a 20 20 20 20 20 20 20 20 23 20  easy..        # 
f330: 20 20 20 20 20 20 74 6f 20 73 70 6f 74 2e 0d 0a        to spot...
f340: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
f350: 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
f360: 65 6e 67 74 68 20 24 76 65 72 73 69 6f 6e 5d 20  ength $version] 
f370: 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
f380: 20 20 20 20 20 20 20 20 73 65 74 20 76 65 72 73          set vers
f390: 69 6f 6e 20 6e 75 6c 6c 0d 0a 20 20 20 20 20 20  ion null..      
f3a0: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23    }....        #
f3b0: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
f3c0: 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 71 75 65  : Attempt to que
f3d0: 72 79 20 74 68 65 20 46 6f 73 73 69 6c 20 73 6f  ry the Fossil so
f3e0: 75 72 63 65 20 69 64 65 6e 74 69 66 69 65 72 20  urce identifier 
f3f0: 66 6f 72 20 74 68 65 20 53 51 4c 69 74 65 0d 0a  for the SQLite..
f400: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
f410: 63 6f 72 65 20 6c 69 62 72 61 72 79 2e 0d 0a 20  core library... 
f420: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
f430: 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
f440: 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74            object
f450: 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b   invoke -flags +
f460: 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20  NonPublic \..   
f470: 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65             Syste
f480: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51  m.Data.SQLite.SQ
f490: 4c 69 74 65 33 20 53 51 4c 69 74 65 53 6f 75 72  Lite3 SQLiteSour
f4a0: 63 65 49 64 0d 0a 20 20 20 20 20 20 20 20 7d 20  ceId..        } 
f4b0: 73 6f 75 72 63 65 49 64 5d 7d 20 74 68 65 6e 20  sourceId]} then 
f4c0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  {..          #..
f4d0: 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
f4e0: 3a 20 57 65 20 66 61 69 6c 65 64 20 74 6f 20 71  : We failed to q
f4f0: 75 65 72 79 20 74 68 65 20 46 6f 73 73 69 6c 20  uery the Fossil 
f500: 73 6f 75 72 63 65 20 69 64 65 6e 74 69 66 69 65  source identifie
f510: 72 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  r...          #.
f520: 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20 73  .          set s
f530: 6f 75 72 63 65 49 64 20 75 6e 6b 6e 6f 77 6e 0d  ourceId unknown.
f540: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
f550: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
f560: 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69   # NOTE: Check i
f570: 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 46  f the returned F
f580: 6f 73 73 69 6c 20 73 6f 75 72 63 65 20 69 64 65  ossil source ide
f590: 6e 74 69 66 69 65 72 20 77 61 73 20 6e 75 6c 6c  ntifier was null
f5a0: 2e 20 20 49 66 0d 0a 20 20 20 20 20 20 20 20 23  .  If..        #
f5b0: 20 20 20 20 20 20 20 73 6f 2c 20 6d 61 6b 65 20         so, make 
f5c0: 69 74 20 65 61 73 79 20 74 6f 20 73 70 6f 74 2e  it easy to spot.
f5d0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
f5e0: 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
f5f0: 20 6c 65 6e 67 74 68 20 24 73 6f 75 72 63 65 49   length $sourceI
f600: 64 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  d] == 0} then {.
f610: 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20 73  .          set s
f620: 6f 75 72 63 65 49 64 20 6e 75 6c 6c 0d 0a 20 20  ourceId null..  
f630: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
f640: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
f650: 4e 4f 54 45 3a 20 59 65 73 2c 20 74 68 65 20 53  NOTE: Yes, the S
f660: 51 4c 69 74 65 20 63 6f 72 65 20 6c 69 62 72 61  QLite core libra
f670: 72 79 20 61 70 70 65 61 72 73 20 74 6f 20 62 65  ry appears to be
f680: 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0a 20 20 20   available...   
f690: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
f6a0: 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 53 51  addConstraint SQ
f6b0: 4c 69 74 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20  Lite....        
f6c0: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
f6d0: 61 70 70 65 6e 64 41 72 67 73 20 22 79 65 73 20  appendArgs "yes 
f6e0: 28 22 20 24 76 65 72 73 69 6f 6e 20 22 20 22 20  (" $version " " 
f6f0: 24 73 6f 75 72 63 65 49 64 20 22 29 5c 6e 22 5d  $sourceId ")\n"]
f700: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
f710: 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
f720: 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20  $channel no\n.. 
f730: 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
f740: 0d 0a 20 20 20 20 70 72 6f 63 20 63 68 65 63 6b  ..    proc check
f750: 46 6f 72 53 51 4c 69 74 65 49 6e 74 65 72 6f 70  ForSQLiteInterop
f760: 20 7b 20 63 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a   { channel } {..
f770: 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
f780: 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 68 65 63 6b  nnel "---- check
f790: 69 6e 67 20 66 6f 72 20 53 51 4c 69 74 65 20 69  ing for SQLite i
f7a0: 6e 74 65 72 6f 70 20 61 73 73 65 6d 62 6c 79 2e  nterop assembly.
f7b0: 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 69 66  .. "....      if
f7c0: 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
f7d0: 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b      object invok
f7e0: 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62  e -flags +NonPub
f7f0: 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  lic \..         
f800: 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53     System.Data.S
f810: 51 4c 69 74 65 2e 53 51 4c 69 74 65 33 20 49 6e  QLite.SQLite3 In
f820: 74 65 72 6f 70 56 65 72 73 69 6f 6e 0d 0a 20 20  teropVersion..  
f830: 20 20 20 20 7d 20 76 65 72 73 69 6f 6e 5d 20 3d      } version] =
f840: 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
f850: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
f860: 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66  # NOTE: Check if
f870: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 76 65   the returned ve
f880: 72 73 69 6f 6e 20 77 61 73 20 6e 75 6c 6c 2e 20  rsion was null. 
f890: 20 49 66 20 73 6f 2c 20 6d 61 6b 65 20 69 74 20   If so, make it 
f8a0: 65 61 73 79 0d 0a 20 20 20 20 20 20 20 20 23 20  easy..        # 
f8b0: 20 20 20 20 20 20 74 6f 20 73 70 6f 74 2e 0d 0a        to spot...
f8c0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
f8d0: 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
f8e0: 65 6e 67 74 68 20 24 76 65 72 73 69 6f 6e 5d 20  ength $version] 
f8f0: 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
f900: 20 20 20 20 20 20 20 20 73 65 74 20 76 65 72 73          set vers
f910: 69 6f 6e 20 6e 75 6c 6c 0d 0a 20 20 20 20 20 20  ion null..      
f920: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23    }....        #
f930: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
f940: 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 71 75 65  : Attempt to que
f950: 72 79 20 74 68 65 20 46 6f 73 73 69 6c 20 73 6f  ry the Fossil so
f960: 75 72 63 65 20 69 64 65 6e 74 69 66 69 65 72 20  urce identifier 
f970: 66 6f 72 20 74 68 65 20 53 51 4c 69 74 65 0d 0a  for the SQLite..
f980: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
f990: 63 6f 72 65 20 6c 69 62 72 61 72 79 2e 0d 0a 20  core library... 
f9a0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
f9b0: 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
f9c0: 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74            object
f9d0: 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b   invoke -flags +
f9e0: 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20  NonPublic \..   
f9f0: 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65             Syste
fa00: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51  m.Data.SQLite.SQ
fa10: 4c 69 74 65 33 20 49 6e 74 65 72 6f 70 53 6f 75  Lite3 InteropSou
fa20: 72 63 65 49 64 0d 0a 20 20 20 20 20 20 20 20 7d  rceId..        }
fa30: 20 73 6f 75 72 63 65 49 64 5d 7d 20 74 68 65 6e   sourceId]} then
fa40: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d   {..          #.
fa50: 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
fa60: 45 3a 20 57 65 20 66 61 69 6c 65 64 20 74 6f 20  E: We failed to 
fa70: 71 75 65 72 79 20 74 68 65 20 46 6f 73 73 69 6c  query the Fossil
fa80: 20 73 6f 75 72 63 65 20 69 64 65 6e 74 69 66 69   source identifi
fa90: 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  er...          #
faa0: 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
fab0: 73 6f 75 72 63 65 49 64 20 75 6e 6b 6e 6f 77 6e  sourceId unknown
fac0: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
fad0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
fae0: 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20    # NOTE: Check 
faf0: 69 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  if the returned 
fb00: 46 6f 73 73 69 6c 20 73 6f 75 72 63 65 20 69 64  Fossil source id
fb10: 65 6e 74 69 66 69 65 72 20 77 61 73 20 6e 75 6c  entifier was nul
fb20: 6c 2e 20 20 49 66 0d 0a 20 20 20 20 20 20 20 20  l.  If..        
fb30: 23 20 20 20 20 20 20 20 73 6f 2c 20 6d 61 6b 65  #       so, make
fb40: 20 69 74 20 65 61 73 79 20 74 6f 20 73 70 6f 74   it easy to spot
fb50: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
fb60: 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
fb70: 67 20 6c 65 6e 67 74 68 20 24 73 6f 75 72 63 65  g length $source
fb80: 49 64 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  Id] == 0} then {
fb90: 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
fba0: 73 6f 75 72 63 65 49 64 20 6e 75 6c 6c 0d 0a 20  sourceId null.. 
fbb0: 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
fbc0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
fbd0: 20 4e 4f 54 45 3a 20 42 65 66 6f 72 65 20 61 63   NOTE: Before ac
fbe0: 74 75 61 6c 6c 79 20 61 64 64 69 6e 67 20 74 68  tually adding th
fbf0: 65 20 74 65 73 74 20 63 6f 6e 73 74 72 61 69 6e  e test constrain
fc00: 74 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  t, make sure the
fc10: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
fc20: 20 20 76 65 72 73 69 6f 6e 20 69 73 20 76 61 6c    version is val
fc30: 69 64 20 28 69 2e 65 2e 20 6e 6f 74 20 6a 75 73  id (i.e. not jus
fc40: 74 20 74 68 61 74 20 77 65 20 63 6f 75 6c 64 20  t that we could 
fc50: 71 75 65 72 79 20 69 74 29 2e 0d 0a 20 20 20 20  query it)...    
fc60: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69      #..        i
fc70: 66 20 7b 24 76 65 72 73 69 6f 6e 20 6e 65 20 22  f {$version ne "
fc80: 6e 75 6c 6c 22 7d 20 74 68 65 6e 20 7b 0d 0a 20  null"} then {.. 
fc90: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
fca0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 59 65        # NOTE: Ye
fcb0: 73 2c 20 74 68 65 20 53 51 4c 69 74 65 20 69 6e  s, the SQLite in
fcc0: 74 65 72 6f 70 20 61 73 73 65 6d 62 6c 79 20 61  terop assembly a
fcd0: 70 70 65 61 72 73 20 74 6f 20 62 65 20 61 76 61  ppears to be ava
fce0: 69 6c 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20 20  ilable...       
fcf0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
fd00: 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 53 51  addConstraint SQ
fd10: 4c 69 74 65 49 6e 74 65 72 6f 70 0d 0a 0d 0a 20  LiteInterop.... 
fd20: 20 20 20 20 20 20 20 20 20 73 65 74 20 61 6e 73           set ans
fd30: 77 65 72 20 79 65 73 0d 0a 20 20 20 20 20 20 20  wer yes..       
fd40: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
fd50: 20 20 20 20 20 73 65 74 20 61 6e 73 77 65 72 20       set answer 
fd60: 6e 6f 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  no..        }...
fd70: 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
fd80: 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
fd90: 72 67 73 20 24 61 6e 73 77 65 72 20 22 20 28 22  rgs $answer " ("
fda0: 20 24 76 65 72 73 69 6f 6e 20 22 20 22 20 24 73   $version " " $s
fdb0: 6f 75 72 63 65 49 64 20 22 29 5c 6e 22 5d 0d 0a  ourceId ")\n"]..
fdc0: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
fdd0: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
fde0: 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20  hannel no\n..   
fdf0: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
fe00: 20 20 20 20 70 72 6f 63 20 63 68 65 63 6b 46 6f      proc checkFo
fe10: 72 53 51 4c 69 74 65 44 65 66 69 6e 65 43 6f 6e  rSQLiteDefineCon
fe20: 73 74 61 6e 74 20 7b 20 63 68 61 6e 6e 65 6c 20  stant { channel 
fe30: 6e 61 6d 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20  name } {..      
fe40: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
fe50: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
fe60: 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68          "---- ch
fe70: 65 63 6b 69 6e 67 20 66 6f 72 20 53 79 73 74 65  ecking for Syste
fe80: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 64 65  m.Data.SQLite de
fe90: 66 69 6e 65 20 63 6f 6e 73 74 61 6e 74 20 5c 22  fine constant \"
fea0: 22 20 24 6e 61 6d 65 20 5c 0d 0a 20 20 20 20 20  " $name \..     
feb0: 20 20 20 20 20 22 5c 22 2e 2e 2e 20 22 5d 0d 0a       "\"... "]..
fec0: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74  ..      if {[cat
fed0: 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 6f 62  ch {..        ob
fee0: 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61  ject invoke -fla
fef0: 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d  gs +NonPublic \.
ff00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73  .            Sys
ff10: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
ff20: 53 51 4c 69 74 65 33 20 44 65 66 69 6e 65 43 6f  SQLite3 DefineCo
ff30: 6e 73 74 61 6e 74 73 0d 0a 20 20 20 20 20 20 7d  nstants..      }
ff40: 20 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 73   defineConstants
ff50: 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
ff60: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 6c 73 65          if {[lse
ff70: 61 72 63 68 20 2d 65 78 61 63 74 20 2d 6e 6f 63  arch -exact -noc
ff80: 61 73 65 20 24 64 65 66 69 6e 65 43 6f 6e 73 74  ase $defineConst
ff90: 61 6e 74 73 20 24 6e 61 6d 65 5d 20 21 3d 20 2d  ants $name] != -
ffa0: 31 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  1} then {..     
ffb0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
ffc0: 20 20 23 20 4e 4f 54 45 3a 20 59 65 73 2c 20 74    # NOTE: Yes, t
ffd0: 68 69 73 20 64 65 66 69 6e 65 20 63 6f 6e 73 74  his define const
ffe0: 61 6e 74 20 77 61 73 20 65 6e 61 62 6c 65 64 20  ant was enabled 
fff0: 77 68 65 6e 20 74 68 65 20 6d 61 6e 61 67 65 64  when the managed
10000 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20  ..          #   
10010 20 20 20 20 61 73 73 65 6d 62 6c 79 20 77 61 73      assembly was
10020 20 63 6f 6d 70 69 6c 65 64 2e 0d 0a 20 20 20 20   compiled...    
10030 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
10040 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74     addConstraint
10050 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5b 67 65   [appendArgs [ge
10060 74 53 51 4c 69 74 65 44 65 66 69 6e 65 43 6f 6e  tSQLiteDefineCon
10070 73 74 61 6e 74 50 72 65 66 69 78 5d 20 24 6e 61  stantPrefix] $na
10080 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  me]....         
10090 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
100a0 79 65 73 5c 6e 0d 0a 20 20 20 20 20 20 20 20 7d  yes\n..        }
100b0 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
100c0 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
100d0 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20 20 20  l no\n..        
100e0 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  }..      } else 
100f0 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  {..        tputs
10100 20 24 63 68 61 6e 6e 65 6c 20 65 72 72 6f 72 5c   $channel error\
10110 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  n..      }..    
10120 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67  }.....    proc g
10130 65 74 44 61 74 65 54 69 6d 65 46 6f 72 6d 61 74  etDateTimeFormat
10140 20 7b 20 7b 74 69 6d 65 5a 6f 6e 65 20 74 72 75   { {timeZone tru
10150 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  e} } {..      #.
10160 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54  .      # NOTE: T
10170 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 73 69  his procedure si
10180 6d 70 6c 79 20 72 65 74 75 72 6e 73 20 74 68 65  mply returns the
10190 20 22 64 65 66 61 75 6c 74 22 20 44 61 74 65 54   "default" DateT
101a0 69 6d 65 20 66 6f 72 6d 61 74 20 75 73 65 64 0d  ime format used.
101b0 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62  .      #       b
101c0 79 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65  y the test suite
101d0 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
101e0 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73    if {[info exis
101f0 74 73 20 3a 3a 64 61 74 65 74 69 6d 65 5f 66 6f  ts ::datetime_fo
10200 72 6d 61 74 5d 20 26 26 20 5c 0d 0a 20 20 20 20  rmat] && \..    
10210 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65        [string le
10220 6e 67 74 68 20 24 3a 3a 64 61 74 65 74 69 6d 65  ngth $::datetime
10230 5f 66 6f 72 6d 61 74 5d 20 3e 20 30 7d 20 74 68  _format] > 0} th
10240 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
10250 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
10260 20 52 65 74 75 72 6e 20 74 68 65 20 6d 61 6e 75   Return the manu
10270 61 6c 6c 79 20 6f 76 65 72 72 69 64 64 65 6e 20  ally overridden 
10280 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 44 61  value for the Da
10290 74 65 54 69 6d 65 20 66 6f 72 6d 61 74 2e 0d 0a  teTime format...
102a0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
102b0 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 64 61 74     return $::dat
102c0 65 74 69 6d 65 5f 66 6f 72 6d 61 74 0d 0a 20 20  etime_format..  
102d0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
102e0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
102f0 20 23 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e 20   # NOTE: Return 
10300 61 6e 20 49 53 4f 38 36 30 31 20 44 61 74 65 54  an ISO8601 DateT
10310 69 6d 65 20 66 6f 72 6d 61 74 20 63 6f 6d 70 61  ime format compa
10320 74 69 62 6c 65 20 77 69 74 68 20 53 51 4c 69 74  tible with SQLit
10330 65 2c 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  e,..        #   
10340 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e      System.Data.
10350 53 51 4c 69 74 65 2c 20 61 6e 64 20 73 75 69 74  SQLite, and suit
10360 61 62 6c 65 20 66 6f 72 20 72 6f 75 6e 64 2d 74  able for round-t
10370 72 69 70 70 69 6e 67 20 77 69 74 68 20 74 68 65  ripping with the
10380 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
10390 20 20 44 61 74 65 54 69 6d 65 20 63 6c 61 73 73    DateTime class
103a0 20 6f 66 20 74 68 65 20 66 72 61 6d 65 77 6f 72   of the framewor
103b0 6b 2e 20 20 49 66 20 74 68 69 73 20 76 61 6c 75  k.  If this valu
103c0 65 20 69 73 20 63 68 61 6e 67 65 64 2c 0d 0a 20  e is changed,.. 
103d0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 76         #       v
103e0 61 72 69 6f 75 73 20 74 65 73 74 73 20 6d 61 79  arious tests may
103f0 20 66 61 69 6c 2e 0d 0a 20 20 20 20 20 20 20 20   fail...        
10400 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  #..        retur
10410 6e 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  n [appendArgs \.
10420 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 79 79  .            "yy
10430 79 79 2d 4d 4d 2d 64 64 20 48 48 3a 6d 6d 3a 73  yy-MM-dd HH:mm:s
10440 73 2e 46 46 46 46 46 46 46 22 20 5b 65 78 70 72  s.FFFFFFF" [expr
10450 20 7b 24 74 69 6d 65 5a 6f 6e 65 20 3f 20 22 4b   {$timeZone ? "K
10460 22 20 3a 20 22 22 7d 5d 5d 0d 0a 20 20 20 20 20  " : ""}]]..     
10470 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
10480 20 20 70 72 6f 63 20 67 65 74 44 61 74 65 54 69    proc getDateTi
10490 6d 65 54 69 63 6b 73 20 7b 20 76 61 6c 75 65 20  meTicks { value 
104a0 7b 6c 6f 63 61 6c 20 22 22 7d 20 7b 64 65 66 61  {local ""} {defa
104b0 75 6c 74 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20  ult ""} } {..   
104c0 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
104d0 65 6e 67 74 68 20 24 76 61 6c 75 65 5d 20 3d 3d  ength $value] ==
104e0 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
104f0 20 20 20 20 72 65 74 75 72 6e 20 24 64 65 66 61      return $defa
10500 75 6c 74 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  ult..      }....
10510 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
10520 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   {..        set 
10530 64 61 74 65 54 69 6d 65 20 5b 6f 62 6a 65 63 74  dateTime [object
10540 20 69 6e 76 6f 6b 65 20 2d 63 72 65 61 74 65 20   invoke -create 
10550 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2d  \..            -
10560 70 61 72 61 6d 65 74 65 72 74 79 70 65 73 20 5b  parametertypes [
10570 6c 69 73 74 20 53 74 72 69 6e 67 20 53 74 72 69  list String Stri
10580 6e 67 20 49 46 6f 72 6d 61 74 50 72 6f 76 69 64  ng IFormatProvid
10590 65 72 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  er \..          
105a0 20 20 53 79 73 74 65 6d 2e 47 6c 6f 62 61 6c 69    System.Globali
105b0 7a 61 74 69 6f 6e 2e 44 61 74 65 54 69 6d 65 53  zation.DateTimeS
105c0 74 79 6c 65 73 5d 20 44 61 74 65 54 69 6d 65 20  tyles] DateTime 
105d0 50 61 72 73 65 45 78 61 63 74 20 5c 0d 0a 20 20  ParseExact \..  
105e0 20 20 20 20 20 20 20 20 20 20 24 76 61 6c 75 65            $value
105f0 20 5b 67 65 74 44 61 74 65 54 69 6d 65 46 6f 72   [getDateTimeFor
10600 6d 61 74 5d 20 6e 75 6c 6c 20 41 64 6a 75 73 74  mat] null Adjust
10610 54 6f 55 6e 69 76 65 72 73 61 6c 5d 0d 0a 20 20  ToUniversal]..  
10620 20 20 20 20 7d 5d 7d 20 74 68 65 6e 20 7b 0d 0a      }]} then {..
10630 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24          return $
10640 64 65 66 61 75 6c 74 0d 0a 20 20 20 20 20 20 7d  default..      }
10650 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73  ....      if {[s
10660 74 72 69 6e 67 20 69 73 20 62 6f 6f 6c 65 61 6e  tring is boolean
10670 20 2d 73 74 72 69 63 74 20 24 6c 6f 63 61 6c 5d   -strict $local]
10680 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
10690 20 20 73 65 74 20 64 61 74 65 54 69 6d 65 20 5b    set dateTime [
106a0 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 63  object invoke -c
106b0 72 65 61 74 65 20 44 61 74 65 54 69 6d 65 20 53  reate DateTime S
106c0 70 65 63 69 66 79 4b 69 6e 64 20 5c 0d 0a 20 20  pecifyKind \..  
106d0 20 20 20 20 20 20 20 20 20 20 24 64 61 74 65 54            $dateT
106e0 69 6d 65 20 55 74 63 5d 0d 0a 20 20 20 20 20 20  ime Utc]..      
106f0 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
10700 20 20 72 65 74 75 72 6e 20 5b 6f 62 6a 65 63 74    return [object
10710 20 69 6e 76 6f 6b 65 20 24 64 61 74 65 54 69 6d   invoke $dateTim
10720 65 20 54 69 63 6b 73 5d 0d 0a 20 20 20 20 20 20  e Ticks]..      
10730 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 24  }....      if {$
10740 6c 6f 63 61 6c 7d 20 74 68 65 6e 20 7b 0d 0a 20  local} then {.. 
10750 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6f         return [o
10760 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 24 64 61  bject invoke $da
10770 74 65 54 69 6d 65 20 54 6f 4c 6f 63 61 6c 54 69  teTime ToLocalTi
10780 6d 65 2e 54 69 63 6b 73 5d 0d 0a 20 20 20 20 20  me.Ticks]..     
10790 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
107a0 20 20 20 72 65 74 75 72 6e 20 5b 6f 62 6a 65 63     return [objec
107b0 74 20 69 6e 76 6f 6b 65 20 24 64 61 74 65 54 69  t invoke $dateTi
107c0 6d 65 20 54 6f 55 6e 69 76 65 72 73 61 6c 54 69  me ToUniversalTi
107d0 6d 65 2e 54 69 63 6b 73 5d 0d 0a 20 20 20 20 20  me.Ticks]..     
107e0 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
107f0 20 20 70 72 6f 63 20 67 65 74 50 72 6f 70 65 72    proc getProper
10800 74 69 65 73 20 7b 20 6f 62 6a 65 63 74 20 76 61  ties { object va
10810 72 4e 61 6d 65 20 7d 20 7b 0d 0a 20 20 20 20 20  rName } {..     
10820 20 75 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d   upvar 1 $varNam
10830 65 20 70 72 6f 70 65 72 74 69 65 73 0d 0a 0d 0a  e properties....
10840 20 20 20 20 20 20 73 65 74 20 63 6f 75 6e 74 20        set count 
10850 30 0d 0a 20 20 20 20 20 20 73 65 74 20 6e 61 6d  0..      set nam
10860 65 73 20 5b 6c 69 73 74 5d 0d 0a 0d 0a 20 20 20  es [list]....   
10870 20 20 20 69 66 20 7b 5b 69 73 4f 62 6a 65 63 74     if {[isObject
10880 48 61 6e 64 6c 65 20 24 6f 62 6a 65 63 74 5d 20  Handle $object] 
10890 26 26 20 24 6f 62 6a 65 63 74 20 6e 65 20 22 6e  && $object ne "n
108a0 75 6c 6c 22 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ull"} then {..  
108b0 20 20 20 20 20 20 65 76 61 6c 20 6c 61 70 70 65        eval lappe
108c0 6e 64 20 6e 61 6d 65 73 20 5b 6f 62 6a 65 63 74  nd names [object
108d0 20 6d 65 6d 62 65 72 73 20 5c 0d 0a 20 20 20 20   members \..    
108e0 20 20 20 20 20 20 20 20 2d 6d 65 6d 62 65 72 74          -membert
108f0 79 70 65 73 20 50 72 6f 70 65 72 74 79 20 2d 6e  ypes Property -n
10900 61 6d 65 6f 6e 6c 79 20 24 6f 62 6a 65 63 74 5d  ameonly $object]
10910 0d 0a 0d 0a 20 20 20 20 20 20 20 20 65 76 61 6c  ....        eval
10920 20 6c 61 70 70 65 6e 64 20 6e 61 6d 65 73 20 5b   lappend names [
10930 6f 62 6a 65 63 74 20 6d 65 6d 62 65 72 73 20 5c  object members \
10940 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2d 6d  ..            -m
10950 65 6d 62 65 72 74 79 70 65 73 20 46 69 65 6c 64  embertypes Field
10960 20 2d 6e 61 6d 65 6f 6e 6c 79 20 24 6f 62 6a 65   -nameonly $obje
10970 63 74 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  ct]..      }....
10980 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 6e 61        foreach na
10990 6d 65 20 24 6e 61 6d 65 73 20 7b 0d 0a 20 20 20  me $names {..   
109a0 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
109b0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a  {..          obj
109c0 65 63 74 20 69 6e 76 6f 6b 65 20 2d 6f 62 6a 65  ect invoke -obje
109d0 63 74 66 6c 61 67 73 20 2b 4e 6f 44 69 73 70 6f  ctflags +NoDispo
109e0 73 65 20 24 6f 62 6a 65 63 74 20 24 6e 61 6d 65  se $object $name
109f0 0d 0a 20 20 20 20 20 20 20 20 7d 20 76 61 6c 75  ..        } valu
10a00 65 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  e] == 0} then {.
10a10 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b  .          if {[
10a20 69 73 4f 62 6a 65 63 74 48 61 6e 64 6c 65 20 24  isObjectHandle $
10a30 76 61 6c 75 65 5d 20 26 26 20 24 76 61 6c 75 65  value] && $value
10a40 20 6e 65 20 22 6e 75 6c 6c 22 7d 20 74 68 65 6e   ne "null"} then
10a50 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
10a60 73 65 74 20 65 72 72 6f 72 20 6e 75 6c 6c 3b 20  set error null; 
10a70 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66  object invoke -f
10a80 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20  lags +NonPublic 
10a90 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
10aa0 20 20 20 2d 6d 61 72 73 68 61 6c 66 6c 61 67 73     -marshalflags
10ab0 20 2b 4e 6f 48 61 6e 64 6c 65 20 49 6e 74 65 72   +NoHandle Inter
10ac0 70 72 65 74 65 72 2e 47 65 74 41 63 74 69 76 65  preter.GetActive
10ad0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
10ae0 20 20 20 20 41 64 64 4f 62 6a 65 63 74 52 65 66      AddObjectRef
10af0 65 72 65 6e 63 65 20 4f 6b 20 24 76 61 6c 75 65  erence Ok $value
10b00 20 65 72 72 6f 72 0d 0a 0d 0a 20 20 20 20 20 20   error....      
10b10 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 70 72        lappend pr
10b20 6f 70 65 72 74 69 65 73 28 6f 62 6a 65 63 74 73  operties(objects
10b30 29 20 5b 6c 69 73 74 20 24 6e 61 6d 65 20 24 76  ) [list $name $v
10b40 61 6c 75 65 5d 0d 0a 20 20 20 20 20 20 20 20 20  alue]..         
10b50 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
10b60 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 70         lappend p
10b70 72 6f 70 65 72 74 69 65 73 28 76 61 6c 75 65 73  roperties(values
10b80 29 20 5b 6c 69 73 74 20 24 6e 61 6d 65 20 24 76  ) [list $name $v
10b90 61 6c 75 65 5d 0d 0a 20 20 20 20 20 20 20 20 20  alue]..         
10ba0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
10bb0 69 6e 63 72 20 63 6f 75 6e 74 0d 0a 20 20 20 20  incr count..    
10bc0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
10bd0 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20          lappend 
10be0 70 72 6f 70 65 72 74 69 65 73 28 65 72 72 6f 72  properties(error
10bf0 73 29 20 5b 6c 69 73 74 20 24 6e 61 6d 65 20 24  s) [list $name $
10c00 3a 3a 65 72 72 6f 72 43 6f 64 65 5d 0d 0a 20 20  ::errorCode]..  
10c10 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
10c20 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ....      return
10c30 20 24 63 6f 75 6e 74 0d 0a 20 20 20 20 7d 0d 0a   $count..    }..
10c40 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 41  ...    proc getA
10c50 6c 6c 50 72 6f 70 65 72 74 69 65 73 20 7b 20 6f  llProperties { o
10c60 62 6a 65 63 74 20 76 61 72 4e 61 6d 65 20 7d 20  bject varName } 
10c70 7b 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20 31  {..      upvar 1
10c80 20 24 76 61 72 4e 61 6d 65 20 70 72 6f 70 65 72   $varName proper
10c90 74 69 65 73 0d 0a 20 20 20 20 20 20 73 65 74 20  ties..      set 
10ca0 76 61 6c 75 65 20 24 6f 62 6a 65 63 74 0d 0a 0d  value $object...
10cb0 0a 20 20 20 20 20 20 77 68 69 6c 65 20 7b 74 72  .      while {tr
10cc0 75 65 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20 69  ue} {..        i
10cd0 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
10ce0 20 70 72 6f 70 65 72 74 69 65 73 28 73 65 65 6e   properties(seen
10cf0 4f 62 6a 65 63 74 73 29 5d 20 7c 7c 20 5c 0d 0a  Objects)] || \..
10d00 20 20 20 20 20 20 20 20 20 20 20 20 24 76 61 6c              $val
10d10 75 65 20 6e 69 20 24 70 72 6f 70 65 72 74 69 65  ue ni $propertie
10d20 73 28 73 65 65 6e 4f 62 6a 65 63 74 73 29 7d 20  s(seenObjects)} 
10d30 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
10d40 20 20 67 65 74 50 72 6f 70 65 72 74 69 65 73 20    getProperties 
10d50 24 76 61 6c 75 65 20 70 72 6f 70 65 72 74 69 65  $value propertie
10d60 73 0d 0a 20 20 20 20 20 20 20 20 20 20 6c 61 70  s..          lap
10d70 70 65 6e 64 20 70 72 6f 70 65 72 74 69 65 73 28  pend properties(
10d80 73 65 65 6e 4f 62 6a 65 63 74 73 29 20 24 76 61  seenObjects) $va
10d90 6c 75 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  lue..        }..
10da0 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b  ..        if {![
10db0 69 6e 66 6f 20 65 78 69 73 74 73 20 70 72 6f 70  info exists prop
10dc0 65 72 74 69 65 73 28 6f 62 6a 65 63 74 73 29 5d  erties(objects)]
10dd0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
10de0 20 20 20 20 62 72 65 61 6b 0d 0a 20 20 20 20 20      break..     
10df0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
10e00 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 70 72  if {[llength $pr
10e10 6f 70 65 72 74 69 65 73 28 6f 62 6a 65 63 74 73  operties(objects
10e20 29 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  )] == 0} then {.
10e30 0a 20 20 20 20 20 20 20 20 20 20 75 6e 73 65 74  .          unset
10e40 20 70 72 6f 70 65 72 74 69 65 73 28 6f 62 6a 65   properties(obje
10e50 63 74 73 29 3b 20 62 72 65 61 6b 0d 0a 20 20 20  cts); break..   
10e60 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
10e70 20 20 73 65 74 20 76 61 6c 75 65 20 5b 6c 69 6e    set value [lin
10e80 64 65 78 20 5b 6c 69 6e 64 65 78 20 24 70 72 6f  dex [lindex $pro
10e90 70 65 72 74 69 65 73 28 6f 62 6a 65 63 74 73 29  perties(objects)
10ea0 20 30 5d 20 65 6e 64 5d 0d 0a 20 20 20 20 20 20   0] end]..      
10eb0 20 20 73 65 74 20 70 72 6f 70 65 72 74 69 65 73    set properties
10ec0 28 6f 62 6a 65 63 74 73 29 20 5b 6c 72 61 6e 67  (objects) [lrang
10ed0 65 20 24 70 72 6f 70 65 72 74 69 65 73 28 6f 62  e $properties(ob
10ee0 6a 65 63 74 73 29 20 31 20 65 6e 64 5d 0d 0a 20  jects) 1 end].. 
10ef0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
10f00 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
10f10 20 70 72 6f 70 65 72 74 69 65 73 28 73 65 65 6e   properties(seen
10f20 4f 62 6a 65 63 74 73 29 5d 7d 20 74 68 65 6e 20  Objects)]} then 
10f30 7b 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61  {..        forea
10f40 63 68 20 76 61 6c 75 65 20 24 70 72 6f 70 65 72  ch value $proper
10f50 74 69 65 73 28 73 65 65 6e 4f 62 6a 65 63 74 73  ties(seenObjects
10f60 29 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69  ) {..          i
10f70 66 20 7b 24 76 61 6c 75 65 20 65 71 20 24 6f 62  f {$value eq $ob
10f80 6a 65 63 74 7d 20 63 6f 6e 74 69 6e 75 65 0d 0a  ject} continue..
10f90 20 20 20 20 20 20 20 20 20 20 63 61 74 63 68 20            catch 
10fa0 7b 6f 62 6a 65 63 74 20 64 69 73 70 6f 73 65 20  {object dispose 
10fb0 24 76 61 6c 75 65 7d 0d 0a 20 20 20 20 20 20 20  $value}..       
10fc0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 75 6e   }....        un
10fd0 73 65 74 20 70 72 6f 70 65 72 74 69 65 73 28 73  set properties(s
10fe0 65 65 6e 4f 62 6a 65 63 74 73 29 0d 0a 20 20 20  eenObjects)..   
10ff0 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
11000 20 20 20 20 70 72 6f 63 20 67 65 74 56 61 72 69      proc getVari
11010 61 62 6c 65 73 20 7b 20 76 61 72 4e 61 6d 65 73  ables { varNames
11020 20 7b 6f 62 6a 65 63 74 73 20 66 61 6c 73 65 7d   {objects false}
11030 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20   } {..      set 
11040 72 65 73 75 6c 74 20 5b 6c 69 73 74 5d 0d 0a 0d  result [list]...
11050 0a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 76  .      foreach v
11060 61 72 4e 61 6d 65 20 24 76 61 72 4e 61 6d 65 73  arName $varNames
11070 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   {..        if {
11080 5b 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74  [uplevel 1 [list
11090 20 61 72 72 61 79 20 65 78 69 73 74 73 20 24 76   array exists $v
110a0 61 72 4e 61 6d 65 5d 5d 7d 20 74 68 65 6e 20 7b  arName]]} then {
110b0 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
110c0 61 72 72 61 79 4e 61 6d 65 20 24 76 61 72 4e 61  arrayName $varNa
110d0 6d 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  me....          
110e0 66 6f 72 65 61 63 68 20 65 6c 65 6d 65 6e 74 4e  foreach elementN
110f0 61 6d 65 20 5b 75 70 6c 65 76 65 6c 20 31 20 5b  ame [uplevel 1 [
11100 6c 69 73 74 20 61 72 72 61 79 20 6e 61 6d 65 73  list array names
11110 20 24 61 72 72 61 79 4e 61 6d 65 5d 5d 20 7b 0d   $arrayName]] {.
11120 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74  .            set
11130 20 6e 61 6d 65 20 5b 61 70 70 65 6e 64 41 72 67   name [appendArg
11140 73 20 24 61 72 72 61 79 4e 61 6d 65 20 28 20 24  s $arrayName ( $
11150 65 6c 65 6d 65 6e 74 4e 61 6d 65 20 29 5d 0d 0a  elementName )]..
11160 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
11170 76 61 72 56 61 6c 75 65 20 5b 75 70 6c 65 76 65  varValue [upleve
11180 6c 20 31 20 5b 6c 69 73 74 20 73 65 74 20 24 6e  l 1 [list set $n
11190 61 6d 65 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  ame]]....       
111a0 20 20 20 20 20 69 66 20 7b 24 6f 62 6a 65 63 74       if {$object
111b0 73 20 26 26 20 5b 69 73 4f 62 6a 65 63 74 48 61  s && [isObjectHa
111c0 6e 64 6c 65 20 24 76 61 72 56 61 6c 75 65 5d 7d  ndle $varValue]}
111d0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
111e0 20 20 20 20 20 20 20 75 6e 73 65 74 20 2d 6e 6f         unset -no
111f0 63 6f 6d 70 6c 61 69 6e 20 70 72 6f 70 65 72 74  complain propert
11200 69 65 73 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ies..           
11210 20 20 20 67 65 74 41 6c 6c 50 72 6f 70 65 72 74     getAllPropert
11220 69 65 73 20 24 76 61 72 56 61 6c 75 65 20 70 72  ies $varValue pr
11230 6f 70 65 72 74 69 65 73 0d 0a 0d 0a 20 20 20 20  operties....    
11240 20 20 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e            lappen
11250 64 20 72 65 73 75 6c 74 20 5b 6c 69 73 74 20 24  d result [list $
11260 6e 61 6d 65 20 5b 61 72 72 61 79 20 67 65 74 20  name [array get 
11270 70 72 6f 70 65 72 74 69 65 73 5d 5d 0d 0a 20 20  properties]]..  
11280 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
11290 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
112a0 20 20 6c 61 70 70 65 6e 64 20 72 65 73 75 6c 74    lappend result
112b0 20 5b 6c 69 73 74 20 24 6e 61 6d 65 20 24 76 61   [list $name $va
112c0 72 56 61 6c 75 65 5d 0d 0a 20 20 20 20 20 20 20  rValue]..       
112d0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
112e0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65    }..        } e
112f0 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
11300 20 73 65 74 20 76 61 72 56 61 6c 75 65 20 5b 75   set varValue [u
11310 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74 20 73  plevel 1 [list s
11320 65 74 20 24 76 61 72 4e 61 6d 65 5d 5d 0d 0a 0d  et $varName]]...
11330 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 24  .          if {$
11340 6f 62 6a 65 63 74 73 20 26 26 20 5b 69 73 4f 62  objects && [isOb
11350 6a 65 63 74 48 61 6e 64 6c 65 20 24 76 61 72 56  jectHandle $varV
11360 61 6c 75 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  alue]} then {.. 
11370 20 20 20 20 20 20 20 20 20 20 20 75 6e 73 65 74             unset
11380 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 70 72 6f   -nocomplain pro
11390 70 65 72 74 69 65 73 0d 0a 20 20 20 20 20 20 20  perties..       
113a0 20 20 20 20 20 67 65 74 41 6c 6c 50 72 6f 70 65       getAllPrope
113b0 72 74 69 65 73 20 24 76 61 72 56 61 6c 75 65 20  rties $varValue 
113c0 70 72 6f 70 65 72 74 69 65 73 0d 0a 0d 0a 20 20  properties....  
113d0 20 20 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e            lappen
113e0 64 20 72 65 73 75 6c 74 20 5b 6c 69 73 74 20 24  d result [list $
113f0 76 61 72 4e 61 6d 65 20 5b 61 72 72 61 79 20 67  varName [array g
11400 65 74 20 70 72 6f 70 65 72 74 69 65 73 5d 5d 0d  et properties]].
11410 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73  .          } els
11420 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e {..           
11430 20 6c 61 70 70 65 6e 64 20 72 65 73 75 6c 74 20   lappend result 
11440 5b 6c 69 73 74 20 24 76 61 72 4e 61 6d 65 20 24  [list $varName $
11450 76 61 72 56 61 6c 75 65 5d 0d 0a 20 20 20 20 20  varValue]..     
11460 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
11470 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  }..      }....  
11480 20 20 20 20 72 65 74 75 72 6e 20 24 72 65 73 75      return $resu
11490 6c 74 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  lt..    }.....  
114a0 20 20 70 72 6f 63 20 65 6e 75 6d 65 72 61 62 6c    proc enumerabl
114b0 65 54 6f 4c 69 73 74 20 7b 20 65 6e 75 6d 65 72  eToList { enumer
114c0 61 62 6c 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20  able } {..      
114d0 73 65 74 20 72 65 73 75 6c 74 20 5b 6c 69 73 74  set result [list
114e0 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  ]....      if {[
114f0 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 65  string length $e
11500 6e 75 6d 65 72 61 62 6c 65 5d 20 3d 3d 20 30 20  numerable] == 0 
11510 7c 7c 20 24 65 6e 75 6d 65 72 61 62 6c 65 20 65  || $enumerable e
11520 71 20 22 6e 75 6c 6c 22 7d 20 74 68 65 6e 20 7b  q "null"} then {
11530 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
11540 20 24 72 65 73 75 6c 74 0d 0a 20 20 20 20 20 20   $result..      
11550 7d 0d 0a 0d 0a 20 20 20 20 20 20 6f 62 6a 65 63  }....      objec
11560 74 20 66 6f 72 65 61 63 68 20 2d 61 6c 69 61 73  t foreach -alias
11570 20 69 74 65 6d 20 24 65 6e 75 6d 65 72 61 62 6c   item $enumerabl
11580 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20  e {..        if 
11590 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
115a0 24 69 74 65 6d 5d 20 3e 20 30 7d 20 74 68 65 6e  $item] > 0} then
115b0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6c 61   {..          la
115c0 70 70 65 6e 64 20 72 65 73 75 6c 74 20 5b 24 69  ppend result [$i
115d0 74 65 6d 20 54 6f 53 74 72 69 6e 67 5d 0d 0a 20  tem ToString].. 
115e0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
115f0 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72  }....      retur
11600 6e 20 24 72 65 73 75 6c 74 0d 0a 20 20 20 20 7d  n $result..    }
11610 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 61  .....    proc ca
11620 74 63 68 41 6e 64 52 65 74 75 72 6e 20 7b 20 73  tchAndReturn { s
11630 63 72 69 70 74 20 7b 73 74 61 63 6b 54 72 61 63  cript {stackTrac
11640 65 20 66 61 6c 73 65 7d 20 7b 73 74 72 69 63 74  e false} {strict
11650 20 74 72 75 65 7d 20 7d 20 7b 0d 0a 20 20 20 20   true} } {..    
11660 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
11670 45 3a 20 45 76 61 6c 75 61 74 65 20 74 68 65 20  E: Evaluate the 
11680 73 63 72 69 70 74 20 70 72 6f 76 69 64 65 64 20  script provided 
11690 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 20 69 6e  by our caller in
116a0 20 74 68 65 69 72 20 63 6f 6e 74 65 78 74 2c 0d   their context,.
116b0 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63  .      #       c
116c0 61 70 74 75 72 69 6e 67 20 62 6f 74 68 20 74 68  apturing both th
116d0 65 20 72 65 73 75 6c 74 20 61 6e 64 20 74 68 65  e result and the
116e0 20 72 65 74 75 72 6e 20 63 6f 64 65 2e 0d 0a 20   return code... 
116f0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65       #..      se
11700 74 20 63 6f 64 65 20 5b 63 61 74 63 68 20 7b 75  t code [catch {u
11710 70 6c 65 76 65 6c 20 31 20 24 73 63 72 69 70 74  plevel 1 $script
11720 7d 20 72 65 73 75 6c 74 5d 0d 0a 0d 0a 20 20 20  } result]....   
11730 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
11740 54 45 3a 20 44 69 64 20 74 68 65 20 73 63 72 69  TE: Did the scri
11750 70 74 20 70 72 6f 76 69 64 65 64 20 62 79 20 6f  pt provided by o
11760 75 72 20 63 61 6c 6c 65 72 20 4e 4f 54 20 72 61  ur caller NOT ra
11770 69 73 65 20 61 6e 20 65 72 72 6f 72 3f 0d 0a 20  ise an error?.. 
11780 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
11790 20 7b 24 73 74 72 69 63 74 20 26 26 20 24 63 6f   {$strict && $co
117a0 64 65 20 3d 3d 20 30 20 7c 7c 20 21 24 73 74 72  de == 0 || !$str
117b0 69 63 74 20 26 26 20 24 63 6f 64 65 20 21 3d 20  ict && $code != 
117c0 31 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  1} then {..     
117d0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
117e0 4e 4f 54 45 3a 20 53 75 63 63 65 73 73 2e 20 20  NOTE: Success.  
117f0 52 65 74 75 72 6e 20 61 20 6c 69 73 74 20 77 69  Return a list wi
11800 74 68 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f  th the return co
11810 64 65 20 61 6e 64 20 74 68 65 20 72 65 73 75 6c  de and the resul
11820 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  t...        #.. 
11830 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6c         return [l
11840 69 73 74 20 24 63 6f 64 65 20 24 72 65 73 75 6c  ist $code $resul
11850 74 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  t]..      } else
11860 69 66 20 7b 24 73 74 61 63 6b 54 72 61 63 65 7d  if {$stackTrace}
11870 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
11880 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
11890 54 45 3a 20 46 61 69 6c 75 72 65 2e 20 20 4f 75  TE: Failure.  Ou
118a0 72 20 63 61 6c 6c 65 72 20 77 61 6e 74 73 20 61  r caller wants a
118b0 20 66 75 6c 6c 20 73 74 61 63 6b 20 74 72 61 63   full stack trac
118c0 65 20 28 69 66 20 61 70 70 6c 69 63 61 62 6c 65  e (if applicable
118d0 29 2c 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ),..        #   
118e0 20 20 20 20 72 65 74 75 72 6e 20 61 20 6c 69 73      return a lis
118f0 74 20 77 69 74 68 20 74 68 65 20 72 65 74 75 72  t with the retur
11900 6e 20 63 6f 64 65 20 61 6e 64 20 74 68 65 20 72  n code and the r
11910 65 73 75 6c 74 20 76 65 72 62 61 74 69 6d 2e 0d  esult verbatim..
11920 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
11930 20 20 20 20 72 65 74 75 72 6e 20 5b 6c 69 73 74      return [list
11940 20 24 63 6f 64 65 20 24 72 65 73 75 6c 74 5d 0d   $code $result].
11950 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
11960 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
11970 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 61 69 6c      # NOTE: Fail
11980 75 72 65 2e 20 20 4f 75 72 20 63 61 6c 6c 65 72  ure.  Our caller
11990 20 64 6f 65 73 20 6e 6f 74 20 77 61 6e 74 20 61   does not want a
119a0 20 66 75 6c 6c 20 73 74 61 63 6b 20 74 72 61 63   full stack trac
119b0 65 20 28 69 66 0d 0a 20 20 20 20 20 20 20 20 23  e (if..        #
119c0 20 20 20 20 20 20 20 61 70 70 6c 69 63 61 62 6c         applicabl
119d0 65 29 2c 20 72 65 74 75 72 6e 20 61 20 6c 69 73  e), return a lis
119e0 74 20 77 69 74 68 20 74 68 65 20 72 65 74 75 72  t with the retur
119f0 6e 20 63 6f 64 65 2c 20 74 68 65 20 65 72 72 6f  n code, the erro
11a00 72 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  r..        #    
11a10 20 20 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20     code for the 
11a20 69 6e 74 65 72 70 72 65 74 65 72 2c 20 61 6e 64  interpreter, and
11a30 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61   the error messa
11a40 67 65 20 75 70 20 74 6f 20 74 68 65 0d 0a 20 20  ge up to the..  
11a50 20 20 20 20 20 20 23 20 20 20 20 20 20 20 70 6f        #       po
11a60 69 6e 74 20 77 68 65 72 65 20 74 68 65 20 73 74  int where the st
11a70 61 63 6b 20 74 72 61 63 65 20 73 68 6f 75 6c 64  ack trace should
11a80 20 73 74 61 72 74 2e 0d 0a 20 20 20 20 20 20 20   start...       
11a90 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   #..        retu
11aa0 72 6e 20 5b 6c 69 73 74 20 24 63 6f 64 65 20 24  rn [list $code $
11ab0 3a 3a 65 72 72 6f 72 43 6f 64 65 20 5c 0d 0a 20  ::errorCode \.. 
11ac0 20 20 20 20 20 20 20 20 20 20 20 5b 65 78 74 72             [extr
11ad0 61 63 74 53 79 73 74 65 6d 44 61 74 61 53 51 4c  actSystemDataSQL
11ae0 69 74 65 45 78 63 65 70 74 69 6f 6e 4d 65 73 73  iteExceptionMess
11af0 61 67 65 20 24 72 65 73 75 6c 74 5d 5d 0d 0a 20  age $result]].. 
11b00 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
11b10 0d 0a 20 20 20 20 70 72 6f 63 20 63 6f 6d 70 69  ..    proc compi
11b20 6c 65 43 53 68 61 72 70 57 69 74 68 20 7b 0d 0a  leCSharpWith {..
11b30 20 20 20 20 20 20 20 20 20 20 20 20 74 65 78 74              text
11b40 20 6d 65 6d 6f 72 79 20 73 79 6d 62 6f 6c 73 20   memory symbols 
11b50 73 74 72 69 63 74 20 72 65 73 75 6c 74 73 56 61  strict resultsVa
11b60 72 4e 61 6d 65 20 65 72 72 6f 72 73 56 61 72 4e  rName errorsVarN
11b70 61 6d 65 20 66 69 6c 65 4e 61 6d 65 73 0d 0a 20  ame fileNames.. 
11b80 20 20 20 20 20 20 20 20 20 20 20 61 72 67 73 20             args 
11b90 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
11ba0 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 69 6e 63      # NOTE: Sinc
11bb0 65 20 77 65 20 61 72 65 20 67 6f 69 6e 67 20 74  e we are going t
11bc0 6f 20 75 73 65 20 74 68 69 73 20 6d 65 74 68 6f  o use this metho
11bd0 64 20 6e 61 6d 65 20 61 20 6c 6f 74 2c 20 61 73  d name a lot, as
11be0 73 69 67 6e 20 69 74 20 74 6f 20 61 0d 0a 20 20  sign it to a..  
11bf0 20 20 20 20 23 20 20 20 20 20 20 20 76 61 72 69      #       vari
11c00 61 62 6c 65 20 66 69 72 73 74 2e 0d 0a 20 20 20  able first...   
11c10 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20     #..      set 
11c20 61 64 64 20 52 65 66 65 72 65 6e 63 65 64 41 73  add ReferencedAs
11c30 73 65 6d 62 6c 69 65 73 2e 41 64 64 0d 0a 0d 0a  semblies.Add....
11c40 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
11c50 20 4e 4f 54 45 3a 20 43 72 65 61 74 65 20 74 68   NOTE: Create th
11c60 65 20 62 61 73 65 20 63 6f 6d 6d 61 6e 64 20 74  e base command t
11c70 6f 20 65 76 61 6c 75 61 74 65 20 61 6e 64 20 61  o evaluate and a
11c80 64 64 20 74 68 65 20 70 72 6f 70 65 72 74 79 20  dd the property 
11c90 73 65 74 74 69 6e 67 73 0d 0a 20 20 20 20 20 20  settings..      
11ca0 23 20 20 20 20 20 20 20 74 68 61 74 20 61 72 65  #       that are
11cb0 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 6e   almost always n
11cc0 65 65 64 65 64 20 62 79 20 6f 75 72 20 75 6e 69  eeded by our uni
11cd0 74 20 74 65 73 74 73 20 28 69 2e 65 2e 20 74 68  t tests (i.e. th
11ce0 65 20 53 79 73 74 65 6d 0d 0a 20 20 20 20 20 20  e System..      
11cf0 23 20 20 20 20 20 20 20 61 6e 64 20 53 79 73 74  #       and Syst
11d00 65 6d 2e 44 61 74 61 20 61 73 73 65 6d 62 6c 79  em.Data assembly
11d10 20 72 65 66 65 72 65 6e 63 65 73 29 2e 0d 0a 20   references)... 
11d20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65       #..      se
11d30 74 20 63 6f 6d 6d 61 6e 64 20 5b 6c 69 73 74 20  t command [list 
11d40 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6d  \..          com
11d50 70 69 6c 65 43 53 68 61 72 70 20 24 74 65 78 74  pileCSharp $text
11d60 20 24 6d 65 6d 6f 72 79 20 24 73 79 6d 62 6f 6c   $memory $symbol
11d70 73 20 24 73 74 72 69 63 74 20 72 65 73 75 6c 74  s $strict result
11d80 73 20 65 72 72 6f 72 73 20 5c 0d 0a 20 20 20 20  s errors \..    
11d90 20 20 20 20 20 20 24 61 64 64 20 53 79 73 74 65        $add Syste
11da0 6d 2e 64 6c 6c 20 24 61 64 64 20 53 79 73 74 65  m.dll $add Syste
11db0 6d 2e 44 61 74 61 2e 64 6c 6c 20 24 61 64 64 20  m.Data.dll $add 
11dc0 53 79 73 74 65 6d 2e 54 72 61 6e 73 61 63 74 69  System.Transacti
11dd0 6f 6e 73 2e 64 6c 6c 20 5c 0d 0a 20 20 20 20 20  ons.dll \..     
11de0 20 20 20 20 20 24 61 64 64 20 53 79 73 74 65 6d       $add System
11df0 2e 58 6d 6c 2e 64 6c 6c 5d 0d 0a 0d 0a 20 20 20  .Xml.dll]....   
11e00 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
11e10 54 45 3a 20 41 64 64 20 61 6c 6c 20 74 68 65 20  TE: Add all the 
11e20 70 72 6f 76 69 64 65 64 20 66 69 6c 65 20 6e 61  provided file na
11e30 6d 65 73 20 61 73 20 61 73 73 65 6d 62 6c 79 20  mes as assembly 
11e40 72 65 66 65 72 65 6e 63 65 73 2e 0d 0a 20 20 20  references...   
11e50 20 20 20 23 0d 0a 20 20 20 20 20 20 66 6f 72 65     #..      fore
11e60 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 66 69  ach fileName $fi
11e70 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20  leNames {..     
11e80 20 20 20 6c 61 70 70 65 6e 64 20 63 6f 6d 6d 61     lappend comma
11e90 6e 64 20 24 61 64 64 20 5b 67 65 74 42 69 6e 61  nd $add [getBina
11ea0 72 79 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65  ryFileName $file
11eb0 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a  Name]..      }..
11ec0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
11ed0 20 23 20 4e 4f 54 45 3a 20 41 64 64 20 74 68 65   # NOTE: Add the
11ee0 20 65 78 74 72 61 20 61 72 67 75 6d 65 6e 74 73   extra arguments
11ef0 2c 20 69 66 20 61 6e 79 2c 20 74 6f 20 74 68 65  , if any, to the
11f00 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c   command to eval
11f10 75 61 74 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  uate...      #..
11f20 20 20 20 20 20 20 65 76 61 6c 20 6c 61 70 70 65        eval lappe
11f30 6e 64 20 63 6f 6d 6d 61 6e 64 20 24 61 72 67 73  nd command $args
11f40 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
11f50 20 20 20 23 20 4e 4f 54 45 3a 20 41 6c 69 61 73     # NOTE: Alias
11f60 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 6c 6f   the compiler lo
11f70 63 61 6c 20 72 65 73 75 6c 74 73 20 61 6e 64 20  cal results and 
11f80 65 72 72 6f 72 73 20 76 61 72 69 61 62 6c 65 73  errors variables
11f90 20 74 6f 20 74 68 65 0d 0a 20 20 20 20 20 20 23   to the..      #
11fa0 20 20 20 20 20 20 20 76 61 72 69 61 62 6c 65 20         variable 
11fb0 6e 61 6d 65 73 20 70 72 6f 76 69 64 65 64 20 62  names provided b
11fc0 79 20 6f 75 72 20 63 61 6c 6c 65 72 2e 0d 0a 20  y our caller... 
11fd0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
11fe0 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   {[string length
11ff0 20 24 72 65 73 75 6c 74 73 56 61 72 4e 61 6d 65   $resultsVarName
12000 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
12010 20 20 20 20 20 20 20 75 70 76 61 72 20 31 20 24         upvar 1 $
12020 72 65 73 75 6c 74 73 56 61 72 4e 61 6d 65 20 72  resultsVarName r
12030 65 73 75 6c 74 73 0d 0a 20 20 20 20 20 20 7d 0d  esults..      }.
12040 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74  ...      if {[st
12050 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 65 72 72  ring length $err
12060 6f 72 73 56 61 72 4e 61 6d 65 5d 20 3e 20 30 7d  orsVarName] > 0}
12070 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
12080 20 75 70 76 61 72 20 31 20 24 65 72 72 6f 72 73   upvar 1 $errors
12090 56 61 72 4e 61 6d 65 20 65 72 72 6f 72 73 0d 0a  VarName errors..
120a0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
120b0 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
120c0 3a 20 45 76 61 6c 75 61 74 65 20 74 68 65 20 63  : Evaluate the c
120d0 6f 6e 73 74 72 75 63 74 65 64 20 5b 63 6f 6d 70  onstructed [comp
120e0 69 6c 65 43 53 68 61 72 70 5d 20 63 6f 6d 6d 61  ileCSharp] comma
120f0 6e 64 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68  nd and return th
12100 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
12110 20 72 65 73 75 6c 74 2e 0d 0a 20 20 20 20 20 20   result...      
12120 23 0d 0a 20 20 20 20 20 20 65 76 61 6c 20 24 63  #..      eval $c
12130 6f 6d 6d 61 6e 64 0d 0a 20 20 20 20 7d 0d 0a 0c  ommand..    }...
12140 0d 0a 20 20 20 20 70 72 6f 63 20 69 73 4d 65 6d  ..    proc isMem
12150 6f 72 79 44 62 20 7b 20 66 69 6c 65 4e 61 6d 65  oryDb { fileName
12160 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20   } {..      #.. 
12170 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 73 20       # NOTE: Is 
12180 74 68 65 20 73 70 65 63 69 66 69 65 64 20 64 61  the specified da
12190 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65  tabase file name
121a0 20 72 65 61 6c 6c 79 20 61 6e 20 69 6e 2d 6d 65   really an in-me
121b0 6d 6f 72 79 20 64 61 74 61 62 61 73 65 3f 0d 0a  mory database?..
121c0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72        #..      r
121d0 65 74 75 72 6e 20 5b 65 78 70 72 20 7b 24 66 69  eturn [expr {$fi
121e0 6c 65 4e 61 6d 65 20 65 71 20 22 3a 6d 65 6d 6f  leName eq ":memo
121f0 72 79 3a 22 20 7c 7c 20 5c 0d 0a 20 20 20 20 20  ry:" || \..     
12200 20 20 20 20 20 5b 73 74 72 69 6e 67 20 72 61 6e       [string ran
12210 67 65 20 24 66 69 6c 65 4e 61 6d 65 20 30 20 31  ge $fileName 0 1
12220 32 5d 20 65 71 20 22 66 69 6c 65 3a 3a 6d 65 6d  2] eq "file::mem
12230 6f 72 79 3a 22 7d 5d 0d 0a 20 20 20 20 7d 0d 0a  ory:"}]..    }..
12240 0c 0d 0a 20 20 20 20 70 72 6f 63 20 69 73 54 61  ...    proc isTa
12250 62 6c 65 49 6e 44 62 20 7b 20 6e 61 6d 65 20 7b  bleInDb { name {
12260 76 61 72 4e 61 6d 65 20 64 62 7d 20 7d 20 7b 0d  varName db} } {.
12270 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
12280 23 20 4e 4f 54 45 3a 20 52 65 66 65 72 20 74 6f  # NOTE: Refer to
12290 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 76   the specified v
122a0 61 72 69 61 62 6c 65 20 28 65 2e 67 2e 20 22 64  ariable (e.g. "d
122b0 62 22 29 20 69 6e 20 74 68 65 20 63 6f 6e 74 65  b") in the conte
122c0 78 74 20 6f 66 20 6f 75 72 0d 0a 20 20 20 20 20  xt of our..     
122d0 20 23 20 20 20 20 20 20 20 63 61 6c 6c 65 72 2e   #       caller.
122e0 20 20 49 74 20 63 6f 6e 74 61 69 6e 73 20 74 68    It contains th
122f0 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
12300 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20 74 68 61  ction handle tha
12310 74 20 77 69 6c 6c 20 62 65 0d 0a 20 20 20 20 20  t will be..     
12320 20 23 20 20 20 20 20 20 20 75 73 65 64 20 74 6f   #       used to
12330 20 65 78 65 63 75 74 65 20 74 68 65 20 71 75 65   execute the que
12340 72 79 20 75 73 65 64 20 74 6f 20 64 65 74 65 72  ry used to deter
12350 6d 69 6e 65 20 69 66 20 74 68 65 20 6e 61 6d 65  mine if the name
12360 64 20 74 61 62 6c 65 20 69 73 0d 0a 20 20 20 20  d table is..    
12370 20 20 23 20 20 20 20 20 20 20 70 72 65 73 65 6e    #       presen
12380 74 20 69 6e 20 74 68 61 74 20 64 61 74 61 62 61  t in that databa
12390 73 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  se...      #..  
123a0 20 20 20 20 75 70 76 61 72 20 31 20 24 76 61 72      upvar 1 $var
123b0 4e 61 6d 65 20 64 62 0d 0a 0d 0a 20 20 20 20 20  Name db....     
123c0 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
123d0 3a 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65  : Use the sqlite
123e0 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 74 6f  _master table to
123f0 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68   determine if th
12400 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 20 69 73  e named table is
12410 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
12420 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 64  present in the d
12430 61 74 61 62 61 73 65 2e 0d 0a 20 20 20 20 20 20  atabase...      
12440 23 0d 0a 20 20 20 20 20 20 73 65 74 20 73 71 6c  #..      set sql
12450 20 7b 0d 0a 20 20 20 20 20 20 20 20 53 45 4c 45   {..        SELE
12460 43 54 20 43 4f 55 4e 54 28 2a 29 20 46 52 4f 4d  CT COUNT(*) FROM
12470 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 57   sqlite_master W
12480 48 45 52 45 20 74 79 70 65 20 3d 20 27 74 61 62  HERE type = 'tab
12490 6c 65 27 20 41 4e 44 20 6e 61 6d 65 20 3d 20 3f  le' AND name = ?
124a0 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  ;..      }....  
124b0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
124c0 4f 54 45 3a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d  OTE: Return non-
124d0 7a 65 72 6f 20 69 66 20 74 68 65 20 6e 61 6d 65  zero if the name
124e0 64 20 74 61 62 6c 65 20 69 73 20 70 72 65 73 65  d table is prese
124f0 6e 74 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  nt...      #..  
12500 20 20 20 20 72 65 74 75 72 6e 20 5b 65 78 70 72      return [expr
12510 20 7b 0d 0a 20 20 20 20 20 20 20 20 5b 73 71 6c   {..        [sql
12520 20 65 78 65 63 75 74 65 20 2d 65 78 65 63 75 74   execute -execut
12530 65 20 73 63 61 6c 61 72 20 24 64 62 20 24 73 71  e scalar $db $sq
12540 6c 20 5b 6c 69 73 74 20 70 61 72 61 6d 31 20 53  l [list param1 S
12550 74 72 69 6e 67 20 24 6e 61 6d 65 5d 5d 20 3e 20  tring $name]] > 
12560 30 0d 0a 20 20 20 20 20 20 7d 5d 0d 0a 20 20 20  0..      }]..   
12570 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
12580 67 65 74 44 62 44 65 66 61 75 6c 74 50 61 67 65  getDbDefaultPage
12590 53 69 7a 65 20 7b 7d 20 7b 0d 0a 20 20 20 20 20  Size {} {..     
125a0 20 72 65 74 75 72 6e 20 5b 65 78 65 63 75 74 65   return [execute
125b0 53 71 6c 20 22 50 52 41 47 4d 41 20 70 61 67 65  Sql "PRAGMA page
125c0 5f 73 69 7a 65 3b 22 20 73 63 61 6c 61 72 5d 0d  _size;" scalar].
125d0 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
125e0 72 6f 63 20 67 65 74 44 62 44 65 66 61 75 6c 74  roc getDbDefault
125f0 43 61 63 68 65 53 69 7a 65 20 7b 7d 20 7b 0d 0a  CacheSize {} {..
12600 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 65 78        return [ex
12610 65 63 75 74 65 53 71 6c 20 22 50 52 41 47 4d 41  ecuteSql "PRAGMA
12620 20 63 61 63 68 65 5f 73 69 7a 65 3b 22 20 73 63   cache_size;" sc
12630 61 6c 61 72 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d  alar]..    }....
12640 0a 20 20 20 20 70 72 6f 63 20 75 73 65 4c 65 67  .    proc useLeg
12650 61 63 79 44 62 50 61 67 65 41 6e 64 43 61 63 68  acyDbPageAndCach
12660 65 53 69 7a 65 73 20 7b 20 76 61 72 4e 61 6d 65  eSizes { varName
12670 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20   } {..      #.. 
12680 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 66       # NOTE: Ref
12690 65 72 20 74 6f 20 74 68 65 20 73 70 65 63 69 66  er to the specif
126a0 69 65 64 20 76 61 72 69 61 62 6c 65 20 28 65 2e  ied variable (e.
126b0 67 2e 20 22 64 62 22 29 20 69 6e 20 74 68 65 20  g. "db") in the 
126c0 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72 0d 0a  context of our..
126d0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 61        #       ca
126e0 6c 6c 65 72 2e 20 20 49 74 20 63 6f 6e 74 61 69  ller.  It contai
126f0 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ns the database 
12700 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c  connection handl
12710 65 20 74 68 61 74 20 77 69 6c 6c 20 62 65 0d 0a  e that will be..
12720 20 20 20 20 20 20 23 20 20 20 20 20 20 20 75 73        #       us
12730 65 64 20 74 6f 20 65 78 65 63 75 74 65 20 71 75  ed to execute qu
12740 65 72 69 65 73 20 75 73 65 64 20 74 6f 20 73 65  eries used to se
12750 74 20 74 68 65 20 70 61 67 65 20 61 6e 64 20 63  t the page and c
12760 61 63 68 65 20 73 69 7a 65 73 2e 0d 0a 20 20 20  ache sizes...   
12770 20 20 20 23 0d 0a 20 20 20 20 20 20 75 70 76 61     #..      upva
12780 72 20 31 20 24 76 61 72 4e 61 6d 65 20 64 62 0d  r 1 $varName db.
12790 0a 0d 0a 20 20 20 20 20 20 73 71 6c 20 65 78 65  ...      sql exe
127a0 63 75 74 65 20 24 64 62 20 7b 0d 0a 20 20 20 20  cute $db {..    
127b0 20 20 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f      PRAGMA page_
127c0 73 69 7a 65 20 3d 20 31 30 32 34 3b 0d 0a 20 20  size = 1024;..  
127d0 20 20 20 20 20 20 50 52 41 47 4d 41 20 63 61 63        PRAGMA cac
127e0 68 65 5f 73 69 7a 65 20 3d 20 32 30 30 30 3b 0d  he_size = 2000;.
127f0 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
12800 20 20 72 65 74 75 72 6e 20 5b 6c 69 73 74 20 5c    return [list \
12810 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 71 6c  ..          [sql
12820 20 65 78 65 63 75 74 65 20 2d 65 78 65 63 75 74   execute -execut
12830 65 20 73 63 61 6c 61 72 20 24 64 62 20 22 50 52  e scalar $db "PR
12840 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 3b 22  AGMA page_size;"
12850 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b  ] \..          [
12860 73 71 6c 20 65 78 65 63 75 74 65 20 2d 65 78 65  sql execute -exe
12870 63 75 74 65 20 73 63 61 6c 61 72 20 24 64 62 20  cute scalar $db 
12880 22 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69  "PRAGMA cache_si
12890 7a 65 3b 22 5d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c  ze;"]]..    }...
128a0 0d 0a 20 20 20 20 70 72 6f 63 20 65 78 74 72 61  ..    proc extra
128b0 63 74 53 79 73 74 65 6d 44 61 74 61 53 51 4c 69  ctSystemDataSQLi
128c0 74 65 45 78 63 65 70 74 69 6f 6e 4d 65 73 73 61  teExceptionMessa
128d0 67 65 20 7b 20 76 61 6c 75 65 20 7d 20 7b 0d 0a  ge { value } {..
128e0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
128f0 20 4e 4f 54 45 3a 20 49 66 20 74 68 65 20 73 74   NOTE: If the st
12900 72 69 6e 67 20 63 6f 6e 66 6f 72 6d 73 20 74 6f  ring conforms to
12910 20 66 6f 72 6d 61 74 20 6f 66 20 74 68 65 20 6e   format of the n
12920 6f 72 6d 61 6c 20 65 78 63 65 70 74 69 6f 6e 0d  ormal exception.
12930 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 65  .      #       e
12940 72 72 6f 72 20 73 74 72 69 6e 67 73 2c 20 65 78  rror strings, ex
12950 74 72 61 63 74 20 61 6e 64 20 72 65 74 75 72 6e  tract and return
12960 20 6f 6e 6c 79 20 74 68 65 20 65 72 72 6f 72 20   only the error 
12970 6d 65 73 73 61 67 65 0d 0a 20 20 20 20 20 20 23  message..      #
12980 20 20 20 20 20 20 20 70 6f 72 74 69 6f 6e 20 69         portion i
12990 74 73 65 6c 66 2e 0d 0a 20 20 20 20 20 20 23 0d  tself...      #.
129a0 0a 20 20 20 20 20 20 73 65 74 20 70 61 74 74 65  .      set patte
129b0 72 6e 73 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20  rns [list \..   
129c0 20 20 20 7b 53 79 73 74 65 6d 5c 2e 44 61 74 61     {System\.Data
129d0 5c 2e 53 51 4c 69 74 65 5c 2e 53 51 4c 69 74 65  \.SQLite\.SQLite
129e0 45 78 63 65 70 74 69 6f 6e 20 5c 28 30 78 38 30  Exception \(0x80
129f0 30 30 34 30 30 35 5c 29 3a 20 28 2e 2b 3f 29 20  004005\): (.+?) 
12a00 20 28 3f 3a 20 29 3f 61 74 7d 20 5c 0d 0a 20 20   (?: )?at} \..  
12a10 20 20 20 20 7b 53 79 73 74 65 6d 5c 2e 44 61 74      {System\.Dat
12a20 61 5c 2e 53 51 4c 69 74 65 5c 2e 53 51 4c 69 74  a\.SQLite\.SQLit
12a30 65 45 78 63 65 70 74 69 6f 6e 3a 20 28 2e 2b 3f  eException: (.+?
12a40 29 20 20 28 3f 3a 20 29 3f 61 74 7d 20 5c 0d 0a  )  (?: )?at} \..
12a50 20 20 20 20 20 20 7b 45 61 67 6c 65 5c 2e 5f 43        {Eagle\._C
12a60 6f 6d 70 6f 6e 65 6e 74 73 5c 2e 50 75 62 6c 69  omponents\.Publi
12a70 63 5c 2e 53 63 72 69 70 74 45 78 63 65 70 74 69  c\.ScriptExcepti
12a80 6f 6e 3a 20 28 2e 2b 3f 29 20 20 28 3f 3a 20 29  on: (.+?)  (?: )
12a90 3f 61 74 7d 5d 0d 0a 0d 0a 20 20 20 20 20 20 66  ?at}]....      f
12aa0 6f 72 65 61 63 68 20 70 61 74 74 65 72 6e 20 24  oreach pattern $
12ab0 70 61 74 74 65 72 6e 73 20 7b 0d 0a 20 20 20 20  patterns {..    
12ac0 20 20 20 20 69 66 20 7b 5b 72 65 67 65 78 70 20      if {[regexp 
12ad0 2d 2d 20 24 70 61 74 74 65 72 6e 20 24 76 61 6c  -- $pattern $val
12ae0 75 65 20 64 75 6d 6d 79 20 6d 65 73 73 61 67 65  ue dummy message
12af0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
12b00 20 20 20 20 20 73 65 74 20 6d 65 73 73 61 67 65       set message
12b10 20 5b 73 74 72 69 6e 67 20 6d 61 70 20 5b 6c 69   [string map [li
12b20 73 74 20 5c 72 5c 6e 20 5c 6e 5d 20 5b 73 74 72  st \r\n \n] [str
12b30 69 6e 67 20 74 72 69 6d 20 24 6d 65 73 73 61 67  ing trim $messag
12b40 65 5d 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 73  e]]..          s
12b50 65 74 20 6c 69 6e 65 73 20 5b 73 70 6c 69 74 20  et lines [split 
12b60 24 6d 65 73 73 61 67 65 20 5c 6e 5d 0d 0a 0d 0a  $message \n]....
12b70 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 6c            if {[l
12b80 6c 65 6e 67 74 68 20 24 6c 69 6e 65 73 5d 20 3d  length $lines] =
12b90 3d 20 32 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 2} then {..   
12ba0 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 6c 69           if {[li
12bb0 6e 64 65 78 20 24 6c 69 6e 65 73 20 30 5d 20 65  ndex $lines 0] e
12bc0 71 20 5b 6c 69 6e 64 65 78 20 24 6c 69 6e 65 73  q [lindex $lines
12bd0 20 31 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20   1]} then {..   
12be0 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
12bf0 6e 20 5b 6c 69 6e 64 65 78 20 24 6c 69 6e 65 73  n [lindex $lines
12c00 20 30 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20   0]..           
12c10 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
12c20 20 20 72 65 74 75 72 6e 20 5b 61 70 70 65 6e 64    return [append
12c30 41 72 67 73 20 5b 6c 69 6e 64 65 78 20 24 6c 69  Args [lindex $li
12c40 6e 65 73 20 30 5d 20 22 20 2d 2d 20 22 20 5b 6c  nes 0] " -- " [l
12c50 69 6e 64 65 78 20 24 6c 69 6e 65 73 20 31 5d 5d  index $lines 1]]
12c60 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d  ..          }...
12c70 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
12c80 6e 20 24 6d 65 73 73 61 67 65 0d 0a 20 20 20 20  n $message..    
12c90 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
12ca0 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 24  ..      return $
12cb0 76 61 6c 75 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d  value..    }....
12cc0 0a 20 20 20 20 70 72 6f 63 20 74 72 69 6d 53 71  .    proc trimSq
12cd0 6c 20 7b 20 73 71 6c 20 7d 20 7b 0d 0a 20 20 20  l { sql } {..   
12ce0 20 20 20 72 65 74 75 72 6e 20 5b 72 65 67 73 75     return [regsu
12cf0 62 20 2d 61 6c 6c 20 2d 2d 20 7b 5c 73 2b 7d 20  b -all -- {\s+} 
12d00 5b 73 74 72 69 6e 67 20 74 72 69 6d 20 24 73 71  [string trim $sq
12d10 6c 5d 20 22 20 22 5d 0d 0a 20 20 20 20 7d 0d 0a  l] " "]..    }..
12d20 0c 0d 0a 20 20 20 20 70 72 6f 63 20 65 78 65 63  ...    proc exec
12d30 75 74 65 53 71 6c 20 7b 20 73 71 6c 20 7b 65 78  uteSql { sql {ex
12d40 65 63 75 74 65 20 6e 6f 6e 65 7d 20 7b 66 6f 72  ecute none} {for
12d50 6d 61 74 20 6e 6f 6e 65 7d 20 7b 66 69 6c 65 4e  mat none} {fileN
12d60 61 6d 65 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20  ame ""} } {..   
12d70 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
12d80 65 6e 67 74 68 20 24 66 69 6c 65 4e 61 6d 65 5d  ength $fileName]
12d90 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 73 65 74   == 0} then {set
12da0 20 66 69 6c 65 4e 61 6d 65 20 3a 6d 65 6d 6f 72   fileName :memor
12db0 79 3a 7d 0d 0a 20 20 20 20 20 20 73 65 74 75 70  y:}..      setup
12dc0 44 62 20 24 66 69 6c 65 4e 61 6d 65 20 22 22 20  Db $fileName "" 
12dd0 22 22 20 22 22 20 22 22 20 22 22 20 66 61 6c 73  "" "" "" "" fals
12de0 65 20 66 61 6c 73 65 20 66 61 6c 73 65 20 66 61  e false false fa
12df0 6c 73 65 20 64 62 20 74 72 75 65 0d 0a 0d 0a 20  lse db true.... 
12e00 20 20 20 20 20 74 72 79 20 7b 0d 0a 20 20 20 20       try {..    
12e10 20 20 20 20 72 65 74 75 72 6e 20 5b 75 70 6c 65      return [uple
12e20 76 65 6c 20 31 20 5b 6c 69 73 74 20 5c 0d 0a 20  vel 1 [list \.. 
12e30 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 20 65             sql e
12e40 78 65 63 75 74 65 20 2d 65 78 65 63 75 74 65 20  xecute -execute 
12e50 24 65 78 65 63 75 74 65 20 2d 66 6f 72 6d 61 74  $execute -format
12e60 20 24 66 6f 72 6d 61 74 20 24 64 62 20 24 73 71   $format $db $sq
12e70 6c 5d 5d 0d 0a 20 20 20 20 20 20 7d 20 66 69 6e  l]]..      } fin
12e80 61 6c 6c 79 20 7b 0d 0a 20 20 20 20 20 20 20 20  ally {..        
12e90 73 65 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 5b  set connection [
12ea0 67 65 74 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 5d  getDbConnection]
12eb0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 72 79 20  ....        try 
12ec0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 6c 65  {..          cle
12ed0 61 6e 75 70 44 62 20 24 66 69 6c 65 4e 61 6d 65  anupDb $fileName
12ee0 20 64 62 20 66 61 6c 73 65 20 66 61 6c 73 65 20   db false false 
12ef0 66 61 6c 73 65 0d 0a 20 20 20 20 20 20 20 20 7d  false..        }
12f00 20 66 69 6e 61 6c 6c 79 20 7b 0d 0a 20 20 20 20   finally {..    
12f10 20 20 20 20 20 20 6f 62 6a 65 63 74 20 66 6c 61        object fla
12f20 67 73 20 24 63 6f 6e 6e 65 63 74 69 6f 6e 20 2d  gs $connection -
12f30 4e 6f 44 69 73 70 6f 73 65 3b 20 66 72 65 65 44  NoDispose; freeD
12f40 62 43 6f 6e 6e 65 63 74 69 6f 6e 0d 0a 20 20 20  bConnection..   
12f50 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
12f60 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
12f70 72 6f 63 20 68 61 73 4e 6f 46 6c 61 67 73 20 7b  roc hasNoFlags {
12f80 20 76 61 72 4e 61 6d 65 20 6e 6f 6e 65 20 7d 20   varName none } 
12f90 7b 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20 31  {..      upvar 1
12fa0 20 24 76 61 72 4e 61 6d 65 20 66 6c 61 67 73 0d   $varName flags.
12fb0 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 69  ...      if {![i
12fc0 6e 66 6f 20 65 78 69 73 74 73 20 66 6c 61 67 73  nfo exists flags
12fd0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
12fe0 20 20 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a     return true..
12ff0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
13000 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
13010 67 74 68 20 24 66 6c 61 67 73 5d 20 3d 3d 20 30  gth $flags] == 0
13020 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
13030 20 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20    return true.. 
13040 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
13050 69 66 20 7b 24 6e 6f 6e 65 20 26 26 20 24 66 6c  if {$none && $fl
13060 61 67 73 20 65 71 20 22 4e 6f 6e 65 22 7d 20 74  ags eq "None"} t
13070 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72  hen {..        r
13080 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20  eturn true..    
13090 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74    }....      ret
130a0 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20 7d  urn false..    }
130b0 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65  .....    proc ge
130c0 74 43 6f 6e 6e 65 63 74 69 6f 6e 46 6c 61 67 73  tConnectionFlags
130d0 20 7b 20 66 69 6c 65 4e 61 6d 65 20 66 6c 61 67   { fileName flag
130e0 73 20 7b 71 75 69 65 74 20 66 61 6c 73 65 7d 20  s {quiet false} 
130f0 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
13100 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69 67 75      # NOTE: Figu
13110 72 65 20 6f 75 74 20 77 68 69 63 68 20 64 61 74  re out which dat
13120 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20  abase file name 
13130 6f 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74  or connection st
13140 72 69 6e 67 20 74 68 65 73 65 0d 0a 20 20 20 20  ring these..    
13150 20 20 23 20 20 20 20 20 20 20 63 6f 6e 6e 65 63    #       connec
13160 74 69 6f 6e 20 66 6c 61 67 73 20 77 69 6c 6c 20  tion flags will 
13170 61 63 74 75 61 6c 6c 79 20 61 70 70 6c 79 20 74  actually apply t
13180 6f 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 74 20  o.  This is not 
13190 6e 65 63 65 73 73 61 72 79 0d 0a 20 20 20 20 20  necessary..     
131a0 20 23 20 20 20 20 20 20 20 69 6e 20 71 75 69 65   #       in quie
131b0 74 20 6d 6f 64 65 20 62 65 63 61 75 73 65 20 74  t mode because t
131c0 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
131d0 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72  is only used for
131e0 20 6c 6f 67 67 69 6e 67 0d 0a 20 20 20 20 20 20   logging..      
131f0 23 20 20 20 20 20 20 20 61 6e 64 20 72 65 70 6f  #       and repo
13200 72 74 69 6e 67 20 70 75 72 70 6f 73 65 73 2e 0d  rting purposes..
13210 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
13220 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
13230 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20  n {..        if 
13240 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
13250 24 66 69 6c 65 4e 61 6d 65 5d 20 3e 20 30 7d 20  $fileName] > 0} 
13260 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
13270 20 20 73 65 74 20 64 61 74 61 62 61 73 65 20 5b    set database [
13280 61 70 70 65 6e 64 41 72 67 73 20 22 66 69 6c 65  appendArgs "file
13290 20 6e 61 6d 65 20 5c 22 22 20 24 66 69 6c 65 4e   name \"" $fileN
132a0 61 6d 65 20 5c 22 5d 0d 0a 20 20 20 20 20 20 20  ame \"]..       
132b0 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f   } elseif {[info
132c0 20 65 78 69 73 74 73 20 3a 3a 64 61 74 61 53 6f   exists ::dataSo
132d0 75 72 63 65 5d 20 26 26 20 5c 0d 0a 20 20 20 20  urce] && \..    
132e0 20 20 20 20 20 20 20 20 21 5b 61 72 72 61 79 20          ![array 
132f0 65 78 69 73 74 73 20 3a 3a 64 61 74 61 53 6f 75  exists ::dataSou
13300 72 63 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  rce]} then {..  
13310 20 20 20 20 20 20 20 20 73 65 74 20 64 61 74 61          set data
13320 62 61 73 65 20 5b 61 70 70 65 6e 64 41 72 67 73  base [appendArgs
13330 20 22 64 61 74 61 20 73 6f 75 72 63 65 20 5c 22   "data source \"
13340 22 20 24 3a 3a 64 61 74 61 53 6f 75 72 63 65 20  " $::dataSource 
13350 5c 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65  \"]..        } e
13360 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
13370 20 73 65 74 20 64 61 74 61 62 61 73 65 20 3c 75   set database <u
13380 6e 6b 6e 6f 77 6e 3e 0d 0a 20 20 20 20 20 20 20  nknown>..       
13390 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20   }..      }.... 
133a0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
133b0 4e 4f 54 45 3a 20 45 76 65 6e 20 74 68 6f 75 67  NOTE: Even thoug
133c0 68 20 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20  h there is only 
133d0 6f 6e 65 20 73 6f 75 72 63 65 20 6f 66 20 66 6c  one source of fl
133e0 61 67 73 20 73 6f 20 66 61 72 2c 20 74 68 65 79  ags so far, they
133f0 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
13400 6d 75 73 74 20 62 65 20 63 6f 6d 62 69 6e 65 64  must be combined
13410 20 75 73 69 6e 67 20 74 68 65 20 63 6f 72 72 65   using the corre
13420 63 74 20 73 79 6e 74 61 78 20 66 6f 72 20 65 6e  ct syntax for en
13430 75 6d 65 72 61 74 65 64 0d 0a 20 20 20 20 20 20  umerated..      
13440 23 20 20 20 20 20 20 20 66 6c 61 67 20 76 61 6c  #       flag val
13450 75 65 73 20 66 6f 72 20 74 68 65 20 2e 4e 45 54  ues for the .NET
13460 20 46 72 61 6d 65 77 6f 72 6b 2e 0d 0a 20 20 20   Framework...   
13470 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20     #..      set 
13480 66 6c 61 67 73 20 5b 63 6f 6d 62 69 6e 65 46 6c  flags [combineFl
13490 61 67 73 20 24 66 6c 61 67 73 20 22 22 5d 0d 0a  ags $flags ""]..
134a0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
134b0 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20 28 61   # NOTE: Show (a
134c0 6e 64 20 6c 6f 67 29 20 74 68 65 20 6c 6f 63 61  nd log) the loca
134d0 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61  l connection fla
134e0 67 73 20 61 6e 64 20 74 68 65 20 61 73 73 6f 63  gs and the assoc
134f0 69 61 74 65 64 0d 0a 20 20 20 20 20 20 23 20 20  iated..      #  
13500 20 20 20 20 20 64 61 74 61 20 73 6f 75 72 63 65       data source
13510 20 6f 72 20 66 69 6c 65 20 6e 61 6d 65 2e 0d 0a   or file name...
13520 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
13530 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
13540 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   {..        if {
13550 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
13560 6e 6f 28 65 6d 69 74 4c 6f 63 61 6c 46 6c 61 67  no(emitLocalFlag
13570 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  s)] && \..      
13580 20 20 20 20 20 20 28 21 5b 69 6e 66 6f 20 65 78        (![info ex
13590 69 73 74 73 20 3a 3a 6e 6f 28 65 6d 69 74 4c 6f  ists ::no(emitLo
135a0 63 61 6c 46 6c 61 67 73 49 66 4e 6f 6e 65 29 5d  calFlagsIfNone)]
135b0 20 7c 7c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   || \..         
135c0 20 20 20 20 21 5b 68 61 73 4e 6f 46 6c 61 67 73      ![hasNoFlags
135d0 20 66 6c 61 67 73 20 66 61 6c 73 65 5d 29 7d 20   flags false])} 
135e0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
135f0 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
13600 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
13610 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
13620 20 20 20 20 20 22 2d 2d 2d 2d 20 6c 6f 63 61 6c       "---- local
13630 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67   connection flag
13640 73 20 66 6f 72 20 22 20 24 64 61 74 61 62 61 73  s for " $databas
13650 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
13660 20 20 20 22 20 61 72 65 3a 20 22 20 5b 65 78 70     " are: " [exp
13670 72 20 7b 21 5b 68 61 73 4e 6f 46 6c 61 67 73 20  r {![hasNoFlags 
13680 66 6c 61 67 73 20 66 61 6c 73 65 5d 20 3f 20 5c  flags false] ? \
13690 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
136a0 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 22 20 24  [appendArgs \" $
136b0 66 6c 61 67 73 20 5c 22 5d 20 3a 20 22 3c 6e 6f  flags \"] : "<no
136c0 6e 65 3e 22 7d 5d 20 5c 6e 5d 0d 0a 20 20 20 20  ne>"}] \n]..    
136d0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
136e0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
136f0 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20 28 61   # NOTE: Show (a
13700 6e 64 20 6c 6f 67 29 20 74 68 65 20 73 68 61 72  nd log) the shar
13710 65 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c  ed connection fl
13720 61 67 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ags...      #.. 
13730 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
13740 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
13750 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
13760 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74            object
13770 20 69 6e 76 6f 6b 65 20 53 79 73 74 65 6d 2e 44   invoke System.D
13780 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74  ata.SQLite.SQLit
13790 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 53 68 61 72  eConnection Shar
137a0 65 64 46 6c 61 67 73 0d 0a 20 20 20 20 20 20 20  edFlags..       
137b0 20 7d 20 73 68 61 72 65 64 46 6c 61 67 73 5d 20   } sharedFlags] 
137c0 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
137d0 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
137e0 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 65  fo exists ::no(e
137f0 6d 69 74 53 68 61 72 65 64 46 6c 61 67 73 29 5d  mitSharedFlags)]
13800 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
13810 20 20 20 20 20 28 21 5b 69 6e 66 6f 20 65 78 69       (![info exi
13820 73 74 73 20 3a 3a 6e 6f 28 65 6d 69 74 53 68 61  sts ::no(emitSha
13830 72 65 64 46 6c 61 67 73 49 66 4e 6f 6e 65 29 5d  redFlagsIfNone)]
13840 20 7c 7c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   || \..         
13850 20 20 20 20 20 20 21 5b 68 61 73 4e 6f 46 6c 61        ![hasNoFla
13860 67 73 20 73 68 61 72 65 64 46 6c 61 67 73 20 74  gs sharedFlags t
13870 72 75 65 5d 29 7d 20 74 68 65 6e 20 7b 0d 0a 20  rue])} then {.. 
13880 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
13890 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
138a0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
138b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
138c0 22 2d 2d 2d 2d 20 73 68 61 72 65 64 20 63 6f 6e  "---- shared con
138d0 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 66 6f  nection flags fo
138e0 72 20 22 20 24 64 61 74 61 62 61 73 65 20 5c 0d  r " $database \.
138f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13900 20 22 20 61 72 65 3a 20 22 20 5b 65 78 70 72 20   " are: " [expr 
13910 7b 21 5b 68 61 73 4e 6f 46 6c 61 67 73 20 73 68  {![hasNoFlags sh
13920 61 72 65 64 46 6c 61 67 73 20 74 72 75 65 5d 20  aredFlags true] 
13930 3f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ? \..           
13940 20 20 20 20 20 5b 61 70 70 65 6e 64 41 72 67 73       [appendArgs
13950 20 5c 22 20 24 73 68 61 72 65 64 46 6c 61 67 73   \" $sharedFlags
13960 20 5c 22 5d 20 3a 20 22 3c 6e 6f 6e 65 3e 22 7d   \"] : "<none>"}
13970 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  ] \n]..         
13980 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c   }..        } el
13990 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
139a0 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
139b0 73 20 3a 3a 6e 6f 28 65 6d 69 74 53 68 61 72 65  s ::no(emitShare
139c0 64 46 6c 61 67 73 29 5d 20 26 26 20 5c 0d 0a 20  dFlags)] && \.. 
139d0 20 20 20 20 20 20 20 20 20 20 20 20 20 21 5b 69               ![i
139e0 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
139f0 65 6d 69 74 53 68 61 72 65 64 46 6c 61 67 73 49  emitSharedFlagsI
13a00 66 55 6e 61 76 61 69 6c 61 62 6c 65 29 5d 7d 20  fUnavailable)]} 
13a10 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
13a20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
13a30 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
13a40 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
13a50 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73           "---- s
13a60 68 61 72 65 64 20 63 6f 6e 6e 65 63 74 69 6f 6e  hared connection
13a70 20 66 6c 61 67 73 20 66 6f 72 20 22 20 24 64 61   flags for " $da
13a80 74 61 62 61 73 65 20 5c 0d 0a 20 20 20 20 20 20  tabase \..      
13a90 20 20 20 20 20 20 20 20 20 20 22 20 61 72 65 3a            " are:
13aa0 20 3c 75 6e 61 76 61 69 6c 61 62 6c 65 3e 5c 6e   <unavailable>\n
13ab0 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  "]..          }.
13ac0 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
13ad0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
13ae0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 68        # NOTE: Sh
13af0 6f 77 20 28 61 6e 64 20 6c 6f 67 29 20 74 68 65  ow (and log) the
13b00 20 64 65 74 65 63 74 65 64 20 67 6c 6f 62 61 6c   detected global
13b10 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67   connection flag
13b20 73 2c 20 69 66 20 61 6e 79 2e 0d 0a 20 20 20 20  s, if any...    
13b30 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 21    #..      if {!
13b40 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
13b50 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
13b60 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 65  fo exists ::no(e
13b70 6d 69 74 47 6c 6f 62 61 6c 46 6c 61 67 73 29 5d  mitGlobalFlags)]
13b80 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
13b90 20 20 20 28 21 5b 69 6e 66 6f 20 65 78 69 73 74     (![info exist
13ba0 73 20 3a 3a 6e 6f 28 65 6d 69 74 47 6c 6f 62 61  s ::no(emitGloba
13bb0 6c 46 6c 61 67 73 49 66 4e 6f 6e 65 29 5d 20 7c  lFlagsIfNone)] |
13bc0 7c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  | \..           
13bd0 20 20 21 5b 68 61 73 4e 6f 46 6c 61 67 73 20 3a    ![hasNoFlags :
13be0 3a 63 6f 6e 6e 65 63 74 69 6f 6e 5f 66 6c 61 67  :connection_flag
13bf0 73 20 66 61 6c 73 65 5d 29 7d 20 74 68 65 6e 20  s false])} then 
13c00 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75  {..          tpu
13c10 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
13c20 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
13c30 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
13c40 22 2d 2d 2d 2d 20 67 6c 6f 62 61 6c 20 63 6f 6e  "---- global con
13c50 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 61 72  nection flags ar
13c60 65 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20  e: " \..        
13c70 20 20 20 20 20 20 5b 65 78 70 72 20 7b 21 5b 68        [expr {![h
13c80 61 73 4e 6f 46 6c 61 67 73 20 3a 3a 63 6f 6e 6e  asNoFlags ::conn
13c90 65 63 74 69 6f 6e 5f 66 6c 61 67 73 20 66 61 6c  ection_flags fal
13ca0 73 65 5d 20 3f 20 5c 0d 0a 20 20 20 20 20 20 20  se] ? \..       
13cb0 20 20 20 20 20 20 20 5b 61 70 70 65 6e 64 41 72         [appendAr
13cc0 67 73 20 5c 22 20 24 3a 3a 63 6f 6e 6e 65 63 74  gs \" $::connect
13cd0 69 6f 6e 5f 66 6c 61 67 73 20 5c 22 5d 20 3a 20  ion_flags \"] : 
13ce0 22 3c 6e 6f 6e 65 3e 22 7d 5d 20 5c 6e 5d 0d 0a  "<none>"}] \n]..
13cf0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
13d00 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   }....      #.. 
13d10 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20       # NOTE: If 
13d20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 67 6c  there are any gl
13d30 6f 62 61 6c 20 28 70 65 72 20 74 65 73 74 20 72  obal (per test r
13d40 75 6e 29 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66  un) connection f
13d50 6c 61 67 73 20 63 75 72 72 65 6e 74 6c 79 0d 0a  lags currently..
13d60 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73 65        #       se
13d70 74 2c 20 75 73 65 20 74 68 65 6d 20 6e 6f 77 20  t, use them now 
13d80 28 69 2e 65 2e 20 62 79 20 63 6f 6d 62 69 6e 69  (i.e. by combini
13d90 6e 67 20 74 68 65 6d 20 77 69 74 68 20 74 68 65  ng them with the
13da0 20 6f 6e 65 73 20 66 6f 72 20 74 68 69 73 0d 0a   ones for this..
13db0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f        #       co
13dc0 6e 6e 65 63 74 69 6f 6e 29 2e 0d 0a 20 20 20 20  nnection)...    
13dd0 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
13de0 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 63 6f  info exists ::co
13df0 6e 6e 65 63 74 69 6f 6e 5f 66 6c 61 67 73 5d 7d  nnection_flags]}
13e00 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
13e10 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
13e20 54 45 3a 20 43 6f 6d 62 69 6e 65 20 61 6e 64 2f  TE: Combine and/
13e30 6f 72 20 72 65 70 6c 61 63 65 20 74 68 65 20 63  or replace the c
13e40 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 20  onnection flags 
13e50 61 6e 64 20 74 68 65 6e 20 73 68 6f 77 20 74 68  and then show th
13e60 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
13e70 20 20 20 6e 65 77 20 76 61 6c 75 65 2e 0d 0a 20     new value... 
13e80 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
13e90 20 20 73 65 74 20 66 6c 61 67 73 20 5b 63 6f 6d    set flags [com
13ea0 62 69 6e 65 46 6c 61 67 73 20 24 66 6c 61 67 73  bineFlags $flags
13eb0 20 24 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e 5f 66   $::connection_f
13ec0 6c 61 67 73 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  lags]....       
13ed0 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
13ee0 54 45 3a 20 53 68 6f 77 20 28 61 6e 64 20 6c 6f  TE: Show (and lo
13ef0 67 29 20 74 68 65 20 6e 65 77 20 65 66 66 65 63  g) the new effec
13f00 74 69 76 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  tive connection 
13f10 66 6c 61 67 73 2e 0d 0a 20 20 20 20 20 20 20 20  flags...        
13f20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21  #..        if {!
13f30 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
13f40 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
13f50 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
13f60 28 65 6d 69 74 43 6f 6d 62 69 6e 65 64 46 6c 61  (emitCombinedFla
13f70 67 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  gs)] && \..     
13f80 20 20 20 20 20 20 20 20 20 28 21 5b 69 6e 66 6f           (![info
13f90 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 65 6d 69   exists ::no(emi
13fa0 74 43 6f 6d 62 69 6e 65 64 46 6c 61 67 73 49 66  tCombinedFlagsIf
13fb0 4e 6f 6e 65 29 5d 20 7c 7c 20 5c 0d 0a 20 20 20  None)] || \..   
13fc0 20 20 20 20 20 20 20 20 20 20 20 20 21 5b 68 61              ![ha
13fd0 73 4e 6f 46 6c 61 67 73 20 66 6c 61 67 73 20 66  sNoFlags flags f
13fe0 61 6c 73 65 5d 29 7d 20 74 68 65 6e 20 7b 0d 0a  alse])} then {..
13ff0 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
14000 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
14010 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
14020 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14030 20 22 2d 2d 2d 2d 20 63 6f 6d 62 69 6e 65 64 20   "---- combined 
14040 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73  connection flags
14050 20 66 6f 72 20 22 20 24 64 61 74 61 62 61 73 65   for " $database
14060 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
14070 20 20 20 20 22 20 61 72 65 3a 20 22 20 5b 65 78      " are: " [ex
14080 70 72 20 7b 21 5b 68 61 73 4e 6f 46 6c 61 67 73  pr {![hasNoFlags
14090 20 66 6c 61 67 73 20 66 61 6c 73 65 5d 20 3f 20   flags false] ? 
140a0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
140b0 20 20 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c     [appendArgs \
140c0 22 20 24 66 6c 61 67 73 20 5c 22 5d 20 3a 20 22  " $flags \"] : "
140d0 3c 6e 6f 6e 65 3e 22 7d 5d 20 5c 6e 5d 0d 0a 20  <none>"}] \n].. 
140e0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
140f0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
14100 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 24  ..      return $
14110 66 6c 61 67 73 0d 0a 20 20 20 20 7d 0d 0a 0c 0d  flags..    }....
14120 0a 20 20 20 20 70 72 6f 63 20 67 65 74 46 6c 61  .    proc getFla
14130 67 73 50 72 6f 70 65 72 74 79 20 7b 20 7b 66 6c  gsProperty { {fl
14140 61 67 73 20 22 22 7d 20 7b 71 75 69 65 74 20 66  ags ""} {quiet f
14150 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  alse} } {..     
14160 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
14170 3a 20 44 65 74 65 72 6d 69 6e 65 20 77 68 61 74  : Determine what
14180 20 74 68 65 20 63 6f 6d 62 69 6e 65 64 20 28 67   the combined (g
14190 6c 6f 62 61 6c 20 61 6e 64 20 6c 6f 63 61 6c 29  lobal and local)
141a0 20 63 6f 6e 6e 65 63 74 69 6f 6e 0d 0a 20 20 20   connection..   
141b0 20 20 20 23 20 20 20 20 20 20 20 66 6c 61 67 73     #       flags
141c0 20 73 68 6f 75 6c 64 20 62 65 2c 20 70 6f 73 73   should be, poss
141d0 69 62 6c 79 20 71 75 69 65 74 6c 79 2e 0d 0a 20  ibly quietly... 
141e0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65       #..      se
141f0 74 20 66 6c 61 67 73 20 5b 67 65 74 43 6f 6e 6e  t flags [getConn
14200 65 63 74 69 6f 6e 46 6c 61 67 73 20 22 22 20 24  ectionFlags "" $
14210 66 6c 61 67 73 20 24 71 75 69 65 74 5d 0d 0a 0d  flags $quiet]...
14220 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
14230 23 20 4e 4f 54 45 3a 20 49 66 20 6e 6f 20 67 6c  # NOTE: If no gl
14240 6f 62 61 6c 20 6f 72 20 6c 6f 63 61 6c 20 63 6f  obal or local co
14250 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 77  nnection flags w
14260 65 72 65 20 73 70 65 63 69 66 69 65 64 2c 20 74  ere specified, t
14270 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  he..      #     
14280 20 20 64 65 66 61 75 6c 74 20 63 6f 6e 6e 65 63    default connec
14290 74 69 6f 6e 20 66 6c 61 67 73 20 73 68 6f 75 6c  tion flags shoul
142a0 64 20 62 65 20 75 73 65 64 3b 20 74 68 65 72 65  d be used; there
142b0 66 6f 72 65 2c 20 72 65 74 75 72 6e 0d 0a 20 20  fore, return..  
142c0 20 20 20 20 23 20 20 20 20 20 20 20 61 6e 20 65      #       an e
142d0 6d 70 74 79 20 73 74 72 69 6e 67 20 69 6e 20 74  mpty string in t
142e0 68 61 74 20 63 61 73 65 2e 0d 0a 20 20 20 20 20  hat case...     
142f0 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73   #..      if {[s
14300 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 66 6c  tring length $fl
14310 61 67 73 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ags] == 0} then 
14320 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  {..        retur
14330 6e 20 22 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  n ""..      }...
14340 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
14350 23 20 4e 4f 54 45 3a 20 49 6e 20 6f 72 64 65 72  # NOTE: In order
14360 20 74 6f 20 63 68 65 63 6b 20 69 66 20 74 68 65   to check if the
14370 20 64 65 66 61 75 6c 74 20 63 6f 6e 6e 65 63 74   default connect
14380 69 6f 6e 20 66 6c 61 67 73 20 61 72 65 20 62 65  ion flags are be
14390 69 6e 67 20 75 73 65 64 0d 0a 20 20 20 20 20 20  ing used..      
143a0 23 20 20 20 20 20 20 20 69 74 20 69 73 20 6e 65  #       it is ne
143b0 63 65 73 73 61 72 79 20 74 6f 20 61 74 74 65 6d  cessary to attem
143c0 70 74 20 61 20 63 6f 6e 76 65 72 73 69 6f 6e 20  pt a conversion 
143d0 74 6f 20 74 68 65 20 61 63 74 75 61 6c 20 65 6e  to the actual en
143e0 75 6d 65 72 61 74 65 64 0d 0a 20 20 20 20 20 20  umerated..      
143f0 23 20 20 20 20 20 20 20 74 79 70 65 2e 20 20 46  #       type.  F
14400 61 69 6c 69 6e 67 20 74 68 61 74 2c 20 74 68 65  ailing that, the
14410 20 63 68 65 63 6b 20 61 67 61 69 6e 73 74 20 74   check against t
14420 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  he default value
14430 20 77 69 6c 6c 20 62 65 0d 0a 20 20 20 20 20 20   will be..      
14440 23 20 20 20 20 20 20 20 73 6b 69 70 70 65 64 2e  #       skipped.
14450 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
14460 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
14470 20 20 20 20 20 20 20 73 65 74 20 65 72 72 6f 72         set error
14480 20 6e 75 6c 6c 3b 20 23 20 49 47 4e 4f 52 45 44   null; # IGNORED
14490 0d 0a 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a 65  ....        obje
144a0 63 74 20 69 6e 76 6f 6b 65 20 55 74 69 6c 69 74  ct invoke Utilit
144b0 79 20 54 72 79 50 61 72 73 65 46 6c 61 67 73 45  y TryParseFlagsE
144c0 6e 75 6d 20 22 22 20 5c 0d 0a 20 20 20 20 20 20  num "" \..      
144d0 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74        System.Dat
144e0 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 43  a.SQLite.SQLiteC
144f0 6f 6e 6e 65 63 74 69 6f 6e 46 6c 61 67 73 20 22  onnectionFlags "
14500 22 20 24 66 6c 61 67 73 20 6e 75 6c 6c 20 74 72  " $flags null tr
14510 75 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ue \..          
14520 20 20 74 72 75 65 20 74 72 75 65 20 65 72 72 6f    true true erro
14530 72 0d 0a 20 20 20 20 20 20 7d 20 76 61 6c 75 65  r..      } value
14540 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
14550 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
14560 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 69 6e 67  NOTE: Attempting
14570 20 74 6f 20 70 61 72 73 65 20 74 68 65 20 63 6f   to parse the co
14580 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 63  nnection flags c
14590 61 75 73 65 64 20 61 20 73 63 72 69 70 74 0d 0a  aused a script..
145a0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
145b0 65 72 72 6f 72 2e 20 20 45 6d 69 74 20 61 20 77  error.  Emit a w
145c0 61 72 6e 69 6e 67 20 74 6f 20 74 68 65 20 74 65  arning to the te
145d0 73 74 20 6c 6f 67 20 66 69 6c 65 20 61 6e 64 20  st log file and 
145e0 63 6f 6e 74 69 6e 75 65 0d 0a 20 20 20 20 20 20  continue..      
145f0 20 20 23 20 20 20 20 20 20 20 75 73 69 6e 67 20    #       using 
14600 61 6e 20 65 6d 74 70 79 20 73 74 72 69 6e 67 20  an emtpy string 
14610 69 6e 73 74 65 61 64 2e 0d 0a 20 20 20 20 20 20  instead...      
14620 20 20 23 0d 0a 20 20 20 20 20 20 20 20 74 6c 6f    #..        tlo
14630 67 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  g [appendArgs \.
14640 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d  .            "==
14650 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c  == WARNING: fail
14660 65 64 20 74 6f 20 70 61 72 73 65 20 63 6f 6e 6e  ed to parse conn
14670 65 63 74 69 6f 6e 20 66 6c 61 67 73 2c 20 65 72  ection flags, er
14680 72 6f 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20  ror: " \..      
14690 20 20 20 20 20 20 5c 6e 5c 74 20 24 76 61 6c 75        \n\t $valu
146a0 65 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  e \n]....       
146b0 20 73 65 74 20 76 61 6c 75 65 20 22 22 0d 0a 20   set value "".. 
146c0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
146d0 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
146e0 20 49 66 20 74 68 65 20 63 6f 6d 62 69 6e 65 64   If the combined
146f0 20 66 6c 61 67 73 20 73 74 72 69 6e 67 20 63 6f   flags string co
14700 75 6c 64 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79  uld not actually
14710 20 62 65 20 63 6f 6e 76 65 72 74 65 64 0d 0a 20   be converted.. 
14720 20 20 20 20 20 23 20 20 20 20 20 20 20 74 6f 20       #       to 
14730 74 68 65 20 65 6e 75 6d 65 72 61 74 65 64 20 74  the enumerated t
14740 79 70 65 20 69 74 20 69 73 20 74 68 65 20 64 65  ype it is the de
14750 66 61 75 6c 74 20 76 61 6c 75 65 2c 20 74 68 65  fault value, the
14760 6e 20 6a 75 73 74 20 75 73 65 0d 0a 20 20 20 20  n just use..    
14770 20 20 23 20 20 20 20 20 20 20 69 74 20 76 65 72    #       it ver
14780 62 61 74 69 6d 3b 20 6f 74 68 65 72 77 69 73 65  batim; otherwise
14790 2c 20 6a 75 73 74 20 72 65 74 75 72 6e 20 61 6e  , just return an
147a0 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e 20 20   empty string.  
147b0 49 6e 20 74 68 61 74 0d 0a 20 20 20 20 20 20 23  In that..      #
147c0 20 20 20 20 20 20 20 63 61 73 65 2c 20 74 68 65         case, the
147d0 20 64 65 66 61 75 6c 74 20 63 6f 6e 6e 65 63 74   default connect
147e0 69 6f 6e 20 66 6c 61 67 73 20 77 69 6c 6c 20 62  ion flags will b
147f0 65 20 75 73 65 64 2e 0d 0a 20 20 20 20 20 20 23  e used...      #
14800 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72  ..      if {[str
14810 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 61 6c 75  ing length $valu
14820 65 5d 20 3d 3d 20 30 20 7c 7c 20 24 76 61 6c 75  e] == 0 || $valu
14830 65 20 6e 65 20 22 44 65 66 61 75 6c 74 22 7d 20  e ne "Default"} 
14840 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
14850 23 0d 0a 20 20 20 20 20 20 20 20 23 20 57 41 52  #..        # WAR
14860 4e 49 4e 47 3a 20 54 68 69 73 20 72 65 74 75 72  NING: This retur
14870 6e 73 20 74 68 65 20 73 74 72 69 6e 67 20 76 61  ns the string va
14880 6c 75 65 20 6f 66 20 74 68 65 20 63 6f 6d 62 69  lue of the combi
14890 6e 65 64 20 66 6c 61 67 73 2c 20 6e 6f 74 0d 0a  ned flags, not..
148a0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
148b0 20 20 20 74 68 65 20 65 6e 75 6d 65 72 61 74 65     the enumerate
148c0 64 20 76 61 6c 75 65 2e 20 20 54 68 69 73 20 69  d value.  This i
148d0 73 20 62 79 20 64 65 73 69 67 6e 20 61 6e 64 20  s by design and 
148e0 73 68 6f 75 6c 64 20 6e 6f 74 0d 0a 20 20 20 20  should not..    
148f0 20 20 20 20 23 20 20 20 20 20 20 20 20 20 20 62      #          b
14900 65 20 63 68 61 6e 67 65 64 20 77 69 74 68 6f 75  e changed withou
14910 74 20 63 61 72 65 66 75 6c 20 63 6f 6e 73 69 64  t careful consid
14920 65 72 61 74 69 6f 6e 20 28 65 2e 67 2e 20 69 74  eration (e.g. it
14930 20 77 6f 75 6c 64 0d 0a 20 20 20 20 20 20 20 20   would..        
14940 23 20 20 20 20 20 20 20 20 20 20 70 72 65 76 65  #          preve
14950 6e 74 20 74 68 65 20 53 51 4c 69 74 65 43 6f 6e  nt the SQLiteCon
14960 6e 65 63 74 69 6f 6e 20 63 6c 61 73 73 20 66 72  nection class fr
14970 6f 6d 20 61 6c 6c 6f 77 69 6e 67 20 69 6e 76 61  om allowing inva
14980 6c 69 64 0d 0a 20 20 20 20 20 20 20 20 23 20 20  lid..        #  
14990 20 20 20 20 20 20 20 20 5b 22 6d 61 67 69 63 61          ["magica
149a0 6c 22 5d 20 6d 65 74 61 2d 66 6c 61 67 73 29 2e  l"] meta-flags).
149b0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
149c0 20 20 20 20 20 72 65 74 75 72 6e 20 5b 61 70 70       return [app
149d0 65 6e 64 41 72 67 73 20 22 46 6c 61 67 73 3d 22  endArgs "Flags="
149e0 20 24 66 6c 61 67 73 20 5c 3b 5d 0d 0a 20 20 20   $flags \;]..   
149f0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65     }....      re
14a00 74 75 72 6e 20 22 22 0d 0a 20 20 20 20 7d 0d 0a  turn ""..    }..
14a10 0c 0d 0a 20 20 20 20 70 72 6f 63 20 65 6e 61 62  ...    proc enab
14a20 6c 65 53 68 61 72 65 64 43 61 63 68 65 20 7b 20  leSharedCache { 
14a30 63 68 61 6e 6e 65 6c 20 65 6e 61 62 6c 65 20 7b  channel enable {
14a40 71 75 69 65 74 20 66 61 6c 73 65 7d 20 7d 20 7b  quiet false} } {
14a50 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74  ..      if {[cat
14a60 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 6f 62  ch {..        ob
14a70 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61  ject invoke -fla
14a80 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d  gs +NonPublic \.
14a90 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73  .            Sys
14aa0 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
14ab0 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68  UnsafeNativeMeth
14ac0 6f 64 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ods \..         
14ad0 20 20 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c     sqlite3_enabl
14ae0 65 5f 73 68 61 72 65 64 5f 63 61 63 68 65 20 5b  e_shared_cache [
14af0 65 78 70 72 20 69 6e 74 28 24 65 6e 61 62 6c 65  expr int($enable
14b00 29 5d 0d 0a 20 20 20 20 20 20 7d 20 72 65 73 75  )]..      } resu
14b10 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  lt] == 0} then {
14b20 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 24  ..        if {!$
14b30 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
14b40 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
14b50 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
14b60 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
14b70 20 20 20 20 20 22 2d 2d 2d 2d 20 63 61 6c 6c 20       "---- call 
14b80 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 73  sqlite3_enable_s
14b90 68 61 72 65 64 5f 63 61 63 68 65 28 22 20 24 65  hared_cache(" $e
14ba0 6e 61 62 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20  nable \..       
14bb0 20 20 20 20 20 20 20 22 29 2e 2e 2e 20 6f 6b 3a         ")... ok:
14bc0 20 22 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a   " $result \n]..
14bd0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
14be0 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
14bf0 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
14c00 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
14c10 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
14c20 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
14c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
14c40 2d 2d 2d 20 63 61 6c 6c 20 73 71 6c 69 74 65 33  --- call sqlite3
14c50 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f 63  _enable_shared_c
14c60 61 63 68 65 28 22 20 24 65 6e 61 62 6c 65 20 5c  ache(" $enable \
14c70 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
14c80 22 29 2e 2e 2e 20 65 72 72 6f 72 3a 20 22 20 5c  ")... error: " \
14c90 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d  n\t $result \n].
14ca0 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
14cb0 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
14cc0 20 20 20 70 72 6f 63 20 73 65 74 75 70 44 62 20     proc setupDb 
14cd0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  {..            f
14ce0 69 6c 65 4e 61 6d 65 20 7b 6d 6f 64 65 20 22 22  ileName {mode ""
14cf0 7d 20 7b 64 61 74 65 54 69 6d 65 46 6f 72 6d 61  } {dateTimeForma
14d00 74 20 22 22 7d 20 7b 64 61 74 65 54 69 6d 65 4b  t ""} {dateTimeK
14d10 69 6e 64 20 22 22 7d 20 7b 66 6c 61 67 73 20 22  ind ""} {flags "
14d20 22 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  "}..            
14d30 7b 65 78 74 72 61 20 22 22 7d 20 7b 71 75 61 6c  {extra ""} {qual
14d40 69 66 79 20 74 72 75 65 7d 20 7b 64 65 6c 65 74  ify true} {delet
14d50 65 20 74 72 75 65 7d 20 7b 75 72 69 20 66 61 6c  e true} {uri fal
14d60 73 65 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  se}..           
14d70 20 7b 74 65 6d 70 6f 72 61 72 79 20 74 72 75 65   {temporary true
14d80 7d 20 7b 76 61 72 4e 61 6d 65 20 64 62 7d 20 7b  } {varName db} {
14d90 71 75 69 65 74 20 66 61 6c 73 65 7d 20 7d 20 7b  quiet false} } {
14da0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
14db0 20 23 20 4e 4f 54 45 3a 20 46 69 72 73 74 2c 20   # NOTE: First, 
14dc0 73 65 65 20 69 66 20 6f 75 72 20 63 61 6c 6c 65  see if our calle
14dd0 72 20 68 61 73 20 72 65 71 75 65 73 74 65 64 20  r has requested 
14de0 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
14df0 61 62 61 73 65 2e 0d 0a 20 20 20 20 20 20 23 0d  abase...      #.
14e00 0a 20 20 20 20 20 20 73 65 74 20 69 73 4d 65 6d  .      set isMem
14e10 6f 72 79 20 5b 69 73 4d 65 6d 6f 72 79 44 62 20  ory [isMemoryDb 
14e20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20 20  $fileName]....  
14e30 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
14e40 4f 54 45 3a 20 46 6f 72 20 6e 6f 77 2c 20 61 6c  OTE: For now, al
14e50 6c 20 74 65 73 74 20 64 61 74 61 62 61 73 65 73  l test databases
14e60 20 75 73 65 64 20 62 79 20 74 68 65 20 74 65 73   used by the tes
14e70 74 20 73 75 69 74 65 20 61 72 65 20 70 6c 61 63  t suite are plac
14e80 65 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ed..      #     
14e90 20 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62    into the datab
14ea0 61 73 65 20 64 69 72 65 63 74 6f 72 79 2e 20 20  ase directory.  
14eb0 45 61 63 68 20 64 61 74 61 62 61 73 65 20 61 6e  Each database an
14ec0 64 20 72 65 6c 61 74 65 64 20 66 69 6c 65 73 0d  d related files.
14ed0 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 75  .      #       u
14ee0 73 65 64 20 62 79 20 61 20 74 65 73 74 20 73 68  sed by a test sh
14ef0 6f 75 6c 64 20 62 65 20 63 6c 65 61 6e 65 64 20  ould be cleaned 
14f00 75 70 20 62 79 20 74 68 61 74 20 74 65 73 74 20  up by that test 
14f10 75 73 69 6e 67 20 74 68 65 0d 0a 20 20 20 20 20  using the..     
14f20 20 23 20 20 20 20 20 20 20 22 63 6c 65 61 6e 75   #       "cleanu
14f30 70 44 62 22 20 70 72 6f 63 65 64 75 72 65 2c 20  pDb" procedure, 
14f40 62 65 6c 6f 77 2e 0d 0a 20 20 20 20 20 20 23 0d  below...      #.
14f50 0a 20 20 20 20 20 20 69 66 20 7b 21 24 69 73 4d  .      if {!$isM
14f60 65 6d 6f 72 79 20 26 26 20 24 71 75 61 6c 69 66  emory && $qualif
14f70 79 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  y} then {..     
14f80 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 20     set fileName 
14f90 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 44  [file join [getD
14fa0 61 74 61 62 61 73 65 44 69 72 65 63 74 6f 72 79  atabaseDirectory
14fb0 5d 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69  ] [file tail $fi
14fc0 6c 65 4e 61 6d 65 5d 5d 0d 0a 20 20 20 20 20 20  leName]]..      
14fd0 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
14fe0 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 79 20 64      # NOTE: By d
14ff0 65 66 61 75 6c 74 2c 20 64 65 6c 65 74 65 20 61  efault, delete a
15000 6e 79 20 70 72 65 2d 65 78 69 73 74 69 6e 67 20  ny pre-existing 
15010 64 61 74 61 62 61 73 65 20 77 69 74 68 20 74 68  database with th
15020 65 20 73 61 6d 65 20 66 69 6c 65 0d 0a 20 20 20  e same file..   
15030 20 20 20 23 20 20 20 20 20 20 20 6e 61 6d 65 20     #       name 
15040 69 66 20 69 74 20 63 75 72 72 65 6e 74 6c 79 20  if it currently 
15050 65 78 69 73 74 73 2e 0d 0a 20 20 20 20 20 20 23  exists...      #
15060 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 24 69 73  ..      if {!$is
15070 4d 65 6d 6f 72 79 20 26 26 20 24 64 65 6c 65 74  Memory && $delet
15080 65 20 26 26 20 5b 66 69 6c 65 20 65 78 69 73 74  e && [file exist
15090 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68  s $fileName]} th
150a0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
150b0 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
150c0 20 41 74 74 65 6d 70 74 20 74 6f 20 64 65 6c 65   Attempt to dele
150d0 74 65 20 61 6e 79 20 70 72 65 2d 65 78 69 73 74  te any pre-exist
150e0 69 6e 67 20 64 61 74 61 62 61 73 65 20 77 69 74  ing database wit
150f0 68 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 0d  h the same file.
15100 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
15110 20 6e 61 6d 65 2e 0d 0a 20 20 20 20 20 20 20 20   name...        
15120 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  #..        if {[
15130 63 61 74 63 68 20 7b 66 69 6c 65 20 64 65 6c 65  catch {file dele
15140 74 65 20 24 66 69 6c 65 4e 61 6d 65 7d 20 65 72  te $fileName} er
15150 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ror]} then {..  
15160 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
15170 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 65 20       # NOTE: We 
15180 73 6f 6d 65 68 6f 77 20 66 61 69 6c 65 64 20 74  somehow failed t
15190 6f 20 64 65 6c 65 74 65 20 74 68 65 20 66 69 6c  o delete the fil
151a0 65 2c 20 72 65 70 6f 72 74 20 77 68 79 2e 0d 0a  e, report why...
151b0 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
151c0 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
151d0 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
151e0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
151f0 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
15200 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
15210 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d               "==
15220 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c  == WARNING: fail
15230 65 64 20 74 6f 20 64 65 6c 65 74 65 20 64 61 74  ed to delete dat
15240 61 62 61 73 65 20 66 69 6c 65 20 5c 22 22 20 24  abase file \"" $
15250 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20  fileName \..    
15260 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 20              "\" 
15270 64 75 72 69 6e 67 20 73 65 74 75 70 2c 20 65 72  during setup, er
15280 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72  ror: " \n\t $err
15290 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  or \n]..        
152a0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
152b0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
152c0 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
152d0 3a 20 52 65 66 65 72 20 74 6f 20 74 68 65 20 73  : Refer to the s
152e0 70 65 63 69 66 69 65 64 20 76 61 72 69 61 62 6c  pecified variabl
152f0 65 20 28 65 2e 67 2e 20 22 64 62 22 29 20 69 6e  e (e.g. "db") in
15300 20 74 68 65 20 63 6f 6e 74 65 78 74 20 6f 66 20   the context of 
15310 6f 75 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20  our..      #    
15320 20 20 20 63 61 6c 6c 65 72 2e 20 20 54 68 65 20     caller.  The 
15330 68 61 6e 64 6c 65 20 74 6f 20 74 68 65 20 6f 70  handle to the op
15340 65 6e 65 64 20 64 61 74 61 62 61 73 65 20 77 69  ened database wi
15350 6c 6c 20 62 65 20 73 74 6f 72 65 64 20 74 68 65  ll be stored the
15360 72 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  re...      #..  
15370 20 20 20 20 75 70 76 61 72 20 31 20 24 76 61 72      upvar 1 $var
15380 4e 61 6d 65 20 64 62 0d 0a 0d 0a 20 20 20 20 20  Name db....     
15390 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
153a0 3a 20 53 74 61 72 74 20 62 75 69 6c 64 69 6e 67  : Start building
153b0 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
153c0 73 74 72 69 6e 67 2e 20 20 54 68 65 20 6f 6e 6c  string.  The onl
153d0 79 20 72 65 71 75 69 72 65 64 20 70 6f 72 74 69  y required porti
153e0 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  on..      #     
153f0 20 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74    of the connect
15400 69 6f 6e 20 73 74 72 69 6e 67 20 69 73 20 74 68  ion string is th
15410 65 20 64 61 74 61 20 73 6f 75 72 63 65 2c 20 77  e data source, w
15420 68 69 63 68 20 63 6f 6e 74 61 69 6e 73 20 74 68  hich contains th
15430 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
15440 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e   database file n
15450 61 6d 65 20 69 74 73 65 6c 66 2e 20 20 49 66 20  ame itself.  If 
15460 6f 75 72 20 63 61 6c 6c 65 72 20 77 61 6e 74 73  our caller wants
15470 20 74 6f 20 75 73 65 20 61 20 55 52 49 20 61 73   to use a URI as
15480 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
15490 74 68 65 20 64 61 74 61 20 73 6f 75 72 63 65 2c  the data source,
154a0 20 75 73 65 20 74 68 65 20 46 75 6c 6c 55 72 69   use the FullUri
154b0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69   connection stri
154c0 6e 67 20 70 72 6f 70 65 72 74 79 20 74 6f 0d 0a  ng property to..
154d0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 70 72        #       pr
154e0 65 76 65 6e 74 20 74 68 65 20 64 61 74 61 20 73  event the data s
154f0 6f 75 72 63 65 20 73 74 72 69 6e 67 20 66 72 6f  ource string fro
15500 6d 20 62 65 69 6e 67 20 6d 61 6e 67 6c 65 64 2e  m being mangled.
15510 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
15520 20 69 66 20 7b 24 75 72 69 7d 20 74 68 65 6e 20   if {$uri} then 
15530 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 63  {..        set c
15540 6f 6e 6e 65 63 74 69 6f 6e 20 7b 46 75 6c 6c 55  onnection {FullU
15550 72 69 3d 24 7b 66 69 6c 65 4e 61 6d 65 7d 7d 0d  ri=${fileName}}.
15560 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
15570 0a 20 20 20 20 20 20 20 20 73 65 74 20 63 6f 6e  .        set con
15580 6e 65 63 74 69 6f 6e 20 7b 44 61 74 61 20 53 6f  nection {Data So
15590 75 72 63 65 3d 24 7b 66 69 6c 65 4e 61 6d 65 7d  urce=${fileName}
155a0 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  }..      }....  
155b0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
155c0 4f 54 45 3a 20 53 69 6e 63 65 20 74 68 69 73 20  OTE: Since this 
155d0 70 72 6f 63 65 64 75 72 65 20 68 61 73 20 6e 6f  procedure has no
155e0 20 73 70 65 63 69 61 6c 20 6b 6e 6f 77 6c 65 64   special knowled
155f0 67 65 20 6f 66 20 77 68 61 74 20 74 68 65 20 64  ge of what the d
15600 65 66 61 75 6c 74 0d 0a 20 20 20 20 20 20 23 20  efault..      # 
15610 20 20 20 20 20 20 73 65 74 74 69 6e 67 20 69 73        setting is
15620 20 66 6f 72 20 74 68 65 20 54 6f 46 75 6c 6c 50   for the ToFullP
15630 61 74 68 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73  ath connection s
15640 74 72 69 6e 67 20 70 72 6f 70 65 72 79 2c 20 61  tring propery, a
15650 6c 77 61 79 73 0d 0a 20 20 20 20 20 20 23 20 20  lways..      #  
15660 20 20 20 20 20 61 64 64 20 74 68 65 20 76 61 6c       add the val
15670 75 65 20 77 65 20 6b 6e 6f 77 20 61 62 6f 75 74  ue we know about
15680 20 74 6f 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   to the connecti
15690 6f 6e 20 73 74 72 69 6e 67 2e 0d 0a 20 20 20 20  on string...    
156a0 20 20 23 0d 0a 20 20 20 20 20 20 61 70 70 65 6e    #..      appen
156b0 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 3b 54  d connection {;T
156c0 6f 46 75 6c 6c 50 61 74 68 3d 24 7b 71 75 61 6c  oFullPath=${qual
156d0 69 66 79 7d 7d 0d 0a 0d 0a 20 20 20 20 20 20 23  ify}}....      #
156e0 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
156f0 49 66 20 6f 75 72 20 63 61 6c 6c 65 72 20 73 70  If our caller sp
15700 65 63 69 66 69 65 64 20 61 20 6a 6f 75 72 6e 61  ecified a journa
15710 6c 20 6d 6f 64 65 2c 20 61 64 64 20 74 68 65 20  l mode, add the 
15720 6e 65 63 65 73 73 61 72 79 20 70 6f 72 74 69 6f  necessary portio
15730 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  n..      #      
15740 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   of the connecti
15750 6f 6e 20 73 74 72 69 6e 67 20 6e 6f 77 2e 0d 0a  on string now...
15760 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
15770 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  f {[string lengt
15780 68 20 24 6d 6f 64 65 5d 20 3e 20 30 7d 20 74 68  h $mode] > 0} th
15790 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 61 70  en {..        ap
157a0 70 65 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  pend connection 
157b0 7b 3b 4a 6f 75 72 6e 61 6c 20 4d 6f 64 65 3d 24  {;Journal Mode=$
157c0 7b 6d 6f 64 65 7d 7d 0d 0a 20 20 20 20 20 20 7d  {mode}}..      }
157d0 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
157e0 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 6f 75     # NOTE: If ou
157f0 72 20 63 61 6c 6c 65 72 20 73 70 65 63 69 66 69  r caller specifi
15800 65 64 20 61 20 44 61 74 65 54 69 6d 65 20 66 6f  ed a DateTime fo
15810 72 6d 61 74 2c 20 61 64 64 20 74 68 65 20 6e 65  rmat, add the ne
15820 63 65 73 73 61 72 79 0d 0a 20 20 20 20 20 20 23  cessary..      #
15830 20 20 20 20 20 20 20 70 6f 72 74 69 6f 6e 20 6f         portion o
15840 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  f the connection
15850 20 73 74 72 69 6e 67 20 6e 6f 77 2e 0d 0a 20 20   string now...  
15860 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
15870 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
15880 24 64 61 74 65 54 69 6d 65 46 6f 72 6d 61 74 5d  $dateTimeFormat]
15890 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
158a0 20 20 20 20 20 20 61 70 70 65 6e 64 20 63 6f 6e        append con
158b0 6e 65 63 74 69 6f 6e 20 7b 3b 44 61 74 65 54 69  nection {;DateTi
158c0 6d 65 46 6f 72 6d 61 74 3d 24 7b 64 61 74 65 54  meFormat=${dateT
158d0 69 6d 65 46 6f 72 6d 61 74 7d 7d 0d 0a 20 20 20  imeFormat}}..   
158e0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
158f0 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49  .      # NOTE: I
15900 66 20 6f 75 72 20 63 61 6c 6c 65 72 20 73 70 65  f our caller spe
15910 63 69 66 69 65 64 20 61 20 44 61 74 65 54 69 6d  cified a DateTim
15920 65 4b 69 6e 64 2c 20 61 64 64 20 74 68 65 20 6e  eKind, add the n
15930 65 63 65 73 73 61 72 79 20 70 6f 72 74 69 6f 6e  ecessary portion
15940 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
15950 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  of the connectio
15960 6e 20 73 74 72 69 6e 67 20 6e 6f 77 2e 0d 0a 20  n string now... 
15970 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
15980 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   {[string length
15990 20 24 64 61 74 65 54 69 6d 65 4b 69 6e 64 5d 20   $dateTimeKind] 
159a0 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
159b0 20 20 20 20 20 61 70 70 65 6e 64 20 63 6f 6e 6e       append conn
159c0 65 63 74 69 6f 6e 20 7b 3b 44 61 74 65 54 69 6d  ection {;DateTim
159d0 65 4b 69 6e 64 3d 24 7b 64 61 74 65 54 69 6d 65  eKind=${dateTime
159e0 4b 69 6e 64 7d 7d 0d 0a 20 20 20 20 20 20 7d 0d  Kind}}..      }.
159f0 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
15a00 20 20 23 20 4e 4f 54 45 3a 20 46 69 67 75 72 65    # NOTE: Figure
15a10 20 6f 75 74 20 77 68 61 74 20 74 68 65 20 66 69   out what the fi
15a20 6e 61 6c 20 66 6c 61 67 73 20 66 6f 72 20 74 68  nal flags for th
15a30 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6e 65  is connection ne
15a40 65 64 20 74 6f 20 62 65 2e 0d 0a 20 20 20 20 20  ed to be...     
15a50 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 66 6c   #..      set fl
15a60 61 67 73 20 5b 67 65 74 43 6f 6e 6e 65 63 74 69  ags [getConnecti
15a70 6f 6e 46 6c 61 67 73 20 24 66 69 6c 65 4e 61 6d  onFlags $fileNam
15a80 65 20 24 66 6c 61 67 73 20 24 71 75 69 65 74 5d  e $flags $quiet]
15a90 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
15aa0 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 6f 75     # NOTE: If ou
15ab0 72 20 63 61 6c 6c 65 72 20 73 70 65 63 69 66 69  r caller specifi
15ac0 65 64 20 73 6f 6d 65 20 53 51 4c 69 74 65 43 6f  ed some SQLiteCo
15ad0 6e 6e 65 63 74 69 6f 6e 46 6c 61 67 73 2c 20 61  nnectionFlags, a
15ae0 64 64 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20  dd the..      # 
15af0 20 20 20 20 20 20 6e 65 63 65 73 73 61 72 79 20        necessary 
15b00 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 63  portion of the c
15b10 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e 67  onnection string
15b20 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 23 0d 0a   now...      #..
15b30 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
15b40 67 20 6c 65 6e 67 74 68 20 24 66 6c 61 67 73 5d  g length $flags]
15b50 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
15b60 20 20 20 20 20 20 61 70 70 65 6e 64 20 63 6f 6e        append con
15b70 6e 65 63 74 69 6f 6e 20 7b 3b 46 6c 61 67 73 3d  nection {;Flags=
15b80 24 7b 66 6c 61 67 73 7d 7d 0d 0a 20 20 20 20 20  ${flags}}..     
15b90 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   }....      #.. 
15ba0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20       # NOTE: If 
15bb0 6f 75 72 20 63 61 6c 6c 65 72 20 73 70 65 63 69  our caller speci
15bc0 66 69 65 64 20 61 6e 20 65 78 74 72 61 20 70 61  fied an extra pa
15bd0 79 6c 6f 61 64 20 74 6f 20 74 68 65 20 63 6f 6e  yload to the con
15be0 6e 65 63 74 69 6f 6e 0d 0a 20 20 20 20 20 20 23  nection..      #
15bf0 20 20 20 20 20 20 20 73 74 72 69 6e 67 2c 20 61         string, a
15c00 70 70 65 6e 64 20 69 74 20 6e 6f 77 2e 0d 0a 20  ppend it now... 
15c10 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
15c20 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   {[string length
15c30 20 24 65 78 74 72 61 5d 20 3e 20 30 7d 20 74 68   $extra] > 0} th
15c40 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 61 70  en {..        ap
15c50 70 65 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  pend connection 
15c60 5c 3b 20 24 65 78 74 72 61 0d 0a 20 20 20 20 20  \; $extra..     
15c70 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   }....      #.. 
15c80 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 6f 72       # NOTE: For
15c90 20 63 6c 61 72 69 74 79 2c 20 61 70 70 65 6e 64   clarity, append
15ca0 20 61 20 66 69 6e 61 6c 20 73 65 6d 69 63 6f 6c   a final semicol
15cb0 6f 6e 20 74 6f 20 74 68 65 20 63 6f 6e 6e 65 63  on to the connec
15cc0 74 69 6f 6e 20 73 74 72 69 6e 67 2e 0d 0a 20 20  tion string...  
15cd0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 61 70 70      #..      app
15ce0 65 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 5c  end connection \
15cf0 3b 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ;....      #..  
15d00 20 20 20 20 23 20 4e 4f 54 45 3a 20 4f 70 65 6e      # NOTE: Open
15d10 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
15d20 6e 6e 65 63 74 69 6f 6e 20 6e 6f 77 2c 20 70 6c  nnection now, pl
15d30 61 63 69 6e 67 20 74 68 65 20 6f 70 61 71 75 65  acing the opaque
15d40 20 68 61 6e 64 6c 65 20 76 61 6c 75 65 0d 0a 20   handle value.. 
15d50 20 20 20 20 20 23 20 20 20 20 20 20 20 69 6e 74       #       int
15d60 6f 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 73  o the variable s
15d70 70 65 63 69 66 69 65 64 20 62 79 20 6f 75 72 20  pecified by our 
15d80 63 61 6c 6c 65 72 2e 0d 0a 20 20 20 20 20 20 23  caller...      #
15d90 0d 0a 20 20 20 20 20 20 73 65 74 20 64 62 20 5b  ..      set db [
15da0 73 71 6c 20 6f 70 65 6e 20 2d 74 79 70 65 20 53  sql open -type S
15db0 51 4c 69 74 65 20 5b 73 75 62 73 74 20 24 63 6f  QLite [subst $co
15dc0 6e 6e 65 63 74 69 6f 6e 5d 5d 0d 0a 0d 0a 20 20  nnection]]....  
15dd0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
15de0 4f 54 45 3a 20 43 6f 6e 66 69 67 75 72 65 20 74  OTE: Configure t
15df0 68 65 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72  he temporary dir
15e00 65 63 74 6f 72 79 20 66 6f 72 20 74 68 65 20 6e  ectory for the n
15e10 65 77 6c 79 20 6f 70 65 6e 65 64 20 64 61 74 61  ewly opened data
15e20 62 61 73 65 0d 0a 20 20 20 20 20 20 23 20 20 20  base..      #   
15e30 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6e      connection n
15e40 6f 77 20 75 6e 6c 65 73 73 20 6f 75 72 20 63 61  ow unless our ca
15e50 6c 6c 65 72 20 66 6f 72 62 69 64 73 20 69 74 2e  ller forbids it.
15e60 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
15e70 20 69 66 20 7b 24 74 65 6d 70 6f 72 61 72 79 20   if {$temporary 
15e80 26 26 20 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  && ![info exists
15e90 20 3a 3a 6e 6f 28 73 65 74 54 65 6d 70 6f 72 61   ::no(setTempora
15ea0 72 79 44 69 72 65 63 74 6f 72 79 29 5d 7d 20 74  ryDirectory)]} t
15eb0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 73  hen {..        s
15ec0 71 6c 20 65 78 65 63 75 74 65 20 24 64 62 20 5b  ql execute $db [
15ed0 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
15ee0 20 20 20 20 20 20 20 20 20 20 22 50 52 41 47 4d            "PRAGM
15ef0 41 20 74 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72  A temp_store_dir
15f00 65 63 74 6f 72 79 20 3d 20 5c 22 22 20 5b 67 65  ectory = \"" [ge
15f10 74 54 65 6d 70 6f 72 61 72 79 44 69 72 65 63 74  tTemporaryDirect
15f20 6f 72 79 5d 20 5c 22 5c 3b 5d 0d 0a 20 20 20 20  ory] \"\;]..    
15f30 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
15f40 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 50 65        # NOTE: Pe
15f50 72 66 6f 72 6d 20 61 6e 79 20 65 78 74 72 61 20  rform any extra 
15f60 70 65 72 2d 63 6f 6e 6e 65 63 74 69 6f 6e 20 73  per-connection s
15f70 65 74 75 70 20 66 6f 72 20 74 68 65 20 6e 65 77  etup for the new
15f80 6c 79 20 6f 70 65 6e 65 64 0d 0a 20 20 20 20 20  ly opened..     
15f90 20 23 20 20 20 20 20 20 20 64 61 74 61 62 61 73   #       databas
15fa0 65 20 6e 6f 77 20 75 6e 6c 65 73 73 20 6f 75 72  e now unless our
15fb0 20 63 61 6c 6c 65 72 20 66 6f 72 62 69 64 73 20   caller forbids 
15fc0 69 74 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  it...      #..  
15fd0 20 20 20 20 73 65 74 20 65 78 65 63 75 74 65 4f      set executeO
15fe0 6e 53 65 74 75 70 20 5b 67 65 74 45 78 65 63 75  nSetup [getExecu
15ff0 74 65 4f 6e 53 65 74 75 70 5d 0d 0a 0d 0a 20 20  teOnSetup]....  
16000 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
16010 6c 65 6e 67 74 68 20 24 65 78 65 63 75 74 65 4f  length $executeO
16020 6e 53 65 74 75 70 5d 20 3e 20 30 20 26 26 20 5c  nSetup] > 0 && \
16030 0d 0a 20 20 20 20 20 20 20 20 20 20 21 5b 69 6e  ..          ![in
16040 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 65  fo exists ::no(e
16050 78 65 63 75 74 65 4f 6e 53 65 74 75 70 29 5d 7d  xecuteOnSetup)]}
16060 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
16070 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
16080 54 45 3a 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64  TE: This command
16090 20 6d 61 79 20 72 61 69 73 65 20 61 6e 20 65 72   may raise an er
160a0 72 6f 72 3b 20 69 66 20 73 6f 2c 20 74 68 61 74  ror; if so, that
160b0 20 69 73 20 66 69 6e 65 2c 20 61 73 0d 0a 20 20   is fine, as..  
160c0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68        #       th
160d0 65 20 65 6e 63 6c 6f 73 69 6e 67 20 74 65 73 74  e enclosing test
160e0 20 77 69 6c 6c 20 74 68 65 6e 20 66 61 69 6c 2e   will then fail.
160f0 20 20 54 68 65 20 5b 73 75 62 73 74 5d 20 63 6f    The [subst] co
16100 6d 6d 61 6e 64 20 69 73 0d 0a 20 20 20 20 20 20  mmand is..      
16110 20 20 23 20 20 20 20 20 20 20 75 73 65 64 20 6f    #       used o
16120 6e 20 74 68 65 20 53 51 4c 20 69 6e 20 63 61 73  n the SQL in cas
16130 65 20 69 74 20 6e 65 65 64 73 20 74 6f 20 72 65  e it needs to re
16140 66 65 72 20 74 6f 20 73 74 61 74 65 20 69 6e 20  fer to state in 
16150 6f 75 72 0d 0a 20 20 20 20 20 20 20 20 23 20 20  our..        #  
16160 20 20 20 20 20 63 6f 6e 74 65 78 74 2e 0d 0a 20       context... 
16170 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
16180 20 20 73 71 6c 20 65 78 65 63 75 74 65 20 24 64    sql execute $d
16190 62 20 5b 73 75 62 73 74 20 24 65 78 65 63 75 74  b [subst $execut
161a0 65 4f 6e 53 65 74 75 70 5d 0d 0a 20 20 20 20 20  eOnSetup]..     
161b0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   }....      #.. 
161c0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 6c 77       # NOTE: Alw
161d0 61 79 73 20 72 65 74 75 72 6e 20 74 68 65 20 63  ays return the c
161e0 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65  onnection handle
161f0 20 75 70 6f 6e 20 73 75 63 63 65 73 73 2e 0d 0a   upon success...
16200 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72        #..      r
16210 65 74 75 72 6e 20 24 64 62 0d 0a 20 20 20 20 7d  eturn $db..    }
16220 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65  .....    proc ge
16230 74 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 20 7b 20  tDbConnection { 
16240 7b 76 61 72 4e 61 6d 65 20 64 62 7d 20 7d 20 7b  {varName db} } {
16250 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
16260 20 23 20 4e 4f 54 45 3a 20 52 65 66 65 72 20 74   # NOTE: Refer t
16270 6f 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  o the specified 
16280 76 61 72 69 61 62 6c 65 20 28 65 2e 67 2e 20 22  variable (e.g. "
16290 64 62 22 29 20 69 6e 20 74 68 65 20 63 6f 6e 74  db") in the cont
162a0 65 78 74 20 6f 66 20 6f 75 72 0d 0a 20 20 20 20  ext of our..    
162b0 20 20 23 20 20 20 20 20 20 20 63 61 6c 6c 65 72    #       caller
162c0 2e 20 20 54 68 65 20 68 61 6e 64 6c 65 20 74 6f  .  The handle to
162d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 70 72   the database pr
162e0 65 76 69 6f 75 73 6c 79 20 6f 70 65 6e 65 64 20  eviously opened 
162f0 76 69 61 20 74 68 65 0d 0a 20 20 20 20 20 20 23  via the..      #
16300 20 20 20 20 20 20 20 5b 73 65 74 75 70 44 62 5d         [setupDb]
16310 20 70 72 6f 63 65 64 75 72 65 20 73 68 6f 75 6c   procedure shoul
16320 64 20 62 65 20 73 74 6f 72 65 64 20 74 68 65 72  d be stored ther
16330 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  e...      #..   
16340 20 20 20 75 70 76 61 72 20 31 20 24 76 61 72 4e     upvar 1 $varN
16350 61 6d 65 20 64 62 0d 0a 0d 0a 20 20 20 20 20 20  ame db....      
16360 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
16370 20 54 68 69 73 20 72 65 74 75 72 6e 73 20 74 68   This returns th
16380 65 20 41 44 4f 2e 4e 45 54 20 49 44 62 43 6f 6e  e ADO.NET IDbCon
16390 6e 65 63 74 69 6f 6e 20 6f 62 6a 65 63 74 20 69  nection object i
163a0 6e 73 74 61 6e 63 65 20 66 6f 72 20 74 68 65 0d  nstance for the.
163b0 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73  .      #       s
163c0 70 65 63 69 66 69 65 64 20 64 61 74 61 62 73 65  pecified databse
163d0 20 68 61 6e 64 6c 65 2e 20 20 53 69 6e 63 65 20   handle.  Since 
163e0 67 65 74 74 69 6e 67 20 74 68 69 73 20 6f 62 6a  getting this obj
163f0 65 63 74 20 72 65 6c 69 65 73 20 75 70 6f 6e 0d  ect relies upon.
16400 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 45  .      #       E
16410 61 67 6c 65 20 69 6e 74 65 72 6e 61 6c 73 2c 20  agle internals, 
16420 67 72 65 61 74 20 63 61 72 65 20 73 68 6f 75 6c  great care shoul
16430 64 20 62 65 20 74 61 6b 65 6e 20 74 6f 20 61 76  d be taken to av
16440 6f 69 64 20 64 69 73 70 6f 73 69 6e 67 20 6f 66  oid disposing of
16450 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
16460 74 68 69 73 20 6f 62 6a 65 63 74 20 6f 72 20 6f  this object or o
16470 74 68 65 72 77 69 73 65 20 70 75 74 74 69 6e 67  therwise putting
16480 20 69 74 20 69 6e 74 6f 20 61 6e 20 69 6e 76 61   it into an inva
16490 6c 69 64 20 73 74 61 74 65 2e 0d 0a 20 20 20 20  lid state...    
164a0 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
164b0 69 6e 66 6f 20 65 78 69 73 74 73 20 64 62 5d 7d  info exists db]}
164c0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
164d0 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
164e0 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20           object 
164f0 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e  invoke -flags +N
16500 6f 6e 50 75 62 6c 69 63 20 2d 6f 62 6a 65 63 74  onPublic -object
16510 66 6c 61 67 73 20 2b 4e 6f 44 69 73 70 6f 73 65  flags +NoDispose
16520 20 2d 61 6c 69 61 73 20 5c 0d 0a 20 20 20 20 20   -alias \..     
16530 20 20 20 20 20 20 20 20 20 49 6e 74 65 72 70 72           Interpr
16540 65 74 65 72 2e 47 65 74 41 63 74 69 76 65 2e 63  eter.GetActive.c
16550 6f 6e 6e 65 63 74 69 6f 6e 73 20 49 74 65 6d 20  onnections Item 
16560 24 64 62 0d 0a 20 20 20 20 20 20 20 20 7d 20 72  $db..        } r
16570 65 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65  esult] == 0} the
16580 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23  n {..          #
16590 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
165a0 54 45 3a 20 53 75 63 63 65 73 73 2c 20 72 65 74  TE: Success, ret
165b0 75 72 6e 20 74 68 65 20 6f 70 61 71 75 65 20 6f  urn the opaque o
165c0 62 6a 65 63 74 20 68 61 6e 64 6c 65 2e 0d 0a 20  bject handle... 
165d0 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
165e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 72 65        return $re
165f0 73 75 6c 74 0d 0a 20 20 20 20 20 20 20 20 7d 20  sult..        } 
16600 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
16610 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23    #..          #
16620 20 4e 4f 54 45 3a 20 46 61 69 6c 75 72 65 2c 20   NOTE: Failure, 
16630 72 65 70 6f 72 74 20 77 68 79 2e 0d 0a 20 20 20  report why...   
16640 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
16650 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
16660 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
16670 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
16680 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52         "==== WAR
16690 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20  NING: failed to 
166a0 67 65 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68  get connection h
166b0 61 6e 64 6c 65 20 66 6f 72 20 64 61 74 61 62 61  andle for databa
166c0 73 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20  se \"" \..      
166d0 20 20 20 20 20 20 20 20 24 64 62 20 22 5c 22 2c          $db "\",
166e0 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24   error: " \n\t $
166f0 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20  result \n]..    
16700 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
16710 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
16720 20 23 20 4e 4f 54 45 3a 20 46 61 69 6c 75 72 65   # NOTE: Failure
16730 2c 20 72 65 74 75 72 6e 20 61 6e 20 6f 62 76 69  , return an obvi
16740 6f 75 73 6c 79 20 69 6e 76 61 6c 69 64 20 6f 70  ously invalid op
16750 61 71 75 65 20 6f 62 6a 65 63 74 20 68 61 6e 64  aque object hand
16760 6c 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  le...      #..  
16770 20 20 20 20 72 65 74 75 72 6e 20 22 22 0d 0a 20      return "".. 
16780 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
16790 63 20 66 72 65 65 44 62 43 6f 6e 6e 65 63 74 69  c freeDbConnecti
167a0 6f 6e 20 7b 20 7b 76 61 72 4e 61 6d 65 20 63 6f  on { {varName co
167b0 6e 6e 65 63 74 69 6f 6e 7d 20 7d 20 7b 0d 0a 20  nnection} } {.. 
167c0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
167d0 4e 4f 54 45 3a 20 52 65 66 65 72 20 74 6f 20 74  NOTE: Refer to t
167e0 68 65 20 73 70 65 63 69 66 69 65 64 20 76 61 72  he specified var
167f0 69 61 62 6c 65 20 28 65 2e 67 2e 20 22 63 6f 6e  iable (e.g. "con
16800 6e 65 63 74 69 6f 6e 22 29 20 69 6e 20 74 68 65  nection") in the
16810 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
16820 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72 20 63  context of our c
16830 61 6c 6c 65 72 2e 20 20 54 68 65 20 6f 70 61 71  aller.  The opaq
16840 75 65 20 6f 62 6a 65 63 74 20 68 61 6e 64 6c 65  ue object handle
16850 20 66 6f 72 20 61 6e 20 41 44 4f 2e 4e 45 54 0d   for an ADO.NET.
16860 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63  .      #       c
16870 6f 6e 6e 65 63 74 69 6f 6e 20 70 72 65 76 69 6f  onnection previo
16880 75 73 6c 79 20 72 65 74 75 72 6e 65 64 20 62 79  usly returned by
16890 20 5b 67 65 74 44 62 43 6f 6e 6e 65 63 74 69 6f   [getDbConnectio
168a0 6e 5d 20 73 68 6f 75 6c 64 20 62 65 0d 0a 20 20  n] should be..  
168b0 20 20 20 20 23 20 20 20 20 20 20 20 73 74 6f 72      #       stor
168c0 65 64 20 74 68 65 72 65 2e 0d 0a 20 20 20 20 20  ed there...     
168d0 20 23 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20   #..      upvar 
168e0 31 20 24 76 61 72 4e 61 6d 65 20 63 6f 6e 6e 65  1 $varName conne
168f0 63 74 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20 23  ction....      #
16900 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
16910 41 74 74 65 6d 70 74 20 74 6f 20 72 65 6d 6f 76  Attempt to remov
16920 65 20 74 68 65 20 6f 70 61 71 75 65 20 6f 62 6a  e the opaque obj
16930 65 63 74 20 68 61 6e 64 6c 65 20 66 72 6f 6d 20  ect handle from 
16940 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 0d  the interpreter.
16950 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6e  .      #       n
16960 6f 77 2e 20 20 54 68 69 73 20 5b 6f 62 6a 65 63  ow.  This [objec
16970 74 20 64 69 73 70 6f 73 65 5d 20 63 61 6c 6c 20  t dispose] call 
16980 77 69 6c 6c 20 6e 6f 74 20 61 63 74 75 61 6c 6c  will not actuall
16990 79 20 64 69 73 70 6f 73 65 20 6f 66 20 74 68 65  y dispose of the
169a0 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
169b0 75 6e 64 65 72 6c 79 69 6e 67 20 6f 62 6a 65 63  underlying objec
169c0 74 20 62 65 63 61 75 73 65 20 74 68 65 20 2b 4e  t because the +N
169d0 6f 44 69 73 70 6f 73 65 20 66 6c 61 67 20 77 61  oDispose flag wa
169e0 73 20 73 65 74 20 6f 6e 20 69 74 0d 0a 20 20 20  s set on it..   
169f0 20 20 20 23 20 20 20 20 20 20 20 64 75 72 69 6e     #       durin
16a00 67 20 63 72 65 61 74 69 6f 6e 20 6f 66 20 74 68  g creation of th
16a10 65 20 6f 70 61 71 75 65 20 6f 62 6a 65 63 74 20  e opaque object 
16a20 68 61 6e 64 6c 65 2e 0d 0a 20 20 20 20 20 20 23  handle...      #
16a30 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66  ..      if {[inf
16a40 6f 20 65 78 69 73 74 73 20 63 6f 6e 6e 65 63 74  o exists connect
16a50 69 6f 6e 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  ion] && \..     
16a60 20 20 20 20 20 5b 63 61 74 63 68 20 7b 6f 62 6a       [catch {obj
16a70 65 63 74 20 64 69 73 70 6f 73 65 20 24 63 6f 6e  ect dispose $con
16a80 6e 65 63 74 69 6f 6e 7d 20 65 72 72 6f 72 5d 7d  nection} error]}
16a90 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
16aa0 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
16ab0 54 45 3a 20 57 65 20 73 6f 6d 65 68 6f 77 20 66  TE: We somehow f
16ac0 61 69 6c 65 64 20 74 6f 20 72 65 6d 6f 76 65 20  ailed to remove 
16ad0 74 68 65 20 68 61 6e 64 6c 65 2c 20 72 65 70 6f  the handle, repo
16ae0 72 74 20 77 68 79 2e 0d 0a 20 20 20 20 20 20 20  rt why...       
16af0 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   #..        tput
16b00 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
16b10 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
16b20 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d  .            "==
16b30 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c  == WARNING: fail
16b40 65 64 20 74 6f 20 72 65 6d 6f 76 65 20 63 6f 6e  ed to remove con
16b50 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20 5c  nection handle \
16b60 22 22 20 24 63 6f 6e 6e 65 63 74 69 6f 6e 20 5c  "" $connection \
16b70 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 5c  ..            "\
16b80 22 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74  ", error: " \n\t
16b90 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20   $error \n]..   
16ba0 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
16bb0 20 20 20 20 70 72 6f 63 20 61 64 64 44 62 43 6f      proc addDbCo
16bc0 6e 6e 65 63 74 69 6f 6e 20 7b 20 63 6f 6e 6e 65  nnection { conne
16bd0 63 74 69 6f 6e 20 7b 76 61 72 4e 61 6d 65 20 64  ction {varName d
16be0 62 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  b} } {..      #.
16bf0 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52  .      # NOTE: R
16c00 65 66 65 72 20 74 6f 20 74 68 65 20 73 70 65 63  efer to the spec
16c10 69 66 69 65 64 20 76 61 72 69 61 62 6c 65 20 28  ified variable (
16c20 65 2e 67 2e 20 22 64 62 22 29 20 69 6e 20 74 68  e.g. "db") in th
16c30 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72  e context of our
16c40 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
16c50 63 61 6c 6c 65 72 2e 0d 0a 20 20 20 20 20 20 23  caller...      #
16c60 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20 31 20  ..      upvar 1 
16c70 24 76 61 72 4e 61 6d 65 20 64 62 0d 0a 0d 0a 20  $varName db.... 
16c80 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
16c90 4e 4f 54 45 3a 20 43 72 65 61 74 65 20 61 20 63  NOTE: Create a c
16ca0 6f 72 72 65 63 74 6c 79 20 66 6f 72 6d 61 74 74  orrectly formatt
16cb0 65 64 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20  ed name for the 
16cc0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
16cd0 69 6f 6e 20 74 6f 0d 0a 20 20 20 20 20 20 23 20  ion to..      # 
16ce0 20 20 20 20 20 20 62 65 20 61 64 64 65 64 20 74        be added t
16cf0 6f 20 74 68 65 20 6c 69 73 74 20 6d 61 6e 61 67  o the list manag
16d00 65 64 20 62 79 20 74 68 65 20 45 61 67 6c 65 20  ed by the Eagle 
16d10 69 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a 20 20  interpreter...  
16d20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74      #..      set
16d30 20 64 62 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f   db [object invo
16d40 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75  ke -flags +NonPu
16d50 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20  blic \..        
16d60 20 20 45 61 67 6c 65 2e 5f 43 6f 6d 70 6f 6e 65    Eagle._Compone
16d70 6e 74 73 2e 50 72 69 76 61 74 65 2e 46 6f 72 6d  nts.Private.Form
16d80 61 74 4f 70 73 20 44 61 74 61 62 61 73 65 4f 62  atOps DatabaseOb
16d90 6a 65 63 74 4e 61 6d 65 20 24 63 6f 6e 6e 65 63  jectName $connec
16da0 74 69 6f 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20  tion \..        
16db0 20 20 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69    SQLiteConnecti
16dc0 6f 6e 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b  on [object invok
16dd0 65 20 49 6e 74 65 72 70 72 65 74 65 72 2e 47 65  e Interpreter.Ge
16de0 74 41 63 74 69 76 65 20 4e 65 78 74 49 64 5d 5d  tActive NextId]]
16df0 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
16e00 20 20 20 23 20 4e 4f 54 45 3a 20 41 64 64 20 74     # NOTE: Add t
16e10 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
16e20 65 63 74 69 6f 6e 20 70 72 6f 76 69 64 65 64 20  ection provided 
16e30 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 20 74 6f  by our caller to
16e40 20 74 68 65 20 6c 69 73 74 0d 0a 20 20 20 20 20   the list..     
16e50 20 23 20 20 20 20 20 20 20 6f 66 20 74 68 6f 73   #       of thos
16e60 65 20 6b 6e 6f 77 6e 20 74 6f 20 74 68 65 20 45  e known to the E
16e70 61 67 6c 65 20 69 6e 74 65 72 70 72 65 74 65 72  agle interpreter
16e80 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
16e90 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20    object invoke 
16ea0 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69  -flags +NonPubli
16eb0 63 20 49 6e 74 65 72 70 72 65 74 65 72 2e 47 65  c Interpreter.Ge
16ec0 74 41 63 74 69 76 65 2e 63 6f 6e 6e 65 63 74 69  tActive.connecti
16ed0 6f 6e 73 20 41 64 64 20 5c 0d 0a 20 20 20 20 20  ons Add \..     
16ee0 20 20 20 20 20 24 64 62 20 24 63 6f 6e 6e 65 63       $db $connec
16ef0 74 69 6f 6e 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  tion..    }.....
16f00 20 20 20 20 70 72 6f 63 20 67 65 74 52 6f 77 73      proc getRows
16f10 46 72 6f 6d 44 61 74 61 54 61 62 6c 65 20 7b 20  FromDataTable { 
16f20 64 61 74 61 54 61 62 6c 65 20 7b 76 61 6c 75 65  dataTable {value
16f30 43 61 6c 6c 62 61 63 6b 20 22 22 7d 20 7d 20 7b  Callback ""} } {
16f40 0d 0a 20 20 20 20 20 20 73 65 74 20 72 6f 77 73  ..      set rows
16f50 20 5b 6c 69 73 74 5d 0d 0a 20 20 20 20 20 20 73   [list]..      s
16f60 65 74 20 63 6f 75 6e 74 20 5b 24 64 61 74 61 54  et count [$dataT
16f70 61 62 6c 65 20 43 6f 6c 75 6d 6e 73 2e 43 6f 75  able Columns.Cou
16f80 6e 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 66 6f 72  nt]....      for
16f90 20 7b 73 65 74 20 69 6e 64 65 78 20 30 7d 20 7b   {set index 0} {
16fa0 24 69 6e 64 65 78 20 3c 20 24 63 6f 75 6e 74 7d  $index < $count}
16fb0 20 7b 69 6e 63 72 20 69 6e 64 65 78 7d 20 7b 0d   {incr index} {.
16fc0 0a 20 20 20 20 20 20 20 20 73 65 74 20 64 61 74  .        set dat
16fd0 61 43 6f 6c 75 6d 6e 20 5b 24 64 61 74 61 54 61  aColumn [$dataTa
16fe0 62 6c 65 20 2d 61 6c 69 61 73 20 43 6f 6c 75 6d  ble -alias Colum
16ff0 6e 73 2e 67 65 74 5f 49 74 65 6d 20 24 69 6e 64  ns.get_Item $ind
17000 65 78 5d 0d 0a 20 20 20 20 20 20 20 20 73 65 74  ex]..        set
17010 20 6e 61 6d 65 73 28 24 69 6e 64 65 78 29 20 5b   names($index) [
17020 24 64 61 74 61 43 6f 6c 75 6d 6e 20 43 6f 6c 75  $dataColumn Colu
17030 6d 6e 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20 7d  mnName]..      }
17040 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
17050 20 20 20 23 20 4e 4f 54 45 3a 20 53 65 74 75 70     # NOTE: Setup
17060 20 73 6f 6d 65 20 54 63 6c 20 72 65 74 75 72 6e   some Tcl return
17070 20 63 6f 64 65 20 63 6f 6e 73 74 61 6e 74 73 2e   code constants.
17080 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
17090 20 73 65 74 20 4f 6b 20 30 3b 20 73 65 74 20 45   set Ok 0; set E
170a0 72 72 6f 72 20 31 3b 20 73 65 74 20 52 65 74 75  rror 1; set Retu
170b0 72 6e 20 32 3b 20 73 65 74 20 42 72 65 61 6b 20  rn 2; set Break 
170c0 33 3b 20 73 65 74 20 43 6f 6e 74 69 6e 75 65 20  3; set Continue 
170d0 34 0d 0a 0d 0a 20 20 20 20 20 20 6f 62 6a 65 63  4....      objec
170e0 74 20 66 6f 72 65 61 63 68 20 2d 61 6c 69 61 73  t foreach -alias
170f0 20 64 61 74 61 52 6f 77 20 5b 73 65 74 20 64 61   dataRow [set da
17100 74 61 52 6f 77 73 20 5b 24 64 61 74 61 54 61 62  taRows [$dataTab
17110 6c 65 20 52 6f 77 73 5d 5d 20 7b 0d 0a 20 20 20  le Rows]] {..   
17120 20 20 20 20 20 73 65 74 20 72 6f 77 20 5b 6c 69       set row [li
17130 73 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 66  st]....        f
17140 6f 72 20 7b 73 65 74 20 69 6e 64 65 78 20 30 7d  or {set index 0}
17150 20 7b 24 69 6e 64 65 78 20 3c 20 24 63 6f 75 6e   {$index < $coun
17160 74 7d 20 7b 69 6e 63 72 20 69 6e 64 65 78 7d 20  t} {incr index} 
17170 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  {..          set
17180 20 76 61 6c 75 65 20 5b 24 64 61 74 61 52 6f 77   value [$dataRow
17190 20 2d 63 72 65 61 74 65 20 2d 61 6c 69 61 73 20   -create -alias 
171a0 67 65 74 5f 49 74 65 6d 20 24 69 6e 64 65 78 5d  get_Item $index]
171b0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66  ....          if
171c0 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   {[string length
171d0 20 24 76 61 6c 75 65 43 61 6c 6c 62 61 63 6b 5d   $valueCallback]
171e0 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
171f0 20 20 20 20 20 20 20 20 20 20 73 65 74 20 63 6f            set co
17200 64 65 20 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  de [catch {..   
17210 20 20 20 20 20 20 20 20 20 20 20 24 76 61 6c 75             $valu
17220 65 43 61 6c 6c 62 61 63 6b 20 24 64 61 74 61 54  eCallback $dataT
17230 61 62 6c 65 20 24 64 61 74 61 52 6f 77 20 24 69  able $dataRow $i
17240 6e 64 65 78 20 24 76 61 6c 75 65 0d 0a 20 20 20  ndex $value..   
17250 20 20 20 20 20 20 20 20 20 7d 20 6e 65 77 56 61           } newVa
17260 6c 75 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  lue]....        
17270 20 20 20 20 69 66 20 7b 24 63 6f 64 65 20 3d 3d      if {$code ==
17280 20 24 4f 6b 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   $Ok} then {..  
17290 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
172a0 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e               # N
172b0 4f 54 45 3a 20 55 73 65 20 74 68 65 20 73 70 65  OTE: Use the spe
172c0 63 69 66 69 65 64 20 28 6e 65 77 3f 29 20 72 6f  cified (new?) ro
172d0 77 20 76 61 6c 75 65 2e 0d 0a 20 20 20 20 20 20  w value...      
172e0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
172f0 20 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64           lappend
17300 20 72 6f 77 20 5b 6c 69 73 74 20 24 6e 61 6d 65   row [list $name
17310 73 28 24 69 6e 64 65 78 29 20 24 6e 65 77 56 61  s($index) $newVa
17320 6c 75 65 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  lue]..          
17330 20 20 7d 20 65 6c 73 65 69 66 20 7b 24 63 6f 64    } elseif {$cod
17340 65 20 3d 3d 20 24 45 72 72 6f 72 7d 20 74 68 65  e == $Error} the
17350 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
17360 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
17370 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20      # NOTE: Use 
17380 74 68 65 20 28 6e 65 77 3f 29 20 4e 55 4c 4c 20  the (new?) NULL 
17390 72 6f 77 20 76 61 6c 75 65 2e 0d 0a 20 20 20 20  row value...    
173a0 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
173b0 20 20 20 20 20 20 20 20 20 20 20 6c 61 70 70 65             lappe
173c0 6e 64 20 72 6f 77 20 5b 6c 69 73 74 20 24 6e 61  nd row [list $na
173d0 6d 65 73 28 24 69 6e 64 65 78 29 5d 0d 0a 20 20  mes($index)]..  
173e0 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
173f0 69 66 20 7b 24 63 6f 64 65 20 3d 3d 20 24 52 65  if {$code == $Re
17400 74 75 72 6e 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  turn} then {..  
17410 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
17420 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e               # N
17430 4f 54 45 3a 20 53 6b 69 70 20 72 65 6d 61 69 6e  OTE: Skip remain
17440 69 6e 67 20 76 61 6c 75 65 73 20 66 6f 72 20 74  ing values for t
17450 68 69 73 20 72 6f 77 2e 0d 0a 20 20 20 20 20 20  his row...      
17460 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
17470 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 0d 0a           break..
17480 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c              } el
17490 73 65 69 66 20 7b 24 63 6f 64 65 20 3d 3d 20 24  seif {$code == $
174a0 42 72 65 61 6b 7d 20 74 68 65 6e 20 7b 0d 0a 20  Break} then {.. 
174b0 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a               #..
174c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
174d0 4e 4f 54 45 3a 20 53 6b 69 70 20 70 72 6f 63 65  NOTE: Skip proce
174e0 73 73 69 6e 67 20 74 68 69 73 20 72 6f 77 20 76  ssing this row v
174f0 61 6c 75 65 2e 0d 0a 20 20 20 20 20 20 20 20 20  alue...         
17500 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
17510 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 24 63      } elseif {$c
17520 6f 64 65 20 3d 3d 20 24 43 6f 6e 74 69 6e 75 65  ode == $Continue
17530 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
17540 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
17550 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
17560 20 55 73 65 20 64 65 66 61 75 6c 74 20 72 6f 77   Use default row
17570 20 76 61 6c 75 65 20 68 61 6e 64 6c 69 6e 67 2e   value handling.
17580 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
17590 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  #..            }
175a0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c  ..          } el
175b0 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
175c0 20 20 73 65 74 20 63 6f 64 65 20 24 43 6f 6e 74    set code $Cont
175d0 69 6e 75 65 0d 0a 20 20 20 20 20 20 20 20 20 20  inue..          
175e0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69  }....          i
175f0 66 20 7b 24 63 6f 64 65 20 3d 3d 20 24 43 6f 6e  f {$code == $Con
17600 74 69 6e 75 65 7d 20 74 68 65 6e 20 7b 0d 0a 20  tinue} then {.. 
17610 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b             if {[
17620 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76  string length $v
17630 61 6c 75 65 5d 20 3e 20 30 20 26 26 20 5c 0d 0a  alue] > 0 && \..
17640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17650 21 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20  ![object invoke 
17660 43 6f 6e 76 65 72 74 20 49 73 44 42 4e 75 6c 6c  Convert IsDBNull
17670 20 24 76 61 6c 75 65 5d 7d 20 74 68 65 6e 20 7b   $value]} then {
17680 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
17690 6c 61 70 70 65 6e 64 20 72 6f 77 20 5b 6c 69 73  lappend row [lis
176a0 74 20 24 6e 61 6d 65 73 28 24 69 6e 64 65 78 29  t $names($index)
176b0 20 5b 24 76 61 6c 75 65 20 54 6f 53 74 72 69 6e   [$value ToStrin
176c0 67 5d 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  g]]..           
176d0 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
176e0 20 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64           lappend
176f0 20 72 6f 77 20 5b 6c 69 73 74 20 24 6e 61 6d 65   row [list $name
17700 73 28 24 69 6e 64 65 78 29 5d 0d 0a 20 20 20 20  s($index)]..    
17710 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
17720 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
17730 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 6c 61 70  }....        lap
17740 70 65 6e 64 20 72 6f 77 73 20 24 72 6f 77 0d 0a  pend rows $row..
17750 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
17760 20 72 65 74 75 72 6e 20 24 72 6f 77 73 0d 0a 20   return $rows.. 
17770 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
17780 63 20 64 75 6d 70 52 6f 77 73 46 72 6f 6d 44 61  c dumpRowsFromDa
17790 74 61 54 61 62 6c 65 20 7b 20 63 68 61 6e 6e 65  taTable { channe
177a0 6c 20 72 6f 77 73 20 7d 20 7b 0d 0a 20 20 20 20  l rows } {..    
177b0 20 20 73 65 74 20 73 65 71 75 65 6e 63 65 20 31    set sequence 1
177c0 0d 0a 0d 0a 20 20 20 20 20 20 66 6f 72 65 61 63  ....      foreac
177d0 68 20 72 6f 77 20 24 72 6f 77 73 20 7b 0d 0a 20  h row $rows {.. 
177e0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
177f0 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
17800 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
17810 20 5b 65 78 70 72 20 7b 24 73 65 71 75 65 6e 63   [expr {$sequenc
17820 65 20 3e 20 31 20 3f 20 22 5c 6e 22 20 3a 20 22  e > 1 ? "\n" : "
17830 22 7d 5d 20 22 2d 2d 2d 2d 20 52 4f 57 20 23 22  "}] "---- ROW #"
17840 20 24 73 65 71 75 65 6e 63 65 20 3a 5c 6e 5d 0d   $sequence :\n].
17850 0a 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61  ...        forea
17860 63 68 20 70 61 69 72 20 24 72 6f 77 20 7b 0d 0a  ch pair $row {..
17870 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 6c            if {[l
17880 6c 65 6e 67 74 68 20 24 70 61 69 72 5d 20 3e 3d  length $pair] >=
17890 20 32 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   2} then {..    
178a0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
178b0 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
178c0 67 73 20 5c 74 20 5c 0d 0a 20 20 20 20 20 20 20  gs \t \..       
178d0 20 20 20 20 20 20 20 20 20 5b 6c 69 73 74 20 5b           [list [
178e0 6c 69 6e 64 65 78 20 24 70 61 69 72 20 30 5d 5d  lindex $pair 0]]
178f0 20 22 3a 20 22 20 5b 6c 69 73 74 20 5b 6c 69 6e   ": " [list [lin
17900 64 65 78 20 24 70 61 69 72 20 31 5d 5d 20 5c 6e  dex $pair 1]] \n
17910 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65  ]..          } e
17920 6c 73 65 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20  lseif {[llength 
17930 24 70 61 69 72 5d 20 3d 3d 20 31 7d 20 74 68 65  $pair] == 1} the
17940 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
17950 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
17960 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 74 20 5c  [appendArgs \t \
17970 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
17980 20 20 5b 6c 69 73 74 20 5b 6c 69 6e 64 65 78 20    [list [lindex 
17990 24 70 61 69 72 20 30 5d 5d 20 22 3a 20 3c 6e 75  $pair 0]] ": <nu
179a0 6c 6c 3e 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20  ll>\n"]..       
179b0 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
179c0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
179d0 63 68 61 6e 6e 65 6c 20 5c 74 3c 65 6d 70 74 79  channel \t<empty
179e0 3e 5c 6e 3b 20 23 20 4e 4f 54 45 3a 20 4e 6f 20  >\n; # NOTE: No 
179f0 64 61 74 61 3f 0d 0a 20 20 20 20 20 20 20 20 20  data?..         
17a00 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d   }..        }...
17a10 0a 20 20 20 20 20 20 20 20 69 6e 63 72 20 73 65  .        incr se
17a20 71 75 65 6e 63 65 0d 0a 20 20 20 20 20 20 7d 0d  quence..      }.
17a30 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
17a40 72 6f 63 20 63 6c 65 61 6e 75 70 44 62 20 7b 20  roc cleanupDb { 
17a50 66 69 6c 65 4e 61 6d 65 20 7b 76 61 72 4e 61 6d  fileName {varNam
17a60 65 20 64 62 7d 20 7b 63 6f 6c 6c 65 63 74 20 74  e db} {collect t
17a70 72 75 65 7d 20 7b 71 75 61 6c 69 66 79 20 74 72  rue} {qualify tr
17a80 75 65 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ue}..           
17a90 20 20 20 20 20 20 20 20 20 20 7b 64 65 6c 65 74            {delet
17aa0 65 20 74 72 75 65 7d 20 7d 20 7b 0d 0a 20 20 20  e true} } {..   
17ab0 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
17ac0 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 66  TE: Attempt to f
17ad0 6f 72 63 65 20 61 6c 6c 20 70 65 6e 64 69 6e 67  orce all pending
17ae0 20 22 67 61 72 62 61 67 65 22 20 6f 62 6a 65 63   "garbage" objec
17af0 74 73 20 74 6f 20 62 65 20 63 6f 6c 6c 65 63 74  ts to be collect
17b00 65 64 2c 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ed,..      #    
17b10 20 20 20 69 6e 63 6c 75 64 69 6e 67 20 53 51 4c     including SQL
17b20 69 74 65 20 73 74 61 74 65 6d 65 6e 74 73 20 61  ite statements a
17b30 6e 64 20 62 61 63 6b 75 70 20 6f 62 6a 65 63 74  nd backup object
17b40 73 3b 20 74 68 69 73 20 73 68 6f 75 6c 64 20 61  s; this should a
17b50 6c 6c 6f 77 0d 0a 20 20 20 20 20 20 23 20 20 20  llow..      #   
17b60 20 20 20 20 74 68 65 20 75 6e 64 65 72 6c 79 69      the underlyi
17b70 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ng database file
17b80 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 2e 0d   to be deleted..
17b90 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
17ba0 69 66 20 7b 24 63 6f 6c 6c 65 63 74 7d 20 74 68  if {$collect} th
17bb0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 63 6f  en {..        co
17bc0 6c 6c 65 63 74 47 61 72 62 61 67 65 20 24 3a 3a  llectGarbage $::
17bd0 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 20 20  test_channel..  
17be0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
17bf0 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
17c00 52 65 66 65 72 20 74 6f 20 74 68 65 20 73 70 65  Refer to the spe
17c10 63 69 66 69 65 64 20 76 61 72 69 61 62 6c 65 20  cified variable 
17c20 28 65 2e 67 2e 20 22 64 62 22 29 20 69 6e 20 74  (e.g. "db") in t
17c30 68 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75  he context of ou
17c40 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  r..      #      
17c50 20 63 61 6c 6c 65 72 2e 20 20 54 68 65 20 68 61   caller.  The ha
17c60 6e 64 6c 65 20 74 6f 20 74 68 65 20 64 61 74 61  ndle to the data
17c70 62 61 73 65 20 70 72 65 76 69 6f 75 73 6c 79 20  base previously 
17c80 6f 70 65 6e 65 64 20 76 69 61 20 74 68 65 0d 0a  opened via the..
17c90 20 20 20 20 20 20 23 20 20 20 20 20 20 20 5b 73        #       [s
17ca0 65 74 75 70 44 62 5d 20 70 72 6f 63 65 64 75 72  etupDb] procedur
17cb0 65 20 73 68 6f 75 6c 64 20 62 65 20 73 74 6f 72  e should be stor
17cc0 65 64 20 74 68 65 72 65 2e 0d 0a 20 20 20 20 20  ed there...     
17cd0 20 23 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20   #..      upvar 
17ce0 31 20 24 76 61 72 4e 61 6d 65 20 64 62 0d 0a 0d  1 $varName db...
17cf0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
17d00 23 20 4e 4f 54 45 3a 20 43 6c 6f 73 65 20 74 68  # NOTE: Close th
17d10 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  e connection to 
17d20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 6f 77  the database now
17d30 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20 61  .  This should a
17d40 6c 6c 6f 77 20 75 73 0d 0a 20 20 20 20 20 20 23  llow us..      #
17d50 20 20 20 20 20 20 20 74 6f 20 64 65 6c 65 74 65         to delete
17d60 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
17d70 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0d 0a  database file...
17d80 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
17d90 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
17da0 64 62 5d 20 26 26 20 5b 63 61 74 63 68 20 7b 73  db] && [catch {s
17db0 71 6c 20 63 6c 6f 73 65 20 24 64 62 7d 20 65 72  ql close $db} er
17dc0 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ror]} then {..  
17dd0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
17de0 20 23 20 4e 4f 54 45 3a 20 57 65 20 73 6f 6d 65   # NOTE: We some
17df0 68 6f 77 20 66 61 69 6c 65 64 20 74 6f 20 63 6c  how failed to cl
17e00 6f 73 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ose the database
17e10 2c 20 72 65 70 6f 72 74 20 77 68 79 2e 0d 0a 20  , report why... 
17e20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
17e30 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
17e40 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
17e50 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
17e60 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47     "==== WARNING
17e70 3a 20 66 61 69 6c 65 64 20 74 6f 20 63 6c 6f 73  : failed to clos
17e80 65 20 64 61 74 61 62 61 73 65 20 5c 22 22 20 24  e database \"" $
17e90 64 62 20 22 5c 22 2c 20 65 72 72 6f 72 3a 20 22  db "\", error: "
17ea0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
17eb0 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d  \n\t $error \n].
17ec0 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
17ed0 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
17ee0 45 3a 20 46 69 72 73 74 2c 20 73 65 65 20 69 66  E: First, see if
17ef0 20 6f 75 72 20 63 61 6c 6c 65 72 20 68 61 73 20   our caller has 
17f00 72 65 71 75 65 73 74 65 64 20 61 6e 20 69 6e 2d  requested an in-
17f10 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e  memory database.
17f20 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
17f30 20 73 65 74 20 69 73 4d 65 6d 6f 72 79 20 5b 69   set isMemory [i
17f40 73 4d 65 6d 6f 72 79 44 62 20 24 66 69 6c 65 4e  sMemoryDb $fileN
17f50 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d  ame]....      #.
17f60 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42  .      # NOTE: B
17f70 75 69 6c 64 20 74 68 65 20 66 75 6c 6c 20 70 61  uild the full pa
17f80 74 68 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  th to the databa
17f90 73 65 20 66 69 6c 65 20 6e 61 6d 65 2e 20 20 46  se file name.  F
17fa0 6f 72 20 6e 6f 77 2c 20 61 6c 6c 20 74 65 73 74  or now, all test
17fb0 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
17fc0 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 61  database files a
17fd0 72 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  re stored in the
17fe0 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63   temporary direc
17ff0 74 6f 72 79 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  tory...      #..
18000 20 20 20 20 20 20 69 66 20 7b 21 24 69 73 4d 65        if {!$isMe
18010 6d 6f 72 79 20 26 26 20 24 71 75 61 6c 69 66 79  mory && $qualify
18020 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
18030 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b    set fileName [
18040 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 44 61  file join [getDa
18050 74 61 62 61 73 65 44 69 72 65 63 74 6f 72 79 5d  tabaseDirectory]
18060 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69 6c   [file tail $fil
18070 65 4e 61 6d 65 5d 5d 0d 0a 20 20 20 20 20 20 7d  eName]]..      }
18080 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
18090 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b     # NOTE: Check
180a0 20 69 66 20 74 68 65 20 66 69 6c 65 20 73 74 69   if the file sti
180b0 6c 6c 20 65 78 69 73 74 73 2e 0d 0a 20 20 20 20  ll exists...    
180c0 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 21    #..      if {!
180d0 24 69 73 4d 65 6d 6f 72 79 20 26 26 20 24 64 65  $isMemory && $de
180e0 6c 65 74 65 20 26 26 20 5b 66 69 6c 65 20 65 78  lete && [file ex
180f0 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d  ists $fileName]}
18100 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
18110 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
18120 54 45 3a 20 53 6b 69 70 20 64 65 6c 65 74 69 6e  TE: Skip deletin
18130 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  g database files
18140 20 69 66 20 73 6f 6d 65 62 6f 64 79 20 73 65 74   if somebody set
18150 73 20 74 68 65 20 67 6c 6f 62 61 6c 0d 0a 20 20  s the global..  
18160 20 20 20 20 20 20 23 20 20 20 20 20 20 20 76 61        #       va
18170 72 69 61 62 6c 65 20 74 6f 20 70 72 65 76 65 6e  riable to preven
18180 74 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23  t it...        #
18190 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b  ..        if {![
181a0 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
181b0 28 63 6c 65 61 6e 75 70 44 62 46 69 6c 65 29 5d  (cleanupDbFile)]
181c0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
181d0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
181e0 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74   # NOTE: Attempt
181f0 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 74   to delete the t
18200 65 73 74 20 64 61 74 61 62 61 73 65 20 66 69 6c  est database fil
18210 65 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20  e now...        
18220 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69    #..          i
18230 66 20 7b 5b 73 65 74 20 63 6f 64 65 20 5b 63 61  f {[set code [ca
18240 74 63 68 20 7b 66 69 6c 65 20 64 65 6c 65 74 65  tch {file delete
18250 20 24 66 69 6c 65 4e 61 6d 65 7d 20 65 72 72 6f   $fileName} erro
18260 72 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  r]]} then {..   
18270 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
18280 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
18290 57 65 20 73 6f 6d 65 68 6f 77 20 66 61 69 6c 65  We somehow faile
182a0 64 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20  d to delete the 
182b0 66 69 6c 65 2c 20 72 65 70 6f 72 74 20 77 68 79  file, report why
182c0 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  ...            #
182d0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
182e0 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
182f0 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
18300 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
18310 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47     "==== WARNING
18320 3a 20 66 61 69 6c 65 64 20 74 6f 20 64 65 6c 65  : failed to dele
18330 74 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  te database file
18340 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c   \"" $fileName \
18350 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
18360 20 20 22 5c 22 20 64 75 72 69 6e 67 20 63 6c 65    "\" during cle
18370 61 6e 75 70 2c 20 65 72 72 6f 72 3a 20 22 20 5c  anup, error: " \
18380 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a  n\t $error \n]..
18390 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
183a0 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
183b0 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
183c0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 68        # NOTE: Sh
183d0 6f 77 20 74 68 61 74 20 77 65 20 73 6b 69 70 70  ow that we skipp
183e0 65 64 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20  ed deleting the 
183f0 66 69 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 20  file...         
18400 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   #..          se
18410 74 20 63 6f 64 65 20 30 0d 0a 0d 0a 20 20 20 20  t code 0....    
18420 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
18430 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
18440 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
18450 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57           "==== W
18460 41 52 4e 49 4e 47 3a 20 73 6b 69 70 70 65 64 20  ARNING: skipped 
18470 64 65 6c 65 74 69 6e 67 20 64 61 74 61 62 61 73  deleting databas
18480 65 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c 65  e file \"" $file
18490 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  Name \..        
184a0 20 20 20 20 20 20 22 5c 22 20 64 75 72 69 6e 67        "\" during
184b0 20 63 6c 65 61 6e 75 70 5c 6e 22 5d 0d 0a 20 20   cleanup\n"]..  
184c0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
184d0 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
184e0 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
184f0 54 45 3a 20 54 68 65 20 66 69 6c 65 20 64 6f 65  TE: The file doe
18500 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 73 75 63  s not exist, suc
18510 63 65 73 73 21 0d 0a 20 20 20 20 20 20 20 20 23  cess!..        #
18520 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 63 6f  ..        set co
18530 64 65 20 30 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  de 0..      }...
18540 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 63  .      return $c
18550 6f 64 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20  ode..    }..... 
18560 20 20 20 70 72 6f 63 20 73 61 76 65 45 6e 76 69     proc saveEnvi
18570 72 6f 6e 6d 65 6e 74 56 61 72 69 61 62 6c 65 73  ronmentVariables
18580 20 7b 20 6e 61 6d 65 73 20 7b 76 61 72 4e 61 6d   { names {varNam
18590 65 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  e ""} } {..     
185a0 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
185b0 3a 20 46 6f 72 20 65 61 63 68 20 6e 61 6d 65 2c  : For each name,
185c0 20 64 6f 65 73 20 74 68 65 20 6c 69 76 65 20 65   does the live e
185d0 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61  nvironment varia
185e0 62 6c 65 20 65 78 69 73 74 3f 20 20 49 66 0d 0a  ble exist?  If..
185f0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73 6f        #       so
18600 2c 20 73 61 76 65 20 74 68 65 20 76 61 6c 75 65  , save the value
18610 20 66 6f 72 20 6c 61 74 65 72 3b 20 6f 74 68 65   for later; othe
18620 72 77 69 73 65 2c 20 6d 61 6b 65 20 73 75 72 65  rwise, make sure
18630 20 74 68 65 20 73 61 76 65 64 0d 0a 20 20 20 20   the saved..    
18640 20 20 23 20 20 20 20 20 20 20 76 61 6c 75 65 20    #       value 
18650 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 20 65  does not exist e
18660 69 74 68 65 72 2e 20 20 54 68 65 20 6c 69 76 65  ither.  The live
18670 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72   environment var
18680 69 61 62 6c 65 73 0d 0a 20 20 20 20 20 20 23 20  iables..      # 
18690 20 20 20 20 20 20 41 52 45 20 4e 4f 54 20 63 68        ARE NOT ch
186a0 61 6e 67 65 64 20 62 79 20 74 68 69 73 20 70 72  anged by this pr
186b0 6f 63 65 64 75 72 65 2e 0d 0a 20 20 20 20 20 20  ocedure...      
186c0 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74  #..      if {[st
186d0 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 61 72  ring length $var
186e0 4e 61 6d 65 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  Name] == 0} then
186f0 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   {..        set 
18700 76 61 72 4e 61 6d 65 20 73 61 76 65 64 45 6e 76  varName savedEnv
18710 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
18720 20 20 20 75 70 76 61 72 20 31 20 24 76 61 72 4e     upvar 1 $varN
18730 61 6d 65 20 73 61 76 65 64 45 6e 76 0d 0a 0d 0a  ame savedEnv....
18740 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 6e 61        foreach na
18750 6d 65 20 24 6e 61 6d 65 73 20 7b 0d 0a 20 20 20  me $names {..   
18760 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65       if {[info e
18770 78 69 73 74 73 20 3a 3a 65 6e 76 28 24 6e 61 6d  xists ::env($nam
18780 65 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  e)]} then {..   
18790 20 20 20 20 20 20 20 73 65 74 20 73 61 76 65 64         set saved
187a0 45 6e 76 28 24 6e 61 6d 65 29 20 24 3a 3a 65 6e  Env($name) $::en
187b0 76 28 24 6e 61 6d 65 29 0d 0a 20 20 20 20 20 20  v($name)..      
187c0 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
187d0 20 20 20 20 20 20 75 6e 73 65 74 20 2d 6e 6f 63        unset -noc
187e0 6f 6d 70 6c 61 69 6e 20 73 61 76 65 64 45 6e 76  omplain savedEnv
187f0 28 24 6e 61 6d 65 29 0d 0a 20 20 20 20 20 20 20  ($name)..       
18800 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20   }..      }.... 
18810 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
18820 4e 4f 54 45 3a 20 54 68 69 73 20 69 73 20 73 65  NOTE: This is se
18830 6c 66 2d 63 6c 65 61 6e 69 6e 67 2e 20 20 49 66  lf-cleaning.  If
18840 20 6e 6f 20 73 61 76 65 64 20 65 6e 76 69 72 6f   no saved enviro
18850 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 73 20  nment variables 
18860 6e 6f 77 0d 0a 20 20 20 20 20 20 23 20 20 20 20  now..      #    
18870 20 20 20 65 78 69 73 74 2c 20 72 65 6d 6f 76 65     exist, remove
18880 20 74 68 65 20 61 72 72 61 79 2e 0d 0a 20 20 20   the array...   
18890 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
188a0 5b 61 72 72 61 79 20 73 69 7a 65 20 73 61 76 65  [array size save
188b0 64 45 6e 76 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  dEnv] == 0} then
188c0 20 7b 0d 0a 20 20 20 20 20 20 20 20 75 6e 73 65   {..        unse
188d0 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 73 61  t -nocomplain sa
188e0 76 65 64 45 6e 76 0d 0a 20 20 20 20 20 20 7d 0d  vedEnv..      }.
188f0 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
18900 72 6f 63 20 72 65 73 74 6f 72 65 45 6e 76 69 72  roc restoreEnvir
18910 6f 6e 6d 65 6e 74 56 61 72 69 61 62 6c 65 73 20  onmentVariables 
18920 7b 20 6e 61 6d 65 73 20 7b 76 61 72 4e 61 6d 65  { names {varName
18930 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20   ""} } {..      
18940 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
18950 20 46 6f 72 20 65 61 63 68 20 6e 61 6d 65 2c 20   For each name, 
18960 64 6f 65 73 20 74 68 65 20 73 61 76 65 64 20 65  does the saved e
18970 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61  nvironment varia
18980 62 6c 65 20 65 78 69 73 74 3f 20 20 49 66 0d 0a  ble exist?  If..
18990 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73 6f        #       so
189a0 2c 20 72 65 73 74 6f 72 65 20 74 68 65 20 73 61  , restore the sa
189b0 76 65 64 20 76 61 6c 75 65 20 61 6e 64 20 75 6e  ved value and un
189c0 73 65 74 20 69 74 3b 20 6f 74 68 65 72 77 69 73  set it; otherwis
189d0 65 2c 20 6d 61 6b 65 20 73 75 72 65 0d 0a 20 20  e, make sure..  
189e0 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20      #       the 
189f0 6c 69 76 65 20 65 6e 76 69 72 6f 6e 6d 65 6e 74  live environment
18a00 20 76 61 72 69 61 62 6c 65 20 64 6f 65 73 20 6e   variable does n
18a10 6f 74 20 65 78 69 73 74 20 65 69 74 68 65 72 20  ot exist either 
18a20 28 69 2e 65 2e 20 69 74 0d 0a 20 20 20 20 20 20  (i.e. it..      
18a30 23 20 20 20 20 20 20 20 77 61 73 20 6e 6f 74 20  #       was not 
18a40 73 65 74 20 74 6f 20 62 65 67 69 6e 20 77 69 74  set to begin wit
18a50 68 29 2e 20 20 42 6f 74 68 20 73 61 76 65 64 20  h).  Both saved 
18a60 61 6e 64 20 6c 69 76 65 20 65 6e 76 69 72 6f 6e  and live environ
18a70 6d 65 6e 74 0d 0a 20 20 20 20 20 20 23 20 20 20  ment..      #   
18a80 20 20 20 20 76 61 72 69 61 62 6c 65 73 20 41 52      variables AR
18a90 45 20 63 68 61 6e 67 65 64 20 62 79 20 74 68 69  E changed by thi
18aa0 73 20 70 72 6f 63 65 64 75 72 65 2e 0d 0a 20 20  s procedure...  
18ab0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
18ac0 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
18ad0 24 76 61 72 4e 61 6d 65 5d 20 3d 3d 20 30 7d 20  $varName] == 0} 
18ae0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
18af0 73 65 74 20 76 61 72 4e 61 6d 65 20 73 61 76 65  set varName save
18b00 64 45 6e 76 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  dEnv..      }...
18b10 0a 20 20 20 20 20 20 75 70 76 61 72 20 31 20 24  .      upvar 1 $
18b20 76 61 72 4e 61 6d 65 20 73 61 76 65 64 45 6e 76  varName savedEnv
18b30 0d 0a 0d 0a 20 20 20 20 20 20 66 6f 72 65 61 63  ....      foreac
18b40 68 20 6e 61 6d 65 20 24 6e 61 6d 65 73 20 7b 0d  h name $names {.
18b50 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69 6e  .        if {[in
18b60 66 6f 20 65 78 69 73 74 73 20 73 61 76 65 64 45  fo exists savedE
18b70 6e 76 28 24 6e 61 6d 65 29 5d 7d 20 74 68 65 6e  nv($name)]} then
18b80 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   {..          se
18b90 74 20 3a 3a 65 6e 76 28 24 6e 61 6d 65 29 20 24  t ::env($name) $
18ba0 73 61 76 65 64 45 6e 76 28 24 6e 61 6d 65 29 0d  savedEnv($name).
18bb0 0a 20 20 20 20 20 20 20 20 20 20 75 6e 73 65 74  .          unset
18bc0 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 73 61 76   -nocomplain sav
18bd0 65 64 45 6e 76 28 24 6e 61 6d 65 29 0d 0a 20 20  edEnv($name)..  
18be0 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
18bf0 20 20 20 20 20 20 20 20 20 20 75 6e 73 65 74 20            unset 
18c00 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 3a 3a 65 6e  -nocomplain ::en
18c10 76 28 24 6e 61 6d 65 29 0d 0a 20 20 20 20 20 20  v($name)..      
18c20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a    }..      }....
18c30 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
18c40 20 4e 4f 54 45 3a 20 54 68 69 73 20 69 73 20 73   NOTE: This is s
18c50 65 6c 66 2d 63 6c 65 61 6e 69 6e 67 2e 20 20 49  elf-cleaning.  I
18c60 66 20 6e 6f 20 73 61 76 65 64 20 65 6e 76 69 72  f no saved envir
18c70 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 73  onment variables
18c80 20 6e 6f 77 0d 0a 20 20 20 20 20 20 23 20 20 20   now..      #   
18c90 20 20 20 20 65 78 69 73 74 2c 20 72 65 6d 6f 76      exist, remov
18ca0 65 20 74 68 65 20 61 72 72 61 79 2e 0d 0a 20 20  e the array...  
18cb0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
18cc0 7b 5b 61 72 72 61 79 20 73 69 7a 65 20 73 61 76  {[array size sav
18cd0 65 64 45 6e 76 5d 20 3d 3d 20 30 7d 20 74 68 65  edEnv] == 0} the
18ce0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 75 6e 73  n {..        uns
18cf0 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 73  et -nocomplain s
18d00 61 76 65 64 45 6e 76 0d 0a 20 20 20 20 20 20 7d  avedEnv..      }
18d10 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
18d20 70 72 6f 63 20 73 61 76 65 47 65 74 53 65 74 74  proc saveGetSett
18d30 69 6e 67 56 61 6c 75 65 45 6e 76 69 72 6f 6e 6d  ingValueEnvironm
18d40 65 6e 74 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20  ent {} {..      
18d50 75 70 76 61 72 20 31 20 73 61 76 65 64 45 6e 76  upvar 1 savedEnv
18d60 20 73 61 76 65 64 45 6e 76 0d 0a 0d 0a 20 20 20   savedEnv....   
18d70 20 20 20 73 61 76 65 45 6e 76 69 72 6f 6e 6d 65     saveEnvironme
18d80 6e 74 56 61 72 69 61 62 6c 65 73 20 5b 6c 69 73  ntVariables [lis
18d90 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 4e  t \..          N
18da0 6f 5f 45 78 70 61 6e 64 20 4e 6f 5f 53 51 4c 69  o_Expand No_SQLi
18db0 74 65 47 65 74 53 65 74 74 69 6e 67 56 61 6c 75  teGetSettingValu
18dc0 65 20 4e 6f 5f 53 51 4c 69 74 65 58 6d 6c 43 6f  e No_SQLiteXmlCo
18dd0 6e 66 69 67 46 69 6c 65 5d 20 5c 0d 0a 20 20 20  nfigFile] \..   
18de0 20 20 20 20 20 20 20 73 61 76 65 64 45 6e 76 0d         savedEnv.
18df0 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
18e00 72 6f 63 20 72 65 73 74 6f 72 65 47 65 74 53 65  roc restoreGetSe
18e10 74 74 69 6e 67 56 61 6c 75 65 45 6e 76 69 72 6f  ttingValueEnviro
18e20 6e 6d 65 6e 74 20 7b 7d 20 7b 0d 0a 20 20 20 20  nment {} {..    
18e30 20 20 75 70 76 61 72 20 31 20 73 61 76 65 64 45    upvar 1 savedE
18e40 6e 76 20 73 61 76 65 64 45 6e 76 0d 0a 0d 0a 20  nv savedEnv.... 
18e50 20 20 20 20 20 72 65 73 74 6f 72 65 45 6e 76 69       restoreEnvi
18e60 72 6f 6e 6d 65 6e 74 56 61 72 69 61 62 6c 65 73  ronmentVariables
18e70 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20   [list \..      
18e80 20 20 20 20 4e 6f 5f 45 78 70 61 6e 64 20 4e 6f      No_Expand No
18e90 5f 53 51 4c 69 74 65 47 65 74 53 65 74 74 69 6e  _SQLiteGetSettin
18ea0 67 56 61 6c 75 65 20 4e 6f 5f 53 51 4c 69 74 65  gValue No_SQLite
18eb0 58 6d 6c 43 6f 6e 66 69 67 46 69 6c 65 5d 20 5c  XmlConfigFile] \
18ec0 0d 0a 20 20 20 20 20 20 20 20 20 20 73 61 76 65  ..          save
18ed0 64 45 6e 76 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  dEnv..    }.....
18ee0 20 20 20 20 70 72 6f 63 20 73 61 76 65 53 51 4c      proc saveSQL
18ef0 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 45 6e 76  iteConnectionEnv
18f00 69 72 6f 6e 6d 65 6e 74 20 7b 7d 20 7b 0d 0a 20  ironment {} {.. 
18f10 20 20 20 20 20 75 70 76 61 72 20 31 20 73 61 76       upvar 1 sav
18f20 65 64 45 6e 76 20 73 61 76 65 64 45 6e 76 0d 0a  edEnv savedEnv..
18f30 0d 0a 20 20 20 20 20 20 73 61 76 65 45 6e 76 69  ..      saveEnvi
18f40 72 6f 6e 6d 65 6e 74 56 61 72 69 61 62 6c 65 73  ronmentVariables
18f50 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20   [list \..      
18f60 20 20 20 20 44 65 66 61 75 6c 74 46 6c 61 67 73      DefaultFlags
18f70 5f 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f  _SQLiteConnectio
18f80 6e 20 4e 6f 5f 53 51 4c 69 74 65 43 6f 6e 6e 65  n No_SQLiteConne
18f90 63 74 69 6f 6e 4e 65 77 50 61 72 73 65 72 5d 20  ctionNewParser] 
18fa0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 73 61 76  \..          sav
18fb0 65 64 45 6e 76 0d 0a 20 20 20 20 7d 0d 0a 0c 0d  edEnv..    }....
18fc0 0a 20 20 20 20 70 72 6f 63 20 72 65 73 74 6f 72  .    proc restor
18fd0 65 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f  eSQLiteConnectio
18fe0 6e 45 6e 76 69 72 6f 6e 6d 65 6e 74 20 7b 7d 20  nEnvironment {} 
18ff0 7b 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20 31  {..      upvar 1
19000 20 73 61 76 65 64 45 6e 76 20 73 61 76 65 64 45   savedEnv savedE
19010 6e 76 0d 0a 0d 0a 20 20 20 20 20 20 72 65 73 74  nv....      rest
19020 6f 72 65 45 6e 76 69 72 6f 6e 6d 65 6e 74 56 61  oreEnvironmentVa
19030 72 69 61 62 6c 65 73 20 5b 6c 69 73 74 20 5c 0d  riables [list \.
19040 0a 20 20 20 20 20 20 20 20 20 20 44 65 66 61 75  .          Defau
19050 6c 74 46 6c 61 67 73 5f 53 51 4c 69 74 65 43 6f  ltFlags_SQLiteCo
19060 6e 6e 65 63 74 69 6f 6e 20 4e 6f 5f 53 51 4c 69  nnection No_SQLi
19070 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 4e 65 77 50  teConnectionNewP
19080 61 72 73 65 72 5d 20 5c 0d 0a 20 20 20 20 20 20  arser] \..      
19090 20 20 20 20 73 61 76 65 64 45 6e 76 0d 0a 20 20      savedEnv..  
190a0 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
190b0 20 73 61 76 65 53 51 4c 69 74 65 43 6f 6e 76 65   saveSQLiteConve
190c0 72 74 45 6e 76 69 72 6f 6e 6d 65 6e 74 20 7b 7d  rtEnvironment {}
190d0 20 7b 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20   {..      upvar 
190e0 31 20 73 61 76 65 64 45 6e 76 20 73 61 76 65 64  1 savedEnv saved
190f0 45 6e 76 0d 0a 0d 0a 20 20 20 20 20 20 73 61 76  Env....      sav
19100 65 45 6e 76 69 72 6f 6e 6d 65 6e 74 56 61 72 69  eEnvironmentVari
19110 61 62 6c 65 73 20 5b 6c 69 73 74 20 5c 0d 0a 20  ables [list \.. 
19120 20 20 20 20 20 20 20 20 20 55 73 65 5f 53 51 4c           Use_SQL
19130 69 74 65 43 6f 6e 76 65 72 74 5f 44 65 66 61 75  iteConvert_Defau
19140 6c 74 44 62 54 79 70 65 20 55 73 65 5f 53 51 4c  ltDbType Use_SQL
19150 69 74 65 43 6f 6e 76 65 72 74 5f 44 65 66 61 75  iteConvert_Defau
19160 6c 74 54 79 70 65 4e 61 6d 65 5d 20 5c 0d 0a 20  ltTypeName] \.. 
19170 20 20 20 20 20 20 20 20 20 73 61 76 65 64 45 6e           savedEn
19180 76 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  v..    }.....   
19190 20 70 72 6f 63 20 72 65 73 74 6f 72 65 53 51 4c   proc restoreSQL
191a0 69 74 65 43 6f 6e 76 65 72 74 45 6e 76 69 72 6f  iteConvertEnviro
191b0 6e 6d 65 6e 74 20 7b 7d 20 7b 0d 0a 20 20 20 20  nment {} {..    
191c0 20 20 75 70 76 61 72 20 31 20 73 61 76 65 64 45    upvar 1 savedE
191d0 6e 76 20 73 61 76 65 64 45 6e 76 0d 0a 0d 0a 20  nv savedEnv.... 
191e0 20 20 20 20 20 72 65 73 74 6f 72 65 45 6e 76 69       restoreEnvi
191f0 72 6f 6e 6d 65 6e 74 56 61 72 69 61 62 6c 65 73  ronmentVariables
19200 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20   [list \..      
19210 20 20 20 20 55 73 65 5f 53 51 4c 69 74 65 43 6f      Use_SQLiteCo
19220 6e 76 65 72 74 5f 44 65 66 61 75 6c 74 44 62 54  nvert_DefaultDbT
19230 79 70 65 20 55 73 65 5f 53 51 4c 69 74 65 43 6f  ype Use_SQLiteCo
19240 6e 76 65 72 74 5f 44 65 66 61 75 6c 74 54 79 70  nvert_DefaultTyp
19250 65 4e 61 6d 65 5d 20 5c 0d 0a 20 20 20 20 20 20  eName] \..      
19260 20 20 20 20 73 61 76 65 64 45 6e 76 0d 0a 20 20      savedEnv..  
19270 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
19280 20 73 65 74 75 70 44 62 49 6e 74 65 72 72 75 70   setupDbInterrup
19290 74 43 61 6c 6c 62 61 63 6b 20 7b 20 63 68 61 6e  tCallback { chan
192a0 6e 65 6c 20 6c 6f 67 20 7d 20 7b 0d 0a 20 20 20  nel log } {..   
192b0 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
192c0 6c 20 22 2d 2d 2d 2d 20 73 65 74 74 69 6e 67 20  l "---- setting 
192d0 75 70 20 64 65 62 75 67 67 65 72 20 69 6e 74 65  up debugger inte
192e0 72 72 75 70 74 20 63 61 6c 6c 62 61 63 6b 2e 2e  rrupt callback..
192f0 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20  . "....      if 
19300 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
19310 20 20 20 73 61 76 65 45 6e 76 69 72 6f 6e 6d 65     saveEnvironme
19320 6e 74 56 61 72 69 61 62 6c 65 73 20 5b 6c 69 73  ntVariables [lis
19330 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  t \..           
19340 20 71 75 69 65 74 46 69 6e 64 49 6e 74 65 72 70   quietFindInterp
19350 72 65 74 65 72 54 65 73 74 50 61 74 68 20 71 75  reterTestPath qu
19360 69 65 74 53 65 74 75 70 49 6e 74 65 72 70 72 65  ietSetupInterpre
19370 74 65 72 54 65 73 74 50 61 74 68 5d 0d 0a 0d 0a  terTestPath]....
19380 20 20 20 20 20 20 20 20 74 72 79 20 7b 0d 0a 20          try {.. 
19390 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
193a0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 50 72        # NOTE: Pr
193b0 65 76 65 6e 74 20 74 68 65 20 76 65 6e 64 6f 72  event the vendor
193c0 20 73 63 72 69 70 74 20 66 72 6f 6d 20 62 65 69   script from bei
193d0 6e 67 20 6e 6f 69 73 79 20 77 68 65 6e 20 63 72  ng noisy when cr
193e0 65 61 74 69 6e 67 0d 0a 20 20 20 20 20 20 20 20  eating..        
193f0 20 20 23 20 20 20 20 20 20 20 74 68 65 20 69 73    #       the is
19400 6f 6c 61 74 65 64 20 69 6e 74 65 72 70 72 65 74  olated interpret
19410 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  er...          #
19420 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
19430 3a 3a 65 6e 76 28 71 75 69 65 74 46 69 6e 64 49  ::env(quietFindI
19440 6e 74 65 72 70 72 65 74 65 72 54 65 73 74 50 61  nterpreterTestPa
19450 74 68 29 20 31 0d 0a 20 20 20 20 20 20 20 20 20  th) 1..         
19460 20 73 65 74 20 3a 3a 65 6e 76 28 71 75 69 65 74   set ::env(quiet
19470 53 65 74 75 70 49 6e 74 65 72 70 72 65 74 65 72  SetupInterpreter
19480 54 65 73 74 50 61 74 68 29 20 31 0d 0a 0d 0a 20  TestPath) 1.... 
19490 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
194a0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4d 61        # NOTE: Ma
194b0 6b 65 20 73 75 72 65 20 74 68 65 20 73 63 72 69  ke sure the scri
194c0 70 74 20 64 65 62 75 67 67 65 72 20 61 6e 64 20  pt debugger and 
194d0 74 68 65 20 69 73 6f 6c 61 74 65 64 20 69 6e 74  the isolated int
194e0 65 72 70 72 65 74 65 72 0d 0a 20 20 20 20 20 20  erpreter..      
194f0 20 20 20 20 23 20 20 20 20 20 20 20 61 72 65 20      #       are 
19500 73 65 74 75 70 20 61 6e 64 20 72 65 61 64 79 20  setup and ready 
19510 66 6f 72 20 75 73 65 2e 0d 0a 20 20 20 20 20 20  for use...      
19520 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
19530 20 64 65 62 75 67 20 73 65 74 75 70 20 74 72 75   debug setup tru
19540 65 20 74 72 75 65 0d 0a 0d 0a 20 20 20 20 20 20  e true....      
19550 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
19560 20 23 20 4e 4f 54 45 3a 20 4c 6f 61 64 20 74 68   # NOTE: Load th
19570 65 20 6e 65 63 65 73 73 61 72 79 20 70 61 63 6b  e necessary pack
19580 61 67 65 73 20 69 6e 74 6f 20 74 68 65 20 69 73  ages into the is
19590 6f 6c 61 74 65 64 20 69 6e 74 65 72 70 72 65 74  olated interpret
195a0 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  er...          #
195b0 0d 0a 20 20 20 20 20 20 20 20 20 20 64 65 62 75  ..          debu
195c0 67 20 65 76 61 6c 20 7b 0d 0a 20 20 20 20 20 20  g eval {..      
195d0 20 20 20 20 20 20 70 61 63 6b 61 67 65 20 72 65        package re
195e0 71 75 69 72 65 20 45 61 67 6c 65 0d 0a 20 20 20  quire Eagle..   
195f0 20 20 20 20 20 20 20 20 20 70 61 63 6b 61 67 65           package
19600 20 72 65 71 75 69 72 65 20 45 61 67 6c 65 2e 4c   require Eagle.L
19610 69 62 72 61 72 79 0d 0a 20 20 20 20 20 20 20 20  ibrary..        
19620 20 20 20 20 70 61 63 6b 61 67 65 20 72 65 71 75      package requ
19630 69 72 65 20 45 61 67 6c 65 2e 54 65 73 74 0d 0a  ire Eagle.Test..
19640 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
19650 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
19660 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 6f        # NOTE: Co
19670 70 79 20 74 68 65 20 6e 65 63 65 73 73 61 72 79  py the necessary
19680 20 76 61 72 69 61 62 6c 65 73 20 69 6e 74 6f 20   variables into 
19690 74 68 65 20 69 73 6f 6c 61 74 65 64 20 69 6e 74  the isolated int
196a0 65 72 70 72 65 74 65 72 2e 0d 0a 20 20 20 20 20  erpreter...     
196b0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
196c0 20 20 64 65 62 75 67 20 69 6e 76 6f 6b 65 20 30    debug invoke 0
196d0 20 73 65 74 20 3a 3a 74 65 73 74 5f 63 68 61 6e   set ::test_chan
196e0 6e 65 6c 20 24 63 68 61 6e 6e 65 6c 3b 20 23 20  nel $channel; # 
196f0 4e 4f 54 45 3a 20 46 6f 72 20 5b 74 70 75 74 73  NOTE: For [tputs
19700 5d 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 64 65  ]...          de
19710 62 75 67 20 69 6e 76 6f 6b 65 20 30 20 73 65 74  bug invoke 0 set
19720 20 3a 3a 74 65 73 74 5f 6c 6f 67 20 24 6c 6f 67   ::test_log $log
19730 3b 20 23 20 4e 4f 54 45 3a 20 46 6f 72 20 5b 74  ; # NOTE: For [t
19740 6c 6f 67 5d 2e 0d 0a 0d 0a 20 20 20 20 20 20 20  log].....       
19750 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
19760 23 20 4e 4f 54 45 3a 20 49 6e 73 74 61 6c 6c 20  # NOTE: Install 
19770 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 73 63 72  the callback scr
19780 69 70 74 20 74 6f 20 62 65 20 65 76 61 6c 75 61  ipt to be evalua
19790 74 65 64 20 69 6e 20 74 68 65 20 69 73 6f 6c 61  ted in the isola
197a0 74 65 64 0d 0a 20 20 20 20 20 20 20 20 20 20 23  ted..          #
197b0 20 20 20 20 20 20 20 69 6e 74 65 72 70 72 65 74         interpret
197c0 65 72 20 77 68 65 6e 20 74 68 69 73 20 69 6e 74  er when this int
197d0 65 72 70 72 65 74 65 72 20 69 73 20 69 6e 74 65  erpreter is inte
197e0 72 72 75 70 74 65 64 20 62 79 20 73 63 72 69 70  rrupted by scrip
197f0 74 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20  t..          #  
19800 20 20 20 20 20 63 61 6e 63 65 6c 6c 61 74 69 6f       cancellatio
19810 6e 2c 20 65 74 63 2e 0d 0a 20 20 20 20 20 20 20  n, etc...       
19820 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
19830 64 65 62 75 67 20 63 61 6c 6c 62 61 63 6b 20 61  debug callback a
19840 70 70 6c 79 20 7b 7b 73 65 6e 64 65 72 20 65 7d  pply {{sender e}
19850 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
19860 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  #..            #
19870 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20   NOTE: Check if 
19880 74 68 69 73 20 64 65 62 75 67 67 65 72 20 63 61  this debugger ca
19890 6c 6c 62 61 63 6b 20 69 73 20 6f 6e 65 20 74 68  llback is one th
198a0 61 74 20 77 65 20 63 61 72 65 20 61 62 6f 75 74  at we care about
198b0 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  ...            #
198c0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65  ..            se
198d0 74 20 69 6e 74 65 72 72 75 70 74 54 79 70 65 73  t interruptTypes
198e0 20 5b 73 70 6c 69 74 20 5b 24 65 20 49 6e 74 65   [split [$e Inte
198f0 72 72 75 70 74 54 79 70 65 5d 20 22 2c 20 22 5d  rruptType] ", "]
19900 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
19910 69 66 20 7b 22 43 61 6e 63 65 6c 65 64 22 20 69  if {"Canceled" i
19920 6e 20 24 69 6e 74 65 72 72 75 70 74 54 79 70 65  n $interruptType
19930 73 20 7c 7c 20 5c 0d 0a 20 20 20 20 20 20 20 20  s || \..        
19940 20 20 20 20 20 20 20 20 22 55 6e 77 6f 75 6e 64          "Unwound
19950 22 20 69 6e 20 24 69 6e 74 65 72 72 75 70 74 54  " in $interruptT
19960 79 70 65 73 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ypes} then {..  
19970 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
19980 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e               # N
19990 4f 54 45 3a 20 4d 61 6b 65 20 73 75 72 65 20 74  OTE: Make sure t
199a0 68 65 20 5b 6f 62 6a 65 63 74 5d 20 63 6f 6d 6d  he [object] comm
199b0 61 6e 64 20 69 73 20 61 76 61 69 6c 61 62 6c 65  and is available
199c0 2e 20 20 53 69 6e 63 65 0d 0a 20 20 20 20 20 20  .  Since..      
199d0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
199e0 74 68 69 73 20 69 73 20 61 6e 20 69 73 6f 6c 61  this is an isola
199f0 74 65 64 20 69 6e 74 65 72 70 72 65 74 65 72 2c  ted interpreter,
19a00 20 63 68 65 63 6b 20 66 6f 72 20 69 74 20 74 68   check for it th
19a10 65 20 68 61 72 64 0d 0a 20 20 20 20 20 20 20 20  e hard..        
19a20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 77 61        #       wa
19a30 79 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  y...            
19a40 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
19a50 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20     if {[llength 
19a60 5b 69 6e 66 6f 20 63 6f 6d 6d 61 6e 64 73 20 6f  [info commands o
19a70 62 6a 65 63 74 5d 5d 20 3e 20 30 7d 20 74 68 65  bject]] > 0} the
19a80 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
19a90 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
19aa0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
19ab0 49 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  Iterate through 
19ac0 61 6c 6c 20 64 61 74 61 62 61 73 65 20 63 6f 6e  all database con
19ad0 6e 65 63 74 69 6f 6e 73 20 6b 6e 6f 77 6e 20 74  nections known t
19ae0 6f 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 20  o the..         
19af0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 70         #       p
19b00 61 72 65 6e 74 20 69 6e 74 65 72 70 72 65 74 65  arent interprete
19b10 72 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  r...            
19b20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
19b30 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 66 6f         object fo
19b40 72 65 61 63 68 20 2d 61 6c 69 61 73 20 70 61 69  reach -alias pai
19b50 72 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65  r [object invoke
19b60 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c   -flags +NonPubl
19b70 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ic \..          
19b80 20 20 20 20 20 20 20 20 20 20 24 65 20 49 6e 74            $e Int
19b90 65 72 70 72 65 74 65 72 2e 63 6f 6e 6e 65 63 74  erpreter.connect
19ba0 69 6f 6e 73 5d 20 7b 0d 0a 20 20 20 20 20 20 20  ions] {..       
19bb0 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
19bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19bd0 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20  # NOTE: Attempt 
19be0 74 6f 20 63 61 6e 63 65 6c 20 61 6e 79 20 53 51  to cancel any SQ
19bf0 4c 20 71 75 65 72 69 65 73 20 69 6e 20 70 72 6f  L queries in pro
19c00 67 72 65 73 73 20 6f 6e 0d 0a 20 20 20 20 20 20  gress on..      
19c10 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20              #   
19c20 20 20 20 20 74 68 69 73 20 64 61 74 61 62 61 73      this databas
19c30 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0d 0a 20  e connection... 
19c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c50 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
19c60 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
19c70 20 7b 24 70 61 69 72 20 56 61 6c 75 65 2e 43 61   {$pair Value.Ca
19c80 6e 63 65 6c 7d 20 65 72 72 6f 72 5d 7d 20 74 68  ncel} error]} th
19c90 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
19ca0 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
19cb0 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
19cc0 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 6e 20 5c  [appendArgs \n \
19cd0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
19ce0 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20            "==== 
19cf0 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20  WARNING: failed 
19d00 74 6f 20 63 61 6e 63 65 6c 20 71 75 65 72 79 20  to cancel query 
19d10 66 6f 72 20 22 20 5c 0d 0a 20 20 20 20 20 20 20  for " \..       
19d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d30 20 22 63 6f 6e 6e 65 63 74 69 6f 6e 20 5c 22 22   "connection \""
19d40 20 5b 24 70 61 69 72 20 4b 65 79 5d 20 22 5c 22   [$pair Key] "\"
19d50 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20  , error: " \n\t 
19d60 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
19d70 20 20 20 20 20 20 20 20 20 20 20 24 65 72 72 6f             $erro
19d80 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  r \n]..         
19d90 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
19da0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
19db0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65               } e
19dc0 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
19dd0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
19de0 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
19df0 70 65 6e 64 41 72 67 73 20 5c 6e 20 5c 0d 0a 20  pendArgs \n \.. 
19e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e10 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47     "==== WARNING
19e20 3a 20 63 61 6e 6e 6f 74 20 63 61 6e 63 65 6c 20  : cannot cancel 
19e30 61 6e 79 20 71 75 65 72 69 65 73 3a 20 22 20 5c  any queries: " \
19e40 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
19e50 20 20 20 20 20 20 22 74 68 65 20 5c 22 6f 62 6a        "the \"obj
19e60 65 63 74 5c 22 20 63 6f 6d 6d 61 6e 64 20 69 73  ect\" command is
19e70 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 5c 6e   not available\n
19e80 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  "]..            
19e90 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
19ea0 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 7d   }..          }}
19eb0 0d 0a 20 20 20 20 20 20 20 20 7d 20 66 69 6e 61  ..        } fina
19ec0 6c 6c 79 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lly {..         
19ed0 20 72 65 73 74 6f 72 65 45 6e 76 69 72 6f 6e 6d   restoreEnvironm
19ee0 65 6e 74 56 61 72 69 61 62 6c 65 73 20 5b 6c 69  entVariables [li
19ef0 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  st \..          
19f00 20 20 20 20 71 75 69 65 74 46 69 6e 64 49 6e 74      quietFindInt
19f10 65 72 70 72 65 74 65 72 54 65 73 74 50 61 74 68  erpreterTestPath
19f20 20 71 75 69 65 74 53 65 74 75 70 49 6e 74 65 72   quietSetupInter
19f30 70 72 65 74 65 72 54 65 73 74 50 61 74 68 5d 0d  preterTestPath].
19f40 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
19f50 20 20 7d 20 65 72 72 6f 72 5d 20 3d 3d 20 30 7d    } error] == 0}
19f60 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
19f70 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 69   addConstraint i
19f80 6e 74 65 72 72 75 70 74 43 61 6c 6c 62 61 63 6b  nterruptCallback
19f90 2e 73 71 6c 69 74 65 33 0d 0a 0d 0a 20 20 20 20  .sqlite3....    
19fa0 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
19fb0 65 6c 20 79 65 73 5c 6e 0d 0a 20 20 20 20 20 20  el yes\n..      
19fc0 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
19fd0 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
19fe0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 6e 6f   [appendArgs "no
19ff0 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20  , error: " \n\t 
1a000 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20  $error \n]..    
1a010 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
1a020 20 20 20 70 72 6f 63 20 63 6c 65 61 6e 75 70 46     proc cleanupF
1a030 69 6c 65 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7b  ile { fileName {
1a040 63 6f 6c 6c 65 63 74 20 74 72 75 65 7d 20 7b 66  collect true} {f
1a050 6f 72 63 65 20 66 61 6c 73 65 7d 20 7d 20 7b 0d  orce false} } {.
1a060 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
1a070 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20  # NOTE: Attempt 
1a080 74 6f 20 66 6f 72 63 65 20 61 6c 6c 20 70 65 6e  to force all pen
1a090 64 69 6e 67 20 22 67 61 72 62 61 67 65 22 20 6f  ding "garbage" o
1a0a0 62 6a 65 63 74 73 20 74 6f 20 62 65 20 63 6f 6c  bjects to be col
1a0b0 6c 65 63 74 65 64 2c 0d 0a 20 20 20 20 20 20 23  lected,..      #
1a0c0 20 20 20 20 20 20 20 69 6e 63 6c 75 64 69 6e 67         including
1a0d0 20 53 51 4c 69 74 65 20 73 74 61 74 65 6d 65 6e   SQLite statemen
1a0e0 74 73 20 61 6e 64 20 62 61 63 6b 75 70 20 6f 62  ts and backup ob
1a0f0 6a 65 63 74 73 3b 20 74 68 69 73 20 73 68 6f 75  jects; this shou
1a100 6c 64 20 61 6c 6c 6f 77 0d 0a 20 20 20 20 20 20  ld allow..      
1a110 23 20 20 20 20 20 20 20 74 68 65 20 75 6e 64 65  #       the unde
1a120 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65 20  rlying database 
1a130 66 69 6c 65 20 74 6f 20 62 65 20 64 65 6c 65 74  file to be delet
1a140 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ed...      #..  
1a150 20 20 20 20 69 66 20 7b 24 63 6f 6c 6c 65 63 74      if {$collect
1a160 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1a170 20 20 63 6f 6c 6c 65 63 74 47 61 72 62 61 67 65    collectGarbage
1a180 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
1a190 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
1a1a0 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
1a1b0 54 45 3a 20 43 68 65 63 6b 20 69 66 20 74 68 65  TE: Check if the
1a1c0 20 66 69 6c 65 20 73 74 69 6c 6c 20 65 78 69 73   file still exis
1a1d0 74 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ts...      #..  
1a1e0 20 20 20 20 69 66 20 7b 5b 66 69 6c 65 20 65 78      if {[file ex
1a1f0 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d  ists $fileName]}
1a200 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1a210 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
1a220 54 45 3a 20 53 6b 69 70 20 64 65 6c 65 74 69 6e  TE: Skip deletin
1a230 67 20 74 65 73 74 20 66 69 6c 65 73 20 69 66 20  g test files if 
1a240 73 6f 6d 65 62 6f 64 79 20 73 65 74 73 20 74 68  somebody sets th
1a250 65 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c  e global variabl
1a260 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
1a270 20 20 20 74 6f 20 70 72 65 76 65 6e 74 20 69 74     to prevent it
1a280 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
1a290 20 20 20 20 20 20 69 66 20 7b 24 66 6f 72 63 65        if {$force
1a2a0 20 7c 7c 20 21 5b 69 6e 66 6f 20 65 78 69 73 74   || ![info exist
1a2b0 73 20 3a 3a 6e 6f 28 63 6c 65 61 6e 75 70 46 69  s ::no(cleanupFi
1a2c0 6c 65 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  le)]} then {..  
1a2d0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1a2e0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74       # NOTE: Att
1a2f0 65 6d 70 74 20 74 6f 20 64 65 6c 65 74 65 20 74  empt to delete t
1a300 68 65 20 74 65 73 74 20 66 69 6c 65 20 6e 6f 77  he test file now
1a310 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
1a320 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73            if {[s
1a330 65 74 20 63 6f 64 65 20 5b 63 61 74 63 68 20 7b  et code [catch {
1a340 66 69 6c 65 20 64 65 6c 65 74 65 20 24 66 69 6c  file delete $fil
1a350 65 4e 61 6d 65 7d 20 65 72 72 6f 72 5d 5d 7d 20  eName} error]]} 
1a360 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1a370 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
1a380 20 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 73 6f     # NOTE: We so
1a390 6d 65 68 6f 77 20 66 61 69 6c 65 64 20 74 6f 20  mehow failed to 
1a3a0 64 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65 2c  delete the file,
1a3b0 20 72 65 70 6f 72 74 20 77 68 79 2e 0d 0a 20 20   report why...  
1a3c0 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
1a3d0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
1a3e0 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
1a3f0 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
1a400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d                "=
1a410 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69  === WARNING: fai
1a420 6c 65 64 20 74 6f 20 64 65 6c 65 74 65 20 74 65  led to delete te
1a430 73 74 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c  st file \"" $fil
1a440 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20  eName \..       
1a450 20 20 20 20 20 20 20 20 20 22 5c 22 20 64 75 72           "\" dur
1a460 69 6e 67 20 63 6c 65 61 6e 75 70 2c 20 65 72 72  ing cleanup, err
1a470 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f  or: " \n\t $erro
1a480 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  r \n]..         
1a490 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c   }..        } el
1a4a0 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
1a4b0 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e  #..          # N
1a4c0 4f 54 45 3a 20 53 68 6f 77 20 74 68 61 74 20 77  OTE: Show that w
1a4d0 65 20 73 6b 69 70 70 65 64 20 64 65 6c 65 74 69  e skipped deleti
1a4e0 6e 67 20 74 68 65 20 66 69 6c 65 2e 0d 0a 20 20  ng the file...  
1a4f0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1a500 20 20 20 20 20 73 65 74 20 63 6f 64 65 20 30 0d       set code 0.
1a510 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75  ...          tpu
1a520 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
1a530 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
1a540 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1a550 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 73  "==== WARNING: s
1a560 6b 69 70 70 65 64 20 64 65 6c 65 74 69 6e 67 20  kipped deleting 
1a570 74 65 73 74 20 66 69 6c 65 20 5c 22 22 20 24 66  test file \"" $f
1a580 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20  ileName \..     
1a590 20 20 20 20 20 20 20 20 20 22 5c 22 20 64 75 72           "\" dur
1a5a0 69 6e 67 20 63 6c 65 61 6e 75 70 5c 6e 22 5d 0d  ing cleanup\n"].
1a5b0 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
1a5c0 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
1a5d0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
1a5e0 20 4e 4f 54 45 3a 20 54 68 65 20 66 69 6c 65 20   NOTE: The file 
1a5f0 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20  does not exist, 
1a600 73 75 63 63 65 73 73 21 0d 0a 20 20 20 20 20 20  success!..      
1a610 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74    #..        set
1a620 20 63 6f 64 65 20 30 0d 0a 20 20 20 20 20 20 7d   code 0..      }
1a630 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ....      return
1a640 20 24 63 6f 64 65 0d 0a 20 20 20 20 7d 0d 0a 0c   $code..    }...
1a650 0d 0a 20 20 20 20 70 72 6f 63 20 63 6c 65 61 6e  ..    proc clean
1a660 75 70 4d 65 6d 6f 72 79 20 7b 20 76 61 72 4e 61  upMemory { varNa
1a670 6d 65 20 7b 71 75 69 65 74 20 66 61 6c 73 65 7d  me {quiet false}
1a680 20 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b   } {..      if {
1a690 5b 68 61 76 65 53 51 4c 69 74 65 4f 62 6a 65 63  [haveSQLiteObjec
1a6a0 74 43 6f 6d 6d 61 6e 64 5d 20 26 26 20 5c 0d 0a  tCommand] && \..
1a6b0 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e            [strin
1a6c0 67 20 6c 65 6e 67 74 68 20 24 76 61 72 4e 61 6d  g length $varNam
1a6d0 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  e] > 0} then {..
1a6e0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1a6f0 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 66 65 72     # NOTE: Refer
1a700 20 74 6f 20 74 68 65 20 73 70 65 63 69 66 69 65   to the specifie
1a710 64 20 76 61 72 69 61 62 6c 65 20 28 65 2e 67 2e  d variable (e.g.
1a720 20 22 63 6f 6e 6e 65 63 74 69 6f 6e 22 29 20 69   "connection") i
1a730 6e 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23  n the..        #
1a740 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74 20 6f         context o
1a750 66 20 6f 75 72 20 63 61 6c 6c 65 72 2e 20 20 54  f our caller.  T
1a760 68 65 20 6f 70 61 71 75 65 20 6f 62 6a 65 63 74  he opaque object
1a770 20 68 61 6e 64 6c 65 20 66 6f 72 20 61 6e 0d 0a   handle for an..
1a780 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
1a790 41 44 4f 2e 4e 45 54 20 63 6f 6e 6e 65 63 74 69  ADO.NET connecti
1a7a0 6f 6e 20 70 72 65 76 69 6f 75 73 6c 79 20 72 65  on previously re
1a7b0 74 75 72 6e 65 64 20 62 79 20 5b 67 65 74 44 62  turned by [getDb
1a7c0 43 6f 6e 6e 65 63 74 69 6f 6e 5d 0d 0a 20 20 20  Connection]..   
1a7d0 20 20 20 20 20 23 20 20 20 20 20 20 20 73 68 6f       #       sho
1a7e0 75 6c 64 20 62 65 20 73 74 6f 72 65 64 20 74 68  uld be stored th
1a7f0 65 72 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ere...        #.
1a800 0a 20 20 20 20 20 20 20 20 75 70 76 61 72 20 31  .        upvar 1
1a810 20 24 76 61 72 4e 61 6d 65 20 63 6f 6e 6e 65 63   $varName connec
1a820 74 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20  tion....        
1a830 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20  if {[catch {..  
1a840 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69          object i
1a850 6e 76 6f 6b 65 20 24 63 6f 6e 6e 65 63 74 69 6f  nvoke $connectio
1a860 6e 20 52 65 6c 65 61 73 65 4d 65 6d 6f 72 79 0d  n ReleaseMemory.
1a870 0a 20 20 20 20 20 20 20 20 7d 20 72 65 73 75 6c  .        } resul
1a880 74 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  t]} then {..    
1a890 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
1a8a0 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
1a8b0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
1a8c0 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
1a8d0 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
1a8e0 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d              "===
1a8f0 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65  = WARNING: faile
1a900 64 20 74 6f 20 72 65 6c 65 61 73 65 20 64 61 74  d to release dat
1a910 61 62 61 73 65 20 6d 65 6d 6f 72 79 2c 20 65 72  abase memory, er
1a920 72 6f 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20  ror: " \..      
1a930 20 20 20 20 20 20 20 20 20 20 5c 6e 5c 74 20 24            \n\t $
1a940 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20  result \n]..    
1a950 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
1a960 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20   }..      }.... 
1a970 20 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67 74       if {[llengt
1a980 68 20 5b 69 6e 66 6f 20 63 6f 6d 6d 61 6e 64 73  h [info commands
1a990 20 64 65 62 75 67 5d 5d 20 3e 20 30 7d 20 74 68   debug]] > 0} th
1a9a0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66  en {..        if
1a9b0 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
1a9c0 20 20 20 20 20 20 75 70 6c 65 76 65 6c 20 31 20        uplevel 1 
1a9d0 5b 6c 69 73 74 20 64 65 62 75 67 20 70 75 72 67  [list debug purg
1a9e0 65 5d 0d 0a 20 20 20 20 20 20 20 20 7d 20 72 65  e]..        } re
1a9f0 73 75 6c 74 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  sult]} then {.. 
1aa00 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71           if {!$q
1aa10 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
1aa20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
1aa30 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
1aa40 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
1aa50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1aa60 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61  ==== WARNING: fa
1aa70 69 6c 65 64 20 74 6f 20 70 75 72 67 65 20 63 61  iled to purge ca
1aa80 6c 6c 20 66 72 61 6d 65 2c 20 65 72 72 6f 72 3a  ll frame, error:
1aa90 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   " \..          
1aaa0 20 20 20 20 20 20 5c 6e 5c 74 20 24 72 65 73 75        \n\t $resu
1aab0 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  lt \n]..        
1aac0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
1aad0 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63  ..        if {[c
1aae0 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
1aaf0 20 20 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73    uplevel 1 [lis
1ab00 74 20 64 65 62 75 67 20 63 6c 65 61 6e 75 70 5d  t debug cleanup]
1ab10 0d 0a 20 20 20 20 20 20 20 20 7d 20 72 65 73 75  ..        } resu
1ab20 6c 74 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  lt]} then {..   
1ab30 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
1ab40 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
1ab50 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
1ab60 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
1ab70 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
1ab80 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d               "==
1ab90 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c  == WARNING: fail
1aba0 65 64 20 74 6f 20 63 6c 65 61 6e 75 70 20 69 6e  ed to cleanup in
1abb0 74 65 72 70 72 65 74 65 72 2c 20 65 72 72 6f 72  terpreter, error
1abc0 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  : " \..         
1abd0 20 20 20 20 20 20 20 5c 6e 5c 74 20 24 72 65 73         \n\t $res
1abe0 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ult \n]..       
1abf0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
1ac00 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  ...        if {[
1ac10 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
1ac20 20 20 20 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69     uplevel 1 [li
1ac30 73 74 20 64 65 62 75 67 20 63 6f 6c 6c 65 63 74  st debug collect
1ac40 5d 0d 0a 20 20 20 20 20 20 20 20 7d 20 72 65 73  ]..        } res
1ac50 75 6c 74 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ult]} then {..  
1ac60 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
1ac70 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
1ac80 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
1ac90 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
1aca0 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
1acb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d                "=
1acc0 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69  === WARNING: fai
1acd0 6c 65 64 20 74 6f 20 63 6f 6c 6c 65 63 74 20 67  led to collect g
1ace0 61 72 62 61 67 65 2c 20 65 72 72 6f 72 3a 20 22  arbage, error: "
1acf0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1ad00 20 20 20 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74      \n\t $result
1ad10 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \n]..          
1ad20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  }..        }..  
1ad30 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
1ad40 0a 20 20 20 20 70 72 6f 63 20 73 65 74 75 70 4d  .    proc setupM
1ad50 65 6d 6f 72 79 43 6f 75 6e 74 65 72 73 20 7b 20  emoryCounters { 
1ad60 76 61 72 4e 61 6d 65 20 7d 20 7b 0d 0a 20 20 20  varName } {..   
1ad70 20 20 20 69 66 20 7b 5b 68 61 76 65 53 51 4c 69     if {[haveSQLi
1ad80 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d  teObjectCommand]
1ad90 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1ada0 20 20 75 70 76 61 72 20 31 20 24 76 61 72 4e 61    upvar 1 $varNa
1adb0 6d 65 20 63 6f 75 6e 74 65 72 0d 0a 0d 0a 20 20  me counter....  
1adc0 20 20 20 20 20 20 73 65 74 20 63 6f 75 6e 74 65        set counte
1add0 72 28 31 29 20 5b 6f 62 6a 65 63 74 20 63 72 65  r(1) [object cre
1ade0 61 74 65 20 2d 61 6c 69 61 73 20 5c 0d 0a 20 20  ate -alias \..  
1adf0 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d            System
1ae00 2e 44 69 61 67 6e 6f 73 74 69 63 73 2e 50 65 72  .Diagnostics.Per
1ae10 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72 20  formanceCounter 
1ae20 50 72 6f 63 65 73 73 20 5c 0d 0a 20 20 20 20 20  Process \..     
1ae30 20 20 20 20 20 20 20 22 57 6f 72 6b 69 6e 67 20         "Working 
1ae40 53 65 74 22 20 5b 66 69 6c 65 20 72 6f 6f 74 6e  Set" [file rootn
1ae50 61 6d 65 20 5b 66 69 6c 65 20 74 61 69 6c 20 24  ame [file tail $
1ae60 3a 3a 62 69 6e 5f 66 69 6c 65 5d 5d 5d 0d 0a 0d  ::bin_file]]]...
1ae70 0a 20 20 20 20 20 20 20 20 73 65 74 20 63 6f 75  .        set cou
1ae80 6e 74 65 72 28 32 29 20 5b 6f 62 6a 65 63 74 20  nter(2) [object 
1ae90 63 72 65 61 74 65 20 2d 61 6c 69 61 73 20 5c 0d  create -alias \.
1aea0 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73  .            Sys
1aeb0 74 65 6d 2e 44 69 61 67 6e 6f 73 74 69 63 73 2e  tem.Diagnostics.
1aec0 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74  PerformanceCount
1aed0 65 72 20 50 72 6f 63 65 73 73 20 5c 0d 0a 20 20  er Process \..  
1aee0 20 20 20 20 20 20 20 20 20 20 22 57 6f 72 6b 69            "Worki
1aef0 6e 67 20 53 65 74 20 50 65 61 6b 22 20 5b 66 69  ng Set Peak" [fi
1af00 6c 65 20 72 6f 6f 74 6e 61 6d 65 20 5b 66 69 6c  le rootname [fil
1af10 65 20 74 61 69 6c 20 24 3a 3a 62 69 6e 5f 66 69  e tail $::bin_fi
1af20 6c 65 5d 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  le]]]....       
1af30 20 73 65 74 20 63 6f 75 6e 74 65 72 28 33 29 20   set counter(3) 
1af40 5b 6f 62 6a 65 63 74 20 63 72 65 61 74 65 20 2d  [object create -
1af50 61 6c 69 61 73 20 5c 0d 0a 20 20 20 20 20 20 20  alias \..       
1af60 20 20 20 20 20 53 79 73 74 65 6d 2e 44 69 61 67       System.Diag
1af70 6e 6f 73 74 69 63 73 2e 50 65 72 66 6f 72 6d 61  nostics.Performa
1af80 6e 63 65 43 6f 75 6e 74 65 72 20 50 72 6f 63 65  nceCounter Proce
1af90 73 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ss \..          
1afa0 20 20 22 50 72 69 76 61 74 65 20 42 79 74 65 73    "Private Bytes
1afb0 22 20 5b 66 69 6c 65 20 72 6f 6f 74 6e 61 6d 65  " [file rootname
1afc0 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 3a 3a 62   [file tail $::b
1afd0 69 6e 5f 66 69 6c 65 5d 5d 5d 0d 0a 20 20 20 20  in_file]]]..    
1afe0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74    }....      ret
1aff0 75 72 6e 20 22 22 0d 0a 20 20 20 20 7d 0d 0a 0c  urn ""..    }...
1b000 0d 0a 20 20 20 20 70 72 6f 63 20 72 65 70 6f 72  ..    proc repor
1b010 74 4d 65 6d 6f 72 79 43 6f 75 6e 74 65 72 73 20  tMemoryCounters 
1b020 7b 20 63 68 61 6e 6e 65 6c 20 76 61 72 4e 61 6d  { channel varNam
1b030 65 20 70 72 65 66 69 78 20 7d 20 7b 0d 0a 20 20  e prefix } {..  
1b040 20 20 20 20 69 66 20 7b 5b 68 61 76 65 53 51 4c      if {[haveSQL
1b050 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64  iteObjectCommand
1b060 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
1b070 20 20 20 75 70 76 61 72 20 31 20 24 76 61 72 4e     upvar 1 $varN
1b080 61 6d 65 20 63 6f 75 6e 74 65 72 0d 0a 0d 0a 20  ame counter.... 
1b090 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
1b0a0 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
1b0b0 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
1b0c0 20 22 2d 2d 2d 2d 20 22 20 24 70 72 65 66 69 78   "---- " $prefix
1b0d0 20 22 20 63 6f 75 6e 74 65 72 20 5c 22 22 20 5c   " counter \"" \
1b0e0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 6f  ..            [o
1b0f0 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 24 63 6f  bject invoke $co
1b100 75 6e 74 65 72 28 31 29 20 43 6f 75 6e 74 65 72  unter(1) Counter
1b110 4e 61 6d 65 5d 20 22 5c 22 20 76 61 6c 75 65 20  Name] "\" value 
1b120 69 73 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20  is " \..        
1b130 20 20 20 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f      [object invo
1b140 6b 65 20 24 63 6f 75 6e 74 65 72 28 31 29 20 52  ke $counter(1) R
1b150 61 77 56 61 6c 75 65 5d 20 5c 6e 5d 0d 0a 0d 0a  awValue] \n]....
1b160 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
1b170 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
1b180 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
1b190 20 20 22 2d 2d 2d 2d 20 22 20 24 70 72 65 66 69    "---- " $prefi
1b1a0 78 20 22 20 63 6f 75 6e 74 65 72 20 5c 22 22 20  x " counter \"" 
1b1b0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
1b1c0 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 24 63  object invoke $c
1b1d0 6f 75 6e 74 65 72 28 32 29 20 43 6f 75 6e 74 65  ounter(2) Counte
1b1e0 72 4e 61 6d 65 5d 20 22 5c 22 20 76 61 6c 75 65  rName] "\" value
1b1f0 20 69 73 20 22 20 5c 0d 0a 20 20 20 20 20 20 20   is " \..       
1b200 20 20 20 20 20 5b 6f 62 6a 65 63 74 20 69 6e 76       [object inv
1b210 6f 6b 65 20 24 63 6f 75 6e 74 65 72 28 32 29 20  oke $counter(2) 
1b220 52 61 77 56 61 6c 75 65 5d 20 5c 6e 5d 0d 0a 0d  RawValue] \n]...
1b230 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
1b240 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
1b250 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
1b260 20 20 20 22 2d 2d 2d 2d 20 22 20 24 70 72 65 66     "---- " $pref
1b270 69 78 20 22 20 63 6f 75 6e 74 65 72 20 5c 22 22  ix " counter \""
1b280 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1b290 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 24  [object invoke $
1b2a0 63 6f 75 6e 74 65 72 28 33 29 20 43 6f 75 6e 74  counter(3) Count
1b2b0 65 72 4e 61 6d 65 5d 20 22 5c 22 20 76 61 6c 75  erName] "\" valu
1b2c0 65 20 69 73 20 22 20 5c 0d 0a 20 20 20 20 20 20  e is " \..      
1b2d0 20 20 20 20 20 20 5b 6f 62 6a 65 63 74 20 69 6e        [object in
1b2e0 76 6f 6b 65 20 24 63 6f 75 6e 74 65 72 28 33 29  voke $counter(3)
1b2f0 20 52 61 77 56 61 6c 75 65 5d 20 5c 6e 5d 0d 0a   RawValue] \n]..
1b300 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
1b310 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 6f 6c 6c  ...    proc coll
1b320 65 63 74 47 61 72 62 61 67 65 20 7b 20 63 68 61  ectGarbage { cha
1b330 6e 6e 65 6c 20 7b 6d 69 6c 6c 69 73 65 63 6f 6e  nnel {millisecon
1b340 64 73 20 31 30 30 30 7d 20 7b 71 75 69 65 74 20  ds 1000} {quiet 
1b350 74 72 75 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  true} } {..     
1b360 20 69 66 20 7b 5b 68 61 76 65 53 51 4c 69 74 65   if {[haveSQLite
1b370 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20  ObjectCommand]} 
1b380 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1b390 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20  if {[catch {..  
1b3a0 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69          object i
1b3b0 6e 76 6f 6b 65 20 47 43 20 47 65 74 54 6f 74 61  nvoke GC GetTota
1b3c0 6c 4d 65 6d 6f 72 79 20 66 61 6c 73 65 0d 0a 20  lMemory false.. 
1b3d0 20 20 20 20 20 20 20 7d 20 72 65 73 75 6c 74 5d         } result]
1b3e0 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
1b3f0 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71           if {!$q
1b400 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
1b410 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
1b420 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
1b430 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
1b440 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6d 65          "---- me
1b450 6d 6f 72 79 20 69 6e 20 75 73 65 20 62 79 20 74  mory in use by t
1b460 68 65 20 43 4c 52 20 62 65 66 6f 72 65 20 63 6f  he CLR before co
1b470 6c 6c 65 63 74 69 6f 6e 2e 2e 2e 20 22 20 5c 0d  llection... " \.
1b480 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b490 20 24 72 65 73 75 6c 74 20 22 20 62 79 74 65 73   $result " bytes
1b4a0 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  \n"]..          
1b4b0 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73  }..        } els
1b4c0 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74  e {..          t
1b4d0 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
1b4e0 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
1b4f0 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d             "====
1b500 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64   WARNING: failed
1b510 20 74 6f 20 67 65 74 20 43 4c 52 20 6d 65 6d 6f   to get CLR memo
1b520 72 79 20 75 73 61 67 65 2c 20 65 72 72 6f 72 3a  ry usage, error:
1b530 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   " \..          
1b540 20 20 20 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74      \n\t $result
1b550 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d   \n]..        }.
1b560 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
1b570 20 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23    ##############
1b580 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1b590 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1b5a0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1b5b0 23 23 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20  ###########.... 
1b5c0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
1b5d0 4e 4f 54 45 3a 20 52 65 70 65 61 74 65 64 6c 79  NOTE: Repeatedly
1b5e0 20 61 74 74 65 6d 70 74 20 74 6f 20 63 6f 6c 6c   attempt to coll
1b5f0 65 63 74 20 67 61 72 62 61 67 65 20 75 6e 74 69  ect garbage unti
1b600 6c 20 74 68 65 20 61 6c 6c 6f 74 74 65 64 20 6e  l the allotted n
1b610 75 6d 62 65 72 0d 0a 20 20 20 20 20 20 23 20 20  umber..      #  
1b620 20 20 20 20 20 6f 66 20 6d 69 6c 6c 69 73 65 63       of millisec
1b630 6f 6e 64 73 20 68 61 73 20 65 6c 61 70 73 65 64  onds has elapsed
1b640 2e 20 20 41 6c 77 61 79 73 20 61 74 74 65 6d 70  .  Always attemp
1b650 74 20 74 6f 20 63 6f 6c 6c 65 63 74 20 67 61 72  t to collect gar
1b660 62 61 67 65 0d 0a 20 20 20 20 20 20 23 20 20 20  bage..      #   
1b670 20 20 20 20 61 74 20 6c 65 61 73 74 20 6f 6e 63      at least onc
1b680 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  e...      #..   
1b690 20 20 20 69 66 20 7b 5b 68 61 76 65 53 51 4c 69     if {[haveSQLi
1b6a0 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d  teObjectCommand]
1b6b0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1b6c0 20 20 73 65 74 20 73 74 61 72 74 20 5b 63 6c 6f    set start [clo
1b6d0 63 6b 20 73 65 63 6f 6e 64 73 5d 0d 0a 20 20 20  ck seconds]..   
1b6e0 20 20 20 20 20 73 65 74 20 73 74 6f 70 20 5b 65       set stop [e
1b6f0 78 70 72 20 7b 24 73 74 61 72 74 20 2b 20 28 24  xpr {$start + ($
1b700 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 2f 20 31  milliseconds / 1
1b710 30 30 30 29 7d 5d 0d 0a 0d 0a 20 20 20 20 20 20  000)}]....      
1b720 20 20 64 6f 20 7b 0d 0a 20 20 20 20 20 20 20 20    do {..        
1b730 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23    #..          #
1b740 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74   NOTE: Attempt t
1b750 6f 20 66 6f 72 63 65 20 61 20 66 75 6c 6c 20 67  o force a full g
1b760 61 72 62 61 67 65 20 63 6f 6c 6c 65 63 74 69 6f  arbage collectio
1b770 6e 20 6e 6f 77 2e 20 20 52 65 70 6f 72 74 20 61  n now.  Report a
1b780 6e 79 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20  ny..          # 
1b790 20 20 20 20 20 20 65 72 72 6f 72 20 74 68 61 74        error that
1b7a0 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20   is encountered 
1b7b0 69 66 20 77 65 20 66 61 69 6c 2e 0d 0a 20 20 20  if we fail...   
1b7c0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1b7d0 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
1b7e0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 62  ..            ob
1b7f0 6a 65 63 74 20 69 6e 76 6f 6b 65 20 47 43 20 47  ject invoke GC G
1b800 65 74 54 6f 74 61 6c 4d 65 6d 6f 72 79 20 74 72  etTotalMemory tr
1b810 75 65 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20  ue..          } 
1b820 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a  error]} then {..
1b830 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
1b840 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
1b850 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
1b860 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20            "==== 
1b870 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20  WARNING: failed 
1b880 66 75 6c 6c 20 67 61 72 62 61 67 65 20 63 6f 6c  full garbage col
1b890 6c 65 63 74 69 6f 6e 2c 20 65 72 72 6f 72 3a 20  lection, error: 
1b8a0 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
1b8b0 20 20 20 20 20 5c 6e 5c 74 20 24 65 72 72 6f 72       \n\t $error
1b8c0 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \n]..          
1b8d0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 73  }....          s
1b8e0 65 74 20 6e 6f 77 20 5b 63 6c 6f 63 6b 20 73 65  et now [clock se
1b8f0 63 6f 6e 64 73 5d 0d 0a 20 20 20 20 20 20 20 20  conds]..        
1b900 7d 20 77 68 69 6c 65 20 7b 24 73 74 61 72 74 20  } while {$start 
1b910 3c 3d 20 24 6e 6f 77 20 26 26 20 24 6e 6f 77 20  <= $now && $now 
1b920 3c 20 24 73 74 6f 70 7d 0d 0a 20 20 20 20 20 20  < $stop}..      
1b930 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 23 23 23 23  }....      #####
1b940 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1b950 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1b960 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1b970 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1b980 23 23 23 23 0d 0a 0d 0a 20 20 20 20 20 20 69 66  ####....      if
1b990 20 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f 62 6a   {[haveSQLiteObj
1b9a0 65 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65  ectCommand]} the
1b9b0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20  n {..        if 
1b9c0 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
1b9d0 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f       object invo
1b9e0 6b 65 20 47 43 20 47 65 74 54 6f 74 61 6c 4d 65  ke GC GetTotalMe
1b9f0 6d 6f 72 79 20 66 61 6c 73 65 0d 0a 20 20 20 20  mory false..    
1ba00 20 20 20 20 7d 20 72 65 73 75 6c 74 5d 20 3d 3d      } result] ==
1ba10 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
1ba20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
1ba30 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
1ba40 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
1ba50 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
1ba60 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
1ba70 20 20 20 20 20 22 2d 2d 2d 2d 20 6d 65 6d 6f 72       "---- memor
1ba80 79 20 69 6e 20 75 73 65 20 62 79 20 74 68 65 20  y in use by the 
1ba90 43 4c 52 20 61 66 74 65 72 20 63 6f 6c 6c 65 63  CLR after collec
1baa0 74 69 6f 6e 2e 2e 2e 20 22 20 5c 0d 0a 20 20 20  tion... " \..   
1bab0 20 20 20 20 20 20 20 20 20 20 20 20 20 24 72 65               $re
1bac0 73 75 6c 74 20 22 20 62 79 74 65 73 5c 6e 22 5d  sult " bytes\n"]
1bad0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
1bae0 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
1baf0 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
1bb00 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
1bb10 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
1bb20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52         "==== WAR
1bb30 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20  NING: failed to 
1bb40 67 65 74 20 43 4c 52 20 6d 65 6d 6f 72 79 20 75  get CLR memory u
1bb50 73 61 67 65 2c 20 65 72 72 6f 72 3a 20 22 20 5c  sage, error: " \
1bb60 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1bb70 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d  \n\t $result \n]
1bb80 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
1bb90 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
1bba0 20 20 20 20 70 72 6f 63 20 67 65 74 53 51 4c 69      proc getSQLi
1bbb0 74 65 48 61 6e 64 6c 65 43 6f 75 6e 74 73 20 7b  teHandleCounts {
1bbc0 20 63 68 61 6e 6e 65 6c 20 7b 71 75 69 65 74 20   channel {quiet 
1bbd0 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20  false} } {..    
1bbe0 20 20 73 65 74 20 72 65 73 75 6c 74 20 5b 6c 69    set result [li
1bbf0 73 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20  st]....      if 
1bc00 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f 62 6a 65  {[haveSQLiteObje
1bc10 63 74 43 6f 6d 6d 61 6e 64 5d 20 26 26 20 5c 0d  ctCommand] && \.
1bc20 0a 20 20 20 20 20 20 20 20 20 20 5b 68 61 76 65  .          [have
1bc30 53 51 4c 69 74 65 44 65 66 69 6e 65 43 6f 6e 73  SQLiteDefineCons
1bc40 74 61 6e 74 20 43 4f 55 4e 54 5f 48 41 4e 44 4c  tant COUNT_HANDL
1bc50 45 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  E]} then {..    
1bc60 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
1bc70 20 4e 4f 54 45 3a 20 41 64 64 20 65 61 63 68 20   NOTE: Add each 
1bc80 63 72 69 74 69 63 61 6c 20 68 61 6e 64 6c 65 20  critical handle 
1bc90 63 6f 75 6e 74 20 74 6f 20 74 68 65 20 72 65 73  count to the res
1bca0 75 6c 74 69 6e 67 20 6c 69 73 74 2e 0d 0a 20 20  ulting list...  
1bcb0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1bcc0 20 66 6f 72 65 61 63 68 20 6e 61 6d 65 20 5b 6c   foreach name [l
1bcd0 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ist \..         
1bce0 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 43 6f 75     connectionCou
1bcf0 6e 74 20 73 74 61 74 65 6d 65 6e 74 43 6f 75 6e  nt statementCoun
1bd00 74 20 62 61 63 6b 75 70 43 6f 75 6e 74 20 62 6c  t backupCount bl
1bd10 6f 62 43 6f 75 6e 74 5d 20 7b 0d 0a 20 20 20 20  obCount] {..    
1bd20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
1bd30 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1bd40 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66  object invoke -f
1bd50 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20  lags +NonPublic 
1bd60 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1bd70 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53     System.Data.S
1bd80 51 4c 69 74 65 2e 44 65 62 75 67 44 61 74 61 20  QLite.DebugData 
1bd90 24 6e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 20  $name..         
1bda0 20 7d 20 76 61 6c 75 65 5d 20 3d 3d 20 30 7d 20   } value] == 0} 
1bdb0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1bdc0 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
1bdd0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1bde0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
1bdf0 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
1be00 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
1be10 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 72 69         "---- cri
1be20 74 69 63 61 6c 20 68 61 6e 64 6c 65 20 63 6f 75  tical handle cou
1be30 6e 74 20 5c 22 22 20 24 6e 61 6d 65 20 22 5c 22  nt \"" $name "\"
1be40 20 69 73 20 22 20 24 76 61 6c 75 65 20 5c 6e 5d   is " $value \n]
1be50 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
1be60 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c  ...            l
1be70 61 70 70 65 6e 64 20 72 65 73 75 6c 74 20 24 76  append result $v
1be80 61 6c 75 65 0d 0a 20 20 20 20 20 20 20 20 20 20  alue..          
1be90 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
1bea0 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
1beb0 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
1bec0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1bed0 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e      "==== WARNIN
1bee0 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 67 65 74  G: failed to get
1bef0 20 63 72 69 74 69 63 61 6c 20 68 61 6e 64 6c 65   critical handle
1bf00 20 63 6f 75 6e 74 20 5c 22 22 20 5c 0d 0a 20 20   count \"" \..  
1bf10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24 6e                $n
1bf20 61 6d 65 20 22 5c 22 2c 20 65 72 72 6f 72 3a 20  ame "\", error: 
1bf30 22 20 5c 6e 5c 74 20 24 76 61 6c 75 65 20 5c 6e  " \n\t $value \n
1bf40 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ]..          }..
1bf50 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
1bf60 20 7d 20 65 6c 73 65 69 66 20 7b 21 24 71 75 69   } elseif {!$qui
1bf70 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
1bf80 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
1bf90 20 4e 4f 54 45 3a 20 54 68 65 20 61 63 74 75 61   NOTE: The actua
1bfa0 6c 20 68 61 6e 64 6c 65 20 63 6f 75 6e 74 73 20  l handle counts 
1bfb0 61 72 65 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c  are not availabl
1bfc0 65 3b 20 74 68 65 72 65 66 6f 72 65 2c 20 6a 75  e; therefore, ju
1bfd0 73 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  st..        #   
1bfe0 20 20 20 20 72 65 74 75 72 6e 20 61 6e 20 65 6d      return an em
1bff0 70 74 79 20 6c 69 73 74 2e 0d 0a 20 20 20 20 20  pty list...     
1c000 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70     #..        tp
1c010 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d  uts $channel "--
1c020 2d 2d 20 63 72 69 74 69 63 61 6c 20 68 61 6e 64  -- critical hand
1c030 6c 65 20 63 6f 75 6e 74 73 20 75 6e 61 76 61 69  le counts unavai
1c040 6c 61 62 6c 65 5c 6e 22 0d 0a 20 20 20 20 20 20  lable\n"..      
1c050 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72  }....      retur
1c060 6e 20 24 72 65 73 75 6c 74 0d 0a 20 20 20 20 7d  n $result..    }
1c070 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 73 68  .....    proc sh
1c080 75 74 64 6f 77 6e 53 51 4c 69 74 65 20 7b 20 63  utdownSQLite { c
1c090 68 61 6e 6e 65 6c 20 7b 66 6f 72 63 65 20 66 61  hannel {force fa
1c0a0 6c 73 65 7d 20 7b 71 75 69 65 74 20 66 61 6c 73  lse} {quiet fals
1c0b0 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  e} } {..      #.
1c0c0 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4d  .      # NOTE: M
1c0d0 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 53 51  ake sure that SQ
1c0e0 4c 69 74 65 20 63 6f 72 65 20 6c 69 62 72 61 72  Lite core librar
1c0f0 79 20 69 73 20 63 6f 6d 70 6c 65 74 65 6c 79 20  y is completely 
1c100 73 68 75 74 64 6f 77 6e 2e 20 20 54 68 69 73 0d  shutdown.  This.
1c110 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69  .      #       i
1c120 73 20 75 73 65 64 20 62 79 20 74 65 73 74 73 20  s used by tests 
1c130 74 68 61 74 20 63 68 61 6e 67 65 20 63 6f 6e 66  that change conf
1c140 69 67 75 72 61 74 69 6f 6e 20 6f 70 74 69 6f 6e  iguration option
1c150 73 20 61 6e 64 2f 6f 72 20 74 68 6f 73 65 0d 0a  s and/or those..
1c160 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68        #       th
1c170 61 74 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20  at need to make 
1c180 73 75 72 65 20 6c 6f 67 67 69 6e 67 20 69 73 20  sure logging is 
1c190 69 6e 69 74 69 61 6c 69 7a 65 64 20 28 69 2e 65  initialized (i.e
1c1a0 2e 20 6a 75 73 74 20 69 6e 20 63 61 73 65 0d 0a  . just in case..
1c1b0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68        #       th
1c1c0 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20 6c 69  e SQLite core li
1c1d0 62 72 61 72 79 20 77 61 73 20 69 6e 69 74 69 61  brary was initia
1c1e0 6c 69 7a 65 64 20 69 6e 20 74 68 65 20 70 72 6f  lized in the pro
1c1f0 63 65 73 73 20 70 72 69 6f 72 20 74 6f 0d 0a 20  cess prior to.. 
1c200 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
1c210 20 53 51 4c 69 74 65 4c 6f 67 20 63 6c 61 73 73   SQLiteLog class
1c220 20 62 65 69 6e 67 20 61 62 6c 65 20 74 6f 20 73   being able to s
1c230 65 74 75 70 20 69 74 73 20 6c 6f 67 67 69 6e 67  etup its logging
1c240 20 63 61 6c 6c 62 61 63 6b 29 2e 0d 0a 20 20 20   callback)...   
1c250 20 20 20 23 20 20 20 20 20 20 20 4e 6f 72 6d 61     #       Norma
1c260 6c 6c 79 2c 20 74 68 69 73 20 73 68 6f 75 6c 64  lly, this should
1c270 20 6f 6e 6c 79 20 62 65 20 70 65 72 66 6f 72 6d   only be perform
1c280 65 64 20 69 66 20 53 51 4c 69 74 65 20 69 73 20  ed if SQLite is 
1c290 6c 6f 61 64 65 64 20 61 6e 64 0d 0a 20 20 20 20  loaded and..    
1c2a0 20 20 23 20 20 20 20 20 20 20 72 65 61 64 79 20    #       ready 
1c2b0 66 6f 72 20 75 73 65 20 62 79 20 74 68 65 20 74  for use by the t
1c2c0 65 73 74 20 73 75 69 74 65 2e 0d 0a 20 20 20 20  est suite...    
1c2d0 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 24    #..      if {$
1c2e0 66 6f 72 63 65 20 7c 7c 20 5b 69 73 53 51 4c 69  force || [isSQLi
1c2f0 74 65 52 65 61 64 79 5d 7d 20 74 68 65 6e 20 7b  teReady]} then {
1c300 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1c310 20 20 20 20 20 23 20 42 55 47 46 49 58 3a 20 4d       # BUGFIX: M
1c320 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 61 6e  ake sure that an
1c330 79 20 22 6c 65 61 6b 65 64 22 20 74 72 61 6e 73  y "leaked" trans
1c340 61 63 74 69 6f 6e 73 20 61 6e 64 2f 6f 72 20 63  actions and/or c
1c350 6f 6e 6e 65 63 74 69 6f 6e 73 0d 0a 20 20 20 20  onnections..    
1c360 20 20 20 20 23 20 20 20 20 20 20 20 20 20 61 72      #         ar
1c370 65 20 63 6c 65 61 6e 65 64 20 75 70 20 62 65 66  e cleaned up bef
1c380 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74 68 65 20  ore calling the 
1c390 6e 61 74 69 76 65 20 73 68 75 74 64 6f 77 6e 20  native shutdown 
1c3a0 66 75 6e 63 74 69 6f 6e 2e 0d 0a 20 20 20 20 20  function...     
1c3b0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 66 6f     #..        fo
1c3c0 72 65 61 63 68 20 74 72 61 6e 73 61 63 74 69 6f  reach transactio
1c3d0 6e 20 5b 69 6e 66 6f 20 74 72 61 6e 73 61 63 74  n [info transact
1c3e0 69 6f 6e 73 5d 20 7b 0d 0a 20 20 20 20 20 20 20  ions] {..       
1c3f0 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6d     if {[string m
1c400 61 74 63 68 20 5c 0d 0a 20 20 20 20 20 20 20 20  atch \..        
1c410 20 20 20 20 20 20 53 79 73 74 65 6d 23 44 61 74        System#Dat
1c420 61 23 53 51 4c 69 74 65 23 53 51 4c 69 74 65 54  a#SQLite#SQLiteT
1c430 72 61 6e 73 61 63 74 69 6f 6e 23 2a 20 24 74 72  ransaction#* $tr
1c440 61 6e 73 61 63 74 69 6f 6e 5d 7d 20 74 68 65 6e  ansaction]} then
1c450 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1c460 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20  if {[catch {..  
1c470 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 20              sql 
1c480 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c  transaction roll
1c490 62 61 63 6b 20 24 74 72 61 6e 73 61 63 74 69 6f  back $transactio
1c4a0 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  n..            }
1c4b0 20 65 72 72 6f 72 5d 20 3d 3d 20 30 7d 20 74 68   error] == 0} th
1c4c0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
1c4d0 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
1c4e0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1c4f0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
1c500 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
1c510 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
1c520 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
1c530 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 6c 65 61   rolled back lea
1c540 6b 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ked transaction 
1c550 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  \"" \..         
1c560 20 20 20 20 20 20 20 20 20 20 20 24 74 72 61 6e             $tran
1c570 73 61 63 74 69 6f 6e 20 5c 22 5c 6e 5d 0d 0a 20  saction \"\n].. 
1c580 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
1c590 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c              } el
1c5a0 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
1c5b0 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
1c5c0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1c5d0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
1c5e0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
1c5f0 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
1c600 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d             "====
1c610 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64   WARNING: failed
1c620 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 6c 65 61   to rollback lea
1c630 6b 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ked transaction 
1c640 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  \"" \..         
1c650 20 20 20 20 20 20 20 20 20 20 20 24 74 72 61 6e             $tran
1c660 73 61 63 74 69 6f 6e 20 22 5c 22 2c 20 65 72 72  saction "\", err
1c670 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f  or: " \n\t $erro
1c680 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  r \n]..         
1c690 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
1c6a0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
1c6b0 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d   }..        }...
1c6c0 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68  .        foreach
1c6d0 20 64 62 20 5b 69 6e 66 6f 20 63 6f 6e 6e 65 63   db [info connec
1c6e0 74 69 6f 6e 73 5d 20 7b 0d 0a 20 20 20 20 20 20  tions] {..      
1c6f0 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
1c700 6d 61 74 63 68 20 5c 0d 0a 20 20 20 20 20 20 20  match \..       
1c710 20 20 20 20 20 20 20 53 79 73 74 65 6d 23 44 61         System#Da
1c720 74 61 23 53 51 4c 69 74 65 23 53 51 4c 69 74 65  ta#SQLite#SQLite
1c730 43 6f 6e 6e 65 63 74 69 6f 6e 23 2a 20 24 64 62  Connection#* $db
1c740 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
1c750 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
1c760 68 20 7b 73 71 6c 20 63 6c 6f 73 65 20 24 64 62  h {sql close $db
1c770 7d 20 65 72 72 6f 72 5d 20 3d 3d 20 30 7d 20 74  } error] == 0} t
1c780 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1c790 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
1c7a0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1c7b0 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
1c7c0 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
1c7d0 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
1c7e0 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
1c7f0 2d 20 63 6c 6f 73 65 64 20 6c 65 61 6b 65 64 20  - closed leaked 
1c800 64 61 74 61 62 61 73 65 20 5c 22 22 20 24 64 62  database \"" $db
1c810 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20   \"\n]..        
1c820 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
1c830 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
1c840 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
1c850 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
1c860 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1c870 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
1c880 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
1c890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c8a0 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e      "==== WARNIN
1c8b0 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 63 6c 6f  G: failed to clo
1c8c0 73 65 20 6c 65 61 6b 65 64 20 64 61 74 61 62 61  se leaked databa
1c8d0 73 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20  se \"" \..      
1c8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24 64                $d
1c8f0 62 20 22 5c 22 2c 20 65 72 72 6f 72 3a 20 22 20  b "\", error: " 
1c900 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d  \n\t $error \n].
1c910 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
1c920 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
1c930 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
1c940 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
1c950 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
1c960 42 55 47 46 49 58 3a 20 42 65 66 6f 72 65 20 63  BUGFIX: Before c
1c970 61 6c 6c 69 6e 67 20 74 68 65 20 6e 61 74 69 76  alling the nativ
1c980 65 20 73 68 75 74 64 6f 77 6e 20 66 75 6e 63 74  e shutdown funct
1c990 69 6f 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 62  ion, make sure b
1c9a0 6f 74 68 0d 0a 20 20 20 20 20 20 20 20 23 20 20  oth..        #  
1c9b0 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 50 52         of the PR
1c9c0 41 47 4d 41 20 72 65 6c 61 74 65 64 20 64 69 72  AGMA related dir
1c9d0 65 63 74 6f 72 79 20 6e 61 6d 65 73 20 61 72 65  ectory names are
1c9e0 20 66 72 65 65 64 2e 0d 0a 20 20 20 20 20 20 20   freed...       
1c9f0 20 23 0d 0a 20 20 20 20 20 20 20 20 63 68 65 63   #..        chec
1ca00 6b 46 6f 72 53 51 4c 69 74 65 44 69 72 65 63 74  kForSQLiteDirect
1ca10 6f 72 69 65 73 20 24 63 68 61 6e 6e 65 6c 20 74  ories $channel t
1ca20 72 75 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69  rue....        i
1ca30 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  f {[catch {..   
1ca40 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e         object in
1ca50 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e  voke -flags +Non
1ca60 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20  Public \..      
1ca70 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44          System.D
1ca80 61 74 61 2e 53 51 4c 69 74 65 2e 55 6e 73 61 66  ata.SQLite.Unsaf
1ca90 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 20 73  eNativeMethods s
1caa0 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 0d  qlite3_shutdown.
1cab0 0a 20 20 20 20 20 20 20 20 7d 20 72 65 73 75 6c  .        } resul
1cac0 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  t] == 0} then {.
1cad0 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21  .          if {!
1cae0 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
1caf0 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
1cb00 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
1cb10 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
1cb20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
1cb30 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f 73 68 75  call sqlite3_shu
1cb40 74 64 6f 77 6e 28 29 2e 2e 2e 20 6f 6b 3a 20 22  tdown()... ok: "
1cb50 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20   $result \n]..  
1cb60 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
1cb70 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
1cb80 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
1cb90 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
1cba0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
1cbb0 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
1cbc0 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
1cbd0 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 61 6c 6c        "---- call
1cbe0 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77   sqlite3_shutdow
1cbf0 6e 28 29 2e 2e 2e 20 65 72 72 6f 72 3a 20 22 20  n()... error: " 
1cc00 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d  \n\t $result \n]
1cc10 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
1cc20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1cc30 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
1cc40 20 70 72 6f 63 20 72 65 70 6f 72 74 53 51 4c 69   proc reportSQLi
1cc50 74 65 52 65 73 6f 75 72 63 65 73 20 7b 0d 0a 20  teResources {.. 
1cc60 20 20 20 20 20 20 20 20 20 20 20 63 68 61 6e 6e             chann
1cc70 65 6c 20 7b 71 75 69 65 74 20 66 61 6c 73 65 7d  el {quiet false}
1cc80 20 7b 72 65 73 65 74 20 74 72 75 65 7d 20 7b 63   {reset true} {c
1cc90 6f 6c 6c 65 63 74 20 74 72 75 65 7d 20 7d 20 7b  ollect true} } {
1cca0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
1ccb0 20 23 20 4e 4f 54 45 3a 20 49 66 20 61 76 61 69   # NOTE: If avai
1ccc0 6c 61 62 6c 65 2c 20 72 65 70 6f 72 74 20 6f 6e  lable, report on
1ccd0 20 28 61 6e 64 20 70 6f 73 73 69 62 6c 79 20 72   (and possibly r
1cce0 65 73 65 74 29 20 74 68 65 20 72 75 6e 74 69 6d  eset) the runtim
1ccf0 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
1cd00 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 73   configuration s
1cd10 74 61 74 69 73 74 69 63 73 2e 0d 0a 20 20 20 20  tatistics...    
1cd20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
1cd30 68 61 76 65 53 51 4c 69 74 65 4f 62 6a 65 63 74  haveSQLiteObject
1cd40 43 6f 6d 6d 61 6e 64 5d 20 26 26 20 5c 0d 0a 20  Command] && \.. 
1cd50 20 20 20 20 20 20 20 20 20 5b 68 61 76 65 43 6f           [haveCo
1cd60 6e 73 74 72 61 69 6e 74 20 62 75 69 6c 64 43 6f  nstraint buildCo
1cd70 6e 66 69 67 75 72 61 74 69 6f 6e 2e 44 65 62 75  nfiguration.Debu
1cd80 67 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  g]} then {..    
1cd90 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
1cda0 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65  ..          obje
1cdb0 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73  ct invoke -flags
1cdc0 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 2d 61 6c 69   +NonPublic -ali
1cdd0 61 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  as \..          
1cde0 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e      System.Data.
1cdf0 53 51 4c 69 74 65 2e 44 65 62 75 67 44 61 74 61  SQLite.DebugData
1ce00 20 73 65 74 74 69 6e 67 52 65 61 64 43 6f 75 6e   settingReadCoun
1ce10 74 73 0d 0a 20 20 20 20 20 20 20 20 7d 20 73 65  ts..        } se
1ce20 74 74 69 6e 67 52 65 61 64 43 6f 75 6e 74 73 5d  ttingReadCounts]
1ce30 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
1ce40 20 20 20 20 20 20 20 20 20 73 65 74 20 6e 61 6d           set nam
1ce50 65 43 6f 75 6e 74 20 5b 24 73 65 74 74 69 6e 67  eCount [$setting
1ce60 52 65 61 64 43 6f 75 6e 74 73 20 43 6f 75 6e 74  ReadCounts Count
1ce70 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  ]..          set
1ce80 20 76 61 6c 75 65 43 6f 75 6e 74 20 30 0d 0a 0d   valueCount 0...
1ce90 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63  .          objec
1cea0 74 20 66 6f 72 65 61 63 68 20 2d 61 6c 69 61 73  t foreach -alias
1ceb0 20 70 61 69 72 20 24 73 65 74 74 69 6e 67 52 65   pair $settingRe
1cec0 61 64 43 6f 75 6e 74 73 20 7b 0d 0a 20 20 20 20  adCounts {..    
1ced0 20 20 20 20 20 20 20 20 69 6e 63 72 20 76 61 6c          incr val
1cee0 75 65 43 6f 75 6e 74 20 5b 24 70 61 69 72 20 56  ueCount [$pair V
1cef0 61 6c 75 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  alue]....       
1cf00 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
1cf10 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1cf20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
1cf30 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
1cf40 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
1cf50 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 65          "---- se
1cf60 74 74 69 6e 67 20 5c 22 22 20 5b 24 70 61 69 72  tting \"" [$pair
1cf70 20 4b 65 79 5d 20 22 5c 22 20 77 61 73 20 72 65   Key] "\" was re
1cf80 61 64 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20  ad " \..        
1cf90 20 20 20 20 20 20 20 20 20 20 5b 24 70 61 69 72            [$pair
1cfa0 20 56 61 6c 75 65 5d 20 22 20 74 69 6d 65 73 5c   Value] " times\
1cfb0 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n"]..           
1cfc0 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d   }..          }.
1cfd0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  ...          if 
1cfe0 7b 24 72 65 73 65 74 7d 20 74 68 65 6e 20 7b 0d  {$reset} then {.
1cff0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
1d000 7b 5b 63 61 74 63 68 20 7b 24 73 65 74 74 69 6e  {[catch {$settin
1d010 67 52 65 61 64 43 6f 75 6e 74 73 20 43 6c 65 61  gReadCounts Clea
1d020 72 7d 20 65 72 72 6f 72 5d 20 3d 3d 20 30 7d 20  r} error] == 0} 
1d030 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1d040 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
1d050 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
1d060 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
1d070 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
1d080 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
1d090 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
1d0a0 2d 2d 20 72 65 73 65 74 20 73 65 74 74 69 6e 67  -- reset setting
1d0b0 20 73 74 61 74 69 73 74 69 63 73 20 66 6f 72 20   statistics for 
1d0c0 74 68 65 20 70 72 65 76 69 6f 75 73 20 22 20 5c  the previous " \
1d0d0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1d0e0 20 20 20 20 20 20 24 6e 61 6d 65 43 6f 75 6e 74        $nameCount
1d0f0 20 22 20 6e 61 6d 65 73 20 61 6e 64 20 22 20 24   " names and " $
1d100 76 61 6c 75 65 43 6f 75 6e 74 20 22 20 76 61 6c  valueCount " val
1d110 75 65 73 20 72 65 61 64 5c 6e 22 5d 0d 0a 20 20  ues read\n"]..  
1d120 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
1d130 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73             } els
1d140 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e {..           
1d150 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
1d160 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
1d170 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1d180 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47     "==== WARNING
1d190 3a 20 66 61 69 6c 65 64 20 74 6f 20 72 65 73 65  : failed to rese
1d1a0 74 20 73 65 74 74 69 6e 67 20 73 74 61 74 69 73  t setting statis
1d1b0 74 69 63 73 20 66 6f 72 20 22 20 5c 0d 0a 20 20  tics for " \..  
1d1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d1d0 22 74 68 65 20 70 72 65 76 69 6f 75 73 20 22 20  "the previous " 
1d1e0 24 6e 61 6d 65 43 6f 75 6e 74 20 22 20 6e 61 6d  $nameCount " nam
1d1f0 65 73 20 61 6e 64 20 22 20 24 76 61 6c 75 65 43  es and " $valueC
1d200 6f 75 6e 74 20 5c 0d 0a 20 20 20 20 20 20 20 20  ount \..        
1d210 20 20 20 20 20 20 20 20 20 20 22 20 76 61 6c 75            " valu
1d220 65 73 20 72 65 61 64 2c 20 65 72 72 6f 72 3a 20  es read, error: 
1d230 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e  " \n\t $error \n
1d240 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ]..            }
1d250 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
1d260 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
1d270 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
1d280 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65  ..          obje
1d290 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73  ct invoke -flags
1d2a0 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 2d 61 6c 69   +NonPublic -ali
1d2b0 61 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  as \..          
1d2c0 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e      System.Data.
1d2d0 53 51 4c 69 74 65 2e 44 65 62 75 67 44 61 74 61  SQLite.DebugData
1d2e0 20 73 65 74 74 69 6e 67 46 69 6c 65 52 65 61 64   settingFileRead
1d2f0 43 6f 75 6e 74 73 0d 0a 20 20 20 20 20 20 20 20  Counts..        
1d300 7d 20 73 65 74 74 69 6e 67 46 69 6c 65 52 65 61  } settingFileRea
1d310 64 43 6f 75 6e 74 73 5d 20 3d 3d 20 30 7d 20 74  dCounts] == 0} t
1d320 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1d330 20 73 65 74 20 6e 61 6d 65 43 6f 75 6e 74 20 5b   set nameCount [
1d340 24 73 65 74 74 69 6e 67 46 69 6c 65 52 65 61 64  $settingFileRead
1d350 43 6f 75 6e 74 73 20 43 6f 75 6e 74 5d 0d 0a 20  Counts Count].. 
1d360 20 20 20 20 20 20 20 20 20 73 65 74 20 76 61 6c           set val
1d370 75 65 43 6f 75 6e 74 20 30 0d 0a 0d 0a 20 20 20  ueCount 0....   
1d380 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 66 6f         object fo
1d390 72 65 61 63 68 20 2d 61 6c 69 61 73 20 70 61 69  reach -alias pai
1d3a0 72 20 24 73 65 74 74 69 6e 67 46 69 6c 65 52 65  r $settingFileRe
1d3b0 61 64 43 6f 75 6e 74 73 20 7b 0d 0a 20 20 20 20  adCounts {..    
1d3c0 20 20 20 20 20 20 20 20 69 6e 63 72 20 76 61 6c          incr val
1d3d0 75 65 43 6f 75 6e 74 20 5b 24 70 61 69 72 20 56  ueCount [$pair V
1d3e0 61 6c 75 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  alue]....       
1d3f0 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
1d400 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1d410 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
1d420 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
1d430 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
1d440 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 65          "---- se
1d450 74 74 69 6e 67 20 5c 22 22 20 5b 24 70 61 69 72  tting \"" [$pair
1d460 20 4b 65 79 5d 20 22 5c 22 20 77 61 73 20 72 65   Key] "\" was re
1d470 61 64 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20  ad " \..        
1d480 20 20 20 20 20 20 20 20 20 20 5b 24 70 61 69 72            [$pair
1d490 20 56 61 6c 75 65 5d 20 22 20 74 69 6d 65 73 20   Value] " times 
1d4a0 66 72 6f 6d 20 74 68 65 20 63 6f 6e 66 69 67 75  from the configu
1d4b0 72 61 74 69 6f 6e 20 66 69 6c 65 5c 6e 22 5d 0d  ration file\n"].
1d4c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
1d4d0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
1d4e0 20 20 20 20 20 20 20 20 20 69 66 20 7b 24 72 65           if {$re
1d4f0 73 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  set} then {..   
1d500 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61           if {[ca
1d510 74 63 68 20 7b 24 73 65 74 74 69 6e 67 46 69 6c  tch {$settingFil
1d520 65 52 65 61 64 43 6f 75 6e 74 73 20 43 6c 65 61  eReadCounts Clea
1d530 72 7d 20 65 72 72 6f 72 5d 20 3d 3d 20 30 7d 20  r} error] == 0} 
1d540 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1d550 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
1d560 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
1d570 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
1d580 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
1d590 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
1d5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
1d5b0 2d 2d 20 72 65 73 65 74 20 73 65 74 74 69 6e 67  -- reset setting
1d5c0 20 73 74 61 74 69 73 74 69 63 73 20 66 6f 72 20   statistics for 
1d5d0 74 68 65 20 70 72 65 76 69 6f 75 73 20 22 20 5c  the previous " \
1d5e0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1d5f0 20 20 20 20 20 20 24 6e 61 6d 65 43 6f 75 6e 74        $nameCount
1d600 20 22 20 6e 61 6d 65 73 20 61 6e 64 20 22 20 24   " names and " $
1d610 76 61 6c 75 65 43 6f 75 6e 74 20 22 20 76 61 6c  valueCount " val
1d620 75 65 73 20 72 65 61 64 20 22 20 5c 0d 0a 20 20  ues read " \..  
1d630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d640 20 20 22 66 72 6f 6d 20 74 68 65 20 63 6f 6e 66    "from the conf
1d650 69 67 75 72 61 74 69 6f 6e 20 66 69 6c 65 5c 6e  iguration file\n
1d660 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  "]..            
1d670 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
1d680 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
1d690 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
1d6a0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
1d6b0 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
1d6c0 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57           "==== W
1d6d0 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74  ARNING: failed t
1d6e0 6f 20 72 65 73 65 74 20 73 65 74 74 69 6e 67 20  o reset setting 
1d6f0 73 74 61 74 69 73 74 69 63 73 20 66 6f 72 20 22  statistics for "
1d700 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1d710 20 20 20 20 20 20 22 74 68 65 20 70 72 65 76 69        "the previ
1d720 6f 75 73 20 22 20 24 6e 61 6d 65 43 6f 75 6e 74  ous " $nameCount
1d730 20 22 20 6e 61 6d 65 73 20 61 6e 64 20 22 20 24   " names and " $
1d740 76 61 6c 75 65 43 6f 75 6e 74 20 5c 0d 0a 20 20  valueCount \..  
1d750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d760 22 20 76 61 6c 75 65 73 20 72 65 61 64 20 66 72  " values read fr
1d770 6f 6d 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61  om the configura
1d780 74 69 6f 6e 20 66 69 6c 65 2c 20 65 72 72 6f 72  tion file, error
1d790 3a 20 22 20 5c 6e 5c 74 20 5c 0d 0a 20 20 20 20  : " \n\t \..    
1d7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24 65                $e
1d7b0 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  rror \n]..      
1d7c0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
1d7d0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
1d7e0 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
1d7f0 20 20 69 66 20 7b 5b 68 61 76 65 53 51 4c 69 74    if {[haveSQLit
1d800 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d 20  eObjectCommand] 
1d810 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
1d820 5b 68 61 76 65 53 51 4c 69 74 65 44 65 66 69 6e  [haveSQLiteDefin
1d830 65 43 6f 6e 73 74 61 6e 74 20 49 4e 54 45 52 4f  eConstant INTERO
1d840 50 5f 56 49 52 54 55 41 4c 5f 54 41 42 4c 45 5d  P_VIRTUAL_TABLE]
1d850 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
1d860 20 5b 68 61 76 65 53 51 4c 69 74 65 44 65 66 69   [haveSQLiteDefi
1d870 6e 65 43 6f 6e 73 74 61 6e 74 20 54 52 41 43 4b  neConstant TRACK
1d880 5f 4d 45 4d 4f 52 59 5f 42 59 54 45 53 5d 7d 20  _MEMORY_BYTES]} 
1d890 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1d8a0 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
1d8b0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74  n {..          t
1d8c0 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d  puts $channel "-
1d8d0 2d 2d 2d 20 63 75 72 72 65 6e 74 20 6d 65 6d 6f  --- current memo
1d8e0 72 79 20 69 6e 20 75 73 65 20 62 79 20 53 51 4c  ry in use by SQL
1d8f0 69 74 65 4d 65 6d 6f 72 79 2e 2e 2e 20 22 0d 0a  iteMemory... "..
1d900 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
1d910 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
1d920 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a  {..          obj
1d930 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67  ect invoke -flag
1d940 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a  s +NonPublic \..
1d950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79                Sy
1d960 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
1d970 2e 53 51 4c 69 74 65 4d 65 6d 6f 72 79 20 62 79  .SQLiteMemory by
1d980 74 65 73 41 6c 6c 6f 63 61 74 65 64 0d 0a 20 20  tesAllocated..  
1d990 20 20 20 20 20 20 7d 20 6d 65 6d 6f 72 79 5d 20        } memory] 
1d9a0 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
1d9b0 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
1d9c0 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
1d9d0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
1d9e0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
1d9f0 72 67 73 20 24 6d 65 6d 6f 72 79 20 22 20 62 79  rgs $memory " by
1da00 74 65 73 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20  tes\n"]..       
1da10 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20     }..        } 
1da20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
1da30 20 20 73 65 74 20 6d 65 6d 6f 72 79 20 75 6e 6b    set memory unk
1da40 6e 6f 77 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20  nown....        
1da50 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
1da60 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1da70 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
1da80 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d  l [appendArgs $m
1da90 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20 20 20  emory \n]..     
1daa0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
1dab0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20  }....        if 
1dac0 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
1dad0 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74  ..          tput
1dae0 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d  s $channel "----
1daf0 20 6d 61 78 69 6d 75 6d 20 6d 65 6d 6f 72 79 20   maximum memory 
1db00 69 6e 20 75 73 65 20 62 79 20 53 51 4c 69 74 65  in use by SQLite
1db10 4d 65 6d 6f 72 79 2e 2e 2e 20 22 0d 0a 20 20 20  Memory... "..   
1db20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
1db30 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
1db40 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74            object
1db50 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b   invoke -flags +
1db60 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20  NonPublic \..   
1db70 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65             Syste
1db80 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51  m.Data.SQLite.SQ
1db90 4c 69 74 65 4d 65 6d 6f 72 79 20 6d 61 78 69 6d  LiteMemory maxim
1dba0 75 6d 42 79 74 65 73 41 6c 6c 6f 63 61 74 65 64  umBytesAllocated
1dbb0 0d 0a 20 20 20 20 20 20 20 20 7d 20 6d 65 6d 6f  ..        } memo
1dbc0 72 79 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  ry] == 0} then {
1dbd0 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
1dbe0 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
1dbf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
1dc00 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
1dc10 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20  endArgs $memory 
1dc20 22 20 62 79 74 65 73 5c 6e 22 5d 0d 0a 20 20 20  " bytes\n"]..   
1dc30 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1dc40 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
1dc50 20 20 20 20 20 20 73 65 74 20 6d 65 6d 6f 72 79        set memory
1dc60 20 75 6e 6b 6e 6f 77 6e 0d 0a 0d 0a 20 20 20 20   unknown....    
1dc70 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
1dc80 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
1dc90 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
1dca0 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
1dcb0 73 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20  s $memory \n].. 
1dcc0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
1dcd0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
1dce0 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 24 71 75  ..      if {!$qu
1dcf0 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
1dd00 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
1dd10 6e 65 6c 20 22 2d 2d 2d 2d 20 63 75 72 72 65 6e  nel "---- curren
1dd20 74 20 6d 65 6d 6f 72 79 20 69 6e 20 75 73 65 20  t memory in use 
1dd30 62 79 20 53 51 4c 69 74 65 2e 2e 2e 20 22 0d 0a  by SQLite... "..
1dd40 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
1dd50 20 69 66 20 7b 5b 68 61 76 65 53 51 4c 69 74 65   if {[haveSQLite
1dd60 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20  ObjectCommand]} 
1dd70 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1dd80 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20  if {[catch {..  
1dd90 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69          object i
1dda0 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f  nvoke -flags +No
1ddb0 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20  nPublic \..     
1ddc0 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e           System.
1ddd0 44 61 74 61 2e 53 51 4c 69 74 65 2e 55 6e 73 61  Data.SQLite.Unsa
1dde0 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 20  feNativeMethods 
1ddf0 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 75  sqlite3_memory_u
1de00 73 65 64 0d 0a 20 20 20 20 20 20 20 20 7d 20 6d  sed..        } m
1de10 65 6d 6f 72 79 5d 20 3d 3d 20 30 7d 20 74 68 65  emory] == 0} the
1de20 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69  n {..          i
1de30 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
1de40 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1de50 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
1de60 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f  appendArgs $memo
1de70 72 79 20 22 20 62 79 74 65 73 5c 6e 22 5d 0d 0a  ry " bytes\n"]..
1de80 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
1de90 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
1dea0 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
1deb0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4d 61        # NOTE: Ma
1dec0 79 62 65 20 74 68 65 20 53 51 4c 69 74 65 20 63  ybe the SQLite c
1ded0 6f 72 65 20 6c 69 62 72 61 72 79 20 69 73 20 75  ore library is u
1dee0 6e 61 76 61 69 6c 61 62 6c 65 3f 0d 0a 20 20 20  navailable?..   
1def0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1df00 20 20 20 20 73 65 74 20 6d 65 6d 6f 72 79 20 75      set memory u
1df10 6e 6b 6e 6f 77 6e 0d 0a 0d 0a 20 20 20 20 20 20  nknown....      
1df20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
1df30 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1df40 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
1df50 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
1df60 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20  $memory \n]..   
1df70 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1df80 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73    }..      } els
1df90 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74  e {..        set
1dfa0 20 6d 65 6d 6f 72 79 20 75 6e 61 76 61 69 6c 61   memory unavaila
1dfb0 62 6c 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69  ble....        i
1dfc0 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
1dfd0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70   {..          tp
1dfe0 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
1dff0 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79  pendArgs $memory
1e000 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d   \n]..        }.
1e010 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
1e020 20 20 73 65 74 20 72 65 73 75 6c 74 20 24 6d 65    set result $me
1e030 6d 6f 72 79 3b 20 23 20 4e 4f 54 45 3a 20 52 65  mory; # NOTE: Re
1e040 74 75 72 6e 20 6d 65 6d 6f 72 79 20 69 6e 2d 75  turn memory in-u
1e050 73 65 20 74 6f 20 6f 75 72 20 63 61 6c 6c 65 72  se to our caller
1e060 2e 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 21  .....      if {!
1e070 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
1e080 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
1e090 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 6d 61 78  hannel "---- max
1e0a0 69 6d 75 6d 20 6d 65 6d 6f 72 79 20 69 6e 20 75  imum memory in u
1e0b0 73 65 20 62 79 20 53 51 4c 69 74 65 2e 2e 2e 20  se by SQLite... 
1e0c0 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  "..      }....  
1e0d0 20 20 20 20 69 66 20 7b 5b 68 61 76 65 53 51 4c      if {[haveSQL
1e0e0 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64  iteObjectCommand
1e0f0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
1e100 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d     if {[catch {.
1e110 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63  .          objec
1e120 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20  t invoke -flags 
1e130 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20  +NonPublic \..  
1e140 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74              Syst
1e150 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 55  em.Data.SQLite.U
1e160 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f  nsafeNativeMetho
1e170 64 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ds \..          
1e180 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f      sqlite3_memo
1e190 72 79 5f 68 69 67 68 77 61 74 65 72 20 30 0d 0a  ry_highwater 0..
1e1a0 20 20 20 20 20 20 20 20 7d 20 6d 65 6d 6f 72 79          } memory
1e1b0 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
1e1c0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24            if {!$
1e1d0 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
1e1e0 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
1e1f0 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
1e200 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 22 20  dArgs $memory " 
1e210 62 79 74 65 73 5c 6e 22 5d 0d 0a 20 20 20 20 20  bytes\n"]..     
1e220 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
1e230 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
1e240 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
1e250 20 23 20 4e 4f 54 45 3a 20 4d 61 79 62 65 20 74   # NOTE: Maybe t
1e260 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20 6c  he SQLite core l
1e270 69 62 72 61 72 79 20 69 73 20 75 6e 61 76 61 69  ibrary is unavai
1e280 6c 61 62 6c 65 3f 0d 0a 20 20 20 20 20 20 20 20  lable?..        
1e290 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73    #..          s
1e2a0 65 74 20 6d 65 6d 6f 72 79 20 75 6e 6b 6e 6f 77  et memory unknow
1e2b0 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69  n....          i
1e2c0 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
1e2d0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1e2e0 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
1e2f0 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f  appendArgs $memo
1e300 72 79 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  ry \n]..        
1e310 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
1e320 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
1e330 20 20 20 20 20 20 20 20 73 65 74 20 6d 65 6d 6f          set memo
1e340 72 79 20 75 6e 61 76 61 69 6c 61 62 6c 65 0d 0a  ry unavailable..
1e350 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 24  ..        if {!$
1e360 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
1e370 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
1e380 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
1e390 72 67 73 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d  rgs $memory \n].
1e3a0 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
1e3b0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20    }....      if 
1e3c0 7b 24 63 6f 6c 6c 65 63 74 7d 20 74 68 65 6e 20  {$collect} then 
1e3d0 7b 0d 0a 20 20 20 20 20 20 20 20 63 6f 6c 6c 65  {..        colle
1e3e0 63 74 47 61 72 62 61 67 65 20 24 63 68 61 6e 6e  ctGarbage $chann
1e3f0 65 6c 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  el..      }.... 
1e400 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
1e410 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1e420 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
1e430 20 22 2d 2d 2d 2d 20 63 75 72 72 65 6e 74 20 6d   "---- current m
1e440 65 6d 6f 72 79 20 69 6e 20 75 73 65 20 62 79 20  emory in use by 
1e450 74 68 65 20 43 4c 52 2e 2e 2e 20 22 0d 0a 20 20  the CLR... "..  
1e460 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69      }....      i
1e470 66 20 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f 62  f {[haveSQLiteOb
1e480 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68  jectCommand]} th
1e490 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66  en {..        if
1e4a0 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
1e4b0 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76        object inv
1e4c0 6f 6b 65 20 47 43 20 47 65 74 54 6f 74 61 6c 4d  oke GC GetTotalM
1e4d0 65 6d 6f 72 79 20 66 61 6c 73 65 0d 0a 20 20 20  emory false..   
1e4e0 20 20 20 20 20 7d 20 6d 65 6d 6f 72 79 5d 20 3d       } memory] =
1e4f0 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
1e500 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69         if {[stri
1e510 6e 67 20 69 73 20 69 6e 74 65 67 65 72 20 2d 73  ng is integer -s
1e520 74 72 69 63 74 20 24 6d 65 6d 6f 72 79 5d 7d 20  trict $memory]} 
1e530 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1e540 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
1e550 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1e560 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
1e570 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
1e580 73 20 24 6d 65 6d 6f 72 79 20 22 20 62 79 74 65  s $memory " byte
1e590 73 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20  s\n"]..         
1e5a0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
1e5b0 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
1e5c0 20 20 20 20 20 20 73 65 74 20 6d 65 6d 6f 72 79        set memory
1e5d0 20 69 6e 76 61 6c 69 64 0d 0a 0d 0a 20 20 20 20   invalid....    
1e5e0 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
1e5f0 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
1e600 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
1e610 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
1e620 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 5c 6e  dArgs $memory \n
1e630 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ]..            }
1e640 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
1e650 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
1e660 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20 6d  .          set m
1e670 65 6d 6f 72 79 20 75 6e 6b 6e 6f 77 6e 0d 0a 0d  emory unknown...
1e680 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21  .          if {!
1e690 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
1e6a0 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
1e6b0 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
1e6c0 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 5c  ndArgs $memory \
1e6d0 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  n]..          }.
1e6e0 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
1e6f0 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
1e700 20 20 20 20 73 65 74 20 6d 65 6d 6f 72 79 20 75      set memory u
1e710 6e 61 76 61 69 6c 61 62 6c 65 0d 0a 0d 0a 20 20  navailable....  
1e720 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
1e730 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
1e740 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
1e750 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
1e760 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20  $memory \n]..   
1e770 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
1e780 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ...      return 
1e790 24 72 65 73 75 6c 74 0d 0a 20 20 20 20 7d 0d 0a  $result..    }..
1e7a0 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 68 65 63  ...    proc chec
1e7b0 6b 46 6f 72 53 51 4c 69 74 65 44 69 72 65 63 74  kForSQLiteDirect
1e7c0 6f 72 69 65 73 20 7b 20 63 68 61 6e 6e 65 6c 20  ories { channel 
1e7d0 7b 72 65 73 65 74 20 66 61 6c 73 65 7d 20 7d 20  {reset false} } 
1e7e0 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
1e7f0 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20    # NOTE: Check 
1e800 69 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f 77  if the sqlite3_w
1e810 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f  in32_set_directo
1e820 72 79 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  ry function is a
1e830 76 61 69 6c 61 62 6c 65 2e 0d 0a 20 20 20 20 20  vailable...     
1e840 20 23 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20   #..      tputs 
1e850 24 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20  $channel \..    
1e860 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65 63        "---- chec
1e870 6b 69 6e 67 20 66 6f 72 20 66 75 6e 63 74 69 6f  king for functio
1e880 6e 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  n sqlite3_win32_
1e890 73 65 74 5f 64 69 72 65 63 74 6f 72 79 2e 2e 2e  set_directory...
1e8a0 20 22 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   "....      #.. 
1e8b0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69       # NOTE: Thi
1e8c0 73 20 63 61 6c 6c 20 74 6f 20 74 68 65 20 73 71  s call to the sq
1e8d0 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f  lite3_win32_set_
1e8e0 64 69 72 65 63 74 6f 72 79 20 66 75 6e 63 74 69  directory functi
1e8f0 6f 6e 20 75 73 65 73 20 74 68 65 0d 0a 20 20 20  on uses the..   
1e900 20 20 20 23 20 20 20 20 20 20 20 69 6e 76 61 6c     #       inval
1e910 69 64 20 76 61 6c 75 65 20 30 20 66 6f 72 20 74  id value 0 for t
1e920 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
1e930 74 2e 20 20 54 68 69 73 20 63 6f 64 65 20 69 73  t.  This code is
1e940 20 64 65 73 69 67 6e 65 64 0d 0a 20 20 20 20 20   designed..     
1e950 20 23 20 20 20 20 20 20 20 74 6f 20 63 68 65 63   #       to chec
1e960 6b 20 69 66 20 63 61 6c 6c 69 6e 67 20 74 68 65  k if calling the
1e970 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 72   function will r
1e980 61 69 73 65 20 61 6e 20 65 78 63 65 70 74 69 6f  aise an exceptio
1e990 6e 20 28 69 2e 65 2e 0d 0a 20 20 20 20 20 20 23  n (i.e...      #
1e9a0 20 20 20 20 20 20 20 74 68 65 20 61 63 74 75 61         the actua
1e9b0 6c 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  l result of the 
1e9c0 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  function does no
1e9d0 74 20 6d 61 74 74 65 72 20 61 73 20 6c 6f 6e 67  t matter as long
1e9e0 20 61 73 20 6e 6f 0d 0a 20 20 20 20 20 20 23 20   as no..      # 
1e9f0 20 20 20 20 20 20 64 69 72 65 63 74 6f 72 79 20        directory 
1ea00 69 73 20 63 68 61 6e 67 65 64 29 2e 0d 0a 20 20  is changed)...  
1ea10 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
1ea20 7b 5b 69 73 57 69 6e 64 6f 77 73 5d 20 26 26 20  {[isWindows] && 
1ea30 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
1ea40 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20    object invoke 
1ea50 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69  -flags +NonPubli
1ea60 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  c \..           
1ea70 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
1ea80 69 74 65 2e 55 6e 73 61 66 65 4e 61 74 69 76 65  ite.UnsafeNative
1ea90 4d 65 74 68 6f 64 73 20 5c 0d 0a 20 20 20 20 20  Methods \..     
1eaa0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 77         sqlite3_w
1eab0 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f  in32_set_directo
1eac0 72 79 20 30 20 6e 75 6c 6c 0d 0a 20 20 20 20 20  ry 0 null..     
1ead0 20 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b   }] == 0} then {
1eae0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1eaf0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 61 6c       # NOTE: Cal
1eb00 6c 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33  ling the sqlite3
1eb10 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63  _win32_set_direc
1eb20 74 6f 72 79 20 66 75 6e 63 74 69 6f 6e 20 64 6f  tory function do
1eb30 65 73 20 6e 6f 74 0d 0a 20 20 20 20 20 20 20 20  es not..        
1eb40 23 20 20 20 20 20 20 20 63 61 75 73 65 20 61 6e  #       cause an
1eb50 20 65 78 63 65 70 74 69 6f 6e 3b 20 74 68 65 72   exception; ther
1eb60 65 66 6f 72 65 2c 20 69 74 20 6d 75 73 74 20 62  efore, it must b
1eb70 65 20 61 76 61 69 6c 61 62 6c 65 20 28 69 2e 65  e available (i.e
1eb80 2e 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  ...        #    
1eb90 20 20 20 65 76 65 6e 20 74 68 6f 75 67 68 20 69     even though i
1eba0 74 20 73 68 6f 75 6c 64 20 72 65 74 75 72 6e 20  t should return 
1ebb0 61 20 66 61 69 6c 75 72 65 20 72 65 74 75 72 6e  a failure return
1ebc0 20 63 6f 64 65 20 69 6e 20 74 68 69 73 0d 0a 20   code in this.. 
1ebd0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63         #       c
1ebe0 61 73 65 29 2e 0d 0a 20 20 20 20 20 20 20 20 23  ase)...        #
1ebf0 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e  ..        addCon
1ec00 73 74 72 61 69 6e 74 20 73 71 6c 69 74 65 33 5f  straint sqlite3_
1ec10 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74  win32_set_direct
1ec20 6f 72 79 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74  ory....        t
1ec30 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 79 65  puts $channel ye
1ec40 73 5c 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23  s\n....        #
1ec50 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
1ec60 3a 20 44 6f 65 73 20 6f 75 72 20 63 61 6c 6c 65  : Does our calle
1ec70 72 20 77 61 6e 74 20 74 6f 20 72 65 73 65 74 20  r want to reset 
1ec80 74 68 65 20 64 69 72 65 63 74 6f 72 69 65 73 3f  the directories?
1ec90 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1eca0 20 20 20 20 20 69 66 20 7b 24 72 65 73 65 74 7d       if {$reset}
1ecb0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1ecc0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
1ecd0 23 20 4e 4f 54 45 3a 20 4e 6f 77 20 6d 61 6b 65  # NOTE: Now make
1ece0 20 73 75 72 65 20 74 68 65 20 64 61 74 61 62 61   sure the databa
1ecf0 73 65 20 61 6e 64 20 74 65 6d 70 6f 72 61 72 79  se and temporary
1ed00 20 64 69 72 65 63 74 6f 72 69 65 73 20 61 72 65   directories are
1ed10 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20  ..          #   
1ed20 20 20 20 20 72 65 73 65 74 20 74 68 65 69 72 20      reset their 
1ed30 64 65 66 61 75 6c 74 20 76 61 6c 75 65 73 2c 20  default values, 
1ed40 77 68 69 63 68 20 73 68 6f 75 6c 64 20 62 65 20  which should be 
1ed50 6e 75 6c 6c 20 66 6f 72 20 62 6f 74 68 2e 0d 0a  null for both...
1ed60 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
1ed70 20 20 53 69 6e 63 65 20 74 68 65 20 73 71 6c 69    Since the sqli
1ed80 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69  te3_win32_set_di
1ed90 72 65 63 74 6f 72 79 20 66 75 6e 63 74 69 6f 6e  rectory function
1eda0 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 0d 0a   is available,..
1edb0 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
1edc0 20 20 75 73 65 20 69 74 2e 0d 0a 20 20 20 20 20    use it...     
1edd0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1ede0 20 20 66 6f 72 20 7b 73 65 74 20 69 6e 64 65 78    for {set index
1edf0 20 31 7d 20 7b 24 69 6e 64 65 78 20 3c 20 33 7d   1} {$index < 3}
1ee00 20 7b 69 6e 63 72 20 69 6e 64 65 78 7d 20 7b 0d   {incr index} {.
1ee10 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
1ee20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
1ee30 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20           object 
1ee40 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e  invoke -flags +N
1ee50 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20  onPublic \..    
1ee60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79                Sy
1ee70 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
1ee80 2e 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74  .UnsafeNativeMet
1ee90 68 6f 64 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  hods \..        
1eea0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1eeb0 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65  3_win32_set_dire
1eec0 63 74 6f 72 79 20 24 69 6e 64 65 78 20 6e 75 6c  ctory $index nul
1eed0 6c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  l..            }
1eee0 20 72 65 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74   result] == 0} t
1eef0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1ef00 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
1ef10 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
1ef20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1ef30 20 20 20 20 20 22 2d 2d 2d 2d 20 63 61 6c 6c 20       "---- call 
1ef40 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65  sqlite3_win32_se
1ef50 74 5f 64 69 72 65 63 74 6f 72 79 28 22 20 24 69  t_directory(" $i
1ef60 6e 64 65 78 20 5c 0d 0a 20 20 20 20 20 20 20 20  ndex \..        
1ef70 20 20 20 20 20 20 20 20 20 20 22 2c 20 6e 75 6c            ", nul
1ef80 6c 29 2e 2e 2e 20 6f 6b 3a 20 22 20 24 72 65 73  l)... ok: " $res
1ef90 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ult \n]..       
1efa0 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
1efb0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
1efc0 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
1efd0 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
1efe0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
1eff0 2d 2d 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f  -- call sqlite3_
1f000 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74  win32_set_direct
1f010 6f 72 79 28 22 20 24 69 6e 64 65 78 20 5c 0d 0a  ory(" $index \..
1f020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f030 20 20 22 2c 20 6e 75 6c 6c 29 2e 2e 2e 20 65 72    ", null)... er
1f040 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 72 65 73  ror: " \n\t $res
1f050 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ult \n]..       
1f060 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
1f070 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
1f080 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
1f090 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
1f0a0 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 0d 0a 20  hannel no\n.... 
1f0b0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1f0c0 20 20 23 20 4e 4f 54 45 3a 20 44 6f 65 73 20 6f    # NOTE: Does o
1f0d0 75 72 20 63 61 6c 6c 65 72 20 77 61 6e 74 20 74  ur caller want t
1f0e0 6f 20 72 65 73 65 74 20 74 68 65 20 64 69 72 65  o reset the dire
1f0f0 63 74 6f 72 69 65 73 3f 20 20 54 68 69 73 20 63  ctories?  This c
1f100 61 6e 20 6f 6e 6c 79 0d 0a 20 20 20 20 20 20 20  an only..       
1f110 20 23 20 20 20 20 20 20 20 62 65 20 70 65 72 66   #       be perf
1f120 6f 72 6d 65 64 20 69 66 20 53 51 4c 69 74 65 20  ormed if SQLite 
1f130 69 73 20 6c 6f 61 64 65 64 20 61 6e 64 20 72 65  is loaded and re
1f140 61 64 79 20 66 6f 72 20 75 73 65 20 62 79 20 74  ady for use by t
1f150 68 65 20 74 65 73 74 0d 0a 20 20 20 20 20 20 20  he test..       
1f160 20 23 20 20 20 20 20 20 20 73 75 69 74 65 2e 0d   #       suite..
1f170 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
1f180 20 20 20 20 69 66 20 7b 24 72 65 73 65 74 20 26      if {$reset &
1f190 26 20 5b 69 73 53 51 4c 69 74 65 52 65 61 64 79  & [isSQLiteReady
1f1a0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
1f1b0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1f1c0 20 20 23 20 4e 4f 54 45 3a 20 4e 6f 77 20 6d 61    # NOTE: Now ma
1f1d0 6b 65 20 73 75 72 65 20 74 68 65 20 64 61 74 61  ke sure the data
1f1e0 62 61 73 65 20 61 6e 64 20 74 65 6d 70 6f 72 61  base and tempora
1f1f0 72 79 20 64 69 72 65 63 74 6f 72 69 65 73 20 61  ry directories a
1f200 72 65 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20  re..          # 
1f210 20 20 20 20 20 20 72 65 73 65 74 20 74 68 65 69        reset thei
1f220 72 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 73  r default values
1f230 2c 20 77 68 69 63 68 20 73 68 6f 75 6c 64 20 62  , which should b
1f240 65 20 6e 75 6c 6c 20 66 6f 72 20 62 6f 74 68 2e  e null for both.
1f250 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20  ..          #   
1f260 20 20 20 20 53 69 6e 63 65 20 74 68 65 20 73 71      Since the sq
1f270 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f  lite3_win32_set_
1f280 64 69 72 65 63 74 6f 72 79 20 66 75 6e 63 74 69  directory functi
1f290 6f 6e 20 64 6f 65 73 20 6e 6f 74 0d 0a 20 20 20  on does not..   
1f2a0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61         #       a
1f2b0 70 70 65 61 72 20 74 6f 20 62 65 20 61 76 61 69  ppear to be avai
1f2c0 6c 61 62 6c 65 2c 20 75 73 65 20 74 68 65 20 61  lable, use the a
1f2d0 73 73 6f 63 69 61 74 65 64 20 50 52 41 47 4d 41  ssociated PRAGMA
1f2e0 20 63 6f 6d 6d 61 6e 64 73 0d 0a 20 20 20 20 20   commands..     
1f2f0 20 20 20 20 20 23 20 20 20 20 20 20 20 69 6e 73       #       ins
1f300 74 65 61 64 2e 0d 0a 20 20 20 20 20 20 20 20 20  tead...         
1f310 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 66 6f   #..          fo
1f320 72 65 61 63 68 20 64 69 72 65 63 74 6f 72 79 20  reach directory 
1f330 5b 6c 69 73 74 20 64 61 74 61 5f 73 74 6f 72 65  [list data_store
1f340 5f 64 69 72 65 63 74 6f 72 79 20 74 65 6d 70 5f  _directory temp_
1f350 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 5d  store_directory]
1f360 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1f370 73 65 74 20 73 71 6c 20 5b 61 70 70 65 6e 64 41  set sql [appendA
1f380 72 67 73 20 22 50 52 41 47 4d 41 20 22 20 24 64  rgs "PRAGMA " $d
1f390 69 72 65 63 74 6f 72 79 20 22 20 3d 20 5c 22 5c  irectory " = \"\
1f3a0 22 3b 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ";"]....        
1f3b0 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
1f3c0 65 78 65 63 75 74 65 53 71 6c 20 24 73 71 6c 7d  executeSql $sql}
1f3d0 20 72 65 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74   result] == 0} t
1f3e0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1f3f0 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
1f400 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
1f410 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1f420 20 20 20 20 20 22 2d 2d 2d 2d 20 65 78 65 63 75       "---- execu
1f430 74 65 20 50 52 41 47 4d 41 20 22 20 24 64 69 72  te PRAGMA " $dir
1f440 65 63 74 6f 72 79 20 22 2e 2e 2e 20 6f 6b 3a 20  ectory "... ok: 
1f450 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  \"" \..         
1f460 20 20 20 20 20 20 20 20 20 24 72 65 73 75 6c 74           $result
1f470 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20   \"\n]..        
1f480 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
1f490 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
1f4a0 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
1f4b0 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
1f4c0 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
1f4d0 2d 20 65 78 65 63 75 74 65 20 50 52 41 47 4d 41  - execute PRAGMA
1f4e0 20 22 20 24 64 69 72 65 63 74 6f 72 79 20 22 2e   " $directory ".
1f4f0 2e 2e 20 65 72 72 6f 72 3a 20 22 20 5c 0d 0a 20  .. error: " \.. 
1f500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f510 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e   \n\t $result \n
1f520 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ]..            }
1f530 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
1f540 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1f550 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
1f560 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69 6e 61      # NOTE: Fina
1f570 6c 6c 79 2c 20 73 68 6f 77 20 74 68 65 20 63 75  lly, show the cu
1f580 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 74  rrent value of t
1f590 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  he database and 
1f5a0 74 65 6d 70 6f 72 61 72 79 0d 0a 20 20 20 20 20  temporary..     
1f5b0 20 23 20 20 20 20 20 20 20 64 69 72 65 63 74 6f   #       directo
1f5c0 72 69 65 73 2e 20 20 54 68 69 73 20 63 61 6e 20  ries.  This can 
1f5d0 6f 6e 6c 79 20 62 65 20 70 65 72 66 6f 72 6d 65  only be performe
1f5e0 64 20 69 66 20 53 51 4c 69 74 65 20 69 73 20 6c  d if SQLite is l
1f5f0 6f 61 64 65 64 0d 0a 20 20 20 20 20 20 23 20 20  oaded..      #  
1f600 20 20 20 20 20 61 6e 64 20 72 65 61 64 79 20 66       and ready f
1f610 6f 72 20 75 73 65 20 62 79 20 74 68 65 20 74 65  or use by the te
1f620 73 74 20 73 75 69 74 65 2e 0d 0a 20 20 20 20 20  st suite...     
1f630 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69   #..      if {[i
1f640 73 53 51 4c 69 74 65 52 65 61 64 79 5d 7d 20 74  sSQLiteReady]} t
1f650 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 66  hen {..        f
1f660 6f 72 65 61 63 68 20 64 69 72 65 63 74 6f 72 79  oreach directory
1f670 20 5b 6c 69 73 74 20 64 61 74 61 5f 73 74 6f 72   [list data_stor
1f680 65 5f 64 69 72 65 63 74 6f 72 79 20 74 65 6d 70  e_directory temp
1f690 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79  _store_directory
1f6a0 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74  ] {..          t
1f6b0 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
1f6c0 70 70 65 6e 64 41 72 67 73 20 22 2d 2d 2d 2d 20  ppendArgs "---- 
1f6d0 63 68 65 63 6b 69 6e 67 20 22 20 24 64 69 72 65  checking " $dire
1f6e0 63 74 6f 72 79 20 22 2e 2e 2e 20 22 5d 0d 0a 0d  ctory "... "]...
1f6f0 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20 73  .          set s
1f700 71 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22  ql [appendArgs "
1f710 50 52 41 47 4d 41 20 22 20 24 64 69 72 65 63 74  PRAGMA " $direct
1f720 6f 72 79 20 5c 3b 5d 0d 0a 0d 0a 20 20 20 20 20  ory \;]....     
1f730 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
1f740 7b 65 78 65 63 75 74 65 53 71 6c 20 24 73 71 6c  {executeSql $sql
1f750 20 73 63 61 6c 61 72 7d 20 72 65 73 75 6c 74 5d   scalar} result]
1f760 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
1f770 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
1f780 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
1f790 64 41 72 67 73 20 22 6f 6b 3a 20 5c 22 22 20 24  dArgs "ok: \"" $
1f7a0 72 65 73 75 6c 74 20 5c 22 5c 6e 5d 0d 0a 20 20  result \"\n]..  
1f7b0 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
1f7c0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
1f7d0 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
1f7e0 70 65 6e 64 41 72 67 73 20 22 65 72 72 6f 72 3a  pendArgs "error:
1f7f0 20 22 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20   " \n\t $result 
1f800 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  \n]..          }
1f810 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
1f820 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
1f830 20 20 20 20 70 72 6f 63 20 6c 6f 61 64 53 51 4c      proc loadSQL
1f840 69 74 65 54 65 73 74 53 65 74 74 69 6e 67 73 20  iteTestSettings 
1f850 7b 20 63 68 61 6e 6e 65 6c 20 7b 73 75 66 66 69  { channel {suffi
1f860 78 20 22 22 7d 20 7b 71 75 69 65 74 20 66 61 6c  x ""} {quiet fal
1f870 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23  se} } {..      #
1f880 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
1f890 53 6b 69 70 20 6c 6f 61 64 69 6e 67 20 74 68 65  Skip loading the
1f8a0 20 73 65 74 74 69 6e 67 73 20 69 66 20 74 68 65   settings if the
1f8b0 69 72 20 75 73 61 67 65 20 68 61 73 20 62 65 65  ir usage has bee
1f8c0 6e 20 64 69 73 61 62 6c 65 64 2e 0d 0a 20 20 20  n disabled...   
1f8d0 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
1f8e0 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
1f8f0 6e 6f 28 73 71 6c 69 74 65 54 65 73 74 53 65 74  no(sqliteTestSet
1f900 74 69 6e 67 73 29 5d 7d 20 74 68 65 6e 20 7b 0d  tings)]} then {.
1f910 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
1f920 20 20 20 20 23 20 4e 4f 54 45 3a 20 4c 6f 61 64      # NOTE: Load
1f930 20 63 75 73 74 6f 6d 20 70 65 72 2d 75 73 65 72   custom per-user
1f940 20 61 6e 64 2f 6f 72 20 70 65 72 2d 68 6f 73 74   and/or per-host
1f950 20 74 65 73 74 20 73 65 74 74 69 6e 67 73 20 6e   test settings n
1f960 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ow...        #..
1f970 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66          if {[inf
1f980 6f 20 65 78 69 73 74 73 20 3a 3a 74 63 6c 5f 70  o exists ::tcl_p
1f990 6c 61 74 66 6f 72 6d 28 75 73 65 72 29 5d 7d 20  latform(user)]} 
1f9a0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1f9b0 20 20 73 65 74 20 75 73 65 72 53 65 74 74 69 6e    set userSettin
1f9c0 67 73 46 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65  gsFileName [file
1f9d0 20 6a 6f 69 6e 20 5b 67 65 74 43 6f 6d 6d 6f 6e   join [getCommon
1f9e0 44 69 72 65 63 74 6f 72 79 5d 20 5c 0d 0a 20 20  Directory] \..  
1f9f0 20 20 20 20 20 20 20 20 20 20 20 20 5b 61 70 70              [app
1fa00 65 6e 64 41 72 67 73 20 73 65 74 74 69 6e 67 73  endArgs settings
1fa10 20 24 73 75 66 66 69 78 20 2e 20 24 3a 3a 74 63   $suffix . $::tc
1fa20 6c 5f 70 6c 61 74 66 6f 72 6d 28 75 73 65 72 29  l_platform(user)
1fa30 20 2e 65 61 67 6c 65 5d 5d 0d 0a 0d 0a 20 20 20   .eagle]]....   
1fa40 20 20 20 20 20 20 20 69 66 20 7b 5b 66 69 6c 65         if {[file
1fa50 20 65 78 69 73 74 73 20 24 75 73 65 72 53 65 74   exists $userSet
1fa60 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 5d 7d 20  tingsFileName]} 
1fa70 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1fa80 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
1fa90 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1faa0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
1fab0 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
1fac0 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
1fad0 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6c 6f 61         "---- loa
1fae0 64 69 6e 67 20 70 65 72 2d 75 73 65 72 20 74 65  ding per-user te
1faf0 73 74 20 73 65 74 74 69 6e 67 73 20 66 69 6c 65  st settings file
1fb00 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20   \"" \..        
1fb10 20 20 20 20 20 20 20 20 20 20 24 75 73 65 72 53            $userS
1fb20 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 20  ettingsFileName 
1fb30 5c 22 2e 2e 2e 5c 6e 5d 0d 0a 20 20 20 20 20 20  \"...\n]..      
1fb40 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
1fb50 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
1fb60 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  h {..           
1fb70 20 20 20 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69     uplevel 1 [li
1fb80 73 74 20 73 6f 75 72 63 65 20 24 75 73 65 72 53  st source $userS
1fb90 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 5d  ettingsFileName]
1fba0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20  ..            } 
1fbb0 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a  error]} then {..
1fbc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
1fbd0 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
1fbe0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
1fbf0 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
1fc00 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
1fc10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1fc20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49       "==== WARNI
1fc30 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 6c 6f  NG: failed to lo
1fc40 61 64 20 70 65 72 2d 75 73 65 72 20 73 65 74 74  ad per-user sett
1fc50 69 6e 67 73 20 66 69 6c 65 20 5c 22 22 20 5c 0d  ings file \"" \.
1fc60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1fc70 20 20 20 20 20 24 75 73 65 72 53 65 74 74 69 6e       $userSettin
1fc80 67 73 46 69 6c 65 4e 61 6d 65 20 22 5c 22 2c 20  gsFileName "\", 
1fc90 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65  error: " \n\t $e
1fca0 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  rror \n]..      
1fcb0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
1fcc0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1fcd0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
1fce0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24            if {!$
1fcf0 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
1fd00 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
1fd10 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
1fd20 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
1fd30 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
1fd40 2d 2d 20 73 6b 69 70 70 65 64 20 6c 6f 61 64 69  -- skipped loadi
1fd50 6e 67 20 70 65 72 2d 75 73 65 72 20 74 65 73 74  ng per-user test
1fd60 20 73 65 74 74 69 6e 67 73 20 66 69 6c 65 20 5c   settings file \
1fd70 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  "" \..          
1fd80 20 20 20 20 20 20 20 20 24 75 73 65 72 53 65 74          $userSet
1fd90 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 20 22 5c  tingsFileName "\
1fda0 22 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65  ", it does not e
1fdb0 78 69 73 74 5c 6e 22 5d 0d 0a 20 20 20 20 20 20  xist\n"]..      
1fdc0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
1fdd0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
1fde0 0a 0d 0a 20 20 20 20 20 20 20 20 23 23 23 23 23  ...        #####
1fdf0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1fe00 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1fe10 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1fe20 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1fe30 23 23 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66  ##....        if
1fe40 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
1fe50 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 68 6f  :tcl_platform(ho
1fe60 73 74 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  st)]} then {..  
1fe70 20 20 20 20 20 20 20 20 73 65 74 20 68 6f 73 74          set host
1fe80 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65  SettingsFileName
1fe90 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74   [file join [get
1fea0 43 6f 6d 6d 6f 6e 44 69 72 65 63 74 6f 72 79 5d  CommonDirectory]
1feb0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1fec0 20 20 5b 61 70 70 65 6e 64 41 72 67 73 20 73 65    [appendArgs se
1fed0 74 74 69 6e 67 73 20 24 73 75 66 66 69 78 20 2e  ttings $suffix .
1fee0 20 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d   $::tcl_platform
1fef0 28 68 6f 73 74 29 20 2e 65 61 67 6c 65 5d 5d 0d  (host) .eagle]].
1ff00 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  ...          if 
1ff10 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 68  {[file exists $h
1ff20 6f 73 74 53 65 74 74 69 6e 67 73 46 69 6c 65 4e  ostSettingsFileN
1ff30 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ame]} then {..  
1ff40 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24            if {!$
1ff50 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
1ff60 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
1ff70 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
1ff80 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
1ff90 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
1ffa0 2d 2d 20 6c 6f 61 64 69 6e 67 20 70 65 72 2d 68  -- loading per-h
1ffb0 6f 73 74 20 74 65 73 74 20 73 65 74 74 69 6e 67  ost test setting
1ffc0 73 20 66 69 6c 65 20 5c 22 22 20 5c 0d 0a 20 20  s file \"" \..  
1ffd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ffe0 24 68 6f 73 74 53 65 74 74 69 6e 67 73 46 69 6c  $hostSettingsFil
1fff0 65 4e 61 6d 65 20 5c 22 2e 2e 2e 5c 6e 5d 0d 0a  eName \"...\n]..
20000 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
20010 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
20020 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
20030 20 20 20 20 20 20 20 20 20 75 70 6c 65 76 65 6c           uplevel
20040 20 31 20 5b 6c 69 73 74 20 73 6f 75 72 63 65 20   1 [list source 
20050 24 68 6f 73 74 53 65 74 74 69 6e 67 73 46 69 6c  $hostSettingsFil
20060 65 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20 20 20  eName]..        
20070 20 20 20 20 7d 20 65 72 72 6f 72 5d 7d 20 74 68      } error]} th
20080 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
20090 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
200a0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
200b0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
200c0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
200d0 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
200e0 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d             "====
200f0 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64   WARNING: failed
20100 20 74 6f 20 6c 6f 61 64 20 70 65 72 2d 68 6f 73   to load per-hos
20110 74 20 73 65 74 74 69 6e 67 73 20 66 69 6c 65 20  t settings file 
20120 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  \"" \..         
20130 20 20 20 20 20 20 20 20 20 20 20 24 68 6f 73 74             $host
20140 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65  SettingsFileName
20150 20 22 5c 22 2c 20 65 72 72 6f 72 3a 20 22 20 5c   "\", error: " \
20160 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a  n\t $error \n]..
20170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
20180 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
20190 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
201a0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
201b0 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
201c0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
201d0 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
201e0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
201f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20200 20 20 20 22 2d 2d 2d 2d 20 73 6b 69 70 70 65 64     "---- skipped
20210 20 6c 6f 61 64 69 6e 67 20 70 65 72 2d 68 6f 73   loading per-hos
20220 74 20 74 65 73 74 20 73 65 74 74 69 6e 67 73 20  t test settings 
20230 66 69 6c 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20  file \"" \..    
20240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24 68                $h
20250 6f 73 74 53 65 74 74 69 6e 67 73 46 69 6c 65 4e  ostSettingsFileN
20260 61 6d 65 20 22 5c 22 2c 20 69 74 20 64 6f 65 73  ame "\", it does
20270 20 6e 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a   not exist\n"]..
20280 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
20290 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
202a0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
202b0 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
202c0 6f 63 20 63 6f 70 79 53 61 6d 70 6c 65 44 61 74  oc copySampleDat
202d0 61 62 61 73 65 46 69 6c 65 73 20 7b 7d 20 7b 0d  abaseFiles {} {.
202e0 0a 20 20 20 20 20 20 75 70 6c 65 76 65 6c 20 31  .      uplevel 1
202f0 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
20300 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43         # NOTE: C
20310 6f 70 79 20 28 6f 72 20 72 65 2d 63 6f 70 79 29  opy (or re-copy)
20320 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 64   the reference d
20330 61 74 61 62 61 73 65 20 66 69 6c 65 20 75 73 65  atabase file use
20340 64 20 66 6f 72 20 74 68 69 73 0d 0a 20 20 20 20  d for this..    
20350 20 20 20 20 23 20 20 20 20 20 20 20 75 6e 69 74      #       unit
20360 20 74 65 73 74 20 74 6f 20 74 68 65 20 62 75 69   test to the bui
20370 6c 64 20 64 69 72 65 63 74 6f 72 79 20 69 6e 20  ld directory in 
20380 63 61 73 65 20 69 74 20 68 61 73 20 62 65 65 6e  case it has been
20390 20 63 68 61 6e 67 65 64 0d 0a 20 20 20 20 20 20   changed..      
203a0 20 20 23 20 20 20 20 20 20 20 62 79 20 61 20 70    #       by a p
203b0 72 65 76 69 6f 75 73 20 74 65 73 74 20 72 75 6e  revious test run
203c0 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
203d0 20 20 20 20 20 20 66 69 6c 65 20 63 6f 70 79 20        file copy 
203e0 2d 66 6f 72 63 65 20 24 6e 6f 72 74 68 77 69 6e  -force $northwin
203f0 64 45 66 44 62 46 69 6c 65 20 5c 0d 0a 20 20 20  dEfDbFile \..   
20400 20 20 20 20 20 20 20 5b 66 69 6c 65 20 6a 6f 69         [file joi
20410 6e 20 5b 67 65 74 42 75 69 6c 64 44 69 72 65 63  n [getBuildDirec
20420 74 6f 72 79 20 66 61 6c 73 65 5d 20 5b 66 69 6c  tory false] [fil
20430 65 20 74 61 69 6c 20 24 6e 6f 72 74 68 77 69 6e  e tail $northwin
20440 64 45 66 44 62 46 69 6c 65 5d 5d 0d 0a 20 20 20  dEfDbFile]]..   
20450 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
20460 20 20 20 20 70 72 6f 63 20 72 75 6e 53 51 4c 69      proc runSQLi
20470 74 65 54 65 73 74 50 72 6f 6c 6f 67 75 65 20 7b  teTestPrologue {
20480 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
20490 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70      # NOTE: Skip
204a0 20 72 75 6e 6e 69 6e 67 20 6f 75 72 20 63 75 73   running our cus
204b0 74 6f 6d 20 70 72 6f 6c 6f 67 75 65 20 69 66 20  tom prologue if 
204c0 74 68 65 20 6d 61 69 6e 20 6f 6e 65 20 68 61 73  the main one has
204d0 20 62 65 65 6e 0d 0a 20 20 20 20 20 20 23 20 20   been..      #  
204e0 20 20 20 20 20 73 6b 69 70 70 65 64 2e 0d 0a 20       skipped... 
204f0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
20500 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
20510 3a 3a 6e 6f 28 70 72 6f 6c 6f 67 75 65 2e 65 61  ::no(prologue.ea
20520 67 6c 65 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  gle)]} then {.. 
20530 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
20540 20 20 23 20 4e 4f 54 45 3a 20 4c 6f 61 64 20 74    # NOTE: Load t
20550 68 65 20 22 62 65 66 6f 72 65 2d 63 6f 6e 73 74  he "before-const
20560 72 61 69 6e 74 73 22 20 63 75 73 74 6f 6d 20 70  raints" custom p
20570 65 72 2d 75 73 65 72 20 61 6e 64 2f 6f 72 20 70  er-user and/or p
20580 65 72 2d 68 6f 73 74 0d 0a 20 20 20 20 20 20 20  er-host..       
20590 20 23 20 20 20 20 20 20 20 74 65 73 74 20 73 65   #       test se
205a0 74 74 69 6e 67 73 20 6e 6f 77 2e 0d 0a 20 20 20  ttings now...   
205b0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
205c0 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74 20  uplevel 1 [list 
205d0 6c 6f 61 64 53 51 4c 69 74 65 54 65 73 74 53 65  loadSQLiteTestSe
205e0 74 74 69 6e 67 73 20 24 3a 3a 74 65 73 74 5f 63  ttings $::test_c
205f0 68 61 6e 6e 65 6c 20 2e 62 65 66 6f 72 65 5d 0d  hannel .before].
20600 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
20610 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68        # NOTE: Ch
20620 65 63 6b 20 69 66 20 74 68 65 20 5b 6f 62 6a 65  eck if the [obje
20630 63 74 5d 20 63 6f 6d 6d 61 6e 64 20 69 73 20 61  ct] command is a
20640 76 61 69 6c 61 62 6c 65 3b 20 69 66 20 6e 6f 74  vailable; if not
20650 2c 20 61 64 64 20 73 6f 6d 65 0d 0a 20 20 20 20  , add some..    
20660 20 20 20 20 23 20 20 20 20 20 20 20 73 68 69 6d      #       shim
20670 73 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 74 65  s to make the te
20680 73 74 20 73 75 69 74 65 20 72 75 6e 20 73 6d 6f  st suite run smo
20690 6f 74 68 65 72 2e 0d 0a 20 20 20 20 20 20 20 20  other...        
206a0 23 0d 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b  #..        check
206b0 46 6f 72 53 51 4c 69 74 65 4f 62 6a 65 63 74 43  ForSQLiteObjectC
206c0 6f 6d 6d 61 6e 64 20 24 3a 3a 74 65 73 74 5f 63  ommand $::test_c
206d0 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20 20  hannel....      
206e0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
206f0 4f 54 45 3a 20 44 65 74 65 72 6d 69 6e 65 20 74  OTE: Determine t
20700 68 65 20 6e 61 6d 65 73 20 6f 66 20 74 68 65 20  he names of the 
20710 6e 61 74 69 76 65 20 70 6c 61 74 66 6f 72 6d 20  native platform 
20720 61 6e 64 20 61 72 63 68 69 74 65 63 74 75 72 65  and architecture
20730 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
20740 20 20 20 20 20 20 73 65 74 20 70 6c 61 74 66 6f        set platfo
20750 72 6d 20 5b 67 65 74 42 75 69 6c 64 50 6c 61 74  rm [getBuildPlat
20760 66 6f 72 6d 20 74 72 75 65 5d 0d 0a 20 20 20 20  form true]..    
20770 20 20 20 20 73 65 74 20 61 72 63 68 69 74 65 63      set architec
20780 74 75 72 65 20 5b 61 72 63 68 69 74 65 63 74 75  ture [architectu
20790 72 65 46 6f 72 50 6c 61 74 66 6f 72 6d 20 24 70  reForPlatform $p
207a0 6c 61 74 66 6f 72 6d 5d 0d 0a 0d 0a 20 20 20 20  latform]....    
207b0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
207c0 20 4e 4f 54 45 3a 20 53 68 6f 77 20 74 68 65 20   NOTE: Show the 
207d0 70 6c 61 74 66 6f 72 6d 20 61 6e 64 20 61 72 63  platform and arc
207e0 68 69 74 65 63 74 75 72 65 20 75 73 65 64 20 74  hitecture used t
207f0 6f 20 68 65 6c 70 20 6c 6f 63 61 74 65 20 74 68  o help locate th
20800 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
20810 20 20 20 6e 61 74 69 76 65 20 62 75 69 6c 64 20     native build 
20820 66 69 6c 65 73 2e 0d 0a 20 20 20 20 20 20 20 20  files...        
20830 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  #..        tputs
20840 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
20850 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
20860 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
20870 2d 20 70 6c 61 74 66 6f 72 6d 20 66 6f 72 20 6c  - platform for l
20880 6f 63 61 74 69 6e 67 20 6e 61 74 69 76 65 20 62  ocating native b
20890 75 69 6c 64 20 66 69 6c 65 73 20 69 73 20 5c 22  uild files is \"
208a0 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
208b0 20 24 70 6c 61 74 66 6f 72 6d 20 5c 22 5c 6e 5d   $platform \"\n]
208c0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74  ....        tput
208d0 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
208e0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
208f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d  .            "--
20900 2d 2d 20 61 72 63 68 69 74 65 63 74 75 72 65 20  -- architecture 
20910 66 6f 72 20 6c 6f 63 61 74 69 6e 67 20 6e 61 74  for locating nat
20920 69 76 65 20 62 75 69 6c 64 20 66 69 6c 65 73 20  ive build files 
20930 69 73 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20  is \"" \..      
20940 20 20 20 20 20 20 24 61 72 63 68 69 74 65 63 74        $architect
20950 75 72 65 20 5c 22 5c 6e 5d 0d 0a 0d 0a 20 20 20  ure \"\n]....   
20960 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
20970 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20 61 20  # NOTE: Build a 
20980 6c 69 73 74 20 6f 66 20 63 6f 6e 66 69 67 75 72  list of configur
20990 61 74 69 6f 6e 20 66 69 6c 65 73 20 74 68 61 74  ation files that
209a0 20 77 65 20 68 61 6e 64 6c 65 2e 0d 0a 20 20 20   we handle...   
209b0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
209c0 73 65 74 20 63 6f 6e 66 69 67 46 69 6c 65 4e 61  set configFileNa
209d0 6d 65 73 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20  mes [list \..   
209e0 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e           System.
209f0 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 2e  Data.SQLite.dll.
20a00 63 6f 6e 66 69 67 5d 0d 0a 0d 0a 20 20 20 20 20  config]....     
20a10 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
20a20 4e 4f 54 45 3a 20 42 75 69 6c 64 20 61 20 6c 69  NOTE: Build a li
20a30 73 74 20 6f 66 20 61 75 78 69 6c 69 61 72 79 20  st of auxiliary 
20a40 4d 61 6e 61 67 65 64 20 44 65 62 75 67 67 69 6e  Managed Debuggin
20a50 67 20 41 73 73 69 73 74 61 6e 74 73 20 28 4d 44  g Assistants (MD
20a60 41 29 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  A)..        #   
20a70 20 20 20 20 63 6f 6e 66 69 67 75 72 61 74 69 6f      configuratio
20a80 6e 20 66 69 6c 65 73 20 74 68 61 74 20 77 65 20  n files that we 
20a90 68 61 6e 64 6c 65 2e 0d 0a 20 20 20 20 20 20 20  handle...       
20aa0 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   #..        set 
20ab0 6d 64 61 43 6f 6e 66 69 67 46 69 6c 65 4e 61 6d  mdaConfigFileNam
20ac0 65 73 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20  es [list \..    
20ad0 20 20 20 20 20 20 20 20 45 61 67 6c 65 53 68 65          EagleShe
20ae0 6c 6c 33 32 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e  ll32.exe.mda.con
20af0 66 69 67 20 49 6e 73 74 61 6c 6c 65 72 2e 65 78  fig Installer.ex
20b00 65 2e 6d 64 61 2e 63 6f 6e 66 69 67 20 5c 0d 0a  e.mda.config \..
20b10 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
20b20 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e 66 69 67 20  .exe.mda.config 
20b30 74 65 73 74 6c 69 6e 71 2e 65 78 65 2e 6d 64 61  testlinq.exe.mda
20b40 2e 63 6f 6e 66 69 67 20 5c 0d 0a 20 20 20 20 20  .config \..     
20b50 20 20 20 20 20 20 20 74 65 73 74 65 66 36 2e 65         testef6.e
20b60 78 65 2e 6d 64 61 2e 63 6f 6e 66 69 67 5d 0d 0a  xe.mda.config]..
20b70 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
20b80 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69       # NOTE: Bui
20b90 6c 64 20 74 68 65 20 6c 69 73 74 20 6f 66 20 65  ld the list of e
20ba0 78 74 65 72 6e 61 6c 20 66 69 6c 65 73 20 74 68  xternal files th
20bb0 61 74 20 77 65 20 68 61 6e 64 6c 65 2e 20 20 53  at we handle.  S
20bc0 6f 6d 65 20 6f 66 0d 0a 20 20 20 20 20 20 20 20  ome of..        
20bd0 23 20 20 20 20 20 20 20 74 68 65 73 65 20 66 69  #       these fi
20be0 6c 65 73 20 6d 61 79 20 62 65 20 6e 61 74 69 76  les may be nativ
20bf0 65 20 61 6e 64 2f 6f 72 20 6d 61 6e 61 67 65 64  e and/or managed
20c00 20 61 73 73 65 6d 62 6c 69 65 73 20 74 68 61 74   assemblies that
20c10 20 61 72 65 0d 0a 20 20 20 20 20 20 20 20 23 20   are..        # 
20c20 20 20 20 20 20 20 72 65 71 75 69 72 65 64 20 74        required t
20c30 6f 20 70 65 72 66 6f 72 6d 20 76 61 72 69 6f 75  o perform variou
20c40 73 20 74 65 73 74 73 2e 0d 0a 20 20 20 20 20 20  s tests...      
20c50 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74    #..        set
20c60 20 65 78 74 65 72 6e 61 6c 46 69 6c 65 4e 61 6d   externalFileNam
20c70 65 73 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20  es [list \..    
20c80 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 6a 6f          [file jo
20c90 69 6e 20 45 6e 74 69 74 79 46 72 61 6d 65 77 6f  in EntityFramewo
20ca0 72 6b 20 6c 69 62 20 5b 73 74 72 69 6e 67 20 6d  rk lib [string m
20cb0 61 70 20 5b 6c 69 73 74 20 46 78 20 22 22 5d 20  ap [list Fx ""] 
20cc0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
20cd0 73 74 72 69 6e 67 20 6d 61 70 20 5b 6c 69 73 74  string map [list
20ce0 20 6e 65 74 46 78 34 35 31 20 6e 65 74 46 78 34   netFx451 netFx4
20cf0 35 20 6e 65 74 46 78 34 35 32 20 6e 65 74 46 78  5 netFx452 netFx
20d00 34 35 20 6e 65 74 46 78 34 36 20 5c 0d 0a 20 20  45 netFx46 \..  
20d10 20 20 20 20 20 20 20 20 20 20 6e 65 74 46 78 34            netFx4
20d20 35 20 6e 65 74 46 78 34 36 31 20 6e 65 74 46 78  5 netFx461 netFx
20d30 34 35 20 6e 65 74 46 78 34 36 32 20 6e 65 74 46  45 netFx462 netF
20d40 78 34 35 5d 20 5b 67 65 74 42 75 69 6c 64 4e 65  x45] [getBuildNe
20d50 74 46 78 5d 5d 5d 20 5c 0d 0a 20 20 20 20 20 20  tFx]]] \..      
20d60 20 20 20 20 20 20 45 6e 74 69 74 79 46 72 61 6d        EntityFram
20d70 65 77 6f 72 6b 2e 64 6c 6c 5d 5d 0d 0a 0d 0a 20  ework.dll]].... 
20d80 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
20d90 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20    # NOTE: Build 
20da0 74 68 65 20 6c 69 73 74 20 6f 66 20 6e 61 74 69  the list of nati
20db0 76 65 20 61 73 73 65 6d 62 6c 79 20 66 69 6c 65  ve assembly file
20dc0 73 20 74 68 61 74 20 77 65 20 68 61 6e 64 6c 65  s that we handle
20dd0 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
20de0 20 20 20 20 20 20 73 65 74 20 6e 61 74 69 76 65        set native
20df0 46 69 6c 65 4e 61 6d 65 73 20 5b 6c 69 73 74 5d  FileNames [list]
20e00 0d 0a 0d 0a 20 20 20 20 20 20 20 20 65 76 61 6c  ....        eval
20e10 20 6c 61 70 70 65 6e 64 20 6e 61 74 69 76 65 46   lappend nativeF
20e20 69 6c 65 4e 61 6d 65 73 20 5b 67 65 74 4e 61 74  ileNames [getNat
20e30 69 76 65 4c 69 62 72 61 72 79 46 69 6c 65 4e 61  iveLibraryFileNa
20e40 6d 65 73 4f 6e 6c 79 5d 0d 0a 20 20 20 20 20 20  mesOnly]..      
20e50 20 20 65 76 61 6c 20 6c 61 70 70 65 6e 64 20 6e    eval lappend n
20e60 61 74 69 76 65 46 69 6c 65 4e 61 6d 65 73 20 5b  ativeFileNames [
20e70 67 65 74 49 6e 74 65 72 6f 70 41 73 73 65 6d 62  getInteropAssemb
20e80 6c 79 46 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79 5d  lyFileNamesOnly]
20e90 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
20ea0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42         # NOTE: B
20eb0 75 69 6c 64 20 74 68 65 20 6c 69 73 74 20 6f 66  uild the list of
20ec0 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73 65   mixed-mode asse
20ed0 6d 62 6c 79 20 66 69 6c 65 73 20 74 68 61 74 20  mbly files that 
20ee0 77 65 20 68 61 6e 64 6c 65 2e 0d 0a 20 20 20 20  we handle...    
20ef0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73      #..        s
20f00 65 74 20 6d 69 78 65 64 46 69 6c 65 4e 61 6d 65  et mixedFileName
20f10 73 20 5b 6c 69 73 74 5d 0d 0a 0d 0a 20 20 20 20  s [list]....    
20f20 20 20 20 20 69 66 20 7b 5b 68 61 73 52 75 6e 74      if {[hasRunt
20f30 69 6d 65 4f 70 74 69 6f 6e 20 6e 61 74 69 76 65  imeOption native
20f40 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
20f50 20 20 20 20 20 6c 61 70 70 65 6e 64 20 6d 69 78       lappend mix
20f60 65 64 46 69 6c 65 4e 61 6d 65 73 20 53 79 73 74  edFileNames Syst
20f70 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64  em.Data.SQLite.d
20f80 6c 6c 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  ll..        }...
20f90 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
20fa0 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c      # NOTE: Buil
20fb0 64 20 74 68 65 20 6c 69 73 74 20 6f 66 20 6d 61  d the list of ma
20fc0 6e 61 67 65 64 20 61 73 73 65 6d 62 6c 79 20 66  naged assembly f
20fd0 69 6c 65 73 20 74 68 61 74 20 77 65 20 68 61 6e  iles that we han
20fe0 64 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  dle...        #.
20ff0 0a 20 20 20 20 20 20 20 20 73 65 74 20 6d 61 6e  .        set man
21000 61 67 65 64 46 69 6c 65 4e 61 6d 65 73 20 5b 6c  agedFileNames [l
21010 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ist \..         
21020 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53     System.Data.S
21030 51 4c 69 74 65 2e 4c 69 6e 71 2e 64 6c 6c 20 53  QLite.Linq.dll S
21040 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
21050 65 2e 45 46 36 2e 64 6c 6c 5d 0d 0a 0d 0a 20 20  e.EF6.dll]....  
21060 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61 73 52        if {![hasR
21070 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 6e 61 74  untimeOption nat
21080 69 76 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ive]} then {..  
21090 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20          lappend 
210a0 6d 61 6e 61 67 65 64 46 69 6c 65 4e 61 6d 65 73  managedFileNames
210b0 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
210c0 69 74 65 2e 64 6c 6c 0d 0a 20 20 20 20 20 20 20  ite.dll..       
210d0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d   }....        #.
210e0 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
210f0 20 53 68 6f 77 20 74 68 65 20 76 61 72 69 6f 75   Show the variou
21100 73 20 6c 69 73 74 73 20 6f 66 20 66 69 6c 65 20  s lists of file 
21110 6e 61 6d 65 73 20 74 68 61 74 20 61 72 65 20 68  names that are h
21120 61 6e 64 6c 65 64 20 62 79 20 74 68 69 73 0d 0a  andled by this..
21130 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
21140 70 72 6f 63 65 64 75 72 65 2e 0d 0a 20 20 20 20  procedure...    
21150 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 74      #..        t
21160 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
21170 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
21180 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
21190 22 2d 2d 2d 2d 20 6c 69 73 74 20 6f 66 20 5c 22  "---- list of \"
211a0 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 5c 22 20  configuration\" 
211b0 66 69 6c 65 20 6e 61 6d 65 73 20 69 73 3a 20 22  file names is: "
211c0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
211d0 24 63 6f 6e 66 69 67 46 69 6c 65 4e 61 6d 65 73  $configFileNames
211e0 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20   \n]....        
211f0 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
21200 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
21210 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
21220 20 22 2d 2d 2d 2d 20 6c 69 73 74 20 6f 66 20 5c   "---- list of \
21230 22 4d 44 41 20 63 6f 6e 66 69 67 75 72 61 74 69  "MDA configurati
21240 6f 6e 5c 22 20 66 69 6c 65 20 6e 61 6d 65 73 20  on\" file names 
21250 69 73 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20  is: " \..       
21260 20 20 20 20 20 24 6d 64 61 43 6f 6e 66 69 67 46       $mdaConfigF
21270 69 6c 65 4e 61 6d 65 73 20 5c 6e 5d 0d 0a 0d 0a  ileNames \n]....
21280 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
21290 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
212a0 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
212b0 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6c           "---- l
212c0 69 73 74 20 6f 66 20 5c 22 65 78 74 65 72 6e 61  ist of \"externa
212d0 6c 5c 22 20 66 69 6c 65 20 6e 61 6d 65 73 20 69  l\" file names i
212e0 73 3a 20 22 20 24 65 78 74 65 72 6e 61 6c 46 69  s: " $externalFi
212f0 6c 65 4e 61 6d 65 73 20 5c 6e 5d 0d 0a 0d 0a 20  leNames \n].... 
21300 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
21310 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
21320 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
21330 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6c 69          "---- li
21340 73 74 20 6f 66 20 5c 22 6e 61 74 69 76 65 5c 22  st of \"native\"
21350 20 66 69 6c 65 20 6e 61 6d 65 73 20 69 73 3a 20   file names is: 
21360 22 20 24 6e 61 74 69 76 65 46 69 6c 65 4e 61 6d  " $nativeFileNam
21370 65 73 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20  es \n]....      
21380 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
21390 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
213a0 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
213b0 20 20 20 22 2d 2d 2d 2d 20 6c 69 73 74 20 6f 66     "---- list of
213c0 20 5c 22 6d 69 78 65 64 5c 22 20 66 69 6c 65 20   \"mixed\" file 
213d0 6e 61 6d 65 73 20 69 73 3a 20 22 20 24 6d 69 78  names is: " $mix
213e0 65 64 46 69 6c 65 4e 61 6d 65 73 20 5c 6e 5d 0d  edFileNames \n].
213f0 0a 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  ...        tputs
21400 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
21410 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
21420 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
21430 2d 20 6c 69 73 74 20 6f 66 20 5c 22 6d 61 6e 61  - list of \"mana
21440 67 65 64 5c 22 20 66 69 6c 65 20 6e 61 6d 65 73  ged\" file names
21450 20 69 73 3a 20 22 20 24 6d 61 6e 61 67 65 64 46   is: " $managedF
21460 69 6c 65 4e 61 6d 65 73 20 5c 6e 5d 0d 0a 0d 0a  ileNames \n]....
21470 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
21480 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 6d 6f 76     # NOTE: Remov
21490 65 20 61 6e 79 20 74 65 73 74 20 63 6f 6e 73 74  e any test const
214a0 72 61 69 6e 74 73 20 74 68 61 74 20 72 65 66 65  raints that refe
214b0 72 20 74 6f 20 74 68 65 20 6e 61 74 69 76 65 20  r to the native 
214c0 61 6e 64 2f 6f 72 0d 0a 20 20 20 20 20 20 20 20  and/or..        
214d0 23 20 20 20 20 20 20 20 6d 61 6e 61 67 65 64 20  #       managed 
214e0 61 73 73 65 6d 62 6c 79 20 66 69 6c 65 73 20 74  assembly files t
214f0 68 61 74 20 77 65 20 68 61 6e 64 6c 65 20 75 6e  hat we handle un
21500 6c 65 73 73 20 66 6f 72 62 69 64 64 65 6e 20 66  less forbidden f
21510 72 6f 6d 0d 0a 20 20 20 20 20 20 20 20 23 20 20  rom..        #  
21520 20 20 20 20 20 64 6f 69 6e 67 20 73 6f 2e 0d 0a       doing so...
21530 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
21540 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
21550 69 73 74 73 20 3a 3a 6e 6f 28 73 71 6c 69 74 65  ists ::no(sqlite
21560 52 65 6d 6f 76 65 43 6f 6e 73 74 72 61 69 6e 74  RemoveConstraint
21570 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  s)]} then {..   
21580 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66         foreach f
21590 69 6c 65 4e 61 6d 65 20 24 63 6f 6e 66 69 67 46  ileName $configF
215a0 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20  ileNames {..    
215b0 20 20 20 20 20 20 20 20 72 65 6d 6f 76 65 43 6f          removeCo
215c0 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64  nstraint [append
215d0 41 72 67 73 20 66 69 6c 65 5f 20 24 66 69 6c 65  Args file_ $file
215e0 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20 20 20 20  Name]..         
215f0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
21600 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65  foreach fileName
21610 20 24 6d 64 61 43 6f 6e 66 69 67 46 69 6c 65 4e   $mdaConfigFileN
21620 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20  ames {..        
21630 20 20 20 20 72 65 6d 6f 76 65 43 6f 6e 73 74 72      removeConstr
21640 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
21650 20 66 69 6c 65 5f 20 24 66 69 6c 65 4e 61 6d 65   file_ $fileName
21660 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ]..          }..
21670 0d 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 65  ..          fore
21680 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 65 78  ach fileName $ex
21690 74 65 72 6e 61 6c 46 69 6c 65 4e 61 6d 65 73 20  ternalFileNames 
216a0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  {..            r
216b0 65 6d 6f 76 65 43 6f 6e 73 74 72 61 69 6e 74 20  emoveConstraint 
216c0 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65  [appendArgs file
216d0 5f 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69  _ [file tail $fi
216e0 6c 65 4e 61 6d 65 5d 5d 0d 0a 20 20 20 20 20 20  leName]]..      
216f0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
21700 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e     foreach fileN
21710 61 6d 65 20 24 6e 61 74 69 76 65 46 69 6c 65 4e  ame $nativeFileN
21720 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20  ames {..        
21730 20 20 20 20 72 65 6d 6f 76 65 43 6f 6e 73 74 72      removeConstr
21740 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
21750 20 66 69 6c 65 5f 20 24 66 69 6c 65 4e 61 6d 65   file_ $fileName
21760 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ]..          }..
21770 0d 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 65  ..          fore
21780 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6d 69  ach fileName $mi
21790 78 65 64 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a  xedFileNames {..
217a0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6d 6f              remo
217b0 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70  veConstraint [ap
217c0 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 24  pendArgs file_ $
217d0 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20 20 20  fileName]..     
217e0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
217f0 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65      foreach file
21800 4e 61 6d 65 20 24 6d 61 6e 61 67 65 64 46 69 6c  Name $managedFil
21810 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20  eNames {..      
21820 20 20 20 20 20 20 72 65 6d 6f 76 65 43 6f 6e 73        removeCons
21830 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
21840 67 73 20 66 69 6c 65 5f 20 24 66 69 6c 65 4e 61  gs file_ $fileNa
21850 6d 65 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  me]..          }
21860 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
21870 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
21880 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20 61    # NOTE: Skip a
21890 6c 6c 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  ll System.Data.S
218a0 51 4c 69 74 65 20 72 65 6c 61 74 65 64 20 66 69  QLite related fi
218b0 6c 65 20 68 61 6e 64 6c 69 6e 67 20 28 64 65 6c  le handling (del
218c0 65 74 69 6e 67 2c 0d 0a 20 20 20 20 20 20 20 20  eting,..        
218d0 23 20 20 20 20 20 20 20 63 6f 70 79 69 6e 67 2c  #       copying,
218e0 20 61 6e 64 20 6c 6f 61 64 69 6e 67 29 20 69 66   and loading) if
218f0 20 69 6e 73 74 72 75 63 74 65 64 2e 0d 0a 20 20   instructed...  
21900 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
21910 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
21920 74 73 20 3a 3a 6e 6f 28 73 71 6c 69 74 65 46 69  ts ::no(sqliteFi
21930 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  les)]} then {.. 
21940 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
21950 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b        # NOTE: Sk
21960 69 70 20 74 72 79 69 6e 67 20 74 6f 20 64 65 6c  ip trying to del
21970 65 74 65 20 61 6e 79 20 66 69 6c 65 73 20 69 66  ete any files if
21980 20 69 6e 73 74 72 75 63 74 65 64 2e 0d 0a 20 20   instructed...  
21990 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
219a0 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
219b0 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65  exists ::no(dele
219c0 74 65 53 71 6c 69 74 65 46 69 6c 65 73 29 5d 7d  teSqliteFiles)]}
219d0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
219e0 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
219f0 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65  exists ::no(dele
21a00 74 65 53 71 6c 69 74 65 43 6f 6e 66 69 67 46 69  teSqliteConfigFi
21a10 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  les)]} then {.. 
21a20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
21a30 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 63  each fileName $c
21a40 6f 6e 66 69 67 46 69 6c 65 4e 61 6d 65 73 20 7b  onfigFileNames {
21a50 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
21a60 20 20 74 72 79 44 65 6c 65 74 65 42 69 6e 61 72    tryDeleteBinar
21a70 79 46 69 6c 65 20 24 66 69 6c 65 4e 61 6d 65 0d  yFile $fileName.
21a80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
21a90 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
21aa0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ...            i
21ab0 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
21ac0 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69   ::no(deleteSqli
21ad0 74 65 45 78 74 65 72 6e 61 6c 46 69 6c 65 73 29  teExternalFiles)
21ae0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
21af0 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
21b00 20 66 69 6c 65 4e 61 6d 65 20 24 6d 64 61 43 6f   fileName $mdaCo
21b10 6e 66 69 67 46 69 6c 65 4e 61 6d 65 73 20 7b 0d  nfigFileNames {.
21b20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21b30 20 74 72 79 44 65 6c 65 74 65 42 75 69 6c 64 46   tryDeleteBuildF
21b40 69 6c 65 20 24 66 69 6c 65 4e 61 6d 65 20 66 61  ile $fileName fa
21b50 6c 73 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  lse..           
21b60 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
21b70 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69        foreach fi
21b80 6c 65 4e 61 6d 65 20 24 65 78 74 65 72 6e 61 6c  leName $external
21b90 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20  FileNames {..   
21ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79               try
21bb0 44 65 6c 65 74 65 42 69 6e 61 72 79 46 69 6c 65  DeleteBinaryFile
21bc0 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20   $fileName..    
21bd0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
21be0 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
21bf0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
21c00 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
21c10 28 64 65 6c 65 74 65 53 71 6c 69 74 65 4e 61 74  (deleteSqliteNat
21c20 69 76 65 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e  iveFiles)]} then
21c30 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
21c40 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
21c50 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53  sts ::no(deleteS
21c60 71 6c 69 74 65 49 6d 70 6c 69 63 69 74 4e 61 74  qliteImplicitNat
21c70 69 76 65 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e  iveFiles)]} then
21c80 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
21c90 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65      foreach file
21ca0 4e 61 6d 65 20 24 6e 61 74 69 76 65 46 69 6c 65  Name $nativeFile
21cb0 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20  Names {..       
21cc0 20 20 20 20 20 20 20 20 20 20 20 74 72 79 44 65             tryDe
21cd0 6c 65 74 65 41 73 73 65 6d 62 6c 79 20 24 66 69  leteAssembly $fi
21ce0 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20  leName..        
21cf0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
21d00 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
21d10 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
21d20 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
21d30 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69 74 65 4e  no(deleteSqliteN
21d40 6f 6e 49 6d 70 6c 69 63 69 74 46 69 6c 65 73 29  onImplicitFiles)
21d50 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
21d60 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
21d70 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
21d80 6f 28 64 65 6c 65 74 65 53 71 6c 69 74 65 50 6c  o(deleteSqlitePl
21d90 61 74 66 6f 72 6d 46 69 6c 65 73 29 5d 20 26 26  atformFiles)] &&
21da0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
21db0 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20          [string 
21dc0 6c 65 6e 67 74 68 20 24 70 6c 61 74 66 6f 72 6d  length $platform
21dd0 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
21de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21df0 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d   foreach fileNam
21e00 65 20 24 6e 61 74 69 76 65 46 69 6c 65 4e 61 6d  e $nativeFileNam
21e10 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  es {..          
21e20 20 20 20 20 20 20 20 20 20 20 74 72 79 44 65 6c            tryDel
21e30 65 74 65 41 73 73 65 6d 62 6c 79 20 24 66 69 6c  eteAssembly $fil
21e40 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 0d  eName $platform.
21e50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21e60 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
21e70 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
21e80 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
21e90 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
21ea0 6f 28 64 65 6c 65 74 65 53 71 6c 69 74 65 41 72  o(deleteSqliteAr
21eb0 63 68 69 74 65 63 74 75 72 65 46 69 6c 65 73 29  chitectureFiles)
21ec0 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
21ed0 20 20 20 20 20 20 20 20 20 20 20 20 5b 73 74 72              [str
21ee0 69 6e 67 20 6c 65 6e 67 74 68 20 24 61 72 63 68  ing length $arch
21ef0 69 74 65 63 74 75 72 65 5d 20 3e 20 30 7d 20 74  itecture] > 0} t
21f00 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
21f10 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
21f20 20 66 69 6c 65 4e 61 6d 65 20 24 6e 61 74 69 76   fileName $nativ
21f30 65 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20  eFileNames {..  
21f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21f50 20 20 74 72 79 44 65 6c 65 74 65 41 73 73 65 6d    tryDeleteAssem
21f60 62 6c 79 20 24 66 69 6c 65 4e 61 6d 65 20 24 61  bly $fileName $a
21f70 72 63 68 69 74 65 63 74 75 72 65 0d 0a 20 20 20  rchitecture..   
21f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
21f90 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
21fa0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
21fb0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
21fc0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
21fd0 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
21fe0 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74 65  ists ::no(delete
21ff0 53 71 6c 69 74 65 4d 69 78 65 64 46 69 6c 65 73  SqliteMixedFiles
22000 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
22010 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
22020 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
22030 45 3a 20 49 66 20 74 68 65 20 22 6e 61 74 69 76  E: If the "nativ
22040 65 22 20 72 75 6e 74 69 6d 65 20 6f 70 74 69 6f  e" runtime optio
22050 6e 20 69 73 20 73 65 74 2c 20 64 65 6c 65 74 65  n is set, delete
22060 20 69 6d 70 6c 69 63 69 74 0d 0a 20 20 20 20 20   implicit..     
22070 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
22080 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73 65   mixed-mode asse
22090 6d 62 6c 79 20 66 69 6c 65 73 20 61 73 20 77 65  mbly files as we
220a0 6c 6c 2e 20 20 54 68 69 73 20 72 75 6e 74 69 6d  ll.  This runtim
220b0 65 20 6f 70 74 69 6f 6e 0d 0a 20 20 20 20 20 20  e option..      
220c0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
220d0 63 68 65 63 6b 20 69 73 20 68 61 6e 64 6c 65 64  check is handled
220e0 20 77 68 65 6e 20 62 75 69 6c 64 69 6e 67 20 74   when building t
220f0 68 65 20 6c 69 73 74 20 6f 66 20 6d 69 78 65 64  he list of mixed
22100 2d 6d 6f 64 65 0d 0a 20 20 20 20 20 20 20 20 20  -mode..         
22110 20 20 20 20 20 23 20 20 20 20 20 20 20 61 73 73       #       ass
22120 65 6d 62 6c 79 20 66 69 6c 65 20 6e 61 6d 65 73  embly file names
22130 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
22140 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
22150 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
22160 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53  sts ::no(deleteS
22170 71 6c 69 74 65 49 6d 70 6c 69 63 69 74 4d 69 78  qliteImplicitMix
22180 65 64 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20  edFiles)]} then 
22190 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
221a0 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e     foreach fileN
221b0 61 6d 65 20 24 6d 69 78 65 64 46 69 6c 65 4e 61  ame $mixedFileNa
221c0 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  mes {..         
221d0 20 20 20 20 20 20 20 20 20 74 72 79 44 65 6c 65           tryDele
221e0 74 65 41 73 73 65 6d 62 6c 79 20 24 66 69 6c 65  teAssembly $file
221f0 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20  Name..          
22200 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
22210 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
22220 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
22230 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
22240 28 64 65 6c 65 74 65 53 71 6c 69 74 65 4e 6f 6e  (deleteSqliteNon
22250 49 6d 70 6c 69 63 69 74 46 69 6c 65 73 29 5d 7d  ImplicitFiles)]}
22260 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
22270 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69           if {![i
22280 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
22290 64 65 6c 65 74 65 53 71 6c 69 74 65 50 6c 61 74  deleteSqlitePlat
222a0 66 6f 72 6d 46 69 6c 65 73 29 5d 20 26 26 20 5c  formFiles)] && \
222b0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
222c0 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65        [string le
222d0 6e 67 74 68 20 24 70 6c 61 74 66 6f 72 6d 5d 20  ngth $platform] 
222e0 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
222f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
22300 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20  oreach fileName 
22310 24 6d 69 78 65 64 46 69 6c 65 4e 61 6d 65 73 20  $mixedFileNames 
22320 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
22330 20 20 20 20 20 20 20 74 72 79 44 65 6c 65 74 65         tryDelete
22340 41 73 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61  Assembly $fileNa
22350 6d 65 20 24 70 6c 61 74 66 6f 72 6d 0d 0a 20 20  me $platform..  
22360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22370 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  }..             
22380 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
22390 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
223a0 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64  fo exists ::no(d
223b0 65 6c 65 74 65 53 71 6c 69 74 65 41 72 63 68 69  eleteSqliteArchi
223c0 74 65 63 74 75 72 65 46 69 6c 65 73 29 5d 20 26  tectureFiles)] &
223d0 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  & \..           
223e0 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67           [string
223f0 20 6c 65 6e 67 74 68 20 24 61 72 63 68 69 74 65   length $archite
22400 63 74 75 72 65 5d 20 3e 20 30 7d 20 74 68 65 6e  cture] > 0} then
22410 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
22420 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69        foreach fi
22430 6c 65 4e 61 6d 65 20 24 6d 69 78 65 64 46 69 6c  leName $mixedFil
22440 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20  eNames {..      
22450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72                tr
22460 79 44 65 6c 65 74 65 41 73 73 65 6d 62 6c 79 20  yDeleteAssembly 
22470 24 66 69 6c 65 4e 61 6d 65 20 24 61 72 63 68 69  $fileName $archi
22480 74 65 63 74 75 72 65 0d 0a 20 20 20 20 20 20 20  tecture..       
22490 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
224a0 20 20 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 20 20 20 20 7d  .              }
224c0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
224d0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ...            i
224e0 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
224f0 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69   ::no(deleteSqli
22500 74 65 4d 61 6e 61 67 65 64 46 69 6c 65 73 29 5d  teManagedFiles)]
22510 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
22520 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
22530 66 69 6c 65 4e 61 6d 65 20 24 6d 61 6e 61 67 65  fileName $manage
22540 64 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20  dFileNames {..  
22550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72                tr
22560 79 44 65 6c 65 74 65 41 73 73 65 6d 62 6c 79 20  yDeleteAssembly 
22570 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20  $fileName..     
22580 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
22590 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
225a0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
225b0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
225c0 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 66   # NOTE: Check f
225d0 6f 72 20 74 68 65 20 22 61 75 74 6f 53 65 6c 65  or the "autoSele
225e0 63 74 22 20 72 75 6e 74 69 6d 65 20 6f 70 74 69  ct" runtime opti
225f0 6f 6e 2e 20 20 49 66 20 70 72 65 73 65 6e 74 2c  on.  If present,
22600 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20  ..          #   
22610 20 20 20 20 61 74 74 65 6d 70 74 20 74 6f 20 61      attempt to a
22620 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 73 65 6c  utomatically sel
22630 65 63 74 20 74 68 65 20 66 69 72 73 74 20 61 76  ect the first av
22640 61 69 6c 61 62 6c 65 0d 0a 20 20 20 20 20 20 20  ailable..       
22650 20 20 20 23 20 20 20 20 20 20 20 62 75 69 6c 64     #       build
22660 20 28 6f 72 20 22 72 65 6c 65 61 73 65 22 29 20   (or "release") 
22670 6f 66 20 53 51 4c 69 74 65 20 61 6e 64 20 53 79  of SQLite and Sy
22680 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
22690 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20  ..          #   
226a0 20 20 20 20 66 6f 72 20 75 73 65 20 77 69 74 68      for use with
226b0 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65 2e   the test suite.
226c0 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
226d0 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 68 61           if {[ha
226e0 73 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 61  sRuntimeOption a
226f0 75 74 6f 53 65 6c 65 63 74 5d 7d 20 74 68 65 6e  utoSelect]} then
22700 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
22710 69 66 20 7b 21 5b 63 68 65 63 6b 46 6f 72 53 51  if {![checkForSQ
22720 4c 69 74 65 42 75 69 6c 64 73 20 24 3a 3a 74 65  LiteBuilds $::te
22730 73 74 5f 63 68 61 6e 6e 65 6c 20 74 72 75 65 5d  st_channel true]
22740 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
22750 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72          checkFor
22760 53 51 4c 69 74 65 52 65 6c 65 61 73 65 73 20 24  SQLiteReleases $
22770 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 74  ::test_channel t
22780 72 75 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  rue..           
22790 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d   }..          }.
227a0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
227b0 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
227c0 3a 20 53 6b 69 70 20 74 72 79 69 6e 67 20 74 6f  : Skip trying to
227d0 20 76 65 72 69 66 79 20 74 68 65 20 62 75 69 6c   verify the buil
227e0 64 20 64 69 72 65 63 74 6f 72 79 20 69 66 20 69  d directory if i
227f0 6e 73 74 72 75 63 74 65 64 3b 0d 0a 20 20 20 20  nstructed;..    
22800 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6f 74        #       ot
22810 68 65 72 77 69 73 65 2c 20 6d 61 6b 65 20 73 75  herwise, make su
22820 72 65 20 69 74 20 61 63 74 75 61 6c 6c 79 20 65  re it actually e
22830 78 69 73 74 73 20 6f 72 20 68 61 6c 74 20 74 68  xists or halt th
22840 65 20 65 6e 74 69 72 65 0d 0a 20 20 20 20 20 20  e entire..      
22850 20 20 20 20 23 20 20 20 20 20 20 20 74 65 73 74      #       test
22860 69 6e 67 20 70 72 6f 63 65 73 73 20 69 66 20 69  ing process if i
22870 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  t does not exist
22880 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
22890 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
228a0 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
228b0 28 76 65 72 69 66 79 42 75 69 6c 64 44 69 72 65  (verifyBuildDire
228c0 63 74 6f 72 79 29 5d 7d 20 74 68 65 6e 20 7b 0d  ctory)]} then {.
228d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a  .            #..
228e0 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f              # NO
228f0 54 45 3a 20 41 74 20 74 68 69 73 20 70 6f 69 6e  TE: At this poin
22900 74 2c 20 74 68 65 20 62 75 69 6c 64 20 64 69 72  t, the build dir
22910 65 63 74 6f 72 79 20 4d 55 53 54 20 65 78 69 73  ectory MUST exis
22920 74 20 61 73 20 61 0d 0a 20 20 20 20 20 20 20 20  t as a..        
22930 20 20 20 20 23 20 20 20 20 20 20 20 76 61 6c 69      #       vali
22940 64 20 64 69 72 65 63 74 6f 72 79 20 66 6f 72 20  d directory for 
22950 74 68 65 20 74 65 73 74 69 6e 67 20 70 72 6f 63  the testing proc
22960 65 73 73 20 74 6f 20 63 6f 6e 74 69 6e 75 65 2e  ess to continue.
22970 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d  ..            #.
22980 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74  .            set
22990 20 64 69 72 65 63 74 6f 72 79 20 5b 67 65 74 42   directory [getB
229a0 75 69 6c 64 44 69 72 65 63 74 6f 72 79 20 66 61  uildDirectory fa
229b0 6c 73 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  lse]....        
229c0 20 20 20 20 69 66 20 7b 21 5b 66 69 6c 65 20 65      if {![file e
229d0 78 69 73 74 73 20 24 64 69 72 65 63 74 6f 72 79  xists $directory
229e0 5d 20 7c 7c 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] || \..        
229f0 20 20 20 20 20 20 20 20 21 5b 66 69 6c 65 20 69          ![file i
22a00 73 64 69 72 65 63 74 6f 72 79 20 24 64 69 72 65  sdirectory $dire
22a10 63 74 6f 72 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a  ctory]} then {..
22a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
22a30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
22a40 20 4e 4f 54 45 3a 20 4a 75 73 74 20 70 72 69 6f   NOTE: Just prio
22a50 72 20 74 6f 20 61 63 74 75 61 6c 6c 79 20 68 61  r to actually ha
22a60 6c 74 69 6e 67 20 74 68 65 20 74 65 73 74 69 6e  lting the testin
22a70 67 20 70 72 6f 63 65 73 73 2c 0d 0a 20 20 20 20  g process,..    
22a80 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
22a90 20 20 61 64 64 20 61 6e 20 65 72 72 6f 72 20 74    add an error t
22aa0 6f 20 74 68 65 20 74 65 73 74 20 6c 6f 67 20 66  o the test log f
22ab0 69 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ile...          
22ac0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
22ad0 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
22ae0 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
22af0 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
22b00 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
22b10 2d 20 63 6f 75 6c 64 20 6e 6f 74 20 76 65 72 69  - could not veri
22b20 66 79 20 62 75 69 6c 64 20 64 69 72 65 63 74 6f  fy build directo
22b30 72 79 20 5c 22 22 20 24 64 69 72 65 63 74 6f 72  ry \"" $director
22b40 79 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  y \..           
22b50 20 20 20 20 20 20 20 22 5c 22 2c 20 61 6c 6c 20         "\", all 
22b60 74 65 73 74 69 6e 67 20 68 61 6c 74 65 64 5c 6e  testing halted\n
22b70 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  "]....          
22b80 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
22b90 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 61 69       # NOTE: Rai
22ba0 73 69 6e 67 20 61 20 73 63 72 69 70 74 20 65 72  sing a script er
22bb0 72 6f 72 20 66 72 6f 6d 20 74 68 69 73 20 70 6f  ror from this po
22bc0 69 6e 74 20 73 68 6f 75 6c 64 20 68 61 6c 74 0d  int should halt.
22bd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
22be0 20 20 20 20 20 20 20 74 68 65 20 74 65 73 74 69         the testi
22bf0 6e 67 20 70 72 6f 63 65 73 73 2e 0d 0a 20 20 20  ng process...   
22c00 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
22c10 20 20 20 20 20 20 20 20 20 20 20 20 65 72 72 6f              erro
22c20 72 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  r [appendArgs \.
22c30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22c40 20 20 20 22 63 6f 75 6c 64 20 6e 6f 74 20 76 65     "could not ve
22c50 72 69 66 79 20 62 75 69 6c 64 20 64 69 72 65 63  rify build direc
22c60 74 6f 72 79 20 5c 22 22 20 24 64 69 72 65 63 74  tory \"" $direct
22c70 6f 72 79 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ory \..         
22c80 20 20 20 20 20 20 20 20 20 22 5c 22 2c 20 61 6c           "\", al
22c90 6c 20 74 65 73 74 69 6e 67 20 68 61 6c 74 65 64  l testing halted
22ca0 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  "]..            
22cb0 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  }..          }..
22cc0 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
22cd0 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
22ce0 20 53 6b 69 70 20 74 72 79 69 6e 67 20 74 6f 20   Skip trying to 
22cf0 63 6f 70 79 20 61 6e 79 20 66 69 6c 65 73 20 69  copy any files i
22d00 66 20 69 6e 73 74 72 75 63 74 65 64 2e 0d 0a 20  f instructed... 
22d10 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
22d20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
22d30 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70   exists ::no(cop
22d40 79 53 71 6c 69 74 65 46 69 6c 65 73 29 5d 7d 20  ySqliteFiles)]} 
22d50 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
22d60 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
22d70 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53  xists ::no(copyS
22d80 71 6c 69 74 65 43 6f 6e 66 69 67 46 69 6c 65 73  qliteConfigFiles
22d90 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
22da0 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
22db0 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
22dc0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
22dd0 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 70 79 69       "---- copyi
22de0 6e 67 20 5c 22 63 6f 6e 66 69 67 75 72 61 74 69  ng \"configurati
22df0 6f 6e 5c 22 20 66 69 6c 65 73 2e 2e 2e 5c 6e 22  on\" files...\n"
22e00 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
22e10 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61    foreach fileNa
22e20 6d 65 20 24 63 6f 6e 66 69 67 46 69 6c 65 4e 61  me $configFileNa
22e30 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  mes {..         
22e40 20 20 20 20 20 20 20 74 72 79 43 6f 70 79 42 75         tryCopyBu
22e50 69 6c 64 46 69 6c 65 20 24 66 69 6c 65 4e 61 6d  ildFile $fileNam
22e60 65 20 66 61 6c 73 65 0d 0a 20 20 20 20 20 20 20  e false..       
22e70 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
22e80 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
22e90 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
22ea0 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f  o exists ::no(co
22eb0 70 79 53 71 6c 69 74 65 45 78 74 65 72 6e 61 6c  pySqliteExternal
22ec0 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d  Files)]} then {.
22ed0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
22ee0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
22ef0 23 20 4e 4f 54 45 3a 20 43 6f 70 79 20 74 68 65  # NOTE: Copy the
22f00 20 4d 61 6e 61 67 65 64 20 44 65 62 75 67 67 69   Managed Debuggi
22f10 6e 67 20 41 73 73 69 73 74 61 6e 74 73 20 28 4d  ng Assistants (M
22f20 44 41 29 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  DA) configuratio
22f30 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n..             
22f40 20 23 20 20 20 20 20 20 20 66 69 6c 65 20 66 6f   #       file fo
22f50 72 20 74 68 65 20 45 61 67 6c 65 20 73 68 65 6c  r the Eagle shel
22f60 6c 20 74 6f 20 74 68 65 20 62 75 69 6c 64 20 6f  l to the build o
22f70 75 74 70 75 74 20 64 69 72 65 63 74 6f 72 79 2c  utput directory,
22f80 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
22f90 23 20 20 20 20 20 20 20 77 68 69 6c 65 20 75 73  #       while us
22fa0 69 6e 67 20 65 61 63 68 20 6f 66 20 74 68 65 20  ing each of the 
22fb0 6e 61 6d 65 73 20 6f 66 20 74 68 65 20 76 61 72  names of the var
22fc0 69 6f 75 73 20 6c 65 67 61 63 79 20 74 65 73 74  ious legacy test
22fd0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
22fe0 23 20 20 20 20 20 20 20 65 78 65 63 75 74 61 62  #       executab
22ff0 6c 65 73 2e 20 20 54 68 69 73 20 77 69 6c 6c 20  les.  This will 
23000 68 65 6c 70 20 74 6f 20 6d 61 6b 65 20 73 75 72  help to make sur
23010 65 20 74 68 61 74 20 61 6c 6c 20 74 68 65 0d 0a  e that all the..
23020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
23030 20 20 20 20 20 20 6c 65 67 61 63 79 20 74 65 73        legacy tes
23040 74 73 20 72 75 6e 20 77 69 74 68 20 65 78 61 63  ts run with exac
23050 74 6c 79 20 74 68 65 20 73 61 6d 65 20 73 65 74  tly the same set
23060 20 6f 66 20 4d 61 6e 61 67 65 64 0d 0a 20 20 20   of Managed..   
23070 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20             #    
23080 20 20 20 44 65 62 75 67 67 69 6e 67 20 41 73 73     Debugging Ass
23090 69 73 74 61 6e 74 73 20 63 6f 6e 66 69 67 75 72  istants configur
230a0 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ed...           
230b0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
230c0 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
230d0 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20  t_channel \..   
230e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
230f0 2d 2d 2d 2d 20 63 6f 70 79 69 6e 67 20 5c 22 4d  ---- copying \"M
23100 44 41 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  DA configuration
23110 5c 22 20 66 69 6c 65 73 2e 2e 2e 5c 6e 22 0d 0a  \" files...\n"..
23120 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
23130 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65  foreach fileName
23140 20 24 6d 64 61 43 6f 6e 66 69 67 46 69 6c 65 4e   $mdaConfigFileN
23150 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20  ames {..        
23160 20 20 20 20 20 20 20 20 74 72 79 43 6f 70 79 42          tryCopyB
23170 69 6e 61 72 79 46 69 6c 65 20 45 61 67 6c 65 53  inaryFile EagleS
23180 68 65 6c 6c 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e  hell.exe.mda.con
23190 66 69 67 20 74 72 75 65 20 22 22 20 24 66 69 6c  fig true "" $fil
231a0 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 20  eName..         
231b0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
231c0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
231d0 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
231e0 20 43 6f 70 79 20 74 68 65 20 65 78 74 65 72 6e   Copy the extern
231f0 61 6c 20 62 69 6e 61 72 69 65 73 2c 20 69 66 20  al binaries, if 
23200 61 6e 79 2c 20 74 6f 20 74 68 65 20 64 69 72 65  any, to the dire
23210 63 74 6f 72 79 20 74 68 61 74 0d 0a 20 20 20 20  ctory that..    
23220 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
23230 20 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 45    contains the E
23240 61 67 6c 65 20 73 68 65 6c 6c 2e 20 20 54 68 69  agle shell.  Thi
23250 73 20 69 73 20 74 79 70 69 63 61 6c 6c 79 20 75  s is typically u
23260 73 65 64 20 74 6f 20 6d 61 6b 65 0d 0a 20 20 20  sed to make..   
23270 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20             #    
23280 20 20 20 73 75 72 65 20 61 73 73 65 6d 62 6c 69     sure assembli
23290 65 73 20 72 65 66 65 72 65 6e 63 65 64 20 62 79  es referenced by
232a0 20 74 68 65 20 6f 6e 65 73 20 62 65 69 6e 67 20   the ones being 
232b0 74 65 73 74 65 64 20 61 72 65 0d 0a 20 20 20 20  tested are..    
232c0 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
232d0 20 20 61 76 61 69 6c 61 62 6c 65 20 64 75 72 69    available duri
232e0 6e 67 20 74 68 65 20 74 65 73 74 69 6e 67 20 70  ng the testing p
232f0 72 6f 63 65 73 73 2e 0d 0a 20 20 20 20 20 20 20  rocess...       
23300 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
23310 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
23320 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 22 2d  :test_channel "-
23330 2d 2d 2d 20 63 6f 70 79 69 6e 67 20 5c 22 65 78  --- copying \"ex
23340 74 65 72 6e 61 6c 5c 22 20 66 69 6c 65 73 2e 2e  ternal\" files..
23350 2e 5c 6e 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20  .\n"....        
23360 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69        foreach fi
23370 6c 65 4e 61 6d 65 20 24 65 78 74 65 72 6e 61 6c  leName $external
23380 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20  FileNames {..   
23390 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79               try
233a0 43 6f 70 79 45 78 74 65 72 6e 61 6c 46 69 6c 65  CopyExternalFile
233b0 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20   $fileName..    
233c0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
233d0 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
233e0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
233f0 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
23400 28 63 6f 70 79 53 71 6c 69 74 65 4e 61 74 69 76  (copySqliteNativ
23410 65 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b  eFiles)]} then {
23420 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
23430 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  #..             
23440 20 23 20 4e 4f 54 45 3a 20 49 66 20 74 68 65 20   # NOTE: If the 
23450 74 65 73 74 20 70 6c 61 74 66 6f 72 6d 20 69 73  test platform is
23460 20 6c 69 6b 65 6c 79 20 74 68 65 20 64 65 66 61   likely the defa
23470 75 6c 74 20 66 6f 72 20 74 68 69 73 0d 0a 20 20  ult for this..  
23480 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20              #   
23490 20 20 20 20 6d 61 63 68 69 6e 65 2c 20 61 6c 73      machine, als
234a0 6f 20 74 72 79 20 74 6f 20 63 6f 70 79 20 74 68  o try to copy th
234b0 65 20 6e 61 74 69 76 65 20 66 69 6c 65 73 20 74  e native files t
234c0 6f 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 20  o the..         
234d0 20 20 20 20 20 23 20 20 20 20 20 20 20 62 69 6e       #       bin
234e0 61 72 79 20 6c 6f 63 61 74 69 6f 6e 2e 0d 0a 20  ary location... 
234f0 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a               #..
23500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
23510 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
23520 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65 49  ::no(copySqliteI
23530 6d 70 6c 69 63 69 74 4e 61 74 69 76 65 46 69 6c  mplicitNativeFil
23540 65 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  es)] && \..     
23550 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 69 73               [is
23560 44 65 66 61 75 6c 74 42 75 69 6c 64 50 6c 61 74  DefaultBuildPlat
23570 66 6f 72 6d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  form]} then {.. 
23580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
23590 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
235a0 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20  nnel \..        
235b0 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
235c0 2d 20 63 6f 70 79 69 6e 67 20 69 6d 70 6c 69 63  - copying implic
235d0 69 74 20 5c 22 6e 61 74 69 76 65 5c 22 20 66 69  it \"native\" fi
235e0 6c 65 73 2e 2e 2e 5c 6e 22 0d 0a 0d 0a 20 20 20  les...\n"....   
235f0 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
23600 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6e  each fileName $n
23610 61 74 69 76 65 46 69 6c 65 4e 61 6d 65 73 20 7b  ativeFileNames {
23620 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
23630 20 20 20 20 74 72 79 43 6f 70 79 41 73 73 65 6d      tryCopyAssem
23640 62 6c 79 20 24 66 69 6c 65 4e 61 6d 65 20 66 61  bly $fileName fa
23650 6c 73 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  lse..           
23660 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
23670 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
23680 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69           if {![i
23690 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
236a0 63 6f 70 79 53 71 6c 69 74 65 4e 6f 6e 49 6d 70  copySqliteNonImp
236b0 6c 69 63 69 74 46 69 6c 65 73 29 5d 7d 20 74 68  licitFiles)]} th
236c0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
236d0 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
236e0 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70   exists ::no(cop
236f0 79 53 71 6c 69 74 65 50 6c 61 74 66 6f 72 6d 46  ySqlitePlatformF
23700 69 6c 65 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20  iles)] && \..   
23710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23720 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20   [string length 
23730 24 70 6c 61 74 66 6f 72 6d 5d 20 3e 20 30 7d 20  $platform] > 0} 
23740 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
23750 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
23760 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
23770 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
23780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23790 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 70 79 69       "---- copyi
237a0 6e 67 20 5c 22 6e 61 74 69 76 65 5c 22 20 66 69  ng \"native\" fi
237b0 6c 65 73 20 66 6f 72 20 70 6c 61 74 66 6f 72 6d  les for platform
237c0 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20   \"" \..        
237d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24 70                $p
237e0 6c 61 74 66 6f 72 6d 20 5c 22 2e 2e 2e 5c 6e 5d  latform \"...\n]
237f0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
23800 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69        foreach fi
23810 6c 65 4e 61 6d 65 20 24 6e 61 74 69 76 65 46 69  leName $nativeFi
23820 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20  leNames {..     
23830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
23840 72 79 43 6f 70 79 41 73 73 65 6d 62 6c 79 20 24  ryCopyAssembly $
23850 66 69 6c 65 4e 61 6d 65 20 66 61 6c 73 65 20 24  fileName false $
23860 70 6c 61 74 66 6f 72 6d 0d 0a 20 20 20 20 20 20  platform..      
23870 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
23880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
23890 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
238a0 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
238b0 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53  xists ::no(copyS
238c0 71 6c 69 74 65 41 72 63 68 69 74 65 63 74 75 72  qliteArchitectur
238d0 65 46 69 6c 65 73 29 5d 20 26 26 20 5c 0d 0a 20  eFiles)] && \.. 
238e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
238f0 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74     [string lengt
23900 68 20 24 61 72 63 68 69 74 65 63 74 75 72 65 5d  h $architecture]
23910 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
23920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23930 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
23940 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
23950 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
23960 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
23970 20 63 6f 70 79 69 6e 67 20 5c 22 6e 61 74 69 76   copying \"nativ
23980 65 5c 22 20 66 69 6c 65 73 20 66 6f 72 20 61 72  e\" files for ar
23990 63 68 69 74 65 63 74 75 72 65 20 5c 22 22 20 5c  chitecture \"" \
239a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
239b0 20 20 20 20 20 20 20 20 24 61 72 63 68 69 74 65          $archite
239c0 63 74 75 72 65 20 5c 22 2e 2e 2e 5c 6e 5d 0d 0a  cture \"...\n]..
239d0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
239e0 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65      foreach file
239f0 4e 61 6d 65 20 24 6e 61 74 69 76 65 46 69 6c 65  Name $nativeFile
23a00 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20  Names {..       
23a10 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79               try
23a20 43 6f 70 79 41 73 73 65 6d 62 6c 79 20 24 66 69  CopyAssembly $fi
23a30 6c 65 4e 61 6d 65 20 66 61 6c 73 65 20 24 61 72  leName false $ar
23a40 63 68 69 74 65 63 74 75 72 65 0d 0a 20 20 20 20  chitecture..    
23a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
23a60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23a70 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
23a80 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
23a90 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
23aa0 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
23ab0 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c  sts ::no(copySql
23ac0 69 74 65 4d 69 78 65 64 46 69 6c 65 73 29 5d 7d  iteMixedFiles)]}
23ad0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
23ae0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
23af0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
23b00 49 66 20 74 68 65 20 22 6e 61 74 69 76 65 22 20  If the "native" 
23b10 72 75 6e 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69  runtime option i
23b20 73 20 73 65 74 2c 20 63 6f 70 79 20 69 6d 70 6c  s set, copy impl
23b30 69 63 69 74 0d 0a 20 20 20 20 20 20 20 20 20 20  icit..          
23b40 20 20 20 20 23 20 20 20 20 20 20 20 6d 69 78 65      #       mixe
23b50 64 2d 6d 6f 64 65 20 61 73 73 65 6d 62 6c 79 20  d-mode assembly 
23b60 66 69 6c 65 73 20 61 73 20 77 65 6c 6c 2e 20 20  files as well.  
23b70 54 68 65 20 72 75 6e 74 69 6d 65 20 6f 70 74 69  The runtime opti
23b80 6f 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  on..            
23b90 20 20 23 20 20 20 20 20 20 20 63 68 65 63 6b 20    #       check 
23ba0 69 73 20 68 61 6e 64 6c 65 64 20 77 68 65 6e 20  is handled when 
23bb0 62 75 69 6c 64 69 6e 67 20 74 68 65 20 6c 69 73  building the lis
23bc0 74 20 6f 66 20 6d 69 78 65 64 2d 6d 6f 64 65 0d  t of mixed-mode.
23bd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
23be0 20 20 20 20 20 20 20 61 73 73 65 6d 62 6c 79 20         assembly 
23bf0 66 69 6c 65 20 6e 61 6d 65 73 2e 0d 0a 20 20 20  file names...   
23c00 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
23c10 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
23c20 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
23c30 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65 49 6d 70  no(copySqliteImp
23c40 6c 69 63 69 74 4d 69 78 65 64 46 69 6c 65 73 29  licitMixedFiles)
23c50 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
23c60 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
23c70 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
23c80 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
23c90 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6f          "---- co
23ca0 70 79 69 6e 67 20 69 6d 70 6c 69 63 69 74 20 5c  pying implicit \
23cb0 22 6d 69 78 65 64 5c 22 20 66 69 6c 65 73 2e 2e  "mixed\" files..
23cc0 2e 5c 6e 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20  .\n"....        
23cd0 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
23ce0 66 69 6c 65 4e 61 6d 65 20 24 6d 69 78 65 64 46  fileName $mixedF
23cf0 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20  ileNames {..    
23d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72                tr
23d10 79 43 6f 70 79 41 73 73 65 6d 62 6c 79 20 24 66  yCopyAssembly $f
23d20 69 6c 65 4e 61 6d 65 20 66 61 6c 73 65 0d 0a 20  ileName false.. 
23d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
23d40 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
23d50 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
23d60 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
23d70 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71  ists ::no(copySq
23d80 6c 69 74 65 4e 6f 6e 49 6d 70 6c 69 63 69 74 46  liteNonImplicitF
23d90 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  iles)]} then {..
23da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23db0 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
23dc0 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74  s ::no(copySqlit
23dd0 65 50 6c 61 74 66 6f 72 6d 46 69 6c 65 73 29 5d  ePlatformFiles)]
23de0 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
23df0 20 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69             [stri
23e00 6e 67 20 6c 65 6e 67 74 68 20 24 70 6c 61 74 66  ng length $platf
23e10 6f 72 6d 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  orm] > 0} then {
23e20 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
23e30 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
23e40 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
23e50 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
23e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
23e70 2d 2d 2d 2d 20 63 6f 70 79 69 6e 67 20 5c 22 6d  ---- copying \"m
23e80 69 78 65 64 5c 22 20 66 69 6c 65 73 20 66 6f 72  ixed\" files for
23e90 20 70 6c 61 74 66 6f 72 6d 20 5c 22 22 20 5c 0d   platform \"" \.
23ea0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23eb0 20 20 20 20 20 20 20 24 70 6c 61 74 66 6f 72 6d         $platform
23ec0 20 5c 22 2e 2e 2e 5c 6e 5d 0d 0a 0d 0a 20 20 20   \"...\n]....   
23ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
23ee0 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20  oreach fileName 
23ef0 24 6d 69 78 65 64 46 69 6c 65 4e 61 6d 65 73 20  $mixedFileNames 
23f00 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
23f10 20 20 20 20 20 20 20 74 72 79 43 6f 70 79 41 73         tryCopyAs
23f20 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61 6d 65  sembly $fileName
23f30 20 66 61 6c 73 65 20 24 70 6c 61 74 66 6f 72 6d   false $platform
23f40 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
23f50 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
23f60 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
23f70 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
23f80 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
23f90 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65 41 72 63  no(copySqliteArc
23fa0 68 69 74 65 63 74 75 72 65 46 69 6c 65 73 29 5d  hitectureFiles)]
23fb0 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
23fc0 20 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69             [stri
23fd0 6e 67 20 6c 65 6e 67 74 68 20 24 61 72 63 68 69  ng length $archi
23fe0 74 65 63 74 75 72 65 5d 20 3e 20 30 7d 20 74 68  tecture] > 0} th
23ff0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
24000 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
24010 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
24020 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
24030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24040 20 20 20 22 2d 2d 2d 2d 20 63 6f 70 79 69 6e 67     "---- copying
24050 20 5c 22 6d 69 78 65 64 5c 22 20 66 69 6c 65 73   \"mixed\" files
24060 20 66 6f 72 20 61 72 63 68 69 74 65 63 74 75 72   for architectur
24070 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20  e \"" \..       
24080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24                 $
24090 61 72 63 68 69 74 65 63 74 75 72 65 20 5c 22 2e  architecture \".
240a0 2e 2e 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  ..\n]....       
240b0 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61             forea
240c0 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6d 69 78  ch fileName $mix
240d0 65 64 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20  edFileNames {.. 
240e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
240f0 20 20 20 74 72 79 43 6f 70 79 41 73 73 65 6d 62     tryCopyAssemb
24100 6c 79 20 24 66 69 6c 65 4e 61 6d 65 20 66 61 6c  ly $fileName fal
24110 73 65 20 24 61 72 63 68 69 74 65 63 74 75 72 65  se $architecture
24120 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
24130 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
24140 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
24150 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
24160 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
24170 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
24180 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63  fo exists ::no(c
24190 6f 70 79 53 71 6c 69 74 65 4d 61 6e 61 67 65 64  opySqliteManaged
241a0 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d  Files)]} then {.
241b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  .              t
241c0 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
241d0 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 6f 70 79 69  nnel "---- copyi
241e0 6e 67 20 5c 22 6d 61 6e 61 67 65 64 5c 22 20 66  ng \"managed\" f
241f0 69 6c 65 73 2e 2e 2e 5c 6e 22 0d 0a 0d 0a 20 20  iles...\n"....  
24200 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65              fore
24210 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6d 61  ach fileName $ma
24220 6e 61 67 65 64 46 69 6c 65 4e 61 6d 65 73 20 7b  nagedFileNames {
24230 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
24240 20 20 74 72 79 43 6f 70 79 41 73 73 65 6d 62 6c    tryCopyAssembl
24250 79 20 24 66 69 6c 65 4e 61 6d 65 20 74 72 75 65  y $fileName true
24260 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
24270 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  }..            }
24280 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d  ..          }...
24290 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
242a0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
242b0 53 6b 69 70 20 74 72 79 69 6e 67 20 74 6f 20 6c  Skip trying to l
242c0 6f 61 64 20 61 6e 79 20 66 69 6c 65 73 20 69 66  oad any files if
242d0 20 69 6e 73 74 72 75 63 74 65 64 2e 0d 0a 20 20   instructed...  
242e0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
242f0 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
24300 65 78 69 73 74 73 20 3a 3a 6e 6f 28 6c 6f 61 64  exists ::no(load
24310 53 71 6c 69 74 65 46 69 6c 65 73 29 5d 7d 20 74  SqliteFiles)]} t
24320 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
24330 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
24340 69 73 74 73 20 3a 3a 6e 6f 28 6c 6f 61 64 53 71  ists ::no(loadSq
24350 6c 69 74 65 49 6d 70 6c 69 63 69 74 46 69 6c 65  liteImplicitFile
24360 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  s)]} then {..   
24370 20 20 20 20 20 20 20 20 20 20 20 74 72 79 4c 6f             tryLo
24380 61 64 41 73 73 65 6d 62 6c 79 20 53 79 73 74 65  adAssembly Syste
24390 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c  m.Data.SQLite.dl
243a0 6c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  l..            }
243b0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
243c0 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
243d0 73 20 3a 3a 6e 6f 28 6c 6f 61 64 53 71 6c 69 74  s ::no(loadSqlit
243e0 65 4c 69 6e 71 46 69 6c 65 73 29 5d 7d 20 74 68  eLinqFiles)]} th
243f0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
24400 20 20 20 20 74 72 79 4c 6f 61 64 41 73 73 65 6d      tryLoadAssem
24410 62 6c 79 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  bly System.Data.
24420 53 51 4c 69 74 65 2e 4c 69 6e 71 2e 64 6c 6c 0d  SQLite.Linq.dll.
24430 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
24440 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
24450 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
24460 3a 3a 6e 6f 28 6c 6f 61 64 53 71 6c 69 74 65 45  ::no(loadSqliteE
24470 66 36 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20  f6Files)]} then 
24480 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
24490 20 74 72 79 4c 6f 61 64 41 73 73 65 6d 62 6c 79   tryLoadAssembly
244a0 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
244b0 69 74 65 2e 45 46 36 2e 64 6c 6c 0d 0a 20 20 20  ite.EF6.dll..   
244c0 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
244d0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
244e0 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
244f0 28 6c 6f 61 64 53 71 6c 69 74 65 4e 6f 6e 49 6d  (loadSqliteNonIm
24500 70 6c 69 63 69 74 46 69 6c 65 73 29 5d 7d 20 74  plicitFiles)]} t
24510 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
24520 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
24530 65 78 69 73 74 73 20 3a 3a 6e 6f 28 6c 6f 61 64  exists ::no(load
24540 53 71 6c 69 74 65 50 6c 61 74 66 6f 72 6d 46 69  SqlitePlatformFi
24550 6c 65 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20  les)] && \..    
24560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 73                [s
24570 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 70 6c  tring length $pl
24580 61 74 66 6f 72 6d 5d 20 3e 20 30 7d 20 74 68 65  atform] > 0} the
24590 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
245a0 20 20 20 20 20 74 72 79 4c 6f 61 64 41 73 73 65       tryLoadAsse
245b0 6d 62 6c 79 20 53 79 73 74 65 6d 2e 44 61 74 61  mbly System.Data
245c0 2e 53 51 4c 69 74 65 2e 64 6c 6c 20 24 70 6c 61  .SQLite.dll $pla
245d0 74 66 6f 72 6d 0d 0a 20 20 20 20 20 20 20 20 20  tform..         
245e0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
245f0 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
24600 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 6c  fo exists ::no(l
24610 6f 61 64 53 71 6c 69 74 65 41 72 63 68 69 74 65  oadSqliteArchite
24620 63 74 75 72 65 46 69 6c 65 73 29 5d 20 26 26 20  ctureFiles)] && 
24630 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
24640 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
24650 67 74 68 20 24 61 72 63 68 69 74 65 63 74 75 72  gth $architectur
24660 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  e] > 0} then {..
24670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24680 74 72 79 4c 6f 61 64 41 73 73 65 6d 62 6c 79 20  tryLoadAssembly 
24690 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
246a0 74 65 2e 64 6c 6c 20 24 61 72 63 68 69 74 65 63  te.dll $architec
246b0 74 75 72 65 0d 0a 20 20 20 20 20 20 20 20 20 20  ture..          
246c0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
246d0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
246e0 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  }..        }....
246f0 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
24700 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 24 6e 61  fileNameOnly $na
24710 74 69 76 65 46 69 6c 65 4e 61 6d 65 73 20 7b 0d  tiveFileNames {.
24720 0a 20 20 20 20 20 20 20 20 20 20 63 61 74 63 68  .          catch
24730 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
24740 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
24750 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
24760 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
24770 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20       "---- file 
24780 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22 22 20 24  version of \"" $
24790 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 22 5c 22  fileNameOnly "\"
247a0 2e 2e 2e 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20  ... \"" \..     
247b0 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65             [file
247c0 20 76 65 72 73 69 6f 6e 20 5b 67 65 74 42 69 6e   version [getBin
247d0 61 72 79 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c  aryFileName $fil
247e0 65 4e 61 6d 65 4f 6e 6c 79 5d 5d 20 5c 22 5c 6e  eNameOnly]] \"\n
247f0 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ]..          }..
24800 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
24810 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c       foreach fil
24820 65 4e 61 6d 65 4f 6e 6c 79 20 24 6d 69 78 65 64  eNameOnly $mixed
24830 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20  FileNames {..   
24840 20 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a         catch {..
24850 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
24860 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
24870 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
24880 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
24890 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73   "---- file vers
248a0 69 6f 6e 20 6f 66 20 5c 22 22 20 24 66 69 6c 65  ion of \"" $file
248b0 4e 61 6d 65 4f 6e 6c 79 20 22 5c 22 2e 2e 2e 20  NameOnly "\"... 
248c0 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  \"" \..         
248d0 20 20 20 20 20 20 20 5b 66 69 6c 65 20 76 65 72         [file ver
248e0 73 69 6f 6e 20 5b 67 65 74 42 69 6e 61 72 79 46  sion [getBinaryF
248f0 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d  ileName $fileNam
24900 65 4f 6e 6c 79 5d 5d 20 5c 22 5c 6e 5d 0d 0a 20  eOnly]] \"\n].. 
24910 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
24920 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
24930 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d   foreach fileNam
24940 65 4f 6e 6c 79 20 24 6d 61 6e 61 67 65 64 46 69  eOnly $managedFi
24950 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20  leNames {..     
24960 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20       catch {..  
24970 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
24980 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
24990 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
249a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
249b0 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73 69 6f  ---- file versio
249c0 6e 20 6f 66 20 5c 22 22 20 24 66 69 6c 65 4e 61  n of \"" $fileNa
249d0 6d 65 4f 6e 6c 79 20 22 5c 22 2e 2e 2e 20 5c 22  meOnly "\"... \"
249e0 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
249f0 20 20 20 20 20 5b 66 69 6c 65 20 76 65 72 73 69       [file versi
24a00 6f 6e 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c  on [getBinaryFil
24a10 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 4f  eName $fileNameO
24a20 6e 6c 79 5d 5d 20 5c 22 5c 6e 5d 0d 0a 20 20 20  nly]] \"\n]..   
24a30 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
24a40 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69    }....        i
24a50 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  f {[string lengt
24a60 68 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3e 20 30  h $platform] > 0
24a70 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
24a80 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65      foreach file
24a90 4e 61 6d 65 4f 6e 6c 79 20 24 6e 61 74 69 76 65  NameOnly $native
24aa0 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20  FileNames {..   
24ab0 20 20 20 20 20 20 20 20 20 63 61 74 63 68 20 7b           catch {
24ac0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
24ad0 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
24ae0 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
24af0 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
24b00 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c         "---- fil
24b10 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22 22  e version of \""
24b20 20 24 70 6c 61 74 66 6f 72 6d 20 5c 0d 0a 20 20   $platform \..  
24b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b40 2f 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20  / $fileNameOnly 
24b50 22 5c 22 2e 2e 2e 20 5c 22 22 20 5b 66 69 6c 65  "\"... \"" [file
24b60 20 76 65 72 73 69 6f 6e 20 5c 0d 0a 20 20 20 20   version \..    
24b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 67                [g
24b80 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65  etBinaryFileName
24b90 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 24   $fileNameOnly $
24ba0 70 6c 61 74 66 6f 72 6d 5d 5d 20 5c 22 5c 6e 5d  platform]] \"\n]
24bb0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
24bc0 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  .          }....
24bd0 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63            foreac
24be0 68 20 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 24  h fileNameOnly $
24bf0 6d 69 78 65 64 46 69 6c 65 4e 61 6d 65 73 20 7b  mixedFileNames {
24c00 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 61  ..            ca
24c10 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
24c20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
24c30 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
24c40 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
24c50 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
24c60 2d 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f  - file version o
24c70 66 20 5c 22 22 20 24 70 6c 61 74 66 6f 72 6d 20  f \"" $platform 
24c80 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
24c90 20 20 20 20 20 2f 20 24 66 69 6c 65 4e 61 6d 65       / $fileName
24ca0 4f 6e 6c 79 20 22 5c 22 2e 2e 2e 20 5c 22 22 20  Only "\"... \"" 
24cb0 5b 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 5c 0d  [file version \.
24cc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
24cd0 20 20 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c     [getBinaryFil
24ce0 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 4f  eName $fileNameO
24cf0 6e 6c 79 20 24 70 6c 61 74 66 6f 72 6d 5d 5d 20  nly $platform]] 
24d00 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  \"\n]..         
24d10 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
24d20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  }..        }....
24d30 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72          if {[str
24d40 69 6e 67 20 6c 65 6e 67 74 68 20 24 61 72 63 68  ing length $arch
24d50 69 74 65 63 74 75 72 65 5d 20 3e 20 30 7d 20 74  itecture] > 0} t
24d60 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
24d70 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d   foreach fileNam
24d80 65 4f 6e 6c 79 20 24 6e 61 74 69 76 65 46 69 6c  eOnly $nativeFil
24d90 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20  eNames {..      
24da0 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20        catch {.. 
24db0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
24dc0 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
24dd0 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
24de0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
24df0 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76      "---- file v
24e00 65 72 73 69 6f 6e 20 6f 66 20 5c 22 22 20 24 61  ersion of \"" $a
24e10 72 63 68 69 74 65 63 74 75 72 65 20 5c 0d 0a 20  rchitecture \.. 
24e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e30 20 2f 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79   / $fileNameOnly
24e40 20 22 5c 22 2e 2e 2e 20 5c 22 22 20 5b 66 69 6c   "\"... \"" [fil
24e50 65 20 76 65 72 73 69 6f 6e 20 5c 0d 0a 20 20 20  e version \..   
24e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b                 [
24e70 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d  getBinaryFileNam
24e80 65 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20  e $fileNameOnly 
24e90 24 61 72 63 68 69 74 65 63 74 75 72 65 5d 5d 20  $architecture]] 
24ea0 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  \"\n]..         
24eb0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
24ec0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 66  }....          f
24ed0 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 4f  oreach fileNameO
24ee0 6e 6c 79 20 24 6d 69 78 65 64 46 69 6c 65 4e 61  nly $mixedFileNa
24ef0 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  mes {..         
24f00 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20     catch {..    
24f10 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
24f20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
24f30 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
24f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24f50 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73   "---- file vers
24f60 69 6f 6e 20 6f 66 20 5c 22 22 20 24 61 72 63 68  ion of \"" $arch
24f70 69 74 65 63 74 75 72 65 20 5c 0d 0a 20 20 20 20  itecture \..    
24f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 20                / 
24f90 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 22 5c  $fileNameOnly "\
24fa0 22 2e 2e 2e 20 5c 22 22 20 5b 66 69 6c 65 20 76  "... \"" [file v
24fb0 65 72 73 69 6f 6e 20 5c 0d 0a 20 20 20 20 20 20  ersion \..      
24fc0 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74              [get
24fd0 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 24  BinaryFileName $
24fe0 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 24 61 72  fileNameOnly $ar
24ff0 63 68 69 74 65 63 74 75 72 65 5d 5d 20 5c 22 5c  chitecture]] \"\
25000 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  n]..            
25010 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  }..          }..
25020 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
25030 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
25040 23 20 4e 4f 54 45 3a 20 47 72 61 62 20 74 68 65  # NOTE: Grab the
25050 20 6c 69 73 74 20 6f 66 20 6d 61 6e 61 67 65 64   list of managed
25060 20 61 73 73 65 6d 62 6c 69 65 73 20 66 6f 72 20   assemblies for 
25070 74 68 65 20 63 75 72 72 65 6e 74 20 70 72 6f 63  the current proc
25080 65 73 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ess..        #  
25090 20 20 20 20 20 61 6e 64 20 72 65 70 6f 72 74 20       and report 
250a0 6f 6e 20 74 68 65 20 53 79 73 74 65 6d 2e 44 61  on the System.Da
250b0 74 61 2e 53 51 4c 69 74 65 20 72 65 6c 61 74 65  ta.SQLite relate
250c0 64 20 6f 6e 65 73 2e 0d 0a 20 20 20 20 20 20 20  d ones...       
250d0 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   #..        if {
250e0 5b 68 61 76 65 53 51 4c 69 74 65 4f 62 6a 65 63  [haveSQLiteObjec
250f0 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65 6e 20  tCommand]} then 
25100 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  {..          set
25110 20 61 73 73 65 6d 62 6c 69 65 73 20 5b 6f 62 6a   assemblies [obj
25120 65 63 74 20 69 6e 76 6f 6b 65 20 41 70 70 44 6f  ect invoke AppDo
25130 6d 61 69 6e 2e 43 75 72 72 65 6e 74 44 6f 6d 61  main.CurrentDoma
25140 69 6e 20 47 65 74 41 73 73 65 6d 62 6c 69 65 73  in GetAssemblies
25150 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 6f  ]....          o
25160 62 6a 65 63 74 20 66 6f 72 65 61 63 68 20 61 73  bject foreach as
25170 73 65 6d 62 6c 79 20 24 61 73 73 65 6d 62 6c 69  sembly $assembli
25180 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  es {..          
25190 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6d 61    if {[string ma
251a0 74 63 68 20 5c 7b 53 79 73 74 65 6d 2e 44 61 74  tch \{System.Dat
251b0 61 2e 53 51 4c 69 74 65 2a 20 24 61 73 73 65 6d  a.SQLite* $assem
251c0 62 6c 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  bly]} then {..  
251d0 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
251e0 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
251f0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
25200 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25210 20 20 20 22 2d 2d 2d 2d 20 66 6f 75 6e 64 20 6c     "---- found l
25220 6f 61 64 65 64 20 61 73 73 65 6d 62 6c 79 3a 20  oaded assembly: 
25230 22 20 24 61 73 73 65 6d 62 6c 79 20 5c 6e 5d 0d  " $assembly \n].
25240 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
25250 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
25260 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
25270 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20    catch {..     
25280 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
25290 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20  st_channel \..  
252a0 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
252b0 2d 20 64 65 66 69 6e 65 20 63 6f 6e 73 74 61 6e  - define constan
252c0 74 73 20 66 6f 72 20 5c 22 53 79 73 74 65 6d 2e  ts for \"System.
252d0 44 61 74 61 2e 53 51 4c 69 74 65 5c 22 2e 2e 2e  Data.SQLite\"...
252e0 20 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   "....          
252f0 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20  if {[catch {..  
25300 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74            object
25310 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b   invoke -flags +
25320 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20  NonPublic \..   
25330 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73               Sys
25340 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
25350 53 51 4c 69 74 65 33 20 44 65 66 69 6e 65 43 6f  SQLite3 DefineCo
25360 6e 73 74 61 6e 74 73 0d 0a 20 20 20 20 20 20 20  nstants..       
25370 20 20 20 7d 20 64 65 66 69 6e 65 43 6f 6e 73 74     } defineConst
25380 61 6e 74 73 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  ants] == 0} then
25390 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
253a0 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
253b0 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
253c0 73 20 5b 66 6f 72 6d 61 74 4c 69 73 74 20 5b 6c  s [formatList [l
253d0 73 6f 72 74 20 5c 0d 0a 20 20 20 20 20 20 20 20  sort \..        
253e0 20 20 20 20 20 20 20 20 24 64 65 66 69 6e 65 43          $defineC
253f0 6f 6e 73 74 61 6e 74 73 5d 20 3c 6e 6f 6e 65 3e  onstants] <none>
25400 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  ] \n]..         
25410 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
25420 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
25430 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 75 6e 6b  test_channel unk
25440 6e 6f 77 6e 5c 6e 0d 0a 20 20 20 20 20 20 20 20  nown\n..        
25450 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
25460 0d 0a 20 20 20 20 20 20 20 20 63 61 74 63 68 20  ..        catch 
25470 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75  {..          tpu
25480 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
25490 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  el \..          
254a0 20 20 20 20 22 2d 2d 2d 2d 20 73 6f 75 72 63 65      "---- source
254b0 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22 53 79   version of \"Sy
254c0 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
254d0 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 0d 0a 0d 0a 20  .dll\"... ".... 
254e0 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61           if {[ca
254f0 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
25500 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65     object invoke
25510 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c   -flags +NonPubl
25520 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ic \..          
25530 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74        System.Dat
25540 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 43  a.SQLite.SQLiteC
25550 6f 6e 6e 65 63 74 69 6f 6e 20 50 72 6f 76 69 64  onnection Provid
25560 65 72 56 65 72 73 69 6f 6e 0d 0a 20 20 20 20 20  erVersion..     
25570 20 20 20 20 20 7d 20 76 65 72 73 69 6f 6e 5d 20       } version] 
25580 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
25590 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73            if {[s
255a0 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 65  tring length $ve
255b0 72 73 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65  rsion] == 0} the
255c0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
255d0 20 20 20 73 65 74 20 76 65 72 73 69 6f 6e 20 6e     set version n
255e0 75 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ull..           
255f0 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
25600 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
25610 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
25620 73 20 24 76 65 72 73 69 6f 6e 20 5c 6e 5d 0d 0a  s $version \n]..
25630 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
25640 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
25650 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
25660 61 6e 6e 65 6c 20 75 6e 6b 6e 6f 77 6e 5c 6e 0d  annel unknown\n.
25670 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
25680 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
25690 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20     catch {..    
256a0 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
256b0 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20  est_channel \.. 
256c0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
256d0 2d 2d 20 73 6f 75 72 63 65 20 63 68 65 63 6b 6f  -- source checko
256e0 75 74 20 6f 66 20 5c 22 53 79 73 74 65 6d 2e 44  ut of \"System.D
256f0 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 5c 22  ata.SQLite.dll\"
25700 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 20  ... "....       
25710 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d     if {[catch {.
25720 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a  .            obj
25730 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67  ect invoke -flag
25740 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a  s +NonPublic \..
25750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25760 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
25770 74 65 2e 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74  te.SQLiteConnect
25780 69 6f 6e 20 50 72 6f 76 69 64 65 72 53 6f 75 72  ion ProviderSour
25790 63 65 49 64 0d 0a 20 20 20 20 20 20 20 20 20 20  ceId..          
257a0 7d 20 73 6f 75 72 63 65 49 64 5d 20 3d 3d 20 30  } sourceId] == 0
257b0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
257c0 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
257d0 67 20 6c 65 6e 67 74 68 20 24 73 6f 75 72 63 65  g length $source
257e0 49 64 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  Id] == 0} then {
257f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
25800 73 65 74 20 73 6f 75 72 63 65 49 64 20 6e 75 6c  set sourceId nul
25810 6c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  l..            }
25820 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
25830 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
25840 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
25850 24 73 6f 75 72 63 65 49 64 20 5c 6e 5d 0d 0a 20  $sourceId \n].. 
25860 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20           } else 
25870 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
25880 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
25890 6e 6e 65 6c 20 75 6e 6b 6e 6f 77 6e 5c 6e 0d 0a  nnel unknown\n..
258a0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
258b0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
258c0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
258d0 4f 54 45 3a 20 43 68 65 63 6b 20 74 68 65 20 61  OTE: Check the a
258e0 76 61 69 6c 61 62 6c 65 20 62 75 69 6c 64 73 20  vailable builds 
258f0 28 61 6e 64 20 22 72 65 6c 65 61 73 65 73 22 29  (and "releases")
25900 20 6f 66 20 53 51 4c 69 74 65 20 61 6e 64 0d 0a   of SQLite and..
25910 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
25920 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
25930 74 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  te...        #..
25940 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72          checkFor
25950 53 51 4c 69 74 65 42 75 69 6c 64 73 20 24 3a 3a  SQLiteBuilds $::
25960 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 20 20  test_channel..  
25970 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51        checkForSQ
25980 4c 69 74 65 52 65 6c 65 61 73 65 73 20 24 3a 3a  LiteReleases $::
25990 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a  test_channel....
259a0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
259b0 20 20 20 23 20 4e 4f 54 45 3a 20 4e 6f 77 2c 20     # NOTE: Now, 
259c0 77 65 20 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20  we need to know 
259d0 69 66 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f  if the SQLite co
259e0 72 65 20 6c 69 62 72 61 72 79 20 69 73 20 61 76  re library is av
259f0 61 69 6c 61 62 6c 65 0d 0a 20 20 20 20 20 20 20  ailable..       
25a00 20 23 20 20 20 20 20 20 20 28 69 2e 65 2e 20 62   #       (i.e. b
25a10 65 63 61 75 73 65 20 74 68 65 20 6d 61 6e 61 67  ecause the manag
25a20 65 64 2d 6f 6e 6c 79 20 53 79 73 74 65 6d 2e 44  ed-only System.D
25a30 61 74 61 2e 53 51 4c 69 74 65 20 61 73 73 65 6d  ata.SQLite assem
25a40 62 6c 79 20 63 61 6e 0d 0a 20 20 20 20 20 20 20  bly can..       
25a50 20 23 20 20 20 20 20 20 20 6c 6f 61 64 20 77 69   #       load wi
25a60 74 68 6f 75 74 20 69 74 3b 20 68 6f 77 65 76 65  thout it; howeve
25a70 72 2c 20 69 74 20 63 61 6e 6e 6f 74 20 64 6f 20  r, it cannot do 
25a80 61 6e 79 74 68 69 6e 67 20 75 73 65 66 75 6c 20  anything useful 
25a90 77 69 74 68 6f 75 74 0d 0a 20 20 20 20 20 20 20  without..       
25aa0 20 23 20 20 20 20 20 20 20 69 74 29 2e 20 20 49   #       it).  I
25ab0 66 20 77 65 20 61 72 65 20 75 73 69 6e 67 20 74  f we are using t
25ac0 68 65 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73  he mixed-mode as
25ad0 73 65 6d 62 6c 79 20 61 6e 64 20 77 65 20 61 6c  sembly and we al
25ae0 72 65 61 64 79 0d 0a 20 20 20 20 20 20 20 20 23  ready..        #
25af0 20 20 20 20 20 20 20 66 6f 75 6e 64 20 69 74 20         found it 
25b00 28 61 62 6f 76 65 29 2c 20 74 68 69 73 20 73 68  (above), this sh
25b10 6f 75 6c 64 20 61 6c 77 61 79 73 20 73 75 63 63  ould always succ
25b20 65 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  eed...        #.
25b30 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f  .        checkFo
25b40 72 53 51 4c 69 74 65 4c 69 62 72 61 72 79 20 24  rSQLiteLibrary $
25b50 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a  ::test_channel..
25b60 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
25b70 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65       # NOTE: Che
25b80 63 6b 20 69 66 20 74 68 65 20 53 51 4c 69 74 65  ck if the SQLite
25b90 20 69 6e 74 65 72 6f 70 20 61 73 73 65 6d 62 6c   interop assembl
25ba0 79 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0d  y is available..
25bb0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
25bc0 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51 4c 69      checkForSQLi
25bd0 74 65 49 6e 74 65 72 6f 70 20 24 3a 3a 74 65 73  teInterop $::tes
25be0 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20  t_channel....   
25bf0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
25c00 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 74 68  # NOTE: Check th
25c10 65 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73  e SQLite databas
25c20 65 20 61 6e 64 20 74 65 6d 70 6f 72 61 72 79 20  e and temporary 
25c30 64 69 72 65 63 74 6f 72 69 65 73 2e 0d 0a 20 20  directories...  
25c40 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
25c50 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 44   checkForSQLiteD
25c60 69 72 65 63 74 6f 72 69 65 73 20 24 3a 3a 74 65  irectories $::te
25c70 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20  st_channel....  
25c80 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
25c90 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74   # NOTE: Attempt
25ca0 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66   to determine if
25cb0 20 76 61 72 69 6f 75 73 20 63 6f 6d 70 69 6c 65   various compile
25cc0 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 73 20 6e 65  -time options ne
25cd0 65 64 65 64 20 66 6f 72 0d 0a 20 20 20 20 20 20  eded for..      
25ce0 20 20 23 20 20 20 20 20 20 20 74 65 73 74 20 63    #       test c
25cf0 6f 6e 73 74 72 61 69 6e 74 73 20 77 65 72 65 20  onstraints were 
25d00 65 6e 61 62 6c 65 64 20 66 6f 72 20 74 68 65 20  enabled for the 
25d10 6d 61 6e 61 67 65 64 20 61 73 73 65 6d 62 6c 79  managed assembly
25d20 2e 20 20 54 68 65 72 65 0d 0a 20 20 20 20 20 20  .  There..      
25d30 20 20 23 20 20 20 20 20 20 20 61 72 65 20 73 6f    #       are so
25d40 6d 65 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  me compile-time 
25d50 6f 70 74 69 6f 6e 73 20 74 68 61 74 20 6d 75 73  options that mus
25d60 74 20 61 6c 73 6f 20 68 61 76 65 20 62 65 65 6e  t also have been
25d70 20 65 6e 61 62 6c 65 64 0d 0a 20 20 20 20 20 20   enabled..      
25d80 20 20 23 20 20 20 20 20 20 20 66 6f 72 20 74 68    #       for th
25d90 65 20 69 6e 74 65 72 6f 70 20 61 73 73 65 6d 62  e interop assemb
25da0 6c 79 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62  ly in order to b
25db0 65 20 65 66 66 65 63 74 69 76 65 2e 20 20 46 6f  e effective.  Fo
25dc0 72 20 74 68 6f 73 65 0d 0a 20 20 20 20 20 20 20  r those..       
25dd0 20 23 20 20 20 20 20 20 20 6f 70 74 69 6f 6e 73   #       options
25de0 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 61 73 73  , it will be ass
25df0 75 6d 65 64 20 74 68 61 74 20 69 74 20 77 61 73  umed that it was
25e00 20 65 6e 61 62 6c 65 64 20 66 6f 72 20 74 68 65   enabled for the
25e10 20 69 6e 74 65 72 6f 70 0d 0a 20 20 20 20 20 20   interop..      
25e20 20 20 23 20 20 20 20 20 20 20 61 73 73 65 6d 62    #       assemb
25e30 6c 79 20 69 66 20 69 74 20 77 61 73 20 65 6e 61  ly if it was ena
25e40 62 6c 65 64 20 66 6f 72 20 74 68 65 20 6d 61 6e  bled for the man
25e50 61 67 65 64 20 61 73 73 65 6d 62 6c 79 2e 0d 0a  aged assembly...
25e60 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
25e70 20 20 20 66 6f 72 65 61 63 68 20 64 65 66 69 6e     foreach defin
25e80 65 43 6f 6e 73 74 61 6e 74 20 5b 6c 69 73 74 20  eConstant [list 
25e90 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 43  \..            C
25ea0 48 45 43 4b 5f 53 54 41 54 45 20 43 4f 55 4e 54  HECK_STATE COUNT
25eb0 5f 48 41 4e 44 4c 45 20 44 45 42 55 47 20 49 4e  _HANDLE DEBUG IN
25ec0 54 45 52 4f 50 5f 43 4f 44 45 43 20 49 4e 54 45  TEROP_CODEC INTE
25ed0 52 4f 50 5f 44 45 42 55 47 20 5c 0d 0a 20 20 20  ROP_DEBUG \..   
25ee0 20 20 20 20 20 20 20 20 20 49 4e 54 45 52 4f 50           INTEROP
25ef0 5f 45 58 54 45 4e 53 49 4f 4e 5f 46 55 4e 43 54  _EXTENSION_FUNCT
25f00 49 4f 4e 53 20 49 4e 54 45 52 4f 50 5f 46 54 53  IONS INTEROP_FTS
25f10 35 5f 45 58 54 45 4e 53 49 4f 4e 20 5c 0d 0a 20  5_EXTENSION \.. 
25f20 20 20 20 20 20 20 20 20 20 20 20 49 4e 54 45 52             INTER
25f30 4f 50 5f 49 4e 43 4c 55 44 45 5f 43 45 52 4f 44  OP_INCLUDE_CEROD
25f40 20 49 4e 54 45 52 4f 50 5f 49 4e 43 4c 55 44 45   INTEROP_INCLUDE
25f50 5f 45 58 54 52 41 20 49 4e 54 45 52 4f 50 5f 49  _EXTRA INTEROP_I
25f60 4e 43 4c 55 44 45 5f 53 45 45 20 5c 0d 0a 20 20  NCLUDE_SEE \..  
25f70 20 20 20 20 20 20 20 20 20 20 49 4e 54 45 52 4f            INTERO
25f80 50 5f 49 4e 43 4c 55 44 45 5f 5a 49 50 56 46 53  P_INCLUDE_ZIPVFS
25f90 20 49 4e 54 45 52 4f 50 5f 4a 53 4f 4e 31 5f 45   INTEROP_JSON1_E
25fa0 58 54 45 4e 53 49 4f 4e 20 5c 0d 0a 20 20 20 20  XTENSION \..    
25fb0 20 20 20 20 20 20 20 20 49 4e 54 45 52 4f 50 5f          INTEROP_
25fc0 4c 45 47 41 43 59 5f 43 4c 4f 53 45 20 49 4e 54  LEGACY_CLOSE INT
25fd0 45 52 4f 50 5f 4c 4f 47 20 49 4e 54 45 52 4f 50  EROP_LOG INTEROP
25fe0 5f 50 45 52 43 45 4e 54 49 4c 45 5f 45 58 54 45  _PERCENTILE_EXTE
25ff0 4e 53 49 4f 4e 20 5c 0d 0a 20 20 20 20 20 20 20  NSION \..       
26000 20 20 20 20 20 49 4e 54 45 52 4f 50 5f 52 45 47       INTEROP_REG
26010 45 58 50 5f 45 58 54 45 4e 53 49 4f 4e 20 49 4e  EXP_EXTENSION IN
26020 54 45 52 4f 50 5f 54 45 53 54 5f 45 58 54 45 4e  TEROP_TEST_EXTEN
26030 53 49 4f 4e 20 5c 0d 0a 20 20 20 20 20 20 20 20  SION \..        
26040 20 20 20 20 49 4e 54 45 52 4f 50 5f 54 4f 54 59      INTEROP_TOTY
26050 50 45 5f 45 58 54 45 4e 53 49 4f 4e 20 49 4e 54  PE_EXTENSION INT
26060 45 52 4f 50 5f 56 49 52 54 55 41 4c 5f 54 41 42  EROP_VIRTUAL_TAB
26070 4c 45 20 4e 45 54 5f 32 30 20 4e 45 54 5f 33 35  LE NET_20 NET_35
26080 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
26090 4e 45 54 5f 34 30 20 4e 45 54 5f 34 35 20 4e 45  NET_40 NET_45 NE
260a0 54 5f 34 35 31 20 4e 45 54 5f 34 35 32 20 4e 45  T_451 NET_452 NE
260b0 54 5f 34 36 20 4e 45 54 5f 34 36 31 20 4e 45 54  T_46 NET_461 NET
260c0 5f 34 36 32 20 5c 0d 0a 20 20 20 20 20 20 20 20  _462 \..        
260d0 20 20 20 20 4e 45 54 5f 43 4f 4d 50 41 43 54 5f      NET_COMPACT_
260e0 32 30 20 50 4c 41 54 46 4f 52 4d 5f 43 4f 4d 50  20 PLATFORM_COMP
260f0 41 43 54 46 52 41 4d 45 57 4f 52 4b 20 50 52 45  ACTFRAMEWORK PRE
26100 4c 4f 41 44 5f 4e 41 54 49 56 45 5f 4c 49 42 52  LOAD_NATIVE_LIBR
26110 41 52 59 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ARY \..         
26120 20 20 20 52 45 54 41 52 47 45 54 41 42 4c 45 20     RETARGETABLE 
26130 53 51 4c 49 54 45 5f 53 54 41 4e 44 41 52 44 20  SQLITE_STANDARD 
26140 54 48 52 4f 57 5f 4f 4e 5f 44 49 53 50 4f 53 45  THROW_ON_DISPOSE
26150 44 20 54 52 41 43 45 20 5c 0d 0a 20 20 20 20 20  D TRACE \..     
26160 20 20 20 20 20 20 20 54 52 41 43 45 5f 43 4f 4e         TRACE_CON
26170 4e 45 43 54 49 4f 4e 20 54 52 41 43 45 5f 44 45  NECTION TRACE_DE
26180 54 45 43 54 49 4f 4e 20 54 52 41 43 45 5f 48 41  TECTION TRACE_HA
26190 4e 44 4c 45 20 54 52 41 43 45 5f 50 52 45 4c 4f  NDLE TRACE_PRELO
261a0 41 44 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  AD \..          
261b0 20 20 54 52 41 43 45 5f 53 48 41 52 45 44 20 54    TRACE_SHARED T
261c0 52 41 43 45 5f 53 54 41 54 45 4d 45 4e 54 20 54  RACE_STATEMENT T
261d0 52 41 43 45 5f 57 41 52 4e 49 4e 47 20 54 52 41  RACE_WARNING TRA
261e0 43 4b 5f 4d 45 4d 4f 52 59 5f 42 59 54 45 53 20  CK_MEMORY_BYTES 
261f0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 55  \..            U
26200 53 45 5f 45 4e 54 49 54 59 5f 46 52 41 4d 45 57  SE_ENTITY_FRAMEW
26210 4f 52 4b 5f 36 20 55 53 45 5f 49 4e 54 45 52 4f  ORK_6 USE_INTERO
26220 50 5f 44 4c 4c 20 55 53 45 5f 50 52 45 50 41 52  P_DLL USE_PREPAR
26230 45 5f 56 32 20 57 49 4e 44 4f 57 53 5d 20 7b 0d  E_V2 WINDOWS] {.
26240 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
26250 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
26260 43 68 65 63 6b 20 69 66 20 74 68 65 20 63 6f 6d  Check if the com
26270 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e  pile-time option
26280 20 69 73 20 6c 69 73 74 65 64 20 69 6e 20 74 68   is listed in th
26290 65 20 6c 69 73 74 20 6f 66 0d 0a 20 20 20 20 20  e list of..     
262a0 20 20 20 20 20 23 20 20 20 20 20 20 20 22 64 65       #       "de
262b0 66 69 6e 65 20 63 6f 6e 73 74 61 6e 74 73 22 20  fine constants" 
262c0 6b 65 70 74 20 74 72 61 63 6b 20 6f 66 20 62 79  kept track of by
262d0 20 74 68 65 20 6d 61 6e 61 67 65 64 20 61 73 73   the managed ass
262e0 65 6d 62 6c 79 2e 0d 0a 20 20 20 20 20 20 20 20  embly...        
262f0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 63    #..          c
26300 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 44 65 66  heckForSQLiteDef
26310 69 6e 65 43 6f 6e 73 74 61 6e 74 20 24 3a 3a 74  ineConstant $::t
26320 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 64 65 66  est_channel $def
26330 69 6e 65 43 6f 6e 73 74 61 6e 74 0d 0a 20 20 20  ineConstant..   
26340 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
26350 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
26360 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20 74 68  OTE: Check if th
26370 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  e System.Data.SQ
26380 4c 69 74 65 20 70 72 6f 76 69 64 65 72 20 77 61  Lite provider wa
26390 73 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 0d  s compiled with.
263a0 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
263b0 20 73 75 70 70 6f 72 74 20 66 6f 72 20 61 6e 79   support for any
263c0 20 65 6e 63 72 79 70 74 65 64 20 64 61 74 61 62   encrypted datab
263d0 61 73 65 73 2e 0d 0a 20 20 20 20 20 20 20 20 23  ases...        #
263e0 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 68  ..        if {[h
263f0 61 76 65 53 51 4c 69 74 65 44 65 66 69 6e 65 43  aveSQLiteDefineC
26400 6f 6e 73 74 61 6e 74 20 49 4e 54 45 52 4f 50 5f  onstant INTEROP_
26410 43 4f 44 45 43 5d 20 7c 7c 20 5c 0d 0a 20 20 20  CODEC] || \..   
26420 20 20 20 20 20 20 20 20 20 5b 68 61 76 65 53 51           [haveSQ
26430 4c 69 74 65 44 65 66 69 6e 65 43 6f 6e 73 74 61  LiteDefineConsta
26440 6e 74 20 49 4e 54 45 52 4f 50 5f 49 4e 43 4c 55  nt INTEROP_INCLU
26450 44 45 5f 53 45 45 5d 7d 20 74 68 65 6e 20 7b 0d  DE_SEE]} then {.
26460 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
26470 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
26480 59 65 73 2c 20 61 64 64 20 67 65 6e 65 72 69 63  Yes, add generic
26490 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 6f 72 20   constraint for 
264a0 75 73 65 20 62 79 20 74 68 65 20 74 65 73 74 20  use by the test 
264b0 73 75 69 74 65 2e 0d 0a 20 20 20 20 20 20 20 20  suite...        
264c0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 61    #..          a
264d0 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 53 79 73  ddConstraint Sys
264e0 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
264f0 45 6e 63 72 79 70 74 69 6f 6e 0d 0a 20 20 20 20  Encryption..    
26500 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
26510 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
26520 54 45 3a 20 43 68 65 63 6b 20 74 68 65 20 63 75  TE: Check the cu
26530 72 72 65 6e 74 20 62 75 69 6c 64 20 79 65 61 72  rrent build year
26540 2e 20 20 42 61 73 69 63 61 6c 6c 79 2c 20 74 68  .  Basically, th
26550 69 73 20 69 6e 64 69 63 61 74 65 73 0d 0a 20 20  is indicates..  
26560 20 20 20 20 20 20 23 20 20 20 20 20 20 20 77 68        #       wh
26570 69 63 68 20 76 65 72 73 69 6f 6e 20 6f 66 20 4d  ich version of M
26580 53 42 75 69 6c 64 20 61 6e 64 2f 6f 72 20 56 69  SBuild and/or Vi
26590 73 75 61 6c 20 53 74 75 64 69 6f 20 77 61 73 20  sual Studio was 
265a0 75 73 65 64 20 74 6f 0d 0a 20 20 20 20 20 20 20  used to..       
265b0 20 23 20 20 20 20 20 20 20 63 6f 6d 70 69 6c 65   #       compile
265c0 20 74 68 65 20 61 73 73 65 6d 62 6c 79 20 62 69   the assembly bi
265d0 6e 61 72 69 65 73 20 75 6e 64 65 72 20 74 65 73  naries under tes
265e0 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  t...        #.. 
265f0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
26600 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a  test_channel \..
26610 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
26620 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 53  - checking for S
26630 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
26640 65 20 62 75 69 6c 64 20 79 65 61 72 2e 2e 2e 20  e build year... 
26650 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74  "....        set
26660 20 79 65 61 72 20 5b 67 65 74 42 75 69 6c 64 59   year [getBuildY
26670 65 61 72 5d 0d 0a 20 20 20 20 20 20 20 20 61 64  ear]..        ad
26680 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70  dConstraint [app
26690 65 6e 64 41 72 67 73 20 62 75 69 6c 64 59 65 61  endArgs buildYea
266a0 72 2e 20 24 79 65 61 72 5d 0d 0a 20 20 20 20 20  r. $year]..     
266b0 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
266c0 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
266d0 41 72 67 73 20 5c 22 20 24 79 65 61 72 20 5c 22  Args \" $year \"
266e0 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23  \n]....        #
266f0 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
26700 3a 20 43 68 65 63 6b 20 74 68 65 20 63 75 72 72  : Check the curr
26710 65 6e 74 20 62 75 69 6c 64 20 2e 4e 45 54 20 46  ent build .NET F
26720 72 61 6d 65 77 6f 72 6b 2e 20 20 42 61 73 69 63  ramework.  Basic
26730 61 6c 6c 79 2c 20 74 68 69 73 0d 0a 20 20 20 20  ally, this..    
26740 20 20 20 20 23 20 20 20 20 20 20 20 69 6e 64 69      #       indi
26750 63 61 74 65 73 20 77 68 69 63 68 20 76 65 72 73  cates which vers
26760 69 6f 6e 20 6f 66 20 74 68 65 20 2e 4e 45 54 20  ion of the .NET 
26770 46 72 61 6d 65 77 6f 72 6b 20 69 73 20 62 65 69  Framework is bei
26780 6e 67 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ng..        #   
26790 20 20 20 20 75 73 65 64 20 62 79 20 74 68 65 20      used by the 
267a0 61 73 73 65 6d 62 6c 79 20 62 69 6e 61 72 69 65  assembly binarie
267b0 73 20 75 6e 64 65 72 20 74 65 73 74 2e 0d 0a 20  s under test... 
267c0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
267d0 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
267e0 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20  channel \..     
267f0 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65         "---- che
26800 63 6b 69 6e 67 20 66 6f 72 20 53 79 73 74 65 6d  cking for System
26810 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 62 75 69  .Data.SQLite bui
26820 6c 64 20 2e 4e 45 54 20 46 72 61 6d 65 77 6f 72  ld .NET Framewor
26830 6b 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20  k... "....      
26840 20 20 73 65 74 20 6e 65 74 46 78 20 5b 67 65 74    set netFx [get
26850 42 75 69 6c 64 4e 65 74 46 78 5d 0d 0a 20 20 20  BuildNetFx]..   
26860 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
26870 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 62  nt [appendArgs b
26880 75 69 6c 64 46 72 61 6d 65 77 6f 72 6b 2e 20 24  uildFramework. $
26890 6e 65 74 46 78 5d 0d 0a 20 20 20 20 20 20 20 20  netFx]..        
268a0 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
268b0 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
268c0 73 20 5c 22 20 24 6e 65 74 46 78 20 5c 22 5c 6e  s \" $netFx \"\n
268d0 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ]....        #..
268e0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
268f0 43 68 65 63 6b 20 74 68 65 20 63 75 72 72 65 6e  Check the curren
26900 74 20 62 75 69 6c 64 20 63 6f 6e 66 69 67 75 72  t build configur
26910 61 74 69 6f 6e 2e 20 20 54 68 69 73 20 73 68 6f  ation.  This sho
26920 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79 0d 0a 20 20  uld normally..  
26930 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62 65        #       be
26940 20 65 69 74 68 65 72 20 22 44 65 62 75 67 22 20   either "Debug" 
26950 6f 72 20 22 52 65 6c 65 61 73 65 22 2e 0d 0a 20  or "Release"... 
26960 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
26970 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
26980 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20  channel \..     
26990 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65         "---- che
269a0 63 6b 69 6e 67 20 66 6f 72 20 53 79 73 74 65 6d  cking for System
269b0 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 62 75 69  .Data.SQLite bui
269c0 6c 64 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  ld configuration
269d0 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 20  ... "....       
269e0 20 73 65 74 20 63 6f 6e 66 69 67 75 72 61 74 69   set configurati
269f0 6f 6e 20 5b 67 65 74 42 75 69 6c 64 43 6f 6e 66  on [getBuildConf
26a00 69 67 75 72 61 74 69 6f 6e 5d 0d 0a 20 20 20 20  iguration]..    
26a10 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e      addConstrain
26a20 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 62 75  t [appendArgs bu
26a30 69 6c 64 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e  ildConfiguration
26a40 2e 20 24 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  . $configuration
26a50 5d 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  ]..        tputs
26a60 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
26a70 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 22 20   [appendArgs \" 
26a80 24 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 5c  $configuration \
26a90 22 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  "\n]....        
26aa0 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
26ab0 45 3a 20 54 72 79 20 74 6f 20 73 65 74 75 70 20  E: Try to setup 
26ac0 61 6e 20 69 6e 74 65 72 72 75 70 74 20 63 61 6c  an interrupt cal
26ad0 6c 62 61 63 6b 20 75 73 69 6e 67 20 74 68 65 20  lback using the 
26ae0 73 63 72 69 70 74 20 64 65 62 75 67 67 65 72 0d  script debugger.
26af0 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
26b00 20 74 68 61 74 20 77 69 6c 6c 20 63 61 6e 63 65   that will cance
26b10 6c 20 61 6c 6c 20 53 51 4c 20 71 75 65 72 69 65  l all SQL querie
26b20 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20 66 6f  s in progress fo
26b30 72 20 61 6c 6c 20 64 61 74 61 62 61 73 65 0d 0a  r all database..
26b40 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
26b50 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6b 6e 6f 77  connections know
26b60 6e 20 74 6f 20 74 68 69 73 20 69 6e 74 65 72 70  n to this interp
26b70 72 65 74 65 72 2e 0d 0a 20 20 20 20 20 20 20 20  reter...        
26b80 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21  #..        if {!
26b90 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
26ba0 6f 28 73 71 6c 69 74 65 49 6e 74 65 72 72 75 70  o(sqliteInterrup
26bb0 74 43 61 6c 6c 62 61 63 6b 29 5d 7d 20 74 68 65  tCallback)]} the
26bc0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73  n {..          s
26bd0 65 74 75 70 44 62 49 6e 74 65 72 72 75 70 74 43  etupDbInterruptC
26be0 61 6c 6c 62 61 63 6b 20 24 3a 3a 74 65 73 74 5f  allback $::test_
26bf0 63 68 61 6e 6e 65 6c 20 24 3a 3a 74 65 73 74 5f  channel $::test_
26c00 6c 6f 67 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  log..        }..
26c10 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
26c20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65       # NOTE: Che
26c30 63 6b 20 66 6f 72 20 74 68 65 20 6e 61 74 69 76  ck for the nativ
26c40 65 20 72 75 6e 74 69 6d 65 20 6f 70 74 69 6f 6e  e runtime option
26c50 2c 20 77 68 69 63 68 20 77 6f 75 6c 64 20 6d 65  , which would me
26c60 61 6e 20 77 65 20 61 72 65 0d 0a 20 20 20 20 20  an we are..     
26c70 20 20 20 23 20 20 20 20 20 20 20 75 73 69 6e 67     #       using
26c80 20 74 68 65 20 6d 69 78 65 64 2d 6d 6f 64 65 20   the mixed-mode 
26c90 61 73 73 65 6d 62 6c 79 2e 0d 0a 20 20 20 20 20  assembly...     
26ca0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 63 68     #..        ch
26cb0 65 63 6b 46 6f 72 52 75 6e 74 69 6d 65 4f 70 74  eckForRuntimeOpt
26cc0 69 6f 6e 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  ion $::test_chan
26cd0 6e 65 6c 20 6e 61 74 69 76 65 0d 0a 0d 0a 20 20  nel native....  
26ce0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
26cf0 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69   # NOTE: Check i
26d00 66 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65  f the test suite
26d10 20 73 68 6f 75 6c 64 20 63 6f 75 6e 74 20 74 68   should count th
26d20 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6e 6e  e number of conn
26d30 65 63 74 69 6f 6e 73 0d 0a 20 20 20 20 20 20 20  ections..       
26d40 20 23 20 20 20 20 20 20 20 22 6f 70 65 6e 65 64   #       "opened
26d50 22 20 61 6e 64 20 22 63 6c 6f 73 65 64 22 20 66  " and "closed" f
26d60 72 6f 6d 20 74 68 65 20 70 6f 6f 6c 20 77 68 65  rom the pool whe
26d70 6e 20 64 65 74 65 72 6d 69 6e 69 6e 67 20 69 66  n determining if
26d80 20 61 20 74 65 73 74 0d 0a 20 20 20 20 20 20 20   a test..       
26d90 20 23 20 20 20 20 20 20 20 70 61 73 73 65 64 2e   #       passed.
26da0 20 20 44 69 73 61 62 6c 69 6e 67 20 74 68 69 73    Disabling this
26db0 20 62 65 68 61 76 69 6f 72 20 69 73 20 73 6f 6d   behavior is som
26dc0 65 74 69 6d 65 73 20 6e 65 63 65 73 73 61 72 79  etimes necessary
26dd0 20 28 65 2e 67 2e 0d 0a 20 20 20 20 20 20 20 20   (e.g...        
26de0 23 20 20 20 20 20 20 20 64 75 72 69 6e 67 20 74  #       during t
26df0 68 65 20 72 65 6c 65 61 73 65 20 74 65 73 74 69  he release testi
26e00 6e 67 20 70 72 6f 63 65 73 73 29 20 62 65 63 61  ng process) beca
26e10 75 73 65 20 74 68 65 72 65 20 61 72 65 20 73 65  use there are se
26e20 76 65 72 61 6c 0d 0a 20 20 20 20 20 20 20 20 23  veral..        #
26e30 20 20 20 20 20 20 20 74 65 73 74 73 20 74 68 61         tests tha
26e40 74 20 72 65 6c 79 20 6f 6e 20 74 68 65 20 22 6f  t rely on the "o
26e50 70 65 6e 65 64 20 66 72 6f 6d 20 70 6f 6f 6c 22  pened from pool"
26e60 20 63 6f 75 6e 74 20 62 65 69 6e 67 20 67 72 65   count being gre
26e70 61 74 65 72 0d 0a 20 20 20 20 20 20 20 20 23 20  ater..        # 
26e80 20 20 20 20 20 20 74 68 61 6e 20 7a 65 72 6f 2e        than zero.
26e90 20 20 54 68 65 73 65 20 74 65 73 74 73 20 6d 61    These tests ma
26ea0 79 20 66 61 69 6c 20 64 75 65 20 74 6f 20 74 68  y fail due to th
26eb0 65 20 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e 69 73  e non-determinis
26ec0 74 69 63 0d 0a 20 20 20 20 20 20 20 20 23 20 20  tic..        #  
26ed0 20 20 20 20 20 62 65 68 61 76 69 6f 72 20 6f 66       behavior of
26ee0 20 74 68 65 20 43 4c 52 20 47 43 2c 20 65 76 65   the CLR GC, eve
26ef0 6e 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20  n when there is 
26f00 6e 6f 20 62 75 67 20 69 6e 20 74 68 65 20 63 6f  no bug in the co
26f10 64 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  de..        #   
26f20 20 20 20 20 62 65 69 6e 67 20 74 65 73 74 65 64      being tested
26f30 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
26f40 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 52 75        checkForRu
26f50 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 24 3a 3a 74  ntimeOption $::t
26f60 65 73 74 5f 63 68 61 6e 6e 65 6c 20 6e 6f 50 6f  est_channel noPo
26f70 6f 6c 43 6f 75 6e 74 73 0d 0a 0d 0a 20 20 20 20  olCounts....    
26f80 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
26f90 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20   NOTE: Check if 
26fa0 74 68 65 20 74 65 73 74 20 73 75 69 74 65 20 73  the test suite s
26fb0 68 6f 75 6c 64 20 75 73 65 20 73 68 61 72 65 64  hould use shared
26fc0 2d 63 61 63 68 65 20 6d 6f 64 65 2e 0d 0a 20 20  -cache mode...  
26fd0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
26fe0 20 63 68 65 63 6b 46 6f 72 52 75 6e 74 69 6d 65   checkForRuntime
26ff0 4f 70 74 69 6f 6e 20 24 3a 3a 74 65 73 74 5f 63  Option $::test_c
27000 68 61 6e 6e 65 6c 20 73 68 61 72 65 64 43 61 63  hannel sharedCac
27010 68 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d  he....        #.
27020 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
27030 20 52 65 70 6f 72 74 20 74 68 65 20 72 65 73 6f   Report the reso
27040 75 72 63 65 20 75 73 61 67 65 20 70 72 69 6f 72  urce usage prior
27050 20 74 6f 20 72 75 6e 6e 69 6e 67 20 61 6e 79 20   to running any 
27060 74 65 73 74 73 2e 0d 0a 20 20 20 20 20 20 20 20  tests...        
27070 23 0d 0a 20 20 20 20 20 20 20 20 72 65 70 6f 72  #..        repor
27080 74 53 51 4c 69 74 65 52 65 73 6f 75 72 63 65 73  tSQLiteResources
27090 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
270a0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
270b0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 47         # NOTE: G
270c0 72 61 62 20 74 68 65 20 6c 69 73 74 20 6f 66 20  rab the list of 
270d0 6e 61 74 69 76 65 20 6d 6f 64 75 6c 65 73 20 66  native modules f
270e0 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  or the current p
270f0 72 6f 63 65 73 73 20 61 6e 64 0d 0a 20 20 20 20  rocess and..    
27100 20 20 20 20 23 20 20 20 20 20 20 20 72 65 70 6f      #       repo
27110 72 74 20 6f 6e 20 74 68 65 20 53 79 73 74 65 6d  rt on the System
27120 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 72 65 6c  .Data.SQLite rel
27130 61 74 65 64 20 6f 6e 65 73 2e 0d 0a 20 20 20 20  ated ones...    
27140 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69      #..        i
27150 66 20 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f 62  f {[haveSQLiteOb
27160 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68  jectCommand]} th
27170 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
27180 73 65 74 20 6d 6f 64 75 6c 65 73 20 5b 6f 62 6a  set modules [obj
27190 65 63 74 20 69 6e 76 6f 6b 65 20 5c 0d 0a 20 20  ect invoke \..  
271a0 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74              Syst
271b0 65 6d 2e 44 69 61 67 6e 6f 73 74 69 63 73 2e 50  em.Diagnostics.P
271c0 72 6f 63 65 73 73 2e 47 65 74 43 75 72 72 65 6e  rocess.GetCurren
271d0 74 50 72 6f 63 65 73 73 20 4d 6f 64 75 6c 65 73  tProcess Modules
271e0 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 6f  ]....          o
271f0 62 6a 65 63 74 20 66 6f 72 65 61 63 68 20 2d 61  bject foreach -a
27200 6c 69 61 73 20 6d 6f 64 75 6c 65 20 24 6d 6f 64  lias module $mod
27210 75 6c 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20  ules {..        
27220 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
27230 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 6d     # NOTE: The m
27240 6f 64 75 6c 65 20 66 69 6c 65 20 6e 61 6d 65 20  odule file name 
27250 68 65 72 65 20 6d 75 73 74 20 62 65 20 6e 6f 72  here must be nor
27260 6d 61 6c 69 7a 65 64 2e 0d 0a 20 20 20 20 20 20  malized...      
27270 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
27280 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d       set fileNam
27290 65 20 5b 66 69 6c 65 20 6e 6f 72 6d 61 6c 69 7a  e [file normaliz
272a0 65 20 5b 24 6d 6f 64 75 6c 65 20 46 69 6c 65 4e  e [$module FileN
272b0 61 6d 65 5d 5d 0d 0a 20 20 20 20 20 20 20 20 20  ame]]..         
272c0 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 4f     set fileNameO
272d0 6e 6c 79 20 5b 66 69 6c 65 20 74 61 69 6c 20 24  nly [file tail $
272e0 66 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20  fileName]....   
272f0 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 6c 73           if {[ls
27300 65 61 72 63 68 20 2d 65 78 61 63 74 20 2d 6e 6f  earch -exact -no
27310 63 61 73 65 20 2d 2d 20 5c 0d 0a 20 20 20 20 20  case -- \..     
27320 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 4e             [getN
27330 61 74 69 76 65 4c 69 62 72 61 72 79 46 69 6c 65  ativeLibraryFile
27340 4e 61 6d 65 73 4f 6e 6c 79 5d 20 24 66 69 6c 65  NamesOnly] $file
27350 4e 61 6d 65 4f 6e 6c 79 5d 20 21 3d 20 2d 31 7d  NameOnly] != -1}
27360 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
27370 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
27380 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
27390 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
273a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
273b0 2d 2d 2d 20 66 6f 75 6e 64 20 6c 6f 61 64 65 64  --- found loaded
273c0 20 53 51 4c 69 74 65 20 6e 61 74 69 76 65 20 6c   SQLite native l
273d0 69 62 72 61 72 79 20 6d 6f 64 75 6c 65 3a 20 22  ibrary module: "
273e0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
273f0 20 20 20 20 20 20 24 66 69 6c 65 4e 61 6d 65 20        $fileName 
27400 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  \n]..           
27410 20 7d 20 65 6c 73 65 69 66 20 7b 5b 6c 73 65 61   } elseif {[lsea
27420 72 63 68 20 2d 65 78 61 63 74 20 2d 6e 6f 63 61  rch -exact -noca
27430 73 65 20 2d 2d 20 5c 0d 0a 20 20 20 20 20 20 20  se -- \..       
27440 20 20 20 20 20 20 20 20 20 5b 67 65 74 49 6e 74           [getInt
27450 65 72 6f 70 41 73 73 65 6d 62 6c 79 46 69 6c 65  eropAssemblyFile
27460 4e 61 6d 65 73 4f 6e 6c 79 5d 20 24 66 69 6c 65  NamesOnly] $file
27470 4e 61 6d 65 4f 6e 6c 79 5d 20 21 3d 20 2d 31 7d  NameOnly] != -1}
27480 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
27490 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
274a0 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
274b0 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
274c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
274d0 2d 2d 2d 20 66 6f 75 6e 64 20 6c 6f 61 64 65 64  --- found loaded
274e0 20 53 51 4c 69 74 65 20 69 6e 74 65 72 6f 70 20   SQLite interop 
274f0 61 73 73 65 6d 62 6c 79 20 6d 6f 64 75 6c 65 3a  assembly module:
27500 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   " \..          
27510 20 20 20 20 20 20 20 20 24 66 69 6c 65 4e 61 6d          $fileNam
27520 65 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  e \n]..         
27530 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
27540 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  }..        }....
27550 20 20 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d          catch {.
27560 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
27570 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
27580 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
27590 20 20 22 2d 2d 2d 2d 20 63 6f 6d 70 69 6c 65 2d    "---- compile-
275a0 74 69 6d 65 20 6f 70 74 69 6f 6e 73 20 66 6f 72  time options for
275b0 20 53 51 4c 69 74 65 20 63 6f 72 65 20 6c 69 62   SQLite core lib
275c0 72 61 72 79 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20  rary... "....   
275d0 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
275e0 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  h {..           
275f0 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d   object invoke -
27600 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63  flags +NonPublic
27610 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
27620 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e      System.Data.
27630 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 33 20 53  SQLite.SQLite3 S
27640 51 4c 69 74 65 43 6f 6d 70 69 6c 65 4f 70 74 69  QLiteCompileOpti
27650 6f 6e 73 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  ons..          }
27660 20 63 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 73 5d   compileOptions]
27670 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
27680 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
27690 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
276a0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5b 66 6f   [appendArgs [fo
276b0 72 6d 61 74 4c 69 73 74 20 5b 6c 73 6f 72 74 20  rmatList [lsort 
276c0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
276d0 20 20 20 24 63 6f 6d 70 69 6c 65 4f 70 74 69 6f     $compileOptio
276e0 6e 73 5d 20 3c 6e 6f 6e 65 3e 5d 20 5c 6e 5d 0d  ns] <none>] \n].
276f0 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73  .          } els
27700 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e {..           
27710 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
27720 68 61 6e 6e 65 6c 20 75 6e 6b 6e 6f 77 6e 5c 6e  hannel unknown\n
27730 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
27740 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
27750 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20      catch {..   
27760 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
27770 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a  test_channel \..
27780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
27790 2d 2d 2d 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65  --- compile-time
277a0 20 6f 70 74 69 6f 6e 73 20 66 6f 72 20 53 51 4c   options for SQL
277b0 69 74 65 20 69 6e 74 65 72 6f 70 20 61 73 73 65  ite interop asse
277c0 6d 62 6c 79 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20  mbly... "....   
277d0 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
277e0 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  h {..           
277f0 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d   object invoke -
27800 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63  flags +NonPublic
27810 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
27820 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e      System.Data.
27830 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 33 20 49  SQLite.SQLite3 I
27840 6e 74 65 72 6f 70 43 6f 6d 70 69 6c 65 4f 70 74  nteropCompileOpt
27850 69 6f 6e 73 0d 0a 20 20 20 20 20 20 20 20 20 20  ions..          
27860 7d 20 63 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 73  } compileOptions
27870 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
27880 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
27890 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
278a0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5b 66  l [appendArgs [f
278b0 6f 72 6d 61 74 4c 69 73 74 20 5b 6c 73 6f 72 74  ormatList [lsort
278c0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
278d0 20 20 20 20 24 63 6f 6d 70 69 6c 65 4f 70 74 69      $compileOpti
278e0 6f 6e 73 5d 20 3c 6e 6f 6e 65 3e 5d 20 5c 6e 5d  ons] <none>] \n]
278f0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c  ..          } el
27900 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
27910 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
27920 63 68 61 6e 6e 65 6c 20 75 6e 6b 6e 6f 77 6e 5c  channel unknown\
27930 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  n..          }..
27940 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
27950 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
27960 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20 74 68 65  # NOTE: Show the
27970 20 61 63 74 69 76 65 20 74 65 73 74 20 63 6f 6e   active test con
27980 73 74 72 61 69 6e 74 73 2e 0d 0a 20 20 20 20 20  straints...     
27990 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70     #..        tp
279a0 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
279b0 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
279c0 22 2d 2d 2d 2d 20 63 6f 6e 73 74 72 61 69 6e 74  "---- constraint
279d0 73 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20  s: " \..        
279e0 20 20 20 20 5b 66 6f 72 6d 61 74 4c 69 73 74 20      [formatList 
279f0 5b 6c 73 6f 72 74 20 5b 67 65 74 43 6f 6e 73 74  [lsort [getConst
27a00 72 61 69 6e 74 73 5d 5d 20 3c 6e 6f 6e 65 3e 5d  raints]] <none>]
27a10 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20   \n]....        
27a20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
27a30 45 3a 20 53 61 76 65 20 74 68 65 20 74 65 73 74  E: Save the test
27a40 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 66 6f 72   constraints for
27a50 20 75 73 65 20 62 79 20 74 68 72 65 61 64 73 20   use by threads 
27a60 63 72 65 61 74 65 64 20 69 6e 20 74 68 69 73 0d  created in this.
27a70 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
27a80 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 64 6f 6d   application dom
27a90 61 69 6e 2e 20 20 54 68 69 73 20 69 73 20 6e 65  ain.  This is ne
27aa0 63 65 73 73 61 72 79 20 62 65 63 61 75 73 65 20  cessary because 
27ab0 61 6c 6c 20 74 68 65 20 45 61 67 6c 65 0d 0a 20  all the Eagle.. 
27ac0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 22         #       "
27ad0 74 65 73 74 20 63 6f 6e 74 65 78 74 22 20 69 6e  test context" in
27ae0 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 70 65 72  formation is per
27af0 2d 74 68 72 65 61 64 2e 0d 0a 20 20 20 20 20 20  -thread...      
27b00 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20    #..        if 
27b10 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
27b20 3a 74 65 73 74 5f 63 6f 6e 73 74 72 61 69 6e 74  :test_constraint
27b30 73 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  s]} then {..    
27b40 20 20 20 20 20 20 73 65 74 20 3a 3a 74 65 73 74        set ::test
27b50 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 24 3a 3a  _constraints $::
27b60 65 61 67 6c 65 5f 74 65 73 74 73 28 63 6f 6e 73  eagle_tests(cons
27b70 74 72 61 69 6e 74 73 29 0d 0a 20 20 20 20 20 20  traints)..      
27b80 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23    }....        #
27b90 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
27ba0 3a 20 4c 6f 61 64 20 74 68 65 20 22 61 66 74 65  : Load the "afte
27bb0 72 2d 63 6f 6e 73 74 72 61 69 6e 74 73 22 20 63  r-constraints" c
27bc0 75 73 74 6f 6d 20 70 65 72 2d 75 73 65 72 20 61  ustom per-user a
27bd0 6e 64 2f 6f 72 20 70 65 72 2d 68 6f 73 74 0d 0a  nd/or per-host..
27be0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
27bf0 74 65 73 74 20 73 65 74 74 69 6e 67 73 20 6e 6f  test settings no
27c00 77 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  w...        #.. 
27c10 20 20 20 20 20 20 20 75 70 6c 65 76 65 6c 20 31         uplevel 1
27c20 20 5b 6c 69 73 74 20 6c 6f 61 64 53 51 4c 69 74   [list loadSQLit
27c30 65 54 65 73 74 53 65 74 74 69 6e 67 73 20 24 3a  eTestSettings $:
27c40 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 2e 61  :test_channel .a
27c50 66 74 65 72 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  fter]....       
27c60 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
27c70 54 45 3a 20 49 66 20 6e 65 63 65 73 73 61 72 79  TE: If necessary
27c80 2c 20 65 6e 61 62 6c 65 20 73 68 61 72 65 64 2d  , enable shared-
27c90 63 61 63 68 65 20 6d 6f 64 65 20 6e 6f 77 2e 0d  cache mode now..
27ca0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
27cb0 20 20 20 20 69 66 20 7b 5b 68 61 73 52 75 6e 74      if {[hasRunt
27cc0 69 6d 65 4f 70 74 69 6f 6e 20 73 68 61 72 65 64  imeOption shared
27cd0 43 61 63 68 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a  Cache]} then {..
27ce0 20 20 20 20 20 20 20 20 20 20 65 6e 61 62 6c 65            enable
27cf0 53 68 61 72 65 64 43 61 63 68 65 20 24 3a 3a 74  SharedCache $::t
27d00 65 73 74 5f 63 68 61 6e 6e 65 6c 20 74 72 75 65  est_channel true
27d10 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
27d20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
27d30 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20 77    # NOTE: Show w
27d40 68 65 6e 20 6f 75 72 20 74 65 73 74 73 20 61 63  hen our tests ac
27d50 74 75 61 6c 6c 79 20 62 65 67 61 6e 20 28 6e 6f  tually began (no
27d60 77 29 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  w)...        #..
27d70 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
27d80 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
27d90 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
27da0 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 53           "---- S
27db0 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
27dc0 65 20 74 65 73 74 73 20 62 65 67 61 6e 20 61 74  e tests began at
27dd0 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   " \..          
27de0 20 20 5b 63 6c 6f 63 6b 20 66 6f 72 6d 61 74 20    [clock format 
27df0 5b 63 6c 6f 63 6b 20 73 65 63 6f 6e 64 73 5d 5d  [clock seconds]]
27e00 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20   \n]..      }.. 
27e10 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
27e20 63 20 72 75 6e 53 51 4c 69 74 65 54 65 73 74 46  c runSQLiteTestF
27e30 69 6c 65 73 50 72 6f 6c 6f 67 75 65 20 7b 7d 20  ilesPrologue {} 
27e40 7b 0d 0a 20 20 20 20 20 20 75 70 6c 65 76 65 6c  {..      uplevel
27e50 20 31 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d   1 {..        #.
27e60 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
27e70 20 53 65 74 75 70 20 74 68 65 20 76 61 72 69 61   Setup the varia
27e80 62 6c 65 73 20 74 68 61 74 20 72 65 66 65 72 20  bles that refer 
27e90 74 6f 20 74 68 65 20 76 61 72 69 6f 75 73 20 6e  to the various n
27ea0 6f 6e 2d 64 61 74 61 20 66 69 6c 65 73 0d 0a 20  on-data files.. 
27eb0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 72         #       r
27ec0 65 71 75 69 72 65 64 20 62 79 20 74 68 65 20 74  equired by the t
27ed0 65 73 74 73 20 69 6e 20 74 68 69 73 20 66 69 6c  ests in this fil
27ee0 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  e...        #.. 
27ef0 20 20 20 20 20 20 20 73 65 74 20 65 6e 74 69 74         set entit
27f00 79 46 72 61 6d 65 77 6f 72 6b 44 6c 6c 46 69 6c  yFrameworkDllFil
27f10 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
27f20 20 5b 67 65 74 42 75 69 6c 64 46 69 6c 65 4e 61   [getBuildFileNa
27f30 6d 65 20 45 6e 74 69 74 79 46 72 61 6d 65 77 6f  me EntityFramewo
27f40 72 6b 2e 64 6c 6c 20 66 61 6c 73 65 5d 0d 0a 0d  rk.dll false]...
27f50 0a 20 20 20 20 20 20 20 20 73 65 74 20 69 6e 73  .        set ins
27f60 74 61 6c 6c 65 72 45 78 65 46 69 6c 65 20 5c 0d  tallerExeFile \.
27f70 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65  .            [ge
27f80 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20 49  tBuildFileName I
27f90 6e 73 74 61 6c 6c 65 72 2e 65 78 65 20 66 61 6c  nstaller.exe fal
27fa0 73 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73  se]....        s
27fb0 65 74 20 73 71 6c 69 74 65 44 65 73 69 67 6e 65  et sqliteDesigne
27fc0 72 44 6c 6c 46 69 6c 65 20 5c 0d 0a 20 20 20 20  rDllFile \..    
27fd0 20 20 20 20 20 20 20 20 5b 67 65 74 42 75 69 6c          [getBuil
27fe0 64 46 69 6c 65 4e 61 6d 65 20 53 51 4c 69 74 65  dFileName SQLite
27ff0 2e 44 65 73 69 67 6e 65 72 2e 64 6c 6c 20 66 61  .Designer.dll fa
28000 6c 73 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  lse]....        
28010 73 65 74 20 73 79 73 74 65 6d 44 61 74 61 53 51  set systemDataSQ
28020 4c 69 74 65 44 6c 6c 46 69 6c 65 20 5c 0d 0a 20  LiteDllFile \.. 
28030 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 42             [getB
28040 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20 53 79 73  uildFileName Sys
28050 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
28060 64 6c 6c 20 66 61 6c 73 65 5d 0d 0a 0d 0a 20 20  dll false]....  
28070 20 20 20 20 20 20 73 65 74 20 73 79 73 74 65 6d        set system
28080 44 61 74 61 53 51 4c 69 74 65 4c 69 6e 71 44 6c  DataSQLiteLinqDl
28090 6c 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20  lFile \..       
280a0 20 20 20 20 20 5b 67 65 74 42 75 69 6c 64 46 69       [getBuildFi
280b0 6c 65 4e 61 6d 65 20 53 79 73 74 65 6d 2e 44 61  leName System.Da
280c0 74 61 2e 53 51 4c 69 74 65 2e 4c 69 6e 71 2e 64  ta.SQLite.Linq.d
280d0 6c 6c 20 66 61 6c 73 65 5d 0d 0a 0d 0a 20 20 20  ll false]....   
280e0 20 20 20 20 20 73 65 74 20 73 79 73 74 65 6d 44       set systemD
280f0 61 74 61 53 51 4c 69 74 65 45 66 36 44 6c 6c 46  ataSQLiteEf6DllF
28100 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ile \..         
28110 20 20 20 5b 67 65 74 42 75 69 6c 64 46 69 6c 65     [getBuildFile
28120 4e 61 6d 65 20 53 79 73 74 65 6d 2e 44 61 74 61  Name System.Data
28130 2e 53 51 4c 69 74 65 2e 45 46 36 2e 64 6c 6c 20  .SQLite.EF6.dll 
28140 66 61 6c 73 65 5d 0d 0a 0d 0a 20 20 20 20 20 20  false]....      
28150 20 20 73 65 74 20 74 65 73 74 45 78 65 46 69 6c    set testExeFil
28160 65 20 5b 67 65 74 42 75 69 6c 64 46 69 6c 65 4e  e [getBuildFileN
28170 61 6d 65 20 74 65 73 74 2e 65 78 65 20 66 61 6c  ame test.exe fal
28180 73 65 5d 0d 0a 20 20 20 20 20 20 20 20 73 65 74  se]..        set
28190 20 74 65 73 74 4c 69 6e 71 45 78 65 46 69 6c 65   testLinqExeFile
281a0 20 5b 67 65 74 42 75 69 6c 64 46 69 6c 65 4e 61   [getBuildFileNa
281b0 6d 65 20 74 65 73 74 6c 69 6e 71 2e 65 78 65 20  me testlinq.exe 
281c0 66 61 6c 73 65 5d 0d 0a 20 20 20 20 20 20 20 20  false]..        
281d0 73 65 74 20 74 65 73 74 45 66 36 45 78 65 46 69  set testEf6ExeFi
281e0 6c 65 20 5b 67 65 74 42 75 69 6c 64 46 69 6c 65  le [getBuildFile
281f0 4e 61 6d 65 20 74 65 73 74 65 66 36 2e 65 78 65  Name testef6.exe
28200 20 66 61 6c 73 65 5d 0d 0a 0d 0a 20 20 20 20 20   false]....     
28210 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
28220 4e 4f 54 45 3a 20 53 65 74 75 70 20 74 68 65 20  NOTE: Setup the 
28230 76 61 72 69 61 62 6c 65 73 20 74 68 61 74 20 72  variables that r
28240 65 66 65 72 20 74 6f 20 74 68 65 20 76 61 72 69  efer to the vari
28250 6f 75 73 20 64 61 74 61 20 66 69 6c 65 73 0d 0a  ous data files..
28260 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
28270 72 65 71 75 69 72 65 64 20 62 79 20 74 68 65 20  required by the 
28280 74 65 73 74 73 20 69 6e 20 74 68 69 73 20 66 69  tests in this fi
28290 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  le...        #..
282a0 20 20 20 20 20 20 20 20 73 65 74 20 74 65 73 74          set test
282b0 4c 69 6e 71 4f 75 74 46 69 6c 65 20 5b 66 69 6c  LinqOutFile [fil
282c0 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69  e nativename [fi
282d0 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20  le join \..     
282e0 20 20 20 20 20 20 20 5b 67 65 74 53 51 4c 69 74         [getSQLit
282f0 65 54 65 73 74 44 61 74 61 50 61 74 68 5d 20 74  eTestDataPath] t
28300 65 73 74 6c 69 6e 71 2e 6f 75 74 5d 5d 0d 0a 0d  estlinq.out]]...
28310 0a 20 20 20 20 20 20 20 20 73 65 74 20 6e 6f 72  .        set nor
28320 74 68 77 69 6e 64 45 66 44 62 46 69 6c 65 20 5b  thwindEfDbFile [
28330 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20  file nativename 
28340 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20  [file join \..  
28350 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20            [file 
28360 64 69 72 6e 61 6d 65 20 5b 66 69 6c 65 20 64 69  dirname [file di
28370 72 6e 61 6d 65 20 5b 67 65 74 53 51 4c 69 74 65  rname [getSQLite
28380 54 65 73 74 44 61 74 61 50 61 74 68 5d 5d 5d 20  TestDataPath]]] 
28390 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  \..            t
283a0 65 73 74 6c 69 6e 71 20 6e 6f 72 74 68 77 69 6e  estlinq northwin
283b0 64 45 46 2e 64 62 5d 5d 0d 0a 0d 0a 20 20 20 20  dEF.db]]....    
283c0 20 20 20 20 73 65 74 20 6e 6f 6e 57 61 6c 44 62      set nonWalDb
283d0 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69 76  File [file nativ
283e0 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e  ename [file join
283f0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
28400 5b 67 65 74 53 51 4c 69 74 65 54 65 73 74 44 61  [getSQLiteTestDa
28410 74 61 50 61 74 68 5d 20 6e 6f 6e 57 61 6c 2e 64  taPath] nonWal.d
28420 62 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73  b]]....        s
28430 65 74 20 77 61 6c 44 62 46 69 6c 65 20 5b 66 69  et walDbFile [fi
28440 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66  le nativename [f
28450 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20  ile join \..    
28460 20 20 20 20 20 20 20 20 5b 67 65 74 53 51 4c 69          [getSQLi
28470 74 65 54 65 73 74 44 61 74 61 50 61 74 68 5d 20  teTestDataPath] 
28480 77 61 6c 2e 64 62 5d 5d 0d 0a 0d 0a 20 20 20 20  wal.db]]....    
28490 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
284a0 20 4e 4f 54 45 3a 20 54 68 65 20 76 61 72 69 6f   NOTE: The vario
284b0 75 73 20 69 6e 73 74 61 6c 6c 2f 75 6e 69 6e 73  us install/unins
284c0 74 61 6c 6c 20 6c 6f 67 20 66 69 6c 65 73 20 75  tall log files u
284d0 73 65 64 20 74 6f 20 74 65 73 74 20 74 68 65 0d  sed to test the.
284e0 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
284f0 20 64 65 73 69 67 6e 2d 74 69 6d 65 20 63 6f 6d   design-time com
28500 70 6f 6e 65 6e 74 20 69 6e 73 74 61 6c 6c 65 72  ponent installer
28510 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
28520 20 20 20 20 20 20 73 65 74 20 74 65 73 74 49 6e        set testIn
28530 73 74 61 6c 6c 56 73 32 30 30 35 4c 6f 67 46 69  stallVs2005LogFi
28540 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e  le [file nativen
28550 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c  ame [file join \
28560 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 67  ..            [g
28570 65 74 53 51 4c 69 74 65 54 65 73 74 44 61 74 61  etSQLiteTestData
28580 50 61 74 68 5d 20 49 6e 73 74 61 6c 6c 65 72 5f  Path] Installer_
28590 54 65 73 74 5f 56 73 32 30 30 35 2e 6c 6f 67 5d  Test_Vs2005.log]
285a0 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74  ]....        set
285b0 20 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30   testInstallVs20
285c0 30 38 4c 6f 67 46 69 6c 65 20 5b 66 69 6c 65 20  08LogFile [file 
285d0 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65  nativename [file
285e0 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20   join \..       
285f0 20 20 20 20 20 5b 67 65 74 53 51 4c 69 74 65 54       [getSQLiteT
28600 65 73 74 44 61 74 61 50 61 74 68 5d 20 49 6e 73  estDataPath] Ins
28610 74 61 6c 6c 65 72 5f 54 65 73 74 5f 56 73 32 30  taller_Test_Vs20
28620 30 38 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20  08.log]]....    
28630 20 20 20 20 73 65 74 20 74 65 73 74 49 6e 73 74      set testInst
28640 61 6c 6c 56 73 32 30 31 30 4c 6f 67 46 69 6c 65  allVs2010LogFile
28650 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d   [file nativenam
28660 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a  e [file join \..
28670 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74              [get
28680 53 51 4c 69 74 65 54 65 73 74 44 61 74 61 50 61  SQLiteTestDataPa
28690 74 68 5d 20 49 6e 73 74 61 6c 6c 65 72 5f 54 65  th] Installer_Te
286a0 73 74 5f 56 73 32 30 31 30 2e 6c 6f 67 5d 5d 0d  st_Vs2010.log]].
286b0 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 74  ...        set t
286c0 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 31 32  estInstallVs2012
286d0 4c 6f 67 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61  LogFile [file na
286e0 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a  tivename [file j
286f0 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  oin \..         
28700 20 20 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73     [getSQLiteTes
28710 74 44 61 74 61 50 61 74 68 5d 20 49 6e 73 74 61  tDataPath] Insta
28720 6c 6c 65 72 5f 54 65 73 74 5f 56 73 32 30 31 32  ller_Test_Vs2012
28730 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20  .log]]....      
28740 20 20 73 65 74 20 74 65 73 74 49 6e 73 74 61 6c    set testInstal
28750 6c 56 73 32 30 31 33 4c 6f 67 46 69 6c 65 20 5b  lVs2013LogFile [
28760 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20  file nativename 
28770 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20  [file join \..  
28780 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 53 51            [getSQ
28790 4c 69 74 65 54 65 73 74 44 61 74 61 50 61 74 68  LiteTestDataPath
287a0 5d 20 49 6e 73 74 61 6c 6c 65 72 5f 54 65 73 74  ] Installer_Test
287b0 5f 56 73 32 30 31 33 2e 6c 6f 67 5d 5d 0d 0a 0d  _Vs2013.log]]...
287c0 0a 20 20 20 20 20 20 20 20 73 65 74 20 74 65 73  .        set tes
287d0 74 49 6e 73 74 61 6c 6c 56 73 32 30 31 35 4c 6f  tInstallVs2015Lo
287e0 67 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69  gFile [file nati
287f0 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69  vename [file joi
28800 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n \..           
28810 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73 74 44   [getSQLiteTestD
28820 61 74 61 50 61 74 68 5d 20 49 6e 73 74 61 6c 6c  ataPath] Install
28830 65 72 5f 54 65 73 74 5f 56 73 32 30 31 35 2e 6c  er_Test_Vs2015.l
28840 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  og]]....        
28850 73 65 74 20 74 65 73 74 55 6e 69 6e 73 74 61 6c  set testUninstal
28860 6c 56 73 32 30 30 35 4c 6f 67 46 69 6c 65 20 5b  lVs2005LogFile [
28870 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20  file nativename 
28880 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20  [file join \..  
28890 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 53 51            [getSQ
288a0 4c 69 74 65 54 65 73 74 44 61 74 61 50 61 74 68  LiteTestDataPath
288b0 5d 20 55 6e 69 6e 73 74 61 6c 6c 65 72 5f 54 65  ] Uninstaller_Te
288c0 73 74 5f 56 73 32 30 30 35 2e 6c 6f 67 5d 5d 0d  st_Vs2005.log]].
288d0 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 74  ...        set t
288e0 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30  estUninstallVs20
288f0 30 38 4c 6f 67 46 69 6c 65 20 5b 66 69 6c 65 20  08LogFile [file 
28900 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65  nativename [file
28910 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20   join \..       
28920 20 20 20 20 20 5b 67 65 74 53 51 4c 69 74 65 54       [getSQLiteT
28930 65 73 74 44 61 74 61 50 61 74 68 5d 20 55 6e 69  estDataPath] Uni
28940 6e 73 74 61 6c 6c 65 72 5f 54 65 73 74 5f 56 73  nstaller_Test_Vs
28950 32 30 30 38 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20  2008.log]]....  
28960 20 20 20 20 20 20 73 65 74 20 74 65 73 74 55 6e        set testUn
28970 69 6e 73 74 61 6c 6c 56 73 32 30 31 30 4c 6f 67  installVs2010Log
28980 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69 76  File [file nativ
28990 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e  ename [file join
289a0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
289b0 5b 67 65 74 53 51 4c 69 74 65 54 65 73 74 44 61  [getSQLiteTestDa
289c0 74 61 50 61 74 68 5d 20 55 6e 69 6e 73 74 61 6c  taPath] Uninstal
289d0 6c 65 72 5f 54 65 73 74 5f 56 73 32 30 31 30 2e  ler_Test_Vs2010.
289e0 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  log]]....       
289f0 20 73 65 74 20 74 65 73 74 55 6e 69 6e 73 74 61   set testUninsta
28a00 6c 6c 56 73 32 30 31 32 4c 6f 67 46 69 6c 65 20  llVs2012LogFile 
28a10 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65  [file nativename
28a20 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20   [file join \.. 
28a30 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 53             [getS
28a40 51 4c 69 74 65 54 65 73 74 44 61 74 61 50 61 74  QLiteTestDataPat
28a50 68 5d 20 55 6e 69 6e 73 74 61 6c 6c 65 72 5f 54  h] Uninstaller_T
28a60 65 73 74 5f 56 73 32 30 31 32 2e 6c 6f 67 5d 5d  est_Vs2012.log]]
28a70 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20  ....        set 
28a80 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32  testUninstallVs2
28a90 30 31 33 4c 6f 67 46 69 6c 65 20 5b 66 69 6c 65  013LogFile [file
28aa0 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c   nativename [fil
28ab0 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20  e join \..      
28ac0 20 20 20 20 20 20 5b 67 65 74 53 51 4c 69 74 65        [getSQLite
28ad0 54 65 73 74 44 61 74 61 50 61 74 68 5d 20 55 6e  TestDataPath] Un
28ae0 69 6e 73 74 61 6c 6c 65 72 5f 54 65 73 74 5f 56  installer_Test_V
28af0 73 32 30 31 33 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20  s2013.log]].... 
28b00 20 20 20 20 20 20 20 73 65 74 20 74 65 73 74 55         set testU
28b10 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31 35 4c 6f  ninstallVs2015Lo
28b20 67 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69  gFile [file nati
28b30 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69  vename [file joi
28b40 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n \..           
28b50 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73 74 44   [getSQLiteTestD
28b60 61 74 61 50 61 74 68 5d 20 55 6e 69 6e 73 74 61  ataPath] Uninsta
28b70 6c 6c 65 72 5f 54 65 73 74 5f 56 73 32 30 31 35  ller_Test_Vs2015
28b80 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20  .log]]....      
28b90 20 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23    ##############
28ba0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
28bb0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
28bc0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
28bd0 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20 20  #########....   
28be0 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43       if {![haveC
28bf0 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e  onstraint [appen
28c00 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20  dArgs file_ \.. 
28c10 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65             [file
28c20 20 74 61 69 6c 20 24 65 6e 74 69 74 79 46 72 61   tail $entityFra
28c30 6d 65 77 6f 72 6b 44 6c 6c 46 69 6c 65 5d 5d 5d  meworkDllFile]]]
28c40 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
28c50 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65      checkForFile
28c60 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24   $test_channel $
28c70 65 6e 74 69 74 79 46 72 61 6d 65 77 6f 72 6b 44  entityFrameworkD
28c80 6c 6c 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20  llFile..        
28c90 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20  }....        if 
28ca0 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e  {![haveConstrain
28cb0 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69  t [appendArgs fi
28cc0 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  le_ \..         
28cd0 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 69     [file tail $i
28ce0 6e 73 74 61 6c 6c 65 72 45 78 65 46 69 6c 65 5d  nstallerExeFile]
28cf0 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  ]]} then {..    
28d00 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69        checkForFi
28d10 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c  le $test_channel
28d20 20 24 69 6e 73 74 61 6c 6c 65 72 45 78 65 46 69   $installerExeFi
28d30 6c 65 20 49 6e 73 74 61 6c 6c 65 72 2e 65 78 65  le Installer.exe
28d40 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
28d50 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76         if {![hav
28d60 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70  eConstraint [app
28d70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d  endArgs file_ \.
28d80 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69  .            [fi
28d90 6c 65 20 74 61 69 6c 20 24 73 71 6c 69 74 65 44  le tail $sqliteD
28da0 65 73 69 67 6e 65 72 44 6c 6c 46 69 6c 65 5d 5d  esignerDllFile]]
28db0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
28dc0 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c       checkForFil
28dd0 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  e $test_channel 
28de0 24 73 71 6c 69 74 65 44 65 73 69 67 6e 65 72 44  $sqliteDesignerD
28df0 6c 6c 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20  llFile..        
28e00 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20  }....        if 
28e10 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e  {![haveConstrain
28e20 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69  t [appendArgs fi
28e30 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  le_ \..         
28e40 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 73     [file tail $s
28e50 79 73 74 65 6d 44 61 74 61 53 51 4c 69 74 65 44  ystemDataSQLiteD
28e60 6c 6c 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20  llFile]]]} then 
28e70 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68 65  {..          che
28e80 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f  ckForFile $test_
28e90 63 68 61 6e 6e 65 6c 20 24 73 79 73 74 65 6d 44  channel $systemD
28ea0 61 74 61 53 51 4c 69 74 65 44 6c 6c 46 69 6c 65  ataSQLiteDllFile
28eb0 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
28ec0 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76         if {![hav
28ed0 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70  eConstraint [app
28ee0 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d  endArgs file_ \.
28ef0 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69  .            [fi
28f00 6c 65 20 74 61 69 6c 20 24 73 79 73 74 65 6d 44  le tail $systemD
28f10 61 74 61 53 51 4c 69 74 65 4c 69 6e 71 44 6c 6c  ataSQLiteLinqDll
28f20 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d  File]]]} then {.
28f30 0a 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b  .          check
28f40 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68  ForFile $test_ch
28f50 61 6e 6e 65 6c 20 24 73 79 73 74 65 6d 44 61 74  annel $systemDat
28f60 61 53 51 4c 69 74 65 4c 69 6e 71 44 6c 6c 46 69  aSQLiteLinqDllFi
28f70 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  le..        }...
28f80 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68  .        if {![h
28f90 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61  aveConstraint [a
28fa0 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20  ppendArgs file_ 
28fb0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
28fc0 66 69 6c 65 20 74 61 69 6c 20 24 73 79 73 74 65  file tail $syste
28fd0 6d 44 61 74 61 53 51 4c 69 74 65 45 66 36 44 6c  mDataSQLiteEf6Dl
28fe0 6c 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b  lFile]]]} then {
28ff0 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68 65 63  ..          chec
29000 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63  kForFile $test_c
29010 68 61 6e 6e 65 6c 20 24 73 79 73 74 65 6d 44 61  hannel $systemDa
29020 74 61 53 51 4c 69 74 65 45 66 36 44 6c 6c 46 69  taSQLiteEf6DllFi
29030 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  le..        }...
29040 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68  .        if {![h
29050 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61  aveConstraint [a
29060 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20  ppendArgs file_ 
29070 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
29080 66 69 6c 65 20 74 61 69 6c 20 24 74 65 73 74 45  file tail $testE
29090 78 65 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20  xeFile]]]} then 
290a0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68 65  {..          che
290b0 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f  ckForFile $test_
290c0 63 68 61 6e 6e 65 6c 20 24 74 65 73 74 45 78 65  channel $testExe
290d0 46 69 6c 65 20 74 65 73 74 2e 65 78 65 0d 0a 20  File test.exe.. 
290e0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
290f0 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f      if {![haveCo
29100 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64  nstraint [append
29110 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20  Args file_ \..  
29120 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20            [file 
29130 74 61 69 6c 20 24 74 65 73 74 4c 69 6e 71 45 78  tail $testLinqEx
29140 65 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b  eFile]]]} then {
29150 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68 65 63  ..          chec
29160 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63  kForFile $test_c
29170 68 61 6e 6e 65 6c 20 24 74 65 73 74 4c 69 6e 71  hannel $testLinq
29180 45 78 65 46 69 6c 65 20 74 65 73 74 6c 69 6e 71  ExeFile testlinq
29190 2e 65 78 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d  .exe..        }.
291a0 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21  ...        if {!
291b0 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20  [haveConstraint 
291c0 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65  [appendArgs file
291d0 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  _ \..           
291e0 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 74 65 73   [file tail $tes
291f0 74 45 66 36 45 78 65 46 69 6c 65 5d 5d 5d 7d 20  tEf6ExeFile]]]} 
29200 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
29210 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24    checkForFile $
29220 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65  test_channel $te
29230 73 74 45 66 36 45 78 65 46 69 6c 65 20 74 65 73  stEf6ExeFile tes
29240 74 65 66 36 2e 65 78 65 0d 0a 20 20 20 20 20 20  tef6.exe..      
29250 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69    }....        i
29260 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61  f {![haveConstra
29270 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20  int [appendArgs 
29280 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20  file_ \..       
29290 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20       [file tail 
292a0 24 74 65 73 74 4c 69 6e 71 4f 75 74 46 69 6c 65  $testLinqOutFile
292b0 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ]]]} then {..   
292c0 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46         checkForF
292d0 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65  ile $test_channe
292e0 6c 20 24 74 65 73 74 4c 69 6e 71 4f 75 74 46 69  l $testLinqOutFi
292f0 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  le..        }...
29300 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68  .        if {![h
29310 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61  aveConstraint [a
29320 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20  ppendArgs file_ 
29330 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
29340 66 69 6c 65 20 74 61 69 6c 20 24 6e 6f 72 74 68  file tail $north
29350 77 69 6e 64 45 66 44 62 46 69 6c 65 5d 5d 5d 7d  windEfDbFile]]]}
29360 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
29370 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20     checkForFile 
29380 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 6e  $test_channel $n
29390 6f 72 74 68 77 69 6e 64 45 66 44 62 46 69 6c 65  orthwindEfDbFile
293a0 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
293b0 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76         if {![hav
293c0 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70  eConstraint [app
293d0 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d  endArgs file_ \.
293e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69  .            [fi
293f0 6c 65 20 74 61 69 6c 20 24 6e 6f 6e 57 61 6c 44  le tail $nonWalD
29400 62 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b  bFile]]]} then {
29410 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68 65 63  ..          chec
29420 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63  kForFile $test_c
29430 68 61 6e 6e 65 6c 20 24 6e 6f 6e 57 61 6c 44 62  hannel $nonWalDb
29440 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d  File..        }.
29450 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21  ...        if {!
29460 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20  [haveConstraint 
29470 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65  [appendArgs file
29480 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  _ \..           
29490 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 77 61 6c   [file tail $wal
294a0 44 62 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20  DbFile]]]} then 
294b0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68 65  {..          che
294c0 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f  ckForFile $test_
294d0 63 68 61 6e 6e 65 6c 20 24 77 61 6c 44 62 46 69  channel $walDbFi
294e0 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  le..        }...
294f0 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68  .        if {![h
29500 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61  aveConstraint [a
29510 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20  ppendArgs file_ 
29520 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
29530 66 69 6c 65 20 74 61 69 6c 20 24 74 65 73 74 49  file tail $testI
29540 6e 73 74 61 6c 6c 56 73 32 30 30 35 4c 6f 67 46  nstallVs2005LogF
29550 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a  ile]]]} then {..
29560 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 46            checkF
29570 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61  orFile $test_cha
29580 6e 6e 65 6c 20 24 74 65 73 74 49 6e 73 74 61 6c  nnel $testInstal
29590 6c 56 73 32 30 30 35 4c 6f 67 46 69 6c 65 0d 0a  lVs2005LogFile..
295a0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
295b0 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43       if {![haveC
295c0 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e  onstraint [appen
295d0 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20  dArgs file_ \.. 
295e0 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65             [file
295f0 20 74 61 69 6c 20 24 74 65 73 74 49 6e 73 74 61   tail $testInsta
29600 6c 6c 56 73 32 30 30 38 4c 6f 67 46 69 6c 65 5d  llVs2008LogFile]
29610 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  ]]} then {..    
29620 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69        checkForFi
29630 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c  le $test_channel
29640 20 24 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32   $testInstallVs2
29650 30 30 38 4c 6f 67 46 69 6c 65 0d 0a 20 20 20 20  008LogFile..    
29660 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
29670 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74   if {![haveConst
29680 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67  raint [appendArg
29690 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20  s file_ \..     
296a0 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69         [file tai
296b0 6c 20 24 74 65 73 74 49 6e 73 74 61 6c 6c 56 73  l $testInstallVs
296c0 32 30 31 30 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20  2010LogFile]]]} 
296d0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
296e0 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24    checkForFile $
296f0 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65  test_channel $te
29700 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 31 30 4c  stInstallVs2010L
29710 6f 67 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20  ogFile..        
29720 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20  }....        if 
29730 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e  {![haveConstrain
29740 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69  t [appendArgs fi
29750 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  le_ \..         
29760 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 74     [file tail $t
29770 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 31 32  estInstallVs2012
29780 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e  LogFile]]]} then
29790 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68   {..          ch
297a0 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74  eckForFile $test
297b0 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73 74 49 6e  _channel $testIn
297c0 73 74 61 6c 6c 56 73 32 30 31 32 4c 6f 67 46 69  stallVs2012LogFi
297d0 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  le..        }...
297e0 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68  .        if {![h
297f0 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61  aveConstraint [a
29800 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20  ppendArgs file_ 
29810 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
29820 66 69 6c 65 20 74 61 69 6c 20 24 74 65 73 74 49  file tail $testI
29830 6e 73 74 61 6c 6c 56 73 32 30 31 33 4c 6f 67 46  nstallVs2013LogF
29840 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a  ile]]]} then {..
29850 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 46            checkF
29860 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61  orFile $test_cha
29870 6e 6e 65 6c 20 24 74 65 73 74 49 6e 73 74 61 6c  nnel $testInstal
29880 6c 56 73 32 30 31 33 4c 6f 67 46 69 6c 65 0d 0a  lVs2013LogFile..
29890 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
298a0 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43       if {![haveC
298b0 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e  onstraint [appen
298c0 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20  dArgs file_ \.. 
298d0 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65             [file
298e0 20 74 61 69 6c 20 24 74 65 73 74 49 6e 73 74 61   tail $testInsta
298f0 6c 6c 56 73 32 30 31 35 4c 6f 67 46 69 6c 65 5d  llVs2015LogFile]
29900 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  ]]} then {..    
29910 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69        checkForFi
29920 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c  le $test_channel
29930 20 24 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32   $testInstallVs2
29940 30 31 35 4c 6f 67 46 69 6c 65 0d 0a 20 20 20 20  015LogFile..    
29950 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
29960 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74   if {![haveConst
29970 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67  raint [appendArg
29980 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20  s file_ \..     
29990 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69         [file tai
299a0 6c 20 24 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c  l $testUninstall
299b0 56 73 32 30 30 35 4c 6f 67 46 69 6c 65 5d 5d 5d  Vs2005LogFile]]]
299c0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
299d0 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65      checkForFile
299e0 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24   $test_channel $
299f0 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32  testUninstallVs2
29a00 30 30 35 4c 6f 67 46 69 6c 65 0d 0a 20 20 20 20  005LogFile..    
29a10 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
29a20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74   if {![haveConst
29a30 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67  raint [appendArg
29a40 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20  s file_ \..     
29a50 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69         [file tai
29a60 6c 20 24 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c  l $testUninstall
29a70 56 73 32 30 30 38 4c 6f 67 46 69 6c 65 5d 5d 5d  Vs2008LogFile]]]
29a80 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
29a90 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65      checkForFile
29aa0 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24   $test_channel $
29ab0 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32  testUninstallVs2
29ac0 30 30 38 4c 6f 67 46 69 6c 65 0d 0a 20 20 20 20  008LogFile..    
29ad0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
29ae0 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74   if {![haveConst
29af0 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67  raint [appendArg
29b00 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20  s file_ \..     
29b10 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69         [file tai
29b20 6c 20 24 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c  l $testUninstall
29b30 56 73 32 30 31 30 4c 6f 67 46 69 6c 65 5d 5d 5d  Vs2010LogFile]]]
29b40 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
29b50 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65      checkForFile
29b60 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24   $test_channel $
29b70 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32  testUninstallVs2
29b80 30 31 30 4c 6f 67 46 69 6c 65 0d 0a 20 20 20 20  010LogFile..    
29b90 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
29ba0 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74   if {![haveConst
29bb0 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67  raint [appendArg
29bc0 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20  s file_ \..     
29bd0 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69         [file tai
29be0 6c 20 24 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c  l $testUninstall
29bf0 56 73 32 30 31 32 4c 6f 67 46 69 6c 65 5d 5d 5d  Vs2012LogFile]]]
29c00 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
29c10 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65      checkForFile
29c20 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24   $test_channel $
29c30 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32  testUninstallVs2
29c40 30 31 32 4c 6f 67 46 69 6c 65 0d 0a 20 20 20 20  012LogFile..    
29c50 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
29c60 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74   if {![haveConst
29c70 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67  raint [appendArg
29c80 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20  s file_ \..     
29c90 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69         [file tai
29ca0 6c 20 24 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c  l $testUninstall
29cb0 56 73 32 30 31 33 4c 6f 67 46 69 6c 65 5d 5d 5d  Vs2013LogFile]]]
29cc0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
29cd0 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65      checkForFile
29ce0 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24   $test_channel $
29cf0 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32  testUninstallVs2
29d00 30 31 33 4c 6f 67 46 69 6c 65 0d 0a 20 20 20 20  013LogFile..    
29d10 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
29d20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74   if {![haveConst
29d30 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67  raint [appendArg
29d40 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20  s file_ \..     
29d50 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69         [file tai
29d60 6c 20 24 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c  l $testUninstall
29d70 56 73 32 30 31 35 4c 6f 67 46 69 6c 65 5d 5d 5d  Vs2015LogFile]]]
29d80 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
29d90 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65      checkForFile
29da0 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24   $test_channel $
29db0 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32  testUninstallVs2
29dc0 30 31 35 4c 6f 67 46 69 6c 65 0d 0a 20 20 20 20  015LogFile..    
29dd0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
29de0 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
29df0 6f 63 20 72 75 6e 53 51 4c 69 74 65 54 65 73 74  oc runSQLiteTest
29e00 46 69 6c 65 73 45 70 69 6c 6f 67 75 65 20 7b 7d  FilesEpilogue {}
29e10 20 7b 0d 0a 20 20 20 20 20 20 75 70 6c 65 76 65   {..      upleve
29e20 6c 20 31 20 7b 0d 0a 20 20 20 20 20 20 20 20 75  l 1 {..        u
29e30 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e  nset -nocomplain
29e40 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
29e50 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32  testUninstallVs2
29e60 30 31 35 4c 6f 67 46 69 6c 65 20 74 65 73 74 55  015LogFile testU
29e70 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31 33 4c 6f  ninstallVs2013Lo
29e80 67 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20  gFile \..       
29e90 20 20 20 20 20 74 65 73 74 55 6e 69 6e 73 74 61       testUninsta
29ea0 6c 6c 56 73 32 30 31 32 4c 6f 67 46 69 6c 65 20  llVs2012LogFile 
29eb0 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32  testUninstallVs2
29ec0 30 31 30 4c 6f 67 46 69 6c 65 20 5c 0d 0a 20 20  010LogFile \..  
29ed0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 55 6e            testUn
29ee0 69 6e 73 74 61 6c 6c 56 73 32 30 30 38 4c 6f 67  installVs2008Log
29ef0 46 69 6c 65 20 74 65 73 74 55 6e 69 6e 73 74 61  File testUninsta
29f00 6c 6c 56 73 32 30 30 35 4c 6f 67 46 69 6c 65 20  llVs2005LogFile 
29f10 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  \..            t
29f20 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 31 35  estInstallVs2015
29f30 4c 6f 67 46 69 6c 65 20 74 65 73 74 49 6e 73 74  LogFile testInst
29f40 61 6c 6c 56 73 32 30 31 33 4c 6f 67 46 69 6c 65  allVs2013LogFile
29f50 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
29f60 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 31  testInstallVs201
29f70 32 4c 6f 67 46 69 6c 65 20 74 65 73 74 49 6e 73  2LogFile testIns
29f80 74 61 6c 6c 56 73 32 30 31 30 4c 6f 67 46 69 6c  tallVs2010LogFil
29f90 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
29fa0 20 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30   testInstallVs20
29fb0 30 38 4c 6f 67 46 69 6c 65 20 74 65 73 74 49 6e  08LogFile testIn
29fc0 73 74 61 6c 6c 56 73 32 30 30 35 4c 6f 67 46 69  stallVs2005LogFi
29fd0 6c 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20 75 6e  le....        un
29fe0 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20  set -nocomplain 
29ff0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e  \..            n
2a000 6f 72 74 68 77 69 6e 64 45 66 44 62 46 69 6c 65  orthwindEfDbFile
2a010 20 74 65 73 74 4c 69 6e 71 4f 75 74 46 69 6c 65   testLinqOutFile
2a020 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
2a030 77 61 6c 44 62 46 69 6c 65 20 6e 6f 6e 57 61 6c  walDbFile nonWal
2a040 44 62 46 69 6c 65 0d 0a 0d 0a 20 20 20 20 20 20  DbFile....      
2a050 20 20 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c    unset -nocompl
2a060 61 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ain \..         
2a070 20 20 20 74 65 73 74 45 66 36 45 78 65 46 69 6c     testEf6ExeFil
2a080 65 20 74 65 73 74 4c 69 6e 71 45 78 65 46 69 6c  e testLinqExeFil
2a090 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
2a0a0 20 74 65 73 74 45 78 65 46 69 6c 65 20 73 79 73   testExeFile sys
2a0b0 74 65 6d 44 61 74 61 53 51 4c 69 74 65 45 66 36  temDataSQLiteEf6
2a0c0 44 6c 6c 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20  DllFile \..     
2a0d0 20 20 20 20 20 20 20 73 79 73 74 65 6d 44 61 74         systemDat
2a0e0 61 53 51 4c 69 74 65 4c 69 6e 71 44 6c 6c 46 69  aSQLiteLinqDllFi
2a0f0 6c 65 20 73 79 73 74 65 6d 44 61 74 61 53 51 4c  le systemDataSQL
2a100 69 74 65 44 6c 6c 46 69 6c 65 20 5c 0d 0a 20 20  iteDllFile \..  
2a110 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2a120 44 65 73 69 67 6e 65 72 44 6c 6c 46 69 6c 65 20  DesignerDllFile 
2a130 69 6e 73 74 61 6c 6c 65 72 45 78 65 46 69 6c 65  installerExeFile
2a140 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
2a150 65 6e 74 69 74 79 46 72 61 6d 65 77 6f 72 6b 44  entityFrameworkD
2a160 6c 6c 46 69 6c 65 0d 0a 20 20 20 20 20 20 7d 0d  llFile..      }.
2a170 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
2a180 72 6f 63 20 72 75 6e 53 51 4c 69 74 65 54 65 73  roc runSQLiteTes
2a190 74 45 70 69 6c 6f 67 75 65 20 7b 7d 20 7b 0d 0a  tEpilogue {} {..
2a1a0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
2a1b0 20 4e 4f 54 45 3a 20 53 6b 69 70 20 72 75 6e 6e   NOTE: Skip runn
2a1c0 69 6e 67 20 6f 75 72 20 63 75 73 74 6f 6d 20 65  ing our custom e
2a1d0 70 69 6c 6f 67 75 65 20 69 66 20 74 68 65 20 6d  pilogue if the m
2a1e0 61 69 6e 20 6f 6e 65 20 68 61 73 20 62 65 65 6e  ain one has been
2a1f0 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
2a200 73 6b 69 70 70 65 64 2e 0d 0a 20 20 20 20 20 20  skipped...      
2a210 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 69  #..      if {![i
2a220 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
2a230 65 70 69 6c 6f 67 75 65 2e 65 61 67 6c 65 29 5d  epilogue.eagle)]
2a240 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
2a250 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
2a260 4f 54 45 3a 20 53 68 6f 77 20 77 68 65 6e 20 6f  OTE: Show when o
2a270 75 72 20 74 65 73 74 73 20 61 63 74 75 61 6c 6c  ur tests actuall
2a280 79 20 65 6e 64 65 64 20 28 6e 6f 77 29 2e 0d 0a  y ended (now)...
2a290 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
2a2a0 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
2a2b0 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
2a2c0 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
2a2d0 20 20 20 20 22 2d 2d 2d 2d 20 53 79 73 74 65 6d      "---- System
2a2e0 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 74 65 73  .Data.SQLite tes
2a2f0 74 73 20 65 6e 64 65 64 20 61 74 20 22 20 5c 0d  ts ended at " \.
2a300 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 63 6c  .            [cl
2a310 6f 63 6b 20 66 6f 72 6d 61 74 20 5b 63 6c 6f 63  ock format [cloc
2a320 6b 20 73 65 63 6f 6e 64 73 5d 5d 20 5c 6e 5d 0d  k seconds]] \n].
2a330 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
2a340 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4c 6f        # NOTE: Lo
2a350 61 64 20 74 68 65 20 22 65 70 69 6c 6f 67 75 65  ad the "epilogue
2a360 22 20 63 75 73 74 6f 6d 20 70 65 72 2d 75 73 65  " custom per-use
2a370 72 20 61 6e 64 2f 6f 72 20 70 65 72 2d 68 6f 73  r and/or per-hos
2a380 74 20 74 65 73 74 0d 0a 20 20 20 20 20 20 20 20  t test..        
2a390 23 20 20 20 20 20 20 20 73 65 74 74 69 6e 67 73  #       settings
2a3a0 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 23   now...        #
2a3b0 0d 0a 20 20 20 20 20 20 20 20 75 70 6c 65 76 65  ..        upleve
2a3c0 6c 20 31 20 5b 6c 69 73 74 20 6c 6f 61 64 53 51  l 1 [list loadSQ
2a3d0 4c 69 74 65 54 65 73 74 53 65 74 74 69 6e 67 73  LiteTestSettings
2a3e0 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
2a3f0 20 2e 65 70 69 6c 6f 67 75 65 5d 0d 0a 0d 0a 20   .epilogue].... 
2a400 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
2a410 20 20 23 20 42 55 47 46 49 58 3a 20 42 65 66 6f    # BUGFIX: Befo
2a420 72 65 20 63 68 65 63 6b 69 6e 67 20 74 68 65 20  re checking the 
2a430 66 69 6e 61 6c 20 72 65 73 6f 75 72 63 65 73 20  final resources 
2a440 69 6e 20 75 73 65 20 62 79 20 53 51 4c 69 74 65  in use by SQLite
2a450 2c 20 6d 61 6b 65 0d 0a 20 20 20 20 20 20 20 20  , make..        
2a460 23 20 20 20 20 20 20 20 20 20 73 75 72 65 20 62  #         sure b
2a470 6f 74 68 20 6f 66 20 74 68 65 20 50 52 41 47 4d  oth of the PRAGM
2a480 41 20 72 65 6c 61 74 65 64 20 64 69 72 65 63 74  A related direct
2a490 6f 72 79 20 6e 61 6d 65 73 20 61 72 65 20 66 72  ory names are fr
2a4a0 65 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  eed...        #.
2a4b0 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f  .        checkFo
2a4c0 72 53 51 4c 69 74 65 44 69 72 65 63 74 6f 72 69  rSQLiteDirectori
2a4d0 65 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  es $::test_chann
2a4e0 65 6c 20 74 72 75 65 0d 0a 0d 0a 20 20 20 20 20  el true....     
2a4f0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
2a500 4e 4f 54 45 3a 20 41 6c 73 6f 20 72 65 70 6f 72  NOTE: Also repor
2a510 74 20 74 68 65 20 72 65 73 6f 75 72 63 65 20 75  t the resource u
2a520 73 61 67 65 20 61 66 74 65 72 20 72 75 6e 6e 69  sage after runni
2a530 6e 67 20 74 68 65 20 74 65 73 74 73 2e 0d 0a 20  ng the tests... 
2a540 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
2a550 20 20 72 65 70 6f 72 74 53 51 4c 69 74 65 52 65    reportSQLiteRe
2a560 73 6f 75 72 63 65 73 20 24 3a 3a 74 65 73 74 5f  sources $::test_
2a570 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20  channel....     
2a580 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
2a590 4e 4f 54 45 3a 20 52 65 70 6f 72 74 20 74 68 65  NOTE: Report the
2a5a0 20 63 72 69 74 69 63 61 6c 20 68 61 6e 64 6c 65   critical handle
2a5b0 20 63 6f 75 6e 74 73 20 61 66 74 65 72 20 72 75   counts after ru
2a5c0 6e 6e 69 6e 67 20 74 68 65 20 74 65 73 74 73 2e  nning the tests.
2a5d0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
2a5e0 20 20 20 20 20 67 65 74 53 51 4c 69 74 65 48 61       getSQLiteHa
2a5f0 6e 64 6c 65 43 6f 75 6e 74 73 20 24 3a 3a 74 65  ndleCounts $::te
2a600 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20  st_channel....  
2a610 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
2a620 20 23 20 4e 4f 54 45 3a 20 49 66 20 6e 65 63 65   # NOTE: If nece
2a630 73 73 61 72 79 2c 20 64 69 73 61 62 6c 65 20 73  ssary, disable s
2a640 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65  hared-cache mode
2a650 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 23   now...        #
2a660 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 68  ..        if {[h
2a670 61 73 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20  asRuntimeOption 
2a680 73 68 61 72 65 64 43 61 63 68 65 5d 7d 20 74 68  sharedCache]} th
2a690 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
2a6a0 65 6e 61 62 6c 65 53 68 61 72 65 64 43 61 63 68  enableSharedCach
2a6b0 65 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  e $::test_channe
2a6c0 6c 20 66 61 6c 73 65 0d 0a 20 20 20 20 20 20 20  l false..       
2a6d0 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20   }..      }..   
2a6e0 20 7d 0d 0a 0c 0d 0a 20 20 20 20 23 23 23 23 23   }.....    #####
2a6f0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2a700 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2a710 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2a720 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2a730 23 23 23 23 23 23 0d 0a 20 20 20 20 23 23 23 23  ######..    ####
2a740 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2a750 23 23 23 23 23 23 23 23 23 20 45 4e 44 20 45 61  ######### END Ea
2a760 67 6c 65 20 4f 4e 4c 59 20 23 23 23 23 23 23 23  gle ONLY #######
2a770 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2a780 23 23 23 23 23 23 23 0d 0a 20 20 20 20 23 23 23  #######..    ###
2a790 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2a7a0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2a7b0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2a7c0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2a7d0 23 23 23 23 23 23 23 23 0d 0a 20 20 7d 0d 0a 0d  ########..  }...
2a7e0 0a 20 20 23 0d 0a 20 20 23 20 4e 4f 54 45 3a 20  .  #..  # NOTE: 
2a7f0 53 61 76 65 20 74 68 65 20 6e 61 6d 65 20 6f 66  Save the name of
2a800 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 63   the directory c
2a810 6f 6e 74 61 69 6e 69 6e 67 20 74 68 69 73 20 66  ontaining this f
2a820 69 6c 65 2e 0d 0a 20 20 23 0d 0a 20 20 69 66 20  ile...  #..  if 
2a830 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 63  {![info exists c
2a840 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79 5d  ommon_directory]
2a850 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 73 65  } then {..    se
2a860 74 20 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f  t common_directo
2a870 72 79 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65  ry [file dirname
2a880 20 5b 69 6e 66 6f 20 73 63 72 69 70 74 5d 5d 0d   [info script]].
2a890 0a 20 20 7d 0d 0a 0d 0a 20 20 23 0d 0a 20 20 23  .  }....  #..  #
2a8a0 20 4e 4f 54 45 3a 20 50 72 6f 76 69 64 65 20 74   NOTE: Provide t
2a8b0 68 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  he System.Data.S
2a8c0 51 4c 69 74 65 20 74 65 73 74 20 70 61 63 6b 61  QLite test packa
2a8d0 67 65 20 74 6f 20 74 68 65 20 69 6e 74 65 72 70  ge to the interp
2a8e0 72 65 74 65 72 2e 0d 0a 20 20 23 0d 0a 20 20 70  reter...  #..  p
2a8f0 61 63 6b 61 67 65 20 70 72 6f 76 69 64 65 20 53  ackage provide S
2a900 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
2a910 65 2e 54 65 73 74 20 31 2e 30 0d 0a 7d 0d 0a     e.Test 1.0..}..