System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact e03e5a30cc78989b3072eb40b015be1f96bfbcc2:


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 54 65 73  .    proc getTes
99e0: 74 4f 76 65 72 72 69 64 65 73 50 72 65 61 6d 62  tOverridesPreamb
99f0: 6c 65 20 7b 20 7b 65 78 74 72 61 56 61 72 4e 61  le { {extraVarNa
9a00: 6d 65 73 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20  mes ""} } {..   
9a10: 20 20 20 73 65 74 20 76 61 72 4e 61 6d 65 73 20     set varNames 
9a20: 5b 6c 69 73 74 5d 0d 0a 0d 0a 20 20 20 20 20 20  [list]....      
9a30: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
9a40: 20 49 66 20 61 76 61 69 6c 61 62 6c 65 2c 20 73   If available, s
9a50: 74 61 72 74 20 77 69 74 68 20 74 68 65 20 6d 61  tart with the ma
9a60: 73 74 65 72 20 6c 69 73 74 20 6f 66 20 74 65 73  ster list of tes
9a70: 74 20 6f 76 65 72 72 69 64 65 0d 0a 20 20 20 20  t override..    
9a80: 20 20 23 20 20 20 20 20 20 20 76 61 72 69 61 62    #       variab
9a90: 6c 65 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  les...      #.. 
9aa0: 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65       if {[info e
9ab0: 78 69 73 74 73 20 3a 3a 74 65 73 74 5f 6f 76 65  xists ::test_ove
9ac0: 72 72 69 64 65 73 5d 20 26 26 20 5c 0d 0a 20 20  rrides] && \..  
9ad0: 20 20 20 20 20 20 20 20 5b 6c 6c 65 6e 67 74 68          [llength
9ae0: 20 24 3a 3a 74 65 73 74 5f 6f 76 65 72 72 69 64   $::test_overrid
9af0: 65 73 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  es] > 0} then {.
9b00: 0a 20 20 20 20 20 20 20 20 65 76 61 6c 20 6c 61  .        eval la
9b10: 70 70 65 6e 64 20 76 61 72 4e 61 6d 65 73 20 24  ppend varNames $
9b20: 3a 3a 74 65 73 74 5f 6f 76 65 72 72 69 64 65 73  ::test_overrides
9b30: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
9b40: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
9b50: 54 45 3a 20 49 66 20 72 65 71 75 65 73 74 65 64  TE: If requested
9b60: 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 2c 20   by our caller, 
9b70: 61 64 64 20 61 6e 79 20 61 64 64 69 74 69 6f 6e  add any addition
9b80: 61 6c 20 76 61 72 69 61 62 6c 65 0d 0a 20 20 20  al variable..   
9b90: 20 20 20 23 20 20 20 20 20 20 20 6e 61 6d 65 73     #       names
9ba0: 20 74 6f 20 63 6f 70 79 20 6e 6f 77 2e 0d 0a 20   to copy now... 
9bb0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
9bc0: 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 65 78 74 72   {[llength $extr
9bd0: 61 56 61 72 4e 61 6d 65 73 5d 20 3e 20 30 7d 20  aVarNames] > 0} 
9be0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
9bf0: 65 76 61 6c 20 6c 61 70 70 65 6e 64 20 76 61 72  eval lappend var
9c00: 4e 61 6d 65 73 20 24 65 78 74 72 61 56 61 72 4e  Names $extraVarN
9c10: 61 6d 65 73 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  ames..      }...
9c20: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
9c30: 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74 68  # NOTE: Build th
9c40: 65 20 73 63 72 69 70 74 20 66 72 61 67 6d 65 6e  e script fragmen
9c50: 74 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64  t to be returned
9c60: 20 62 79 20 70 72 6f 63 65 73 73 69 6e 67 20 65   by processing e
9c70: 61 63 68 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ach..      #    
9c80: 20 20 20 76 61 72 69 61 62 6c 65 20 6e 61 6d 65     variable name
9c90: 20 61 6e 64 20 61 64 64 69 6e 67 20 74 68 65 20   and adding the 
9ca0: 6e 65 63 65 63 65 73 73 61 72 79 20 73 63 72 69  nececessary scri
9cb0: 70 74 20 66 72 61 67 6d 65 6e 74 73 20 66 6f 72  pt fragments for
9cc0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
9cd0: 65 61 63 68 20 6f 6e 65 2e 0d 0a 20 20 20 20 20  each one...     
9ce0: 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 72 65   #..      set re
9cf0: 73 75 6c 74 20 22 22 0d 0a 0d 0a 20 20 20 20 20  sult ""....     
9d00: 20 66 6f 72 65 61 63 68 20 76 61 72 4e 61 6d 65   foreach varName
9d10: 20 24 76 61 72 4e 61 6d 65 73 20 7b 0d 0a 20 20   $varNames {..  
9d20: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
9d30: 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74   # NOTE: Build t
9d40: 68 65 20 71 75 61 6c 69 66 69 65 64 20 67 6c 6f  he qualified glo
9d50: 62 61 6c 20 76 61 72 69 61 62 6c 65 20 6e 61 6d  bal variable nam
9d60: 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  e...        #.. 
9d70: 20 20 20 20 20 20 20 73 65 74 20 66 75 6c 6c 56         set fullV
9d80: 61 72 4e 61 6d 65 20 5b 61 70 70 65 6e 64 41 72  arName [appendAr
9d90: 67 73 20 3a 3a 20 24 76 61 72 4e 61 6d 65 5d 0d  gs :: $varName].
9da0: 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
9db0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 44 6f        # NOTE: Do
9dc0: 65 73 20 74 68 65 20 76 61 72 69 61 62 6c 65 20  es the variable 
9dd0: 65 78 69 73 74 20 69 6e 20 74 68 69 73 20 69 6e  exist in this in
9de0: 74 65 72 70 72 65 74 65 72 20 63 6f 6e 74 65 78  terpreter contex
9df0: 74 3f 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  t?..        #.. 
9e00: 20 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f         if {[info
9e10: 20 65 78 69 73 74 73 20 24 66 75 6c 6c 56 61 72   exists $fullVar
9e20: 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  Name]} then {.. 
9e30: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
9e40: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 70        # NOTE: Ap
9e50: 70 65 6e 64 20 61 20 73 63 72 69 70 74 20 66 72  pend a script fr
9e60: 61 67 6d 65 6e 74 20 74 6f 20 74 68 65 20 72 65  agment to the re
9e70: 73 75 6c 74 20 74 68 61 74 20 77 69 6c 6c 20 63  sult that will c
9e80: 6f 72 72 65 63 74 6c 79 0d 0a 20 20 20 20 20 20  orrectly..      
9e90: 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 70 79      #       copy
9ea0: 20 61 6e 79 20 63 6f 6e 74 61 69 6e 65 64 20 76   any contained v
9eb0: 61 6c 75 65 20 74 6f 20 61 6e 6f 74 68 65 72 20  alue to another 
9ec0: 69 6e 74 65 72 70 72 65 74 65 72 20 63 6f 6e 74  interpreter cont
9ed0: 65 78 74 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ext...          
9ee0: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 61 70 70  #..          app
9ef0: 65 6e 64 20 72 65 73 75 6c 74 20 5c 6e 20 22 73  end result \n "s
9f00: 65 74 20 22 20 24 66 75 6c 6c 56 61 72 4e 61 6d  et " $fullVarNam
9f10: 65 20 22 20 5c 7b 22 20 5b 73 65 74 20 24 66 75  e " \{" [set $fu
9f20: 6c 6c 56 61 72 4e 61 6d 65 5d 20 5c 7d 0d 0a 20  llVarName] \}.. 
9f30: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
9f40: 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
9f50: 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 74      # NOTE: If t
9f60: 68 65 20 72 65 73 75 6c 74 20 63 6f 6e 74 61 69  he result contai
9f70: 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73  ns one or more s
9f80: 63 72 69 70 74 20 66 72 61 67 6d 65 6e 74 73 2c  cript fragments,
9f90: 20 61 70 70 65 6e 64 20 61 0d 0a 20 20 20 20 20   append a..     
9fa0: 20 23 20 20 20 20 20 20 20 6e 65 77 6c 69 6e 65   #       newline
9fb0: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
9fc0: 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
9fd0: 6e 67 74 68 20 24 72 65 73 75 6c 74 5d 20 3e 20  ngth $result] > 
9fe0: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
9ff0: 20 20 20 61 70 70 65 6e 64 20 72 65 73 75 6c 74     append result
a000: 20 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a   \n..      }....
a010: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 72 65        return $re
a020: 73 75 6c 74 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  sult..    }.....
a030: 20 20 20 20 70 72 6f 63 20 6d 6f 76 65 53 79 73      proc moveSys
a040: 74 65 6d 44 61 74 61 53 51 4c 69 74 65 44 6c 6c  temDataSQLiteDll
a050: 43 6f 6e 66 69 67 20 7b 20 7b 72 65 73 74 6f 72  Config { {restor
a060: 65 20 66 61 6c 73 65 7d 20 7b 76 65 72 62 6f 73  e false} {verbos
a070: 65 20 74 72 75 65 7d 20 7d 20 7b 0d 0a 20 20 20  e true} } {..   
a080: 20 20 20 73 65 74 20 64 69 72 65 63 74 6f 72 79     set directory
a090: 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20   [object invoke 
a0a0: 41 70 70 44 6f 6d 61 69 6e 20 43 75 72 72 65 6e  AppDomain Curren
a0b0: 74 44 6f 6d 61 69 6e 2e 42 61 73 65 44 69 72 65  tDomain.BaseDire
a0c0: 63 74 6f 72 79 5d 0d 0a 0d 0a 20 20 20 20 20 20  ctory]....      
a0d0: 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
a0e0: 74 68 20 24 64 69 72 65 63 74 6f 72 79 5d 20 3d  th $directory] =
a0f0: 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
a100: 20 20 20 20 20 69 66 20 7b 24 76 65 72 62 6f 73       if {$verbos
a110: 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  e} then {..     
a120: 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
a130: 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
a140: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
a150: 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6b          "---- sk
a160: 69 70 70 65 64 20 6d 6f 76 69 6e 67 20 5c 22 53  ipped moving \"S
a170: 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
a180: 65 2e 64 6c 6c 2e 63 6f 6e 66 69 67 5c 22 2c 20  e.dll.config\", 
a190: 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
a1a0: 20 20 20 22 6e 6f 20 62 61 73 65 20 64 69 72 65     "no base dire
a1b0: 63 74 6f 72 79 5c 6e 22 5d 0d 0a 20 20 20 20 20  ctory\n"]..     
a1c0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
a1d0: 72 65 74 75 72 6e 0d 0a 20 20 20 20 20 20 7d 0d  return..      }.
a1e0: 0a 0d 0a 20 20 20 20 20 20 73 65 74 20 66 69 6c  ...      set fil
a1f0: 65 4e 61 6d 65 28 31 29 20 5b 66 69 6c 65 20 6e  eName(1) [file n
a200: 6f 72 6d 61 6c 69 7a 65 20 5c 0d 0a 20 20 20 20  ormalize \..    
a210: 20 20 20 20 20 20 5b 66 69 6c 65 20 6a 6f 69 6e        [file join
a220: 20 24 64 69 72 65 63 74 6f 72 79 20 53 79 73 74   $directory Syst
a230: 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64  em.Data.SQLite.d
a240: 6c 6c 2e 63 6f 6e 66 69 67 5d 5d 0d 0a 0d 0a 20  ll.config]].... 
a250: 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d       set fileNam
a260: 65 28 32 29 20 5b 61 70 70 65 6e 64 41 72 67 73  e(2) [appendArgs
a270: 20 24 66 69 6c 65 4e 61 6d 65 28 31 29 20 2e 6d   $fileName(1) .m
a280: 6f 76 65 64 5d 0d 0a 0d 0a 20 20 20 20 20 20 69  oved]....      i
a290: 66 20 7b 24 72 65 73 74 6f 72 65 7d 20 74 68 65  f {$restore} the
a2a0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20  n {..        if 
a2b0: 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 66  {[file exists $f
a2c0: 69 6c 65 4e 61 6d 65 28 32 29 5d 7d 20 74 68 65  ileName(2)]} the
a2d0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 66  n {..          f
a2e0: 69 6c 65 20 72 65 6e 61 6d 65 20 24 66 69 6c 65  ile rename $file
a2f0: 4e 61 6d 65 28 32 29 20 24 66 69 6c 65 4e 61 6d  Name(2) $fileNam
a300: 65 28 31 29 0d 0a 0d 0a 20 20 20 20 20 20 20 20  e(1)....        
a310: 20 20 69 66 20 7b 24 76 65 72 62 6f 73 65 7d 20    if {$verbose} 
a320: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
a330: 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
a340: 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
a350: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
a360: 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6d           "---- m
a370: 6f 76 65 64 20 5c 22 22 20 24 66 69 6c 65 4e 61  oved \"" $fileNa
a380: 6d 65 28 32 29 20 22 5c 22 20 74 6f 20 5c 22 22  me(2) "\" to \""
a390: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
a3a0: 20 20 20 20 24 66 69 6c 65 4e 61 6d 65 28 31 29      $fileName(1)
a3b0: 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20   \"\n]..        
a3c0: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65    }..        } e
a3d0: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
a3e0: 20 69 66 20 7b 24 76 65 72 62 6f 73 65 7d 20 74   if {$verbose} t
a3f0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
a400: 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
a410: 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
a420: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
a430: 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6b          "---- sk
a440: 69 70 70 65 64 20 6d 6f 76 69 6e 67 20 5c 22 22  ipped moving \""
a450: 20 24 66 69 6c 65 4e 61 6d 65 28 32 29 20 5c 0d   $fileName(2) \.
a460: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a470: 20 22 5c 22 2c 20 69 74 20 64 6f 65 73 20 6e 6f   "\", it does no
a480: 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a 20 20 20  t exist\n"]..   
a490: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
a4a0: 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73    }..      } els
a4b0: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20  e {..        if 
a4c0: 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 66  {[file exists $f
a4d0: 69 6c 65 4e 61 6d 65 28 31 29 5d 7d 20 74 68 65  ileName(1)]} the
a4e0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 66  n {..          f
a4f0: 69 6c 65 20 72 65 6e 61 6d 65 20 24 66 69 6c 65  ile rename $file
a500: 4e 61 6d 65 28 31 29 20 24 66 69 6c 65 4e 61 6d  Name(1) $fileNam
a510: 65 28 32 29 0d 0a 0d 0a 20 20 20 20 20 20 20 20  e(2)....        
a520: 20 20 69 66 20 7b 24 76 65 72 62 6f 73 65 7d 20    if {$verbose} 
a530: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
a540: 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
a550: 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
a560: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
a570: 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6d           "---- m
a580: 6f 76 65 64 20 5c 22 22 20 24 66 69 6c 65 4e 61  oved \"" $fileNa
a590: 6d 65 28 31 29 20 22 5c 22 20 74 6f 20 5c 22 22  me(1) "\" to \""
a5a0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
a5b0: 20 20 20 20 24 66 69 6c 65 4e 61 6d 65 28 32 29      $fileName(2)
a5c0: 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20   \"\n]..        
a5d0: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65    }..        } e
a5e0: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
a5f0: 20 69 66 20 7b 24 76 65 72 62 6f 73 65 7d 20 74   if {$verbose} t
a600: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
a610: 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
a620: 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
a630: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
a640: 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6b          "---- sk
a650: 69 70 70 65 64 20 6d 6f 76 69 6e 67 20 5c 22 22  ipped moving \""
a660: 20 24 66 69 6c 65 4e 61 6d 65 28 31 29 20 5c 0d   $fileName(1) \.
a670: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a680: 20 22 5c 22 2c 20 69 74 20 64 6f 65 73 20 6e 6f   "\", it does no
a690: 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a 20 20 20  t exist\n"]..   
a6a0: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
a6b0: 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20    }..      }..  
a6c0: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
a6d0: 20 67 65 74 41 70 70 44 6f 6d 61 69 6e 50 72 65   getAppDomainPre
a6e0: 61 6d 62 6c 65 20 7b 20 7b 70 72 65 66 69 78 20  amble { {prefix 
a6f0: 22 22 7d 20 7b 73 75 66 66 69 78 20 22 22 7d 20  ""} {suffix ""} 
a700: 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
a710: 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73      # NOTE: This
a720: 20 70 72 6f 63 65 64 75 72 65 20 72 65 74 75 72   procedure retur
a730: 6e 73 20 61 20 74 65 73 74 20 73 65 74 75 70 20  ns a test setup 
a740: 73 63 72 69 70 74 20 66 72 61 67 6d 65 6e 74 20  script fragment 
a750: 73 75 69 74 61 62 6c 65 20 66 6f 72 0d 0a 20 20  suitable for..  
a760: 20 20 20 20 23 20 20 20 20 20 20 20 65 76 61 6c      #       eval
a770: 75 61 74 69 6f 6e 20 62 79 20 61 6e 20 69 6e 74  uation by an int
a780: 65 72 70 72 65 74 65 72 20 63 72 65 61 74 65 64  erpreter created
a790: 20 69 6e 20 61 6e 20 69 73 6f 6c 61 74 65 64 20   in an isolated 
a7a0: 61 70 70 6c 69 63 61 74 69 6f 6e 0d 0a 20 20 20  application..   
a7b0: 20 20 20 23 20 20 20 20 20 20 20 64 6f 6d 61 69     #       domai
a7c0: 6e 2e 20 20 54 68 65 20 73 63 72 69 70 74 20 66  n.  The script f
a7d0: 72 61 67 6d 65 6e 74 20 62 65 69 6e 67 20 72 65  ragment being re
a7e0: 74 75 72 6e 65 64 20 77 69 6c 6c 20 62 65 20 73  turned will be s
a7f0: 75 72 72 6f 75 6e 64 65 64 20 62 79 0d 0a 20 20  urrounded by..  
a800: 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20      #       the 
a810: 70 72 65 66 69 78 20 61 6e 64 20 73 75 66 66 69  prefix and suffi
a820: 78 20 22 73 63 72 69 70 74 20 66 72 61 67 6d 65  x "script fragme
a830: 6e 74 73 22 20 73 70 65 63 69 66 69 65 64 20 62  nts" specified b
a840: 79 20 6f 75 72 20 63 61 6c 6c 65 72 2c 0d 0a 20  y our caller,.. 
a850: 20 20 20 20 20 23 20 20 20 20 20 20 20 69 66 20       #       if 
a860: 61 6e 79 2e 20 20 54 68 65 20 65 6e 74 69 72 65  any.  The entire
a870: 20 73 63 72 69 70 74 20 62 65 69 6e 67 20 72 65   script being re
a880: 74 75 72 6e 65 64 20 77 69 6c 6c 20 62 65 20 73  turned will be s
a890: 75 62 73 74 69 74 75 74 65 64 20 76 69 61 0d 0a  ubstituted via..
a8a0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 5b 73        #       [s
a8b0: 75 62 73 74 5d 2c 20 69 6e 20 74 68 65 20 63 6f  ubst], in the co
a8c0: 6e 74 65 78 74 20 6f 66 20 6f 75 72 20 63 61 6c  ntext of our cal
a8d0: 6c 65 72 2c 20 62 65 66 6f 72 65 20 62 65 69 6e  ler, before bein
a8e0: 67 20 72 65 74 75 72 6e 65 64 2e 0d 0a 20 20 20  g returned...   
a8f0: 20 20 20 23 20 20 20 20 20 20 20 54 68 69 73 20     #       This 
a900: 73 74 65 70 20 69 73 20 6e 65 63 65 73 73 61 72  step is necessar
a910: 79 20 73 6f 20 74 68 61 74 20 73 6f 6d 65 20 6c  y so that some l
a920: 69 6d 69 74 65 64 20 63 6f 6e 74 65 78 74 20 69  imited context i
a930: 6e 66 6f 72 6d 61 74 69 6f 6e 2c 0d 0a 20 20 20  nformation,..   
a940: 20 20 20 23 20 20 20 20 20 20 20 70 72 69 6d 61     #       prima
a950: 72 69 6c 79 20 72 65 6c 61 74 65 64 20 74 6f 20  rily related to 
a960: 74 68 65 20 74 65 73 74 69 6e 67 20 64 69 72 65  the testing dire
a970: 63 74 6f 72 69 65 73 2c 20 63 61 6e 20 62 65 20  ctories, can be 
a980: 74 72 61 6e 73 66 65 72 72 65 64 0d 0a 20 20 20  transferred..   
a990: 20 20 20 23 20 20 20 20 20 20 20 74 6f 20 74 68     #       to th
a9a0: 65 20 69 6e 74 65 72 70 72 65 74 65 72 20 69 6e  e interpreter in
a9b0: 20 74 68 65 20 69 73 6f 6c 61 74 65 64 20 61 70   the isolated ap
a9c0: 70 6c 69 63 61 74 69 6f 6e 20 64 6f 6d 61 69 6e  plication domain
a9d0: 2c 20 6d 61 6b 69 6e 67 20 69 74 0d 0a 20 20 20  , making it..   
a9e0: 20 20 20 23 20 20 20 20 20 20 20 61 62 6c 65 20     #       able 
a9f0: 74 6f 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  to successfully 
aa00: 72 75 6e 20 74 65 73 74 73 20 74 68 61 74 20 72  run tests that r
aa10: 65 71 75 69 72 65 20 6f 6e 65 20 6f 72 20 6d 6f  equire one or mo
aa20: 72 65 20 6f 66 20 74 68 65 0d 0a 20 20 20 20 20  re of the..     
aa30: 20 23 20 20 20 20 20 20 20 66 69 6c 65 73 20 69   #       files i
aa40: 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 65 73  n one of the tes
aa50: 74 69 6e 67 20 64 69 72 65 63 74 6f 72 69 65 73  ting directories
aa60: 2e 20 20 43 61 6c 6c 65 72 73 20 73 68 6f 75 6c  .  Callers shoul
aa70: 64 20 6b 65 65 70 20 69 6e 0d 0a 20 20 20 20 20  d keep in..     
aa80: 20 23 20 20 20 20 20 20 20 6d 69 6e 64 20 74 68   #       mind th
aa90: 61 74 20 74 68 65 20 74 65 73 74 20 73 63 72 69  at the test scri
aaa0: 70 74 20 66 72 61 67 6d 65 6e 74 20 62 65 69 6e  pt fragment bein
aab0: 67 20 72 65 74 75 72 6e 65 64 20 63 61 6e 6e 6f  g returned canno
aac0: 74 20 72 65 6c 79 20 6f 6e 0d 0a 20 20 20 20 20  t rely on..     
aad0: 20 23 20 20 20 20 20 20 20 61 6e 79 20 73 63 72   #       any scr
aae0: 69 70 74 20 6c 69 62 72 61 72 79 20 70 72 6f 63  ipt library proc
aaf0: 65 64 75 72 65 73 20 74 68 61 74 20 61 72 65 20  edures that are 
ab00: 6e 6f 74 20 70 72 6f 76 69 64 65 64 20 62 79 20  not provided by 
ab10: 74 68 65 20 45 61 67 6c 65 0d 0a 20 20 20 20 20  the Eagle..     
ab20: 20 23 20 20 20 20 20 20 20 6c 69 62 72 61 72 79   #       library
ab30: 20 70 61 63 6b 61 67 65 20 28 69 2e 65 2e 20 22   package (i.e. "
ab40: 69 6e 69 74 2e 65 61 67 6c 65 22 29 2c 20 69 6e  init.eagle"), in
ab50: 63 6c 75 64 69 6e 67 20 74 68 6f 73 65 20 70 72  cluding those pr
ab60: 6f 76 69 64 65 64 20 62 79 0d 0a 20 20 20 20 20  ovided by..     
ab70: 20 23 20 20 20 20 20 20 20 74 68 65 20 45 61 67   #       the Eag
ab80: 6c 65 20 74 65 73 74 20 70 61 63 6b 61 67 65 2c  le test package,
ab90: 20 75 6e 6c 65 73 73 20 74 68 65 20 66 69 6c 65   unless the file
aba0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 6d   containing them
abb0: 20 69 73 20 6c 6f 61 64 65 64 0d 0a 20 20 20 20   is loaded..    
abc0: 20 20 23 20 20 20 20 20 20 20 6d 61 6e 75 61 6c    #       manual
abd0: 6c 79 20 76 69 61 20 73 6f 6d 65 20 6f 74 68 65  ly via some othe
abe0: 72 20 6d 65 63 68 61 6e 69 73 6d 20 28 65 2e 67  r mechanism (e.g
abf0: 2e 20 62 79 20 69 6e 63 6c 75 64 69 6e 67 20 61  . by including a
ac00: 70 70 72 6f 70 72 69 61 74 65 0d 0a 20 20 20 20  ppropriate..    
ac10: 20 20 23 20 20 20 20 20 20 20 5b 70 61 63 6b 61    #       [packa
ac20: 67 65 20 72 65 71 75 69 72 65 5d 20 6f 72 20 5b  ge require] or [
ac30: 73 6f 75 72 63 65 5d 20 63 6f 6d 6d 61 6e 64 73  source] commands
ac40: 20 69 6e 20 74 68 65 20 70 72 65 66 69 78 20 6f   in the prefix o
ac50: 72 20 73 75 66 66 69 78 0d 0a 20 20 20 20 20 20  r suffix..      
ac60: 23 20 20 20 20 20 20 20 73 63 72 69 70 74 20 66  #       script f
ac70: 72 61 67 6d 65 6e 74 73 29 2e 20 20 41 6c 73 6f  ragments).  Also
ac80: 2c 20 61 6c 6c 20 76 61 72 69 61 62 6c 65 20 72  , all variable r
ac90: 65 66 65 72 65 6e 63 65 73 20 61 6e 64 20 61 6c  eferences and al
aca0: 6c 20 6e 65 73 74 65 64 0d 0a 20 20 20 20 20 20  l nested..      
acb0: 23 20 20 20 20 20 20 20 63 6f 6d 6d 61 6e 64 73  #       commands
acc0: 20 28 69 2e 65 2e 20 74 68 6f 73 65 20 69 6e 20   (i.e. those in 
acd0: 73 71 75 61 72 65 20 62 72 61 63 6b 65 74 73 29  square brackets)
ace0: 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68   contained in th
acf0: 65 20 66 69 6e 61 6c 0d 0a 20 20 20 20 20 20 23  e final..      #
ad00: 20 20 20 20 20 20 20 73 63 72 69 70 74 20 66 72         script fr
ad10: 61 67 6d 65 6e 74 20 77 69 6c 6c 20 65 6e 64 20  agment will end 
ad20: 75 70 20 62 65 69 6e 67 20 65 76 61 6c 75 61 74  up being evaluat
ad30: 65 64 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 78  ed in the contex
ad40: 74 20 6f 66 20 74 68 65 0d 0a 20 20 20 20 20 20  t of the..      
ad50: 23 20 20 20 20 20 20 20 63 61 6c 6c 69 6e 67 20  #       calling 
ad60: 69 6e 74 65 72 70 72 65 74 65 72 20 61 6e 64 20  interpreter and 
ad70: 6e 6f 74 20 74 68 65 20 74 61 72 67 65 74 20 69  not the target i
ad80: 6e 74 65 72 70 72 65 74 65 72 20 63 72 65 61 74  nterpreter creat
ad90: 65 64 20 69 6e 20 74 68 65 0d 0a 20 20 20 20 20  ed in the..     
ada0: 20 23 20 20 20 20 20 20 20 69 73 6f 6c 61 74 65   #       isolate
adb0: 64 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 64 6f  d application do
adc0: 6d 61 69 6e 20 75 6e 6c 65 73 73 20 74 68 65 20  main unless the 
add0: 64 6f 6c 6c 61 72 20 73 69 67 6e 73 20 61 6e 64  dollar signs and
ade0: 2f 6f 72 20 73 71 75 61 72 65 0d 0a 20 20 20 20  /or square..    
adf0: 20 20 23 20 20 20 20 20 20 20 62 72 61 63 6b 65    #       bracke
ae00: 74 73 20 61 72 65 20 73 70 65 63 69 61 6c 6c 79  ts are specially
ae10: 20 71 75 6f 74 65 64 20 77 69 74 68 20 62 61 63   quoted with bac
ae20: 6b 73 6c 61 73 68 65 73 2e 0d 0a 20 20 20 20 20  kslashes...     
ae30: 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e   #..      return
ae40: 20 5b 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73   [uplevel 1 [lis
ae50: 74 20 73 75 62 73 74 20 5b 61 70 70 65 6e 64 41  t subst [appendA
ae60: 72 67 73 20 24 70 72 65 66 69 78 20 7b 0d 0a 20  rgs $prefix {.. 
ae70: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
ae80: 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 5c 5b    # NOTE: The \[
ae90: 6f 62 6a 65 63 74 5c 5d 20 63 6f 6d 6d 61 6e 64  object\] command
aea0: 20 6d 61 79 20 62 65 20 6d 69 73 73 69 6e 67 20   may be missing 
aeb0: 69 6e 20 73 6f 6d 65 20 45 61 67 6c 65 20 63 6f  in some Eagle co
aec0: 72 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  re..        #   
aed0: 20 20 20 20 6c 69 62 72 61 72 79 20 63 6f 6e 66      library conf
aee0: 69 67 75 72 61 74 69 6f 6e 73 2e 20 20 43 6c 6f  igurations.  Clo
aef0: 6e 69 6e 67 20 61 6e 64 20 75 73 69 6e 67 20 74  ning and using t
af00: 68 65 20 70 72 6f 63 65 64 75 72 65 0d 0a 20 20  he procedure..  
af10: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 5c 5b        #       \[
af20: 63 68 61 6e 67 65 4e 61 74 69 76 65 52 75 6e 74  changeNativeRunt
af30: 69 6d 65 4f 70 74 69 6f 6e 5c 5d 20 6d 61 79 20  imeOption\] may 
af40: 68 65 6c 70 20 74 6f 20 6d 69 74 69 67 61 74 65  help to mitigate
af50: 20 74 68 69 73 2e 0d 0a 20 20 20 20 20 20 20 20   this...        
af60: 23 0d 0a 20 20 20 20 20 20 20 20 70 72 6f 63 20  #..        proc 
af70: 63 68 61 6e 67 65 4e 61 74 69 76 65 52 75 6e 74  changeNativeRunt
af80: 69 6d 65 4f 70 74 69 6f 6e 20 5c 0d 0a 20 20 20  imeOption \..   
af90: 20 20 20 20 20 20 20 20 20 7b 5b 69 6e 66 6f 20           {[info 
afa0: 61 72 67 73 20 63 68 61 6e 67 65 4e 61 74 69 76  args changeNativ
afb0: 65 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 5d 7d  eRuntimeOption]}
afc0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
afd0: 7b 5b 69 6e 66 6f 20 62 6f 64 79 20 63 68 61 6e  {[info body chan
afe0: 67 65 4e 61 74 69 76 65 52 75 6e 74 69 6d 65 4f  geNativeRuntimeO
aff0: 70 74 69 6f 6e 5d 7d 0d 0a 0d 0a 20 20 20 20 20  ption]}....     
b000: 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20     catch {..    
b010: 20 20 20 20 20 20 63 68 61 6e 67 65 4e 61 74 69        changeNati
b020: 76 65 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20  veRuntimeOption 
b030: 5b 68 61 73 52 75 6e 74 69 6d 65 4f 70 74 69 6f  [hasRuntimeOptio
b040: 6e 20 6e 61 74 69 76 65 5d 0d 0a 20 20 20 20 20  n native]..     
b050: 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 5b 67     }..      } [g
b060: 65 74 54 65 73 74 4f 76 65 72 72 69 64 65 73 50  etTestOverridesP
b070: 72 65 61 6d 62 6c 65 20 5b 6c 69 73 74 20 70 61  reamble [list pa
b080: 74 68 20 74 65 73 74 5f 63 68 61 6e 6e 65 6c 5d  th test_channel]
b090: 5d 20 24 73 75 66 66 69 78 5d 5d 5d 0d 0a 20 20  ] $suffix]]]..  
b0a0: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
b0b0: 20 74 72 79 43 6f 70 79 45 78 74 65 72 6e 61 6c   tryCopyExternal
b0c0: 46 69 6c 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  File {..        
b0d0: 20 20 20 20 66 69 6c 65 4e 61 6d 65 20 7b 70 6c      fileName {pl
b0e0: 61 74 66 6f 72 6d 20 22 22 7d 20 7b 6e 65 77 46  atform ""} {newF
b0f0: 69 6c 65 4e 61 6d 65 20 22 22 7d 20 7b 76 65 72  ileName ""} {ver
b100: 62 6f 73 65 20 74 72 75 65 7d 20 7d 20 7b 0d 0a  bose true} } {..
b110: 20 20 20 20 20 20 73 65 74 20 73 6f 75 72 63 65        set source
b120: 46 69 6c 65 4e 61 6d 65 20 5b 67 65 74 45 78 74  FileName [getExt
b130: 65 72 6e 61 6c 46 69 6c 65 4e 61 6d 65 20 24 66  ernalFileName $f
b140: 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20  ileName]....    
b150: 20 20 69 66 20 7b 21 5b 66 69 6c 65 20 65 78 69    if {![file exi
b160: 73 74 73 20 24 73 6f 75 72 63 65 46 69 6c 65 4e  sts $sourceFileN
b170: 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ame]} then {..  
b180: 20 20 20 20 20 20 69 66 20 7b 24 76 65 72 62 6f        if {$verbo
b190: 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  se} then {..    
b1a0: 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
b1b0: 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
b1c0: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
b1d0: 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73           "---- s
b1e0: 6b 69 70 70 65 64 20 63 6f 70 79 69 6e 67 20 65  kipped copying e
b1f0: 78 74 65 72 6e 61 6c 20 66 69 6c 65 20 5c 22 22  xternal file \""
b200: 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65   $sourceFileName
b210: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
b220: 20 20 22 5c 22 2c 20 69 74 20 64 6f 65 73 20 6e    "\", it does n
b230: 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a 20 20  ot exist\n"]..  
b240: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
b250: 20 20 20 72 65 74 75 72 6e 0d 0a 20 20 20 20 20     return..     
b260: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b   }....      if {
b270: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
b280: 6e 65 77 46 69 6c 65 4e 61 6d 65 5d 20 3e 20 30  newFileName] > 0
b290: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
b2a0: 20 20 73 65 74 20 74 61 72 67 65 74 46 69 6c 65    set targetFile
b2b0: 4e 61 6d 65 20 5b 67 65 74 42 69 6e 61 72 79 46  Name [getBinaryF
b2c0: 69 6c 65 4e 61 6d 65 20 24 6e 65 77 46 69 6c 65  ileName $newFile
b2d0: 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 5d 0d  Name $platform].
b2e0: 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
b2f0: 0a 20 20 20 20 20 20 20 20 73 65 74 20 74 61 72  .        set tar
b300: 67 65 74 46 69 6c 65 4e 61 6d 65 20 5b 67 65 74  getFileName [get
b310: 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 24  BinaryFileName $
b320: 66 69 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f  fileName $platfo
b330: 72 6d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  rm]..      }....
b340: 20 20 20 20 20 20 73 65 74 20 74 61 72 67 65 74        set target
b350: 44 69 72 65 63 74 6f 72 79 20 5b 66 69 6c 65 20  Directory [file 
b360: 64 69 72 6e 61 6d 65 20 24 74 61 72 67 65 74 46  dirname $targetF
b370: 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20  ileName]....    
b380: 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
b390: 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 66 69          if {![fi
b3a0: 6c 65 20 65 78 69 73 74 73 20 24 74 61 72 67 65  le exists $targe
b3b0: 74 44 69 72 65 63 74 6f 72 79 5d 7d 20 74 68 65  tDirectory]} the
b3c0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 66  n {..          f
b3d0: 69 6c 65 20 6d 6b 64 69 72 20 24 74 61 72 67 65  ile mkdir $targe
b3e0: 74 44 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20  tDirectory..    
b3f0: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
b400: 20 66 69 6c 65 20 63 6f 70 79 20 2d 66 6f 72 63   file copy -forc
b410: 65 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d  e $sourceFileNam
b420: 65 20 24 74 61 72 67 65 74 46 69 6c 65 4e 61 6d  e $targetFileNam
b430: 65 0d 0a 20 20 20 20 20 20 7d 5d 20 3d 3d 20 30  e..      }] == 0
b440: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
b450: 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
b460: 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
b470: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
b480: 20 20 20 22 2d 2d 2d 2d 20 63 6f 70 69 65 64 20     "---- copied 
b490: 65 78 74 65 72 6e 61 6c 20 66 69 6c 65 20 66 72  external file fr
b4a0: 6f 6d 20 5c 22 22 20 24 73 6f 75 72 63 65 46 69  om \"" $sourceFi
b4b0: 6c 65 4e 61 6d 65 20 22 5c 22 20 74 6f 20 5c 22  leName "\" to \"
b4c0: 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
b4d0: 20 24 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65   $targetFileName
b4e0: 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 20   \"\n]..      } 
b4f0: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
b500: 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
b510: 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
b520: 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
b530: 20 22 2d 2d 2d 2d 20 66 61 69 6c 65 64 20 74 6f   "---- failed to
b540: 20 63 6f 70 79 20 65 78 74 65 72 6e 61 6c 20 66   copy external f
b550: 69 6c 65 20 66 72 6f 6d 20 5c 22 22 20 24 73 6f  ile from \"" $so
b560: 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 5c 0d 0a  urceFileName \..
b570: 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 20              "\" 
b580: 74 6f 20 5c 22 22 20 24 74 61 72 67 65 74 46 69  to \"" $targetFi
b590: 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20  leName \"\n]..  
b5a0: 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
b5b0: 0a 20 20 20 20 70 72 6f 63 20 74 72 79 43 6f 70  .    proc tryCop
b5c0: 79 42 69 6e 61 72 79 46 69 6c 65 20 7b 0d 0a 20  yBinaryFile {.. 
b5d0: 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 4e             fileN
b5e0: 61 6d 65 20 6d 61 6e 61 67 65 64 4f 6e 6c 79 20  ame managedOnly 
b5f0: 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20 7b 6e  {platform ""} {n
b600: 65 77 46 69 6c 65 4e 61 6d 65 20 22 22 7d 0d 0a  ewFileName ""}..
b610: 20 20 20 20 20 20 20 20 20 20 20 20 7b 76 65 72              {ver
b620: 62 6f 73 65 20 74 72 75 65 7d 20 7d 20 7b 0d 0a  bose true} } {..
b630: 20 20 20 20 20 20 73 65 74 20 73 6f 75 72 63 65        set source
b640: 46 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42 69 6e  FileName [getBin
b650: 61 72 79 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c  aryFileName $fil
b660: 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 5d  eName $platform]
b670: 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b  ....      if {![
b680: 66 69 6c 65 20 65 78 69 73 74 73 20 24 73 6f 75  file exists $sou
b690: 72 63 65 46 69 6c 65 4e 61 6d 65 5d 7d 20 74 68  rceFileName]} th
b6a0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66  en {..        if
b6b0: 20 7b 24 76 65 72 62 6f 73 65 7d 20 74 68 65 6e   {$verbose} then
b6c0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70   {..          tp
b6d0: 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
b6e0: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
b6f0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
b700: 20 22 2d 2d 2d 2d 20 73 6b 69 70 70 65 64 20 63   "---- skipped c
b710: 6f 70 79 69 6e 67 20 62 69 6e 61 72 79 20 66 69  opying binary fi
b720: 6c 65 20 5c 22 22 20 24 73 6f 75 72 63 65 46 69  le \"" $sourceFi
b730: 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20  leName \..      
b740: 20 20 20 20 20 20 20 20 22 5c 22 2c 20 69 74 20          "\", it 
b750: 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 5c 6e  does not exist\n
b760: 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  "]..        }...
b770: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 0d  .        return.
b780: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
b790: 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
b7a0: 6e 67 74 68 20 24 6e 65 77 46 69 6c 65 4e 61 6d  ngth $newFileNam
b7b0: 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  e] > 0} then {..
b7c0: 20 20 20 20 20 20 20 20 73 65 74 20 74 61 72 67          set targ
b7d0: 65 74 46 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42  etFileName [getB
b7e0: 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20 5c 0d 0a  uildFileName \..
b7f0: 20 20 20 20 20 20 20 20 20 20 20 20 24 6e 65 77              $new
b800: 46 69 6c 65 4e 61 6d 65 20 24 6d 61 6e 61 67 65  FileName $manage
b810: 64 4f 6e 6c 79 20 24 70 6c 61 74 66 6f 72 6d 5d  dOnly $platform]
b820: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
b830: 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 74 61  ..        set ta
b840: 72 67 65 74 46 69 6c 65 4e 61 6d 65 20 5b 67 65  rgetFileName [ge
b850: 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20 5c  tBuildFileName \
b860: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 24 66  ..            $f
b870: 69 6c 65 4e 61 6d 65 20 24 6d 61 6e 61 67 65 64  ileName $managed
b880: 4f 6e 6c 79 20 24 70 6c 61 74 66 6f 72 6d 5d 0d  Only $platform].
b890: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
b8a0: 20 20 73 65 74 20 74 61 72 67 65 74 44 69 72 65    set targetDire
b8b0: 63 74 6f 72 79 20 5b 66 69 6c 65 20 64 69 72 6e  ctory [file dirn
b8c0: 61 6d 65 20 24 74 61 72 67 65 74 46 69 6c 65 4e  ame $targetFileN
b8d0: 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66  ame]....      if
b8e0: 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
b8f0: 20 20 20 20 69 66 20 7b 21 5b 66 69 6c 65 20 65      if {![file e
b900: 78 69 73 74 73 20 24 74 61 72 67 65 74 44 69 72  xists $targetDir
b910: 65 63 74 6f 72 79 5d 7d 20 74 68 65 6e 20 7b 0d  ectory]} then {.
b920: 0a 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20  .          file 
b930: 6d 6b 64 69 72 20 24 74 61 72 67 65 74 44 69 72  mkdir $targetDir
b940: 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 20 20  ectory..        
b950: 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 66 69 6c  }....        fil
b960: 65 20 63 6f 70 79 20 2d 66 6f 72 63 65 20 24 73  e copy -force $s
b970: 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 24 74  ourceFileName $t
b980: 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 0d 0a 20  argetFileName.. 
b990: 20 20 20 20 20 7d 5d 20 3d 3d 20 30 7d 20 74 68       }] == 0} th
b9a0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70  en {..        tp
b9b0: 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
b9c0: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
b9d0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  \..            "
b9e0: 2d 2d 2d 2d 20 63 6f 70 69 65 64 20 62 69 6e 61  ---- copied bina
b9f0: 72 79 20 66 69 6c 65 20 66 72 6f 6d 20 5c 22 22  ry file from \""
ba00: 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65   $sourceFileName
ba10: 20 22 5c 22 20 74 6f 20 5c 22 22 20 5c 0d 0a 20   "\" to \"" \.. 
ba20: 20 20 20 20 20 20 20 20 20 20 20 24 74 61 72 67             $targ
ba30: 65 74 46 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d  etFileName \"\n]
ba40: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
ba50: 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
ba60: 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
ba70: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
ba80: 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
ba90: 20 66 61 69 6c 65 64 20 74 6f 20 63 6f 70 79 20   failed to copy 
baa0: 62 69 6e 61 72 79 20 66 69 6c 65 20 66 72 6f 6d  binary file from
bab0: 20 5c 22 22 20 24 73 6f 75 72 63 65 46 69 6c 65   \"" $sourceFile
bac0: 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  Name \..        
bad0: 20 20 20 20 22 5c 22 20 74 6f 20 5c 22 22 20 24      "\" to \"" $
bae0: 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 20 5c  targetFileName \
baf0: 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  "\n]..      }.. 
bb00: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
bb10: 63 20 74 72 79 43 6f 70 79 42 75 69 6c 64 46 69  c tryCopyBuildFi
bb20: 6c 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  le {..          
bb30: 20 20 66 69 6c 65 4e 61 6d 65 20 6d 61 6e 61 67    fileName manag
bb40: 65 64 4f 6e 6c 79 20 7b 70 6c 61 74 66 6f 72 6d  edOnly {platform
bb50: 20 22 22 7d 20 7b 6e 65 77 46 69 6c 65 4e 61 6d   ""} {newFileNam
bb60: 65 20 22 22 7d 0d 0a 20 20 20 20 20 20 20 20 20  e ""}..         
bb70: 20 20 20 7b 76 65 72 62 6f 73 65 20 74 72 75 65     {verbose true
bb80: 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74  } } {..      set
bb90: 20 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20   sourceFileName 
bba0: 5b 67 65 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d  [getBuildFileNam
bbb0: 65 20 24 66 69 6c 65 4e 61 6d 65 20 24 6d 61 6e  e $fileName $man
bbc0: 61 67 65 64 4f 6e 6c 79 20 24 70 6c 61 74 66 6f  agedOnly $platfo
bbd0: 72 6d 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20  rm]....      if 
bbe0: 7b 21 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24  {![file exists $
bbf0: 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 5d 7d  sourceFileName]}
bc00: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
bc10: 20 69 66 20 7b 24 76 65 72 62 6f 73 65 7d 20 74   if {$verbose} t
bc20: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
bc30: 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
bc40: 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
bc50: 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
bc60: 20 20 20 20 22 2d 2d 2d 2d 20 73 6b 69 70 70 65      "---- skippe
bc70: 64 20 63 6f 70 79 69 6e 67 20 62 75 69 6c 64 20  d copying build 
bc80: 66 69 6c 65 20 5c 22 22 20 24 73 6f 75 72 63 65  file \"" $source
bc90: 46 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20  FileName \..    
bca0: 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c 20 69            "\", i
bcb0: 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  t does not exist
bcc0: 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d  \n"]..        }.
bcd0: 0a 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ...        retur
bce0: 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  n..      }....  
bcf0: 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
bd00: 6c 65 6e 67 74 68 20 24 6e 65 77 46 69 6c 65 4e  length $newFileN
bd10: 61 6d 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ame] > 0} then {
bd20: 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 74 61  ..        set ta
bd30: 72 67 65 74 46 69 6c 65 4e 61 6d 65 20 5b 67 65  rgetFileName [ge
bd40: 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20  tBinaryFileName 
bd50: 24 6e 65 77 46 69 6c 65 4e 61 6d 65 20 24 70 6c  $newFileName $pl
bd60: 61 74 66 6f 72 6d 5d 0d 0a 20 20 20 20 20 20 7d  atform]..      }
bd70: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
bd80: 20 73 65 74 20 74 61 72 67 65 74 46 69 6c 65 4e   set targetFileN
bd90: 61 6d 65 20 5b 67 65 74 42 69 6e 61 72 79 46 69  ame [getBinaryFi
bda0: 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65  leName $fileName
bdb0: 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a 20 20 20   $platform]..   
bdc0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 73 65     }....      se
bdd0: 74 20 74 61 72 67 65 74 44 69 72 65 63 74 6f 72  t targetDirector
bde0: 79 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20  y [file dirname 
bdf0: 24 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 5d  $targetFileName]
be00: 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63  ....      if {[c
be10: 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
be20: 69 66 20 7b 21 5b 66 69 6c 65 20 65 78 69 73 74  if {![file exist
be30: 73 20 24 74 61 72 67 65 74 44 69 72 65 63 74 6f  s $targetDirecto
be40: 72 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ry]} then {..   
be50: 20 20 20 20 20 20 20 66 69 6c 65 20 6d 6b 64 69         file mkdi
be60: 72 20 24 74 61 72 67 65 74 44 69 72 65 63 74 6f  r $targetDirecto
be70: 72 79 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  ry..        }...
be80: 0a 20 20 20 20 20 20 20 20 66 69 6c 65 20 63 6f  .        file co
be90: 70 79 20 2d 66 6f 72 63 65 20 24 73 6f 75 72 63  py -force $sourc
bea0: 65 46 69 6c 65 4e 61 6d 65 20 24 74 61 72 67 65  eFileName $targe
beb0: 74 46 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20  tFileName..     
bec0: 20 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b   }] == 0} then {
bed0: 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
bee0: 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
bef0: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
bf00: 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
bf10: 20 63 6f 70 69 65 64 20 62 75 69 6c 64 20 66 69   copied build fi
bf20: 6c 65 20 66 72 6f 6d 20 5c 22 22 20 24 73 6f 75  le from \"" $sou
bf30: 72 63 65 46 69 6c 65 4e 61 6d 65 20 22 5c 22 20  rceFileName "\" 
bf40: 74 6f 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20  to \"" \..      
bf50: 20 20 20 20 20 20 24 74 61 72 67 65 74 46 69 6c        $targetFil
bf60: 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20  eName \"\n]..   
bf70: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
bf80: 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
bf90: 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
bfa0: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
bfb0: 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 61 69 6c        "---- fail
bfc0: 65 64 20 74 6f 20 63 6f 70 79 20 62 75 69 6c 64  ed to copy build
bfd0: 20 66 69 6c 65 20 66 72 6f 6d 20 5c 22 22 20 24   file from \"" $
bfe0: 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 5c  sourceFileName \
bff0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 5c  ..            "\
c000: 22 20 74 6f 20 5c 22 22 20 24 74 61 72 67 65 74  " to \"" $target
c010: 46 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a  FileName \"\n]..
c020: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
c030: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 74 72 79 44  ...    proc tryD
c040: 65 6c 65 74 65 42 69 6e 61 72 79 46 69 6c 65 20  eleteBinaryFile 
c050: 7b 20 66 69 6c 65 4e 61 6d 65 20 7b 70 6c 61 74  { fileName {plat
c060: 66 6f 72 6d 20 22 22 7d 20 7b 76 65 72 62 6f 73  form ""} {verbos
c070: 65 20 74 72 75 65 7d 20 7d 20 7b 0d 0a 20 20 20  e true} } {..   
c080: 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 20     set fileName 
c090: 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61  [getBinaryFileNa
c0a0: 6d 65 20 24 66 69 6c 65 4e 61 6d 65 20 24 70 6c  me $fileName $pl
c0b0: 61 74 66 6f 72 6d 5d 0d 0a 0d 0a 20 20 20 20 20  atform]....     
c0c0: 20 69 66 20 7b 21 5b 66 69 6c 65 20 65 78 69 73   if {![file exis
c0d0: 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74  ts $fileName]} t
c0e0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69  hen {..        i
c0f0: 66 20 7b 24 76 65 72 62 6f 73 65 7d 20 74 68 65  f {$verbose} the
c100: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74  n {..          t
c110: 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
c120: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
c130: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
c140: 20 20 22 2d 2d 2d 2d 20 73 6b 69 70 70 65 64 20    "---- skipped 
c150: 64 65 6c 65 74 69 6e 67 20 62 69 6e 61 72 79 20  deleting binary 
c160: 66 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e 61  file \"" $fileNa
c170: 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  me \..          
c180: 20 20 20 20 22 5c 22 2c 20 69 74 20 64 6f 65 73      "\", it does
c190: 20 6e 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a   not exist\n"]..
c1a0: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
c1b0: 20 20 20 20 20 72 65 74 75 72 6e 0d 0a 20 20 20       return..   
c1c0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66     }....      if
c1d0: 20 7b 5b 63 61 74 63 68 20 7b 66 69 6c 65 20 64   {[catch {file d
c1e0: 65 6c 65 74 65 20 24 66 69 6c 65 4e 61 6d 65 7d  elete $fileName}
c1f0: 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
c200: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
c210: 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
c220: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
c230: 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 64           "---- d
c240: 65 6c 65 74 65 64 20 62 69 6e 61 72 79 20 66 69  eleted binary fi
c250: 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65  le \"" $fileName
c260: 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 20   \"\n]..      } 
c270: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
c280: 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
c290: 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
c2a0: 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
c2b0: 20 22 2d 2d 2d 2d 20 66 61 69 6c 65 64 20 74 6f   "---- failed to
c2c0: 20 64 65 6c 65 74 65 20 62 69 6e 61 72 79 20 66   delete 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: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
c300: 70 72 6f 63 20 74 72 79 44 65 6c 65 74 65 42 75  proc tryDeleteBu
c310: 69 6c 64 46 69 6c 65 20 7b 0d 0a 20 20 20 20 20  ildFile {..     
c320: 20 20 20 20 20 20 20 66 69 6c 65 4e 61 6d 65 20         fileName 
c330: 6d 61 6e 61 67 65 64 4f 6e 6c 79 20 7b 70 6c 61  managedOnly {pla
c340: 74 66 6f 72 6d 20 22 22 7d 20 7b 76 65 72 62 6f  tform ""} {verbo
c350: 73 65 20 74 72 75 65 7d 20 7d 20 7b 0d 0a 20 20  se true} } {..  
c360: 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65      set fileName
c370: 20 5b 67 65 74 42 75 69 6c 64 46 69 6c 65 4e 61   [getBuildFileNa
c380: 6d 65 20 24 66 69 6c 65 4e 61 6d 65 20 24 6d 61  me $fileName $ma
c390: 6e 61 67 65 64 4f 6e 6c 79 20 24 70 6c 61 74 66  nagedOnly $platf
c3a0: 6f 72 6d 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66  orm]....      if
c3b0: 20 7b 21 5b 66 69 6c 65 20 65 78 69 73 74 73 20   {![file exists 
c3c0: 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e  $fileName]} then
c3d0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   {..        if {
c3e0: 24 76 65 72 62 6f 73 65 7d 20 74 68 65 6e 20 7b  $verbose} then {
c3f0: 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74  ..          tput
c400: 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
c410: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
c420: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
c430: 2d 2d 2d 2d 20 73 6b 69 70 70 65 64 20 64 65 6c  ---- skipped del
c440: 65 74 69 6e 67 20 62 75 69 6c 64 20 66 69 6c 65  eting build file
c450: 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c   \"" $fileName \
c460: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
c470: 22 5c 22 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74  "\", it does not
c480: 20 65 78 69 73 74 5c 6e 22 5d 0d 0a 20 20 20 20   exist\n"]..    
c490: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
c4a0: 20 72 65 74 75 72 6e 0d 0a 20 20 20 20 20 20 7d   return..      }
c4b0: 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63  ....      if {[c
c4c0: 61 74 63 68 20 7b 66 69 6c 65 20 64 65 6c 65 74  atch {file delet
c4d0: 65 20 24 66 69 6c 65 4e 61 6d 65 7d 5d 20 3d 3d  e $fileName}] ==
c4e0: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
c4f0: 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
c500: 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
c510: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
c520: 20 20 20 20 20 22 2d 2d 2d 2d 20 64 65 6c 65 74       "---- delet
c530: 65 64 20 62 75 69 6c 64 20 66 69 6c 65 20 5c 22  ed build file \"
c540: 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e  " $fileName \"\n
c550: 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  ]..      } else 
c560: 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  {..        tputs
c570: 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
c580: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
c590: 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
c5a0: 2d 20 66 61 69 6c 65 64 20 74 6f 20 64 65 6c 65  - failed to dele
c5b0: 74 65 20 62 75 69 6c 64 20 66 69 6c 65 20 5c 22  te build file \"
c5c0: 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e  " $fileName \"\n
c5d0: 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  ]..      }..    
c5e0: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 74  }.....    proc t
c5f0: 72 79 43 6f 70 79 41 73 73 65 6d 62 6c 79 20 7b  ryCopyAssembly {
c600: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 69  ..            fi
c610: 6c 65 4e 61 6d 65 20 6d 61 6e 61 67 65 64 4f 6e  leName managedOn
c620: 6c 79 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d  ly {platform ""}
c630: 20 7b 70 64 62 20 74 72 75 65 7d 20 7b 76 65 72   {pdb true} {ver
c640: 62 6f 73 65 20 74 72 75 65 7d 20 7d 20 7b 0d 0a  bose true} } {..
c650: 20 20 20 20 20 20 74 72 79 43 6f 70 79 42 75 69        tryCopyBui
c660: 6c 64 46 69 6c 65 20 24 66 69 6c 65 4e 61 6d 65  ldFile $fileName
c670: 20 24 6d 61 6e 61 67 65 64 4f 6e 6c 79 20 24 70   $managedOnly $p
c680: 6c 61 74 66 6f 72 6d 20 22 22 20 24 76 65 72 62  latform "" $verb
c690: 6f 73 65 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20  ose....      if 
c6a0: 7b 24 70 64 62 7d 20 74 68 65 6e 20 7b 0d 0a 20  {$pdb} then {.. 
c6b0: 20 20 20 20 20 20 20 74 72 79 43 6f 70 79 42 75         tryCopyBu
c6c0: 69 6c 64 46 69 6c 65 20 5b 61 70 70 65 6e 64 41  ildFile [appendA
c6d0: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
c6e0: 20 20 20 5b 66 69 6c 65 20 72 6f 6f 74 6e 61 6d     [file rootnam
c6f0: 65 20 24 66 69 6c 65 4e 61 6d 65 5d 20 2e 70 64  e $fileName] .pd
c700: 62 5d 20 24 6d 61 6e 61 67 65 64 4f 6e 6c 79 20  b] $managedOnly 
c710: 24 70 6c 61 74 66 6f 72 6d 20 22 22 20 24 76 65  $platform "" $ve
c720: 72 62 6f 73 65 0d 0a 20 20 20 20 20 20 7d 0d 0a  rbose..      }..
c730: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
c740: 6f 63 20 74 72 79 44 65 6c 65 74 65 41 73 73 65  oc tryDeleteAsse
c750: 6d 62 6c 79 20 7b 0d 0a 20 20 20 20 20 20 20 20  mbly {..        
c760: 20 20 20 20 66 69 6c 65 4e 61 6d 65 20 7b 70 6c      fileName {pl
c770: 61 74 66 6f 72 6d 20 22 22 7d 20 7b 70 64 62 20  atform ""} {pdb 
c780: 74 72 75 65 7d 20 7b 76 65 72 62 6f 73 65 20 74  true} {verbose t
c790: 72 75 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20  rue} } {..      
c7a0: 74 72 79 44 65 6c 65 74 65 42 69 6e 61 72 79 46  tryDeleteBinaryF
c7b0: 69 6c 65 20 24 66 69 6c 65 4e 61 6d 65 20 24 70  ile $fileName $p
c7c0: 6c 61 74 66 6f 72 6d 20 24 76 65 72 62 6f 73 65  latform $verbose
c7d0: 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 70  ....      if {$p
c7e0: 64 62 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  db} then {..    
c7f0: 20 20 20 20 74 72 79 44 65 6c 65 74 65 42 69 6e      tryDeleteBin
c800: 61 72 79 46 69 6c 65 20 5b 61 70 70 65 6e 64 41  aryFile [appendA
c810: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
c820: 20 20 20 5b 66 69 6c 65 20 72 6f 6f 74 6e 61 6d     [file rootnam
c830: 65 20 24 66 69 6c 65 4e 61 6d 65 5d 20 2e 70 64  e $fileName] .pd
c840: 62 5d 20 24 70 6c 61 74 66 6f 72 6d 20 24 76 65  b] $platform $ve
c850: 72 62 6f 73 65 0d 0a 20 20 20 20 20 20 7d 0d 0a  rbose..      }..
c860: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
c870: 6f 63 20 74 72 79 4c 6f 61 64 41 73 73 65 6d 62  oc tryLoadAssemb
c880: 6c 79 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7b 70  ly { fileName {p
c890: 6c 61 74 66 6f 72 6d 20 22 22 7d 20 7d 20 7b 0d  latform ""} } {.
c8a0: 0a 20 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e  .      set fileN
c8b0: 61 6d 65 20 5b 67 65 74 42 69 6e 61 72 79 46 69  ame [getBinaryFi
c8c0: 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65  leName $fileName
c8d0: 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a 0d 0a 20   $platform].... 
c8e0: 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
c8f0: 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 61  {..        set a
c900: 73 73 65 6d 62 6c 79 20 5b 6f 62 6a 65 63 74 20  ssembly [object 
c910: 6c 6f 61 64 20 2d 6c 6f 61 64 74 79 70 65 20 46  load -loadtype F
c920: 69 6c 65 20 2d 61 6c 69 61 73 20 24 66 69 6c 65  ile -alias $file
c930: 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20 7d 5d 20  Name]..      }] 
c940: 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
c950: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
c960: 20 23 20 4e 4f 54 45 3a 20 4e 6f 77 2c 20 61 64   # NOTE: Now, ad
c970: 64 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20  d the necessary 
c980: 74 65 73 74 20 63 6f 6e 73 74 72 61 69 6e 74 2e  test constraint.
c990: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
c9a0: 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
c9b0: 6e 74 20 5b 66 69 6c 65 20 72 6f 6f 74 6e 61 6d  nt [file rootnam
c9c0: 65 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69  e [file tail $fi
c9d0: 6c 65 4e 61 6d 65 5d 5d 0d 0a 0d 0a 20 20 20 20  leName]]....    
c9e0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
c9f0: 20 4e 4f 54 45 3a 20 47 72 61 62 20 74 68 65 20   NOTE: Grab the 
ca00: 69 6d 61 67 65 20 72 75 6e 74 69 6d 65 20 76 65  image runtime ve
ca10: 72 73 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 61  rsion from the a
ca20: 73 73 65 6d 62 6c 79 20 62 65 63 61 75 73 65 0d  ssembly because.
ca30: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
ca40: 20 73 65 76 65 72 61 6c 20 74 65 73 74 73 20 72   several tests r
ca50: 65 6c 79 20 6f 6e 20 69 74 20 68 61 76 69 6e 67  ely on it having
ca60: 20 61 20 63 65 72 74 61 69 6e 20 76 61 6c 75 65   a certain value
ca70: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
ca80: 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61        addConstra
ca90: 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20  int [appendArgs 
caa0: 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69 6c 65  [file tail $file
cab0: 4e 61 6d 65 5d 20 5f 20 5c 0d 0a 20 20 20 20 20  Name] _ \..     
cac0: 20 20 20 20 20 20 20 5b 24 61 73 73 65 6d 62 6c         [$assembl
cad0: 79 20 49 6d 61 67 65 52 75 6e 74 69 6d 65 56 65  y ImageRuntimeVe
cae0: 72 73 69 6f 6e 5d 5d 0d 0a 0d 0a 20 20 20 20 20  rsion]]....     
caf0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
cb00: 4e 4f 54 45 3a 20 52 65 74 75 72 6e 20 74 68 65  NOTE: Return the
cb10: 20 66 75 6c 6c 20 70 61 74 68 20 6f 66 20 74 68   full path of th
cb20: 65 20 6c 6f 61 64 65 64 20 66 69 6c 65 2e 0d 0a  e loaded file...
cb30: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
cb40: 20 20 20 72 65 74 75 72 6e 20 24 66 69 6c 65 4e     return $fileN
cb50: 61 6d 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  ame..      }....
cb60: 20 20 20 20 20 20 72 65 74 75 72 6e 20 22 22 0d        return "".
cb70: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
cb80: 72 6f 63 20 69 73 53 51 4c 69 74 65 52 65 61 64  roc isSQLiteRead
cb90: 79 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  y {} {..      #.
cba0: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54  .      # NOTE: T
cbb0: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 6d 75  his procedure mu
cbc0: 73 74 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  st return non-ze
cbd0: 72 6f 20 6f 6e 6c 79 20 69 66 20 74 68 65 20 53  ro only if the S
cbe0: 51 4c 69 74 65 20 6e 61 74 69 76 65 0d 0a 20 20  QLite native..  
cbf0: 20 20 20 20 23 20 20 20 20 20 20 20 6c 69 62 72      #       libr
cc00: 61 72 79 20 61 6e 64 20 74 68 65 20 53 79 73 74  ary and the Syst
cc10: 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 6d  em.Data.SQLite m
cc20: 61 6e 61 67 65 64 20 61 73 73 65 6d 62 6c 79 20  anaged assembly 
cc30: 61 72 65 20 6c 6f 61 64 65 64 0d 0a 20 20 20 20  are loaded..    
cc40: 20 20 23 20 20 20 20 20 20 20 61 6e 64 20 72 65    #       and re
cc50: 61 64 79 20 66 6f 72 20 75 73 65 20 62 79 20 74  ady for use by t
cc60: 68 65 20 74 65 73 74 20 73 75 69 74 65 2e 20 20  he test suite.  
cc70: 43 75 72 72 65 6e 74 6c 79 2c 20 74 68 69 73 20  Currently, this 
cc80: 70 72 6f 63 65 64 75 72 65 0d 0a 20 20 20 20 20  procedure..     
cc90: 20 23 20 20 20 20 20 20 20 73 68 6f 75 6c 64 20   #       should 
cca0: 62 65 20 63 61 6c 6c 65 64 20 6f 6e 6c 79 20 61  be called only a
ccb0: 66 74 65 72 20 74 68 65 20 5b 74 72 79 4c 6f 61  fter the [tryLoa
ccc0: 64 41 73 73 65 6d 62 6c 79 5d 20 70 72 6f 63 65  dAssembly] proce
ccd0: 64 75 72 65 20 68 61 73 0d 0a 20 20 20 20 20 20  dure has..      
cce0: 23 20 20 20 20 20 20 20 62 65 65 6e 20 63 61 6c  #       been cal
ccf0: 6c 65 64 20 74 6f 20 70 72 6f 62 65 20 66 6f 72  led to probe for
cd00: 20 74 68 65 20 53 79 73 74 65 6d 2e 44 61 74 61   the System.Data
cd10: 2e 53 51 4c 69 74 65 20 6d 61 6e 61 67 65 64 20  .SQLite managed 
cd20: 61 73 73 65 6d 62 6c 79 0d 0a 20 20 20 20 20 20  assembly..      
cd30: 23 20 20 20 20 20 20 20 61 6e 64 20 74 68 65 20  #       and the 
cd40: 5b 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 5d  [checkForSQLite]
cd50: 20 70 72 6f 63 65 64 75 72 65 20 68 61 73 20 62   procedure has b
cd60: 65 65 6e 20 63 61 6c 6c 65 64 20 74 6f 20 70 72  een called to pr
cd70: 6f 62 65 20 66 6f 72 0d 0a 20 20 20 20 20 20 23  obe for..      #
cd80: 20 20 20 20 20 20 20 74 68 65 20 53 51 4c 69 74         the SQLit
cd90: 65 20 6e 61 74 69 76 65 20 6c 69 62 72 61 72 79  e native library
cda0: 3b 20 6f 74 68 65 72 77 69 73 65 2c 20 74 68 69  ; otherwise, thi
cdb0: 73 20 70 72 6f 63 65 64 75 72 65 20 77 69 6c 6c  s procedure will
cdc0: 20 73 69 6d 70 6c 79 0d 0a 20 20 20 20 20 20 23   simply..      #
cdd0: 20 20 20 20 20 20 20 61 6c 77 61 79 73 20 72 65         always re
cde0: 74 75 72 6e 20 7a 65 72 6f 2e 0d 0a 20 20 20 20  turn zero...    
cdf0: 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75 72    #..      retur
ce00: 6e 20 5b 65 78 70 72 20 7b 0d 0a 20 20 20 20 20  n [expr {..     
ce10: 20 20 20 5b 68 61 76 65 43 6f 6e 73 74 72 61 69     [haveConstrai
ce20: 6e 74 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  nt System.Data.S
ce30: 51 4c 69 74 65 5d 20 26 26 20 5b 68 61 76 65 43  QLite] && [haveC
ce40: 6f 6e 73 74 72 61 69 6e 74 20 53 51 4c 69 74 65  onstraint SQLite
ce50: 5d 0d 0a 20 20 20 20 20 20 7d 5d 0d 0a 20 20 20  ]..      }]..   
ce60: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
ce70: 6d 61 74 63 68 50 6c 61 74 66 6f 72 6d 20 7b 20  matchPlatform { 
ce80: 70 6c 61 74 66 6f 72 6d 20 7d 20 7b 0d 0a 20 20  platform } {..  
ce90: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
cea0: 4f 54 45 3a 20 41 6e 20 65 6d 70 74 79 20 73 74  OTE: An empty st
ceb0: 72 69 6e 67 20 66 6f 72 20 74 68 65 20 70 6c 61  ring for the pla
cec0: 74 66 6f 72 6d 20 6d 65 61 6e 73 20 74 68 61 74  tform means that
ced0: 20 74 68 65 20 62 75 69 6c 64 20 69 73 20 6e 6f   the build is no
cee0: 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  t..      #      
cef0: 20 5b 70 72 69 6d 61 72 69 6c 79 5d 20 61 20 6e   [primarily] a n
cf00: 61 74 69 76 65 20 62 75 69 6c 64 3b 20 74 68 65  ative build; the
cf10: 72 65 66 6f 72 65 2c 20 69 74 20 61 6c 77 61 79  refore, it alway
cf20: 73 20 6d 61 74 63 68 65 73 2e 0d 0a 20 20 20 20  s matches...    
cf30: 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
cf40: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 70  string length $p
cf50: 6c 61 74 66 6f 72 6d 5d 20 3d 3d 20 30 7d 20 74  latform] == 0} t
cf60: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72  hen {..        r
cf70: 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20  eturn true..    
cf80: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
cf90: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66        # NOTE: If
cfa0: 20 74 68 65 20 6d 61 63 68 69 6e 65 20 6e 61 6d   the machine nam
cfb0: 65 20 69 73 20 75 6e 61 76 61 69 6c 61 62 6c 65  e is unavailable
cfc0: 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 74 68 69  , there is nothi
cfd0: 67 6e 20 65 6c 73 65 20 77 65 0d 0a 20 20 20 20  gn else we..    
cfe0: 20 20 23 20 20 20 20 20 20 20 63 61 6e 20 64 6f    #       can do
cff0: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
d000: 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
d010: 73 74 73 20 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f  sts ::tcl_platfo
d020: 72 6d 28 6d 61 63 68 69 6e 65 29 5d 7d 20 74 68  rm(machine)]} th
d030: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65  en {..        re
d040: 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20  turn false..    
d050: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
d060: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 44 6f        # NOTE: Do
d070: 65 73 20 74 68 65 20 73 70 65 63 69 66 69 65 64  es the specified
d080: 20 70 6c 61 74 66 6f 72 6d 20 6d 61 74 63 68 20   platform match 
d090: 75 70 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e  up to the curren
d0a0: 74 20 70 72 6f 63 65 73 73 3f 0d 0a 20 20 20 20  t process?..    
d0b0: 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 24    #..      if {$
d0c0: 70 6c 61 74 66 6f 72 6d 20 65 71 20 5b 6d 61 63  platform eq [mac
d0d0: 68 69 6e 65 54 6f 50 6c 61 74 66 6f 72 6d 20 24  hineToPlatform $
d0e0: 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 6d  ::tcl_platform(m
d0f0: 61 63 68 69 6e 65 29 5d 7d 20 74 68 65 6e 20 7b  achine)]} then {
d100: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
d110: 20 74 72 75 65 0d 0a 20 20 20 20 20 20 7d 0d 0a   true..      }..
d120: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
d130: 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 73 70 65   # NOTE: The spe
d140: 63 69 66 69 65 64 20 70 6c 61 74 66 6f 72 6d 20  cified platform 
d150: 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 75  does not match u
d160: 70 20 77 69 74 68 20 74 68 65 20 70 6c 61 74 66  p with the platf
d170: 6f 72 6d 0d 0a 20 20 20 20 20 20 23 20 20 20 20  orm..      #    
d180: 20 20 20 66 6f 72 20 74 68 65 20 63 75 72 72 65     for the curre
d190: 6e 74 20 70 72 6f 63 65 73 73 2e 0d 0a 20 20 20  nt process...   
d1a0: 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75     #..      retu
d1b0: 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20 7d 0d  rn false..    }.
d1c0: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 68 61 76  ....    proc hav
d1d0: 65 53 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d  eSQLiteObjectCom
d1e0: 6d 61 6e 64 20 7b 7d 20 7b 0d 0a 20 20 20 20 20  mand {} {..     
d1f0: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
d200: 3a 20 49 73 20 74 68 65 20 5b 6f 62 6a 65 63 74  : Is the [object
d210: 5d 20 63 6f 6d 6d 61 6e 64 20 63 75 72 72 65 6e  ] command curren
d220: 74 6c 79 20 61 76 61 69 6c 61 62 6c 65 3f 0d 0a  tly available?..
d230: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72        #..      r
d240: 65 74 75 72 6e 20 5b 65 78 70 72 20 7b 5b 6c 6c  eturn [expr {[ll
d250: 65 6e 67 74 68 20 5b 69 6e 66 6f 20 63 6f 6d 6d  ength [info comm
d260: 61 6e 64 73 20 6f 62 6a 65 63 74 5d 5d 20 3e 20  ands object]] > 
d270: 30 7d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20  0}]..    }..... 
d280: 20 20 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72     proc checkFor
d290: 53 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d  SQLiteObjectComm
d2a0: 61 6e 64 20 7b 20 63 68 61 6e 6e 65 6c 20 7d 20  and { channel } 
d2b0: 7b 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20 24  {..      tputs $
d2c0: 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 68  channel "---- ch
d2d0: 65 63 6b 69 6e 67 20 66 6f 72 20 5c 22 6f 62 6a  ecking for \"obj
d2e0: 65 63 74 5c 22 20 63 6f 6d 6d 61 6e 64 20 75 73  ect\" command us
d2f0: 61 67 65 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20  age... "....    
d300: 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
d310: 73 74 73 20 3a 3a 6e 6f 28 73 71 6c 69 74 65 4f  sts ::no(sqliteO
d320: 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 29 5d 20 26  bjectCommand)] &
d330: 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b  & \..          [
d340: 68 61 76 65 53 51 4c 69 74 65 4f 62 6a 65 63 74  haveSQLiteObject
d350: 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65 6e 20 7b  Command]} then {
d360: 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
d370: 24 63 68 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a  $channel yes\n..
d380: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
d390: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
d3a0: 20 20 20 23 20 4e 4f 54 45 3a 20 55 6e 6c 65 73     # NOTE: Unles
d3b0: 73 20 77 65 20 61 72 65 20 66 6f 72 62 69 64 64  s we are forbidd
d3c0: 65 6e 20 66 72 6f 6d 20 64 6f 69 6e 67 20 73 6f  en from doing so
d3d0: 2c 20 61 64 64 20 73 6f 6d 65 20 63 6f 6e 73 74  , add some const
d3e0: 72 61 69 6e 74 73 0d 0a 20 20 20 20 20 20 20 20  raints..        
d3f0: 23 20 20 20 20 20 20 20 74 68 61 74 20 77 69 6c  #       that wil
d400: 6c 20 61 6c 6c 6f 77 20 6d 6f 73 74 20 6f 66 20  l allow most of 
d410: 74 68 65 20 74 65 73 74 20 73 75 69 74 65 20 74  the test suite t
d420: 6f 20 72 75 6e 20 28 69 2e 65 2e 20 74 68 6f 73  o run (i.e. thos
d430: 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
d440: 20 20 20 74 65 73 74 73 20 74 68 61 74 20 64 6f     tests that do
d450: 20 6e 6f 74 20 64 69 72 65 63 74 6c 79 20 72 65   not directly re
d460: 6c 79 20 75 70 6f 6e 20 74 68 65 20 5b 6f 62 6a  ly upon the [obj
d470: 65 63 74 5d 20 63 6f 6d 6d 61 6e 64 29 2e 0d 0a  ect] command)...
d480: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
d490: 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
d4a0: 69 73 74 73 20 3a 3a 6e 6f 28 73 68 69 6d 53 51  ists ::no(shimSQ
d4b0: 4c 69 74 65 41 73 73 65 6d 62 6c 79 43 6f 6e 73  LiteAssemblyCons
d4c0: 74 72 61 69 6e 74 73 29 5d 7d 20 74 68 65 6e 20  traints)]} then 
d4d0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 61 64 64  {..          add
d4e0: 43 6f 6e 73 74 72 61 69 6e 74 20 53 51 4c 69 74  Constraint SQLit
d4f0: 65 0d 0a 20 20 20 20 20 20 20 20 20 20 61 64 64  e..          add
d500: 43 6f 6e 73 74 72 61 69 6e 74 20 53 51 4c 69 74  Constraint SQLit
d510: 65 49 6e 74 65 72 6f 70 0d 0a 20 20 20 20 20 20  eInterop..      
d520: 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e      addConstrain
d530: 74 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  t System.Data.SQ
d540: 4c 69 74 65 0d 0a 20 20 20 20 20 20 20 20 20 20  Lite..          
d550: 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 53 79  addConstraint Sy
d560: 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
d570: 2e 45 6e 63 72 79 70 74 69 6f 6e 0d 0a 20 20 20  .Encryption..   
d580: 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72         addConstr
d590: 61 69 6e 74 20 53 79 73 74 65 6d 2e 44 61 74 61  aint System.Data
d5a0: 2e 53 51 4c 69 74 65 2e 4c 69 6e 71 0d 0a 0d 0a  .SQLite.Linq....
d5b0: 20 20 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e            addCon
d5c0: 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41  straint [appendA
d5d0: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
d5e0: 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61       System.Data
d5f0: 2e 53 51 4c 69 74 65 2e 64 6c 6c 5f 76 20 5b 67  .SQLite.dll_v [g
d600: 65 74 42 75 69 6c 64 43 6c 72 56 65 72 73 69 6f  etBuildClrVersio
d610: 6e 5d 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  n]]..        }..
d620: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b  ..        if {![
d630: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
d640: 28 73 68 69 6d 53 51 4c 69 74 65 44 65 66 69 6e  (shimSQLiteDefin
d650: 65 43 6f 6e 73 74 61 6e 74 43 6f 6e 73 74 72 61  eConstantConstra
d660: 69 6e 74 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  ints)]} then {..
d670: 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63            foreac
d680: 68 20 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74  h defineConstant
d690: 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20   [list \..      
d6a0: 20 20 20 20 20 20 20 20 49 4e 54 45 52 4f 50 5f          INTEROP_
d6b0: 45 58 54 45 4e 53 49 4f 4e 5f 46 55 4e 43 54 49  EXTENSION_FUNCTI
d6c0: 4f 4e 53 20 49 4e 54 45 52 4f 50 5f 46 54 53 35  ONS INTEROP_FTS5
d6d0: 5f 45 58 54 45 4e 53 49 4f 4e 20 5c 0d 0a 20 20  _EXTENSION \..  
d6e0: 20 20 20 20 20 20 20 20 20 20 20 20 49 4e 54 45              INTE
d6f0: 52 4f 50 5f 4a 53 4f 4e 31 5f 45 58 54 45 4e 53  ROP_JSON1_EXTENS
d700: 49 4f 4e 20 49 4e 54 45 52 4f 50 5f 50 45 52 43  ION INTEROP_PERC
d710: 45 4e 54 49 4c 45 5f 45 58 54 45 4e 53 49 4f 4e  ENTILE_EXTENSION
d720: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
d730: 20 20 49 4e 54 45 52 4f 50 5f 52 45 47 45 58 50    INTEROP_REGEXP
d740: 5f 45 58 54 45 4e 53 49 4f 4e 20 49 4e 54 45 52  _EXTENSION INTER
d750: 4f 50 5f 54 45 53 54 5f 45 58 54 45 4e 53 49 4f  OP_TEST_EXTENSIO
d760: 4e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  N \..           
d770: 20 20 20 49 4e 54 45 52 4f 50 5f 54 4f 54 59 50     INTEROP_TOTYP
d780: 45 5f 45 58 54 45 4e 53 49 4f 4e 20 49 4e 54 45  E_EXTENSION INTE
d790: 52 4f 50 5f 56 49 52 54 55 41 4c 5f 54 41 42 4c  ROP_VIRTUAL_TABL
d7a0: 45 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  E \..           
d7b0: 20 20 20 55 53 45 5f 49 4e 54 45 52 4f 50 5f 44     USE_INTEROP_D
d7c0: 4c 4c 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  LL] {..         
d7d0: 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74     addConstraint
d7e0: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
d7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d800: 5b 67 65 74 53 51 4c 69 74 65 44 65 66 69 6e 65  [getSQLiteDefine
d810: 43 6f 6e 73 74 61 6e 74 50 72 65 66 69 78 5d 20  ConstantPrefix] 
d820: 24 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 5d  $defineConstant]
d830: 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
d840: 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
d850: 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
d860: 78 69 73 74 73 20 3a 3a 6e 6f 28 73 68 69 6d 53  xists ::no(shimS
d870: 51 4c 69 74 65 56 69 73 75 61 6c 53 74 75 64 69  QLiteVisualStudi
d880: 6f 43 6f 6e 73 74 72 61 69 6e 74 73 29 5d 7d 20  oConstraints)]} 
d890: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
d8a0: 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20    addConstraint 
d8b0: 5b 61 70 70 65 6e 64 41 72 67 73 20 76 69 73 75  [appendArgs visu
d8c0: 61 6c 53 74 75 64 69 6f 20 5b 67 65 74 42 75 69  alStudio [getBui
d8d0: 6c 64 59 65 61 72 5d 5d 0d 0a 20 20 20 20 20 20  ldYear]]..      
d8e0: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74    }....        t
d8f0: 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f  puts $channel no
d900: 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  \n..      }..   
d910: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
d920: 63 68 61 6e 67 65 4e 61 74 69 76 65 52 75 6e 74  changeNativeRunt
d930: 69 6d 65 4f 70 74 69 6f 6e 20 7b 20 6e 61 74 69  imeOption { nati
d940: 76 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66  ve } {..      if
d950: 20 7b 5b 6c 6c 65 6e 67 74 68 20 5b 69 6e 66 6f   {[llength [info
d960: 20 63 6f 6d 6d 61 6e 64 73 20 64 65 62 75 67 5d   commands debug]
d970: 5d 20 3e 20 30 20 26 26 20 5c 0d 0a 20 20 20 20  ] > 0 && \..    
d980: 20 20 20 20 20 20 5b 6c 6c 65 6e 67 74 68 20 5b        [llength [
d990: 69 6e 66 6f 20 73 75 62 63 6f 6d 6d 61 6e 64 73  info subcommands
d9a0: 20 64 65 62 75 67 20 72 75 6e 74 69 6d 65 6f 70   debug runtimeop
d9b0: 74 69 6f 6e 5d 5d 20 3e 20 30 20 26 26 20 5b 63  tion]] > 0 && [c
d9c0: 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
d9d0: 64 65 62 75 67 20 72 75 6e 74 69 6d 65 6f 70 74  debug runtimeopt
d9e0: 69 6f 6e 20 5b 65 78 70 72 20 7b 24 6e 61 74 69  ion [expr {$nati
d9f0: 76 65 20 3f 20 22 61 64 64 22 20 3a 20 22 72 65  ve ? "add" : "re
da00: 6d 6f 76 65 22 7d 5d 20 6e 61 74 69 76 65 0d 0a  move"}] native..
da10: 20 20 20 20 20 20 7d 5d 20 3d 3d 20 30 7d 20 74        }] == 0} t
da20: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72  hen {..        r
da30: 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20  eturn true..    
da40: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20    }....      if 
da50: 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f 62 6a 65  {[haveSQLiteObje
da60: 63 74 43 6f 6d 6d 61 6e 64 5d 20 26 26 20 5b 63  ctCommand] && [c
da70: 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
da80: 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 49 6e  object invoke In
da90: 74 65 72 70 72 65 74 65 72 2e 47 65 74 41 63 74  terpreter.GetAct
daa0: 69 76 65 20 5b 65 78 70 72 20 7b 24 6e 61 74 69  ive [expr {$nati
dab0: 76 65 20 3f 20 5c 0d 0a 20 20 20 20 20 20 20 20  ve ? \..        
dac0: 20 20 20 20 22 41 64 64 52 75 6e 74 69 6d 65 4f      "AddRuntimeO
dad0: 70 74 69 6f 6e 22 20 3a 20 22 52 65 6d 6f 76 65  ption" : "Remove
dae0: 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 22 7d 5d  RuntimeOption"}]
daf0: 20 6e 61 74 69 76 65 0d 0a 20 20 20 20 20 20 7d   native..      }
db00: 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
db10: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74          return t
db20: 72 75 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  rue..      }....
db30: 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c        return fal
db40: 73 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  se..    }.....  
db50: 20 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72 53    proc checkForS
db60: 51 4c 69 74 65 42 75 69 6c 64 73 20 7b 20 63 68  QLiteBuilds { ch
db70: 61 6e 6e 65 6c 20 7b 73 65 6c 65 63 74 20 66 61  annel {select fa
db80: 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20  lse} } {..      
db90: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
dba0: 20 43 68 65 63 6b 20 66 6f 72 20 65 76 65 72 79   Check for every
dbb0: 20 70 6f 73 73 69 62 6c 65 20 76 61 6c 69 64 20   possible valid 
dbc0: 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 76  combination of v
dbd0: 61 6c 75 65 73 20 75 73 65 64 20 77 68 65 6e 0d  alues used when.
dbe0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6c  .      #       l
dbf0: 6f 63 61 74 69 6e 67 20 6f 75 74 20 74 68 65 20  ocating out the 
dc00: 62 75 69 6c 64 20 6f 75 74 70 75 74 20 64 69 72  build output dir
dc10: 65 63 74 6f 72 79 2c 20 73 68 6f 77 69 6e 67 20  ectory, showing 
dc20: 65 61 63 68 20 61 76 61 69 6c 61 62 6c 65 0d 0a  each available..
dc30: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62 75        #       bu
dc40: 69 6c 64 20 76 61 72 69 61 74 69 6f 6e 20 61 6c  ild variation al
dc50: 6f 6e 67 20 74 68 65 20 77 61 79 2e 0d 0a 20 20  ong the way...  
dc60: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 66 6f 72      #..      for
dc70: 65 61 63 68 20 6e 61 74 69 76 65 20 5b 6c 69 73  each native [lis
dc80: 74 20 66 61 6c 73 65 20 74 72 75 65 5d 20 7b 0d  t false true] {.
dc90: 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68  .        foreach
dca0: 20 79 65 61 72 20 5b 67 65 74 42 75 69 6c 64 59   year [getBuildY
dcb0: 65 61 72 73 5d 20 7b 0d 0a 20 20 20 20 20 20 20  ears] {..       
dcc0: 20 20 20 66 6f 72 65 61 63 68 20 63 6f 6e 66 69     foreach confi
dcd0: 67 75 72 61 74 69 6f 6e 20 5b 67 65 74 42 75 69  guration [getBui
dce0: 6c 64 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73  ldConfigurations
dcf0: 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ] {..           
dd00: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
dd10: 23 20 4e 4f 54 45 3a 20 46 69 67 75 72 65 20 6f  # NOTE: Figure o
dd20: 75 74 20 74 68 65 20 65 66 66 65 63 74 69 76 65  ut the effective
dd30: 20 62 75 69 6c 64 20 70 6c 61 74 66 6f 72 6d 2e   build platform.
dd40: 20 20 54 68 69 73 20 69 73 0d 0a 20 20 20 20 20    This is..     
dd50: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62         #       b
dd60: 61 73 65 64 20 6f 6e 20 77 68 65 74 68 65 72 20  ased on whether 
dd70: 6f 72 20 6e 6f 74 20 61 20 5b 70 72 69 6d 61 72  or not a [primar
dd80: 69 6c 79 5d 20 6e 61 74 69 76 65 20 62 75 69 6c  ily] native buil
dd90: 64 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  d..            #
dda0: 20 20 20 20 20 20 20 69 73 20 62 65 69 6e 67 20         is being 
ddb0: 75 73 65 64 2e 20 20 46 6f 72 20 5b 70 72 69 6d  used.  For [prim
ddc0: 61 72 69 6c 79 5d 20 6e 6f 6e 2d 6e 61 74 69 76  arily] non-nativ
ddd0: 65 20 62 75 69 6c 64 73 2c 0d 0a 20 20 20 20 20  e builds,..     
dde0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74         #       t
ddf0: 68 69 73 20 77 69 6c 6c 20 62 65 20 61 6e 20 65  his will be an e
de00: 6d 70 74 79 20 73 74 72 69 6e 67 2e 0d 0a 20 20  mpty string...  
de10: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
de20: 20 20 20 20 20 20 20 20 20 73 65 74 20 70 6c 61           set pla
de30: 74 66 6f 72 6d 20 5b 67 65 74 42 75 69 6c 64 50  tform [getBuildP
de40: 6c 61 74 66 6f 72 6d 20 24 6e 61 74 69 76 65 5d  latform $native]
de50: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
de60: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
de70: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
de80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
de90: 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72  --- checking for
dea0: 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
deb0: 69 74 65 20 62 75 69 6c 64 20 5c 22 22 20 5b 65  ite build \"" [e
dec0: 78 70 72 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  xpr \..         
ded0: 20 20 20 20 20 20 20 7b 24 6e 61 74 69 76 65 20         {$native 
dee0: 3f 20 22 6e 61 74 69 76 65 2f 22 20 3a 20 22 22  ? "native/" : ""
def0: 7d 5d 20 5b 65 78 70 72 20 7b 5b 73 74 72 69 6e  }] [expr {[strin
df00: 67 20 6c 65 6e 67 74 68 20 5c 0d 0a 20 20 20 20  g length \..    
df10: 20 20 20 20 20 20 20 20 20 20 20 20 24 70 6c 61              $pla
df20: 74 66 6f 72 6d 5d 20 3e 20 30 20 3f 20 5b 61 70  tform] > 0 ? [ap
df30: 70 65 6e 64 41 72 67 73 20 24 70 6c 61 74 66 6f  pendArgs $platfo
df40: 72 6d 20 2f 5d 20 3a 20 22 22 7d 5d 20 24 79 65  rm /] : ""}] $ye
df50: 61 72 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ar \..          
df60: 20 20 20 20 20 20 2f 20 24 63 6f 6e 66 69 67 75        / $configu
df70: 72 61 74 69 6f 6e 20 22 5c 22 2e 2e 2e 20 22 5d  ration "\"... "]
df80: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
df90: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  #..            #
dfa0: 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74 68 65   NOTE: Build the
dfb0: 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64   fully qualified
dfc0: 20 64 69 72 65 63 74 6f 72 79 20 77 68 65 72 65   directory where
dfd0: 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 0d 0a   the necessary..
dfe0: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20              #   
dff0: 20 20 20 20 63 6f 6d 70 6f 6e 65 6e 74 73 20 66      components f
e000: 6f 72 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  or System.Data.S
e010: 51 4c 69 74 65 20 73 68 6f 75 6c 64 20 62 65 20  QLite should be 
e020: 66 6f 75 6e 64 2e 0d 0a 20 20 20 20 20 20 20 20  found...        
e030: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
e040: 20 20 20 73 65 74 20 64 69 72 65 63 74 6f 72 79     set directory
e050: 20 5b 6a 6f 69 6e 42 75 69 6c 64 44 69 72 65 63   [joinBuildDirec
e060: 74 6f 72 79 20 24 6e 61 74 69 76 65 20 5c 0d 0a  tory $native \..
e070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e080: 5b 67 65 74 42 75 69 6c 64 42 61 73 65 44 69 72  [getBuildBaseDir
e090: 65 63 74 6f 72 79 5d 20 24 79 65 61 72 20 24 70  ectory] $year $p
e0a0: 6c 61 74 66 6f 72 6d 20 24 63 6f 6e 66 69 67 75  latform $configu
e0b0: 72 61 74 69 6f 6e 5d 0d 0a 0d 0a 20 20 20 20 20  ration]....     
e0c0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
e0d0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 44 6f        # NOTE: Do
e0e0: 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 66   the necessary f
e0f0: 69 6c 65 73 20 65 78 69 73 74 3f 20 20 43 75 72  iles exist?  Cur
e100: 72 65 6e 74 6c 79 2c 20 6e 6f 20 6f 74 68 65 72  rently, no other
e110: 20 73 74 65 70 73 0d 0a 20 20 20 20 20 20 20 20   steps..        
e120: 20 20 20 20 23 20 20 20 20 20 20 20 61 72 65 20      #       are 
e130: 74 61 6b 65 6e 20 74 6f 20 76 65 72 69 66 79 20  taken to verify 
e140: 74 68 69 73 20 62 75 69 6c 64 20 69 73 20 61 63  this build is ac
e150: 74 75 61 6c 6c 79 20 76 69 61 62 6c 65 2e 0d 0a  tually viable...
e160: 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
e170: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b             if {[
e180: 69 73 42 75 69 6c 64 41 76 61 69 6c 61 62 6c 65  isBuildAvailable
e190: 20 24 6e 61 74 69 76 65 20 24 64 69 72 65 63 74   $native $direct
e1a0: 6f 72 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ory]} then {..  
e1b0: 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
e1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e               # N
e1d0: 4f 54 45 3a 20 57 68 65 6e 20 69 6e 20 22 73 65  OTE: When in "se
e1e0: 6c 65 63 74 22 20 6d 6f 64 65 2c 20 61 75 74 6f  lect" mode, auto
e1f0: 6d 61 74 69 63 61 6c 6c 79 20 73 65 6c 65 63 74  matically select
e200: 20 74 68 65 20 66 69 72 73 74 0d 0a 20 20 20 20   the first..    
e210: 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
e220: 20 20 61 76 61 69 6c 61 62 6c 65 20 62 75 69 6c    available buil
e230: 64 20 6f 66 20 53 79 73 74 65 6d 2e 44 61 74 61  d of System.Data
e240: 2e 53 51 4c 69 74 65 20 61 6e 64 20 74 68 65 6e  .SQLite and then
e250: 20 72 65 74 75 72 6e 0d 0a 20 20 20 20 20 20 20   return..       
e260: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69         #       i
e270: 6d 6d 65 64 69 61 74 65 6c 79 2e 0d 0a 20 20 20  mmediately...   
e280: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
e290: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
e2a0: 24 73 65 6c 65 63 74 20 26 26 20 5b 6d 61 74 63  $select && [matc
e2b0: 68 50 6c 61 74 66 6f 72 6d 20 24 70 6c 61 74 66  hPlatform $platf
e2c0: 6f 72 6d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  orm]} then {..  
e2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
e2e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e2f0: 20 23 20 4e 4f 54 45 3a 20 4d 61 6e 75 61 6c 6c   # NOTE: Manuall
e300: 79 20 6f 76 65 72 72 69 64 65 20 61 6c 6c 20 74  y override all t
e310: 68 65 20 62 75 69 6c 64 20 64 69 72 65 63 74 6f  he build directo
e320: 72 79 20 73 65 6c 65 63 74 69 6f 6e 0d 0a 20 20  ry selection..  
e330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
e340: 20 20 20 20 20 20 72 65 6c 61 74 65 64 20 74 65        related te
e350: 73 74 20 73 65 74 74 69 6e 67 73 20 69 6e 20 6f  st settings in o
e360: 72 64 65 72 20 74 6f 20 66 6f 72 63 65 20 74 68  rder to force th
e370: 69 73 20 62 75 69 6c 64 0d 0a 20 20 20 20 20 20  is build..      
e380: 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
e390: 20 20 6f 66 20 53 79 73 74 65 6d 2e 44 61 74 61    of System.Data
e3a0: 2e 53 51 4c 69 74 65 20 74 6f 20 62 65 20 75 73  .SQLite to be us
e3b0: 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ed...           
e3c0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
e3d0: 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 63 68          if {![ch
e3e0: 61 6e 67 65 4e 61 74 69 76 65 52 75 6e 74 69 6d  angeNativeRuntim
e3f0: 65 4f 70 74 69 6f 6e 20 24 6e 61 74 69 76 65 5d  eOption $native]
e400: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
e410: 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
e420: 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
e430: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
e440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e450: 22 6e 6f 2c 20 66 61 69 6c 65 64 20 74 6f 20 22  "no, failed to "
e460: 20 5b 65 78 70 72 20 7b 24 6e 61 74 69 76 65 20   [expr {$native 
e470: 3f 20 22 61 64 64 22 20 3a 20 22 72 65 6d 6f 76  ? "add" : "remov
e480: 65 22 7d 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20  e"}] \..        
e490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
e4a0: 74 68 65 20 5c 22 6e 61 74 69 76 65 5c 22 20 72  the \"native\" r
e4b0: 75 6e 74 69 6d 65 20 6f 70 74 69 6f 6e 5c 6e 22  untime option\n"
e4c0: 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ]....           
e4d0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61         return fa
e4e0: 6c 73 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  lse..           
e4f0: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
e500: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 3a 3a            set ::
e510: 74 65 73 74 5f 79 65 61 72 20 24 79 65 61 72 0d  test_year $year.
e520: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e530: 20 73 65 74 20 3a 3a 74 65 73 74 5f 70 6c 61 74   set ::test_plat
e540: 66 6f 72 6d 20 24 70 6c 61 74 66 6f 72 6d 0d 0a  form $platform..
e550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e560: 73 65 74 20 3a 3a 74 65 73 74 5f 63 6f 6e 66 69  set ::test_confi
e570: 67 75 72 61 74 69 6f 6e 20 24 63 6f 6e 66 69 67  guration $config
e580: 75 72 61 74 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20  uration....     
e590: 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
e5a0: 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
e5b0: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
e5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 79 65               "ye
e5d0: 73 2c 20 73 65 6c 65 63 74 65 64 20 28 22 20 5b  s, selected (" [
e5e0: 65 78 70 72 20 7b 24 6e 61 74 69 76 65 20 3f 20  expr {$native ? 
e5f0: 22 6e 61 74 69 76 65 2f 22 20 3a 20 22 22 7d 5d  "native/" : ""}]
e600: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
e610: 20 20 20 20 20 20 20 20 5b 65 78 70 72 20 7b 5b          [expr {[
e620: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 70  string length $p
e630: 6c 61 74 66 6f 72 6d 5d 20 3e 20 30 20 3f 20 5b  latform] > 0 ? [
e640: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
e650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e660: 20 20 24 70 6c 61 74 66 6f 72 6d 20 2f 5d 20 3a    $platform /] :
e670: 20 22 22 7d 5d 20 24 79 65 61 72 20 2f 20 24 63   ""}] $year / $c
e680: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 22 29 5c  onfiguration ")\
e690: 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  n"]....         
e6a0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72         return tr
e6b0: 75 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue..            
e6c0: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
e6d0: 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
e6e0: 73 20 24 63 68 61 6e 6e 65 6c 20 79 65 73 5c 6e  s $channel yes\n
e6f0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
e700: 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  }..            }
e710: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
e720: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
e730: 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20  annel no\n..    
e740: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
e750: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
e760: 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  }..      }....  
e770: 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65      return false
e780: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
e790: 70 72 6f 63 20 63 68 65 63 6b 46 6f 72 53 51 4c  proc checkForSQL
e7a0: 69 74 65 52 65 6c 65 61 73 65 73 20 7b 20 63 68  iteReleases { ch
e7b0: 61 6e 6e 65 6c 20 7b 73 65 6c 65 63 74 20 66 61  annel {select fa
e7c0: 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20  lse} } {..      
e7d0: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
e7e0: 20 43 68 65 63 6b 20 66 6f 72 20 70 61 73 74 20   Check for past 
e7f0: 72 65 6c 65 61 73 65 73 20 6f 66 20 53 79 73 74  releases of Syst
e800: 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 69  em.Data.SQLite i
e810: 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 0d  n the directory.
e820: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63  .      #       c
e830: 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20  ontained in the 
e840: 22 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c  "System.Data.SQL
e850: 69 74 65 22 20 65 6e 76 69 72 6f 6e 6d 65 6e 74  ite" environment
e860: 20 76 61 72 69 61 62 6c 65 2c 20 69 66 0d 0a 20   variable, if.. 
e870: 20 20 20 20 20 23 20 20 20 20 20 20 20 70 72 65       #       pre
e880: 73 65 6e 74 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  sent...      #..
e890: 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20        if {[info 
e8a0: 65 78 69 73 74 73 20 3a 3a 65 6e 76 28 53 79 73  exists ::env(Sys
e8b0: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 29  tem.Data.SQLite)
e8c0: 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
e8d0: 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
e8e0: 20 24 3a 3a 65 6e 76 28 53 79 73 74 65 6d 2e 44   $::env(System.D
e8f0: 61 74 61 2e 53 51 4c 69 74 65 29 5d 20 3e 20 30  ata.SQLite)] > 0
e900: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
e910: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
e920: 4f 54 45 3a 20 42 75 69 6c 64 20 74 68 65 20 66  OTE: Build the f
e930: 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 20 64  ully qualified d
e940: 69 72 65 63 74 6f 72 79 20 77 68 65 72 65 20 74  irectory where t
e950: 68 65 20 6e 65 63 65 73 73 61 72 79 0d 0a 20 20  he necessary..  
e960: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f        #       co
e970: 6d 70 6f 6e 65 6e 74 73 20 66 6f 72 20 53 79 73  mponents for Sys
e980: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20  tem.Data.SQLite 
e990: 73 68 6f 75 6c 64 20 62 65 20 66 6f 75 6e 64 2e  should be found.
e9a0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
e9b0: 20 20 20 20 20 73 65 74 20 64 69 72 65 63 74 6f       set directo
e9c0: 72 79 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e  ry [file nativen
e9d0: 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c  ame [file join \
e9e0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 24 3a  ..            $:
e9f0: 3a 65 6e 76 28 53 79 73 74 65 6d 2e 44 61 74 61  :env(System.Data
ea00: 2e 53 51 4c 69 74 65 29 20 5b 67 65 74 52 65 6c  .SQLite) [getRel
ea10: 65 61 73 65 56 65 72 73 69 6f 6e 5d 5d 5d 0d 0a  easeVersion]]]..
ea20: 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
ea30: 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
ea40: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
ea50: 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69      "---- checki
ea60: 6e 67 20 66 6f 72 20 53 79 73 74 65 6d 2e 44 61  ng for System.Da
ea70: 74 61 2e 53 51 4c 69 74 65 20 72 65 6c 65 61 73  ta.SQLite releas
ea80: 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20  e \"" \..       
ea90: 20 20 20 20 20 24 64 69 72 65 63 74 6f 72 79 20       $directory 
eaa0: 22 5c 22 2e 2e 2e 20 22 5d 0d 0a 0d 0a 20 20 20  "\"... "]....   
eab0: 20 20 20 20 20 69 66 20 7b 5b 69 73 52 65 6c 65       if {[isRele
eac0: 61 73 65 41 76 61 69 6c 61 62 6c 65 20 24 64 69  aseAvailable $di
ead0: 72 65 63 74 6f 72 79 20 70 6c 61 74 66 6f 72 6d  rectory platform
eae0: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
eaf0: 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
eb00: 20 6c 65 6e 67 74 68 20 24 70 6c 61 74 66 6f 72   length $platfor
eb10: 6d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  m] == 0} then {.
eb20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74  .            set
eb30: 20 70 6c 61 74 66 6f 72 6d 20 75 6e 6b 6e 6f 77   platform unknow
eb40: 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  n..          }..
eb50: 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
eb60: 24 73 65 6c 65 63 74 20 26 26 20 5b 6d 61 74 63  $select && [matc
eb70: 68 50 6c 61 74 66 6f 72 6d 20 24 70 6c 61 74 66  hPlatform $platf
eb80: 6f 72 6d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  orm]} then {..  
eb90: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 3a 3a            set ::
eba0: 62 75 69 6c 64 5f 64 69 72 65 63 74 6f 72 79 20  build_directory 
ebb0: 24 64 69 72 65 63 74 6f 72 79 0d 0a 0d 0a 20 20  $directory....  
ebc0: 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
ebd0: 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
ebe0: 41 72 67 73 20 22 79 65 73 2c 20 73 65 6c 65 63  Args "yes, selec
ebf0: 74 65 64 20 28 22 20 24 70 6c 61 74 66 6f 72 6d  ted (" $platform
ec00: 20 22 29 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20   ")\n"]....     
ec10: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72         return tr
ec20: 75 65 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20  ue..          } 
ec30: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
ec40: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
ec50: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22  el [appendArgs "
ec60: 79 65 73 20 28 22 20 24 70 6c 61 74 66 6f 72 6d  yes (" $platform
ec70: 20 22 29 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20   ")\n"]..       
ec80: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20     }..        } 
ec90: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
eca0: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
ecb0: 20 6e 6f 5c 6e 0d 0a 0d 0a 20 20 20 20 20 20 20   no\n....       
ecc0: 20 20 20 66 6f 72 65 61 63 68 20 70 61 74 68 20     foreach path 
ecd0: 5b 6c 73 6f 72 74 20 2d 64 65 63 72 65 61 73 69  [lsort -decreasi
ece0: 6e 67 20 5b 66 69 6c 65 20 6c 69 73 74 20 24 64  ng [file list $d
ecf0: 69 72 65 63 74 6f 72 79 20 2a 5d 5d 20 7b 0d 0a  irectory *]] {..
ed00: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
ed10: 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 70 61  [file exists $pa
ed20: 74 68 5d 20 26 26 20 5b 66 69 6c 65 20 69 73 64  th] && [file isd
ed30: 69 72 65 63 74 6f 72 79 20 24 70 61 74 68 5d 7d  irectory $path]}
ed40: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
ed50: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
ed60: 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
ed70: 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
ed80: 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65         "---- che
ed90: 63 6b 69 6e 67 20 66 6f 72 20 53 79 73 74 65 6d  cking for System
eda0: 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 72 65 6c  .Data.SQLite rel
edb0: 65 61 73 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20  ease \"" \..    
edc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24 70                $p
edd0: 61 74 68 20 22 5c 22 2e 2e 2e 20 22 5d 0d 0a 0d  ath "\"... "]...
ede0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
edf0: 66 20 7b 5b 69 73 52 65 6c 65 61 73 65 41 76 61  f {[isReleaseAva
ee00: 69 6c 61 62 6c 65 20 24 70 61 74 68 20 70 6c 61  ilable $path pla
ee10: 74 66 6f 72 6d 5d 7d 20 74 68 65 6e 20 7b 0d 0a  tform]} then {..
ee20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee30: 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
ee40: 74 68 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3d 3d  th $platform] ==
ee50: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
ee60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
ee70: 74 20 70 6c 61 74 66 6f 72 6d 20 75 6e 6b 6e 6f  t platform unkno
ee80: 77 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  wn..            
ee90: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
eea0: 20 20 20 20 20 20 20 20 20 69 66 20 7b 24 73 65           if {$se
eeb0: 6c 65 63 74 20 26 26 20 5b 6d 61 74 63 68 50 6c  lect && [matchPl
eec0: 61 74 66 6f 72 6d 20 24 70 6c 61 74 66 6f 72 6d  atform $platform
eed0: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
eee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74               set
eef0: 20 3a 3a 62 75 69 6c 64 5f 64 69 72 65 63 74 6f   ::build_directo
ef00: 72 79 20 24 70 61 74 68 0d 0a 0d 0a 20 20 20 20  ry $path....    
ef10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70                tp
ef20: 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
ef30: 70 65 6e 64 41 72 67 73 20 22 79 65 73 2c 20 73  pendArgs "yes, s
ef40: 65 6c 65 63 74 65 64 20 28 22 20 24 70 6c 61 74  elected (" $plat
ef50: 66 6f 72 6d 20 22 29 5c 6e 22 5d 0d 0a 0d 0a 20  form ")\n"].... 
ef60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef70: 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20   return true..  
ef80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 20                } 
ef90: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
efa0: 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
efb0: 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
efc0: 41 72 67 73 20 22 79 65 73 20 28 22 20 24 70 6c  Args "yes (" $pl
efd0: 61 74 66 6f 72 6d 20 22 29 5c 6e 22 5d 0d 0a 20  atform ")\n"].. 
efe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
eff0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
f000: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
f010: 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
f020: 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20  $channel no\n.. 
f030: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
f040: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
f050: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
f060: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65      }..      } e
f070: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74  lse {..        t
f080: 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
f090: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
f0a0: 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 65           "---- e
f0b0: 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61  nvironment varia
f0c0: 62 6c 65 20 5c 22 53 79 73 74 65 6d 2e 44 61 74  ble \"System.Dat
f0d0: 61 2e 53 51 4c 69 74 65 5c 22 20 69 73 20 6e 6f  a.SQLite\" is no
f0e0: 74 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  t " \..         
f0f0: 20 20 20 22 73 65 74 2c 20 73 6b 69 70 70 69 6e     "set, skippin
f100: 67 20 63 68 65 63 6b 20 66 6f 72 20 72 65 6c 65  g check for rele
f110: 61 73 65 73 2e 2e 2e 5c 6e 22 5d 0d 0a 20 20 20  ases...\n"]..   
f120: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65     }....      re
f130: 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20  turn false..    
f140: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63  }.....    proc c
f150: 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 4c 69 62  heckForSQLiteLib
f160: 72 61 72 79 20 7b 20 63 68 61 6e 6e 65 6c 20 7d  rary { channel }
f170: 20 7b 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20   {..      tputs 
f180: 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63  $channel "---- c
f190: 68 65 63 6b 69 6e 67 20 66 6f 72 20 53 51 4c 69  hecking for SQLi
f1a0: 74 65 20 63 6f 72 65 20 6c 69 62 72 61 72 79 2e  te core library.
f1b0: 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 69 66  .. "....      if
f1c0: 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
f1d0: 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b      object invok
f1e0: 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62  e -flags +NonPub
f1f0: 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  lic \..         
f200: 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53     System.Data.S
f210: 51 4c 69 74 65 2e 53 51 4c 69 74 65 33 20 53 51  QLite.SQLite3 SQ
f220: 4c 69 74 65 56 65 72 73 69 6f 6e 0d 0a 20 20 20  LiteVersion..   
f230: 20 20 20 7d 20 76 65 72 73 69 6f 6e 5d 20 3d 3d     } version] ==
f240: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
f250: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
f260: 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20   NOTE: Check if 
f270: 74 68 65 20 72 65 74 75 72 6e 65 64 20 76 65 72  the returned ver
f280: 73 69 6f 6e 20 77 61 73 20 6e 75 6c 6c 2e 20 20  sion was null.  
f290: 49 66 20 73 6f 2c 20 6d 61 6b 65 20 69 74 20 65  If so, make it e
f2a0: 61 73 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20  asy..        #  
f2b0: 20 20 20 20 20 74 6f 20 73 70 6f 74 2e 0d 0a 20       to spot... 
f2c0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
f2d0: 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
f2e0: 6e 67 74 68 20 24 76 65 72 73 69 6f 6e 5d 20 3d  ngth $version] =
f2f0: 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
f300: 20 20 20 20 20 20 20 73 65 74 20 76 65 72 73 69         set versi
f310: 6f 6e 20 6e 75 6c 6c 0d 0a 20 20 20 20 20 20 20  on null..       
f320: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d   }....        #.
f330: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
f340: 20 41 74 74 65 6d 70 74 20 74 6f 20 71 75 65 72   Attempt to quer
f350: 79 20 74 68 65 20 46 6f 73 73 69 6c 20 73 6f 75  y the Fossil sou
f360: 72 63 65 20 69 64 65 6e 74 69 66 69 65 72 20 66  rce identifier f
f370: 6f 72 20 74 68 65 20 53 51 4c 69 74 65 0d 0a 20  or the SQLite.. 
f380: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63         #       c
f390: 6f 72 65 20 6c 69 62 72 61 72 79 2e 0d 0a 20 20  ore library...  
f3a0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
f3b0: 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
f3c0: 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20           object 
f3d0: 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e  invoke -flags +N
f3e0: 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20  onPublic \..    
f3f0: 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d            System
f400: 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c  .Data.SQLite.SQL
f410: 69 74 65 33 20 53 51 4c 69 74 65 53 6f 75 72 63  ite3 SQLiteSourc
f420: 65 49 64 0d 0a 20 20 20 20 20 20 20 20 7d 20 73  eId..        } s
f430: 6f 75 72 63 65 49 64 5d 7d 20 74 68 65 6e 20 7b  ourceId]} then {
f440: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
f450: 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
f460: 20 57 65 20 66 61 69 6c 65 64 20 74 6f 20 71 75   We failed to qu
f470: 65 72 79 20 74 68 65 20 46 6f 73 73 69 6c 20 73  ery the Fossil s
f480: 6f 75 72 63 65 20 69 64 65 6e 74 69 66 69 65 72  ource identifier
f490: 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
f4a0: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 73 6f            set so
f4b0: 75 72 63 65 49 64 20 75 6e 6b 6e 6f 77 6e 0d 0a  urceId unknown..
f4c0: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
f4d0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
f4e0: 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66  # NOTE: Check if
f4f0: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 46 6f   the returned Fo
f500: 73 73 69 6c 20 73 6f 75 72 63 65 20 69 64 65 6e  ssil source iden
f510: 74 69 66 69 65 72 20 77 61 73 20 6e 75 6c 6c 2e  tifier was null.
f520: 20 20 49 66 0d 0a 20 20 20 20 20 20 20 20 23 20    If..        # 
f530: 20 20 20 20 20 20 73 6f 2c 20 6d 61 6b 65 20 69        so, make i
f540: 74 20 65 61 73 79 20 74 6f 20 73 70 6f 74 2e 0d  t easy to spot..
f550: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
f560: 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
f570: 6c 65 6e 67 74 68 20 24 73 6f 75 72 63 65 49 64  length $sourceId
f580: 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
f590: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 73 6f            set so
f5a0: 75 72 63 65 49 64 20 6e 75 6c 6c 0d 0a 20 20 20  urceId null..   
f5b0: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
f5c0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
f5d0: 4f 54 45 3a 20 59 65 73 2c 20 74 68 65 20 53 51  OTE: Yes, the SQ
f5e0: 4c 69 74 65 20 63 6f 72 65 20 6c 69 62 72 61 72  Lite core librar
f5f0: 79 20 61 70 70 65 61 72 73 20 74 6f 20 62 65 20  y appears to be 
f600: 61 76 61 69 6c 61 62 6c 65 2e 0d 0a 20 20 20 20  available...    
f610: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 61      #..        a
f620: 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 53 51 4c  ddConstraint SQL
f630: 69 74 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74  ite....        t
f640: 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
f650: 70 70 65 6e 64 41 72 67 73 20 22 79 65 73 20 28  ppendArgs "yes (
f660: 22 20 24 76 65 72 73 69 6f 6e 20 22 20 22 20 24  " $version " " $
f670: 73 6f 75 72 63 65 49 64 20 22 29 5c 6e 22 5d 0d  sourceId ")\n"].
f680: 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
f690: 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
f6a0: 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20  channel no\n..  
f6b0: 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
f6c0: 0a 20 20 20 20 70 72 6f 63 20 63 68 65 63 6b 46  .    proc checkF
f6d0: 6f 72 53 51 4c 69 74 65 49 6e 74 65 72 6f 70 20  orSQLiteInterop 
f6e0: 7b 20 63 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20  { channel } {.. 
f6f0: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
f700: 6e 65 6c 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69  nel "---- checki
f710: 6e 67 20 66 6f 72 20 53 51 4c 69 74 65 20 69 6e  ng for SQLite in
f720: 74 65 72 6f 70 20 61 73 73 65 6d 62 6c 79 2e 2e  terop assembly..
f730: 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20  . "....      if 
f740: 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
f750: 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65     object invoke
f760: 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c   -flags +NonPubl
f770: 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ic \..          
f780: 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51    System.Data.SQ
f790: 4c 69 74 65 2e 53 51 4c 69 74 65 33 20 49 6e 74  Lite.SQLite3 Int
f7a0: 65 72 6f 70 56 65 72 73 69 6f 6e 0d 0a 20 20 20  eropVersion..   
f7b0: 20 20 20 7d 20 76 65 72 73 69 6f 6e 5d 20 3d 3d     } version] ==
f7c0: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
f7d0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
f7e0: 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20   NOTE: Check if 
f7f0: 74 68 65 20 72 65 74 75 72 6e 65 64 20 76 65 72  the returned ver
f800: 73 69 6f 6e 20 77 61 73 20 6e 75 6c 6c 2e 20 20  sion was null.  
f810: 49 66 20 73 6f 2c 20 6d 61 6b 65 20 69 74 20 65  If so, make it e
f820: 61 73 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20  asy..        #  
f830: 20 20 20 20 20 74 6f 20 73 70 6f 74 2e 0d 0a 20       to spot... 
f840: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
f850: 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
f860: 6e 67 74 68 20 24 76 65 72 73 69 6f 6e 5d 20 3d  ngth $version] =
f870: 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
f880: 20 20 20 20 20 20 20 73 65 74 20 76 65 72 73 69         set versi
f890: 6f 6e 20 6e 75 6c 6c 0d 0a 20 20 20 20 20 20 20  on null..       
f8a0: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d   }....        #.
f8b0: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
f8c0: 20 41 74 74 65 6d 70 74 20 74 6f 20 71 75 65 72   Attempt to quer
f8d0: 79 20 74 68 65 20 46 6f 73 73 69 6c 20 73 6f 75  y the Fossil sou
f8e0: 72 63 65 20 69 64 65 6e 74 69 66 69 65 72 20 66  rce identifier f
f8f0: 6f 72 20 74 68 65 20 53 51 4c 69 74 65 0d 0a 20  or the SQLite.. 
f900: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63         #       c
f910: 6f 72 65 20 6c 69 62 72 61 72 79 2e 0d 0a 20 20  ore library...  
f920: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
f930: 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
f940: 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20           object 
f950: 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e  invoke -flags +N
f960: 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20  onPublic \..    
f970: 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d            System
f980: 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c  .Data.SQLite.SQL
f990: 69 74 65 33 20 49 6e 74 65 72 6f 70 53 6f 75 72  ite3 InteropSour
f9a0: 63 65 49 64 0d 0a 20 20 20 20 20 20 20 20 7d 20  ceId..        } 
f9b0: 73 6f 75 72 63 65 49 64 5d 7d 20 74 68 65 6e 20  sourceId]} then 
f9c0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  {..          #..
f9d0: 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
f9e0: 3a 20 57 65 20 66 61 69 6c 65 64 20 74 6f 20 71  : We failed to q
f9f0: 75 65 72 79 20 74 68 65 20 46 6f 73 73 69 6c 20  uery the Fossil 
fa00: 73 6f 75 72 63 65 20 69 64 65 6e 74 69 66 69 65  source identifie
fa10: 72 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  r...          #.
fa20: 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20 73  .          set s
fa30: 6f 75 72 63 65 49 64 20 75 6e 6b 6e 6f 77 6e 0d  ourceId unknown.
fa40: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
fa50: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
fa60: 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69   # NOTE: Check i
fa70: 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 46  f the returned F
fa80: 6f 73 73 69 6c 20 73 6f 75 72 63 65 20 69 64 65  ossil source ide
fa90: 6e 74 69 66 69 65 72 20 77 61 73 20 6e 75 6c 6c  ntifier was null
faa0: 2e 20 20 49 66 0d 0a 20 20 20 20 20 20 20 20 23  .  If..        #
fab0: 20 20 20 20 20 20 20 73 6f 2c 20 6d 61 6b 65 20         so, make 
fac0: 69 74 20 65 61 73 79 20 74 6f 20 73 70 6f 74 2e  it easy to spot.
fad0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
fae0: 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
faf0: 20 6c 65 6e 67 74 68 20 24 73 6f 75 72 63 65 49   length $sourceI
fb00: 64 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  d] == 0} then {.
fb10: 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20 73  .          set s
fb20: 6f 75 72 63 65 49 64 20 6e 75 6c 6c 0d 0a 20 20  ourceId null..  
fb30: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
fb40: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
fb50: 4e 4f 54 45 3a 20 42 65 66 6f 72 65 20 61 63 74  NOTE: Before act
fb60: 75 61 6c 6c 79 20 61 64 64 69 6e 67 20 74 68 65  ually adding the
fb70: 20 74 65 73 74 20 63 6f 6e 73 74 72 61 69 6e 74   test constraint
fb80: 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 0d  , make sure the.
fb90: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
fba0: 20 76 65 72 73 69 6f 6e 20 69 73 20 76 61 6c 69   version is vali
fbb0: 64 20 28 69 2e 65 2e 20 6e 6f 74 20 6a 75 73 74  d (i.e. not just
fbc0: 20 74 68 61 74 20 77 65 20 63 6f 75 6c 64 20 71   that we could q
fbd0: 75 65 72 79 20 69 74 29 2e 0d 0a 20 20 20 20 20  uery it)...     
fbe0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66     #..        if
fbf0: 20 7b 24 76 65 72 73 69 6f 6e 20 6e 65 20 22 6e   {$version ne "n
fc00: 75 6c 6c 22 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ull"} then {..  
fc10: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
fc20: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 59 65 73       # NOTE: Yes
fc30: 2c 20 74 68 65 20 53 51 4c 69 74 65 20 69 6e 74  , the SQLite int
fc40: 65 72 6f 70 20 61 73 73 65 6d 62 6c 79 20 61 70  erop assembly ap
fc50: 70 65 61 72 73 20 74 6f 20 62 65 20 61 76 61 69  pears to be avai
fc60: 6c 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20  lable...        
fc70: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 61    #..          a
fc80: 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 53 51 4c  ddConstraint SQL
fc90: 69 74 65 49 6e 74 65 72 6f 70 0d 0a 0d 0a 20 20  iteInterop....  
fca0: 20 20 20 20 20 20 20 20 73 65 74 20 61 6e 73 77          set answ
fcb0: 65 72 20 79 65 73 0d 0a 20 20 20 20 20 20 20 20  er yes..        
fcc0: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
fcd0: 20 20 20 20 73 65 74 20 61 6e 73 77 65 72 20 6e      set answer n
fce0: 6f 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  o..        }....
fcf0: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
fd00: 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
fd10: 67 73 20 24 61 6e 73 77 65 72 20 22 20 28 22 20  gs $answer " (" 
fd20: 24 76 65 72 73 69 6f 6e 20 22 20 22 20 24 73 6f  $version " " $so
fd30: 75 72 63 65 49 64 20 22 29 5c 6e 22 5d 0d 0a 20  urceId ")\n"].. 
fd40: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
fd50: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
fd60: 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20  annel no\n..    
fd70: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
fd80: 20 20 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72     proc checkFor
fd90: 53 51 4c 69 74 65 44 65 66 69 6e 65 43 6f 6e 73  SQLiteDefineCons
fda0: 74 61 6e 74 20 7b 20 63 68 61 6e 6e 65 6c 20 6e  tant { channel n
fdb0: 61 6d 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74  ame } {..      t
fdc0: 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
fdd0: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
fde0: 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65         "---- che
fdf0: 63 6b 69 6e 67 20 66 6f 72 20 53 79 73 74 65 6d  cking for System
fe00: 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 64 65 66  .Data.SQLite def
fe10: 69 6e 65 20 63 6f 6e 73 74 61 6e 74 20 5c 22 22  ine constant \""
fe20: 20 24 6e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20   $name \..      
fe30: 20 20 20 20 22 5c 22 2e 2e 2e 20 22 5d 0d 0a 0d      "\"... "]...
fe40: 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63  .      if {[catc
fe50: 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a  h {..        obj
fe60: 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67  ect invoke -flag
fe70: 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a  s +NonPublic \..
fe80: 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74              Syst
fe90: 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53  em.Data.SQLite.S
fea0: 51 4c 69 74 65 33 20 44 65 66 69 6e 65 43 6f 6e  QLite3 DefineCon
feb0: 73 74 61 6e 74 73 0d 0a 20 20 20 20 20 20 7d 20  stants..      } 
fec0: 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 73 5d  defineConstants]
fed0: 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
fee0: 20 20 20 20 20 20 20 69 66 20 7b 5b 6c 73 65 61         if {[lsea
fef0: 72 63 68 20 2d 65 78 61 63 74 20 2d 6e 6f 63 61  rch -exact -noca
ff00: 73 65 20 24 64 65 66 69 6e 65 43 6f 6e 73 74 61  se $defineConsta
ff10: 6e 74 73 20 24 6e 61 6d 65 5d 20 21 3d 20 2d 31  nts $name] != -1
ff20: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
ff30: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
ff40: 20 23 20 4e 4f 54 45 3a 20 59 65 73 2c 20 74 68   # NOTE: Yes, th
ff50: 69 73 20 64 65 66 69 6e 65 20 63 6f 6e 73 74 61  is define consta
ff60: 6e 74 20 77 61 73 20 65 6e 61 62 6c 65 64 20 77  nt was enabled w
ff70: 68 65 6e 20 74 68 65 20 6d 61 6e 61 67 65 64 0d  hen the managed.
ff80: 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20  .          #    
ff90: 20 20 20 61 73 73 65 6d 62 6c 79 20 77 61 73 20     assembly was 
ffa0: 63 6f 6d 70 69 6c 65 64 2e 0d 0a 20 20 20 20 20  compiled...     
ffb0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
ffc0: 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20    addConstraint 
ffd0: 5b 61 70 70 65 6e 64 41 72 67 73 20 5b 67 65 74  [appendArgs [get
ffe0: 53 51 4c 69 74 65 44 65 66 69 6e 65 43 6f 6e 73  SQLiteDefineCons
fff0: 74 61 6e 74 50 72 65 66 69 78 5d 20 24 6e 61 6d  tantPrefix] $nam
10000 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  e]....          
10010 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 79  tputs $channel y
10020 65 73 5c 6e 0d 0a 20 20 20 20 20 20 20 20 7d 20  es\n..        } 
10030 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
10040 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
10050 20 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20 20 20 7d   no\n..        }
10060 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
10070 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
10080 24 63 68 61 6e 6e 65 6c 20 65 72 72 6f 72 5c 6e  $channel error\n
10090 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
100a0 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65  .....    proc ge
100b0 74 44 61 74 65 54 69 6d 65 46 6f 72 6d 61 74 20  tDateTimeFormat 
100c0 7b 20 7b 74 69 6d 65 5a 6f 6e 65 20 74 72 75 65  { {timeZone true
100d0 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a  } } {..      #..
100e0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68        # NOTE: Th
100f0 69 73 20 70 72 6f 63 65 64 75 72 65 20 73 69 6d  is procedure sim
10100 70 6c 79 20 72 65 74 75 72 6e 73 20 74 68 65 20  ply returns the 
10110 22 64 65 66 61 75 6c 74 22 20 44 61 74 65 54 69  "default" DateTi
10120 6d 65 20 66 6f 72 6d 61 74 20 75 73 65 64 0d 0a  me format used..
10130 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62 79        #       by
10140 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65 2e   the test suite.
10150 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
10160 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
10170 73 20 3a 3a 64 61 74 65 74 69 6d 65 5f 66 6f 72  s ::datetime_for
10180 6d 61 74 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  mat] && \..     
10190 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
101a0 67 74 68 20 24 3a 3a 64 61 74 65 74 69 6d 65 5f  gth $::datetime_
101b0 66 6f 72 6d 61 74 5d 20 3e 20 30 7d 20 74 68 65  format] > 0} the
101c0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
101d0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
101e0 52 65 74 75 72 6e 20 74 68 65 20 6d 61 6e 75 61  Return the manua
101f0 6c 6c 79 20 6f 76 65 72 72 69 64 64 65 6e 20 76  lly overridden v
10200 61 6c 75 65 20 66 6f 72 20 74 68 65 20 44 61 74  alue for the Dat
10210 65 54 69 6d 65 20 66 6f 72 6d 61 74 2e 0d 0a 20  eTime format... 
10220 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
10230 20 20 72 65 74 75 72 6e 20 24 3a 3a 64 61 74 65    return $::date
10240 74 69 6d 65 5f 66 6f 72 6d 61 74 0d 0a 20 20 20  time_format..   
10250 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
10260 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
10270 23 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e 20 61  # NOTE: Return a
10280 6e 20 49 53 4f 38 36 30 31 20 44 61 74 65 54 69  n ISO8601 DateTi
10290 6d 65 20 66 6f 72 6d 61 74 20 63 6f 6d 70 61 74  me format compat
102a0 69 62 6c 65 20 77 69 74 68 20 53 51 4c 69 74 65  ible with SQLite
102b0 2c 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  ,..        #    
102c0 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53     System.Data.S
102d0 51 4c 69 74 65 2c 20 61 6e 64 20 73 75 69 74 61  QLite, and suita
102e0 62 6c 65 20 66 6f 72 20 72 6f 75 6e 64 2d 74 72  ble for round-tr
102f0 69 70 70 69 6e 67 20 77 69 74 68 20 74 68 65 0d  ipping with the.
10300 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
10310 20 44 61 74 65 54 69 6d 65 20 63 6c 61 73 73 20   DateTime class 
10320 6f 66 20 74 68 65 20 66 72 61 6d 65 77 6f 72 6b  of the framework
10330 2e 20 20 49 66 20 74 68 69 73 20 76 61 6c 75 65  .  If this value
10340 20 69 73 20 63 68 61 6e 67 65 64 2c 0d 0a 20 20   is changed,..  
10350 20 20 20 20 20 20 23 20 20 20 20 20 20 20 76 61        #       va
10360 72 69 6f 75 73 20 74 65 73 74 73 20 6d 61 79 20  rious tests may 
10370 66 61 69 6c 2e 0d 0a 20 20 20 20 20 20 20 20 23  fail...        #
10380 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
10390 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
103a0 20 20 20 20 20 20 20 20 20 20 20 20 22 79 79 79              "yyy
103b0 79 2d 4d 4d 2d 64 64 20 48 48 3a 6d 6d 3a 73 73  y-MM-dd HH:mm:ss
103c0 2e 46 46 46 46 46 46 46 22 20 5b 65 78 70 72 20  .FFFFFFF" [expr 
103d0 7b 24 74 69 6d 65 5a 6f 6e 65 20 3f 20 22 4b 22  {$timeZone ? "K"
103e0 20 3a 20 22 22 7d 5d 5d 0d 0a 20 20 20 20 20 20   : ""}]]..      
103f0 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
10400 20 70 72 6f 63 20 67 65 74 44 61 74 65 54 69 6d   proc getDateTim
10410 65 54 69 63 6b 73 20 7b 20 76 61 6c 75 65 20 7b  eTicks { value {
10420 6c 6f 63 61 6c 20 22 22 7d 20 7b 64 65 66 61 75  local ""} {defau
10430 6c 74 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20  lt ""} } {..    
10440 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
10450 6e 67 74 68 20 24 76 61 6c 75 65 5d 20 3d 3d 20  ngth $value] == 
10460 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
10470 20 20 20 72 65 74 75 72 6e 20 24 64 65 66 61 75     return $defau
10480 6c 74 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  lt..      }.... 
10490 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
104a0 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 64  {..        set d
104b0 61 74 65 54 69 6d 65 20 5b 6f 62 6a 65 63 74 20  ateTime [object 
104c0 69 6e 76 6f 6b 65 20 2d 63 72 65 61 74 65 20 44  invoke -create D
104d0 61 74 65 54 69 6d 65 20 50 61 72 73 65 45 78 61  ateTime ParseExa
104e0 63 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ct \..          
104f0 20 20 24 76 61 6c 75 65 20 5b 67 65 74 44 61 74    $value [getDat
10500 65 54 69 6d 65 46 6f 72 6d 61 74 5d 20 6e 75 6c  eTimeFormat] nul
10510 6c 20 41 64 6a 75 73 74 54 6f 55 6e 69 76 65 72  l AdjustToUniver
10520 73 61 6c 5d 0d 0a 20 20 20 20 20 20 7d 5d 7d 20  sal]..      }]} 
10530 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
10540 72 65 74 75 72 6e 20 24 64 65 66 61 75 6c 74 0d  return $default.
10550 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
10560 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 69 73    if {[string is
10570 20 62 6f 6f 6c 65 61 6e 20 2d 73 74 72 69 63 74   boolean -strict
10580 20 24 6c 6f 63 61 6c 5d 7d 20 74 68 65 6e 20 7b   $local]} then {
10590 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 64 61  ..        set da
105a0 74 65 54 69 6d 65 20 5b 6f 62 6a 65 63 74 20 69  teTime [object i
105b0 6e 76 6f 6b 65 20 2d 63 72 65 61 74 65 20 44 61  nvoke -create Da
105c0 74 65 54 69 6d 65 20 53 70 65 63 69 66 79 4b 69  teTime SpecifyKi
105d0 6e 64 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  nd \..          
105e0 20 20 24 64 61 74 65 54 69 6d 65 20 55 74 63 5d    $dateTime Utc]
105f0 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
10600 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
10610 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20   [object invoke 
10620 24 64 61 74 65 54 69 6d 65 20 54 69 63 6b 73 5d  $dateTime Ticks]
10630 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
10640 20 20 20 69 66 20 7b 24 6c 6f 63 61 6c 7d 20 74     if {$local} t
10650 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72  hen {..        r
10660 65 74 75 72 6e 20 5b 6f 62 6a 65 63 74 20 69 6e  eturn [object in
10670 76 6f 6b 65 20 24 64 61 74 65 54 69 6d 65 20 54  voke $dateTime T
10680 6f 4c 6f 63 61 6c 54 69 6d 65 2e 54 69 63 6b 73  oLocalTime.Ticks
10690 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  ]..      } else 
106a0 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  {..        retur
106b0 6e 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65  n [object invoke
106c0 20 24 64 61 74 65 54 69 6d 65 20 54 6f 55 6e 69   $dateTime ToUni
106d0 76 65 72 73 61 6c 54 69 6d 65 2e 54 69 63 6b 73  versalTime.Ticks
106e0 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  ]..      }..    
106f0 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67  }.....    proc g
10700 65 74 50 72 6f 70 65 72 74 69 65 73 20 7b 20 6f  etProperties { o
10710 62 6a 65 63 74 20 76 61 72 4e 61 6d 65 20 7d 20  bject varName } 
10720 7b 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20 31  {..      upvar 1
10730 20 24 76 61 72 4e 61 6d 65 20 70 72 6f 70 65 72   $varName proper
10740 74 69 65 73 0d 0a 0d 0a 20 20 20 20 20 20 73 65  ties....      se
10750 74 20 63 6f 75 6e 74 20 30 0d 0a 20 20 20 20 20  t count 0..     
10760 20 73 65 74 20 6e 61 6d 65 73 20 5b 6c 69 73 74   set names [list
10770 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  ]....      if {[
10780 69 73 4f 62 6a 65 63 74 48 61 6e 64 6c 65 20 24  isObjectHandle $
10790 6f 62 6a 65 63 74 5d 20 26 26 20 24 6f 62 6a 65  object] && $obje
107a0 63 74 20 6e 65 20 22 6e 75 6c 6c 22 7d 20 74 68  ct ne "null"} th
107b0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 65 76  en {..        ev
107c0 61 6c 20 6c 61 70 70 65 6e 64 20 6e 61 6d 65 73  al lappend names
107d0 20 5b 6f 62 6a 65 63 74 20 6d 65 6d 62 65 72 73   [object members
107e0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
107f0 2d 6d 65 6d 62 65 72 74 79 70 65 73 20 50 72 6f  -membertypes Pro
10800 70 65 72 74 79 20 2d 6e 61 6d 65 6f 6e 6c 79 20  perty -nameonly 
10810 24 6f 62 6a 65 63 74 5d 0d 0a 0d 0a 20 20 20 20  $object]....    
10820 20 20 20 20 65 76 61 6c 20 6c 61 70 70 65 6e 64      eval lappend
10830 20 6e 61 6d 65 73 20 5b 6f 62 6a 65 63 74 20 6d   names [object m
10840 65 6d 62 65 72 73 20 5c 0d 0a 20 20 20 20 20 20  embers \..      
10850 20 20 20 20 20 20 2d 6d 65 6d 62 65 72 74 79 70        -membertyp
10860 65 73 20 46 69 65 6c 64 20 2d 6e 61 6d 65 6f 6e  es Field -nameon
10870 6c 79 20 24 6f 62 6a 65 63 74 5d 0d 0a 20 20 20  ly $object]..   
10880 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 66 6f     }....      fo
10890 72 65 61 63 68 20 6e 61 6d 65 20 24 6e 61 6d 65  reach name $name
108a0 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20  s {..        if 
108b0 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
108c0 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f       object invo
108d0 6b 65 20 2d 6f 62 6a 65 63 74 66 6c 61 67 73 20  ke -objectflags 
108e0 2b 4e 6f 44 69 73 70 6f 73 65 20 24 6f 62 6a 65  +NoDispose $obje
108f0 63 74 20 24 6e 61 6d 65 0d 0a 20 20 20 20 20 20  ct $name..      
10900 20 20 7d 20 76 61 6c 75 65 5d 20 3d 3d 20 30 7d    } value] == 0}
10910 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
10920 20 20 20 69 66 20 7b 5b 69 73 4f 62 6a 65 63 74     if {[isObject
10930 48 61 6e 64 6c 65 20 24 76 61 6c 75 65 5d 20 26  Handle $value] &
10940 26 20 24 76 61 6c 75 65 20 6e 65 20 22 6e 75 6c  & $value ne "nul
10950 6c 22 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  l"} then {..    
10960 20 20 20 20 20 20 20 20 73 65 74 20 65 72 72 6f          set erro
10970 72 20 6e 75 6c 6c 3b 20 6f 62 6a 65 63 74 20 69  r null; object i
10980 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f  nvoke -flags +No
10990 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20  nPublic \..     
109a0 20 20 20 20 20 20 20 20 20 20 20 2d 6d 61 72 73             -mars
109b0 68 61 6c 66 6c 61 67 73 20 2b 4e 6f 48 61 6e 64  halflags +NoHand
109c0 6c 65 20 49 6e 74 65 72 70 72 65 74 65 72 2e 47  le Interpreter.G
109d0 65 74 41 63 74 69 76 65 20 5c 0d 0a 20 20 20 20  etActive \..    
109e0 20 20 20 20 20 20 20 20 20 20 20 20 41 64 64 4f              AddO
109f0 62 6a 65 63 74 52 65 66 65 72 65 6e 63 65 20 4f  bjectReference O
10a00 6b 20 24 76 61 6c 75 65 20 65 72 72 6f 72 0d 0a  k $value error..
10a10 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 61  ..            la
10a20 70 70 65 6e 64 20 70 72 6f 70 65 72 74 69 65 73  ppend properties
10a30 28 6f 62 6a 65 63 74 73 29 20 5b 6c 69 73 74 20  (objects) [list 
10a40 24 6e 61 6d 65 20 24 76 61 6c 75 65 5d 0d 0a 20  $name $value].. 
10a50 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20           } else 
10a60 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c  {..            l
10a70 61 70 70 65 6e 64 20 70 72 6f 70 65 72 74 69 65  append propertie
10a80 73 28 76 61 6c 75 65 73 29 20 5b 6c 69 73 74 20  s(values) [list 
10a90 24 6e 61 6d 65 20 24 76 61 6c 75 65 5d 0d 0a 20  $name $value].. 
10aa0 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
10ab0 20 20 20 20 20 20 20 20 69 6e 63 72 20 63 6f 75          incr cou
10ac0 6e 74 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c  nt..        } el
10ad0 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
10ae0 6c 61 70 70 65 6e 64 20 70 72 6f 70 65 72 74 69  lappend properti
10af0 65 73 28 65 72 72 6f 72 73 29 20 5b 6c 69 73 74  es(errors) [list
10b00 20 24 6e 61 6d 65 20 24 3a 3a 65 72 72 6f 72 43   $name $::errorC
10b10 6f 64 65 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d  ode]..        }.
10b20 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
10b30 20 20 72 65 74 75 72 6e 20 24 63 6f 75 6e 74 0d    return $count.
10b40 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
10b50 72 6f 63 20 67 65 74 41 6c 6c 50 72 6f 70 65 72  roc getAllProper
10b60 74 69 65 73 20 7b 20 6f 62 6a 65 63 74 20 76 61  ties { object va
10b70 72 4e 61 6d 65 20 7d 20 7b 0d 0a 20 20 20 20 20  rName } {..     
10b80 20 75 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d   upvar 1 $varNam
10b90 65 20 70 72 6f 70 65 72 74 69 65 73 0d 0a 20 20  e properties..  
10ba0 20 20 20 20 73 65 74 20 76 61 6c 75 65 20 24 6f      set value $o
10bb0 62 6a 65 63 74 0d 0a 0d 0a 20 20 20 20 20 20 77  bject....      w
10bc0 68 69 6c 65 20 7b 74 72 75 65 7d 20 7b 0d 0a 20  hile {true} {.. 
10bd0 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
10be0 6f 20 65 78 69 73 74 73 20 70 72 6f 70 65 72 74  o exists propert
10bf0 69 65 73 28 73 65 65 6e 4f 62 6a 65 63 74 73 29  ies(seenObjects)
10c00 5d 20 7c 7c 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] || \..        
10c10 20 20 20 20 24 76 61 6c 75 65 20 6e 69 20 24 70      $value ni $p
10c20 72 6f 70 65 72 74 69 65 73 28 73 65 65 6e 4f 62  roperties(seenOb
10c30 6a 65 63 74 73 29 7d 20 74 68 65 6e 20 7b 0d 0a  jects)} then {..
10c40 20 20 20 20 20 20 20 20 20 20 67 65 74 50 72 6f            getPro
10c50 70 65 72 74 69 65 73 20 24 76 61 6c 75 65 20 70  perties $value p
10c60 72 6f 70 65 72 74 69 65 73 0d 0a 20 20 20 20 20  roperties..     
10c70 20 20 20 20 20 6c 61 70 70 65 6e 64 20 70 72 6f       lappend pro
10c80 70 65 72 74 69 65 73 28 73 65 65 6e 4f 62 6a 65  perties(seenObje
10c90 63 74 73 29 20 24 76 61 6c 75 65 0d 0a 20 20 20  cts) $value..   
10ca0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
10cb0 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
10cc0 73 74 73 20 70 72 6f 70 65 72 74 69 65 73 28 6f  sts properties(o
10cd0 62 6a 65 63 74 73 29 5d 7d 20 74 68 65 6e 20 7b  bjects)]} then {
10ce0 0d 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ..          brea
10cf0 6b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  k..        }....
10d00 20 20 20 20 20 20 20 20 69 66 20 7b 5b 6c 6c 65          if {[lle
10d10 6e 67 74 68 20 24 70 72 6f 70 65 72 74 69 65 73  ngth $properties
10d20 28 6f 62 6a 65 63 74 73 29 5d 20 3d 3d 20 30 7d  (objects)] == 0}
10d30 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
10d40 20 20 20 75 6e 73 65 74 20 70 72 6f 70 65 72 74     unset propert
10d50 69 65 73 28 6f 62 6a 65 63 74 73 29 3b 20 62 72  ies(objects); br
10d60 65 61 6b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  eak..        }..
10d70 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 76 61  ..        set va
10d80 6c 75 65 20 5b 6c 69 6e 64 65 78 20 5b 6c 69 6e  lue [lindex [lin
10d90 64 65 78 20 24 70 72 6f 70 65 72 74 69 65 73 28  dex $properties(
10da0 6f 62 6a 65 63 74 73 29 20 30 5d 20 65 6e 64 5d  objects) 0] end]
10db0 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 70 72  ..        set pr
10dc0 6f 70 65 72 74 69 65 73 28 6f 62 6a 65 63 74 73  operties(objects
10dd0 29 20 5b 6c 72 61 6e 67 65 20 24 70 72 6f 70 65  ) [lrange $prope
10de0 72 74 69 65 73 28 6f 62 6a 65 63 74 73 29 20 31  rties(objects) 1
10df0 20 65 6e 64 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a   end]..      }..
10e00 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66  ..      if {[inf
10e10 6f 20 65 78 69 73 74 73 20 70 72 6f 70 65 72 74  o exists propert
10e20 69 65 73 28 73 65 65 6e 4f 62 6a 65 63 74 73 29  ies(seenObjects)
10e30 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
10e40 20 20 20 66 6f 72 65 61 63 68 20 76 61 6c 75 65     foreach value
10e50 20 24 70 72 6f 70 65 72 74 69 65 73 28 73 65 65   $properties(see
10e60 6e 4f 62 6a 65 63 74 73 29 20 7b 0d 0a 20 20 20  nObjects) {..   
10e70 20 20 20 20 20 20 20 69 66 20 7b 24 76 61 6c 75         if {$valu
10e80 65 20 65 71 20 24 6f 62 6a 65 63 74 7d 20 63 6f  e eq $object} co
10e90 6e 74 69 6e 75 65 0d 0a 20 20 20 20 20 20 20 20  ntinue..        
10ea0 20 20 63 61 74 63 68 20 7b 6f 62 6a 65 63 74 20    catch {object 
10eb0 64 69 73 70 6f 73 65 20 24 76 61 6c 75 65 7d 0d  dispose $value}.
10ec0 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
10ed0 20 20 20 20 20 20 75 6e 73 65 74 20 70 72 6f 70        unset prop
10ee0 65 72 74 69 65 73 28 73 65 65 6e 4f 62 6a 65 63  erties(seenObjec
10ef0 74 73 29 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  ts)..      }..  
10f00 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
10f10 20 67 65 74 56 61 72 69 61 62 6c 65 73 20 7b 20   getVariables { 
10f20 76 61 72 4e 61 6d 65 73 20 7b 6f 62 6a 65 63 74  varNames {object
10f30 73 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20  s false} } {..  
10f40 20 20 20 20 73 65 74 20 72 65 73 75 6c 74 20 5b      set result [
10f50 6c 69 73 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 66  list]....      f
10f60 6f 72 65 61 63 68 20 76 61 72 4e 61 6d 65 20 24  oreach varName $
10f70 76 61 72 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20  varNames {..    
10f80 20 20 20 20 69 66 20 7b 5b 75 70 6c 65 76 65 6c      if {[uplevel
10f90 20 31 20 5b 6c 69 73 74 20 61 72 72 61 79 20 65   1 [list array e
10fa0 78 69 73 74 73 20 24 76 61 72 4e 61 6d 65 5d 5d  xists $varName]]
10fb0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
10fc0 20 20 20 20 73 65 74 20 61 72 72 61 79 4e 61 6d      set arrayNam
10fd0 65 20 24 76 61 72 4e 61 6d 65 0d 0a 0d 0a 20 20  e $varName....  
10fe0 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
10ff0 65 6c 65 6d 65 6e 74 4e 61 6d 65 20 5b 75 70 6c  elementName [upl
11000 65 76 65 6c 20 31 20 5b 6c 69 73 74 20 61 72 72  evel 1 [list arr
11010 61 79 20 6e 61 6d 65 73 20 24 61 72 72 61 79 4e  ay names $arrayN
11020 61 6d 65 5d 5d 20 7b 0d 0a 20 20 20 20 20 20 20  ame]] {..       
11030 20 20 20 20 20 73 65 74 20 6e 61 6d 65 20 5b 61       set name [a
11040 70 70 65 6e 64 41 72 67 73 20 24 61 72 72 61 79  ppendArgs $array
11050 4e 61 6d 65 20 28 20 24 65 6c 65 6d 65 6e 74 4e  Name ( $elementN
11060 61 6d 65 20 29 5d 0d 0a 20 20 20 20 20 20 20 20  ame )]..        
11070 20 20 20 20 73 65 74 20 76 61 72 56 61 6c 75 65      set varValue
11080 20 5b 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73   [uplevel 1 [lis
11090 74 20 73 65 74 20 24 6e 61 6d 65 5d 5d 0d 0a 0d  t set $name]]...
110a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
110b0 7b 24 6f 62 6a 65 63 74 73 20 26 26 20 5b 69 73  {$objects && [is
110c0 4f 62 6a 65 63 74 48 61 6e 64 6c 65 20 24 76 61  ObjectHandle $va
110d0 72 56 61 6c 75 65 5d 7d 20 74 68 65 6e 20 7b 0d  rValue]} then {.
110e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 75  .              u
110f0 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e  nset -nocomplain
11100 20 70 72 6f 70 65 72 74 69 65 73 0d 0a 20 20 20   properties..   
11110 20 20 20 20 20 20 20 20 20 20 20 67 65 74 41 6c             getAl
11120 6c 50 72 6f 70 65 72 74 69 65 73 20 24 76 61 72  lProperties $var
11130 56 61 6c 75 65 20 70 72 6f 70 65 72 74 69 65 73  Value properties
11140 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
11150 20 20 6c 61 70 70 65 6e 64 20 72 65 73 75 6c 74    lappend result
11160 20 5b 6c 69 73 74 20 24 6e 61 6d 65 20 5b 61 72   [list $name [ar
11170 72 61 79 20 67 65 74 20 70 72 6f 70 65 72 74 69  ray get properti
11180 65 73 5d 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  es]]..          
11190 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
111a0 20 20 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e            lappen
111b0 64 20 72 65 73 75 6c 74 20 5b 6c 69 73 74 20 24  d result [list $
111c0 6e 61 6d 65 20 24 76 61 72 56 61 6c 75 65 5d 0d  name $varValue].
111d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
111e0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
111f0 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
11200 20 20 20 20 20 20 20 20 20 73 65 74 20 76 61 72           set var
11210 56 61 6c 75 65 20 5b 75 70 6c 65 76 65 6c 20 31  Value [uplevel 1
11220 20 5b 6c 69 73 74 20 73 65 74 20 24 76 61 72 4e   [list set $varN
11230 61 6d 65 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  ame]]....       
11240 20 20 20 69 66 20 7b 24 6f 62 6a 65 63 74 73 20     if {$objects 
11250 26 26 20 5b 69 73 4f 62 6a 65 63 74 48 61 6e 64  && [isObjectHand
11260 6c 65 20 24 76 61 72 56 61 6c 75 65 5d 7d 20 74  le $varValue]} t
11270 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
11280 20 20 20 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70     unset -nocomp
11290 6c 61 69 6e 20 70 72 6f 70 65 72 74 69 65 73 0d  lain properties.
112a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 65 74  .            get
112b0 41 6c 6c 50 72 6f 70 65 72 74 69 65 73 20 24 76  AllProperties $v
112c0 61 72 56 61 6c 75 65 20 70 72 6f 70 65 72 74 69  arValue properti
112d0 65 73 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  es....          
112e0 20 20 6c 61 70 70 65 6e 64 20 72 65 73 75 6c 74    lappend result
112f0 20 5b 6c 69 73 74 20 24 76 61 72 4e 61 6d 65 20   [list $varName 
11300 5b 61 72 72 61 79 20 67 65 74 20 70 72 6f 70 65  [array get prope
11310 72 74 69 65 73 5d 5d 0d 0a 20 20 20 20 20 20 20  rties]]..       
11320 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
11330 20 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64           lappend
11340 20 72 65 73 75 6c 74 20 5b 6c 69 73 74 20 24 76   result [list $v
11350 61 72 4e 61 6d 65 20 24 76 61 72 56 61 6c 75 65  arName $varValue
11360 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ]..          }..
11370 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
11380 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75   }....      retu
11390 72 6e 20 24 72 65 73 75 6c 74 0d 0a 20 20 20 20  rn $result..    
113a0 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 65  }.....    proc e
113b0 6e 75 6d 65 72 61 62 6c 65 54 6f 4c 69 73 74 20  numerableToList 
113c0 7b 20 65 6e 75 6d 65 72 61 62 6c 65 20 7d 20 7b  { enumerable } {
113d0 0d 0a 20 20 20 20 20 20 73 65 74 20 72 65 73 75  ..      set resu
113e0 6c 74 20 5b 6c 69 73 74 5d 0d 0a 0d 0a 20 20 20  lt [list]....   
113f0 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
11400 65 6e 67 74 68 20 24 65 6e 75 6d 65 72 61 62 6c  ength $enumerabl
11410 65 5d 20 3d 3d 20 30 20 7c 7c 20 24 65 6e 75 6d  e] == 0 || $enum
11420 65 72 61 62 6c 65 20 65 71 20 22 6e 75 6c 6c 22  erable eq "null"
11430 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
11440 20 20 72 65 74 75 72 6e 20 24 72 65 73 75 6c 74    return $result
11450 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
11460 20 20 20 6f 62 6a 65 63 74 20 66 6f 72 65 61 63     object foreac
11470 68 20 2d 61 6c 69 61 73 20 69 74 65 6d 20 24 65  h -alias item $e
11480 6e 75 6d 65 72 61 62 6c 65 20 7b 0d 0a 20 20 20  numerable {..   
11490 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
114a0 20 6c 65 6e 67 74 68 20 24 69 74 65 6d 5d 20 3e   length $item] >
114b0 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
114c0 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 72 65        lappend re
114d0 73 75 6c 74 20 5b 24 69 74 65 6d 20 54 6f 53 74  sult [$item ToSt
114e0 72 69 6e 67 5d 0d 0a 20 20 20 20 20 20 20 20 7d  ring]..        }
114f0 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
11500 20 20 20 72 65 74 75 72 6e 20 24 72 65 73 75 6c     return $resul
11510 74 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  t..    }.....   
11520 20 70 72 6f 63 20 63 61 74 63 68 41 6e 64 52 65   proc catchAndRe
11530 74 75 72 6e 20 7b 20 73 63 72 69 70 74 20 7b 73  turn { script {s
11540 74 61 63 6b 54 72 61 63 65 20 66 61 6c 73 65 7d  tackTrace false}
11550 20 7b 73 74 72 69 63 74 20 74 72 75 65 7d 20 7d   {strict true} }
11560 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
11570 20 20 20 23 20 4e 4f 54 45 3a 20 45 76 61 6c 75     # NOTE: Evalu
11580 61 74 65 20 74 68 65 20 73 63 72 69 70 74 20 70  ate the script p
11590 72 6f 76 69 64 65 64 20 62 79 20 6f 75 72 20 63  rovided by our c
115a0 61 6c 6c 65 72 20 69 6e 20 74 68 65 69 72 20 63  aller in their c
115b0 6f 6e 74 65 78 74 2c 0d 0a 20 20 20 20 20 20 23  ontext,..      #
115c0 20 20 20 20 20 20 20 63 61 70 74 75 72 69 6e 67         capturing
115d0 20 62 6f 74 68 20 74 68 65 20 72 65 73 75 6c 74   both the result
115e0 20 61 6e 64 20 74 68 65 20 72 65 74 75 72 6e 20   and the return 
115f0 63 6f 64 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  code...      #..
11600 20 20 20 20 20 20 73 65 74 20 63 6f 64 65 20 5b        set code [
11610 63 61 74 63 68 20 7b 75 70 6c 65 76 65 6c 20 31  catch {uplevel 1
11620 20 24 73 63 72 69 70 74 7d 20 72 65 73 75 6c 74   $script} result
11630 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ]....      #..  
11640 20 20 20 20 23 20 4e 4f 54 45 3a 20 44 69 64 20      # NOTE: Did 
11650 74 68 65 20 73 63 72 69 70 74 20 70 72 6f 76 69  the script provi
11660 64 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65  ded by our calle
11670 72 20 4e 4f 54 20 72 61 69 73 65 20 61 6e 20 65  r NOT raise an e
11680 72 72 6f 72 3f 0d 0a 20 20 20 20 20 20 23 0d 0a  rror?..      #..
11690 20 20 20 20 20 20 69 66 20 7b 24 73 74 72 69 63        if {$stric
116a0 74 20 26 26 20 24 63 6f 64 65 20 3d 3d 20 30 20  t && $code == 0 
116b0 7c 7c 20 21 24 73 74 72 69 63 74 20 26 26 20 24  || !$strict && $
116c0 63 6f 64 65 20 21 3d 20 31 7d 20 74 68 65 6e 20  code != 1} then 
116d0 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
116e0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 75        # NOTE: Su
116f0 63 63 65 73 73 2e 20 20 52 65 74 75 72 6e 20 61  ccess.  Return a
11700 20 6c 69 73 74 20 77 69 74 68 20 74 68 65 20 72   list with the r
11710 65 74 75 72 6e 20 63 6f 64 65 20 61 6e 64 20 74  eturn code and t
11720 68 65 20 72 65 73 75 6c 74 2e 0d 0a 20 20 20 20  he result...    
11730 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
11740 65 74 75 72 6e 20 5b 6c 69 73 74 20 24 63 6f 64  eturn [list $cod
11750 65 20 24 72 65 73 75 6c 74 5d 0d 0a 20 20 20 20  e $result]..    
11760 20 20 7d 20 65 6c 73 65 69 66 20 7b 24 73 74 61    } elseif {$sta
11770 63 6b 54 72 61 63 65 7d 20 74 68 65 6e 20 7b 0d  ckTrace} then {.
11780 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
11790 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 61 69 6c      # NOTE: Fail
117a0 75 72 65 2e 20 20 4f 75 72 20 63 61 6c 6c 65 72  ure.  Our caller
117b0 20 77 61 6e 74 73 20 61 20 66 75 6c 6c 20 73 74   wants a full st
117c0 61 63 6b 20 74 72 61 63 65 20 28 69 66 20 61 70  ack trace (if ap
117d0 70 6c 69 63 61 62 6c 65 29 2c 0d 0a 20 20 20 20  plicable),..    
117e0 20 20 20 20 23 20 20 20 20 20 20 20 72 65 74 75      #       retu
117f0 72 6e 20 61 20 6c 69 73 74 20 77 69 74 68 20 74  rn a list with t
11800 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 61  he return code a
11810 6e 64 20 74 68 65 20 72 65 73 75 6c 74 20 76 65  nd the result ve
11820 72 62 61 74 69 6d 2e 0d 0a 20 20 20 20 20 20 20  rbatim...       
11830 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   #..        retu
11840 72 6e 20 5b 6c 69 73 74 20 24 63 6f 64 65 20 24  rn [list $code $
11850 72 65 73 75 6c 74 5d 0d 0a 20 20 20 20 20 20 7d  result]..      }
11860 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
11870 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
11880 54 45 3a 20 46 61 69 6c 75 72 65 2e 20 20 4f 75  TE: Failure.  Ou
11890 72 20 63 61 6c 6c 65 72 20 64 6f 65 73 20 6e 6f  r caller does no
118a0 74 20 77 61 6e 74 20 61 20 66 75 6c 6c 20 73 74  t want a full st
118b0 61 63 6b 20 74 72 61 63 65 20 28 69 66 0d 0a 20  ack trace (if.. 
118c0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61         #       a
118d0 70 70 6c 69 63 61 62 6c 65 29 2c 20 72 65 74 75  pplicable), retu
118e0 72 6e 20 61 20 6c 69 73 74 20 77 69 74 68 20 74  rn a list with t
118f0 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 2c 20  he return code, 
11900 74 68 65 20 65 72 72 6f 72 0d 0a 20 20 20 20 20  the error..     
11910 20 20 20 23 20 20 20 20 20 20 20 63 6f 64 65 20     #       code 
11920 66 6f 72 20 74 68 65 20 69 6e 74 65 72 70 72 65  for the interpre
11930 74 65 72 2c 20 61 6e 64 20 74 68 65 20 65 72 72  ter, and the err
11940 6f 72 20 6d 65 73 73 61 67 65 20 75 70 20 74 6f  or message up to
11950 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20   the..        # 
11960 20 20 20 20 20 20 70 6f 69 6e 74 20 77 68 65 72        point wher
11970 65 20 74 68 65 20 73 74 61 63 6b 20 74 72 61 63  e the stack trac
11980 65 20 73 68 6f 75 6c 64 20 73 74 61 72 74 2e 0d  e should start..
11990 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
119a0 20 20 20 20 72 65 74 75 72 6e 20 5b 6c 69 73 74      return [list
119b0 20 24 63 6f 64 65 20 24 3a 3a 65 72 72 6f 72 43   $code $::errorC
119c0 6f 64 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ode \..         
119d0 20 20 20 5b 65 78 74 72 61 63 74 53 79 73 74 65     [extractSyste
119e0 6d 44 61 74 61 53 51 4c 69 74 65 45 78 63 65 70  mDataSQLiteExcep
119f0 74 69 6f 6e 4d 65 73 73 61 67 65 20 24 72 65 73  tionMessage $res
11a00 75 6c 74 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a  ult]]..      }..
11a10 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
11a20 6f 63 20 63 6f 6d 70 69 6c 65 43 53 68 61 72 70  oc compileCSharp
11a30 57 69 74 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  With {..        
11a40 20 20 20 20 74 65 78 74 20 6d 65 6d 6f 72 79 20      text memory 
11a50 73 79 6d 62 6f 6c 73 20 73 74 72 69 63 74 20 72  symbols strict r
11a60 65 73 75 6c 74 73 56 61 72 4e 61 6d 65 20 65 72  esultsVarName er
11a70 72 6f 72 73 56 61 72 4e 61 6d 65 20 66 69 6c 65  rorsVarName file
11a80 4e 61 6d 65 73 0d 0a 20 20 20 20 20 20 20 20 20  Names..         
11a90 20 20 20 61 72 67 73 20 7d 20 7b 0d 0a 20 20 20     args } {..   
11aa0 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
11ab0 54 45 3a 20 53 69 6e 63 65 20 77 65 20 61 72 65  TE: Since we are
11ac0 20 67 6f 69 6e 67 20 74 6f 20 75 73 65 20 74 68   going to use th
11ad0 69 73 20 6d 65 74 68 6f 64 20 6e 61 6d 65 20 61  is method name a
11ae0 20 6c 6f 74 2c 20 61 73 73 69 67 6e 20 69 74 20   lot, assign it 
11af0 74 6f 20 61 0d 0a 20 20 20 20 20 20 23 20 20 20  to a..      #   
11b00 20 20 20 20 76 61 72 69 61 62 6c 65 20 66 69 72      variable fir
11b10 73 74 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  st...      #..  
11b20 20 20 20 20 73 65 74 20 61 64 64 20 52 65 66 65      set add Refe
11b30 72 65 6e 63 65 64 41 73 73 65 6d 62 6c 69 65 73  rencedAssemblies
11b40 2e 41 64 64 0d 0a 0d 0a 20 20 20 20 20 20 23 0d  .Add....      #.
11b50 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43  .      # NOTE: C
11b60 72 65 61 74 65 20 74 68 65 20 62 61 73 65 20 63  reate the base c
11b70 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 75 61  ommand to evalua
11b80 74 65 20 61 6e 64 20 61 64 64 20 74 68 65 20 70  te and add the p
11b90 72 6f 70 65 72 74 79 20 73 65 74 74 69 6e 67 73  roperty settings
11ba0 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
11bb0 74 68 61 74 20 61 72 65 20 61 6c 6d 6f 73 74 20  that are almost 
11bc0 61 6c 77 61 79 73 20 6e 65 65 64 65 64 20 62 79  always needed by
11bd0 20 6f 75 72 20 75 6e 69 74 20 74 65 73 74 73 20   our unit tests 
11be0 28 69 2e 65 2e 20 74 68 65 20 53 79 73 74 65 6d  (i.e. the System
11bf0 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
11c00 61 6e 64 20 53 79 73 74 65 6d 2e 44 61 74 61 20  and System.Data 
11c10 61 73 73 65 6d 62 6c 79 20 72 65 66 65 72 65 6e  assembly referen
11c20 63 65 73 29 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  ces)...      #..
11c30 20 20 20 20 20 20 73 65 74 20 63 6f 6d 6d 61 6e        set comman
11c40 64 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20  d [list \..     
11c50 20 20 20 20 20 63 6f 6d 70 69 6c 65 43 53 68 61       compileCSha
11c60 72 70 20 24 74 65 78 74 20 24 6d 65 6d 6f 72 79  rp $text $memory
11c70 20 24 73 79 6d 62 6f 6c 73 20 24 73 74 72 69 63   $symbols $stric
11c80 74 20 72 65 73 75 6c 74 73 20 65 72 72 6f 72 73  t results errors
11c90 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 24 61   \..          $a
11ca0 64 64 20 53 79 73 74 65 6d 2e 64 6c 6c 20 24 61  dd System.dll $a
11cb0 64 64 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 64  dd System.Data.d
11cc0 6c 6c 20 24 61 64 64 20 53 79 73 74 65 6d 2e 54  ll $add System.T
11cd0 72 61 6e 73 61 63 74 69 6f 6e 73 2e 64 6c 6c 20  ransactions.dll 
11ce0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 24 61 64  \..          $ad
11cf0 64 20 53 79 73 74 65 6d 2e 58 6d 6c 2e 64 6c 6c  d System.Xml.dll
11d00 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ]....      #..  
11d10 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 64 64 20      # NOTE: Add 
11d20 61 6c 6c 20 74 68 65 20 70 72 6f 76 69 64 65 64  all the provided
11d30 20 66 69 6c 65 20 6e 61 6d 65 73 20 61 73 20 61   file names as a
11d40 73 73 65 6d 62 6c 79 20 72 65 66 65 72 65 6e 63  ssembly referenc
11d50 65 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  es...      #..  
11d60 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65      foreach file
11d70 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 73 20  Name $fileNames 
11d80 7b 0d 0a 20 20 20 20 20 20 20 20 6c 61 70 70 65  {..        lappe
11d90 6e 64 20 63 6f 6d 6d 61 6e 64 20 24 61 64 64 20  nd command $add 
11da0 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61  [getBinaryFileNa
11db0 6d 65 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20  me $fileName].. 
11dc0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
11dd0 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
11de0 20 41 64 64 20 74 68 65 20 65 78 74 72 61 20 61   Add the extra a
11df0 72 67 75 6d 65 6e 74 73 2c 20 69 66 20 61 6e 79  rguments, if any
11e00 2c 20 74 6f 20 74 68 65 20 63 6f 6d 6d 61 6e 64  , to the command
11e10 20 74 6f 20 65 76 61 6c 75 61 74 65 2e 0d 0a 20   to evaluate... 
11e20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 65 76       #..      ev
11e30 61 6c 20 6c 61 70 70 65 6e 64 20 63 6f 6d 6d 61  al lappend comma
11e40 6e 64 20 24 61 72 67 73 0d 0a 0d 0a 20 20 20 20  nd $args....    
11e50 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
11e60 45 3a 20 41 6c 69 61 73 20 74 68 65 20 63 6f 6d  E: Alias the com
11e70 70 69 6c 65 72 20 6c 6f 63 61 6c 20 72 65 73 75  piler local resu
11e80 6c 74 73 20 61 6e 64 20 65 72 72 6f 72 73 20 76  lts and errors v
11e90 61 72 69 61 62 6c 65 73 20 74 6f 20 74 68 65 0d  ariables to the.
11ea0 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 76  .      #       v
11eb0 61 72 69 61 62 6c 65 20 6e 61 6d 65 73 20 70 72  ariable names pr
11ec0 6f 76 69 64 65 64 20 62 79 20 6f 75 72 20 63 61  ovided by our ca
11ed0 6c 6c 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  ller...      #..
11ee0 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
11ef0 67 20 6c 65 6e 67 74 68 20 24 72 65 73 75 6c 74  g length $result
11f00 73 56 61 72 4e 61 6d 65 5d 20 3e 20 30 7d 20 74  sVarName] > 0} t
11f10 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 75  hen {..        u
11f20 70 76 61 72 20 31 20 24 72 65 73 75 6c 74 73 56  pvar 1 $resultsV
11f30 61 72 4e 61 6d 65 20 72 65 73 75 6c 74 73 0d 0a  arName results..
11f40 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
11f50 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
11f60 67 74 68 20 24 65 72 72 6f 72 73 56 61 72 4e 61  gth $errorsVarNa
11f70 6d 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  me] > 0} then {.
11f80 0a 20 20 20 20 20 20 20 20 75 70 76 61 72 20 31  .        upvar 1
11f90 20 24 65 72 72 6f 72 73 56 61 72 4e 61 6d 65 20   $errorsVarName 
11fa0 65 72 72 6f 72 73 0d 0a 20 20 20 20 20 20 7d 0d  errors..      }.
11fb0 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
11fc0 20 20 23 20 4e 4f 54 45 3a 20 45 76 61 6c 75 61    # NOTE: Evalua
11fd0 74 65 20 74 68 65 20 63 6f 6e 73 74 72 75 63 74  te the construct
11fe0 65 64 20 5b 63 6f 6d 70 69 6c 65 43 53 68 61 72  ed [compileCShar
11ff0 70 5d 20 63 6f 6d 6d 61 6e 64 20 61 6e 64 20 72  p] command and r
12000 65 74 75 72 6e 20 74 68 65 0d 0a 20 20 20 20 20  eturn the..     
12010 20 23 20 20 20 20 20 20 20 72 65 73 75 6c 74 2e   #       result.
12020 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
12030 20 65 76 61 6c 20 24 63 6f 6d 6d 61 6e 64 0d 0a   eval $command..
12040 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
12050 6f 63 20 69 73 4d 65 6d 6f 72 79 44 62 20 7b 20  oc isMemoryDb { 
12060 66 69 6c 65 4e 61 6d 65 20 7d 20 7b 0d 0a 20 20  fileName } {..  
12070 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
12080 4f 54 45 3a 20 49 73 20 74 68 65 20 73 70 65 63  OTE: Is the spec
12090 69 66 69 65 64 20 64 61 74 61 62 61 73 65 20 66  ified database f
120a0 69 6c 65 20 6e 61 6d 65 20 72 65 61 6c 6c 79 20  ile name really 
120b0 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
120c0 61 62 61 73 65 3f 0d 0a 20 20 20 20 20 20 23 0d  abase?..      #.
120d0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 65  .      return [e
120e0 78 70 72 20 7b 24 66 69 6c 65 4e 61 6d 65 20 65  xpr {$fileName e
120f0 71 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 7c 7c 20  q ":memory:" || 
12100 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74  \..          [st
12110 72 69 6e 67 20 72 61 6e 67 65 20 24 66 69 6c 65  ring range $file
12120 4e 61 6d 65 20 30 20 31 32 5d 20 65 71 20 22 66  Name 0 12] eq "f
12130 69 6c 65 3a 3a 6d 65 6d 6f 72 79 3a 22 7d 5d 0d  ile::memory:"}].
12140 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
12150 72 6f 63 20 69 73 54 61 62 6c 65 49 6e 44 62 20  roc isTableInDb 
12160 7b 20 6e 61 6d 65 20 7b 76 61 72 4e 61 6d 65 20  { name {varName 
12170 64 62 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23  db} } {..      #
12180 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
12190 52 65 66 65 72 20 74 6f 20 74 68 65 20 73 70 65  Refer to the spe
121a0 63 69 66 69 65 64 20 76 61 72 69 61 62 6c 65 20  cified variable 
121b0 28 65 2e 67 2e 20 22 64 62 22 29 20 69 6e 20 74  (e.g. "db") in t
121c0 68 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75  he context of ou
121d0 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  r..      #      
121e0 20 63 61 6c 6c 65 72 2e 20 20 49 74 20 63 6f 6e   caller.  It con
121f0 74 61 69 6e 73 20 74 68 65 20 64 61 74 61 62 61  tains the databa
12200 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61  se connection ha
12210 6e 64 6c 65 20 74 68 61 74 20 77 69 6c 6c 20 62  ndle that will b
12220 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
12230 20 75 73 65 64 20 74 6f 20 65 78 65 63 75 74 65   used to execute
12240 20 74 68 65 20 71 75 65 72 79 20 75 73 65 64 20   the query used 
12250 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20  to determine if 
12260 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 20  the named table 
12270 69 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  is..      #     
12280 20 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 61    present in tha
12290 74 20 64 61 74 61 62 61 73 65 2e 0d 0a 20 20 20  t database...   
122a0 20 20 20 23 0d 0a 20 20 20 20 20 20 75 70 76 61     #..      upva
122b0 72 20 31 20 24 76 61 72 4e 61 6d 65 20 64 62 0d  r 1 $varName db.
122c0 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
122d0 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68    # NOTE: Use th
122e0 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
122f0 74 61 62 6c 65 20 74 6f 20 64 65 74 65 72 6d 69  table to determi
12300 6e 65 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20  ne if the named 
12310 74 61 62 6c 65 20 69 73 0d 0a 20 20 20 20 20 20  table is..      
12320 23 20 20 20 20 20 20 20 70 72 65 73 65 6e 74 20  #       present 
12330 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  in the database.
12340 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
12350 20 73 65 74 20 73 71 6c 20 7b 0d 0a 20 20 20 20   set sql {..    
12360 20 20 20 20 53 45 4c 45 43 54 20 43 4f 55 4e 54      SELECT COUNT
12370 28 2a 29 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  (*) FROM sqlite_
12380 6d 61 73 74 65 72 20 57 48 45 52 45 20 74 79 70  master WHERE typ
12390 65 20 3d 20 27 74 61 62 6c 65 27 20 41 4e 44 20  e = 'table' AND 
123a0 6e 61 6d 65 20 3d 20 3f 3b 0d 0a 20 20 20 20 20  name = ?;..     
123b0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   }....      #.. 
123c0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 74       # NOTE: Ret
123d0 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20  urn non-zero if 
123e0 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 20  the named table 
123f0 69 73 20 70 72 65 73 65 6e 74 2e 0d 0a 20 20 20  is present...   
12400 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75     #..      retu
12410 72 6e 20 5b 65 78 70 72 20 7b 0d 0a 20 20 20 20  rn [expr {..    
12420 20 20 20 20 5b 73 71 6c 20 65 78 65 63 75 74 65      [sql execute
12430 20 2d 65 78 65 63 75 74 65 20 73 63 61 6c 61 72   -execute scalar
12440 20 24 64 62 20 24 73 71 6c 20 5b 6c 69 73 74 20   $db $sql [list 
12450 70 61 72 61 6d 31 20 53 74 72 69 6e 67 20 24 6e  param1 String $n
12460 61 6d 65 5d 5d 20 3e 20 30 0d 0a 20 20 20 20 20  ame]] > 0..     
12470 20 7d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20   }]..    }..... 
12480 20 20 20 70 72 6f 63 20 67 65 74 44 62 44 65 66     proc getDbDef
12490 61 75 6c 74 50 61 67 65 53 69 7a 65 20 7b 7d 20  aultPageSize {} 
124a0 7b 0d 0a 20 20 20 20 20 20 74 72 79 20 7b 0d 0a  {..      try {..
124b0 20 20 20 20 20 20 20 20 73 65 74 20 64 62 20 5b          set db [
124c0 73 71 6c 20 6f 70 65 6e 20 2d 74 79 70 65 20 53  sql open -type S
124d0 51 4c 69 74 65 20 7b 44 61 74 61 20 53 6f 75 72  QLite {Data Sour
124e0 63 65 3d 3a 6d 65 6d 6f 72 79 3a 3b 7d 5d 0d 0a  ce=:memory:;}]..
124f0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b          return [
12500 73 71 6c 20 65 78 65 63 75 74 65 20 2d 65 78 65  sql execute -exe
12510 63 75 74 65 20 73 63 61 6c 61 72 20 24 64 62 20  cute scalar $db 
12520 22 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a  "PRAGMA page_siz
12530 65 3b 22 5d 0d 0a 20 20 20 20 20 20 7d 20 66 69  e;"]..      } fi
12540 6e 61 6c 6c 79 20 7b 0d 0a 20 20 20 20 20 20 20  nally {..       
12550 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
12560 73 20 64 62 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  s db]} then {.. 
12570 20 20 20 20 20 20 20 20 20 63 61 74 63 68 20 7b           catch {
12580 73 71 6c 20 63 6c 6f 73 65 20 24 64 62 7d 0d 0a  sql close $db}..
12590 20 20 20 20 20 20 20 20 20 20 75 6e 73 65 74 20            unset 
125a0 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 64 62 0d 0a  -nocomplain db..
125b0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
125c0 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
125d0 20 20 70 72 6f 63 20 67 65 74 44 62 44 65 66 61    proc getDbDefa
125e0 75 6c 74 43 61 63 68 65 53 69 7a 65 20 7b 7d 20  ultCacheSize {} 
125f0 7b 0d 0a 20 20 20 20 20 20 74 72 79 20 7b 0d 0a  {..      try {..
12600 20 20 20 20 20 20 20 20 73 65 74 20 64 62 20 5b          set db [
12610 73 71 6c 20 6f 70 65 6e 20 2d 74 79 70 65 20 53  sql open -type S
12620 51 4c 69 74 65 20 7b 44 61 74 61 20 53 6f 75 72  QLite {Data Sour
12630 63 65 3d 3a 6d 65 6d 6f 72 79 3a 3b 7d 5d 0d 0a  ce=:memory:;}]..
12640 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b          return [
12650 73 71 6c 20 65 78 65 63 75 74 65 20 2d 65 78 65  sql execute -exe
12660 63 75 74 65 20 73 63 61 6c 61 72 20 24 64 62 20  cute scalar $db 
12670 22 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69  "PRAGMA cache_si
12680 7a 65 3b 22 5d 0d 0a 20 20 20 20 20 20 7d 20 66  ze;"]..      } f
12690 69 6e 61 6c 6c 79 20 7b 0d 0a 20 20 20 20 20 20  inally {..      
126a0 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73    if {[info exis
126b0 74 73 20 64 62 5d 7d 20 74 68 65 6e 20 7b 0d 0a  ts db]} then {..
126c0 20 20 20 20 20 20 20 20 20 20 63 61 74 63 68 20            catch 
126d0 7b 73 71 6c 20 63 6c 6f 73 65 20 24 64 62 7d 0d  {sql close $db}.
126e0 0a 20 20 20 20 20 20 20 20 20 20 75 6e 73 65 74  .          unset
126f0 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 64 62 0d   -nocomplain db.
12700 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
12710 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
12720 20 20 20 70 72 6f 63 20 75 73 65 4c 65 67 61 63     proc useLegac
12730 79 44 62 50 61 67 65 41 6e 64 43 61 63 68 65 53  yDbPageAndCacheS
12740 69 7a 65 73 20 7b 20 76 61 72 4e 61 6d 65 20 7d  izes { varName }
12750 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
12760 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 66 65 72     # NOTE: Refer
12770 20 74 6f 20 74 68 65 20 73 70 65 63 69 66 69 65   to the specifie
12780 64 20 76 61 72 69 61 62 6c 65 20 28 65 2e 67 2e  d variable (e.g.
12790 20 22 64 62 22 29 20 69 6e 20 74 68 65 20 63 6f   "db") in the co
127a0 6e 74 65 78 74 20 6f 66 20 6f 75 72 0d 0a 20 20  ntext of our..  
127b0 20 20 20 20 23 20 20 20 20 20 20 20 63 61 6c 6c      #       call
127c0 65 72 2e 20 20 49 74 20 63 6f 6e 74 61 69 6e 73  er.  It contains
127d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
127e0 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20  nnection handle 
127f0 74 68 61 74 20 77 69 6c 6c 20 62 65 0d 0a 20 20  that will be..  
12800 20 20 20 20 23 20 20 20 20 20 20 20 75 73 65 64      #       used
12810 20 74 6f 20 65 78 65 63 75 74 65 20 71 75 65 72   to execute quer
12820 69 65 73 20 75 73 65 64 20 74 6f 20 73 65 74 20  ies used to set 
12830 74 68 65 20 70 61 67 65 20 61 6e 64 20 63 61 63  the page and cac
12840 68 65 20 73 69 7a 65 73 2e 0d 0a 20 20 20 20 20  he sizes...     
12850 20 23 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20   #..      upvar 
12860 31 20 24 76 61 72 4e 61 6d 65 20 64 62 0d 0a 0d  1 $varName db...
12870 0a 20 20 20 20 20 20 73 71 6c 20 65 78 65 63 75  .      sql execu
12880 74 65 20 24 64 62 20 7b 0d 0a 20 20 20 20 20 20  te $db {..      
12890 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69    PRAGMA page_si
128a0 7a 65 20 3d 20 31 30 32 34 3b 0d 0a 20 20 20 20  ze = 1024;..    
128b0 20 20 20 20 50 52 41 47 4d 41 20 63 61 63 68 65      PRAGMA cache
128c0 5f 73 69 7a 65 20 3d 20 32 30 30 30 3b 0d 0a 20  _size = 2000;.. 
128d0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
128e0 72 65 74 75 72 6e 20 5b 6c 69 73 74 20 5c 0d 0a  return [list \..
128f0 20 20 20 20 20 20 20 20 20 20 5b 73 71 6c 20 65            [sql e
12900 78 65 63 75 74 65 20 2d 65 78 65 63 75 74 65 20  xecute -execute 
12910 73 63 61 6c 61 72 20 24 64 62 20 22 50 52 41 47  scalar $db "PRAG
12920 4d 41 20 70 61 67 65 5f 73 69 7a 65 3b 22 5d 20  MA page_size;"] 
12930 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 71  \..          [sq
12940 6c 20 65 78 65 63 75 74 65 20 2d 65 78 65 63 75  l execute -execu
12950 74 65 20 73 63 61 6c 61 72 20 24 64 62 20 22 50  te scalar $db "P
12960 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65  RAGMA cache_size
12970 3b 22 5d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  ;"]]..    }.....
12980 20 20 20 20 70 72 6f 63 20 65 78 74 72 61 63 74      proc extract
12990 53 79 73 74 65 6d 44 61 74 61 53 51 4c 69 74 65  SystemDataSQLite
129a0 45 78 63 65 70 74 69 6f 6e 4d 65 73 73 61 67 65  ExceptionMessage
129b0 20 7b 20 76 61 6c 75 65 20 7d 20 7b 0d 0a 20 20   { value } {..  
129c0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
129d0 4f 54 45 3a 20 49 66 20 74 68 65 20 73 74 72 69  OTE: If the stri
129e0 6e 67 20 63 6f 6e 66 6f 72 6d 73 20 74 6f 20 66  ng conforms to f
129f0 6f 72 6d 61 74 20 6f 66 20 74 68 65 20 6e 6f 72  ormat of the nor
12a00 6d 61 6c 20 65 78 63 65 70 74 69 6f 6e 0d 0a 20  mal exception.. 
12a10 20 20 20 20 20 23 20 20 20 20 20 20 20 65 72 72       #       err
12a20 6f 72 20 73 74 72 69 6e 67 73 2c 20 65 78 74 72  or strings, extr
12a30 61 63 74 20 61 6e 64 20 72 65 74 75 72 6e 20 6f  act and return o
12a40 6e 6c 79 20 74 68 65 20 65 72 72 6f 72 20 6d 65  nly the error me
12a50 73 73 61 67 65 0d 0a 20 20 20 20 20 20 23 20 20  ssage..      #  
12a60 20 20 20 20 20 70 6f 72 74 69 6f 6e 20 69 74 73       portion its
12a70 65 6c 66 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  elf...      #.. 
12a80 20 20 20 20 20 73 65 74 20 70 61 74 74 65 72 6e       set pattern
12a90 73 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20  s [list \..     
12aa0 20 7b 53 79 73 74 65 6d 5c 2e 44 61 74 61 5c 2e   {System\.Data\.
12ab0 53 51 4c 69 74 65 5c 2e 53 51 4c 69 74 65 45 78  SQLite\.SQLiteEx
12ac0 63 65 70 74 69 6f 6e 20 5c 28 30 78 38 30 30 30  ception \(0x8000
12ad0 34 30 30 35 5c 29 3a 20 28 2e 2b 3f 29 20 20 28  4005\): (.+?)  (
12ae0 3f 3a 20 29 3f 61 74 7d 20 5c 0d 0a 20 20 20 20  ?: )?at} \..    
12af0 20 20 7b 53 79 73 74 65 6d 5c 2e 44 61 74 61 5c    {System\.Data\
12b00 2e 53 51 4c 69 74 65 5c 2e 53 51 4c 69 74 65 45  .SQLite\.SQLiteE
12b10 78 63 65 70 74 69 6f 6e 3a 20 28 2e 2b 3f 29 20  xception: (.+?) 
12b20 20 28 3f 3a 20 29 3f 61 74 7d 20 5c 0d 0a 20 20   (?: )?at} \..  
12b30 20 20 20 20 7b 45 61 67 6c 65 5c 2e 5f 43 6f 6d      {Eagle\._Com
12b40 70 6f 6e 65 6e 74 73 5c 2e 50 75 62 6c 69 63 5c  ponents\.Public\
12b50 2e 53 63 72 69 70 74 45 78 63 65 70 74 69 6f 6e  .ScriptException
12b60 3a 20 28 2e 2b 3f 29 20 20 28 3f 3a 20 29 3f 61  : (.+?)  (?: )?a
12b70 74 7d 5d 0d 0a 0d 0a 20 20 20 20 20 20 66 6f 72  t}]....      for
12b80 65 61 63 68 20 70 61 74 74 65 72 6e 20 24 70 61  each pattern $pa
12b90 74 74 65 72 6e 73 20 7b 0d 0a 20 20 20 20 20 20  tterns {..      
12ba0 20 20 69 66 20 7b 5b 72 65 67 65 78 70 20 2d 2d    if {[regexp --
12bb0 20 24 70 61 74 74 65 72 6e 20 24 76 61 6c 75 65   $pattern $value
12bc0 20 64 75 6d 6d 79 20 6d 65 73 73 61 67 65 5d 7d   dummy message]}
12bd0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
12be0 20 20 20 73 65 74 20 6d 65 73 73 61 67 65 20 5b     set message [
12bf0 73 74 72 69 6e 67 20 6d 61 70 20 5b 6c 69 73 74  string map [list
12c00 20 5c 72 5c 6e 20 5c 6e 5d 20 5b 73 74 72 69 6e   \r\n \n] [strin
12c10 67 20 74 72 69 6d 20 24 6d 65 73 73 61 67 65 5d  g trim $message]
12c20 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  ]..          set
12c30 20 6c 69 6e 65 73 20 5b 73 70 6c 69 74 20 24 6d   lines [split $m
12c40 65 73 73 61 67 65 20 5c 6e 5d 0d 0a 0d 0a 20 20  essage \n]....  
12c50 20 20 20 20 20 20 20 20 69 66 20 7b 5b 6c 6c 65          if {[lle
12c60 6e 67 74 68 20 24 6c 69 6e 65 73 5d 20 3d 3d 20  ngth $lines] == 
12c70 32 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  2} then {..     
12c80 20 20 20 20 20 20 20 69 66 20 7b 5b 6c 69 6e 64         if {[lind
12c90 65 78 20 24 6c 69 6e 65 73 20 30 5d 20 65 71 20  ex $lines 0] eq 
12ca0 5b 6c 69 6e 64 65 78 20 24 6c 69 6e 65 73 20 31  [lindex $lines 1
12cb0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
12cc0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
12cd0 5b 6c 69 6e 64 65 78 20 24 6c 69 6e 65 73 20 30  [lindex $lines 0
12ce0 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ]..            }
12cf0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
12d00 72 65 74 75 72 6e 20 5b 61 70 70 65 6e 64 41 72  return [appendAr
12d10 67 73 20 5b 6c 69 6e 64 65 78 20 24 6c 69 6e 65  gs [lindex $line
12d20 73 20 30 5d 20 22 20 2d 2d 20 22 20 5b 6c 69 6e  s 0] " -- " [lin
12d30 64 65 78 20 24 6c 69 6e 65 73 20 31 5d 5d 0d 0a  dex $lines 1]]..
12d40 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
12d50 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
12d60 24 6d 65 73 73 61 67 65 0d 0a 20 20 20 20 20 20  $message..      
12d70 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a    }..      }....
12d80 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 76 61        return $va
12d90 6c 75 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20  lue..    }..... 
12da0 20 20 20 70 72 6f 63 20 74 72 69 6d 53 71 6c 20     proc trimSql 
12db0 7b 20 73 71 6c 20 7d 20 7b 0d 0a 20 20 20 20 20  { sql } {..     
12dc0 20 72 65 74 75 72 6e 20 5b 72 65 67 73 75 62 20   return [regsub 
12dd0 2d 61 6c 6c 20 2d 2d 20 7b 5c 73 2b 7d 20 5b 73  -all -- {\s+} [s
12de0 74 72 69 6e 67 20 74 72 69 6d 20 24 73 71 6c 5d  tring trim $sql]
12df0 20 22 20 22 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d   " "]..    }....
12e00 0a 20 20 20 20 70 72 6f 63 20 65 78 65 63 75 74  .    proc execut
12e10 65 53 71 6c 20 7b 20 73 71 6c 20 7b 65 78 65 63  eSql { sql {exec
12e20 75 74 65 20 6e 6f 6e 65 7d 20 7b 66 6f 72 6d 61  ute none} {forma
12e30 74 20 6e 6f 6e 65 7d 20 7b 66 69 6c 65 4e 61 6d  t none} {fileNam
12e40 65 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  e ""} } {..     
12e50 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
12e60 67 74 68 20 24 66 69 6c 65 4e 61 6d 65 5d 20 3d  gth $fileName] =
12e70 3d 20 30 7d 20 74 68 65 6e 20 7b 73 65 74 20 66  = 0} then {set f
12e80 69 6c 65 4e 61 6d 65 20 3a 6d 65 6d 6f 72 79 3a  ileName :memory:
12e90 7d 0d 0a 20 20 20 20 20 20 73 65 74 75 70 44 62  }..      setupDb
12ea0 20 24 66 69 6c 65 4e 61 6d 65 20 22 22 20 22 22   $fileName "" ""
12eb0 20 22 22 20 22 22 20 22 22 20 66 61 6c 73 65 20   "" "" "" false 
12ec0 66 61 6c 73 65 20 66 61 6c 73 65 20 66 61 6c 73  false false fals
12ed0 65 20 64 62 20 74 72 75 65 0d 0a 0d 0a 20 20 20  e db true....   
12ee0 20 20 20 74 72 79 20 7b 0d 0a 20 20 20 20 20 20     try {..      
12ef0 20 20 72 65 74 75 72 6e 20 5b 75 70 6c 65 76 65    return [upleve
12f00 6c 20 31 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20  l 1 [list \..   
12f10 20 20 20 20 20 20 20 20 20 73 71 6c 20 65 78 65           sql exe
12f20 63 75 74 65 20 2d 65 78 65 63 75 74 65 20 24 65  cute -execute $e
12f30 78 65 63 75 74 65 20 2d 66 6f 72 6d 61 74 20 24  xecute -format $
12f40 66 6f 72 6d 61 74 20 24 64 62 20 24 73 71 6c 5d  format $db $sql]
12f50 5d 0d 0a 20 20 20 20 20 20 7d 20 66 69 6e 61 6c  ]..      } final
12f60 6c 79 20 7b 0d 0a 20 20 20 20 20 20 20 20 63 6c  ly {..        cl
12f70 65 61 6e 75 70 44 62 20 24 66 69 6c 65 4e 61 6d  eanupDb $fileNam
12f80 65 20 64 62 20 66 61 6c 73 65 20 66 61 6c 73 65  e db false false
12f90 20 66 61 6c 73 65 0d 0a 20 20 20 20 20 20 7d 0d   false..      }.
12fa0 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
12fb0 72 6f 63 20 68 61 73 4e 6f 46 6c 61 67 73 20 7b  roc hasNoFlags {
12fc0 20 76 61 72 4e 61 6d 65 20 6e 6f 6e 65 20 7d 20   varName none } 
12fd0 7b 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20 31  {..      upvar 1
12fe0 20 24 76 61 72 4e 61 6d 65 20 66 6c 61 67 73 0d   $varName flags.
12ff0 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 69  ...      if {![i
13000 6e 66 6f 20 65 78 69 73 74 73 20 66 6c 61 67 73  nfo exists flags
13010 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
13020 20 20 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a     return true..
13030 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
13040 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
13050 67 74 68 20 24 66 6c 61 67 73 5d 20 3d 3d 20 30  gth $flags] == 0
13060 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
13070 20 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20    return true.. 
13080 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
13090 69 66 20 7b 24 6e 6f 6e 65 20 26 26 20 24 66 6c  if {$none && $fl
130a0 61 67 73 20 65 71 20 22 4e 6f 6e 65 22 7d 20 74  ags eq "None"} t
130b0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72  hen {..        r
130c0 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20  eturn true..    
130d0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74    }....      ret
130e0 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20 7d  urn false..    }
130f0 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65  .....    proc ge
13100 74 43 6f 6e 6e 65 63 74 69 6f 6e 46 6c 61 67 73  tConnectionFlags
13110 20 7b 20 66 69 6c 65 4e 61 6d 65 20 66 6c 61 67   { fileName flag
13120 73 20 7b 71 75 69 65 74 20 66 61 6c 73 65 7d 20  s {quiet false} 
13130 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
13140 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69 67 75      # NOTE: Figu
13150 72 65 20 6f 75 74 20 77 68 69 63 68 20 64 61 74  re out which dat
13160 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20  abase file name 
13170 6f 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74  or connection st
13180 72 69 6e 67 20 74 68 65 73 65 0d 0a 20 20 20 20  ring these..    
13190 20 20 23 20 20 20 20 20 20 20 63 6f 6e 6e 65 63    #       connec
131a0 74 69 6f 6e 20 66 6c 61 67 73 20 77 69 6c 6c 20  tion flags will 
131b0 61 63 74 75 61 6c 6c 79 20 61 70 70 6c 79 20 74  actually apply t
131c0 6f 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 74 20  o.  This is not 
131d0 6e 65 63 65 73 73 61 72 79 0d 0a 20 20 20 20 20  necessary..     
131e0 20 23 20 20 20 20 20 20 20 69 6e 20 71 75 69 65   #       in quie
131f0 74 20 6d 6f 64 65 20 62 65 63 61 75 73 65 20 74  t mode because t
13200 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
13210 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72  is only used for
13220 20 6c 6f 67 67 69 6e 67 0d 0a 20 20 20 20 20 20   logging..      
13230 23 20 20 20 20 20 20 20 61 6e 64 20 72 65 70 6f  #       and repo
13240 72 74 69 6e 67 20 70 75 72 70 6f 73 65 73 2e 0d  rting purposes..
13250 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
13260 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
13270 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20  n {..        if 
13280 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
13290 24 66 69 6c 65 4e 61 6d 65 5d 20 3e 20 30 7d 20  $fileName] > 0} 
132a0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
132b0 20 20 73 65 74 20 64 61 74 61 62 61 73 65 20 5b    set database [
132c0 61 70 70 65 6e 64 41 72 67 73 20 22 66 69 6c 65  appendArgs "file
132d0 20 6e 61 6d 65 20 5c 22 22 20 24 66 69 6c 65 4e   name \"" $fileN
132e0 61 6d 65 20 5c 22 5d 0d 0a 20 20 20 20 20 20 20  ame \"]..       
132f0 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f   } elseif {[info
13300 20 65 78 69 73 74 73 20 3a 3a 64 61 74 61 53 6f   exists ::dataSo
13310 75 72 63 65 5d 20 26 26 20 5c 0d 0a 20 20 20 20  urce] && \..    
13320 20 20 20 20 20 20 20 20 21 5b 61 72 72 61 79 20          ![array 
13330 65 78 69 73 74 73 20 3a 3a 64 61 74 61 53 6f 75  exists ::dataSou
13340 72 63 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  rce]} then {..  
13350 20 20 20 20 20 20 20 20 73 65 74 20 64 61 74 61          set data
13360 62 61 73 65 20 5b 61 70 70 65 6e 64 41 72 67 73  base [appendArgs
13370 20 22 64 61 74 61 20 73 6f 75 72 63 65 20 5c 22   "data source \"
13380 22 20 24 3a 3a 64 61 74 61 53 6f 75 72 63 65 20  " $::dataSource 
13390 5c 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65  \"]..        } e
133a0 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
133b0 20 73 65 74 20 64 61 74 61 62 61 73 65 20 3c 75   set database <u
133c0 6e 6b 6e 6f 77 6e 3e 0d 0a 20 20 20 20 20 20 20  nknown>..       
133d0 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20   }..      }.... 
133e0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
133f0 4e 4f 54 45 3a 20 45 76 65 6e 20 74 68 6f 75 67  NOTE: Even thoug
13400 68 20 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20  h there is only 
13410 6f 6e 65 20 73 6f 75 72 63 65 20 6f 66 20 66 6c  one source of fl
13420 61 67 73 20 73 6f 20 66 61 72 2c 20 74 68 65 79  ags so far, they
13430 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
13440 6d 75 73 74 20 62 65 20 63 6f 6d 62 69 6e 65 64  must be combined
13450 20 75 73 69 6e 67 20 74 68 65 20 63 6f 72 72 65   using the corre
13460 63 74 20 73 79 6e 74 61 78 20 66 6f 72 20 65 6e  ct syntax for en
13470 75 6d 65 72 61 74 65 64 0d 0a 20 20 20 20 20 20  umerated..      
13480 23 20 20 20 20 20 20 20 66 6c 61 67 20 76 61 6c  #       flag val
13490 75 65 73 20 66 6f 72 20 74 68 65 20 2e 4e 45 54  ues for the .NET
134a0 20 46 72 61 6d 65 77 6f 72 6b 2e 0d 0a 20 20 20   Framework...   
134b0 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20     #..      set 
134c0 66 6c 61 67 73 20 5b 63 6f 6d 62 69 6e 65 46 6c  flags [combineFl
134d0 61 67 73 20 24 66 6c 61 67 73 20 22 22 5d 0d 0a  ags $flags ""]..
134e0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
134f0 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20 28 61   # NOTE: Show (a
13500 6e 64 20 6c 6f 67 29 20 74 68 65 20 6c 6f 63 61  nd log) the loca
13510 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61  l connection fla
13520 67 73 20 61 6e 64 20 74 68 65 20 61 73 73 6f 63  gs and the assoc
13530 69 61 74 65 64 0d 0a 20 20 20 20 20 20 23 20 20  iated..      #  
13540 20 20 20 20 20 64 61 74 61 20 73 6f 75 72 63 65       data source
13550 20 6f 72 20 66 69 6c 65 20 6e 61 6d 65 2e 0d 0a   or file name...
13560 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
13570 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
13580 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   {..        if {
13590 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
135a0 6e 6f 28 65 6d 69 74 4c 6f 63 61 6c 46 6c 61 67  no(emitLocalFlag
135b0 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  s)] && \..      
135c0 20 20 20 20 20 20 28 21 5b 69 6e 66 6f 20 65 78        (![info ex
135d0 69 73 74 73 20 3a 3a 6e 6f 28 65 6d 69 74 4c 6f  ists ::no(emitLo
135e0 63 61 6c 46 6c 61 67 73 49 66 4e 6f 6e 65 29 5d  calFlagsIfNone)]
135f0 20 7c 7c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   || \..         
13600 20 20 20 20 21 5b 68 61 73 4e 6f 46 6c 61 67 73      ![hasNoFlags
13610 20 66 6c 61 67 73 20 66 61 6c 73 65 5d 29 7d 20   flags false])} 
13620 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
13630 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
13640 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
13650 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
13660 20 20 20 20 20 22 2d 2d 2d 2d 20 6c 6f 63 61 6c       "---- local
13670 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67   connection flag
13680 73 20 66 6f 72 20 22 20 24 64 61 74 61 62 61 73  s for " $databas
13690 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
136a0 20 20 20 22 20 61 72 65 3a 20 22 20 5b 65 78 70     " are: " [exp
136b0 72 20 7b 21 5b 68 61 73 4e 6f 46 6c 61 67 73 20  r {![hasNoFlags 
136c0 66 6c 61 67 73 20 66 61 6c 73 65 5d 20 3f 20 5c  flags false] ? \
136d0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
136e0 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 22 20 24  [appendArgs \" $
136f0 66 6c 61 67 73 20 5c 22 5d 20 3a 20 22 3c 6e 6f  flags \"] : "<no
13700 6e 65 3e 22 7d 5d 20 5c 6e 5d 0d 0a 20 20 20 20  ne>"}] \n]..    
13710 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
13720 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
13730 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20 28 61   # NOTE: Show (a
13740 6e 64 20 6c 6f 67 29 20 74 68 65 20 73 68 61 72  nd log) the shar
13750 65 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c  ed connection fl
13760 61 67 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ags...      #.. 
13770 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
13780 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
13790 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
137a0 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74            object
137b0 20 69 6e 76 6f 6b 65 20 53 79 73 74 65 6d 2e 44   invoke System.D
137c0 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74  ata.SQLite.SQLit
137d0 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 53 68 61 72  eConnection Shar
137e0 65 64 46 6c 61 67 73 0d 0a 20 20 20 20 20 20 20  edFlags..       
137f0 20 7d 20 73 68 61 72 65 64 46 6c 61 67 73 5d 20   } sharedFlags] 
13800 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
13810 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
13820 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 65  fo exists ::no(e
13830 6d 69 74 53 68 61 72 65 64 46 6c 61 67 73 29 5d  mitSharedFlags)]
13840 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
13850 20 20 20 20 20 28 21 5b 69 6e 66 6f 20 65 78 69       (![info exi
13860 73 74 73 20 3a 3a 6e 6f 28 65 6d 69 74 53 68 61  sts ::no(emitSha
13870 72 65 64 46 6c 61 67 73 49 66 4e 6f 6e 65 29 5d  redFlagsIfNone)]
13880 20 7c 7c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   || \..         
13890 20 20 20 20 20 20 21 5b 68 61 73 4e 6f 46 6c 61        ![hasNoFla
138a0 67 73 20 73 68 61 72 65 64 46 6c 61 67 73 20 74  gs sharedFlags t
138b0 72 75 65 5d 29 7d 20 74 68 65 6e 20 7b 0d 0a 20  rue])} then {.. 
138c0 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
138d0 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
138e0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
138f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13900 22 2d 2d 2d 2d 20 73 68 61 72 65 64 20 63 6f 6e  "---- shared con
13910 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 66 6f  nection flags fo
13920 72 20 22 20 24 64 61 74 61 62 61 73 65 20 5c 0d  r " $database \.
13930 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13940 20 22 20 61 72 65 3a 20 22 20 5b 65 78 70 72 20   " are: " [expr 
13950 7b 21 5b 68 61 73 4e 6f 46 6c 61 67 73 20 73 68  {![hasNoFlags sh
13960 61 72 65 64 46 6c 61 67 73 20 74 72 75 65 5d 20  aredFlags true] 
13970 3f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ? \..           
13980 20 20 20 20 20 5b 61 70 70 65 6e 64 41 72 67 73       [appendArgs
13990 20 5c 22 20 24 73 68 61 72 65 64 46 6c 61 67 73   \" $sharedFlags
139a0 20 5c 22 5d 20 3a 20 22 3c 6e 6f 6e 65 3e 22 7d   \"] : "<none>"}
139b0 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  ] \n]..         
139c0 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c   }..        } el
139d0 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
139e0 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
139f0 73 20 3a 3a 6e 6f 28 65 6d 69 74 53 68 61 72 65  s ::no(emitShare
13a00 64 46 6c 61 67 73 29 5d 20 26 26 20 5c 0d 0a 20  dFlags)] && \.. 
13a10 20 20 20 20 20 20 20 20 20 20 20 20 20 21 5b 69               ![i
13a20 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
13a30 65 6d 69 74 53 68 61 72 65 64 46 6c 61 67 73 49  emitSharedFlagsI
13a40 66 55 6e 61 76 61 69 6c 61 62 6c 65 29 5d 7d 20  fUnavailable)]} 
13a50 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
13a60 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
13a70 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
13a80 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
13a90 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73           "---- s
13aa0 68 61 72 65 64 20 63 6f 6e 6e 65 63 74 69 6f 6e  hared connection
13ab0 20 66 6c 61 67 73 20 66 6f 72 20 22 20 24 64 61   flags for " $da
13ac0 74 61 62 61 73 65 20 5c 0d 0a 20 20 20 20 20 20  tabase \..      
13ad0 20 20 20 20 20 20 20 20 20 20 22 20 61 72 65 3a            " are:
13ae0 20 3c 75 6e 61 76 61 69 6c 61 62 6c 65 3e 5c 6e   <unavailable>\n
13af0 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  "]..          }.
13b00 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
13b10 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
13b20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 68        # NOTE: Sh
13b30 6f 77 20 28 61 6e 64 20 6c 6f 67 29 20 74 68 65  ow (and log) the
13b40 20 64 65 74 65 63 74 65 64 20 67 6c 6f 62 61 6c   detected global
13b50 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67   connection flag
13b60 73 2c 20 69 66 20 61 6e 79 2e 0d 0a 20 20 20 20  s, if any...    
13b70 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 21    #..      if {!
13b80 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
13b90 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
13ba0 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 65  fo exists ::no(e
13bb0 6d 69 74 47 6c 6f 62 61 6c 46 6c 61 67 73 29 5d  mitGlobalFlags)]
13bc0 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
13bd0 20 20 20 28 21 5b 69 6e 66 6f 20 65 78 69 73 74     (![info exist
13be0 73 20 3a 3a 6e 6f 28 65 6d 69 74 47 6c 6f 62 61  s ::no(emitGloba
13bf0 6c 46 6c 61 67 73 49 66 4e 6f 6e 65 29 5d 20 7c  lFlagsIfNone)] |
13c00 7c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  | \..           
13c10 20 20 21 5b 68 61 73 4e 6f 46 6c 61 67 73 20 3a    ![hasNoFlags :
13c20 3a 63 6f 6e 6e 65 63 74 69 6f 6e 5f 66 6c 61 67  :connection_flag
13c30 73 20 66 61 6c 73 65 5d 29 7d 20 74 68 65 6e 20  s false])} then 
13c40 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75  {..          tpu
13c50 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
13c60 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
13c70 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
13c80 22 2d 2d 2d 2d 20 67 6c 6f 62 61 6c 20 63 6f 6e  "---- global con
13c90 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 61 72  nection flags ar
13ca0 65 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20  e: " \..        
13cb0 20 20 20 20 20 20 5b 65 78 70 72 20 7b 21 5b 68        [expr {![h
13cc0 61 73 4e 6f 46 6c 61 67 73 20 3a 3a 63 6f 6e 6e  asNoFlags ::conn
13cd0 65 63 74 69 6f 6e 5f 66 6c 61 67 73 20 66 61 6c  ection_flags fal
13ce0 73 65 5d 20 3f 20 5c 0d 0a 20 20 20 20 20 20 20  se] ? \..       
13cf0 20 20 20 20 20 20 20 5b 61 70 70 65 6e 64 41 72         [appendAr
13d00 67 73 20 5c 22 20 24 3a 3a 63 6f 6e 6e 65 63 74  gs \" $::connect
13d10 69 6f 6e 5f 66 6c 61 67 73 20 5c 22 5d 20 3a 20  ion_flags \"] : 
13d20 22 3c 6e 6f 6e 65 3e 22 7d 5d 20 5c 6e 5d 0d 0a  "<none>"}] \n]..
13d30 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
13d40 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   }....      #.. 
13d50 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20       # NOTE: If 
13d60 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 67 6c  there are any gl
13d70 6f 62 61 6c 20 28 70 65 72 20 74 65 73 74 20 72  obal (per test r
13d80 75 6e 29 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66  un) connection f
13d90 6c 61 67 73 20 63 75 72 72 65 6e 74 6c 79 0d 0a  lags currently..
13da0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73 65        #       se
13db0 74 2c 20 75 73 65 20 74 68 65 6d 20 6e 6f 77 20  t, use them now 
13dc0 28 69 2e 65 2e 20 62 79 20 63 6f 6d 62 69 6e 69  (i.e. by combini
13dd0 6e 67 20 74 68 65 6d 20 77 69 74 68 20 74 68 65  ng them with the
13de0 20 6f 6e 65 73 20 66 6f 72 20 74 68 69 73 0d 0a   ones for this..
13df0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f        #       co
13e00 6e 6e 65 63 74 69 6f 6e 29 2e 0d 0a 20 20 20 20  nnection)...    
13e10 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
13e20 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 63 6f  info exists ::co
13e30 6e 6e 65 63 74 69 6f 6e 5f 66 6c 61 67 73 5d 7d  nnection_flags]}
13e40 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
13e50 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
13e60 54 45 3a 20 43 6f 6d 62 69 6e 65 20 61 6e 64 2f  TE: Combine and/
13e70 6f 72 20 72 65 70 6c 61 63 65 20 74 68 65 20 63  or replace the c
13e80 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 20  onnection flags 
13e90 61 6e 64 20 74 68 65 6e 20 73 68 6f 77 20 74 68  and then show th
13ea0 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
13eb0 20 20 20 6e 65 77 20 76 61 6c 75 65 2e 0d 0a 20     new value... 
13ec0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
13ed0 20 20 73 65 74 20 66 6c 61 67 73 20 5b 63 6f 6d    set flags [com
13ee0 62 69 6e 65 46 6c 61 67 73 20 24 66 6c 61 67 73  bineFlags $flags
13ef0 20 24 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e 5f 66   $::connection_f
13f00 6c 61 67 73 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  lags]....       
13f10 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
13f20 54 45 3a 20 53 68 6f 77 20 28 61 6e 64 20 6c 6f  TE: Show (and lo
13f30 67 29 20 74 68 65 20 6e 65 77 20 65 66 66 65 63  g) the new effec
13f40 74 69 76 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  tive connection 
13f50 66 6c 61 67 73 2e 0d 0a 20 20 20 20 20 20 20 20  flags...        
13f60 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21  #..        if {!
13f70 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
13f80 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
13f90 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
13fa0 28 65 6d 69 74 43 6f 6d 62 69 6e 65 64 46 6c 61  (emitCombinedFla
13fb0 67 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  gs)] && \..     
13fc0 20 20 20 20 20 20 20 20 20 28 21 5b 69 6e 66 6f           (![info
13fd0 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 65 6d 69   exists ::no(emi
13fe0 74 43 6f 6d 62 69 6e 65 64 46 6c 61 67 73 49 66  tCombinedFlagsIf
13ff0 4e 6f 6e 65 29 5d 20 7c 7c 20 5c 0d 0a 20 20 20  None)] || \..   
14000 20 20 20 20 20 20 20 20 20 20 20 20 21 5b 68 61              ![ha
14010 73 4e 6f 46 6c 61 67 73 20 66 6c 61 67 73 20 66  sNoFlags flags f
14020 61 6c 73 65 5d 29 7d 20 74 68 65 6e 20 7b 0d 0a  alse])} then {..
14030 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
14040 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
14050 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
14060 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14070 20 22 2d 2d 2d 2d 20 63 6f 6d 62 69 6e 65 64 20   "---- combined 
14080 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73  connection flags
14090 20 66 6f 72 20 22 20 24 64 61 74 61 62 61 73 65   for " $database
140a0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
140b0 20 20 20 20 22 20 61 72 65 3a 20 22 20 5b 65 78      " are: " [ex
140c0 70 72 20 7b 21 5b 68 61 73 4e 6f 46 6c 61 67 73  pr {![hasNoFlags
140d0 20 66 6c 61 67 73 20 66 61 6c 73 65 5d 20 3f 20   flags false] ? 
140e0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
140f0 20 20 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c     [appendArgs \
14100 22 20 24 66 6c 61 67 73 20 5c 22 5d 20 3a 20 22  " $flags \"] : "
14110 3c 6e 6f 6e 65 3e 22 7d 5d 20 5c 6e 5d 0d 0a 20  <none>"}] \n].. 
14120 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
14130 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
14140 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 24  ..      return $
14150 66 6c 61 67 73 0d 0a 20 20 20 20 7d 0d 0a 0c 0d  flags..    }....
14160 0a 20 20 20 20 70 72 6f 63 20 67 65 74 46 6c 61  .    proc getFla
14170 67 73 50 72 6f 70 65 72 74 79 20 7b 20 7b 66 6c  gsProperty { {fl
14180 61 67 73 20 22 22 7d 20 7b 71 75 69 65 74 20 66  ags ""} {quiet f
14190 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  alse} } {..     
141a0 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
141b0 3a 20 44 65 74 65 72 6d 69 6e 65 20 77 68 61 74  : Determine what
141c0 20 74 68 65 20 63 6f 6d 62 69 6e 65 64 20 28 67   the combined (g
141d0 6c 6f 62 61 6c 20 61 6e 64 20 6c 6f 63 61 6c 29  lobal and local)
141e0 20 63 6f 6e 6e 65 63 74 69 6f 6e 0d 0a 20 20 20   connection..   
141f0 20 20 20 23 20 20 20 20 20 20 20 66 6c 61 67 73     #       flags
14200 20 73 68 6f 75 6c 64 20 62 65 2c 20 70 6f 73 73   should be, poss
14210 69 62 6c 79 20 71 75 69 65 74 6c 79 2e 0d 0a 20  ibly quietly... 
14220 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65       #..      se
14230 74 20 66 6c 61 67 73 20 5b 67 65 74 43 6f 6e 6e  t flags [getConn
14240 65 63 74 69 6f 6e 46 6c 61 67 73 20 22 22 20 24  ectionFlags "" $
14250 66 6c 61 67 73 20 24 71 75 69 65 74 5d 0d 0a 0d  flags $quiet]...
14260 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
14270 23 20 4e 4f 54 45 3a 20 49 66 20 6e 6f 20 67 6c  # NOTE: If no gl
14280 6f 62 61 6c 20 6f 72 20 6c 6f 63 61 6c 20 63 6f  obal or local co
14290 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 77  nnection flags w
142a0 65 72 65 20 73 70 65 63 69 66 69 65 64 2c 20 74  ere specified, t
142b0 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  he..      #     
142c0 20 20 64 65 66 61 75 6c 74 20 63 6f 6e 6e 65 63    default connec
142d0 74 69 6f 6e 20 66 6c 61 67 73 20 73 68 6f 75 6c  tion flags shoul
142e0 64 20 62 65 20 75 73 65 64 3b 20 74 68 65 72 65  d be used; there
142f0 66 6f 72 65 2c 20 72 65 74 75 72 6e 0d 0a 20 20  fore, return..  
14300 20 20 20 20 23 20 20 20 20 20 20 20 61 6e 20 65      #       an e
14310 6d 70 74 79 20 73 74 72 69 6e 67 20 69 6e 20 74  mpty string in t
14320 68 61 74 20 63 61 73 65 2e 0d 0a 20 20 20 20 20  hat case...     
14330 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73   #..      if {[s
14340 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 66 6c  tring length $fl
14350 61 67 73 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ags] == 0} then 
14360 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  {..        retur
14370 6e 20 22 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  n ""..      }...
14380 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
14390 23 20 4e 4f 54 45 3a 20 49 6e 20 6f 72 64 65 72  # NOTE: In order
143a0 20 74 6f 20 63 68 65 63 6b 20 69 66 20 74 68 65   to check if the
143b0 20 64 65 66 61 75 6c 74 20 63 6f 6e 6e 65 63 74   default connect
143c0 69 6f 6e 20 66 6c 61 67 73 20 61 72 65 20 62 65  ion flags are be
143d0 69 6e 67 20 75 73 65 64 0d 0a 20 20 20 20 20 20  ing used..      
143e0 23 20 20 20 20 20 20 20 69 74 20 69 73 20 6e 65  #       it is ne
143f0 63 65 73 73 61 72 79 20 74 6f 20 61 74 74 65 6d  cessary to attem
14400 70 74 20 61 20 63 6f 6e 76 65 72 73 69 6f 6e 20  pt a conversion 
14410 74 6f 20 74 68 65 20 61 63 74 75 61 6c 20 65 6e  to the actual en
14420 75 6d 65 72 61 74 65 64 0d 0a 20 20 20 20 20 20  umerated..      
14430 23 20 20 20 20 20 20 20 74 79 70 65 2e 20 20 46  #       type.  F
14440 61 69 6c 69 6e 67 20 74 68 61 74 2c 20 74 68 65  ailing that, the
14450 20 63 68 65 63 6b 20 61 67 61 69 6e 73 74 20 74   check against t
14460 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  he default value
14470 20 77 69 6c 6c 20 62 65 0d 0a 20 20 20 20 20 20   will be..      
14480 23 20 20 20 20 20 20 20 73 6b 69 70 70 65 64 2e  #       skipped.
14490 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
144a0 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
144b0 20 20 20 20 20 20 20 73 65 74 20 65 72 72 6f 72         set error
144c0 20 6e 75 6c 6c 3b 20 23 20 49 47 4e 4f 52 45 44   null; # IGNORED
144d0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a 65  ....        obje
144e0 63 74 20 69 6e 76 6f 6b 65 20 55 74 69 6c 69 74  ct invoke Utilit
144f0 79 20 54 72 79 50 61 72 73 65 46 6c 61 67 73 45  y TryParseFlagsE
14500 6e 75 6d 20 22 22 20 5c 0d 0a 20 20 20 20 20 20  num "" \..      
14510 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74        System.Dat
14520 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 43  a.SQLite.SQLiteC
14530 6f 6e 6e 65 63 74 69 6f 6e 46 6c 61 67 73 20 22  onnectionFlags "
14540 22 20 24 66 6c 61 67 73 20 6e 75 6c 6c 20 74 72  " $flags null tr
14550 75 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ue \..          
14560 20 20 74 72 75 65 20 74 72 75 65 20 65 72 72 6f    true true erro
14570 72 0d 0a 20 20 20 20 20 20 7d 20 76 61 6c 75 65  r..      } value
14580 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
14590 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
145a0 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 69 6e 67  NOTE: Attempting
145b0 20 74 6f 20 70 61 72 73 65 20 74 68 65 20 63 6f   to parse the co
145c0 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 63  nnection flags c
145d0 61 75 73 65 64 20 61 20 73 63 72 69 70 74 0d 0a  aused a script..
145e0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
145f0 65 72 72 6f 72 2e 20 20 45 6d 69 74 20 61 20 77  error.  Emit a w
14600 61 72 6e 69 6e 67 20 74 6f 20 74 68 65 20 74 65  arning to the te
14610 73 74 20 6c 6f 67 20 66 69 6c 65 20 61 6e 64 20  st log file and 
14620 63 6f 6e 74 69 6e 75 65 0d 0a 20 20 20 20 20 20  continue..      
14630 20 20 23 20 20 20 20 20 20 20 75 73 69 6e 67 20    #       using 
14640 61 6e 20 65 6d 74 70 79 20 73 74 72 69 6e 67 20  an emtpy string 
14650 69 6e 73 74 65 61 64 2e 0d 0a 20 20 20 20 20 20  instead...      
14660 20 20 23 0d 0a 20 20 20 20 20 20 20 20 74 6c 6f    #..        tlo
14670 67 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  g [appendArgs \.
14680 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d  .            "==
14690 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c  == WARNING: fail
146a0 65 64 20 74 6f 20 70 61 72 73 65 20 63 6f 6e 6e  ed to parse conn
146b0 65 63 74 69 6f 6e 20 66 6c 61 67 73 2c 20 65 72  ection flags, er
146c0 72 6f 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20  ror: " \..      
146d0 20 20 20 20 20 20 5c 6e 5c 74 20 24 76 61 6c 75        \n\t $valu
146e0 65 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  e \n]....       
146f0 20 73 65 74 20 76 61 6c 75 65 20 22 22 0d 0a 20   set value "".. 
14700 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
14710 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
14720 20 49 66 20 74 68 65 20 63 6f 6d 62 69 6e 65 64   If the combined
14730 20 66 6c 61 67 73 20 73 74 72 69 6e 67 20 63 6f   flags string co
14740 75 6c 64 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79  uld not actually
14750 20 62 65 20 63 6f 6e 76 65 72 74 65 64 0d 0a 20   be converted.. 
14760 20 20 20 20 20 23 20 20 20 20 20 20 20 74 6f 20       #       to 
14770 74 68 65 20 65 6e 75 6d 65 72 61 74 65 64 20 74  the enumerated t
14780 79 70 65 20 69 74 20 69 73 20 74 68 65 20 64 65  ype it is the de
14790 66 61 75 6c 74 20 76 61 6c 75 65 2c 20 74 68 65  fault value, the
147a0 6e 20 6a 75 73 74 20 75 73 65 0d 0a 20 20 20 20  n just use..    
147b0 20 20 23 20 20 20 20 20 20 20 69 74 20 76 65 72    #       it ver
147c0 62 61 74 69 6d 3b 20 6f 74 68 65 72 77 69 73 65  batim; otherwise
147d0 2c 20 6a 75 73 74 20 72 65 74 75 72 6e 20 61 6e  , just return an
147e0 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e 20 20   empty string.  
147f0 49 6e 20 74 68 61 74 0d 0a 20 20 20 20 20 20 23  In that..      #
14800 20 20 20 20 20 20 20 63 61 73 65 2c 20 74 68 65         case, the
14810 20 64 65 66 61 75 6c 74 20 63 6f 6e 6e 65 63 74   default connect
14820 69 6f 6e 20 66 6c 61 67 73 20 77 69 6c 6c 20 62  ion flags will b
14830 65 20 75 73 65 64 2e 0d 0a 20 20 20 20 20 20 23  e used...      #
14840 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72  ..      if {[str
14850 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 61 6c 75  ing length $valu
14860 65 5d 20 3d 3d 20 30 20 7c 7c 20 24 76 61 6c 75  e] == 0 || $valu
14870 65 20 6e 65 20 22 44 65 66 61 75 6c 74 22 7d 20  e ne "Default"} 
14880 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
14890 23 0d 0a 20 20 20 20 20 20 20 20 23 20 57 41 52  #..        # WAR
148a0 4e 49 4e 47 3a 20 54 68 69 73 20 72 65 74 75 72  NING: This retur
148b0 6e 73 20 74 68 65 20 73 74 72 69 6e 67 20 76 61  ns the string va
148c0 6c 75 65 20 6f 66 20 74 68 65 20 63 6f 6d 62 69  lue of the combi
148d0 6e 65 64 20 66 6c 61 67 73 2c 20 6e 6f 74 0d 0a  ned flags, not..
148e0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
148f0 20 20 20 74 68 65 20 65 6e 75 6d 65 72 61 74 65     the enumerate
14900 64 20 76 61 6c 75 65 2e 20 20 54 68 69 73 20 69  d value.  This i
14910 73 20 62 79 20 64 65 73 69 67 6e 20 61 6e 64 20  s by design and 
14920 73 68 6f 75 6c 64 20 6e 6f 74 0d 0a 20 20 20 20  should not..    
14930 20 20 20 20 23 20 20 20 20 20 20 20 20 20 20 62      #          b
14940 65 20 63 68 61 6e 67 65 64 20 77 69 74 68 6f 75  e changed withou
14950 74 20 63 61 72 65 66 75 6c 20 63 6f 6e 73 69 64  t careful consid
14960 65 72 61 74 69 6f 6e 20 28 65 2e 67 2e 20 69 74  eration (e.g. it
14970 20 77 6f 75 6c 64 0d 0a 20 20 20 20 20 20 20 20   would..        
14980 23 20 20 20 20 20 20 20 20 20 20 70 72 65 76 65  #          preve
14990 6e 74 20 74 68 65 20 53 51 4c 69 74 65 43 6f 6e  nt the SQLiteCon
149a0 6e 65 63 74 69 6f 6e 20 63 6c 61 73 73 20 66 72  nection class fr
149b0 6f 6d 20 61 6c 6c 6f 77 69 6e 67 20 69 6e 76 61  om allowing inva
149c0 6c 69 64 0d 0a 20 20 20 20 20 20 20 20 23 20 20  lid..        #  
149d0 20 20 20 20 20 20 20 20 5b 22 6d 61 67 69 63 61          ["magica
149e0 6c 22 5d 20 6d 65 74 61 2d 66 6c 61 67 73 29 2e  l"] meta-flags).
149f0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
14a00 20 20 20 20 20 72 65 74 75 72 6e 20 5b 61 70 70       return [app
14a10 65 6e 64 41 72 67 73 20 22 46 6c 61 67 73 3d 22  endArgs "Flags="
14a20 20 24 66 6c 61 67 73 20 5c 3b 5d 0d 0a 20 20 20   $flags \;]..   
14a30 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65     }....      re
14a40 74 75 72 6e 20 22 22 0d 0a 20 20 20 20 7d 0d 0a  turn ""..    }..
14a50 0c 0d 0a 20 20 20 20 70 72 6f 63 20 65 6e 61 62  ...    proc enab
14a60 6c 65 53 68 61 72 65 64 43 61 63 68 65 20 7b 20  leSharedCache { 
14a70 63 68 61 6e 6e 65 6c 20 65 6e 61 62 6c 65 20 7b  channel enable {
14a80 71 75 69 65 74 20 66 61 6c 73 65 7d 20 7d 20 7b  quiet false} } {
14a90 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74  ..      if {[cat
14aa0 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 6f 62  ch {..        ob
14ab0 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61  ject invoke -fla
14ac0 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d  gs +NonPublic \.
14ad0 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73  .            Sys
14ae0 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
14af0 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68  UnsafeNativeMeth
14b00 6f 64 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ods \..         
14b10 20 20 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c     sqlite3_enabl
14b20 65 5f 73 68 61 72 65 64 5f 63 61 63 68 65 20 5b  e_shared_cache [
14b30 65 78 70 72 20 69 6e 74 28 24 65 6e 61 62 6c 65  expr int($enable
14b40 29 5d 0d 0a 20 20 20 20 20 20 7d 20 72 65 73 75  )]..      } resu
14b50 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  lt] == 0} then {
14b60 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 24  ..        if {!$
14b70 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
14b80 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
14b90 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
14ba0 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
14bb0 20 20 20 20 20 22 2d 2d 2d 2d 20 63 61 6c 6c 20       "---- call 
14bc0 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 73  sqlite3_enable_s
14bd0 68 61 72 65 64 5f 63 61 63 68 65 28 22 20 24 65  hared_cache(" $e
14be0 6e 61 62 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20  nable \..       
14bf0 20 20 20 20 20 20 20 22 29 2e 2e 2e 20 6f 6b 3a         ")... ok:
14c00 20 22 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a   " $result \n]..
14c10 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
14c20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
14c30 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
14c40 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
14c50 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
14c60 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
14c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
14c80 2d 2d 2d 20 63 61 6c 6c 20 73 71 6c 69 74 65 33  --- call sqlite3
14c90 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f 63  _enable_shared_c
14ca0 61 63 68 65 28 22 20 24 65 6e 61 62 6c 65 20 5c  ache(" $enable \
14cb0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
14cc0 22 29 2e 2e 2e 20 65 72 72 6f 72 3a 20 22 20 5c  ")... error: " \
14cd0 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d  n\t $result \n].
14ce0 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
14cf0 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
14d00 20 20 20 70 72 6f 63 20 73 65 74 75 70 44 62 20     proc setupDb 
14d10 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  {..            f
14d20 69 6c 65 4e 61 6d 65 20 7b 6d 6f 64 65 20 22 22  ileName {mode ""
14d30 7d 20 7b 64 61 74 65 54 69 6d 65 46 6f 72 6d 61  } {dateTimeForma
14d40 74 20 22 22 7d 20 7b 64 61 74 65 54 69 6d 65 4b  t ""} {dateTimeK
14d50 69 6e 64 20 22 22 7d 20 7b 66 6c 61 67 73 20 22  ind ""} {flags "
14d60 22 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  "}..            
14d70 7b 65 78 74 72 61 20 22 22 7d 20 7b 71 75 61 6c  {extra ""} {qual
14d80 69 66 79 20 74 72 75 65 7d 20 7b 64 65 6c 65 74  ify true} {delet
14d90 65 20 74 72 75 65 7d 20 7b 75 72 69 20 66 61 6c  e true} {uri fal
14da0 73 65 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  se}..           
14db0 20 7b 74 65 6d 70 6f 72 61 72 79 20 74 72 75 65   {temporary true
14dc0 7d 20 7b 76 61 72 4e 61 6d 65 20 64 62 7d 20 7b  } {varName db} {
14dd0 71 75 69 65 74 20 66 61 6c 73 65 7d 20 7d 20 7b  quiet false} } {
14de0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
14df0 20 23 20 4e 4f 54 45 3a 20 46 69 72 73 74 2c 20   # NOTE: First, 
14e00 73 65 65 20 69 66 20 6f 75 72 20 63 61 6c 6c 65  see if our calle
14e10 72 20 68 61 73 20 72 65 71 75 65 73 74 65 64 20  r has requested 
14e20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
14e30 61 62 61 73 65 2e 0d 0a 20 20 20 20 20 20 23 0d  abase...      #.
14e40 0a 20 20 20 20 20 20 73 65 74 20 69 73 4d 65 6d  .      set isMem
14e50 6f 72 79 20 5b 69 73 4d 65 6d 6f 72 79 44 62 20  ory [isMemoryDb 
14e60 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20 20  $fileName]....  
14e70 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
14e80 4f 54 45 3a 20 46 6f 72 20 6e 6f 77 2c 20 61 6c  OTE: For now, al
14e90 6c 20 74 65 73 74 20 64 61 74 61 62 61 73 65 73  l test databases
14ea0 20 75 73 65 64 20 62 79 20 74 68 65 20 74 65 73   used by the tes
14eb0 74 20 73 75 69 74 65 20 61 72 65 20 70 6c 61 63  t suite are plac
14ec0 65 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ed..      #     
14ed0 20 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62    into the datab
14ee0 61 73 65 20 64 69 72 65 63 74 6f 72 79 2e 20 20  ase directory.  
14ef0 45 61 63 68 20 64 61 74 61 62 61 73 65 20 61 6e  Each database an
14f00 64 20 72 65 6c 61 74 65 64 20 66 69 6c 65 73 0d  d related files.
14f10 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 75  .      #       u
14f20 73 65 64 20 62 79 20 61 20 74 65 73 74 20 73 68  sed by a test sh
14f30 6f 75 6c 64 20 62 65 20 63 6c 65 61 6e 65 64 20  ould be cleaned 
14f40 75 70 20 62 79 20 74 68 61 74 20 74 65 73 74 20  up by that test 
14f50 75 73 69 6e 67 20 74 68 65 0d 0a 20 20 20 20 20  using the..     
14f60 20 23 20 20 20 20 20 20 20 22 63 6c 65 61 6e 75   #       "cleanu
14f70 70 44 62 22 20 70 72 6f 63 65 64 75 72 65 2c 20  pDb" procedure, 
14f80 62 65 6c 6f 77 2e 0d 0a 20 20 20 20 20 20 23 0d  below...      #.
14f90 0a 20 20 20 20 20 20 69 66 20 7b 21 24 69 73 4d  .      if {!$isM
14fa0 65 6d 6f 72 79 20 26 26 20 24 71 75 61 6c 69 66  emory && $qualif
14fb0 79 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  y} then {..     
14fc0 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 20     set fileName 
14fd0 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 44  [file join [getD
14fe0 61 74 61 62 61 73 65 44 69 72 65 63 74 6f 72 79  atabaseDirectory
14ff0 5d 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69  ] [file tail $fi
15000 6c 65 4e 61 6d 65 5d 5d 0d 0a 20 20 20 20 20 20  leName]]..      
15010 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
15020 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 79 20 64      # NOTE: By d
15030 65 66 61 75 6c 74 2c 20 64 65 6c 65 74 65 20 61  efault, delete a
15040 6e 79 20 70 72 65 2d 65 78 69 73 74 69 6e 67 20  ny pre-existing 
15050 64 61 74 61 62 61 73 65 20 77 69 74 68 20 74 68  database with th
15060 65 20 73 61 6d 65 20 66 69 6c 65 0d 0a 20 20 20  e same file..   
15070 20 20 20 23 20 20 20 20 20 20 20 6e 61 6d 65 20     #       name 
15080 69 66 20 69 74 20 63 75 72 72 65 6e 74 6c 79 20  if it currently 
15090 65 78 69 73 74 73 2e 0d 0a 20 20 20 20 20 20 23  exists...      #
150a0 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 24 69 73  ..      if {!$is
150b0 4d 65 6d 6f 72 79 20 26 26 20 24 64 65 6c 65 74  Memory && $delet
150c0 65 20 26 26 20 5b 66 69 6c 65 20 65 78 69 73 74  e && [file exist
150d0 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68  s $fileName]} th
150e0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
150f0 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
15100 20 41 74 74 65 6d 70 74 20 74 6f 20 64 65 6c 65   Attempt to dele
15110 74 65 20 61 6e 79 20 70 72 65 2d 65 78 69 73 74  te any pre-exist
15120 69 6e 67 20 64 61 74 61 62 61 73 65 20 77 69 74  ing database wit
15130 68 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 0d  h the same file.
15140 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
15150 20 6e 61 6d 65 2e 0d 0a 20 20 20 20 20 20 20 20   name...        
15160 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  #..        if {[
15170 63 61 74 63 68 20 7b 66 69 6c 65 20 64 65 6c 65  catch {file dele
15180 74 65 20 24 66 69 6c 65 4e 61 6d 65 7d 20 65 72  te $fileName} er
15190 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ror]} then {..  
151a0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
151b0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 65 20       # NOTE: We 
151c0 73 6f 6d 65 68 6f 77 20 66 61 69 6c 65 64 20 74  somehow failed t
151d0 6f 20 64 65 6c 65 74 65 20 74 68 65 20 66 69 6c  o delete the fil
151e0 65 2c 20 72 65 70 6f 72 74 20 77 68 79 2e 0d 0a  e, report why...
151f0 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
15200 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
15210 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
15220 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
15230 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
15240 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
15250 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d               "==
15260 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c  == WARNING: fail
15270 65 64 20 74 6f 20 64 65 6c 65 74 65 20 64 61 74  ed to delete dat
15280 61 62 61 73 65 20 66 69 6c 65 20 5c 22 22 20 24  abase file \"" $
15290 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20  fileName \..    
152a0 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 20              "\" 
152b0 64 75 72 69 6e 67 20 73 65 74 75 70 2c 20 65 72  during setup, er
152c0 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72  ror: " \n\t $err
152d0 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  or \n]..        
152e0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
152f0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
15300 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
15310 3a 20 52 65 66 65 72 20 74 6f 20 74 68 65 20 73  : Refer to the s
15320 70 65 63 69 66 69 65 64 20 76 61 72 69 61 62 6c  pecified variabl
15330 65 20 28 65 2e 67 2e 20 22 64 62 22 29 20 69 6e  e (e.g. "db") in
15340 20 74 68 65 20 63 6f 6e 74 65 78 74 20 6f 66 20   the context of 
15350 6f 75 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20  our..      #    
15360 20 20 20 63 61 6c 6c 65 72 2e 20 20 54 68 65 20     caller.  The 
15370 68 61 6e 64 6c 65 20 74 6f 20 74 68 65 20 6f 70  handle to the op
15380 65 6e 65 64 20 64 61 74 61 62 61 73 65 20 77 69  ened database wi
15390 6c 6c 20 62 65 20 73 74 6f 72 65 64 20 74 68 65  ll be stored the
153a0 72 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  re...      #..  
153b0 20 20 20 20 75 70 76 61 72 20 31 20 24 76 61 72      upvar 1 $var
153c0 4e 61 6d 65 20 64 62 0d 0a 0d 0a 20 20 20 20 20  Name db....     
153d0 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
153e0 3a 20 53 74 61 72 74 20 62 75 69 6c 64 69 6e 67  : Start building
153f0 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
15400 73 74 72 69 6e 67 2e 20 20 54 68 65 20 6f 6e 6c  string.  The onl
15410 79 20 72 65 71 75 69 72 65 64 20 70 6f 72 74 69  y required porti
15420 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  on..      #     
15430 20 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74    of the connect
15440 69 6f 6e 20 73 74 72 69 6e 67 20 69 73 20 74 68  ion string is th
15450 65 20 64 61 74 61 20 73 6f 75 72 63 65 2c 20 77  e data source, w
15460 68 69 63 68 20 63 6f 6e 74 61 69 6e 73 20 74 68  hich contains th
15470 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
15480 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e   database file n
15490 61 6d 65 20 69 74 73 65 6c 66 2e 20 20 49 66 20  ame itself.  If 
154a0 6f 75 72 20 63 61 6c 6c 65 72 20 77 61 6e 74 73  our caller wants
154b0 20 74 6f 20 75 73 65 20 61 20 55 52 49 20 61 73   to use a URI as
154c0 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
154d0 74 68 65 20 64 61 74 61 20 73 6f 75 72 63 65 2c  the data source,
154e0 20 75 73 65 20 74 68 65 20 46 75 6c 6c 55 72 69   use the FullUri
154f0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69   connection stri
15500 6e 67 20 70 72 6f 70 65 72 74 79 20 74 6f 0d 0a  ng property to..
15510 20 20 20 20 20 20 23 20 20 20 20 20 20 20 70 72        #       pr
15520 65 76 65 6e 74 20 74 68 65 20 64 61 74 61 20 73  event the data s
15530 6f 75 72 63 65 20 73 74 72 69 6e 67 20 66 72 6f  ource string fro
15540 6d 20 62 65 69 6e 67 20 6d 61 6e 67 6c 65 64 2e  m being mangled.
15550 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
15560 20 69 66 20 7b 24 75 72 69 7d 20 74 68 65 6e 20   if {$uri} then 
15570 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 63  {..        set c
15580 6f 6e 6e 65 63 74 69 6f 6e 20 7b 46 75 6c 6c 55  onnection {FullU
15590 72 69 3d 24 7b 66 69 6c 65 4e 61 6d 65 7d 7d 0d  ri=${fileName}}.
155a0 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
155b0 0a 20 20 20 20 20 20 20 20 73 65 74 20 63 6f 6e  .        set con
155c0 6e 65 63 74 69 6f 6e 20 7b 44 61 74 61 20 53 6f  nection {Data So
155d0 75 72 63 65 3d 24 7b 66 69 6c 65 4e 61 6d 65 7d  urce=${fileName}
155e0 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  }..      }....  
155f0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
15600 4f 54 45 3a 20 53 69 6e 63 65 20 74 68 69 73 20  OTE: Since this 
15610 70 72 6f 63 65 64 75 72 65 20 68 61 73 20 6e 6f  procedure has no
15620 20 73 70 65 63 69 61 6c 20 6b 6e 6f 77 6c 65 64   special knowled
15630 67 65 20 6f 66 20 77 68 61 74 20 74 68 65 20 64  ge of what the d
15640 65 66 61 75 6c 74 0d 0a 20 20 20 20 20 20 23 20  efault..      # 
15650 20 20 20 20 20 20 73 65 74 74 69 6e 67 20 69 73        setting is
15660 20 66 6f 72 20 74 68 65 20 54 6f 46 75 6c 6c 50   for the ToFullP
15670 61 74 68 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73  ath connection s
15680 74 72 69 6e 67 20 70 72 6f 70 65 72 79 2c 20 61  tring propery, a
15690 6c 77 61 79 73 0d 0a 20 20 20 20 20 20 23 20 20  lways..      #  
156a0 20 20 20 20 20 61 64 64 20 74 68 65 20 76 61 6c       add the val
156b0 75 65 20 77 65 20 6b 6e 6f 77 20 61 62 6f 75 74  ue we know about
156c0 20 74 6f 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   to the connecti
156d0 6f 6e 20 73 74 72 69 6e 67 2e 0d 0a 20 20 20 20  on string...    
156e0 20 20 23 0d 0a 20 20 20 20 20 20 61 70 70 65 6e    #..      appen
156f0 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 3b 54  d connection {;T
15700 6f 46 75 6c 6c 50 61 74 68 3d 24 7b 71 75 61 6c  oFullPath=${qual
15710 69 66 79 7d 7d 0d 0a 0d 0a 20 20 20 20 20 20 23  ify}}....      #
15720 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
15730 49 66 20 6f 75 72 20 63 61 6c 6c 65 72 20 73 70  If our caller sp
15740 65 63 69 66 69 65 64 20 61 20 6a 6f 75 72 6e 61  ecified a journa
15750 6c 20 6d 6f 64 65 2c 20 61 64 64 20 74 68 65 20  l mode, add the 
15760 6e 65 63 65 73 73 61 72 79 20 70 6f 72 74 69 6f  necessary portio
15770 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  n..      #      
15780 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   of the connecti
15790 6f 6e 20 73 74 72 69 6e 67 20 6e 6f 77 2e 0d 0a  on string now...
157a0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
157b0 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  f {[string lengt
157c0 68 20 24 6d 6f 64 65 5d 20 3e 20 30 7d 20 74 68  h $mode] > 0} th
157d0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 61 70  en {..        ap
157e0 70 65 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  pend connection 
157f0 7b 3b 4a 6f 75 72 6e 61 6c 20 4d 6f 64 65 3d 24  {;Journal Mode=$
15800 7b 6d 6f 64 65 7d 7d 0d 0a 20 20 20 20 20 20 7d  {mode}}..      }
15810 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
15820 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 6f 75     # NOTE: If ou
15830 72 20 63 61 6c 6c 65 72 20 73 70 65 63 69 66 69  r caller specifi
15840 65 64 20 61 20 44 61 74 65 54 69 6d 65 20 66 6f  ed a DateTime fo
15850 72 6d 61 74 2c 20 61 64 64 20 74 68 65 20 6e 65  rmat, add the ne
15860 63 65 73 73 61 72 79 0d 0a 20 20 20 20 20 20 23  cessary..      #
15870 20 20 20 20 20 20 20 70 6f 72 74 69 6f 6e 20 6f         portion o
15880 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  f the connection
15890 20 73 74 72 69 6e 67 20 6e 6f 77 2e 0d 0a 20 20   string now...  
158a0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
158b0 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
158c0 24 64 61 74 65 54 69 6d 65 46 6f 72 6d 61 74 5d  $dateTimeFormat]
158d0 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
158e0 20 20 20 20 20 20 61 70 70 65 6e 64 20 63 6f 6e        append con
158f0 6e 65 63 74 69 6f 6e 20 7b 3b 44 61 74 65 54 69  nection {;DateTi
15900 6d 65 46 6f 72 6d 61 74 3d 24 7b 64 61 74 65 54  meFormat=${dateT
15910 69 6d 65 46 6f 72 6d 61 74 7d 7d 0d 0a 20 20 20  imeFormat}}..   
15920 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
15930 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49  .      # NOTE: I
15940 66 20 6f 75 72 20 63 61 6c 6c 65 72 20 73 70 65  f our caller spe
15950 63 69 66 69 65 64 20 61 20 44 61 74 65 54 69 6d  cified a DateTim
15960 65 4b 69 6e 64 2c 20 61 64 64 20 74 68 65 20 6e  eKind, add the n
15970 65 63 65 73 73 61 72 79 20 70 6f 72 74 69 6f 6e  ecessary portion
15980 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
15990 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  of the connectio
159a0 6e 20 73 74 72 69 6e 67 20 6e 6f 77 2e 0d 0a 20  n string now... 
159b0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
159c0 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   {[string length
159d0 20 24 64 61 74 65 54 69 6d 65 4b 69 6e 64 5d 20   $dateTimeKind] 
159e0 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
159f0 20 20 20 20 20 61 70 70 65 6e 64 20 63 6f 6e 6e       append conn
15a00 65 63 74 69 6f 6e 20 7b 3b 44 61 74 65 54 69 6d  ection {;DateTim
15a10 65 4b 69 6e 64 3d 24 7b 64 61 74 65 54 69 6d 65  eKind=${dateTime
15a20 4b 69 6e 64 7d 7d 0d 0a 20 20 20 20 20 20 7d 0d  Kind}}..      }.
15a30 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
15a40 20 20 23 20 4e 4f 54 45 3a 20 46 69 67 75 72 65    # NOTE: Figure
15a50 20 6f 75 74 20 77 68 61 74 20 74 68 65 20 66 69   out what the fi
15a60 6e 61 6c 20 66 6c 61 67 73 20 66 6f 72 20 74 68  nal flags for th
15a70 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6e 65  is connection ne
15a80 65 64 20 74 6f 20 62 65 2e 0d 0a 20 20 20 20 20  ed to be...     
15a90 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 66 6c   #..      set fl
15aa0 61 67 73 20 5b 67 65 74 43 6f 6e 6e 65 63 74 69  ags [getConnecti
15ab0 6f 6e 46 6c 61 67 73 20 24 66 69 6c 65 4e 61 6d  onFlags $fileNam
15ac0 65 20 24 66 6c 61 67 73 20 24 71 75 69 65 74 5d  e $flags $quiet]
15ad0 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
15ae0 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 6f 75     # NOTE: If ou
15af0 72 20 63 61 6c 6c 65 72 20 73 70 65 63 69 66 69  r caller specifi
15b00 65 64 20 73 6f 6d 65 20 53 51 4c 69 74 65 43 6f  ed some SQLiteCo
15b10 6e 6e 65 63 74 69 6f 6e 46 6c 61 67 73 2c 20 61  nnectionFlags, a
15b20 64 64 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20  dd the..      # 
15b30 20 20 20 20 20 20 6e 65 63 65 73 73 61 72 79 20        necessary 
15b40 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 63  portion of the c
15b50 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e 67  onnection string
15b60 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 23 0d 0a   now...      #..
15b70 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
15b80 67 20 6c 65 6e 67 74 68 20 24 66 6c 61 67 73 5d  g length $flags]
15b90 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
15ba0 20 20 20 20 20 20 61 70 70 65 6e 64 20 63 6f 6e        append con
15bb0 6e 65 63 74 69 6f 6e 20 7b 3b 46 6c 61 67 73 3d  nection {;Flags=
15bc0 24 7b 66 6c 61 67 73 7d 7d 0d 0a 20 20 20 20 20  ${flags}}..     
15bd0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   }....      #.. 
15be0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20       # NOTE: If 
15bf0 6f 75 72 20 63 61 6c 6c 65 72 20 73 70 65 63 69  our caller speci
15c00 66 69 65 64 20 61 6e 20 65 78 74 72 61 20 70 61  fied an extra pa
15c10 79 6c 6f 61 64 20 74 6f 20 74 68 65 20 63 6f 6e  yload to the con
15c20 6e 65 63 74 69 6f 6e 0d 0a 20 20 20 20 20 20 23  nection..      #
15c30 20 20 20 20 20 20 20 73 74 72 69 6e 67 2c 20 61         string, a
15c40 70 70 65 6e 64 20 69 74 20 6e 6f 77 2e 0d 0a 20  ppend it now... 
15c50 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
15c60 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   {[string length
15c70 20 24 65 78 74 72 61 5d 20 3e 20 30 7d 20 74 68   $extra] > 0} th
15c80 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 61 70  en {..        ap
15c90 70 65 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  pend connection 
15ca0 5c 3b 20 24 65 78 74 72 61 0d 0a 20 20 20 20 20  \; $extra..     
15cb0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   }....      #.. 
15cc0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4f 70 65       # NOTE: Ope
15cd0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  n the database c
15ce0 6f 6e 6e 65 63 74 69 6f 6e 20 6e 6f 77 2c 20 70  onnection now, p
15cf0 6c 61 63 69 6e 67 20 74 68 65 20 6f 70 61 71 75  lacing the opaqu
15d00 65 20 68 61 6e 64 6c 65 20 76 61 6c 75 65 0d 0a  e handle value..
15d10 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69 6e        #       in
15d20 74 6f 20 74 68 65 20 76 61 72 69 61 62 6c 65 20  to the variable 
15d30 73 70 65 63 69 66 69 65 64 20 62 79 20 6f 75 72  specified by our
15d40 20 63 61 6c 6c 65 72 2e 0d 0a 20 20 20 20 20 20   caller...      
15d50 23 0d 0a 20 20 20 20 20 20 73 65 74 20 64 62 20  #..      set db 
15d60 5b 73 71 6c 20 6f 70 65 6e 20 2d 74 79 70 65 20  [sql open -type 
15d70 53 51 4c 69 74 65 20 5b 73 75 62 73 74 20 24 63  SQLite [subst $c
15d80 6f 6e 6e 65 63 74 69 6f 6e 5d 5d 0d 0a 0d 0a 20  onnection]].... 
15d90 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
15da0 4e 4f 54 45 3a 20 43 6f 6e 66 69 67 75 72 65 20  NOTE: Configure 
15db0 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 64 69  the temporary di
15dc0 72 65 63 74 6f 72 79 20 66 6f 72 20 74 68 65 20  rectory for the 
15dd0 6e 65 77 6c 79 20 6f 70 65 6e 65 64 20 64 61 74  newly opened dat
15de0 61 62 61 73 65 0d 0a 20 20 20 20 20 20 23 20 20  abase..      #  
15df0 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 20       connection 
15e00 6e 6f 77 20 75 6e 6c 65 73 73 20 6f 75 72 20 63  now unless our c
15e10 61 6c 6c 65 72 20 66 6f 72 62 69 64 73 20 69 74  aller forbids it
15e20 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
15e30 20 20 69 66 20 7b 24 74 65 6d 70 6f 72 61 72 79    if {$temporary
15e40 20 26 26 20 21 5b 69 6e 66 6f 20 65 78 69 73 74   && ![info exist
15e50 73 20 3a 3a 6e 6f 28 73 65 74 54 65 6d 70 6f 72  s ::no(setTempor
15e60 61 72 79 44 69 72 65 63 74 6f 72 79 29 5d 7d 20  aryDirectory)]} 
15e70 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
15e80 73 71 6c 20 65 78 65 63 75 74 65 20 24 64 62 20  sql execute $db 
15e90 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
15ea0 20 20 20 20 20 20 20 20 20 20 20 22 50 52 41 47             "PRAG
15eb0 4d 41 20 74 65 6d 70 5f 73 74 6f 72 65 5f 64 69  MA temp_store_di
15ec0 72 65 63 74 6f 72 79 20 3d 20 5c 22 22 20 5b 67  rectory = \"" [g
15ed0 65 74 54 65 6d 70 6f 72 61 72 79 44 69 72 65 63  etTemporaryDirec
15ee0 74 6f 72 79 5d 20 5c 22 5c 3b 5d 0d 0a 20 20 20  tory] \"\;]..   
15ef0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
15f00 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 50  .      # NOTE: P
15f10 65 72 66 6f 72 6d 20 61 6e 79 20 65 78 74 72 61  erform any extra
15f20 20 70 65 72 2d 63 6f 6e 6e 65 63 74 69 6f 6e 20   per-connection 
15f30 73 65 74 75 70 20 66 6f 72 20 74 68 65 20 6e 65  setup for the ne
15f40 77 6c 79 20 6f 70 65 6e 65 64 0d 0a 20 20 20 20  wly opened..    
15f50 20 20 23 20 20 20 20 20 20 20 64 61 74 61 62 61    #       databa
15f60 73 65 20 6e 6f 77 20 75 6e 6c 65 73 73 20 6f 75  se now unless ou
15f70 72 20 63 61 6c 6c 65 72 20 66 6f 72 62 69 64 73  r caller forbids
15f80 20 69 74 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20   it...      #.. 
15f90 20 20 20 20 20 73 65 74 20 65 78 65 63 75 74 65       set execute
15fa0 4f 6e 53 65 74 75 70 20 5b 67 65 74 45 78 65 63  OnSetup [getExec
15fb0 75 74 65 4f 6e 53 65 74 75 70 5d 0d 0a 0d 0a 20  uteOnSetup].... 
15fc0 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
15fd0 20 6c 65 6e 67 74 68 20 24 65 78 65 63 75 74 65   length $execute
15fe0 4f 6e 53 65 74 75 70 5d 20 3e 20 30 20 26 26 20  OnSetup] > 0 && 
15ff0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 21 5b 69  \..          ![i
16000 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
16010 65 78 65 63 75 74 65 4f 6e 53 65 74 75 70 29 5d  executeOnSetup)]
16020 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
16030 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
16040 4f 54 45 3a 20 54 68 69 73 20 63 6f 6d 6d 61 6e  OTE: This comman
16050 64 20 6d 61 79 20 72 61 69 73 65 20 61 6e 20 65  d may raise an e
16060 72 72 6f 72 3b 20 69 66 20 73 6f 2c 20 74 68 61  rror; if so, tha
16070 74 20 69 73 20 66 69 6e 65 2c 20 61 73 0d 0a 20  t is fine, as.. 
16080 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74         #       t
16090 68 65 20 65 6e 63 6c 6f 73 69 6e 67 20 74 65 73  he enclosing tes
160a0 74 20 77 69 6c 6c 20 74 68 65 6e 20 66 61 69 6c  t will then fail
160b0 2e 20 20 54 68 65 20 5b 73 75 62 73 74 5d 20 63  .  The [subst] c
160c0 6f 6d 6d 61 6e 64 20 69 73 0d 0a 20 20 20 20 20  ommand is..     
160d0 20 20 20 23 20 20 20 20 20 20 20 75 73 65 64 20     #       used 
160e0 6f 6e 20 74 68 65 20 53 51 4c 20 69 6e 20 63 61  on the SQL in ca
160f0 73 65 20 69 74 20 6e 65 65 64 73 20 74 6f 20 72  se it needs to r
16100 65 66 65 72 20 74 6f 20 73 74 61 74 65 20 69 6e  efer to state in
16110 20 6f 75 72 0d 0a 20 20 20 20 20 20 20 20 23 20   our..        # 
16120 20 20 20 20 20 20 63 6f 6e 74 65 78 74 2e 0d 0a        context...
16130 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
16140 20 20 20 73 71 6c 20 65 78 65 63 75 74 65 20 24     sql execute $
16150 64 62 20 5b 73 75 62 73 74 20 24 65 78 65 63 75  db [subst $execu
16160 74 65 4f 6e 53 65 74 75 70 5d 0d 0a 20 20 20 20  teOnSetup]..    
16170 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
16180 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 6c        # NOTE: Al
16190 77 61 79 73 20 72 65 74 75 72 6e 20 74 68 65 20  ways return the 
161a0 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c  connection handl
161b0 65 20 75 70 6f 6e 20 73 75 63 63 65 73 73 2e 0d  e upon success..
161c0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
161d0 72 65 74 75 72 6e 20 24 64 62 0d 0a 20 20 20 20  return $db..    
161e0 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67  }.....    proc g
161f0 65 74 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 20 7b  etDbConnection {
16200 20 7b 76 61 72 4e 61 6d 65 20 64 62 7d 20 7d 20   {varName db} } 
16210 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
16220 20 20 23 20 4e 4f 54 45 3a 20 52 65 66 65 72 20    # NOTE: Refer 
16230 74 6f 20 74 68 65 20 73 70 65 63 69 66 69 65 64  to the specified
16240 20 76 61 72 69 61 62 6c 65 20 28 65 2e 67 2e 20   variable (e.g. 
16250 22 64 62 22 29 20 69 6e 20 74 68 65 20 63 6f 6e  "db") in the con
16260 74 65 78 74 20 6f 66 20 6f 75 72 0d 0a 20 20 20  text of our..   
16270 20 20 20 23 20 20 20 20 20 20 20 63 61 6c 6c 65     #       calle
16280 72 2e 20 20 54 68 65 20 68 61 6e 64 6c 65 20 74  r.  The handle t
16290 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 70  o the database p
162a0 72 65 76 69 6f 75 73 6c 79 20 6f 70 65 6e 65 64  reviously opened
162b0 20 76 69 61 20 74 68 65 0d 0a 20 20 20 20 20 20   via the..      
162c0 23 20 20 20 20 20 20 20 5b 73 65 74 75 70 44 62  #       [setupDb
162d0 5d 20 70 72 6f 63 65 64 75 72 65 20 73 68 6f 75  ] procedure shou
162e0 6c 64 20 62 65 20 73 74 6f 72 65 64 20 74 68 65  ld be stored the
162f0 72 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  re...      #..  
16300 20 20 20 20 75 70 76 61 72 20 31 20 24 76 61 72      upvar 1 $var
16310 4e 61 6d 65 20 64 62 0d 0a 0d 0a 20 20 20 20 20  Name db....     
16320 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
16330 3a 20 54 68 69 73 20 72 65 74 75 72 6e 73 20 74  : This returns t
16340 68 65 20 41 44 4f 2e 4e 45 54 20 49 44 62 43 6f  he ADO.NET IDbCo
16350 6e 6e 65 63 74 69 6f 6e 20 6f 62 6a 65 63 74 20  nnection object 
16360 69 6e 73 74 61 6e 63 65 20 66 6f 72 20 74 68 65  instance for the
16370 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
16380 73 70 65 63 69 66 69 65 64 20 64 61 74 61 62 73  specified databs
16390 65 20 68 61 6e 64 6c 65 2e 20 20 53 69 6e 63 65  e handle.  Since
163a0 20 67 65 74 74 69 6e 67 20 74 68 69 73 20 6f 62   getting this ob
163b0 6a 65 63 74 20 72 65 6c 69 65 73 20 75 70 6f 6e  ject relies upon
163c0 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
163d0 45 61 67 6c 65 20 69 6e 74 65 72 6e 61 6c 73 2c  Eagle internals,
163e0 20 67 72 65 61 74 20 63 61 72 65 20 73 68 6f 75   great care shou
163f0 6c 64 20 62 65 20 74 61 6b 65 6e 20 74 6f 20 61  ld be taken to a
16400 76 6f 69 64 20 64 69 73 70 6f 73 69 6e 67 20 6f  void disposing o
16410 66 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  f..      #      
16420 20 74 68 69 73 20 6f 62 6a 65 63 74 20 6f 72 20   this object or 
16430 6f 74 68 65 72 77 69 73 65 20 70 75 74 74 69 6e  otherwise puttin
16440 67 20 69 74 20 69 6e 74 6f 20 61 6e 20 69 6e 76  g it into an inv
16450 61 6c 69 64 20 73 74 61 74 65 2e 0d 0a 20 20 20  alid state...   
16460 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
16470 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 64 62 5d  [info exists db]
16480 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
16490 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
164a0 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74            object
164b0 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b   invoke -flags +
164c0 4e 6f 6e 50 75 62 6c 69 63 20 2d 6f 62 6a 65 63  NonPublic -objec
164d0 74 66 6c 61 67 73 20 2b 4e 6f 44 69 73 70 6f 73  tflags +NoDispos
164e0 65 20 2d 61 6c 69 61 73 20 5c 0d 0a 20 20 20 20  e -alias \..    
164f0 20 20 20 20 20 20 20 20 20 20 49 6e 74 65 72 70            Interp
16500 72 65 74 65 72 2e 47 65 74 41 63 74 69 76 65 2e  reter.GetActive.
16510 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 49 74 65 6d  connections Item
16520 20 24 64 62 0d 0a 20 20 20 20 20 20 20 20 7d 20   $db..        } 
16530 72 65 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68  result] == 0} th
16540 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
16550 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e  #..          # N
16560 4f 54 45 3a 20 53 75 63 63 65 73 73 2c 20 72 65  OTE: Success, re
16570 74 75 72 6e 20 74 68 65 20 6f 70 61 71 75 65 20  turn the opaque 
16580 6f 62 6a 65 63 74 20 68 61 6e 64 6c 65 2e 0d 0a  object handle...
16590 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
165a0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 72         return $r
165b0 65 73 75 6c 74 0d 0a 20 20 20 20 20 20 20 20 7d  esult..        }
165c0 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
165d0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
165e0 23 20 4e 4f 54 45 3a 20 46 61 69 6c 75 72 65 2c  # NOTE: Failure,
165f0 20 72 65 70 6f 72 74 20 77 68 79 2e 0d 0a 20 20   report why...  
16600 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
16610 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
16620 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
16630 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
16640 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41          "==== WA
16650 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f  RNING: failed to
16660 20 67 65 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   get connection 
16670 68 61 6e 64 6c 65 20 66 6f 72 20 64 61 74 61 62  handle for datab
16680 61 73 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20  ase \"" \..     
16690 20 20 20 20 20 20 20 20 20 24 64 62 20 22 5c 22           $db "\"
166a0 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20  , error: " \n\t 
166b0 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20  $result \n]..   
166c0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
166d0 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
166e0 20 20 23 20 4e 4f 54 45 3a 20 46 61 69 6c 75 72    # NOTE: Failur
166f0 65 2c 20 72 65 74 75 72 6e 20 61 6e 20 6f 62 76  e, return an obv
16700 69 6f 75 73 6c 79 20 69 6e 76 61 6c 69 64 20 6f  iously invalid o
16710 70 61 71 75 65 20 6f 62 6a 65 63 74 20 68 61 6e  paque object han
16720 64 6c 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  dle...      #.. 
16730 20 20 20 20 20 72 65 74 75 72 6e 20 22 22 0d 0a       return ""..
16740 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
16750 6f 63 20 66 72 65 65 44 62 43 6f 6e 6e 65 63 74  oc freeDbConnect
16760 69 6f 6e 20 7b 20 7b 76 61 72 4e 61 6d 65 20 63  ion { {varName c
16770 6f 6e 6e 65 63 74 69 6f 6e 7d 20 7d 20 7b 0d 0a  onnection} } {..
16780 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
16790 20 4e 4f 54 45 3a 20 52 65 66 65 72 20 74 6f 20   NOTE: Refer to 
167a0 74 68 65 20 73 70 65 63 69 66 69 65 64 20 76 61  the specified va
167b0 72 69 61 62 6c 65 20 28 65 2e 67 2e 20 22 63 6f  riable (e.g. "co
167c0 6e 6e 65 63 74 69 6f 6e 22 29 20 69 6e 20 74 68  nnection") in th
167d0 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
167e0 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72 20   context of our 
167f0 63 61 6c 6c 65 72 2e 20 20 54 68 65 20 6f 70 61  caller.  The opa
16800 71 75 65 20 6f 62 6a 65 63 74 20 68 61 6e 64 6c  que object handl
16810 65 20 66 6f 72 20 61 6e 20 41 44 4f 2e 4e 45 54  e for an ADO.NET
16820 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
16830 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 72 65 76 69  connection previ
16840 6f 75 73 6c 79 20 72 65 74 75 72 6e 65 64 20 62  ously returned b
16850 79 20 5b 67 65 74 44 62 43 6f 6e 6e 65 63 74 69  y [getDbConnecti
16860 6f 6e 5d 20 73 68 6f 75 6c 64 20 62 65 0d 0a 20  on] should be.. 
16870 20 20 20 20 20 23 20 20 20 20 20 20 20 73 74 6f       #       sto
16880 72 65 64 20 74 68 65 72 65 2e 0d 0a 20 20 20 20  red there...    
16890 20 20 23 0d 0a 20 20 20 20 20 20 75 70 76 61 72    #..      upvar
168a0 20 31 20 24 76 61 72 4e 61 6d 65 20 63 6f 6e 6e   1 $varName conn
168b0 65 63 74 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20  ection....      
168c0 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
168d0 20 41 74 74 65 6d 70 74 20 74 6f 20 72 65 6d 6f   Attempt to remo
168e0 76 65 20 74 68 65 20 6f 70 61 71 75 65 20 6f 62  ve the opaque ob
168f0 6a 65 63 74 20 68 61 6e 64 6c 65 20 66 72 6f 6d  ject handle from
16900 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72   the interpreter
16910 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
16920 6e 6f 77 2e 20 20 54 68 69 73 20 5b 6f 62 6a 65  now.  This [obje
16930 63 74 20 64 69 73 70 6f 73 65 5d 20 63 61 6c 6c  ct dispose] call
16940 20 77 69 6c 6c 20 6e 6f 74 20 61 63 74 75 61 6c   will not actual
16950 6c 79 20 64 69 73 70 6f 73 65 20 6f 66 20 74 68  ly dispose of th
16960 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
16970 20 75 6e 64 65 72 6c 79 69 6e 67 20 6f 62 6a 65   underlying obje
16980 63 74 20 62 65 63 61 75 73 65 20 74 68 65 20 2b  ct because the +
16990 4e 6f 44 69 73 70 6f 73 65 20 66 6c 61 67 20 77  NoDispose flag w
169a0 61 73 20 73 65 74 20 6f 6e 20 69 74 0d 0a 20 20  as set on it..  
169b0 20 20 20 20 23 20 20 20 20 20 20 20 64 75 72 69      #       duri
169c0 6e 67 20 63 72 65 61 74 69 6f 6e 20 6f 66 20 74  ng creation of t
169d0 68 65 20 6f 70 61 71 75 65 20 6f 62 6a 65 63 74  he opaque object
169e0 20 68 61 6e 64 6c 65 2e 0d 0a 20 20 20 20 20 20   handle...      
169f0 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e  #..      if {[in
16a00 66 6f 20 65 78 69 73 74 73 20 63 6f 6e 6e 65 63  fo exists connec
16a10 74 69 6f 6e 5d 20 26 26 20 5c 0d 0a 20 20 20 20  tion] && \..    
16a20 20 20 20 20 20 20 5b 63 61 74 63 68 20 7b 6f 62        [catch {ob
16a30 6a 65 63 74 20 64 69 73 70 6f 73 65 20 24 63 6f  ject dispose $co
16a40 6e 6e 65 63 74 69 6f 6e 7d 20 65 72 72 6f 72 5d  nnection} error]
16a50 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
16a60 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
16a70 4f 54 45 3a 20 57 65 20 73 6f 6d 65 68 6f 77 20  OTE: We somehow 
16a80 66 61 69 6c 65 64 20 74 6f 20 72 65 6d 6f 76 65  failed to remove
16a90 20 74 68 65 20 68 61 6e 64 6c 65 2c 20 72 65 70   the handle, rep
16aa0 6f 72 74 20 77 68 79 2e 0d 0a 20 20 20 20 20 20  ort why...      
16ab0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75    #..        tpu
16ac0 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
16ad0 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
16ae0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 3d  ..            "=
16af0 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69  === WARNING: fai
16b00 6c 65 64 20 74 6f 20 72 65 6d 6f 76 65 20 63 6f  led to remove co
16b10 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20  nnection handle 
16b20 5c 22 22 20 24 63 6f 6e 6e 65 63 74 69 6f 6e 20  \"" $connection 
16b30 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  \..            "
16b40 5c 22 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c  \", error: " \n\
16b50 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20  t $error \n]..  
16b60 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
16b70 0a 20 20 20 20 70 72 6f 63 20 61 64 64 44 62 43  .    proc addDbC
16b80 6f 6e 6e 65 63 74 69 6f 6e 20 7b 20 63 6f 6e 6e  onnection { conn
16b90 65 63 74 69 6f 6e 20 7b 76 61 72 4e 61 6d 65 20  ection {varName 
16ba0 64 62 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23  db} } {..      #
16bb0 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
16bc0 52 65 66 65 72 20 74 6f 20 74 68 65 20 73 70 65  Refer to the spe
16bd0 63 69 66 69 65 64 20 76 61 72 69 61 62 6c 65 20  cified variable 
16be0 28 65 2e 67 2e 20 22 64 62 22 29 20 69 6e 20 74  (e.g. "db") in t
16bf0 68 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75  he context of ou
16c00 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  r..      #      
16c10 20 63 61 6c 6c 65 72 2e 0d 0a 20 20 20 20 20 20   caller...      
16c20 23 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20 31  #..      upvar 1
16c30 20 24 76 61 72 4e 61 6d 65 20 64 62 0d 0a 0d 0a   $varName db....
16c40 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
16c50 20 4e 4f 54 45 3a 20 43 72 65 61 74 65 20 61 20   NOTE: Create a 
16c60 63 6f 72 72 65 63 74 6c 79 20 66 6f 72 6d 61 74  correctly format
16c70 74 65 64 20 6e 61 6d 65 20 66 6f 72 20 74 68 65  ted name for the
16c80 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
16c90 74 69 6f 6e 20 74 6f 0d 0a 20 20 20 20 20 20 23  tion to..      #
16ca0 20 20 20 20 20 20 20 62 65 20 61 64 64 65 64 20         be added 
16cb0 74 6f 20 74 68 65 20 6c 69 73 74 20 6d 61 6e 61  to the list mana
16cc0 67 65 64 20 62 79 20 74 68 65 20 45 61 67 6c 65  ged by the Eagle
16cd0 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a 20   interpreter... 
16ce0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65       #..      se
16cf0 74 20 64 62 20 5b 6f 62 6a 65 63 74 20 69 6e 76  t db [object inv
16d00 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50  oke -flags +NonP
16d10 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20  ublic \..       
16d20 20 20 20 45 61 67 6c 65 2e 5f 43 6f 6d 70 6f 6e     Eagle._Compon
16d30 65 6e 74 73 2e 50 72 69 76 61 74 65 2e 46 6f 72  ents.Private.For
16d40 6d 61 74 4f 70 73 20 44 61 74 61 62 61 73 65 4f  matOps DatabaseO
16d50 62 6a 65 63 74 4e 61 6d 65 20 24 63 6f 6e 6e 65  bjectName $conne
16d60 63 74 69 6f 6e 20 5c 0d 0a 20 20 20 20 20 20 20  ction \..       
16d70 20 20 20 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74     SQLiteConnect
16d80 69 6f 6e 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f  ion [object invo
16d90 6b 65 20 49 6e 74 65 72 70 72 65 74 65 72 2e 47  ke Interpreter.G
16da0 65 74 41 63 74 69 76 65 20 4e 65 78 74 49 64 5d  etActive NextId]
16db0 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ]....      #..  
16dc0 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 64 64 20      # NOTE: Add 
16dd0 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  the database con
16de0 6e 65 63 74 69 6f 6e 20 70 72 6f 76 69 64 65 64  nection provided
16df0 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 20 74   by our caller t
16e00 6f 20 74 68 65 20 6c 69 73 74 0d 0a 20 20 20 20  o the list..    
16e10 20 20 23 20 20 20 20 20 20 20 6f 66 20 74 68 6f    #       of tho
16e20 73 65 20 6b 6e 6f 77 6e 20 74 6f 20 74 68 65 20  se known to the 
16e30 45 61 67 6c 65 20 69 6e 74 65 72 70 72 65 74 65  Eagle interprete
16e40 72 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  r...      #..   
16e50 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65     object invoke
16e60 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c   -flags +NonPubl
16e70 69 63 20 49 6e 74 65 72 70 72 65 74 65 72 2e 47  ic Interpreter.G
16e80 65 74 41 63 74 69 76 65 2e 63 6f 6e 6e 65 63 74  etActive.connect
16e90 69 6f 6e 73 20 41 64 64 20 5c 0d 0a 20 20 20 20  ions Add \..    
16ea0 20 20 20 20 20 20 24 64 62 20 24 63 6f 6e 6e 65        $db $conne
16eb0 63 74 69 6f 6e 0d 0a 20 20 20 20 7d 0d 0a 0c 0d  ction..    }....
16ec0 0a 20 20 20 20 70 72 6f 63 20 67 65 74 52 6f 77  .    proc getRow
16ed0 73 46 72 6f 6d 44 61 74 61 54 61 62 6c 65 20 7b  sFromDataTable {
16ee0 20 64 61 74 61 54 61 62 6c 65 20 7d 20 7b 0d 0a   dataTable } {..
16ef0 20 20 20 20 20 20 73 65 74 20 72 6f 77 73 20 5b        set rows [
16f00 6c 69 73 74 5d 0d 0a 20 20 20 20 20 20 73 65 74  list]..      set
16f10 20 63 6f 75 6e 74 20 5b 24 64 61 74 61 54 61 62   count [$dataTab
16f20 6c 65 20 43 6f 6c 75 6d 6e 73 2e 43 6f 75 6e 74  le Columns.Count
16f30 5d 0d 0a 0d 0a 20 20 20 20 20 20 66 6f 72 20 7b  ]....      for {
16f40 73 65 74 20 69 6e 64 65 78 20 30 7d 20 7b 24 69  set index 0} {$i
16f50 6e 64 65 78 20 3c 20 24 63 6f 75 6e 74 7d 20 7b  ndex < $count} {
16f60 69 6e 63 72 20 69 6e 64 65 78 7d 20 7b 0d 0a 20  incr index} {.. 
16f70 20 20 20 20 20 20 20 73 65 74 20 64 61 74 61 43         set dataC
16f80 6f 6c 75 6d 6e 20 5b 24 64 61 74 61 54 61 62 6c  olumn [$dataTabl
16f90 65 20 2d 61 6c 69 61 73 20 43 6f 6c 75 6d 6e 73  e -alias Columns
16fa0 2e 67 65 74 5f 49 74 65 6d 20 24 69 6e 64 65 78  .get_Item $index
16fb0 5d 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 6e  ]..        set n
16fc0 61 6d 65 73 28 24 69 6e 64 65 78 29 20 5b 24 64  ames($index) [$d
16fd0 61 74 61 43 6f 6c 75 6d 6e 20 43 6f 6c 75 6d 6e  ataColumn Column
16fe0 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a  Name]..      }..
16ff0 0d 0a 20 20 20 20 20 20 6f 62 6a 65 63 74 20 66  ..      object f
17000 6f 72 65 61 63 68 20 2d 61 6c 69 61 73 20 64 61  oreach -alias da
17010 74 61 52 6f 77 20 5b 73 65 74 20 64 61 74 61 52  taRow [set dataR
17020 6f 77 73 20 5b 24 64 61 74 61 54 61 62 6c 65 20  ows [$dataTable 
17030 52 6f 77 73 5d 5d 20 7b 0d 0a 20 20 20 20 20 20  Rows]] {..      
17040 20 20 73 65 74 20 72 6f 77 20 5b 6c 69 73 74 5d    set row [list]
17050 0d 0a 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 20  ....        for 
17060 7b 73 65 74 20 69 6e 64 65 78 20 30 7d 20 7b 24  {set index 0} {$
17070 69 6e 64 65 78 20 3c 20 24 63 6f 75 6e 74 7d 20  index < $count} 
17080 7b 69 6e 63 72 20 69 6e 64 65 78 7d 20 7b 0d 0a  {incr index} {..
17090 20 20 20 20 20 20 20 20 20 20 73 65 74 20 76 61            set va
170a0 6c 75 65 20 5b 24 64 61 74 61 52 6f 77 20 2d 63  lue [$dataRow -c
170b0 72 65 61 74 65 20 2d 61 6c 69 61 73 20 67 65 74  reate -alias get
170c0 5f 49 74 65 6d 20 24 69 6e 64 65 78 5d 0d 0a 0d  _Item $index]...
170d0 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b  .          if {[
170e0 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76  string length $v
170f0 61 6c 75 65 5d 20 3e 20 30 20 26 26 20 5c 0d 0a  alue] > 0 && \..
17100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 21 5b                ![
17110 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 43 6f  object invoke Co
17120 6e 76 65 72 74 20 49 73 44 42 4e 75 6c 6c 20 24  nvert IsDBNull $
17130 76 61 6c 75 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a  value]} then {..
17140 20 20 20 20 20 20 20 20 20 20 20 20 6c 61 70 70              lapp
17150 65 6e 64 20 72 6f 77 20 5b 6c 69 73 74 20 24 6e  end row [list $n
17160 61 6d 65 73 28 24 69 6e 64 65 78 29 20 5b 24 76  ames($index) [$v
17170 61 6c 75 65 20 54 6f 53 74 72 69 6e 67 5d 5d 0d  alue ToString]].
17180 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73  .          } els
17190 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e {..           
171a0 20 6c 61 70 70 65 6e 64 20 72 6f 77 20 5b 6c 69   lappend row [li
171b0 73 74 20 24 6e 61 6d 65 73 28 24 69 6e 64 65 78  st $names($index
171c0 29 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  )]..          }.
171d0 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
171e0 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 72 6f        lappend ro
171f0 77 73 20 24 72 6f 77 0d 0a 20 20 20 20 20 20 7d  ws $row..      }
17200 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ....      return
17210 20 24 72 6f 77 73 0d 0a 20 20 20 20 7d 0d 0a 0c   $rows..    }...
17220 0d 0a 20 20 20 20 70 72 6f 63 20 64 75 6d 70 52  ..    proc dumpR
17230 6f 77 73 46 72 6f 6d 44 61 74 61 54 61 62 6c 65  owsFromDataTable
17240 20 7b 20 63 68 61 6e 6e 65 6c 20 72 6f 77 73 20   { channel rows 
17250 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 73  } {..      set s
17260 65 71 75 65 6e 63 65 20 31 0d 0a 0d 0a 20 20 20  equence 1....   
17270 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 20 24     foreach row $
17280 72 6f 77 73 20 7b 0d 0a 20 20 20 20 20 20 20 20  rows {..        
17290 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
172a0 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
172b0 20 20 20 20 20 20 20 20 20 20 5b 65 78 70 72 20            [expr 
172c0 7b 24 73 65 71 75 65 6e 63 65 20 3e 20 31 20 3f  {$sequence > 1 ?
172d0 20 22 5c 6e 22 20 3a 20 22 22 7d 5d 20 22 2d 2d   "\n" : ""}] "--
172e0 2d 2d 20 52 4f 57 20 23 22 20 24 73 65 71 75 65  -- ROW #" $seque
172f0 6e 63 65 20 3a 5c 6e 5d 0d 0a 0d 0a 20 20 20 20  nce :\n]....    
17300 20 20 20 20 66 6f 72 65 61 63 68 20 70 61 69 72      foreach pair
17310 20 24 72 6f 77 20 7b 0d 0a 20 20 20 20 20 20 20   $row {..       
17320 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20     if {[llength 
17330 24 70 61 69 72 5d 20 3e 3d 20 32 7d 20 74 68 65  $pair] >= 2} the
17340 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
17350 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
17360 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 74 20 5c  [appendArgs \t \
17370 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
17380 20 20 5b 6c 69 73 74 20 5b 6c 69 6e 64 65 78 20    [list [lindex 
17390 24 70 61 69 72 20 30 5d 5d 20 22 3a 20 22 20 5b  $pair 0]] ": " [
173a0 6c 69 73 74 20 5b 6c 69 6e 64 65 78 20 24 70 61  list [lindex $pa
173b0 69 72 20 31 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20  ir 1]] \n]..    
173c0 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b        } elseif {
173d0 5b 6c 6c 65 6e 67 74 68 20 24 70 61 69 72 5d 20  [llength $pair] 
173e0 3d 3d 20 31 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 1} then {..  
173f0 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
17400 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
17410 41 72 67 73 20 5c 74 20 5c 0d 0a 20 20 20 20 20  Args \t \..     
17420 20 20 20 20 20 20 20 20 20 20 20 5b 6c 69 73 74             [list
17430 20 5b 6c 69 6e 64 65 78 20 24 70 61 69 72 20 30   [lindex $pair 0
17440 5d 5d 20 22 3a 20 3c 6e 75 6c 6c 3e 5c 6e 22 5d  ]] ": <null>\n"]
17450 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c  ..          } el
17460 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
17470 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
17480 20 5c 74 3c 65 6d 70 74 79 3e 5c 6e 3b 20 23 20   \t<empty>\n; # 
17490 4e 4f 54 45 3a 20 4e 6f 20 64 61 74 61 3f 0d 0a  NOTE: No data?..
174a0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
174b0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
174c0 20 20 69 6e 63 72 20 73 65 71 75 65 6e 63 65 0d    incr sequence.
174d0 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
174e0 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 6c 65  ....    proc cle
174f0 61 6e 75 70 44 62 20 7b 20 66 69 6c 65 4e 61 6d  anupDb { fileNam
17500 65 20 7b 76 61 72 4e 61 6d 65 20 64 62 7d 20 7b  e {varName db} {
17510 63 6f 6c 6c 65 63 74 20 74 72 75 65 7d 20 7b 71  collect true} {q
17520 75 61 6c 69 66 79 20 74 72 75 65 7d 0d 0a 20 20  ualify true}..  
17530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17540 20 20 20 7b 64 65 6c 65 74 65 20 74 72 75 65 7d     {delete true}
17550 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20   } {..      #.. 
17560 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74       # NOTE: Att
17570 65 6d 70 74 20 74 6f 20 66 6f 72 63 65 20 61 6c  empt to force al
17580 6c 20 70 65 6e 64 69 6e 67 20 22 67 61 72 62 61  l pending "garba
17590 67 65 22 20 6f 62 6a 65 63 74 73 20 74 6f 20 62  ge" objects to b
175a0 65 20 63 6f 6c 6c 65 63 74 65 64 2c 0d 0a 20 20  e collected,..  
175b0 20 20 20 20 23 20 20 20 20 20 20 20 69 6e 63 6c      #       incl
175c0 75 64 69 6e 67 20 53 51 4c 69 74 65 20 73 74 61  uding SQLite sta
175d0 74 65 6d 65 6e 74 73 20 61 6e 64 20 62 61 63 6b  tements and back
175e0 75 70 20 6f 62 6a 65 63 74 73 3b 20 74 68 69 73  up objects; this
175f0 20 73 68 6f 75 6c 64 20 61 6c 6c 6f 77 0d 0a 20   should allow.. 
17600 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
17610 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61   underlying data
17620 62 61 73 65 20 66 69 6c 65 20 74 6f 20 62 65 20  base file to be 
17630 64 65 6c 65 74 65 64 2e 0d 0a 20 20 20 20 20 20  deleted...      
17640 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 63 6f  #..      if {$co
17650 6c 6c 65 63 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  llect} then {.. 
17660 20 20 20 20 20 20 20 63 6f 6c 6c 65 63 74 47 61         collectGa
17670 72 62 61 67 65 20 24 3a 3a 74 65 73 74 5f 63 68  rbage $::test_ch
17680 61 6e 6e 65 6c 0d 0a 20 20 20 20 20 20 7d 0d 0a  annel..      }..
17690 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
176a0 20 23 20 4e 4f 54 45 3a 20 52 65 66 65 72 20 74   # NOTE: Refer t
176b0 6f 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  o the specified 
176c0 76 61 72 69 61 62 6c 65 20 28 65 2e 67 2e 20 22  variable (e.g. "
176d0 64 62 22 29 20 69 6e 20 74 68 65 20 63 6f 6e 74  db") in the cont
176e0 65 78 74 20 6f 66 20 6f 75 72 0d 0a 20 20 20 20  ext of our..    
176f0 20 20 23 20 20 20 20 20 20 20 63 61 6c 6c 65 72    #       caller
17700 2e 20 20 54 68 65 20 68 61 6e 64 6c 65 20 74 6f  .  The handle to
17710 20 74 68 65 20 64 61 74 61 62 61 73 65 20 70 72   the database pr
17720 65 76 69 6f 75 73 6c 79 20 6f 70 65 6e 65 64 20  eviously opened 
17730 76 69 61 20 74 68 65 0d 0a 20 20 20 20 20 20 23  via the..      #
17740 20 20 20 20 20 20 20 5b 73 65 74 75 70 44 62 5d         [setupDb]
17750 20 70 72 6f 63 65 64 75 72 65 20 73 68 6f 75 6c   procedure shoul
17760 64 20 62 65 20 73 74 6f 72 65 64 20 74 68 65 72  d be stored ther
17770 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  e...      #..   
17780 20 20 20 75 70 76 61 72 20 31 20 24 76 61 72 4e     upvar 1 $varN
17790 61 6d 65 20 64 62 0d 0a 0d 0a 20 20 20 20 20 20  ame db....      
177a0 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
177b0 20 43 6c 6f 73 65 20 74 68 65 20 63 6f 6e 6e 65   Close the conne
177c0 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 64 61 74  ction to the dat
177d0 61 62 61 73 65 20 6e 6f 77 2e 20 20 54 68 69 73  abase now.  This
177e0 20 73 68 6f 75 6c 64 20 61 6c 6c 6f 77 20 75 73   should allow us
177f0 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
17800 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 75 6e  to delete the un
17810 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73  derlying databas
17820 65 20 66 69 6c 65 2e 0d 0a 20 20 20 20 20 20 23  e file...      #
17830 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66  ..      if {[inf
17840 6f 20 65 78 69 73 74 73 20 64 62 5d 20 26 26 20  o exists db] && 
17850 5b 63 61 74 63 68 20 7b 73 71 6c 20 63 6c 6f 73  [catch {sql clos
17860 65 20 24 64 62 7d 20 65 72 72 6f 72 5d 7d 20 74  e $db} error]} t
17870 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
17880 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
17890 3a 20 57 65 20 73 6f 6d 65 68 6f 77 20 66 61 69  : We somehow fai
178a0 6c 65 64 20 74 6f 20 63 6c 6f 73 65 20 74 68 65  led to close the
178b0 20 64 61 74 61 62 61 73 65 2c 20 72 65 70 6f 72   database, repor
178c0 74 20 77 68 79 2e 0d 0a 20 20 20 20 20 20 20 20  t why...        
178d0 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  #..        tputs
178e0 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
178f0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
17900 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d              "===
17910 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65  = WARNING: faile
17920 64 20 74 6f 20 63 6c 6f 73 65 20 64 61 74 61 62  d to close datab
17930 61 73 65 20 5c 22 22 20 24 64 62 20 22 5c 22 2c  ase \"" $db "\",
17940 20 65 72 72 6f 72 3a 20 22 20 5c 0d 0a 20 20 20   error: " \..   
17950 20 20 20 20 20 20 20 20 20 5c 6e 5c 74 20 24 65           \n\t $e
17960 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  rror \n]..      
17970 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
17980 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69 72 73      # NOTE: Firs
17990 74 2c 20 73 65 65 20 69 66 20 6f 75 72 20 63 61  t, see if our ca
179a0 6c 6c 65 72 20 68 61 73 20 72 65 71 75 65 73 74  ller has request
179b0 65 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  ed an in-memory 
179c0 64 61 74 61 62 61 73 65 2e 0d 0a 20 20 20 20 20  database...     
179d0 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 69 73   #..      set is
179e0 4d 65 6d 6f 72 79 20 5b 69 73 4d 65 6d 6f 72 79  Memory [isMemory
179f0 44 62 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 0d  Db $fileName]...
17a00 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
17a10 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74 68  # NOTE: Build th
17a20 65 20 66 75 6c 6c 20 70 61 74 68 20 74 6f 20 74  e full path to t
17a30 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
17a40 20 6e 61 6d 65 2e 20 20 46 6f 72 20 6e 6f 77 2c   name.  For now,
17a50 20 61 6c 6c 20 74 65 73 74 0d 0a 20 20 20 20 20   all test..     
17a60 20 23 20 20 20 20 20 20 20 64 61 74 61 62 61 73   #       databas
17a70 65 20 66 69 6c 65 73 20 61 72 65 20 73 74 6f 72  e files are stor
17a80 65 64 20 69 6e 20 74 68 65 20 74 65 6d 70 6f 72  ed in the tempor
17a90 61 72 79 20 64 69 72 65 63 74 6f 72 79 2e 0d 0a  ary directory...
17aa0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
17ab0 66 20 7b 21 24 69 73 4d 65 6d 6f 72 79 20 26 26  f {!$isMemory &&
17ac0 20 24 71 75 61 6c 69 66 79 7d 20 74 68 65 6e 20   $qualify} then 
17ad0 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 66  {..        set f
17ae0 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f  ileName [file jo
17af0 69 6e 20 5b 67 65 74 44 61 74 61 62 61 73 65 44  in [getDatabaseD
17b00 69 72 65 63 74 6f 72 79 5d 20 5b 66 69 6c 65 20  irectory] [file 
17b10 74 61 69 6c 20 24 66 69 6c 65 4e 61 6d 65 5d 5d  tail $fileName]]
17b20 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
17b30 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
17b40 54 45 3a 20 43 68 65 63 6b 20 69 66 20 74 68 65  TE: Check if the
17b50 20 66 69 6c 65 20 73 74 69 6c 6c 20 65 78 69 73   file still exis
17b60 74 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ts...      #..  
17b70 20 20 20 20 69 66 20 7b 21 24 69 73 4d 65 6d 6f      if {!$isMemo
17b80 72 79 20 26 26 20 24 64 65 6c 65 74 65 20 26 26  ry && $delete &&
17b90 20 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 66   [file exists $f
17ba0 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b  ileName]} then {
17bb0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
17bc0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69       # NOTE: Ski
17bd0 70 20 64 65 6c 65 74 69 6e 67 20 64 61 74 61 62  p deleting datab
17be0 61 73 65 20 66 69 6c 65 73 20 69 66 20 73 6f 6d  ase files if som
17bf0 65 62 6f 64 79 20 73 65 74 73 20 74 68 65 20 67  ebody sets the g
17c00 6c 6f 62 61 6c 0d 0a 20 20 20 20 20 20 20 20 23  lobal..        #
17c10 20 20 20 20 20 20 20 76 61 72 69 61 62 6c 65 20         variable 
17c20 74 6f 20 70 72 65 76 65 6e 74 20 69 74 2e 0d 0a  to prevent it...
17c30 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
17c40 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
17c50 69 73 74 73 20 3a 3a 6e 6f 28 63 6c 65 61 6e 75  ists ::no(cleanu
17c60 70 44 62 46 69 6c 65 29 5d 7d 20 74 68 65 6e 20  pDbFile)]} then 
17c70 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  {..          #..
17c80 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
17c90 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 64 65 6c  : Attempt to del
17ca0 65 74 65 20 74 68 65 20 74 65 73 74 20 64 61 74  ete the test dat
17cb0 61 62 61 73 65 20 66 69 6c 65 20 6e 6f 77 2e 0d  abase file now..
17cc0 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
17cd0 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 65 74          if {[set
17ce0 20 63 6f 64 65 20 5b 63 61 74 63 68 20 7b 66 69   code [catch {fi
17cf0 6c 65 20 64 65 6c 65 74 65 20 24 66 69 6c 65 4e  le delete $fileN
17d00 61 6d 65 7d 20 65 72 72 6f 72 5d 5d 7d 20 74 68  ame} error]]} th
17d10 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
17d20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
17d30 20 23 20 4e 4f 54 45 3a 20 57 65 20 73 6f 6d 65   # NOTE: We some
17d40 68 6f 77 20 66 61 69 6c 65 64 20 74 6f 20 64 65  how failed to de
17d50 6c 65 74 65 20 74 68 65 20 66 69 6c 65 2c 20 72  lete the file, r
17d60 65 70 6f 72 74 20 77 68 79 2e 0d 0a 20 20 20 20  eport why...    
17d70 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
17d80 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
17d90 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
17da0 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
17db0 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d              "===
17dc0 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65  = WARNING: faile
17dd0 64 20 74 6f 20 64 65 6c 65 74 65 20 64 61 74 61  d to delete data
17de0 62 61 73 65 20 66 69 6c 65 20 5c 22 22 20 24 66  base file \"" $f
17df0 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20  ileName \..     
17e00 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 20 64             "\" d
17e10 75 72 69 6e 67 20 63 6c 65 61 6e 75 70 2c 20 65  uring cleanup, e
17e20 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72  rror: " \n\t $er
17e30 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ror \n]..       
17e40 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20     }..        } 
17e50 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
17e60 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23    #..          #
17e70 20 4e 4f 54 45 3a 20 53 68 6f 77 20 74 68 61 74   NOTE: Show that
17e80 20 77 65 20 73 6b 69 70 70 65 64 20 64 65 6c 65   we skipped dele
17e90 74 69 6e 67 20 74 68 65 20 66 69 6c 65 2e 0d 0a  ting the file...
17ea0 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
17eb0 20 20 20 20 20 20 20 73 65 74 20 63 6f 64 65 20         set code 
17ec0 30 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 74  0....          t
17ed0 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
17ee0 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
17ef0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
17f00 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a    "==== WARNING:
17f10 20 73 6b 69 70 70 65 64 20 64 65 6c 65 74 69 6e   skipped deletin
17f20 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  g database file 
17f30 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c 0d  \"" $fileName \.
17f40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
17f50 5c 22 20 64 75 72 69 6e 67 20 63 6c 65 61 6e 75  \" during cleanu
17f60 70 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d  p\n"]..        }
17f70 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
17f80 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
17f90 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65       # NOTE: The
17fa0 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65   file does not e
17fb0 78 69 73 74 2c 20 73 75 63 63 65 73 73 21 0d 0a  xist, success!..
17fc0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
17fd0 20 20 20 73 65 74 20 63 6f 64 65 20 30 0d 0a 20     set code 0.. 
17fe0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
17ff0 72 65 74 75 72 6e 20 24 63 6f 64 65 0d 0a 20 20  return $code..  
18000 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
18010 20 73 61 76 65 45 6e 76 69 72 6f 6e 6d 65 6e 74   saveEnvironment
18020 56 61 72 69 61 62 6c 65 73 20 7b 20 6e 61 6d 65  Variables { name
18030 73 20 7b 76 61 72 4e 61 6d 65 20 22 22 7d 20 7d  s {varName ""} }
18040 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
18050 20 20 20 23 20 4e 4f 54 45 3a 20 46 6f 72 20 65     # NOTE: For e
18060 61 63 68 20 6e 61 6d 65 2c 20 64 6f 65 73 20 74  ach name, does t
18070 68 65 20 6c 69 76 65 20 65 6e 76 69 72 6f 6e 6d  he live environm
18080 65 6e 74 20 76 61 72 69 61 62 6c 65 20 65 78 69  ent variable exi
18090 73 74 3f 20 20 49 66 0d 0a 20 20 20 20 20 20 23  st?  If..      #
180a0 20 20 20 20 20 20 20 73 6f 2c 20 73 61 76 65 20         so, save 
180b0 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20 6c 61  the value for la
180c0 74 65 72 3b 20 6f 74 68 65 72 77 69 73 65 2c 20  ter; otherwise, 
180d0 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 61  make sure the sa
180e0 76 65 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ved..      #    
180f0 20 20 20 76 61 6c 75 65 20 64 6f 65 73 20 6e 6f     value does no
18100 74 20 65 78 69 73 74 20 65 69 74 68 65 72 2e 20  t exist either. 
18110 20 54 68 65 20 6c 69 76 65 20 65 6e 76 69 72 6f   The live enviro
18120 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 73 0d  nment variables.
18130 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 41  .      #       A
18140 52 45 20 4e 4f 54 20 63 68 61 6e 67 65 64 20 62  RE NOT changed b
18150 79 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65  y this procedure
18160 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
18170 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
18180 6e 67 74 68 20 24 76 61 72 4e 61 6d 65 5d 20 3d  ngth $varName] =
18190 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
181a0 20 20 20 20 20 73 65 74 20 76 61 72 4e 61 6d 65       set varName
181b0 20 73 61 76 65 64 45 6e 76 0d 0a 20 20 20 20 20   savedEnv..     
181c0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 75 70 76 61   }....      upva
181d0 72 20 31 20 24 76 61 72 4e 61 6d 65 20 73 61 76  r 1 $varName sav
181e0 65 64 45 6e 76 0d 0a 0d 0a 20 20 20 20 20 20 66  edEnv....      f
181f0 6f 72 65 61 63 68 20 6e 61 6d 65 20 24 6e 61 6d  oreach name $nam
18200 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66  es {..        if
18210 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
18220 3a 65 6e 76 28 24 6e 61 6d 65 29 5d 7d 20 74 68  :env($name)]} th
18230 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
18240 73 65 74 20 73 61 76 65 64 45 6e 76 28 24 6e 61  set savedEnv($na
18250 6d 65 29 20 24 3a 3a 65 6e 76 28 24 6e 61 6d 65  me) $::env($name
18260 29 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73  )..        } els
18270 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 75  e {..          u
18280 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e  nset -nocomplain
18290 20 73 61 76 65 64 45 6e 76 28 24 6e 61 6d 65 29   savedEnv($name)
182a0 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
182b0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
182c0 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54  .      # NOTE: T
182d0 68 69 73 20 69 73 20 73 65 6c 66 2d 63 6c 65 61  his is self-clea
182e0 6e 69 6e 67 2e 20 20 49 66 20 6e 6f 20 73 61 76  ning.  If no sav
182f0 65 64 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76  ed environment v
18300 61 72 69 61 62 6c 65 73 20 6e 6f 77 0d 0a 20 20  ariables now..  
18310 20 20 20 20 23 20 20 20 20 20 20 20 65 78 69 73      #       exis
18320 74 2c 20 72 65 6d 6f 76 65 20 74 68 65 20 61 72  t, remove the ar
18330 72 61 79 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ray...      #.. 
18340 20 20 20 20 20 69 66 20 7b 5b 61 72 72 61 79 20       if {[array 
18350 73 69 7a 65 20 73 61 76 65 64 45 6e 76 5d 20 3d  size savedEnv] =
18360 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
18370 20 20 20 20 20 75 6e 73 65 74 20 2d 6e 6f 63 6f       unset -noco
18380 6d 70 6c 61 69 6e 20 73 61 76 65 64 45 6e 76 0d  mplain savedEnv.
18390 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
183a0 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 72 65 73  ....    proc res
183b0 74 6f 72 65 45 6e 76 69 72 6f 6e 6d 65 6e 74 56  toreEnvironmentV
183c0 61 72 69 61 62 6c 65 73 20 7b 20 6e 61 6d 65 73  ariables { names
183d0 20 7b 76 61 72 4e 61 6d 65 20 22 22 7d 20 7d 20   {varName ""} } 
183e0 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
183f0 20 20 23 20 4e 4f 54 45 3a 20 46 6f 72 20 65 61    # NOTE: For ea
18400 63 68 20 6e 61 6d 65 2c 20 64 6f 65 73 20 74 68  ch name, does th
18410 65 20 73 61 76 65 64 20 65 6e 76 69 72 6f 6e 6d  e saved environm
18420 65 6e 74 20 76 61 72 69 61 62 6c 65 20 65 78 69  ent variable exi
18430 73 74 3f 20 20 49 66 0d 0a 20 20 20 20 20 20 23  st?  If..      #
18440 20 20 20 20 20 20 20 73 6f 2c 20 72 65 73 74 6f         so, resto
18450 72 65 20 74 68 65 20 73 61 76 65 64 20 76 61 6c  re the saved val
18460 75 65 20 61 6e 64 20 75 6e 73 65 74 20 69 74 3b  ue and unset it;
18470 20 6f 74 68 65 72 77 69 73 65 2c 20 6d 61 6b 65   otherwise, make
18480 20 73 75 72 65 0d 0a 20 20 20 20 20 20 23 20 20   sure..      #  
18490 20 20 20 20 20 74 68 65 20 6c 69 76 65 20 65 6e       the live en
184a0 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62  vironment variab
184b0 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  le does not exis
184c0 74 20 65 69 74 68 65 72 20 28 69 2e 65 2e 20 69  t either (i.e. i
184d0 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  t..      #      
184e0 20 77 61 73 20 6e 6f 74 20 73 65 74 20 74 6f 20   was not set to 
184f0 62 65 67 69 6e 20 77 69 74 68 29 2e 20 20 42 6f  begin with).  Bo
18500 74 68 20 73 61 76 65 64 20 61 6e 64 20 6c 69 76  th saved and liv
18510 65 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 0d 0a 20  e environment.. 
18520 20 20 20 20 20 23 20 20 20 20 20 20 20 76 61 72       #       var
18530 69 61 62 6c 65 73 20 41 52 45 20 63 68 61 6e 67  iables ARE chang
18540 65 64 20 62 79 20 74 68 69 73 20 70 72 6f 63 65  ed by this proce
18550 64 75 72 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  dure...      #..
18560 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
18570 67 20 6c 65 6e 67 74 68 20 24 76 61 72 4e 61 6d  g length $varNam
18580 65 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  e] == 0} then {.
18590 0a 20 20 20 20 20 20 20 20 73 65 74 20 76 61 72  .        set var
185a0 4e 61 6d 65 20 73 61 76 65 64 45 6e 76 0d 0a 20  Name savedEnv.. 
185b0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
185c0 75 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65  upvar 1 $varName
185d0 20 73 61 76 65 64 45 6e 76 0d 0a 0d 0a 20 20 20   savedEnv....   
185e0 20 20 20 66 6f 72 65 61 63 68 20 6e 61 6d 65 20     foreach name 
185f0 24 6e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20  $names {..      
18600 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73    if {[info exis
18610 74 73 20 73 61 76 65 64 45 6e 76 28 24 6e 61 6d  ts savedEnv($nam
18620 65 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  e)]} then {..   
18630 20 20 20 20 20 20 20 73 65 74 20 3a 3a 65 6e 76         set ::env
18640 28 24 6e 61 6d 65 29 20 24 73 61 76 65 64 45 6e  ($name) $savedEn
18650 76 28 24 6e 61 6d 65 29 0d 0a 20 20 20 20 20 20  v($name)..      
18660 20 20 20 20 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d      unset -nocom
18670 70 6c 61 69 6e 20 73 61 76 65 64 45 6e 76 28 24  plain savedEnv($
18680 6e 61 6d 65 29 0d 0a 20 20 20 20 20 20 20 20 7d  name)..        }
18690 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
186a0 20 20 20 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70     unset -nocomp
186b0 6c 61 69 6e 20 3a 3a 65 6e 76 28 24 6e 61 6d 65  lain ::env($name
186c0 29 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  )..        }..  
186d0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
186e0 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
186f0 54 68 69 73 20 69 73 20 73 65 6c 66 2d 63 6c 65  This is self-cle
18700 61 6e 69 6e 67 2e 20 20 49 66 20 6e 6f 20 73 61  aning.  If no sa
18710 76 65 64 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20  ved environment 
18720 76 61 72 69 61 62 6c 65 73 20 6e 6f 77 0d 0a 20  variables now.. 
18730 20 20 20 20 20 23 20 20 20 20 20 20 20 65 78 69       #       exi
18740 73 74 2c 20 72 65 6d 6f 76 65 20 74 68 65 20 61  st, remove the a
18750 72 72 61 79 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  rray...      #..
18760 20 20 20 20 20 20 69 66 20 7b 5b 61 72 72 61 79        if {[array
18770 20 73 69 7a 65 20 73 61 76 65 64 45 6e 76 5d 20   size savedEnv] 
18780 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
18790 20 20 20 20 20 20 75 6e 73 65 74 20 2d 6e 6f 63        unset -noc
187a0 6f 6d 70 6c 61 69 6e 20 73 61 76 65 64 45 6e 76  omplain savedEnv
187b0 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
187c0 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 73 61  .....    proc sa
187d0 76 65 47 65 74 53 65 74 74 69 6e 67 56 61 6c 75  veGetSettingValu
187e0 65 45 6e 76 69 72 6f 6e 6d 65 6e 74 20 7b 7d 20  eEnvironment {} 
187f0 7b 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20 31  {..      upvar 1
18800 20 73 61 76 65 64 45 6e 76 20 73 61 76 65 64 45   savedEnv savedE
18810 6e 76 0d 0a 0d 0a 20 20 20 20 20 20 73 61 76 65  nv....      save
18820 45 6e 76 69 72 6f 6e 6d 65 6e 74 56 61 72 69 61  EnvironmentVaria
18830 62 6c 65 73 20 5b 6c 69 73 74 20 5c 0d 0a 20 20  bles [list \..  
18840 20 20 20 20 20 20 20 20 4e 6f 5f 45 78 70 61 6e          No_Expan
18850 64 20 4e 6f 5f 53 51 4c 69 74 65 47 65 74 53 65  d No_SQLiteGetSe
18860 74 74 69 6e 67 56 61 6c 75 65 20 4e 6f 5f 53 51  ttingValue No_SQ
18870 4c 69 74 65 58 6d 6c 43 6f 6e 66 69 67 46 69 6c  LiteXmlConfigFil
18880 65 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  e] \..          
18890 73 61 76 65 64 45 6e 76 0d 0a 20 20 20 20 7d 0d  savedEnv..    }.
188a0 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 72 65 73  ....    proc res
188b0 74 6f 72 65 47 65 74 53 65 74 74 69 6e 67 56 61  toreGetSettingVa
188c0 6c 75 65 45 6e 76 69 72 6f 6e 6d 65 6e 74 20 7b  lueEnvironment {
188d0 7d 20 7b 0d 0a 20 20 20 20 20 20 75 70 76 61 72  } {..      upvar
188e0 20 31 20 73 61 76 65 64 45 6e 76 20 73 61 76 65   1 savedEnv save
188f0 64 45 6e 76 0d 0a 0d 0a 20 20 20 20 20 20 72 65  dEnv....      re
18900 73 74 6f 72 65 45 6e 76 69 72 6f 6e 6d 65 6e 74  storeEnvironment
18910 56 61 72 69 61 62 6c 65 73 20 5b 6c 69 73 74 20  Variables [list 
18920 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 4e 6f 5f  \..          No_
18930 45 78 70 61 6e 64 20 4e 6f 5f 53 51 4c 69 74 65  Expand No_SQLite
18940 47 65 74 53 65 74 74 69 6e 67 56 61 6c 75 65 20  GetSettingValue 
18950 4e 6f 5f 53 51 4c 69 74 65 58 6d 6c 43 6f 6e 66  No_SQLiteXmlConf
18960 69 67 46 69 6c 65 5d 20 5c 0d 0a 20 20 20 20 20  igFile] \..     
18970 20 20 20 20 20 73 61 76 65 64 45 6e 76 0d 0a 20       savedEnv.. 
18980 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
18990 63 20 73 61 76 65 53 51 4c 69 74 65 43 6f 6e 6e  c saveSQLiteConn
189a0 65 63 74 69 6f 6e 45 6e 76 69 72 6f 6e 6d 65 6e  ectionEnvironmen
189b0 74 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 75 70  t {} {..      up
189c0 76 61 72 20 31 20 73 61 76 65 64 45 6e 76 20 73  var 1 savedEnv s
189d0 61 76 65 64 45 6e 76 0d 0a 0d 0a 20 20 20 20 20  avedEnv....     
189e0 20 73 61 76 65 45 6e 76 69 72 6f 6e 6d 65 6e 74   saveEnvironment
189f0 56 61 72 69 61 62 6c 65 73 20 5b 6c 69 73 74 20  Variables [list 
18a00 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 44 65 66  \..          Def
18a10 61 75 6c 74 46 6c 61 67 73 5f 53 51 4c 69 74 65  aultFlags_SQLite
18a20 43 6f 6e 6e 65 63 74 69 6f 6e 20 4e 6f 5f 53 51  Connection No_SQ
18a30 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 4e 65  LiteConnectionNe
18a40 77 50 61 72 73 65 72 5d 20 5c 0d 0a 20 20 20 20  wParser] \..    
18a50 20 20 20 20 20 20 73 61 76 65 64 45 6e 76 0d 0a        savedEnv..
18a60 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
18a70 6f 63 20 72 65 73 74 6f 72 65 53 51 4c 69 74 65  oc restoreSQLite
18a80 43 6f 6e 6e 65 63 74 69 6f 6e 45 6e 76 69 72 6f  ConnectionEnviro
18a90 6e 6d 65 6e 74 20 7b 7d 20 7b 0d 0a 20 20 20 20  nment {} {..    
18aa0 20 20 75 70 76 61 72 20 31 20 73 61 76 65 64 45    upvar 1 savedE
18ab0 6e 76 20 73 61 76 65 64 45 6e 76 0d 0a 0d 0a 20  nv savedEnv.... 
18ac0 20 20 20 20 20 72 65 73 74 6f 72 65 45 6e 76 69       restoreEnvi
18ad0 72 6f 6e 6d 65 6e 74 56 61 72 69 61 62 6c 65 73  ronmentVariables
18ae0 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20   [list \..      
18af0 20 20 20 20 44 65 66 61 75 6c 74 46 6c 61 67 73      DefaultFlags
18b00 5f 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f  _SQLiteConnectio
18b10 6e 20 4e 6f 5f 53 51 4c 69 74 65 43 6f 6e 6e 65  n No_SQLiteConne
18b20 63 74 69 6f 6e 4e 65 77 50 61 72 73 65 72 5d 20  ctionNewParser] 
18b30 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 73 61 76  \..          sav
18b40 65 64 45 6e 76 0d 0a 20 20 20 20 7d 0d 0a 0c 0d  edEnv..    }....
18b50 0a 20 20 20 20 70 72 6f 63 20 73 61 76 65 53 51  .    proc saveSQ
18b60 4c 69 74 65 43 6f 6e 76 65 72 74 45 6e 76 69 72  LiteConvertEnvir
18b70 6f 6e 6d 65 6e 74 20 7b 7d 20 7b 0d 0a 20 20 20  onment {} {..   
18b80 20 20 20 75 70 76 61 72 20 31 20 73 61 76 65 64     upvar 1 saved
18b90 45 6e 76 20 73 61 76 65 64 45 6e 76 0d 0a 0d 0a  Env savedEnv....
18ba0 20 20 20 20 20 20 73 61 76 65 45 6e 76 69 72 6f        saveEnviro
18bb0 6e 6d 65 6e 74 56 61 72 69 61 62 6c 65 73 20 5b  nmentVariables [
18bc0 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20  list \..        
18bd0 20 20 55 73 65 5f 53 51 4c 69 74 65 43 6f 6e 76    Use_SQLiteConv
18be0 65 72 74 5f 44 65 66 61 75 6c 74 44 62 54 79 70  ert_DefaultDbTyp
18bf0 65 20 55 73 65 5f 53 51 4c 69 74 65 43 6f 6e 76  e Use_SQLiteConv
18c00 65 72 74 5f 44 65 66 61 75 6c 74 54 79 70 65 4e  ert_DefaultTypeN
18c10 61 6d 65 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20  ame] \..        
18c20 20 20 73 61 76 65 64 45 6e 76 0d 0a 20 20 20 20    savedEnv..    
18c30 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 72  }.....    proc r
18c40 65 73 74 6f 72 65 53 51 4c 69 74 65 43 6f 6e 76  estoreSQLiteConv
18c50 65 72 74 45 6e 76 69 72 6f 6e 6d 65 6e 74 20 7b  ertEnvironment {
18c60 7d 20 7b 0d 0a 20 20 20 20 20 20 75 70 76 61 72  } {..      upvar
18c70 20 31 20 73 61 76 65 64 45 6e 76 20 73 61 76 65   1 savedEnv save
18c80 64 45 6e 76 0d 0a 0d 0a 20 20 20 20 20 20 72 65  dEnv....      re
18c90 73 74 6f 72 65 45 6e 76 69 72 6f 6e 6d 65 6e 74  storeEnvironment
18ca0 56 61 72 69 61 62 6c 65 73 20 5b 6c 69 73 74 20  Variables [list 
18cb0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 55 73 65  \..          Use
18cc0 5f 53 51 4c 69 74 65 43 6f 6e 76 65 72 74 5f 44  _SQLiteConvert_D
18cd0 65 66 61 75 6c 74 44 62 54 79 70 65 20 55 73 65  efaultDbType Use
18ce0 5f 53 51 4c 69 74 65 43 6f 6e 76 65 72 74 5f 44  _SQLiteConvert_D
18cf0 65 66 61 75 6c 74 54 79 70 65 4e 61 6d 65 5d 20  efaultTypeName] 
18d00 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 73 61 76  \..          sav
18d10 65 64 45 6e 76 0d 0a 20 20 20 20 7d 0d 0a 0c 0d  edEnv..    }....
18d20 0a 20 20 20 20 70 72 6f 63 20 73 65 74 75 70 44  .    proc setupD
18d30 62 49 6e 74 65 72 72 75 70 74 43 61 6c 6c 62 61  bInterruptCallba
18d40 63 6b 20 7b 20 63 68 61 6e 6e 65 6c 20 6c 6f 67  ck { channel log
18d50 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74 70 75 74   } {..      tput
18d60 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d  s $channel "----
18d70 20 73 65 74 74 69 6e 67 20 75 70 20 64 65 62 75   setting up debu
18d80 67 67 65 72 20 69 6e 74 65 72 72 75 70 74 20 63  gger interrupt c
18d90 61 6c 6c 62 61 63 6b 2e 2e 2e 20 22 0d 0a 0d 0a  allback... "....
18da0 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
18db0 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 61 76 65   {..        save
18dc0 45 6e 76 69 72 6f 6e 6d 65 6e 74 56 61 72 69 61  EnvironmentVaria
18dd0 62 6c 65 73 20 5b 6c 69 73 74 20 5c 0d 0a 20 20  bles [list \..  
18de0 20 20 20 20 20 20 20 20 20 20 71 75 69 65 74 46            quietF
18df0 69 6e 64 49 6e 74 65 72 70 72 65 74 65 72 54 65  indInterpreterTe
18e00 73 74 50 61 74 68 20 71 75 69 65 74 53 65 74 75  stPath quietSetu
18e10 70 49 6e 74 65 72 70 72 65 74 65 72 54 65 73 74  pInterpreterTest
18e20 50 61 74 68 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  Path]....       
18e30 20 74 72 79 20 7b 0d 0a 20 20 20 20 20 20 20 20   try {..        
18e40 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23    #..          #
18e50 20 4e 4f 54 45 3a 20 50 72 65 76 65 6e 74 20 74   NOTE: Prevent t
18e60 68 65 20 76 65 6e 64 6f 72 20 73 63 72 69 70 74  he vendor script
18e70 20 66 72 6f 6d 20 62 65 69 6e 67 20 6e 6f 69 73   from being nois
18e80 79 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 0d  y when creating.
18e90 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20  .          #    
18ea0 20 20 20 74 68 65 20 69 73 6f 6c 61 74 65 64 20     the isolated 
18eb0 69 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a 20 20  interpreter...  
18ec0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
18ed0 20 20 20 20 20 73 65 74 20 3a 3a 65 6e 76 28 71       set ::env(q
18ee0 75 69 65 74 46 69 6e 64 49 6e 74 65 72 70 72 65  uietFindInterpre
18ef0 74 65 72 54 65 73 74 50 61 74 68 29 20 31 0d 0a  terTestPath) 1..
18f00 20 20 20 20 20 20 20 20 20 20 73 65 74 20 3a 3a            set ::
18f10 65 6e 76 28 71 75 69 65 74 53 65 74 75 70 49 6e  env(quietSetupIn
18f20 74 65 72 70 72 65 74 65 72 54 65 73 74 50 61 74  terpreterTestPat
18f30 68 29 20 31 0d 0a 0d 0a 20 20 20 20 20 20 20 20  h) 1....        
18f40 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23    #..          #
18f50 20 4e 4f 54 45 3a 20 4d 61 6b 65 20 73 75 72 65   NOTE: Make sure
18f60 20 74 68 65 20 73 63 72 69 70 74 20 64 65 62 75   the script debu
18f70 67 67 65 72 20 61 6e 64 20 74 68 65 20 69 73 6f  gger and the iso
18f80 6c 61 74 65 64 20 69 6e 74 65 72 70 72 65 74 65  lated interprete
18f90 72 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20  r..          #  
18fa0 20 20 20 20 20 61 72 65 20 73 65 74 75 70 20 61       are setup a
18fb0 6e 64 20 72 65 61 64 79 20 66 6f 72 20 75 73 65  nd ready for use
18fc0 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
18fd0 20 20 20 20 20 20 20 20 20 20 64 65 62 75 67 20            debug 
18fe0 73 65 74 75 70 20 74 72 75 65 20 74 72 75 65 0d  setup true true.
18ff0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
19000 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
19010 3a 20 4c 6f 61 64 20 74 68 65 20 6e 65 63 65 73  : Load the neces
19020 73 61 72 79 20 70 61 63 6b 61 67 65 73 20 69 6e  sary packages in
19030 74 6f 20 74 68 65 20 69 73 6f 6c 61 74 65 64 20  to the isolated 
19040 69 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a 20 20  interpreter...  
19050 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
19060 20 20 20 20 20 64 65 62 75 67 20 65 76 61 6c 20       debug eval 
19070 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  {..            p
19080 61 63 6b 61 67 65 20 72 65 71 75 69 72 65 20 45  ackage require E
19090 61 67 6c 65 0d 0a 20 20 20 20 20 20 20 20 20 20  agle..          
190a0 20 20 70 61 63 6b 61 67 65 20 72 65 71 75 69 72    package requir
190b0 65 20 45 61 67 6c 65 2e 4c 69 62 72 61 72 79 0d  e Eagle.Library.
190c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 61 63  .            pac
190d0 6b 61 67 65 20 72 65 71 75 69 72 65 20 45 61 67  kage require Eag
190e0 6c 65 2e 54 65 73 74 0d 0a 20 20 20 20 20 20 20  le.Test..       
190f0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
19100 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23    #..          #
19110 20 4e 4f 54 45 3a 20 43 6f 70 79 20 74 68 65 20   NOTE: Copy the 
19120 6e 65 63 65 73 73 61 72 79 20 76 61 72 69 61 62  necessary variab
19130 6c 65 73 20 69 6e 74 6f 20 74 68 65 20 69 73 6f  les into the iso
19140 6c 61 74 65 64 20 69 6e 74 65 72 70 72 65 74 65  lated interprete
19150 72 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  r...          #.
19160 0a 20 20 20 20 20 20 20 20 20 20 64 65 62 75 67  .          debug
19170 20 69 6e 76 6f 6b 65 20 30 20 73 65 74 20 3a 3a   invoke 0 set ::
19180 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 63 68  test_channel $ch
19190 61 6e 6e 65 6c 3b 20 23 20 4e 4f 54 45 3a 20 46  annel; # NOTE: F
191a0 6f 72 20 5b 74 70 75 74 73 5d 2e 0d 0a 20 20 20  or [tputs]...   
191b0 20 20 20 20 20 20 20 64 65 62 75 67 20 69 6e 76         debug inv
191c0 6f 6b 65 20 30 20 73 65 74 20 3a 3a 74 65 73 74  oke 0 set ::test
191d0 5f 6c 6f 67 20 24 6c 6f 67 3b 20 23 20 4e 4f 54  _log $log; # NOT
191e0 45 3a 20 46 6f 72 20 5b 74 6c 6f 67 5d 2e 0d 0a  E: For [tlog]...
191f0 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
19200 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
19210 20 49 6e 73 74 61 6c 6c 20 74 68 65 20 63 61 6c   Install the cal
19220 6c 62 61 63 6b 20 73 63 72 69 70 74 20 74 6f 20  lback script to 
19230 62 65 20 65 76 61 6c 75 61 74 65 64 20 69 6e 20  be evaluated in 
19240 74 68 65 20 69 73 6f 6c 61 74 65 64 0d 0a 20 20  the isolated..  
19250 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
19260 69 6e 74 65 72 70 72 65 74 65 72 20 77 68 65 6e  interpreter when
19270 20 74 68 69 73 20 69 6e 74 65 72 70 72 65 74 65   this interprete
19280 72 20 69 73 20 69 6e 74 65 72 72 75 70 74 65 64  r is interrupted
19290 20 62 79 20 73 63 72 69 70 74 0d 0a 20 20 20 20   by script..    
192a0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 61        #       ca
192b0 6e 63 65 6c 6c 61 74 69 6f 6e 2c 20 65 74 63 2e  ncellation, etc.
192c0 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
192d0 20 20 20 20 20 20 20 20 20 64 65 62 75 67 20 63           debug c
192e0 61 6c 6c 62 61 63 6b 20 61 70 70 6c 79 20 7b 7b  allback apply {{
192f0 73 65 6e 64 65 72 20 65 7d 20 7b 0d 0a 20 20 20  sender e} {..   
19300 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
19310 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
19320 43 68 65 63 6b 20 69 66 20 74 68 69 73 20 64 65  Check if this de
19330 62 75 67 67 65 72 20 63 61 6c 6c 62 61 63 6b 20  bugger callback 
19340 69 73 20 6f 6e 65 20 74 68 61 74 20 77 65 20 63  is one that we c
19350 61 72 65 20 61 62 6f 75 74 2e 0d 0a 20 20 20 20  are about...    
19360 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
19370 20 20 20 20 20 20 20 73 65 74 20 69 6e 74 65 72         set inter
19380 72 75 70 74 54 79 70 65 73 20 5b 73 70 6c 69 74  ruptTypes [split
19390 20 5b 24 65 20 49 6e 74 65 72 72 75 70 74 54 79   [$e InterruptTy
193a0 70 65 5d 20 22 2c 20 22 5d 0d 0a 0d 0a 20 20 20  pe] ", "]....   
193b0 20 20 20 20 20 20 20 20 20 69 66 20 7b 22 43 61           if {"Ca
193c0 6e 63 65 6c 65 64 22 20 69 6e 20 24 69 6e 74 65  nceled" in $inte
193d0 72 72 75 70 74 54 79 70 65 73 20 7c 7c 20 5c 0d  rruptTypes || \.
193e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
193f0 20 22 55 6e 77 6f 75 6e 64 22 20 69 6e 20 24 69   "Unwound" in $i
19400 6e 74 65 72 72 75 70 74 54 79 70 65 73 7d 20 74  nterruptTypes} t
19410 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
19420 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
19430 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4d 61        # NOTE: Ma
19440 6b 65 20 73 75 72 65 20 74 68 65 20 5b 6f 62 6a  ke sure the [obj
19450 65 63 74 5d 20 63 6f 6d 6d 61 6e 64 20 69 73 20  ect] command is 
19460 61 76 61 69 6c 61 62 6c 65 2e 20 20 53 69 6e 63  available.  Sinc
19470 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e..             
19480 20 23 20 20 20 20 20 20 20 74 68 69 73 20 69 73   #       this is
19490 20 61 6e 20 69 73 6f 6c 61 74 65 64 20 69 6e 74   an isolated int
194a0 65 72 70 72 65 74 65 72 2c 20 63 68 65 63 6b 20  erpreter, check 
194b0 66 6f 72 20 69 74 20 74 68 65 20 68 61 72 64 0d  for it the hard.
194c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
194d0 20 20 20 20 20 20 20 77 61 79 2e 0d 0a 20 20 20         way...   
194e0 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
194f0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
19500 5b 6c 6c 65 6e 67 74 68 20 5b 69 6e 66 6f 20 63  [llength [info c
19510 6f 6d 6d 61 6e 64 73 20 6f 62 6a 65 63 74 5d 5d  ommands object]]
19520 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
19530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
19540 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19550 20 23 20 4e 4f 54 45 3a 20 49 74 65 72 61 74 65   # NOTE: Iterate
19560 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 64 61 74   through all dat
19570 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
19580 73 20 6b 6e 6f 77 6e 20 74 6f 20 74 68 65 0d 0a  s known to the..
19590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
195a0 23 20 20 20 20 20 20 20 70 61 72 65 6e 74 20 69  #       parent i
195b0 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a 20 20 20  nterpreter...   
195c0 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a               #..
195d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
195e0 6f 62 6a 65 63 74 20 66 6f 72 65 61 63 68 20 2d  object foreach -
195f0 61 6c 69 61 73 20 70 61 69 72 20 5b 6f 62 6a 65  alias pair [obje
19600 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73  ct invoke -flags
19610 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20   +NonPublic \.. 
19620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19630 20 20 20 24 65 20 49 6e 74 65 72 70 72 65 74 65     $e Interprete
19640 72 2e 63 6f 6e 6e 65 63 74 69 6f 6e 73 5d 20 7b  r.connections] {
19650 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
19660 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
19670 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
19680 20 41 74 74 65 6d 70 74 20 74 6f 20 63 61 6e 63   Attempt to canc
19690 65 6c 20 61 6e 79 20 53 51 4c 20 71 75 65 72 69  el any SQL queri
196a0 65 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20 6f  es in progress o
196b0 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n..             
196c0 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 69       #       thi
196d0 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  s database conne
196e0 63 74 69 6f 6e 2e 0d 0a 20 20 20 20 20 20 20 20  ction...        
196f0 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
19700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
19710 66 20 7b 5b 63 61 74 63 68 20 7b 24 70 61 69 72  f {[catch {$pair
19720 20 56 61 6c 75 65 2e 43 61 6e 63 65 6c 7d 20 65   Value.Cancel} e
19730 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  rror]} then {.. 
19740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19750 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
19760 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
19770 41 72 67 73 20 5c 6e 20 5c 0d 0a 20 20 20 20 20  Args \n \..     
19780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19790 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47     "==== WARNING
197a0 3a 20 66 61 69 6c 65 64 20 74 6f 20 63 61 6e 63  : failed to canc
197b0 65 6c 20 71 75 65 72 79 20 66 6f 72 20 22 20 5c  el query for " \
197c0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
197d0 20 20 20 20 20 20 20 20 20 20 22 63 6f 6e 6e 65            "conne
197e0 63 74 69 6f 6e 20 5c 22 22 20 5b 24 70 61 69 72  ction \"" [$pair
197f0 20 4b 65 79 5d 20 22 5c 22 2c 20 65 72 72 6f 72   Key] "\", error
19800 3a 20 22 20 5c 6e 5c 74 20 5c 0d 0a 20 20 20 20  : " \n\t \..    
19810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19820 20 20 20 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a      $error \n]..
19830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19840 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
19850 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
19860 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
19870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19880 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
19890 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
198a0 73 20 5c 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20  s \n \..        
198b0 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d              "===
198c0 3d 20 57 41 52 4e 49 4e 47 3a 20 63 61 6e 6e 6f  = WARNING: canno
198d0 74 20 63 61 6e 63 65 6c 20 61 6e 79 20 71 75 65  t cancel any que
198e0 72 69 65 73 3a 20 22 20 5c 0d 0a 20 20 20 20 20  ries: " \..     
198f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
19900 74 68 65 20 5c 22 6f 62 6a 65 63 74 5c 22 20 63  the \"object\" c
19910 6f 6d 6d 61 6e 64 20 69 73 20 6e 6f 74 20 61 76  ommand is not av
19920 61 69 6c 61 62 6c 65 5c 6e 22 5d 0d 0a 20 20 20  ailable\n"]..   
19930 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
19940 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
19950 20 20 20 20 20 20 20 7d 7d 0d 0a 20 20 20 20 20         }}..     
19960 20 20 20 7d 20 66 69 6e 61 6c 6c 79 20 7b 0d 0a     } finally {..
19970 20 20 20 20 20 20 20 20 20 20 72 65 73 74 6f 72            restor
19980 65 45 6e 76 69 72 6f 6e 6d 65 6e 74 56 61 72 69  eEnvironmentVari
19990 61 62 6c 65 73 20 5b 6c 69 73 74 20 5c 0d 0a 20  ables [list \.. 
199a0 20 20 20 20 20 20 20 20 20 20 20 20 20 71 75 69               qui
199b0 65 74 46 69 6e 64 49 6e 74 65 72 70 72 65 74 65  etFindInterprete
199c0 72 54 65 73 74 50 61 74 68 20 71 75 69 65 74 53  rTestPath quietS
199d0 65 74 75 70 49 6e 74 65 72 70 72 65 74 65 72 54  etupInterpreterT
199e0 65 73 74 50 61 74 68 5d 0d 0a 20 20 20 20 20 20  estPath]..      
199f0 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 72 72    }..      } err
19a00 6f 72 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  or] == 0} then {
19a10 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e  ..        addCon
19a20 73 74 72 61 69 6e 74 20 69 6e 74 65 72 72 75 70  straint interrup
19a30 74 43 61 6c 6c 62 61 63 6b 2e 73 71 6c 69 74 65  tCallback.sqlite
19a40 33 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 70 75  3....        tpu
19a50 74 73 20 24 63 68 61 6e 6e 65 6c 20 79 65 73 5c  ts $channel yes\
19a60 6e 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  n..      } else 
19a70 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  {..        tputs
19a80 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
19a90 64 41 72 67 73 20 22 6e 6f 2c 20 65 72 72 6f 72  dArgs "no, error
19aa0 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20  : " \n\t $error 
19ab0 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  \n]..      }..  
19ac0 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
19ad0 20 63 6c 65 61 6e 75 70 46 69 6c 65 20 7b 20 66   cleanupFile { f
19ae0 69 6c 65 4e 61 6d 65 20 7b 63 6f 6c 6c 65 63 74  ileName {collect
19af0 20 74 72 75 65 7d 20 7b 66 6f 72 63 65 20 66 61   true} {force fa
19b00 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20  lse} } {..      
19b10 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
19b20 20 41 74 74 65 6d 70 74 20 74 6f 20 66 6f 72 63   Attempt to forc
19b30 65 20 61 6c 6c 20 70 65 6e 64 69 6e 67 20 22 67  e all pending "g
19b40 61 72 62 61 67 65 22 20 6f 62 6a 65 63 74 73 20  arbage" objects 
19b50 74 6f 20 62 65 20 63 6f 6c 6c 65 63 74 65 64 2c  to be collected,
19b60 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
19b70 69 6e 63 6c 75 64 69 6e 67 20 53 51 4c 69 74 65  including SQLite
19b80 20 73 74 61 74 65 6d 65 6e 74 73 20 61 6e 64 20   statements and 
19b90 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 3b 20  backup objects; 
19ba0 74 68 69 73 20 73 68 6f 75 6c 64 20 61 6c 6c 6f  this should allo
19bb0 77 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  w..      #      
19bc0 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
19bd0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
19be0 20 62 65 20 64 65 6c 65 74 65 64 2e 0d 0a 20 20   be deleted...  
19bf0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
19c00 7b 24 63 6f 6c 6c 65 63 74 7d 20 74 68 65 6e 20  {$collect} then 
19c10 7b 0d 0a 20 20 20 20 20 20 20 20 63 6f 6c 6c 65  {..        colle
19c20 63 74 47 61 72 62 61 67 65 20 24 3a 3a 74 65 73  ctGarbage $::tes
19c30 74 5f 63 68 61 6e 6e 65 6c 0d 0a 20 20 20 20 20  t_channel..     
19c40 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   }....      #.. 
19c50 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65       # NOTE: Che
19c60 63 6b 20 69 66 20 74 68 65 20 66 69 6c 65 20 73  ck if the file s
19c70 74 69 6c 6c 20 65 78 69 73 74 73 2e 0d 0a 20 20  till exists...  
19c80 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
19c90 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 66  {[file exists $f
19ca0 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b  ileName]} then {
19cb0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
19cc0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69       # NOTE: Ski
19cd0 70 20 64 65 6c 65 74 69 6e 67 20 74 65 73 74 20  p deleting test 
19ce0 66 69 6c 65 73 20 69 66 20 73 6f 6d 65 62 6f 64  files if somebod
19cf0 79 20 73 65 74 73 20 74 68 65 20 67 6c 6f 62 61  y sets the globa
19d00 6c 20 76 61 72 69 61 62 6c 65 0d 0a 20 20 20 20  l variable..    
19d10 20 20 20 20 23 20 20 20 20 20 20 20 74 6f 20 70      #       to p
19d20 72 65 76 65 6e 74 20 69 74 2e 0d 0a 20 20 20 20  revent it...    
19d30 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69      #..        i
19d40 66 20 7b 24 66 6f 72 63 65 20 7c 7c 20 21 5b 69  f {$force || ![i
19d50 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
19d60 63 6c 65 61 6e 75 70 46 69 6c 65 29 5d 7d 20 74  cleanupFile)]} t
19d70 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
19d80 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
19d90 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f  NOTE: Attempt to
19da0 20 64 65 6c 65 74 65 20 74 68 65 20 74 65 73 74   delete the test
19db0 20 66 69 6c 65 20 6e 6f 77 2e 0d 0a 20 20 20 20   file now...    
19dc0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
19dd0 20 20 20 69 66 20 7b 5b 73 65 74 20 63 6f 64 65     if {[set code
19de0 20 5b 63 61 74 63 68 20 7b 66 69 6c 65 20 64 65   [catch {file de
19df0 6c 65 74 65 20 24 66 69 6c 65 4e 61 6d 65 7d 20  lete $fileName} 
19e00 65 72 72 6f 72 5d 5d 7d 20 74 68 65 6e 20 7b 0d  error]]} then {.
19e10 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a  .            #..
19e20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f              # NO
19e30 54 45 3a 20 57 65 20 73 6f 6d 65 68 6f 77 20 66  TE: We somehow f
19e40 61 69 6c 65 64 20 74 6f 20 64 65 6c 65 74 65 20  ailed to delete 
19e50 74 68 65 20 66 69 6c 65 2c 20 72 65 70 6f 72 74  the file, report
19e60 20 77 68 79 2e 0d 0a 20 20 20 20 20 20 20 20 20   why...         
19e70 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
19e80 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
19e90 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
19ea0 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
19eb0 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52         "==== WAR
19ec0 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20  NING: failed to 
19ed0 64 65 6c 65 74 65 20 74 65 73 74 20 66 69 6c 65  delete test file
19ee0 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c   \"" $fileName \
19ef0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
19f00 20 20 22 5c 22 20 64 75 72 69 6e 67 20 63 6c 65    "\" during cle
19f10 61 6e 75 70 2c 20 65 72 72 6f 72 3a 20 22 20 5c  anup, error: " \
19f20 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a  n\t $error \n]..
19f30 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
19f40 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
19f50 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
19f60 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 68        # NOTE: Sh
19f70 6f 77 20 74 68 61 74 20 77 65 20 73 6b 69 70 70  ow that we skipp
19f80 65 64 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20  ed deleting the 
19f90 66 69 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 20  file...         
19fa0 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   #..          se
19fb0 74 20 63 6f 64 65 20 30 0d 0a 0d 0a 20 20 20 20  t code 0....    
19fc0 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
19fd0 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
19fe0 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
19ff0 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57           "==== W
1a000 41 52 4e 49 4e 47 3a 20 73 6b 69 70 70 65 64 20  ARNING: skipped 
1a010 64 65 6c 65 74 69 6e 67 20 74 65 73 74 20 66 69  deleting test fi
1a020 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65  le \"" $fileName
1a030 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1a040 20 20 22 5c 22 20 64 75 72 69 6e 67 20 63 6c 65    "\" during cle
1a050 61 6e 75 70 5c 6e 22 5d 0d 0a 20 20 20 20 20 20  anup\n"]..      
1a060 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73    }..      } els
1a070 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  e {..        #..
1a080 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
1a090 54 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  The file does no
1a0a0 74 20 65 78 69 73 74 2c 20 73 75 63 63 65 73 73  t exist, success
1a0b0 21 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  !..        #..  
1a0c0 20 20 20 20 20 20 73 65 74 20 63 6f 64 65 20 30        set code 0
1a0d0 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
1a0e0 20 20 20 72 65 74 75 72 6e 20 24 63 6f 64 65 0d     return $code.
1a0f0 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
1a100 72 6f 63 20 63 6c 65 61 6e 75 70 4d 65 6d 6f 72  roc cleanupMemor
1a110 79 20 7b 20 76 61 72 4e 61 6d 65 20 7b 71 75 69  y { varName {qui
1a120 65 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20  et false} } {.. 
1a130 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65 53 51       if {[haveSQ
1a140 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e  LiteObjectComman
1a150 64 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  d] && \..       
1a160 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74     [string lengt
1a170 68 20 24 76 61 72 4e 61 6d 65 5d 20 3e 20 30 7d  h $varName] > 0}
1a180 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1a190 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
1a1a0 54 45 3a 20 52 65 66 65 72 20 74 6f 20 74 68 65  TE: Refer to the
1a1b0 20 73 70 65 63 69 66 69 65 64 20 76 61 72 69 61   specified varia
1a1c0 62 6c 65 20 28 65 2e 67 2e 20 22 63 6f 6e 6e 65  ble (e.g. "conne
1a1d0 63 74 69 6f 6e 22 29 20 69 6e 20 74 68 65 0d 0a  ction") in the..
1a1e0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
1a1f0 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72 20 63  context of our c
1a200 61 6c 6c 65 72 2e 20 20 54 68 65 20 6f 70 61 71  aller.  The opaq
1a210 75 65 20 6f 62 6a 65 63 74 20 68 61 6e 64 6c 65  ue object handle
1a220 20 66 6f 72 20 61 6e 0d 0a 20 20 20 20 20 20 20   for an..       
1a230 20 23 20 20 20 20 20 20 20 41 44 4f 2e 4e 45 54   #       ADO.NET
1a240 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 72 65 76   connection prev
1a250 69 6f 75 73 6c 79 20 72 65 74 75 72 6e 65 64 20  iously returned 
1a260 62 79 20 5b 67 65 74 44 62 43 6f 6e 6e 65 63 74  by [getDbConnect
1a270 69 6f 6e 5d 0d 0a 20 20 20 20 20 20 20 20 23 20  ion]..        # 
1a280 20 20 20 20 20 20 73 68 6f 75 6c 64 20 62 65 20        should be 
1a290 73 74 6f 72 65 64 20 74 68 65 72 65 2e 0d 0a 20  stored there... 
1a2a0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1a2b0 20 20 75 70 76 61 72 20 31 20 24 76 61 72 4e 61    upvar 1 $varNa
1a2c0 6d 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0d 0a 0d  me connection...
1a2d0 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61  .        if {[ca
1a2e0 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
1a2f0 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 24   object invoke $
1a300 63 6f 6e 6e 65 63 74 69 6f 6e 20 52 65 6c 65 61  connection Relea
1a310 73 65 4d 65 6d 6f 72 79 0d 0a 20 20 20 20 20 20  seMemory..      
1a320 20 20 7d 20 72 65 73 75 6c 74 5d 7d 20 74 68 65    } result]} the
1a330 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69  n {..          i
1a340 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
1a350 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1a360 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
1a370 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
1a380 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
1a390 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49       "==== WARNI
1a3a0 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 72 65  NG: failed to re
1a3b0 6c 65 61 73 65 20 64 61 74 61 62 61 73 65 20 6d  lease database m
1a3c0 65 6d 6f 72 79 2c 20 65 72 72 6f 72 3a 20 22 20  emory, error: " 
1a3d0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1a3e0 20 20 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20     \n\t $result 
1a3f0 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  \n]..          }
1a400 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
1a410 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66     }....      if
1a420 20 7b 5b 6c 6c 65 6e 67 74 68 20 5b 69 6e 66 6f   {[llength [info
1a430 20 63 6f 6d 6d 61 6e 64 73 20 64 65 62 75 67 5d   commands debug]
1a440 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
1a450 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
1a460 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 75  h {..          u
1a470 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74 20 64  plevel 1 [list d
1a480 65 62 75 67 20 70 75 72 67 65 5d 0d 0a 20 20 20  ebug purge]..   
1a490 20 20 20 20 20 7d 20 72 65 73 75 6c 74 5d 7d 20       } result]} 
1a4a0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1a4b0 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
1a4c0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1a4d0 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
1a4e0 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
1a4f0 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
1a500 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41          "==== WA
1a510 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f  RNING: failed to
1a520 20 70 75 72 67 65 20 63 61 6c 6c 20 66 72 61 6d   purge call fram
1a530 65 2c 20 65 72 72 6f 72 3a 20 22 20 5c 0d 0a 20  e, error: " \.. 
1a540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
1a550 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d  n\t $result \n].
1a560 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
1a570 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
1a580 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d     if {[catch {.
1a590 0a 20 20 20 20 20 20 20 20 20 20 75 70 6c 65 76  .          uplev
1a5a0 65 6c 20 31 20 5b 6c 69 73 74 20 64 65 62 75 67  el 1 [list debug
1a5b0 20 63 6c 65 61 6e 75 70 5d 0d 0a 20 20 20 20 20   cleanup]..     
1a5c0 20 20 20 7d 20 72 65 73 75 6c 74 5d 7d 20 74 68     } result]} th
1a5d0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
1a5e0 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
1a5f0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
1a600 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
1a610 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
1a620 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
1a630 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e        "==== WARN
1a640 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 63  ING: failed to c
1a650 6c 65 61 6e 75 70 20 69 6e 74 65 72 70 72 65 74  leanup interpret
1a660 65 72 2c 20 65 72 72 6f 72 3a 20 22 20 5c 0d 0a  er, error: " \..
1a670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a680 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d  \n\t $result \n]
1a690 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
1a6a0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
1a6b0 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
1a6c0 0d 0a 20 20 20 20 20 20 20 20 20 20 75 70 6c 65  ..          uple
1a6d0 76 65 6c 20 31 20 5b 6c 69 73 74 20 64 65 62 75  vel 1 [list debu
1a6e0 67 20 63 6f 6c 6c 65 63 74 5d 0d 0a 20 20 20 20  g collect]..    
1a6f0 20 20 20 20 7d 20 72 65 73 75 6c 74 5d 7d 20 74      } result]} t
1a700 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1a710 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
1a720 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
1a730 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
1a740 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
1a750 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
1a760 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52         "==== WAR
1a770 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20  NING: failed to 
1a780 63 6f 6c 6c 65 63 74 20 67 61 72 62 61 67 65 2c  collect garbage,
1a790 20 65 72 72 6f 72 3a 20 22 20 5c 0d 0a 20 20 20   error: " \..   
1a7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 6e 5c               \n\
1a7b0 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20  t $result \n].. 
1a7c0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
1a7d0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
1a7e0 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
1a7f0 6f 63 20 73 65 74 75 70 4d 65 6d 6f 72 79 43 6f  oc setupMemoryCo
1a800 75 6e 74 65 72 73 20 7b 20 76 61 72 4e 61 6d 65  unters { varName
1a810 20 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b   } {..      if {
1a820 5b 68 61 76 65 53 51 4c 69 74 65 4f 62 6a 65 63  [haveSQLiteObjec
1a830 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65 6e 20  tCommand]} then 
1a840 7b 0d 0a 20 20 20 20 20 20 20 20 75 70 76 61 72  {..        upvar
1a850 20 31 20 24 76 61 72 4e 61 6d 65 20 63 6f 75 6e   1 $varName coun
1a860 74 65 72 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73  ter....        s
1a870 65 74 20 63 6f 75 6e 74 65 72 28 31 29 20 5b 6f  et counter(1) [o
1a880 62 6a 65 63 74 20 63 72 65 61 74 65 20 2d 61 6c  bject create -al
1a890 69 61 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ias \..         
1a8a0 20 20 20 53 79 73 74 65 6d 2e 44 69 61 67 6e 6f     System.Diagno
1a8b0 73 74 69 63 73 2e 50 65 72 66 6f 72 6d 61 6e 63  stics.Performanc
1a8c0 65 43 6f 75 6e 74 65 72 20 50 72 6f 63 65 73 73  eCounter Process
1a8d0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1a8e0 22 57 6f 72 6b 69 6e 67 20 53 65 74 22 20 5b 66  "Working Set" [f
1a8f0 69 6c 65 20 72 6f 6f 74 6e 61 6d 65 20 5b 66 69  ile rootname [fi
1a900 6c 65 20 74 61 69 6c 20 24 3a 3a 62 69 6e 5f 66  le tail $::bin_f
1a910 69 6c 65 5d 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20  ile]]]....      
1a920 20 20 73 65 74 20 63 6f 75 6e 74 65 72 28 32 29    set counter(2)
1a930 20 5b 6f 62 6a 65 63 74 20 63 72 65 61 74 65 20   [object create 
1a940 2d 61 6c 69 61 73 20 5c 0d 0a 20 20 20 20 20 20  -alias \..      
1a950 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 69 61        System.Dia
1a960 67 6e 6f 73 74 69 63 73 2e 50 65 72 66 6f 72 6d  gnostics.Perform
1a970 61 6e 63 65 43 6f 75 6e 74 65 72 20 50 72 6f 63  anceCounter Proc
1a980 65 73 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ess \..         
1a990 20 20 20 22 57 6f 72 6b 69 6e 67 20 53 65 74 20     "Working Set 
1a9a0 50 65 61 6b 22 20 5b 66 69 6c 65 20 72 6f 6f 74  Peak" [file root
1a9b0 6e 61 6d 65 20 5b 66 69 6c 65 20 74 61 69 6c 20  name [file tail 
1a9c0 24 3a 3a 62 69 6e 5f 66 69 6c 65 5d 5d 5d 0d 0a  $::bin_file]]]..
1a9d0 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 63 6f  ..        set co
1a9e0 75 6e 74 65 72 28 33 29 20 5b 6f 62 6a 65 63 74  unter(3) [object
1a9f0 20 63 72 65 61 74 65 20 2d 61 6c 69 61 73 20 5c   create -alias \
1aa00 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 79  ..            Sy
1aa10 73 74 65 6d 2e 44 69 61 67 6e 6f 73 74 69 63 73  stem.Diagnostics
1aa20 2e 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e  .PerformanceCoun
1aa30 74 65 72 20 50 72 6f 63 65 73 73 20 5c 0d 0a 20  ter Process \.. 
1aa40 20 20 20 20 20 20 20 20 20 20 20 22 50 72 69 76             "Priv
1aa50 61 74 65 20 42 79 74 65 73 22 20 5b 66 69 6c 65  ate Bytes" [file
1aa60 20 72 6f 6f 74 6e 61 6d 65 20 5b 66 69 6c 65 20   rootname [file 
1aa70 74 61 69 6c 20 24 3a 3a 62 69 6e 5f 66 69 6c 65  tail $::bin_file
1aa80 5d 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  ]]]..      }....
1aa90 20 20 20 20 20 20 72 65 74 75 72 6e 20 22 22 0d        return "".
1aaa0 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
1aab0 72 6f 63 20 72 65 70 6f 72 74 4d 65 6d 6f 72 79  roc reportMemory
1aac0 43 6f 75 6e 74 65 72 73 20 7b 20 63 68 61 6e 6e  Counters { chann
1aad0 65 6c 20 76 61 72 4e 61 6d 65 20 70 72 65 66 69  el varName prefi
1aae0 78 20 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66 20  x } {..      if 
1aaf0 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f 62 6a 65  {[haveSQLiteObje
1ab00 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65 6e  ctCommand]} then
1ab10 20 7b 0d 0a 20 20 20 20 20 20 20 20 75 70 76 61   {..        upva
1ab20 72 20 31 20 24 76 61 72 4e 61 6d 65 20 63 6f 75  r 1 $varName cou
1ab30 6e 74 65 72 0d 0a 0d 0a 20 20 20 20 20 20 20 20  nter....        
1ab40 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
1ab50 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
1ab60 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
1ab70 22 20 24 70 72 65 66 69 78 20 22 20 63 6f 75 6e  " $prefix " coun
1ab80 74 65 72 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20  ter \"" \..     
1ab90 20 20 20 20 20 20 20 5b 6f 62 6a 65 63 74 20 69         [object i
1aba0 6e 76 6f 6b 65 20 24 63 6f 75 6e 74 65 72 28 31  nvoke $counter(1
1abb0 29 20 43 6f 75 6e 74 65 72 4e 61 6d 65 5d 20 22  ) CounterName] "
1abc0 5c 22 20 76 61 6c 75 65 20 69 73 20 22 20 5c 0d  \" value is " \.
1abd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 6f 62  .            [ob
1abe0 6a 65 63 74 20 69 6e 76 6f 6b 65 20 24 63 6f 75  ject invoke $cou
1abf0 6e 74 65 72 28 31 29 20 52 61 77 56 61 6c 75 65  nter(1) RawValue
1ac00 5d 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  ] \n]....       
1ac10 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
1ac20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
1ac30 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
1ac40 20 22 20 24 70 72 65 66 69 78 20 22 20 63 6f 75   " $prefix " cou
1ac50 6e 74 65 72 20 5c 22 22 20 5c 0d 0a 20 20 20 20  nter \"" \..    
1ac60 20 20 20 20 20 20 20 20 5b 6f 62 6a 65 63 74 20          [object 
1ac70 69 6e 76 6f 6b 65 20 24 63 6f 75 6e 74 65 72 28  invoke $counter(
1ac80 32 29 20 43 6f 75 6e 74 65 72 4e 61 6d 65 5d 20  2) CounterName] 
1ac90 22 5c 22 20 76 61 6c 75 65 20 69 73 20 22 20 5c  "\" value is " \
1aca0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 6f  ..            [o
1acb0 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 24 63 6f  bject invoke $co
1acc0 75 6e 74 65 72 28 32 29 20 52 61 77 56 61 6c 75  unter(2) RawValu
1acd0 65 5d 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20  e] \n]....      
1ace0 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
1acf0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
1ad00 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
1ad10 2d 20 22 20 24 70 72 65 66 69 78 20 22 20 63 6f  - " $prefix " co
1ad20 75 6e 74 65 72 20 5c 22 22 20 5c 0d 0a 20 20 20  unter \"" \..   
1ad30 20 20 20 20 20 20 20 20 20 5b 6f 62 6a 65 63 74           [object
1ad40 20 69 6e 76 6f 6b 65 20 24 63 6f 75 6e 74 65 72   invoke $counter
1ad50 28 33 29 20 43 6f 75 6e 74 65 72 4e 61 6d 65 5d  (3) CounterName]
1ad60 20 22 5c 22 20 76 61 6c 75 65 20 69 73 20 22 20   "\" value is " 
1ad70 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
1ad80 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 24 63  object invoke $c
1ad90 6f 75 6e 74 65 72 28 33 29 20 52 61 77 56 61 6c  ounter(3) RawVal
1ada0 75 65 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d  ue] \n]..      }
1adb0 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
1adc0 70 72 6f 63 20 63 6f 6c 6c 65 63 74 47 61 72 62  proc collectGarb
1add0 61 67 65 20 7b 20 63 68 61 6e 6e 65 6c 20 7b 6d  age { channel {m
1ade0 69 6c 6c 69 73 65 63 6f 6e 64 73 20 31 30 30 30  illiseconds 1000
1adf0 7d 20 7b 71 75 69 65 74 20 74 72 75 65 7d 20 7d  } {quiet true} }
1ae00 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 68   {..      if {[h
1ae10 61 76 65 53 51 4c 69 74 65 4f 62 6a 65 63 74 43  aveSQLiteObjectC
1ae20 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65 6e 20 7b 0d  ommand]} then {.
1ae30 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61  .        if {[ca
1ae40 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
1ae50 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 47   object invoke G
1ae60 43 20 47 65 74 54 6f 74 61 6c 4d 65 6d 6f 72 79  C GetTotalMemory
1ae70 20 66 61 6c 73 65 0d 0a 20 20 20 20 20 20 20 20   false..        
1ae80 7d 20 72 65 73 75 6c 74 5d 20 3d 3d 20 30 7d 20  } result] == 0} 
1ae90 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1aea0 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
1aeb0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1aec0 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
1aed0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
1aee0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1aef0 20 22 2d 2d 2d 2d 20 6d 65 6d 6f 72 79 20 69 6e   "---- memory in
1af00 20 75 73 65 20 62 79 20 74 68 65 20 43 4c 52 20   use by the CLR 
1af10 62 65 66 6f 72 65 20 63 6f 6c 6c 65 63 74 69 6f  before collectio
1af20 6e 2e 2e 2e 20 22 20 5c 0d 0a 20 20 20 20 20 20  n... " \..      
1af30 20 20 20 20 20 20 20 20 20 20 24 72 65 73 75 6c            $resul
1af40 74 20 22 20 62 79 74 65 73 5c 6e 22 5d 0d 0a 20  t " bytes\n"].. 
1af50 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
1af60 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
1af70 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
1af80 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
1af90 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
1afa0 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e      "==== WARNIN
1afb0 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 67 65 74  G: failed to get
1afc0 20 43 4c 52 20 6d 65 6d 6f 72 79 20 75 73 61 67   CLR memory usag
1afd0 65 2c 20 65 72 72 6f 72 3a 20 22 20 5c 0d 0a 20  e, error: " \.. 
1afe0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 6e 5c               \n\
1aff0 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20  t $result \n].. 
1b000 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1b010 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 23 23 23 23  }....      #####
1b020 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1b030 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1b040 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1b050 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1b060 23 23 23 23 0d 0a 0d 0a 20 20 20 20 20 20 23 0d  ####....      #.
1b070 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52  .      # NOTE: R
1b080 65 70 65 61 74 65 64 6c 79 20 61 74 74 65 6d 70  epeatedly attemp
1b090 74 20 74 6f 20 63 6f 6c 6c 65 63 74 20 67 61 72  t to collect gar
1b0a0 62 61 67 65 20 75 6e 74 69 6c 20 74 68 65 20 61  bage until the a
1b0b0 6c 6c 6f 74 74 65 64 20 6e 75 6d 62 65 72 0d 0a  llotted number..
1b0c0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6f 66        #       of
1b0d0 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 68 61   milliseconds ha
1b0e0 73 20 65 6c 61 70 73 65 64 2e 20 20 41 6c 77 61  s elapsed.  Alwa
1b0f0 79 73 20 61 74 74 65 6d 70 74 20 74 6f 20 63 6f  ys attempt to co
1b100 6c 6c 65 63 74 20 67 61 72 62 61 67 65 0d 0a 20  llect garbage.. 
1b110 20 20 20 20 20 23 20 20 20 20 20 20 20 61 74 20       #       at 
1b120 6c 65 61 73 74 20 6f 6e 63 65 2e 0d 0a 20 20 20  least once...   
1b130 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
1b140 5b 68 61 76 65 53 51 4c 69 74 65 4f 62 6a 65 63  [haveSQLiteObjec
1b150 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65 6e 20  tCommand]} then 
1b160 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 73  {..        set s
1b170 74 61 72 74 20 5b 63 6c 6f 63 6b 20 73 65 63 6f  tart [clock seco
1b180 6e 64 73 5d 0d 0a 20 20 20 20 20 20 20 20 73 65  nds]..        se
1b190 74 20 73 74 6f 70 20 5b 65 78 70 72 20 7b 24 73  t stop [expr {$s
1b1a0 74 61 72 74 20 2b 20 28 24 6d 69 6c 6c 69 73 65  tart + ($millise
1b1b0 63 6f 6e 64 73 20 2f 20 31 30 30 30 29 7d 5d 0d  conds / 1000)}].
1b1c0 0a 0d 0a 20 20 20 20 20 20 20 20 64 6f 20 7b 0d  ...        do {.
1b1d0 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
1b1e0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
1b1f0 41 74 74 65 6d 70 74 20 74 6f 20 66 6f 72 63 65  Attempt to force
1b200 20 61 20 66 75 6c 6c 20 67 61 72 62 61 67 65 20   a full garbage 
1b210 63 6f 6c 6c 65 63 74 69 6f 6e 20 6e 6f 77 2e 20  collection now. 
1b220 20 52 65 70 6f 72 74 20 61 6e 79 0d 0a 20 20 20   Report any..   
1b230 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 65         #       e
1b240 72 72 6f 72 20 74 68 61 74 20 69 73 20 65 6e 63  rror that is enc
1b250 6f 75 6e 74 65 72 65 64 20 69 66 20 77 65 20 66  ountered if we f
1b260 61 69 6c 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ail...          
1b270 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  #..          if 
1b280 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
1b290 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e         object in
1b2a0 76 6f 6b 65 20 47 43 20 47 65 74 54 6f 74 61 6c  voke GC GetTotal
1b2b0 4d 65 6d 6f 72 79 20 74 72 75 65 0d 0a 20 20 20  Memory true..   
1b2c0 20 20 20 20 20 20 20 7d 20 65 72 72 6f 72 5d 7d         } error]}
1b2d0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1b2e0 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
1b2f0 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
1b300 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1b310 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47     "==== WARNING
1b320 3a 20 66 61 69 6c 65 64 20 66 75 6c 6c 20 67 61  : failed full ga
1b330 72 62 61 67 65 20 63 6f 6c 6c 65 63 74 69 6f 6e  rbage collection
1b340 2c 20 65 72 72 6f 72 3a 20 22 20 5c 0d 0a 20 20  , error: " \..  
1b350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 6e                \n
1b360 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20  \t $error \n].. 
1b370 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
1b380 20 20 20 20 20 20 20 20 73 65 74 20 6e 6f 77 20          set now 
1b390 5b 63 6c 6f 63 6b 20 73 65 63 6f 6e 64 73 5d 0d  [clock seconds].
1b3a0 0a 20 20 20 20 20 20 20 20 7d 20 77 68 69 6c 65  .        } while
1b3b0 20 7b 24 73 74 61 72 74 20 3c 3d 20 24 6e 6f 77   {$start <= $now
1b3c0 20 26 26 20 24 6e 6f 77 20 3c 20 24 73 74 6f 70   && $now < $stop
1b3d0 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  }..      }....  
1b3e0 20 20 20 20 23 23 23 23 23 23 23 23 23 23 23 23      ############
1b3f0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1b400 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1b410 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1b420 23 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a 0d  #############...
1b430 0a 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65  .      if {[have
1b440 53 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d  SQLiteObjectComm
1b450 61 6e 64 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  and]} then {..  
1b460 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
1b470 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62   {..          ob
1b480 6a 65 63 74 20 69 6e 76 6f 6b 65 20 47 43 20 47  ject invoke GC G
1b490 65 74 54 6f 74 61 6c 4d 65 6d 6f 72 79 20 66 61  etTotalMemory fa
1b4a0 6c 73 65 0d 0a 20 20 20 20 20 20 20 20 7d 20 72  lse..        } r
1b4b0 65 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65  esult] == 0} the
1b4c0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69  n {..          i
1b4d0 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
1b4e0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1b4f0 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
1b500 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
1b510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
1b520 2d 2d 2d 20 6d 65 6d 6f 72 79 20 69 6e 20 75 73  --- memory in us
1b530 65 20 62 79 20 74 68 65 20 43 4c 52 20 61 66 74  e by the CLR aft
1b540 65 72 20 63 6f 6c 6c 65 63 74 69 6f 6e 2e 2e 2e  er collection...
1b550 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   " \..          
1b560 20 20 20 20 20 20 24 72 65 73 75 6c 74 20 22 20        $result " 
1b570 62 79 74 65 73 5c 6e 22 5d 0d 0a 20 20 20 20 20  bytes\n"]..     
1b580 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
1b590 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
1b5a0 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
1b5b0 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
1b5c0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1b5d0 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66  "==== WARNING: f
1b5e0 61 69 6c 65 64 20 74 6f 20 67 65 74 20 43 4c 52  ailed to get CLR
1b5f0 20 6d 65 6d 6f 72 79 20 75 73 61 67 65 2c 20 65   memory usage, e
1b600 72 72 6f 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20  rror: " \..     
1b610 20 20 20 20 20 20 20 20 20 5c 6e 5c 74 20 24 72           \n\t $r
1b620 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20  esult \n]..     
1b630 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20     }..      }.. 
1b640 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
1b650 63 20 67 65 74 53 51 4c 69 74 65 48 61 6e 64 6c  c getSQLiteHandl
1b660 65 43 6f 75 6e 74 73 20 7b 20 63 68 61 6e 6e 65  eCounts { channe
1b670 6c 20 7b 71 75 69 65 74 20 66 61 6c 73 65 7d 20  l {quiet false} 
1b680 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 72  } {..      set r
1b690 65 73 75 6c 74 20 5b 6c 69 73 74 5d 0d 0a 0d 0a  esult [list]....
1b6a0 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65 53        if {[haveS
1b6b0 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61  QLiteObjectComma
1b6c0 6e 64 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  nd] && \..      
1b6d0 20 20 20 20 5b 68 61 76 65 53 51 4c 69 74 65 44      [haveSQLiteD
1b6e0 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 20 43 4f  efineConstant CO
1b6f0 55 4e 54 5f 48 41 4e 44 4c 45 5d 7d 20 74 68 65  UNT_HANDLE]} the
1b700 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
1b710 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
1b720 41 64 64 20 65 61 63 68 20 63 72 69 74 69 63 61  Add each critica
1b730 6c 20 68 61 6e 64 6c 65 20 63 6f 75 6e 74 20 74  l handle count t
1b740 6f 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67 20  o the resulting 
1b750 6c 69 73 74 2e 0d 0a 20 20 20 20 20 20 20 20 23  list...        #
1b760 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63  ..        foreac
1b770 68 20 6e 61 6d 65 20 5b 6c 69 73 74 20 5c 0d 0a  h name [list \..
1b780 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 6e              conn
1b790 65 63 74 69 6f 6e 43 6f 75 6e 74 20 73 74 61 74  ectionCount stat
1b7a0 65 6d 65 6e 74 43 6f 75 6e 74 20 62 61 63 6b 75  ementCount backu
1b7b0 70 43 6f 75 6e 74 20 62 6c 6f 62 43 6f 75 6e 74  pCount blobCount
1b7c0 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69  ] {..          i
1b7d0 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  f {[catch {..   
1b7e0 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20           object 
1b7f0 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e  invoke -flags +N
1b800 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20  onPublic \..    
1b810 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74              Syst
1b820 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 44  em.Data.SQLite.D
1b830 65 62 75 67 44 61 74 61 20 24 6e 61 6d 65 0d 0a  ebugData $name..
1b840 20 20 20 20 20 20 20 20 20 20 7d 20 76 61 6c 75            } valu
1b850 65 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  e] == 0} then {.
1b860 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
1b870 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
1b880 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1b890 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
1b8a0 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
1b8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b8c0 22 2d 2d 2d 2d 20 63 72 69 74 69 63 61 6c 20 68  "---- critical h
1b8d0 61 6e 64 6c 65 20 63 6f 75 6e 74 20 5c 22 22 20  andle count \"" 
1b8e0 24 6e 61 6d 65 20 22 5c 22 20 69 73 20 22 20 24  $name "\" is " $
1b8f0 76 61 6c 75 65 20 5c 6e 5d 0d 0a 20 20 20 20 20  value \n]..     
1b900 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
1b910 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20          lappend 
1b920 72 65 73 75 6c 74 20 24 76 61 6c 75 65 0d 0a 20  result $value.. 
1b930 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20           } else 
1b940 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
1b950 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
1b960 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
1b970 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d               "==
1b980 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c  == WARNING: fail
1b990 65 64 20 74 6f 20 67 65 74 20 63 72 69 74 69 63  ed to get critic
1b9a0 61 6c 20 68 61 6e 64 6c 65 20 63 6f 75 6e 74 20  al handle count 
1b9b0 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  \"" \..         
1b9c0 20 20 20 20 20 20 20 24 6e 61 6d 65 20 22 5c 22         $name "\"
1b9d0 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20  , error: " \n\t 
1b9e0 24 76 61 6c 75 65 20 5c 6e 5d 0d 0a 20 20 20 20  $value \n]..    
1b9f0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
1ba00 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65   }..      } else
1ba10 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
1ba20 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
1ba30 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
1ba40 54 68 65 20 61 63 74 75 61 6c 20 68 61 6e 64 6c  The actual handl
1ba50 65 20 63 6f 75 6e 74 73 20 61 72 65 20 6e 6f 74  e counts are not
1ba60 20 61 76 61 69 6c 61 62 6c 65 3b 20 74 68 65 72   available; ther
1ba70 65 66 6f 72 65 2c 20 6a 75 73 74 0d 0a 20 20 20  efore, just..   
1ba80 20 20 20 20 20 23 20 20 20 20 20 20 20 72 65 74       #       ret
1ba90 75 72 6e 20 61 6e 20 65 6d 70 74 79 20 6c 69 73  urn an empty lis
1baa0 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  t...        #.. 
1bab0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
1bac0 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 72 69 74  annel "---- crit
1bad0 69 63 61 6c 20 68 61 6e 64 6c 65 20 63 6f 75 6e  ical handle coun
1bae0 74 73 20 75 6e 61 76 61 69 6c 61 62 6c 65 5c 6e  ts unavailable\n
1baf0 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  "..      }....  
1bb00 20 20 20 20 72 65 74 75 72 6e 20 24 72 65 73 75      return $resu
1bb10 6c 74 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  lt..    }.....  
1bb20 20 20 70 72 6f 63 20 73 68 75 74 64 6f 77 6e 53    proc shutdownS
1bb30 51 4c 69 74 65 20 7b 20 63 68 61 6e 6e 65 6c 20  QLite { channel 
1bb40 7b 66 6f 72 63 65 20 66 61 6c 73 65 7d 20 7b 71  {force false} {q
1bb50 75 69 65 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d  uiet false} } {.
1bb60 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
1bb70 23 20 4e 4f 54 45 3a 20 4d 61 6b 65 20 73 75 72  # NOTE: Make sur
1bb80 65 20 74 68 61 74 20 53 51 4c 69 74 65 20 63 6f  e that SQLite co
1bb90 72 65 20 6c 69 62 72 61 72 79 20 69 73 20 63 6f  re library is co
1bba0 6d 70 6c 65 74 65 6c 79 20 73 68 75 74 64 6f 77  mpletely shutdow
1bbb0 6e 2e 20 20 54 68 69 73 0d 0a 20 20 20 20 20 20  n.  This..      
1bbc0 23 20 20 20 20 20 20 20 69 73 20 75 73 65 64 20  #       is used 
1bbd0 62 79 20 74 65 73 74 73 20 74 68 61 74 20 63 68  by tests that ch
1bbe0 61 6e 67 65 20 63 6f 6e 66 69 67 75 72 61 74 69  ange configurati
1bbf0 6f 6e 20 6f 70 74 69 6f 6e 73 20 61 6e 64 2f 6f  on options and/o
1bc00 72 20 74 68 6f 73 65 0d 0a 20 20 20 20 20 20 23  r those..      #
1bc10 20 20 20 20 20 20 20 74 68 61 74 20 6e 65 65 64         that need
1bc20 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 6c 6f   to make sure lo
1bc30 67 67 69 6e 67 20 69 73 20 69 6e 69 74 69 61 6c  gging is initial
1bc40 69 7a 65 64 20 28 69 2e 65 2e 20 6a 75 73 74 20  ized (i.e. just 
1bc50 69 6e 20 63 61 73 65 0d 0a 20 20 20 20 20 20 23  in case..      #
1bc60 20 20 20 20 20 20 20 74 68 65 20 53 51 4c 69 74         the SQLit
1bc70 65 20 63 6f 72 65 20 6c 69 62 72 61 72 79 20 77  e core library w
1bc80 61 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 69  as initialized i
1bc90 6e 20 74 68 65 20 70 72 6f 63 65 73 73 20 70 72  n the process pr
1bca0 69 6f 72 20 74 6f 0d 0a 20 20 20 20 20 20 23 20  ior to..      # 
1bcb0 20 20 20 20 20 20 74 68 65 20 53 51 4c 69 74 65        the SQLite
1bcc0 4c 6f 67 20 63 6c 61 73 73 20 62 65 69 6e 67 20  Log class being 
1bcd0 61 62 6c 65 20 74 6f 20 73 65 74 75 70 20 69 74  able to setup it
1bce0 73 20 6c 6f 67 67 69 6e 67 20 63 61 6c 6c 62 61  s logging callba
1bcf0 63 6b 29 2e 0d 0a 20 20 20 20 20 20 23 20 20 20  ck)...      #   
1bd00 20 20 20 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74 68      Normally, th
1bd10 69 73 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62  is should only b
1bd20 65 20 70 65 72 66 6f 72 6d 65 64 20 69 66 20 53  e performed if S
1bd30 51 4c 69 74 65 20 69 73 20 6c 6f 61 64 65 64 20  QLite is loaded 
1bd40 61 6e 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20  and..      #    
1bd50 20 20 20 72 65 61 64 79 20 66 6f 72 20 75 73 65     ready for use
1bd60 20 62 79 20 74 68 65 20 74 65 73 74 20 73 75 69   by the test sui
1bd70 74 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  te...      #..  
1bd80 20 20 20 20 69 66 20 7b 24 66 6f 72 63 65 20 7c      if {$force |
1bd90 7c 20 5b 69 73 53 51 4c 69 74 65 52 65 61 64 79  | [isSQLiteReady
1bda0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
1bdb0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
1bdc0 42 55 47 46 49 58 3a 20 4d 61 6b 65 20 73 75 72  BUGFIX: Make sur
1bdd0 65 20 74 68 61 74 20 61 6e 79 20 22 6c 65 61 6b  e that any "leak
1bde0 65 64 22 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ed" transactions
1bdf0 20 61 6e 64 2f 6f 72 20 63 6f 6e 6e 65 63 74 69   and/or connecti
1be00 6f 6e 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ons..        #  
1be10 20 20 20 20 20 20 20 61 72 65 20 63 6c 65 61 6e         are clean
1be20 65 64 20 75 70 20 62 65 66 6f 72 65 20 63 61 6c  ed up before cal
1be30 6c 69 6e 67 20 74 68 65 20 6e 61 74 69 76 65 20  ling the native 
1be40 73 68 75 74 64 6f 77 6e 20 66 75 6e 63 74 69 6f  shutdown functio
1be50 6e 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  n...        #.. 
1be60 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 74         foreach t
1be70 72 61 6e 73 61 63 74 69 6f 6e 20 5b 69 6e 66 6f  ransaction [info
1be80 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 5d 20 7b   transactions] {
1be90 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
1bea0 5b 73 74 72 69 6e 67 20 6d 61 74 63 68 20 5c 0d  [string match \.
1beb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53  .              S
1bec0 79 73 74 65 6d 23 44 61 74 61 23 53 51 4c 69 74  ystem#Data#SQLit
1bed0 65 23 53 51 4c 69 74 65 54 72 61 6e 73 61 63 74  e#SQLiteTransact
1bee0 69 6f 6e 23 2a 20 24 74 72 61 6e 73 61 63 74 69  ion#* $transacti
1bef0 6f 6e 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  on]} then {..   
1bf00 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61           if {[ca
1bf10 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
1bf20 20 20 20 20 20 73 71 6c 20 74 72 61 6e 73 61 63       sql transac
1bf30 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 20 24 74  tion rollback $t
1bf40 72 61 6e 73 61 63 74 69 6f 6e 0d 0a 20 20 20 20  ransaction..    
1bf50 20 20 20 20 20 20 20 20 7d 20 65 72 72 6f 72 5d          } error]
1bf60 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
1bf70 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
1bf80 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
1bf90 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1bfa0 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
1bfb0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
1bfc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bfd0 20 20 20 20 22 2d 2d 2d 2d 20 72 6f 6c 6c 65 64      "---- rolled
1bfe0 20 62 61 63 6b 20 6c 65 61 6b 65 64 20 74 72 61   back leaked tra
1bff0 6e 73 61 63 74 69 6f 6e 20 5c 22 22 20 5c 0d 0a  nsaction \"" \..
1c000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c010 20 20 20 20 24 74 72 61 6e 73 61 63 74 69 6f 6e      $transaction
1c020 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20   \"\n]..        
1c030 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
1c040 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
1c050 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
1c060 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
1c070 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1c080 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
1c090 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
1c0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c0b0 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e      "==== WARNIN
1c0c0 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 72 6f 6c  G: failed to rol
1c0d0 6c 62 61 63 6b 20 6c 65 61 6b 65 64 20 74 72 61  lback leaked tra
1c0e0 6e 73 61 63 74 69 6f 6e 20 5c 22 22 20 5c 0d 0a  nsaction \"" \..
1c0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c100 20 20 20 20 24 74 72 61 6e 73 61 63 74 69 6f 6e      $transaction
1c110 20 22 5c 22 2c 20 65 72 72 6f 72 3a 20 22 20 5c   "\", error: " \
1c120 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a  n\t $error \n]..
1c130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
1c140 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
1c150 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
1c160 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
1c170 20 20 66 6f 72 65 61 63 68 20 64 62 20 5b 69 6e    foreach db [in
1c180 66 6f 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 5d 20  fo connections] 
1c190 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  {..          if 
1c1a0 7b 5b 73 74 72 69 6e 67 20 6d 61 74 63 68 20 5c  {[string match \
1c1b0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1c1c0 53 79 73 74 65 6d 23 44 61 74 61 23 53 51 4c 69  System#Data#SQLi
1c1d0 74 65 23 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74  te#SQLiteConnect
1c1e0 69 6f 6e 23 2a 20 24 64 62 5d 7d 20 74 68 65 6e  ion#* $db]} then
1c1f0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1c200 69 66 20 7b 5b 63 61 74 63 68 20 7b 73 71 6c 20  if {[catch {sql 
1c210 63 6c 6f 73 65 20 24 64 62 7d 20 65 72 72 6f 72  close $db} error
1c220 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
1c230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
1c240 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
1c250 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
1c260 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
1c270 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
1c280 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1c290 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6c 6f 73 65       "---- close
1c2a0 64 20 6c 65 61 6b 65 64 20 64 61 74 61 62 61 73  d leaked databas
1c2b0 65 20 5c 22 22 20 24 64 62 20 5c 22 5c 6e 5d 0d  e \"" $db \"\n].
1c2c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
1c2d0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20  ..            } 
1c2e0 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
1c2f0 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
1c300 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
1c310 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
1c320 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
1c330 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
1c340 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d               "==
1c350 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c  == WARNING: fail
1c360 65 64 20 74 6f 20 63 6c 6f 73 65 20 6c 65 61 6b  ed to close leak
1c370 65 64 20 64 61 74 61 62 61 73 65 20 5c 22 22 20  ed database \"" 
1c380 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1c390 20 20 20 20 20 20 20 24 64 62 20 22 5c 22 2c 20         $db "\", 
1c3a0 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65  error: " \n\t $e
1c3b0 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  rror \n]..      
1c3c0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
1c3d0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1c3e0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
1c3f0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
1c400 20 20 20 20 20 20 20 23 20 42 55 47 46 49 58 3a         # BUGFIX:
1c410 20 42 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20   Before calling 
1c420 74 68 65 20 6e 61 74 69 76 65 20 73 68 75 74 64  the native shutd
1c430 6f 77 6e 20 66 75 6e 63 74 69 6f 6e 2c 20 6d 61  own function, ma
1c440 6b 65 20 73 75 72 65 20 62 6f 74 68 0d 0a 20 20  ke sure both..  
1c450 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20        #         
1c460 6f 66 20 74 68 65 20 50 52 41 47 4d 41 20 72 65  of the PRAGMA re
1c470 6c 61 74 65 64 20 64 69 72 65 63 74 6f 72 79 20  lated directory 
1c480 6e 61 6d 65 73 20 61 72 65 20 66 72 65 65 64 2e  names are freed.
1c490 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1c4a0 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51 4c       checkForSQL
1c4b0 69 74 65 44 69 72 65 63 74 6f 72 69 65 73 20 24  iteDirectories $
1c4c0 63 68 61 6e 6e 65 6c 20 74 72 75 65 0d 0a 0d 0a  channel true....
1c4d0 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
1c4e0 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
1c4f0 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66  object invoke -f
1c500 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20  lags +NonPublic 
1c510 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1c520 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
1c530 69 74 65 2e 55 6e 73 61 66 65 4e 61 74 69 76 65  ite.UnsafeNative
1c540 4d 65 74 68 6f 64 73 20 73 71 6c 69 74 65 33 5f  Methods sqlite3_
1c550 73 68 75 74 64 6f 77 6e 0d 0a 20 20 20 20 20 20  shutdown..      
1c560 20 20 7d 20 72 65 73 75 6c 74 5d 20 3d 3d 20 30    } result] == 0
1c570 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1c580 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
1c590 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1c5a0 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
1c5b0 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
1c5c0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1c5d0 20 20 20 22 2d 2d 2d 2d 20 63 61 6c 6c 20 73 71     "---- call sq
1c5e0 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 28 29  lite3_shutdown()
1c5f0 2e 2e 2e 20 6f 6b 3a 20 22 20 24 72 65 73 75 6c  ... ok: " $resul
1c600 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  t \n]..         
1c610 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c   }..        } el
1c620 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
1c630 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
1c640 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
1c650 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
1c660 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
1c670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1c680 2d 2d 2d 2d 20 63 61 6c 6c 20 73 71 6c 69 74 65  ---- call sqlite
1c690 33 5f 73 68 75 74 64 6f 77 6e 28 29 2e 2e 2e 20  3_shutdown()... 
1c6a0 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 72  error: " \n\t $r
1c6b0 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20  esult \n]..     
1c6c0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
1c6d0 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  }..      }..    
1c6e0 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 72  }.....    proc r
1c6f0 65 70 6f 72 74 53 51 4c 69 74 65 52 65 73 6f 75  eportSQLiteResou
1c700 72 63 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20  rces {..        
1c710 20 20 20 20 63 68 61 6e 6e 65 6c 20 7b 71 75 69      channel {qui
1c720 65 74 20 66 61 6c 73 65 7d 20 7b 72 65 73 65 74  et false} {reset
1c730 20 74 72 75 65 7d 20 7b 63 6f 6c 6c 65 63 74 20   true} {collect 
1c740 74 72 75 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  true} } {..     
1c750 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
1c760 3a 20 49 66 20 61 76 61 69 6c 61 62 6c 65 2c 20  : If available, 
1c770 72 65 70 6f 72 74 20 6f 6e 20 28 61 6e 64 20 70  report on (and p
1c780 6f 73 73 69 62 6c 79 20 72 65 73 65 74 29 20 74  ossibly reset) t
1c790 68 65 20 72 75 6e 74 69 6d 65 0d 0a 20 20 20 20  he runtime..    
1c7a0 20 20 23 20 20 20 20 20 20 20 63 6f 6e 66 69 67    #       config
1c7b0 75 72 61 74 69 6f 6e 20 73 74 61 74 69 73 74 69  uration statisti
1c7c0 63 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  cs...      #..  
1c7d0 20 20 20 20 69 66 20 7b 5b 68 61 76 65 53 51 4c      if {[haveSQL
1c7e0 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64  iteObjectCommand
1c7f0 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
1c800 20 20 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e    [haveConstrain
1c810 74 20 62 75 69 6c 64 43 6f 6e 66 69 67 75 72 61  t buildConfigura
1c820 74 69 6f 6e 2e 44 65 62 75 67 5d 7d 20 74 68 65  tion.Debug]} the
1c830 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20  n {..        if 
1c840 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
1c850 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f       object invo
1c860 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75  ke -flags +NonPu
1c870 62 6c 69 63 20 2d 61 6c 69 61 73 20 5c 0d 0a 20  blic -alias \.. 
1c880 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73               Sys
1c890 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
1c8a0 44 65 62 75 67 44 61 74 61 20 73 65 74 74 69 6e  DebugData settin
1c8b0 67 52 65 61 64 43 6f 75 6e 74 73 0d 0a 20 20 20  gReadCounts..   
1c8c0 20 20 20 20 20 7d 20 73 65 74 74 69 6e 67 52 65       } settingRe
1c8d0 61 64 43 6f 75 6e 74 73 5d 20 3d 3d 20 30 7d 20  adCounts] == 0} 
1c8e0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1c8f0 20 20 73 65 74 20 6e 61 6d 65 43 6f 75 6e 74 20    set nameCount 
1c900 5b 24 73 65 74 74 69 6e 67 52 65 61 64 43 6f 75  [$settingReadCou
1c910 6e 74 73 20 43 6f 75 6e 74 5d 0d 0a 20 20 20 20  nts Count]..    
1c920 20 20 20 20 20 20 73 65 74 20 76 61 6c 75 65 43        set valueC
1c930 6f 75 6e 74 20 30 0d 0a 0d 0a 20 20 20 20 20 20  ount 0....      
1c940 20 20 20 20 6f 62 6a 65 63 74 20 66 6f 72 65 61      object forea
1c950 63 68 20 2d 61 6c 69 61 73 20 70 61 69 72 20 24  ch -alias pair $
1c960 73 65 74 74 69 6e 67 52 65 61 64 43 6f 75 6e 74  settingReadCount
1c970 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s {..           
1c980 20 69 6e 63 72 20 76 61 6c 75 65 43 6f 75 6e 74   incr valueCount
1c990 20 5b 24 70 61 69 72 20 56 61 6c 75 65 5d 0d 0a   [$pair Value]..
1c9a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
1c9b0 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
1c9c0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
1c9d0 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
1c9e0 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
1c9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca00 20 22 2d 2d 2d 2d 20 73 65 74 74 69 6e 67 20 5c   "---- setting \
1ca10 22 22 20 5b 24 70 61 69 72 20 4b 65 79 5d 20 22  "" [$pair Key] "
1ca20 5c 22 20 77 61 73 20 72 65 61 64 20 22 20 5c 0d  \" was read " \.
1ca30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1ca40 20 20 20 5b 24 70 61 69 72 20 56 61 6c 75 65 5d     [$pair Value]
1ca50 20 22 20 74 69 6d 65 73 5c 6e 22 5d 0d 0a 20 20   " times\n"]..  
1ca60 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
1ca70 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
1ca80 20 20 20 20 20 20 69 66 20 7b 24 72 65 73 65 74        if {$reset
1ca90 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1caa0 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
1cab0 20 7b 24 73 65 74 74 69 6e 67 52 65 61 64 43 6f   {$settingReadCo
1cac0 75 6e 74 73 20 43 6c 65 61 72 7d 20 65 72 72 6f  unts Clear} erro
1cad0 72 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  r] == 0} then {.
1cae0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
1caf0 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
1cb00 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1cb10 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
1cb20 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
1cb30 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1cb40 20 20 20 20 20 20 22 2d 2d 2d 2d 20 72 65 73 65        "---- rese
1cb50 74 20 73 65 74 74 69 6e 67 20 73 74 61 74 69 73  t setting statis
1cb60 74 69 63 73 20 66 6f 72 20 74 68 65 20 70 72 65  tics for the pre
1cb70 76 69 6f 75 73 20 22 20 5c 0d 0a 20 20 20 20 20  vious " \..     
1cb80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24                 $
1cb90 6e 61 6d 65 43 6f 75 6e 74 20 22 20 6e 61 6d 65  nameCount " name
1cba0 73 20 61 6e 64 20 22 20 24 76 61 6c 75 65 43 6f  s and " $valueCo
1cbb0 75 6e 74 20 22 20 76 61 6c 75 65 73 20 72 65 61  unt " values rea
1cbc0 64 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20  d\n"]..         
1cbd0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
1cbe0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
1cbf0 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
1cc00 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
1cc10 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
1cc20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d              "===
1cc30 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65  = WARNING: faile
1cc40 64 20 74 6f 20 72 65 73 65 74 20 73 65 74 74 69  d to reset setti
1cc50 6e 67 20 73 74 61 74 69 73 74 69 63 73 20 66 6f  ng statistics fo
1cc60 72 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  r " \..         
1cc70 20 20 20 20 20 20 20 20 20 22 74 68 65 20 70 72           "the pr
1cc80 65 76 69 6f 75 73 20 22 20 24 6e 61 6d 65 43 6f  evious " $nameCo
1cc90 75 6e 74 20 22 20 6e 61 6d 65 73 20 61 6e 64 20  unt " names and 
1cca0 22 20 24 76 61 6c 75 65 43 6f 75 6e 74 20 5c 0d  " $valueCount \.
1ccb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1ccc0 20 20 20 22 20 76 61 6c 75 65 73 20 72 65 61 64     " values read
1ccd0 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20  , error: " \n\t 
1cce0 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20  $error \n]..    
1ccf0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
1cd00 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
1cd10 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20  }....        if 
1cd20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
1cd30 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f       object invo
1cd40 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75  ke -flags +NonPu
1cd50 62 6c 69 63 20 2d 61 6c 69 61 73 20 5c 0d 0a 20  blic -alias \.. 
1cd60 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73               Sys
1cd70 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
1cd80 44 65 62 75 67 44 61 74 61 20 73 65 74 74 69 6e  DebugData settin
1cd90 67 46 69 6c 65 52 65 61 64 43 6f 75 6e 74 73 0d  gFileReadCounts.
1cda0 0a 20 20 20 20 20 20 20 20 7d 20 73 65 74 74 69  .        } setti
1cdb0 6e 67 46 69 6c 65 52 65 61 64 43 6f 75 6e 74 73  ngFileReadCounts
1cdc0 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
1cdd0 20 20 20 20 20 20 20 20 20 20 73 65 74 20 6e 61            set na
1cde0 6d 65 43 6f 75 6e 74 20 5b 24 73 65 74 74 69 6e  meCount [$settin
1cdf0 67 46 69 6c 65 52 65 61 64 43 6f 75 6e 74 73 20  gFileReadCounts 
1ce00 43 6f 75 6e 74 5d 0d 0a 20 20 20 20 20 20 20 20  Count]..        
1ce10 20 20 73 65 74 20 76 61 6c 75 65 43 6f 75 6e 74    set valueCount
1ce20 20 30 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   0....          
1ce30 6f 62 6a 65 63 74 20 66 6f 72 65 61 63 68 20 2d  object foreach -
1ce40 61 6c 69 61 73 20 70 61 69 72 20 24 73 65 74 74  alias pair $sett
1ce50 69 6e 67 46 69 6c 65 52 65 61 64 43 6f 75 6e 74  ingFileReadCount
1ce60 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s {..           
1ce70 20 69 6e 63 72 20 76 61 6c 75 65 43 6f 75 6e 74   incr valueCount
1ce80 20 5b 24 70 61 69 72 20 56 61 6c 75 65 5d 0d 0a   [$pair Value]..
1ce90 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
1cea0 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
1ceb0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
1cec0 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
1ced0 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
1cee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cef0 20 22 2d 2d 2d 2d 20 73 65 74 74 69 6e 67 20 5c   "---- setting \
1cf00 22 22 20 5b 24 70 61 69 72 20 4b 65 79 5d 20 22  "" [$pair Key] "
1cf10 5c 22 20 77 61 73 20 72 65 61 64 20 22 20 5c 0d  \" was read " \.
1cf20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1cf30 20 20 20 5b 24 70 61 69 72 20 56 61 6c 75 65 5d     [$pair Value]
1cf40 20 22 20 74 69 6d 65 73 20 66 72 6f 6d 20 74 68   " times from th
1cf50 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  e configuration 
1cf60 66 69 6c 65 5c 6e 22 5d 0d 0a 20 20 20 20 20 20  file\n"]..      
1cf70 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
1cf80 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
1cf90 20 20 69 66 20 7b 24 72 65 73 65 74 7d 20 74 68    if {$reset} th
1cfa0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
1cfb0 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 24 73    if {[catch {$s
1cfc0 65 74 74 69 6e 67 46 69 6c 65 52 65 61 64 43 6f  ettingFileReadCo
1cfd0 75 6e 74 73 20 43 6c 65 61 72 7d 20 65 72 72 6f  unts Clear} erro
1cfe0 72 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  r] == 0} then {.
1cff0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
1d000 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
1d010 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1d020 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
1d030 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
1d040 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1d050 20 20 20 20 20 20 22 2d 2d 2d 2d 20 72 65 73 65        "---- rese
1d060 74 20 73 65 74 74 69 6e 67 20 73 74 61 74 69 73  t setting statis
1d070 74 69 63 73 20 66 6f 72 20 74 68 65 20 70 72 65  tics for the pre
1d080 76 69 6f 75 73 20 22 20 5c 0d 0a 20 20 20 20 20  vious " \..     
1d090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24                 $
1d0a0 6e 61 6d 65 43 6f 75 6e 74 20 22 20 6e 61 6d 65  nameCount " name
1d0b0 73 20 61 6e 64 20 22 20 24 76 61 6c 75 65 43 6f  s and " $valueCo
1d0c0 75 6e 74 20 22 20 76 61 6c 75 65 73 20 72 65 61  unt " values rea
1d0d0 64 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  d " \..         
1d0e0 20 20 20 20 20 20 20 20 20 20 20 22 66 72 6f 6d             "from
1d0f0 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69   the configurati
1d100 6f 6e 20 66 69 6c 65 5c 6e 22 5d 0d 0a 20 20 20  on file\n"]..   
1d110 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
1d120 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
1d130 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1d140 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
1d150 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
1d160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d170 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a    "==== WARNING:
1d180 20 66 61 69 6c 65 64 20 74 6f 20 72 65 73 65 74   failed to reset
1d190 20 73 65 74 74 69 6e 67 20 73 74 61 74 69 73 74   setting statist
1d1a0 69 63 73 20 66 6f 72 20 22 20 5c 0d 0a 20 20 20  ics for " \..   
1d1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1d1c0 74 68 65 20 70 72 65 76 69 6f 75 73 20 22 20 24  the previous " $
1d1d0 6e 61 6d 65 43 6f 75 6e 74 20 22 20 6e 61 6d 65  nameCount " name
1d1e0 73 20 61 6e 64 20 22 20 24 76 61 6c 75 65 43 6f  s and " $valueCo
1d1f0 75 6e 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  unt \..         
1d200 20 20 20 20 20 20 20 20 20 22 20 76 61 6c 75 65           " value
1d210 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  s read from the 
1d220 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 66 69  configuration fi
1d230 6c 65 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c  le, error: " \n\
1d240 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  t \..           
1d250 20 20 20 20 20 20 20 24 65 72 72 6f 72 20 5c 6e         $error \n
1d260 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ]..            }
1d270 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
1d280 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1d290 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  }....      if {[
1d2a0 68 61 76 65 53 51 4c 69 74 65 4f 62 6a 65 63 74  haveSQLiteObject
1d2b0 43 6f 6d 6d 61 6e 64 5d 20 26 26 20 5c 0d 0a 20  Command] && \.. 
1d2c0 20 20 20 20 20 20 20 20 20 5b 68 61 76 65 53 51           [haveSQ
1d2d0 4c 69 74 65 44 65 66 69 6e 65 43 6f 6e 73 74 61  LiteDefineConsta
1d2e0 6e 74 20 49 4e 54 45 52 4f 50 5f 56 49 52 54 55  nt INTEROP_VIRTU
1d2f0 41 4c 5f 54 41 42 4c 45 5d 20 26 26 20 5c 0d 0a  AL_TABLE] && \..
1d300 20 20 20 20 20 20 20 20 20 20 5b 68 61 76 65 53            [haveS
1d310 51 4c 69 74 65 44 65 66 69 6e 65 43 6f 6e 73 74  QLiteDefineConst
1d320 61 6e 74 20 54 52 41 43 4b 5f 4d 45 4d 4f 52 59  ant TRACK_MEMORY
1d330 5f 42 59 54 45 53 5d 7d 20 74 68 65 6e 20 7b 0d  _BYTES]} then {.
1d340 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71  .        if {!$q
1d350 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
1d360 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
1d370 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 75 72  hannel "---- cur
1d380 72 65 6e 74 20 6d 65 6d 6f 72 79 20 69 6e 20 75  rent memory in u
1d390 73 65 20 62 79 20 53 51 4c 69 74 65 4d 65 6d 6f  se by SQLiteMemo
1d3a0 72 79 2e 2e 2e 20 22 0d 0a 20 20 20 20 20 20 20  ry... "..       
1d3b0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66   }....        if
1d3c0 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
1d3d0 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76        object inv
1d3e0 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50  oke -flags +NonP
1d3f0 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20  ublic \..       
1d400 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61         System.Da
1d410 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65  ta.SQLite.SQLite
1d420 4d 65 6d 6f 72 79 20 62 79 74 65 73 41 6c 6c 6f  Memory bytesAllo
1d430 63 61 74 65 64 0d 0a 20 20 20 20 20 20 20 20 7d  cated..        }
1d440 20 6d 65 6d 6f 72 79 5d 20 3d 3d 20 30 7d 20 74   memory] == 0} t
1d450 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1d460 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
1d470 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
1d480 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
1d490 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65   [appendArgs $me
1d4a0 6d 6f 72 79 20 22 20 62 79 74 65 73 5c 6e 22 5d  mory " bytes\n"]
1d4b0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
1d4c0 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
1d4d0 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20 6d  .          set m
1d4e0 65 6d 6f 72 79 20 75 6e 6b 6e 6f 77 6e 0d 0a 0d  emory unknown...
1d4f0 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21  .          if {!
1d500 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
1d510 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
1d520 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
1d530 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 5c  ndArgs $memory \
1d540 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  n]..          }.
1d550 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
1d560 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
1d570 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
1d580 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
1d590 6e 65 6c 20 22 2d 2d 2d 2d 20 6d 61 78 69 6d 75  nel "---- maximu
1d5a0 6d 20 6d 65 6d 6f 72 79 20 69 6e 20 75 73 65 20  m memory in use 
1d5b0 62 79 20 53 51 4c 69 74 65 4d 65 6d 6f 72 79 2e  by SQLiteMemory.
1d5c0 2e 2e 20 22 0d 0a 20 20 20 20 20 20 20 20 7d 0d  .. "..        }.
1d5d0 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  ...        if {[
1d5e0 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
1d5f0 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65     object invoke
1d600 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c   -flags +NonPubl
1d610 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ic \..          
1d620 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e      System.Data.
1d630 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 4d 65 6d  SQLite.SQLiteMem
1d640 6f 72 79 20 6d 61 78 69 6d 75 6d 42 79 74 65 73  ory maximumBytes
1d650 41 6c 6c 6f 63 61 74 65 64 0d 0a 20 20 20 20 20  Allocated..     
1d660 20 20 20 7d 20 6d 65 6d 6f 72 79 5d 20 3d 3d 20     } memory] == 
1d670 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
1d680 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
1d690 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1d6a0 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
1d6b0 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
1d6c0 20 24 6d 65 6d 6f 72 79 20 22 20 62 79 74 65 73   $memory " bytes
1d6d0 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  \n"]..          
1d6e0 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73  }..        } els
1d6f0 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73  e {..          s
1d700 65 74 20 6d 65 6d 6f 72 79 20 75 6e 6b 6e 6f 77  et memory unknow
1d710 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69  n....          i
1d720 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
1d730 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1d740 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
1d750 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f  appendArgs $memo
1d760 72 79 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  ry \n]..        
1d770 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
1d780 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
1d790 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
1d7a0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70  en {..        tp
1d7b0 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d  uts $channel "--
1d7c0 2d 2d 20 63 75 72 72 65 6e 74 20 6d 65 6d 6f 72  -- current memor
1d7d0 79 20 69 6e 20 75 73 65 20 62 79 20 53 51 4c 69  y in use by SQLi
1d7e0 74 65 2e 2e 2e 20 22 0d 0a 20 20 20 20 20 20 7d  te... "..      }
1d7f0 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 68  ....      if {[h
1d800 61 76 65 53 51 4c 69 74 65 4f 62 6a 65 63 74 43  aveSQLiteObjectC
1d810 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65 6e 20 7b 0d  ommand]} then {.
1d820 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61  .        if {[ca
1d830 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
1d840 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d   object invoke -
1d850 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63  flags +NonPublic
1d860 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1d870 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51    System.Data.SQ
1d880 4c 69 74 65 2e 55 6e 73 61 66 65 4e 61 74 69 76  Lite.UnsafeNativ
1d890 65 4d 65 74 68 6f 64 73 20 73 71 6c 69 74 65 33  eMethods sqlite3
1d8a0 5f 6d 65 6d 6f 72 79 5f 75 73 65 64 0d 0a 20 20  _memory_used..  
1d8b0 20 20 20 20 20 20 7d 20 6d 65 6d 6f 72 79 5d 20        } memory] 
1d8c0 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
1d8d0 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
1d8e0 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
1d8f0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
1d900 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
1d910 72 67 73 20 24 6d 65 6d 6f 72 79 20 22 20 62 79  rgs $memory " by
1d920 74 65 73 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20  tes\n"]..       
1d930 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20     }..        } 
1d940 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
1d950 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23    #..          #
1d960 20 4e 4f 54 45 3a 20 4d 61 79 62 65 20 74 68 65   NOTE: Maybe the
1d970 20 53 51 4c 69 74 65 20 63 6f 72 65 20 6c 69 62   SQLite core lib
1d980 72 61 72 79 20 69 73 20 75 6e 61 76 61 69 6c 61  rary is unavaila
1d990 62 6c 65 3f 0d 0a 20 20 20 20 20 20 20 20 20 20  ble?..          
1d9a0 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  #..          set
1d9b0 20 6d 65 6d 6f 72 79 20 75 6e 6b 6e 6f 77 6e 0d   memory unknown.
1d9c0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  ...          if 
1d9d0 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
1d9e0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
1d9f0 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
1da00 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79  pendArgs $memory
1da10 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \n]..          
1da20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  }..        }..  
1da30 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
1da40 20 20 20 20 20 20 73 65 74 20 6d 65 6d 6f 72 79        set memory
1da50 20 75 6e 61 76 61 69 6c 61 62 6c 65 0d 0a 0d 0a   unavailable....
1da60 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
1da70 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
1da80 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
1da90 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
1daa0 73 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20  s $memory \n].. 
1dab0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1dac0 7d 0d 0a 0d 0a 20 20 20 20 20 20 73 65 74 20 72  }....      set r
1dad0 65 73 75 6c 74 20 24 6d 65 6d 6f 72 79 3b 20 23  esult $memory; #
1dae0 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e 20 6d 65   NOTE: Return me
1daf0 6d 6f 72 79 20 69 6e 2d 75 73 65 20 74 6f 20 6f  mory in-use to o
1db00 75 72 20 63 61 6c 6c 65 72 2e 0d 0a 0d 0a 20 20  ur caller.....  
1db10 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
1db20 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1db30 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
1db40 22 2d 2d 2d 2d 20 6d 61 78 69 6d 75 6d 20 6d 65  "---- maximum me
1db50 6d 6f 72 79 20 69 6e 20 75 73 65 20 62 79 20 53  mory in use by S
1db60 51 4c 69 74 65 2e 2e 2e 20 22 0d 0a 20 20 20 20  QLite... "..    
1db70 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20    }....      if 
1db80 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f 62 6a 65  {[haveSQLiteObje
1db90 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65 6e  ctCommand]} then
1dba0 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   {..        if {
1dbb0 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
1dbc0 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b      object invok
1dbd0 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62  e -flags +NonPub
1dbe0 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  lic \..         
1dbf0 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61       System.Data
1dc00 2e 53 51 4c 69 74 65 2e 55 6e 73 61 66 65 4e 61  .SQLite.UnsafeNa
1dc10 74 69 76 65 4d 65 74 68 6f 64 73 20 5c 0d 0a 20  tiveMethods \.. 
1dc20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
1dc30 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 68 69 67 68  ite3_memory_high
1dc40 77 61 74 65 72 20 30 0d 0a 20 20 20 20 20 20 20  water 0..       
1dc50 20 7d 20 6d 65 6d 6f 72 79 5d 20 3d 3d 20 30 7d   } memory] == 0}
1dc60 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1dc70 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
1dc80 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1dc90 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
1dca0 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24  el [appendArgs $
1dcb0 6d 65 6d 6f 72 79 20 22 20 62 79 74 65 73 5c 6e  memory " bytes\n
1dcc0 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  "]..          }.
1dcd0 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20  .        } else 
1dce0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  {..          #..
1dcf0 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
1dd00 3a 20 4d 61 79 62 65 20 74 68 65 20 53 51 4c 69  : Maybe the SQLi
1dd10 74 65 20 63 6f 72 65 20 6c 69 62 72 61 72 79 20  te core library 
1dd20 69 73 20 75 6e 61 76 61 69 6c 61 62 6c 65 3f 0d  is unavailable?.
1dd30 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
1dd40 20 20 20 20 20 20 20 20 73 65 74 20 6d 65 6d 6f          set memo
1dd50 72 79 20 75 6e 6b 6e 6f 77 6e 0d 0a 0d 0a 20 20  ry unknown....  
1dd60 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
1dd70 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
1dd80 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
1dd90 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
1dda0 72 67 73 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d  rgs $memory \n].
1ddb0 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
1ddc0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
1ddd0 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
1dde0 20 73 65 74 20 6d 65 6d 6f 72 79 20 75 6e 61 76   set memory unav
1ddf0 61 69 6c 61 62 6c 65 0d 0a 0d 0a 20 20 20 20 20  ailable....     
1de00 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
1de10 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1de20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
1de30 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65   [appendArgs $me
1de40 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  mory \n]..      
1de50 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a    }..      }....
1de60 20 20 20 20 20 20 69 66 20 7b 24 63 6f 6c 6c 65        if {$colle
1de70 63 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  ct} then {..    
1de80 20 20 20 20 63 6f 6c 6c 65 63 74 47 61 72 62 61      collectGarba
1de90 67 65 20 24 63 68 61 6e 6e 65 6c 0d 0a 20 20 20  ge $channel..   
1dea0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66     }....      if
1deb0 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
1dec0 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  {..        tputs
1ded0 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20   $channel "---- 
1dee0 63 75 72 72 65 6e 74 20 6d 65 6d 6f 72 79 20 69  current memory i
1def0 6e 20 75 73 65 20 62 79 20 74 68 65 20 43 4c 52  n use by the CLR
1df00 2e 2e 2e 20 22 0d 0a 20 20 20 20 20 20 7d 0d 0a  ... "..      }..
1df10 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76  ..      if {[hav
1df20 65 53 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d  eSQLiteObjectCom
1df30 6d 61 6e 64 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  mand]} then {.. 
1df40 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
1df50 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6f  h {..          o
1df60 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 47 43 20  bject invoke GC 
1df70 47 65 74 54 6f 74 61 6c 4d 65 6d 6f 72 79 20 66  GetTotalMemory f
1df80 61 6c 73 65 0d 0a 20 20 20 20 20 20 20 20 7d 20  alse..        } 
1df90 6d 65 6d 6f 72 79 5d 20 3d 3d 20 30 7d 20 74 68  memory] == 0} th
1dfa0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
1dfb0 69 66 20 7b 5b 73 74 72 69 6e 67 20 69 73 20 69  if {[string is i
1dfc0 6e 74 65 67 65 72 20 2d 73 74 72 69 63 74 20 24  nteger -strict $
1dfd0 6d 65 6d 6f 72 79 5d 7d 20 74 68 65 6e 20 7b 0d  memory]} then {.
1dfe0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
1dff0 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
1e000 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1e010 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
1e020 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f  appendArgs $memo
1e030 72 79 20 22 20 62 79 74 65 73 5c 6e 22 5d 0d 0a  ry " bytes\n"]..
1e040 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
1e050 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20           } else 
1e060 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  {..            s
1e070 65 74 20 6d 65 6d 6f 72 79 20 69 6e 76 61 6c 69  et memory invali
1e080 64 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  d....           
1e090 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
1e0a0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
1e0b0 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
1e0c0 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24  el [appendArgs $
1e0d0 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20 20  memory \n]..    
1e0e0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
1e0f0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
1e100 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
1e110 20 20 20 20 73 65 74 20 6d 65 6d 6f 72 79 20 75      set memory u
1e120 6e 6b 6e 6f 77 6e 0d 0a 0d 0a 20 20 20 20 20 20  nknown....      
1e130 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
1e140 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1e150 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
1e160 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
1e170 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20  $memory \n]..   
1e180 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1e190 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73    }..      } els
1e1a0 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74  e {..        set
1e1b0 20 6d 65 6d 6f 72 79 20 75 6e 61 76 61 69 6c 61   memory unavaila
1e1c0 62 6c 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69  ble....        i
1e1d0 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
1e1e0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70   {..          tp
1e1f0 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
1e200 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79  pendArgs $memory
1e210 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d   \n]..        }.
1e220 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
1e230 20 20 72 65 74 75 72 6e 20 24 72 65 73 75 6c 74    return $result
1e240 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
1e250 70 72 6f 63 20 63 68 65 63 6b 46 6f 72 53 51 4c  proc checkForSQL
1e260 69 74 65 44 69 72 65 63 74 6f 72 69 65 73 20 7b  iteDirectories {
1e270 20 63 68 61 6e 6e 65 6c 20 7b 72 65 73 65 74 20   channel {reset 
1e280 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20  false} } {..    
1e290 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
1e2a0 45 3a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20  E: Check if the 
1e2b0 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65  sqlite3_win32_se
1e2c0 74 5f 64 69 72 65 63 74 6f 72 79 20 66 75 6e 63  t_directory func
1e2d0 74 69 6f 6e 20 69 73 20 61 76 61 69 6c 61 62 6c  tion is availabl
1e2e0 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  e...      #..   
1e2f0 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
1e300 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 22  l \..          "
1e310 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f  ---- checking fo
1e320 72 20 66 75 6e 63 74 69 6f 6e 20 73 71 6c 69 74  r function sqlit
1e330 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72  e3_win32_set_dir
1e340 65 63 74 6f 72 79 2e 2e 2e 20 22 0d 0a 0d 0a 20  ectory... ".... 
1e350 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
1e360 4e 4f 54 45 3a 20 54 68 69 73 20 63 61 6c 6c 20  NOTE: This call 
1e370 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33 5f 77  to the sqlite3_w
1e380 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f  in32_set_directo
1e390 72 79 20 66 75 6e 63 74 69 6f 6e 20 75 73 65 73  ry function uses
1e3a0 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20   the..      #   
1e3b0 20 20 20 20 69 6e 76 61 6c 69 64 20 76 61 6c 75      invalid valu
1e3c0 65 20 30 20 66 6f 72 20 74 68 65 20 66 69 72 73  e 0 for the firs
1e3d0 74 20 61 72 67 75 6d 65 6e 74 2e 20 20 54 68 69  t argument.  Thi
1e3e0 73 20 63 6f 64 65 20 69 73 20 64 65 73 69 67 6e  s code is design
1e3f0 65 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ed..      #     
1e400 20 20 74 6f 20 63 68 65 63 6b 20 69 66 20 63 61    to check if ca
1e410 6c 6c 69 6e 67 20 74 68 65 20 66 75 6e 63 74 69  lling the functi
1e420 6f 6e 20 77 69 6c 6c 20 72 61 69 73 65 20 61 6e  on will raise an
1e430 20 65 78 63 65 70 74 69 6f 6e 20 28 69 2e 65 2e   exception (i.e.
1e440 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
1e450 74 68 65 20 61 63 74 75 61 6c 20 72 65 73 75 6c  the actual resul
1e460 74 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f  t of the functio
1e470 6e 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65  n does not matte
1e480 72 20 61 73 20 6c 6f 6e 67 20 61 73 20 6e 6f 0d  r as long as no.
1e490 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64  .      #       d
1e4a0 69 72 65 63 74 6f 72 79 20 69 73 20 63 68 61 6e  irectory is chan
1e4b0 67 65 64 29 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  ged)...      #..
1e4c0 20 20 20 20 20 20 69 66 20 7b 5b 69 73 57 69 6e        if {[isWin
1e4d0 64 6f 77 73 5d 20 26 26 20 5b 63 61 74 63 68 20  dows] && [catch 
1e4e0 7b 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a 65 63  {..        objec
1e4f0 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20  t invoke -flags 
1e500 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20  +NonPublic \..  
1e510 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d            System
1e520 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 55 6e 73  .Data.SQLite.Uns
1e530 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73  afeNativeMethods
1e540 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1e550 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65  sqlite3_win32_se
1e560 74 5f 64 69 72 65 63 74 6f 72 79 20 30 20 6e 75  t_directory 0 nu
1e570 6c 6c 0d 0a 20 20 20 20 20 20 7d 5d 20 3d 3d 20  ll..      }] == 
1e580 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
1e590 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
1e5a0 4e 4f 54 45 3a 20 43 61 6c 6c 69 6e 67 20 74 68  NOTE: Calling th
1e5b0 65 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  e sqlite3_win32_
1e5c0 73 65 74 5f 64 69 72 65 63 74 6f 72 79 20 66 75  set_directory fu
1e5d0 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 0d  nction does not.
1e5e0 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
1e5f0 20 63 61 75 73 65 20 61 6e 20 65 78 63 65 70 74   cause an except
1e600 69 6f 6e 3b 20 74 68 65 72 65 66 6f 72 65 2c 20  ion; therefore, 
1e610 69 74 20 6d 75 73 74 20 62 65 20 61 76 61 69 6c  it must be avail
1e620 61 62 6c 65 20 28 69 2e 65 2e 0d 0a 20 20 20 20  able (i.e...    
1e630 20 20 20 20 23 20 20 20 20 20 20 20 65 76 65 6e      #       even
1e640 20 74 68 6f 75 67 68 20 69 74 20 73 68 6f 75 6c   though it shoul
1e650 64 20 72 65 74 75 72 6e 20 61 20 66 61 69 6c 75  d return a failu
1e660 72 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 69  re return code i
1e670 6e 20 74 68 69 73 0d 0a 20 20 20 20 20 20 20 20  n this..        
1e680 23 20 20 20 20 20 20 20 63 61 73 65 29 2e 0d 0a  #       case)...
1e690 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1e6a0 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74     addConstraint
1e6b0 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73   sqlite3_win32_s
1e6c0 65 74 5f 64 69 72 65 63 74 6f 72 79 0d 0a 0d 0a  et_directory....
1e6d0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
1e6e0 68 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 0d 0a  hannel yes\n....
1e6f0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1e700 20 20 20 23 20 4e 4f 54 45 3a 20 44 6f 65 73 20     # NOTE: Does 
1e710 6f 75 72 20 63 61 6c 6c 65 72 20 77 61 6e 74 20  our caller want 
1e720 74 6f 20 72 65 73 65 74 20 74 68 65 20 64 69 72  to reset the dir
1e730 65 63 74 6f 72 69 65 73 3f 0d 0a 20 20 20 20 20  ectories?..     
1e740 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66     #..        if
1e750 20 7b 24 72 65 73 65 74 7d 20 74 68 65 6e 20 7b   {$reset} then {
1e760 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
1e770 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
1e780 20 4e 6f 77 20 6d 61 6b 65 20 73 75 72 65 20 74   Now make sure t
1e790 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  he database and 
1e7a0 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74  temporary direct
1e7b0 6f 72 69 65 73 20 61 72 65 0d 0a 20 20 20 20 20  ories are..     
1e7c0 20 20 20 20 20 23 20 20 20 20 20 20 20 72 65 73       #       res
1e7d0 65 74 20 74 68 65 69 72 20 64 65 66 61 75 6c 74  et their default
1e7e0 20 76 61 6c 75 65 73 2c 20 77 68 69 63 68 20 73   values, which s
1e7f0 68 6f 75 6c 64 20 62 65 20 6e 75 6c 6c 20 66 6f  hould be null fo
1e800 72 20 62 6f 74 68 2e 0d 0a 20 20 20 20 20 20 20  r both...       
1e810 20 20 20 23 20 20 20 20 20 20 20 53 69 6e 63 65     #       Since
1e820 20 74 68 65 20 73 71 6c 69 74 65 33 5f 77 69 6e   the sqlite3_win
1e830 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79  32_set_directory
1e840 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 76 61   function is ava
1e850 69 6c 61 62 6c 65 2c 0d 0a 20 20 20 20 20 20 20  ilable,..       
1e860 20 20 20 23 20 20 20 20 20 20 20 75 73 65 20 69     #       use i
1e870 74 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  t...          #.
1e880 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 7b  .          for {
1e890 73 65 74 20 69 6e 64 65 78 20 31 7d 20 7b 24 69  set index 1} {$i
1e8a0 6e 64 65 78 20 3c 20 33 7d 20 7b 69 6e 63 72 20  ndex < 3} {incr 
1e8b0 69 6e 64 65 78 7d 20 7b 0d 0a 20 20 20 20 20 20  index} {..      
1e8c0 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
1e8d0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1e8e0 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20    object invoke 
1e8f0 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69  -flags +NonPubli
1e900 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  c \..           
1e910 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61         System.Da
1e920 74 61 2e 53 51 4c 69 74 65 2e 55 6e 73 61 66 65  ta.SQLite.Unsafe
1e930 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 20 5c 0d  NativeMethods \.
1e940 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1e950 20 20 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32     sqlite3_win32
1e960 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79 20 24  _set_directory $
1e970 69 6e 64 65 78 20 6e 75 6c 6c 0d 0a 20 20 20 20  index null..    
1e980 20 20 20 20 20 20 20 20 7d 20 72 65 73 75 6c 74          } result
1e990 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
1e9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70                tp
1e9b0 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
1e9c0 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
1e9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
1e9e0 2d 2d 2d 20 63 61 6c 6c 20 73 71 6c 69 74 65 33  --- call sqlite3
1e9f0 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63  _win32_set_direc
1ea00 74 6f 72 79 28 22 20 24 69 6e 64 65 78 20 5c 0d  tory(" $index \.
1ea10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1ea20 20 20 20 22 2c 20 6e 75 6c 6c 29 2e 2e 2e 20 6f     ", null)... o
1ea30 6b 3a 20 22 20 24 72 65 73 75 6c 74 20 5c 6e 5d  k: " $result \n]
1ea40 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20  ..            } 
1ea50 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
1ea60 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
1ea70 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
1ea80 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1ea90 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 61 6c 6c        "---- call
1eaa0 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73   sqlite3_win32_s
1eab0 65 74 5f 64 69 72 65 63 74 6f 72 79 28 22 20 24  et_directory(" $
1eac0 69 6e 64 65 78 20 5c 0d 0a 20 20 20 20 20 20 20  index \..       
1ead0 20 20 20 20 20 20 20 20 20 20 20 22 2c 20 6e 75             ", nu
1eae0 6c 6c 29 2e 2e 2e 20 65 72 72 6f 72 3a 20 22 20  ll)... error: " 
1eaf0 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d  \n\t $result \n]
1eb00 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
1eb10 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
1eb20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
1eb30 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
1eb40 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
1eb50 6e 6f 5c 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20  no\n....        
1eb60 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
1eb70 45 3a 20 44 6f 65 73 20 6f 75 72 20 63 61 6c 6c  E: Does our call
1eb80 65 72 20 77 61 6e 74 20 74 6f 20 72 65 73 65 74  er want to reset
1eb90 20 74 68 65 20 64 69 72 65 63 74 6f 72 69 65 73   the directories
1eba0 3f 20 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79  ?  This can only
1ebb0 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
1ebc0 20 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20 69    be performed i
1ebd0 66 20 53 51 4c 69 74 65 20 69 73 20 6c 6f 61 64  f SQLite is load
1ebe0 65 64 20 61 6e 64 20 72 65 61 64 79 20 66 6f 72  ed and ready for
1ebf0 20 75 73 65 20 62 79 20 74 68 65 20 74 65 73 74   use by the test
1ec00 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
1ec10 20 20 73 75 69 74 65 2e 0d 0a 20 20 20 20 20 20    suite...      
1ec20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20    #..        if 
1ec30 7b 24 72 65 73 65 74 20 26 26 20 5b 69 73 53 51  {$reset && [isSQ
1ec40 4c 69 74 65 52 65 61 64 79 5d 7d 20 74 68 65 6e  LiteReady]} then
1ec50 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d   {..          #.
1ec60 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
1ec70 45 3a 20 4e 6f 77 20 6d 61 6b 65 20 73 75 72 65  E: Now make sure
1ec80 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6e   the database an
1ec90 64 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65  d temporary dire
1eca0 63 74 6f 72 69 65 73 20 61 72 65 0d 0a 20 20 20  ctories are..   
1ecb0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 72         #       r
1ecc0 65 73 65 74 20 74 68 65 69 72 20 64 65 66 61 75  eset their defau
1ecd0 6c 74 20 76 61 6c 75 65 73 2c 20 77 68 69 63 68  lt values, which
1ece0 20 73 68 6f 75 6c 64 20 62 65 20 6e 75 6c 6c 20   should be null 
1ecf0 66 6f 72 20 62 6f 74 68 2e 0d 0a 20 20 20 20 20  for both...     
1ed00 20 20 20 20 20 23 20 20 20 20 20 20 20 53 69 6e       #       Sin
1ed10 63 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f 77  ce the sqlite3_w
1ed20 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f  in32_set_directo
1ed30 72 79 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73  ry function does
1ed40 20 6e 6f 74 0d 0a 20 20 20 20 20 20 20 20 20 20   not..          
1ed50 23 20 20 20 20 20 20 20 61 70 70 65 61 72 20 74  #       appear t
1ed60 6f 20 62 65 20 61 76 61 69 6c 61 62 6c 65 2c 20  o be available, 
1ed70 75 73 65 20 74 68 65 20 61 73 73 6f 63 69 61 74  use the associat
1ed80 65 64 20 50 52 41 47 4d 41 20 63 6f 6d 6d 61 6e  ed PRAGMA comman
1ed90 64 73 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20  ds..          # 
1eda0 20 20 20 20 20 20 69 6e 73 74 65 61 64 2e 0d 0a        instead...
1edb0 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
1edc0 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 64         foreach d
1edd0 69 72 65 63 74 6f 72 79 20 5b 6c 69 73 74 20 64  irectory [list d
1ede0 61 74 61 5f 73 74 6f 72 65 5f 64 69 72 65 63 74  ata_store_direct
1edf0 6f 72 79 20 74 65 6d 70 5f 73 74 6f 72 65 5f 64  ory temp_store_d
1ee00 69 72 65 63 74 6f 72 79 5d 20 7b 0d 0a 20 20 20  irectory] {..   
1ee10 20 20 20 20 20 20 20 20 20 73 65 74 20 73 71 6c           set sql
1ee20 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 50 52   [appendArgs "PR
1ee30 41 47 4d 41 20 22 20 24 64 69 72 65 63 74 6f 72  AGMA " $director
1ee40 79 20 22 20 3d 20 5c 22 5c 22 3b 22 5d 0d 0a 0d  y " = \"\";"]...
1ee50 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
1ee60 7b 5b 63 61 74 63 68 20 7b 65 78 65 63 75 74 65  {[catch {execute
1ee70 53 71 6c 20 24 73 71 6c 7d 20 72 65 73 75 6c 74  Sql $sql} result
1ee80 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
1ee90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70                tp
1eea0 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
1eeb0 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
1eec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
1eed0 2d 2d 2d 20 65 78 65 63 75 74 65 20 50 52 41 47  --- execute PRAG
1eee0 4d 41 20 22 20 24 64 69 72 65 63 74 6f 72 79 20  MA " $directory 
1eef0 22 2e 2e 2e 20 6f 6b 3a 20 5c 22 22 20 5c 0d 0a  "... ok: \"" \..
1ef00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef10 20 20 24 72 65 73 75 6c 74 20 5c 22 5c 6e 5d 0d    $result \"\n].
1ef20 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65  .            } e
1ef30 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
1ef40 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
1ef50 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
1ef60 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1ef70 20 20 20 20 20 22 2d 2d 2d 2d 20 65 78 65 63 75       "---- execu
1ef80 74 65 20 50 52 41 47 4d 41 20 22 20 24 64 69 72  te PRAGMA " $dir
1ef90 65 63 74 6f 72 79 20 22 2e 2e 2e 20 65 72 72 6f  ectory "... erro
1efa0 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20  r: " \..        
1efb0 20 20 20 20 20 20 20 20 20 20 5c 6e 5c 74 20 24            \n\t $
1efc0 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20  result \n]..    
1efd0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
1efe0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
1eff0 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  }..      }....  
1f000 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
1f010 4f 54 45 3a 20 46 69 6e 61 6c 6c 79 2c 20 73 68  OTE: Finally, sh
1f020 6f 77 20 74 68 65 20 63 75 72 72 65 6e 74 20 76  ow the current v
1f030 61 6c 75 65 20 6f 66 20 74 68 65 20 64 61 74 61  alue of the data
1f040 62 61 73 65 20 61 6e 64 20 74 65 6d 70 6f 72 61  base and tempora
1f050 72 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ry..      #     
1f060 20 20 64 69 72 65 63 74 6f 72 69 65 73 2e 20 20    directories.  
1f070 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 62 65  This can only be
1f080 20 70 65 72 66 6f 72 6d 65 64 20 69 66 20 53 51   performed if SQ
1f090 4c 69 74 65 20 69 73 20 6c 6f 61 64 65 64 0d 0a  Lite is loaded..
1f0a0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61 6e        #       an
1f0b0 64 20 72 65 61 64 79 20 66 6f 72 20 75 73 65 20  d ready for use 
1f0c0 62 79 20 74 68 65 20 74 65 73 74 20 73 75 69 74  by the test suit
1f0d0 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  e...      #..   
1f0e0 20 20 20 69 66 20 7b 5b 69 73 53 51 4c 69 74 65     if {[isSQLite
1f0f0 52 65 61 64 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a  Ready]} then {..
1f100 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
1f110 64 69 72 65 63 74 6f 72 79 20 5b 6c 69 73 74 20  directory [list 
1f120 64 61 74 61 5f 73 74 6f 72 65 5f 64 69 72 65 63  data_store_direc
1f130 74 6f 72 79 20 74 65 6d 70 5f 73 74 6f 72 65 5f  tory temp_store_
1f140 64 69 72 65 63 74 6f 72 79 5d 20 7b 0d 0a 20 20  directory] {..  
1f150 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
1f160 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
1f170 67 73 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e  gs "---- checkin
1f180 67 20 22 20 24 64 69 72 65 63 74 6f 72 79 20 22  g " $directory "
1f190 2e 2e 2e 20 22 5d 0d 0a 0d 0a 20 20 20 20 20 20  ... "]....      
1f1a0 20 20 20 20 73 65 74 20 73 71 6c 20 5b 61 70 70      set sql [app
1f1b0 65 6e 64 41 72 67 73 20 22 50 52 41 47 4d 41 20  endArgs "PRAGMA 
1f1c0 22 20 24 64 69 72 65 63 74 6f 72 79 20 5c 3b 5d  " $directory \;]
1f1d0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66  ....          if
1f1e0 20 7b 5b 63 61 74 63 68 20 7b 65 78 65 63 75 74   {[catch {execut
1f1f0 65 53 71 6c 20 24 73 71 6c 20 73 63 61 6c 61 72  eSql $sql scalar
1f200 7d 20 72 65 73 75 6c 74 5d 20 3d 3d 20 30 7d 20  } result] == 0} 
1f210 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1f220 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
1f230 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22  el [appendArgs "
1f240 6f 6b 3a 20 5c 22 22 20 24 72 65 73 75 6c 74 20  ok: \"" $result 
1f250 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  \"\n]..         
1f260 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
1f270 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
1f280 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
1f290 73 20 22 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74  s "error: " \n\t
1f2a0 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20   $result \n]..  
1f2b0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
1f2c0 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20     }..      }.. 
1f2d0 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
1f2e0 63 20 6c 6f 61 64 53 51 4c 69 74 65 54 65 73 74  c loadSQLiteTest
1f2f0 53 65 74 74 69 6e 67 73 20 7b 20 63 68 61 6e 6e  Settings { chann
1f300 65 6c 20 7b 73 75 66 66 69 78 20 22 22 7d 20 7b  el {suffix ""} {
1f310 71 75 69 65 74 20 66 61 6c 73 65 7d 20 7d 20 7b  quiet false} } {
1f320 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
1f330 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20 6c 6f   # NOTE: Skip lo
1f340 61 64 69 6e 67 20 74 68 65 20 73 65 74 74 69 6e  ading the settin
1f350 67 73 20 69 66 20 74 68 65 69 72 20 75 73 61 67  gs if their usag
1f360 65 20 68 61 73 20 62 65 65 6e 20 64 69 73 61 62  e has been disab
1f370 6c 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  led...      #.. 
1f380 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
1f390 65 78 69 73 74 73 20 3a 3a 6e 6f 28 73 71 6c 69  exists ::no(sqli
1f3a0 74 65 54 65 73 74 53 65 74 74 69 6e 67 73 29 5d  teTestSettings)]
1f3b0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1f3c0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
1f3d0 4f 54 45 3a 20 4c 6f 61 64 20 63 75 73 74 6f 6d  OTE: Load custom
1f3e0 20 70 65 72 2d 75 73 65 72 20 61 6e 64 2f 6f 72   per-user and/or
1f3f0 20 70 65 72 2d 68 6f 73 74 20 74 65 73 74 20 73   per-host test s
1f400 65 74 74 69 6e 67 73 20 6e 6f 77 2e 0d 0a 20 20  ettings now...  
1f410 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1f420 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
1f430 73 20 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d  s ::tcl_platform
1f440 28 75 73 65 72 29 5d 7d 20 74 68 65 6e 20 7b 0d  (user)]} then {.
1f450 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20 75  .          set u
1f460 73 65 72 53 65 74 74 69 6e 67 73 46 69 6c 65 4e  serSettingsFileN
1f470 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b  ame [file join [
1f480 67 65 74 43 6f 6d 6d 6f 6e 44 69 72 65 63 74 6f  getCommonDirecto
1f490 72 79 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ry] \..         
1f4a0 20 20 20 20 20 5b 61 70 70 65 6e 64 41 72 67 73       [appendArgs
1f4b0 20 73 65 74 74 69 6e 67 73 20 24 73 75 66 66 69   settings $suffi
1f4c0 78 20 2e 20 24 3a 3a 74 63 6c 5f 70 6c 61 74 66  x . $::tcl_platf
1f4d0 6f 72 6d 28 75 73 65 72 29 20 2e 65 61 67 6c 65  orm(user) .eagle
1f4e0 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  ]]....          
1f4f0 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73  if {[file exists
1f500 20 24 75 73 65 72 53 65 74 74 69 6e 67 73 46 69   $userSettingsFi
1f510 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d  leName]} then {.
1f520 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
1f530 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
1f540 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1f550 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
1f560 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
1f570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f580 22 2d 2d 2d 2d 20 6c 6f 61 64 69 6e 67 20 70 65  "---- loading pe
1f590 72 2d 75 73 65 72 20 74 65 73 74 20 73 65 74 74  r-user test sett
1f5a0 69 6e 67 73 20 66 69 6c 65 20 5c 22 22 20 5c 0d  ings file \"" \.
1f5b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f5c0 20 20 20 24 75 73 65 72 53 65 74 74 69 6e 67 73     $userSettings
1f5d0 46 69 6c 65 4e 61 6d 65 20 5c 22 2e 2e 2e 5c 6e  FileName \"...\n
1f5e0 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ]..            }
1f5f0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
1f600 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20  if {[catch {..  
1f610 20 20 20 20 20 20 20 20 20 20 20 20 75 70 6c 65              uple
1f620 76 65 6c 20 31 20 5b 6c 69 73 74 20 73 6f 75 72  vel 1 [list sour
1f630 63 65 20 24 75 73 65 72 53 65 74 74 69 6e 67 73  ce $userSettings
1f640 46 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20 20 20  FileName]..     
1f650 20 20 20 20 20 20 20 7d 20 65 72 72 6f 72 5d 7d         } error]}
1f660 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1f670 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
1f680 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
1f690 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
1f6a0 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
1f6b0 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
1f6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d                "=
1f6d0 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69  === WARNING: fai
1f6e0 6c 65 64 20 74 6f 20 6c 6f 61 64 20 70 65 72 2d  led to load per-
1f6f0 75 73 65 72 20 73 65 74 74 69 6e 67 73 20 66 69  user settings fi
1f700 6c 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20  le \"" \..      
1f710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24 75                $u
1f720 73 65 72 53 65 74 74 69 6e 67 73 46 69 6c 65 4e  serSettingsFileN
1f730 61 6d 65 20 22 5c 22 2c 20 65 72 72 6f 72 3a 20  ame "\", error: 
1f740 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e  " \n\t $error \n
1f750 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ]..             
1f760 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
1f770 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65  }..          } e
1f780 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
1f790 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
1f7a0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1f7b0 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
1f7c0 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
1f7d0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1f7e0 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6b 69 70        "---- skip
1f7f0 70 65 64 20 6c 6f 61 64 69 6e 67 20 70 65 72 2d  ped loading per-
1f800 75 73 65 72 20 74 65 73 74 20 73 65 74 74 69 6e  user test settin
1f810 67 73 20 66 69 6c 65 20 5c 22 22 20 5c 0d 0a 20  gs file \"" \.. 
1f820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f830 20 24 75 73 65 72 53 65 74 74 69 6e 67 73 46 69   $userSettingsFi
1f840 6c 65 4e 61 6d 65 20 22 5c 22 2c 20 69 74 20 64  leName "\", it d
1f850 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 5c 6e 22  oes not exist\n"
1f860 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ]..            }
1f870 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
1f880 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
1f890 20 20 20 20 23 23 23 23 23 23 23 23 23 23 23 23      ############
1f8a0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1f8b0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1f8c0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1f8d0 23 23 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20  ###########.... 
1f8e0 20 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f         if {[info
1f8f0 20 65 78 69 73 74 73 20 3a 3a 74 63 6c 5f 70 6c   exists ::tcl_pl
1f900 61 74 66 6f 72 6d 28 68 6f 73 74 29 5d 7d 20 74  atform(host)]} t
1f910 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1f920 20 73 65 74 20 68 6f 73 74 53 65 74 74 69 6e 67   set hostSetting
1f930 73 46 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20  sFileName [file 
1f940 6a 6f 69 6e 20 5b 67 65 74 43 6f 6d 6d 6f 6e 44  join [getCommonD
1f950 69 72 65 63 74 6f 72 79 5d 20 5c 0d 0a 20 20 20  irectory] \..   
1f960 20 20 20 20 20 20 20 20 20 20 20 5b 61 70 70 65             [appe
1f970 6e 64 41 72 67 73 20 73 65 74 74 69 6e 67 73 20  ndArgs settings 
1f980 24 73 75 66 66 69 78 20 2e 20 24 3a 3a 74 63 6c  $suffix . $::tcl
1f990 5f 70 6c 61 74 66 6f 72 6d 28 68 6f 73 74 29 20  _platform(host) 
1f9a0 2e 65 61 67 6c 65 5d 5d 0d 0a 0d 0a 20 20 20 20  .eagle]]....    
1f9b0 20 20 20 20 20 20 69 66 20 7b 5b 66 69 6c 65 20        if {[file 
1f9c0 65 78 69 73 74 73 20 24 68 6f 73 74 53 65 74 74  exists $hostSett
1f9d0 69 6e 67 73 46 69 6c 65 4e 61 6d 65 5d 7d 20 74  ingsFileName]} t
1f9e0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1f9f0 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
1fa00 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1fa10 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
1fa20 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
1fa30 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1fa40 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6c 6f 61 64        "---- load
1fa50 69 6e 67 20 70 65 72 2d 68 6f 73 74 20 74 65 73  ing per-host tes
1fa60 74 20 73 65 74 74 69 6e 67 73 20 66 69 6c 65 20  t settings file 
1fa70 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  \"" \..         
1fa80 20 20 20 20 20 20 20 20 20 24 68 6f 73 74 53 65           $hostSe
1fa90 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 20 5c  ttingsFileName \
1faa0 22 2e 2e 2e 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  "...\n]..       
1fab0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
1fac0 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
1fad0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1fae0 20 20 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73    uplevel 1 [lis
1faf0 74 20 73 6f 75 72 63 65 20 24 68 6f 73 74 53 65  t source $hostSe
1fb00 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 5d 0d  ttingsFileName].
1fb10 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65  .            } e
1fb20 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  rror]} then {.. 
1fb30 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
1fb40 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
1fb50 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1fb60 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
1fb70 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
1fb80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb90 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e      "==== WARNIN
1fba0 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 6c 6f 61  G: failed to loa
1fbb0 64 20 70 65 72 2d 68 6f 73 74 20 73 65 74 74 69  d per-host setti
1fbc0 6e 67 73 20 66 69 6c 65 20 5c 22 22 20 5c 0d 0a  ngs file \"" \..
1fbd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fbe0 20 20 20 20 24 68 6f 73 74 53 65 74 74 69 6e 67      $hostSetting
1fbf0 73 46 69 6c 65 4e 61 6d 65 20 22 5c 22 2c 20 65  sFileName "\", e
1fc00 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72  rror: " \n\t $er
1fc10 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ror \n]..       
1fc20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1fc30 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
1fc40 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
1fc50 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71           if {!$q
1fc60 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
1fc70 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
1fc80 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
1fc90 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
1fca0 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
1fcb0 2d 20 73 6b 69 70 70 65 64 20 6c 6f 61 64 69 6e  - skipped loadin
1fcc0 67 20 70 65 72 2d 68 6f 73 74 20 74 65 73 74 20  g per-host test 
1fcd0 73 65 74 74 69 6e 67 73 20 66 69 6c 65 20 5c 22  settings file \"
1fce0 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
1fcf0 20 20 20 20 20 20 20 24 68 6f 73 74 53 65 74 74         $hostSett
1fd00 69 6e 67 73 46 69 6c 65 4e 61 6d 65 20 22 5c 22  ingsFileName "\"
1fd10 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78  , it does not ex
1fd20 69 73 74 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20  ist\n"]..       
1fd30 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
1fd40 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
1fd50 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
1fd60 0c 0d 0a 20 20 20 20 70 72 6f 63 20 72 75 6e 53  ...    proc runS
1fd70 51 4c 69 74 65 54 65 73 74 50 72 6f 6c 6f 67 75  QLiteTestPrologu
1fd80 65 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  e {} {..      #.
1fd90 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53  .      # NOTE: S
1fda0 6b 69 70 20 72 75 6e 6e 69 6e 67 20 6f 75 72 20  kip running our 
1fdb0 63 75 73 74 6f 6d 20 70 72 6f 6c 6f 67 75 65 20  custom prologue 
1fdc0 69 66 20 74 68 65 20 6d 61 69 6e 20 6f 6e 65 20  if the main one 
1fdd0 68 61 73 20 62 65 65 6e 0d 0a 20 20 20 20 20 20  has been..      
1fde0 23 20 20 20 20 20 20 20 73 6b 69 70 70 65 64 2e  #       skipped.
1fdf0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
1fe00 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
1fe10 74 73 20 3a 3a 6e 6f 28 70 72 6f 6c 6f 67 75 65  ts ::no(prologue
1fe20 2e 65 61 67 6c 65 29 5d 7d 20 74 68 65 6e 20 7b  .eagle)]} then {
1fe30 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1fe40 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4c 6f 61       # NOTE: Loa
1fe50 64 20 74 68 65 20 22 62 65 66 6f 72 65 2d 63 6f  d the "before-co
1fe60 6e 73 74 72 61 69 6e 74 73 22 20 63 75 73 74 6f  nstraints" custo
1fe70 6d 20 70 65 72 2d 75 73 65 72 20 61 6e 64 2f 6f  m per-user and/o
1fe80 72 20 70 65 72 2d 68 6f 73 74 0d 0a 20 20 20 20  r per-host..    
1fe90 20 20 20 20 23 20 20 20 20 20 20 20 74 65 73 74      #       test
1fea0 20 73 65 74 74 69 6e 67 73 20 6e 6f 77 2e 0d 0a   settings now...
1feb0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1fec0 20 20 20 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69     uplevel 1 [li
1fed0 73 74 20 6c 6f 61 64 53 51 4c 69 74 65 54 65 73  st loadSQLiteTes
1fee0 74 53 65 74 74 69 6e 67 73 20 24 3a 3a 74 65 73  tSettings $::tes
1fef0 74 5f 63 68 61 6e 6e 65 6c 20 2e 62 65 66 6f 72  t_channel .befor
1ff00 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d  e]....        #.
1ff10 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
1ff20 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 5b 6f   Check if the [o
1ff30 62 6a 65 63 74 5d 20 63 6f 6d 6d 61 6e 64 20 69  bject] command i
1ff40 73 20 61 76 61 69 6c 61 62 6c 65 3b 20 69 66 20  s available; if 
1ff50 6e 6f 74 2c 20 61 64 64 20 73 6f 6d 65 0d 0a 20  not, add some.. 
1ff60 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73         #       s
1ff70 68 69 6d 73 20 74 6f 20 6d 61 6b 65 20 74 68 65  hims to make the
1ff80 20 74 65 73 74 20 73 75 69 74 65 20 72 75 6e 20   test suite run 
1ff90 73 6d 6f 6f 74 68 65 72 2e 0d 0a 20 20 20 20 20  smoother...     
1ffa0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 63 68     #..        ch
1ffb0 65 63 6b 46 6f 72 53 51 4c 69 74 65 4f 62 6a 65  eckForSQLiteObje
1ffc0 63 74 43 6f 6d 6d 61 6e 64 20 24 3a 3a 74 65 73  ctCommand $::tes
1ffd0 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20  t_channel....   
1ffe0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1fff0 23 20 4e 4f 54 45 3a 20 44 65 74 65 72 6d 69 6e  # NOTE: Determin
20000 65 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 74  e the names of t
20010 68 65 20 6e 61 74 69 76 65 20 70 6c 61 74 66 6f  he native platfo
20020 72 6d 20 61 6e 64 20 61 72 63 68 69 74 65 63 74  rm and architect
20030 75 72 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ure...        #.
20040 0a 20 20 20 20 20 20 20 20 73 65 74 20 70 6c 61  .        set pla
20050 74 66 6f 72 6d 20 5b 67 65 74 42 75 69 6c 64 50  tform [getBuildP
20060 6c 61 74 66 6f 72 6d 20 74 72 75 65 5d 0d 0a 20  latform true].. 
20070 20 20 20 20 20 20 20 73 65 74 20 61 72 63 68 69         set archi
20080 74 65 63 74 75 72 65 20 5b 61 72 63 68 69 74 65  tecture [archite
20090 63 74 75 72 65 46 6f 72 50 6c 61 74 66 6f 72 6d  ctureForPlatform
200a0 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a 0d 0a 20   $platform].... 
200b0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
200c0 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20 74    # NOTE: Show t
200d0 68 65 20 70 6c 61 74 66 6f 72 6d 20 61 6e 64 20  he platform and 
200e0 61 72 63 68 69 74 65 63 74 75 72 65 20 75 73 65  architecture use
200f0 64 20 74 6f 20 68 65 6c 70 20 6c 6f 63 61 74 65  d to help locate
20100 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20   the..        # 
20110 20 20 20 20 20 20 6e 61 74 69 76 65 20 62 75 69        native bui
20120 6c 64 20 66 69 6c 65 73 2e 0d 0a 20 20 20 20 20  ld files...     
20130 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70     #..        tp
20140 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
20150 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
20160 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  \..            "
20170 2d 2d 2d 2d 20 70 6c 61 74 66 6f 72 6d 20 66 6f  ---- platform fo
20180 72 20 6c 6f 63 61 74 69 6e 67 20 6e 61 74 69 76  r locating nativ
20190 65 20 62 75 69 6c 64 20 66 69 6c 65 73 20 69 73  e build files is
201a0 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20   \"" \..        
201b0 20 20 20 20 24 70 6c 61 74 66 6f 72 6d 20 5c 22      $platform \"
201c0 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74  \n]....        t
201d0 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
201e0 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
201f0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
20200 22 2d 2d 2d 2d 20 61 72 63 68 69 74 65 63 74 75  "---- architectu
20210 72 65 20 66 6f 72 20 6c 6f 63 61 74 69 6e 67 20  re for locating 
20220 6e 61 74 69 76 65 20 62 75 69 6c 64 20 66 69 6c  native build fil
20230 65 73 20 69 73 20 5c 22 22 20 5c 0d 0a 20 20 20  es is \"" \..   
20240 20 20 20 20 20 20 20 20 20 24 61 72 63 68 69 74           $archit
20250 65 63 74 75 72 65 20 5c 22 5c 6e 5d 0d 0a 0d 0a  ecture \"\n]....
20260 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
20270 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64     # NOTE: Build
20280 20 61 20 6c 69 73 74 20 6f 66 20 63 6f 6e 66 69   a list of confi
20290 67 75 72 61 74 69 6f 6e 20 66 69 6c 65 73 20 74  guration files t
202a0 68 61 74 20 77 65 20 68 61 6e 64 6c 65 2e 0d 0a  hat we handle...
202b0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
202c0 20 20 20 73 65 74 20 63 6f 6e 66 69 67 46 69 6c     set configFil
202d0 65 4e 61 6d 65 73 20 5b 6c 69 73 74 20 5c 0d 0a  eNames [list \..
202e0 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74              Syst
202f0 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64  em.Data.SQLite.d
20300 6c 6c 2e 63 6f 6e 66 69 67 5d 0d 0a 0d 0a 20 20  ll.config]....  
20310 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
20320 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20 61   # NOTE: Build a
20330 20 6c 69 73 74 20 6f 66 20 61 75 78 69 6c 69 61   list of auxilia
20340 72 79 20 4d 61 6e 61 67 65 64 20 44 65 62 75 67  ry Managed Debug
20350 67 69 6e 67 20 41 73 73 69 73 74 61 6e 74 73 20  ging Assistants 
20360 28 4d 44 41 29 0d 0a 20 20 20 20 20 20 20 20 23  (MDA)..        #
20370 20 20 20 20 20 20 20 63 6f 6e 66 69 67 75 72 61         configura
20380 74 69 6f 6e 20 66 69 6c 65 73 20 74 68 61 74 20  tion files that 
20390 77 65 20 68 61 6e 64 6c 65 2e 0d 0a 20 20 20 20  we handle...    
203a0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73      #..        s
203b0 65 74 20 6d 64 61 43 6f 6e 66 69 67 46 69 6c 65  et mdaConfigFile
203c0 4e 61 6d 65 73 20 5b 6c 69 73 74 20 5c 0d 0a 20  Names [list \.. 
203d0 20 20 20 20 20 20 20 20 20 20 20 45 61 67 6c 65             Eagle
203e0 53 68 65 6c 6c 33 32 2e 65 78 65 2e 6d 64 61 2e  Shell32.exe.mda.
203f0 63 6f 6e 66 69 67 20 49 6e 73 74 61 6c 6c 65 72  config Installer
20400 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e 66 69 67 20  .exe.mda.config 
20410 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  \..            t
20420 65 73 74 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e 66  est.exe.mda.conf
20430 69 67 20 74 65 73 74 6c 69 6e 71 2e 65 78 65 2e  ig testlinq.exe.
20440 6d 64 61 2e 63 6f 6e 66 69 67 20 5c 0d 0a 20 20  mda.config \..  
20450 20 20 20 20 20 20 20 20 20 20 74 65 73 74 65 66            testef
20460 36 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e 66 69 67  6.exe.mda.config
20470 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ]....        #..
20480 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
20490 42 75 69 6c 64 20 74 68 65 20 6c 69 73 74 20 6f  Build the list o
204a0 66 20 65 78 74 65 72 6e 61 6c 20 66 69 6c 65 73  f external files
204b0 20 74 68 61 74 20 77 65 20 68 61 6e 64 6c 65 2e   that we handle.
204c0 20 20 53 6f 6d 65 20 6f 66 0d 0a 20 20 20 20 20    Some of..     
204d0 20 20 20 23 20 20 20 20 20 20 20 74 68 65 73 65     #       these
204e0 20 66 69 6c 65 73 20 6d 61 79 20 62 65 20 6e 61   files may be na
204f0 74 69 76 65 20 61 6e 64 2f 6f 72 20 6d 61 6e 61  tive and/or mana
20500 67 65 64 20 61 73 73 65 6d 62 6c 69 65 73 20 74  ged assemblies t
20510 68 61 74 20 61 72 65 0d 0a 20 20 20 20 20 20 20  hat are..       
20520 20 23 20 20 20 20 20 20 20 72 65 71 75 69 72 65   #       require
20530 64 20 74 6f 20 70 65 72 66 6f 72 6d 20 76 61 72  d to perform var
20540 69 6f 75 73 20 74 65 73 74 73 2e 0d 0a 20 20 20  ious tests...   
20550 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
20560 73 65 74 20 65 78 74 65 72 6e 61 6c 46 69 6c 65  set externalFile
20570 4e 61 6d 65 73 20 5b 6c 69 73 74 20 5c 0d 0a 20  Names [list \.. 
20580 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65             [file
20590 20 6a 6f 69 6e 20 45 6e 74 69 74 79 46 72 61 6d   join EntityFram
205a0 65 77 6f 72 6b 20 6c 69 62 20 5b 73 74 72 69 6e  ework lib [strin
205b0 67 20 6d 61 70 20 5b 6c 69 73 74 20 46 78 20 22  g map [list Fx "
205c0 22 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  "] \..          
205d0 20 20 5b 73 74 72 69 6e 67 20 6d 61 70 20 5b 6c    [string map [l
205e0 69 73 74 20 6e 65 74 46 78 34 35 31 20 6e 65 74  ist netFx451 net
205f0 46 78 34 35 20 6e 65 74 46 78 34 35 32 20 6e 65  Fx45 netFx452 ne
20600 74 46 78 34 35 20 6e 65 74 46 78 34 36 20 5c 0d  tFx45 netFx46 \.
20610 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 74  .            net
20620 46 78 34 35 20 6e 65 74 46 78 34 36 31 20 6e 65  Fx45 netFx461 ne
20630 74 46 78 34 35 20 6e 65 74 46 78 34 36 32 20 6e  tFx45 netFx462 n
20640 65 74 46 78 34 35 5d 20 5b 67 65 74 42 75 69 6c  etFx45] [getBuil
20650 64 4e 65 74 46 78 5d 5d 5d 20 5c 0d 0a 20 20 20  dNetFx]]] \..   
20660 20 20 20 20 20 20 20 20 20 45 6e 74 69 74 79 46           EntityF
20670 72 61 6d 65 77 6f 72 6b 2e 64 6c 6c 5d 5d 0d 0a  ramework.dll]]..
20680 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
20690 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69       # NOTE: Bui
206a0 6c 64 20 74 68 65 20 6c 69 73 74 20 6f 66 20 6e  ld the list of n
206b0 61 74 69 76 65 20 61 73 73 65 6d 62 6c 79 20 66  ative assembly f
206c0 69 6c 65 73 20 74 68 61 74 20 77 65 20 68 61 6e  iles that we han
206d0 64 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  dle...        #.
206e0 0a 20 20 20 20 20 20 20 20 73 65 74 20 6e 61 74  .        set nat
206f0 69 76 65 46 69 6c 65 4e 61 6d 65 73 20 5b 6c 69  iveFileNames [li
20700 73 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 65  st]....        e
20710 76 61 6c 20 6c 61 70 70 65 6e 64 20 6e 61 74 69  val lappend nati
20720 76 65 46 69 6c 65 4e 61 6d 65 73 20 5b 67 65 74  veFileNames [get
20730 4e 61 74 69 76 65 4c 69 62 72 61 72 79 46 69 6c  NativeLibraryFil
20740 65 4e 61 6d 65 73 4f 6e 6c 79 5d 0d 0a 20 20 20  eNamesOnly]..   
20750 20 20 20 20 20 65 76 61 6c 20 6c 61 70 70 65 6e       eval lappen
20760 64 20 6e 61 74 69 76 65 46 69 6c 65 4e 61 6d 65  d nativeFileName
20770 73 20 5b 67 65 74 49 6e 74 65 72 6f 70 41 73 73  s [getInteropAss
20780 65 6d 62 6c 79 46 69 6c 65 4e 61 6d 65 73 4f 6e  emblyFileNamesOn
20790 6c 79 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23  ly]....        #
207a0 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
207b0 3a 20 42 75 69 6c 64 20 74 68 65 20 6c 69 73 74  : Build the list
207c0 20 6f 66 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61   of mixed-mode a
207d0 73 73 65 6d 62 6c 79 20 66 69 6c 65 73 20 74 68  ssembly files th
207e0 61 74 20 77 65 20 68 61 6e 64 6c 65 2e 0d 0a 20  at we handle... 
207f0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
20800 20 20 73 65 74 20 6d 69 78 65 64 46 69 6c 65 4e    set mixedFileN
20810 61 6d 65 73 20 5b 6c 69 73 74 5d 0d 0a 0d 0a 20  ames [list].... 
20820 20 20 20 20 20 20 20 69 66 20 7b 5b 68 61 73 52         if {[hasR
20830 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 6e 61 74  untimeOption nat
20840 69 76 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ive]} then {..  
20850 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20          lappend 
20860 6d 69 78 65 64 46 69 6c 65 4e 61 6d 65 73 20 53  mixedFileNames S
20870 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
20880 65 2e 64 6c 6c 0d 0a 20 20 20 20 20 20 20 20 7d  e.dll..        }
20890 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
208a0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42         # NOTE: B
208b0 75 69 6c 64 20 74 68 65 20 6c 69 73 74 20 6f 66  uild the list of
208c0 20 6d 61 6e 61 67 65 64 20 61 73 73 65 6d 62 6c   managed assembl
208d0 79 20 66 69 6c 65 73 20 74 68 61 74 20 77 65 20  y files that we 
208e0 68 61 6e 64 6c 65 2e 0d 0a 20 20 20 20 20 20 20  handle...       
208f0 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   #..        set 
20900 6d 61 6e 61 67 65 64 46 69 6c 65 4e 61 6d 65 73  managedFileNames
20910 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20   [list \..      
20920 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74        System.Dat
20930 61 2e 53 51 4c 69 74 65 2e 4c 69 6e 71 2e 64 6c  a.SQLite.Linq.dl
20940 6c 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  l System.Data.SQ
20950 4c 69 74 65 2e 45 46 36 2e 64 6c 6c 5d 0d 0a 0d  Lite.EF6.dll]...
20960 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68  .        if {![h
20970 61 73 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20  asRuntimeOption 
20980 6e 61 74 69 76 65 5d 7d 20 74 68 65 6e 20 7b 0d  native]} then {.
20990 0a 20 20 20 20 20 20 20 20 20 20 6c 61 70 70 65  .          lappe
209a0 6e 64 20 6d 61 6e 61 67 65 64 46 69 6c 65 4e 61  nd managedFileNa
209b0 6d 65 73 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  mes System.Data.
209c0 53 51 4c 69 74 65 2e 64 6c 6c 0d 0a 20 20 20 20  SQLite.dll..    
209d0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
209e0 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
209f0 54 45 3a 20 53 68 6f 77 20 74 68 65 20 76 61 72  TE: Show the var
20a00 69 6f 75 73 20 6c 69 73 74 73 20 6f 66 20 66 69  ious lists of fi
20a10 6c 65 20 6e 61 6d 65 73 20 74 68 61 74 20 61 72  le names that ar
20a20 65 20 68 61 6e 64 6c 65 64 20 62 79 20 74 68 69  e handled by thi
20a30 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  s..        #    
20a40 20 20 20 70 72 6f 63 65 64 75 72 65 2e 0d 0a 20     procedure... 
20a50 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
20a60 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
20a70 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
20a80 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
20a90 20 20 20 22 2d 2d 2d 2d 20 6c 69 73 74 20 6f 66     "---- list of
20aa0 20 5c 22 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e   \"configuration
20ab0 5c 22 20 66 69 6c 65 20 6e 61 6d 65 73 20 69 73  \" file names is
20ac0 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  : " \..         
20ad0 20 20 20 24 63 6f 6e 66 69 67 46 69 6c 65 4e 61     $configFileNa
20ae0 6d 65 73 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20  mes \n]....     
20af0 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
20b00 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
20b10 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
20b20 20 20 20 20 22 2d 2d 2d 2d 20 6c 69 73 74 20 6f      "---- list o
20b30 66 20 5c 22 4d 44 41 20 63 6f 6e 66 69 67 75 72  f \"MDA configur
20b40 61 74 69 6f 6e 5c 22 20 66 69 6c 65 20 6e 61 6d  ation\" file nam
20b50 65 73 20 69 73 3a 20 22 20 5c 0d 0a 20 20 20 20  es is: " \..    
20b60 20 20 20 20 20 20 20 20 24 6d 64 61 43 6f 6e 66          $mdaConf
20b70 69 67 46 69 6c 65 4e 61 6d 65 73 20 5c 6e 5d 0d  igFileNames \n].
20b80 0a 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  ...        tputs
20b90 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
20ba0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
20bb0 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
20bc0 2d 20 6c 69 73 74 20 6f 66 20 5c 22 65 78 74 65  - list of \"exte
20bd0 72 6e 61 6c 5c 22 20 66 69 6c 65 20 6e 61 6d 65  rnal\" file name
20be0 73 20 69 73 3a 20 22 20 24 65 78 74 65 72 6e 61  s is: " $externa
20bf0 6c 46 69 6c 65 4e 61 6d 65 73 20 5c 6e 5d 0d 0a  lFileNames \n]..
20c00 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
20c10 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
20c20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
20c30 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
20c40 20 6c 69 73 74 20 6f 66 20 5c 22 6e 61 74 69 76   list of \"nativ
20c50 65 5c 22 20 66 69 6c 65 20 6e 61 6d 65 73 20 69  e\" file names i
20c60 73 3a 20 22 20 24 6e 61 74 69 76 65 46 69 6c 65  s: " $nativeFile
20c70 4e 61 6d 65 73 20 5c 6e 5d 0d 0a 0d 0a 20 20 20  Names \n]....   
20c80 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
20c90 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
20ca0 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
20cb0 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6c 69 73 74        "---- list
20cc0 20 6f 66 20 5c 22 6d 69 78 65 64 5c 22 20 66 69   of \"mixed\" fi
20cd0 6c 65 20 6e 61 6d 65 73 20 69 73 3a 20 22 20 24  le names is: " $
20ce0 6d 69 78 65 64 46 69 6c 65 4e 61 6d 65 73 20 5c  mixedFileNames \
20cf0 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 70  n]....        tp
20d00 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
20d10 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
20d20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  \..            "
20d30 2d 2d 2d 2d 20 6c 69 73 74 20 6f 66 20 5c 22 6d  ---- list of \"m
20d40 61 6e 61 67 65 64 5c 22 20 66 69 6c 65 20 6e 61  anaged\" file na
20d50 6d 65 73 20 69 73 3a 20 22 20 24 6d 61 6e 61 67  mes is: " $manag
20d60 65 64 46 69 6c 65 4e 61 6d 65 73 20 5c 6e 5d 0d  edFileNames \n].
20d70 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
20d80 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65        # NOTE: Re
20d90 6d 6f 76 65 20 61 6e 79 20 74 65 73 74 20 63 6f  move any test co
20da0 6e 73 74 72 61 69 6e 74 73 20 74 68 61 74 20 72  nstraints that r
20db0 65 66 65 72 20 74 6f 20 74 68 65 20 6e 61 74 69  efer to the nati
20dc0 76 65 20 61 6e 64 2f 6f 72 0d 0a 20 20 20 20 20  ve and/or..     
20dd0 20 20 20 23 20 20 20 20 20 20 20 6d 61 6e 61 67     #       manag
20de0 65 64 20 61 73 73 65 6d 62 6c 79 20 66 69 6c 65  ed assembly file
20df0 73 20 74 68 61 74 20 77 65 20 68 61 6e 64 6c 65  s that we handle
20e00 20 75 6e 6c 65 73 73 20 66 6f 72 62 69 64 64 65   unless forbidde
20e10 6e 20 66 72 6f 6d 0d 0a 20 20 20 20 20 20 20 20  n from..        
20e20 23 20 20 20 20 20 20 20 64 6f 69 6e 67 20 73 6f  #       doing so
20e30 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
20e40 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
20e50 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 73 71 6c   exists ::no(sql
20e60 69 74 65 52 65 6d 6f 76 65 43 6f 6e 73 74 72 61  iteRemoveConstra
20e70 69 6e 74 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  ints)]} then {..
20e80 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63            foreac
20e90 68 20 66 69 6c 65 4e 61 6d 65 20 24 63 6f 6e 66  h fileName $conf
20ea0 69 67 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20  igFileNames {.. 
20eb0 20 20 20 20 20 20 20 20 20 20 20 72 65 6d 6f 76             remov
20ec0 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70  eConstraint [app
20ed0 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 24 66  endArgs file_ $f
20ee0 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20  ileName]..      
20ef0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
20f00 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e     foreach fileN
20f10 61 6d 65 20 24 6d 64 61 43 6f 6e 66 69 67 46 69  ame $mdaConfigFi
20f20 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20  leNames {..     
20f30 20 20 20 20 20 20 20 72 65 6d 6f 76 65 43 6f 6e         removeCon
20f40 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41  straint [appendA
20f50 72 67 73 20 66 69 6c 65 5f 20 24 66 69 6c 65 4e  rgs file_ $fileN
20f60 61 6d 65 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  ame]..          
20f70 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 66  }....          f
20f80 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20  oreach fileName 
20f90 24 65 78 74 65 72 6e 61 6c 46 69 6c 65 4e 61 6d  $externalFileNam
20fa0 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  es {..          
20fb0 20 20 72 65 6d 6f 76 65 43 6f 6e 73 74 72 61 69    removeConstrai
20fc0 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66  nt [appendArgs f
20fd0 69 6c 65 5f 20 5b 66 69 6c 65 20 74 61 69 6c 20  ile_ [file tail 
20fe0 24 66 69 6c 65 4e 61 6d 65 5d 5d 0d 0a 20 20 20  $fileName]]..   
20ff0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
21000 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69        foreach fi
21010 6c 65 4e 61 6d 65 20 24 6e 61 74 69 76 65 46 69  leName $nativeFi
21020 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20  leNames {..     
21030 20 20 20 20 20 20 20 72 65 6d 6f 76 65 43 6f 6e         removeCon
21040 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41  straint [appendA
21050 72 67 73 20 66 69 6c 65 5f 20 24 66 69 6c 65 4e  rgs file_ $fileN
21060 61 6d 65 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  ame]..          
21070 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 66  }....          f
21080 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20  oreach fileName 
21090 24 6d 69 78 65 64 46 69 6c 65 4e 61 6d 65 73 20  $mixedFileNames 
210a0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  {..            r
210b0 65 6d 6f 76 65 43 6f 6e 73 74 72 61 69 6e 74 20  emoveConstraint 
210c0 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65  [appendArgs file
210d0 5f 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20  _ $fileName]..  
210e0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
210f0 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66         foreach f
21100 69 6c 65 4e 61 6d 65 20 24 6d 61 6e 61 67 65 64  ileName $managed
21110 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20  FileNames {..   
21120 20 20 20 20 20 20 20 20 20 72 65 6d 6f 76 65 43           removeC
21130 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e  onstraint [appen
21140 64 41 72 67 73 20 66 69 6c 65 5f 20 24 66 69 6c  dArgs file_ $fil
21150 65 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20 20 20  eName]..        
21160 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
21170 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
21180 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69       # NOTE: Ski
21190 70 20 61 6c 6c 20 53 79 73 74 65 6d 2e 44 61 74  p all System.Dat
211a0 61 2e 53 51 4c 69 74 65 20 72 65 6c 61 74 65 64  a.SQLite related
211b0 20 66 69 6c 65 20 68 61 6e 64 6c 69 6e 67 20 28   file handling (
211c0 64 65 6c 65 74 69 6e 67 2c 0d 0a 20 20 20 20 20  deleting,..     
211d0 20 20 20 23 20 20 20 20 20 20 20 63 6f 70 79 69     #       copyi
211e0 6e 67 2c 20 61 6e 64 20 6c 6f 61 64 69 6e 67 29  ng, and loading)
211f0 20 69 66 20 69 6e 73 74 72 75 63 74 65 64 2e 0d   if instructed..
21200 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
21210 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
21220 78 69 73 74 73 20 3a 3a 6e 6f 28 73 71 6c 69 74  xists ::no(sqlit
21230 65 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b  eFiles)]} then {
21240 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
21250 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
21260 20 53 6b 69 70 20 74 72 79 69 6e 67 20 74 6f 20   Skip trying to 
21270 64 65 6c 65 74 65 20 61 6e 79 20 66 69 6c 65 73  delete any files
21280 20 69 66 20 69 6e 73 74 72 75 63 74 65 64 2e 0d   if instructed..
21290 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
212a0 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
212b0 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64  fo exists ::no(d
212c0 65 6c 65 74 65 53 71 6c 69 74 65 46 69 6c 65 73  eleteSqliteFiles
212d0 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
212e0 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
212f0 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64  fo exists ::no(d
21300 65 6c 65 74 65 53 71 6c 69 74 65 43 6f 6e 66 69  eleteSqliteConfi
21310 67 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b  gFiles)]} then {
21320 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
21330 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65  foreach fileName
21340 20 24 63 6f 6e 66 69 67 46 69 6c 65 4e 61 6d 65   $configFileName
21350 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s {..           
21360 20 20 20 20 20 74 72 79 44 65 6c 65 74 65 42 69       tryDeleteBi
21370 6e 61 72 79 46 69 6c 65 20 24 66 69 6c 65 4e 61  naryFile $fileNa
21380 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  me..            
21390 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
213a0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
213b0 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
213c0 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53  sts ::no(deleteS
213d0 71 6c 69 74 65 45 78 74 65 72 6e 61 6c 46 69 6c  qliteExternalFil
213e0 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  es)]} then {..  
213f0 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65              fore
21400 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6d 64  ach fileName $md
21410 61 43 6f 6e 66 69 67 46 69 6c 65 4e 61 6d 65 73  aConfigFileNames
21420 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
21430 20 20 20 20 74 72 79 44 65 6c 65 74 65 42 75 69      tryDeleteBui
21440 6c 64 46 69 6c 65 20 24 66 69 6c 65 4e 61 6d 65  ldFile $fileName
21450 20 66 61 6c 73 65 0d 0a 20 20 20 20 20 20 20 20   false..        
21460 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
21470 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
21480 20 66 69 6c 65 4e 61 6d 65 20 24 65 78 74 65 72   fileName $exter
21490 6e 61 6c 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a  nalFileNames {..
214a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
214b0 74 72 79 44 65 6c 65 74 65 42 69 6e 61 72 79 46  tryDeleteBinaryF
214c0 69 6c 65 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20  ile $fileName.. 
214d0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
214e0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
214f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
21500 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
21510 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69 74 65  :no(deleteSqlite
21520 4e 61 74 69 76 65 46 69 6c 65 73 29 5d 7d 20 74  NativeFiles)]} t
21530 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
21540 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
21550 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65  exists ::no(dele
21560 74 65 53 71 6c 69 74 65 49 6d 70 6c 69 63 69 74  teSqliteImplicit
21570 4e 61 74 69 76 65 46 69 6c 65 73 29 5d 7d 20 74  NativeFiles)]} t
21580 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
21590 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66         foreach f
215a0 69 6c 65 4e 61 6d 65 20 24 6e 61 74 69 76 65 46  ileName $nativeF
215b0 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20  ileNames {..    
215c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72                tr
215d0 79 44 65 6c 65 74 65 41 73 73 65 6d 62 6c 79 20  yDeleteAssembly 
215e0 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20  $fileName..     
215f0 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
21600 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
21610 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
21620 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
21630 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69   ::no(deleteSqli
21640 74 65 4e 6f 6e 49 6d 70 6c 69 63 69 74 46 69 6c  teNonImplicitFil
21650 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  es)]} then {..  
21660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
21670 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
21680 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69 74  ::no(deleteSqlit
21690 65 50 6c 61 74 66 6f 72 6d 46 69 6c 65 73 29 5d  ePlatformFiles)]
216a0 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
216b0 20 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69             [stri
216c0 6e 67 20 6c 65 6e 67 74 68 20 24 70 6c 61 74 66  ng length $platf
216d0 6f 72 6d 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  orm] > 0} then {
216e0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
216f0 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65      foreach file
21700 4e 61 6d 65 20 24 6e 61 74 69 76 65 46 69 6c 65  Name $nativeFile
21710 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20  Names {..       
21720 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79               try
21730 44 65 6c 65 74 65 41 73 73 65 6d 62 6c 79 20 24  DeleteAssembly $
21740 66 69 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f  fileName $platfo
21750 72 6d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  rm..            
21760 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
21770 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
21780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
21790 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
217a0 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69 74  ::no(deleteSqlit
217b0 65 41 72 63 68 69 74 65 63 74 75 72 65 46 69 6c  eArchitectureFil
217c0 65 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  es)] && \..     
217d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b                 [
217e0 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 61  string length $a
217f0 72 63 68 69 74 65 63 74 75 72 65 5d 20 3e 20 30  rchitecture] > 0
21800 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
21810 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65              fore
21820 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6e 61  ach fileName $na
21830 74 69 76 65 46 69 6c 65 4e 61 6d 65 73 20 7b 0d  tiveFileNames {.
21840 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21850 20 20 20 20 20 74 72 79 44 65 6c 65 74 65 41 73       tryDeleteAs
21860 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61 6d 65  sembly $fileName
21870 20 24 61 72 63 68 69 74 65 63 74 75 72 65 0d 0a   $architecture..
21880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21890 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
218a0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
218b0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
218c0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
218d0 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
218e0 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c   exists ::no(del
218f0 65 74 65 53 71 6c 69 74 65 4d 69 78 65 64 46 69  eteSqliteMixedFi
21900 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  les)]} then {.. 
21910 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a               #..
21920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
21930 4e 4f 54 45 3a 20 49 66 20 74 68 65 20 22 6e 61  NOTE: If the "na
21940 74 69 76 65 22 20 72 75 6e 74 69 6d 65 20 6f 70  tive" runtime op
21950 74 69 6f 6e 20 69 73 20 73 65 74 2c 20 64 65 6c  tion is set, del
21960 65 74 65 20 69 6d 70 6c 69 63 69 74 0d 0a 20 20  ete implicit..  
21970 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20              #   
21980 20 20 20 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61      mixed-mode a
21990 73 73 65 6d 62 6c 79 20 66 69 6c 65 73 20 61 73  ssembly files as
219a0 20 77 65 6c 6c 2e 20 20 54 68 69 73 20 72 75 6e   well.  This run
219b0 74 69 6d 65 20 6f 70 74 69 6f 6e 0d 0a 20 20 20  time option..   
219c0 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20             #    
219d0 20 20 20 63 68 65 63 6b 20 69 73 20 68 61 6e 64     check is hand
219e0 6c 65 64 20 77 68 65 6e 20 62 75 69 6c 64 69 6e  led when buildin
219f0 67 20 74 68 65 20 6c 69 73 74 20 6f 66 20 6d 69  g the list of mi
21a00 78 65 64 2d 6d 6f 64 65 0d 0a 20 20 20 20 20 20  xed-mode..      
21a10 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
21a20 61 73 73 65 6d 62 6c 79 20 66 69 6c 65 20 6e 61  assembly file na
21a30 6d 65 73 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  mes...          
21a40 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
21a50 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
21a60 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65  exists ::no(dele
21a70 74 65 53 71 6c 69 74 65 49 6d 70 6c 69 63 69 74  teSqliteImplicit
21a80 4d 69 78 65 64 46 69 6c 65 73 29 5d 7d 20 74 68  MixedFiles)]} th
21a90 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
21aa0 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69        foreach fi
21ab0 6c 65 4e 61 6d 65 20 24 6d 69 78 65 64 46 69 6c  leName $mixedFil
21ac0 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20  eNames {..      
21ad0 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79 44              tryD
21ae0 65 6c 65 74 65 41 73 73 65 6d 62 6c 79 20 24 66  eleteAssembly $f
21af0 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20  ileName..       
21b00 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
21b10 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
21b20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
21b30 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
21b40 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69 74 65  :no(deleteSqlite
21b50 4e 6f 6e 49 6d 70 6c 69 63 69 74 46 69 6c 65 73  NonImplicitFiles
21b60 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
21b70 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
21b80 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
21b90 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69 74 65 50  no(deleteSqliteP
21ba0 6c 61 74 66 6f 72 6d 46 69 6c 65 73 29 5d 20 26  latformFiles)] &
21bb0 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  & \..           
21bc0 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67           [string
21bd0 20 6c 65 6e 67 74 68 20 24 70 6c 61 74 66 6f 72   length $platfor
21be0 6d 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  m] > 0} then {..
21bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21c00 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61    foreach fileNa
21c10 6d 65 20 24 6d 69 78 65 64 46 69 6c 65 4e 61 6d  me $mixedFileNam
21c20 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  es {..          
21c30 20 20 20 20 20 20 20 20 20 20 74 72 79 44 65 6c            tryDel
21c40 65 74 65 41 73 73 65 6d 62 6c 79 20 24 66 69 6c  eteAssembly $fil
21c50 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 0d  eName $platform.
21c60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21c70 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
21c80 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
21c90 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
21ca0 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
21cb0 6f 28 64 65 6c 65 74 65 53 71 6c 69 74 65 41 72  o(deleteSqliteAr
21cc0 63 68 69 74 65 63 74 75 72 65 46 69 6c 65 73 29  chitectureFiles)
21cd0 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
21ce0 20 20 20 20 20 20 20 20 20 20 20 20 5b 73 74 72              [str
21cf0 69 6e 67 20 6c 65 6e 67 74 68 20 24 61 72 63 68  ing length $arch
21d00 69 74 65 63 74 75 72 65 5d 20 3e 20 30 7d 20 74  itecture] > 0} t
21d10 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
21d20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
21d30 20 66 69 6c 65 4e 61 6d 65 20 24 6d 69 78 65 64   fileName $mixed
21d40 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20  FileNames {..   
21d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21d60 20 74 72 79 44 65 6c 65 74 65 41 73 73 65 6d 62   tryDeleteAssemb
21d70 6c 79 20 24 66 69 6c 65 4e 61 6d 65 20 24 61 72  ly $fileName $ar
21d80 63 68 69 74 65 63 74 75 72 65 0d 0a 20 20 20 20  chitecture..    
21d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
21da0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21db0 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
21dc0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
21dd0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
21de0 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
21df0 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53  sts ::no(deleteS
21e00 71 6c 69 74 65 4d 61 6e 61 67 65 64 46 69 6c 65  qliteManagedFile
21e10 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  s)]} then {..   
21e20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61             forea
21e30 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6d 61 6e  ch fileName $man
21e40 61 67 65 64 46 69 6c 65 4e 61 6d 65 73 20 7b 0d  agedFileNames {.
21e50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21e60 20 74 72 79 44 65 6c 65 74 65 41 73 73 65 6d 62   tryDeleteAssemb
21e70 6c 79 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20  ly $fileName..  
21e80 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
21e90 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
21ea0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
21eb0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
21ec0 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63      # NOTE: Chec
21ed0 6b 20 66 6f 72 20 74 68 65 20 22 61 75 74 6f 53  k for the "autoS
21ee0 65 6c 65 63 74 22 20 72 75 6e 74 69 6d 65 20 6f  elect" runtime o
21ef0 70 74 69 6f 6e 2e 20 20 49 66 20 70 72 65 73 65  ption.  If prese
21f00 6e 74 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 23  nt,..          #
21f10 20 20 20 20 20 20 20 61 74 74 65 6d 70 74 20 74         attempt t
21f20 6f 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  o automatically 
21f30 73 65 6c 65 63 74 20 74 68 65 20 66 69 72 73 74  select the first
21f40 20 61 76 61 69 6c 61 62 6c 65 0d 0a 20 20 20 20   available..    
21f50 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62 75        #       bu
21f60 69 6c 64 20 28 6f 72 20 22 72 65 6c 65 61 73 65  ild (or "release
21f70 22 29 20 6f 66 20 53 51 4c 69 74 65 20 61 6e 64  ") of SQLite and
21f80 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
21f90 69 74 65 0d 0a 20 20 20 20 20 20 20 20 20 20 23  ite..          #
21fa0 20 20 20 20 20 20 20 66 6f 72 20 75 73 65 20 77         for use w
21fb0 69 74 68 20 74 68 65 20 74 65 73 74 20 73 75 69  ith the test sui
21fc0 74 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  te...          #
21fd0 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
21fe0 5b 68 61 73 52 75 6e 74 69 6d 65 4f 70 74 69 6f  [hasRuntimeOptio
21ff0 6e 20 61 75 74 6f 53 65 6c 65 63 74 5d 7d 20 74  n autoSelect]} t
22000 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
22010 20 20 20 69 66 20 7b 21 5b 63 68 65 63 6b 46 6f     if {![checkFo
22020 72 53 51 4c 69 74 65 42 75 69 6c 64 73 20 24 3a  rSQLiteBuilds $:
22030 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 74 72  :test_channel tr
22040 75 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ue]} then {..   
22050 20 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b             check
22060 46 6f 72 53 51 4c 69 74 65 52 65 6c 65 61 73 65  ForSQLiteRelease
22070 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
22080 6c 20 74 72 75 65 0d 0a 20 20 20 20 20 20 20 20  l true..        
22090 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
220a0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
220b0 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e  #..          # N
220c0 4f 54 45 3a 20 53 6b 69 70 20 74 72 79 69 6e 67  OTE: Skip trying
220d0 20 74 6f 20 76 65 72 69 66 79 20 74 68 65 20 62   to verify the b
220e0 75 69 6c 64 20 64 69 72 65 63 74 6f 72 79 20 69  uild directory i
220f0 66 20 69 6e 73 74 72 75 63 74 65 64 3b 0d 0a 20  f instructed;.. 
22100 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
22110 20 6f 74 68 65 72 77 69 73 65 2c 20 6d 61 6b 65   otherwise, make
22120 20 73 75 72 65 20 69 74 20 61 63 74 75 61 6c 6c   sure it actuall
22130 79 20 65 78 69 73 74 73 20 6f 72 20 68 61 6c 74  y exists or halt
22140 20 74 68 65 20 65 6e 74 69 72 65 0d 0a 20 20 20   the entire..   
22150 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74         #       t
22160 65 73 74 69 6e 67 20 70 72 6f 63 65 73 73 20 69  esting process i
22170 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78  f it does not ex
22180 69 73 74 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ist...          
22190 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  #..          if 
221a0 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
221b0 3a 6e 6f 28 76 65 72 69 66 79 42 75 69 6c 64 44  :no(verifyBuildD
221c0 69 72 65 63 74 6f 72 79 29 5d 7d 20 74 68 65 6e  irectory)]} then
221d0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
221e0 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  #..            #
221f0 20 4e 4f 54 45 3a 20 41 74 20 74 68 69 73 20 70   NOTE: At this p
22200 6f 69 6e 74 2c 20 74 68 65 20 62 75 69 6c 64 20  oint, the build 
22210 64 69 72 65 63 74 6f 72 79 20 4d 55 53 54 20 65  directory MUST e
22220 78 69 73 74 20 61 73 20 61 0d 0a 20 20 20 20 20  xist as a..     
22230 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 76         #       v
22240 61 6c 69 64 20 64 69 72 65 63 74 6f 72 79 20 66  alid directory f
22250 6f 72 20 74 68 65 20 74 65 73 74 69 6e 67 20 70  or the testing p
22260 72 6f 63 65 73 73 20 74 6f 20 63 6f 6e 74 69 6e  rocess to contin
22270 75 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ue...           
22280 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
22290 73 65 74 20 64 69 72 65 63 74 6f 72 79 20 5b 67  set directory [g
222a0 65 74 42 75 69 6c 64 44 69 72 65 63 74 6f 72 79  etBuildDirectory
222b0 20 66 61 6c 73 65 5d 0d 0a 0d 0a 20 20 20 20 20   false]....     
222c0 20 20 20 20 20 20 20 69 66 20 7b 21 5b 66 69 6c         if {![fil
222d0 65 20 65 78 69 73 74 73 20 24 64 69 72 65 63 74  e exists $direct
222e0 6f 72 79 5d 20 7c 7c 20 5c 0d 0a 20 20 20 20 20  ory] || \..     
222f0 20 20 20 20 20 20 20 20 20 20 20 21 5b 66 69 6c             ![fil
22300 65 20 69 73 64 69 72 65 63 74 6f 72 79 20 24 64  e isdirectory $d
22310 69 72 65 63 74 6f 72 79 5d 7d 20 74 68 65 6e 20  irectory]} then 
22320 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
22330 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
22340 20 20 23 20 4e 4f 54 45 3a 20 4a 75 73 74 20 70    # NOTE: Just p
22350 72 69 6f 72 20 74 6f 20 61 63 74 75 61 6c 6c 79  rior to actually
22360 20 68 61 6c 74 69 6e 67 20 74 68 65 20 74 65 73   halting the tes
22370 74 69 6e 67 20 70 72 6f 63 65 73 73 2c 0d 0a 20  ting process,.. 
22380 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20               #  
22390 20 20 20 20 20 61 64 64 20 61 6e 20 65 72 72 6f       add an erro
223a0 72 20 74 6f 20 74 68 65 20 74 65 73 74 20 6c 6f  r to the test lo
223b0 67 20 66 69 6c 65 2e 0d 0a 20 20 20 20 20 20 20  g file...       
223c0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
223d0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
223e0 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
223f0 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
22400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
22410 2d 2d 2d 2d 20 63 6f 75 6c 64 20 6e 6f 74 20 76  ---- could not v
22420 65 72 69 66 79 20 62 75 69 6c 64 20 64 69 72 65  erify build dire
22430 63 74 6f 72 79 20 5c 22 22 20 24 64 69 72 65 63  ctory \"" $direc
22440 74 6f 72 79 20 5c 0d 0a 20 20 20 20 20 20 20 20  tory \..        
22450 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c 20 61            "\", a
22460 6c 6c 20 74 65 73 74 69 6e 67 20 68 61 6c 74 65  ll testing halte
22470 64 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  d\n"]....       
22480 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
22490 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
224a0 52 61 69 73 69 6e 67 20 61 20 73 63 72 69 70 74  Raising a script
224b0 20 65 72 72 6f 72 20 66 72 6f 6d 20 74 68 69 73   error from this
224c0 20 70 6f 69 6e 74 20 73 68 6f 75 6c 64 20 68 61   point should ha
224d0 6c 74 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  lt..            
224e0 20 20 23 20 20 20 20 20 20 20 74 68 65 20 74 65    #       the te
224f0 73 74 69 6e 67 20 70 72 6f 63 65 73 73 2e 0d 0a  sting process...
22500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
22510 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65  .              e
22520 72 72 6f 72 20 5b 61 70 70 65 6e 64 41 72 67 73  rror [appendArgs
22530 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
22540 20 20 20 20 20 20 22 63 6f 75 6c 64 20 6e 6f 74        "could not
22550 20 76 65 72 69 66 79 20 62 75 69 6c 64 20 64 69   verify build di
22560 72 65 63 74 6f 72 79 20 5c 22 22 20 24 64 69 72  rectory \"" $dir
22570 65 63 74 6f 72 79 20 5c 0d 0a 20 20 20 20 20 20  ectory \..      
22580 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c              "\",
22590 20 61 6c 6c 20 74 65 73 74 69 6e 67 20 68 61 6c   all testing hal
225a0 74 65 64 22 5d 0d 0a 20 20 20 20 20 20 20 20 20  ted"]..         
225b0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
225c0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23  }....          #
225d0 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
225e0 54 45 3a 20 53 6b 69 70 20 74 72 79 69 6e 67 20  TE: Skip trying 
225f0 74 6f 20 63 6f 70 79 20 61 6e 79 20 66 69 6c 65  to copy any file
22600 73 20 69 66 20 69 6e 73 74 72 75 63 74 65 64 2e  s if instructed.
22610 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
22620 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69           if {![i
22630 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
22640 63 6f 70 79 53 71 6c 69 74 65 46 69 6c 65 73 29  copySqliteFiles)
22650 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
22660 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
22670 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f  o exists ::no(co
22680 70 79 53 71 6c 69 74 65 43 6f 6e 66 69 67 46 69  pySqliteConfigFi
22690 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  les)]} then {.. 
226a0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
226b0 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
226c0 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  el \..          
226d0 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6f          "---- co
226e0 70 79 69 6e 67 20 5c 22 63 6f 6e 66 69 67 75 72  pying \"configur
226f0 61 74 69 6f 6e 5c 22 20 66 69 6c 65 73 2e 2e 2e  ation\" files...
22700 5c 6e 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  \n"....         
22710 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c       foreach fil
22720 65 4e 61 6d 65 20 24 63 6f 6e 66 69 67 46 69 6c  eName $configFil
22730 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20  eNames {..      
22740 20 20 20 20 20 20 20 20 20 20 74 72 79 43 6f 70            tryCop
22750 79 42 75 69 6c 64 46 69 6c 65 20 24 66 69 6c 65  yBuildFile $file
22760 4e 61 6d 65 20 66 61 6c 73 65 0d 0a 20 20 20 20  Name false..    
22770 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
22780 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
22790 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
227a0 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
227b0 28 63 6f 70 79 53 71 6c 69 74 65 45 78 74 65 72  (copySqliteExter
227c0 6e 61 6c 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e  nalFiles)]} then
227d0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
227e0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
227f0 20 20 20 23 20 4e 4f 54 45 3a 20 43 6f 70 79 20     # NOTE: Copy 
22800 74 68 65 20 4d 61 6e 61 67 65 64 20 44 65 62 75  the Managed Debu
22810 67 67 69 6e 67 20 41 73 73 69 73 74 61 6e 74 73  gging Assistants
22820 20 28 4d 44 41 29 20 63 6f 6e 66 69 67 75 72 61   (MDA) configura
22830 74 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20 20 20  tion..          
22840 20 20 20 20 23 20 20 20 20 20 20 20 66 69 6c 65      #       file
22850 20 66 6f 72 20 74 68 65 20 45 61 67 6c 65 20 73   for the Eagle s
22860 68 65 6c 6c 20 74 6f 20 74 68 65 20 62 75 69 6c  hell to the buil
22870 64 20 6f 75 74 70 75 74 20 64 69 72 65 63 74 6f  d output directo
22880 72 79 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ry,..           
22890 20 20 20 23 20 20 20 20 20 20 20 77 68 69 6c 65     #       while
228a0 20 75 73 69 6e 67 20 65 61 63 68 20 6f 66 20 74   using each of t
228b0 68 65 20 6e 61 6d 65 73 20 6f 66 20 74 68 65 20  he names of the 
228c0 76 61 72 69 6f 75 73 20 6c 65 67 61 63 79 20 74  various legacy t
228d0 65 73 74 0d 0a 20 20 20 20 20 20 20 20 20 20 20  est..           
228e0 20 20 20 23 20 20 20 20 20 20 20 65 78 65 63 75     #       execu
228f0 74 61 62 6c 65 73 2e 20 20 54 68 69 73 20 77 69  tables.  This wi
22900 6c 6c 20 68 65 6c 70 20 74 6f 20 6d 61 6b 65 20  ll help to make 
22910 73 75 72 65 20 74 68 61 74 20 61 6c 6c 20 74 68  sure that all th
22920 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e..             
22930 20 23 20 20 20 20 20 20 20 6c 65 67 61 63 79 20   #       legacy 
22940 74 65 73 74 73 20 72 75 6e 20 77 69 74 68 20 65  tests run with e
22950 78 61 63 74 6c 79 20 74 68 65 20 73 61 6d 65 20  xactly the same 
22960 73 65 74 20 6f 66 20 4d 61 6e 61 67 65 64 0d 0a  set of Managed..
22970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
22980 20 20 20 20 20 20 44 65 62 75 67 67 69 6e 67 20        Debugging 
22990 41 73 73 69 73 74 61 6e 74 73 20 63 6f 6e 66 69  Assistants confi
229a0 67 75 72 65 64 2e 0d 0a 20 20 20 20 20 20 20 20  gured...        
229b0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
229c0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
229d0 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a  test_channel \..
229e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
229f0 20 20 22 2d 2d 2d 2d 20 63 6f 70 79 69 6e 67 20    "---- copying 
22a00 5c 22 4d 44 41 20 63 6f 6e 66 69 67 75 72 61 74  \"MDA configurat
22a10 69 6f 6e 5c 22 20 66 69 6c 65 73 2e 2e 2e 5c 6e  ion\" files...\n
22a20 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  "....           
22a30 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e     foreach fileN
22a40 61 6d 65 20 24 6d 64 61 43 6f 6e 66 69 67 46 69  ame $mdaConfigFi
22a50 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20  leNames {..     
22a60 20 20 20 20 20 20 20 20 20 20 20 74 72 79 43 6f             tryCo
22a70 70 79 42 69 6e 61 72 79 46 69 6c 65 20 45 61 67  pyBinaryFile Eag
22a80 6c 65 53 68 65 6c 6c 2e 65 78 65 2e 6d 64 61 2e  leShell.exe.mda.
22a90 63 6f 6e 66 69 67 20 74 72 75 65 20 22 22 20 24  config true "" $
22aa0 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20  fileName..      
22ab0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
22ac0 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
22ad0 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f              # NO
22ae0 54 45 3a 20 43 6f 70 79 20 74 68 65 20 65 78 74  TE: Copy the ext
22af0 65 72 6e 61 6c 20 62 69 6e 61 72 69 65 73 2c 20  ernal binaries, 
22b00 69 66 20 61 6e 79 2c 20 74 6f 20 74 68 65 20 64  if any, to the d
22b10 69 72 65 63 74 6f 72 79 20 74 68 61 74 0d 0a 20  irectory that.. 
22b20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20               #  
22b30 20 20 20 20 20 63 6f 6e 74 61 69 6e 73 20 74 68       contains th
22b40 65 20 45 61 67 6c 65 20 73 68 65 6c 6c 2e 20 20  e Eagle shell.  
22b50 54 68 69 73 20 69 73 20 74 79 70 69 63 61 6c 6c  This is typicall
22b60 79 20 75 73 65 64 20 74 6f 20 6d 61 6b 65 0d 0a  y used to make..
22b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
22b80 20 20 20 20 20 20 73 75 72 65 20 61 73 73 65 6d        sure assem
22b90 62 6c 69 65 73 20 72 65 66 65 72 65 6e 63 65 64  blies referenced
22ba0 20 62 79 20 74 68 65 20 6f 6e 65 73 20 62 65 69   by the ones bei
22bb0 6e 67 20 74 65 73 74 65 64 20 61 72 65 0d 0a 20  ng tested are.. 
22bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20               #  
22bd0 20 20 20 20 20 61 76 61 69 6c 61 62 6c 65 20 64       available d
22be0 75 72 69 6e 67 20 74 68 65 20 74 65 73 74 69 6e  uring the testin
22bf0 67 20 70 72 6f 63 65 73 73 2e 0d 0a 20 20 20 20  g process...    
22c00 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
22c10 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
22c20 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
22c30 20 22 2d 2d 2d 2d 20 63 6f 70 79 69 6e 67 20 5c   "---- copying \
22c40 22 65 78 74 65 72 6e 61 6c 5c 22 20 66 69 6c 65  "external\" file
22c50 73 2e 2e 2e 5c 6e 22 0d 0a 0d 0a 20 20 20 20 20  s...\n"....     
22c60 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
22c70 20 66 69 6c 65 4e 61 6d 65 20 24 65 78 74 65 72   fileName $exter
22c80 6e 61 6c 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a  nalFileNames {..
22c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ca0 74 72 79 43 6f 70 79 45 78 74 65 72 6e 61 6c 46  tryCopyExternalF
22cb0 69 6c 65 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20  ile $fileName.. 
22cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
22cd0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
22ce0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
22cf0 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
22d00 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65 4e 61  :no(copySqliteNa
22d10 74 69 76 65 46 69 6c 65 73 29 5d 7d 20 74 68 65  tiveFiles)]} the
22d20 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
22d30 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
22d40 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 74      # NOTE: If t
22d50 68 65 20 74 65 73 74 20 70 6c 61 74 66 6f 72 6d  he test platform
22d60 20 69 73 20 6c 69 6b 65 6c 79 20 74 68 65 20 64   is likely the d
22d70 65 66 61 75 6c 74 20 66 6f 72 20 74 68 69 73 0d  efault for this.
22d80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
22d90 20 20 20 20 20 20 20 6d 61 63 68 69 6e 65 2c 20         machine, 
22da0 61 6c 73 6f 20 74 72 79 20 74 6f 20 63 6f 70 79  also try to copy
22db0 20 74 68 65 20 6e 61 74 69 76 65 20 66 69 6c 65   the native file
22dc0 73 20 74 6f 20 74 68 65 0d 0a 20 20 20 20 20 20  s to the..      
22dd0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
22de0 62 69 6e 61 72 79 20 6c 6f 63 61 74 69 6f 6e 2e  binary location.
22df0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
22e00 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  #..             
22e10 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
22e20 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69  ts ::no(copySqli
22e30 74 65 49 6d 70 6c 69 63 69 74 4e 61 74 69 76 65  teImplicitNative
22e40 46 69 6c 65 73 29 5d 20 26 26 20 5c 0d 0a 20 20  Files)] && \..  
22e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e60 5b 69 73 44 65 66 61 75 6c 74 42 75 69 6c 64 50  [isDefaultBuildP
22e70 6c 61 74 66 6f 72 6d 5d 7d 20 74 68 65 6e 20 7b  latform]} then {
22e80 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
22e90 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
22ea0 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20  channel \..     
22eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
22ec0 2d 2d 2d 2d 20 63 6f 70 79 69 6e 67 20 69 6d 70  ---- copying imp
22ed0 6c 69 63 69 74 20 5c 22 6e 61 74 69 76 65 5c 22  licit \"native\"
22ee0 20 66 69 6c 65 73 2e 2e 2e 5c 6e 22 0d 0a 0d 0a   files...\n"....
22ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f00 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65  foreach fileName
22f10 20 24 6e 61 74 69 76 65 46 69 6c 65 4e 61 6d 65   $nativeFileName
22f20 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s {..           
22f30 20 20 20 20 20 20 20 74 72 79 43 6f 70 79 41 73         tryCopyAs
22f40 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61 6d 65  sembly $fileName
22f50 20 66 61 6c 73 65 0d 0a 20 20 20 20 20 20 20 20   false..        
22f60 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
22f70 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
22f80 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
22f90 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
22fa0 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65 4e 6f 6e  no(copySqliteNon
22fb0 49 6d 70 6c 69 63 69 74 46 69 6c 65 73 29 5d 7d  ImplicitFiles)]}
22fc0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
22fd0 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69           if {![i
22fe0 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
22ff0 63 6f 70 79 53 71 6c 69 74 65 50 6c 61 74 66 6f  copySqlitePlatfo
23000 72 6d 46 69 6c 65 73 29 5d 20 26 26 20 5c 0d 0a  rmFiles)] && \..
23010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23020 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67      [string leng
23030 74 68 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3e 20  th $platform] > 
23040 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
23050 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
23060 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
23070 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
23080 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
23090 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6f          "---- co
230a0 70 79 69 6e 67 20 5c 22 6e 61 74 69 76 65 5c 22  pying \"native\"
230b0 20 66 69 6c 65 73 20 66 6f 72 20 70 6c 61 74 66   files for platf
230c0 6f 72 6d 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20  orm \"" \..     
230d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
230e0 20 24 70 6c 61 74 66 6f 72 6d 20 5c 22 2e 2e 2e   $platform \"...
230f0 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  \n]....         
23100 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
23110 20 66 69 6c 65 4e 61 6d 65 20 24 6e 61 74 69 76   fileName $nativ
23120 65 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20  eFileNames {..  
23130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23140 20 20 74 72 79 43 6f 70 79 41 73 73 65 6d 62 6c    tryCopyAssembl
23150 79 20 24 66 69 6c 65 4e 61 6d 65 20 66 61 6c 73  y $fileName fals
23160 65 20 24 70 6c 61 74 66 6f 72 6d 0d 0a 20 20 20  e $platform..   
23170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
23180 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
23190 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
231a0 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
231b0 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f  o exists ::no(co
231c0 70 79 53 71 6c 69 74 65 41 72 63 68 69 74 65 63  pySqliteArchitec
231d0 74 75 72 65 46 69 6c 65 73 29 5d 20 26 26 20 5c  tureFiles)] && \
231e0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
231f0 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65        [string le
23200 6e 67 74 68 20 24 61 72 63 68 69 74 65 63 74 75  ngth $architectu
23210 72 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  re] > 0} then {.
23220 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23230 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
23240 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
23250 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
23260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
23270 2d 2d 2d 20 63 6f 70 79 69 6e 67 20 5c 22 6e 61  --- copying \"na
23280 74 69 76 65 5c 22 20 66 69 6c 65 73 20 66 6f 72  tive\" files for
23290 20 61 72 63 68 69 74 65 63 74 75 72 65 20 5c 22   architecture \"
232a0 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
232b0 20 20 20 20 20 20 20 20 20 20 20 24 61 72 63 68             $arch
232c0 69 74 65 63 74 75 72 65 20 5c 22 2e 2e 2e 5c 6e  itecture \"...\n
232d0 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ]....           
232e0 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66         foreach f
232f0 69 6c 65 4e 61 6d 65 20 24 6e 61 74 69 76 65 46  ileName $nativeF
23300 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20  ileNames {..    
23310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23320 74 72 79 43 6f 70 79 41 73 73 65 6d 62 6c 79 20  tryCopyAssembly 
23330 24 66 69 6c 65 4e 61 6d 65 20 66 61 6c 73 65 20  $fileName false 
23340 24 61 72 63 68 69 74 65 63 74 75 72 65 0d 0a 20  $architecture.. 
23350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23360 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
23370 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
23380 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
23390 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
233a0 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
233b0 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79  exists ::no(copy
233c0 53 71 6c 69 74 65 4d 69 78 65 64 46 69 6c 65 73  SqliteMixedFiles
233d0 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
233e0 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
233f0 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
23400 45 3a 20 49 66 20 74 68 65 20 22 6e 61 74 69 76  E: If the "nativ
23410 65 22 20 72 75 6e 74 69 6d 65 20 6f 70 74 69 6f  e" runtime optio
23420 6e 20 69 73 20 73 65 74 2c 20 63 6f 70 79 20 69  n is set, copy i
23430 6d 70 6c 69 63 69 74 0d 0a 20 20 20 20 20 20 20  mplicit..       
23440 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6d         #       m
23450 69 78 65 64 2d 6d 6f 64 65 20 61 73 73 65 6d 62  ixed-mode assemb
23460 6c 79 20 66 69 6c 65 73 20 61 73 20 77 65 6c 6c  ly files as well
23470 2e 20 20 54 68 65 20 72 75 6e 74 69 6d 65 20 6f  .  The runtime o
23480 70 74 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20 20  ption..         
23490 20 20 20 20 20 23 20 20 20 20 20 20 20 63 68 65       #       che
234a0 63 6b 20 69 73 20 68 61 6e 64 6c 65 64 20 77 68  ck is handled wh
234b0 65 6e 20 62 75 69 6c 64 69 6e 67 20 74 68 65 20  en building the 
234c0 6c 69 73 74 20 6f 66 20 6d 69 78 65 64 2d 6d 6f  list of mixed-mo
234d0 64 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  de..            
234e0 20 20 23 20 20 20 20 20 20 20 61 73 73 65 6d 62    #       assemb
234f0 6c 79 20 66 69 6c 65 20 6e 61 6d 65 73 2e 0d 0a  ly file names...
23500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
23510 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
23520 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
23530 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65   ::no(copySqlite
23540 49 6d 70 6c 69 63 69 74 4d 69 78 65 64 46 69 6c  ImplicitMixedFil
23550 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  es)]} then {..  
23560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70                tp
23570 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
23580 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  nel \..         
23590 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
235a0 20 63 6f 70 79 69 6e 67 20 69 6d 70 6c 69 63 69   copying implici
235b0 74 20 5c 22 6d 69 78 65 64 5c 22 20 66 69 6c 65  t \"mixed\" file
235c0 73 2e 2e 2e 5c 6e 22 0d 0a 0d 0a 20 20 20 20 20  s...\n"....     
235d0 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61             forea
235e0 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6d 69 78  ch fileName $mix
235f0 65 64 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20  edFileNames {.. 
23600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23610 20 74 72 79 43 6f 70 79 41 73 73 65 6d 62 6c 79   tryCopyAssembly
23620 20 24 66 69 6c 65 4e 61 6d 65 20 66 61 6c 73 65   $fileName false
23630 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
23640 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
23650 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
23660 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
23670 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70   exists ::no(cop
23680 79 53 71 6c 69 74 65 4e 6f 6e 49 6d 70 6c 69 63  ySqliteNonImplic
23690 69 74 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20  itFiles)]} then 
236a0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
236b0 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
236c0 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71  ists ::no(copySq
236d0 6c 69 74 65 50 6c 61 74 66 6f 72 6d 46 69 6c 65  litePlatformFile
236e0 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  s)] && \..      
236f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 73                [s
23700 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 70 6c  tring length $pl
23710 61 74 66 6f 72 6d 5d 20 3e 20 30 7d 20 74 68 65  atform] > 0} the
23720 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
23730 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
23740 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
23750 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
23760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23770 20 20 22 2d 2d 2d 2d 20 63 6f 70 79 69 6e 67 20    "---- copying 
23780 5c 22 6d 69 78 65 64 5c 22 20 66 69 6c 65 73 20  \"mixed\" files 
23790 66 6f 72 20 70 6c 61 74 66 6f 72 6d 20 5c 22 22  for platform \""
237a0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
237b0 20 20 20 20 20 20 20 20 20 20 24 70 6c 61 74 66            $platf
237c0 6f 72 6d 20 5c 22 2e 2e 2e 5c 6e 5d 0d 0a 0d 0a  orm \"...\n]....
237d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
237e0 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61    foreach fileNa
237f0 6d 65 20 24 6d 69 78 65 64 46 69 6c 65 4e 61 6d  me $mixedFileNam
23800 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  es {..          
23810 20 20 20 20 20 20 20 20 20 20 74 72 79 43 6f 70            tryCop
23820 79 41 73 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e  yAssembly $fileN
23830 61 6d 65 20 66 61 6c 73 65 20 24 70 6c 61 74 66  ame false $platf
23840 6f 72 6d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  orm..           
23850 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
23860 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
23870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
23880 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
23890 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65   ::no(copySqlite
238a0 41 72 63 68 69 74 65 63 74 75 72 65 46 69 6c 65  ArchitectureFile
238b0 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  s)] && \..      
238c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 73                [s
238d0 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 61 72  tring length $ar
238e0 63 68 69 74 65 63 74 75 72 65 5d 20 3e 20 30 7d  chitecture] > 0}
238f0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
23900 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
23910 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
23920 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
23930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23940 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 70 79        "---- copy
23950 69 6e 67 20 5c 22 6d 69 78 65 64 5c 22 20 66 69  ing \"mixed\" fi
23960 6c 65 73 20 66 6f 72 20 61 72 63 68 69 74 65 63  les for architec
23970 74 75 72 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20  ture \"" \..    
23980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23990 20 20 24 61 72 63 68 69 74 65 63 74 75 72 65 20    $architecture 
239a0 5c 22 2e 2e 2e 5c 6e 5d 0d 0a 0d 0a 20 20 20 20  \"...\n]....    
239b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f                fo
239c0 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24  reach fileName $
239d0 6d 69 78 65 64 46 69 6c 65 4e 61 6d 65 73 20 7b  mixedFileNames {
239e0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
239f0 20 20 20 20 20 20 74 72 79 43 6f 70 79 41 73 73        tryCopyAss
23a00 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61 6d 65 20  embly $fileName 
23a10 66 61 6c 73 65 20 24 61 72 63 68 69 74 65 63 74  false $architect
23a20 75 72 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ure..           
23a30 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
23a40 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
23a50 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
23a60 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
23a70 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
23a80 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
23a90 6f 28 63 6f 70 79 53 71 6c 69 74 65 4d 61 6e 61  o(copySqliteMana
23aa0 67 65 64 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e  gedFiles)]} then
23ab0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
23ac0 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
23ad0 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 6f  channel "---- co
23ae0 70 79 69 6e 67 20 5c 22 6d 61 6e 61 67 65 64 5c  pying \"managed\
23af0 22 20 66 69 6c 65 73 2e 2e 2e 5c 6e 22 0d 0a 0d  " files...\n"...
23b00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66  .              f
23b10 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20  oreach fileName 
23b20 24 6d 61 6e 61 67 65 64 46 69 6c 65 4e 61 6d 65  $managedFileName
23b30 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s {..           
23b40 20 20 20 20 20 74 72 79 43 6f 70 79 41 73 73 65       tryCopyAsse
23b50 6d 62 6c 79 20 24 66 69 6c 65 4e 61 6d 65 20 74  mbly $fileName t
23b60 72 75 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  rue..           
23b70 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
23b80 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d    }..          }
23b90 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  ....          #.
23ba0 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
23bb0 45 3a 20 53 6b 69 70 20 74 72 79 69 6e 67 20 74  E: Skip trying t
23bc0 6f 20 6c 6f 61 64 20 61 6e 79 20 66 69 6c 65 73  o load any files
23bd0 20 69 66 20 69 6e 73 74 72 75 63 74 65 64 2e 0d   if instructed..
23be0 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
23bf0 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
23c00 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 6c  fo exists ::no(l
23c10 6f 61 64 53 71 6c 69 74 65 46 69 6c 65 73 29 5d  oadSqliteFiles)]
23c20 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
23c30 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
23c40 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 6c 6f 61   exists ::no(loa
23c50 64 53 71 6c 69 74 65 49 6d 70 6c 69 63 69 74 46  dSqliteImplicitF
23c60 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  iles)]} then {..
23c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72                tr
23c80 79 4c 6f 61 64 41 73 73 65 6d 62 6c 79 20 53 79  yLoadAssembly Sy
23c90 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
23ca0 2e 64 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20 20  .dll..          
23cb0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
23cc0 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
23cd0 69 73 74 73 20 3a 3a 6e 6f 28 6c 6f 61 64 53 71  ists ::no(loadSq
23ce0 6c 69 74 65 4c 69 6e 71 46 69 6c 65 73 29 5d 7d  liteLinqFiles)]}
23cf0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
23d00 20 20 20 20 20 20 20 74 72 79 4c 6f 61 64 41 73         tryLoadAs
23d10 73 65 6d 62 6c 79 20 53 79 73 74 65 6d 2e 44 61  sembly System.Da
23d20 74 61 2e 53 51 4c 69 74 65 2e 4c 69 6e 71 2e 64  ta.SQLite.Linq.d
23d30 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ll..            
23d40 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
23d50 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
23d60 74 73 20 3a 3a 6e 6f 28 6c 6f 61 64 53 71 6c 69  ts ::no(loadSqli
23d70 74 65 45 66 36 46 69 6c 65 73 29 5d 7d 20 74 68  teEf6Files)]} th
23d80 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
23d90 20 20 20 20 74 72 79 4c 6f 61 64 41 73 73 65 6d      tryLoadAssem
23da0 62 6c 79 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  bly System.Data.
23db0 53 51 4c 69 74 65 2e 45 46 36 2e 64 6c 6c 0d 0a  SQLite.EF6.dll..
23dc0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
23dd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
23de0 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
23df0 3a 6e 6f 28 6c 6f 61 64 53 71 6c 69 74 65 4e 6f  :no(loadSqliteNo
23e00 6e 49 6d 70 6c 69 63 69 74 46 69 6c 65 73 29 5d  nImplicitFiles)]
23e10 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
23e20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
23e30 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 6c  fo exists ::no(l
23e40 6f 61 64 53 71 6c 69 74 65 50 6c 61 74 66 6f 72  oadSqlitePlatfor
23e50 6d 46 69 6c 65 73 29 5d 20 26 26 20 5c 0d 0a 20  mFiles)] && \.. 
23e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23e70 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20   [string length 
23e80 24 70 6c 61 74 66 6f 72 6d 5d 20 3e 20 30 7d 20  $platform] > 0} 
23e90 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
23ea0 20 20 20 20 20 20 20 20 74 72 79 4c 6f 61 64 41          tryLoadA
23eb0 73 73 65 6d 62 6c 79 20 53 79 73 74 65 6d 2e 44  ssembly System.D
23ec0 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 20 24  ata.SQLite.dll $
23ed0 70 6c 61 74 66 6f 72 6d 0d 0a 20 20 20 20 20 20  platform..      
23ee0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
23ef0 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
23f00 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
23f10 6f 28 6c 6f 61 64 53 71 6c 69 74 65 41 72 63 68  o(loadSqliteArch
23f20 69 74 65 63 74 75 72 65 46 69 6c 65 73 29 5d 20  itectureFiles)] 
23f30 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
23f40 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20          [string 
23f50 6c 65 6e 67 74 68 20 24 61 72 63 68 69 74 65 63  length $architec
23f60 74 75 72 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20  ture] > 0} then 
23f70 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
23f80 20 20 20 74 72 79 4c 6f 61 64 41 73 73 65 6d 62     tryLoadAssemb
23f90 6c 79 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  ly System.Data.S
23fa0 51 4c 69 74 65 2e 64 6c 6c 20 24 61 72 63 68 69  QLite.dll $archi
23fb0 74 65 63 74 75 72 65 0d 0a 20 20 20 20 20 20 20  tecture..       
23fc0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
23fd0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
23fe0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
23ff0 0a 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61  ...        forea
24000 63 68 20 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20  ch fileNameOnly 
24010 24 6e 61 74 69 76 65 46 69 6c 65 4e 61 6d 65 73  $nativeFileNames
24020 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 61   {..          ca
24030 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
24040 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
24050 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
24060 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
24070 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69          "---- fi
24080 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22  le version of \"
24090 22 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20  " $fileNameOnly 
240a0 22 5c 22 2e 2e 2e 20 5c 22 22 20 5c 0d 0a 20 20  "\"... \"" \..  
240b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 66                [f
240c0 69 6c 65 20 76 65 72 73 69 6f 6e 20 5b 67 65 74  ile version [get
240d0 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 24  BinaryFileName $
240e0 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 5d 5d 20 5c  fileNameOnly]] \
240f0 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  "\n]..          
24100 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  }..        }....
24110 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
24120 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 24 6d 69  fileNameOnly $mi
24130 78 65 64 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a  xedFileNames {..
24140 20 20 20 20 20 20 20 20 20 20 63 61 74 63 68 20            catch 
24150 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
24160 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
24170 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
24180 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
24190 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76      "---- file v
241a0 65 72 73 69 6f 6e 20 6f 66 20 5c 22 22 20 24 66  ersion of \"" $f
241b0 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 22 5c 22 2e  ileNameOnly "\".
241c0 2e 2e 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20  .. \"" \..      
241d0 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20            [file 
241e0 76 65 72 73 69 6f 6e 20 5b 67 65 74 42 69 6e 61  version [getBina
241f0 72 79 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65  ryFileName $file
24200 4e 61 6d 65 4f 6e 6c 79 5d 5d 20 5c 22 5c 6e 5d  NameOnly]] \"\n]
24210 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
24220 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
24230 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65      foreach file
24240 4e 61 6d 65 4f 6e 6c 79 20 24 6d 61 6e 61 67 65  NameOnly $manage
24250 64 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20  dFileNames {..  
24260 20 20 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d          catch {.
24270 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
24280 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
24290 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
242a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
242b0 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72    "---- file ver
242c0 73 69 6f 6e 20 6f 66 20 5c 22 22 20 24 66 69 6c  sion of \"" $fil
242d0 65 4e 61 6d 65 4f 6e 6c 79 20 22 5c 22 2e 2e 2e  eNameOnly "\"...
242e0 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20   \"" \..        
242f0 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 76 65          [file ve
24300 72 73 69 6f 6e 20 5b 67 65 74 42 69 6e 61 72 79  rsion [getBinary
24310 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61  FileName $fileNa
24320 6d 65 4f 6e 6c 79 5d 5d 20 5c 22 5c 6e 5d 0d 0a  meOnly]] \"\n]..
24330 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
24340 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
24350 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
24360 6e 67 74 68 20 24 70 6c 61 74 66 6f 72 6d 5d 20  ngth $platform] 
24370 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
24380 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66         foreach f
24390 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 24 6e 61 74  ileNameOnly $nat
243a0 69 76 65 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a  iveFileNames {..
243b0 20 20 20 20 20 20 20 20 20 20 20 20 63 61 74 63              catc
243c0 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  h {..           
243d0 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
243e0 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
243f0 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
24400 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
24410 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66 20  file version of 
24420 5c 22 22 20 24 70 6c 61 74 66 6f 72 6d 20 5c 0d  \"" $platform \.
24430 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
24440 20 20 20 2f 20 24 66 69 6c 65 4e 61 6d 65 4f 6e     / $fileNameOn
24450 6c 79 20 22 5c 22 2e 2e 2e 20 5c 22 22 20 5b 66  ly "\"... \"" [f
24460 69 6c 65 20 76 65 72 73 69 6f 6e 20 5c 0d 0a 20  ile version \.. 
24470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24480 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e   [getBinaryFileN
24490 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c  ame $fileNameOnl
244a0 79 20 24 70 6c 61 74 66 6f 72 6d 5d 5d 20 5c 22  y $platform]] \"
244b0 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  \n]..           
244c0 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d   }..          }.
244d0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  ...          for
244e0 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 4f 6e 6c  each fileNameOnl
244f0 79 20 24 6d 69 78 65 64 46 69 6c 65 4e 61 6d 65  y $mixedFileName
24500 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s {..           
24510 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20   catch {..      
24520 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
24530 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
24540 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
24550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
24560 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73 69 6f  ---- file versio
24570 6e 20 6f 66 20 5c 22 22 20 24 70 6c 61 74 66 6f  n of \"" $platfo
24580 72 6d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  rm \..          
24590 20 20 20 20 20 20 20 20 2f 20 24 66 69 6c 65 4e          / $fileN
245a0 61 6d 65 4f 6e 6c 79 20 22 5c 22 2e 2e 2e 20 5c  ameOnly "\"... \
245b0 22 22 20 5b 66 69 6c 65 20 76 65 72 73 69 6f 6e  "" [file version
245c0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
245d0 20 20 20 20 20 20 5b 67 65 74 42 69 6e 61 72 79        [getBinary
245e0 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61  FileName $fileNa
245f0 6d 65 4f 6e 6c 79 20 24 70 6c 61 74 66 6f 72 6d  meOnly $platform
24600 5d 5d 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20  ]] \"\n]..      
24610 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
24620 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
24630 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  ...        if {[
24640 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 61  string length $a
24650 72 63 68 69 74 65 63 74 75 72 65 5d 20 3e 20 30  rchitecture] > 0
24660 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
24670 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65      foreach file
24680 4e 61 6d 65 4f 6e 6c 79 20 24 6e 61 74 69 76 65  NameOnly $native
24690 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20  FileNames {..   
246a0 20 20 20 20 20 20 20 20 20 63 61 74 63 68 20 7b           catch {
246b0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
246c0 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
246d0 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
246e0 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
246f0 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c         "---- fil
24700 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22 22  e version of \""
24710 20 24 61 72 63 68 69 74 65 63 74 75 72 65 20 5c   $architecture \
24720 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
24730 20 20 20 20 2f 20 24 66 69 6c 65 4e 61 6d 65 4f      / $fileNameO
24740 6e 6c 79 20 22 5c 22 2e 2e 2e 20 5c 22 22 20 5b  nly "\"... \"" [
24750 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 5c 0d 0a  file version \..
24760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24770 20 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65    [getBinaryFile
24780 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 4f 6e  Name $fileNameOn
24790 6c 79 20 24 61 72 63 68 69 74 65 63 74 75 72 65  ly $architecture
247a0 5d 5d 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20  ]] \"\n]..      
247b0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
247c0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
247d0 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61    foreach fileNa
247e0 6d 65 4f 6e 6c 79 20 24 6d 69 78 65 64 46 69 6c  meOnly $mixedFil
247f0 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20  eNames {..      
24800 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20        catch {.. 
24810 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
24820 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
24830 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
24840 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
24850 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76      "---- file v
24860 65 72 73 69 6f 6e 20 6f 66 20 5c 22 22 20 24 61  ersion of \"" $a
24870 72 63 68 69 74 65 63 74 75 72 65 20 5c 0d 0a 20  rchitecture \.. 
24880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24890 20 2f 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79   / $fileNameOnly
248a0 20 22 5c 22 2e 2e 2e 20 5c 22 22 20 5b 66 69 6c   "\"... \"" [fil
248b0 65 20 76 65 72 73 69 6f 6e 20 5c 0d 0a 20 20 20  e version \..   
248c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b                 [
248d0 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d  getBinaryFileNam
248e0 65 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20  e $fileNameOnly 
248f0 24 61 72 63 68 69 74 65 63 74 75 72 65 5d 5d 20  $architecture]] 
24900 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  \"\n]..         
24910 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
24920 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  }..        }....
24930 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
24940 20 20 20 23 20 4e 4f 54 45 3a 20 47 72 61 62 20     # NOTE: Grab 
24950 74 68 65 20 6c 69 73 74 20 6f 66 20 6d 61 6e 61  the list of mana
24960 67 65 64 20 61 73 73 65 6d 62 6c 69 65 73 20 66  ged assemblies f
24970 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  or the current p
24980 72 6f 63 65 73 73 0d 0a 20 20 20 20 20 20 20 20  rocess..        
24990 23 20 20 20 20 20 20 20 61 6e 64 20 72 65 70 6f  #       and repo
249a0 72 74 20 6f 6e 20 74 68 65 20 53 79 73 74 65 6d  rt on the System
249b0 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 72 65 6c  .Data.SQLite rel
249c0 61 74 65 64 20 6f 6e 65 73 2e 0d 0a 20 20 20 20  ated ones...    
249d0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69      #..        i
249e0 66 20 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f 62  f {[haveSQLiteOb
249f0 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68  jectCommand]} th
24a00 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
24a10 73 65 74 20 61 73 73 65 6d 62 6c 69 65 73 20 5b  set assemblies [
24a20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 41 70  object invoke Ap
24a30 70 44 6f 6d 61 69 6e 2e 43 75 72 72 65 6e 74 44  pDomain.CurrentD
24a40 6f 6d 61 69 6e 20 47 65 74 41 73 73 65 6d 62 6c  omain GetAssembl
24a50 69 65 73 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ies]....        
24a60 20 20 6f 62 6a 65 63 74 20 66 6f 72 65 61 63 68    object foreach
24a70 20 61 73 73 65 6d 62 6c 79 20 24 61 73 73 65 6d   assembly $assem
24a80 62 6c 69 65 73 20 7b 0d 0a 20 20 20 20 20 20 20  blies {..       
24a90 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
24aa0 20 6d 61 74 63 68 20 5c 7b 53 79 73 74 65 6d 2e   match \{System.
24ab0 44 61 74 61 2e 53 51 4c 69 74 65 2a 20 24 61 73  Data.SQLite* $as
24ac0 73 65 6d 62 6c 79 5d 7d 20 74 68 65 6e 20 7b 0d  sembly]} then {.
24ad0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  .              t
24ae0 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
24af0 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
24b00 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
24b10 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 6f 75 6e        "---- foun
24b20 64 20 6c 6f 61 64 65 64 20 61 73 73 65 6d 62 6c  d loaded assembl
24b30 79 3a 20 22 20 24 61 73 73 65 6d 62 6c 79 20 5c  y: " $assembly \
24b40 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  n]..            
24b50 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  }..          }..
24b60 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
24b70 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20       catch {..  
24b80 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
24b90 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d  :test_channel \.
24ba0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
24bb0 2d 2d 2d 2d 20 64 65 66 69 6e 65 20 63 6f 6e 73  ---- define cons
24bc0 74 61 6e 74 73 20 66 6f 72 20 5c 22 53 79 73 74  tants for \"Syst
24bd0 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 5c 22  em.Data.SQLite\"
24be0 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 20  ... "....       
24bf0 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d     if {[catch {.
24c00 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a  .            obj
24c10 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67  ect invoke -flag
24c20 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a  s +NonPublic \..
24c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c40 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
24c50 74 65 2e 53 51 4c 69 74 65 33 20 44 65 66 69 6e  te.SQLite3 Defin
24c60 65 43 6f 6e 73 74 61 6e 74 73 0d 0a 20 20 20 20  eConstants..    
24c70 20 20 20 20 20 20 7d 20 64 65 66 69 6e 65 43 6f        } defineCo
24c80 6e 73 74 61 6e 74 73 5d 20 3d 3d 20 30 7d 20 74  nstants] == 0} t
24c90 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
24ca0 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
24cb0 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
24cc0 41 72 67 73 20 5b 66 6f 72 6d 61 74 4c 69 73 74  Args [formatList
24cd0 20 5b 6c 73 6f 72 74 20 5c 0d 0a 20 20 20 20 20   [lsort \..     
24ce0 20 20 20 20 20 20 20 20 20 20 20 24 64 65 66 69             $defi
24cf0 6e 65 43 6f 6e 73 74 61 6e 74 73 5d 20 3c 6e 6f  neConstants] <no
24d00 6e 65 3e 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  ne>] \n]..      
24d10 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
24d20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
24d30 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
24d40 75 6e 6b 6e 6f 77 6e 5c 6e 0d 0a 20 20 20 20 20  unknown\n..     
24d50 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
24d60 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63 61 74  }....        cat
24d70 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
24d80 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
24d90 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20  annel \..       
24da0 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6f 75         "---- sou
24db0 72 63 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c  rce version of \
24dc0 22 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c  "System.Data.SQL
24dd0 69 74 65 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 0d 0a  ite.dll\"... "..
24de0 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
24df0 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
24e00 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76        object inv
24e10 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50  oke -flags +NonP
24e20 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20  ublic \..       
24e30 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e           System.
24e40 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69  Data.SQLite.SQLi
24e50 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 50 72 6f  teConnection Pro
24e60 76 69 64 65 72 56 65 72 73 69 6f 6e 0d 0a 20 20  viderVersion..  
24e70 20 20 20 20 20 20 20 20 7d 20 76 65 72 73 69 6f          } versio
24e80 6e 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  n] == 0} then {.
24e90 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
24ea0 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
24eb0 24 76 65 72 73 69 6f 6e 5d 20 3d 3d 20 30 7d 20  $version] == 0} 
24ec0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
24ed0 20 20 20 20 20 20 73 65 74 20 76 65 72 73 69 6f        set versio
24ee0 6e 20 6e 75 6c 6c 0d 0a 20 20 20 20 20 20 20 20  n null..        
24ef0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
24f00 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
24f10 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
24f20 41 72 67 73 20 24 76 65 72 73 69 6f 6e 20 5c 6e  Args $version \n
24f30 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65  ]..          } e
24f40 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
24f50 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
24f60 5f 63 68 61 6e 6e 65 6c 20 75 6e 6b 6e 6f 77 6e  _channel unknown
24f70 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  \n..          }.
24f80 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
24f90 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20        catch {.. 
24fa0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
24fb0 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c  ::test_channel \
24fc0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
24fd0 22 2d 2d 2d 2d 20 73 6f 75 72 63 65 20 63 68 65  "---- source che
24fe0 63 6b 6f 75 74 20 6f 66 20 5c 22 53 79 73 74 65  ckout of \"Syste
24ff0 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c  m.Data.SQLite.dl
25000 6c 5c 22 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20  l\"... "....    
25010 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
25020 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
25030 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66  object invoke -f
25040 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20  lags +NonPublic 
25050 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
25060 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53     System.Data.S
25070 51 4c 69 74 65 2e 53 51 4c 69 74 65 43 6f 6e 6e  QLite.SQLiteConn
25080 65 63 74 69 6f 6e 20 50 72 6f 76 69 64 65 72 53  ection ProviderS
25090 6f 75 72 63 65 49 64 0d 0a 20 20 20 20 20 20 20  ourceId..       
250a0 20 20 20 7d 20 73 6f 75 72 63 65 49 64 5d 20 3d     } sourceId] =
250b0 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
250c0 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74           if {[st
250d0 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 73 6f 75  ring length $sou
250e0 72 63 65 49 64 5d 20 3d 3d 20 30 7d 20 74 68 65  rceId] == 0} the
250f0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
25100 20 20 20 73 65 74 20 73 6f 75 72 63 65 49 64 20     set sourceId 
25110 6e 75 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20 20  null..          
25120 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
25130 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
25140 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
25150 67 73 20 24 73 6f 75 72 63 65 49 64 20 5c 6e 5d  gs $sourceId \n]
25160 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c  ..          } el
25170 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
25180 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
25190 63 68 61 6e 6e 65 6c 20 75 6e 6b 6e 6f 77 6e 5c  channel unknown\
251a0 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  n..          }..
251b0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
251c0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
251d0 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 74 68  # NOTE: Check th
251e0 65 20 61 76 61 69 6c 61 62 6c 65 20 62 75 69 6c  e available buil
251f0 64 73 20 28 61 6e 64 20 22 72 65 6c 65 61 73 65  ds (and "release
25200 73 22 29 20 6f 66 20 53 51 4c 69 74 65 20 61 6e  s") of SQLite an
25210 64 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  d..        #    
25220 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53     System.Data.S
25230 51 4c 69 74 65 2e 0d 0a 20 20 20 20 20 20 20 20  QLite...        
25240 23 0d 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b  #..        check
25250 46 6f 72 53 51 4c 69 74 65 42 75 69 6c 64 73 20  ForSQLiteBuilds 
25260 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d  $::test_channel.
25270 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f  .        checkFo
25280 72 53 51 4c 69 74 65 52 65 6c 65 61 73 65 73 20  rSQLiteReleases 
25290 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d  $::test_channel.
252a0 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
252b0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e 6f        # NOTE: No
252c0 77 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 6b 6e  w, we need to kn
252d0 6f 77 20 69 66 20 74 68 65 20 53 51 4c 69 74 65  ow if the SQLite
252e0 20 63 6f 72 65 20 6c 69 62 72 61 72 79 20 69 73   core library is
252f0 20 61 76 61 69 6c 61 62 6c 65 0d 0a 20 20 20 20   available..    
25300 20 20 20 20 23 20 20 20 20 20 20 20 28 69 2e 65      #       (i.e
25310 2e 20 62 65 63 61 75 73 65 20 74 68 65 20 6d 61  . because the ma
25320 6e 61 67 65 64 2d 6f 6e 6c 79 20 53 79 73 74 65  naged-only Syste
25330 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 61 73  m.Data.SQLite as
25340 73 65 6d 62 6c 79 20 63 61 6e 0d 0a 20 20 20 20  sembly can..    
25350 20 20 20 20 23 20 20 20 20 20 20 20 6c 6f 61 64      #       load
25360 20 77 69 74 68 6f 75 74 20 69 74 3b 20 68 6f 77   without it; how
25370 65 76 65 72 2c 20 69 74 20 63 61 6e 6e 6f 74 20  ever, it cannot 
25380 64 6f 20 61 6e 79 74 68 69 6e 67 20 75 73 65 66  do anything usef
25390 75 6c 20 77 69 74 68 6f 75 74 0d 0a 20 20 20 20  ul without..    
253a0 20 20 20 20 23 20 20 20 20 20 20 20 69 74 29 2e      #       it).
253b0 20 20 49 66 20 77 65 20 61 72 65 20 75 73 69 6e    If we are usin
253c0 67 20 74 68 65 20 6d 69 78 65 64 2d 6d 6f 64 65  g the mixed-mode
253d0 20 61 73 73 65 6d 62 6c 79 20 61 6e 64 20 77 65   assembly and we
253e0 20 61 6c 72 65 61 64 79 0d 0a 20 20 20 20 20 20   already..      
253f0 20 20 23 20 20 20 20 20 20 20 66 6f 75 6e 64 20    #       found 
25400 69 74 20 28 61 62 6f 76 65 29 2c 20 74 68 69 73  it (above), this
25410 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 73   should always s
25420 75 63 63 65 65 64 2e 0d 0a 20 20 20 20 20 20 20  ucceed...       
25430 20 23 0d 0a 20 20 20 20 20 20 20 20 63 68 65 63   #..        chec
25440 6b 46 6f 72 53 51 4c 69 74 65 4c 69 62 72 61 72  kForSQLiteLibrar
25450 79 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  y $::test_channe
25460 6c 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  l....        #..
25470 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
25480 43 68 65 63 6b 20 69 66 20 74 68 65 20 53 51 4c  Check if the SQL
25490 69 74 65 20 69 6e 74 65 72 6f 70 20 61 73 73 65  ite interop asse
254a0 6d 62 6c 79 20 69 73 20 61 76 61 69 6c 61 62 6c  mbly is availabl
254b0 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  e...        #.. 
254c0 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53         checkForS
254d0 51 4c 69 74 65 49 6e 74 65 72 6f 70 20 24 3a 3a  QLiteInterop $::
254e0 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a  test_channel....
254f0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
25500 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b     # NOTE: Check
25510 20 74 68 65 20 53 51 4c 69 74 65 20 64 61 74 61   the SQLite data
25520 62 61 73 65 20 61 6e 64 20 74 65 6d 70 6f 72 61  base and tempora
25530 72 79 20 64 69 72 65 63 74 6f 72 69 65 73 2e 0d  ry directories..
25540 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
25550 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51 4c 69      checkForSQLi
25560 74 65 44 69 72 65 63 74 6f 72 69 65 73 20 24 3a  teDirectories $:
25570 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d  :test_channel...
25580 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
25590 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65      # NOTE: Atte
255a0 6d 70 74 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  mpt to determine
255b0 20 69 66 20 76 61 72 69 6f 75 73 20 63 6f 6d 70   if various comp
255c0 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 73  ile-time options
255d0 20 6e 65 65 64 65 64 20 66 6f 72 0d 0a 20 20 20   needed for..   
255e0 20 20 20 20 20 23 20 20 20 20 20 20 20 74 65 73       #       tes
255f0 74 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 77 65  t constraints we
25600 72 65 20 65 6e 61 62 6c 65 64 20 66 6f 72 20 74  re enabled for t
25610 68 65 20 6d 61 6e 61 67 65 64 20 61 73 73 65 6d  he managed assem
25620 62 6c 79 2e 20 20 54 68 65 72 65 0d 0a 20 20 20  bly.  There..   
25630 20 20 20 20 20 23 20 20 20 20 20 20 20 61 72 65       #       are
25640 20 73 6f 6d 65 20 63 6f 6d 70 69 6c 65 2d 74 69   some compile-ti
25650 6d 65 20 6f 70 74 69 6f 6e 73 20 74 68 61 74 20  me options that 
25660 6d 75 73 74 20 61 6c 73 6f 20 68 61 76 65 20 62  must also have b
25670 65 65 6e 20 65 6e 61 62 6c 65 64 0d 0a 20 20 20  een enabled..   
25680 20 20 20 20 20 23 20 20 20 20 20 20 20 66 6f 72       #       for
25690 20 74 68 65 20 69 6e 74 65 72 6f 70 20 61 73 73   the interop ass
256a0 65 6d 62 6c 79 20 69 6e 20 6f 72 64 65 72 20 74  embly in order t
256b0 6f 20 62 65 20 65 66 66 65 63 74 69 76 65 2e 20  o be effective. 
256c0 20 46 6f 72 20 74 68 6f 73 65 0d 0a 20 20 20 20   For those..    
256d0 20 20 20 20 23 20 20 20 20 20 20 20 6f 70 74 69      #       opti
256e0 6f 6e 73 2c 20 69 74 20 77 69 6c 6c 20 62 65 20  ons, it will be 
256f0 61 73 73 75 6d 65 64 20 74 68 61 74 20 69 74 20  assumed that it 
25700 77 61 73 20 65 6e 61 62 6c 65 64 20 66 6f 72 20  was enabled for 
25710 74 68 65 20 69 6e 74 65 72 6f 70 0d 0a 20 20 20  the interop..   
25720 20 20 20 20 20 23 20 20 20 20 20 20 20 61 73 73       #       ass
25730 65 6d 62 6c 79 20 69 66 20 69 74 20 77 61 73 20  embly if it was 
25740 65 6e 61 62 6c 65 64 20 66 6f 72 20 74 68 65 20  enabled for the 
25750 6d 61 6e 61 67 65 64 20 61 73 73 65 6d 62 6c 79  managed assembly
25760 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
25770 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 64 65        foreach de
25780 66 69 6e 65 43 6f 6e 73 74 61 6e 74 20 5b 6c 69  fineConstant [li
25790 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  st \..          
257a0 20 20 43 48 45 43 4b 5f 53 54 41 54 45 20 43 4f    CHECK_STATE CO
257b0 55 4e 54 5f 48 41 4e 44 4c 45 20 44 45 42 55 47  UNT_HANDLE DEBUG
257c0 20 49 4e 54 45 52 4f 50 5f 43 4f 44 45 43 20 49   INTEROP_CODEC I
257d0 4e 54 45 52 4f 50 5f 44 45 42 55 47 20 5c 0d 0a  NTEROP_DEBUG \..
257e0 20 20 20 20 20 20 20 20 20 20 20 20 49 4e 54 45              INTE
257f0 52 4f 50 5f 45 58 54 45 4e 53 49 4f 4e 5f 46 55  ROP_EXTENSION_FU
25800 4e 43 54 49 4f 4e 53 20 49 4e 54 45 52 4f 50 5f  NCTIONS INTEROP_
25810 46 54 53 35 5f 45 58 54 45 4e 53 49 4f 4e 20 5c  FTS5_EXTENSION \
25820 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 49 4e  ..            IN
25830 54 45 52 4f 50 5f 49 4e 43 4c 55 44 45 5f 43 45  TEROP_INCLUDE_CE
25840 52 4f 44 20 49 4e 54 45 52 4f 50 5f 49 4e 43 4c  ROD INTEROP_INCL
25850 55 44 45 5f 45 58 54 52 41 20 49 4e 54 45 52 4f  UDE_EXTRA INTERO
25860 50 5f 49 4e 43 4c 55 44 45 5f 53 45 45 20 5c 0d  P_INCLUDE_SEE \.
25870 0a 20 20 20 20 20 20 20 20 20 20 20 20 49 4e 54  .            INT
25880 45 52 4f 50 5f 49 4e 43 4c 55 44 45 5f 5a 49 50  EROP_INCLUDE_ZIP
25890 56 46 53 20 49 4e 54 45 52 4f 50 5f 4a 53 4f 4e  VFS INTEROP_JSON
258a0 31 5f 45 58 54 45 4e 53 49 4f 4e 20 5c 0d 0a 20  1_EXTENSION \.. 
258b0 20 20 20 20 20 20 20 20 20 20 20 49 4e 54 45 52             INTER
258c0 4f 50 5f 4c 45 47 41 43 59 5f 43 4c 4f 53 45 20  OP_LEGACY_CLOSE 
258d0 49 4e 54 45 52 4f 50 5f 4c 4f 47 20 49 4e 54 45  INTEROP_LOG INTE
258e0 52 4f 50 5f 50 45 52 43 45 4e 54 49 4c 45 5f 45  ROP_PERCENTILE_E
258f0 58 54 45 4e 53 49 4f 4e 20 5c 0d 0a 20 20 20 20  XTENSION \..    
25900 20 20 20 20 20 20 20 20 49 4e 54 45 52 4f 50 5f          INTEROP_
25910 52 45 47 45 58 50 5f 45 58 54 45 4e 53 49 4f 4e  REGEXP_EXTENSION
25920 20 49 4e 54 45 52 4f 50 5f 54 45 53 54 5f 45 58   INTEROP_TEST_EX
25930 54 45 4e 53 49 4f 4e 20 5c 0d 0a 20 20 20 20 20  TENSION \..     
25940 20 20 20 20 20 20 20 49 4e 54 45 52 4f 50 5f 54         INTEROP_T
25950 4f 54 59 50 45 5f 45 58 54 45 4e 53 49 4f 4e 20  OTYPE_EXTENSION 
25960 49 4e 54 45 52 4f 50 5f 56 49 52 54 55 41 4c 5f  INTEROP_VIRTUAL_
25970 54 41 42 4c 45 20 4e 45 54 5f 32 30 20 4e 45 54  TABLE NET_20 NET
25980 5f 33 35 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  _35 \..         
25990 20 20 20 4e 45 54 5f 34 30 20 4e 45 54 5f 34 35     NET_40 NET_45
259a0 20 4e 45 54 5f 34 35 31 20 4e 45 54 5f 34 35 32   NET_451 NET_452
259b0 20 4e 45 54 5f 34 36 20 4e 45 54 5f 34 36 31 20   NET_46 NET_461 
259c0 4e 45 54 5f 34 36 32 20 5c 0d 0a 20 20 20 20 20  NET_462 \..     
259d0 20 20 20 20 20 20 20 4e 45 54 5f 43 4f 4d 50 41         NET_COMPA
259e0 43 54 5f 32 30 20 50 4c 41 54 46 4f 52 4d 5f 43  CT_20 PLATFORM_C
259f0 4f 4d 50 41 43 54 46 52 41 4d 45 57 4f 52 4b 20  OMPACTFRAMEWORK 
25a00 50 52 45 4c 4f 41 44 5f 4e 41 54 49 56 45 5f 4c  PRELOAD_NATIVE_L
25a10 49 42 52 41 52 59 20 5c 0d 0a 20 20 20 20 20 20  IBRARY \..      
25a20 20 20 20 20 20 20 52 45 54 41 52 47 45 54 41 42        RETARGETAB
25a30 4c 45 20 53 51 4c 49 54 45 5f 53 54 41 4e 44 41  LE SQLITE_STANDA
25a40 52 44 20 54 48 52 4f 57 5f 4f 4e 5f 44 49 53 50  RD THROW_ON_DISP
25a50 4f 53 45 44 20 54 52 41 43 45 20 5c 0d 0a 20 20  OSED TRACE \..  
25a60 20 20 20 20 20 20 20 20 20 20 54 52 41 43 45 5f            TRACE_
25a70 43 4f 4e 4e 45 43 54 49 4f 4e 20 54 52 41 43 45  CONNECTION TRACE
25a80 5f 44 45 54 45 43 54 49 4f 4e 20 54 52 41 43 45  _DETECTION TRACE
25a90 5f 48 41 4e 44 4c 45 20 54 52 41 43 45 5f 50 52  _HANDLE TRACE_PR
25aa0 45 4c 4f 41 44 20 5c 0d 0a 20 20 20 20 20 20 20  ELOAD \..       
25ab0 20 20 20 20 20 54 52 41 43 45 5f 53 48 41 52 45       TRACE_SHARE
25ac0 44 20 54 52 41 43 45 5f 53 54 41 54 45 4d 45 4e  D TRACE_STATEMEN
25ad0 54 20 54 52 41 43 45 5f 57 41 52 4e 49 4e 47 20  T TRACE_WARNING 
25ae0 54 52 41 43 4b 5f 4d 45 4d 4f 52 59 5f 42 59 54  TRACK_MEMORY_BYT
25af0 45 53 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ES \..          
25b00 20 20 55 53 45 5f 45 4e 54 49 54 59 5f 46 52 41    USE_ENTITY_FRA
25b10 4d 45 57 4f 52 4b 5f 36 20 55 53 45 5f 49 4e 54  MEWORK_6 USE_INT
25b20 45 52 4f 50 5f 44 4c 4c 20 55 53 45 5f 50 52 45  EROP_DLL USE_PRE
25b30 50 41 52 45 5f 56 32 20 57 49 4e 44 4f 57 53 5d  PARE_V2 WINDOWS]
25b40 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d   {..          #.
25b50 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
25b60 45 3a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20  E: Check if the 
25b70 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74  compile-time opt
25b80 69 6f 6e 20 69 73 20 6c 69 73 74 65 64 20 69 6e  ion is listed in
25b90 20 74 68 65 20 6c 69 73 74 20 6f 66 0d 0a 20 20   the list of..  
25ba0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
25bb0 22 64 65 66 69 6e 65 20 63 6f 6e 73 74 61 6e 74  "define constant
25bc0 73 22 20 6b 65 70 74 20 74 72 61 63 6b 20 6f 66  s" kept track of
25bd0 20 62 79 20 74 68 65 20 6d 61 6e 61 67 65 64 20   by the managed 
25be0 61 73 73 65 6d 62 6c 79 2e 0d 0a 20 20 20 20 20  assembly...     
25bf0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
25c00 20 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65    checkForSQLite
25c10 44 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 20 24  DefineConstant $
25c20 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24  ::test_channel $
25c30 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 0d 0a  defineConstant..
25c40 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
25c50 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
25c60 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66  # NOTE: Check if
25c70 20 74 68 65 20 53 79 73 74 65 6d 2e 44 61 74 61   the System.Data
25c80 2e 53 51 4c 69 74 65 20 70 72 6f 76 69 64 65 72  .SQLite provider
25c90 20 77 61 73 20 63 6f 6d 70 69 6c 65 64 20 77 69   was compiled wi
25ca0 74 68 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  th..        #   
25cb0 20 20 20 20 73 75 70 70 6f 72 74 20 66 6f 72 20      support for 
25cc0 61 6e 79 20 65 6e 63 72 79 70 74 65 64 20 64 61  any encrypted da
25cd0 74 61 62 61 73 65 73 2e 0d 0a 20 20 20 20 20 20  tabases...      
25ce0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20    #..        if 
25cf0 7b 5b 68 61 76 65 53 51 4c 69 74 65 44 65 66 69  {[haveSQLiteDefi
25d00 6e 65 43 6f 6e 73 74 61 6e 74 20 49 4e 54 45 52  neConstant INTER
25d10 4f 50 5f 43 4f 44 45 43 5d 20 7c 7c 20 5c 0d 0a  OP_CODEC] || \..
25d20 20 20 20 20 20 20 20 20 20 20 20 20 5b 68 61 76              [hav
25d30 65 53 51 4c 69 74 65 44 65 66 69 6e 65 43 6f 6e  eSQLiteDefineCon
25d40 73 74 61 6e 74 20 49 4e 54 45 52 4f 50 5f 49 4e  stant INTEROP_IN
25d50 43 4c 55 44 45 5f 53 45 45 5d 7d 20 74 68 65 6e  CLUDE_SEE]} then
25d60 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d   {..          #.
25d70 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
25d80 45 3a 20 59 65 73 2c 20 61 64 64 20 67 65 6e 65  E: Yes, add gene
25d90 72 69 63 20 63 6f 6e 73 74 72 61 69 6e 74 20 66  ric constraint f
25da0 6f 72 20 75 73 65 20 62 79 20 74 68 65 20 74 65  or use by the te
25db0 73 74 20 73 75 69 74 65 2e 0d 0a 20 20 20 20 20  st suite...     
25dc0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
25dd0 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20    addConstraint 
25de0 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
25df0 74 65 2e 45 6e 63 72 79 70 74 69 6f 6e 0d 0a 20  te.Encryption.. 
25e00 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
25e10 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
25e20 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 74 68 65   NOTE: Check the
25e30 20 63 75 72 72 65 6e 74 20 62 75 69 6c 64 20 79   current build y
25e40 65 61 72 2e 20 20 42 61 73 69 63 61 6c 6c 79 2c  ear.  Basically,
25e50 20 74 68 69 73 20 69 6e 64 69 63 61 74 65 73 0d   this indicates.
25e60 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
25e70 20 77 68 69 63 68 20 76 65 72 73 69 6f 6e 20 6f   which version o
25e80 66 20 4d 53 42 75 69 6c 64 20 61 6e 64 2f 6f 72  f MSBuild and/or
25e90 20 56 69 73 75 61 6c 20 53 74 75 64 69 6f 20 77   Visual Studio w
25ea0 61 73 20 75 73 65 64 20 74 6f 0d 0a 20 20 20 20  as used to..    
25eb0 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 6d 70      #       comp
25ec0 69 6c 65 20 74 68 65 20 61 73 73 65 6d 62 6c 79  ile the assembly
25ed0 20 62 69 6e 61 72 69 65 73 20 75 6e 64 65 72 20   binaries under 
25ee0 74 65 73 74 2e 0d 0a 20 20 20 20 20 20 20 20 23  test...        #
25ef0 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
25f00 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
25f10 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  \..            "
25f20 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f  ---- checking fo
25f30 72 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  r System.Data.SQ
25f40 4c 69 74 65 20 62 75 69 6c 64 20 79 65 61 72 2e  Lite build year.
25f50 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20  .. "....        
25f60 73 65 74 20 79 65 61 72 20 5b 67 65 74 42 75 69  set year [getBui
25f70 6c 64 59 65 61 72 5d 0d 0a 20 20 20 20 20 20 20  ldYear]..       
25f80 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b   addConstraint [
25f90 61 70 70 65 6e 64 41 72 67 73 20 62 75 69 6c 64  appendArgs build
25fa0 59 65 61 72 2e 20 24 79 65 61 72 5d 0d 0a 20 20  Year. $year]..  
25fb0 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
25fc0 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
25fd0 65 6e 64 41 72 67 73 20 5c 22 20 24 79 65 61 72  endArgs \" $year
25fe0 20 5c 22 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20   \"\n]....      
25ff0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
26000 4f 54 45 3a 20 43 68 65 63 6b 20 74 68 65 20 63  OTE: Check the c
26010 75 72 72 65 6e 74 20 62 75 69 6c 64 20 2e 4e 45  urrent build .NE
26020 54 20 46 72 61 6d 65 77 6f 72 6b 2e 20 20 42 61  T Framework.  Ba
26030 73 69 63 61 6c 6c 79 2c 20 74 68 69 73 0d 0a 20  sically, this.. 
26040 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69         #       i
26050 6e 64 69 63 61 74 65 73 20 77 68 69 63 68 20 76  ndicates which v
26060 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 2e 4e  ersion of the .N
26070 45 54 20 46 72 61 6d 65 77 6f 72 6b 20 69 73 20  ET Framework is 
26080 62 65 69 6e 67 0d 0a 20 20 20 20 20 20 20 20 23  being..        #
26090 20 20 20 20 20 20 20 75 73 65 64 20 62 79 20 74         used by t
260a0 68 65 20 61 73 73 65 6d 62 6c 79 20 62 69 6e 61  he assembly bina
260b0 72 69 65 73 20 75 6e 64 65 72 20 74 65 73 74 2e  ries under test.
260c0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
260d0 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
260e0 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20  st_channel \..  
260f0 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
26100 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 53 79 73  checking for Sys
26110 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20  tem.Data.SQLite 
26120 62 75 69 6c 64 20 2e 4e 45 54 20 46 72 61 6d 65  build .NET Frame
26130 77 6f 72 6b 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20  work... "....   
26140 20 20 20 20 20 73 65 74 20 6e 65 74 46 78 20 5b       set netFx [
26150 67 65 74 42 75 69 6c 64 4e 65 74 46 78 5d 0d 0a  getBuildNetFx]..
26160 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74          addConst
26170 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67  raint [appendArg
26180 73 20 62 75 69 6c 64 46 72 61 6d 65 77 6f 72 6b  s buildFramework
26190 2e 20 24 6e 65 74 46 78 5d 0d 0a 20 20 20 20 20  . $netFx]..     
261a0 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
261b0 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
261c0 41 72 67 73 20 5c 22 20 24 6e 65 74 46 78 20 5c  Args \" $netFx \
261d0 22 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  "\n]....        
261e0 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
261f0 45 3a 20 43 68 65 63 6b 20 74 68 65 20 63 75 72  E: Check the cur
26200 72 65 6e 74 20 62 75 69 6c 64 20 63 6f 6e 66 69  rent build confi
26210 67 75 72 61 74 69 6f 6e 2e 20 20 54 68 69 73 20  guration.  This 
26220 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79 0d  should normally.
26230 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
26240 20 62 65 20 65 69 74 68 65 72 20 22 44 65 62 75   be either "Debu
26250 67 22 20 6f 72 20 22 52 65 6c 65 61 73 65 22 2e  g" or "Release".
26260 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
26270 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
26280 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20  st_channel \..  
26290 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
262a0 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 53 79 73  checking for Sys
262b0 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20  tem.Data.SQLite 
262c0 62 75 69 6c 64 20 63 6f 6e 66 69 67 75 72 61 74  build configurat
262d0 69 6f 6e 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20  ion... "....    
262e0 20 20 20 20 73 65 74 20 63 6f 6e 66 69 67 75 72      set configur
262f0 61 74 69 6f 6e 20 5b 67 65 74 42 75 69 6c 64 43  ation [getBuildC
26300 6f 6e 66 69 67 75 72 61 74 69 6f 6e 5d 0d 0a 20  onfiguration].. 
26310 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72         addConstr
26320 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
26330 20 62 75 69 6c 64 43 6f 6e 66 69 67 75 72 61 74   buildConfigurat
26340 69 6f 6e 2e 20 24 63 6f 6e 66 69 67 75 72 61 74  ion. $configurat
26350 69 6f 6e 5d 0d 0a 20 20 20 20 20 20 20 20 74 70  ion]..        tp
26360 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
26370 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
26380 5c 22 20 24 63 6f 6e 66 69 67 75 72 61 74 69 6f  \" $configuratio
26390 6e 20 5c 22 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20  n \"\n]....     
263a0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
263b0 4e 4f 54 45 3a 20 54 72 79 20 74 6f 20 73 65 74  NOTE: Try to set
263c0 75 70 20 61 6e 20 69 6e 74 65 72 72 75 70 74 20  up an interrupt 
263d0 63 61 6c 6c 62 61 63 6b 20 75 73 69 6e 67 20 74  callback using t
263e0 68 65 20 73 63 72 69 70 74 20 64 65 62 75 67 67  he script debugg
263f0 65 72 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  er..        #   
26400 20 20 20 20 74 68 61 74 20 77 69 6c 6c 20 63 61      that will ca
26410 6e 63 65 6c 20 61 6c 6c 20 53 51 4c 20 71 75 65  ncel all SQL que
26420 72 69 65 73 20 69 6e 20 70 72 6f 67 72 65 73 73  ries in progress
26430 20 66 6f 72 20 61 6c 6c 20 64 61 74 61 62 61 73   for all databas
26440 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
26450 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6b     connections k
26460 6e 6f 77 6e 20 74 6f 20 74 68 69 73 20 69 6e 74  nown to this int
26470 65 72 70 72 65 74 65 72 2e 0d 0a 20 20 20 20 20  erpreter...     
26480 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66     #..        if
26490 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
264a0 3a 3a 6e 6f 28 73 71 6c 69 74 65 49 6e 74 65 72  ::no(sqliteInter
264b0 72 75 70 74 43 61 6c 6c 62 61 63 6b 29 5d 7d 20  ruptCallback)]} 
264c0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
264d0 20 20 73 65 74 75 70 44 62 49 6e 74 65 72 72 75    setupDbInterru
264e0 70 74 43 61 6c 6c 62 61 63 6b 20 24 3a 3a 74 65  ptCallback $::te
264f0 73 74 5f 63 68 61 6e 6e 65 6c 20 24 3a 3a 74 65  st_channel $::te
26500 73 74 5f 6c 6f 67 0d 0a 20 20 20 20 20 20 20 20  st_log..        
26510 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  }....        #..
26520 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
26530 43 68 65 63 6b 20 66 6f 72 20 74 68 65 20 6e 61  Check for the na
26540 74 69 76 65 20 72 75 6e 74 69 6d 65 20 6f 70 74  tive runtime opt
26550 69 6f 6e 2c 20 77 68 69 63 68 20 77 6f 75 6c 64  ion, which would
26560 20 6d 65 61 6e 20 77 65 20 61 72 65 0d 0a 20 20   mean we are..  
26570 20 20 20 20 20 20 23 20 20 20 20 20 20 20 75 73        #       us
26580 69 6e 67 20 74 68 65 20 6d 69 78 65 64 2d 6d 6f  ing the mixed-mo
26590 64 65 20 61 73 73 65 6d 62 6c 79 2e 0d 0a 20 20  de assembly...  
265a0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
265b0 20 63 68 65 63 6b 46 6f 72 52 75 6e 74 69 6d 65   checkForRuntime
265c0 4f 70 74 69 6f 6e 20 24 3a 3a 74 65 73 74 5f 63  Option $::test_c
265d0 68 61 6e 6e 65 6c 20 6e 61 74 69 76 65 0d 0a 0d  hannel native...
265e0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
265f0 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63      # NOTE: Chec
26600 6b 20 69 66 20 74 68 65 20 74 65 73 74 20 73 75  k if the test su
26610 69 74 65 20 73 68 6f 75 6c 64 20 63 6f 75 6e 74  ite should count
26620 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
26630 6f 6e 6e 65 63 74 69 6f 6e 73 0d 0a 20 20 20 20  onnections..    
26640 20 20 20 20 23 20 20 20 20 20 20 20 22 6f 70 65      #       "ope
26650 6e 65 64 22 20 61 6e 64 20 22 63 6c 6f 73 65 64  ned" and "closed
26660 22 20 66 72 6f 6d 20 74 68 65 20 70 6f 6f 6c 20  " from the pool 
26670 77 68 65 6e 20 64 65 74 65 72 6d 69 6e 69 6e 67  when determining
26680 20 69 66 20 61 20 74 65 73 74 0d 0a 20 20 20 20   if a test..    
26690 20 20 20 20 23 20 20 20 20 20 20 20 70 61 73 73      #       pass
266a0 65 64 2e 20 20 44 69 73 61 62 6c 69 6e 67 20 74  ed.  Disabling t
266b0 68 69 73 20 62 65 68 61 76 69 6f 72 20 69 73 20  his behavior is 
266c0 73 6f 6d 65 74 69 6d 65 73 20 6e 65 63 65 73 73  sometimes necess
266d0 61 72 79 20 28 65 2e 67 2e 0d 0a 20 20 20 20 20  ary (e.g...     
266e0 20 20 20 23 20 20 20 20 20 20 20 64 75 72 69 6e     #       durin
266f0 67 20 74 68 65 20 72 65 6c 65 61 73 65 20 74 65  g the release te
26700 73 74 69 6e 67 20 70 72 6f 63 65 73 73 29 20 62  sting process) b
26710 65 63 61 75 73 65 20 74 68 65 72 65 20 61 72 65  ecause there are
26720 20 73 65 76 65 72 61 6c 0d 0a 20 20 20 20 20 20   several..      
26730 20 20 23 20 20 20 20 20 20 20 74 65 73 74 73 20    #       tests 
26740 74 68 61 74 20 72 65 6c 79 20 6f 6e 20 74 68 65  that rely on the
26750 20 22 6f 70 65 6e 65 64 20 66 72 6f 6d 20 70 6f   "opened from po
26760 6f 6c 22 20 63 6f 75 6e 74 20 62 65 69 6e 67 20  ol" count being 
26770 67 72 65 61 74 65 72 0d 0a 20 20 20 20 20 20 20  greater..       
26780 20 23 20 20 20 20 20 20 20 74 68 61 6e 20 7a 65   #       than ze
26790 72 6f 2e 20 20 54 68 65 73 65 20 74 65 73 74 73  ro.  These tests
267a0 20 6d 61 79 20 66 61 69 6c 20 64 75 65 20 74 6f   may fail due to
267b0 20 74 68 65 20 6e 6f 6e 2d 64 65 74 65 72 6d 69   the non-determi
267c0 6e 69 73 74 69 63 0d 0a 20 20 20 20 20 20 20 20  nistic..        
267d0 23 20 20 20 20 20 20 20 62 65 68 61 76 69 6f 72  #       behavior
267e0 20 6f 66 20 74 68 65 20 43 4c 52 20 47 43 2c 20   of the CLR GC, 
267f0 65 76 65 6e 20 77 68 65 6e 20 74 68 65 72 65 20  even when there 
26800 69 73 20 6e 6f 20 62 75 67 20 69 6e 20 74 68 65  is no bug in the
26810 20 63 6f 64 65 0d 0a 20 20 20 20 20 20 20 20 23   code..        #
26820 20 20 20 20 20 20 20 62 65 69 6e 67 20 74 65 73         being tes
26830 74 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ted...        #.
26840 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f  .        checkFo
26850 72 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 24  rRuntimeOption $
26860 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 6e  ::test_channel n
26870 6f 50 6f 6f 6c 43 6f 75 6e 74 73 0d 0a 0d 0a 20  oPoolCounts.... 
26880 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
26890 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20    # NOTE: Check 
268a0 69 66 20 74 68 65 20 74 65 73 74 20 73 75 69 74  if the test suit
268b0 65 20 73 68 6f 75 6c 64 20 75 73 65 20 73 68 61  e should use sha
268c0 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 2e 0d  red-cache mode..
268d0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
268e0 20 20 20 20 63 68 65 63 6b 46 6f 72 52 75 6e 74      checkForRunt
268f0 69 6d 65 4f 70 74 69 6f 6e 20 24 3a 3a 74 65 73  imeOption $::tes
26900 74 5f 63 68 61 6e 6e 65 6c 20 73 68 61 72 65 64  t_channel shared
26910 43 61 63 68 65 0d 0a 0d 0a 20 20 20 20 20 20 20  Cache....       
26920 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
26930 54 45 3a 20 52 65 70 6f 72 74 20 74 68 65 20 72  TE: Report the r
26940 65 73 6f 75 72 63 65 20 75 73 61 67 65 20 70 72  esource usage pr
26950 69 6f 72 20 74 6f 20 72 75 6e 6e 69 6e 67 20 61  ior to running a
26960 6e 79 20 74 65 73 74 73 2e 0d 0a 20 20 20 20 20  ny tests...     
26970 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65     #..        re
26980 70 6f 72 74 53 51 4c 69 74 65 52 65 73 6f 75 72  portSQLiteResour
26990 63 65 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  ces $::test_chan
269a0 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23  nel....        #
269b0 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
269c0 3a 20 47 72 61 62 20 74 68 65 20 6c 69 73 74 20  : Grab the list 
269d0 6f 66 20 6e 61 74 69 76 65 20 6d 6f 64 75 6c 65  of native module
269e0 73 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e  s for the curren
269f0 74 20 70 72 6f 63 65 73 73 20 61 6e 64 0d 0a 20  t process and.. 
26a00 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 72         #       r
26a10 65 70 6f 72 74 20 6f 6e 20 74 68 65 20 53 79 73  eport on the Sys
26a20 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20  tem.Data.SQLite 
26a30 72 65 6c 61 74 65 64 20 6f 6e 65 73 2e 0d 0a 20  related ones... 
26a40 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
26a50 20 20 69 66 20 7b 5b 68 61 76 65 53 51 4c 69 74    if {[haveSQLit
26a60 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d 7d  eObjectCommand]}
26a70 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
26a80 20 20 20 73 65 74 20 6d 6f 64 75 6c 65 73 20 5b     set modules [
26a90 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 5c 0d  object invoke \.
26aa0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53  .              S
26ab0 79 73 74 65 6d 2e 44 69 61 67 6e 6f 73 74 69 63  ystem.Diagnostic
26ac0 73 2e 50 72 6f 63 65 73 73 2e 47 65 74 43 75 72  s.Process.GetCur
26ad0 72 65 6e 74 50 72 6f 63 65 73 73 20 4d 6f 64 75  rentProcess Modu
26ae0 6c 65 73 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  les]....        
26af0 20 20 6f 62 6a 65 63 74 20 66 6f 72 65 61 63 68    object foreach
26b00 20 2d 61 6c 69 61 73 20 6d 6f 64 75 6c 65 20 24   -alias module $
26b10 6d 6f 64 75 6c 65 73 20 7b 0d 0a 20 20 20 20 20  modules {..     
26b20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
26b30 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68        # NOTE: Th
26b40 65 20 6d 6f 64 75 6c 65 20 66 69 6c 65 20 6e 61  e module file na
26b50 6d 65 20 68 65 72 65 20 6d 75 73 74 20 62 65 20  me here must be 
26b60 6e 6f 72 6d 61 6c 69 7a 65 64 2e 0d 0a 20 20 20  normalized...   
26b70 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
26b80 20 20 20 20 20 20 20 20 73 65 74 20 66 69 6c 65          set file
26b90 4e 61 6d 65 20 5b 66 69 6c 65 20 6e 6f 72 6d 61  Name [file norma
26ba0 6c 69 7a 65 20 5b 24 6d 6f 64 75 6c 65 20 46 69  lize [$module Fi
26bb0 6c 65 4e 61 6d 65 5d 5d 0d 0a 20 20 20 20 20 20  leName]]..      
26bc0 20 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61        set fileNa
26bd0 6d 65 4f 6e 6c 79 20 5b 66 69 6c 65 20 74 61 69  meOnly [file tai
26be0 6c 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a  l $fileName]....
26bf0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
26c00 5b 6c 73 65 61 72 63 68 20 2d 65 78 61 63 74 20  [lsearch -exact 
26c10 2d 6e 6f 63 61 73 65 20 2d 2d 20 5c 0d 0a 20 20  -nocase -- \..  
26c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 67                [g
26c30 65 74 4e 61 74 69 76 65 4c 69 62 72 61 72 79 46  etNativeLibraryF
26c40 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79 5d 20 24 66  ileNamesOnly] $f
26c50 69 6c 65 4e 61 6d 65 4f 6e 6c 79 5d 20 21 3d 20  ileNameOnly] != 
26c60 2d 31 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  -1} then {..    
26c70 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
26c80 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
26c90 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
26ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26cb0 20 22 2d 2d 2d 2d 20 66 6f 75 6e 64 20 6c 6f 61   "---- found loa
26cc0 64 65 64 20 53 51 4c 69 74 65 20 6e 61 74 69 76  ded SQLite nativ
26cd0 65 20 6c 69 62 72 61 72 79 20 6d 6f 64 75 6c 65  e library module
26ce0 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  : " \..         
26cf0 20 20 20 20 20 20 20 20 20 24 66 69 6c 65 4e 61           $fileNa
26d00 6d 65 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  me \n]..        
26d10 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 6c      } elseif {[l
26d20 73 65 61 72 63 68 20 2d 65 78 61 63 74 20 2d 6e  search -exact -n
26d30 6f 63 61 73 65 20 2d 2d 20 5c 0d 0a 20 20 20 20  ocase -- \..    
26d40 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74              [get
26d50 49 6e 74 65 72 6f 70 41 73 73 65 6d 62 6c 79 46  InteropAssemblyF
26d60 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79 5d 20 24 66  ileNamesOnly] $f
26d70 69 6c 65 4e 61 6d 65 4f 6e 6c 79 5d 20 21 3d 20  ileNameOnly] != 
26d80 2d 31 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  -1} then {..    
26d90 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
26da0 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
26db0 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
26dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26dd0 20 22 2d 2d 2d 2d 20 66 6f 75 6e 64 20 6c 6f 61   "---- found loa
26de0 64 65 64 20 53 51 4c 69 74 65 20 69 6e 74 65 72  ded SQLite inter
26df0 6f 70 20 61 73 73 65 6d 62 6c 79 20 6d 6f 64 75  op assembly modu
26e00 6c 65 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20  le: " \..       
26e10 20 20 20 20 20 20 20 20 20 20 20 24 66 69 6c 65             $file
26e20 4e 61 6d 65 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  Name \n]..      
26e30 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
26e40 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
26e50 0a 0d 0a 20 20 20 20 20 20 20 20 63 61 74 63 68  ...        catch
26e60 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70   {..          tp
26e70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
26e80 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  nel \..         
26e90 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 6d 70 69       "---- compi
26ea0 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 73 20  le-time options 
26eb0 66 6f 72 20 53 51 4c 69 74 65 20 63 6f 72 65 20  for SQLite core 
26ec0 6c 69 62 72 61 72 79 2e 2e 2e 20 22 0d 0a 0d 0a  library... "....
26ed0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63            if {[c
26ee0 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
26ef0 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b      object invok
26f00 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62  e -flags +NonPub
26f10 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  lic \..         
26f20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61         System.Da
26f30 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65  ta.SQLite.SQLite
26f40 33 20 53 51 4c 69 74 65 43 6f 6d 70 69 6c 65 4f  3 SQLiteCompileO
26f50 70 74 69 6f 6e 73 0d 0a 20 20 20 20 20 20 20 20  ptions..        
26f60 20 20 7d 20 63 6f 6d 70 69 6c 65 4f 70 74 69 6f    } compileOptio
26f70 6e 73 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  ns] == 0} then {
26f80 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
26f90 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
26fa0 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
26fb0 5b 66 6f 72 6d 61 74 4c 69 73 74 20 5b 6c 73 6f  [formatList [lso
26fc0 72 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  rt \..          
26fd0 20 20 20 20 20 20 24 63 6f 6d 70 69 6c 65 4f 70        $compileOp
26fe0 74 69 6f 6e 73 5d 20 3c 6e 6f 6e 65 3e 5d 20 5c  tions] <none>] \
26ff0 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20  n]..          } 
27000 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
27010 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
27020 74 5f 63 68 61 6e 6e 65 6c 20 75 6e 6b 6e 6f 77  t_channel unknow
27030 6e 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  n\n..          }
27040 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
27050 20 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a         catch {..
27060 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
27070 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
27080 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
27090 20 22 2d 2d 2d 2d 20 63 6f 6d 70 69 6c 65 2d 74   "---- compile-t
270a0 69 6d 65 20 6f 70 74 69 6f 6e 73 20 66 6f 72 20  ime options for 
270b0 53 51 4c 69 74 65 20 69 6e 74 65 72 6f 70 20 61  SQLite interop a
270c0 73 73 65 6d 62 6c 79 2e 2e 2e 20 22 0d 0a 0d 0a  ssembly... "....
270d0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63            if {[c
270e0 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
270f0 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b      object invok
27100 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62  e -flags +NonPub
27110 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  lic \..         
27120 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61         System.Da
27130 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65  ta.SQLite.SQLite
27140 33 20 49 6e 74 65 72 6f 70 43 6f 6d 70 69 6c 65  3 InteropCompile
27150 4f 70 74 69 6f 6e 73 0d 0a 20 20 20 20 20 20 20  Options..       
27160 20 20 20 7d 20 63 6f 6d 70 69 6c 65 4f 70 74 69     } compileOpti
27170 6f 6e 73 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ons] == 0} then 
27180 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
27190 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
271a0 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
271b0 20 5b 66 6f 72 6d 61 74 4c 69 73 74 20 5b 6c 73   [formatList [ls
271c0 6f 72 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ort \..         
271d0 20 20 20 20 20 20 20 24 63 6f 6d 70 69 6c 65 4f         $compileO
271e0 70 74 69 6f 6e 73 5d 20 3c 6e 6f 6e 65 3e 5d 20  ptions] <none>] 
271f0 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  \n]..          }
27200 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
27210 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
27220 73 74 5f 63 68 61 6e 6e 65 6c 20 75 6e 6b 6e 6f  st_channel unkno
27230 77 6e 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20 20  wn\n..          
27240 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  }..        }....
27250 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
27260 20 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20     # NOTE: Show 
27270 74 68 65 20 61 63 74 69 76 65 20 74 65 73 74 20  the active test 
27280 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0d 0a 20 20  constraints...  
27290 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
272a0 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
272b0 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
272c0 67 73 20 22 2d 2d 2d 2d 20 63 6f 6e 73 74 72 61  gs "---- constra
272d0 69 6e 74 73 3a 20 22 20 5c 0d 0a 20 20 20 20 20  ints: " \..     
272e0 20 20 20 20 20 20 20 5b 66 6f 72 6d 61 74 4c 69         [formatLi
272f0 73 74 20 5b 6c 73 6f 72 74 20 5b 67 65 74 43 6f  st [lsort [getCo
27300 6e 73 74 72 61 69 6e 74 73 5d 5d 20 3c 6e 6f 6e  nstraints]] <non
27310 65 3e 5d 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20  e>] \n]....     
27320 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
27330 4e 4f 54 45 3a 20 53 61 76 65 20 74 68 65 20 74  NOTE: Save the t
27340 65 73 74 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  est constraints 
27350 66 6f 72 20 75 73 65 20 62 79 20 74 68 72 65 61  for use by threa
27360 64 73 20 63 72 65 61 74 65 64 20 69 6e 20 74 68  ds created in th
27370 69 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  is..        #   
27380 20 20 20 20 61 70 70 6c 69 63 61 74 69 6f 6e 20      application 
27390 64 6f 6d 61 69 6e 2e 20 20 54 68 69 73 20 69 73  domain.  This is
273a0 20 6e 65 63 65 73 73 61 72 79 20 62 65 63 61 75   necessary becau
273b0 73 65 20 61 6c 6c 20 74 68 65 20 45 61 67 6c 65  se all the Eagle
273c0 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
273d0 20 20 22 74 65 73 74 20 63 6f 6e 74 65 78 74 22    "test context"
273e0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
273f0 70 65 72 2d 74 68 72 65 61 64 2e 0d 0a 20 20 20  per-thread...   
27400 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
27410 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
27420 73 20 3a 3a 74 65 73 74 5f 63 6f 6e 73 74 72 61  s ::test_constra
27430 69 6e 74 73 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  ints]} then {.. 
27440 20 20 20 20 20 20 20 20 20 73 65 74 20 3a 3a 74           set ::t
27450 65 73 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20  est_constraints 
27460 24 3a 3a 65 61 67 6c 65 5f 74 65 73 74 73 28 63  $::eagle_tests(c
27470 6f 6e 73 74 72 61 69 6e 74 73 29 0d 0a 20 20 20  onstraints)..   
27480 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
27490 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
274a0 4f 54 45 3a 20 4c 6f 61 64 20 74 68 65 20 22 61  OTE: Load the "a
274b0 66 74 65 72 2d 63 6f 6e 73 74 72 61 69 6e 74 73  fter-constraints
274c0 22 20 63 75 73 74 6f 6d 20 70 65 72 2d 75 73 65  " custom per-use
274d0 72 20 61 6e 64 2f 6f 72 20 70 65 72 2d 68 6f 73  r and/or per-hos
274e0 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  t..        #    
274f0 20 20 20 74 65 73 74 20 73 65 74 74 69 6e 67 73     test settings
27500 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 23   now...        #
27510 0d 0a 20 20 20 20 20 20 20 20 75 70 6c 65 76 65  ..        upleve
27520 6c 20 31 20 5b 6c 69 73 74 20 6c 6f 61 64 53 51  l 1 [list loadSQ
27530 4c 69 74 65 54 65 73 74 53 65 74 74 69 6e 67 73  LiteTestSettings
27540 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
27550 20 2e 61 66 74 65 72 5d 0d 0a 0d 0a 20 20 20 20   .after]....    
27560 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
27570 20 4e 4f 54 45 3a 20 49 66 20 6e 65 63 65 73 73   NOTE: If necess
27580 61 72 79 2c 20 65 6e 61 62 6c 65 20 73 68 61 72  ary, enable shar
27590 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 20 6e 6f  ed-cache mode no
275a0 77 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  w...        #.. 
275b0 20 20 20 20 20 20 20 69 66 20 7b 5b 68 61 73 52         if {[hasR
275c0 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 73 68 61  untimeOption sha
275d0 72 65 64 43 61 63 68 65 5d 7d 20 74 68 65 6e 20  redCache]} then 
275e0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 65 6e 61  {..          ena
275f0 62 6c 65 53 68 61 72 65 64 43 61 63 68 65 20 24  bleSharedCache $
27600 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 74  ::test_channel t
27610 72 75 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  rue..        }..
27620 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
27630 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f       # NOTE: Sho
27640 77 20 77 68 65 6e 20 6f 75 72 20 74 65 73 74 73  w when our tests
27650 20 61 63 74 75 61 6c 6c 79 20 62 65 67 61 6e 20   actually began 
27660 28 6e 6f 77 29 2e 0d 0a 20 20 20 20 20 20 20 20  (now)...        
27670 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  #..        tputs
27680 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
27690 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
276a0 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
276b0 2d 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  - System.Data.SQ
276c0 4c 69 74 65 20 74 65 73 74 73 20 62 65 67 61 6e  Lite tests began
276d0 20 61 74 20 22 20 5c 0d 0a 20 20 20 20 20 20 20   at " \..       
276e0 20 20 20 20 20 5b 63 6c 6f 63 6b 20 66 6f 72 6d       [clock form
276f0 61 74 20 5b 63 6c 6f 63 6b 20 73 65 63 6f 6e 64  at [clock second
27700 73 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d  s]] \n]..      }
27710 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
27720 70 72 6f 63 20 72 75 6e 53 51 4c 69 74 65 54 65  proc runSQLiteTe
27730 73 74 46 69 6c 65 73 50 72 6f 6c 6f 67 75 65 20  stFilesPrologue 
27740 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 75 70 6c 65  {} {..      uple
27750 76 65 6c 20 31 20 7b 0d 0a 20 20 20 20 20 20 20  vel 1 {..       
27760 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
27770 54 45 3a 20 53 65 74 75 70 20 74 68 65 20 76 61  TE: Setup the va
27780 72 69 61 62 6c 65 73 20 74 68 61 74 20 72 65 66  riables that ref
27790 65 72 20 74 6f 20 74 68 65 20 76 61 72 69 6f 75  er to the variou
277a0 73 20 6e 6f 6e 2d 64 61 74 61 20 66 69 6c 65 73  s non-data files
277b0 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
277c0 20 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68    required by th
277d0 65 20 74 65 73 74 73 20 69 6e 20 74 68 69 73 20  e tests in this 
277e0 66 69 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 23  file...        #
277f0 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 65 6e  ..        set en
27800 74 69 74 79 46 72 61 6d 65 77 6f 72 6b 44 6c 6c  tityFrameworkDll
27810 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  File \..        
27820 20 20 20 20 5b 67 65 74 42 75 69 6c 64 46 69 6c      [getBuildFil
27830 65 4e 61 6d 65 20 45 6e 74 69 74 79 46 72 61 6d  eName EntityFram
27840 65 77 6f 72 6b 2e 64 6c 6c 20 74 72 75 65 5d 0d  ework.dll true].
27850 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 69  ...        set i
27860 6e 73 74 61 6c 6c 65 72 45 78 65 46 69 6c 65 20  nstallerExeFile 
27870 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
27880 67 65 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65  getBuildFileName
27890 20 49 6e 73 74 61 6c 6c 65 72 2e 65 78 65 20 74   Installer.exe t
278a0 72 75 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  rue]....        
278b0 73 65 74 20 73 71 6c 69 74 65 44 65 73 69 67 6e  set sqliteDesign
278c0 65 72 44 6c 6c 46 69 6c 65 20 5c 0d 0a 20 20 20  erDllFile \..   
278d0 20 20 20 20 20 20 20 20 20 5b 67 65 74 42 75 69           [getBui
278e0 6c 64 46 69 6c 65 4e 61 6d 65 20 53 51 4c 69 74  ldFileName SQLit
278f0 65 2e 44 65 73 69 67 6e 65 72 2e 64 6c 6c 20 74  e.Designer.dll t
27900 72 75 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  rue]....        
27910 73 65 74 20 73 79 73 74 65 6d 44 61 74 61 53 51  set systemDataSQ
27920 4c 69 74 65 44 6c 6c 46 69 6c 65 20 5c 0d 0a 20  LiteDllFile \.. 
27930 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 42             [getB
27940 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20 53 79 73  uildFileName Sys
27950 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
27960 64 6c 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  dll \..         
27970 20 20 20 5b 65 78 70 72 20 7b 21 5b 68 61 73 52     [expr {![hasR
27980 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 6e 61 74  untimeOption nat
27990 69 76 65 5d 7d 5d 5d 0d 0a 0d 0a 20 20 20 20 20  ive]}]]....     
279a0 20 20 20 73 65 74 20 73 79 73 74 65 6d 44 61 74     set systemDat
279b0 61 53 51 4c 69 74 65 4c 69 6e 71 44 6c 6c 46 69  aSQLiteLinqDllFi
279c0 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  le \..          
279d0 20 20 5b 67 65 74 42 75 69 6c 64 46 69 6c 65 4e    [getBuildFileN
279e0 61 6d 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  ame System.Data.
279f0 53 51 4c 69 74 65 2e 4c 69 6e 71 2e 64 6c 6c 20  SQLite.Linq.dll 
27a00 74 72 75 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  true]....       
27a10 20 73 65 74 20 73 79 73 74 65 6d 44 61 74 61 53   set systemDataS
27a20 51 4c 69 74 65 45 66 36 44 6c 6c 46 69 6c 65 20  QLiteEf6DllFile 
27a30 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
27a40 67 65 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65  getBuildFileName
27a50 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
27a60 69 74 65 2e 45 46 36 2e 64 6c 6c 20 74 72 75 65  ite.EF6.dll true
27a70 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74  ]....        set
27a80 20 74 65 73 74 45 78 65 46 69 6c 65 20 5b 67 65   testExeFile [ge
27a90 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20 74  tBuildFileName t
27aa0 65 73 74 2e 65 78 65 20 74 72 75 65 5d 0d 0a 20  est.exe true].. 
27ab0 20 20 20 20 20 20 20 73 65 74 20 74 65 73 74 4c         set testL
27ac0 69 6e 71 45 78 65 46 69 6c 65 20 5b 67 65 74 42  inqExeFile [getB
27ad0 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20 74 65 73  uildFileName tes
27ae0 74 6c 69 6e 71 2e 65 78 65 20 74 72 75 65 5d 0d  tlinq.exe true].
27af0 0a 20 20 20 20 20 20 20 20 73 65 74 20 74 65 73  .        set tes
27b00 74 45 66 36 45 78 65 46 69 6c 65 20 5b 67 65 74  tEf6ExeFile [get
27b10 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20 74 65  BuildFileName te
27b20 73 74 65 66 36 2e 65 78 65 20 74 72 75 65 5d 0d  stef6.exe true].
27b30 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
27b40 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 65        # NOTE: Se
27b50 74 75 70 20 74 68 65 20 76 61 72 69 61 62 6c 65  tup the variable
27b60 73 20 74 68 61 74 20 72 65 66 65 72 20 74 6f 20  s that refer to 
27b70 74 68 65 20 76 61 72 69 6f 75 73 20 64 61 74 61  the various data
27b80 20 66 69 6c 65 73 0d 0a 20 20 20 20 20 20 20 20   files..        
27b90 23 20 20 20 20 20 20 20 72 65 71 75 69 72 65 64  #       required
27ba0 20 62 79 20 74 68 65 20 74 65 73 74 73 20 69 6e   by the tests in
27bb0 20 74 68 69 73 20 66 69 6c 65 2e 0d 0a 20 20 20   this file...   
27bc0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
27bd0 73 65 74 20 74 65 73 74 4c 69 6e 71 4f 75 74 46  set testLinqOutF
27be0 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65  ile [file native
27bf0 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20  name [file join 
27c00 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
27c10 67 65 74 53 51 4c 69 74 65 54 65 73 74 44 61 74  getSQLiteTestDat
27c20 61 50 61 74 68 5d 20 74 65 73 74 6c 69 6e 71 2e  aPath] testlinq.
27c30 6f 75 74 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  out]]....       
27c40 20 73 65 74 20 6e 6f 72 74 68 77 69 6e 64 45 66   set northwindEf
27c50 44 62 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74  DbFile [file nat
27c60 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f  ivename [file jo
27c70 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  in \..          
27c80 20 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20    [file dirname 
27c90 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20 5b 67  [file dirname [g
27ca0 65 74 53 51 4c 69 74 65 54 65 73 74 44 61 74 61  etSQLiteTestData
27cb0 50 61 74 68 5d 5d 5d 20 5c 0d 0a 20 20 20 20 20  Path]]] \..     
27cc0 20 20 20 20 20 20 20 74 65 73 74 6c 69 6e 71 20         testlinq 
27cd0 6e 6f 72 74 68 77 69 6e 64 45 46 2e 64 62 5d 5d  northwindEF.db]]
27ce0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20  ....        set 
27cf0 6e 6f 6e 57 61 6c 44 62 46 69 6c 65 20 5b 66 69  nonWalDbFile [fi
27d00 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66  le nativename [f
27d10 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20  ile join \..    
27d20 20 20 20 20 20 20 20 20 5b 67 65 74 53 51 4c 69          [getSQLi
27d30 74 65 54 65 73 74 44 61 74 61 50 61 74 68 5d 20  teTestDataPath] 
27d40 6e 6f 6e 57 61 6c 2e 64 62 5d 5d 0d 0a 0d 0a 20  nonWal.db]].... 
27d50 20 20 20 20 20 20 20 73 65 74 20 77 61 6c 44 62         set walDb
27d60 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69 76  File [file nativ
27d70 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e  ename [file join
27d80 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
27d90 5b 67 65 74 53 51 4c 69 74 65 54 65 73 74 44 61  [getSQLiteTestDa
27da0 74 61 50 61 74 68 5d 20 77 61 6c 2e 64 62 5d 5d  taPath] wal.db]]
27db0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
27dc0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54         # NOTE: T
27dd0 68 65 20 76 61 72 69 6f 75 73 20 69 6e 73 74 61  he various insta
27de0 6c 6c 2f 75 6e 69 6e 73 74 61 6c 6c 20 6c 6f 67  ll/uninstall log
27df0 20 66 69 6c 65 73 20 75 73 65 64 20 74 6f 20 74   files used to t
27e00 65 73 74 20 74 68 65 0d 0a 20 20 20 20 20 20 20  est the..       
27e10 20 23 20 20 20 20 20 20 20 64 65 73 69 67 6e 2d   #       design-
27e20 74 69 6d 65 20 63 6f 6d 70 6f 6e 65 6e 74 20 69  time component i
27e30 6e 73 74 61 6c 6c 65 72 2e 0d 0a 20 20 20 20 20  nstaller...     
27e40 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65     #..        se
27e50 74 20 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32  t testInstallVs2
27e60 30 30 35 4c 6f 67 46 69 6c 65 20 5b 66 69 6c 65  005LogFile [file
27e70 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c   nativename [fil
27e80 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20  e join \..      
27e90 20 20 20 20 20 20 5b 67 65 74 53 51 4c 69 74 65        [getSQLite
27ea0 54 65 73 74 44 61 74 61 50 61 74 68 5d 20 49 6e  TestDataPath] In
27eb0 73 74 61 6c 6c 65 72 5f 54 65 73 74 5f 56 73 32  staller_Test_Vs2
27ec0 30 30 35 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20  005.log]]....   
27ed0 20 20 20 20 20 73 65 74 20 74 65 73 74 49 6e 73       set testIns
27ee0 74 61 6c 6c 56 73 32 30 30 38 4c 6f 67 46 69 6c  tallVs2008LogFil
27ef0 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61  e [file nativena
27f00 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d  me [file join \.
27f10 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65  .            [ge
27f20 74 53 51 4c 69 74 65 54 65 73 74 44 61 74 61 50  tSQLiteTestDataP
27f30 61 74 68 5d 20 49 6e 73 74 61 6c 6c 65 72 5f 54  ath] Installer_T
27f40 65 73 74 5f 56 73 32 30 30 38 2e 6c 6f 67 5d 5d  est_Vs2008.log]]
27f50 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20  ....        set 
27f60 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 31  testInstallVs201
27f70 30 4c 6f 67 46 69 6c 65 20 5b 66 69 6c 65 20 6e  0LogFile [file n
27f80 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20  ativename [file 
27f90 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20  join \..        
27fa0 20 20 20 20 5b 67 65 74 53 51 4c 69 74 65 54 65      [getSQLiteTe
27fb0 73 74 44 61 74 61 50 61 74 68 5d 20 49 6e 73 74  stDataPath] Inst
27fc0 61 6c 6c 65 72 5f 54 65 73 74 5f 56 73 32 30 31  aller_Test_Vs201
27fd0 30 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20  0.log]]....     
27fe0 20 20 20 73 65 74 20 74 65 73 74 49 6e 73 74 61     set testInsta
27ff0 6c 6c 56 73 32 30 31 32 4c 6f 67 46 69 6c 65 20  llVs2012LogFile 
28000 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65  [file nativename
28010 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20   [file join \.. 
28020 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 53             [getS
28030 51 4c 69 74 65 54 65 73 74 44 61 74 61 50 61 74  QLiteTestDataPat
28040 68 5d 20 49 6e 73 74 61 6c 6c 65 72 5f 54 65 73  h] Installer_Tes
28050 74 5f 56 73 32 30 31 32 2e 6c 6f 67 5d 5d 0d 0a  t_Vs2012.log]]..
28060 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 74 65  ..        set te
28070 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 31 33 4c  stInstallVs2013L
28080 6f 67 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74  ogFile [file nat
28090 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f  ivename [file jo
280a0 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  in \..          
280b0 20 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73 74    [getSQLiteTest
280c0 44 61 74 61 50 61 74 68 5d 20 49 6e 73 74 61 6c  DataPath] Instal
280d0 6c 65 72 5f 54 65 73 74 5f 56 73 32 30 31 33 2e  ler_Test_Vs2013.
280e0 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  log]]....       
280f0 20 73 65 74 20 74 65 73 74 49 6e 73 74 61 6c 6c   set testInstall
28100 56 73 32 30 31 35 4c 6f 67 46 69 6c 65 20 5b 66  Vs2015LogFile [f
28110 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b  ile nativename [
28120 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20  file join \..   
28130 20 20 20 20 20 20 20 20 20 5b 67 65 74 53 51 4c           [getSQL
28140 69 74 65 54 65 73 74 44 61 74 61 50 61 74 68 5d  iteTestDataPath]
28150 20 49 6e 73 74 61 6c 6c 65 72 5f 54 65 73 74 5f   Installer_Test_
28160 56 73 32 30 31 35 2e 6c 6f 67 5d 5d 0d 0a 0d 0a  Vs2015.log]]....
28170 20 20 20 20 20 20 20 20 73 65 74 20 74 65 73 74          set test
28180 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 30 35 4c  UninstallVs2005L
28190 6f 67 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74  ogFile [file nat
281a0 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f  ivename [file jo
281b0 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  in \..          
281c0 20 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73 74    [getSQLiteTest
281d0 44 61 74 61 50 61 74 68 5d 20 55 6e 69 6e 73 74  DataPath] Uninst
281e0 61 6c 6c 65 72 5f 54 65 73 74 5f 56 73 32 30 30  aller_Test_Vs200
281f0 35 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20  5.log]]....     
28200 20 20 20 73 65 74 20 74 65 73 74 55 6e 69 6e 73     set testUnins
28210 74 61 6c 6c 56 73 32 30 30 38 4c 6f 67 46 69 6c  tallVs2008LogFil
28220 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61  e [file nativena
28230 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d  me [file join \.
28240 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65  .            [ge
28250 74 53 51 4c 69 74 65 54 65 73 74 44 61 74 61 50  tSQLiteTestDataP
28260 61 74 68 5d 20 55 6e 69 6e 73 74 61 6c 6c 65 72  ath] Uninstaller
28270 5f 54 65 73 74 5f 56 73 32 30 30 38 2e 6c 6f 67  _Test_Vs2008.log
28280 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65  ]]....        se
28290 74 20 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56  t testUninstallV
282a0 73 32 30 31 30 4c 6f 67 46 69 6c 65 20 5b 66 69  s2010LogFile [fi
282b0 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66  le nativename [f
282c0 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20  ile join \..    
282d0 20 20 20 20 20 20 20 20 5b 67 65 74 53 51 4c 69          [getSQLi
282e0 74 65 54 65 73 74 44 61 74 61 50 61 74 68 5d 20  teTestDataPath] 
282f0 55 6e 69 6e 73 74 61 6c 6c 65 72 5f 54 65 73 74  Uninstaller_Test
28300 5f 56 73 32 30 31 30 2e 6c 6f 67 5d 5d 0d 0a 0d  _Vs2010.log]]...
28310 0a 20 20 20 20 20 20 20 20 73 65 74 20 74 65 73  .        set tes
28320 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31 32  tUninstallVs2012
28330 4c 6f 67 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61  LogFile [file na
28340 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a  tivename [file j
28350 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  oin \..         
28360 20 20 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73     [getSQLiteTes
28370 74 44 61 74 61 50 61 74 68 5d 20 55 6e 69 6e 73  tDataPath] Unins
28380 74 61 6c 6c 65 72 5f 54 65 73 74 5f 56 73 32 30  taller_Test_Vs20
28390 31 32 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20  12.log]]....    
283a0 20 20 20 20 73 65 74 20 74 65 73 74 55 6e 69 6e      set testUnin
283b0 73 74 61 6c 6c 56 73 32 30 31 33 4c 6f 67 46 69  stallVs2013LogFi
283c0 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e  le [file nativen
283d0 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c  ame [file join \
283e0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 67  ..            [g
283f0 65 74 53 51 4c 69 74 65 54 65 73 74 44 61 74 61  etSQLiteTestData
28400 50 61 74 68 5d 20 55 6e 69 6e 73 74 61 6c 6c 65  Path] Uninstalle
28410 72 5f 54 65 73 74 5f 56 73 32 30 31 33 2e 6c 6f  r_Test_Vs2013.lo
28420 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73  g]]....        s
28430 65 74 20 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c  et testUninstall
28440 56 73 32 30 31 35 4c 6f 67 46 69 6c 65 20 5b 66  Vs2015LogFile [f
28450 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b  ile nativename [
28460 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20  file join \..   
28470 20 20 20 20 20 20 20 20 20 5b 67 65 74 53 51 4c           [getSQL
28480 69 74 65 54 65 73 74 44 61 74 61 50 61 74 68 5d  iteTestDataPath]
28490 20 55 6e 69 6e 73 74 61 6c 6c 65 72 5f 54 65 73   Uninstaller_Tes
284a0 74 5f 56 73 32 30 31 35 2e 6c 6f 67 5d 5d 0d 0a  t_Vs2015.log]]..
284b0 0d 0a 20 20 20 20 20 20 20 20 23 23 23 23 23 23  ..        ######
284c0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
284d0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
284e0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
284f0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
28500 23 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20  #....        if 
28510 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e  {![haveConstrain
28520 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69  t [appendArgs fi
28530 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  le_ \..         
28540 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 65     [file tail $e
28550 6e 74 69 74 79 46 72 61 6d 65 77 6f 72 6b 44 6c  ntityFrameworkDl
28560 6c 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b  lFile]]]} then {
28570 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68 65 63  ..          chec
28580 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63  kForFile $test_c
28590 68 61 6e 6e 65 6c 20 24 65 6e 74 69 74 79 46 72  hannel $entityFr
285a0 61 6d 65 77 6f 72 6b 44 6c 6c 46 69 6c 65 0d 0a  ameworkDllFile..
285b0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
285c0 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43       if {![haveC
285d0 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e  onstraint [appen
285e0 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20  dArgs file_ \.. 
285f0 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65             [file
28600 20 74 61 69 6c 20 24 69 6e 73 74 61 6c 6c 65 72   tail $installer
28610 45 78 65 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e  ExeFile]]]} then
28620 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68   {..          ch
28630 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74  eckForFile $test
28640 5f 63 68 61 6e 6e 65 6c 20 24 69 6e 73 74 61 6c  _channel $instal
28650 6c 65 72 45 78 65 46 69 6c 65 20 49 6e 73 74 61  lerExeFile Insta
28660 6c 6c 65 72 2e 65 78 65 0d 0a 20 20 20 20 20 20  ller.exe..      
28670 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69    }....        i
28680 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61  f {![haveConstra
28690 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20  int [appendArgs 
286a0 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20  file_ \..       
286b0 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20       [file tail 
286c0 24 73 71 6c 69 74 65 44 65 73 69 67 6e 65 72 44  $sqliteDesignerD
286d0 6c 6c 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20  llFile]]]} then 
286e0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68 65  {..          che
286f0 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f  ckForFile $test_
28700 63 68 61 6e 6e 65 6c 20 24 73 71 6c 69 74 65 44  channel $sqliteD
28710 65 73 69 67 6e 65 72 44 6c 6c 46 69 6c 65 0d 0a  esignerDllFile..
28720 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
28730 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43       if {![haveC
28740 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e  onstraint [appen
28750 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20  dArgs file_ \.. 
28760 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65             [file
28770 20 74 61 69 6c 20 24 73 79 73 74 65 6d 44 61 74   tail $systemDat
28780 61 53 51 4c 69 74 65 44 6c 6c 46 69 6c 65 5d 5d  aSQLiteDllFile]]
28790 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
287a0 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c       checkForFil
287b0 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  e $test_channel 
287c0 24 73 79 73 74 65 6d 44 61 74 61 53 51 4c 69 74  $systemDataSQLit
287d0 65 44 6c 6c 46 69 6c 65 0d 0a 20 20 20 20 20 20  eDllFile..      
287e0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69    }....        i
287f0 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61  f {![haveConstra
28800 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20  int [appendArgs 
28810 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20  file_ \..       
28820 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20       [file tail 
28830 24 73 79 73 74 65 6d 44 61 74 61 53 51 4c 69 74  $systemDataSQLit
28840 65 4c 69 6e 71 44 6c 6c 46 69 6c 65 5d 5d 5d 7d  eLinqDllFile]]]}
28850 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
28860 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20     checkForFile 
28870 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 73  $test_channel $s
28880 79 73 74 65 6d 44 61 74 61 53 51 4c 69 74 65 4c  ystemDataSQLiteL
28890 69 6e 71 44 6c 6c 46 69 6c 65 0d 0a 20 20 20 20  inqDllFile..    
288a0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
288b0 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74   if {![haveConst
288c0 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67  raint [appendArg
288d0 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20  s file_ \..     
288e0 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69         [file tai
288f0 6c 20 24 73 79 73 74 65 6d 44 61 74 61 53 51 4c  l $systemDataSQL
28900 69 74 65 45 66 36 44 6c 6c 46 69 6c 65 5d 5d 5d  iteEf6DllFile]]]
28910 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
28920 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65      checkForFile
28930 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24   $test_channel $
28940 73 79 73 74 65 6d 44 61 74 61 53 51 4c 69 74 65  systemDataSQLite
28950 45 66 36 44 6c 6c 46 69 6c 65 0d 0a 20 20 20 20  Ef6DllFile..    
28960 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
28970 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74   if {![haveConst
28980 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67  raint [appendArg
28990 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20  s file_ \..     
289a0 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69         [file tai
289b0 6c 20 24 74 65 73 74 45 78 65 46 69 6c 65 5d 5d  l $testExeFile]]
289c0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
289d0 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c       checkForFil
289e0 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  e $test_channel 
289f0 24 74 65 73 74 45 78 65 46 69 6c 65 20 74 65 73  $testExeFile tes
28a00 74 2e 65 78 65 0d 0a 20 20 20 20 20 20 20 20 7d  t.exe..        }
28a10 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b  ....        if {
28a20 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74  ![haveConstraint
28a30 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c   [appendArgs fil
28a40 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  e_ \..          
28a50 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 74 65    [file tail $te
28a60 73 74 4c 69 6e 71 45 78 65 46 69 6c 65 5d 5d 5d  stLinqExeFile]]]
28a70 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
28a80 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65      checkForFile
28a90 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24   $test_channel $
28aa0 74 65 73 74 4c 69 6e 71 45 78 65 46 69 6c 65 20  testLinqExeFile 
28ab0 74 65 73 74 6c 69 6e 71 2e 65 78 65 0d 0a 20 20  testlinq.exe..  
28ac0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
28ad0 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e     if {![haveCon
28ae0 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41  straint [appendA
28af0 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20  rgs file_ \..   
28b00 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74           [file t
28b10 61 69 6c 20 24 74 65 73 74 45 66 36 45 78 65 46  ail $testEf6ExeF
28b20 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a  ile]]]} then {..
28b30 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 46            checkF
28b40 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61  orFile $test_cha
28b50 6e 6e 65 6c 20 24 74 65 73 74 45 66 36 45 78 65  nnel $testEf6Exe
28b60 46 69 6c 65 20 74 65 73 74 65 66 36 2e 65 78 65  File testef6.exe
28b70 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
28b80 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76         if {![hav
28b90 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70  eConstraint [app
28ba0 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d  endArgs file_ \.
28bb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69  .            [fi
28bc0 6c 65 20 74 61 69 6c 20 24 74 65 73 74 4c 69 6e  le tail $testLin
28bd0 71 4f 75 74 46 69 6c 65 5d 5d 5d 7d 20 74 68 65  qOutFile]]]} the
28be0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63  n {..          c
28bf0 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73  heckForFile $tes
28c00 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73 74 4c  t_channel $testL
28c10 69 6e 71 4f 75 74 46 69 6c 65 0d 0a 20 20 20 20  inqOutFile..    
28c20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
28c30 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74   if {![haveConst
28c40 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67  raint [appendArg
28c50 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20  s file_ \..     
28c60 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69         [file tai
28c70 6c 20 24 6e 6f 72 74 68 77 69 6e 64 45 66 44 62  l $northwindEfDb
28c80 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d  File]]]} then {.
28c90 0a 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b  .          check
28ca0 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68  ForFile $test_ch
28cb0 61 6e 6e 65 6c 20 24 6e 6f 72 74 68 77 69 6e 64  annel $northwind
28cc0 45 66 44 62 46 69 6c 65 0d 0a 20 20 20 20 20 20  EfDbFile..      
28cd0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69    }....        i
28ce0 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61  f {![haveConstra
28cf0 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20  int [appendArgs 
28d00 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20  file_ \..       
28d10 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20       [file tail 
28d20 24 6e 6f 6e 57 61 6c 44 62 46 69 6c 65 5d 5d 5d  $nonWalDbFile]]]
28d30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
28d40 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65      checkForFile
28d50 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24   $test_channel $
28d60 6e 6f 6e 57 61 6c 44 62 46 69 6c 65 0d 0a 20 20  nonWalDbFile..  
28d70 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
28d80 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e     if {![haveCon
28d90 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41  straint [appendA
28da0 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20  rgs file_ \..   
28db0 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74           [file t
28dc0 61 69 6c 20 24 77 61 6c 44 62 46 69 6c 65 5d 5d  ail $walDbFile]]
28dd0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
28de0 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c       checkForFil
28df0 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  e $test_channel 
28e00 24 77 61 6c 44 62 46 69 6c 65 0d 0a 20 20 20 20  $walDbFile..    
28e10 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
28e20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74   if {![haveConst
28e30 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67  raint [appendArg
28e40 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20  s file_ \..     
28e50 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69         [file tai
28e60 6c 20 24 74 65 73 74 49 6e 73 74 61 6c 6c 56 73  l $testInstallVs
28e70 32 30 30 35 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20  2005LogFile]]]} 
28e80 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
28e90 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24    checkForFile $
28ea0 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65  test_channel $te
28eb0 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 30 35 4c  stInstallVs2005L
28ec0 6f 67 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20  ogFile..        
28ed0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20  }....        if 
28ee0 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e  {![haveConstrain
28ef0 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69  t [appendArgs fi
28f00 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  le_ \..         
28f10 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 74     [file tail $t
28f20 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 30 38  estInstallVs2008
28f30 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e  LogFile]]]} then
28f40 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68   {..          ch
28f50 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74  eckForFile $test
28f60 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73 74 49 6e  _channel $testIn
28f70 73 74 61 6c 6c 56 73 32 30 30 38 4c 6f 67 46 69  stallVs2008LogFi
28f80 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  le..        }...
28f90 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68  .        if {![h
28fa0 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61  aveConstraint [a
28fb0 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20  ppendArgs file_ 
28fc0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
28fd0 66 69 6c 65 20 74 61 69 6c 20 24 74 65 73 74 49  file tail $testI
28fe0 6e 73 74 61 6c 6c 56 73 32 30 31 30 4c 6f 67 46  nstallVs2010LogF
28ff0 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a  ile]]]} then {..
29000 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 46            checkF
29010 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61  orFile $test_cha
29020 6e 6e 65 6c 20 24 74 65 73 74 49 6e 73 74 61 6c  nnel $testInstal
29030 6c 56 73 32 30 31 30 4c 6f 67 46 69 6c 65 0d 0a  lVs2010LogFile..
29040 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
29050 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43       if {![haveC
29060 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e  onstraint [appen
29070 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20  dArgs file_ \.. 
29080 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65             [file
29090 20 74 61 69 6c 20 24 74 65 73 74 49 6e 73 74 61   tail $testInsta
290a0 6c 6c 56 73 32 30 31 32 4c 6f 67 46 69 6c 65 5d  llVs2012LogFile]
290b0 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  ]]} then {..    
290c0 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69        checkForFi
290d0 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c  le $test_channel
290e0 20 24 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32   $testInstallVs2
290f0 30 31 32 4c 6f 67 46 69 6c 65 0d 0a 20 20 20 20  012LogFile..    
29100 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
29110 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74   if {![haveConst
29120 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67  raint [appendArg
29130 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20  s file_ \..     
29140 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69         [file tai
29150 6c 20 24 74 65 73 74 49 6e 73 74 61 6c 6c 56 73  l $testInstallVs
29160 32 30 31 33 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20  2013LogFile]]]} 
29170 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
29180 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24    checkForFile $
29190 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65  test_channel $te
291a0 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 31 33 4c  stInstallVs2013L
291b0 6f 67 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20  ogFile..        
291c0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20  }....        if 
291d0 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e  {![haveConstrain
291e0 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69  t [appendArgs fi
291f0 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  le_ \..         
29200 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 74     [file tail $t
29210 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 31 35  estInstallVs2015
29220 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e  LogFile]]]} then
29230 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68   {..          ch
29240 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74  eckForFile $test
29250 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73 74 49 6e  _channel $testIn
29260 73 74 61 6c 6c 56 73 32 30 31 35 4c 6f 67 46 69  stallVs2015LogFi
29270 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  le..        }...
29280 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68  .        if {![h
29290 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61  aveConstraint [a
292a0 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20  ppendArgs file_ 
292b0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
292c0 66 69 6c 65 20 74 61 69 6c 20 24 74 65 73 74 55  file tail $testU
292d0 6e 69 6e 73 74 61 6c 6c 56 73 32 30 30 35 4c 6f  ninstallVs2005Lo
292e0 67 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b  gFile]]]} then {
292f0 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68 65 63  ..          chec
29300 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63  kForFile $test_c
29310 68 61 6e 6e 65 6c 20 24 74 65 73 74 55 6e 69 6e  hannel $testUnin
29320 73 74 61 6c 6c 56 73 32 30 30 35 4c 6f 67 46 69  stallVs2005LogFi
29330 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  le..        }...
29340 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68  .        if {![h
29350 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61  aveConstraint [a
29360 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20  ppendArgs file_ 
29370 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
29380 66 69 6c 65 20 74 61 69 6c 20 24 74 65 73 74 55  file tail $testU
29390 6e 69 6e 73 74 61 6c 6c 56 73 32 30 30 38 4c 6f  ninstallVs2008Lo
293a0 67 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b  gFile]]]} then {
293b0 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68 65 63  ..          chec
293c0 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63  kForFile $test_c
293d0 68 61 6e 6e 65 6c 20 24 74 65 73 74 55 6e 69 6e  hannel $testUnin
293e0 73 74 61 6c 6c 56 73 32 30 30 38 4c 6f 67 46 69  stallVs2008LogFi
293f0 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  le..        }...
29400 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68  .        if {![h
29410 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61  aveConstraint [a
29420 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20  ppendArgs file_ 
29430 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
29440 66 69 6c 65 20 74 61 69 6c 20 24 74 65 73 74 55  file tail $testU
29450 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31 30 4c 6f  ninstallVs2010Lo
29460 67 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b  gFile]]]} then {
29470 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68 65 63  ..          chec
29480 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63  kForFile $test_c
29490 68 61 6e 6e 65 6c 20 24 74 65 73 74 55 6e 69 6e  hannel $testUnin
294a0 73 74 61 6c 6c 56 73 32 30 31 30 4c 6f 67 46 69  stallVs2010LogFi
294b0 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  le..        }...
294c0 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68  .        if {![h
294d0 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61  aveConstraint [a
294e0 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20  ppendArgs file_ 
294f0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
29500 66 69 6c 65 20 74 61 69 6c 20 24 74 65 73 74 55  file tail $testU
29510 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31 32 4c 6f  ninstallVs2012Lo
29520 67 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b  gFile]]]} then {
29530 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68 65 63  ..          chec
29540 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63  kForFile $test_c
29550 68 61 6e 6e 65 6c 20 24 74 65 73 74 55 6e 69 6e  hannel $testUnin
29560 73 74 61 6c 6c 56 73 32 30 31 32 4c 6f 67 46 69  stallVs2012LogFi
29570 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  le..        }...
29580 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68  .        if {![h
29590 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61  aveConstraint [a
295a0 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20  ppendArgs file_ 
295b0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
295c0 66 69 6c 65 20 74 61 69 6c 20 24 74 65 73 74 55  file tail $testU
295d0 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31 33 4c 6f  ninstallVs2013Lo
295e0 67 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b  gFile]]]} then {
295f0 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68 65 63  ..          chec
29600 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63  kForFile $test_c
29610 68 61 6e 6e 65 6c 20 24 74 65 73 74 55 6e 69 6e  hannel $testUnin
29620 73 74 61 6c 6c 56 73 32 30 31 33 4c 6f 67 46 69  stallVs2013LogFi
29630 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  le..        }...
29640 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68  .        if {![h
29650 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61  aveConstraint [a
29660 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20  ppendArgs file_ 
29670 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
29680 66 69 6c 65 20 74 61 69 6c 20 24 74 65 73 74 55  file tail $testU
29690 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31 35 4c 6f  ninstallVs2015Lo
296a0 67 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b  gFile]]]} then {
296b0 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68 65 63  ..          chec
296c0 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63  kForFile $test_c
296d0 68 61 6e 6e 65 6c 20 24 74 65 73 74 55 6e 69 6e  hannel $testUnin
296e0 73 74 61 6c 6c 56 73 32 30 31 35 4c 6f 67 46 69  stallVs2015LogFi
296f0 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  le..        }.. 
29700 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
29710 0d 0a 20 20 20 20 70 72 6f 63 20 72 75 6e 53 51  ..    proc runSQ
29720 4c 69 74 65 54 65 73 74 46 69 6c 65 73 45 70 69  LiteTestFilesEpi
29730 6c 6f 67 75 65 20 7b 7d 20 7b 0d 0a 20 20 20 20  logue {} {..    
29740 20 20 75 70 6c 65 76 65 6c 20 31 20 7b 0d 0a 20    uplevel 1 {.. 
29750 20 20 20 20 20 20 20 75 6e 73 65 74 20 2d 6e 6f         unset -no
29760 63 6f 6d 70 6c 61 69 6e 20 5c 0d 0a 20 20 20 20  complain \..    
29770 20 20 20 20 20 20 20 20 74 65 73 74 55 6e 69 6e          testUnin
29780 73 74 61 6c 6c 56 73 32 30 31 35 4c 6f 67 46 69  stallVs2015LogFi
29790 6c 65 20 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c  le testUninstall
297a0 56 73 32 30 31 33 4c 6f 67 46 69 6c 65 20 5c 0d  Vs2013LogFile \.
297b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  .            tes
297c0 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31 32  tUninstallVs2012
297d0 4c 6f 67 46 69 6c 65 20 74 65 73 74 55 6e 69 6e  LogFile testUnin
297e0 73 74 61 6c 6c 56 73 32 30 31 30 4c 6f 67 46 69  stallVs2010LogFi
297f0 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  le \..          
29800 20 20 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56    testUninstallV
29810 73 32 30 30 38 4c 6f 67 46 69 6c 65 20 74 65 73  s2008LogFile tes
29820 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 30 35  tUninstallVs2005
29830 4c 6f 67 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20  LogFile \..     
29840 20 20 20 20 20 20 20 74 65 73 74 49 6e 73 74 61         testInsta
29850 6c 6c 56 73 32 30 31 35 4c 6f 67 46 69 6c 65 20  llVs2015LogFile 
29860 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 31  testInstallVs201
29870 33 4c 6f 67 46 69 6c 65 20 5c 0d 0a 20 20 20 20  3LogFile \..    
29880 20 20 20 20 20 20 20 20 74 65 73 74 49 6e 73 74          testInst
29890 61 6c 6c 56 73 32 30 31 32 4c 6f 67 46 69 6c 65  allVs2012LogFile
298a0 20 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30   testInstallVs20
298b0 31 30 4c 6f 67 46 69 6c 65 20 5c 0d 0a 20 20 20  10LogFile \..   
298c0 20 20 20 20 20 20 20 20 20 74 65 73 74 49 6e 73           testIns
298d0 74 61 6c 6c 56 73 32 30 30 38 4c 6f 67 46 69 6c  tallVs2008LogFil
298e0 65 20 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32  e testInstallVs2
298f0 30 30 35 4c 6f 67 46 69 6c 65 0d 0a 0d 0a 20 20  005LogFile....  
29900 20 20 20 20 20 20 75 6e 73 65 74 20 2d 6e 6f 63        unset -noc
29910 6f 6d 70 6c 61 69 6e 20 5c 0d 0a 20 20 20 20 20  omplain \..     
29920 20 20 20 20 20 20 20 6e 6f 72 74 68 77 69 6e 64         northwind
29930 45 66 44 62 46 69 6c 65 20 74 65 73 74 4c 69 6e  EfDbFile testLin
29940 71 4f 75 74 46 69 6c 65 20 5c 0d 0a 20 20 20 20  qOutFile \..    
29950 20 20 20 20 20 20 20 20 77 61 6c 44 62 46 69 6c          walDbFil
29960 65 20 6e 6f 6e 57 61 6c 44 62 46 69 6c 65 0d 0a  e nonWalDbFile..
29970 0d 0a 20 20 20 20 20 20 20 20 75 6e 73 65 74 20  ..        unset 
29980 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 5c 0d 0a 20  -nocomplain \.. 
29990 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 45             testE
299a0 66 36 45 78 65 46 69 6c 65 20 74 65 73 74 4c 69  f6ExeFile testLi
299b0 6e 71 45 78 65 46 69 6c 65 20 5c 0d 0a 20 20 20  nqExeFile \..   
299c0 20 20 20 20 20 20 20 20 20 74 65 73 74 45 78 65           testExe
299d0 46 69 6c 65 20 73 79 73 74 65 6d 44 61 74 61 53  File systemDataS
299e0 51 4c 69 74 65 45 66 36 44 6c 6c 46 69 6c 65 20  QLiteEf6DllFile 
299f0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  \..            s
29a00 79 73 74 65 6d 44 61 74 61 53 51 4c 69 74 65 4c  ystemDataSQLiteL
29a10 69 6e 71 44 6c 6c 46 69 6c 65 20 73 79 73 74 65  inqDllFile syste
29a20 6d 44 61 74 61 53 51 4c 69 74 65 44 6c 6c 46 69  mDataSQLiteDllFi
29a30 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  le \..          
29a40 20 20 73 71 6c 69 74 65 44 65 73 69 67 6e 65 72    sqliteDesigner
29a50 44 6c 6c 46 69 6c 65 20 69 6e 73 74 61 6c 6c 65  DllFile installe
29a60 72 45 78 65 46 69 6c 65 20 5c 0d 0a 20 20 20 20  rExeFile \..    
29a70 20 20 20 20 20 20 20 20 65 6e 74 69 74 79 46 72          entityFr
29a80 61 6d 65 77 6f 72 6b 44 6c 6c 46 69 6c 65 0d 0a  ameworkDllFile..
29a90 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
29aa0 0c 0d 0a 20 20 20 20 70 72 6f 63 20 72 75 6e 53  ...    proc runS
29ab0 51 4c 69 74 65 54 65 73 74 45 70 69 6c 6f 67 75  QLiteTestEpilogu
29ac0 65 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  e {} {..      #.
29ad0 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53  .      # NOTE: S
29ae0 6b 69 70 20 72 75 6e 6e 69 6e 67 20 6f 75 72 20  kip running our 
29af0 63 75 73 74 6f 6d 20 65 70 69 6c 6f 67 75 65 20  custom epilogue 
29b00 69 66 20 74 68 65 20 6d 61 69 6e 20 6f 6e 65 20  if the main one 
29b10 68 61 73 20 62 65 65 6e 0d 0a 20 20 20 20 20 20  has been..      
29b20 23 20 20 20 20 20 20 20 73 6b 69 70 70 65 64 2e  #       skipped.
29b30 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
29b40 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
29b50 74 73 20 3a 3a 6e 6f 28 65 70 69 6c 6f 67 75 65  ts ::no(epilogue
29b60 2e 65 61 67 6c 65 29 5d 7d 20 74 68 65 6e 20 7b  .eagle)]} then {
29b70 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
29b80 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f       # NOTE: Sho
29b90 77 20 77 68 65 6e 20 6f 75 72 20 74 65 73 74 73  w when our tests
29ba0 20 61 63 74 75 61 6c 6c 79 20 65 6e 64 65 64 20   actually ended 
29bb0 28 6e 6f 77 29 2e 0d 0a 20 20 20 20 20 20 20 20  (now)...        
29bc0 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  #..        tputs
29bd0 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
29be0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
29bf0 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
29c00 2d 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  - System.Data.SQ
29c10 4c 69 74 65 20 74 65 73 74 73 20 65 6e 64 65 64  Lite tests ended
29c20 20 61 74 20 22 20 5c 0d 0a 20 20 20 20 20 20 20   at " \..       
29c30 20 20 20 20 20 5b 63 6c 6f 63 6b 20 66 6f 72 6d       [clock form
29c40 61 74 20 5b 63 6c 6f 63 6b 20 73 65 63 6f 6e 64  at [clock second
29c50 73 5d 5d 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20  s]] \n]....     
29c60 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
29c70 4e 4f 54 45 3a 20 4c 6f 61 64 20 74 68 65 20 22  NOTE: Load the "
29c80 65 70 69 6c 6f 67 75 65 22 20 63 75 73 74 6f 6d  epilogue" custom
29c90 20 70 65 72 2d 75 73 65 72 20 61 6e 64 2f 6f 72   per-user and/or
29ca0 20 70 65 72 2d 68 6f 73 74 20 74 65 73 74 0d 0a   per-host test..
29cb0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
29cc0 73 65 74 74 69 6e 67 73 20 6e 6f 77 2e 0d 0a 20  settings now... 
29cd0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
29ce0 20 20 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73    uplevel 1 [lis
29cf0 74 20 6c 6f 61 64 53 51 4c 69 74 65 54 65 73 74  t loadSQLiteTest
29d00 53 65 74 74 69 6e 67 73 20 24 3a 3a 74 65 73 74  Settings $::test
29d10 5f 63 68 61 6e 6e 65 6c 20 2e 65 70 69 6c 6f 67  _channel .epilog
29d20 75 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23  ue]....        #
29d30 0d 0a 20 20 20 20 20 20 20 20 23 20 42 55 47 46  ..        # BUGF
29d40 49 58 3a 20 42 65 66 6f 72 65 20 63 68 65 63 6b  IX: Before check
29d50 69 6e 67 20 74 68 65 20 66 69 6e 61 6c 20 72 65  ing the final re
29d60 73 6f 75 72 63 65 73 20 69 6e 20 75 73 65 20 62  sources in use b
29d70 79 20 53 51 4c 69 74 65 2c 20 6d 61 6b 65 0d 0a  y SQLite, make..
29d80 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
29d90 20 20 73 75 72 65 20 62 6f 74 68 20 6f 66 20 74    sure both of t
29da0 68 65 20 50 52 41 47 4d 41 20 72 65 6c 61 74 65  he PRAGMA relate
29db0 64 20 64 69 72 65 63 74 6f 72 79 20 6e 61 6d 65  d directory name
29dc0 73 20 61 72 65 20 66 72 65 65 64 2e 0d 0a 20 20  s are freed...  
29dd0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
29de0 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 44   checkForSQLiteD
29df0 69 72 65 63 74 6f 72 69 65 73 20 24 3a 3a 74 65  irectories $::te
29e00 73 74 5f 63 68 61 6e 6e 65 6c 20 74 72 75 65 0d  st_channel true.
29e10 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
29e20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 6c        # NOTE: Al
29e30 73 6f 20 72 65 70 6f 72 74 20 74 68 65 20 72 65  so report the re
29e40 73 6f 75 72 63 65 20 75 73 61 67 65 20 61 66 74  source usage aft
29e50 65 72 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 74  er running the t
29e60 65 73 74 73 2e 0d 0a 20 20 20 20 20 20 20 20 23  ests...        #
29e70 0d 0a 20 20 20 20 20 20 20 20 72 65 70 6f 72 74  ..        report
29e80 53 51 4c 69 74 65 52 65 73 6f 75 72 63 65 73 20  SQLiteResources 
29e90 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d  $::test_channel.
29ea0 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
29eb0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65        # NOTE: Re
29ec0 70 6f 72 74 20 74 68 65 20 63 72 69 74 69 63 61  port the critica
29ed0 6c 20 68 61 6e 64 6c 65 20 63 6f 75 6e 74 73 20  l handle counts 
29ee0 61 66 74 65 72 20 72 75 6e 6e 69 6e 67 20 74 68  after running th
29ef0 65 20 74 65 73 74 73 2e 0d 0a 20 20 20 20 20 20  e tests...      
29f00 20 20 23 0d 0a 20 20 20 20 20 20 20 20 67 65 74    #..        get
29f10 53 51 4c 69 74 65 48 61 6e 64 6c 65 43 6f 75 6e  SQLiteHandleCoun
29f20 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
29f30 65 6c 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d  el....        #.
29f40 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
29f50 20 49 66 20 6e 65 63 65 73 73 61 72 79 2c 20 64   If necessary, d
29f60 69 73 61 62 6c 65 20 73 68 61 72 65 64 2d 63 61  isable shared-ca
29f70 63 68 65 20 6d 6f 64 65 20 6e 6f 77 2e 0d 0a 20  che mode now... 
29f80 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
29f90 20 20 69 66 20 7b 5b 68 61 73 52 75 6e 74 69 6d    if {[hasRuntim
29fa0 65 4f 70 74 69 6f 6e 20 73 68 61 72 65 64 43 61  eOption sharedCa
29fb0 63 68 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  che]} then {..  
29fc0 20 20 20 20 20 20 20 20 65 6e 61 62 6c 65 53 68          enableSh
29fd0 61 72 65 64 43 61 63 68 65 20 24 3a 3a 74 65 73  aredCache $::tes
29fe0 74 5f 63 68 61 6e 6e 65 6c 20 66 61 6c 73 65 0d  t_channel false.
29ff0 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
2a000 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
2a010 20 20 20 23 23 23 23 23 23 23 23 23 23 23 23 23     #############
2a020 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2a030 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2a040 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2a050 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a  ##############..
2a060 20 20 20 20 23 23 23 23 23 23 23 23 23 23 23 23      ############
2a070 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2a080 23 20 45 4e 44 20 45 61 67 6c 65 20 4f 4e 4c 59  # END Eagle ONLY
2a090 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23   ###############
2a0a0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d  ###############.
2a0b0 0a 20 20 20 20 23 23 23 23 23 23 23 23 23 23 23  .    ###########
2a0c0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2a0d0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2a0e0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2a0f0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2a100 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 23 0d 0a 20 20  ..  }....  #..  
2a110 23 20 4e 4f 54 45 3a 20 53 61 76 65 20 74 68 65  # NOTE: Save the
2a120 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 69 72   name of the dir
2a130 65 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e  ectory containin
2a140 67 20 74 68 69 73 20 66 69 6c 65 2e 0d 0a 20 20  g this file...  
2a150 23 0d 0a 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20  #..  if {![info 
2a160 65 78 69 73 74 73 20 63 6f 6d 6d 6f 6e 5f 64 69  exists common_di
2a170 72 65 63 74 6f 72 79 5d 7d 20 74 68 65 6e 20 7b  rectory]} then {
2a180 0d 0a 20 20 20 20 73 65 74 20 63 6f 6d 6d 6f 6e  ..    set common
2a190 5f 64 69 72 65 63 74 6f 72 79 20 5b 66 69 6c 65  _directory [file
2a1a0 20 64 69 72 6e 61 6d 65 20 5b 69 6e 66 6f 20 73   dirname [info s
2a1b0 63 72 69 70 74 5d 5d 0d 0a 20 20 7d 0d 0a 0d 0a  cript]]..  }....
2a1c0 20 20 23 0d 0a 20 20 23 20 4e 4f 54 45 3a 20 50    #..  # NOTE: P
2a1d0 72 6f 76 69 64 65 20 74 68 65 20 53 79 73 74 65  rovide the Syste
2a1e0 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 74 65  m.Data.SQLite te
2a1f0 73 74 20 70 61 63 6b 61 67 65 20 74 6f 20 74 68  st package to th
2a200 65 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a  e interpreter...
2a210 20 20 23 0d 0a 20 20 70 61 63 6b 61 67 65 20 70    #..  package p
2a220 72 6f 76 69 64 65 20 53 79 73 74 65 6d 2e 44 61  rovide System.Da
2a230 74 61 2e 53 51 4c 69 74 65 2e 54 65 73 74 20 31  ta.SQLite.Test 1
2a240 2e 30 0d 0a 7d 0d 0a                             .0..}..