System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact 77130de1822b5601534091dc0859d6a7aa179b73:


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 7b 76 61 6c 75   dataTable {valu
16ef0 65 43 61 6c 6c 62 61 63 6b 20 22 22 7d 20 7d 20  eCallback ""} } 
16f00 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 72 6f 77  {..      set row
16f10 73 20 5b 6c 69 73 74 5d 0d 0a 20 20 20 20 20 20  s [list]..      
16f20 73 65 74 20 63 6f 75 6e 74 20 5b 24 64 61 74 61  set count [$data
16f30 54 61 62 6c 65 20 43 6f 6c 75 6d 6e 73 2e 43 6f  Table Columns.Co
16f40 75 6e 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 66 6f  unt]....      fo
16f50 72 20 7b 73 65 74 20 69 6e 64 65 78 20 30 7d 20  r {set index 0} 
16f60 7b 24 69 6e 64 65 78 20 3c 20 24 63 6f 75 6e 74  {$index < $count
16f70 7d 20 7b 69 6e 63 72 20 69 6e 64 65 78 7d 20 7b  } {incr index} {
16f80 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 64 61  ..        set da
16f90 74 61 43 6f 6c 75 6d 6e 20 5b 24 64 61 74 61 54  taColumn [$dataT
16fa0 61 62 6c 65 20 2d 61 6c 69 61 73 20 43 6f 6c 75  able -alias Colu
16fb0 6d 6e 73 2e 67 65 74 5f 49 74 65 6d 20 24 69 6e  mns.get_Item $in
16fc0 64 65 78 5d 0d 0a 20 20 20 20 20 20 20 20 73 65  dex]..        se
16fd0 74 20 6e 61 6d 65 73 28 24 69 6e 64 65 78 29 20  t names($index) 
16fe0 5b 24 64 61 74 61 43 6f 6c 75 6d 6e 20 43 6f 6c  [$dataColumn Col
16ff0 75 6d 6e 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20  umnName]..      
17000 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
17010 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 65 74 75      # NOTE: Setu
17020 70 20 73 6f 6d 65 20 54 63 6c 20 72 65 74 75 72  p some Tcl retur
17030 6e 20 63 6f 64 65 20 63 6f 6e 73 74 61 6e 74 73  n code constants
17040 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
17050 20 20 73 65 74 20 4f 6b 20 30 3b 20 73 65 74 20    set Ok 0; set 
17060 45 72 72 6f 72 20 31 3b 20 73 65 74 20 52 65 74  Error 1; set Ret
17070 75 72 6e 20 32 3b 20 73 65 74 20 42 72 65 61 6b  urn 2; set Break
17080 20 33 3b 20 73 65 74 20 43 6f 6e 74 69 6e 75 65   3; set Continue
17090 20 34 0d 0a 0d 0a 20 20 20 20 20 20 6f 62 6a 65   4....      obje
170a0 63 74 20 66 6f 72 65 61 63 68 20 2d 61 6c 69 61  ct foreach -alia
170b0 73 20 64 61 74 61 52 6f 77 20 5b 73 65 74 20 64  s dataRow [set d
170c0 61 74 61 52 6f 77 73 20 5b 24 64 61 74 61 54 61  ataRows [$dataTa
170d0 62 6c 65 20 52 6f 77 73 5d 5d 20 7b 0d 0a 20 20  ble Rows]] {..  
170e0 20 20 20 20 20 20 73 65 74 20 72 6f 77 20 5b 6c        set row [l
170f0 69 73 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ist]....        
17100 66 6f 72 20 7b 73 65 74 20 69 6e 64 65 78 20 30  for {set index 0
17110 7d 20 7b 24 69 6e 64 65 78 20 3c 20 24 63 6f 75  } {$index < $cou
17120 6e 74 7d 20 7b 69 6e 63 72 20 69 6e 64 65 78 7d  nt} {incr index}
17130 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   {..          se
17140 74 20 76 61 6c 75 65 20 5b 24 64 61 74 61 52 6f  t value [$dataRo
17150 77 20 2d 63 72 65 61 74 65 20 2d 61 6c 69 61 73  w -create -alias
17160 20 67 65 74 5f 49 74 65 6d 20 24 69 6e 64 65 78   get_Item $index
17170 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69  ]....          i
17180 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  f {[string lengt
17190 68 20 24 76 61 6c 75 65 43 61 6c 6c 62 61 63 6b  h $valueCallback
171a0 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
171b0 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 63             set c
171c0 6f 64 65 20 5b 63 61 74 63 68 20 7b 0d 0a 20 20  ode [catch {..  
171d0 20 20 20 20 20 20 20 20 20 20 20 20 24 76 61 6c              $val
171e0 75 65 43 61 6c 6c 62 61 63 6b 20 24 64 61 74 61  ueCallback $data
171f0 54 61 62 6c 65 20 24 64 61 74 61 52 6f 77 20 24  Table $dataRow $
17200 69 6e 64 65 78 20 24 76 61 6c 75 65 0d 0a 20 20  index $value..  
17210 20 20 20 20 20 20 20 20 20 20 7d 20 6e 65 77 56            } newV
17220 61 6c 75 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  alue]....       
17230 20 20 20 20 20 69 66 20 7b 24 63 6f 64 65 20 3d       if {$code =
17240 3d 20 24 4f 6b 7d 20 74 68 65 6e 20 7b 0d 0a 20  = $Ok} then {.. 
17250 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a               #..
17260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
17270 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20 73 70  NOTE: Use the sp
17280 65 63 69 66 69 65 64 20 28 6e 65 77 3f 29 20 72  ecified (new?) r
17290 6f 77 20 76 61 6c 75 65 2e 0d 0a 20 20 20 20 20  ow value...     
172a0 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
172b0 20 20 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e            lappen
172c0 64 20 72 6f 77 20 5b 6c 69 73 74 20 24 6e 61 6d  d row [list $nam
172d0 65 73 28 24 69 6e 64 65 78 29 20 24 6e 65 77 56  es($index) $newV
172e0 61 6c 75 65 5d 0d 0a 20 20 20 20 20 20 20 20 20  alue]..         
172f0 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 24 63 6f     } elseif {$co
17300 64 65 20 3d 3d 20 24 45 72 72 6f 72 7d 20 74 68  de == $Error} th
17310 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
17320 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
17330 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65       # NOTE: Use
17340 20 74 68 65 20 28 6e 65 77 3f 29 20 4e 55 4c 4c   the (new?) NULL
17350 20 72 6f 77 20 76 61 6c 75 65 2e 0d 0a 20 20 20   row value...   
17360 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
17370 20 20 20 20 20 20 20 20 20 20 20 20 6c 61 70 70              lapp
17380 65 6e 64 20 72 6f 77 20 5b 6c 69 73 74 20 24 6e  end row [list $n
17390 61 6d 65 73 28 24 69 6e 64 65 78 29 5d 0d 0a 20  ames($index)].. 
173a0 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73             } els
173b0 65 69 66 20 7b 24 63 6f 64 65 20 3d 3d 20 24 52  eif {$code == $R
173c0 65 74 75 72 6e 7d 20 74 68 65 6e 20 7b 0d 0a 20  eturn} then {.. 
173d0 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a               #..
173e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
173f0 4e 4f 54 45 3a 20 53 6b 69 70 20 72 65 6d 61 69  NOTE: Skip remai
17400 6e 69 6e 67 20 76 61 6c 75 65 73 20 66 6f 72 20  ning values for 
17410 74 68 69 73 20 72 6f 77 2e 0d 0a 20 20 20 20 20  this row...     
17420 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
17430 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 0d            break.
17440 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65  .            } e
17450 6c 73 65 69 66 20 7b 24 63 6f 64 65 20 3d 3d 20  lseif {$code == 
17460 24 42 72 65 61 6b 7d 20 74 68 65 6e 20 7b 0d 0a  $Break} then {..
17470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
17480 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
17490 20 4e 4f 54 45 3a 20 53 6b 69 70 20 70 72 6f 63   NOTE: Skip proc
174a0 65 73 73 69 6e 67 20 74 68 69 73 20 72 6f 77 20  essing this row 
174b0 76 61 6c 75 65 2e 0d 0a 20 20 20 20 20 20 20 20  value...        
174c0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
174d0 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 24       } elseif {$
174e0 63 6f 64 65 20 3d 3d 20 24 43 6f 6e 74 69 6e 75  code == $Continu
174f0 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  e} then {..     
17500 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
17510 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
17520 3a 20 55 73 65 20 64 65 66 61 75 6c 74 20 72 6f  : Use default ro
17530 77 20 76 61 6c 75 65 20 68 61 6e 64 6c 69 6e 67  w value handling
17540 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
17550 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
17560 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65  }..          } e
17570 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
17580 20 20 20 73 65 74 20 63 6f 64 65 20 24 43 6f 6e     set code $Con
17590 74 69 6e 75 65 0d 0a 20 20 20 20 20 20 20 20 20  tinue..         
175a0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
175b0 69 66 20 7b 24 63 6f 64 65 20 3d 3d 20 24 43 6f  if {$code == $Co
175c0 6e 74 69 6e 75 65 7d 20 74 68 65 6e 20 7b 0d 0a  ntinue} then {..
175d0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
175e0 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
175f0 76 61 6c 75 65 5d 20 3e 20 30 20 26 26 20 5c 0d  value] > 0 && \.
17600 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17610 20 21 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65   ![object invoke
17620 20 43 6f 6e 76 65 72 74 20 49 73 44 42 4e 75 6c   Convert IsDBNul
17630 6c 20 24 76 61 6c 75 65 5d 7d 20 74 68 65 6e 20  l $value]} then 
17640 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
17650 20 6c 61 70 70 65 6e 64 20 72 6f 77 20 5b 6c 69   lappend row [li
17660 73 74 20 24 6e 61 6d 65 73 28 24 69 6e 64 65 78  st $names($index
17670 29 20 5b 24 76 61 6c 75 65 20 54 6f 53 74 72 69  ) [$value ToStri
17680 6e 67 5d 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  ng]]..          
17690 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
176a0 20 20 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e            lappen
176b0 64 20 72 6f 77 20 5b 6c 69 73 74 20 24 6e 61 6d  d row [list $nam
176c0 65 73 28 24 69 6e 64 65 78 29 5d 0d 0a 20 20 20  es($index)]..   
176d0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
176e0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
176f0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 6c 61   }....        la
17700 70 70 65 6e 64 20 72 6f 77 73 20 24 72 6f 77 0d  ppend rows $row.
17710 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
17720 20 20 72 65 74 75 72 6e 20 24 72 6f 77 73 0d 0a    return $rows..
17730 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
17740 6f 63 20 64 75 6d 70 52 6f 77 73 46 72 6f 6d 44  oc dumpRowsFromD
17750 61 74 61 54 61 62 6c 65 20 7b 20 63 68 61 6e 6e  ataTable { chann
17760 65 6c 20 72 6f 77 73 20 7d 20 7b 0d 0a 20 20 20  el rows } {..   
17770 20 20 20 73 65 74 20 73 65 71 75 65 6e 63 65 20     set sequence 
17780 31 0d 0a 0d 0a 20 20 20 20 20 20 66 6f 72 65 61  1....      forea
17790 63 68 20 72 6f 77 20 24 72 6f 77 73 20 7b 0d 0a  ch row $rows {..
177a0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
177b0 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
177c0 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
177d0 20 20 5b 65 78 70 72 20 7b 24 73 65 71 75 65 6e    [expr {$sequen
177e0 63 65 20 3e 20 31 20 3f 20 22 5c 6e 22 20 3a 20  ce > 1 ? "\n" : 
177f0 22 22 7d 5d 20 22 2d 2d 2d 2d 20 52 4f 57 20 23  ""}] "---- ROW #
17800 22 20 24 73 65 71 75 65 6e 63 65 20 3a 5c 6e 5d  " $sequence :\n]
17810 0d 0a 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 65  ....        fore
17820 61 63 68 20 70 61 69 72 20 24 72 6f 77 20 7b 0d  ach pair $row {.
17830 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b  .          if {[
17840 6c 6c 65 6e 67 74 68 20 24 70 61 69 72 5d 20 3e  llength $pair] >
17850 3d 20 32 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 2} then {..   
17860 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
17870 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
17880 72 67 73 20 5c 74 20 5c 0d 0a 20 20 20 20 20 20  rgs \t \..      
17890 20 20 20 20 20 20 20 20 20 20 5b 6c 69 73 74 20            [list 
178a0 5b 6c 69 6e 64 65 78 20 24 70 61 69 72 20 30 5d  [lindex $pair 0]
178b0 5d 20 22 3a 20 22 20 5b 6c 69 73 74 20 5b 6c 69  ] ": " [list [li
178c0 6e 64 65 78 20 24 70 61 69 72 20 31 5d 5d 20 5c  ndex $pair 1]] \
178d0 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20  n]..          } 
178e0 65 6c 73 65 69 66 20 7b 5b 6c 6c 65 6e 67 74 68  elseif {[llength
178f0 20 24 70 61 69 72 5d 20 3d 3d 20 31 7d 20 74 68   $pair] == 1} th
17900 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
17910 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
17920 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 74 20   [appendArgs \t 
17930 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
17940 20 20 20 5b 6c 69 73 74 20 5b 6c 69 6e 64 65 78     [list [lindex
17950 20 24 70 61 69 72 20 30 5d 5d 20 22 3a 20 3c 6e   $pair 0]] ": <n
17960 75 6c 6c 3e 5c 6e 22 5d 0d 0a 20 20 20 20 20 20  ull>\n"]..      
17970 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
17980 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
17990 24 63 68 61 6e 6e 65 6c 20 5c 74 3c 65 6d 70 74  $channel \t<empt
179a0 79 3e 5c 6e 3b 20 23 20 4e 4f 54 45 3a 20 4e 6f  y>\n; # NOTE: No
179b0 20 64 61 74 61 3f 0d 0a 20 20 20 20 20 20 20 20   data?..        
179c0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
179d0 0d 0a 20 20 20 20 20 20 20 20 69 6e 63 72 20 73  ..        incr s
179e0 65 71 75 65 6e 63 65 0d 0a 20 20 20 20 20 20 7d  equence..      }
179f0 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
17a00 70 72 6f 63 20 63 6c 65 61 6e 75 70 44 62 20 7b  proc cleanupDb {
17a10 20 66 69 6c 65 4e 61 6d 65 20 7b 76 61 72 4e 61   fileName {varNa
17a20 6d 65 20 64 62 7d 20 7b 63 6f 6c 6c 65 63 74 20  me db} {collect 
17a30 74 72 75 65 7d 20 7b 71 75 61 6c 69 66 79 20 74  true} {qualify t
17a40 72 75 65 7d 0d 0a 20 20 20 20 20 20 20 20 20 20  rue}..          
17a50 20 20 20 20 20 20 20 20 20 20 20 7b 64 65 6c 65             {dele
17a60 74 65 20 74 72 75 65 7d 20 7d 20 7b 0d 0a 20 20  te true} } {..  
17a70 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
17a80 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20  OTE: Attempt to 
17a90 66 6f 72 63 65 20 61 6c 6c 20 70 65 6e 64 69 6e  force all pendin
17aa0 67 20 22 67 61 72 62 61 67 65 22 20 6f 62 6a 65  g "garbage" obje
17ab0 63 74 73 20 74 6f 20 62 65 20 63 6f 6c 6c 65 63  cts to be collec
17ac0 74 65 64 2c 0d 0a 20 20 20 20 20 20 23 20 20 20  ted,..      #   
17ad0 20 20 20 20 69 6e 63 6c 75 64 69 6e 67 20 53 51      including SQ
17ae0 4c 69 74 65 20 73 74 61 74 65 6d 65 6e 74 73 20  Lite statements 
17af0 61 6e 64 20 62 61 63 6b 75 70 20 6f 62 6a 65 63  and backup objec
17b00 74 73 3b 20 74 68 69 73 20 73 68 6f 75 6c 64 20  ts; this should 
17b10 61 6c 6c 6f 77 0d 0a 20 20 20 20 20 20 23 20 20  allow..      #  
17b20 20 20 20 20 20 74 68 65 20 75 6e 64 65 72 6c 79       the underly
17b30 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c  ing database fil
17b40 65 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 2e  e to be deleted.
17b50 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
17b60 20 69 66 20 7b 24 63 6f 6c 6c 65 63 74 7d 20 74   if {$collect} t
17b70 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 63  hen {..        c
17b80 6f 6c 6c 65 63 74 47 61 72 62 61 67 65 20 24 3a  ollectGarbage $:
17b90 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 20  :test_channel.. 
17ba0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
17bb0 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
17bc0 20 52 65 66 65 72 20 74 6f 20 74 68 65 20 73 70   Refer to the sp
17bd0 65 63 69 66 69 65 64 20 76 61 72 69 61 62 6c 65  ecified variable
17be0 20 28 65 2e 67 2e 20 22 64 62 22 29 20 69 6e 20   (e.g. "db") in 
17bf0 74 68 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f  the context of o
17c00 75 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ur..      #     
17c10 20 20 63 61 6c 6c 65 72 2e 20 20 54 68 65 20 68    caller.  The h
17c20 61 6e 64 6c 65 20 74 6f 20 74 68 65 20 64 61 74  andle to the dat
17c30 61 62 61 73 65 20 70 72 65 76 69 6f 75 73 6c 79  abase previously
17c40 20 6f 70 65 6e 65 64 20 76 69 61 20 74 68 65 0d   opened via the.
17c50 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 5b  .      #       [
17c60 73 65 74 75 70 44 62 5d 20 70 72 6f 63 65 64 75  setupDb] procedu
17c70 72 65 20 73 68 6f 75 6c 64 20 62 65 20 73 74 6f  re should be sto
17c80 72 65 64 20 74 68 65 72 65 2e 0d 0a 20 20 20 20  red there...    
17c90 20 20 23 0d 0a 20 20 20 20 20 20 75 70 76 61 72    #..      upvar
17ca0 20 31 20 24 76 61 72 4e 61 6d 65 20 64 62 0d 0a   1 $varName db..
17cb0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
17cc0 20 23 20 4e 4f 54 45 3a 20 43 6c 6f 73 65 20 74   # NOTE: Close t
17cd0 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f  he connection to
17ce0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 6f   the database no
17cf0 77 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20  w.  This should 
17d00 61 6c 6c 6f 77 20 75 73 0d 0a 20 20 20 20 20 20  allow us..      
17d10 23 20 20 20 20 20 20 20 74 6f 20 64 65 6c 65 74  #       to delet
17d20 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  e the underlying
17d30 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0d   database file..
17d40 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
17d50 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
17d60 20 64 62 5d 20 26 26 20 5b 63 61 74 63 68 20 7b   db] && [catch {
17d70 73 71 6c 20 63 6c 6f 73 65 20 24 64 62 7d 20 65  sql close $db} e
17d80 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  rror]} then {.. 
17d90 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
17da0 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 73 6f 6d    # NOTE: We som
17db0 65 68 6f 77 20 66 61 69 6c 65 64 20 74 6f 20 63  ehow failed to c
17dc0 6c 6f 73 65 20 74 68 65 20 64 61 74 61 62 61 73  lose the databas
17dd0 65 2c 20 72 65 70 6f 72 74 20 77 68 79 2e 0d 0a  e, report why...
17de0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
17df0 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
17e00 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
17e10 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
17e20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e      "==== WARNIN
17e30 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 63 6c 6f  G: failed to clo
17e40 73 65 20 64 61 74 61 62 61 73 65 20 5c 22 22 20  se database \"" 
17e50 24 64 62 20 22 5c 22 2c 20 65 72 72 6f 72 3a 20  $db "\", error: 
17e60 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
17e70 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d   \n\t $error \n]
17e80 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
17e90 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
17ea0 54 45 3a 20 46 69 72 73 74 2c 20 73 65 65 20 69  TE: First, see i
17eb0 66 20 6f 75 72 20 63 61 6c 6c 65 72 20 68 61 73  f our caller has
17ec0 20 72 65 71 75 65 73 74 65 64 20 61 6e 20 69 6e   requested an in
17ed0 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
17ee0 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
17ef0 20 20 73 65 74 20 69 73 4d 65 6d 6f 72 79 20 5b    set isMemory [
17f00 69 73 4d 65 6d 6f 72 79 44 62 20 24 66 69 6c 65  isMemoryDb $file
17f10 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 23  Name]....      #
17f20 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
17f30 42 75 69 6c 64 20 74 68 65 20 66 75 6c 6c 20 70  Build the full p
17f40 61 74 68 20 74 6f 20 74 68 65 20 64 61 74 61 62  ath to the datab
17f50 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 2e 20 20  ase file name.  
17f60 46 6f 72 20 6e 6f 77 2c 20 61 6c 6c 20 74 65 73  For now, all tes
17f70 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  t..      #      
17f80 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
17f90 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68  are stored in th
17fa0 65 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65  e temporary dire
17fb0 63 74 6f 72 79 2e 0d 0a 20 20 20 20 20 20 23 0d  ctory...      #.
17fc0 0a 20 20 20 20 20 20 69 66 20 7b 21 24 69 73 4d  .      if {!$isM
17fd0 65 6d 6f 72 79 20 26 26 20 24 71 75 61 6c 69 66  emory && $qualif
17fe0 79 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  y} then {..     
17ff0 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 20     set fileName 
18000 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 44  [file join [getD
18010 61 74 61 62 61 73 65 44 69 72 65 63 74 6f 72 79  atabaseDirectory
18020 5d 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69  ] [file tail $fi
18030 6c 65 4e 61 6d 65 5d 5d 0d 0a 20 20 20 20 20 20  leName]]..      
18040 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
18050 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63      # NOTE: Chec
18060 6b 20 69 66 20 74 68 65 20 66 69 6c 65 20 73 74  k if the file st
18070 69 6c 6c 20 65 78 69 73 74 73 2e 0d 0a 20 20 20  ill exists...   
18080 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
18090 21 24 69 73 4d 65 6d 6f 72 79 20 26 26 20 24 64  !$isMemory && $d
180a0 65 6c 65 74 65 20 26 26 20 5b 66 69 6c 65 20 65  elete && [file e
180b0 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d  xists $fileName]
180c0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
180d0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
180e0 4f 54 45 3a 20 53 6b 69 70 20 64 65 6c 65 74 69  OTE: Skip deleti
180f0 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ng database file
18100 73 20 69 66 20 73 6f 6d 65 62 6f 64 79 20 73 65  s if somebody se
18110 74 73 20 74 68 65 20 67 6c 6f 62 61 6c 0d 0a 20  ts the global.. 
18120 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 76         #       v
18130 61 72 69 61 62 6c 65 20 74 6f 20 70 72 65 76 65  ariable to preve
18140 6e 74 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20  nt it...        
18150 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21  #..        if {!
18160 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
18170 6f 28 63 6c 65 61 6e 75 70 44 62 46 69 6c 65 29  o(cleanupDbFile)
18180 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
18190 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
181a0 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70    # NOTE: Attemp
181b0 74 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20  t to delete the 
181c0 74 65 73 74 20 64 61 74 61 62 61 73 65 20 66 69  test database fi
181d0 6c 65 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20  le now...       
181e0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
181f0 69 66 20 7b 5b 73 65 74 20 63 6f 64 65 20 5b 63  if {[set code [c
18200 61 74 63 68 20 7b 66 69 6c 65 20 64 65 6c 65 74  atch {file delet
18210 65 20 24 66 69 6c 65 4e 61 6d 65 7d 20 65 72 72  e $fileName} err
18220 6f 72 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  or]]} then {..  
18230 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
18240 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
18250 20 57 65 20 73 6f 6d 65 68 6f 77 20 66 61 69 6c   We somehow fail
18260 65 64 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  ed to delete the
18270 20 66 69 6c 65 2c 20 72 65 70 6f 72 74 20 77 68   file, report wh
18280 79 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  y...            
18290 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  #..            t
182a0 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
182b0 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
182c0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
182d0 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e      "==== WARNIN
182e0 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 64 65 6c  G: failed to del
182f0 65 74 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  ete database fil
18300 65 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 20  e \"" $fileName 
18310 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
18320 20 20 20 22 5c 22 20 64 75 72 69 6e 67 20 63 6c     "\" during cl
18330 65 61 6e 75 70 2c 20 65 72 72 6f 72 3a 20 22 20  eanup, error: " 
18340 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d  \n\t $error \n].
18350 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
18360 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
18370 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
18380 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53         # NOTE: S
18390 68 6f 77 20 74 68 61 74 20 77 65 20 73 6b 69 70  how that we skip
183a0 70 65 64 20 64 65 6c 65 74 69 6e 67 20 74 68 65  ped deleting the
183b0 20 66 69 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20   file...        
183c0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73    #..          s
183d0 65 74 20 63 6f 64 65 20 30 0d 0a 0d 0a 20 20 20  et code 0....   
183e0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
183f0 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
18400 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
18410 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20            "==== 
18420 57 41 52 4e 49 4e 47 3a 20 73 6b 69 70 70 65 64  WARNING: skipped
18430 20 64 65 6c 65 74 69 6e 67 20 64 61 74 61 62 61   deleting databa
18440 73 65 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c  se file \"" $fil
18450 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20  eName \..       
18460 20 20 20 20 20 20 20 22 5c 22 20 64 75 72 69 6e         "\" durin
18470 67 20 63 6c 65 61 6e 75 70 5c 6e 22 5d 0d 0a 20  g cleanup\n"].. 
18480 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
18490 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
184a0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
184b0 4f 54 45 3a 20 54 68 65 20 66 69 6c 65 20 64 6f  OTE: The file do
184c0 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 73 75  es not exist, su
184d0 63 63 65 73 73 21 0d 0a 20 20 20 20 20 20 20 20  ccess!..        
184e0 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 63  #..        set c
184f0 6f 64 65 20 30 0d 0a 20 20 20 20 20 20 7d 0d 0a  ode 0..      }..
18500 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 24  ..      return $
18510 63 6f 64 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  code..    }.....
18520 20 20 20 20 70 72 6f 63 20 73 61 76 65 45 6e 76      proc saveEnv
18530 69 72 6f 6e 6d 65 6e 74 56 61 72 69 61 62 6c 65  ironmentVariable
18540 73 20 7b 20 6e 61 6d 65 73 20 7b 76 61 72 4e 61  s { names {varNa
18550 6d 65 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20  me ""} } {..    
18560 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
18570 45 3a 20 46 6f 72 20 65 61 63 68 20 6e 61 6d 65  E: For each name
18580 2c 20 64 6f 65 73 20 74 68 65 20 6c 69 76 65 20  , does the live 
18590 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69  environment vari
185a0 61 62 6c 65 20 65 78 69 73 74 3f 20 20 49 66 0d  able exist?  If.
185b0 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73  .      #       s
185c0 6f 2c 20 73 61 76 65 20 74 68 65 20 76 61 6c 75  o, save the valu
185d0 65 20 66 6f 72 20 6c 61 74 65 72 3b 20 6f 74 68  e for later; oth
185e0 65 72 77 69 73 65 2c 20 6d 61 6b 65 20 73 75 72  erwise, make sur
185f0 65 20 74 68 65 20 73 61 76 65 64 0d 0a 20 20 20  e the saved..   
18600 20 20 20 23 20 20 20 20 20 20 20 76 61 6c 75 65     #       value
18610 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 20   does not exist 
18620 65 69 74 68 65 72 2e 20 20 54 68 65 20 6c 69 76  either.  The liv
18630 65 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61  e environment va
18640 72 69 61 62 6c 65 73 0d 0a 20 20 20 20 20 20 23  riables..      #
18650 20 20 20 20 20 20 20 41 52 45 20 4e 4f 54 20 63         ARE NOT c
18660 68 61 6e 67 65 64 20 62 79 20 74 68 69 73 20 70  hanged by this p
18670 72 6f 63 65 64 75 72 65 2e 0d 0a 20 20 20 20 20  rocedure...     
18680 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73   #..      if {[s
18690 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 61  tring length $va
186a0 72 4e 61 6d 65 5d 20 3d 3d 20 30 7d 20 74 68 65  rName] == 0} the
186b0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74  n {..        set
186c0 20 76 61 72 4e 61 6d 65 20 73 61 76 65 64 45 6e   varName savedEn
186d0 76 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  v..      }....  
186e0 20 20 20 20 75 70 76 61 72 20 31 20 24 76 61 72      upvar 1 $var
186f0 4e 61 6d 65 20 73 61 76 65 64 45 6e 76 0d 0a 0d  Name savedEnv...
18700 0a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 6e  .      foreach n
18710 61 6d 65 20 24 6e 61 6d 65 73 20 7b 0d 0a 20 20  ame $names {..  
18720 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20        if {[info 
18730 65 78 69 73 74 73 20 3a 3a 65 6e 76 28 24 6e 61  exists ::env($na
18740 6d 65 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  me)]} then {..  
18750 20 20 20 20 20 20 20 20 73 65 74 20 73 61 76 65          set save
18760 64 45 6e 76 28 24 6e 61 6d 65 29 20 24 3a 3a 65  dEnv($name) $::e
18770 6e 76 28 24 6e 61 6d 65 29 0d 0a 20 20 20 20 20  nv($name)..     
18780 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
18790 20 20 20 20 20 20 20 75 6e 73 65 74 20 2d 6e 6f         unset -no
187a0 63 6f 6d 70 6c 61 69 6e 20 73 61 76 65 64 45 6e  complain savedEn
187b0 76 28 24 6e 61 6d 65 29 0d 0a 20 20 20 20 20 20  v($name)..      
187c0 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a    }..      }....
187d0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
187e0 20 4e 4f 54 45 3a 20 54 68 69 73 20 69 73 20 73   NOTE: This is s
187f0 65 6c 66 2d 63 6c 65 61 6e 69 6e 67 2e 20 20 49  elf-cleaning.  I
18800 66 20 6e 6f 20 73 61 76 65 64 20 65 6e 76 69 72  f no saved envir
18810 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 73  onment variables
18820 20 6e 6f 77 0d 0a 20 20 20 20 20 20 23 20 20 20   now..      #   
18830 20 20 20 20 65 78 69 73 74 2c 20 72 65 6d 6f 76      exist, remov
18840 65 20 74 68 65 20 61 72 72 61 79 2e 0d 0a 20 20  e the array...  
18850 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
18860 7b 5b 61 72 72 61 79 20 73 69 7a 65 20 73 61 76  {[array size sav
18870 65 64 45 6e 76 5d 20 3d 3d 20 30 7d 20 74 68 65  edEnv] == 0} the
18880 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 75 6e 73  n {..        uns
18890 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 73  et -nocomplain s
188a0 61 76 65 64 45 6e 76 0d 0a 20 20 20 20 20 20 7d  avedEnv..      }
188b0 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
188c0 70 72 6f 63 20 72 65 73 74 6f 72 65 45 6e 76 69  proc restoreEnvi
188d0 72 6f 6e 6d 65 6e 74 56 61 72 69 61 62 6c 65 73  ronmentVariables
188e0 20 7b 20 6e 61 6d 65 73 20 7b 76 61 72 4e 61 6d   { names {varNam
188f0 65 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  e ""} } {..     
18900 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
18910 3a 20 46 6f 72 20 65 61 63 68 20 6e 61 6d 65 2c  : For each name,
18920 20 64 6f 65 73 20 74 68 65 20 73 61 76 65 64 20   does the saved 
18930 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69  environment vari
18940 61 62 6c 65 20 65 78 69 73 74 3f 20 20 49 66 0d  able exist?  If.
18950 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73  .      #       s
18960 6f 2c 20 72 65 73 74 6f 72 65 20 74 68 65 20 73  o, restore the s
18970 61 76 65 64 20 76 61 6c 75 65 20 61 6e 64 20 75  aved value and u
18980 6e 73 65 74 20 69 74 3b 20 6f 74 68 65 72 77 69  nset it; otherwi
18990 73 65 2c 20 6d 61 6b 65 20 73 75 72 65 0d 0a 20  se, make sure.. 
189a0 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
189b0 20 6c 69 76 65 20 65 6e 76 69 72 6f 6e 6d 65 6e   live environmen
189c0 74 20 76 61 72 69 61 62 6c 65 20 64 6f 65 73 20  t variable does 
189d0 6e 6f 74 20 65 78 69 73 74 20 65 69 74 68 65 72  not exist either
189e0 20 28 69 2e 65 2e 20 69 74 0d 0a 20 20 20 20 20   (i.e. it..     
189f0 20 23 20 20 20 20 20 20 20 77 61 73 20 6e 6f 74   #       was not
18a00 20 73 65 74 20 74 6f 20 62 65 67 69 6e 20 77 69   set to begin wi
18a10 74 68 29 2e 20 20 42 6f 74 68 20 73 61 76 65 64  th).  Both saved
18a20 20 61 6e 64 20 6c 69 76 65 20 65 6e 76 69 72 6f   and live enviro
18a30 6e 6d 65 6e 74 0d 0a 20 20 20 20 20 20 23 20 20  nment..      #  
18a40 20 20 20 20 20 76 61 72 69 61 62 6c 65 73 20 41       variables A
18a50 52 45 20 63 68 61 6e 67 65 64 20 62 79 20 74 68  RE changed by th
18a60 69 73 20 70 72 6f 63 65 64 75 72 65 2e 0d 0a 20  is procedure... 
18a70 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
18a80 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   {[string length
18a90 20 24 76 61 72 4e 61 6d 65 5d 20 3d 3d 20 30 7d   $varName] == 0}
18aa0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
18ab0 20 73 65 74 20 76 61 72 4e 61 6d 65 20 73 61 76   set varName sav
18ac0 65 64 45 6e 76 0d 0a 20 20 20 20 20 20 7d 0d 0a  edEnv..      }..
18ad0 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20 31 20  ..      upvar 1 
18ae0 24 76 61 72 4e 61 6d 65 20 73 61 76 65 64 45 6e  $varName savedEn
18af0 76 0d 0a 0d 0a 20 20 20 20 20 20 66 6f 72 65 61  v....      forea
18b00 63 68 20 6e 61 6d 65 20 24 6e 61 6d 65 73 20 7b  ch name $names {
18b10 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69  ..        if {[i
18b20 6e 66 6f 20 65 78 69 73 74 73 20 73 61 76 65 64  nfo exists saved
18b30 45 6e 76 28 24 6e 61 6d 65 29 5d 7d 20 74 68 65  Env($name)]} the
18b40 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73  n {..          s
18b50 65 74 20 3a 3a 65 6e 76 28 24 6e 61 6d 65 29 20  et ::env($name) 
18b60 24 73 61 76 65 64 45 6e 76 28 24 6e 61 6d 65 29  $savedEnv($name)
18b70 0d 0a 20 20 20 20 20 20 20 20 20 20 75 6e 73 65  ..          unse
18b80 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 73 61  t -nocomplain sa
18b90 76 65 64 45 6e 76 28 24 6e 61 6d 65 29 0d 0a 20  vedEnv($name).. 
18ba0 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
18bb0 0a 20 20 20 20 20 20 20 20 20 20 75 6e 73 65 74  .          unset
18bc0 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 3a 3a 65   -nocomplain ::e
18bd0 6e 76 28 24 6e 61 6d 65 29 0d 0a 20 20 20 20 20  nv($name)..     
18be0 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d     }..      }...
18bf0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
18c00 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 69 73 20  # NOTE: This is 
18c10 73 65 6c 66 2d 63 6c 65 61 6e 69 6e 67 2e 20 20  self-cleaning.  
18c20 49 66 20 6e 6f 20 73 61 76 65 64 20 65 6e 76 69  If no saved envi
18c30 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65  ronment variable
18c40 73 20 6e 6f 77 0d 0a 20 20 20 20 20 20 23 20 20  s now..      #  
18c50 20 20 20 20 20 65 78 69 73 74 2c 20 72 65 6d 6f       exist, remo
18c60 76 65 20 74 68 65 20 61 72 72 61 79 2e 0d 0a 20  ve the array... 
18c70 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
18c80 20 7b 5b 61 72 72 61 79 20 73 69 7a 65 20 73 61   {[array size sa
18c90 76 65 64 45 6e 76 5d 20 3d 3d 20 30 7d 20 74 68  vedEnv] == 0} th
18ca0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 75 6e  en {..        un
18cb0 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20  set -nocomplain 
18cc0 73 61 76 65 64 45 6e 76 0d 0a 20 20 20 20 20 20  savedEnv..      
18cd0 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
18ce0 20 70 72 6f 63 20 73 61 76 65 47 65 74 53 65 74   proc saveGetSet
18cf0 74 69 6e 67 56 61 6c 75 65 45 6e 76 69 72 6f 6e  tingValueEnviron
18d00 6d 65 6e 74 20 7b 7d 20 7b 0d 0a 20 20 20 20 20  ment {} {..     
18d10 20 75 70 76 61 72 20 31 20 73 61 76 65 64 45 6e   upvar 1 savedEn
18d20 76 20 73 61 76 65 64 45 6e 76 0d 0a 0d 0a 20 20  v savedEnv....  
18d30 20 20 20 20 73 61 76 65 45 6e 76 69 72 6f 6e 6d      saveEnvironm
18d40 65 6e 74 56 61 72 69 61 62 6c 65 73 20 5b 6c 69  entVariables [li
18d50 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  st \..          
18d60 4e 6f 5f 45 78 70 61 6e 64 20 4e 6f 5f 53 51 4c  No_Expand No_SQL
18d70 69 74 65 47 65 74 53 65 74 74 69 6e 67 56 61 6c  iteGetSettingVal
18d80 75 65 20 4e 6f 5f 53 51 4c 69 74 65 58 6d 6c 43  ue No_SQLiteXmlC
18d90 6f 6e 66 69 67 46 69 6c 65 5d 20 5c 0d 0a 20 20  onfigFile] \..  
18da0 20 20 20 20 20 20 20 20 73 61 76 65 64 45 6e 76          savedEnv
18db0 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
18dc0 70 72 6f 63 20 72 65 73 74 6f 72 65 47 65 74 53  proc restoreGetS
18dd0 65 74 74 69 6e 67 56 61 6c 75 65 45 6e 76 69 72  ettingValueEnvir
18de0 6f 6e 6d 65 6e 74 20 7b 7d 20 7b 0d 0a 20 20 20  onment {} {..   
18df0 20 20 20 75 70 76 61 72 20 31 20 73 61 76 65 64     upvar 1 saved
18e00 45 6e 76 20 73 61 76 65 64 45 6e 76 0d 0a 0d 0a  Env savedEnv....
18e10 20 20 20 20 20 20 72 65 73 74 6f 72 65 45 6e 76        restoreEnv
18e20 69 72 6f 6e 6d 65 6e 74 56 61 72 69 61 62 6c 65  ironmentVariable
18e30 73 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20  s [list \..     
18e40 20 20 20 20 20 4e 6f 5f 45 78 70 61 6e 64 20 4e       No_Expand N
18e50 6f 5f 53 51 4c 69 74 65 47 65 74 53 65 74 74 69  o_SQLiteGetSetti
18e60 6e 67 56 61 6c 75 65 20 4e 6f 5f 53 51 4c 69 74  ngValue No_SQLit
18e70 65 58 6d 6c 43 6f 6e 66 69 67 46 69 6c 65 5d 20  eXmlConfigFile] 
18e80 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 73 61 76  \..          sav
18e90 65 64 45 6e 76 0d 0a 20 20 20 20 7d 0d 0a 0c 0d  edEnv..    }....
18ea0 0a 20 20 20 20 70 72 6f 63 20 73 61 76 65 53 51  .    proc saveSQ
18eb0 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 45 6e  LiteConnectionEn
18ec0 76 69 72 6f 6e 6d 65 6e 74 20 7b 7d 20 7b 0d 0a  vironment {} {..
18ed0 20 20 20 20 20 20 75 70 76 61 72 20 31 20 73 61        upvar 1 sa
18ee0 76 65 64 45 6e 76 20 73 61 76 65 64 45 6e 76 0d  vedEnv savedEnv.
18ef0 0a 0d 0a 20 20 20 20 20 20 73 61 76 65 45 6e 76  ...      saveEnv
18f00 69 72 6f 6e 6d 65 6e 74 56 61 72 69 61 62 6c 65  ironmentVariable
18f10 73 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20  s [list \..     
18f20 20 20 20 20 20 44 65 66 61 75 6c 74 46 6c 61 67       DefaultFlag
18f30 73 5f 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69  s_SQLiteConnecti
18f40 6f 6e 20 4e 6f 5f 53 51 4c 69 74 65 43 6f 6e 6e  on No_SQLiteConn
18f50 65 63 74 69 6f 6e 4e 65 77 50 61 72 73 65 72 5d  ectionNewParser]
18f60 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 73 61   \..          sa
18f70 76 65 64 45 6e 76 0d 0a 20 20 20 20 7d 0d 0a 0c  vedEnv..    }...
18f80 0d 0a 20 20 20 20 70 72 6f 63 20 72 65 73 74 6f  ..    proc resto
18f90 72 65 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69  reSQLiteConnecti
18fa0 6f 6e 45 6e 76 69 72 6f 6e 6d 65 6e 74 20 7b 7d  onEnvironment {}
18fb0 20 7b 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20   {..      upvar 
18fc0 31 20 73 61 76 65 64 45 6e 76 20 73 61 76 65 64  1 savedEnv saved
18fd0 45 6e 76 0d 0a 0d 0a 20 20 20 20 20 20 72 65 73  Env....      res
18fe0 74 6f 72 65 45 6e 76 69 72 6f 6e 6d 65 6e 74 56  toreEnvironmentV
18ff0 61 72 69 61 62 6c 65 73 20 5b 6c 69 73 74 20 5c  ariables [list \
19000 0d 0a 20 20 20 20 20 20 20 20 20 20 44 65 66 61  ..          Defa
19010 75 6c 74 46 6c 61 67 73 5f 53 51 4c 69 74 65 43  ultFlags_SQLiteC
19020 6f 6e 6e 65 63 74 69 6f 6e 20 4e 6f 5f 53 51 4c  onnection No_SQL
19030 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 4e 65 77  iteConnectionNew
19040 50 61 72 73 65 72 5d 20 5c 0d 0a 20 20 20 20 20  Parser] \..     
19050 20 20 20 20 20 73 61 76 65 64 45 6e 76 0d 0a 20       savedEnv.. 
19060 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
19070 63 20 73 61 76 65 53 51 4c 69 74 65 43 6f 6e 76  c saveSQLiteConv
19080 65 72 74 45 6e 76 69 72 6f 6e 6d 65 6e 74 20 7b  ertEnvironment {
19090 7d 20 7b 0d 0a 20 20 20 20 20 20 75 70 76 61 72  } {..      upvar
190a0 20 31 20 73 61 76 65 64 45 6e 76 20 73 61 76 65   1 savedEnv save
190b0 64 45 6e 76 0d 0a 0d 0a 20 20 20 20 20 20 73 61  dEnv....      sa
190c0 76 65 45 6e 76 69 72 6f 6e 6d 65 6e 74 56 61 72  veEnvironmentVar
190d0 69 61 62 6c 65 73 20 5b 6c 69 73 74 20 5c 0d 0a  iables [list \..
190e0 20 20 20 20 20 20 20 20 20 20 55 73 65 5f 53 51            Use_SQ
190f0 4c 69 74 65 43 6f 6e 76 65 72 74 5f 44 65 66 61  LiteConvert_Defa
19100 75 6c 74 44 62 54 79 70 65 20 55 73 65 5f 53 51  ultDbType Use_SQ
19110 4c 69 74 65 43 6f 6e 76 65 72 74 5f 44 65 66 61  LiteConvert_Defa
19120 75 6c 74 54 79 70 65 4e 61 6d 65 5d 20 5c 0d 0a  ultTypeName] \..
19130 20 20 20 20 20 20 20 20 20 20 73 61 76 65 64 45            savedE
19140 6e 76 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  nv..    }.....  
19150 20 20 70 72 6f 63 20 72 65 73 74 6f 72 65 53 51    proc restoreSQ
19160 4c 69 74 65 43 6f 6e 76 65 72 74 45 6e 76 69 72  LiteConvertEnvir
19170 6f 6e 6d 65 6e 74 20 7b 7d 20 7b 0d 0a 20 20 20  onment {} {..   
19180 20 20 20 75 70 76 61 72 20 31 20 73 61 76 65 64     upvar 1 saved
19190 45 6e 76 20 73 61 76 65 64 45 6e 76 0d 0a 0d 0a  Env savedEnv....
191a0 20 20 20 20 20 20 72 65 73 74 6f 72 65 45 6e 76        restoreEnv
191b0 69 72 6f 6e 6d 65 6e 74 56 61 72 69 61 62 6c 65  ironmentVariable
191c0 73 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20  s [list \..     
191d0 20 20 20 20 20 55 73 65 5f 53 51 4c 69 74 65 43       Use_SQLiteC
191e0 6f 6e 76 65 72 74 5f 44 65 66 61 75 6c 74 44 62  onvert_DefaultDb
191f0 54 79 70 65 20 55 73 65 5f 53 51 4c 69 74 65 43  Type Use_SQLiteC
19200 6f 6e 76 65 72 74 5f 44 65 66 61 75 6c 74 54 79  onvert_DefaultTy
19210 70 65 4e 61 6d 65 5d 20 5c 0d 0a 20 20 20 20 20  peName] \..     
19220 20 20 20 20 20 73 61 76 65 64 45 6e 76 0d 0a 20       savedEnv.. 
19230 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
19240 63 20 73 65 74 75 70 44 62 49 6e 74 65 72 72 75  c setupDbInterru
19250 70 74 43 61 6c 6c 62 61 63 6b 20 7b 20 63 68 61  ptCallback { cha
19260 6e 6e 65 6c 20 6c 6f 67 20 7d 20 7b 0d 0a 20 20  nnel log } {..  
19270 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
19280 65 6c 20 22 2d 2d 2d 2d 20 73 65 74 74 69 6e 67  el "---- setting
19290 20 75 70 20 64 65 62 75 67 67 65 72 20 69 6e 74   up debugger int
192a0 65 72 72 75 70 74 20 63 61 6c 6c 62 61 63 6b 2e  errupt callback.
192b0 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 69 66  .. "....      if
192c0 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
192d0 20 20 20 20 73 61 76 65 45 6e 76 69 72 6f 6e 6d      saveEnvironm
192e0 65 6e 74 56 61 72 69 61 62 6c 65 73 20 5b 6c 69  entVariables [li
192f0 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  st \..          
19300 20 20 71 75 69 65 74 46 69 6e 64 49 6e 74 65 72    quietFindInter
19310 70 72 65 74 65 72 54 65 73 74 50 61 74 68 20 71  preterTestPath q
19320 75 69 65 74 53 65 74 75 70 49 6e 74 65 72 70 72  uietSetupInterpr
19330 65 74 65 72 54 65 73 74 50 61 74 68 5d 0d 0a 0d  eterTestPath]...
19340 0a 20 20 20 20 20 20 20 20 74 72 79 20 7b 0d 0a  .        try {..
19350 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
19360 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 50         # NOTE: P
19370 72 65 76 65 6e 74 20 74 68 65 20 76 65 6e 64 6f  revent the vendo
19380 72 20 73 63 72 69 70 74 20 66 72 6f 6d 20 62 65  r script from be
19390 69 6e 67 20 6e 6f 69 73 79 20 77 68 65 6e 20 63  ing noisy when c
193a0 72 65 61 74 69 6e 67 0d 0a 20 20 20 20 20 20 20  reating..       
193b0 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20 69     #       the i
193c0 73 6f 6c 61 74 65 64 20 69 6e 74 65 72 70 72 65  solated interpre
193d0 74 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ter...          
193e0 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  #..          set
193f0 20 3a 3a 65 6e 76 28 71 75 69 65 74 46 69 6e 64   ::env(quietFind
19400 49 6e 74 65 72 70 72 65 74 65 72 54 65 73 74 50  InterpreterTestP
19410 61 74 68 29 20 31 0d 0a 20 20 20 20 20 20 20 20  ath) 1..        
19420 20 20 73 65 74 20 3a 3a 65 6e 76 28 71 75 69 65    set ::env(quie
19430 74 53 65 74 75 70 49 6e 74 65 72 70 72 65 74 65  tSetupInterprete
19440 72 54 65 73 74 50 61 74 68 29 20 31 0d 0a 0d 0a  rTestPath) 1....
19450 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
19460 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4d         # NOTE: M
19470 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 63 72  ake sure the scr
19480 69 70 74 20 64 65 62 75 67 67 65 72 20 61 6e 64  ipt debugger and
19490 20 74 68 65 20 69 73 6f 6c 61 74 65 64 20 69 6e   the isolated in
194a0 74 65 72 70 72 65 74 65 72 0d 0a 20 20 20 20 20  terpreter..     
194b0 20 20 20 20 20 23 20 20 20 20 20 20 20 61 72 65       #       are
194c0 20 73 65 74 75 70 20 61 6e 64 20 72 65 61 64 79   setup and ready
194d0 20 66 6f 72 20 75 73 65 2e 0d 0a 20 20 20 20 20   for use...     
194e0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
194f0 20 20 64 65 62 75 67 20 73 65 74 75 70 20 74 72    debug setup tr
19500 75 65 20 74 72 75 65 0d 0a 0d 0a 20 20 20 20 20  ue true....     
19510 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
19520 20 20 23 20 4e 4f 54 45 3a 20 4c 6f 61 64 20 74    # NOTE: Load t
19530 68 65 20 6e 65 63 65 73 73 61 72 79 20 70 61 63  he necessary pac
19540 6b 61 67 65 73 20 69 6e 74 6f 20 74 68 65 20 69  kages into the i
19550 73 6f 6c 61 74 65 64 20 69 6e 74 65 72 70 72 65  solated interpre
19560 74 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ter...          
19570 23 0d 0a 20 20 20 20 20 20 20 20 20 20 64 65 62  #..          deb
19580 75 67 20 65 76 61 6c 20 7b 0d 0a 20 20 20 20 20  ug eval {..     
19590 20 20 20 20 20 20 20 70 61 63 6b 61 67 65 20 72         package r
195a0 65 71 75 69 72 65 20 45 61 67 6c 65 0d 0a 20 20  equire Eagle..  
195b0 20 20 20 20 20 20 20 20 20 20 70 61 63 6b 61 67            packag
195c0 65 20 72 65 71 75 69 72 65 20 45 61 67 6c 65 2e  e require Eagle.
195d0 4c 69 62 72 61 72 79 0d 0a 20 20 20 20 20 20 20  Library..       
195e0 20 20 20 20 20 70 61 63 6b 61 67 65 20 72 65 71       package req
195f0 75 69 72 65 20 45 61 67 6c 65 2e 54 65 73 74 0d  uire Eagle.Test.
19600 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  .          }....
19610 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
19620 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43         # NOTE: C
19630 6f 70 79 20 74 68 65 20 6e 65 63 65 73 73 61 72  opy the necessar
19640 79 20 76 61 72 69 61 62 6c 65 73 20 69 6e 74 6f  y variables into
19650 20 74 68 65 20 69 73 6f 6c 61 74 65 64 20 69 6e   the isolated in
19660 74 65 72 70 72 65 74 65 72 2e 0d 0a 20 20 20 20  terpreter...    
19670 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
19680 20 20 20 64 65 62 75 67 20 69 6e 76 6f 6b 65 20     debug invoke 
19690 30 20 73 65 74 20 3a 3a 74 65 73 74 5f 63 68 61  0 set ::test_cha
196a0 6e 6e 65 6c 20 24 63 68 61 6e 6e 65 6c 3b 20 23  nnel $channel; #
196b0 20 4e 4f 54 45 3a 20 46 6f 72 20 5b 74 70 75 74   NOTE: For [tput
196c0 73 5d 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 64  s]...          d
196d0 65 62 75 67 20 69 6e 76 6f 6b 65 20 30 20 73 65  ebug invoke 0 se
196e0 74 20 3a 3a 74 65 73 74 5f 6c 6f 67 20 24 6c 6f  t ::test_log $lo
196f0 67 3b 20 23 20 4e 4f 54 45 3a 20 46 6f 72 20 5b  g; # NOTE: For [
19700 74 6c 6f 67 5d 2e 0d 0a 0d 0a 20 20 20 20 20 20  tlog].....      
19710 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
19720 20 23 20 4e 4f 54 45 3a 20 49 6e 73 74 61 6c 6c   # NOTE: Install
19730 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 73 63   the callback sc
19740 72 69 70 74 20 74 6f 20 62 65 20 65 76 61 6c 75  ript to be evalu
19750 61 74 65 64 20 69 6e 20 74 68 65 20 69 73 6f 6c  ated in the isol
19760 61 74 65 64 0d 0a 20 20 20 20 20 20 20 20 20 20  ated..          
19770 23 20 20 20 20 20 20 20 69 6e 74 65 72 70 72 65  #       interpre
19780 74 65 72 20 77 68 65 6e 20 74 68 69 73 20 69 6e  ter when this in
19790 74 65 72 70 72 65 74 65 72 20 69 73 20 69 6e 74  terpreter is int
197a0 65 72 72 75 70 74 65 64 20 62 79 20 73 63 72 69  errupted by scri
197b0 70 74 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20  pt..          # 
197c0 20 20 20 20 20 20 63 61 6e 63 65 6c 6c 61 74 69        cancellati
197d0 6f 6e 2c 20 65 74 63 2e 0d 0a 20 20 20 20 20 20  on, etc...      
197e0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
197f0 20 64 65 62 75 67 20 63 61 6c 6c 62 61 63 6b 20   debug callback 
19800 61 70 70 6c 79 20 7b 7b 73 65 6e 64 65 72 20 65  apply {{sender e
19810 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  } {..           
19820 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
19830 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66  # NOTE: Check if
19840 20 74 68 69 73 20 64 65 62 75 67 67 65 72 20 63   this debugger c
19850 61 6c 6c 62 61 63 6b 20 69 73 20 6f 6e 65 20 74  allback is one t
19860 68 61 74 20 77 65 20 63 61 72 65 20 61 62 6f 75  hat we care abou
19870 74 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  t...            
19880 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  #..            s
19890 65 74 20 69 6e 74 65 72 72 75 70 74 54 79 70 65  et interruptType
198a0 73 20 5b 73 70 6c 69 74 20 5b 24 65 20 49 6e 74  s [split [$e Int
198b0 65 72 72 75 70 74 54 79 70 65 5d 20 22 2c 20 22  erruptType] ", "
198c0 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ]....           
198d0 20 69 66 20 7b 22 43 61 6e 63 65 6c 65 64 22 20   if {"Canceled" 
198e0 69 6e 20 24 69 6e 74 65 72 72 75 70 74 54 79 70  in $interruptTyp
198f0 65 73 20 7c 7c 20 5c 0d 0a 20 20 20 20 20 20 20  es || \..       
19900 20 20 20 20 20 20 20 20 20 22 55 6e 77 6f 75 6e           "Unwoun
19910 64 22 20 69 6e 20 24 69 6e 74 65 72 72 75 70 74  d" in $interrupt
19920 54 79 70 65 73 7d 20 74 68 65 6e 20 7b 0d 0a 20  Types} then {.. 
19930 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a               #..
19940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
19950 4e 4f 54 45 3a 20 4d 61 6b 65 20 73 75 72 65 20  NOTE: Make sure 
19960 74 68 65 20 5b 6f 62 6a 65 63 74 5d 20 63 6f 6d  the [object] com
19970 6d 61 6e 64 20 69 73 20 61 76 61 69 6c 61 62 6c  mand is availabl
19980 65 2e 20 20 53 69 6e 63 65 0d 0a 20 20 20 20 20  e.  Since..     
19990 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
199a0 20 74 68 69 73 20 69 73 20 61 6e 20 69 73 6f 6c   this is an isol
199b0 61 74 65 64 20 69 6e 74 65 72 70 72 65 74 65 72  ated interpreter
199c0 2c 20 63 68 65 63 6b 20 66 6f 72 20 69 74 20 74  , check for it t
199d0 68 65 20 68 61 72 64 0d 0a 20 20 20 20 20 20 20  he hard..       
199e0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 77         #       w
199f0 61 79 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ay...           
19a00 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
19a10 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67 74 68      if {[llength
19a20 20 5b 69 6e 66 6f 20 63 6f 6d 6d 61 6e 64 73 20   [info commands 
19a30 6f 62 6a 65 63 74 5d 5d 20 3e 20 30 7d 20 74 68  object]] > 0} th
19a40 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
19a50 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
19a60 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
19a70 20 49 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   Iterate through
19a80 20 61 6c 6c 20 64 61 74 61 62 61 73 65 20 63 6f   all database co
19a90 6e 6e 65 63 74 69 6f 6e 73 20 6b 6e 6f 77 6e 20  nnections known 
19aa0 74 6f 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20  to the..        
19ab0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
19ac0 70 61 72 65 6e 74 20 69 6e 74 65 72 70 72 65 74  parent interpret
19ad0 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  er...           
19ae0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
19af0 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 66          object f
19b00 6f 72 65 61 63 68 20 2d 61 6c 69 61 73 20 70 61  oreach -alias pa
19b10 69 72 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b  ir [object invok
19b20 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62  e -flags +NonPub
19b30 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  lic \..         
19b40 20 20 20 20 20 20 20 20 20 20 20 24 65 20 49 6e             $e In
19b50 74 65 72 70 72 65 74 65 72 2e 63 6f 6e 6e 65 63  terpreter.connec
19b60 74 69 6f 6e 73 5d 20 7b 0d 0a 20 20 20 20 20 20  tions] {..      
19b70 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
19b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b90 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74   # NOTE: Attempt
19ba0 20 74 6f 20 63 61 6e 63 65 6c 20 61 6e 79 20 53   to cancel any S
19bb0 51 4c 20 71 75 65 72 69 65 73 20 69 6e 20 70 72  QL queries in pr
19bc0 6f 67 72 65 73 73 20 6f 6e 0d 0a 20 20 20 20 20  ogress on..     
19bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20               #  
19be0 20 20 20 20 20 74 68 69 73 20 64 61 74 61 62 61       this databa
19bf0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0d 0a  se connection...
19c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c10 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
19c20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
19c30 68 20 7b 24 70 61 69 72 20 56 61 6c 75 65 2e 43  h {$pair Value.C
19c40 61 6e 63 65 6c 7d 20 65 72 72 6f 72 5d 7d 20 74  ancel} error]} t
19c50 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
19c60 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
19c70 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
19c80 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 6e 20   [appendArgs \n 
19c90 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
19ca0 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d             "====
19cb0 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64   WARNING: failed
19cc0 20 74 6f 20 63 61 6e 63 65 6c 20 71 75 65 72 79   to cancel query
19cd0 20 66 6f 72 20 22 20 5c 0d 0a 20 20 20 20 20 20   for " \..      
19ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19cf0 20 20 22 63 6f 6e 6e 65 63 74 69 6f 6e 20 5c 22    "connection \"
19d00 22 20 5b 24 70 61 69 72 20 4b 65 79 5d 20 22 5c  " [$pair Key] "\
19d10 22 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74  ", error: " \n\t
19d20 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
19d30 20 20 20 20 20 20 20 20 20 20 20 20 24 65 72 72              $err
19d40 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  or \n]..        
19d50 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
19d60 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
19d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 20                } 
19d80 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
19d90 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
19da0 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
19db0 70 70 65 6e 64 41 72 67 73 20 5c 6e 20 5c 0d 0a  ppendArgs \n \..
19dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19dd0 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e      "==== WARNIN
19de0 47 3a 20 63 61 6e 6e 6f 74 20 63 61 6e 63 65 6c  G: cannot cancel
19df0 20 61 6e 79 20 71 75 65 72 69 65 73 3a 20 22 20   any queries: " 
19e00 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
19e10 20 20 20 20 20 20 20 22 74 68 65 20 5c 22 6f 62         "the \"ob
19e20 6a 65 63 74 5c 22 20 63 6f 6d 6d 61 6e 64 20 69  ject\" command i
19e30 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 5c  s not available\
19e40 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n"]..           
19e50 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
19e60 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d    }..          }
19e70 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 66 69 6e  }..        } fin
19e80 61 6c 6c 79 20 7b 0d 0a 20 20 20 20 20 20 20 20  ally {..        
19e90 20 20 72 65 73 74 6f 72 65 45 6e 76 69 72 6f 6e    restoreEnviron
19ea0 6d 65 6e 74 56 61 72 69 61 62 6c 65 73 20 5b 6c  mentVariables [l
19eb0 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ist \..         
19ec0 20 20 20 20 20 71 75 69 65 74 46 69 6e 64 49 6e       quietFindIn
19ed0 74 65 72 70 72 65 74 65 72 54 65 73 74 50 61 74  terpreterTestPat
19ee0 68 20 71 75 69 65 74 53 65 74 75 70 49 6e 74 65  h quietSetupInte
19ef0 72 70 72 65 74 65 72 54 65 73 74 50 61 74 68 5d  rpreterTestPath]
19f00 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
19f10 20 20 20 7d 20 65 72 72 6f 72 5d 20 3d 3d 20 30     } error] == 0
19f20 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
19f30 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20    addConstraint 
19f40 69 6e 74 65 72 72 75 70 74 43 61 6c 6c 62 61 63  interruptCallbac
19f50 6b 2e 73 71 6c 69 74 65 33 0d 0a 0d 0a 20 20 20  k.sqlite3....   
19f60 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
19f70 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20 20 20 20 20  nel yes\n..     
19f80 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
19f90 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
19fa0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 6e  l [appendArgs "n
19fb0 6f 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74  o, error: " \n\t
19fc0 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20   $error \n]..   
19fd0 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
19fe0 20 20 20 20 70 72 6f 63 20 63 6c 65 61 6e 75 70      proc cleanup
19ff0 46 69 6c 65 20 7b 20 66 69 6c 65 4e 61 6d 65 20  File { fileName 
1a000 7b 63 6f 6c 6c 65 63 74 20 74 72 75 65 7d 20 7b  {collect true} {
1a010 66 6f 72 63 65 20 66 61 6c 73 65 7d 20 7d 20 7b  force false} } {
1a020 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
1a030 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74   # NOTE: Attempt
1a040 20 74 6f 20 66 6f 72 63 65 20 61 6c 6c 20 70 65   to force all pe
1a050 6e 64 69 6e 67 20 22 67 61 72 62 61 67 65 22 20  nding "garbage" 
1a060 6f 62 6a 65 63 74 73 20 74 6f 20 62 65 20 63 6f  objects to be co
1a070 6c 6c 65 63 74 65 64 2c 0d 0a 20 20 20 20 20 20  llected,..      
1a080 23 20 20 20 20 20 20 20 69 6e 63 6c 75 64 69 6e  #       includin
1a090 67 20 53 51 4c 69 74 65 20 73 74 61 74 65 6d 65  g SQLite stateme
1a0a0 6e 74 73 20 61 6e 64 20 62 61 63 6b 75 70 20 6f  nts and backup o
1a0b0 62 6a 65 63 74 73 3b 20 74 68 69 73 20 73 68 6f  bjects; this sho
1a0c0 75 6c 64 20 61 6c 6c 6f 77 0d 0a 20 20 20 20 20  uld allow..     
1a0d0 20 23 20 20 20 20 20 20 20 74 68 65 20 75 6e 64   #       the und
1a0e0 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65  erlying database
1a0f0 20 66 69 6c 65 20 74 6f 20 62 65 20 64 65 6c 65   file to be dele
1a100 74 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ted...      #.. 
1a110 20 20 20 20 20 69 66 20 7b 24 63 6f 6c 6c 65 63       if {$collec
1a120 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
1a130 20 20 20 63 6f 6c 6c 65 63 74 47 61 72 62 61 67     collectGarbag
1a140 65 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  e $::test_channe
1a150 6c 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  l..      }....  
1a160 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
1a170 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20 74 68  OTE: Check if th
1a180 65 20 66 69 6c 65 20 73 74 69 6c 6c 20 65 78 69  e file still exi
1a190 73 74 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  sts...      #.. 
1a1a0 20 20 20 20 20 69 66 20 7b 5b 66 69 6c 65 20 65       if {[file e
1a1b0 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d  xists $fileName]
1a1c0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1a1d0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
1a1e0 4f 54 45 3a 20 53 6b 69 70 20 64 65 6c 65 74 69  OTE: Skip deleti
1a1f0 6e 67 20 74 65 73 74 20 66 69 6c 65 73 20 69 66  ng test files if
1a200 20 73 6f 6d 65 62 6f 64 79 20 73 65 74 73 20 74   somebody sets t
1a210 68 65 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62  he global variab
1a220 6c 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  le..        #   
1a230 20 20 20 20 74 6f 20 70 72 65 76 65 6e 74 20 69      to prevent i
1a240 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  t...        #.. 
1a250 20 20 20 20 20 20 20 69 66 20 7b 24 66 6f 72 63         if {$forc
1a260 65 20 7c 7c 20 21 5b 69 6e 66 6f 20 65 78 69 73  e || ![info exis
1a270 74 73 20 3a 3a 6e 6f 28 63 6c 65 61 6e 75 70 46  ts ::no(cleanupF
1a280 69 6c 65 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  ile)]} then {.. 
1a290 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
1a2a0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74        # NOTE: At
1a2b0 74 65 6d 70 74 20 74 6f 20 64 65 6c 65 74 65 20  tempt to delete 
1a2c0 74 68 65 20 74 65 73 74 20 66 69 6c 65 20 6e 6f  the test file no
1a2d0 77 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  w...          #.
1a2e0 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b  .          if {[
1a2f0 73 65 74 20 63 6f 64 65 20 5b 63 61 74 63 68 20  set code [catch 
1a300 7b 66 69 6c 65 20 64 65 6c 65 74 65 20 24 66 69  {file delete $fi
1a310 6c 65 4e 61 6d 65 7d 20 65 72 72 6f 72 5d 5d 7d  leName} error]]}
1a320 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1a330 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1a340 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 73      # NOTE: We s
1a350 6f 6d 65 68 6f 77 20 66 61 69 6c 65 64 20 74 6f  omehow failed to
1a360 20 64 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65   delete the file
1a370 2c 20 72 65 70 6f 72 74 20 77 68 79 2e 0d 0a 20  , report why... 
1a380 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
1a390 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
1a3a0 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
1a3b0 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
1a3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1a3d0 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61  ==== WARNING: fa
1a3e0 69 6c 65 64 20 74 6f 20 64 65 6c 65 74 65 20 74  iled to delete t
1a3f0 65 73 74 20 66 69 6c 65 20 5c 22 22 20 24 66 69  est file \"" $fi
1a400 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20  leName \..      
1a410 20 20 20 20 20 20 20 20 20 20 22 5c 22 20 64 75            "\" du
1a420 72 69 6e 67 20 63 6c 65 61 6e 75 70 2c 20 65 72  ring cleanup, er
1a430 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72  ror: " \n\t $err
1a440 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  or \n]..        
1a450 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65    }..        } e
1a460 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
1a470 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
1a480 4e 4f 54 45 3a 20 53 68 6f 77 20 74 68 61 74 20  NOTE: Show that 
1a490 77 65 20 73 6b 69 70 70 65 64 20 64 65 6c 65 74  we skipped delet
1a4a0 69 6e 67 20 74 68 65 20 66 69 6c 65 2e 0d 0a 20  ing the file... 
1a4b0 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
1a4c0 20 20 20 20 20 20 73 65 74 20 63 6f 64 65 20 30        set code 0
1a4d0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70  ....          tp
1a4e0 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
1a4f0 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
1a500 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1a510 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20   "==== WARNING: 
1a520 73 6b 69 70 70 65 64 20 64 65 6c 65 74 69 6e 67  skipped deleting
1a530 20 74 65 73 74 20 66 69 6c 65 20 5c 22 22 20 24   test file \"" $
1a540 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20  fileName \..    
1a550 20 20 20 20 20 20 20 20 20 20 22 5c 22 20 64 75            "\" du
1a560 72 69 6e 67 20 63 6c 65 61 6e 75 70 5c 6e 22 5d  ring cleanup\n"]
1a570 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
1a580 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
1a590 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1a5a0 23 20 4e 4f 54 45 3a 20 54 68 65 20 66 69 6c 65  # NOTE: The file
1a5b0 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c   does not exist,
1a5c0 20 73 75 63 63 65 73 73 21 0d 0a 20 20 20 20 20   success!..     
1a5d0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65     #..        se
1a5e0 74 20 63 6f 64 65 20 30 0d 0a 20 20 20 20 20 20  t code 0..      
1a5f0 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72  }....      retur
1a600 6e 20 24 63 6f 64 65 0d 0a 20 20 20 20 7d 0d 0a  n $code..    }..
1a610 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 6c 65 61  ...    proc clea
1a620 6e 75 70 4d 65 6d 6f 72 79 20 7b 20 76 61 72 4e  nupMemory { varN
1a630 61 6d 65 20 7b 71 75 69 65 74 20 66 61 6c 73 65  ame {quiet false
1a640 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66 20  } } {..      if 
1a650 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f 62 6a 65  {[haveSQLiteObje
1a660 63 74 43 6f 6d 6d 61 6e 64 5d 20 26 26 20 5c 0d  ctCommand] && \.
1a670 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69  .          [stri
1a680 6e 67 20 6c 65 6e 67 74 68 20 24 76 61 72 4e 61  ng length $varNa
1a690 6d 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  me] > 0} then {.
1a6a0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
1a6b0 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 66 65      # NOTE: Refe
1a6c0 72 20 74 6f 20 74 68 65 20 73 70 65 63 69 66 69  r to the specifi
1a6d0 65 64 20 76 61 72 69 61 62 6c 65 20 28 65 2e 67  ed variable (e.g
1a6e0 2e 20 22 63 6f 6e 6e 65 63 74 69 6f 6e 22 29 20  . "connection") 
1a6f0 69 6e 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20  in the..        
1a700 23 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74 20  #       context 
1a710 6f 66 20 6f 75 72 20 63 61 6c 6c 65 72 2e 20 20  of our caller.  
1a720 54 68 65 20 6f 70 61 71 75 65 20 6f 62 6a 65 63  The opaque objec
1a730 74 20 68 61 6e 64 6c 65 20 66 6f 72 20 61 6e 0d  t handle for an.
1a740 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
1a750 20 41 44 4f 2e 4e 45 54 20 63 6f 6e 6e 65 63 74   ADO.NET connect
1a760 69 6f 6e 20 70 72 65 76 69 6f 75 73 6c 79 20 72  ion previously r
1a770 65 74 75 72 6e 65 64 20 62 79 20 5b 67 65 74 44  eturned by [getD
1a780 62 43 6f 6e 6e 65 63 74 69 6f 6e 5d 0d 0a 20 20  bConnection]..  
1a790 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73 68        #       sh
1a7a0 6f 75 6c 64 20 62 65 20 73 74 6f 72 65 64 20 74  ould be stored t
1a7b0 68 65 72 65 2e 0d 0a 20 20 20 20 20 20 20 20 23  here...        #
1a7c0 0d 0a 20 20 20 20 20 20 20 20 75 70 76 61 72 20  ..        upvar 
1a7d0 31 20 24 76 61 72 4e 61 6d 65 20 63 6f 6e 6e 65  1 $varName conne
1a7e0 63 74 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20 20  ction....       
1a7f0 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
1a800 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20           object 
1a810 69 6e 76 6f 6b 65 20 24 63 6f 6e 6e 65 63 74 69  invoke $connecti
1a820 6f 6e 20 52 65 6c 65 61 73 65 4d 65 6d 6f 72 79  on ReleaseMemory
1a830 0d 0a 20 20 20 20 20 20 20 20 7d 20 72 65 73 75  ..        } resu
1a840 6c 74 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  lt]} then {..   
1a850 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
1a860 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
1a870 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
1a880 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
1a890 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
1a8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d               "==
1a8b0 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c  == WARNING: fail
1a8c0 65 64 20 74 6f 20 72 65 6c 65 61 73 65 20 64 61  ed to release da
1a8d0 74 61 62 61 73 65 20 6d 65 6d 6f 72 79 2c 20 65  tabase memory, e
1a8e0 72 72 6f 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20  rror: " \..     
1a8f0 20 20 20 20 20 20 20 20 20 20 20 5c 6e 5c 74 20             \n\t 
1a900 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20  $result \n]..   
1a910 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1a920 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a    }..      }....
1a930 20 20 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67        if {[lleng
1a940 74 68 20 5b 69 6e 66 6f 20 63 6f 6d 6d 61 6e 64  th [info command
1a950 73 20 64 65 62 75 67 5d 5d 20 3e 20 30 7d 20 74  s debug]] > 0} t
1a960 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69  hen {..        i
1a970 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  f {[catch {..   
1a980 20 20 20 20 20 20 20 75 70 6c 65 76 65 6c 20 31         uplevel 1
1a990 20 5b 6c 69 73 74 20 64 65 62 75 67 20 70 75 72   [list debug pur
1a9a0 67 65 5d 0d 0a 20 20 20 20 20 20 20 20 7d 20 72  ge]..        } r
1a9b0 65 73 75 6c 74 5d 7d 20 74 68 65 6e 20 7b 0d 0a  esult]} then {..
1a9c0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24            if {!$
1a9d0 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
1a9e0 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
1a9f0 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
1aa00 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
1aa10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66  "==== WARNING: f
1aa30 61 69 6c 65 64 20 74 6f 20 70 75 72 67 65 20 63  ailed to purge c
1aa40 61 6c 6c 20 66 72 61 6d 65 2c 20 65 72 72 6f 72  all frame, error
1aa50 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  : " \..         
1aa60 20 20 20 20 20 20 20 5c 6e 5c 74 20 24 72 65 73         \n\t $res
1aa70 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ult \n]..       
1aa80 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
1aa90 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  ...        if {[
1aaa0 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
1aab0 20 20 20 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69     uplevel 1 [li
1aac0 73 74 20 64 65 62 75 67 20 63 6c 65 61 6e 75 70  st debug cleanup
1aad0 5d 0d 0a 20 20 20 20 20 20 20 20 7d 20 72 65 73  ]..        } res
1aae0 75 6c 74 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ult]} then {..  
1aaf0 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
1ab00 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
1ab10 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
1ab20 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
1ab30 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
1ab40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d                "=
1ab50 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69  === WARNING: fai
1ab60 6c 65 64 20 74 6f 20 63 6c 65 61 6e 75 70 20 69  led to cleanup i
1ab70 6e 74 65 72 70 72 65 74 65 72 2c 20 65 72 72 6f  nterpreter, erro
1ab80 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20  r: " \..        
1ab90 20 20 20 20 20 20 20 20 5c 6e 5c 74 20 24 72 65          \n\t $re
1aba0 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  sult \n]..      
1abb0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
1abc0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b  ....        if {
1abd0 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
1abe0 20 20 20 20 75 70 6c 65 76 65 6c 20 31 20 5b 6c      uplevel 1 [l
1abf0 69 73 74 20 64 65 62 75 67 20 63 6f 6c 6c 65 63  ist debug collec
1ac00 74 5d 0d 0a 20 20 20 20 20 20 20 20 7d 20 72 65  t]..        } re
1ac10 73 75 6c 74 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  sult]} then {.. 
1ac20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71           if {!$q
1ac30 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
1ac40 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
1ac50 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
1ac60 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
1ac70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1ac80 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61  ==== WARNING: fa
1ac90 69 6c 65 64 20 74 6f 20 63 6f 6c 6c 65 63 74 20  iled to collect 
1aca0 67 61 72 62 61 67 65 2c 20 65 72 72 6f 72 3a 20  garbage, error: 
1acb0 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
1acc0 20 20 20 20 20 5c 6e 5c 74 20 24 72 65 73 75 6c       \n\t $resul
1acd0 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  t \n]..         
1ace0 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20   }..        }.. 
1acf0 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
1ad00 0d 0a 20 20 20 20 70 72 6f 63 20 73 65 74 75 70  ..    proc setup
1ad10 4d 65 6d 6f 72 79 43 6f 75 6e 74 65 72 73 20 7b  MemoryCounters {
1ad20 20 76 61 72 4e 61 6d 65 20 7d 20 7b 0d 0a 20 20   varName } {..  
1ad30 20 20 20 20 69 66 20 7b 5b 68 61 76 65 53 51 4c      if {[haveSQL
1ad40 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64  iteObjectCommand
1ad50 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
1ad60 20 20 20 75 70 76 61 72 20 31 20 24 76 61 72 4e     upvar 1 $varN
1ad70 61 6d 65 20 63 6f 75 6e 74 65 72 0d 0a 0d 0a 20  ame counter.... 
1ad80 20 20 20 20 20 20 20 73 65 74 20 63 6f 75 6e 74         set count
1ad90 65 72 28 31 29 20 5b 6f 62 6a 65 63 74 20 63 72  er(1) [object cr
1ada0 65 61 74 65 20 2d 61 6c 69 61 73 20 5c 0d 0a 20  eate -alias \.. 
1adb0 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65             Syste
1adc0 6d 2e 44 69 61 67 6e 6f 73 74 69 63 73 2e 50 65  m.Diagnostics.Pe
1add0 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72  rformanceCounter
1ade0 20 50 72 6f 63 65 73 73 20 5c 0d 0a 20 20 20 20   Process \..    
1adf0 20 20 20 20 20 20 20 20 22 57 6f 72 6b 69 6e 67          "Working
1ae00 20 53 65 74 22 20 5b 66 69 6c 65 20 72 6f 6f 74   Set" [file root
1ae10 6e 61 6d 65 20 5b 66 69 6c 65 20 74 61 69 6c 20  name [file tail 
1ae20 24 3a 3a 62 69 6e 5f 66 69 6c 65 5d 5d 5d 0d 0a  $::bin_file]]]..
1ae30 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 63 6f  ..        set co
1ae40 75 6e 74 65 72 28 32 29 20 5b 6f 62 6a 65 63 74  unter(2) [object
1ae50 20 63 72 65 61 74 65 20 2d 61 6c 69 61 73 20 5c   create -alias \
1ae60 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 79  ..            Sy
1ae70 73 74 65 6d 2e 44 69 61 67 6e 6f 73 74 69 63 73  stem.Diagnostics
1ae80 2e 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e  .PerformanceCoun
1ae90 74 65 72 20 50 72 6f 63 65 73 73 20 5c 0d 0a 20  ter Process \.. 
1aea0 20 20 20 20 20 20 20 20 20 20 20 22 57 6f 72 6b             "Work
1aeb0 69 6e 67 20 53 65 74 20 50 65 61 6b 22 20 5b 66  ing Set Peak" [f
1aec0 69 6c 65 20 72 6f 6f 74 6e 61 6d 65 20 5b 66 69  ile rootname [fi
1aed0 6c 65 20 74 61 69 6c 20 24 3a 3a 62 69 6e 5f 66  le tail $::bin_f
1aee0 69 6c 65 5d 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20  ile]]]....      
1aef0 20 20 73 65 74 20 63 6f 75 6e 74 65 72 28 33 29    set counter(3)
1af00 20 5b 6f 62 6a 65 63 74 20 63 72 65 61 74 65 20   [object create 
1af10 2d 61 6c 69 61 73 20 5c 0d 0a 20 20 20 20 20 20  -alias \..      
1af20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 69 61        System.Dia
1af30 67 6e 6f 73 74 69 63 73 2e 50 65 72 66 6f 72 6d  gnostics.Perform
1af40 61 6e 63 65 43 6f 75 6e 74 65 72 20 50 72 6f 63  anceCounter Proc
1af50 65 73 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ess \..         
1af60 20 20 20 22 50 72 69 76 61 74 65 20 42 79 74 65     "Private Byte
1af70 73 22 20 5b 66 69 6c 65 20 72 6f 6f 74 6e 61 6d  s" [file rootnam
1af80 65 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 3a 3a  e [file tail $::
1af90 62 69 6e 5f 66 69 6c 65 5d 5d 5d 0d 0a 20 20 20  bin_file]]]..   
1afa0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65     }....      re
1afb0 74 75 72 6e 20 22 22 0d 0a 20 20 20 20 7d 0d 0a  turn ""..    }..
1afc0 0c 0d 0a 20 20 20 20 70 72 6f 63 20 72 65 70 6f  ...    proc repo
1afd0 72 74 4d 65 6d 6f 72 79 43 6f 75 6e 74 65 72 73  rtMemoryCounters
1afe0 20 7b 20 63 68 61 6e 6e 65 6c 20 76 61 72 4e 61   { channel varNa
1aff0 6d 65 20 70 72 65 66 69 78 20 7d 20 7b 0d 0a 20  me prefix } {.. 
1b000 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65 53 51       if {[haveSQ
1b010 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e  LiteObjectComman
1b020 64 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  d]} then {..    
1b030 20 20 20 20 75 70 76 61 72 20 31 20 24 76 61 72      upvar 1 $var
1b040 4e 61 6d 65 20 63 6f 75 6e 74 65 72 0d 0a 0d 0a  Name counter....
1b050 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
1b060 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
1b070 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
1b080 20 20 22 2d 2d 2d 2d 20 22 20 24 70 72 65 66 69    "---- " $prefi
1b090 78 20 22 20 63 6f 75 6e 74 65 72 20 5c 22 22 20  x " counter \"" 
1b0a0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
1b0b0 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 24 63  object invoke $c
1b0c0 6f 75 6e 74 65 72 28 31 29 20 43 6f 75 6e 74 65  ounter(1) Counte
1b0d0 72 4e 61 6d 65 5d 20 22 5c 22 20 76 61 6c 75 65  rName] "\" value
1b0e0 20 69 73 20 22 20 5c 0d 0a 20 20 20 20 20 20 20   is " \..       
1b0f0 20 20 20 20 20 5b 6f 62 6a 65 63 74 20 69 6e 76       [object inv
1b100 6f 6b 65 20 24 63 6f 75 6e 74 65 72 28 31 29 20  oke $counter(1) 
1b110 52 61 77 56 61 6c 75 65 5d 20 5c 6e 5d 0d 0a 0d  RawValue] \n]...
1b120 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
1b130 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
1b140 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
1b150 20 20 20 22 2d 2d 2d 2d 20 22 20 24 70 72 65 66     "---- " $pref
1b160 69 78 20 22 20 63 6f 75 6e 74 65 72 20 5c 22 22  ix " counter \""
1b170 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1b180 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 24  [object invoke $
1b190 63 6f 75 6e 74 65 72 28 32 29 20 43 6f 75 6e 74  counter(2) Count
1b1a0 65 72 4e 61 6d 65 5d 20 22 5c 22 20 76 61 6c 75  erName] "\" valu
1b1b0 65 20 69 73 20 22 20 5c 0d 0a 20 20 20 20 20 20  e is " \..      
1b1c0 20 20 20 20 20 20 5b 6f 62 6a 65 63 74 20 69 6e        [object in
1b1d0 76 6f 6b 65 20 24 63 6f 75 6e 74 65 72 28 32 29  voke $counter(2)
1b1e0 20 52 61 77 56 61 6c 75 65 5d 20 5c 6e 5d 0d 0a   RawValue] \n]..
1b1f0 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
1b200 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
1b210 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
1b220 20 20 20 20 22 2d 2d 2d 2d 20 22 20 24 70 72 65      "---- " $pre
1b230 66 69 78 20 22 20 63 6f 75 6e 74 65 72 20 5c 22  fix " counter \"
1b240 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
1b250 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20   [object invoke 
1b260 24 63 6f 75 6e 74 65 72 28 33 29 20 43 6f 75 6e  $counter(3) Coun
1b270 74 65 72 4e 61 6d 65 5d 20 22 5c 22 20 76 61 6c  terName] "\" val
1b280 75 65 20 69 73 20 22 20 5c 0d 0a 20 20 20 20 20  ue is " \..     
1b290 20 20 20 20 20 20 20 5b 6f 62 6a 65 63 74 20 69         [object i
1b2a0 6e 76 6f 6b 65 20 24 63 6f 75 6e 74 65 72 28 33  nvoke $counter(3
1b2b0 29 20 52 61 77 56 61 6c 75 65 5d 20 5c 6e 5d 0d  ) RawValue] \n].
1b2c0 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
1b2d0 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 6f 6c  ....    proc col
1b2e0 6c 65 63 74 47 61 72 62 61 67 65 20 7b 20 63 68  lectGarbage { ch
1b2f0 61 6e 6e 65 6c 20 7b 6d 69 6c 6c 69 73 65 63 6f  annel {milliseco
1b300 6e 64 73 20 31 30 30 30 7d 20 7b 71 75 69 65 74  nds 1000} {quiet
1b310 20 74 72 75 65 7d 20 7d 20 7b 0d 0a 20 20 20 20   true} } {..    
1b320 20 20 69 66 20 7b 5b 68 61 76 65 53 51 4c 69 74    if {[haveSQLit
1b330 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d 7d  eObjectCommand]}
1b340 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1b350 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
1b360 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20           object 
1b370 69 6e 76 6f 6b 65 20 47 43 20 47 65 74 54 6f 74  invoke GC GetTot
1b380 61 6c 4d 65 6d 6f 72 79 20 66 61 6c 73 65 0d 0a  alMemory false..
1b390 20 20 20 20 20 20 20 20 7d 20 72 65 73 75 6c 74          } result
1b3a0 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
1b3b0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24            if {!$
1b3c0 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
1b3d0 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
1b3e0 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
1b3f0 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
1b400 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6d           "---- m
1b410 65 6d 6f 72 79 20 69 6e 20 75 73 65 20 62 79 20  emory in use by 
1b420 74 68 65 20 43 4c 52 20 62 65 66 6f 72 65 20 63  the CLR before c
1b430 6f 6c 6c 65 63 74 69 6f 6e 2e 2e 2e 20 22 20 5c  ollection... " \
1b440 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1b450 20 20 24 72 65 73 75 6c 74 20 22 20 62 79 74 65    $result " byte
1b460 73 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20  s\n"]..         
1b470 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c   }..        } el
1b480 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
1b490 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
1b4a0 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
1b4b0 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d              "===
1b4c0 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65  = WARNING: faile
1b4d0 64 20 74 6f 20 67 65 74 20 43 4c 52 20 6d 65 6d  d to get CLR mem
1b4e0 6f 72 79 20 75 73 61 67 65 2c 20 65 72 72 6f 72  ory usage, error
1b4f0 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  : " \..         
1b500 20 20 20 20 20 5c 6e 5c 74 20 24 72 65 73 75 6c       \n\t $resul
1b510 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d  t \n]..        }
1b520 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
1b530 20 20 20 23 23 23 23 23 23 23 23 23 23 23 23 23     #############
1b540 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1b550 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1b560 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1b570 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a  ############....
1b580 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
1b590 20 4e 4f 54 45 3a 20 52 65 70 65 61 74 65 64 6c   NOTE: Repeatedl
1b5a0 79 20 61 74 74 65 6d 70 74 20 74 6f 20 63 6f 6c  y attempt to col
1b5b0 6c 65 63 74 20 67 61 72 62 61 67 65 20 75 6e 74  lect garbage unt
1b5c0 69 6c 20 74 68 65 20 61 6c 6c 6f 74 74 65 64 20  il the allotted 
1b5d0 6e 75 6d 62 65 72 0d 0a 20 20 20 20 20 20 23 20  number..      # 
1b5e0 20 20 20 20 20 20 6f 66 20 6d 69 6c 6c 69 73 65        of millise
1b5f0 63 6f 6e 64 73 20 68 61 73 20 65 6c 61 70 73 65  conds has elapse
1b600 64 2e 20 20 41 6c 77 61 79 73 20 61 74 74 65 6d  d.  Always attem
1b610 70 74 20 74 6f 20 63 6f 6c 6c 65 63 74 20 67 61  pt to collect ga
1b620 72 62 61 67 65 0d 0a 20 20 20 20 20 20 23 20 20  rbage..      #  
1b630 20 20 20 20 20 61 74 20 6c 65 61 73 74 20 6f 6e       at least on
1b640 63 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ce...      #..  
1b650 20 20 20 20 69 66 20 7b 5b 68 61 76 65 53 51 4c      if {[haveSQL
1b660 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64  iteObjectCommand
1b670 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
1b680 20 20 20 73 65 74 20 73 74 61 72 74 20 5b 63 6c     set start [cl
1b690 6f 63 6b 20 73 65 63 6f 6e 64 73 5d 0d 0a 20 20  ock seconds]..  
1b6a0 20 20 20 20 20 20 73 65 74 20 73 74 6f 70 20 5b        set stop [
1b6b0 65 78 70 72 20 7b 24 73 74 61 72 74 20 2b 20 28  expr {$start + (
1b6c0 24 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 2f 20  $milliseconds / 
1b6d0 31 30 30 30 29 7d 5d 0d 0a 0d 0a 20 20 20 20 20  1000)}]....     
1b6e0 20 20 20 64 6f 20 7b 0d 0a 20 20 20 20 20 20 20     do {..       
1b6f0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
1b700 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20  # NOTE: Attempt 
1b710 74 6f 20 66 6f 72 63 65 20 61 20 66 75 6c 6c 20  to force a full 
1b720 67 61 72 62 61 67 65 20 63 6f 6c 6c 65 63 74 69  garbage collecti
1b730 6f 6e 20 6e 6f 77 2e 20 20 52 65 70 6f 72 74 20  on now.  Report 
1b740 61 6e 79 0d 0a 20 20 20 20 20 20 20 20 20 20 23  any..          #
1b750 20 20 20 20 20 20 20 65 72 72 6f 72 20 74 68 61         error tha
1b760 74 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  t is encountered
1b770 20 69 66 20 77 65 20 66 61 69 6c 2e 0d 0a 20 20   if we fail...  
1b780 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1b790 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
1b7a0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f  {..            o
1b7b0 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 47 43 20  bject invoke GC 
1b7c0 47 65 74 54 6f 74 61 6c 4d 65 6d 6f 72 79 20 74  GetTotalMemory t
1b7d0 72 75 65 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  rue..          }
1b7e0 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d   error]} then {.
1b7f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
1b800 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
1b810 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
1b820 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d             "====
1b830 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64   WARNING: failed
1b840 20 66 75 6c 6c 20 67 61 72 62 61 67 65 20 63 6f   full garbage co
1b850 6c 6c 65 63 74 69 6f 6e 2c 20 65 72 72 6f 72 3a  llection, error:
1b860 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   " \..          
1b870 20 20 20 20 20 20 5c 6e 5c 74 20 24 65 72 72 6f        \n\t $erro
1b880 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  r \n]..         
1b890 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
1b8a0 73 65 74 20 6e 6f 77 20 5b 63 6c 6f 63 6b 20 73  set now [clock s
1b8b0 65 63 6f 6e 64 73 5d 0d 0a 20 20 20 20 20 20 20  econds]..       
1b8c0 20 7d 20 77 68 69 6c 65 20 7b 24 73 74 61 72 74   } while {$start
1b8d0 20 3c 3d 20 24 6e 6f 77 20 26 26 20 24 6e 6f 77   <= $now && $now
1b8e0 20 3c 20 24 73 74 6f 70 7d 0d 0a 20 20 20 20 20   < $stop}..     
1b8f0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 23 23 23   }....      ####
1b900 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1b910 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1b920 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1b930 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1b940 23 23 23 23 23 0d 0a 0d 0a 20 20 20 20 20 20 69  #####....      i
1b950 66 20 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f 62  f {[haveSQLiteOb
1b960 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68  jectCommand]} th
1b970 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66  en {..        if
1b980 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
1b990 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76        object inv
1b9a0 6f 6b 65 20 47 43 20 47 65 74 54 6f 74 61 6c 4d  oke GC GetTotalM
1b9b0 65 6d 6f 72 79 20 66 61 6c 73 65 0d 0a 20 20 20  emory false..   
1b9c0 20 20 20 20 20 7d 20 72 65 73 75 6c 74 5d 20 3d       } result] =
1b9d0 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
1b9e0 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
1b9f0 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
1ba00 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
1ba10 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
1ba20 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
1ba30 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6d 65 6d 6f        "---- memo
1ba40 72 79 20 69 6e 20 75 73 65 20 62 79 20 74 68 65  ry in use by the
1ba50 20 43 4c 52 20 61 66 74 65 72 20 63 6f 6c 6c 65   CLR after colle
1ba60 63 74 69 6f 6e 2e 2e 2e 20 22 20 5c 0d 0a 20 20  ction... " \..  
1ba70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24 72                $r
1ba80 65 73 75 6c 74 20 22 20 62 79 74 65 73 5c 6e 22  esult " bytes\n"
1ba90 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ]..          }..
1baa0 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
1bab0 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74  ..          tput
1bac0 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
1bad0 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
1bae0 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41          "==== WA
1baf0 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f  RNING: failed to
1bb00 20 67 65 74 20 43 4c 52 20 6d 65 6d 6f 72 79 20   get CLR memory 
1bb10 75 73 61 67 65 2c 20 65 72 72 6f 72 3a 20 22 20  usage, error: " 
1bb20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1bb30 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e   \n\t $result \n
1bb40 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  ]..        }..  
1bb50 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
1bb60 0a 20 20 20 20 70 72 6f 63 20 67 65 74 53 51 4c  .    proc getSQL
1bb70 69 74 65 48 61 6e 64 6c 65 43 6f 75 6e 74 73 20  iteHandleCounts 
1bb80 7b 20 63 68 61 6e 6e 65 6c 20 7b 71 75 69 65 74  { channel {quiet
1bb90 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20   false} } {..   
1bba0 20 20 20 73 65 74 20 72 65 73 75 6c 74 20 5b 6c     set result [l
1bbb0 69 73 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66  ist]....      if
1bbc0 20 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f 62 6a   {[haveSQLiteObj
1bbd0 65 63 74 43 6f 6d 6d 61 6e 64 5d 20 26 26 20 5c  ectCommand] && \
1bbe0 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 68 61 76  ..          [hav
1bbf0 65 53 51 4c 69 74 65 44 65 66 69 6e 65 43 6f 6e  eSQLiteDefineCon
1bc00 73 74 61 6e 74 20 43 4f 55 4e 54 5f 48 41 4e 44  stant COUNT_HAND
1bc10 4c 45 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  LE]} then {..   
1bc20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1bc30 23 20 4e 4f 54 45 3a 20 41 64 64 20 65 61 63 68  # NOTE: Add each
1bc40 20 63 72 69 74 69 63 61 6c 20 68 61 6e 64 6c 65   critical handle
1bc50 20 63 6f 75 6e 74 20 74 6f 20 74 68 65 20 72 65   count to the re
1bc60 73 75 6c 74 69 6e 67 20 6c 69 73 74 2e 0d 0a 20  sulting list... 
1bc70 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1bc80 20 20 66 6f 72 65 61 63 68 20 6e 61 6d 65 20 5b    foreach name [
1bc90 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20  list \..        
1bca0 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 43 6f      connectionCo
1bcb0 75 6e 74 20 73 74 61 74 65 6d 65 6e 74 43 6f 75  unt statementCou
1bcc0 6e 74 20 62 61 63 6b 75 70 43 6f 75 6e 74 20 62  nt backupCount b
1bcd0 6c 6f 62 43 6f 75 6e 74 5d 20 7b 0d 0a 20 20 20  lobCount] {..   
1bce0 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
1bcf0 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  h {..           
1bd00 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d   object invoke -
1bd10 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63  flags +NonPublic
1bd20 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1bd30 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e      System.Data.
1bd40 53 51 4c 69 74 65 2e 44 65 62 75 67 44 61 74 61  SQLite.DebugData
1bd50 20 24 6e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20   $name..        
1bd60 20 20 7d 20 76 61 6c 75 65 5d 20 3d 3d 20 30 7d    } value] == 0}
1bd70 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1bd80 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
1bd90 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1bda0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
1bdb0 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
1bdc0 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
1bdd0 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 72          "---- cr
1bde0 69 74 69 63 61 6c 20 68 61 6e 64 6c 65 20 63 6f  itical handle co
1bdf0 75 6e 74 20 5c 22 22 20 24 6e 61 6d 65 20 22 5c  unt \"" $name "\
1be00 22 20 69 73 20 22 20 24 76 61 6c 75 65 20 5c 6e  " is " $value \n
1be10 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ]..            }
1be20 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
1be30 6c 61 70 70 65 6e 64 20 72 65 73 75 6c 74 20 24  lappend result $
1be40 76 61 6c 75 65 0d 0a 20 20 20 20 20 20 20 20 20  value..         
1be50 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
1be60 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
1be70 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
1be80 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
1be90 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49       "==== WARNI
1bea0 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 67 65  NG: failed to ge
1beb0 74 20 63 72 69 74 69 63 61 6c 20 68 61 6e 64 6c  t critical handl
1bec0 65 20 63 6f 75 6e 74 20 5c 22 22 20 5c 0d 0a 20  e count \"" \.. 
1bed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24                 $
1bee0 6e 61 6d 65 20 22 5c 22 2c 20 65 72 72 6f 72 3a  name "\", error:
1bef0 20 22 20 5c 6e 5c 74 20 24 76 61 6c 75 65 20 5c   " \n\t $value \
1bf00 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  n]..          }.
1bf10 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
1bf20 20 20 7d 20 65 6c 73 65 69 66 20 7b 21 24 71 75    } elseif {!$qu
1bf30 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
1bf40 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1bf50 23 20 4e 4f 54 45 3a 20 54 68 65 20 61 63 74 75  # NOTE: The actu
1bf60 61 6c 20 68 61 6e 64 6c 65 20 63 6f 75 6e 74 73  al handle counts
1bf70 20 61 72 65 20 6e 6f 74 20 61 76 61 69 6c 61 62   are not availab
1bf80 6c 65 3b 20 74 68 65 72 65 66 6f 72 65 2c 20 6a  le; therefore, j
1bf90 75 73 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ust..        #  
1bfa0 20 20 20 20 20 72 65 74 75 72 6e 20 61 6e 20 65       return an e
1bfb0 6d 70 74 79 20 6c 69 73 74 2e 0d 0a 20 20 20 20  mpty list...    
1bfc0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 74      #..        t
1bfd0 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d  puts $channel "-
1bfe0 2d 2d 2d 20 63 72 69 74 69 63 61 6c 20 68 61 6e  --- critical han
1bff0 64 6c 65 20 63 6f 75 6e 74 73 20 75 6e 61 76 61  dle counts unava
1c000 69 6c 61 62 6c 65 5c 6e 22 0d 0a 20 20 20 20 20  ilable\n"..     
1c010 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75   }....      retu
1c020 72 6e 20 24 72 65 73 75 6c 74 0d 0a 20 20 20 20  rn $result..    
1c030 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 73  }.....    proc s
1c040 68 75 74 64 6f 77 6e 53 51 4c 69 74 65 20 7b 20  hutdownSQLite { 
1c050 63 68 61 6e 6e 65 6c 20 7b 66 6f 72 63 65 20 66  channel {force f
1c060 61 6c 73 65 7d 20 7b 71 75 69 65 74 20 66 61 6c  alse} {quiet fal
1c070 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23  se} } {..      #
1c080 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
1c090 4d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 53  Make sure that S
1c0a0 51 4c 69 74 65 20 63 6f 72 65 20 6c 69 62 72 61  QLite core libra
1c0b0 72 79 20 69 73 20 63 6f 6d 70 6c 65 74 65 6c 79  ry is completely
1c0c0 20 73 68 75 74 64 6f 77 6e 2e 20 20 54 68 69 73   shutdown.  This
1c0d0 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
1c0e0 69 73 20 75 73 65 64 20 62 79 20 74 65 73 74 73  is used by tests
1c0f0 20 74 68 61 74 20 63 68 61 6e 67 65 20 63 6f 6e   that change con
1c100 66 69 67 75 72 61 74 69 6f 6e 20 6f 70 74 69 6f  figuration optio
1c110 6e 73 20 61 6e 64 2f 6f 72 20 74 68 6f 73 65 0d  ns and/or those.
1c120 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74  .      #       t
1c130 68 61 74 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65  hat need to make
1c140 20 73 75 72 65 20 6c 6f 67 67 69 6e 67 20 69 73   sure logging is
1c150 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 28 69 2e   initialized (i.
1c160 65 2e 20 6a 75 73 74 20 69 6e 20 63 61 73 65 0d  e. just in case.
1c170 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74  .      #       t
1c180 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20 6c  he SQLite core l
1c190 69 62 72 61 72 79 20 77 61 73 20 69 6e 69 74 69  ibrary was initi
1c1a0 61 6c 69 7a 65 64 20 69 6e 20 74 68 65 20 70 72  alized in the pr
1c1b0 6f 63 65 73 73 20 70 72 69 6f 72 20 74 6f 0d 0a  ocess prior to..
1c1c0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68        #       th
1c1d0 65 20 53 51 4c 69 74 65 4c 6f 67 20 63 6c 61 73  e SQLiteLog clas
1c1e0 73 20 62 65 69 6e 67 20 61 62 6c 65 20 74 6f 20  s being able to 
1c1f0 73 65 74 75 70 20 69 74 73 20 6c 6f 67 67 69 6e  setup its loggin
1c200 67 20 63 61 6c 6c 62 61 63 6b 29 2e 0d 0a 20 20  g callback)...  
1c210 20 20 20 20 23 20 20 20 20 20 20 20 4e 6f 72 6d      #       Norm
1c220 61 6c 6c 79 2c 20 74 68 69 73 20 73 68 6f 75 6c  ally, this shoul
1c230 64 20 6f 6e 6c 79 20 62 65 20 70 65 72 66 6f 72  d only be perfor
1c240 6d 65 64 20 69 66 20 53 51 4c 69 74 65 20 69 73  med if SQLite is
1c250 20 6c 6f 61 64 65 64 20 61 6e 64 0d 0a 20 20 20   loaded and..   
1c260 20 20 20 23 20 20 20 20 20 20 20 72 65 61 64 79     #       ready
1c270 20 66 6f 72 20 75 73 65 20 62 79 20 74 68 65 20   for use by the 
1c280 74 65 73 74 20 73 75 69 74 65 2e 0d 0a 20 20 20  test suite...   
1c290 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
1c2a0 24 66 6f 72 63 65 20 7c 7c 20 5b 69 73 53 51 4c  $force || [isSQL
1c2b0 69 74 65 52 65 61 64 79 5d 7d 20 74 68 65 6e 20  iteReady]} then 
1c2c0 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
1c2d0 20 20 20 20 20 20 23 20 42 55 47 46 49 58 3a 20        # BUGFIX: 
1c2e0 4d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 61  Make sure that a
1c2f0 6e 79 20 22 6c 65 61 6b 65 64 22 20 74 72 61 6e  ny "leaked" tran
1c300 73 61 63 74 69 6f 6e 73 20 61 6e 64 2f 6f 72 20  sactions and/or 
1c310 63 6f 6e 6e 65 63 74 69 6f 6e 73 0d 0a 20 20 20  connections..   
1c320 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20 61       #         a
1c330 72 65 20 63 6c 65 61 6e 65 64 20 75 70 20 62 65  re cleaned up be
1c340 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74 68 65  fore calling the
1c350 20 6e 61 74 69 76 65 20 73 68 75 74 64 6f 77 6e   native shutdown
1c360 20 66 75 6e 63 74 69 6f 6e 2e 0d 0a 20 20 20 20   function...    
1c370 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 66      #..        f
1c380 6f 72 65 61 63 68 20 74 72 61 6e 73 61 63 74 69  oreach transacti
1c390 6f 6e 20 5b 69 6e 66 6f 20 74 72 61 6e 73 61 63  on [info transac
1c3a0 74 69 6f 6e 73 5d 20 7b 0d 0a 20 20 20 20 20 20  tions] {..      
1c3b0 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
1c3c0 6d 61 74 63 68 20 5c 0d 0a 20 20 20 20 20 20 20  match \..       
1c3d0 20 20 20 20 20 20 20 53 79 73 74 65 6d 23 44 61         System#Da
1c3e0 74 61 23 53 51 4c 69 74 65 23 53 51 4c 69 74 65  ta#SQLite#SQLite
1c3f0 54 72 61 6e 73 61 63 74 69 6f 6e 23 2a 20 24 74  Transaction#* $t
1c400 72 61 6e 73 61 63 74 69 6f 6e 5d 7d 20 74 68 65  ransaction]} the
1c410 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
1c420 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
1c430 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
1c440 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c   transaction rol
1c450 6c 62 61 63 6b 20 24 74 72 61 6e 73 61 63 74 69  lback $transacti
1c460 6f 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  on..            
1c470 7d 20 65 72 72 6f 72 5d 20 3d 3d 20 30 7d 20 74  } error] == 0} t
1c480 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1c490 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
1c4a0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1c4b0 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
1c4c0 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
1c4d0 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
1c4e0 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
1c4f0 2d 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 6c 65  - rolled back le
1c500 61 6b 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  aked transaction
1c510 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20   \"" \..        
1c520 20 20 20 20 20 20 20 20 20 20 20 20 24 74 72 61              $tra
1c530 6e 73 61 63 74 69 6f 6e 20 5c 22 5c 6e 5d 0d 0a  nsaction \"\n]..
1c540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
1c550 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65  .            } e
1c560 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
1c570 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
1c580 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1c590 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
1c5a0 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
1c5b0 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
1c5c0 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d              "===
1c5d0 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65  = WARNING: faile
1c5e0 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 6c 65  d to rollback le
1c5f0 61 6b 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  aked transaction
1c600 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20   \"" \..        
1c610 20 20 20 20 20 20 20 20 20 20 20 20 24 74 72 61              $tra
1c620 6e 73 61 63 74 69 6f 6e 20 22 5c 22 2c 20 65 72  nsaction "\", er
1c630 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72  ror: " \n\t $err
1c640 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  or \n]..        
1c650 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
1c660 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
1c670 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
1c680 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63  ..        foreac
1c690 68 20 64 62 20 5b 69 6e 66 6f 20 63 6f 6e 6e 65  h db [info conne
1c6a0 63 74 69 6f 6e 73 5d 20 7b 0d 0a 20 20 20 20 20  ctions] {..     
1c6b0 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
1c6c0 20 6d 61 74 63 68 20 5c 0d 0a 20 20 20 20 20 20   match \..      
1c6d0 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 23 44          System#D
1c6e0 61 74 61 23 53 51 4c 69 74 65 23 53 51 4c 69 74  ata#SQLite#SQLit
1c6f0 65 43 6f 6e 6e 65 63 74 69 6f 6e 23 2a 20 24 64  eConnection#* $d
1c700 62 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  b]} then {..    
1c710 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
1c720 63 68 20 7b 73 71 6c 20 63 6c 6f 73 65 20 24 64  ch {sql close $d
1c730 62 7d 20 65 72 72 6f 72 5d 20 3d 3d 20 30 7d 20  b} error] == 0} 
1c740 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1c750 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
1c760 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
1c770 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
1c780 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
1c790 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
1c7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
1c7b0 2d 2d 20 63 6c 6f 73 65 64 20 6c 65 61 6b 65 64  -- closed leaked
1c7c0 20 64 61 74 61 62 61 73 65 20 5c 22 22 20 24 64   database \"" $d
1c7d0 62 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  b \"\n]..       
1c7e0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1c7f0 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
1c800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
1c810 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
1c820 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
1c830 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
1c840 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
1c850 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1c860 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49       "==== WARNI
1c870 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 63 6c  NG: failed to cl
1c880 6f 73 65 20 6c 65 61 6b 65 64 20 64 61 74 61 62  ose leaked datab
1c890 61 73 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20  ase \"" \..     
1c8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24                 $
1c8b0 64 62 20 22 5c 22 2c 20 65 72 72 6f 72 3a 20 22  db "\", error: "
1c8c0 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d   \n\t $error \n]
1c8d0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1c8e0 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  }..            }
1c8f0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
1c900 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
1c910 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
1c920 20 42 55 47 46 49 58 3a 20 42 65 66 6f 72 65 20   BUGFIX: Before 
1c930 63 61 6c 6c 69 6e 67 20 74 68 65 20 6e 61 74 69  calling the nati
1c940 76 65 20 73 68 75 74 64 6f 77 6e 20 66 75 6e 63  ve shutdown func
1c950 74 69 6f 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20  tion, make sure 
1c960 62 6f 74 68 0d 0a 20 20 20 20 20 20 20 20 23 20  both..        # 
1c970 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 50          of the P
1c980 52 41 47 4d 41 20 72 65 6c 61 74 65 64 20 64 69  RAGMA related di
1c990 72 65 63 74 6f 72 79 20 6e 61 6d 65 73 20 61 72  rectory names ar
1c9a0 65 20 66 72 65 65 64 2e 0d 0a 20 20 20 20 20 20  e freed...      
1c9b0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 63 68 65    #..        che
1c9c0 63 6b 46 6f 72 53 51 4c 69 74 65 44 69 72 65 63  ckForSQLiteDirec
1c9d0 74 6f 72 69 65 73 20 24 63 68 61 6e 6e 65 6c 20  tories $channel 
1c9e0 74 72 75 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20  true....        
1c9f0 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20  if {[catch {..  
1ca00 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69          object i
1ca10 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f  nvoke -flags +No
1ca20 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20  nPublic \..     
1ca30 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e           System.
1ca40 44 61 74 61 2e 53 51 4c 69 74 65 2e 55 6e 73 61  Data.SQLite.Unsa
1ca50 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 20  feNativeMethods 
1ca60 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e  sqlite3_shutdown
1ca70 0d 0a 20 20 20 20 20 20 20 20 7d 20 72 65 73 75  ..        } resu
1ca80 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  lt] == 0} then {
1ca90 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
1caa0 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
1cab0 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
1cac0 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
1cad0 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
1cae0 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
1caf0 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f 73 68   call sqlite3_sh
1cb00 75 74 64 6f 77 6e 28 29 2e 2e 2e 20 6f 6b 3a 20  utdown()... ok: 
1cb10 22 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20  " $result \n].. 
1cb20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
1cb30 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
1cb40 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
1cb50 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
1cb60 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
1cb70 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
1cb80 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
1cb90 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 61 6c         "---- cal
1cba0 6c 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f  l sqlite3_shutdo
1cbb0 77 6e 28 29 2e 2e 2e 20 65 72 72 6f 72 3a 20 22  wn()... error: "
1cbc0 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e   \n\t $result \n
1cbd0 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ]..          }..
1cbe0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
1cbf0 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
1cc00 20 20 70 72 6f 63 20 72 65 70 6f 72 74 53 51 4c    proc reportSQL
1cc10 69 74 65 52 65 73 6f 75 72 63 65 73 20 7b 0d 0a  iteResources {..
1cc20 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61 6e              chan
1cc30 6e 65 6c 20 7b 71 75 69 65 74 20 66 61 6c 73 65  nel {quiet false
1cc40 7d 20 7b 72 65 73 65 74 20 74 72 75 65 7d 20 7b  } {reset true} {
1cc50 63 6f 6c 6c 65 63 74 20 74 72 75 65 7d 20 7d 20  collect true} } 
1cc60 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
1cc70 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 61 76 61    # NOTE: If ava
1cc80 69 6c 61 62 6c 65 2c 20 72 65 70 6f 72 74 20 6f  ilable, report o
1cc90 6e 20 28 61 6e 64 20 70 6f 73 73 69 62 6c 79 20  n (and possibly 
1cca0 72 65 73 65 74 29 20 74 68 65 20 72 75 6e 74 69  reset) the runti
1ccb0 6d 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  me..      #     
1ccc0 20 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20    configuration 
1ccd0 73 74 61 74 69 73 74 69 63 73 2e 0d 0a 20 20 20  statistics...   
1cce0 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
1ccf0 5b 68 61 76 65 53 51 4c 69 74 65 4f 62 6a 65 63  [haveSQLiteObjec
1cd00 74 43 6f 6d 6d 61 6e 64 5d 20 26 26 20 5c 0d 0a  tCommand] && \..
1cd10 20 20 20 20 20 20 20 20 20 20 5b 68 61 76 65 43            [haveC
1cd20 6f 6e 73 74 72 61 69 6e 74 20 62 75 69 6c 64 43  onstraint buildC
1cd30 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 44 65 62  onfiguration.Deb
1cd40 75 67 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ug]} then {..   
1cd50 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
1cd60 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a  {..          obj
1cd70 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67  ect invoke -flag
1cd80 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 2d 61 6c  s +NonPublic -al
1cd90 69 61 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ias \..         
1cda0 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61       System.Data
1cdb0 2e 53 51 4c 69 74 65 2e 44 65 62 75 67 44 61 74  .SQLite.DebugDat
1cdc0 61 20 73 65 74 74 69 6e 67 52 65 61 64 43 6f 75  a settingReadCou
1cdd0 6e 74 73 0d 0a 20 20 20 20 20 20 20 20 7d 20 73  nts..        } s
1cde0 65 74 74 69 6e 67 52 65 61 64 43 6f 75 6e 74 73  ettingReadCounts
1cdf0 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
1ce00 20 20 20 20 20 20 20 20 20 20 73 65 74 20 6e 61            set na
1ce10 6d 65 43 6f 75 6e 74 20 5b 24 73 65 74 74 69 6e  meCount [$settin
1ce20 67 52 65 61 64 43 6f 75 6e 74 73 20 43 6f 75 6e  gReadCounts Coun
1ce30 74 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65  t]..          se
1ce40 74 20 76 61 6c 75 65 43 6f 75 6e 74 20 30 0d 0a  t valueCount 0..
1ce50 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65  ..          obje
1ce60 63 74 20 66 6f 72 65 61 63 68 20 2d 61 6c 69 61  ct foreach -alia
1ce70 73 20 70 61 69 72 20 24 73 65 74 74 69 6e 67 52  s pair $settingR
1ce80 65 61 64 43 6f 75 6e 74 73 20 7b 0d 0a 20 20 20  eadCounts {..   
1ce90 20 20 20 20 20 20 20 20 20 69 6e 63 72 20 76 61           incr va
1cea0 6c 75 65 43 6f 75 6e 74 20 5b 24 70 61 69 72 20  lueCount [$pair 
1ceb0 56 61 6c 75 65 5d 0d 0a 0d 0a 20 20 20 20 20 20  Value]....      
1cec0 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
1ced0 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
1cee0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
1cef0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
1cf00 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
1cf10 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73           "---- s
1cf20 65 74 74 69 6e 67 20 5c 22 22 20 5b 24 70 61 69  etting \"" [$pai
1cf30 72 20 4b 65 79 5d 20 22 5c 22 20 77 61 73 20 72  r Key] "\" was r
1cf40 65 61 64 20 22 20 5c 0d 0a 20 20 20 20 20 20 20  ead " \..       
1cf50 20 20 20 20 20 20 20 20 20 20 20 5b 24 70 61 69             [$pai
1cf60 72 20 56 61 6c 75 65 5d 20 22 20 74 69 6d 65 73  r Value] " times
1cf70 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  \n"]..          
1cf80 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d    }..          }
1cf90 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66  ....          if
1cfa0 20 7b 24 72 65 73 65 74 7d 20 74 68 65 6e 20 7b   {$reset} then {
1cfb0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
1cfc0 20 7b 5b 63 61 74 63 68 20 7b 24 73 65 74 74 69   {[catch {$setti
1cfd0 6e 67 52 65 61 64 43 6f 75 6e 74 73 20 43 6c 65  ngReadCounts Cle
1cfe0 61 72 7d 20 65 72 72 6f 72 5d 20 3d 3d 20 30 7d  ar} error] == 0}
1cff0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1d000 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
1d010 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
1d020 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
1d030 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
1d040 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
1d050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
1d060 2d 2d 2d 20 72 65 73 65 74 20 73 65 74 74 69 6e  --- reset settin
1d070 67 20 73 74 61 74 69 73 74 69 63 73 20 66 6f 72  g statistics for
1d080 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 22 20   the previous " 
1d090 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1d0a0 20 20 20 20 20 20 20 24 6e 61 6d 65 43 6f 75 6e         $nameCoun
1d0b0 74 20 22 20 6e 61 6d 65 73 20 61 6e 64 20 22 20  t " names and " 
1d0c0 24 76 61 6c 75 65 43 6f 75 6e 74 20 22 20 76 61  $valueCount " va
1d0d0 6c 75 65 73 20 72 65 61 64 5c 6e 22 5d 0d 0a 20  lues read\n"].. 
1d0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
1d0f0 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c              } el
1d100 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
1d110 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
1d120 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
1d130 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1d140 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e      "==== WARNIN
1d150 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 72 65 73  G: failed to res
1d160 65 74 20 73 65 74 74 69 6e 67 20 73 74 61 74 69  et setting stati
1d170 73 74 69 63 73 20 66 6f 72 20 22 20 5c 0d 0a 20  stics for " \.. 
1d180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d190 20 22 74 68 65 20 70 72 65 76 69 6f 75 73 20 22   "the previous "
1d1a0 20 24 6e 61 6d 65 43 6f 75 6e 74 20 22 20 6e 61   $nameCount " na
1d1b0 6d 65 73 20 61 6e 64 20 22 20 24 76 61 6c 75 65  mes and " $value
1d1c0 43 6f 75 6e 74 20 5c 0d 0a 20 20 20 20 20 20 20  Count \..       
1d1d0 20 20 20 20 20 20 20 20 20 20 20 22 20 76 61 6c             " val
1d1e0 75 65 73 20 72 65 61 64 2c 20 65 72 72 6f 72 3a  ues read, error:
1d1f0 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c   " \n\t $error \
1d200 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  n]..            
1d210 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  }..          }..
1d220 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
1d230 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
1d240 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a  {..          obj
1d250 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67  ect invoke -flag
1d260 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 2d 61 6c  s +NonPublic -al
1d270 69 61 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ias \..         
1d280 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61       System.Data
1d290 2e 53 51 4c 69 74 65 2e 44 65 62 75 67 44 61 74  .SQLite.DebugDat
1d2a0 61 20 73 65 74 74 69 6e 67 46 69 6c 65 52 65 61  a settingFileRea
1d2b0 64 43 6f 75 6e 74 73 0d 0a 20 20 20 20 20 20 20  dCounts..       
1d2c0 20 7d 20 73 65 74 74 69 6e 67 46 69 6c 65 52 65   } settingFileRe
1d2d0 61 64 43 6f 75 6e 74 73 5d 20 3d 3d 20 30 7d 20  adCounts] == 0} 
1d2e0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1d2f0 20 20 73 65 74 20 6e 61 6d 65 43 6f 75 6e 74 20    set nameCount 
1d300 5b 24 73 65 74 74 69 6e 67 46 69 6c 65 52 65 61  [$settingFileRea
1d310 64 43 6f 75 6e 74 73 20 43 6f 75 6e 74 5d 0d 0a  dCounts Count]..
1d320 20 20 20 20 20 20 20 20 20 20 73 65 74 20 76 61            set va
1d330 6c 75 65 43 6f 75 6e 74 20 30 0d 0a 0d 0a 20 20  lueCount 0....  
1d340 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 66          object f
1d350 6f 72 65 61 63 68 20 2d 61 6c 69 61 73 20 70 61  oreach -alias pa
1d360 69 72 20 24 73 65 74 74 69 6e 67 46 69 6c 65 52  ir $settingFileR
1d370 65 61 64 43 6f 75 6e 74 73 20 7b 0d 0a 20 20 20  eadCounts {..   
1d380 20 20 20 20 20 20 20 20 20 69 6e 63 72 20 76 61           incr va
1d390 6c 75 65 43 6f 75 6e 74 20 5b 24 70 61 69 72 20  lueCount [$pair 
1d3a0 56 61 6c 75 65 5d 0d 0a 0d 0a 20 20 20 20 20 20  Value]....      
1d3b0 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
1d3c0 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
1d3d0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
1d3e0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
1d3f0 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
1d400 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73           "---- s
1d410 65 74 74 69 6e 67 20 5c 22 22 20 5b 24 70 61 69  etting \"" [$pai
1d420 72 20 4b 65 79 5d 20 22 5c 22 20 77 61 73 20 72  r Key] "\" was r
1d430 65 61 64 20 22 20 5c 0d 0a 20 20 20 20 20 20 20  ead " \..       
1d440 20 20 20 20 20 20 20 20 20 20 20 5b 24 70 61 69             [$pai
1d450 72 20 56 61 6c 75 65 5d 20 22 20 74 69 6d 65 73  r Value] " times
1d460 20 66 72 6f 6d 20 74 68 65 20 63 6f 6e 66 69 67   from the config
1d470 75 72 61 74 69 6f 6e 20 66 69 6c 65 5c 6e 22 5d  uration file\n"]
1d480 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
1d490 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  .          }....
1d4a0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 24 72            if {$r
1d4b0 65 73 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  eset} then {..  
1d4c0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63            if {[c
1d4d0 61 74 63 68 20 7b 24 73 65 74 74 69 6e 67 46 69  atch {$settingFi
1d4e0 6c 65 52 65 61 64 43 6f 75 6e 74 73 20 43 6c 65  leReadCounts Cle
1d4f0 61 72 7d 20 65 72 72 6f 72 5d 20 3d 3d 20 30 7d  ar} error] == 0}
1d500 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1d510 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
1d520 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
1d530 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
1d540 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
1d550 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
1d560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
1d570 2d 2d 2d 20 72 65 73 65 74 20 73 65 74 74 69 6e  --- reset settin
1d580 67 20 73 74 61 74 69 73 74 69 63 73 20 66 6f 72  g statistics for
1d590 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 22 20   the previous " 
1d5a0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1d5b0 20 20 20 20 20 20 20 24 6e 61 6d 65 43 6f 75 6e         $nameCoun
1d5c0 74 20 22 20 6e 61 6d 65 73 20 61 6e 64 20 22 20  t " names and " 
1d5d0 24 76 61 6c 75 65 43 6f 75 6e 74 20 22 20 76 61  $valueCount " va
1d5e0 6c 75 65 73 20 72 65 61 64 20 22 20 5c 0d 0a 20  lues read " \.. 
1d5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d600 20 20 20 22 66 72 6f 6d 20 74 68 65 20 63 6f 6e     "from the con
1d610 66 69 67 75 72 61 74 69 6f 6e 20 66 69 6c 65 5c  figuration file\
1d620 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n"]..           
1d630 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
1d640 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
1d650 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
1d660 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
1d670 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
1d680 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20            "==== 
1d690 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20  WARNING: failed 
1d6a0 74 6f 20 72 65 73 65 74 20 73 65 74 74 69 6e 67  to reset setting
1d6b0 20 73 74 61 74 69 73 74 69 63 73 20 66 6f 72 20   statistics for 
1d6c0 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
1d6d0 20 20 20 20 20 20 20 22 74 68 65 20 70 72 65 76         "the prev
1d6e0 69 6f 75 73 20 22 20 24 6e 61 6d 65 43 6f 75 6e  ious " $nameCoun
1d6f0 74 20 22 20 6e 61 6d 65 73 20 61 6e 64 20 22 20  t " names and " 
1d700 24 76 61 6c 75 65 43 6f 75 6e 74 20 5c 0d 0a 20  $valueCount \.. 
1d710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d720 20 22 20 76 61 6c 75 65 73 20 72 65 61 64 20 66   " values read f
1d730 72 6f 6d 20 74 68 65 20 63 6f 6e 66 69 67 75 72  rom the configur
1d740 61 74 69 6f 6e 20 66 69 6c 65 2c 20 65 72 72 6f  ation file, erro
1d750 72 3a 20 22 20 5c 6e 5c 74 20 5c 0d 0a 20 20 20  r: " \n\t \..   
1d760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24                 $
1d770 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20  error \n]..     
1d780 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1d790 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
1d7a0 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
1d7b0 20 20 20 69 66 20 7b 5b 68 61 76 65 53 51 4c 69     if {[haveSQLi
1d7c0 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d  teObjectCommand]
1d7d0 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
1d7e0 20 5b 68 61 76 65 53 51 4c 69 74 65 44 65 66 69   [haveSQLiteDefi
1d7f0 6e 65 43 6f 6e 73 74 61 6e 74 20 49 4e 54 45 52  neConstant INTER
1d800 4f 50 5f 56 49 52 54 55 41 4c 5f 54 41 42 4c 45  OP_VIRTUAL_TABLE
1d810 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
1d820 20 20 5b 68 61 76 65 53 51 4c 69 74 65 44 65 66    [haveSQLiteDef
1d830 69 6e 65 43 6f 6e 73 74 61 6e 74 20 54 52 41 43  ineConstant TRAC
1d840 4b 5f 4d 45 4d 4f 52 59 5f 42 59 54 45 53 5d 7d  K_MEMORY_BYTES]}
1d850 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1d860 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
1d870 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
1d880 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22  tputs $channel "
1d890 2d 2d 2d 2d 20 63 75 72 72 65 6e 74 20 6d 65 6d  ---- current mem
1d8a0 6f 72 79 20 69 6e 20 75 73 65 20 62 79 20 53 51  ory in use by SQ
1d8b0 4c 69 74 65 4d 65 6d 6f 72 79 2e 2e 2e 20 22 0d  LiteMemory... ".
1d8c0 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
1d8d0 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
1d8e0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62   {..          ob
1d8f0 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61  ject invoke -fla
1d900 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d  gs +NonPublic \.
1d910 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53  .              S
1d920 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
1d930 65 2e 53 51 4c 69 74 65 4d 65 6d 6f 72 79 20 62  e.SQLiteMemory b
1d940 79 74 65 73 41 6c 6c 6f 63 61 74 65 64 0d 0a 20  ytesAllocated.. 
1d950 20 20 20 20 20 20 20 7d 20 6d 65 6d 6f 72 79 5d         } memory]
1d960 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
1d970 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71           if {!$q
1d980 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
1d990 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
1d9a0 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
1d9b0 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 22 20 62  Args $memory " b
1d9c0 79 74 65 73 5c 6e 22 5d 0d 0a 20 20 20 20 20 20  ytes\n"]..      
1d9d0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
1d9e0 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
1d9f0 20 20 20 73 65 74 20 6d 65 6d 6f 72 79 20 75 6e     set memory un
1da00 6b 6e 6f 77 6e 0d 0a 0d 0a 20 20 20 20 20 20 20  known....       
1da10 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
1da20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1da30 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
1da40 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24  el [appendArgs $
1da50 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20 20  memory \n]..    
1da60 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
1da70 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66   }....        if
1da80 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
1da90 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75  {..          tpu
1daa0 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d  ts $channel "---
1dab0 2d 20 6d 61 78 69 6d 75 6d 20 6d 65 6d 6f 72 79  - maximum memory
1dac0 20 69 6e 20 75 73 65 20 62 79 20 53 51 4c 69 74   in use by SQLit
1dad0 65 4d 65 6d 6f 72 79 2e 2e 2e 20 22 0d 0a 20 20  eMemory... "..  
1dae0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
1daf0 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d     if {[catch {.
1db00 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63  .          objec
1db10 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20  t invoke -flags 
1db20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20  +NonPublic \..  
1db30 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74              Syst
1db40 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53  em.Data.SQLite.S
1db50 51 4c 69 74 65 4d 65 6d 6f 72 79 20 6d 61 78 69  QLiteMemory maxi
1db60 6d 75 6d 42 79 74 65 73 41 6c 6c 6f 63 61 74 65  mumBytesAllocate
1db70 64 0d 0a 20 20 20 20 20 20 20 20 7d 20 6d 65 6d  d..        } mem
1db80 6f 72 79 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ory] == 0} then 
1db90 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  {..          if 
1dba0 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
1dbb0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
1dbc0 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
1dbd0 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79  pendArgs $memory
1dbe0 20 22 20 62 79 74 65 73 5c 6e 22 5d 0d 0a 20 20   " bytes\n"]..  
1dbf0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
1dc00 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
1dc10 20 20 20 20 20 20 20 73 65 74 20 6d 65 6d 6f 72         set memor
1dc20 79 20 75 6e 6b 6e 6f 77 6e 0d 0a 0d 0a 20 20 20  y unknown....   
1dc30 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
1dc40 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
1dc50 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
1dc60 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
1dc70 67 73 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a  gs $memory \n]..
1dc80 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
1dc90 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
1dca0 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 24 71  ...      if {!$q
1dcb0 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
1dcc0 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
1dcd0 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 75 72 72 65  nnel "---- curre
1dce0 6e 74 20 6d 65 6d 6f 72 79 20 69 6e 20 75 73 65  nt memory in use
1dcf0 20 62 79 20 53 51 4c 69 74 65 2e 2e 2e 20 22 0d   by SQLite... ".
1dd00 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
1dd10 20 20 69 66 20 7b 5b 68 61 76 65 53 51 4c 69 74    if {[haveSQLit
1dd20 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d 7d  eObjectCommand]}
1dd30 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1dd40 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
1dd50 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20           object 
1dd60 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e  invoke -flags +N
1dd70 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20  onPublic \..    
1dd80 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d            System
1dd90 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 55 6e 73  .Data.SQLite.Uns
1dda0 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73  afeNativeMethods
1ddb0 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f   sqlite3_memory_
1ddc0 75 73 65 64 0d 0a 20 20 20 20 20 20 20 20 7d 20  used..        } 
1ddd0 6d 65 6d 6f 72 79 5d 20 3d 3d 20 30 7d 20 74 68  memory] == 0} th
1dde0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
1ddf0 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
1de00 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
1de10 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
1de20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d  [appendArgs $mem
1de30 6f 72 79 20 22 20 62 79 74 65 73 5c 6e 22 5d 0d  ory " bytes\n"].
1de40 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
1de50 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
1de60 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
1de70 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4d         # NOTE: M
1de80 61 79 62 65 20 74 68 65 20 53 51 4c 69 74 65 20  aybe the SQLite 
1de90 63 6f 72 65 20 6c 69 62 72 61 72 79 20 69 73 20  core library is 
1dea0 75 6e 61 76 61 69 6c 61 62 6c 65 3f 0d 0a 20 20  unavailable?..  
1deb0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1dec0 20 20 20 20 20 73 65 74 20 6d 65 6d 6f 72 79 20       set memory 
1ded0 75 6e 6b 6e 6f 77 6e 0d 0a 0d 0a 20 20 20 20 20  unknown....     
1dee0 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
1def0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1df00 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
1df10 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
1df20 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20   $memory \n]..  
1df30 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
1df40 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c     }..      } el
1df50 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65  se {..        se
1df60 74 20 6d 65 6d 6f 72 79 20 75 6e 61 76 61 69 6c  t memory unavail
1df70 61 62 6c 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20  able....        
1df80 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
1df90 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74  n {..          t
1dfa0 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
1dfb0 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72  ppendArgs $memor
1dfc0 79 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d  y \n]..        }
1dfd0 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
1dfe0 20 20 20 73 65 74 20 72 65 73 75 6c 74 20 24 6d     set result $m
1dff0 65 6d 6f 72 79 3b 20 23 20 4e 4f 54 45 3a 20 52  emory; # NOTE: R
1e000 65 74 75 72 6e 20 6d 65 6d 6f 72 79 20 69 6e 2d  eturn memory in-
1e010 75 73 65 20 74 6f 20 6f 75 72 20 63 61 6c 6c 65  use to our calle
1e020 72 2e 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b  r.....      if {
1e030 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
1e040 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
1e050 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 6d 61  channel "---- ma
1e060 78 69 6d 75 6d 20 6d 65 6d 6f 72 79 20 69 6e 20  ximum memory in 
1e070 75 73 65 20 62 79 20 53 51 4c 69 74 65 2e 2e 2e  use by SQLite...
1e080 20 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20   "..      }.... 
1e090 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65 53 51       if {[haveSQ
1e0a0 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e  LiteObjectComman
1e0b0 64 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  d]} then {..    
1e0c0 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
1e0d0 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65  ..          obje
1e0e0 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73  ct invoke -flags
1e0f0 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20   +NonPublic \.. 
1e100 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73               Sys
1e110 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
1e120 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68  UnsafeNativeMeth
1e130 6f 64 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ods \..         
1e140 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 65 6d       sqlite3_mem
1e150 6f 72 79 5f 68 69 67 68 77 61 74 65 72 20 30 0d  ory_highwater 0.
1e160 0a 20 20 20 20 20 20 20 20 7d 20 6d 65 6d 6f 72  .        } memor
1e170 79 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  y] == 0} then {.
1e180 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21  .          if {!
1e190 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
1e1a0 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
1e1b0 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
1e1c0 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 22  ndArgs $memory "
1e1d0 20 62 79 74 65 73 5c 6e 22 5d 0d 0a 20 20 20 20   bytes\n"]..    
1e1e0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
1e1f0 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
1e200 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1e210 20 20 23 20 4e 4f 54 45 3a 20 4d 61 79 62 65 20    # NOTE: Maybe 
1e220 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20  the SQLite core 
1e230 6c 69 62 72 61 72 79 20 69 73 20 75 6e 61 76 61  library is unava
1e240 69 6c 61 62 6c 65 3f 0d 0a 20 20 20 20 20 20 20  ilable?..       
1e250 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
1e260 73 65 74 20 6d 65 6d 6f 72 79 20 75 6e 6b 6e 6f  set memory unkno
1e270 77 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  wn....          
1e280 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
1e290 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
1e2a0 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
1e2b0 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d  [appendArgs $mem
1e2c0 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ory \n]..       
1e2d0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
1e2e0 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
1e2f0 0a 20 20 20 20 20 20 20 20 73 65 74 20 6d 65 6d  .        set mem
1e300 6f 72 79 20 75 6e 61 76 61 69 6c 61 62 6c 65 0d  ory unavailable.
1e310 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21  ...        if {!
1e320 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
1e330 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
1e340 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
1e350 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d  Args $memory \n]
1e360 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
1e370 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66     }....      if
1e380 20 7b 24 63 6f 6c 6c 65 63 74 7d 20 74 68 65 6e   {$collect} then
1e390 20 7b 0d 0a 20 20 20 20 20 20 20 20 63 6f 6c 6c   {..        coll
1e3a0 65 63 74 47 61 72 62 61 67 65 20 24 63 68 61 6e  ectGarbage $chan
1e3b0 6e 65 6c 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  nel..      }....
1e3c0 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
1e3d0 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
1e3e0 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
1e3f0 6c 20 22 2d 2d 2d 2d 20 63 75 72 72 65 6e 74 20  l "---- current 
1e400 6d 65 6d 6f 72 79 20 69 6e 20 75 73 65 20 62 79  memory in use by
1e410 20 74 68 65 20 43 4c 52 2e 2e 2e 20 22 0d 0a 20   the CLR... ".. 
1e420 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
1e430 69 66 20 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f  if {[haveSQLiteO
1e440 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74  bjectCommand]} t
1e450 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69  hen {..        i
1e460 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  f {[catch {..   
1e470 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e         object in
1e480 76 6f 6b 65 20 47 43 20 47 65 74 54 6f 74 61 6c  voke GC GetTotal
1e490 4d 65 6d 6f 72 79 20 66 61 6c 73 65 0d 0a 20 20  Memory false..  
1e4a0 20 20 20 20 20 20 7d 20 6d 65 6d 6f 72 79 5d 20        } memory] 
1e4b0 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
1e4c0 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72          if {[str
1e4d0 69 6e 67 20 69 73 20 69 6e 74 65 67 65 72 20 2d  ing is integer -
1e4e0 73 74 72 69 63 74 20 24 6d 65 6d 6f 72 79 5d 7d  strict $memory]}
1e4f0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1e500 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
1e510 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1e520 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
1e530 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
1e540 67 73 20 24 6d 65 6d 6f 72 79 20 22 20 62 79 74  gs $memory " byt
1e550 65 73 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20  es\n"]..        
1e560 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
1e570 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
1e580 20 20 20 20 20 20 20 73 65 74 20 6d 65 6d 6f 72         set memor
1e590 79 20 69 6e 76 61 6c 69 64 0d 0a 0d 0a 20 20 20  y invalid....   
1e5a0 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71           if {!$q
1e5b0 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
1e5c0 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
1e5d0 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
1e5e0 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 5c  ndArgs $memory \
1e5f0 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  n]..            
1e600 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  }..          }..
1e610 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
1e620 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
1e630 6d 65 6d 6f 72 79 20 75 6e 6b 6e 6f 77 6e 0d 0a  memory unknown..
1e640 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
1e650 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
1e660 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
1e670 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
1e680 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20  endArgs $memory 
1e690 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  \n]..          }
1e6a0 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
1e6b0 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
1e6c0 20 20 20 20 20 73 65 74 20 6d 65 6d 6f 72 79 20       set memory 
1e6d0 75 6e 61 76 61 69 6c 61 62 6c 65 0d 0a 0d 0a 20  unavailable.... 
1e6e0 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
1e6f0 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
1e700 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
1e710 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
1e720 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20   $memory \n]..  
1e730 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
1e740 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ....      return
1e750 20 24 72 65 73 75 6c 74 0d 0a 20 20 20 20 7d 0d   $result..    }.
1e760 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 68 65  ....    proc che
1e770 63 6b 46 6f 72 53 51 4c 69 74 65 44 69 72 65 63  ckForSQLiteDirec
1e780 74 6f 72 69 65 73 20 7b 20 63 68 61 6e 6e 65 6c  tories { channel
1e790 20 7b 72 65 73 65 74 20 66 61 6c 73 65 7d 20 7d   {reset false} }
1e7a0 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
1e7b0 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b     # NOTE: Check
1e7c0 20 69 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f   if the sqlite3_
1e7d0 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74  win32_set_direct
1e7e0 6f 72 79 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  ory function is 
1e7f0 61 76 61 69 6c 61 62 6c 65 2e 0d 0a 20 20 20 20  available...    
1e800 20 20 23 0d 0a 20 20 20 20 20 20 74 70 75 74 73    #..      tputs
1e810 20 24 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20   $channel \..   
1e820 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65         "---- che
1e830 63 6b 69 6e 67 20 66 6f 72 20 66 75 6e 63 74 69  cking for functi
1e840 6f 6e 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32  on sqlite3_win32
1e850 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79 2e 2e  _set_directory..
1e860 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a  . "....      #..
1e870 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68        # NOTE: Th
1e880 69 73 20 63 61 6c 6c 20 74 6f 20 74 68 65 20 73  is call to the s
1e890 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74  qlite3_win32_set
1e8a0 5f 64 69 72 65 63 74 6f 72 79 20 66 75 6e 63 74  _directory funct
1e8b0 69 6f 6e 20 75 73 65 73 20 74 68 65 0d 0a 20 20  ion uses the..  
1e8c0 20 20 20 20 23 20 20 20 20 20 20 20 69 6e 76 61      #       inva
1e8d0 6c 69 64 20 76 61 6c 75 65 20 30 20 66 6f 72 20  lid value 0 for 
1e8e0 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
1e8f0 6e 74 2e 20 20 54 68 69 73 20 63 6f 64 65 20 69  nt.  This code i
1e900 73 20 64 65 73 69 67 6e 65 64 0d 0a 20 20 20 20  s designed..    
1e910 20 20 23 20 20 20 20 20 20 20 74 6f 20 63 68 65    #       to che
1e920 63 6b 20 69 66 20 63 61 6c 6c 69 6e 67 20 74 68  ck if calling th
1e930 65 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20  e function will 
1e940 72 61 69 73 65 20 61 6e 20 65 78 63 65 70 74 69  raise an excepti
1e950 6f 6e 20 28 69 2e 65 2e 0d 0a 20 20 20 20 20 20  on (i.e...      
1e960 23 20 20 20 20 20 20 20 74 68 65 20 61 63 74 75  #       the actu
1e970 61 6c 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65  al result of the
1e980 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e   function does n
1e990 6f 74 20 6d 61 74 74 65 72 20 61 73 20 6c 6f 6e  ot matter as lon
1e9a0 67 20 61 73 20 6e 6f 0d 0a 20 20 20 20 20 20 23  g as no..      #
1e9b0 20 20 20 20 20 20 20 64 69 72 65 63 74 6f 72 79         directory
1e9c0 20 69 73 20 63 68 61 6e 67 65 64 29 2e 0d 0a 20   is changed)... 
1e9d0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
1e9e0 20 7b 5b 69 73 57 69 6e 64 6f 77 73 5d 20 26 26   {[isWindows] &&
1e9f0 20 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20   [catch {..     
1ea00 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65     object invoke
1ea10 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c   -flags +NonPubl
1ea20 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ic \..          
1ea30 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51    System.Data.SQ
1ea40 4c 69 74 65 2e 55 6e 73 61 66 65 4e 61 74 69 76  Lite.UnsafeNativ
1ea50 65 4d 65 74 68 6f 64 73 20 5c 0d 0a 20 20 20 20  eMethods \..    
1ea60 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
1ea70 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74  win32_set_direct
1ea80 6f 72 79 20 30 20 6e 75 6c 6c 0d 0a 20 20 20 20  ory 0 null..    
1ea90 20 20 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20    }] == 0} then 
1eaa0 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
1eab0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 61        # NOTE: Ca
1eac0 6c 6c 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65  lling the sqlite
1ead0 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65  3_win32_set_dire
1eae0 63 74 6f 72 79 20 66 75 6e 63 74 69 6f 6e 20 64  ctory function d
1eaf0 6f 65 73 20 6e 6f 74 0d 0a 20 20 20 20 20 20 20  oes not..       
1eb00 20 23 20 20 20 20 20 20 20 63 61 75 73 65 20 61   #       cause a
1eb10 6e 20 65 78 63 65 70 74 69 6f 6e 3b 20 74 68 65  n exception; the
1eb20 72 65 66 6f 72 65 2c 20 69 74 20 6d 75 73 74 20  refore, it must 
1eb30 62 65 20 61 76 61 69 6c 61 62 6c 65 20 28 69 2e  be available (i.
1eb40 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  e...        #   
1eb50 20 20 20 20 65 76 65 6e 20 74 68 6f 75 67 68 20      even though 
1eb60 69 74 20 73 68 6f 75 6c 64 20 72 65 74 75 72 6e  it should return
1eb70 20 61 20 66 61 69 6c 75 72 65 20 72 65 74 75 72   a failure retur
1eb80 6e 20 63 6f 64 65 20 69 6e 20 74 68 69 73 0d 0a  n code in this..
1eb90 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
1eba0 63 61 73 65 29 2e 0d 0a 20 20 20 20 20 20 20 20  case)...        
1ebb0 23 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f  #..        addCo
1ebc0 6e 73 74 72 61 69 6e 74 20 73 71 6c 69 74 65 33  nstraint sqlite3
1ebd0 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63  _win32_set_direc
1ebe0 74 6f 72 79 0d 0a 0d 0a 20 20 20 20 20 20 20 20  tory....        
1ebf0 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 79  tputs $channel y
1ec00 65 73 5c 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20  es\n....        
1ec10 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
1ec20 45 3a 20 44 6f 65 73 20 6f 75 72 20 63 61 6c 6c  E: Does our call
1ec30 65 72 20 77 61 6e 74 20 74 6f 20 72 65 73 65 74  er want to reset
1ec40 20 74 68 65 20 64 69 72 65 63 74 6f 72 69 65 73   the directories
1ec50 3f 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ?..        #..  
1ec60 20 20 20 20 20 20 69 66 20 7b 24 72 65 73 65 74        if {$reset
1ec70 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1ec80 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
1ec90 20 23 20 4e 4f 54 45 3a 20 4e 6f 77 20 6d 61 6b   # NOTE: Now mak
1eca0 65 20 73 75 72 65 20 74 68 65 20 64 61 74 61 62  e sure the datab
1ecb0 61 73 65 20 61 6e 64 20 74 65 6d 70 6f 72 61 72  ase and temporar
1ecc0 79 20 64 69 72 65 63 74 6f 72 69 65 73 20 61 72  y directories ar
1ecd0 65 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20  e..          #  
1ece0 20 20 20 20 20 72 65 73 65 74 20 74 68 65 69 72       reset their
1ecf0 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 73 2c   default values,
1ed00 20 77 68 69 63 68 20 73 68 6f 75 6c 64 20 62 65   which should be
1ed10 20 6e 75 6c 6c 20 66 6f 72 20 62 6f 74 68 2e 0d   null for both..
1ed20 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20  .          #    
1ed30 20 20 20 53 69 6e 63 65 20 74 68 65 20 73 71 6c     Since the sql
1ed40 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64  ite3_win32_set_d
1ed50 69 72 65 63 74 6f 72 79 20 66 75 6e 63 74 69 6f  irectory functio
1ed60 6e 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 0d  n is available,.
1ed70 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20  .          #    
1ed80 20 20 20 75 73 65 20 69 74 2e 0d 0a 20 20 20 20     use it...    
1ed90 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1eda0 20 20 20 66 6f 72 20 7b 73 65 74 20 69 6e 64 65     for {set inde
1edb0 78 20 31 7d 20 7b 24 69 6e 64 65 78 20 3c 20 33  x 1} {$index < 3
1edc0 7d 20 7b 69 6e 63 72 20 69 6e 64 65 78 7d 20 7b  } {incr index} {
1edd0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
1ede0 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
1edf0 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74            object
1ee00 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b   invoke -flags +
1ee10 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20  NonPublic \..   
1ee20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
1ee30 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
1ee40 65 2e 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65  e.UnsafeNativeMe
1ee50 74 68 6f 64 73 20 5c 0d 0a 20 20 20 20 20 20 20  thods \..       
1ee60 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
1ee70 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72  e3_win32_set_dir
1ee80 65 63 74 6f 72 79 20 24 69 6e 64 65 78 20 6e 75  ectory $index nu
1ee90 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ll..            
1eea0 7d 20 72 65 73 75 6c 74 5d 20 3d 3d 20 30 7d 20  } result] == 0} 
1eeb0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1eec0 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
1eed0 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
1eee0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1eef0 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 61 6c 6c        "---- call
1ef00 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73   sqlite3_win32_s
1ef10 65 74 5f 64 69 72 65 63 74 6f 72 79 28 22 20 24  et_directory(" $
1ef20 69 6e 64 65 78 20 5c 0d 0a 20 20 20 20 20 20 20  index \..       
1ef30 20 20 20 20 20 20 20 20 20 20 20 22 2c 20 6e 75             ", nu
1ef40 6c 6c 29 2e 2e 2e 20 6f 6b 3a 20 22 20 24 72 65  ll)... ok: " $re
1ef50 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  sult \n]..      
1ef60 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
1ef70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70                tp
1ef80 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
1ef90 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
1efa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
1efb0 2d 2d 2d 20 63 61 6c 6c 20 73 71 6c 69 74 65 33  --- call sqlite3
1efc0 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63  _win32_set_direc
1efd0 74 6f 72 79 28 22 20 24 69 6e 64 65 78 20 5c 0d  tory(" $index \.
1efe0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1eff0 20 20 20 22 2c 20 6e 75 6c 6c 29 2e 2e 2e 20 65     ", null)... e
1f000 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 72 65  rror: " \n\t $re
1f010 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  sult \n]..      
1f020 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
1f030 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
1f040 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
1f050 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
1f060 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 0d 0a  channel no\n....
1f070 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1f080 20 20 20 23 20 4e 4f 54 45 3a 20 44 6f 65 73 20     # NOTE: Does 
1f090 6f 75 72 20 63 61 6c 6c 65 72 20 77 61 6e 74 20  our caller want 
1f0a0 74 6f 20 72 65 73 65 74 20 74 68 65 20 64 69 72  to reset the dir
1f0b0 65 63 74 6f 72 69 65 73 3f 20 20 54 68 69 73 20  ectories?  This 
1f0c0 63 61 6e 20 6f 6e 6c 79 0d 0a 20 20 20 20 20 20  can only..      
1f0d0 20 20 23 20 20 20 20 20 20 20 62 65 20 70 65 72    #       be per
1f0e0 66 6f 72 6d 65 64 20 69 66 20 53 51 4c 69 74 65  formed if SQLite
1f0f0 20 69 73 20 6c 6f 61 64 65 64 20 61 6e 64 20 72   is loaded and r
1f100 65 61 64 79 20 66 6f 72 20 75 73 65 20 62 79 20  eady for use by 
1f110 74 68 65 20 74 65 73 74 0d 0a 20 20 20 20 20 20  the test..      
1f120 20 20 23 20 20 20 20 20 20 20 73 75 69 74 65 2e    #       suite.
1f130 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1f140 20 20 20 20 20 69 66 20 7b 24 72 65 73 65 74 20       if {$reset 
1f150 26 26 20 5b 69 73 53 51 4c 69 74 65 52 65 61 64  && [isSQLiteRead
1f160 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  y]} then {..    
1f170 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1f180 20 20 20 23 20 4e 4f 54 45 3a 20 4e 6f 77 20 6d     # NOTE: Now m
1f190 61 6b 65 20 73 75 72 65 20 74 68 65 20 64 61 74  ake sure the dat
1f1a0 61 62 61 73 65 20 61 6e 64 20 74 65 6d 70 6f 72  abase and tempor
1f1b0 61 72 79 20 64 69 72 65 63 74 6f 72 69 65 73 20  ary directories 
1f1c0 61 72 65 0d 0a 20 20 20 20 20 20 20 20 20 20 23  are..          #
1f1d0 20 20 20 20 20 20 20 72 65 73 65 74 20 74 68 65         reset the
1f1e0 69 72 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  ir default value
1f1f0 73 2c 20 77 68 69 63 68 20 73 68 6f 75 6c 64 20  s, which should 
1f200 62 65 20 6e 75 6c 6c 20 66 6f 72 20 62 6f 74 68  be null for both
1f210 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20  ...          #  
1f220 20 20 20 20 20 53 69 6e 63 65 20 74 68 65 20 73       Since the s
1f230 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74  qlite3_win32_set
1f240 5f 64 69 72 65 63 74 6f 72 79 20 66 75 6e 63 74  _directory funct
1f250 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 0d 0a 20 20  ion does not..  
1f260 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
1f270 61 70 70 65 61 72 20 74 6f 20 62 65 20 61 76 61  appear to be ava
1f280 69 6c 61 62 6c 65 2c 20 75 73 65 20 74 68 65 20  ilable, use the 
1f290 61 73 73 6f 63 69 61 74 65 64 20 50 52 41 47 4d  associated PRAGM
1f2a0 41 20 63 6f 6d 6d 61 6e 64 73 0d 0a 20 20 20 20  A commands..    
1f2b0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69 6e        #       in
1f2c0 73 74 65 61 64 2e 0d 0a 20 20 20 20 20 20 20 20  stead...        
1f2d0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 66    #..          f
1f2e0 6f 72 65 61 63 68 20 64 69 72 65 63 74 6f 72 79  oreach directory
1f2f0 20 5b 6c 69 73 74 20 64 61 74 61 5f 73 74 6f 72   [list data_stor
1f300 65 5f 64 69 72 65 63 74 6f 72 79 20 74 65 6d 70  e_directory temp
1f310 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79  _store_directory
1f320 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ] {..           
1f330 20 73 65 74 20 73 71 6c 20 5b 61 70 70 65 6e 64   set sql [append
1f340 41 72 67 73 20 22 50 52 41 47 4d 41 20 22 20 24  Args "PRAGMA " $
1f350 64 69 72 65 63 74 6f 72 79 20 22 20 3d 20 5c 22  directory " = \"
1f360 5c 22 3b 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  \";"]....       
1f370 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
1f380 7b 65 78 65 63 75 74 65 53 71 6c 20 24 73 71 6c  {executeSql $sql
1f390 7d 20 72 65 73 75 6c 74 5d 20 3d 3d 20 30 7d 20  } result] == 0} 
1f3a0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1f3b0 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
1f3c0 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
1f3d0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1f3e0 20 20 20 20 20 20 22 2d 2d 2d 2d 20 65 78 65 63        "---- exec
1f3f0 75 74 65 20 50 52 41 47 4d 41 20 22 20 24 64 69  ute PRAGMA " $di
1f400 72 65 63 74 6f 72 79 20 22 2e 2e 2e 20 6f 6b 3a  rectory "... ok:
1f410 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20   \"" \..        
1f420 20 20 20 20 20 20 20 20 20 20 24 72 65 73 75 6c            $resul
1f430 74 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  t \"\n]..       
1f440 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
1f450 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
1f460 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
1f470 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
1f480 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
1f490 2d 2d 20 65 78 65 63 75 74 65 20 50 52 41 47 4d  -- execute PRAGM
1f4a0 41 20 22 20 24 64 69 72 65 63 74 6f 72 79 20 22  A " $directory "
1f4b0 2e 2e 2e 20 65 72 72 6f 72 3a 20 22 20 5c 0d 0a  ... error: " \..
1f4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f4d0 20 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c    \n\t $result \
1f4e0 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  n]..            
1f4f0 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  }..          }..
1f500 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
1f510 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   }....      #.. 
1f520 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69 6e       # NOTE: Fin
1f530 61 6c 6c 79 2c 20 73 68 6f 77 20 74 68 65 20 63  ally, show the c
1f540 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20  urrent value of 
1f550 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64  the database and
1f560 20 74 65 6d 70 6f 72 61 72 79 0d 0a 20 20 20 20   temporary..    
1f570 20 20 23 20 20 20 20 20 20 20 64 69 72 65 63 74    #       direct
1f580 6f 72 69 65 73 2e 20 20 54 68 69 73 20 63 61 6e  ories.  This can
1f590 20 6f 6e 6c 79 20 62 65 20 70 65 72 66 6f 72 6d   only be perform
1f5a0 65 64 20 69 66 20 53 51 4c 69 74 65 20 69 73 20  ed if SQLite is 
1f5b0 6c 6f 61 64 65 64 0d 0a 20 20 20 20 20 20 23 20  loaded..      # 
1f5c0 20 20 20 20 20 20 61 6e 64 20 72 65 61 64 79 20        and ready 
1f5d0 66 6f 72 20 75 73 65 20 62 79 20 74 68 65 20 74  for use by the t
1f5e0 65 73 74 20 73 75 69 74 65 2e 0d 0a 20 20 20 20  est suite...    
1f5f0 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
1f600 69 73 53 51 4c 69 74 65 52 65 61 64 79 5d 7d 20  isSQLiteReady]} 
1f610 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1f620 66 6f 72 65 61 63 68 20 64 69 72 65 63 74 6f 72  foreach director
1f630 79 20 5b 6c 69 73 74 20 64 61 74 61 5f 73 74 6f  y [list data_sto
1f640 72 65 5f 64 69 72 65 63 74 6f 72 79 20 74 65 6d  re_directory tem
1f650 70 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72  p_store_director
1f660 79 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  y] {..          
1f670 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
1f680 61 70 70 65 6e 64 41 72 67 73 20 22 2d 2d 2d 2d  appendArgs "----
1f690 20 63 68 65 63 6b 69 6e 67 20 22 20 24 64 69 72   checking " $dir
1f6a0 65 63 74 6f 72 79 20 22 2e 2e 2e 20 22 5d 0d 0a  ectory "... "]..
1f6b0 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
1f6c0 73 71 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  sql [appendArgs 
1f6d0 22 50 52 41 47 4d 41 20 22 20 24 64 69 72 65 63  "PRAGMA " $direc
1f6e0 74 6f 72 79 20 5c 3b 5d 0d 0a 0d 0a 20 20 20 20  tory \;]....    
1f6f0 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
1f700 20 7b 65 78 65 63 75 74 65 53 71 6c 20 24 73 71   {executeSql $sq
1f710 6c 20 73 63 61 6c 61 72 7d 20 72 65 73 75 6c 74  l scalar} result
1f720 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
1f730 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
1f740 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
1f750 6e 64 41 72 67 73 20 22 6f 6b 3a 20 5c 22 22 20  ndArgs "ok: \"" 
1f760 24 72 65 73 75 6c 74 20 5c 22 5c 6e 5d 0d 0a 20  $result \"\n].. 
1f770 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20           } else 
1f780 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
1f790 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
1f7a0 70 70 65 6e 64 41 72 67 73 20 22 65 72 72 6f 72  ppendArgs "error
1f7b0 3a 20 22 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74  : " \n\t $result
1f7c0 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \n]..          
1f7d0 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  }..        }..  
1f7e0 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
1f7f0 0a 20 20 20 20 70 72 6f 63 20 6c 6f 61 64 53 51  .    proc loadSQ
1f800 4c 69 74 65 54 65 73 74 53 65 74 74 69 6e 67 73  LiteTestSettings
1f810 20 7b 20 63 68 61 6e 6e 65 6c 20 7b 73 75 66 66   { channel {suff
1f820 69 78 20 22 22 7d 20 7b 71 75 69 65 74 20 66 61  ix ""} {quiet fa
1f830 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20  lse} } {..      
1f840 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
1f850 20 53 6b 69 70 20 6c 6f 61 64 69 6e 67 20 74 68   Skip loading th
1f860 65 20 73 65 74 74 69 6e 67 73 20 69 66 20 74 68  e settings if th
1f870 65 69 72 20 75 73 61 67 65 20 68 61 73 20 62 65  eir usage has be
1f880 65 6e 20 64 69 73 61 62 6c 65 64 2e 0d 0a 20 20  en disabled...  
1f890 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
1f8a0 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
1f8b0 3a 6e 6f 28 73 71 6c 69 74 65 54 65 73 74 53 65  :no(sqliteTestSe
1f8c0 74 74 69 6e 67 73 29 5d 7d 20 74 68 65 6e 20 7b  ttings)]} then {
1f8d0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1f8e0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4c 6f 61       # NOTE: Loa
1f8f0 64 20 63 75 73 74 6f 6d 20 70 65 72 2d 75 73 65  d custom per-use
1f900 72 20 61 6e 64 2f 6f 72 20 70 65 72 2d 68 6f 73  r and/or per-hos
1f910 74 20 74 65 73 74 20 73 65 74 74 69 6e 67 73 20  t test settings 
1f920 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  now...        #.
1f930 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69 6e  .        if {[in
1f940 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 63 6c 5f  fo exists ::tcl_
1f950 70 6c 61 74 66 6f 72 6d 28 75 73 65 72 29 5d 7d  platform(user)]}
1f960 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1f970 20 20 20 73 65 74 20 75 73 65 72 53 65 74 74 69     set userSetti
1f980 6e 67 73 46 69 6c 65 4e 61 6d 65 20 5b 66 69 6c  ngsFileName [fil
1f990 65 20 6a 6f 69 6e 20 5b 67 65 74 43 6f 6d 6d 6f  e join [getCommo
1f9a0 6e 44 69 72 65 63 74 6f 72 79 5d 20 5c 0d 0a 20  nDirectory] \.. 
1f9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 61 70               [ap
1f9c0 70 65 6e 64 41 72 67 73 20 73 65 74 74 69 6e 67  pendArgs setting
1f9d0 73 20 24 73 75 66 66 69 78 20 2e 20 24 3a 3a 74  s $suffix . $::t
1f9e0 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 75 73 65 72  cl_platform(user
1f9f0 29 20 2e 65 61 67 6c 65 5d 5d 0d 0a 0d 0a 20 20  ) .eagle]]....  
1fa00 20 20 20 20 20 20 20 20 69 66 20 7b 5b 66 69 6c          if {[fil
1fa10 65 20 65 78 69 73 74 73 20 24 75 73 65 72 53 65  e exists $userSe
1fa20 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 5d 7d  ttingsFileName]}
1fa30 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1fa40 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
1fa50 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1fa60 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
1fa70 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
1fa80 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
1fa90 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6c 6f          "---- lo
1faa0 61 64 69 6e 67 20 70 65 72 2d 75 73 65 72 20 74  ading per-user t
1fab0 65 73 74 20 73 65 74 74 69 6e 67 73 20 66 69 6c  est settings fil
1fac0 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20  e \"" \..       
1fad0 20 20 20 20 20 20 20 20 20 20 20 24 75 73 65 72             $user
1fae0 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65  SettingsFileName
1faf0 20 5c 22 2e 2e 2e 5c 6e 5d 0d 0a 20 20 20 20 20   \"...\n]..     
1fb00 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
1fb10 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
1fb20 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
1fb30 20 20 20 20 75 70 6c 65 76 65 6c 20 31 20 5b 6c      uplevel 1 [l
1fb40 69 73 74 20 73 6f 75 72 63 65 20 24 75 73 65 72  ist source $user
1fb50 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65  SettingsFileName
1fb60 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ]..            }
1fb70 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d   error]} then {.
1fb80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
1fb90 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
1fba0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1fbb0 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
1fbc0 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
1fbd0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1fbe0 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e        "==== WARN
1fbf0 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 6c  ING: failed to l
1fc00 6f 61 64 20 70 65 72 2d 75 73 65 72 20 73 65 74  oad per-user set
1fc10 74 69 6e 67 73 20 66 69 6c 65 20 5c 22 22 20 5c  tings file \"" \
1fc20 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1fc30 20 20 20 20 20 20 24 75 73 65 72 53 65 74 74 69        $userSetti
1fc40 6e 67 73 46 69 6c 65 4e 61 6d 65 20 22 5c 22 2c  ngsFileName "\",
1fc50 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24   error: " \n\t $
1fc60 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20  error \n]..     
1fc70 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
1fc80 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
1fc90 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
1fca0 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
1fcb0 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
1fcc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70                tp
1fcd0 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
1fce0 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
1fcf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
1fd00 2d 2d 2d 20 73 6b 69 70 70 65 64 20 6c 6f 61 64  --- skipped load
1fd10 69 6e 67 20 70 65 72 2d 75 73 65 72 20 74 65 73  ing per-user tes
1fd20 74 20 73 65 74 74 69 6e 67 73 20 66 69 6c 65 20  t settings file 
1fd30 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  \"" \..         
1fd40 20 20 20 20 20 20 20 20 20 24 75 73 65 72 53 65           $userSe
1fd50 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 20 22  ttingsFileName "
1fd60 5c 22 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20  \", it does not 
1fd70 65 78 69 73 74 5c 6e 22 5d 0d 0a 20 20 20 20 20  exist\n"]..     
1fd80 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1fd90 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
1fda0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 23 23 23  ....        ####
1fdb0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1fdc0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1fdd0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1fde0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1fdf0 23 23 23 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69  ###....        i
1fe00 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
1fe10 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 68  ::tcl_platform(h
1fe20 6f 73 74 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  ost)]} then {.. 
1fe30 20 20 20 20 20 20 20 20 20 73 65 74 20 68 6f 73           set hos
1fe40 74 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d  tSettingsFileNam
1fe50 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65  e [file join [ge
1fe60 74 43 6f 6d 6d 6f 6e 44 69 72 65 63 74 6f 72 79  tCommonDirectory
1fe70 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ] \..           
1fe80 20 20 20 5b 61 70 70 65 6e 64 41 72 67 73 20 73     [appendArgs s
1fe90 65 74 74 69 6e 67 73 20 24 73 75 66 66 69 78 20  ettings $suffix 
1fea0 2e 20 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72  . $::tcl_platfor
1feb0 6d 28 68 6f 73 74 29 20 2e 65 61 67 6c 65 5d 5d  m(host) .eagle]]
1fec0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66  ....          if
1fed0 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24   {[file exists $
1fee0 68 6f 73 74 53 65 74 74 69 6e 67 73 46 69 6c 65  hostSettingsFile
1fef0 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  Name]} then {.. 
1ff00 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
1ff10 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
1ff20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70                tp
1ff30 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
1ff40 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
1ff50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
1ff60 2d 2d 2d 20 6c 6f 61 64 69 6e 67 20 70 65 72 2d  --- loading per-
1ff70 68 6f 73 74 20 74 65 73 74 20 73 65 74 74 69 6e  host test settin
1ff80 67 73 20 66 69 6c 65 20 5c 22 22 20 5c 0d 0a 20  gs file \"" \.. 
1ff90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ffa0 20 24 68 6f 73 74 53 65 74 74 69 6e 67 73 46 69   $hostSettingsFi
1ffb0 6c 65 4e 61 6d 65 20 5c 22 2e 2e 2e 5c 6e 5d 0d  leName \"...\n].
1ffc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
1ffd0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
1ffe0 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
1fff0 20 20 20 20 20 20 20 20 20 20 75 70 6c 65 76 65            upleve
20000 6c 20 31 20 5b 6c 69 73 74 20 73 6f 75 72 63 65  l 1 [list source
20010 20 24 68 6f 73 74 53 65 74 74 69 6e 67 73 46 69   $hostSettingsFi
20020 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20 20  leName]..       
20030 20 20 20 20 20 7d 20 65 72 72 6f 72 5d 7d 20 74       } error]} t
20040 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
20050 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
20060 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
20070 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
20080 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
20090 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
200a0 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d              "===
200b0 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65  = WARNING: faile
200c0 64 20 74 6f 20 6c 6f 61 64 20 70 65 72 2d 68 6f  d to load per-ho
200d0 73 74 20 73 65 74 74 69 6e 67 73 20 66 69 6c 65  st settings file
200e0 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20   \"" \..        
200f0 20 20 20 20 20 20 20 20 20 20 20 20 24 68 6f 73              $hos
20100 74 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d  tSettingsFileNam
20110 65 20 22 5c 22 2c 20 65 72 72 6f 72 3a 20 22 20  e "\", error: " 
20120 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d  \n\t $error \n].
20130 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
20140 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
20150 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73  .          } els
20160 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e {..           
20170 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
20180 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
20190 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
201a0 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
201b0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
201c0 20 20 20 20 22 2d 2d 2d 2d 20 73 6b 69 70 70 65      "---- skippe
201d0 64 20 6c 6f 61 64 69 6e 67 20 70 65 72 2d 68 6f  d loading per-ho
201e0 73 74 20 74 65 73 74 20 73 65 74 74 69 6e 67 73  st test settings
201f0 20 66 69 6c 65 20 5c 22 22 20 5c 0d 0a 20 20 20   file \"" \..   
20200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24                 $
20210 68 6f 73 74 53 65 74 74 69 6e 67 73 46 69 6c 65  hostSettingsFile
20220 4e 61 6d 65 20 22 5c 22 2c 20 69 74 20 64 6f 65  Name "\", it doe
20230 73 20 6e 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d  s not exist\n"].
20240 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
20250 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
20260 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
20270 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
20280 72 6f 63 20 63 6f 70 79 53 61 6d 70 6c 65 44 61  roc copySampleDa
20290 74 61 62 61 73 65 46 69 6c 65 73 20 7b 7d 20 7b  tabaseFiles {} {
202a0 0d 0a 20 20 20 20 20 20 75 70 6c 65 76 65 6c 20  ..      uplevel 
202b0 31 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  1 {..        #..
202c0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
202d0 43 6f 70 79 20 28 6f 72 20 72 65 2d 63 6f 70 79  Copy (or re-copy
202e0 29 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  ) the reference 
202f0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 75 73  database file us
20300 65 64 20 66 6f 72 20 74 68 69 73 0d 0a 20 20 20  ed for this..   
20310 20 20 20 20 20 23 20 20 20 20 20 20 20 75 6e 69       #       uni
20320 74 20 74 65 73 74 20 74 6f 20 74 68 65 20 62 75  t test to the bu
20330 69 6c 64 20 64 69 72 65 63 74 6f 72 79 20 69 6e  ild directory in
20340 20 63 61 73 65 20 69 74 20 68 61 73 20 62 65 65   case it has bee
20350 6e 20 63 68 61 6e 67 65 64 0d 0a 20 20 20 20 20  n changed..     
20360 20 20 20 23 20 20 20 20 20 20 20 62 79 20 61 20     #       by a 
20370 70 72 65 76 69 6f 75 73 20 74 65 73 74 20 72 75  previous test ru
20380 6e 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  n...        #.. 
20390 20 20 20 20 20 20 20 66 69 6c 65 20 63 6f 70 79         file copy
203a0 20 2d 66 6f 72 63 65 20 24 6e 6f 72 74 68 77 69   -force $northwi
203b0 6e 64 45 66 44 62 46 69 6c 65 20 5c 0d 0a 20 20  ndEfDbFile \..  
203c0 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 6a 6f          [file jo
203d0 69 6e 20 5b 67 65 74 42 75 69 6c 64 44 69 72 65  in [getBuildDire
203e0 63 74 6f 72 79 20 66 61 6c 73 65 5d 20 5b 66 69  ctory false] [fi
203f0 6c 65 20 74 61 69 6c 20 24 6e 6f 72 74 68 77 69  le tail $northwi
20400 6e 64 45 66 44 62 46 69 6c 65 5d 5d 0d 0a 20 20  ndEfDbFile]]..  
20410 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
20420 0a 20 20 20 20 70 72 6f 63 20 72 75 6e 53 51 4c  .    proc runSQL
20430 69 74 65 54 65 73 74 50 72 6f 6c 6f 67 75 65 20  iteTestPrologue 
20440 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20  {} {..      #.. 
20450 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69       # NOTE: Ski
20460 70 20 72 75 6e 6e 69 6e 67 20 6f 75 72 20 63 75  p running our cu
20470 73 74 6f 6d 20 70 72 6f 6c 6f 67 75 65 20 69 66  stom prologue if
20480 20 74 68 65 20 6d 61 69 6e 20 6f 6e 65 20 68 61   the main one ha
20490 73 20 62 65 65 6e 0d 0a 20 20 20 20 20 20 23 20  s been..      # 
204a0 20 20 20 20 20 20 73 6b 69 70 70 65 64 2e 0d 0a        skipped...
204b0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
204c0 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
204d0 20 3a 3a 6e 6f 28 70 72 6f 6c 6f 67 75 65 2e 65   ::no(prologue.e
204e0 61 67 6c 65 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  agle)]} then {..
204f0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
20500 20 20 20 23 20 4e 4f 54 45 3a 20 4c 6f 61 64 20     # NOTE: Load 
20510 74 68 65 20 22 62 65 66 6f 72 65 2d 63 6f 6e 73  the "before-cons
20520 74 72 61 69 6e 74 73 22 20 63 75 73 74 6f 6d 20  traints" custom 
20530 70 65 72 2d 75 73 65 72 20 61 6e 64 2f 6f 72 20  per-user and/or 
20540 70 65 72 2d 68 6f 73 74 0d 0a 20 20 20 20 20 20  per-host..      
20550 20 20 23 20 20 20 20 20 20 20 74 65 73 74 20 73    #       test s
20560 65 74 74 69 6e 67 73 20 6e 6f 77 2e 0d 0a 20 20  ettings now...  
20570 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
20580 20 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74   uplevel 1 [list
20590 20 6c 6f 61 64 53 51 4c 69 74 65 54 65 73 74 53   loadSQLiteTestS
205a0 65 74 74 69 6e 67 73 20 24 3a 3a 74 65 73 74 5f  ettings $::test_
205b0 63 68 61 6e 6e 65 6c 20 2e 62 65 66 6f 72 65 5d  channel .before]
205c0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
205d0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43         # NOTE: C
205e0 68 65 63 6b 20 69 66 20 74 68 65 20 5b 6f 62 6a  heck if the [obj
205f0 65 63 74 5d 20 63 6f 6d 6d 61 6e 64 20 69 73 20  ect] command is 
20600 61 76 61 69 6c 61 62 6c 65 3b 20 69 66 20 6e 6f  available; if no
20610 74 2c 20 61 64 64 20 73 6f 6d 65 0d 0a 20 20 20  t, add some..   
20620 20 20 20 20 20 23 20 20 20 20 20 20 20 73 68 69       #       shi
20630 6d 73 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 74  ms to make the t
20640 65 73 74 20 73 75 69 74 65 20 72 75 6e 20 73 6d  est suite run sm
20650 6f 6f 74 68 65 72 2e 0d 0a 20 20 20 20 20 20 20  oother...       
20660 20 23 0d 0a 20 20 20 20 20 20 20 20 63 68 65 63   #..        chec
20670 6b 46 6f 72 53 51 4c 69 74 65 4f 62 6a 65 63 74  kForSQLiteObject
20680 43 6f 6d 6d 61 6e 64 20 24 3a 3a 74 65 73 74 5f  Command $::test_
20690 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20  channel....     
206a0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
206b0 4e 4f 54 45 3a 20 44 65 74 65 72 6d 69 6e 65 20  NOTE: Determine 
206c0 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 74 68 65  the names of the
206d0 20 6e 61 74 69 76 65 20 70 6c 61 74 66 6f 72 6d   native platform
206e0 20 61 6e 64 20 61 72 63 68 69 74 65 63 74 75 72   and architectur
206f0 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  e...        #.. 
20700 20 20 20 20 20 20 20 73 65 74 20 70 6c 61 74 66         set platf
20710 6f 72 6d 20 5b 67 65 74 42 75 69 6c 64 50 6c 61  orm [getBuildPla
20720 74 66 6f 72 6d 20 74 72 75 65 5d 0d 0a 20 20 20  tform true]..   
20730 20 20 20 20 20 73 65 74 20 61 72 63 68 69 74 65       set archite
20740 63 74 75 72 65 20 5b 61 72 63 68 69 74 65 63 74  cture [architect
20750 75 72 65 46 6f 72 50 6c 61 74 66 6f 72 6d 20 24  ureForPlatform $
20760 70 6c 61 74 66 6f 72 6d 5d 0d 0a 0d 0a 20 20 20  platform]....   
20770 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
20780 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20 74 68 65  # NOTE: Show the
20790 20 70 6c 61 74 66 6f 72 6d 20 61 6e 64 20 61 72   platform and ar
207a0 63 68 69 74 65 63 74 75 72 65 20 75 73 65 64 20  chitecture used 
207b0 74 6f 20 68 65 6c 70 20 6c 6f 63 61 74 65 20 74  to help locate t
207c0 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  he..        #   
207d0 20 20 20 20 6e 61 74 69 76 65 20 62 75 69 6c 64      native build
207e0 20 66 69 6c 65 73 2e 0d 0a 20 20 20 20 20 20 20   files...       
207f0 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   #..        tput
20800 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
20810 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
20820 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d  .            "--
20830 2d 2d 20 70 6c 61 74 66 6f 72 6d 20 66 6f 72 20  -- platform for 
20840 6c 6f 63 61 74 69 6e 67 20 6e 61 74 69 76 65 20  locating native 
20850 62 75 69 6c 64 20 66 69 6c 65 73 20 69 73 20 5c  build files is \
20860 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  "" \..          
20870 20 20 24 70 6c 61 74 66 6f 72 6d 20 5c 22 5c 6e    $platform \"\n
20880 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 70 75  ]....        tpu
20890 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
208a0 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
208b0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d  ..            "-
208c0 2d 2d 2d 20 61 72 63 68 69 74 65 63 74 75 72 65  --- architecture
208d0 20 66 6f 72 20 6c 6f 63 61 74 69 6e 67 20 6e 61   for locating na
208e0 74 69 76 65 20 62 75 69 6c 64 20 66 69 6c 65 73  tive build files
208f0 20 69 73 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20   is \"" \..     
20900 20 20 20 20 20 20 20 24 61 72 63 68 69 74 65 63         $architec
20910 74 75 72 65 20 5c 22 5c 6e 5d 0d 0a 0d 0a 20 20  ture \"\n]....  
20920 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
20930 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20 61   # NOTE: Build a
20940 20 6c 69 73 74 20 6f 66 20 63 6f 6e 66 69 67 75   list of configu
20950 72 61 74 69 6f 6e 20 66 69 6c 65 73 20 74 68 61  ration files tha
20960 74 20 77 65 20 68 61 6e 64 6c 65 2e 0d 0a 20 20  t we handle...  
20970 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
20980 20 73 65 74 20 63 6f 6e 66 69 67 46 69 6c 65 4e   set configFileN
20990 61 6d 65 73 20 5b 6c 69 73 74 20 5c 0d 0a 20 20  ames [list \..  
209a0 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d            System
209b0 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c  .Data.SQLite.dll
209c0 2e 63 6f 6e 66 69 67 5d 0d 0a 0d 0a 20 20 20 20  .config]....    
209d0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
209e0 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20 61 20 6c   NOTE: Build a l
209f0 69 73 74 20 6f 66 20 61 75 78 69 6c 69 61 72 79  ist of auxiliary
20a00 20 4d 61 6e 61 67 65 64 20 44 65 62 75 67 67 69   Managed Debuggi
20a10 6e 67 20 41 73 73 69 73 74 61 6e 74 73 20 28 4d  ng Assistants (M
20a20 44 41 29 0d 0a 20 20 20 20 20 20 20 20 23 20 20  DA)..        #  
20a30 20 20 20 20 20 63 6f 6e 66 69 67 75 72 61 74 69       configurati
20a40 6f 6e 20 66 69 6c 65 73 20 74 68 61 74 20 77 65  on files that we
20a50 20 68 61 6e 64 6c 65 2e 0d 0a 20 20 20 20 20 20   handle...      
20a60 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74    #..        set
20a70 20 6d 64 61 43 6f 6e 66 69 67 46 69 6c 65 4e 61   mdaConfigFileNa
20a80 6d 65 73 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20  mes [list \..   
20a90 20 20 20 20 20 20 20 20 20 45 61 67 6c 65 53 68           EagleSh
20aa0 65 6c 6c 33 32 2e 65 78 65 2e 6d 64 61 2e 63 6f  ell32.exe.mda.co
20ab0 6e 66 69 67 20 49 6e 73 74 61 6c 6c 65 72 2e 65  nfig Installer.e
20ac0 78 65 2e 6d 64 61 2e 63 6f 6e 66 69 67 20 5c 0d  xe.mda.config \.
20ad0 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  .            tes
20ae0 74 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e 66 69 67  t.exe.mda.config
20af0 20 74 65 73 74 6c 69 6e 71 2e 65 78 65 2e 6d 64   testlinq.exe.md
20b00 61 2e 63 6f 6e 66 69 67 20 5c 0d 0a 20 20 20 20  a.config \..    
20b10 20 20 20 20 20 20 20 20 74 65 73 74 65 66 36 2e          testef6.
20b20 65 78 65 2e 6d 64 61 2e 63 6f 6e 66 69 67 5d 0d  exe.mda.config].
20b30 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
20b40 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75        # NOTE: Bu
20b50 69 6c 64 20 74 68 65 20 6c 69 73 74 20 6f 66 20  ild the list of 
20b60 65 78 74 65 72 6e 61 6c 20 66 69 6c 65 73 20 74  external files t
20b70 68 61 74 20 77 65 20 68 61 6e 64 6c 65 2e 20 20  hat we handle.  
20b80 53 6f 6d 65 20 6f 66 0d 0a 20 20 20 20 20 20 20  Some of..       
20b90 20 23 20 20 20 20 20 20 20 74 68 65 73 65 20 66   #       these f
20ba0 69 6c 65 73 20 6d 61 79 20 62 65 20 6e 61 74 69  iles may be nati
20bb0 76 65 20 61 6e 64 2f 6f 72 20 6d 61 6e 61 67 65  ve and/or manage
20bc0 64 20 61 73 73 65 6d 62 6c 69 65 73 20 74 68 61  d assemblies tha
20bd0 74 20 61 72 65 0d 0a 20 20 20 20 20 20 20 20 23  t are..        #
20be0 20 20 20 20 20 20 20 72 65 71 75 69 72 65 64 20         required 
20bf0 74 6f 20 70 65 72 66 6f 72 6d 20 76 61 72 69 6f  to perform vario
20c00 75 73 20 74 65 73 74 73 2e 0d 0a 20 20 20 20 20  us tests...     
20c10 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65     #..        se
20c20 74 20 65 78 74 65 72 6e 61 6c 46 69 6c 65 4e 61  t externalFileNa
20c30 6d 65 73 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20  mes [list \..   
20c40 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 6a           [file j
20c50 6f 69 6e 20 45 6e 74 69 74 79 46 72 61 6d 65 77  oin EntityFramew
20c60 6f 72 6b 20 6c 69 62 20 5b 73 74 72 69 6e 67 20  ork lib [string 
20c70 6d 61 70 20 5b 6c 69 73 74 20 46 78 20 22 22 5d  map [list Fx ""]
20c80 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
20c90 5b 73 74 72 69 6e 67 20 6d 61 70 20 5b 6c 69 73  [string map [lis
20ca0 74 20 6e 65 74 46 78 34 35 31 20 6e 65 74 46 78  t netFx451 netFx
20cb0 34 35 20 6e 65 74 46 78 34 35 32 20 6e 65 74 46  45 netFx452 netF
20cc0 78 34 35 20 6e 65 74 46 78 34 36 20 5c 0d 0a 20  x45 netFx46 \.. 
20cd0 20 20 20 20 20 20 20 20 20 20 20 6e 65 74 46 78             netFx
20ce0 34 35 20 6e 65 74 46 78 34 36 31 20 6e 65 74 46  45 netFx461 netF
20cf0 78 34 35 20 6e 65 74 46 78 34 36 32 20 6e 65 74  x45 netFx462 net
20d00 46 78 34 35 5d 20 5b 67 65 74 42 75 69 6c 64 4e  Fx45] [getBuildN
20d10 65 74 46 78 5d 5d 5d 20 5c 0d 0a 20 20 20 20 20  etFx]]] \..     
20d20 20 20 20 20 20 20 20 45 6e 74 69 74 79 46 72 61         EntityFra
20d30 6d 65 77 6f 72 6b 2e 64 6c 6c 5d 5d 0d 0a 0d 0a  mework.dll]]....
20d40 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
20d50 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64     # NOTE: Build
20d60 20 74 68 65 20 6c 69 73 74 20 6f 66 20 6e 61 74   the list of nat
20d70 69 76 65 20 61 73 73 65 6d 62 6c 79 20 66 69 6c  ive assembly fil
20d80 65 73 20 74 68 61 74 20 77 65 20 68 61 6e 64 6c  es that we handl
20d90 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  e...        #.. 
20da0 20 20 20 20 20 20 20 73 65 74 20 6e 61 74 69 76         set nativ
20db0 65 46 69 6c 65 4e 61 6d 65 73 20 5b 6c 69 73 74  eFileNames [list
20dc0 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 65 76 61  ]....        eva
20dd0 6c 20 6c 61 70 70 65 6e 64 20 6e 61 74 69 76 65  l lappend native
20de0 46 69 6c 65 4e 61 6d 65 73 20 5b 67 65 74 4e 61  FileNames [getNa
20df0 74 69 76 65 4c 69 62 72 61 72 79 46 69 6c 65 4e  tiveLibraryFileN
20e00 61 6d 65 73 4f 6e 6c 79 5d 0d 0a 20 20 20 20 20  amesOnly]..     
20e10 20 20 20 65 76 61 6c 20 6c 61 70 70 65 6e 64 20     eval lappend 
20e20 6e 61 74 69 76 65 46 69 6c 65 4e 61 6d 65 73 20  nativeFileNames 
20e30 5b 67 65 74 49 6e 74 65 72 6f 70 41 73 73 65 6d  [getInteropAssem
20e40 62 6c 79 46 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79  blyFileNamesOnly
20e50 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ]....        #..
20e60 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
20e70 42 75 69 6c 64 20 74 68 65 20 6c 69 73 74 20 6f  Build the list o
20e80 66 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73  f mixed-mode ass
20e90 65 6d 62 6c 79 20 66 69 6c 65 73 20 74 68 61 74  embly files that
20ea0 20 77 65 20 68 61 6e 64 6c 65 2e 0d 0a 20 20 20   we handle...   
20eb0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
20ec0 73 65 74 20 6d 69 78 65 64 46 69 6c 65 4e 61 6d  set mixedFileNam
20ed0 65 73 20 5b 6c 69 73 74 5d 0d 0a 0d 0a 20 20 20  es [list]....   
20ee0 20 20 20 20 20 69 66 20 7b 5b 68 61 73 52 75 6e       if {[hasRun
20ef0 74 69 6d 65 4f 70 74 69 6f 6e 20 6e 61 74 69 76  timeOption nativ
20f00 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  e]} then {..    
20f10 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 6d 69        lappend mi
20f20 78 65 64 46 69 6c 65 4e 61 6d 65 73 20 53 79 73  xedFileNames Sys
20f30 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
20f40 64 6c 6c 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  dll..        }..
20f50 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
20f60 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69       # NOTE: Bui
20f70 6c 64 20 74 68 65 20 6c 69 73 74 20 6f 66 20 6d  ld the list of m
20f80 61 6e 61 67 65 64 20 61 73 73 65 6d 62 6c 79 20  anaged assembly 
20f90 66 69 6c 65 73 20 74 68 61 74 20 77 65 20 68 61  files that we ha
20fa0 6e 64 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 23  ndle...        #
20fb0 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 6d 61  ..        set ma
20fc0 6e 61 67 65 64 46 69 6c 65 4e 61 6d 65 73 20 5b  nagedFileNames [
20fd0 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20  list \..        
20fe0 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e      System.Data.
20ff0 53 51 4c 69 74 65 2e 4c 69 6e 71 2e 64 6c 6c 20  SQLite.Linq.dll 
21000 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
21010 74 65 2e 45 46 36 2e 64 6c 6c 5d 0d 0a 0d 0a 20  te.EF6.dll].... 
21020 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61 73         if {![has
21030 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 6e 61  RuntimeOption na
21040 74 69 76 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  tive]} then {.. 
21050 20 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64           lappend
21060 20 6d 61 6e 61 67 65 64 46 69 6c 65 4e 61 6d 65   managedFileName
21070 73 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  s System.Data.SQ
21080 4c 69 74 65 2e 64 6c 6c 0d 0a 20 20 20 20 20 20  Lite.dll..      
21090 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23    }....        #
210a0 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
210b0 3a 20 53 68 6f 77 20 74 68 65 20 76 61 72 69 6f  : Show the vario
210c0 75 73 20 6c 69 73 74 73 20 6f 66 20 66 69 6c 65  us lists of file
210d0 20 6e 61 6d 65 73 20 74 68 61 74 20 61 72 65 20   names that are 
210e0 68 61 6e 64 6c 65 64 20 62 79 20 74 68 69 73 0d  handled by this.
210f0 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
21100 20 70 72 6f 63 65 64 75 72 65 2e 0d 0a 20 20 20   procedure...   
21110 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
21120 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
21130 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
21140 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
21150 20 22 2d 2d 2d 2d 20 6c 69 73 74 20 6f 66 20 5c   "---- list of \
21160 22 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 5c 22  "configuration\"
21170 20 66 69 6c 65 20 6e 61 6d 65 73 20 69 73 3a 20   file names is: 
21180 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
21190 20 24 63 6f 6e 66 69 67 46 69 6c 65 4e 61 6d 65   $configFileName
211a0 73 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  s \n]....       
211b0 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
211c0 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
211d0 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
211e0 20 20 22 2d 2d 2d 2d 20 6c 69 73 74 20 6f 66 20    "---- list of 
211f0 5c 22 4d 44 41 20 63 6f 6e 66 69 67 75 72 61 74  \"MDA configurat
21200 69 6f 6e 5c 22 20 66 69 6c 65 20 6e 61 6d 65 73  ion\" file names
21210 20 69 73 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20   is: " \..      
21220 20 20 20 20 20 20 24 6d 64 61 43 6f 6e 66 69 67        $mdaConfig
21230 46 69 6c 65 4e 61 6d 65 73 20 5c 6e 5d 0d 0a 0d  FileNames \n]...
21240 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
21250 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
21260 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
21270 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
21280 6c 69 73 74 20 6f 66 20 5c 22 65 78 74 65 72 6e  list of \"extern
21290 61 6c 5c 22 20 66 69 6c 65 20 6e 61 6d 65 73 20  al\" file names 
212a0 69 73 3a 20 22 20 24 65 78 74 65 72 6e 61 6c 46  is: " $externalF
212b0 69 6c 65 4e 61 6d 65 73 20 5c 6e 5d 0d 0a 0d 0a  ileNames \n]....
212c0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
212d0 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
212e0 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
212f0 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6c           "---- l
21300 69 73 74 20 6f 66 20 5c 22 6e 61 74 69 76 65 5c  ist of \"native\
21310 22 20 66 69 6c 65 20 6e 61 6d 65 73 20 69 73 3a  " file names is:
21320 20 22 20 24 6e 61 74 69 76 65 46 69 6c 65 4e 61   " $nativeFileNa
21330 6d 65 73 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20  mes \n]....     
21340 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
21350 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
21360 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
21370 20 20 20 20 22 2d 2d 2d 2d 20 6c 69 73 74 20 6f      "---- list o
21380 66 20 5c 22 6d 69 78 65 64 5c 22 20 66 69 6c 65  f \"mixed\" file
21390 20 6e 61 6d 65 73 20 69 73 3a 20 22 20 24 6d 69   names is: " $mi
213a0 78 65 64 46 69 6c 65 4e 61 6d 65 73 20 5c 6e 5d  xedFileNames \n]
213b0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74  ....        tput
213c0 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
213d0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
213e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d  .            "--
213f0 2d 2d 20 6c 69 73 74 20 6f 66 20 5c 22 6d 61 6e  -- list of \"man
21400 61 67 65 64 5c 22 20 66 69 6c 65 20 6e 61 6d 65  aged\" file name
21410 73 20 69 73 3a 20 22 20 24 6d 61 6e 61 67 65 64  s is: " $managed
21420 46 69 6c 65 4e 61 6d 65 73 20 5c 6e 5d 0d 0a 0d  FileNames \n]...
21430 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
21440 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 6d 6f      # NOTE: Remo
21450 76 65 20 61 6e 79 20 74 65 73 74 20 63 6f 6e 73  ve any test cons
21460 74 72 61 69 6e 74 73 20 74 68 61 74 20 72 65 66  traints that ref
21470 65 72 20 74 6f 20 74 68 65 20 6e 61 74 69 76 65  er to the native
21480 20 61 6e 64 2f 6f 72 0d 0a 20 20 20 20 20 20 20   and/or..       
21490 20 23 20 20 20 20 20 20 20 6d 61 6e 61 67 65 64   #       managed
214a0 20 61 73 73 65 6d 62 6c 79 20 66 69 6c 65 73 20   assembly files 
214b0 74 68 61 74 20 77 65 20 68 61 6e 64 6c 65 20 75  that we handle u
214c0 6e 6c 65 73 73 20 66 6f 72 62 69 64 64 65 6e 20  nless forbidden 
214d0 66 72 6f 6d 0d 0a 20 20 20 20 20 20 20 20 23 20  from..        # 
214e0 20 20 20 20 20 20 64 6f 69 6e 67 20 73 6f 2e 0d        doing so..
214f0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
21500 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
21510 78 69 73 74 73 20 3a 3a 6e 6f 28 73 71 6c 69 74  xists ::no(sqlit
21520 65 52 65 6d 6f 76 65 43 6f 6e 73 74 72 61 69 6e  eRemoveConstrain
21530 74 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ts)]} then {..  
21540 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
21550 66 69 6c 65 4e 61 6d 65 20 24 63 6f 6e 66 69 67  fileName $config
21560 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20  FileNames {..   
21570 20 20 20 20 20 20 20 20 20 72 65 6d 6f 76 65 43           removeC
21580 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e  onstraint [appen
21590 64 41 72 67 73 20 66 69 6c 65 5f 20 24 66 69 6c  dArgs file_ $fil
215a0 65 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20 20 20  eName]..        
215b0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
215c0 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d   foreach fileNam
215d0 65 20 24 6d 64 61 43 6f 6e 66 69 67 46 69 6c 65  e $mdaConfigFile
215e0 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20  Names {..       
215f0 20 20 20 20 20 72 65 6d 6f 76 65 43 6f 6e 73 74       removeConst
21600 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67  raint [appendArg
21610 73 20 66 69 6c 65 5f 20 24 66 69 6c 65 4e 61 6d  s file_ $fileNam
21620 65 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  e]..          }.
21630 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  ...          for
21640 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 65  each fileName $e
21650 78 74 65 72 6e 61 6c 46 69 6c 65 4e 61 6d 65 73  xternalFileNames
21660 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
21670 72 65 6d 6f 76 65 43 6f 6e 73 74 72 61 69 6e 74  removeConstraint
21680 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c   [appendArgs fil
21690 65 5f 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66  e_ [file tail $f
216a0 69 6c 65 4e 61 6d 65 5d 5d 0d 0a 20 20 20 20 20  ileName]]..     
216b0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
216c0 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65      foreach file
216d0 4e 61 6d 65 20 24 6e 61 74 69 76 65 46 69 6c 65  Name $nativeFile
216e0 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20  Names {..       
216f0 20 20 20 20 20 72 65 6d 6f 76 65 43 6f 6e 73 74       removeConst
21700 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67  raint [appendArg
21710 73 20 66 69 6c 65 5f 20 24 66 69 6c 65 4e 61 6d  s file_ $fileNam
21720 65 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  e]..          }.
21730 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  ...          for
21740 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6d  each fileName $m
21750 69 78 65 64 46 69 6c 65 4e 61 6d 65 73 20 7b 0d  ixedFileNames {.
21760 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6d  .            rem
21770 6f 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61  oveConstraint [a
21780 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20  ppendArgs file_ 
21790 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20 20  $fileName]..    
217a0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
217b0 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c       foreach fil
217c0 65 4e 61 6d 65 20 24 6d 61 6e 61 67 65 64 46 69  eName $managedFi
217d0 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20  leNames {..     
217e0 20 20 20 20 20 20 20 72 65 6d 6f 76 65 43 6f 6e         removeCon
217f0 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41  straint [appendA
21800 72 67 73 20 66 69 6c 65 5f 20 24 66 69 6c 65 4e  rgs file_ $fileN
21810 61 6d 65 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  ame]..          
21820 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  }..        }....
21830 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
21840 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20     # NOTE: Skip 
21850 61 6c 6c 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  all System.Data.
21860 53 51 4c 69 74 65 20 72 65 6c 61 74 65 64 20 66  SQLite related f
21870 69 6c 65 20 68 61 6e 64 6c 69 6e 67 20 28 64 65  ile handling (de
21880 6c 65 74 69 6e 67 2c 0d 0a 20 20 20 20 20 20 20  leting,..       
21890 20 23 20 20 20 20 20 20 20 63 6f 70 79 69 6e 67   #       copying
218a0 2c 20 61 6e 64 20 6c 6f 61 64 69 6e 67 29 20 69  , and loading) i
218b0 66 20 69 6e 73 74 72 75 63 74 65 64 2e 0d 0a 20  f instructed... 
218c0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
218d0 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
218e0 73 74 73 20 3a 3a 6e 6f 28 73 71 6c 69 74 65 46  sts ::no(sqliteF
218f0 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  iles)]} then {..
21900 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
21910 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53         # NOTE: S
21920 6b 69 70 20 74 72 79 69 6e 67 20 74 6f 20 64 65  kip trying to de
21930 6c 65 74 65 20 61 6e 79 20 66 69 6c 65 73 20 69  lete any files i
21940 66 20 69 6e 73 74 72 75 63 74 65 64 2e 0d 0a 20  f instructed... 
21950 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
21960 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
21970 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c   exists ::no(del
21980 65 74 65 53 71 6c 69 74 65 46 69 6c 65 73 29 5d  eteSqliteFiles)]
21990 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
219a0 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
219b0 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c   exists ::no(del
219c0 65 74 65 53 71 6c 69 74 65 43 6f 6e 66 69 67 46  eteSqliteConfigF
219d0 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  iles)]} then {..
219e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f                fo
219f0 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24  reach fileName $
21a00 63 6f 6e 66 69 67 46 69 6c 65 4e 61 6d 65 73 20  configFileNames 
21a10 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
21a20 20 20 20 74 72 79 44 65 6c 65 74 65 42 69 6e 61     tryDeleteBina
21a30 72 79 46 69 6c 65 20 24 66 69 6c 65 4e 61 6d 65  ryFile $fileName
21a40 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
21a50 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  }..            }
21a60 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
21a70 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
21a80 73 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c  s ::no(deleteSql
21a90 69 74 65 45 78 74 65 72 6e 61 6c 46 69 6c 65 73  iteExternalFiles
21aa0 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
21ab0 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63            foreac
21ac0 68 20 66 69 6c 65 4e 61 6d 65 20 24 6d 64 61 43  h fileName $mdaC
21ad0 6f 6e 66 69 67 46 69 6c 65 4e 61 6d 65 73 20 7b  onfigFileNames {
21ae0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
21af0 20 20 74 72 79 44 65 6c 65 74 65 42 75 69 6c 64    tryDeleteBuild
21b00 46 69 6c 65 20 24 66 69 6c 65 4e 61 6d 65 20 66  File $fileName f
21b10 61 6c 73 65 0d 0a 20 20 20 20 20 20 20 20 20 20  alse..          
21b20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
21b30 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66         foreach f
21b40 69 6c 65 4e 61 6d 65 20 24 65 78 74 65 72 6e 61  ileName $externa
21b50 6c 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20  lFileNames {..  
21b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72                tr
21b70 79 44 65 6c 65 74 65 42 69 6e 61 72 79 46 69 6c  yDeleteBinaryFil
21b80 65 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20  e $fileName..   
21b90 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
21ba0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
21bb0 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
21bc0 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
21bd0 6f 28 64 65 6c 65 74 65 53 71 6c 69 74 65 4e 61  o(deleteSqliteNa
21be0 74 69 76 65 46 69 6c 65 73 29 5d 7d 20 74 68 65  tiveFiles)]} the
21bf0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
21c00 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
21c10 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74 65  ists ::no(delete
21c20 53 71 6c 69 74 65 49 6d 70 6c 69 63 69 74 4e 61  SqliteImplicitNa
21c30 74 69 76 65 46 69 6c 65 73 29 5d 7d 20 74 68 65  tiveFiles)]} the
21c40 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
21c50 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c       foreach fil
21c60 65 4e 61 6d 65 20 24 6e 61 74 69 76 65 46 69 6c  eName $nativeFil
21c70 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20  eNames {..      
21c80 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79 44              tryD
21c90 65 6c 65 74 65 41 73 73 65 6d 62 6c 79 20 24 66  eleteAssembly $f
21ca0 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20  ileName..       
21cb0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
21cc0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
21cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
21ce0 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
21cf0 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69 74 65  :no(deleteSqlite
21d00 4e 6f 6e 49 6d 70 6c 69 63 69 74 46 69 6c 65 73  NonImplicitFiles
21d10 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
21d20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
21d30 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
21d40 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69 74 65 50  no(deleteSqliteP
21d50 6c 61 74 66 6f 72 6d 46 69 6c 65 73 29 5d 20 26  latformFiles)] &
21d60 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  & \..           
21d70 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67           [string
21d80 20 6c 65 6e 67 74 68 20 24 70 6c 61 74 66 6f 72   length $platfor
21d90 6d 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  m] > 0} then {..
21da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21db0 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61    foreach fileNa
21dc0 6d 65 20 24 6e 61 74 69 76 65 46 69 6c 65 4e 61  me $nativeFileNa
21dd0 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  mes {..         
21de0 20 20 20 20 20 20 20 20 20 20 20 74 72 79 44 65             tryDe
21df0 6c 65 74 65 41 73 73 65 6d 62 6c 79 20 24 66 69  leteAssembly $fi
21e00 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d  leName $platform
21e10 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
21e20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
21e30 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
21e40 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
21e50 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
21e60 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69 74 65 41  no(deleteSqliteA
21e70 72 63 68 69 74 65 63 74 75 72 65 46 69 6c 65 73  rchitectureFiles
21e80 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  )] && \..       
21e90 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 73 74               [st
21ea0 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 61 72 63  ring length $arc
21eb0 68 69 74 65 63 74 75 72 65 5d 20 3e 20 30 7d 20  hitecture] > 0} 
21ec0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
21ed0 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63            foreac
21ee0 68 20 66 69 6c 65 4e 61 6d 65 20 24 6e 61 74 69  h fileName $nati
21ef0 76 65 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20  veFileNames {.. 
21f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21f10 20 20 20 74 72 79 44 65 6c 65 74 65 41 73 73 65     tryDeleteAsse
21f20 6d 62 6c 79 20 24 66 69 6c 65 4e 61 6d 65 20 24  mbly $fileName $
21f30 61 72 63 68 69 74 65 63 74 75 72 65 0d 0a 20 20  architecture..  
21f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21f50 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  }..             
21f60 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
21f70 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
21f80 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
21f90 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
21fa0 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74  xists ::no(delet
21fb0 65 53 71 6c 69 74 65 4d 69 78 65 64 46 69 6c 65  eSqliteMixedFile
21fc0 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  s)]} then {..   
21fd0 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
21fe0 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f              # NO
21ff0 54 45 3a 20 49 66 20 74 68 65 20 22 6e 61 74 69  TE: If the "nati
22000 76 65 22 20 72 75 6e 74 69 6d 65 20 6f 70 74 69  ve" runtime opti
22010 6f 6e 20 69 73 20 73 65 74 2c 20 64 65 6c 65 74  on is set, delet
22020 65 20 69 6d 70 6c 69 63 69 74 0d 0a 20 20 20 20  e implicit..    
22030 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
22040 20 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73    mixed-mode ass
22050 65 6d 62 6c 79 20 66 69 6c 65 73 20 61 73 20 77  embly files as w
22060 65 6c 6c 2e 20 20 54 68 69 73 20 72 75 6e 74 69  ell.  This runti
22070 6d 65 20 6f 70 74 69 6f 6e 0d 0a 20 20 20 20 20  me option..     
22080 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
22090 20 63 68 65 63 6b 20 69 73 20 68 61 6e 64 6c 65   check is handle
220a0 64 20 77 68 65 6e 20 62 75 69 6c 64 69 6e 67 20  d when building 
220b0 74 68 65 20 6c 69 73 74 20 6f 66 20 6d 69 78 65  the list of mixe
220c0 64 2d 6d 6f 64 65 0d 0a 20 20 20 20 20 20 20 20  d-mode..        
220d0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61 73        #       as
220e0 73 65 6d 62 6c 79 20 66 69 6c 65 20 6e 61 6d 65  sembly file name
220f0 73 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  s...            
22100 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
22110 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
22120 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74 65  ists ::no(delete
22130 53 71 6c 69 74 65 49 6d 70 6c 69 63 69 74 4d 69  SqliteImplicitMi
22140 78 65 64 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e  xedFiles)]} then
22150 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
22160 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65      foreach file
22170 4e 61 6d 65 20 24 6d 69 78 65 64 46 69 6c 65 4e  Name $mixedFileN
22180 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20  ames {..        
22190 20 20 20 20 20 20 20 20 20 20 74 72 79 44 65 6c            tryDel
221a0 65 74 65 41 73 73 65 6d 62 6c 79 20 24 66 69 6c  eteAssembly $fil
221b0 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 20  eName..         
221c0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
221d0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
221e0 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
221f0 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
22200 6f 28 64 65 6c 65 74 65 53 71 6c 69 74 65 4e 6f  o(deleteSqliteNo
22210 6e 49 6d 70 6c 69 63 69 74 46 69 6c 65 73 29 5d  nImplicitFiles)]
22220 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
22230 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
22240 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
22250 28 64 65 6c 65 74 65 53 71 6c 69 74 65 50 6c 61  (deleteSqlitePla
22260 74 66 6f 72 6d 46 69 6c 65 73 29 5d 20 26 26 20  tformFiles)] && 
22270 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
22280 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c         [string l
22290 65 6e 67 74 68 20 24 70 6c 61 74 66 6f 72 6d 5d  ength $platform]
222a0 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
222b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
222c0 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65  foreach fileName
222d0 20 24 6d 69 78 65 64 46 69 6c 65 4e 61 6d 65 73   $mixedFileNames
222e0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
222f0 20 20 20 20 20 20 20 20 74 72 79 44 65 6c 65 74          tryDelet
22300 65 41 73 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e  eAssembly $fileN
22310 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 0d 0a 20  ame $platform.. 
22320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22330 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
22340 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
22350 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69           if {![i
22360 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
22370 64 65 6c 65 74 65 53 71 6c 69 74 65 41 72 63 68  deleteSqliteArch
22380 69 74 65 63 74 75 72 65 46 69 6c 65 73 29 5d 20  itectureFiles)] 
22390 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
223a0 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e            [strin
223b0 67 20 6c 65 6e 67 74 68 20 24 61 72 63 68 69 74  g length $archit
223c0 65 63 74 75 72 65 5d 20 3e 20 30 7d 20 74 68 65  ecture] > 0} the
223d0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
223e0 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66         foreach f
223f0 69 6c 65 4e 61 6d 65 20 24 6d 69 78 65 64 46 69  ileName $mixedFi
22400 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20  leNames {..     
22410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
22420 72 79 44 65 6c 65 74 65 41 73 73 65 6d 62 6c 79  ryDeleteAssembly
22430 20 24 66 69 6c 65 4e 61 6d 65 20 24 61 72 63 68   $fileName $arch
22440 69 74 65 63 74 75 72 65 0d 0a 20 20 20 20 20 20  itecture..      
22450 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
22460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
22470 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
22480 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  }..            }
22490 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
224a0 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
224b0 73 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c  s ::no(deleteSql
224c0 69 74 65 4d 61 6e 61 67 65 64 46 69 6c 65 73 29  iteManagedFiles)
224d0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
224e0 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
224f0 20 66 69 6c 65 4e 61 6d 65 20 24 6d 61 6e 61 67   fileName $manag
22500 65 64 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20  edFileNames {.. 
22510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
22520 72 79 44 65 6c 65 74 65 41 73 73 65 6d 62 6c 79  ryDeleteAssembly
22530 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20   $fileName..    
22540 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
22550 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
22560 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
22570 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
22580 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20    # NOTE: Check 
22590 66 6f 72 20 74 68 65 20 22 61 75 74 6f 53 65 6c  for the "autoSel
225a0 65 63 74 22 20 72 75 6e 74 69 6d 65 20 6f 70 74  ect" runtime opt
225b0 69 6f 6e 2e 20 20 49 66 20 70 72 65 73 65 6e 74  ion.  If present
225c0 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20  ,..          #  
225d0 20 20 20 20 20 61 74 74 65 6d 70 74 20 74 6f 20       attempt to 
225e0 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 73 65  automatically se
225f0 6c 65 63 74 20 74 68 65 20 66 69 72 73 74 20 61  lect the first a
22600 76 61 69 6c 61 62 6c 65 0d 0a 20 20 20 20 20 20  vailable..      
22610 20 20 20 20 23 20 20 20 20 20 20 20 62 75 69 6c      #       buil
22620 64 20 28 6f 72 20 22 72 65 6c 65 61 73 65 22 29  d (or "release")
22630 20 6f 66 20 53 51 4c 69 74 65 20 61 6e 64 20 53   of SQLite and S
22640 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
22650 65 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20  e..          #  
22660 20 20 20 20 20 66 6f 72 20 75 73 65 20 77 69 74       for use wit
22670 68 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65  h the test suite
22680 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
22690 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 68            if {[h
226a0 61 73 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20  asRuntimeOption 
226b0 61 75 74 6f 53 65 6c 65 63 74 5d 7d 20 74 68 65  autoSelect]} the
226c0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
226d0 20 69 66 20 7b 21 5b 63 68 65 63 6b 46 6f 72 53   if {![checkForS
226e0 51 4c 69 74 65 42 75 69 6c 64 73 20 24 3a 3a 74  QLiteBuilds $::t
226f0 65 73 74 5f 63 68 61 6e 6e 65 6c 20 74 72 75 65  est_channel true
22700 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
22710 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f           checkFo
22720 72 53 51 4c 69 74 65 52 65 6c 65 61 73 65 73 20  rSQLiteReleases 
22730 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
22740 74 72 75 65 0d 0a 20 20 20 20 20 20 20 20 20 20  true..          
22750 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d    }..          }
22760 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  ....          #.
22770 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
22780 45 3a 20 53 6b 69 70 20 74 72 79 69 6e 67 20 74  E: Skip trying t
22790 6f 20 76 65 72 69 66 79 20 74 68 65 20 62 75 69  o verify the bui
227a0 6c 64 20 64 69 72 65 63 74 6f 72 79 20 69 66 20  ld directory if 
227b0 69 6e 73 74 72 75 63 74 65 64 3b 0d 0a 20 20 20  instructed;..   
227c0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6f         #       o
227d0 74 68 65 72 77 69 73 65 2c 20 6d 61 6b 65 20 73  therwise, make s
227e0 75 72 65 20 69 74 20 61 63 74 75 61 6c 6c 79 20  ure it actually 
227f0 65 78 69 73 74 73 20 6f 72 20 68 61 6c 74 20 74  exists or halt t
22800 68 65 20 65 6e 74 69 72 65 0d 0a 20 20 20 20 20  he entire..     
22810 20 20 20 20 20 23 20 20 20 20 20 20 20 74 65 73       #       tes
22820 74 69 6e 67 20 70 72 6f 63 65 73 73 20 69 66 20  ting process if 
22830 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  it does not exis
22840 74 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  t...          #.
22850 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21  .          if {!
22860 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
22870 6f 28 76 65 72 69 66 79 42 75 69 6c 64 44 69 72  o(verifyBuildDir
22880 65 63 74 6f 72 79 29 5d 7d 20 74 68 65 6e 20 7b  ectory)]} then {
22890 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d  ..            #.
228a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e  .            # N
228b0 4f 54 45 3a 20 41 74 20 74 68 69 73 20 70 6f 69  OTE: At this poi
228c0 6e 74 2c 20 74 68 65 20 62 75 69 6c 64 20 64 69  nt, the build di
228d0 72 65 63 74 6f 72 79 20 4d 55 53 54 20 65 78 69  rectory MUST exi
228e0 73 74 20 61 73 20 61 0d 0a 20 20 20 20 20 20 20  st as a..       
228f0 20 20 20 20 20 23 20 20 20 20 20 20 20 76 61 6c       #       val
22900 69 64 20 64 69 72 65 63 74 6f 72 79 20 66 6f 72  id directory for
22910 20 74 68 65 20 74 65 73 74 69 6e 67 20 70 72 6f   the testing pro
22920 63 65 73 73 20 74 6f 20 63 6f 6e 74 69 6e 75 65  cess to continue
22930 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  ...            #
22940 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65  ..            se
22950 74 20 64 69 72 65 63 74 6f 72 79 20 5b 67 65 74  t directory [get
22960 42 75 69 6c 64 44 69 72 65 63 74 6f 72 79 20 66  BuildDirectory f
22970 61 6c 73 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  alse]....       
22980 20 20 20 20 20 69 66 20 7b 21 5b 66 69 6c 65 20       if {![file 
22990 65 78 69 73 74 73 20 24 64 69 72 65 63 74 6f 72  exists $director
229a0 79 5d 20 7c 7c 20 5c 0d 0a 20 20 20 20 20 20 20  y] || \..       
229b0 20 20 20 20 20 20 20 20 20 21 5b 66 69 6c 65 20           ![file 
229c0 69 73 64 69 72 65 63 74 6f 72 79 20 24 64 69 72  isdirectory $dir
229d0 65 63 74 6f 72 79 5d 7d 20 74 68 65 6e 20 7b 0d  ectory]} then {.
229e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
229f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
22a00 23 20 4e 4f 54 45 3a 20 4a 75 73 74 20 70 72 69  # NOTE: Just pri
22a10 6f 72 20 74 6f 20 61 63 74 75 61 6c 6c 79 20 68  or to actually h
22a20 61 6c 74 69 6e 67 20 74 68 65 20 74 65 73 74 69  alting the testi
22a30 6e 67 20 70 72 6f 63 65 73 73 2c 0d 0a 20 20 20  ng process,..   
22a40 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20             #    
22a50 20 20 20 61 64 64 20 61 6e 20 65 72 72 6f 72 20     add an error 
22a60 74 6f 20 74 68 65 20 74 65 73 74 20 6c 6f 67 20  to the test log 
22a70 66 69 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 20  file...         
22a80 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
22a90 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
22aa0 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
22ab0 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
22ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
22ad0 2d 2d 20 63 6f 75 6c 64 20 6e 6f 74 20 76 65 72  -- could not ver
22ae0 69 66 79 20 62 75 69 6c 64 20 64 69 72 65 63 74  ify build direct
22af0 6f 72 79 20 5c 22 22 20 24 64 69 72 65 63 74 6f  ory \"" $directo
22b00 72 79 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ry \..          
22b10 20 20 20 20 20 20 20 20 22 5c 22 2c 20 61 6c 6c          "\", all
22b20 20 74 65 73 74 69 6e 67 20 68 61 6c 74 65 64 5c   testing halted\
22b30 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  n"]....         
22b40 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
22b50 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 61        # NOTE: Ra
22b60 69 73 69 6e 67 20 61 20 73 63 72 69 70 74 20 65  ising a script e
22b70 72 72 6f 72 20 66 72 6f 6d 20 74 68 69 73 20 70  rror from this p
22b80 6f 69 6e 74 20 73 68 6f 75 6c 64 20 68 61 6c 74  oint should halt
22b90 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
22ba0 23 20 20 20 20 20 20 20 74 68 65 20 74 65 73 74  #       the test
22bb0 69 6e 67 20 70 72 6f 63 65 73 73 2e 0d 0a 20 20  ing process...  
22bc0 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
22bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 65 72 72               err
22be0 6f 72 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  or [appendArgs \
22bf0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
22c00 20 20 20 20 22 63 6f 75 6c 64 20 6e 6f 74 20 76      "could not v
22c10 65 72 69 66 79 20 62 75 69 6c 64 20 64 69 72 65  erify build dire
22c20 63 74 6f 72 79 20 5c 22 22 20 24 64 69 72 65 63  ctory \"" $direc
22c30 74 6f 72 79 20 5c 0d 0a 20 20 20 20 20 20 20 20  tory \..        
22c40 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c 20 61            "\", a
22c50 6c 6c 20 74 65 73 74 69 6e 67 20 68 61 6c 74 65  ll testing halte
22c60 64 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  d"]..           
22c70 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d   }..          }.
22c80 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
22c90 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
22ca0 3a 20 53 6b 69 70 20 74 72 79 69 6e 67 20 74 6f  : Skip trying to
22cb0 20 63 6f 70 79 20 61 6e 79 20 66 69 6c 65 73 20   copy any files 
22cc0 69 66 20 69 6e 73 74 72 75 63 74 65 64 2e 0d 0a  if instructed...
22cd0 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
22ce0 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
22cf0 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f  o exists ::no(co
22d00 70 79 53 71 6c 69 74 65 46 69 6c 65 73 29 5d 7d  pySqliteFiles)]}
22d10 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
22d20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
22d30 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79  exists ::no(copy
22d40 53 71 6c 69 74 65 43 6f 6e 66 69 67 46 69 6c 65  SqliteConfigFile
22d50 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  s)]} then {..   
22d60 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
22d70 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
22d80 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
22d90 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 70 79        "---- copy
22da0 69 6e 67 20 5c 22 63 6f 6e 66 69 67 75 72 61 74  ing \"configurat
22db0 69 6f 6e 5c 22 20 66 69 6c 65 73 2e 2e 2e 5c 6e  ion\" files...\n
22dc0 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  "....           
22dd0 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e     foreach fileN
22de0 61 6d 65 20 24 63 6f 6e 66 69 67 46 69 6c 65 4e  ame $configFileN
22df0 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20  ames {..        
22e00 20 20 20 20 20 20 20 20 74 72 79 43 6f 70 79 42          tryCopyB
22e10 75 69 6c 64 46 69 6c 65 20 24 66 69 6c 65 4e 61  uildFile $fileNa
22e20 6d 65 20 66 61 6c 73 65 0d 0a 20 20 20 20 20 20  me false..      
22e30 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
22e40 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
22e50 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
22e60 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63  fo exists ::no(c
22e70 6f 70 79 53 71 6c 69 74 65 45 78 74 65 72 6e 61  opySqliteExterna
22e80 6c 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b  lFiles)]} then {
22e90 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
22ea0 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  #..             
22eb0 20 23 20 4e 4f 54 45 3a 20 43 6f 70 79 20 74 68   # NOTE: Copy th
22ec0 65 20 4d 61 6e 61 67 65 64 20 44 65 62 75 67 67  e Managed Debugg
22ed0 69 6e 67 20 41 73 73 69 73 74 61 6e 74 73 20 28  ing Assistants (
22ee0 4d 44 41 29 20 63 6f 6e 66 69 67 75 72 61 74 69  MDA) configurati
22ef0 6f 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  on..            
22f00 20 20 23 20 20 20 20 20 20 20 66 69 6c 65 20 66    #       file f
22f10 6f 72 20 74 68 65 20 45 61 67 6c 65 20 73 68 65  or the Eagle she
22f20 6c 6c 20 74 6f 20 74 68 65 20 62 75 69 6c 64 20  ll to the build 
22f30 6f 75 74 70 75 74 20 64 69 72 65 63 74 6f 72 79  output directory
22f40 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
22f50 20 23 20 20 20 20 20 20 20 77 68 69 6c 65 20 75   #       while u
22f60 73 69 6e 67 20 65 61 63 68 20 6f 66 20 74 68 65  sing each of the
22f70 20 6e 61 6d 65 73 20 6f 66 20 74 68 65 20 76 61   names of the va
22f80 72 69 6f 75 73 20 6c 65 67 61 63 79 20 74 65 73  rious legacy tes
22f90 74 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t..             
22fa0 20 23 20 20 20 20 20 20 20 65 78 65 63 75 74 61   #       executa
22fb0 62 6c 65 73 2e 20 20 54 68 69 73 20 77 69 6c 6c  bles.  This will
22fc0 20 68 65 6c 70 20 74 6f 20 6d 61 6b 65 20 73 75   help to make su
22fd0 72 65 20 74 68 61 74 20 61 6c 6c 20 74 68 65 0d  re that all the.
22fe0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
22ff0 20 20 20 20 20 20 20 6c 65 67 61 63 79 20 74 65         legacy te
23000 73 74 73 20 72 75 6e 20 77 69 74 68 20 65 78 61  sts run with exa
23010 63 74 6c 79 20 74 68 65 20 73 61 6d 65 20 73 65  ctly the same se
23020 74 20 6f 66 20 4d 61 6e 61 67 65 64 0d 0a 20 20  t of Managed..  
23030 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20              #   
23040 20 20 20 20 44 65 62 75 67 67 69 6e 67 20 41 73      Debugging As
23050 73 69 73 74 61 6e 74 73 20 63 6f 6e 66 69 67 75  sistants configu
23060 72 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  red...          
23070 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
23080 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
23090 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20  st_channel \..  
230a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
230b0 22 2d 2d 2d 2d 20 63 6f 70 79 69 6e 67 20 5c 22  "---- copying \"
230c0 4d 44 41 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  MDA configuratio
230d0 6e 5c 22 20 66 69 6c 65 73 2e 2e 2e 5c 6e 22 0d  n\" files...\n".
230e0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
230f0 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d   foreach fileNam
23100 65 20 24 6d 64 61 43 6f 6e 66 69 67 46 69 6c 65  e $mdaConfigFile
23110 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20  Names {..       
23120 20 20 20 20 20 20 20 20 20 74 72 79 43 6f 70 79           tryCopy
23130 42 69 6e 61 72 79 46 69 6c 65 20 45 61 67 6c 65  BinaryFile Eagle
23140 53 68 65 6c 6c 2e 65 78 65 2e 6d 64 61 2e 63 6f  Shell.exe.mda.co
23150 6e 66 69 67 20 74 72 75 65 20 22 22 20 24 66 69  nfig true "" $fi
23160 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20  leName..        
23170 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
23180 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
23190 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
231a0 3a 20 43 6f 70 79 20 74 68 65 20 65 78 74 65 72  : Copy the exter
231b0 6e 61 6c 20 62 69 6e 61 72 69 65 73 2c 20 69 66  nal binaries, if
231c0 20 61 6e 79 2c 20 74 6f 20 74 68 65 20 64 69 72   any, to the dir
231d0 65 63 74 6f 72 79 20 74 68 61 74 0d 0a 20 20 20  ectory that..   
231e0 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20             #    
231f0 20 20 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20     contains the 
23200 45 61 67 6c 65 20 73 68 65 6c 6c 2e 20 20 54 68  Eagle shell.  Th
23210 69 73 20 69 73 20 74 79 70 69 63 61 6c 6c 79 20  is is typically 
23220 75 73 65 64 20 74 6f 20 6d 61 6b 65 0d 0a 20 20  used to make..  
23230 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20              #   
23240 20 20 20 20 73 75 72 65 20 61 73 73 65 6d 62 6c      sure assembl
23250 69 65 73 20 72 65 66 65 72 65 6e 63 65 64 20 62  ies referenced b
23260 79 20 74 68 65 20 6f 6e 65 73 20 62 65 69 6e 67  y the ones being
23270 20 74 65 73 74 65 64 20 61 72 65 0d 0a 20 20 20   tested are..   
23280 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20             #    
23290 20 20 20 61 76 61 69 6c 61 62 6c 65 20 64 75 72     available dur
232a0 69 6e 67 20 74 68 65 20 74 65 73 74 69 6e 67 20  ing the testing 
232b0 70 72 6f 63 65 73 73 2e 0d 0a 20 20 20 20 20 20  process...      
232c0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
232d0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
232e0 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 22  ::test_channel "
232f0 2d 2d 2d 2d 20 63 6f 70 79 69 6e 67 20 5c 22 65  ---- copying \"e
23300 78 74 65 72 6e 61 6c 5c 22 20 66 69 6c 65 73 2e  xternal\" files.
23310 2e 2e 5c 6e 22 0d 0a 0d 0a 20 20 20 20 20 20 20  ..\n"....       
23320 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66         foreach f
23330 69 6c 65 4e 61 6d 65 20 24 65 78 74 65 72 6e 61  ileName $externa
23340 6c 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20  lFileNames {..  
23350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72                tr
23360 79 43 6f 70 79 45 78 74 65 72 6e 61 6c 46 69 6c  yCopyExternalFil
23370 65 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20  e $fileName..   
23380 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
23390 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
233a0 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
233b0 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
233c0 6f 28 63 6f 70 79 53 71 6c 69 74 65 4e 61 74 69  o(copySqliteNati
233d0 76 65 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20  veFiles)]} then 
233e0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
233f0 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
23400 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 74 68 65    # NOTE: If the
23410 20 74 65 73 74 20 70 6c 61 74 66 6f 72 6d 20 69   test platform i
23420 73 20 6c 69 6b 65 6c 79 20 74 68 65 20 64 65 66  s likely the def
23430 61 75 6c 74 20 66 6f 72 20 74 68 69 73 0d 0a 20  ault for this.. 
23440 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20               #  
23450 20 20 20 20 20 6d 61 63 68 69 6e 65 2c 20 61 6c       machine, al
23460 73 6f 20 74 72 79 20 74 6f 20 63 6f 70 79 20 74  so try to copy t
23470 68 65 20 6e 61 74 69 76 65 20 66 69 6c 65 73 20  he native files 
23480 74 6f 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20  to the..        
23490 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62 69        #       bi
234a0 6e 61 72 79 20 6c 6f 63 61 74 69 6f 6e 2e 0d 0a  nary location...
234b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
234c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
234d0 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
234e0 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65   ::no(copySqlite
234f0 49 6d 70 6c 69 63 69 74 4e 61 74 69 76 65 46 69  ImplicitNativeFi
23500 6c 65 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20  les)] && \..    
23510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 69                [i
23520 73 44 65 66 61 75 6c 74 42 75 69 6c 64 50 6c 61  sDefaultBuildPla
23530 74 66 6f 72 6d 5d 7d 20 74 68 65 6e 20 7b 0d 0a  tform]} then {..
23540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23550 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
23560 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20  annel \..       
23570 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
23580 2d 2d 20 63 6f 70 79 69 6e 67 20 69 6d 70 6c 69  -- copying impli
23590 63 69 74 20 5c 22 6e 61 74 69 76 65 5c 22 20 66  cit \"native\" f
235a0 69 6c 65 73 2e 2e 2e 5c 6e 22 0d 0a 0d 0a 20 20  iles...\n"....  
235b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f                fo
235c0 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24  reach fileName $
235d0 6e 61 74 69 76 65 46 69 6c 65 4e 61 6d 65 73 20  nativeFileNames 
235e0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
235f0 20 20 20 20 20 74 72 79 43 6f 70 79 41 73 73 65       tryCopyAsse
23600 6d 62 6c 79 20 24 66 69 6c 65 4e 61 6d 65 20 66  mbly $fileName f
23610 61 6c 73 65 0d 0a 20 20 20 20 20 20 20 20 20 20  alse..          
23620 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
23630 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
23640 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
23650 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
23660 28 63 6f 70 79 53 71 6c 69 74 65 4e 6f 6e 49 6d  (copySqliteNonIm
23670 70 6c 69 63 69 74 46 69 6c 65 73 29 5d 7d 20 74  plicitFiles)]} t
23680 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
23690 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
236a0 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f  o exists ::no(co
236b0 70 79 53 71 6c 69 74 65 50 6c 61 74 66 6f 72 6d  pySqlitePlatform
236c0 46 69 6c 65 73 29 5d 20 26 26 20 5c 0d 0a 20 20  Files)] && \..  
236d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
236e0 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
236f0 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3e 20 30 7d   $platform] > 0}
23700 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
23710 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
23720 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
23730 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
23740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23750 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 70 79        "---- copy
23760 69 6e 67 20 5c 22 6e 61 74 69 76 65 5c 22 20 66  ing \"native\" f
23770 69 6c 65 73 20 66 6f 72 20 70 6c 61 74 66 6f 72  iles for platfor
23780 6d 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20  m \"" \..       
23790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24                 $
237a0 70 6c 61 74 66 6f 72 6d 20 5c 22 2e 2e 2e 5c 6e  platform \"...\n
237b0 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ]....           
237c0 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66         foreach f
237d0 69 6c 65 4e 61 6d 65 20 24 6e 61 74 69 76 65 46  ileName $nativeF
237e0 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20  ileNames {..    
237f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23800 74 72 79 43 6f 70 79 41 73 73 65 6d 62 6c 79 20  tryCopyAssembly 
23810 24 66 69 6c 65 4e 61 6d 65 20 66 61 6c 73 65 20  $fileName false 
23820 24 70 6c 61 74 66 6f 72 6d 0d 0a 20 20 20 20 20  $platform..     
23830 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
23840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23850 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
23860 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
23870 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79  exists ::no(copy
23880 53 71 6c 69 74 65 41 72 63 68 69 74 65 63 74 75  SqliteArchitectu
23890 72 65 46 69 6c 65 73 29 5d 20 26 26 20 5c 0d 0a  reFiles)] && \..
238a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
238b0 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67      [string leng
238c0 74 68 20 24 61 72 63 68 69 74 65 63 74 75 72 65  th $architecture
238d0 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
238e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
238f0 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
23900 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
23910 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
23920 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
23930 2d 20 63 6f 70 79 69 6e 67 20 5c 22 6e 61 74 69  - copying \"nati
23940 76 65 5c 22 20 66 69 6c 65 73 20 66 6f 72 20 61  ve\" files for a
23950 72 63 68 69 74 65 63 74 75 72 65 20 5c 22 22 20  rchitecture \"" 
23960 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
23970 20 20 20 20 20 20 20 20 20 24 61 72 63 68 69 74           $archit
23980 65 63 74 75 72 65 20 5c 22 2e 2e 2e 5c 6e 5d 0d  ecture \"...\n].
23990 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
239a0 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c       foreach fil
239b0 65 4e 61 6d 65 20 24 6e 61 74 69 76 65 46 69 6c  eName $nativeFil
239c0 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20  eNames {..      
239d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72                tr
239e0 79 43 6f 70 79 41 73 73 65 6d 62 6c 79 20 24 66  yCopyAssembly $f
239f0 69 6c 65 4e 61 6d 65 20 66 61 6c 73 65 20 24 61  ileName false $a
23a00 72 63 68 69 74 65 63 74 75 72 65 0d 0a 20 20 20  rchitecture..   
23a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
23a20 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
23a30 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
23a40 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
23a50 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
23a60 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
23a70 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71  ists ::no(copySq
23a80 6c 69 74 65 4d 69 78 65 64 46 69 6c 65 73 29 5d  liteMixedFiles)]
23a90 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
23aa0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
23ab0 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
23ac0 20 49 66 20 74 68 65 20 22 6e 61 74 69 76 65 22   If the "native"
23ad0 20 72 75 6e 74 69 6d 65 20 6f 70 74 69 6f 6e 20   runtime option 
23ae0 69 73 20 73 65 74 2c 20 63 6f 70 79 20 69 6d 70  is set, copy imp
23af0 6c 69 63 69 74 0d 0a 20 20 20 20 20 20 20 20 20  licit..         
23b00 20 20 20 20 20 23 20 20 20 20 20 20 20 6d 69 78       #       mix
23b10 65 64 2d 6d 6f 64 65 20 61 73 73 65 6d 62 6c 79  ed-mode assembly
23b20 20 66 69 6c 65 73 20 61 73 20 77 65 6c 6c 2e 20   files as well. 
23b30 20 54 68 65 20 72 75 6e 74 69 6d 65 20 6f 70 74   The runtime opt
23b40 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ion..           
23b50 20 20 20 23 20 20 20 20 20 20 20 63 68 65 63 6b     #       check
23b60 20 69 73 20 68 61 6e 64 6c 65 64 20 77 68 65 6e   is handled when
23b70 20 62 75 69 6c 64 69 6e 67 20 74 68 65 20 6c 69   building the li
23b80 73 74 20 6f 66 20 6d 69 78 65 64 2d 6d 6f 64 65  st of mixed-mode
23b90 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
23ba0 23 20 20 20 20 20 20 20 61 73 73 65 6d 62 6c 79  #       assembly
23bb0 20 66 69 6c 65 20 6e 61 6d 65 73 2e 0d 0a 20 20   file names...  
23bc0 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
23bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
23be0 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
23bf0 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65 49 6d  :no(copySqliteIm
23c00 70 6c 69 63 69 74 4d 69 78 65 64 46 69 6c 65 73  plicitMixedFiles
23c10 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
23c20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
23c30 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
23c40 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  l \..           
23c50 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63           "---- c
23c60 6f 70 79 69 6e 67 20 69 6d 70 6c 69 63 69 74 20  opying implicit 
23c70 5c 22 6d 69 78 65 64 5c 22 20 66 69 6c 65 73 2e  \"mixed\" files.
23c80 2e 2e 5c 6e 22 0d 0a 0d 0a 20 20 20 20 20 20 20  ..\n"....       
23c90 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
23ca0 20 66 69 6c 65 4e 61 6d 65 20 24 6d 69 78 65 64   fileName $mixed
23cb0 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20  FileNames {..   
23cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
23cd0 72 79 43 6f 70 79 41 73 73 65 6d 62 6c 79 20 24  ryCopyAssembly $
23ce0 66 69 6c 65 4e 61 6d 65 20 66 61 6c 73 65 0d 0a  fileName false..
23cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d00 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  }..             
23d10 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
23d20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
23d30 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53  xists ::no(copyS
23d40 71 6c 69 74 65 4e 6f 6e 49 6d 70 6c 69 63 69 74  qliteNonImplicit
23d50 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d  Files)]} then {.
23d60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23d70 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
23d80 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69  ts ::no(copySqli
23d90 74 65 50 6c 61 74 66 6f 72 6d 46 69 6c 65 73 29  tePlatformFiles)
23da0 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
23db0 20 20 20 20 20 20 20 20 20 20 20 20 5b 73 74 72              [str
23dc0 69 6e 67 20 6c 65 6e 67 74 68 20 24 70 6c 61 74  ing length $plat
23dd0 66 6f 72 6d 5d 20 3e 20 30 7d 20 74 68 65 6e 20  form] > 0} then 
23de0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
23df0 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
23e00 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
23e10 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
23e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23e30 22 2d 2d 2d 2d 20 63 6f 70 79 69 6e 67 20 5c 22  "---- copying \"
23e40 6d 69 78 65 64 5c 22 20 66 69 6c 65 73 20 66 6f  mixed\" files fo
23e50 72 20 70 6c 61 74 66 6f 72 6d 20 5c 22 22 20 5c  r platform \"" \
23e60 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
23e70 20 20 20 20 20 20 20 20 24 70 6c 61 74 66 6f 72          $platfor
23e80 6d 20 5c 22 2e 2e 2e 5c 6e 5d 0d 0a 0d 0a 20 20  m \"...\n]....  
23e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ea0 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65  foreach fileName
23eb0 20 24 6d 69 78 65 64 46 69 6c 65 4e 61 6d 65 73   $mixedFileNames
23ec0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
23ed0 20 20 20 20 20 20 20 20 74 72 79 43 6f 70 79 41          tryCopyA
23ee0 73 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61 6d  ssembly $fileNam
23ef0 65 20 66 61 6c 73 65 20 24 70 6c 61 74 66 6f 72  e false $platfor
23f00 6d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  m..             
23f10 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
23f20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
23f30 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
23f40 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
23f50 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65 41 72  :no(copySqliteAr
23f60 63 68 69 74 65 63 74 75 72 65 46 69 6c 65 73 29  chitectureFiles)
23f70 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
23f80 20 20 20 20 20 20 20 20 20 20 20 20 5b 73 74 72              [str
23f90 69 6e 67 20 6c 65 6e 67 74 68 20 24 61 72 63 68  ing length $arch
23fa0 69 74 65 63 74 75 72 65 5d 20 3e 20 30 7d 20 74  itecture] > 0} t
23fb0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
23fc0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
23fd0 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
23fe0 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
23ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24000 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 70 79 69 6e      "---- copyin
24010 67 20 5c 22 6d 69 78 65 64 5c 22 20 66 69 6c 65  g \"mixed\" file
24020 73 20 66 6f 72 20 61 72 63 68 69 74 65 63 74 75  s for architectu
24030 72 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20  re \"" \..      
24040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24050 24 61 72 63 68 69 74 65 63 74 75 72 65 20 5c 22  $architecture \"
24060 2e 2e 2e 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20  ...\n]....      
24070 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65              fore
24080 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6d 69  ach fileName $mi
24090 78 65 64 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a  xedFileNames {..
240a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
240b0 20 20 20 20 74 72 79 43 6f 70 79 41 73 73 65 6d      tryCopyAssem
240c0 62 6c 79 20 24 66 69 6c 65 4e 61 6d 65 20 66 61  bly $fileName fa
240d0 6c 73 65 20 24 61 72 63 68 69 74 65 63 74 75 72  lse $architectur
240e0 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e..             
240f0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
24100 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
24110 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
24120 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
24130 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69           if {![i
24140 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
24150 63 6f 70 79 53 71 6c 69 74 65 4d 61 6e 61 67 65  copySqliteManage
24160 64 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b  dFiles)]} then {
24170 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
24180 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
24190 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 6f 70 79  annel "---- copy
241a0 69 6e 67 20 5c 22 6d 61 6e 61 67 65 64 5c 22 20  ing \"managed\" 
241b0 66 69 6c 65 73 2e 2e 2e 5c 6e 22 0d 0a 0d 0a 20  files...\n".... 
241c0 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
241d0 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6d  each fileName $m
241e0 61 6e 61 67 65 64 46 69 6c 65 4e 61 6d 65 73 20  anagedFileNames 
241f0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
24200 20 20 20 74 72 79 43 6f 70 79 41 73 73 65 6d 62     tryCopyAssemb
24210 6c 79 20 24 66 69 6c 65 4e 61 6d 65 20 74 72 75  ly $fileName tru
24220 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e..             
24230 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
24240 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  }..          }..
24250 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
24260 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
24270 20 53 6b 69 70 20 74 72 79 69 6e 67 20 74 6f 20   Skip trying to 
24280 6c 6f 61 64 20 61 6e 79 20 66 69 6c 65 73 20 69  load any files i
24290 66 20 69 6e 73 74 72 75 63 74 65 64 2e 0d 0a 20  f instructed... 
242a0 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
242b0 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
242c0 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 6c 6f 61   exists ::no(loa
242d0 64 53 71 6c 69 74 65 46 69 6c 65 73 29 5d 7d 20  dSqliteFiles)]} 
242e0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
242f0 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
24300 78 69 73 74 73 20 3a 3a 6e 6f 28 6c 6f 61 64 53  xists ::no(loadS
24310 71 6c 69 74 65 49 6d 70 6c 69 63 69 74 46 69 6c  qliteImplicitFil
24320 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  es)]} then {..  
24330 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79 4c              tryL
24340 6f 61 64 41 73 73 65 6d 62 6c 79 20 53 79 73 74  oadAssembly Syst
24350 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64  em.Data.SQLite.d
24360 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ll..            
24370 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
24380 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
24390 74 73 20 3a 3a 6e 6f 28 6c 6f 61 64 53 71 6c 69  ts ::no(loadSqli
243a0 74 65 4c 69 6e 71 46 69 6c 65 73 29 5d 7d 20 74  teLinqFiles)]} t
243b0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
243c0 20 20 20 20 20 74 72 79 4c 6f 61 64 41 73 73 65       tryLoadAsse
243d0 6d 62 6c 79 20 53 79 73 74 65 6d 2e 44 61 74 61  mbly System.Data
243e0 2e 53 51 4c 69 74 65 2e 4c 69 6e 71 2e 64 6c 6c  .SQLite.Linq.dll
243f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
24400 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ...            i
24410 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
24420 20 3a 3a 6e 6f 28 6c 6f 61 64 53 71 6c 69 74 65   ::no(loadSqlite
24430 45 66 36 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e  Ef6Files)]} then
24440 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
24450 20 20 74 72 79 4c 6f 61 64 41 73 73 65 6d 62 6c    tryLoadAssembl
24460 79 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  y System.Data.SQ
24470 4c 69 74 65 2e 45 46 36 2e 64 6c 6c 0d 0a 20 20  Lite.EF6.dll..  
24480 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
24490 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
244a0 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
244b0 6f 28 6c 6f 61 64 53 71 6c 69 74 65 4e 6f 6e 49  o(loadSqliteNonI
244c0 6d 70 6c 69 63 69 74 46 69 6c 65 73 29 5d 7d 20  mplicitFiles)]} 
244d0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
244e0 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
244f0 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 6c 6f 61   exists ::no(loa
24500 64 53 71 6c 69 74 65 50 6c 61 74 66 6f 72 6d 46  dSqlitePlatformF
24510 69 6c 65 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20  iles)] && \..   
24520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b                 [
24530 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 70  string length $p
24540 6c 61 74 66 6f 72 6d 5d 20 3e 20 30 7d 20 74 68  latform] > 0} th
24550 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
24560 20 20 20 20 20 20 74 72 79 4c 6f 61 64 41 73 73        tryLoadAss
24570 65 6d 62 6c 79 20 53 79 73 74 65 6d 2e 44 61 74  embly System.Dat
24580 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 20 24 70 6c  a.SQLite.dll $pl
24590 61 74 66 6f 72 6d 0d 0a 20 20 20 20 20 20 20 20  atform..        
245a0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
245b0 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69           if {![i
245c0 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
245d0 6c 6f 61 64 53 71 6c 69 74 65 41 72 63 68 69 74  loadSqliteArchit
245e0 65 63 74 75 72 65 46 69 6c 65 73 29 5d 20 26 26  ectureFiles)] &&
245f0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
24600 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65        [string le
24610 6e 67 74 68 20 24 61 72 63 68 69 74 65 63 74 75  ngth $architectu
24620 72 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  re] > 0} then {.
24630 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
24640 20 74 72 79 4c 6f 61 64 41 73 73 65 6d 62 6c 79   tryLoadAssembly
24650 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
24660 69 74 65 2e 64 6c 6c 20 24 61 72 63 68 69 74 65  ite.dll $archite
24670 63 74 75 72 65 0d 0a 20 20 20 20 20 20 20 20 20  cture..         
24680 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
24690 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
246a0 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d   }..        }...
246b0 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68  .        foreach
246c0 20 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 24 6e   fileNameOnly $n
246d0 61 74 69 76 65 46 69 6c 65 4e 61 6d 65 73 20 7b  ativeFileNames {
246e0 0d 0a 20 20 20 20 20 20 20 20 20 20 63 61 74 63  ..          catc
246f0 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  h {..           
24700 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
24710 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
24720 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
24730 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65        "---- file
24740 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22 22 20   version of \"" 
24750 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 22 5c  $fileNameOnly "\
24760 22 2e 2e 2e 20 5c 22 22 20 5c 0d 0a 20 20 20 20  "... \"" \..    
24770 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c              [fil
24780 65 20 76 65 72 73 69 6f 6e 20 5b 67 65 74 42 69  e version [getBi
24790 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 24 66 69  naryFileName $fi
247a0 6c 65 4e 61 6d 65 4f 6e 6c 79 5d 5d 20 5c 22 5c  leNameOnly]] \"\
247b0 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  n]..          }.
247c0 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
247d0 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69        foreach fi
247e0 6c 65 4e 61 6d 65 4f 6e 6c 79 20 24 6d 69 78 65  leNameOnly $mixe
247f0 64 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20  dFileNames {..  
24800 20 20 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d          catch {.
24810 0a 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 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72    "---- file ver
24860 73 69 6f 6e 20 6f 66 20 5c 22 22 20 24 66 69 6c  sion of \"" $fil
24870 65 4e 61 6d 65 4f 6e 6c 79 20 22 5c 22 2e 2e 2e  eNameOnly "\"...
24880 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20   \"" \..        
24890 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 76 65          [file ve
248a0 72 73 69 6f 6e 20 5b 67 65 74 42 69 6e 61 72 79  rsion [getBinary
248b0 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61  FileName $fileNa
248c0 6d 65 4f 6e 6c 79 5d 5d 20 5c 22 5c 6e 5d 0d 0a  meOnly]] \"\n]..
248d0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
248e0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
248f0 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61    foreach fileNa
24900 6d 65 4f 6e 6c 79 20 24 6d 61 6e 61 67 65 64 46  meOnly $managedF
24910 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20  ileNames {..    
24920 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20        catch {.. 
24930 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
24940 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
24950 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
24960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24970 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73 69  "---- file versi
24980 6f 6e 20 6f 66 20 5c 22 22 20 24 66 69 6c 65 4e  on of \"" $fileN
24990 61 6d 65 4f 6e 6c 79 20 22 5c 22 2e 2e 2e 20 5c  ameOnly "\"... \
249a0 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  "" \..          
249b0 20 20 20 20 20 20 5b 66 69 6c 65 20 76 65 72 73        [file vers
249c0 69 6f 6e 20 5b 67 65 74 42 69 6e 61 72 79 46 69  ion [getBinaryFi
249d0 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65  leName $fileName
249e0 4f 6e 6c 79 5d 5d 20 5c 22 5c 6e 5d 0d 0a 20 20  Only]] \"\n]..  
249f0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
24a00 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
24a10 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
24a20 74 68 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3e 20  th $platform] > 
24a30 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
24a40 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c       foreach fil
24a50 65 4e 61 6d 65 4f 6e 6c 79 20 24 6e 61 74 69 76  eNameOnly $nativ
24a60 65 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20  eFileNames {..  
24a70 20 20 20 20 20 20 20 20 20 20 63 61 74 63 68 20            catch 
24a80 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
24a90 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
24aa0 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
24ab0 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
24ac0 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69          "---- fi
24ad0 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22  le version of \"
24ae0 22 20 24 70 6c 61 74 66 6f 72 6d 20 5c 0d 0a 20  " $platform \.. 
24af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b00 20 2f 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79   / $fileNameOnly
24b10 20 22 5c 22 2e 2e 2e 20 5c 22 22 20 5b 66 69 6c   "\"... \"" [fil
24b20 65 20 76 65 72 73 69 6f 6e 20 5c 0d 0a 20 20 20  e version \..   
24b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b                 [
24b40 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d  getBinaryFileNam
24b50 65 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20  e $fileNameOnly 
24b60 24 70 6c 61 74 66 6f 72 6d 5d 5d 20 5c 22 5c 6e  $platform]] \"\n
24b70 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ]..            }
24b80 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d  ..          }...
24b90 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61  .          forea
24ba0 63 68 20 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20  ch fileNameOnly 
24bb0 24 6d 69 78 65 64 46 69 6c 65 4e 61 6d 65 73 20  $mixedFileNames 
24bc0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  {..            c
24bd0 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
24be0 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
24bf0 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
24c00 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
24c10 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
24c20 2d 2d 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 20  -- file version 
24c30 6f 66 20 5c 22 22 20 24 70 6c 61 74 66 6f 72 6d  of \"" $platform
24c40 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
24c50 20 20 20 20 20 20 2f 20 24 66 69 6c 65 4e 61 6d        / $fileNam
24c60 65 4f 6e 6c 79 20 22 5c 22 2e 2e 2e 20 5c 22 22  eOnly "\"... \""
24c70 20 5b 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 5c   [file version \
24c80 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
24c90 20 20 20 20 5b 67 65 74 42 69 6e 61 72 79 46 69      [getBinaryFi
24ca0 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65  leName $fileName
24cb0 4f 6e 6c 79 20 24 70 6c 61 74 66 6f 72 6d 5d 5d  Only $platform]]
24cc0 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20   \"\n]..        
24cd0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
24ce0 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d   }..        }...
24cf0 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74  .        if {[st
24d00 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 61 72 63  ring length $arc
24d10 68 69 74 65 63 74 75 72 65 5d 20 3e 20 30 7d 20  hitecture] > 0} 
24d20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
24d30 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61    foreach fileNa
24d40 6d 65 4f 6e 6c 79 20 24 6e 61 74 69 76 65 46 69  meOnly $nativeFi
24d50 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20  leNames {..     
24d60 20 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a         catch {..
24d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70                tp
24d80 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
24d90 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
24da0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
24db0 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20       "---- file 
24dc0 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22 22 20 24  version of \"" $
24dd0 61 72 63 68 69 74 65 63 74 75 72 65 20 5c 0d 0a  architecture \..
24de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24df0 20 20 2f 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c    / $fileNameOnl
24e00 79 20 22 5c 22 2e 2e 2e 20 5c 22 22 20 5b 66 69  y "\"... \"" [fi
24e10 6c 65 20 76 65 72 73 69 6f 6e 20 5c 0d 0a 20 20  le version \..  
24e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e30 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61  [getBinaryFileNa
24e40 6d 65 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79  me $fileNameOnly
24e50 20 24 61 72 63 68 69 74 65 63 74 75 72 65 5d 5d   $architecture]]
24e60 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20   \"\n]..        
24e70 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
24e80 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
24e90 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65  foreach fileName
24ea0 4f 6e 6c 79 20 24 6d 69 78 65 64 46 69 6c 65 4e  Only $mixedFileN
24eb0 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20  ames {..        
24ec0 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20      catch {..   
24ed0 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
24ee0 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
24ef0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
24f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24f10 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72    "---- file ver
24f20 73 69 6f 6e 20 6f 66 20 5c 22 22 20 24 61 72 63  sion of \"" $arc
24f30 68 69 74 65 63 74 75 72 65 20 5c 0d 0a 20 20 20  hitecture \..   
24f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24f50 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 22   $fileNameOnly "
24f60 5c 22 2e 2e 2e 20 5c 22 22 20 5b 66 69 6c 65 20  \"... \"" [file 
24f70 76 65 72 73 69 6f 6e 20 5c 0d 0a 20 20 20 20 20  version \..     
24f80 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65               [ge
24f90 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20  tBinaryFileName 
24fa0 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 24 61  $fileNameOnly $a
24fb0 72 63 68 69 74 65 63 74 75 72 65 5d 5d 20 5c 22  rchitecture]] \"
24fc0 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  \n]..           
24fd0 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d   }..          }.
24fe0 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
24ff0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
25000 20 23 20 4e 4f 54 45 3a 20 47 72 61 62 20 74 68   # NOTE: Grab th
25010 65 20 6c 69 73 74 20 6f 66 20 6d 61 6e 61 67 65  e list of manage
25020 64 20 61 73 73 65 6d 62 6c 69 65 73 20 66 6f 72  d assemblies for
25030 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 72 6f   the current pro
25040 63 65 73 73 0d 0a 20 20 20 20 20 20 20 20 23 20  cess..        # 
25050 20 20 20 20 20 20 61 6e 64 20 72 65 70 6f 72 74        and report
25060 20 6f 6e 20 74 68 65 20 53 79 73 74 65 6d 2e 44   on the System.D
25070 61 74 61 2e 53 51 4c 69 74 65 20 72 65 6c 61 74  ata.SQLite relat
25080 65 64 20 6f 6e 65 73 2e 0d 0a 20 20 20 20 20 20  ed ones...      
25090 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20    #..        if 
250a0 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f 62 6a 65  {[haveSQLiteObje
250b0 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65 6e  ctCommand]} then
250c0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   {..          se
250d0 74 20 61 73 73 65 6d 62 6c 69 65 73 20 5b 6f 62  t assemblies [ob
250e0 6a 65 63 74 20 69 6e 76 6f 6b 65 20 41 70 70 44  ject invoke AppD
250f0 6f 6d 61 69 6e 2e 43 75 72 72 65 6e 74 44 6f 6d  omain.CurrentDom
25100 61 69 6e 20 47 65 74 41 73 73 65 6d 62 6c 69 65  ain GetAssemblie
25110 73 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  s]....          
25120 6f 62 6a 65 63 74 20 66 6f 72 65 61 63 68 20 61  object foreach a
25130 73 73 65 6d 62 6c 79 20 24 61 73 73 65 6d 62 6c  ssembly $assembl
25140 69 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  ies {..         
25150 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6d     if {[string m
25160 61 74 63 68 20 5c 7b 53 79 73 74 65 6d 2e 44 61  atch \{System.Da
25170 74 61 2e 53 51 4c 69 74 65 2a 20 24 61 73 73 65  ta.SQLite* $asse
25180 6d 62 6c 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  mbly]} then {.. 
25190 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
251a0 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
251b0 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
251c0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
251d0 20 20 20 20 22 2d 2d 2d 2d 20 66 6f 75 6e 64 20      "---- found 
251e0 6c 6f 61 64 65 64 20 61 73 73 65 6d 62 6c 79 3a  loaded assembly:
251f0 20 22 20 24 61 73 73 65 6d 62 6c 79 20 5c 6e 5d   " $assembly \n]
25200 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
25210 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
25220 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
25230 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20     catch {..    
25240 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
25250 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20  est_channel \.. 
25260 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
25270 2d 2d 20 64 65 66 69 6e 65 20 63 6f 6e 73 74 61  -- define consta
25280 6e 74 73 20 66 6f 72 20 5c 22 53 79 73 74 65 6d  nts for \"System
25290 2e 44 61 74 61 2e 53 51 4c 69 74 65 5c 22 2e 2e  .Data.SQLite\"..
252a0 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  . "....         
252b0 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
252c0 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63             objec
252d0 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20  t invoke -flags 
252e0 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20  +NonPublic \..  
252f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79                Sy
25300 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
25310 2e 53 51 4c 69 74 65 33 20 44 65 66 69 6e 65 43  .SQLite3 DefineC
25320 6f 6e 73 74 61 6e 74 73 0d 0a 20 20 20 20 20 20  onstants..      
25330 20 20 20 20 7d 20 64 65 66 69 6e 65 43 6f 6e 73      } defineCons
25340 74 61 6e 74 73 5d 20 3d 3d 20 30 7d 20 74 68 65  tants] == 0} the
25350 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
25360 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
25370 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
25380 67 73 20 5b 66 6f 72 6d 61 74 4c 69 73 74 20 5b  gs [formatList [
25390 6c 73 6f 72 74 20 5c 0d 0a 20 20 20 20 20 20 20  lsort \..       
253a0 20 20 20 20 20 20 20 20 20 24 64 65 66 69 6e 65           $define
253b0 43 6f 6e 73 74 61 6e 74 73 5d 20 3c 6e 6f 6e 65  Constants] <none
253c0 3e 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  >] \n]..        
253d0 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
253e0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
253f0 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 75 6e  :test_channel un
25400 6b 6e 6f 77 6e 5c 6e 0d 0a 20 20 20 20 20 20 20  known\n..       
25410 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
25420 0a 0d 0a 20 20 20 20 20 20 20 20 63 61 74 63 68  ...        catch
25430 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70   {..          tp
25440 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
25450 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  nel \..         
25460 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6f 75 72 63       "---- sourc
25470 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22 53  e version of \"S
25480 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
25490 65 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 0d 0a 0d 0a  e.dll\"... "....
254a0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63            if {[c
254b0 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
254c0 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b      object invok
254d0 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62  e -flags +NonPub
254e0 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  lic \..         
254f0 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61         System.Da
25500 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65  ta.SQLite.SQLite
25510 43 6f 6e 6e 65 63 74 69 6f 6e 20 50 72 6f 76 69  Connection Provi
25520 64 65 72 56 65 72 73 69 6f 6e 0d 0a 20 20 20 20  derVersion..    
25530 20 20 20 20 20 20 7d 20 76 65 72 73 69 6f 6e 5d        } version]
25540 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
25550 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b             if {[
25560 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76  string length $v
25570 65 72 73 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68  ersion] == 0} th
25580 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
25590 20 20 20 20 73 65 74 20 76 65 72 73 69 6f 6e 20      set version 
255a0 6e 75 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20 20  null..          
255b0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
255c0 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
255d0 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
255e0 67 73 20 24 76 65 72 73 69 6f 6e 20 5c 6e 5d 0d  gs $version \n].
255f0 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73  .          } els
25600 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e {..           
25610 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
25620 68 61 6e 6e 65 6c 20 75 6e 6b 6e 6f 77 6e 5c 6e  hannel unknown\n
25630 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
25640 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
25650 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20      catch {..   
25660 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
25670 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a  test_channel \..
25680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
25690 2d 2d 2d 20 73 6f 75 72 63 65 20 63 68 65 63 6b  --- source check
256a0 6f 75 74 20 6f 66 20 5c 22 53 79 73 74 65 6d 2e  out of \"System.
256b0 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 5c  Data.SQLite.dll\
256c0 22 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20  "... "....      
256d0 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
256e0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 62  ..            ob
256f0 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61  ject invoke -fla
25700 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d  gs +NonPublic \.
25710 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25720 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
25730 69 74 65 2e 53 51 4c 69 74 65 43 6f 6e 6e 65 63  ite.SQLiteConnec
25740 74 69 6f 6e 20 50 72 6f 76 69 64 65 72 53 6f 75  tion ProviderSou
25750 72 63 65 49 64 0d 0a 20 20 20 20 20 20 20 20 20  rceId..         
25760 20 7d 20 73 6f 75 72 63 65 49 64 5d 20 3d 3d 20   } sourceId] == 
25770 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
25780 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69         if {[stri
25790 6e 67 20 6c 65 6e 67 74 68 20 24 73 6f 75 72 63  ng length $sourc
257a0 65 49 64 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  eId] == 0} then 
257b0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
257c0 20 73 65 74 20 73 6f 75 72 63 65 49 64 20 6e 75   set sourceId nu
257d0 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ll..            
257e0 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  }..            t
257f0 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
25800 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
25810 20 24 73 6f 75 72 63 65 49 64 20 5c 6e 5d 0d 0a   $sourceId \n]..
25820 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
25830 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
25840 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
25850 61 6e 6e 65 6c 20 75 6e 6b 6e 6f 77 6e 5c 6e 0d  annel unknown\n.
25860 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
25870 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
25880 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
25890 4e 4f 54 45 3a 20 43 68 65 63 6b 20 74 68 65 20  NOTE: Check the 
258a0 61 76 61 69 6c 61 62 6c 65 20 62 75 69 6c 64 73  available builds
258b0 20 28 61 6e 64 20 22 72 65 6c 65 61 73 65 73 22   (and "releases"
258c0 29 20 6f 66 20 53 51 4c 69 74 65 20 61 6e 64 0d  ) of SQLite and.
258d0 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
258e0 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
258f0 69 74 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ite...        #.
25900 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f  .        checkFo
25910 72 53 51 4c 69 74 65 42 75 69 6c 64 73 20 24 3a  rSQLiteBuilds $:
25920 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 20  :test_channel.. 
25930 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53         checkForS
25940 51 4c 69 74 65 52 65 6c 65 61 73 65 73 20 24 3a  QLiteReleases $:
25950 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d  :test_channel...
25960 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
25970 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e 6f 77 2c      # NOTE: Now,
25980 20 77 65 20 6e 65 65 64 20 74 6f 20 6b 6e 6f 77   we need to know
25990 20 69 66 20 74 68 65 20 53 51 4c 69 74 65 20 63   if the SQLite c
259a0 6f 72 65 20 6c 69 62 72 61 72 79 20 69 73 20 61  ore library is a
259b0 76 61 69 6c 61 62 6c 65 0d 0a 20 20 20 20 20 20  vailable..      
259c0 20 20 23 20 20 20 20 20 20 20 28 69 2e 65 2e 20    #       (i.e. 
259d0 62 65 63 61 75 73 65 20 74 68 65 20 6d 61 6e 61  because the mana
259e0 67 65 64 2d 6f 6e 6c 79 20 53 79 73 74 65 6d 2e  ged-only System.
259f0 44 61 74 61 2e 53 51 4c 69 74 65 20 61 73 73 65  Data.SQLite asse
25a00 6d 62 6c 79 20 63 61 6e 0d 0a 20 20 20 20 20 20  mbly can..      
25a10 20 20 23 20 20 20 20 20 20 20 6c 6f 61 64 20 77    #       load w
25a20 69 74 68 6f 75 74 20 69 74 3b 20 68 6f 77 65 76  ithout it; howev
25a30 65 72 2c 20 69 74 20 63 61 6e 6e 6f 74 20 64 6f  er, it cannot do
25a40 20 61 6e 79 74 68 69 6e 67 20 75 73 65 66 75 6c   anything useful
25a50 20 77 69 74 68 6f 75 74 0d 0a 20 20 20 20 20 20   without..      
25a60 20 20 23 20 20 20 20 20 20 20 69 74 29 2e 20 20    #       it).  
25a70 49 66 20 77 65 20 61 72 65 20 75 73 69 6e 67 20  If we are using 
25a80 74 68 65 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61  the mixed-mode a
25a90 73 73 65 6d 62 6c 79 20 61 6e 64 20 77 65 20 61  ssembly and we a
25aa0 6c 72 65 61 64 79 0d 0a 20 20 20 20 20 20 20 20  lready..        
25ab0 23 20 20 20 20 20 20 20 66 6f 75 6e 64 20 69 74  #       found it
25ac0 20 28 61 62 6f 76 65 29 2c 20 74 68 69 73 20 73   (above), this s
25ad0 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 73 75 63  hould always suc
25ae0 63 65 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 23  ceed...        #
25af0 0d 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 46  ..        checkF
25b00 6f 72 53 51 4c 69 74 65 4c 69 62 72 61 72 79 20  orSQLiteLibrary 
25b10 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d  $::test_channel.
25b20 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
25b30 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68        # NOTE: Ch
25b40 65 63 6b 20 69 66 20 74 68 65 20 53 51 4c 69 74  eck if the SQLit
25b50 65 20 69 6e 74 65 72 6f 70 20 61 73 73 65 6d 62  e interop assemb
25b60 6c 79 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e  ly is available.
25b70 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
25b80 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51 4c       checkForSQL
25b90 69 74 65 49 6e 74 65 72 6f 70 20 24 3a 3a 74 65  iteInterop $::te
25ba0 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20  st_channel....  
25bb0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
25bc0 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 74   # NOTE: Check t
25bd0 68 65 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  he SQLite databa
25be0 73 65 20 61 6e 64 20 74 65 6d 70 6f 72 61 72 79  se and temporary
25bf0 20 64 69 72 65 63 74 6f 72 69 65 73 2e 0d 0a 20   directories... 
25c00 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
25c10 20 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65    checkForSQLite
25c20 44 69 72 65 63 74 6f 72 69 65 73 20 24 3a 3a 74  Directories $::t
25c30 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20  est_channel.... 
25c40 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
25c50 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70    # NOTE: Attemp
25c60 74 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69  t to determine i
25c70 66 20 76 61 72 69 6f 75 73 20 63 6f 6d 70 69 6c  f various compil
25c80 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 73 20 6e  e-time options n
25c90 65 65 64 65 64 20 66 6f 72 0d 0a 20 20 20 20 20  eeded for..     
25ca0 20 20 20 23 20 20 20 20 20 20 20 74 65 73 74 20     #       test 
25cb0 63 6f 6e 73 74 72 61 69 6e 74 73 20 77 65 72 65  constraints were
25cc0 20 65 6e 61 62 6c 65 64 20 66 6f 72 20 74 68 65   enabled for the
25cd0 20 6d 61 6e 61 67 65 64 20 61 73 73 65 6d 62 6c   managed assembl
25ce0 79 2e 20 20 54 68 65 72 65 0d 0a 20 20 20 20 20  y.  There..     
25cf0 20 20 20 23 20 20 20 20 20 20 20 61 72 65 20 73     #       are s
25d00 6f 6d 65 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65  ome compile-time
25d10 20 6f 70 74 69 6f 6e 73 20 74 68 61 74 20 6d 75   options that mu
25d20 73 74 20 61 6c 73 6f 20 68 61 76 65 20 62 65 65  st also have bee
25d30 6e 20 65 6e 61 62 6c 65 64 0d 0a 20 20 20 20 20  n enabled..     
25d40 20 20 20 23 20 20 20 20 20 20 20 66 6f 72 20 74     #       for t
25d50 68 65 20 69 6e 74 65 72 6f 70 20 61 73 73 65 6d  he interop assem
25d60 62 6c 79 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  bly in order to 
25d70 62 65 20 65 66 66 65 63 74 69 76 65 2e 20 20 46  be effective.  F
25d80 6f 72 20 74 68 6f 73 65 0d 0a 20 20 20 20 20 20  or those..      
25d90 20 20 23 20 20 20 20 20 20 20 6f 70 74 69 6f 6e    #       option
25da0 73 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 61 73  s, it will be as
25db0 73 75 6d 65 64 20 74 68 61 74 20 69 74 20 77 61  sumed that it wa
25dc0 73 20 65 6e 61 62 6c 65 64 20 66 6f 72 20 74 68  s enabled for th
25dd0 65 20 69 6e 74 65 72 6f 70 0d 0a 20 20 20 20 20  e interop..     
25de0 20 20 20 23 20 20 20 20 20 20 20 61 73 73 65 6d     #       assem
25df0 62 6c 79 20 69 66 20 69 74 20 77 61 73 20 65 6e  bly if it was en
25e00 61 62 6c 65 64 20 66 6f 72 20 74 68 65 20 6d 61  abled for the ma
25e10 6e 61 67 65 64 20 61 73 73 65 6d 62 6c 79 2e 0d  naged assembly..
25e20 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
25e30 20 20 20 20 66 6f 72 65 61 63 68 20 64 65 66 69      foreach defi
25e40 6e 65 43 6f 6e 73 74 61 6e 74 20 5b 6c 69 73 74  neConstant [list
25e50 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
25e60 43 48 45 43 4b 5f 53 54 41 54 45 20 43 4f 55 4e  CHECK_STATE COUN
25e70 54 5f 48 41 4e 44 4c 45 20 44 45 42 55 47 20 49  T_HANDLE DEBUG I
25e80 4e 54 45 52 4f 50 5f 43 4f 44 45 43 20 49 4e 54  NTEROP_CODEC INT
25e90 45 52 4f 50 5f 44 45 42 55 47 20 5c 0d 0a 20 20  EROP_DEBUG \..  
25ea0 20 20 20 20 20 20 20 20 20 20 49 4e 54 45 52 4f            INTERO
25eb0 50 5f 45 58 54 45 4e 53 49 4f 4e 5f 46 55 4e 43  P_EXTENSION_FUNC
25ec0 54 49 4f 4e 53 20 49 4e 54 45 52 4f 50 5f 46 54  TIONS INTEROP_FT
25ed0 53 35 5f 45 58 54 45 4e 53 49 4f 4e 20 5c 0d 0a  S5_EXTENSION \..
25ee0 20 20 20 20 20 20 20 20 20 20 20 20 49 4e 54 45              INTE
25ef0 52 4f 50 5f 49 4e 43 4c 55 44 45 5f 43 45 52 4f  ROP_INCLUDE_CERO
25f00 44 20 49 4e 54 45 52 4f 50 5f 49 4e 43 4c 55 44  D INTEROP_INCLUD
25f10 45 5f 45 58 54 52 41 20 49 4e 54 45 52 4f 50 5f  E_EXTRA INTEROP_
25f20 49 4e 43 4c 55 44 45 5f 53 45 45 20 5c 0d 0a 20  INCLUDE_SEE \.. 
25f30 20 20 20 20 20 20 20 20 20 20 20 49 4e 54 45 52             INTER
25f40 4f 50 5f 49 4e 43 4c 55 44 45 5f 5a 49 50 56 46  OP_INCLUDE_ZIPVF
25f50 53 20 49 4e 54 45 52 4f 50 5f 4a 53 4f 4e 31 5f  S INTEROP_JSON1_
25f60 45 58 54 45 4e 53 49 4f 4e 20 5c 0d 0a 20 20 20  EXTENSION \..   
25f70 20 20 20 20 20 20 20 20 20 49 4e 54 45 52 4f 50           INTEROP
25f80 5f 4c 45 47 41 43 59 5f 43 4c 4f 53 45 20 49 4e  _LEGACY_CLOSE IN
25f90 54 45 52 4f 50 5f 4c 4f 47 20 49 4e 54 45 52 4f  TEROP_LOG INTERO
25fa0 50 5f 50 45 52 43 45 4e 54 49 4c 45 5f 45 58 54  P_PERCENTILE_EXT
25fb0 45 4e 53 49 4f 4e 20 5c 0d 0a 20 20 20 20 20 20  ENSION \..      
25fc0 20 20 20 20 20 20 49 4e 54 45 52 4f 50 5f 52 45        INTEROP_RE
25fd0 47 45 58 50 5f 45 58 54 45 4e 53 49 4f 4e 20 49  GEXP_EXTENSION I
25fe0 4e 54 45 52 4f 50 5f 54 45 53 54 5f 45 58 54 45  NTEROP_TEST_EXTE
25ff0 4e 53 49 4f 4e 20 5c 0d 0a 20 20 20 20 20 20 20  NSION \..       
26000 20 20 20 20 20 49 4e 54 45 52 4f 50 5f 54 4f 54       INTEROP_TOT
26010 59 50 45 5f 45 58 54 45 4e 53 49 4f 4e 20 49 4e  YPE_EXTENSION IN
26020 54 45 52 4f 50 5f 56 49 52 54 55 41 4c 5f 54 41  TEROP_VIRTUAL_TA
26030 42 4c 45 20 4e 45 54 5f 32 30 20 4e 45 54 5f 33  BLE NET_20 NET_3
26040 35 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  5 \..           
26050 20 4e 45 54 5f 34 30 20 4e 45 54 5f 34 35 20 4e   NET_40 NET_45 N
26060 45 54 5f 34 35 31 20 4e 45 54 5f 34 35 32 20 4e  ET_451 NET_452 N
26070 45 54 5f 34 36 20 4e 45 54 5f 34 36 31 20 4e 45  ET_46 NET_461 NE
26080 54 5f 34 36 32 20 5c 0d 0a 20 20 20 20 20 20 20  T_462 \..       
26090 20 20 20 20 20 4e 45 54 5f 43 4f 4d 50 41 43 54       NET_COMPACT
260a0 5f 32 30 20 50 4c 41 54 46 4f 52 4d 5f 43 4f 4d  _20 PLATFORM_COM
260b0 50 41 43 54 46 52 41 4d 45 57 4f 52 4b 20 50 52  PACTFRAMEWORK PR
260c0 45 4c 4f 41 44 5f 4e 41 54 49 56 45 5f 4c 49 42  ELOAD_NATIVE_LIB
260d0 52 41 52 59 20 5c 0d 0a 20 20 20 20 20 20 20 20  RARY \..        
260e0 20 20 20 20 52 45 54 41 52 47 45 54 41 42 4c 45      RETARGETABLE
260f0 20 53 51 4c 49 54 45 5f 53 54 41 4e 44 41 52 44   SQLITE_STANDARD
26100 20 54 48 52 4f 57 5f 4f 4e 5f 44 49 53 50 4f 53   THROW_ON_DISPOS
26110 45 44 20 54 52 41 43 45 20 5c 0d 0a 20 20 20 20  ED TRACE \..    
26120 20 20 20 20 20 20 20 20 54 52 41 43 45 5f 43 4f          TRACE_CO
26130 4e 4e 45 43 54 49 4f 4e 20 54 52 41 43 45 5f 44  NNECTION TRACE_D
26140 45 54 45 43 54 49 4f 4e 20 54 52 41 43 45 5f 48  ETECTION TRACE_H
26150 41 4e 44 4c 45 20 54 52 41 43 45 5f 50 52 45 4c  ANDLE TRACE_PREL
26160 4f 41 44 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  OAD \..         
26170 20 20 20 54 52 41 43 45 5f 53 48 41 52 45 44 20     TRACE_SHARED 
26180 54 52 41 43 45 5f 53 54 41 54 45 4d 45 4e 54 20  TRACE_STATEMENT 
26190 54 52 41 43 45 5f 57 41 52 4e 49 4e 47 20 54 52  TRACE_WARNING TR
261a0 41 43 4b 5f 4d 45 4d 4f 52 59 5f 42 59 54 45 53  ACK_MEMORY_BYTES
261b0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
261c0 55 53 45 5f 45 4e 54 49 54 59 5f 46 52 41 4d 45  USE_ENTITY_FRAME
261d0 57 4f 52 4b 5f 36 20 55 53 45 5f 49 4e 54 45 52  WORK_6 USE_INTER
261e0 4f 50 5f 44 4c 4c 20 55 53 45 5f 50 52 45 50 41  OP_DLL USE_PREPA
261f0 52 45 5f 56 32 20 57 49 4e 44 4f 57 53 5d 20 7b  RE_V2 WINDOWS] {
26200 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
26210 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
26220 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 63 6f   Check if the co
26230 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f  mpile-time optio
26240 6e 20 69 73 20 6c 69 73 74 65 64 20 69 6e 20 74  n is listed in t
26250 68 65 20 6c 69 73 74 20 6f 66 0d 0a 20 20 20 20  he list of..    
26260 20 20 20 20 20 20 23 20 20 20 20 20 20 20 22 64        #       "d
26270 65 66 69 6e 65 20 63 6f 6e 73 74 61 6e 74 73 22  efine constants"
26280 20 6b 65 70 74 20 74 72 61 63 6b 20 6f 66 20 62   kept track of b
26290 79 20 74 68 65 20 6d 61 6e 61 67 65 64 20 61 73  y the managed as
262a0 73 65 6d 62 6c 79 2e 0d 0a 20 20 20 20 20 20 20  sembly...       
262b0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
262c0 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 44 65  checkForSQLiteDe
262d0 66 69 6e 65 43 6f 6e 73 74 61 6e 74 20 24 3a 3a  fineConstant $::
262e0 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 64 65  test_channel $de
262f0 66 69 6e 65 43 6f 6e 73 74 61 6e 74 0d 0a 20 20  fineConstant..  
26300 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
26310 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
26320 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20 74  NOTE: Check if t
26330 68 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  he System.Data.S
26340 51 4c 69 74 65 20 70 72 6f 76 69 64 65 72 20 77  QLite provider w
26350 61 73 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68  as compiled with
26360 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
26370 20 20 73 75 70 70 6f 72 74 20 66 6f 72 20 61 6e    support for an
26380 79 20 65 6e 63 72 79 70 74 65 64 20 64 61 74 61  y encrypted data
26390 62 61 73 65 73 2e 0d 0a 20 20 20 20 20 20 20 20  bases...        
263a0 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  #..        if {[
263b0 68 61 76 65 53 51 4c 69 74 65 44 65 66 69 6e 65  haveSQLiteDefine
263c0 43 6f 6e 73 74 61 6e 74 20 49 4e 54 45 52 4f 50  Constant INTEROP
263d0 5f 43 4f 44 45 43 5d 20 7c 7c 20 5c 0d 0a 20 20  _CODEC] || \..  
263e0 20 20 20 20 20 20 20 20 20 20 5b 68 61 76 65 53            [haveS
263f0 51 4c 69 74 65 44 65 66 69 6e 65 43 6f 6e 73 74  QLiteDefineConst
26400 61 6e 74 20 49 4e 54 45 52 4f 50 5f 49 4e 43 4c  ant INTEROP_INCL
26410 55 44 45 5f 53 45 45 5d 7d 20 74 68 65 6e 20 7b  UDE_SEE]} then {
26420 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
26430 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
26440 20 59 65 73 2c 20 61 64 64 20 67 65 6e 65 72 69   Yes, add generi
26450 63 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 6f 72  c constraint for
26460 20 75 73 65 20 62 79 20 74 68 65 20 74 65 73 74   use by the test
26470 20 73 75 69 74 65 2e 0d 0a 20 20 20 20 20 20 20   suite...       
26480 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
26490 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 53 79  addConstraint Sy
264a0 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
264b0 2e 45 6e 63 72 79 70 74 69 6f 6e 0d 0a 20 20 20  .Encryption..   
264c0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
264d0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
264e0 4f 54 45 3a 20 43 68 65 63 6b 20 74 68 65 20 63  OTE: Check the c
264f0 75 72 72 65 6e 74 20 62 75 69 6c 64 20 79 65 61  urrent build yea
26500 72 2e 20 20 42 61 73 69 63 61 6c 6c 79 2c 20 74  r.  Basically, t
26510 68 69 73 20 69 6e 64 69 63 61 74 65 73 0d 0a 20  his indicates.. 
26520 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 77         #       w
26530 68 69 63 68 20 76 65 72 73 69 6f 6e 20 6f 66 20  hich version of 
26540 4d 53 42 75 69 6c 64 20 61 6e 64 2f 6f 72 20 56  MSBuild and/or V
26550 69 73 75 61 6c 20 53 74 75 64 69 6f 20 77 61 73  isual Studio was
26560 20 75 73 65 64 20 74 6f 0d 0a 20 20 20 20 20 20   used to..      
26570 20 20 23 20 20 20 20 20 20 20 63 6f 6d 70 69 6c    #       compil
26580 65 20 74 68 65 20 61 73 73 65 6d 62 6c 79 20 62  e the assembly b
26590 69 6e 61 72 69 65 73 20 75 6e 64 65 72 20 74 65  inaries under te
265a0 73 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  st...        #..
265b0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
265c0 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d  :test_channel \.
265d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d  .            "--
265e0 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20  -- checking for 
265f0 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
26600 74 65 20 62 75 69 6c 64 20 79 65 61 72 2e 2e 2e  te build year...
26610 20 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65   "....        se
26620 74 20 79 65 61 72 20 5b 67 65 74 42 75 69 6c 64  t year [getBuild
26630 59 65 61 72 5d 0d 0a 20 20 20 20 20 20 20 20 61  Year]..        a
26640 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70  ddConstraint [ap
26650 70 65 6e 64 41 72 67 73 20 62 75 69 6c 64 59 65  pendArgs buildYe
26660 61 72 2e 20 24 79 65 61 72 5d 0d 0a 20 20 20 20  ar. $year]..    
26670 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
26680 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
26690 64 41 72 67 73 20 5c 22 20 24 79 65 61 72 20 5c  dArgs \" $year \
266a0 22 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  "\n]....        
266b0 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
266c0 45 3a 20 43 68 65 63 6b 20 74 68 65 20 63 75 72  E: Check the cur
266d0 72 65 6e 74 20 62 75 69 6c 64 20 2e 4e 45 54 20  rent build .NET 
266e0 46 72 61 6d 65 77 6f 72 6b 2e 20 20 42 61 73 69  Framework.  Basi
266f0 63 61 6c 6c 79 2c 20 74 68 69 73 0d 0a 20 20 20  cally, this..   
26700 20 20 20 20 20 23 20 20 20 20 20 20 20 69 6e 64       #       ind
26710 69 63 61 74 65 73 20 77 68 69 63 68 20 76 65 72  icates which ver
26720 73 69 6f 6e 20 6f 66 20 74 68 65 20 2e 4e 45 54  sion of the .NET
26730 20 46 72 61 6d 65 77 6f 72 6b 20 69 73 20 62 65   Framework is be
26740 69 6e 67 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ing..        #  
26750 20 20 20 20 20 75 73 65 64 20 62 79 20 74 68 65       used by the
26760 20 61 73 73 65 6d 62 6c 79 20 62 69 6e 61 72 69   assembly binari
26770 65 73 20 75 6e 64 65 72 20 74 65 73 74 2e 0d 0a  es under test...
26780 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
26790 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
267a0 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20  _channel \..    
267b0 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68          "---- ch
267c0 65 63 6b 69 6e 67 20 66 6f 72 20 53 79 73 74 65  ecking for Syste
267d0 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 62 75  m.Data.SQLite bu
267e0 69 6c 64 20 2e 4e 45 54 20 46 72 61 6d 65 77 6f  ild .NET Framewo
267f0 72 6b 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20  rk... "....     
26800 20 20 20 73 65 74 20 6e 65 74 46 78 20 5b 67 65     set netFx [ge
26810 74 42 75 69 6c 64 4e 65 74 46 78 5d 0d 0a 20 20  tBuildNetFx]..  
26820 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61        addConstra
26830 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20  int [appendArgs 
26840 62 75 69 6c 64 46 72 61 6d 65 77 6f 72 6b 2e 20  buildFramework. 
26850 24 6e 65 74 46 78 5d 0d 0a 20 20 20 20 20 20 20  $netFx]..       
26860 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
26870 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
26880 67 73 20 5c 22 20 24 6e 65 74 46 78 20 5c 22 5c  gs \" $netFx \"\
26890 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d  n]....        #.
268a0 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
268b0 20 43 68 65 63 6b 20 74 68 65 20 63 75 72 72 65   Check the curre
268c0 6e 74 20 62 75 69 6c 64 20 63 6f 6e 66 69 67 75  nt build configu
268d0 72 61 74 69 6f 6e 2e 20 20 54 68 69 73 20 73 68  ration.  This sh
268e0 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79 0d 0a 20  ould normally.. 
268f0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62         #       b
26900 65 20 65 69 74 68 65 72 20 22 44 65 62 75 67 22  e either "Debug"
26910 20 6f 72 20 22 52 65 6c 65 61 73 65 22 2e 0d 0a   or "Release"...
26920 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
26930 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
26940 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20  _channel \..    
26950 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68          "---- ch
26960 65 63 6b 69 6e 67 20 66 6f 72 20 53 79 73 74 65  ecking for Syste
26970 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 62 75  m.Data.SQLite bu
26980 69 6c 64 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  ild configuratio
26990 6e 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20  n... "....      
269a0 20 20 73 65 74 20 63 6f 6e 66 69 67 75 72 61 74    set configurat
269b0 69 6f 6e 20 5b 67 65 74 42 75 69 6c 64 43 6f 6e  ion [getBuildCon
269c0 66 69 67 75 72 61 74 69 6f 6e 5d 0d 0a 20 20 20  figuration]..   
269d0 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
269e0 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 62  nt [appendArgs b
269f0 75 69 6c 64 43 6f 6e 66 69 67 75 72 61 74 69 6f  uildConfiguratio
26a00 6e 2e 20 24 63 6f 6e 66 69 67 75 72 61 74 69 6f  n. $configuratio
26a10 6e 5d 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74  n]..        tput
26a20 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
26a30 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 22  l [appendArgs \"
26a40 20 24 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20   $configuration 
26a50 5c 22 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  \"\n]....       
26a60 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
26a70 54 45 3a 20 54 72 79 20 74 6f 20 73 65 74 75 70  TE: Try to setup
26a80 20 61 6e 20 69 6e 74 65 72 72 75 70 74 20 63 61   an interrupt ca
26a90 6c 6c 62 61 63 6b 20 75 73 69 6e 67 20 74 68 65  llback using the
26aa0 20 73 63 72 69 70 74 20 64 65 62 75 67 67 65 72   script debugger
26ab0 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
26ac0 20 20 74 68 61 74 20 77 69 6c 6c 20 63 61 6e 63    that will canc
26ad0 65 6c 20 61 6c 6c 20 53 51 4c 20 71 75 65 72 69  el all SQL queri
26ae0 65 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20 66  es in progress f
26af0 6f 72 20 61 6c 6c 20 64 61 74 61 62 61 73 65 0d  or all database.
26b00 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
26b10 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6b 6e 6f   connections kno
26b20 77 6e 20 74 6f 20 74 68 69 73 20 69 6e 74 65 72  wn to this inter
26b30 70 72 65 74 65 72 2e 0d 0a 20 20 20 20 20 20 20  preter...       
26b40 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   #..        if {
26b50 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
26b60 6e 6f 28 73 71 6c 69 74 65 49 6e 74 65 72 72 75  no(sqliteInterru
26b70 70 74 43 61 6c 6c 62 61 63 6b 29 5d 7d 20 74 68  ptCallback)]} th
26b80 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
26b90 73 65 74 75 70 44 62 49 6e 74 65 72 72 75 70 74  setupDbInterrupt
26ba0 43 61 6c 6c 62 61 63 6b 20 24 3a 3a 74 65 73 74  Callback $::test
26bb0 5f 63 68 61 6e 6e 65 6c 20 24 3a 3a 74 65 73 74  _channel $::test
26bc0 5f 6c 6f 67 0d 0a 20 20 20 20 20 20 20 20 7d 0d  _log..        }.
26bd0 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
26be0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68        # NOTE: Ch
26bf0 65 63 6b 20 66 6f 72 20 74 68 65 20 6e 61 74 69  eck for the nati
26c00 76 65 20 72 75 6e 74 69 6d 65 20 6f 70 74 69 6f  ve runtime optio
26c10 6e 2c 20 77 68 69 63 68 20 77 6f 75 6c 64 20 6d  n, which would m
26c20 65 61 6e 20 77 65 20 61 72 65 0d 0a 20 20 20 20  ean we are..    
26c30 20 20 20 20 23 20 20 20 20 20 20 20 75 73 69 6e      #       usin
26c40 67 20 74 68 65 20 6d 69 78 65 64 2d 6d 6f 64 65  g the mixed-mode
26c50 20 61 73 73 65 6d 62 6c 79 2e 0d 0a 20 20 20 20   assembly...    
26c60 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 63      #..        c
26c70 68 65 63 6b 46 6f 72 52 75 6e 74 69 6d 65 4f 70  heckForRuntimeOp
26c80 74 69 6f 6e 20 24 3a 3a 74 65 73 74 5f 63 68 61  tion $::test_cha
26c90 6e 6e 65 6c 20 6e 61 74 69 76 65 0d 0a 0d 0a 20  nnel native.... 
26ca0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
26cb0 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20    # NOTE: Check 
26cc0 69 66 20 74 68 65 20 74 65 73 74 20 73 75 69 74  if the test suit
26cd0 65 20 73 68 6f 75 6c 64 20 63 6f 75 6e 74 20 74  e should count t
26ce0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6e  he number of con
26cf0 6e 65 63 74 69 6f 6e 73 0d 0a 20 20 20 20 20 20  nections..      
26d00 20 20 23 20 20 20 20 20 20 20 22 6f 70 65 6e 65    #       "opene
26d10 64 22 20 61 6e 64 20 22 63 6c 6f 73 65 64 22 20  d" and "closed" 
26d20 66 72 6f 6d 20 74 68 65 20 70 6f 6f 6c 20 77 68  from the pool wh
26d30 65 6e 20 64 65 74 65 72 6d 69 6e 69 6e 67 20 69  en determining i
26d40 66 20 61 20 74 65 73 74 0d 0a 20 20 20 20 20 20  f a test..      
26d50 20 20 23 20 20 20 20 20 20 20 70 61 73 73 65 64    #       passed
26d60 2e 20 20 44 69 73 61 62 6c 69 6e 67 20 74 68 69  .  Disabling thi
26d70 73 20 62 65 68 61 76 69 6f 72 20 69 73 20 73 6f  s behavior is so
26d80 6d 65 74 69 6d 65 73 20 6e 65 63 65 73 73 61 72  metimes necessar
26d90 79 20 28 65 2e 67 2e 0d 0a 20 20 20 20 20 20 20  y (e.g...       
26da0 20 23 20 20 20 20 20 20 20 64 75 72 69 6e 67 20   #       during 
26db0 74 68 65 20 72 65 6c 65 61 73 65 20 74 65 73 74  the release test
26dc0 69 6e 67 20 70 72 6f 63 65 73 73 29 20 62 65 63  ing process) bec
26dd0 61 75 73 65 20 74 68 65 72 65 20 61 72 65 20 73  ause there are s
26de0 65 76 65 72 61 6c 0d 0a 20 20 20 20 20 20 20 20  everal..        
26df0 23 20 20 20 20 20 20 20 74 65 73 74 73 20 74 68  #       tests th
26e00 61 74 20 72 65 6c 79 20 6f 6e 20 74 68 65 20 22  at rely on the "
26e10 6f 70 65 6e 65 64 20 66 72 6f 6d 20 70 6f 6f 6c  opened from pool
26e20 22 20 63 6f 75 6e 74 20 62 65 69 6e 67 20 67 72  " count being gr
26e30 65 61 74 65 72 0d 0a 20 20 20 20 20 20 20 20 23  eater..        #
26e40 20 20 20 20 20 20 20 74 68 61 6e 20 7a 65 72 6f         than zero
26e50 2e 20 20 54 68 65 73 65 20 74 65 73 74 73 20 6d  .  These tests m
26e60 61 79 20 66 61 69 6c 20 64 75 65 20 74 6f 20 74  ay fail due to t
26e70 68 65 20 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e 69  he non-determini
26e80 73 74 69 63 0d 0a 20 20 20 20 20 20 20 20 23 20  stic..        # 
26e90 20 20 20 20 20 20 62 65 68 61 76 69 6f 72 20 6f        behavior o
26ea0 66 20 74 68 65 20 43 4c 52 20 47 43 2c 20 65 76  f the CLR GC, ev
26eb0 65 6e 20 77 68 65 6e 20 74 68 65 72 65 20 69 73  en when there is
26ec0 20 6e 6f 20 62 75 67 20 69 6e 20 74 68 65 20 63   no bug in the c
26ed0 6f 64 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ode..        #  
26ee0 20 20 20 20 20 62 65 69 6e 67 20 74 65 73 74 65       being teste
26ef0 64 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  d...        #.. 
26f00 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 52         checkForR
26f10 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 24 3a 3a  untimeOption $::
26f20 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 6e 6f 50  test_channel noP
26f30 6f 6f 6c 43 6f 75 6e 74 73 0d 0a 0d 0a 20 20 20  oolCounts....   
26f40 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
26f50 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66  # NOTE: Check if
26f60 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65 20   the test suite 
26f70 73 68 6f 75 6c 64 20 75 73 65 20 73 68 61 72 65  should use share
26f80 64 2d 63 61 63 68 65 20 6d 6f 64 65 2e 0d 0a 20  d-cache mode... 
26f90 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
26fa0 20 20 63 68 65 63 6b 46 6f 72 52 75 6e 74 69 6d    checkForRuntim
26fb0 65 4f 70 74 69 6f 6e 20 24 3a 3a 74 65 73 74 5f  eOption $::test_
26fc0 63 68 61 6e 6e 65 6c 20 73 68 61 72 65 64 43 61  channel sharedCa
26fd0 63 68 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23  che....        #
26fe0 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
26ff0 3a 20 52 65 70 6f 72 74 20 74 68 65 20 72 65 73  : Report the res
27000 6f 75 72 63 65 20 75 73 61 67 65 20 70 72 69 6f  ource usage prio
27010 72 20 74 6f 20 72 75 6e 6e 69 6e 67 20 61 6e 79  r to running any
27020 20 74 65 73 74 73 2e 0d 0a 20 20 20 20 20 20 20   tests...       
27030 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 70 6f   #..        repo
27040 72 74 53 51 4c 69 74 65 52 65 73 6f 75 72 63 65  rtSQLiteResource
27050 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
27060 6c 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  l....        #..
27070 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
27080 47 72 61 62 20 74 68 65 20 6c 69 73 74 20 6f 66  Grab the list of
27090 20 6e 61 74 69 76 65 20 6d 6f 64 75 6c 65 73 20   native modules 
270a0 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
270b0 70 72 6f 63 65 73 73 20 61 6e 64 0d 0a 20 20 20  process and..   
270c0 20 20 20 20 20 23 20 20 20 20 20 20 20 72 65 70       #       rep
270d0 6f 72 74 20 6f 6e 20 74 68 65 20 53 79 73 74 65  ort on the Syste
270e0 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 72 65  m.Data.SQLite re
270f0 6c 61 74 65 64 20 6f 6e 65 73 2e 0d 0a 20 20 20  lated ones...   
27100 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
27110 69 66 20 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f  if {[haveSQLiteO
27120 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74  bjectCommand]} t
27130 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
27140 20 73 65 74 20 6d 6f 64 75 6c 65 73 20 5b 6f 62   set modules [ob
27150 6a 65 63 74 20 69 6e 76 6f 6b 65 20 5c 0d 0a 20  ject invoke \.. 
27160 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73               Sys
27170 74 65 6d 2e 44 69 61 67 6e 6f 73 74 69 63 73 2e  tem.Diagnostics.
27180 50 72 6f 63 65 73 73 2e 47 65 74 43 75 72 72 65  Process.GetCurre
27190 6e 74 50 72 6f 63 65 73 73 20 4d 6f 64 75 6c 65  ntProcess Module
271a0 73 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  s]....          
271b0 6f 62 6a 65 63 74 20 66 6f 72 65 61 63 68 20 2d  object foreach -
271c0 61 6c 69 61 73 20 6d 6f 64 75 6c 65 20 24 6d 6f  alias module $mo
271d0 64 75 6c 65 73 20 7b 0d 0a 20 20 20 20 20 20 20  dules {..       
271e0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
271f0 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20      # NOTE: The 
27200 6d 6f 64 75 6c 65 20 66 69 6c 65 20 6e 61 6d 65  module file name
27210 20 68 65 72 65 20 6d 75 73 74 20 62 65 20 6e 6f   here must be no
27220 72 6d 61 6c 69 7a 65 64 2e 0d 0a 20 20 20 20 20  rmalized...     
27230 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
27240 20 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61        set fileNa
27250 6d 65 20 5b 66 69 6c 65 20 6e 6f 72 6d 61 6c 69  me [file normali
27260 7a 65 20 5b 24 6d 6f 64 75 6c 65 20 46 69 6c 65  ze [$module File
27270 4e 61 6d 65 5d 5d 0d 0a 20 20 20 20 20 20 20 20  Name]]..        
27280 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65      set fileName
27290 4f 6e 6c 79 20 5b 66 69 6c 65 20 74 61 69 6c 20  Only [file tail 
272a0 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20 20  $fileName]....  
272b0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 6c            if {[l
272c0 73 65 61 72 63 68 20 2d 65 78 61 63 74 20 2d 6e  search -exact -n
272d0 6f 63 61 73 65 20 2d 2d 20 5c 0d 0a 20 20 20 20  ocase -- \..    
272e0 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74              [get
272f0 4e 61 74 69 76 65 4c 69 62 72 61 72 79 46 69 6c  NativeLibraryFil
27300 65 4e 61 6d 65 73 4f 6e 6c 79 5d 20 24 66 69 6c  eNamesOnly] $fil
27310 65 4e 61 6d 65 4f 6e 6c 79 5d 20 21 3d 20 2d 31  eNameOnly] != -1
27320 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
27330 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
27340 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
27350 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
27360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
27370 2d 2d 2d 2d 20 66 6f 75 6e 64 20 6c 6f 61 64 65  ---- found loade
27380 64 20 53 51 4c 69 74 65 20 6e 61 74 69 76 65 20  d SQLite native 
27390 6c 69 62 72 61 72 79 20 6d 6f 64 75 6c 65 3a 20  library module: 
273a0 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
273b0 20 20 20 20 20 20 20 24 66 69 6c 65 4e 61 6d 65         $fileName
273c0 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \n]..          
273d0 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 6c 73 65    } elseif {[lse
273e0 61 72 63 68 20 2d 65 78 61 63 74 20 2d 6e 6f 63  arch -exact -noc
273f0 61 73 65 20 2d 2d 20 5c 0d 0a 20 20 20 20 20 20  ase -- \..      
27400 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 49 6e            [getIn
27410 74 65 72 6f 70 41 73 73 65 6d 62 6c 79 46 69 6c  teropAssemblyFil
27420 65 4e 61 6d 65 73 4f 6e 6c 79 5d 20 24 66 69 6c  eNamesOnly] $fil
27430 65 4e 61 6d 65 4f 6e 6c 79 5d 20 21 3d 20 2d 31  eNameOnly] != -1
27440 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
27450 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
27460 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
27470 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
27480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
27490 2d 2d 2d 2d 20 66 6f 75 6e 64 20 6c 6f 61 64 65  ---- found loade
274a0 64 20 53 51 4c 69 74 65 20 69 6e 74 65 72 6f 70  d SQLite interop
274b0 20 61 73 73 65 6d 62 6c 79 20 6d 6f 64 75 6c 65   assembly module
274c0 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  : " \..         
274d0 20 20 20 20 20 20 20 20 20 24 66 69 6c 65 4e 61           $fileNa
274e0 6d 65 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  me \n]..        
274f0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
27500 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d   }..        }...
27510 0a 20 20 20 20 20 20 20 20 63 61 74 63 68 20 7b  .        catch {
27520 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74  ..          tput
27530 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
27540 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  l \..           
27550 20 20 20 22 2d 2d 2d 2d 20 63 6f 6d 70 69 6c 65     "---- compile
27560 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 73 20 66 6f  -time options fo
27570 72 20 53 51 4c 69 74 65 20 63 6f 72 65 20 6c 69  r SQLite core li
27580 62 72 61 72 79 2e 2e 2e 20 22 0d 0a 0d 0a 20 20  brary... "....  
27590 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
275a0 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
275b0 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20    object invoke 
275c0 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69  -flags +NonPubli
275d0 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  c \..           
275e0 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61       System.Data
275f0 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 33 20  .SQLite.SQLite3 
27600 53 51 4c 69 74 65 43 6f 6d 70 69 6c 65 4f 70 74  SQLiteCompileOpt
27610 69 6f 6e 73 0d 0a 20 20 20 20 20 20 20 20 20 20  ions..          
27620 7d 20 63 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 73  } compileOptions
27630 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
27640 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
27650 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
27660 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5b 66  l [appendArgs [f
27670 6f 72 6d 61 74 4c 69 73 74 20 5b 6c 73 6f 72 74  ormatList [lsort
27680 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
27690 20 20 20 20 24 63 6f 6d 70 69 6c 65 4f 70 74 69      $compileOpti
276a0 6f 6e 73 5d 20 3c 6e 6f 6e 65 3e 5d 20 5c 6e 5d  ons] <none>] \n]
276b0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c  ..          } el
276c0 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
276d0 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
276e0 63 68 61 6e 6e 65 6c 20 75 6e 6b 6e 6f 77 6e 5c  channel unknown\
276f0 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  n..          }..
27700 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
27710 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20       catch {..  
27720 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
27730 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d  :test_channel \.
27740 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
27750 2d 2d 2d 2d 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  ---- compile-tim
27760 65 20 6f 70 74 69 6f 6e 73 20 66 6f 72 20 53 51  e options for SQ
27770 4c 69 74 65 20 69 6e 74 65 72 6f 70 20 61 73 73  Lite interop ass
27780 65 6d 62 6c 79 2e 2e 2e 20 22 0d 0a 0d 0a 20 20  embly... "....  
27790 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
277a0 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
277b0 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20    object invoke 
277c0 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69  -flags +NonPubli
277d0 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  c \..           
277e0 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61       System.Data
277f0 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 33 20  .SQLite.SQLite3 
27800 49 6e 74 65 72 6f 70 43 6f 6d 70 69 6c 65 4f 70  InteropCompileOp
27810 74 69 6f 6e 73 0d 0a 20 20 20 20 20 20 20 20 20  tions..         
27820 20 7d 20 63 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e   } compileOption
27830 73 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  s] == 0} then {.
27840 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
27850 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
27860 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5b  el [appendArgs [
27870 66 6f 72 6d 61 74 4c 69 73 74 20 5b 6c 73 6f 72  formatList [lsor
27880 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  t \..           
27890 20 20 20 20 20 24 63 6f 6d 70 69 6c 65 4f 70 74       $compileOpt
278a0 69 6f 6e 73 5d 20 3c 6e 6f 6e 65 3e 5d 20 5c 6e  ions] <none>] \n
278b0 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65  ]..          } e
278c0 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
278d0 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
278e0 5f 63 68 61 6e 6e 65 6c 20 75 6e 6b 6e 6f 77 6e  _channel unknown
278f0 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  \n..          }.
27900 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
27910 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
27920 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20 74 68   # NOTE: Show th
27930 65 20 61 63 74 69 76 65 20 74 65 73 74 20 63 6f  e active test co
27940 6e 73 74 72 61 69 6e 74 73 2e 0d 0a 20 20 20 20  nstraints...    
27950 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 74      #..        t
27960 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
27970 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
27980 20 22 2d 2d 2d 2d 20 63 6f 6e 73 74 72 61 69 6e   "---- constrain
27990 74 73 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20  ts: " \..       
279a0 20 20 20 20 20 5b 66 6f 72 6d 61 74 4c 69 73 74       [formatList
279b0 20 5b 6c 73 6f 72 74 20 5b 67 65 74 43 6f 6e 73   [lsort [getCons
279c0 74 72 61 69 6e 74 73 5d 5d 20 3c 6e 6f 6e 65 3e  traints]] <none>
279d0 5d 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  ] \n]....       
279e0 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
279f0 54 45 3a 20 53 61 76 65 20 74 68 65 20 74 65 73  TE: Save the tes
27a00 74 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 66 6f  t constraints fo
27a10 72 20 75 73 65 20 62 79 20 74 68 72 65 61 64 73  r use by threads
27a20 20 63 72 65 61 74 65 64 20 69 6e 20 74 68 69 73   created in this
27a30 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
27a40 20 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 64 6f    application do
27a50 6d 61 69 6e 2e 20 20 54 68 69 73 20 69 73 20 6e  main.  This is n
27a60 65 63 65 73 73 61 72 79 20 62 65 63 61 75 73 65  ecessary because
27a70 20 61 6c 6c 20 74 68 65 20 45 61 67 6c 65 0d 0a   all the Eagle..
27a80 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
27a90 22 74 65 73 74 20 63 6f 6e 74 65 78 74 22 20 69  "test context" i
27aa0 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 70 65  nformation is pe
27ab0 72 2d 74 68 72 65 61 64 2e 0d 0a 20 20 20 20 20  r-thread...     
27ac0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66     #..        if
27ad0 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
27ae0 3a 3a 74 65 73 74 5f 63 6f 6e 73 74 72 61 69 6e  ::test_constrain
27af0 74 73 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ts]} then {..   
27b00 20 20 20 20 20 20 20 73 65 74 20 3a 3a 74 65 73         set ::tes
27b10 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 24 3a  t_constraints $:
27b20 3a 65 61 67 6c 65 5f 74 65 73 74 73 28 63 6f 6e  :eagle_tests(con
27b30 73 74 72 61 69 6e 74 73 29 0d 0a 20 20 20 20 20  straints)..     
27b40 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
27b50 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
27b60 45 3a 20 4c 6f 61 64 20 74 68 65 20 22 61 66 74  E: Load the "aft
27b70 65 72 2d 63 6f 6e 73 74 72 61 69 6e 74 73 22 20  er-constraints" 
27b80 63 75 73 74 6f 6d 20 70 65 72 2d 75 73 65 72 20  custom per-user 
27b90 61 6e 64 2f 6f 72 20 70 65 72 2d 68 6f 73 74 0d  and/or per-host.
27ba0 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
27bb0 20 74 65 73 74 20 73 65 74 74 69 6e 67 73 20 6e   test settings n
27bc0 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ow...        #..
27bd0 20 20 20 20 20 20 20 20 75 70 6c 65 76 65 6c 20          uplevel 
27be0 31 20 5b 6c 69 73 74 20 6c 6f 61 64 53 51 4c 69  1 [list loadSQLi
27bf0 74 65 54 65 73 74 53 65 74 74 69 6e 67 73 20 24  teTestSettings $
27c00 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 2e  ::test_channel .
27c10 61 66 74 65 72 5d 0d 0a 0d 0a 20 20 20 20 20 20  after]....      
27c20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
27c30 4f 54 45 3a 20 49 66 20 6e 65 63 65 73 73 61 72  OTE: If necessar
27c40 79 2c 20 65 6e 61 62 6c 65 20 73 68 61 72 65 64  y, enable shared
27c50 2d 63 61 63 68 65 20 6d 6f 64 65 20 6e 6f 77 2e  -cache mode now.
27c60 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
27c70 20 20 20 20 20 69 66 20 7b 5b 68 61 73 52 75 6e       if {[hasRun
27c80 74 69 6d 65 4f 70 74 69 6f 6e 20 73 68 61 72 65  timeOption share
27c90 64 43 61 63 68 65 5d 7d 20 74 68 65 6e 20 7b 0d  dCache]} then {.
27ca0 0a 20 20 20 20 20 20 20 20 20 20 65 6e 61 62 6c  .          enabl
27cb0 65 53 68 61 72 65 64 43 61 63 68 65 20 24 3a 3a  eSharedCache $::
27cc0 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 74 72 75  test_channel tru
27cd0 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  e..        }....
27ce0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
27cf0 20 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20     # NOTE: Show 
27d00 77 68 65 6e 20 6f 75 72 20 74 65 73 74 73 20 61  when our tests a
27d10 63 74 75 61 6c 6c 79 20 62 65 67 61 6e 20 28 6e  ctually began (n
27d20 6f 77 29 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ow)...        #.
27d30 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
27d40 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
27d50 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
27d60 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
27d70 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
27d80 74 65 20 74 65 73 74 73 20 62 65 67 61 6e 20 61  te tests began a
27d90 74 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  t " \..         
27da0 20 20 20 5b 63 6c 6f 63 6b 20 66 6f 72 6d 61 74     [clock format
27db0 20 5b 63 6c 6f 63 6b 20 73 65 63 6f 6e 64 73 5d   [clock seconds]
27dc0 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a  ] \n]..      }..
27dd0 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
27de0 6f 63 20 72 75 6e 53 51 4c 69 74 65 54 65 73 74  oc runSQLiteTest
27df0 46 69 6c 65 73 50 72 6f 6c 6f 67 75 65 20 7b 7d  FilesPrologue {}
27e00 20 7b 0d 0a 20 20 20 20 20 20 75 70 6c 65 76 65   {..      upleve
27e10 6c 20 31 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  l 1 {..        #
27e20 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
27e30 3a 20 53 65 74 75 70 20 74 68 65 20 76 61 72 69  : Setup the vari
27e40 61 62 6c 65 73 20 74 68 61 74 20 72 65 66 65 72  ables that refer
27e50 20 74 6f 20 74 68 65 20 76 61 72 69 6f 75 73 20   to the various 
27e60 6e 6f 6e 2d 64 61 74 61 20 66 69 6c 65 73 0d 0a  non-data files..
27e70 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
27e80 72 65 71 75 69 72 65 64 20 62 79 20 74 68 65 20  required by the 
27e90 74 65 73 74 73 20 69 6e 20 74 68 69 73 20 66 69  tests in this fi
27ea0 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  le...        #..
27eb0 20 20 20 20 20 20 20 20 73 65 74 20 65 6e 74 69          set enti
27ec0 74 79 46 72 61 6d 65 77 6f 72 6b 44 6c 6c 46 69  tyFrameworkDllFi
27ed0 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  le \..          
27ee0 20 20 5b 67 65 74 42 75 69 6c 64 46 69 6c 65 4e    [getBuildFileN
27ef0 61 6d 65 20 45 6e 74 69 74 79 46 72 61 6d 65 77  ame EntityFramew
27f00 6f 72 6b 2e 64 6c 6c 20 66 61 6c 73 65 5d 0d 0a  ork.dll false]..
27f10 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 69 6e  ..        set in
27f20 73 74 61 6c 6c 65 72 45 78 65 46 69 6c 65 20 5c  stallerExeFile \
27f30 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 67  ..            [g
27f40 65 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20  etBuildFileName 
27f50 49 6e 73 74 61 6c 6c 65 72 2e 65 78 65 20 66 61  Installer.exe fa
27f60 6c 73 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  lse]....        
27f70 73 65 74 20 73 71 6c 69 74 65 44 65 73 69 67 6e  set sqliteDesign
27f80 65 72 44 6c 6c 46 69 6c 65 20 5c 0d 0a 20 20 20  erDllFile \..   
27f90 20 20 20 20 20 20 20 20 20 5b 67 65 74 42 75 69           [getBui
27fa0 6c 64 46 69 6c 65 4e 61 6d 65 20 53 51 4c 69 74  ldFileName SQLit
27fb0 65 2e 44 65 73 69 67 6e 65 72 2e 64 6c 6c 20 66  e.Designer.dll f
27fc0 61 6c 73 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  alse]....       
27fd0 20 73 65 74 20 73 79 73 74 65 6d 44 61 74 61 53   set systemDataS
27fe0 51 4c 69 74 65 44 6c 6c 46 69 6c 65 20 5c 0d 0a  QLiteDllFile \..
27ff0 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74              [get
28000 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20 53 79  BuildFileName Sy
28010 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
28020 2e 64 6c 6c 20 66 61 6c 73 65 5d 0d 0a 0d 0a 20  .dll false].... 
28030 20 20 20 20 20 20 20 73 65 74 20 73 79 73 74 65         set syste
28040 6d 44 61 74 61 53 51 4c 69 74 65 4c 69 6e 71 44  mDataSQLiteLinqD
28050 6c 6c 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20  llFile \..      
28060 20 20 20 20 20 20 5b 67 65 74 42 75 69 6c 64 46        [getBuildF
28070 69 6c 65 4e 61 6d 65 20 53 79 73 74 65 6d 2e 44  ileName System.D
28080 61 74 61 2e 53 51 4c 69 74 65 2e 4c 69 6e 71 2e  ata.SQLite.Linq.
28090 64 6c 6c 20 66 61 6c 73 65 5d 0d 0a 0d 0a 20 20  dll false]....  
280a0 20 20 20 20 20 20 73 65 74 20 73 79 73 74 65 6d        set system
280b0 44 61 74 61 53 51 4c 69 74 65 45 66 36 44 6c 6c  DataSQLiteEf6Dll
280c0 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  File \..        
280d0 20 20 20 20 5b 67 65 74 42 75 69 6c 64 46 69 6c      [getBuildFil
280e0 65 4e 61 6d 65 20 53 79 73 74 65 6d 2e 44 61 74  eName System.Dat
280f0 61 2e 53 51 4c 69 74 65 2e 45 46 36 2e 64 6c 6c  a.SQLite.EF6.dll
28100 20 66 61 6c 73 65 5d 0d 0a 0d 0a 20 20 20 20 20   false]....     
28110 20 20 20 73 65 74 20 74 65 73 74 45 78 65 46 69     set testExeFi
28120 6c 65 20 5b 67 65 74 42 75 69 6c 64 46 69 6c 65  le [getBuildFile
28130 4e 61 6d 65 20 74 65 73 74 2e 65 78 65 20 66 61  Name test.exe fa
28140 6c 73 65 5d 0d 0a 20 20 20 20 20 20 20 20 73 65  lse]..        se
28150 74 20 74 65 73 74 4c 69 6e 71 45 78 65 46 69 6c  t testLinqExeFil
28160 65 20 5b 67 65 74 42 75 69 6c 64 46 69 6c 65 4e  e [getBuildFileN
28170 61 6d 65 20 74 65 73 74 6c 69 6e 71 2e 65 78 65  ame testlinq.exe
28180 20 66 61 6c 73 65 5d 0d 0a 20 20 20 20 20 20 20   false]..       
28190 20 73 65 74 20 74 65 73 74 45 66 36 45 78 65 46   set testEf6ExeF
281a0 69 6c 65 20 5b 67 65 74 42 75 69 6c 64 46 69 6c  ile [getBuildFil
281b0 65 4e 61 6d 65 20 74 65 73 74 65 66 36 2e 65 78  eName testef6.ex
281c0 65 20 66 61 6c 73 65 5d 0d 0a 0d 0a 20 20 20 20  e false]....    
281d0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
281e0 20 4e 4f 54 45 3a 20 53 65 74 75 70 20 74 68 65   NOTE: Setup the
281f0 20 76 61 72 69 61 62 6c 65 73 20 74 68 61 74 20   variables that 
28200 72 65 66 65 72 20 74 6f 20 74 68 65 20 76 61 72  refer to the var
28210 69 6f 75 73 20 64 61 74 61 20 66 69 6c 65 73 0d  ious data files.
28220 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
28230 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68 65   required by the
28240 20 74 65 73 74 73 20 69 6e 20 74 68 69 73 20 66   tests in this f
28250 69 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ile...        #.
28260 0a 20 20 20 20 20 20 20 20 73 65 74 20 74 65 73  .        set tes
28270 74 4c 69 6e 71 4f 75 74 46 69 6c 65 20 5b 66 69  tLinqOutFile [fi
28280 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66  le nativename [f
28290 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20  ile join \..    
282a0 20 20 20 20 20 20 20 20 5b 67 65 74 53 51 4c 69          [getSQLi
282b0 74 65 54 65 73 74 44 61 74 61 50 61 74 68 5d 20  teTestDataPath] 
282c0 74 65 73 74 6c 69 6e 71 2e 6f 75 74 5d 5d 0d 0a  testlinq.out]]..
282d0 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 6e 6f  ..        set no
282e0 72 74 68 77 69 6e 64 45 66 44 62 46 69 6c 65 20  rthwindEfDbFile 
282f0 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65  [file nativename
28300 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20   [file join \.. 
28310 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65             [file
28320 20 64 69 72 6e 61 6d 65 20 5b 66 69 6c 65 20 64   dirname [file d
28330 69 72 6e 61 6d 65 20 5b 67 65 74 53 51 4c 69 74  irname [getSQLit
28340 65 54 65 73 74 44 61 74 61 50 61 74 68 5d 5d 5d  eTestDataPath]]]
28350 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
28360 74 65 73 74 6c 69 6e 71 20 6e 6f 72 74 68 77 69  testlinq northwi
28370 6e 64 45 46 2e 64 62 5d 5d 0d 0a 0d 0a 20 20 20  ndEF.db]]....   
28380 20 20 20 20 20 73 65 74 20 6e 6f 6e 57 61 6c 44       set nonWalD
28390 62 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69  bFile [file nati
283a0 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69  vename [file joi
283b0 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n \..           
283c0 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73 74 44   [getSQLiteTestD
283d0 61 74 61 50 61 74 68 5d 20 6e 6f 6e 57 61 6c 2e  ataPath] nonWal.
283e0 64 62 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  db]]....        
283f0 73 65 74 20 77 61 6c 44 62 46 69 6c 65 20 5b 66  set walDbFile [f
28400 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b  ile nativename [
28410 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20  file join \..   
28420 20 20 20 20 20 20 20 20 20 5b 67 65 74 53 51 4c           [getSQL
28430 69 74 65 54 65 73 74 44 61 74 61 50 61 74 68 5d  iteTestDataPath]
28440 20 77 61 6c 2e 64 62 5d 5d 0d 0a 0d 0a 20 20 20   wal.db]]....   
28450 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
28460 23 20 4e 4f 54 45 3a 20 54 68 65 20 76 61 72 69  # NOTE: The vari
28470 6f 75 73 20 69 6e 73 74 61 6c 6c 2f 75 6e 69 6e  ous install/unin
28480 73 74 61 6c 6c 20 6c 6f 67 20 66 69 6c 65 73 20  stall log files 
28490 75 73 65 64 20 74 6f 20 74 65 73 74 20 74 68 65  used to test the
284a0 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
284b0 20 20 64 65 73 69 67 6e 2d 74 69 6d 65 20 63 6f    design-time co
284c0 6d 70 6f 6e 65 6e 74 20 69 6e 73 74 61 6c 6c 65  mponent installe
284d0 72 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  r...        #.. 
284e0 20 20 20 20 20 20 20 73 65 74 20 74 65 73 74 49         set testI
284f0 6e 73 74 61 6c 6c 56 73 32 30 30 35 4c 6f 67 46  nstallVs2005LogF
28500 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65  ile [file native
28510 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20  name [file join 
28520 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
28530 67 65 74 53 51 4c 69 74 65 54 65 73 74 44 61 74  getSQLiteTestDat
28540 61 50 61 74 68 5d 20 49 6e 73 74 61 6c 6c 65 72  aPath] Installer
28550 5f 54 65 73 74 5f 56 73 32 30 30 35 2e 6c 6f 67  _Test_Vs2005.log
28560 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65  ]]....        se
28570 74 20 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32  t testInstallVs2
28580 30 30 38 4c 6f 67 46 69 6c 65 20 5b 66 69 6c 65  008LogFile [file
28590 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c   nativename [fil
285a0 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20  e join \..      
285b0 20 20 20 20 20 20 5b 67 65 74 53 51 4c 69 74 65        [getSQLite
285c0 54 65 73 74 44 61 74 61 50 61 74 68 5d 20 49 6e  TestDataPath] In
285d0 73 74 61 6c 6c 65 72 5f 54 65 73 74 5f 56 73 32  staller_Test_Vs2
285e0 30 30 38 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20  008.log]]....   
285f0 20 20 20 20 20 73 65 74 20 74 65 73 74 49 6e 73       set testIns
28600 74 61 6c 6c 56 73 32 30 31 30 4c 6f 67 46 69 6c  tallVs2010LogFil
28610 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61  e [file nativena
28620 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d  me [file join \.
28630 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65  .            [ge
28640 74 53 51 4c 69 74 65 54 65 73 74 44 61 74 61 50  tSQLiteTestDataP
28650 61 74 68 5d 20 49 6e 73 74 61 6c 6c 65 72 5f 54  ath] Installer_T
28660 65 73 74 5f 56 73 32 30 31 30 2e 6c 6f 67 5d 5d  est_Vs2010.log]]
28670 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20  ....        set 
28680 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 31  testInstallVs201
28690 32 4c 6f 67 46 69 6c 65 20 5b 66 69 6c 65 20 6e  2LogFile [file n
286a0 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20  ativename [file 
286b0 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20  join \..        
286c0 20 20 20 20 5b 67 65 74 53 51 4c 69 74 65 54 65      [getSQLiteTe
286d0 73 74 44 61 74 61 50 61 74 68 5d 20 49 6e 73 74  stDataPath] Inst
286e0 61 6c 6c 65 72 5f 54 65 73 74 5f 56 73 32 30 31  aller_Test_Vs201
286f0 32 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20  2.log]]....     
28700 20 20 20 73 65 74 20 74 65 73 74 49 6e 73 74 61     set testInsta
28710 6c 6c 56 73 32 30 31 33 4c 6f 67 46 69 6c 65 20  llVs2013LogFile 
28720 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65  [file nativename
28730 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20   [file join \.. 
28740 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 53             [getS
28750 51 4c 69 74 65 54 65 73 74 44 61 74 61 50 61 74  QLiteTestDataPat
28760 68 5d 20 49 6e 73 74 61 6c 6c 65 72 5f 54 65 73  h] Installer_Tes
28770 74 5f 56 73 32 30 31 33 2e 6c 6f 67 5d 5d 0d 0a  t_Vs2013.log]]..
28780 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 74 65  ..        set te
28790 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 31 35 4c  stInstallVs2015L
287a0 6f 67 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74  ogFile [file nat
287b0 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f  ivename [file jo
287c0 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  in \..          
287d0 20 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73 74    [getSQLiteTest
287e0 44 61 74 61 50 61 74 68 5d 20 49 6e 73 74 61 6c  DataPath] Instal
287f0 6c 65 72 5f 54 65 73 74 5f 56 73 32 30 31 35 2e  ler_Test_Vs2015.
28800 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  log]]....       
28810 20 73 65 74 20 74 65 73 74 55 6e 69 6e 73 74 61   set testUninsta
28820 6c 6c 56 73 32 30 30 35 4c 6f 67 46 69 6c 65 20  llVs2005LogFile 
28830 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65  [file nativename
28840 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20   [file join \.. 
28850 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 53             [getS
28860 51 4c 69 74 65 54 65 73 74 44 61 74 61 50 61 74  QLiteTestDataPat
28870 68 5d 20 55 6e 69 6e 73 74 61 6c 6c 65 72 5f 54  h] Uninstaller_T
28880 65 73 74 5f 56 73 32 30 30 35 2e 6c 6f 67 5d 5d  est_Vs2005.log]]
28890 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20  ....        set 
288a0 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32  testUninstallVs2
288b0 30 30 38 4c 6f 67 46 69 6c 65 20 5b 66 69 6c 65  008LogFile [file
288c0 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c   nativename [fil
288d0 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20  e join \..      
288e0 20 20 20 20 20 20 5b 67 65 74 53 51 4c 69 74 65        [getSQLite
288f0 54 65 73 74 44 61 74 61 50 61 74 68 5d 20 55 6e  TestDataPath] Un
28900 69 6e 73 74 61 6c 6c 65 72 5f 54 65 73 74 5f 56  installer_Test_V
28910 73 32 30 30 38 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20  s2008.log]].... 
28920 20 20 20 20 20 20 20 73 65 74 20 74 65 73 74 55         set testU
28930 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31 30 4c 6f  ninstallVs2010Lo
28940 67 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69  gFile [file nati
28950 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69  vename [file joi
28960 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n \..           
28970 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73 74 44   [getSQLiteTestD
28980 61 74 61 50 61 74 68 5d 20 55 6e 69 6e 73 74 61  ataPath] Uninsta
28990 6c 6c 65 72 5f 54 65 73 74 5f 56 73 32 30 31 30  ller_Test_Vs2010
289a0 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20  .log]]....      
289b0 20 20 73 65 74 20 74 65 73 74 55 6e 69 6e 73 74    set testUninst
289c0 61 6c 6c 56 73 32 30 31 32 4c 6f 67 46 69 6c 65  allVs2012LogFile
289d0 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d   [file nativenam
289e0 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a  e [file join \..
289f0 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74              [get
28a00 53 51 4c 69 74 65 54 65 73 74 44 61 74 61 50 61  SQLiteTestDataPa
28a10 74 68 5d 20 55 6e 69 6e 73 74 61 6c 6c 65 72 5f  th] Uninstaller_
28a20 54 65 73 74 5f 56 73 32 30 31 32 2e 6c 6f 67 5d  Test_Vs2012.log]
28a30 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74  ]....        set
28a40 20 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73   testUninstallVs
28a50 32 30 31 33 4c 6f 67 46 69 6c 65 20 5b 66 69 6c  2013LogFile [fil
28a60 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69  e nativename [fi
28a70 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20  le join \..     
28a80 20 20 20 20 20 20 20 5b 67 65 74 53 51 4c 69 74         [getSQLit
28a90 65 54 65 73 74 44 61 74 61 50 61 74 68 5d 20 55  eTestDataPath] U
28aa0 6e 69 6e 73 74 61 6c 6c 65 72 5f 54 65 73 74 5f  ninstaller_Test_
28ab0 56 73 32 30 31 33 2e 6c 6f 67 5d 5d 0d 0a 0d 0a  Vs2013.log]]....
28ac0 20 20 20 20 20 20 20 20 73 65 74 20 74 65 73 74          set test
28ad0 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31 35 4c  UninstallVs2015L
28ae0 6f 67 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74  ogFile [file nat
28af0 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f  ivename [file jo
28b00 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  in \..          
28b10 20 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73 74    [getSQLiteTest
28b20 44 61 74 61 50 61 74 68 5d 20 55 6e 69 6e 73 74  DataPath] Uninst
28b30 61 6c 6c 65 72 5f 54 65 73 74 5f 56 73 32 30 31  aller_Test_Vs201
28b40 35 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20  5.log]]....     
28b50 20 20 20 23 23 23 23 23 23 23 23 23 23 23 23 23     #############
28b60 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
28b70 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
28b80 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
28b90 23 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20  ##########....  
28ba0 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65        if {![have
28bb0 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65  Constraint [appe
28bc0 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a  ndArgs file_ \..
28bd0 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c              [fil
28be0 65 20 74 61 69 6c 20 24 65 6e 74 69 74 79 46 72  e tail $entityFr
28bf0 61 6d 65 77 6f 72 6b 44 6c 6c 46 69 6c 65 5d 5d  ameworkDllFile]]
28c00 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
28c10 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c       checkForFil
28c20 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  e $test_channel 
28c30 24 65 6e 74 69 74 79 46 72 61 6d 65 77 6f 72 6b  $entityFramework
28c40 44 6c 6c 46 69 6c 65 0d 0a 20 20 20 20 20 20 20  DllFile..       
28c50 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66   }....        if
28c60 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69   {![haveConstrai
28c70 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66  nt [appendArgs f
28c80 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20  ile_ \..        
28c90 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24      [file tail $
28ca0 69 6e 73 74 61 6c 6c 65 72 45 78 65 46 69 6c 65  installerExeFile
28cb0 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ]]]} then {..   
28cc0 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46         checkForF
28cd0 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65  ile $test_channe
28ce0 6c 20 24 69 6e 73 74 61 6c 6c 65 72 45 78 65 46  l $installerExeF
28cf0 69 6c 65 20 49 6e 73 74 61 6c 6c 65 72 2e 65 78  ile Installer.ex
28d00 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  e..        }....
28d10 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61          if {![ha
28d20 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70  veConstraint [ap
28d30 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c  pendArgs file_ \
28d40 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 66  ..            [f
28d50 69 6c 65 20 74 61 69 6c 20 24 73 71 6c 69 74 65  ile tail $sqlite
28d60 44 65 73 69 67 6e 65 72 44 6c 6c 46 69 6c 65 5d  DesignerDllFile]
28d70 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  ]]} then {..    
28d80 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69        checkForFi
28d90 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c  le $test_channel
28da0 20 24 73 71 6c 69 74 65 44 65 73 69 67 6e 65 72   $sqliteDesigner
28db0 44 6c 6c 46 69 6c 65 0d 0a 20 20 20 20 20 20 20  DllFile..       
28dc0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66   }....        if
28dd0 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69   {![haveConstrai
28de0 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66  nt [appendArgs f
28df0 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20  ile_ \..        
28e00 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24      [file tail $
28e10 73 79 73 74 65 6d 44 61 74 61 53 51 4c 69 74 65  systemDataSQLite
28e20 44 6c 6c 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e  DllFile]]]} then
28e30 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68   {..          ch
28e40 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74  eckForFile $test
28e50 5f 63 68 61 6e 6e 65 6c 20 24 73 79 73 74 65 6d  _channel $system
28e60 44 61 74 61 53 51 4c 69 74 65 44 6c 6c 46 69 6c  DataSQLiteDllFil
28e70 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  e..        }....
28e80 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61          if {![ha
28e90 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70  veConstraint [ap
28ea0 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c  pendArgs file_ \
28eb0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 66  ..            [f
28ec0 69 6c 65 20 74 61 69 6c 20 24 73 79 73 74 65 6d  ile tail $system
28ed0 44 61 74 61 53 51 4c 69 74 65 4c 69 6e 71 44 6c  DataSQLiteLinqDl
28ee0 6c 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b  lFile]]]} then {
28ef0 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68 65 63  ..          chec
28f00 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63  kForFile $test_c
28f10 68 61 6e 6e 65 6c 20 24 73 79 73 74 65 6d 44 61  hannel $systemDa
28f20 74 61 53 51 4c 69 74 65 4c 69 6e 71 44 6c 6c 46  taSQLiteLinqDllF
28f30 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  ile..        }..
28f40 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b  ..        if {![
28f50 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b  haveConstraint [
28f60 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f  appendArgs file_
28f70 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
28f80 5b 66 69 6c 65 20 74 61 69 6c 20 24 73 79 73 74  [file tail $syst
28f90 65 6d 44 61 74 61 53 51 4c 69 74 65 45 66 36 44  emDataSQLiteEf6D
28fa0 6c 6c 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20  llFile]]]} then 
28fb0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68 65  {..          che
28fc0 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f  ckForFile $test_
28fd0 63 68 61 6e 6e 65 6c 20 24 73 79 73 74 65 6d 44  channel $systemD
28fe0 61 74 61 53 51 4c 69 74 65 45 66 36 44 6c 6c 46  ataSQLiteEf6DllF
28ff0 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  ile..        }..
29000 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b  ..        if {![
29010 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b  haveConstraint [
29020 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f  appendArgs file_
29030 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
29040 5b 66 69 6c 65 20 74 61 69 6c 20 24 74 65 73 74  [file tail $test
29050 45 78 65 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e  ExeFile]]]} then
29060 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68   {..          ch
29070 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74  eckForFile $test
29080 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73 74 45 78  _channel $testEx
29090 65 46 69 6c 65 20 74 65 73 74 2e 65 78 65 0d 0a  eFile test.exe..
290a0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
290b0 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43       if {![haveC
290c0 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e  onstraint [appen
290d0 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20  dArgs file_ \.. 
290e0 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65             [file
290f0 20 74 61 69 6c 20 24 74 65 73 74 4c 69 6e 71 45   tail $testLinqE
29100 78 65 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20  xeFile]]]} then 
29110 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68 65  {..          che
29120 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f  ckForFile $test_
29130 63 68 61 6e 6e 65 6c 20 24 74 65 73 74 4c 69 6e  channel $testLin
29140 71 45 78 65 46 69 6c 65 20 74 65 73 74 6c 69 6e  qExeFile testlin
29150 71 2e 65 78 65 0d 0a 20 20 20 20 20 20 20 20 7d  q.exe..        }
29160 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b  ....        if {
29170 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74  ![haveConstraint
29180 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c   [appendArgs fil
29190 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  e_ \..          
291a0 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 74 65    [file tail $te
291b0 73 74 45 66 36 45 78 65 46 69 6c 65 5d 5d 5d 7d  stEf6ExeFile]]]}
291c0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
291d0 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20     checkForFile 
291e0 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74  $test_channel $t
291f0 65 73 74 45 66 36 45 78 65 46 69 6c 65 20 74 65  estEf6ExeFile te
29200 73 74 65 66 36 2e 65 78 65 0d 0a 20 20 20 20 20  stef6.exe..     
29210 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
29220 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72  if {![haveConstr
29230 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
29240 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20   file_ \..      
29250 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c        [file tail
29260 20 24 74 65 73 74 4c 69 6e 71 4f 75 74 46 69 6c   $testLinqOutFil
29270 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  e]]]} then {..  
29280 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72          checkFor
29290 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e  File $test_chann
292a0 65 6c 20 24 74 65 73 74 4c 69 6e 71 4f 75 74 46  el $testLinqOutF
292b0 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  ile..        }..
292c0 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b  ..        if {![
292d0 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b  haveConstraint [
292e0 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f  appendArgs file_
292f0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
29300 5b 66 69 6c 65 20 74 61 69 6c 20 24 6e 6f 72 74  [file tail $nort
29310 68 77 69 6e 64 45 66 44 62 46 69 6c 65 5d 5d 5d  hwindEfDbFile]]]
29320 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
29330 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65      checkForFile
29340 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24   $test_channel $
29350 6e 6f 72 74 68 77 69 6e 64 45 66 44 62 46 69 6c  northwindEfDbFil
29360 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  e..        }....
29370 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61          if {![ha
29380 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70  veConstraint [ap
29390 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c  pendArgs file_ \
293a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 66  ..            [f
293b0 69 6c 65 20 74 61 69 6c 20 24 6e 6f 6e 57 61 6c  ile tail $nonWal
293c0 44 62 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20  DbFile]]]} then 
293d0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68 65  {..          che
293e0 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f  ckForFile $test_
293f0 63 68 61 6e 6e 65 6c 20 24 6e 6f 6e 57 61 6c 44  channel $nonWalD
29400 62 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d  bFile..        }
29410 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b  ....        if {
29420 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74  ![haveConstraint
29430 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c   [appendArgs fil
29440 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  e_ \..          
29450 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 77 61    [file tail $wa
29460 6c 44 62 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e  lDbFile]]]} then
29470 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68   {..          ch
29480 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74  eckForFile $test
29490 5f 63 68 61 6e 6e 65 6c 20 24 77 61 6c 44 62 46  _channel $walDbF
294a0 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  ile..        }..
294b0 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b  ..        if {![
294c0 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b  haveConstraint [
294d0 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f  appendArgs file_
294e0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
294f0 5b 66 69 6c 65 20 74 61 69 6c 20 24 74 65 73 74  [file tail $test
29500 49 6e 73 74 61 6c 6c 56 73 32 30 30 35 4c 6f 67  InstallVs2005Log
29510 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d  File]]]} then {.
29520 0a 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b  .          check
29530 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68  ForFile $test_ch
29540 61 6e 6e 65 6c 20 24 74 65 73 74 49 6e 73 74 61  annel $testInsta
29550 6c 6c 56 73 32 30 30 35 4c 6f 67 46 69 6c 65 0d  llVs2005LogFile.
29560 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
29570 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65        if {![have
29580 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65  Constraint [appe
29590 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a  ndArgs file_ \..
295a0 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c              [fil
295b0 65 20 74 61 69 6c 20 24 74 65 73 74 49 6e 73 74  e tail $testInst
295c0 61 6c 6c 56 73 32 30 30 38 4c 6f 67 46 69 6c 65  allVs2008LogFile
295d0 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ]]]} then {..   
295e0 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46         checkForF
295f0 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65  ile $test_channe
29600 6c 20 24 74 65 73 74 49 6e 73 74 61 6c 6c 56 73  l $testInstallVs
29610 32 30 30 38 4c 6f 67 46 69 6c 65 0d 0a 20 20 20  2008LogFile..   
29620 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
29630 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73    if {![haveCons
29640 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
29650 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20  gs file_ \..    
29660 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61          [file ta
29670 69 6c 20 24 74 65 73 74 49 6e 73 74 61 6c 6c 56  il $testInstallV
29680 73 32 30 31 30 4c 6f 67 46 69 6c 65 5d 5d 5d 7d  s2010LogFile]]]}
29690 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
296a0 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20     checkForFile 
296b0 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74  $test_channel $t
296c0 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 31 30  estInstallVs2010
296d0 4c 6f 67 46 69 6c 65 0d 0a 20 20 20 20 20 20 20  LogFile..       
296e0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66   }....        if
296f0 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69   {![haveConstrai
29700 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66  nt [appendArgs f
29710 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20  ile_ \..        
29720 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24      [file tail $
29730 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 31  testInstallVs201
29740 32 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74 68 65  2LogFile]]]} the
29750 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63  n {..          c
29760 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73  heckForFile $tes
29770 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73 74 49  t_channel $testI
29780 6e 73 74 61 6c 6c 56 73 32 30 31 32 4c 6f 67 46  nstallVs2012LogF
29790 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  ile..        }..
297a0 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b  ..        if {![
297b0 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b  haveConstraint [
297c0 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f  appendArgs file_
297d0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
297e0 5b 66 69 6c 65 20 74 61 69 6c 20 24 74 65 73 74  [file tail $test
297f0 49 6e 73 74 61 6c 6c 56 73 32 30 31 33 4c 6f 67  InstallVs2013Log
29800 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d  File]]]} then {.
29810 0a 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b  .          check
29820 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68  ForFile $test_ch
29830 61 6e 6e 65 6c 20 24 74 65 73 74 49 6e 73 74 61  annel $testInsta
29840 6c 6c 56 73 32 30 31 33 4c 6f 67 46 69 6c 65 0d  llVs2013LogFile.
29850 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
29860 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65        if {![have
29870 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65  Constraint [appe
29880 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a  ndArgs file_ \..
29890 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c              [fil
298a0 65 20 74 61 69 6c 20 24 74 65 73 74 49 6e 73 74  e tail $testInst
298b0 61 6c 6c 56 73 32 30 31 35 4c 6f 67 46 69 6c 65  allVs2015LogFile
298c0 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ]]]} then {..   
298d0 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46         checkForF
298e0 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65  ile $test_channe
298f0 6c 20 24 74 65 73 74 49 6e 73 74 61 6c 6c 56 73  l $testInstallVs
29900 32 30 31 35 4c 6f 67 46 69 6c 65 0d 0a 20 20 20  2015LogFile..   
29910 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
29920 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73    if {![haveCons
29930 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
29940 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20  gs file_ \..    
29950 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61          [file ta
29960 69 6c 20 24 74 65 73 74 55 6e 69 6e 73 74 61 6c  il $testUninstal
29970 6c 56 73 32 30 30 35 4c 6f 67 46 69 6c 65 5d 5d  lVs2005LogFile]]
29980 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
29990 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c       checkForFil
299a0 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  e $test_channel 
299b0 24 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73  $testUninstallVs
299c0 32 30 30 35 4c 6f 67 46 69 6c 65 0d 0a 20 20 20  2005LogFile..   
299d0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
299e0 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73    if {![haveCons
299f0 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
29a00 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20  gs file_ \..    
29a10 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61          [file ta
29a20 69 6c 20 24 74 65 73 74 55 6e 69 6e 73 74 61 6c  il $testUninstal
29a30 6c 56 73 32 30 30 38 4c 6f 67 46 69 6c 65 5d 5d  lVs2008LogFile]]
29a40 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
29a50 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c       checkForFil
29a60 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  e $test_channel 
29a70 24 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73  $testUninstallVs
29a80 32 30 30 38 4c 6f 67 46 69 6c 65 0d 0a 20 20 20  2008LogFile..   
29a90 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
29aa0 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73    if {![haveCons
29ab0 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
29ac0 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20  gs file_ \..    
29ad0 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61          [file ta
29ae0 69 6c 20 24 74 65 73 74 55 6e 69 6e 73 74 61 6c  il $testUninstal
29af0 6c 56 73 32 30 31 30 4c 6f 67 46 69 6c 65 5d 5d  lVs2010LogFile]]
29b00 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
29b10 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c       checkForFil
29b20 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  e $test_channel 
29b30 24 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73  $testUninstallVs
29b40 32 30 31 30 4c 6f 67 46 69 6c 65 0d 0a 20 20 20  2010LogFile..   
29b50 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
29b60 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73    if {![haveCons
29b70 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
29b80 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20  gs file_ \..    
29b90 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61          [file ta
29ba0 69 6c 20 24 74 65 73 74 55 6e 69 6e 73 74 61 6c  il $testUninstal
29bb0 6c 56 73 32 30 31 32 4c 6f 67 46 69 6c 65 5d 5d  lVs2012LogFile]]
29bc0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
29bd0 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c       checkForFil
29be0 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  e $test_channel 
29bf0 24 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73  $testUninstallVs
29c00 32 30 31 32 4c 6f 67 46 69 6c 65 0d 0a 20 20 20  2012LogFile..   
29c10 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
29c20 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73    if {![haveCons
29c30 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
29c40 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20  gs file_ \..    
29c50 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61          [file ta
29c60 69 6c 20 24 74 65 73 74 55 6e 69 6e 73 74 61 6c  il $testUninstal
29c70 6c 56 73 32 30 31 33 4c 6f 67 46 69 6c 65 5d 5d  lVs2013LogFile]]
29c80 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
29c90 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c       checkForFil
29ca0 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  e $test_channel 
29cb0 24 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73  $testUninstallVs
29cc0 32 30 31 33 4c 6f 67 46 69 6c 65 0d 0a 20 20 20  2013LogFile..   
29cd0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
29ce0 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73    if {![haveCons
29cf0 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
29d00 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20  gs file_ \..    
29d10 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61          [file ta
29d20 69 6c 20 24 74 65 73 74 55 6e 69 6e 73 74 61 6c  il $testUninstal
29d30 6c 56 73 32 30 31 35 4c 6f 67 46 69 6c 65 5d 5d  lVs2015LogFile]]
29d40 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
29d50 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c       checkForFil
29d60 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  e $test_channel 
29d70 24 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73  $testUninstallVs
29d80 32 30 31 35 4c 6f 67 46 69 6c 65 0d 0a 20 20 20  2015LogFile..   
29d90 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
29da0 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
29db0 72 6f 63 20 72 75 6e 53 51 4c 69 74 65 54 65 73  roc runSQLiteTes
29dc0 74 46 69 6c 65 73 45 70 69 6c 6f 67 75 65 20 7b  tFilesEpilogue {
29dd0 7d 20 7b 0d 0a 20 20 20 20 20 20 75 70 6c 65 76  } {..      uplev
29de0 65 6c 20 31 20 7b 0d 0a 20 20 20 20 20 20 20 20  el 1 {..        
29df0 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69  unset -nocomplai
29e00 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n \..           
29e10 20 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73   testUninstallVs
29e20 32 30 31 35 4c 6f 67 46 69 6c 65 20 74 65 73 74  2015LogFile test
29e30 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31 33 4c  UninstallVs2013L
29e40 6f 67 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20  ogFile \..      
29e50 20 20 20 20 20 20 74 65 73 74 55 6e 69 6e 73 74        testUninst
29e60 61 6c 6c 56 73 32 30 31 32 4c 6f 67 46 69 6c 65  allVs2012LogFile
29e70 20 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73   testUninstallVs
29e80 32 30 31 30 4c 6f 67 46 69 6c 65 20 5c 0d 0a 20  2010LogFile \.. 
29e90 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 55             testU
29ea0 6e 69 6e 73 74 61 6c 6c 56 73 32 30 30 38 4c 6f  ninstallVs2008Lo
29eb0 67 46 69 6c 65 20 74 65 73 74 55 6e 69 6e 73 74  gFile testUninst
29ec0 61 6c 6c 56 73 32 30 30 35 4c 6f 67 46 69 6c 65  allVs2005LogFile
29ed0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
29ee0 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 31  testInstallVs201
29ef0 35 4c 6f 67 46 69 6c 65 20 74 65 73 74 49 6e 73  5LogFile testIns
29f00 74 61 6c 6c 56 73 32 30 31 33 4c 6f 67 46 69 6c  tallVs2013LogFil
29f10 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
29f20 20 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30   testInstallVs20
29f30 31 32 4c 6f 67 46 69 6c 65 20 74 65 73 74 49 6e  12LogFile testIn
29f40 73 74 61 6c 6c 56 73 32 30 31 30 4c 6f 67 46 69  stallVs2010LogFi
29f50 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  le \..          
29f60 20 20 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32    testInstallVs2
29f70 30 30 38 4c 6f 67 46 69 6c 65 20 74 65 73 74 49  008LogFile testI
29f80 6e 73 74 61 6c 6c 56 73 32 30 30 35 4c 6f 67 46  nstallVs2005LogF
29f90 69 6c 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20 75  ile....        u
29fa0 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e  nset -nocomplain
29fb0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
29fc0 6e 6f 72 74 68 77 69 6e 64 45 66 44 62 46 69 6c  northwindEfDbFil
29fd0 65 20 74 65 73 74 4c 69 6e 71 4f 75 74 46 69 6c  e testLinqOutFil
29fe0 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
29ff0 20 77 61 6c 44 62 46 69 6c 65 20 6e 6f 6e 57 61   walDbFile nonWa
2a000 6c 44 62 46 69 6c 65 0d 0a 0d 0a 20 20 20 20 20  lDbFile....     
2a010 20 20 20 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70     unset -nocomp
2a020 6c 61 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20  lain \..        
2a030 20 20 20 20 74 65 73 74 45 66 36 45 78 65 46 69      testEf6ExeFi
2a040 6c 65 20 74 65 73 74 4c 69 6e 71 45 78 65 46 69  le testLinqExeFi
2a050 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  le \..          
2a060 20 20 74 65 73 74 45 78 65 46 69 6c 65 20 73 79    testExeFile sy
2a070 73 74 65 6d 44 61 74 61 53 51 4c 69 74 65 45 66  stemDataSQLiteEf
2a080 36 44 6c 6c 46 69 6c 65 20 5c 0d 0a 20 20 20 20  6DllFile \..    
2a090 20 20 20 20 20 20 20 20 73 79 73 74 65 6d 44 61          systemDa
2a0a0 74 61 53 51 4c 69 74 65 4c 69 6e 71 44 6c 6c 46  taSQLiteLinqDllF
2a0b0 69 6c 65 20 73 79 73 74 65 6d 44 61 74 61 53 51  ile systemDataSQ
2a0c0 4c 69 74 65 44 6c 6c 46 69 6c 65 20 5c 0d 0a 20  LiteDllFile \.. 
2a0d0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
2a0e0 65 44 65 73 69 67 6e 65 72 44 6c 6c 46 69 6c 65  eDesignerDllFile
2a0f0 20 69 6e 73 74 61 6c 6c 65 72 45 78 65 46 69 6c   installerExeFil
2a100 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
2a110 20 65 6e 74 69 74 79 46 72 61 6d 65 77 6f 72 6b   entityFramework
2a120 44 6c 6c 46 69 6c 65 0d 0a 20 20 20 20 20 20 7d  DllFile..      }
2a130 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
2a140 70 72 6f 63 20 72 75 6e 53 51 4c 69 74 65 54 65  proc runSQLiteTe
2a150 73 74 45 70 69 6c 6f 67 75 65 20 7b 7d 20 7b 0d  stEpilogue {} {.
2a160 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
2a170 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20 72 75 6e  # NOTE: Skip run
2a180 6e 69 6e 67 20 6f 75 72 20 63 75 73 74 6f 6d 20  ning our custom 
2a190 65 70 69 6c 6f 67 75 65 20 69 66 20 74 68 65 20  epilogue if the 
2a1a0 6d 61 69 6e 20 6f 6e 65 20 68 61 73 20 62 65 65  main one has bee
2a1b0 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  n..      #      
2a1c0 20 73 6b 69 70 70 65 64 2e 0d 0a 20 20 20 20 20   skipped...     
2a1d0 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b   #..      if {![
2a1e0 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
2a1f0 28 65 70 69 6c 6f 67 75 65 2e 65 61 67 6c 65 29  (epilogue.eagle)
2a200 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
2a210 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
2a220 4e 4f 54 45 3a 20 53 68 6f 77 20 77 68 65 6e 20  NOTE: Show when 
2a230 6f 75 72 20 74 65 73 74 73 20 61 63 74 75 61 6c  our tests actual
2a240 6c 79 20 65 6e 64 65 64 20 28 6e 6f 77 29 2e 0d  ly ended (now)..
2a250 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
2a260 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
2a270 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
2a280 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
2a290 20 20 20 20 20 22 2d 2d 2d 2d 20 53 79 73 74 65       "---- Syste
2a2a0 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 74 65  m.Data.SQLite te
2a2b0 73 74 73 20 65 6e 64 65 64 20 61 74 20 22 20 5c  sts ended at " \
2a2c0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 63  ..            [c
2a2d0 6c 6f 63 6b 20 66 6f 72 6d 61 74 20 5b 63 6c 6f  lock format [clo
2a2e0 63 6b 20 73 65 63 6f 6e 64 73 5d 5d 20 5c 6e 5d  ck seconds]] \n]
2a2f0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
2a300 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4c         # NOTE: L
2a310 6f 61 64 20 74 68 65 20 22 65 70 69 6c 6f 67 75  oad the "epilogu
2a320 65 22 20 63 75 73 74 6f 6d 20 70 65 72 2d 75 73  e" custom per-us
2a330 65 72 20 61 6e 64 2f 6f 72 20 70 65 72 2d 68 6f  er and/or per-ho
2a340 73 74 20 74 65 73 74 0d 0a 20 20 20 20 20 20 20  st test..       
2a350 20 23 20 20 20 20 20 20 20 73 65 74 74 69 6e 67   #       setting
2a360 73 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20  s now...        
2a370 23 0d 0a 20 20 20 20 20 20 20 20 75 70 6c 65 76  #..        uplev
2a380 65 6c 20 31 20 5b 6c 69 73 74 20 6c 6f 61 64 53  el 1 [list loadS
2a390 51 4c 69 74 65 54 65 73 74 53 65 74 74 69 6e 67  QLiteTestSetting
2a3a0 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
2a3b0 6c 20 2e 65 70 69 6c 6f 67 75 65 5d 0d 0a 0d 0a  l .epilogue]....
2a3c0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
2a3d0 20 20 20 23 20 42 55 47 46 49 58 3a 20 42 65 66     # BUGFIX: Bef
2a3e0 6f 72 65 20 63 68 65 63 6b 69 6e 67 20 74 68 65  ore checking the
2a3f0 20 66 69 6e 61 6c 20 72 65 73 6f 75 72 63 65 73   final resources
2a400 20 69 6e 20 75 73 65 20 62 79 20 53 51 4c 69 74   in use by SQLit
2a410 65 2c 20 6d 61 6b 65 0d 0a 20 20 20 20 20 20 20  e, make..       
2a420 20 23 20 20 20 20 20 20 20 20 20 73 75 72 65 20   #         sure 
2a430 62 6f 74 68 20 6f 66 20 74 68 65 20 50 52 41 47  both of the PRAG
2a440 4d 41 20 72 65 6c 61 74 65 64 20 64 69 72 65 63  MA related direc
2a450 74 6f 72 79 20 6e 61 6d 65 73 20 61 72 65 20 66  tory names are f
2a460 72 65 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 23  reed...        #
2a470 0d 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 46  ..        checkF
2a480 6f 72 53 51 4c 69 74 65 44 69 72 65 63 74 6f 72  orSQLiteDirector
2a490 69 65 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  ies $::test_chan
2a4a0 6e 65 6c 20 74 72 75 65 0d 0a 0d 0a 20 20 20 20  nel true....    
2a4b0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
2a4c0 20 4e 4f 54 45 3a 20 41 6c 73 6f 20 72 65 70 6f   NOTE: Also repo
2a4d0 72 74 20 74 68 65 20 72 65 73 6f 75 72 63 65 20  rt the resource 
2a4e0 75 73 61 67 65 20 61 66 74 65 72 20 72 75 6e 6e  usage after runn
2a4f0 69 6e 67 20 74 68 65 20 74 65 73 74 73 2e 0d 0a  ing the tests...
2a500 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
2a510 20 20 20 72 65 70 6f 72 74 53 51 4c 69 74 65 52     reportSQLiteR
2a520 65 73 6f 75 72 63 65 73 20 24 3a 3a 74 65 73 74  esources $::test
2a530 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20  _channel....    
2a540 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
2a550 20 4e 4f 54 45 3a 20 52 65 70 6f 72 74 20 74 68   NOTE: Report th
2a560 65 20 63 72 69 74 69 63 61 6c 20 68 61 6e 64 6c  e critical handl
2a570 65 20 63 6f 75 6e 74 73 20 61 66 74 65 72 20 72  e counts after r
2a580 75 6e 6e 69 6e 67 20 74 68 65 20 74 65 73 74 73  unning the tests
2a590 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
2a5a0 20 20 20 20 20 20 67 65 74 53 51 4c 69 74 65 48        getSQLiteH
2a5b0 61 6e 64 6c 65 43 6f 75 6e 74 73 20 24 3a 3a 74  andleCounts $::t
2a5c0 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20  est_channel.... 
2a5d0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
2a5e0 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 6e 65 63    # NOTE: If nec
2a5f0 65 73 73 61 72 79 2c 20 64 69 73 61 62 6c 65 20  essary, disable 
2a600 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64  shared-cache mod
2a610 65 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20  e now...        
2a620 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  #..        if {[
2a630 68 61 73 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e  hasRuntimeOption
2a640 20 73 68 61 72 65 64 43 61 63 68 65 5d 7d 20 74   sharedCache]} t
2a650 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
2a660 20 65 6e 61 62 6c 65 53 68 61 72 65 64 43 61 63   enableSharedCac
2a670 68 65 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  he $::test_chann
2a680 65 6c 20 66 61 6c 73 65 0d 0a 20 20 20 20 20 20  el false..      
2a690 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20    }..      }..  
2a6a0 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 23 23 23 23    }.....    ####
2a6b0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2a6c0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2a6d0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2a6e0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2a6f0 23 23 23 23 23 23 23 0d 0a 20 20 20 20 23 23 23  #######..    ###
2a700 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2a710 23 23 23 23 23 23 23 23 23 23 20 45 4e 44 20 45  ########## END E
2a720 61 67 6c 65 20 4f 4e 4c 59 20 23 23 23 23 23 23  agle ONLY ######
2a730 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2a740 23 23 23 23 23 23 23 23 0d 0a 20 20 20 20 23 23  ########..    ##
2a750 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2a760 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2a770 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2a780 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2a790 23 23 23 23 23 23 23 23 23 0d 0a 20 20 7d 0d 0a  #########..  }..
2a7a0 0d 0a 20 20 23 0d 0a 20 20 23 20 4e 4f 54 45 3a  ..  #..  # NOTE:
2a7b0 20 53 61 76 65 20 74 68 65 20 6e 61 6d 65 20 6f   Save the name o
2a7c0 66 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  f the directory 
2a7d0 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 69 73 20  containing this 
2a7e0 66 69 6c 65 2e 0d 0a 20 20 23 0d 0a 20 20 69 66  file...  #..  if
2a7f0 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
2a800 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79  common_directory
2a810 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 73  ]} then {..    s
2a820 65 74 20 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74  et common_direct
2a830 6f 72 79 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d  ory [file dirnam
2a840 65 20 5b 69 6e 66 6f 20 73 63 72 69 70 74 5d 5d  e [info script]]
2a850 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 23 0d 0a 20 20  ..  }....  #..  
2a860 23 20 4e 4f 54 45 3a 20 50 72 6f 76 69 64 65 20  # NOTE: Provide 
2a870 74 68 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  the System.Data.
2a880 53 51 4c 69 74 65 20 74 65 73 74 20 70 61 63 6b  SQLite test pack
2a890 61 67 65 20 74 6f 20 74 68 65 20 69 6e 74 65 72  age to the inter
2a8a0 70 72 65 74 65 72 2e 0d 0a 20 20 23 0d 0a 20 20  preter...  #..  
2a8b0 70 61 63 6b 61 67 65 20 70 72 6f 76 69 64 65 20  package provide 
2a8c0 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
2a8d0 74 65 2e 54 65 73 74 20 31 2e 30 0d 0a 7d 0d 0a  te.Test 1.0..}..