System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact b415af21e0cc245901cc2c9b36937389022b97fe:


0000: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0010: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0020: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0030: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0040: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d  ###############.
0050: 0a 23 0d 0a 23 20 63 6f 6d 6d 6f 6e 2e 65 61 67  .#..# common.eag
0060: 6c 65 20 2d 2d 0d 0a 23 0d 0a 23 20 57 72 69 74  le --..#..# Writ
0070: 74 65 6e 20 62 79 20 4a 6f 65 20 4d 69 73 74 61  ten by Joe Mista
0080: 63 68 6b 69 6e 2e 0d 0a 23 20 52 65 6c 65 61 73  chkin...# Releas
0090: 65 64 20 74 6f 20 74 68 65 20 70 75 62 6c 69 63  ed to the public
00a0: 20 64 6f 6d 61 69 6e 2c 20 75 73 65 20 61 74 20   domain, use at 
00b0: 79 6f 75 72 20 6f 77 6e 20 72 69 73 6b 21 0d 0a  your own risk!..
00c0: 23 0d 0a 23 23 23 23 23 23 23 23 23 23 23 23 23  #..#############
00d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
00e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
00f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0100: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0110: 23 23 0d 0a 0d 0a 23 0d 0a 23 20 4e 4f 54 45 3a  ##....#..# NOTE:
0120: 20 55 73 65 20 6f 75 72 20 6f 77 6e 20 6e 61 6d   Use our own nam
0130: 65 73 70 61 63 65 20 68 65 72 65 20 62 65 63 61  espace here beca
0140: 75 73 65 20 65 76 65 6e 20 74 68 6f 75 67 68 20  use even though 
0150: 77 65 20 64 6f 20 6e 6f 74 20 64 69 72 65 63 74  we do not direct
0160: 6c 79 0d 0a 23 20 20 20 20 20 20 20 73 75 70 70  ly..#       supp
0170: 6f 72 74 20 6e 61 6d 65 73 70 61 63 65 73 20 6f  ort namespaces o
0180: 75 72 73 65 6c 76 65 73 2c 20 77 65 20 64 6f 20  urselves, we do 
0190: 6e 6f 74 20 77 61 6e 74 20 74 6f 20 70 6f 6c 6c  not want to poll
01a0: 75 74 65 20 74 68 65 20 67 6c 6f 62 61 6c 0d 0a  ute the global..
01b0: 23 20 20 20 20 20 20 20 6e 61 6d 65 73 70 61 63  #       namespac
01c0: 65 20 69 66 20 74 68 69 73 20 73 63 72 69 70 74  e if this script
01d0: 20 61 63 74 75 61 6c 6c 79 20 65 6e 64 73 20 75   actually ends u
01e0: 70 20 62 65 69 6e 67 20 65 76 61 6c 75 61 74 65  p being evaluate
01f0: 64 20 69 6e 20 54 63 6c 2e 0d 0a 23 0d 0a 6e 61  d in Tcl...#..na
0200: 6d 65 73 70 61 63 65 20 65 76 61 6c 20 3a 3a 45  mespace eval ::E
0210: 61 67 6c 65 20 7b 0d 0a 20 20 69 66 20 7b 5b 69  agle {..  if {[i
0220: 73 45 61 67 6c 65 5d 7d 20 74 68 65 6e 20 7b 0d  sEagle]} then {.
0230: 0a 20 20 20 20 23 23 23 23 23 23 23 23 23 23 23  .    ###########
0240: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0250: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0260: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0270: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0280: 0d 0a 20 20 20 20 23 23 23 23 23 23 23 23 23 23  ..    ##########
0290: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
02a0: 23 23 20 42 45 47 49 4e 20 45 61 67 6c 65 20 4f  ## BEGIN Eagle O
02b0: 4e 4c 59 20 23 23 23 23 23 23 23 23 23 23 23 23  NLY ############
02c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
02d0: 23 0d 0a 20 20 20 20 23 23 23 23 23 23 23 23 23  #..    #########
02e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
02f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0300: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0310: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0320: 23 23 0d 0a 0d 0a 20 20 20 20 70 72 6f 63 20 67  ##....    proc g
0330: 65 74 53 51 4c 69 74 65 44 65 66 69 6e 65 43 6f  etSQLiteDefineCo
0340: 6e 73 74 61 6e 74 50 72 65 66 69 78 20 7b 7d 20  nstantPrefix {} 
0350: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
0360: 20 20 23 20 4e 4f 54 45 3a 20 53 65 65 20 69 66    # NOTE: See if
0370: 20 74 68 65 20 64 65 66 69 6e 65 20 63 6f 6e 73   the define cons
0380: 74 61 6e 74 20 70 72 65 66 69 78 20 73 65 74 74  tant prefix sett
0390: 69 6e 67 20 68 61 73 20 62 65 65 6e 20 6f 76 65  ing has been ove
03a0: 72 72 69 64 64 65 6e 0d 0a 20 20 20 20 20 20 23  rridden..      #
03b0: 20 20 20 20 20 20 20 62 79 20 74 68 65 20 75 73         by the us
03c0: 65 72 20 28 65 2e 67 2e 20 6f 6e 20 74 68 65 20  er (e.g. on the 
03d0: 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 29 2e 0d 0a  command line)...
03e0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
03f0: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
0400: 3a 3a 64 65 66 69 6e 65 5f 63 6f 6e 73 74 61 6e  ::define_constan
0410: 74 5f 70 72 65 66 69 78 5d 20 26 26 20 5c 0d 0a  t_prefix] && \..
0420: 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e            [strin
0430: 67 20 6c 65 6e 67 74 68 20 24 3a 3a 64 65 66 69  g length $::defi
0440: 6e 65 5f 63 6f 6e 73 74 61 6e 74 5f 70 72 65 66  ne_constant_pref
0450: 69 78 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  ix] > 0} then {.
0460: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
0470: 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20      # NOTE: Use 
0480: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 64 65  the specified de
0490: 66 69 6e 65 20 63 6f 6e 73 74 61 6e 74 20 70 72  fine constant pr
04a0: 65 66 69 78 2e 0d 0a 20 20 20 20 20 20 20 20 23  efix...        #
04b0: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
04c0: 20 24 3a 3a 64 65 66 69 6e 65 5f 63 6f 6e 73 74   $::define_const
04d0: 61 6e 74 5f 70 72 65 66 69 78 0d 0a 20 20 20 20  ant_prefix..    
04e0: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
04f0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
0500: 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20 64   NOTE: Use the d
0510: 65 66 61 75 6c 74 20 64 65 66 69 6e 65 20 63 6f  efault define co
0520: 6e 73 74 61 6e 74 20 70 72 65 66 69 78 2e 0d 0a  nstant prefix...
0530: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
0540: 20 20 20 72 65 74 75 72 6e 20 64 65 66 69 6e 65     return define
0550: 43 6f 6e 73 74 61 6e 74 2e 53 79 73 74 65 6d 2e  Constant.System.
0560: 44 61 74 61 2e 53 51 4c 69 74 65 2e 0d 0a 20 20  Data.SQLite...  
0570: 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
0580: 0a 20 20 20 20 70 72 6f 63 20 68 61 76 65 53 51  .    proc haveSQ
0590: 4c 69 74 65 44 65 66 69 6e 65 43 6f 6e 73 74 61  LiteDefineConsta
05a0: 6e 74 20 7b 20 6e 61 6d 65 20 7d 20 7b 0d 0a 20  nt { name } {.. 
05b0: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 68 61 76       return [hav
05c0: 65 43 6f 6e 73 74 72 61 69 6e 74 20 5c 0d 0a 20  eConstraint \.. 
05d0: 20 20 20 20 20 20 20 20 20 5b 61 70 70 65 6e 64           [append
05e0: 41 72 67 73 20 5b 67 65 74 53 51 4c 69 74 65 44  Args [getSQLiteD
05f0: 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 50 72 65  efineConstantPre
0600: 66 69 78 5d 20 24 6e 61 6d 65 5d 5d 0d 0a 20 20  fix] $name]]..  
0610: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
0620: 20 67 65 74 42 75 69 6c 64 59 65 61 72 20 7b 7d   getBuildYear {}
0630: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
0640: 20 20 20 23 20 4e 4f 54 45 3a 20 53 65 65 20 69     # NOTE: See i
0650: 66 20 74 68 65 20 22 79 65 61 72 22 20 73 65 74  f the "year" set
0660: 74 69 6e 67 20 68 61 73 20 62 65 65 6e 20 6f 76  ting has been ov
0670: 65 72 72 69 64 64 65 6e 20 62 79 20 74 68 65 20  erridden by the 
0680: 75 73 65 72 20 28 65 2e 67 2e 0d 0a 20 20 20 20  user (e.g...    
0690: 20 20 23 20 20 20 20 20 20 20 6f 6e 20 74 68 65    #       on the
06a0: 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 29 2e 20   command line). 
06b0: 20 54 68 69 73 20 68 65 6c 70 73 20 63 6f 6e 74   This helps cont
06c0: 72 6f 6c 20 65 78 61 63 74 6c 79 20 77 68 69 63  rol exactly whic
06d0: 68 20 73 65 74 20 6f 66 0d 0a 20 20 20 20 20 20  h set of..      
06e0: 23 20 20 20 20 20 20 20 62 69 6e 61 72 69 65 73  #       binaries
06f0: 20 77 65 20 61 72 65 20 74 65 73 74 69 6e 67 2c   we are testing,
0700: 20 74 68 6f 73 65 20 70 72 6f 64 75 63 65 64 20   those produced 
0710: 75 73 69 6e 67 20 74 68 65 20 56 69 73 75 61 6c  using the Visual
0720: 20 53 74 75 64 69 6f 0d 0a 20 20 20 20 20 20 23   Studio..      #
0730: 20 20 20 20 20 20 20 32 30 30 35 2c 20 32 30 30         2005, 200
0740: 38 2c 20 32 30 31 30 2c 20 32 30 31 32 2c 20 32  8, 2010, 2012, 2
0750: 30 31 33 2c 20 6f 72 20 32 30 31 35 20 62 75 69  013, or 2015 bui
0760: 6c 64 20 73 79 73 74 65 6d 73 2e 20 20 54 6f 20  ld systems.  To 
0770: 6f 76 65 72 72 69 64 65 0d 0a 20 20 20 20 20 20  override..      
0780: 23 20 20 20 20 20 20 20 74 68 69 73 20 76 61 6c  #       this val
0790: 75 65 20 76 69 61 20 74 68 65 20 63 6f 6d 6d 61  ue via the comma
07a0: 6e 64 20 6c 69 6e 65 2c 20 65 6e 74 65 72 20 61  nd line, enter a
07b0: 20 63 6f 6d 6d 61 6e 64 20 73 69 6d 69 6c 61 72   command similar
07c0: 20 74 6f 20 6f 6e 65 0d 0a 20 20 20 20 20 20 23   to one..      #
07d0: 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 66 6f         of the fo
07e0: 6c 6c 6f 77 69 6e 67 20 28 61 6c 6c 20 6f 6e 20  llowing (all on 
07f0: 6f 6e 65 20 6c 69 6e 65 29 3a 0d 0a 20 20 20 20  one line):..    
0800: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 20 20 20    #..      #    
0810: 20 20 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78     EagleShell.ex
0820: 65 20 2d 61 6e 79 49 6e 69 74 69 61 6c 69 7a 65  e -anyInitialize
0830: 20 22 73 65 74 20 74 65 73 74 5f 79 65 61 72 20   "set test_year 
0840: 32 30 30 35 22 0d 0a 20 20 20 20 20 20 23 20 20  2005"..      #  
0850: 20 20 20 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70         -file .\p
0860: 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65  ath\to\all.eagle
0870: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
0880: 20 23 20 20 20 20 20 20 20 45 61 67 6c 65 53 68   #       EagleSh
0890: 65 6c 6c 2e 65 78 65 20 2d 61 6e 79 49 6e 69 74  ell.exe -anyInit
08a0: 69 61 6c 69 7a 65 20 22 73 65 74 20 74 65 73 74  ialize "set test
08b0: 5f 79 65 61 72 20 32 30 30 38 22 0d 0a 20 20 20  _year 2008"..   
08c0: 20 20 20 23 20 20 20 20 20 20 20 20 20 2d 66 69     #         -fi
08d0: 6c 65 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c  le .\path\to\all
08e0: 2e 65 61 67 6c 65 0d 0a 20 20 20 20 20 20 23 0d  .eagle..      #.
08f0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 45  .      #       E
0900: 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65 20 2d 61  agleShell.exe -a
0910: 6e 79 49 6e 69 74 69 61 6c 69 7a 65 20 22 73 65  nyInitialize "se
0920: 74 20 74 65 73 74 5f 79 65 61 72 20 32 30 31 30  t test_year 2010
0930: 22 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  "..      #      
0940: 20 20 20 2d 66 69 6c 65 20 2e 5c 70 61 74 68 5c     -file .\path\
0950: 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a 20 20  to\all.eagle..  
0960: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 20      #..      #  
0970: 20 20 20 20 20 45 61 67 6c 65 53 68 65 6c 6c 2e       EagleShell.
0980: 65 78 65 20 2d 61 6e 79 49 6e 69 74 69 61 6c 69  exe -anyInitiali
0990: 7a 65 20 22 73 65 74 20 74 65 73 74 5f 79 65 61  ze "set test_yea
09a0: 72 20 32 30 31 32 22 0d 0a 20 20 20 20 20 20 23  r 2012"..      #
09b0: 20 20 20 20 20 20 20 20 20 2d 66 69 6c 65 20 2e           -file .
09c0: 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67  \path\to\all.eag
09d0: 6c 65 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  le..      #..   
09e0: 20 20 20 23 20 20 20 20 20 20 20 45 61 67 6c 65     #       Eagle
09f0: 53 68 65 6c 6c 2e 65 78 65 20 2d 61 6e 79 49 6e  Shell.exe -anyIn
0a00: 69 74 69 61 6c 69 7a 65 20 22 73 65 74 20 74 65  itialize "set te
0a10: 73 74 5f 79 65 61 72 20 32 30 31 33 22 0d 0a 20  st_year 2013".. 
0a20: 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20 2d       #         -
0a30: 66 69 6c 65 20 2e 5c 70 61 74 68 5c 74 6f 5c 61  file .\path\to\a
0a40: 6c 6c 2e 65 61 67 6c 65 0d 0a 20 20 20 20 20 20  ll.eagle..      
0a50: 23 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  #..      #      
0a60: 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65 20   EagleShell.exe 
0a70: 2d 61 6e 79 49 6e 69 74 69 61 6c 69 7a 65 20 22  -anyInitialize "
0a80: 73 65 74 20 74 65 73 74 5f 79 65 61 72 20 32 30  set test_year 20
0a90: 31 35 22 0d 0a 20 20 20 20 20 20 23 20 20 20 20  15"..      #    
0aa0: 20 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70 61 74       -file .\pat
0ab0: 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a  h\to\all.eagle..
0ac0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
0ad0: 20 20 20 20 20 20 20 45 61 67 6c 65 53 68 65 6c         EagleShel
0ae0: 6c 2e 65 78 65 20 2d 61 6e 79 49 6e 69 74 69 61  l.exe -anyInitia
0af0: 6c 69 7a 65 20 22 75 6e 73 65 74 20 2d 6e 6f 63  lize "unset -noc
0b00: 6f 6d 70 6c 61 69 6e 20 74 65 73 74 5f 79 65 61  omplain test_yea
0b10: 72 22 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  r"..      #     
0b20: 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70 61 74 68      -file .\path
0b30: 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a 20  \to\all.eagle.. 
0b40: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
0b50: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
0b60: 3a 74 65 73 74 5f 79 65 61 72 5d 20 26 26 20 5b  :test_year] && [
0b70: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a  string length $:
0b80: 3a 74 65 73 74 5f 79 65 61 72 5d 20 3e 20 30 7d  :test_year] > 0}
0b90: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
0ba0: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
0bb0: 54 45 3a 20 55 73 65 20 74 68 65 20 73 70 65 63  TE: Use the spec
0bc0: 69 66 69 65 64 20 74 65 73 74 20 79 65 61 72 2e  ified test year.
0bd0: 20 20 49 66 20 74 68 69 73 20 76 61 72 69 61 62    If this variab
0be0: 6c 65 20 69 73 20 6e 6f 74 20 73 65 74 2c 20 74  le is not set, t
0bf0: 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  he..        #   
0c00: 20 20 20 20 64 65 66 61 75 6c 74 20 76 61 6c 75      default valu
0c10: 65 20 77 69 6c 6c 20 62 65 20 62 61 73 65 64 20  e will be based 
0c20: 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  on whether or no
0c30: 74 20 45 61 67 6c 65 20 68 61 73 20 62 65 65 6e  t Eagle has been
0c40: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
0c50: 20 20 63 6f 6d 70 69 6c 65 64 20 61 67 61 69 6e    compiled again
0c60: 73 74 20 74 68 65 20 43 4c 52 20 76 32 2e 30 20  st the CLR v2.0 
0c70: 6f 72 20 43 4c 52 20 76 34 2e 30 2e 0d 0a 20 20  or CLR v4.0...  
0c80: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
0c90: 20 72 65 74 75 72 6e 20 24 3a 3a 74 65 73 74 5f   return $::test_
0ca0: 79 65 61 72 0d 0a 20 20 20 20 20 20 7d 20 65 6c  year..      } el
0cb0: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  se {..        #.
0cc0: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
0cd0: 20 49 66 20 45 61 67 6c 65 20 68 61 73 20 62 65   If Eagle has be
0ce0: 65 6e 20 63 6f 6d 70 69 6c 65 64 20 61 67 61 69  en compiled agai
0cf0: 6e 73 74 20 74 68 65 20 43 4c 52 20 76 34 2e 30  nst the CLR v4.0
0d00: 2c 20 75 73 65 20 22 32 30 31 30 22 20 62 79 0d  , use "2010" by.
0d10: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
0d20: 20 64 65 66 61 75 6c 74 20 28 77 65 20 63 6f 75   default (we cou
0d30: 6c 64 20 75 73 65 20 22 32 30 31 32 22 2c 20 22  ld use "2012", "
0d40: 32 30 31 33 22 2c 20 6f 72 20 22 32 30 31 35 22  2013", or "2015"
0d50: 20 69 6e 20 74 68 61 74 20 63 61 73 65 20 61 73   in that case as
0d60: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
0d70: 20 20 77 65 6c 6c 29 20 61 73 20 74 68 65 20 74    well) as the t
0d80: 65 73 74 20 79 65 61 72 3b 20 6f 74 68 65 72 77  est year; otherw
0d90: 69 73 65 2c 20 75 73 65 20 22 32 30 30 38 22 20  ise, use "2008" 
0da0: 62 79 20 64 65 66 61 75 6c 74 20 28 77 65 0d 0a  by default (we..
0db0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
0dc0: 63 6f 75 6c 64 20 75 73 65 20 22 32 30 30 35 22  could use "2005"
0dd0: 20 69 6e 20 74 68 61 74 20 63 61 73 65 20 61 73   in that case as
0de0: 20 77 65 6c 6c 29 2e 20 20 49 66 20 61 6e 6f 74   well).  If anot
0df0: 68 65 72 20 6d 61 6a 6f 72 0d 0a 20 20 20 20 20  her major..     
0e00: 20 20 20 23 20 20 20 20 20 20 20 5b 69 6e 63 6f     #       [inco
0e10: 6d 70 61 74 69 62 6c 65 5d 20 76 65 72 73 69 6f  mpatible] versio
0e20: 6e 20 6f 66 20 74 68 65 20 43 4c 52 20 69 73 20  n of the CLR is 
0e30: 72 65 6c 65 61 73 65 64 2c 20 74 68 69 73 20 63  released, this c
0e40: 68 65 63 6b 20 77 69 6c 6c 0d 0a 20 20 20 20 20  heck will..     
0e50: 20 20 20 23 20 20 20 20 20 20 20 68 61 76 65 20     #       have 
0e60: 74 6f 20 62 65 20 63 68 61 6e 67 65 64 2e 20 20  to be changed.  
0e70: 54 68 65 20 64 65 66 61 75 6c 74 20 74 65 73 74  The default test
0e80: 20 79 65 61 72 20 74 6f 20 75 73 65 20 66 6f 72   year to use for
0e90: 20 61 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20   a..        #   
0ea0: 20 20 20 20 70 61 72 74 69 63 75 6c 61 72 20 43      particular C
0eb0: 4c 52 20 76 65 72 73 69 6f 6e 20 6d 61 79 20 62  LR version may b
0ec0: 65 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20  e overridden by 
0ed0: 73 65 74 74 69 6e 67 20 74 68 65 20 67 6c 6f 62  setting the glob
0ee0: 61 6c 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  al..        #   
0ef0: 20 20 20 20 76 61 72 69 61 62 6c 65 20 22 74 65      variable "te
0f00: 73 74 5f 79 65 61 72 5f 63 6c 72 5f 76 24 58 22  st_year_clr_v$X"
0f10: 2c 20 77 68 65 72 65 20 22 24 58 22 20 6d 61 79  , where "$X" may
0f20: 20 5b 63 75 72 72 65 6e 74 6c 79 5d 20 62 65 0d   [currently] be.
0f30: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
0f40: 20 65 69 74 68 65 72 20 22 32 22 20 6f 72 20 22   either "2" or "
0f50: 34 22 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  4"...        #..
0f60: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76          if {[hav
0f70: 65 43 6f 6e 73 74 72 61 69 6e 74 20 69 6d 61 67  eConstraint imag
0f80: 65 52 75 6e 74 69 6d 65 34 30 5d 7d 20 74 68 65  eRuntime40]} the
0f90: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69  n {..          i
0fa0: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
0fb0: 3a 3a 74 65 73 74 5f 79 65 61 72 5f 63 6c 72 5f  ::test_year_clr_
0fc0: 76 34 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  v4] && \..      
0fd0: 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20          [string 
0fe0: 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f 79  length $::test_y
0ff0: 65 61 72 5f 63 6c 72 5f 76 34 5d 20 3e 20 30 7d  ear_clr_v4] > 0}
1000: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1010: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1020: 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20      # NOTE: Use 
1030: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 74 65  the specified te
1040: 73 74 20 79 65 61 72 20 66 6f 72 20 74 68 65 20  st year for the 
1050: 43 4c 52 20 76 34 2e 30 2e 0d 0a 20 20 20 20 20  CLR v4.0...     
1060: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1070: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a        return $::
1080: 74 65 73 74 5f 79 65 61 72 5f 63 6c 72 5f 76 34  test_year_clr_v4
1090: 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c  ..          } el
10a0: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
10b0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
10c0: 20 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65   # NOTE: Use the
10d0: 20 64 65 66 61 75 6c 74 20 74 65 73 74 20 79 65   default test ye
10e0: 61 72 20 66 6f 72 20 74 68 65 20 43 4c 52 20 76  ar for the CLR v
10f0: 34 2e 30 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  4.0...          
1100: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
1110: 20 72 65 74 75 72 6e 20 32 30 31 30 3b 20 23 20   return 2010; # 
1120: 54 4f 44 4f 3a 20 47 6f 6f 64 20 22 66 61 6c 6c  TODO: Good "fall
1130: 62 61 63 6b 22 20 64 65 66 61 75 6c 74 3f 0d 0a  back" default?..
1140: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
1150: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
1160: 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69 6e           if {[in
1170: 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 73 74  fo exists ::test
1180: 5f 79 65 61 72 5f 63 6c 72 5f 76 32 5d 20 26 26  _year_clr_v2] &&
1190: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
11a0: 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
11b0: 20 24 3a 3a 74 65 73 74 5f 79 65 61 72 5f 63 6c   $::test_year_cl
11c0: 72 5f 76 32 5d 20 3e 20 30 7d 20 74 68 65 6e 20  r_v2] > 0} then 
11d0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  {..            #
11e0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20  ..            # 
11f0: 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20 73 70  NOTE: Use the sp
1200: 65 63 69 66 69 65 64 20 74 65 73 74 20 79 65 61  ecified test yea
1210: 72 20 66 6f 72 20 74 68 65 20 43 4c 52 20 76 32  r for the CLR v2
1220: 2e 30 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  .0...           
1230: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
1240: 72 65 74 75 72 6e 20 24 3a 3a 74 65 73 74 5f 79  return $::test_y
1250: 65 61 72 5f 63 6c 72 5f 76 32 0d 0a 20 20 20 20  ear_clr_v2..    
1260: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
1270: 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
1280: 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
1290: 45 3a 20 55 73 65 20 74 68 65 20 64 65 66 61 75  E: Use the defau
12a0: 6c 74 20 74 65 73 74 20 79 65 61 72 20 66 6f 72  lt test year for
12b0: 20 74 68 65 20 43 4c 52 20 76 32 2e 30 2e 0d 0a   the CLR v2.0...
12c0: 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
12d0: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
12e0: 6e 20 32 30 30 38 3b 20 23 20 54 4f 44 4f 3a 20  n 2008; # TODO: 
12f0: 47 6f 6f 64 20 22 66 61 6c 6c 62 61 63 6b 22 20  Good "fallback" 
1300: 64 65 66 61 75 6c 74 3f 0d 0a 20 20 20 20 20 20  default?..      
1310: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
1320: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
1330: 0d 0a 0c 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20  .....    #..    
1340: 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 70 72 6f  # NOTE: This pro
1350: 63 65 64 75 72 65 20 69 73 20 6f 6e 6c 79 20 75  cedure is only u
1360: 73 65 64 20 77 68 65 6e 20 61 64 64 69 6e 67 20  sed when adding 
1370: 73 68 69 6d 6d 65 64 20 74 65 73 74 20 63 6f 6e  shimmed test con
1380: 73 74 72 61 69 6e 74 73 2e 0d 0a 20 20 20 20 23  straints...    #
1390: 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 42 75  ..    proc getBu
13a0: 69 6c 64 43 6c 72 56 65 72 73 69 6f 6e 20 7b 7d  ildClrVersion {}
13b0: 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69   {..      if {[i
13c0: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 73  nfo exists ::tes
13d0: 74 5f 63 6c 72 5d 20 26 26 20 5b 73 74 72 69 6e  t_clr] && [strin
13e0: 67 20 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73 74  g length $::test
13f0: 5f 63 6c 72 5d 20 3e 20 30 7d 20 74 68 65 6e 20  _clr] > 0} then 
1400: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
1410: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73        # NOTE: Us
1420: 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  e the specified 
1430: 74 65 73 74 20 76 65 72 73 69 6f 6e 20 66 6f 72  test version for
1440: 20 74 68 65 20 43 4c 52 2e 20 20 49 66 20 74 68   the CLR.  If th
1450: 69 73 20 76 61 72 69 61 62 6c 65 0d 0a 20 20 20  is variable..   
1460: 20 20 20 20 20 23 20 20 20 20 20 20 20 69 73 20       #       is 
1470: 6e 6f 74 20 73 65 74 2c 20 74 68 65 20 64 65 66  not set, the def
1480: 61 75 6c 74 20 76 61 6c 75 65 20 77 69 6c 6c 20  ault value will 
1490: 62 65 20 62 61 73 65 64 20 6f 6e 20 77 68 65 74  be based on whet
14a0: 68 65 72 20 6f 72 20 6e 6f 74 0d 0a 20 20 20 20  her or not..    
14b0: 20 20 20 20 23 20 20 20 20 20 20 20 45 61 67 6c      #       Eagl
14c0: 65 20 68 61 73 20 62 65 65 6e 20 63 6f 6d 70 69  e has been compi
14d0: 6c 65 64 20 61 67 61 69 6e 73 74 20 74 68 65 20  led against the 
14e0: 43 4c 52 20 76 32 2e 30 20 6f 72 20 43 4c 52 20  CLR v2.0 or CLR 
14f0: 76 34 2e 30 2e 0d 0a 20 20 20 20 20 20 20 20 23  v4.0...        #
1500: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
1510: 20 24 3a 3a 74 65 73 74 5f 63 6c 72 0d 0a 20 20   $::test_clr..  
1520: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
1530: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1540: 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69   # NOTE: Check i
1550: 66 20 45 61 67 6c 65 20 68 61 73 20 62 65 65 6e  f Eagle has been
1560: 20 63 6f 6d 70 69 6c 65 64 20 61 67 61 69 6e 73   compiled agains
1570: 74 20 74 68 65 20 43 4c 52 20 76 34 2e 30 2e 20  t the CLR v4.0. 
1580: 20 49 66 20 73 6f 2c 0d 0a 20 20 20 20 20 20 20   If so,..       
1590: 20 23 20 20 20 20 20 20 20 6a 75 73 74 20 75 73   #       just us
15a0: 65 20 74 68 61 74 20 43 4c 52 20 76 65 72 73 69  e that CLR versi
15b0: 6f 6e 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20  on.  Otherwise, 
15c0: 75 73 65 20 74 68 65 20 76 65 72 73 69 6f 6e 20  use the version 
15d0: 66 6f 72 20 74 68 65 0d 0a 20 20 20 20 20 20 20  for the..       
15e0: 20 23 20 20 20 20 20 20 20 43 4c 52 20 76 32 2e   #       CLR v2.
15f0: 30 2e 20 20 49 66 20 61 6e 6f 74 68 65 72 20 6d  0.  If another m
1600: 61 6a 6f 72 20 5b 69 6e 63 6f 6d 70 61 74 69 62  ajor [incompatib
1610: 6c 65 5d 20 76 65 72 73 69 6f 6e 20 6f 66 20 74  le] version of t
1620: 68 65 20 43 4c 52 0d 0a 20 20 20 20 20 20 20 20  he CLR..        
1630: 23 20 20 20 20 20 20 20 69 73 20 72 65 6c 65 61  #       is relea
1640: 73 65 64 2c 20 74 68 69 73 20 63 68 65 63 6b 20  sed, this check 
1650: 77 69 6c 6c 20 68 61 76 65 20 74 6f 20 62 65 20  will have to be 
1660: 63 68 61 6e 67 65 64 2e 20 20 54 68 65 20 64 65  changed.  The de
1670: 66 61 75 6c 74 0d 0a 20 20 20 20 20 20 20 20 23  fault..        #
1680: 20 20 20 20 20 20 20 76 65 72 73 69 6f 6e 20 76         version v
1690: 61 6c 75 65 20 66 6f 72 20 61 20 70 61 72 74 69  alue for a parti
16a0: 63 75 6c 61 72 20 43 4c 52 20 76 65 72 73 69 6f  cular CLR versio
16b0: 6e 20 6d 61 79 20 62 65 20 6f 76 65 72 72 69 64  n may be overrid
16c0: 64 65 6e 0d 0a 20 20 20 20 20 20 20 20 23 20 20  den..        #  
16d0: 20 20 20 20 20 62 79 20 73 65 74 74 69 6e 67 20       by setting 
16e0: 74 68 65 20 67 6c 6f 62 61 6c 20 76 61 72 69 61  the global varia
16f0: 62 6c 65 20 22 74 65 73 74 5f 63 6c 72 5f 76 24  ble "test_clr_v$
1700: 58 22 2c 20 77 68 65 72 65 20 22 24 58 22 20 6d  X", where "$X" m
1710: 61 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ay..        #   
1720: 20 20 20 20 5b 63 75 72 72 65 6e 74 6c 79 5d 20      [currently] 
1730: 62 65 20 65 69 74 68 65 72 20 22 32 22 20 6f 72  be either "2" or
1740: 20 22 34 22 2e 0d 0a 20 20 20 20 20 20 20 20 23   "4"...        #
1750: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 68  ..        if {[h
1760: 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 69 6d  aveConstraint im
1770: 61 67 65 52 75 6e 74 69 6d 65 34 30 5d 7d 20 74  ageRuntime40]} t
1780: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1790: 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
17a0: 73 20 3a 3a 74 65 73 74 5f 63 6c 72 5f 76 34 5d  s ::test_clr_v4]
17b0: 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
17c0: 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
17d0: 67 74 68 20 24 3a 3a 74 65 73 74 5f 63 6c 72 5f  gth $::test_clr_
17e0: 76 34 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  v4] > 0} then {.
17f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a  .            #..
1800: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f              # NO
1810: 54 45 3a 20 55 73 65 20 74 68 65 20 73 70 65 63  TE: Use the spec
1820: 69 66 69 65 64 20 74 65 73 74 20 76 65 72 73 69  ified test versi
1830: 6f 6e 20 66 6f 72 20 74 68 65 20 43 4c 52 20 76  on for the CLR v
1840: 34 2e 30 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  4.0...          
1850: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
1860: 20 72 65 74 75 72 6e 20 24 3a 3a 74 65 73 74 5f   return $::test_
1870: 63 6c 72 5f 76 34 0d 0a 20 20 20 20 20 20 20 20  clr_v4..        
1880: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
1890: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
18a0: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55         # NOTE: U
18b0: 73 65 20 74 68 65 20 64 65 66 61 75 6c 74 20 74  se the default t
18c0: 65 73 74 20 76 65 72 73 69 6f 6e 20 66 6f 72 20  est version for 
18d0: 74 68 65 20 43 4c 52 20 76 34 2e 30 2e 0d 0a 20  the CLR v4.0... 
18e0: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
18f0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1900: 20 34 2e 30 2e 33 30 33 31 39 3b 20 23 20 54 4f   4.0.30319; # TO
1910: 44 4f 3a 20 47 6f 6f 64 20 22 66 61 6c 6c 62 61  DO: Good "fallba
1920: 63 6b 22 20 64 65 66 61 75 6c 74 3f 0d 0a 20 20  ck" default?..  
1930: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
1940: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
1950: 20 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f         if {[info
1960: 20 65 78 69 73 74 73 20 3a 3a 74 65 73 74 5f 63   exists ::test_c
1970: 6c 72 5f 76 32 5d 20 26 26 20 5c 0d 0a 20 20 20  lr_v2] && \..   
1980: 20 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69             [stri
1990: 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73  ng length $::tes
19a0: 74 5f 63 6c 72 5f 76 32 5d 20 3e 20 30 7d 20 74  t_clr_v2] > 0} t
19b0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
19c0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
19d0: 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68    # NOTE: Use th
19e0: 65 20 73 70 65 63 69 66 69 65 64 20 74 65 73 74  e specified test
19f0: 20 76 65 72 73 69 6f 6e 20 66 6f 72 20 74 68 65   version for the
1a00: 20 43 4c 52 20 76 32 2e 30 2e 0d 0a 20 20 20 20   CLR v2.0...    
1a10: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1a20: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a         return $:
1a30: 3a 74 65 73 74 5f 63 6c 72 5f 76 32 0d 0a 20 20  :test_clr_v2..  
1a40: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
1a50: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d  ..            #.
1a60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e  .            # N
1a70: 4f 54 45 3a 20 55 73 65 20 74 68 65 20 64 65 66  OTE: Use the def
1a80: 61 75 6c 74 20 74 65 73 74 20 76 65 72 73 69 6f  ault test versio
1a90: 6e 20 66 6f 72 20 74 68 65 20 43 4c 52 20 76 32  n for the CLR v2
1aa0: 2e 30 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  .0...           
1ab0: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
1ac0: 72 65 74 75 72 6e 20 32 2e 30 2e 35 30 37 32 37  return 2.0.50727
1ad0: 3b 20 23 20 54 4f 44 4f 3a 20 47 6f 6f 64 20 22  ; # TODO: Good "
1ae0: 66 61 6c 6c 62 61 63 6b 22 20 64 65 66 61 75 6c  fallback" defaul
1af0: 74 3f 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  t?..          }.
1b00: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
1b10: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
1b20: 20 20 20 70 72 6f 63 20 67 65 74 42 75 69 6c 64     proc getBuild
1b30: 59 65 61 72 73 20 7b 7d 20 7b 0d 0a 20 20 20 20  Years {} {..    
1b40: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
1b50: 45 3a 20 53 65 65 20 69 66 20 74 68 65 20 6c 69  E: See if the li
1b60: 73 74 20 6f 66 20 74 65 73 74 20 79 65 61 72 73  st of test years
1b70: 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72 69   has been overri
1b80: 64 64 65 6e 20 62 79 20 74 68 65 20 75 73 65 72  dden by the user
1b90: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
1ba0: 28 65 2e 67 2e 20 6f 6e 20 74 68 65 20 63 6f 6d  (e.g. on the com
1bb0: 6d 61 6e 64 20 6c 69 6e 65 29 2e 0d 0a 20 20 20  mand line)...   
1bc0: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
1bd0: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74  [info exists ::t
1be0: 65 73 74 5f 79 65 61 72 73 5d 20 26 26 20 5b 6c  est_years] && [l
1bf0: 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f 79  length $::test_y
1c00: 65 61 72 73 5d 20 3e 20 30 7d 20 74 68 65 6e 20  ears] > 0} then 
1c10: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
1c20: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73        # NOTE: Us
1c30: 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  e the specified 
1c40: 6c 69 73 74 20 6f 66 20 74 65 73 74 20 79 65 61  list of test yea
1c50: 72 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  rs...        #..
1c60: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24          return $
1c70: 3a 3a 74 65 73 74 5f 79 65 61 72 73 0d 0a 20 20  ::test_years..  
1c80: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
1c90: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1ca0: 20 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65   # NOTE: Use the
1cb0: 20 64 65 66 61 75 6c 74 20 6c 69 73 74 20 6f 66   default list of
1cc0: 20 74 65 73 74 20 79 65 61 72 73 20 28 69 2e 65   test years (i.e
1cd0: 2e 20 61 6c 6c 29 2e 0d 0a 20 20 20 20 20 20 20  . all)...       
1ce0: 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   #..        retu
1cf0: 72 6e 20 5b 6c 69 73 74 20 32 30 30 35 20 32 30  rn [list 2005 20
1d00: 30 38 20 32 30 31 30 20 32 30 31 32 20 32 30 31  08 2010 2012 201
1d10: 33 20 32 30 31 35 5d 0d 0a 20 20 20 20 20 20 7d  3 2015]..      }
1d20: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
1d30: 70 72 6f 63 20 67 65 74 42 75 69 6c 64 4e 65 74  proc getBuildNet
1d40: 46 78 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23  Fx {} {..      #
1d50: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
1d60: 53 65 65 20 69 66 20 74 68 65 20 74 65 73 74 20  See if the test 
1d70: 2e 4e 45 54 20 46 72 61 6d 65 77 6f 72 6b 20 73  .NET Framework s
1d80: 65 74 74 69 6e 67 20 68 61 73 20 62 65 65 6e 20  etting has been 
1d90: 6f 76 65 72 72 69 64 64 65 6e 20 62 79 0d 0a 20  overridden by.. 
1da0: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
1db0: 20 75 73 65 72 20 28 65 2e 67 2e 20 6f 6e 20 74   user (e.g. on t
1dc0: 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 29  he command line)
1dd0: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
1de0: 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73    if {[info exis
1df0: 74 73 20 3a 3a 74 65 73 74 5f 6e 65 74 5f 66 78  ts ::test_net_fx
1e00: 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
1e10: 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
1e20: 20 24 3a 3a 74 65 73 74 5f 6e 65 74 5f 66 78 5d   $::test_net_fx]
1e30: 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
1e40: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1e50: 20 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65   # NOTE: Use the
1e60: 20 73 70 65 63 69 66 69 65 64 20 74 65 73 74 20   specified test 
1e70: 2e 4e 45 54 20 46 72 61 6d 65 77 6f 72 6b 2e 0d  .NET Framework..
1e80: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
1e90: 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 74 65      return $::te
1ea0: 73 74 5f 6e 65 74 5f 66 78 0d 0a 20 20 20 20 20  st_net_fx..     
1eb0: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
1ec0: 20 20 20 73 65 74 20 79 65 61 72 20 5b 67 65 74     set year [get
1ed0: 42 75 69 6c 64 59 65 61 72 5d 0d 0a 20 20 20 20  BuildYear]..    
1ee0: 20 20 20 20 73 65 74 20 79 65 61 72 56 61 72 4e      set yearVarN
1ef0: 61 6d 65 20 5b 61 70 70 65 6e 64 41 72 67 73 20  ame [appendArgs 
1f00: 3a 3a 74 65 73 74 5f 6e 65 74 5f 66 78 5f 20 24  ::test_net_fx_ $
1f10: 79 65 61 72 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  year]....       
1f20: 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
1f30: 73 20 24 79 65 61 72 56 61 72 4e 61 6d 65 5d 20  s $yearVarName] 
1f40: 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
1f50: 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
1f60: 20 5b 73 65 74 20 24 79 65 61 72 56 61 72 4e 61   [set $yearVarNa
1f70: 6d 65 5d 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  me]] > 0} then {
1f80: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
1f90: 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
1fa0: 20 55 73 65 20 74 68 65 20 73 70 65 63 69 66 69   Use the specifi
1fb0: 65 64 20 74 65 73 74 20 2e 4e 45 54 20 46 72 61  ed test .NET Fra
1fc0: 6d 65 77 6f 72 6b 2c 20 62 61 73 65 64 20 6f 6e  mework, based on
1fd0: 20 74 68 65 20 62 75 69 6c 64 0d 0a 20 20 20 20   the build..    
1fe0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 79 65        #       ye
1ff0: 61 72 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  ar...          #
2000: 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ..          retu
2010: 72 6e 20 5b 73 65 74 20 24 79 65 61 72 56 61 72  rn [set $yearVar
2020: 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20 20 20 7d  Name]..        }
2030: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
2040: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
2050: 23 20 4e 4f 54 45 3a 20 46 61 6c 6c 62 61 63 6b  # NOTE: Fallback
2060: 20 74 6f 20 74 68 65 20 22 77 65 6c 6c 20 6b 6e   to the "well kn
2070: 6f 77 6e 22 20 2e 4e 45 54 20 46 72 61 6d 65 77  own" .NET Framew
2080: 6f 72 6b 20 76 65 72 73 69 6f 6e 20 74 68 61 74  ork version that
2090: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20  ..          #   
20a0: 20 20 20 20 69 73 20 6d 6f 73 74 20 63 6c 6f 73      is most clos
20b0: 65 6c 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  ely associated w
20c0: 69 74 68 20 61 20 70 61 72 74 69 63 75 6c 61 72  ith a particular
20d0: 20 76 65 72 73 69 6f 6e 20 6f 66 0d 0a 20 20 20   version of..   
20e0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 56         #       V
20f0: 69 73 75 61 6c 20 53 74 75 64 69 6f 2e 0d 0a 20  isual Studio... 
2100: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
2110: 20 20 20 20 20 20 73 77 69 74 63 68 20 2d 65 78        switch -ex
2120: 61 63 74 20 2d 2d 20 24 79 65 61 72 20 7b 0d 0a  act -- $year {..
2130: 20 20 20 20 20 20 20 20 20 20 20 20 32 30 30 35              2005
2140: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
2150: 20 20 72 65 74 75 72 6e 20 6e 65 74 46 78 32 30    return netFx20
2160: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
2170: 0a 20 20 20 20 20 20 20 20 20 20 20 20 32 30 30  .            200
2180: 38 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  8 {..           
2190: 20 20 20 72 65 74 75 72 6e 20 6e 65 74 46 78 33     return netFx3
21a0: 35 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  5..            }
21b0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 32 30  ..            20
21c0: 31 30 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  10 {..          
21d0: 20 20 20 20 72 65 74 75 72 6e 20 6e 65 74 46 78      return netFx
21e0: 34 30 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  40..            
21f0: 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 32  }..            2
2200: 30 31 32 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  012 {..         
2210: 20 20 20 20 20 72 65 74 75 72 6e 20 6e 65 74 46       return netF
2220: 78 34 35 0d 0a 20 20 20 20 20 20 20 20 20 20 20  x45..           
2230: 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
2240: 32 30 31 33 20 7b 0d 0a 20 20 20 20 20 20 20 20  2013 {..        
2250: 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e 65 74        return net
2260: 46 78 34 35 31 3b 20 23 20 54 4f 44 4f 3a 20 4f  Fx451; # TODO: O
2270: 72 20 22 6e 65 74 46 78 34 35 32 22 3f 0d 0a 20  r "netFx452"?.. 
2280: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
2290: 20 20 20 20 20 20 20 20 20 20 32 30 31 35 20 7b            2015 {
22a0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
22b0: 72 65 74 75 72 6e 20 6e 65 74 46 78 34 36 3b 20  return netFx46; 
22c0: 23 20 54 4f 44 4f 3a 20 4f 72 20 22 6e 65 74 46  # TODO: Or "netF
22d0: 78 34 36 31 22 3f 0d 0a 20 20 20 20 20 20 20 20  x461"?..        
22e0: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
22f0: 20 20 20 64 65 66 61 75 6c 74 20 7b 0d 0a 20 20     default {..  
2300: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
2310: 72 6e 20 6e 65 74 46 78 33 35 3b 20 23 20 54 4f  rn netFx35; # TO
2320: 44 4f 3a 20 47 6f 6f 64 20 22 66 61 6c 6c 62 61  DO: Good "fallba
2330: 63 6b 22 20 64 65 66 61 75 6c 74 3f 0d 0a 20 20  ck" default?..  
2340: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
2350: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
2360: 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20    }..      }..  
2370: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 23 0d 0a 20    }.....    #.. 
2380: 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20     # NOTE: This 
2390: 70 72 6f 63 65 64 75 72 65 20 73 68 6f 75 6c 64  procedure should
23a0: 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f   return non-zero
23b0: 20 69 66 20 74 68 65 20 63 6f 6e 66 69 67 75 72   if the configur
23c0: 65 64 20 74 65 73 74 0d 0a 20 20 20 20 23 20 20  ed test..    #  
23d0: 20 20 20 20 20 70 6c 61 74 66 6f 72 6d 20 69 73       platform is
23e0: 20 6d 6f 73 74 20 6c 69 6b 65 6c 79 20 74 68 65   most likely the
23f0: 20 64 65 66 61 75 6c 74 20 66 6f 72 20 74 68 69   default for thi
2400: 73 20 6d 61 63 68 69 6e 65 2e 0d 0a 20 20 20 20  s machine...    
2410: 23 0d 0a 20 20 20 20 70 72 6f 63 20 69 73 44 65  #..    proc isDe
2420: 66 61 75 6c 74 42 75 69 6c 64 50 6c 61 74 66 6f  faultBuildPlatfo
2430: 72 6d 20 7b 20 7b 76 65 72 62 6f 73 65 20 66 61  rm { {verbose fa
2440: 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20  lse} } {..      
2450: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
2460: 20 52 75 6e 6e 69 6e 67 20 6f 6e 20 57 6f 57 36   Running on WoW6
2470: 34 20 69 73 20 6e 65 76 65 72 20 74 68 65 20 64  4 is never the d
2480: 65 66 61 75 6c 74 20 70 6c 61 74 66 6f 72 6d 2e  efault platform.
2490: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
24a0: 20 69 66 20 7b 5b 69 73 52 75 6e 6e 69 6e 67 57   if {[isRunningW
24b0: 6f 57 36 34 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  oW64]} then {.. 
24c0: 20 20 20 20 20 20 20 69 66 20 7b 24 76 65 72 62         if {$verb
24d0: 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ose} then {..   
24e0: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
24f0: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a  test_channel \..
2500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
2510: 2d 2d 2d 20 64 65 74 65 63 74 65 64 20 6e 6f 6e  --- detected non
2520: 2d 64 65 66 61 75 6c 74 20 70 6c 61 74 66 6f 72  -default platfor
2530: 6d 20 28 57 6f 57 36 34 29 5c 6e 22 0d 0a 20 20  m (WoW64)\n"..  
2540: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
2550: 20 72 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20   return false.. 
2560: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
2570: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
2580: 20 54 68 69 73 20 68 61 73 20 61 20 67 6f 6f 64   This has a good
2590: 20 63 68 61 6e 63 65 20 6f 66 20 62 65 69 6e 67   chance of being
25a0: 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 6c 61   the default pla
25b0: 74 66 6f 72 6d 2e 0d 0a 20 20 20 20 20 20 23 0d  tform...      #.
25c0: 0a 20 20 20 20 20 20 69 66 20 7b 24 76 65 72 62  .      if {$verb
25d0: 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ose} then {..   
25e0: 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
25f0: 73 74 5f 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d  st_channel "----
2600: 20 64 65 74 65 63 74 65 64 20 64 65 66 61 75 6c   detected defaul
2610: 74 20 70 6c 61 74 66 6f 72 6d 5c 6e 22 0d 0a 20  t platform\n".. 
2620: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 72 65       }..      re
2630: 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 7d  turn true..    }
2640: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65  .....    proc ge
2650: 74 42 75 69 6c 64 50 6c 61 74 66 6f 72 6d 20 7b  tBuildPlatform {
2660: 20 6e 61 74 69 76 65 20 7d 20 7b 0d 0a 20 20 20   native } {..   
2670: 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69     if {[info exi
2680: 73 74 73 20 3a 3a 74 65 73 74 5f 70 6c 61 74 66  sts ::test_platf
2690: 6f 72 6d 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  orm] && \..     
26a0: 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
26b0: 67 74 68 20 24 3a 3a 74 65 73 74 5f 70 6c 61 74  gth $::test_plat
26c0: 66 6f 72 6d 5d 20 3e 20 30 7d 20 74 68 65 6e 20  form] > 0} then 
26d0: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
26e0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73        # NOTE: Us
26f0: 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  e the specified 
2700: 74 65 73 74 20 70 6c 61 74 66 6f 72 6d 2e 20 20  test platform.  
2710: 49 66 20 74 68 69 73 20 76 61 72 69 61 62 6c 65  If this variable
2720: 20 69 73 20 6e 6f 74 20 73 65 74 2c 0d 0a 20 20   is not set,..  
2730: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68        #       th
2740: 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20  e default value 
2750: 77 69 6c 6c 20 62 65 20 62 61 73 65 64 20 6f 6e  will be based on
2760: 20 74 68 65 20 6d 61 63 68 69 6e 65 20 61 72 63   the machine arc
2770: 68 69 74 65 63 74 75 72 65 2e 0d 0a 20 20 20 20  hitecture...    
2780: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
2790: 65 74 75 72 6e 20 5b 65 78 70 72 20 7b 24 6e 61  eturn [expr {$na
27a0: 74 69 76 65 20 3f 20 24 3a 3a 74 65 73 74 5f 70  tive ? $::test_p
27b0: 6c 61 74 66 6f 72 6d 20 3a 20 22 22 7d 5d 0d 0a  latform : ""}]..
27c0: 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b        } elseif {
27d0: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74  [info exists ::t
27e0: 65 73 74 5f 6d 61 63 68 69 6e 65 5d 20 26 26 20  est_machine] && 
27f0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74  \..          [st
2800: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 74  ring length $::t
2810: 65 73 74 5f 6d 61 63 68 69 6e 65 5d 20 3e 20 30  est_machine] > 0
2820: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
2830: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
2840: 4f 54 45 3a 20 46 6f 72 20 6e 61 74 69 76 65 20  OTE: For native 
2850: 62 75 69 6c 64 73 2c 20 72 65 74 75 72 6e 20 74  builds, return t
2860: 68 65 20 70 6c 61 74 66 6f 72 6d 20 6e 61 6d 65  he platform name
2870: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
2880: 6f 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  o..        #    
2890: 20 20 20 74 68 65 20 74 65 73 74 20 6d 61 63 68     the test mach
28a0: 69 6e 65 20 61 72 63 68 69 74 65 63 74 75 72 65  ine architecture
28b0: 3b 20 6f 74 68 65 72 77 69 73 65 2c 20 72 65 74  ; otherwise, ret
28c0: 75 72 6e 20 61 6e 20 65 6d 70 74 79 0d 0a 20 20  urn an empty..  
28d0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73 74        #       st
28e0: 72 69 6e 67 2e 0d 0a 20 20 20 20 20 20 20 20 23  ring...        #
28f0: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
2900: 20 5b 65 78 70 72 20 7b 0d 0a 20 20 20 20 20 20   [expr {..      
2910: 20 20 20 20 24 6e 61 74 69 76 65 20 3f 20 5b 6d      $native ? [m
2920: 61 63 68 69 6e 65 54 6f 50 6c 61 74 66 6f 72 6d  achineToPlatform
2930: 20 24 3a 3a 74 65 73 74 5f 6d 61 63 68 69 6e 65   $::test_machine
2940: 5d 20 3a 20 22 22 0d 0a 20 20 20 20 20 20 20 20  ] : ""..        
2950: 7d 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  }]..      } else
2960: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
2970: 20 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28   ::tcl_platform(
2980: 6d 61 63 68 69 6e 65 29 5d 7d 20 74 68 65 6e 20  machine)]} then 
2990: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
29a0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 6f        # NOTE: Fo
29b0: 72 20 6e 61 74 69 76 65 20 62 75 69 6c 64 73 2c  r native builds,
29c0: 20 72 65 74 75 72 6e 20 74 68 65 20 70 6c 61 74   return the plat
29d0: 66 6f 72 6d 20 6e 61 6d 65 20 63 6f 72 72 65 73  form name corres
29e0: 70 6f 6e 64 69 6e 67 20 74 6f 0d 0a 20 20 20 20  ponding to..    
29f0: 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20      #       the 
2a00: 6d 61 63 68 69 6e 65 20 61 72 63 68 69 74 65 63  machine architec
2a10: 74 75 72 65 3b 20 6f 74 68 65 72 77 69 73 65 2c  ture; otherwise,
2a20: 20 72 65 74 75 72 6e 20 61 6e 20 65 6d 70 74 79   return an empty
2a30: 20 73 74 72 69 6e 67 2e 0d 0a 20 20 20 20 20 20   string...      
2a40: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
2a50: 75 72 6e 20 5b 65 78 70 72 20 7b 0d 0a 20 20 20  urn [expr {..   
2a60: 20 20 20 20 20 20 20 24 6e 61 74 69 76 65 20 3f         $native ?
2a70: 20 5b 6d 61 63 68 69 6e 65 54 6f 50 6c 61 74 66   [machineToPlatf
2a80: 6f 72 6d 20 24 3a 3a 74 63 6c 5f 70 6c 61 74 66  orm $::tcl_platf
2a90: 6f 72 6d 28 6d 61 63 68 69 6e 65 29 5d 20 3a 20  orm(machine)] : 
2aa0: 22 22 0d 0a 20 20 20 20 20 20 20 20 7d 5d 0d 0a  ""..        }]..
2ab0: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
2ac0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
2ad0: 20 20 20 23 20 4e 4f 54 45 3a 20 4e 6f 20 6d 61     # NOTE: No ma
2ae0: 63 68 69 6e 65 20 61 72 63 68 69 74 65 63 74 75  chine architectu
2af0: 72 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c  re is available,
2b00: 20 72 65 74 75 72 6e 20 61 6e 20 65 6d 70 74 79   return an empty
2b10: 20 73 74 72 69 6e 67 2e 0d 0a 20 20 20 20 20 20   string...      
2b20: 20 20 23 20 20 20 20 20 20 20 49 74 20 69 73 20    #       It is 
2b30: 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 72 65 74  important to ret
2b40: 75 72 6e 20 61 6e 20 65 6d 70 74 79 20 73 74 72  urn an empty str
2b50: 69 6e 67 20 68 65 72 65 20 62 65 63 61 75 73 65  ing here because
2b60: 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20   the..        # 
2b70: 20 20 20 20 20 20 72 65 73 75 6c 74 20 6f 66 20        result of 
2b80: 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 6d  this procedure m
2b90: 61 79 20 62 65 20 75 73 65 64 20 77 69 74 68 20  ay be used with 
2ba0: 5b 66 69 6c 65 20 6a 6f 69 6e 5d 2e 0d 0a 20 20  [file join]...  
2bb0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
2bc0: 20 72 65 74 75 72 6e 20 22 22 0d 0a 20 20 20 20   return ""..    
2bd0: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
2be0: 20 20 20 70 72 6f 63 20 67 65 74 42 75 69 6c 64     proc getBuild
2bf0: 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 7b 7d  Configuration {}
2c00: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
2c10: 20 20 20 23 20 4e 4f 54 45 3a 20 53 65 65 20 69     # NOTE: See i
2c20: 66 20 74 68 65 20 22 63 6f 6e 66 69 67 75 72 61  f the "configura
2c30: 74 69 6f 6e 22 20 73 65 74 74 69 6e 67 20 68 61  tion" setting ha
2c40: 73 20 62 65 65 6e 20 6f 76 65 72 72 69 64 64 65  s been overridde
2c50: 6e 20 62 79 20 74 68 65 0d 0a 20 20 20 20 20 20  n by the..      
2c60: 23 20 20 20 20 20 20 20 75 73 65 72 20 28 65 2e  #       user (e.
2c70: 67 2e 20 6f 6e 20 74 68 65 20 63 6f 6d 6d 61 6e  g. on the comman
2c80: 64 20 6c 69 6e 65 29 2e 20 20 54 68 69 73 20 68  d line).  This h
2c90: 65 6c 70 73 20 63 6f 6e 74 72 6f 6c 20 65 78 61  elps control exa
2ca0: 63 74 6c 79 0d 0a 20 20 20 20 20 20 23 20 20 20  ctly..      #   
2cb0: 20 20 20 20 77 68 69 63 68 20 73 65 74 20 6f 66      which set of
2cc0: 20 62 69 6e 61 72 69 65 73 20 77 65 20 61 72 65   binaries we are
2cd0: 20 74 65 73 74 69 6e 67 20 28 69 2e 65 2e 20 74   testing (i.e. t
2ce0: 68 6f 73 65 20 62 75 69 6c 74 20 69 6e 20 74 68  hose built in th
2cf0: 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
2d00: 20 22 44 65 62 75 67 22 20 6f 72 20 22 52 65 6c   "Debug" or "Rel
2d10: 65 61 73 65 22 20 62 75 69 6c 64 20 63 6f 6e 66  ease" build conf
2d20: 69 67 75 72 61 74 69 6f 6e 73 29 2e 20 20 54 6f  igurations).  To
2d30: 20 6f 76 65 72 72 69 64 65 20 74 68 69 73 0d 0a   override this..
2d40: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 76 61        #       va
2d50: 6c 75 65 20 76 69 61 20 74 68 65 20 63 6f 6d 6d  lue via the comm
2d60: 61 6e 64 20 6c 69 6e 65 2c 20 65 6e 74 65 72 20  and line, enter 
2d70: 61 20 63 6f 6d 6d 61 6e 64 20 73 69 6d 69 6c 61  a command simila
2d80: 72 20 74 6f 20 6f 6e 65 20 6f 66 0d 0a 20 20 20  r to one of..   
2d90: 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20 66     #       the f
2da0: 6f 6c 6c 6f 77 69 6e 67 20 28 61 6c 6c 20 6f 6e  ollowing (all on
2db0: 20 6f 6e 65 20 6c 69 6e 65 29 3a 0d 0a 20 20 20   one line):..   
2dc0: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 20 20     #..      #   
2dd0: 20 20 20 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65      EagleShell.e
2de0: 78 65 20 2d 61 6e 79 49 6e 69 74 69 61 6c 69 7a  xe -anyInitializ
2df0: 65 20 22 73 65 74 20 74 65 73 74 5f 63 6f 6e 66  e "set test_conf
2e00: 69 67 75 72 61 74 69 6f 6e 20 44 65 62 75 67 22  iguration Debug"
2e10: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
2e20: 20 20 2d 66 69 6c 65 20 2e 5c 70 61 74 68 5c 74    -file .\path\t
2e30: 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a 20 20 20  o\all.eagle..   
2e40: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 20 20     #..      #   
2e50: 20 20 20 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65      EagleShell.e
2e60: 78 65 20 2d 61 6e 79 49 6e 69 74 69 61 6c 69 7a  xe -anyInitializ
2e70: 65 20 22 73 65 74 20 74 65 73 74 5f 63 6f 6e 66  e "set test_conf
2e80: 69 67 75 72 61 74 69 6f 6e 20 52 65 6c 65 61 73  iguration Releas
2e90: 65 22 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  e"..      #     
2ea0: 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70 61 74 68      -file .\path
2eb0: 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a 20  \to\all.eagle.. 
2ec0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
2ed0: 20 20 20 20 20 20 45 61 67 6c 65 53 68 65 6c 6c        EagleShell
2ee0: 2e 65 78 65 20 2d 66 69 6c 65 20 2e 5c 70 61 74  .exe -file .\pat
2ef0: 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 20 2d  h\to\all.eagle -
2f00: 70 72 65 54 65 73 74 0d 0a 20 20 20 20 20 20 23  preTest..      #
2f10: 20 20 20 20 20 20 20 20 20 22 75 6e 73 65 74 20           "unset 
2f20: 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 74 65 73 74  -nocomplain test
2f30: 5f 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 22 0d  _configuration".
2f40: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
2f50: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
2f60: 20 3a 3a 74 65 73 74 5f 63 6f 6e 66 69 67 75 72   ::test_configur
2f70: 61 74 69 6f 6e 5d 20 26 26 20 5c 0d 0a 20 20 20  ation] && \..   
2f80: 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c         [string l
2f90: 65 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f 63 6f  ength $::test_co
2fa0: 6e 66 69 67 75 72 61 74 69 6f 6e 5d 20 3e 20 30  nfiguration] > 0
2fb0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
2fc0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
2fd0: 4f 54 45 3a 20 55 73 65 20 74 68 65 20 73 70 65  OTE: Use the spe
2fe0: 63 69 66 69 65 64 20 74 65 73 74 20 63 6f 6e 66  cified test conf
2ff0: 69 67 75 72 61 74 69 6f 6e 2e 20 20 54 68 65 20  iguration.  The 
3000: 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 75 73  default value us
3010: 65 64 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ed..        #   
3020: 20 20 20 20 66 6f 72 20 74 68 69 73 20 76 61 72      for this var
3030: 69 61 62 6c 65 20 69 73 20 74 79 70 69 63 61 6c  iable is typical
3040: 6c 79 20 22 52 65 6c 65 61 73 65 22 2c 20 61 73  ly "Release", as
3050: 20 73 65 74 20 62 79 20 74 68 65 20 74 65 73 74   set by the test
3060: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
3070: 20 20 73 75 69 74 65 20 69 74 73 65 6c 66 2e 0d    suite itself..
3080: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
3090: 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 74 65      return $::te
30a0: 73 74 5f 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  st_configuration
30b0: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
30c0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
30d0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e 6f 72       # NOTE: Nor
30e0: 6d 61 6c 6c 79 2c 20 77 65 20 77 69 6c 6c 20 6e  mally, we will n
30f0: 65 76 65 72 20 68 69 74 20 74 68 69 73 20 63 61  ever hit this ca
3100: 73 65 20 62 65 63 61 75 73 65 20 74 68 65 20 76  se because the v
3110: 61 6c 75 65 20 6f 66 20 74 68 65 0d 0a 20 20 20  alue of the..   
3120: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 65 73       #       tes
3130: 74 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  t configuration 
3140: 76 61 72 69 61 62 6c 65 20 69 73 20 61 6c 77 61  variable is alwa
3150: 79 73 20 73 65 74 20 62 79 20 74 68 65 20 74 65  ys set by the te
3160: 73 74 20 73 75 69 74 65 0d 0a 20 20 20 20 20 20  st suite..      
3170: 20 20 23 20 20 20 20 20 20 20 69 74 73 65 6c 66    #       itself
3180: 3b 20 68 6f 77 65 76 65 72 2c 20 69 74 20 63 61  ; however, it ca
3190: 6e 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e 20  n be overridden 
31a0: 75 73 69 6e 67 20 74 68 65 20 75 6e 73 65 74 20  using the unset 
31b0: 63 6f 6d 6d 61 6e 64 0d 0a 20 20 20 20 20 20 20  command..       
31c0: 20 23 20 20 20 20 20 20 20 66 72 6f 6d 20 74 68   #       from th
31d0: 65 20 2d 70 72 65 54 65 73 74 20 6f 70 74 69 6f  e -preTest optio
31e0: 6e 20 74 6f 20 74 68 65 20 74 65 73 74 20 73 75  n to the test su
31f0: 69 74 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ite...        #.
3200: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
3210: 24 3a 3a 65 61 67 6c 65 5f 70 6c 61 74 66 6f 72  $::eagle_platfor
3220: 6d 28 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 29  m(configuration)
3230: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
3240: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65  .....    proc ge
3250: 74 42 75 69 6c 64 43 6f 6e 66 69 67 75 72 61 74  tBuildConfigurat
3260: 69 6f 6e 73 20 7b 7d 20 7b 0d 0a 20 20 20 20 20  ions {} {..     
3270: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
3280: 3a 20 53 65 65 20 69 66 20 74 68 65 20 6c 69 73  : See if the lis
3290: 74 20 6f 66 20 74 65 73 74 20 63 6f 6e 66 69 67  t of test config
32a0: 75 72 61 74 69 6f 6e 73 20 68 61 73 20 62 65 65  urations has bee
32b0: 6e 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79 0d  n overridden by.
32c0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74  .      #       t
32d0: 68 65 20 75 73 65 72 20 28 65 2e 67 2e 20 6f 6e  he user (e.g. on
32e0: 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e   the command lin
32f0: 65 29 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  e)...      #..  
3300: 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
3310: 69 73 74 73 20 3a 3a 74 65 73 74 5f 63 6f 6e 66  ists ::test_conf
3320: 69 67 75 72 61 74 69 6f 6e 73 5d 20 26 26 20 5c  igurations] && \
3330: 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 6c 6c 65  ..          [lle
3340: 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f 63 6f 6e  ngth $::test_con
3350: 66 69 67 75 72 61 74 69 6f 6e 73 5d 20 3e 20 30  figurations] > 0
3360: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
3370: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
3380: 4f 54 45 3a 20 55 73 65 20 74 68 65 20 73 70 65  OTE: Use the spe
3390: 63 69 66 69 65 64 20 6c 69 73 74 20 6f 66 20 74  cified list of t
33a0: 65 73 74 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  est configuratio
33b0: 6e 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ns...        #..
33c0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24          return $
33d0: 3a 3a 74 65 73 74 5f 63 6f 6e 66 69 67 75 72 61  ::test_configura
33e0: 74 69 6f 6e 73 0d 0a 20 20 20 20 20 20 7d 20 65  tions..      } e
33f0: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  lse {..        #
3400: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
3410: 3a 20 55 73 65 20 74 68 65 20 64 65 66 61 75 6c  : Use the defaul
3420: 74 20 6c 69 73 74 20 6f 66 20 74 65 73 74 20 63  t list of test c
3430: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 2e 0d 0a  onfigurations...
3440: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
3450: 20 20 20 72 65 74 75 72 6e 20 5b 6c 69 73 74 20     return [list 
3460: 44 65 62 75 67 20 52 65 6c 65 61 73 65 5d 0d 0a  Debug Release]..
3470: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
3480: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 42  ...    proc getB
3490: 75 69 6c 64 42 61 73 65 44 69 72 65 63 74 6f 72  uildBaseDirector
34a0: 79 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  y {} {..      #.
34b0: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46  .      # NOTE: F
34c0: 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 62 61  igure out the ba
34d0: 73 65 20 64 69 72 65 63 74 6f 72 79 20 77 68 65  se directory whe
34e0: 72 65 20 61 6c 6c 20 74 68 65 20 62 75 69 6c 64  re all the build
34f0: 73 20 73 68 6f 75 6c 64 20 62 65 0d 0a 20 20 20  s should be..   
3500: 20 20 20 23 20 20 20 20 20 20 20 6c 6f 63 61 74     #       locat
3510: 65 64 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 62  ed.  This will b
3520: 65 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  e the directory 
3530: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
3540: 65 20 61 63 74 75 61 6c 0d 0a 20 20 20 20 20 20  e actual..      
3550: 23 20 20 20 20 20 20 20 62 75 69 6c 64 20 6f 75  #       build ou
3560: 74 70 75 74 20 64 69 72 65 63 74 6f 72 79 20 28  tput directory (
3570: 65 2e 67 2e 20 70 61 72 65 6e 74 20 6f 66 20 22  e.g. parent of "
3580: 62 69 6e 22 29 2e 0d 0a 20 20 20 20 20 20 23 0d  bin")...      #.
3590: 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f  .      if {[info
35a0: 20 65 78 69 73 74 73 20 3a 3a 62 75 69 6c 64 5f   exists ::build_
35b0: 62 61 73 65 5f 64 69 72 65 63 74 6f 72 79 5d 20  base_directory] 
35c0: 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
35d0: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
35e0: 3a 3a 62 75 69 6c 64 5f 62 61 73 65 5f 64 69 72  ::build_base_dir
35f0: 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65  ectory] > 0} the
3600: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
3610: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
3620: 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20  The location of 
3630: 74 68 65 20 62 75 69 6c 64 20 62 61 73 65 20 64  the build base d
3640: 69 72 65 63 74 6f 72 79 20 68 61 73 20 62 65 65  irectory has bee
3650: 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b 0d 0a 20  n overridden;.. 
3660: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74         #       t
3670: 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74  herefore, use it
3680: 20 76 65 72 62 61 74 69 6d 2e 0d 0a 20 20 20 20   verbatim...    
3690: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
36a0: 65 74 75 72 6e 20 24 3a 3a 62 75 69 6c 64 5f 62  eturn $::build_b
36b0: 61 73 65 5f 64 69 72 65 63 74 6f 72 79 0d 0a 20  ase_directory.. 
36c0: 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b       } elseif {[
36d0: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 63 6f  info exists ::co
36e0: 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79 5d 20  mmon_directory] 
36f0: 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
3700: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
3710: 3a 3a 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f  ::common_directo
3720: 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  ry] > 0} then {.
3730: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
3740: 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e 65 78 74      # NOTE: Next
3750: 2c 20 66 61 6c 6c 62 61 63 6b 20 74 6f 20 74 68  , fallback to th
3760: 65 20 67 72 61 6e 64 70 61 72 65 6e 74 20 64 69  e grandparent di
3770: 72 65 63 74 6f 72 79 20 6f 66 20 74 68 65 20 6f  rectory of the o
3780: 6e 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ne..        #   
3790: 20 20 20 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74      containing t
37a0: 68 69 73 20 66 69 6c 65 20 28 69 2e 65 2e 20 22  his file (i.e. "
37b0: 63 6f 6d 6d 6f 6e 2e 65 61 67 6c 65 22 29 2c 20  common.eagle"), 
37c0: 69 66 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0a 20  if available... 
37d0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
37e0: 20 20 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 64    return [file d
37f0: 69 72 6e 61 6d 65 20 5b 66 69 6c 65 20 64 69 72  irname [file dir
3800: 6e 61 6d 65 20 24 3a 3a 63 6f 6d 6d 6f 6e 5f 64  name $::common_d
3810: 69 72 65 63 74 6f 72 79 5d 5d 0d 0a 20 20 20 20  irectory]]..    
3820: 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66    } elseif {[inf
3830: 6f 20 65 78 69 73 74 73 20 3a 3a 70 61 74 68 5d  o exists ::path]
3840: 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
3850: 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20   [string length 
3860: 24 3a 3a 70 61 74 68 5d 20 3e 20 30 7d 20 74 68  $::path] > 0} th
3870: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
3880: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
3890: 20 46 69 6e 61 6c 6c 79 2c 20 66 61 6c 6c 62 61   Finally, fallba
38a0: 63 6b 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74  ck to the parent
38b0: 20 64 69 72 65 63 74 6f 72 79 20 6f 66 20 74 68   directory of th
38c0: 65 20 45 61 67 6c 65 54 65 73 74 0d 0a 20 20 20  e EagleTest..   
38d0: 20 20 20 20 20 23 20 20 20 20 20 20 20 70 61 74       #       pat
38e0: 68 2e 20 20 54 68 65 20 45 61 67 6c 65 54 65 73  h.  The EagleTes
38f0: 74 20 70 61 63 6b 61 67 65 20 67 75 61 72 61 6e  t package guaran
3900: 74 65 65 73 20 74 68 61 74 20 74 68 69 73 20 76  tees that this v
3910: 61 72 69 61 62 6c 65 0d 0a 20 20 20 20 20 20 20  ariable..       
3920: 20 23 20 20 20 20 20 20 20 77 69 6c 6c 20 62 65   #       will be
3930: 20 73 65 74 20 74 6f 20 74 68 65 20 64 69 72 65   set to the dire
3940: 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67  ctory containing
3950: 20 74 68 65 20 66 69 72 73 74 20 66 69 6c 65 20   the first file 
3960: 74 6f 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  to..        #   
3970: 20 20 20 20 65 78 65 63 75 74 65 20 74 68 65 20      execute the 
3980: 5b 72 75 6e 54 65 73 74 50 72 6f 6c 6f 67 75 65  [runTestPrologue
3990: 5d 20 73 63 72 69 70 74 20 6c 69 62 72 61 72 79  ] script library
39a0: 20 70 72 6f 63 65 64 75 72 65 2e 0d 0a 20 20 20   procedure...   
39b0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
39c0: 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 64 69 72  return [file dir
39d0: 6e 61 6d 65 20 24 3a 3a 70 61 74 68 5d 0d 0a 20  name $::path].. 
39e0: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
39f0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
3a00: 20 20 23 20 4e 4f 54 45 3a 20 4e 6f 20 70 61 74    # NOTE: No pat
3a10: 68 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20  h is available, 
3a20: 72 65 74 75 72 6e 20 61 6e 20 65 6d 70 74 79 20  return an empty 
3a30: 73 74 72 69 6e 67 2e 20 20 54 68 69 73 20 70 6f  string.  This po
3a40: 69 6e 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20  int..        #  
3a50: 20 20 20 20 20 73 68 6f 75 6c 64 20 6e 6f 74 20       should not 
3a60: 62 65 20 72 65 61 63 68 65 64 2e 0d 0a 20 20 20  be reached...   
3a70: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
3a80: 72 65 74 75 72 6e 20 22 22 0d 0a 20 20 20 20 20  return ""..     
3a90: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
3aa0: 20 20 70 72 6f 63 20 67 65 74 53 51 4c 69 74 65    proc getSQLite
3ab0: 54 65 73 74 44 61 74 61 50 61 74 68 20 7b 7d 20  TestDataPath {} 
3ac0: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
3ad0: 20 20 23 20 4e 4f 54 45 3a 20 46 69 67 75 72 65    # NOTE: Figure
3ae0: 20 6f 75 74 20 74 68 65 20 64 69 72 65 63 74 6f   out the directo
3af0: 72 79 20 77 68 65 72 65 20 61 6c 6c 20 74 68 65  ry where all the
3b00: 20 74 65 73 74 20 64 61 74 61 20 66 69 6c 65 73   test data files
3b10: 20 73 68 6f 75 6c 64 0d 0a 20 20 20 20 20 20 23   should..      #
3b20: 20 20 20 20 20 20 20 62 65 20 6c 6f 63 61 74 65         be locate
3b30: 64 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20  d.  This should 
3b40: 62 65 20 74 68 65 20 22 64 61 74 61 22 20 64 69  be the "data" di
3b50: 72 65 63 74 6f 72 79 20 62 65 6e 65 61 74 68 20  rectory beneath 
3b60: 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  the..      #    
3b70: 20 20 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e     directory con
3b80: 74 61 69 6e 69 6e 67 20 74 68 65 20 61 63 74 75  taining the actu
3b90: 61 6c 20 74 65 73 74 20 73 63 72 69 70 74 73 2e  al test scripts.
3ba0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
3bb0: 20 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 6a 6f   return [file jo
3bc0: 69 6e 20 24 3a 3a 70 61 74 68 20 64 61 74 61 5d  in $::path data]
3bd0: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
3be0: 70 72 6f 63 20 69 73 52 75 6e 6e 69 6e 67 57 6f  proc isRunningWo
3bf0: 57 36 34 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20  W64 {} {..      
3c00: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
3c10: 20 46 6f 72 20 6e 6f 77 2c 20 6a 75 73 74 20 75   For now, just u
3c20: 73 65 20 74 68 65 20 65 78 69 73 74 69 6e 67 20  se the existing 
3c30: 74 65 73 74 20 63 6f 6e 73 74 72 61 69 6e 74 20  test constraint 
3c40: 66 6f 72 20 64 65 74 65 63 74 69 6e 67 0d 0a 20  for detecting.. 
3c50: 20 20 20 20 20 23 20 20 20 20 20 20 20 61 20 57       #       a W
3c60: 6f 57 36 34 20 70 72 6f 63 65 73 73 2e 0d 0a 20  oW64 process... 
3c70: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65       #..      re
3c80: 74 75 72 6e 20 5b 68 61 76 65 43 6f 6e 73 74 72  turn [haveConstr
3c90: 61 69 6e 74 20 77 6f 77 36 34 5d 0d 0a 20 20 20  aint wow64]..   
3ca0: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
3cb0: 69 73 4d 69 78 65 64 4d 6f 64 65 41 73 73 65 6d  isMixedModeAssem
3cc0: 62 6c 79 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7b  bly { fileName {
3cd0: 76 61 72 4e 61 6d 65 20 22 22 7d 20 7d 20 7b 0d  varName ""} } {.
3ce0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
3cf0: 23 20 4e 4f 54 45 3a 20 46 69 72 73 74 2c 20 6d  # NOTE: First, m
3d00: 61 6b 65 20 73 75 72 65 20 74 68 65 20 74 65 73  ake sure the tes
3d10: 74 20 73 75 69 74 65 20 69 6e 66 72 61 73 74 72  t suite infrastr
3d20: 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 77 65  ucture is allowe
3d30: 64 20 74 6f 0d 0a 20 20 20 20 20 20 23 20 20 20  d to..      #   
3d40: 20 20 20 20 75 73 65 20 74 68 65 20 5b 65 78 65      use the [exe
3d50: 63 5d 20 63 6f 6d 6d 61 6e 64 2e 0d 0a 20 20 20  c] command...   
3d60: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
3d70: 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
3d80: 6e 6f 28 65 78 65 63 29 5d 20 26 26 20 21 5b 69  no(exec)] && ![i
3d90: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
3da0: 63 6f 72 46 6c 61 67 73 29 5d 7d 20 74 68 65 6e  corFlags)]} then
3db0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
3dc0: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49         # NOTE: I
3dd0: 66 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f  f the location o
3de0: 66 20 43 6f 72 46 6c 61 67 73 20 69 73 20 70 72  f CorFlags is pr
3df0: 65 73 65 6e 74 20 69 6e 20 74 68 65 20 65 6e 76  esent in the env
3e00: 69 72 6f 6e 6d 65 6e 74 2c 0d 0a 20 20 20 20 20  ironment,..     
3e10: 20 20 20 23 20 20 20 20 20 20 20 75 73 65 20 69     #       use i
3e20: 74 3b 20 6f 74 68 65 72 77 69 73 65 20 61 73 73  t; otherwise ass
3e30: 75 6d 65 20 69 74 20 69 73 20 69 6e 20 74 68 65  ume it is in the
3e40: 20 50 41 54 48 2e 0d 0a 20 20 20 20 20 20 20 20   PATH...        
3e50: 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 63  #..        set c
3e60: 6f 72 46 6c 61 67 73 20 5b 65 78 70 72 20 7b 0d  orFlags [expr {.
3e70: 0a 20 20 20 20 20 20 20 20 20 20 5b 69 6e 66 6f  .          [info
3e80: 20 65 78 69 73 74 73 20 3a 3a 65 6e 76 28 43 6f   exists ::env(Co
3e90: 72 46 6c 61 67 73 29 5d 20 3f 20 24 3a 3a 65 6e  rFlags)] ? $::en
3ea0: 76 28 43 6f 72 46 6c 61 67 73 29 20 3a 20 22 43  v(CorFlags) : "C
3eb0: 6f 72 46 6c 61 67 73 22 0d 0a 20 20 20 20 20 20  orFlags"..      
3ec0: 20 20 7d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20    }]....        
3ed0: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
3ee0: 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 65 78  E: Attempt to ex
3ef0: 65 63 75 74 65 20 43 6f 72 46 6c 61 67 73 20 6f  ecute CorFlags o
3f00: 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  n the specified 
3f10: 66 69 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 23  file...        #
3f20: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63  ..        if {[c
3f30: 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
3f40: 20 20 65 78 65 63 20 2d 2d 20 24 63 6f 72 46 6c    exec -- $corFl
3f50: 61 67 73 20 5b 66 69 6c 65 20 6e 61 74 69 76 65  ags [file native
3f60: 6e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 5d 0d  name $fileName].
3f70: 0a 20 20 20 20 20 20 20 20 7d 20 65 78 65 63 5d  .        } exec]
3f80: 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
3f90: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
3fa0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66        # NOTE: If
3fb0: 20 72 65 71 75 65 73 74 65 64 20 62 79 20 6f 75   requested by ou
3fc0: 72 20 63 61 6c 6c 65 72 2c 20 61 74 74 65 6d 70  r caller, attemp
3fd0: 74 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  t to determine t
3fe0: 68 65 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20  he..          # 
3ff0: 20 20 20 20 20 20 70 6c 61 74 66 6f 72 6d 20 66        platform f
4000: 6f 72 20 74 68 65 20 73 70 65 63 69 66 69 65 64  or the specified
4010: 20 66 69 6c 65 20 61 73 20 77 65 6c 6c 2e 0d 0a   file as well...
4020: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
4030: 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69         if {[stri
4040: 6e 67 20 6c 65 6e 67 74 68 20 24 76 61 72 4e 61  ng length $varNa
4050: 6d 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  me] > 0} then {.
4060: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a  .            #..
4070: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f              # NO
4080: 54 45 3a 20 53 74 6f 72 65 20 74 68 65 20 70 6c  TE: Store the pl
4090: 61 74 66 6f 72 6d 20 69 6e 20 74 68 65 20 6e 61  atform in the na
40a0: 6d 65 64 20 76 61 72 69 61 62 6c 65 20 69 6e 20  med variable in 
40b0: 74 68 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  the..           
40c0: 20 23 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74   #       context
40d0: 20 6f 66 20 6f 75 72 20 63 61 6c 6c 65 72 2e 0d   of our caller..
40e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a  .            #..
40f0: 20 20 20 20 20 20 20 20 20 20 20 20 75 70 76 61              upva
4100: 72 20 31 20 24 76 61 72 4e 61 6d 65 20 70 6c 61  r 1 $varName pla
4110: 74 66 6f 72 6d 0d 0a 0d 0a 20 20 20 20 20 20 20  tform....       
4120: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
4130: 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65      # NOTE: Atte
4140: 6d 70 74 20 74 6f 20 65 78 74 72 61 63 74 20 74  mpt to extract t
4150: 68 65 20 50 45 20 6c 69 6e 65 20 66 72 6f 6d 20  he PE line from 
4160: 74 68 65 20 63 61 70 74 75 72 65 64 0d 0a 20 20  the captured..  
4170: 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
4180: 20 20 6f 75 74 70 75 74 2e 20 20 49 66 20 74 68    output.  If th
4190: 69 73 20 76 61 6c 75 65 20 69 73 20 22 50 45 33  is value is "PE3
41a0: 32 22 20 6f 72 20 22 50 45 33 32 2b 22 2c 20 74  2" or "PE32+", t
41b0: 68 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  he..            
41c0: 23 20 20 20 20 20 20 20 61 73 73 65 6d 62 6c 79  #       assembly
41d0: 20 66 69 6c 65 20 69 73 20 33 32 2d 62 69 74 20   file is 32-bit 
41e0: 6f 72 20 36 34 2d 62 69 74 2c 20 72 65 73 70 65  or 64-bit, respe
41f0: 63 74 69 76 65 6c 79 3b 0d 0a 20 20 20 20 20 20  ctively;..      
4200: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6f 74        #       ot
4210: 68 65 72 77 69 73 65 2c 20 69 74 73 20 74 79 70  herwise, its typ
4220: 65 20 69 73 20 75 6e 6b 6e 6f 77 6e 2e 0d 0a 20  e is unknown... 
4230: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
4240: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 70 61            set pa
4250: 74 74 65 72 6e 20 7b 5e 50 45 20 20 20 20 20 20  ttern {^PE      
4260: 20 20 3a 20 28 50 45 33 32 7c 50 45 33 32 5c 2b    : (PE32|PE32\+
4270: 29 5c 73 2b 24 7d 0d 0a 0d 0a 20 20 20 20 20 20  )\s+$}....      
4280: 20 20 20 20 20 20 69 66 20 7b 5b 72 65 67 65 78        if {[regex
4290: 70 20 2d 6c 69 6e 65 20 2d 2d 20 24 70 61 74 74  p -line -- $patt
42a0: 65 72 6e 20 24 65 78 65 63 20 64 75 6d 6d 79 20  ern $exec dummy 
42b0: 70 65 33 32 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  pe32]} then {.. 
42c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a               #..
42d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
42e0: 48 41 43 4b 3a 20 54 68 69 73 20 5b 73 77 69 74  HACK: This [swit
42f0: 63 68 5d 20 61 73 73 75 6d 65 73 20 74 68 61 74  ch] assumes that
4300: 20 33 32 2d 62 69 74 20 65 78 65 63 75 74 61 62   32-bit executab
4310: 6c 65 73 20 61 72 65 0d 0a 20 20 20 20 20 20 20  les are..       
4320: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61         #       a
4330: 6c 77 61 79 73 20 78 38 36 20 61 6e 64 20 74 68  lways x86 and th
4340: 61 74 20 36 34 2d 62 69 74 20 65 78 65 63 75 74  at 64-bit execut
4350: 61 62 6c 65 73 20 61 72 65 20 61 6c 77 61 79 73  ables are always
4360: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
4370: 23 20 20 20 20 20 20 20 78 36 34 2e 0d 0a 20 20  #       x64...  
4380: 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
4390: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 77 69               swi
43a0: 74 63 68 20 2d 65 78 61 63 74 20 2d 2d 20 24 70  tch -exact -- $p
43b0: 65 33 32 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  e32 {..         
43c0: 20 20 20 20 20 20 20 50 45 33 32 20 7b 0d 0a 20         PE32 {.. 
43d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
43e0: 20 73 65 74 20 70 6c 61 74 66 6f 72 6d 20 57 69   set platform Wi
43f0: 6e 33 32 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n32..           
4400: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
4410: 20 20 20 20 20 20 20 20 50 45 33 32 2b 20 7b 0d          PE32+ {.
4420: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4430: 20 20 20 73 65 74 20 70 6c 61 74 66 6f 72 6d 20     set platform 
4440: 78 36 34 0d 0a 20 20 20 20 20 20 20 20 20 20 20  x64..           
4450: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
4460: 20 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 20          default 
4470: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
4480: 20 20 20 20 20 73 65 74 20 70 6c 61 74 66 6f 72       set platfor
4490: 6d 20 22 22 0d 0a 20 20 20 20 20 20 20 20 20 20  m ""..          
44a0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
44b0: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
44c0: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
44d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
44e0: 74 20 70 6c 61 74 66 6f 72 6d 20 22 22 0d 0a 20  t platform "".. 
44f0: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
4500: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
4510: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
4520: 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65      # NOTE: Atte
4530: 6d 70 74 20 74 6f 20 65 78 74 72 61 63 74 20 74  mpt to extract t
4540: 68 65 20 49 4c 4f 4e 4c 59 20 6c 69 6e 65 20 66  he ILONLY line f
4550: 72 6f 6d 20 74 68 65 20 63 61 70 74 75 72 65 64  rom the captured
4560: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20  ..          #   
4570: 20 20 20 20 6f 75 74 70 75 74 2e 20 20 49 66 20      output.  If 
4580: 74 68 69 73 20 76 61 6c 75 65 20 69 73 20 7a 65  this value is ze
4590: 72 6f 2c 20 74 68 65 20 73 70 65 63 69 66 69 65  ro, the specifie
45a0: 64 20 66 69 6c 65 20 6d 75 73 74 0d 0a 20 20 20  d file must..   
45b0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62         #       b
45c0: 65 20 61 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61  e a mixed-mode a
45d0: 73 73 65 6d 62 6c 79 3b 20 6f 74 68 65 72 77 69  ssembly; otherwi
45e0: 73 65 2c 20 69 74 20 63 6f 6e 74 61 69 6e 73 20  se, it contains 
45f0: 6f 6e 6c 79 0d 0a 20 20 20 20 20 20 20 20 20 20  only..          
4600: 23 20 20 20 20 20 20 20 6d 61 6e 61 67 65 64 20  #       managed 
4610: 63 6f 6d 70 6f 6e 65 6e 74 73 2e 0d 0a 20 20 20  components...   
4620: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
4630: 20 20 20 20 73 65 74 20 70 61 74 74 65 72 6e 20      set pattern 
4640: 7b 5e 49 4c 4f 4e 4c 59 20 20 20 20 3a 20 28 30  {^ILONLY    : (0
4650: 7c 31 29 5c 73 2b 24 7d 0d 0a 0d 0a 20 20 20 20  |1)\s+$}....    
4660: 20 20 20 20 20 20 69 66 20 7b 21 5b 72 65 67 65        if {![rege
4670: 78 70 20 2d 6c 69 6e 65 20 2d 2d 20 24 70 61 74  xp -line -- $pat
4680: 74 65 72 6e 20 24 65 78 65 63 20 64 75 6d 6d 79  tern $exec dummy
4690: 20 69 6c 4f 6e 6c 79 5d 7d 20 74 68 65 6e 20 7b   ilOnly]} then {
46a0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ..            re
46b0: 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20  turn false..    
46c0: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
46d0: 20 20 20 20 20 69 66 20 7b 21 24 69 6c 4f 6e 6c       if {!$ilOnl
46e0: 79 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  y} then {..     
46f0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72         return tr
4700: 75 65 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  ue..          }.
4710: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
4720: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
4730: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66        # NOTE: If
4740: 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65 20   the test suite 
4750: 63 61 6e 6e 6f 74 20 75 73 65 20 5b 65 78 65 63  cannot use [exec
4760: 5d 20 6f 72 20 65 78 65 63 75 74 69 6f 6e 20 6f  ] or execution o
4770: 66 20 43 6f 72 46 6c 61 67 73 0d 0a 20 20 20 20  f CorFlags..    
4780: 20 20 23 20 20 20 20 20 20 20 66 61 69 6c 65 64    #       failed
4790: 2c 20 72 65 74 75 72 6e 20 66 61 6c 73 65 2e 0d  , return false..
47a0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
47b0: 72 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20  return false..  
47c0: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
47d0: 20 67 65 74 4e 61 74 69 76 65 4c 69 62 72 61 72   getNativeLibrar
47e0: 79 46 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79 20 7b  yFileNamesOnly {
47f0: 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
4800: 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69 72 73      # NOTE: Firs
4810: 74 2c 20 63 68 65 63 6b 20 69 66 20 74 68 65 20  t, check if the 
4820: 6c 69 73 74 20 6f 66 20 6e 61 74 69 76 65 20 6c  list of native l
4830: 69 62 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65  ibrary file name
4840: 73 20 68 61 73 20 62 65 65 6e 0d 0a 20 20 20 20  s has been..    
4850: 20 20 23 20 20 20 20 20 20 20 6d 61 6e 75 61 6c    #       manual
4860: 6c 79 20 6f 76 65 72 72 69 64 64 65 6e 2e 0d 0a  ly overridden...
4870: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
4880: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
4890: 3a 3a 6e 61 74 69 76 65 5f 6c 69 62 72 61 72 79  ::native_library
48a0: 5f 66 69 6c 65 5f 6e 61 6d 65 73 5d 20 26 26 20  _file_names] && 
48b0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 6c 6c  \..          [ll
48c0: 65 6e 67 74 68 20 24 3a 3a 6e 61 74 69 76 65 5f  ength $::native_
48d0: 6c 69 62 72 61 72 79 5f 66 69 6c 65 5f 6e 61 6d  library_file_nam
48e0: 65 73 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  es] > 0} then {.
48f0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
4900: 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20      # NOTE: The 
4910: 6c 69 73 74 20 6f 66 20 6e 61 74 69 76 65 20 6c  list of native l
4920: 69 62 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65  ibrary file name
4930: 73 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72  s has been overr
4940: 69 64 64 65 6e 3b 0d 0a 20 20 20 20 20 20 20 20  idden;..        
4950: 23 20 20 20 20 20 20 20 74 68 65 72 65 66 6f 72  #       therefor
4960: 65 2c 20 75 73 65 20 69 74 20 76 65 72 62 61 74  e, use it verbat
4970: 69 6d 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  im...        #..
4980: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24          return $
4990: 3a 3a 6e 61 74 69 76 65 5f 6c 69 62 72 61 72 79  ::native_library
49a0: 5f 66 69 6c 65 5f 6e 61 6d 65 73 0d 0a 20 20 20  _file_names..   
49b0: 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69 73     } elseif {[is
49c0: 57 69 6e 64 6f 77 73 5d 7d 20 74 68 65 6e 20 7b  Windows]} then {
49d0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
49e0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4f 74 68       # NOTE: Oth
49f0: 65 72 77 69 73 65 2c 20 6f 6e 20 57 69 6e 64 6f  erwise, on Windo
4a00: 77 73 2c 20 61 6c 77 61 79 73 20 75 73 65 20 74  ws, always use t
4a10: 68 65 20 64 65 66 61 75 6c 74 20 66 69 6c 65 20  he default file 
4a20: 6e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 23 20  name..        # 
4a30: 20 20 20 20 20 20 22 73 71 6c 69 74 65 33 2e 64        "sqlite3.d
4a40: 6c 6c 22 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ll"...        #.
4a50: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
4a60: 5b 6c 69 73 74 20 73 71 6c 69 74 65 33 2e 64 6c  [list sqlite3.dl
4a70: 6c 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  l]..      } else
4a80: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
4a90: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4f         # NOTE: O
4aa0: 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e  therwise, return
4ab0: 20 62 6f 74 68 20 74 68 65 20 67 65 6e 65 72 69   both the generi
4ac0: 63 20 50 4f 53 49 58 20 66 69 6c 65 20 6e 61 6d  c POSIX file nam
4ad0: 65 20 61 6e 64 20 74 68 65 0d 0a 20 20 20 20 20  e and the..     
4ae0: 20 20 20 23 20 20 20 20 20 20 20 4d 61 63 20 4f     #       Mac O
4af0: 53 20 58 20 66 69 6c 65 20 6e 61 6d 65 2c 20 73  S X file name, s
4b00: 69 6e 63 65 20 77 65 20 64 6f 20 6e 6f 74 20 63  ince we do not c
4b10: 75 72 72 65 6e 74 6c 79 20 68 61 76 65 20 61 6e  urrently have an
4b20: 20 65 61 73 79 0d 0a 20 20 20 20 20 20 20 20 23   easy..        #
4b30: 20 20 20 20 20 20 20 77 61 79 20 74 6f 20 64 65         way to de
4b40: 74 65 63 74 20 77 68 69 63 68 20 6f 66 20 74 68  tect which of th
4b50: 6f 73 65 20 70 6c 61 74 66 6f 72 6d 73 20 77 65  ose platforms we
4b60: 20 61 72 65 20 72 75 6e 6e 69 6e 67 20 6f 6e 2e   are running on.
4b70: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
4b80: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6c 69 73       return [lis
4b90: 74 20 6c 69 62 73 71 6c 69 74 65 33 2e 64 79 6c  t libsqlite3.dyl
4ba0: 69 62 20 6c 69 62 73 71 6c 69 74 65 33 2e 73 6f  ib libsqlite3.so
4bb0: 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  ]..      }..    
4bc0: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67  }.....    proc g
4bd0: 65 74 49 6e 74 65 72 6f 70 41 73 73 65 6d 62 6c  etInteropAssembl
4be0: 79 46 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79 20 7b  yFileNamesOnly {
4bf0: 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
4c00: 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69 72 73      # NOTE: Firs
4c10: 74 2c 20 63 68 65 63 6b 20 69 66 20 74 68 65 20  t, check if the 
4c20: 6c 69 73 74 20 6f 66 20 69 6e 74 65 72 6f 70 20  list of interop 
4c30: 61 73 73 65 6d 62 6c 79 20 66 69 6c 65 20 6e 61  assembly file na
4c40: 6d 65 73 20 68 61 73 20 62 65 65 6e 0d 0a 20 20  mes has been..  
4c50: 20 20 20 20 23 20 20 20 20 20 20 20 6d 61 6e 75      #       manu
4c60: 61 6c 6c 79 20 6f 76 65 72 72 69 64 64 65 6e 2e  ally overridden.
4c70: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
4c80: 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
4c90: 73 20 3a 3a 69 6e 74 65 72 6f 70 5f 61 73 73 65  s ::interop_asse
4ca0: 6d 62 6c 79 5f 66 69 6c 65 5f 6e 61 6d 65 73 5d  mbly_file_names]
4cb0: 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
4cc0: 20 5b 6c 6c 65 6e 67 74 68 20 24 3a 3a 69 6e 74   [llength $::int
4cd0: 65 72 6f 70 5f 61 73 73 65 6d 62 6c 79 5f 66 69  erop_assembly_fi
4ce0: 6c 65 5f 6e 61 6d 65 73 5d 20 3e 20 30 7d 20 74  le_names] > 0} t
4cf0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
4d00: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
4d10: 3a 20 54 68 65 20 6c 69 73 74 20 6f 66 20 69 6e  : The list of in
4d20: 74 65 72 6f 70 20 61 73 73 65 6d 62 6c 79 20 66  terop assembly f
4d30: 69 6c 65 20 6e 61 6d 65 73 20 68 61 73 20 62 65  ile names has be
4d40: 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b 0d 0a  en overridden;..
4d50: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
4d60: 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69  therefore, use i
4d70: 74 20 76 65 72 62 61 74 69 6d 2e 0d 0a 20 20 20  t verbatim...   
4d80: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
4d90: 72 65 74 75 72 6e 20 24 3a 3a 69 6e 74 65 72 6f  return $::intero
4da0: 70 5f 61 73 73 65 6d 62 6c 79 5f 66 69 6c 65 5f  p_assembly_file_
4db0: 6e 61 6d 65 73 0d 0a 20 20 20 20 20 20 7d 20 65  names..      } e
4dc0: 6c 73 65 69 66 20 7b 5b 69 73 57 69 6e 64 6f 77  lseif {[isWindow
4dd0: 73 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  s]} then {..    
4de0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
4df0: 20 4e 4f 54 45 3a 20 4f 74 68 65 72 77 69 73 65   NOTE: Otherwise
4e00: 2c 20 6f 6e 20 57 69 6e 64 6f 77 73 2c 20 61 6c  , on Windows, al
4e10: 77 61 79 73 20 75 73 65 20 74 68 65 20 64 65 66  ways use the def
4e20: 61 75 6c 74 20 66 69 6c 65 20 6e 61 6d 65 0d 0a  ault file name..
4e30: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
4e40: 22 53 51 4c 69 74 65 2e 49 6e 74 65 72 6f 70 2e  "SQLite.Interop.
4e50: 64 6c 6c 22 2e 0d 0a 20 20 20 20 20 20 20 20 23  dll"...        #
4e60: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
4e70: 20 5b 6c 69 73 74 20 53 51 4c 69 74 65 2e 49 6e   [list SQLite.In
4e80: 74 65 72 6f 70 2e 64 6c 6c 5d 0d 0a 20 20 20 20  terop.dll]..    
4e90: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
4ea0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
4eb0: 20 4e 4f 54 45 3a 20 4f 74 68 65 72 77 69 73 65   NOTE: Otherwise
4ec0: 2c 20 72 65 74 75 72 6e 20 62 6f 74 68 20 74 68  , return both th
4ed0: 65 20 67 65 6e 65 72 69 63 20 50 4f 53 49 58 20  e generic POSIX 
4ee0: 66 69 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68  file name and th
4ef0: 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
4f00: 20 20 20 4d 61 63 20 4f 53 20 58 20 66 69 6c 65     Mac OS X file
4f10: 20 6e 61 6d 65 2c 20 73 69 6e 63 65 20 77 65 20   name, since we 
4f20: 64 6f 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  do not currently
4f30: 20 68 61 76 65 20 61 6e 20 65 61 73 79 0d 0a 20   have an easy.. 
4f40: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 77         #       w
4f50: 61 79 20 74 6f 20 64 65 74 65 63 74 20 77 68 69  ay to detect whi
4f60: 63 68 20 6f 66 20 74 68 6f 73 65 20 70 6c 61 74  ch of those plat
4f70: 66 6f 72 6d 73 20 77 65 20 61 72 65 20 72 75 6e  forms we are run
4f80: 6e 69 6e 67 20 6f 6e 2e 0d 0a 20 20 20 20 20 20  ning on...      
4f90: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
4fa0: 75 72 6e 20 5b 6c 69 73 74 20 6c 69 62 53 51 4c  urn [list libSQL
4fb0: 69 74 65 2e 49 6e 74 65 72 6f 70 2e 64 79 6c 69  ite.Interop.dyli
4fc0: 62 20 6c 69 62 53 51 4c 69 74 65 2e 49 6e 74 65  b libSQLite.Inte
4fd0: 72 6f 70 2e 73 6f 5d 0d 0a 20 20 20 20 20 20 7d  rop.so]..      }
4fe0: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
4ff0: 70 72 6f 63 20 67 65 74 43 6f 72 65 45 78 74 65  proc getCoreExte
5000: 6e 73 69 6f 6e 42 69 6e 61 72 79 46 69 6c 65 4e  nsionBinaryFileN
5010: 61 6d 65 20 7b 20 7b 64 65 66 61 75 6c 74 20 22  ame { {default "
5020: 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65  "} } {..      se
5030: 74 20 66 69 6c 65 4e 61 6d 65 20 5b 67 65 74 43  t fileName [getC
5040: 6f 72 65 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d  oreBinaryFileNam
5050: 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b  e]....      if {
5060: 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 66 69  [file exists $fi
5070: 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d  leName]} then {.
5080: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
5090: 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20  $fileName..     
50a0: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75   }....      retu
50b0: 72 6e 20 24 64 65 66 61 75 6c 74 0d 0a 20 20 20  rn $default..   
50c0: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
50d0: 69 73 42 75 69 6c 64 41 76 61 69 6c 61 62 6c 65  isBuildAvailable
50e0: 20 7b 20 6e 61 74 69 76 65 20 64 69 72 65 63 74   { native direct
50f0: 6f 72 79 20 7b 76 61 72 4e 61 6d 65 20 22 22 7d  ory {varName ""}
5100: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20   } {..      #.. 
5110: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69       # NOTE: Bui
5120: 6c 64 20 74 68 65 20 66 75 6c 6c 79 20 71 75 61  ld the fully qua
5130: 6c 69 66 69 65 64 20 66 69 6c 65 20 6e 61 6d 65  lified file name
5140: 20 66 6f 72 20 74 68 65 20 70 72 69 6d 61 72 79   for the primary
5150: 20 61 73 73 65 6d 62 6c 79 0d 0a 20 20 20 20 20   assembly..     
5160: 20 23 20 20 20 20 20 20 20 63 6f 6e 74 61 69 6e   #       contain
5170: 69 6e 67 20 74 68 65 20 53 79 73 74 65 6d 2e 44  ing the System.D
5180: 61 74 61 2e 53 51 4c 69 74 65 20 6d 61 6e 61 67  ata.SQLite manag
5190: 65 64 20 63 6f 6d 70 6f 6e 65 6e 74 73 2e 20 20  ed components.  
51a0: 49 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  It..      #     
51b0: 20 20 73 68 6f 75 6c 64 20 62 65 20 6e 6f 74 65    should be note
51c0: 64 20 74 68 61 74 20 74 68 69 73 20 61 73 73 65  d that this asse
51d0: 6d 62 6c 79 20 66 69 6c 65 20 6d 61 79 20 61 6c  mbly file may al
51e0: 73 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 0d 0a  so contain the..
51f0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6e 61        #       na
5200: 74 69 76 65 20 63 6f 6d 70 6f 6e 65 6e 74 73 2c  tive components,
5210: 20 69 66 20 61 20 6e 61 74 69 76 65 20 62 75 69   if a native bui
5220: 6c 64 20 69 73 20 69 6e 20 75 73 65 2e 0d 0a 20  ld is in use... 
5230: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65       #..      se
5240: 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65  t fileName [file
5250: 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c   nativename [fil
5260: 65 20 6a 6f 69 6e 20 24 64 69 72 65 63 74 6f 72  e join $director
5270: 79 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 53  y \..          S
5280: 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
5290: 65 2e 64 6c 6c 5d 5d 0d 0a 0d 0a 20 20 20 20 20  e.dll]]....     
52a0: 20 69 66 20 7b 21 5b 66 69 6c 65 20 65 78 69 73   if {![file exis
52b0: 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74  ts $fileName]} t
52c0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72  hen {..        r
52d0: 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20  eturn false..   
52e0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
52f0: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41  .      # NOTE: A
5300: 74 74 65 6d 70 74 20 74 6f 20 61 75 74 6f 6d 61  ttempt to automa
5310: 74 69 63 61 6c 6c 79 20 64 65 74 65 63 74 20 69  tically detect i
5320: 66 20 74 68 65 20 70 72 69 6d 61 72 79 20 61 73  f the primary as
5330: 73 65 6d 62 6c 79 0d 0a 20 20 20 20 20 20 23 20  sembly..      # 
5340: 20 20 20 20 20 20 63 6f 6e 74 61 69 6e 73 20 61        contains a
5350: 6e 79 20 6e 61 74 69 76 65 20 63 6f 6d 70 6f 6e  ny native compon
5360: 65 6e 74 73 2c 20 69 66 20 6e 65 63 65 73 73 61  ents, if necessa
5370: 72 79 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ry...      #..  
5380: 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
5390: 6c 65 6e 67 74 68 20 24 6e 61 74 69 76 65 5d 20  length $native] 
53a0: 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
53b0: 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
53c0: 67 20 6c 65 6e 67 74 68 20 24 76 61 72 4e 61 6d  g length $varNam
53d0: 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  e] > 0} then {..
53e0: 20 20 20 20 20 20 20 20 20 20 75 70 76 61 72 20            upvar 
53f0: 31 20 24 76 61 72 4e 61 6d 65 20 24 76 61 72 4e  1 $varName $varN
5400: 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  ame..        }..
5410: 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 6e 61  ..        set na
5420: 74 69 76 65 20 5b 69 73 4d 69 78 65 64 4d 6f 64  tive [isMixedMod
5430: 65 41 73 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e  eAssembly $fileN
5440: 61 6d 65 20 24 76 61 72 4e 61 6d 65 5d 0d 0a 20  ame $varName].. 
5450: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
5460: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
5470: 20 49 66 20 74 68 65 20 70 72 69 6d 61 72 79 20   If the primary 
5480: 61 73 73 65 6d 62 6c 79 20 61 6c 73 6f 20 63 6f  assembly also co
5490: 6e 74 61 69 6e 73 20 74 68 65 20 6e 61 74 69 76  ntains the nativ
54a0: 65 20 63 6f 6d 70 6f 6e 65 6e 74 73 2c 0d 0a 20  e components,.. 
54b0: 20 20 20 20 20 23 20 20 20 20 20 20 20 77 65 20       #       we 
54c0: 68 61 76 65 20 65 76 65 72 79 74 68 69 6e 67 20  have everything 
54d0: 77 65 20 6e 65 65 64 2e 0d 0a 20 20 20 20 20 20  we need...      
54e0: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 6e 61  #..      if {$na
54f0: 74 69 76 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  tive} then {..  
5500: 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75        return tru
5510: 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  e..      }....  
5520: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
5530: 4f 54 45 3a 20 57 68 61 74 20 69 73 20 74 68 65  OTE: What is the
5540: 20 61 72 63 68 69 74 65 63 74 75 72 65 20 66 6f   architecture fo
5550: 72 20 74 68 69 73 20 6d 61 63 68 69 6e 65 3f 0d  r this machine?.
5560: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
5570: 73 65 74 20 61 72 63 68 69 74 65 63 74 75 72 65  set architecture
5580: 20 5b 6d 61 63 68 69 6e 65 54 6f 50 6c 61 74 66   [machineToPlatf
5590: 6f 72 6d 20 24 3a 3a 74 63 6c 5f 70 6c 61 74 66  orm $::tcl_platf
55a0: 6f 72 6d 28 6d 61 63 68 69 6e 65 29 20 74 72 75  orm(machine) tru
55b0: 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20  e]....      #.. 
55c0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 68 61       # NOTE: Wha
55d0: 74 20 69 73 20 74 68 65 20 70 6c 61 74 66 6f 72  t is the platfor
55e0: 6d 20 66 6f 72 20 74 68 69 73 20 6d 61 63 68 69  m for this machi
55f0: 6e 65 3f 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ne?..      #..  
5600: 20 20 20 20 73 65 74 20 70 6c 61 74 66 6f 72 6d      set platform
5610: 20 5b 6d 61 63 68 69 6e 65 54 6f 50 6c 61 74 66   [machineToPlatf
5620: 6f 72 6d 20 24 3a 3a 74 63 6c 5f 70 6c 61 74 66  orm $::tcl_platf
5630: 6f 72 6d 28 6d 61 63 68 69 6e 65 29 5d 0d 0a 0d  orm(machine)]...
5640: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
5650: 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74 68  # NOTE: Build th
5660: 65 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65  e fully qualifie
5670: 64 20 66 69 6c 65 20 6e 61 6d 65 20 66 6f 72 20  d file name for 
5680: 74 68 65 20 69 6e 74 65 72 6f 70 20 61 73 73 65  the interop asse
5690: 6d 62 6c 79 0d 0a 20 20 20 20 20 20 23 20 20 20  mbly..      #   
56a0: 20 20 20 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74      containing t
56b0: 68 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  he System.Data.S
56c0: 51 4c 69 74 65 20 6e 61 74 69 76 65 20 63 6f 6d  QLite native com
56d0: 70 6f 6e 65 6e 74 73 2e 20 20 49 66 20 74 68 69  ponents.  If thi
56e0: 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  s..      #      
56f0: 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 77 65   file exists, we
5700: 20 73 68 6f 75 6c 64 20 68 61 76 65 20 65 76 65   should have eve
5710: 72 79 74 68 69 6e 67 20 77 65 20 6e 65 65 64 2e  rything we need.
5720: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
5730: 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d   foreach fileNam
5740: 65 4f 6e 6c 79 20 5b 67 65 74 49 6e 74 65 72 6f  eOnly [getIntero
5750: 70 41 73 73 65 6d 62 6c 79 46 69 6c 65 4e 61 6d  pAssemblyFileNam
5760: 65 73 4f 6e 6c 79 5d 20 7b 0d 0a 20 20 20 20 20  esOnly] {..     
5770: 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 20     set fileName 
5780: 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65  [file nativename
5790: 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 64 69 72   [file join $dir
57a0: 65 63 74 6f 72 79 20 5c 0d 0a 20 20 20 20 20 20  ectory \..      
57b0: 20 20 20 20 20 20 24 61 72 63 68 69 74 65 63 74        $architect
57c0: 75 72 65 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c  ure $fileNameOnl
57d0: 79 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69  y]]....        i
57e0: 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20  f {[file exists 
57f0: 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e  $fileName]} then
5800: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65   {..          re
5810: 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20  turn true..     
5820: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
5830: 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69  set fileName [fi
5840: 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66  le nativename [f
5850: 69 6c 65 20 6a 6f 69 6e 20 24 64 69 72 65 63 74  ile join $direct
5860: 6f 72 79 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ory \..         
5870: 20 20 20 24 70 6c 61 74 66 6f 72 6d 20 24 66 69     $platform $fi
5880: 6c 65 4e 61 6d 65 4f 6e 6c 79 5d 5d 0d 0a 0d 0a  leNameOnly]]....
5890: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 66 69 6c          if {[fil
58a0: 65 20 65 78 69 73 74 73 20 24 66 69 6c 65 4e 61  e exists $fileNa
58b0: 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  me]} then {..   
58c0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72         return tr
58d0: 75 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  ue..        }...
58e0: 0a 20 20 20 20 20 20 20 20 73 65 74 20 66 69 6c  .        set fil
58f0: 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6e 61 74 69  eName [file nati
5900: 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69  vename [file joi
5910: 6e 20 24 64 69 72 65 63 74 6f 72 79 20 5c 0d 0a  n $directory \..
5920: 20 20 20 20 20 20 20 20 20 20 20 20 24 66 69 6c              $fil
5930: 65 4e 61 6d 65 4f 6e 6c 79 5d 5d 0d 0a 0d 0a 20  eNameOnly]].... 
5940: 20 20 20 20 20 20 20 69 66 20 7b 5b 66 69 6c 65         if {[file
5950: 20 65 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d   exists $fileNam
5960: 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  e]} then {..    
5970: 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75        return tru
5980: 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  e..        }..  
5990: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
59a0: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
59b0: 42 75 69 6c 64 20 74 68 65 20 66 75 6c 6c 79 20  Build the fully 
59c0: 71 75 61 6c 69 66 69 65 64 20 66 69 6c 65 20 6e  qualified file n
59d0: 61 6d 65 20 66 6f 72 20 74 68 65 20 53 51 4c 69  ame for the SQLi
59e0: 74 65 20 63 6f 72 65 0d 0a 20 20 20 20 20 20 23  te core..      #
59f0: 20 20 20 20 20 20 20 6c 69 62 72 61 72 79 2e 20         library. 
5a00: 20 49 66 20 74 68 69 73 20 66 69 6c 65 20 65 78   If this file ex
5a10: 69 73 74 73 2c 20 77 65 20 73 68 6f 75 6c 64 20  ists, we should 
5a20: 68 61 76 65 20 65 76 65 72 79 74 68 69 6e 67 20  have everything 
5a30: 77 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  we..      #     
5a40: 20 20 6e 65 65 64 2e 0d 0a 20 20 20 20 20 20 23    need...      #
5a50: 0d 0a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20  ..      foreach 
5a60: 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 5b 67 65  fileNameOnly [ge
5a70: 74 4e 61 74 69 76 65 4c 69 62 72 61 72 79 46 69  tNativeLibraryFi
5a80: 6c 65 4e 61 6d 65 73 4f 6e 6c 79 5d 20 7b 0d 0a  leNamesOnly] {..
5a90: 20 20 20 20 20 20 20 20 73 65 74 20 66 69 6c 65          set file
5aa0: 4e 61 6d 65 20 5b 66 69 6c 65 20 6e 61 74 69 76  Name [file nativ
5ab0: 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e  ename [file join
5ac0: 20 24 64 69 72 65 63 74 6f 72 79 20 5c 0d 0a 20   $directory \.. 
5ad0: 20 20 20 20 20 20 20 20 20 20 20 24 61 72 63 68             $arch
5ae0: 69 74 65 63 74 75 72 65 20 24 66 69 6c 65 4e 61  itecture $fileNa
5af0: 6d 65 4f 6e 6c 79 5d 5d 0d 0a 0d 0a 20 20 20 20  meOnly]]....    
5b00: 20 20 20 20 69 66 20 7b 5b 66 69 6c 65 20 65 78      if {[file ex
5b10: 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d  ists $fileName]}
5b20: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
5b30: 20 20 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a     return true..
5b40: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
5b50: 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d       set fileNam
5b60: 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61  e [file nativena
5b70: 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 64  me [file join $d
5b80: 69 72 65 63 74 6f 72 79 20 5c 0d 0a 20 20 20 20  irectory \..    
5b90: 20 20 20 20 20 20 20 20 24 70 6c 61 74 66 6f 72          $platfor
5ba0: 6d 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 5d  m $fileNameOnly]
5bb0: 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20  ]....        if 
5bc0: 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 66  {[file exists $f
5bd0: 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b  ileName]} then {
5be0: 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ..          retu
5bf0: 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20 20  rn true..       
5c00: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65   }....        se
5c10: 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65  t fileName [file
5c20: 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c   nativename [fil
5c30: 65 20 6a 6f 69 6e 20 24 64 69 72 65 63 74 6f 72  e join $director
5c40: 79 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  y \..           
5c50: 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 5d 5d   $fileNameOnly]]
5c60: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b  ....        if {
5c70: 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 66 69  [file exists $fi
5c80: 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d  leName]} then {.
5c90: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
5ca0: 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20 20 20  n true..        
5cb0: 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  }..      }....  
5cc0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
5cd0: 4f 54 45 3a 20 4f 6e 65 20 6f 72 20 6d 6f 72 65  OTE: One or more
5ce0: 20 6e 61 74 69 76 65 20 63 6f 6d 70 6f 6e 65 6e   native componen
5cf0: 74 73 20 6e 65 65 64 65 64 20 62 79 20 53 79 73  ts needed by Sys
5d00: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 0d  tem.Data.SQLite.
5d10: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61  .      #       a
5d20: 72 65 20 6d 69 73 73 69 6e 67 2e 0d 0a 20 20 20  re missing...   
5d30: 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75     #..      retu
5d40: 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20 7d 0d  rn false..    }.
5d50: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 69 73 52  ....    proc isR
5d60: 65 6c 65 61 73 65 41 76 61 69 6c 61 62 6c 65 20  eleaseAvailable 
5d70: 7b 20 64 69 72 65 63 74 6f 72 79 20 7b 76 61 72  { directory {var
5d80: 4e 61 6d 65 20 22 22 7d 20 7d 20 7b 0d 0a 20 20  Name ""} } {..  
5d90: 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
5da0: 6c 65 6e 67 74 68 20 24 76 61 72 4e 61 6d 65 5d  length $varName]
5db0: 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
5dc0: 20 20 20 20 20 20 75 70 76 61 72 20 31 20 24 76        upvar 1 $v
5dd0: 61 72 4e 61 6d 65 20 24 76 61 72 4e 61 6d 65 0d  arName $varName.
5de0: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
5df0: 20 20 72 65 74 75 72 6e 20 5b 69 73 42 75 69 6c    return [isBuil
5e00: 64 41 76 61 69 6c 61 62 6c 65 20 22 22 20 24 64  dAvailable "" $d
5e10: 69 72 65 63 74 6f 72 79 20 24 76 61 72 4e 61 6d  irectory $varNam
5e20: 65 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  e]..    }.....  
5e30: 20 20 70 72 6f 63 20 6a 6f 69 6e 42 75 69 6c 64    proc joinBuild
5e40: 44 69 72 65 63 74 6f 72 79 20 7b 20 6e 61 74 69  Directory { nati
5e50: 76 65 20 70 61 74 68 20 79 65 61 72 20 70 6c 61  ve path year pla
5e60: 74 66 6f 72 6d 20 63 6f 6e 66 69 67 75 72 61 74  tform configurat
5e70: 69 6f 6e 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23  ion } {..      #
5e80: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
5e90: 46 69 67 75 72 65 20 6f 75 74 20 61 6e 64 20 74  Figure out and t
5ea0: 68 65 6e 20 72 65 74 75 72 6e 20 74 68 65 20 66  hen return the f
5eb0: 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 20 70  ully qualified p
5ec0: 61 74 68 20 74 6f 20 74 68 65 20 62 75 69 6c 64  ath to the build
5ed0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
5ee0: 64 69 72 65 63 74 6f 72 79 20 62 61 73 65 64 20  directory based 
5ef0: 6f 6e 20 61 6c 6c 20 74 68 65 20 61 72 67 75 6d  on all the argum
5f00: 65 6e 74 73 20 70 72 6f 76 69 64 65 64 20 62 79  ents provided by
5f10: 20 6f 75 72 20 63 61 6c 6c 65 72 2e 0d 0a 20 20   our caller...  
5f20: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
5f30: 7b 24 6e 61 74 69 76 65 7d 20 74 68 65 6e 20 7b  {$native} then {
5f40: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
5f50: 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 70 61 74   [file join $pat
5f60: 68 20 62 69 6e 20 24 79 65 61 72 20 24 70 6c 61  h bin $year $pla
5f70: 74 66 6f 72 6d 20 24 63 6f 6e 66 69 67 75 72 61  tform $configura
5f80: 74 69 6f 6e 5d 0d 0a 20 20 20 20 20 20 7d 20 65  tion]..      } e
5f90: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 72  lse {..        r
5fa0: 65 74 75 72 6e 20 5b 66 69 6c 65 20 6a 6f 69 6e  eturn [file join
5fb0: 20 24 70 61 74 68 20 62 69 6e 20 24 79 65 61 72   $path bin $year
5fc0: 20 24 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20   $configuration 
5fd0: 62 69 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  bin]..      }.. 
5fe0: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
5ff0: 63 20 67 65 74 42 75 69 6c 64 44 69 72 65 63 74  c getBuildDirect
6000: 6f 72 79 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20  ory {} {..      
6010: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
6020: 20 53 65 65 20 69 66 20 74 68 65 20 22 6e 61 74   See if the "nat
6030: 69 76 65 22 20 72 75 6e 74 69 6d 65 20 6f 70 74  ive" runtime opt
6040: 69 6f 6e 20 68 61 73 20 62 65 65 6e 20 73 65 74  ion has been set
6050: 2e 20 20 49 66 20 73 6f 2c 20 75 73 65 20 74 68  .  If so, use th
6060: 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
6070: 20 64 69 72 65 63 74 6f 72 79 20 66 6f 72 20 74   directory for t
6080: 68 65 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73  he mixed-mode as
6090: 73 65 6d 62 6c 79 20 28 61 2e 6b 2e 61 2e 20 74  sembly (a.k.a. t
60a0: 68 65 20 6e 61 74 69 76 65 20 69 6e 74 65 72 6f  he native intero
60b0: 70 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  p..      #      
60c0: 20 61 73 73 65 6d 62 6c 79 29 2e 20 20 54 6f 20   assembly).  To 
60d0: 65 6e 61 62 6c 65 20 74 68 69 73 20 6f 70 74 69  enable this opti
60e0: 6f 6e 20 76 69 61 20 74 68 65 20 63 6f 6d 6d 61  on via the comma
60f0: 6e 64 20 6c 69 6e 65 2c 20 65 6e 74 65 72 20 61  nd line, enter a
6100: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
6110: 63 6f 6d 6d 61 6e 64 20 73 69 6d 69 6c 61 72 20  command similar 
6120: 74 6f 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f  to one of the fo
6130: 6c 6c 6f 77 69 6e 67 20 28 61 6c 6c 20 6f 6e 20  llowing (all on 
6140: 6f 6e 65 20 6c 69 6e 65 29 3a 0d 0a 20 20 20 20  one line):..    
6150: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 20 20 20    #..      #    
6160: 20 20 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78     EagleShell.ex
6170: 65 20 2d 69 6e 69 74 69 61 6c 69 7a 65 20 2d 72  e -initialize -r
6180: 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 6e 61 74  untimeOption nat
6190: 69 76 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ive..      #    
61a0: 20 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70 61 74       -file .\pat
61b0: 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a  h\to\all.eagle..
61c0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
61d0: 20 20 20 20 20 20 20 54 6f 20 65 6e 61 62 6c 65         To enable
61e0: 20 74 68 69 73 20 6f 70 74 69 6f 6e 20 76 69 61   this option via
61f0: 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e   the command lin
6200: 65 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 22  e prior to the "
6210: 62 65 74 61 20 31 36 22 0d 0a 20 20 20 20 20 20  beta 16"..      
6220: 23 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 20  #       release 
6230: 6f 66 20 45 61 67 6c 65 2c 20 74 68 65 20 66 6f  of Eagle, the fo
6240: 6c 6c 6f 77 69 6e 67 20 63 6f 6d 6d 61 6e 64 20  llowing command 
6250: 6d 75 73 74 20 62 65 20 75 73 65 64 20 69 6e 73  must be used ins
6260: 74 65 61 64 0d 0a 20 20 20 20 20 20 23 20 20 20  tead..      #   
6270: 20 20 20 20 28 61 6c 73 6f 20 61 6c 6c 20 6f 6e      (also all on
6280: 20 6f 6e 65 20 6c 69 6e 65 29 3a 0d 0a 20 20 20   one line):..   
6290: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 20 20     #..      #   
62a0: 20 20 20 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65      EagleShell.e
62b0: 78 65 20 2d 69 6e 69 74 69 61 6c 69 7a 65 20 2d  xe -initialize -
62c0: 70 6f 73 74 49 6e 69 74 69 61 6c 69 7a 65 0d 0a  postInitialize..
62d0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20        #         
62e0: 22 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 49  "object invoke I
62f0: 6e 74 65 72 70 72 65 74 65 72 2e 47 65 74 41 63  nterpreter.GetAc
6300: 74 69 76 65 20 41 64 64 52 75 6e 74 69 6d 65 4f  tive AddRuntimeO
6310: 70 74 69 6f 6e 20 6e 61 74 69 76 65 22 0d 0a 20  ption native".. 
6320: 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20 2d       #         -
6330: 66 69 6c 65 20 2e 5c 70 61 74 68 5c 74 6f 5c 61  file .\path\to\a
6340: 6c 6c 2e 65 61 67 6c 65 0d 0a 20 20 20 20 20 20  ll.eagle..      
6350: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e  #..      if {[in
6360: 66 6f 20 65 78 69 73 74 73 20 3a 3a 62 75 69 6c  fo exists ::buil
6370: 64 5f 64 69 72 65 63 74 6f 72 79 5d 20 26 26 20  d_directory] && 
6380: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74  \..          [st
6390: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 62  ring length $::b
63a0: 75 69 6c 64 5f 64 69 72 65 63 74 6f 72 79 5d 20  uild_directory] 
63b0: 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
63c0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
63d0: 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c 6f 63 61  # NOTE: The loca
63e0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 62 75 69 6c  tion of the buil
63f0: 64 20 64 69 72 65 63 74 6f 72 79 20 68 61 73 20  d directory has 
6400: 62 65 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b  been overridden;
6410: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
6420: 20 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65    therefore, use
6430: 20 69 74 20 76 65 72 62 61 74 69 6d 2e 0d 0a 20   it verbatim... 
6440: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
6450: 20 20 72 65 74 75 72 6e 20 24 3a 3a 62 75 69 6c    return $::buil
6460: 64 5f 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20  d_directory..   
6470: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
6480: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
6490: 23 20 4e 4f 54 45 3a 20 49 66 20 74 68 65 20 22  # NOTE: If the "
64a0: 6e 61 74 69 76 65 22 20 72 75 6e 74 69 6d 65 20  native" runtime 
64b0: 6f 70 74 69 6f 6e 20 69 73 20 73 65 74 2c 20 74  option is set, t
64c0: 68 65 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73  he mixed-mode as
64d0: 73 65 6d 62 6c 79 0d 0a 20 20 20 20 20 20 20 20  sembly..        
64e0: 23 20 20 20 20 20 20 20 69 73 20 62 65 69 6e 67  #       is being
64f0: 20 74 65 73 74 65 64 2e 20 20 49 6e 20 74 68 61   tested.  In tha
6500: 74 20 63 61 73 65 2c 20 74 68 65 20 70 61 74 68  t case, the path
6510: 20 74 6f 20 74 68 65 20 62 75 69 6c 64 20 64 69   to the build di
6520: 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 20  rectory..       
6530: 20 23 20 20 20 20 20 20 20 77 69 6c 6c 20 63 6f   #       will co
6540: 6e 74 61 69 6e 20 74 68 65 20 70 6c 61 74 66 6f  ntain the platfo
6550: 72 6d 20 6e 61 6d 65 20 61 6e 64 20 61 6c 6c 20  rm name and all 
6560: 74 68 65 20 62 69 6e 61 72 69 65 73 20 75 6e 64  the binaries und
6570: 65 72 20 74 65 73 74 0d 0a 20 20 20 20 20 20 20  er test..       
6580: 20 23 20 20 20 20 20 20 20 73 68 6f 75 6c 64 20   #       should 
6590: 62 65 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68  be present in th
65a0: 61 74 20 64 69 72 65 63 74 6f 72 79 2e 20 20 49  at directory.  I
65b0: 66 20 74 68 65 20 22 6e 61 74 69 76 65 22 20 72  f the "native" r
65c0: 75 6e 74 69 6d 65 0d 0a 20 20 20 20 20 20 20 20  untime..        
65d0: 23 20 20 20 20 20 20 20 6f 70 74 69 6f 6e 20 69  #       option i
65e0: 73 20 6e 6f 74 20 73 65 74 2c 20 74 68 65 20 62  s not set, the b
65f0: 75 69 6c 64 20 64 69 72 65 63 74 6f 72 79 20 77  uild directory w
6600: 69 6c 6c 20 62 65 20 63 6f 6e 73 69 64 65 72 65  ill be considere
6610: 64 20 74 6f 20 62 65 0d 0a 20 20 20 20 20 20 20  d to be..       
6620: 20 23 20 20 20 20 20 20 20 22 70 6c 61 74 66 6f   #       "platfo
6630: 72 6d 2d 6e 65 75 74 72 61 6c 22 2c 20 77 69 74  rm-neutral", wit
6640: 68 20 74 68 65 20 6e 6f 74 61 62 6c 65 20 65 78  h the notable ex
6650: 63 65 70 74 69 6f 6e 20 6f 66 20 61 6e 79 20 6e  ception of any n
6660: 61 74 69 76 65 0d 0a 20 20 20 20 20 20 20 20 23  ative..        #
6670: 20 20 20 20 20 20 20 61 73 73 65 6d 62 6c 79 20         assembly 
6680: 28 65 2e 67 2e 20 22 53 51 4c 69 74 65 2e 49 6e  (e.g. "SQLite.In
6690: 74 65 72 6f 70 2e 64 6c 6c 22 29 20 63 6f 70 69  terop.dll") copi
66a0: 65 64 20 74 68 65 72 65 20 64 75 72 69 6e 67 20  ed there during 
66b0: 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  the..        #  
66c0: 20 20 20 20 20 62 75 69 6c 64 20 70 72 6f 63 65       build proce
66d0: 73 73 20 69 74 73 65 6c 66 2e 20 20 49 66 20 74  ss itself.  If t
66e0: 68 65 20 62 75 69 6c 64 20 70 72 6f 63 65 73 73  he build process
66f0: 20 73 6f 6d 65 68 6f 77 20 64 6f 65 73 20 6e 6f   somehow does no
6700: 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  t..        #    
6710: 20 20 20 63 6f 70 79 20 74 68 65 20 6e 61 74 69     copy the nati
6720: 76 65 20 61 73 73 65 6d 62 6c 79 20 66 6f 72 20  ve assembly for 
6730: 74 68 69 73 20 70 6c 61 74 66 6f 72 6d 2c 20 6d  this platform, m
6740: 6f 73 74 20 6f 66 20 74 68 65 20 74 65 73 74 73  ost of the tests
6750: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
6760: 20 20 69 6e 20 74 68 65 20 73 75 69 74 65 20 77    in the suite w
6770: 69 6c 6c 20 73 69 6d 70 6c 79 20 62 65 20 73 6b  ill simply be sk
6780: 69 70 70 65 64 2e 20 20 47 65 6e 65 72 61 6c 6c  ipped.  Generall
6790: 79 20 73 70 65 61 6b 69 6e 67 2c 20 74 68 65 72  y speaking, ther
67a0: 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
67b0: 20 20 20 61 72 65 20 74 77 6f 20 77 61 79 73 20     are two ways 
67c0: 74 6f 20 62 75 69 6c 64 20 74 68 65 20 62 69 6e  to build the bin
67d0: 61 72 69 65 73 20 77 68 65 6e 20 70 72 65 70 61  aries when prepa
67e0: 72 69 6e 67 20 74 6f 20 72 75 6e 20 74 68 65 0d  ring to run the.
67f0: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
6800: 20 74 65 73 74 20 73 75 69 74 65 3a 0d 0a 20 20   test suite:..  
6810: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
6820: 20 23 20 20 20 20 20 20 20 31 2e 20 42 75 69 6c   #       1. Buil
6830: 64 20 74 68 65 20 73 65 70 61 72 61 74 65 20 6d  d the separate m
6840: 61 6e 61 67 65 64 20 61 6e 64 20 6e 61 74 69 76  anaged and nativ
6850: 65 20 61 73 73 65 6d 62 6c 69 65 73 20 75 73 69  e assemblies usi
6860: 6e 67 20 73 6f 6d 65 0d 0a 20 20 20 20 20 20 20  ng some..       
6870: 20 23 20 20 20 20 20 20 20 20 20 20 63 6f 6d 6d   #          comm
6880: 61 6e 64 73 20 73 69 6d 69 6c 61 72 20 74 6f 3a  ands similar to:
6890: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
68a0: 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20 20       #          
68b0: 62 75 69 6c 64 2e 62 61 74 20 24 7b 43 6f 6e 66  build.bat ${Conf
68c0: 69 67 75 72 61 74 69 6f 6e 7d 4d 61 6e 61 67 65  iguration}Manage
68d0: 64 4f 6e 6c 79 20 24 7b 50 6c 61 74 66 6f 72 6d  dOnly ${Platform
68e0: 7d 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  }..        #    
68f0: 20 20 20 20 20 20 62 75 69 6c 64 2e 62 61 74 20        build.bat 
6900: 24 7b 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 7d  ${Configuration}
6910: 4e 61 74 69 76 65 4f 6e 6c 79 20 24 7b 50 6c 61  NativeOnly ${Pla
6920: 74 66 6f 72 6d 7d 0d 0a 20 20 20 20 20 20 20 20  tform}..        
6930: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  #..        #    
6940: 20 20 20 20 20 20 57 68 65 72 65 20 24 7b 43 6f        Where ${Co
6950: 6e 66 69 67 75 72 61 74 69 6f 6e 7d 20 69 73 20  nfiguration} is 
6960: 65 69 74 68 65 72 20 22 44 65 62 75 67 22 20 6f  either "Debug" o
6970: 72 20 22 52 65 6c 65 61 73 65 22 20 61 6e 64 0d  r "Release" and.
6980: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
6990: 20 20 20 20 24 7b 50 6c 61 74 66 6f 72 6d 7d 20      ${Platform} 
69a0: 69 73 20 65 69 74 68 65 72 20 22 57 69 6e 33 32  is either "Win32
69b0: 22 20 6f 72 20 22 78 36 34 22 2e 0d 0a 20 20 20  " or "x64"...   
69c0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
69d0: 23 20 20 20 20 20 20 20 32 2e 20 42 75 69 6c 64  #       2. Build
69e0: 20 74 68 65 20 6d 69 78 65 64 2d 6d 6f 64 65 20   the mixed-mode 
69f0: 61 73 73 65 6d 62 6c 79 20 75 73 69 6e 67 20 61  assembly using a
6a00: 20 63 6f 6d 6d 61 6e 64 20 73 69 6d 69 6c 61 72   command similar
6a10: 20 74 6f 3a 0d 0a 20 20 20 20 20 20 20 20 23 0d   to:..        #.
6a20: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
6a30: 20 20 20 20 62 75 69 6c 64 2e 62 61 74 20 24 7b      build.bat ${
6a40: 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 7d 20 24  Configuration} $
6a50: 7b 50 6c 61 74 66 6f 72 6d 7d 0d 0a 20 20 20 20  {Platform}..    
6a60: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
6a70: 20 20 20 20 20 20 20 20 20 20 57 68 65 72 65 20            Where 
6a80: 24 7b 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 7d  ${Configuration}
6a90: 20 69 73 20 65 69 74 68 65 72 20 22 44 65 62 75   is either "Debu
6aa0: 67 22 20 6f 72 20 22 52 65 6c 65 61 73 65 22 20  g" or "Release" 
6ab0: 61 6e 64 0d 0a 20 20 20 20 20 20 20 20 23 20 20  and..        #  
6ac0: 20 20 20 20 20 20 20 20 24 7b 50 6c 61 74 66 6f          ${Platfo
6ad0: 72 6d 7d 20 69 73 20 65 69 74 68 65 72 20 22 57  rm} is either "W
6ae0: 69 6e 33 32 22 20 6f 72 20 22 78 36 34 22 2e 20  in32" or "x64". 
6af0: 20 49 66 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64   If this command
6b00: 20 69 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20   is..        #  
6b10: 20 20 20 20 20 20 20 20 75 73 65 64 2c 20 76 61          used, va
6b20: 72 69 6f 75 73 20 74 65 73 74 73 20 74 68 61 74  rious tests that
6b30: 20 72 65 71 75 69 72 65 20 73 75 70 70 6c 65 6d   require supplem
6b40: 65 6e 74 61 72 79 20 6d 61 6e 61 67 65 64 0d 0a  entary managed..
6b50: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
6b60: 20 20 20 61 73 73 65 6d 62 6c 69 65 73 20 28 65     assemblies (e
6b70: 2e 67 2e 20 4c 49 4e 51 29 20 6d 61 79 20 62 65  .g. LINQ) may be
6b80: 20 73 6b 69 70 70 65 64 20 75 6e 6c 65 73 73 20   skipped unless 
6b90: 74 68 6f 73 65 20 62 69 6e 61 72 69 65 73 0d 0a  those binaries..
6ba0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
6bb0: 20 20 20 61 72 65 20 73 75 62 73 65 71 75 65 6e     are subsequen
6bc0: 74 6c 79 20 63 6f 70 69 65 64 20 69 6e 74 6f 20  tly copied into 
6bd0: 74 68 65 20 63 6f 72 72 65 63 74 20 64 69 72 65  the correct dire
6be0: 63 74 6f 72 79 20 28 69 2e 65 2e 20 62 79 0d 0a  ctory (i.e. by..
6bf0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
6c00: 20 20 20 22 74 65 73 74 5f 61 6c 6c 2e 62 61 74     "test_all.bat
6c10: 22 29 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ")...        #..
6c20: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
6c30: 4e 6f 74 65 20 74 68 61 74 20 61 6c 6c 20 6f 66  Note that all of
6c40: 20 74 68 65 20 62 75 69 6c 64 20 63 6f 6d 6d 61   the build comma
6c50: 6e 64 73 20 61 62 6f 76 65 20 77 69 6c 6c 20 64  nds above will d
6c60: 65 66 61 75 6c 74 20 74 6f 20 75 73 69 6e 67 0d  efault to using.
6c70: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
6c80: 20 74 68 65 20 6c 61 74 65 73 74 20 76 65 72 73   the latest vers
6c90: 69 6f 6e 20 6f 66 20 4d 53 42 75 69 6c 64 20 61  ion of MSBuild a
6ca0: 76 61 69 6c 61 62 6c 65 20 61 6e 64 20 74 68 65  vailable and the
6cb0: 20 22 74 65 73 74 5f 79 65 61 72 22 20 6d 61 79   "test_year" may
6cc0: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
6cd0: 20 20 6e 65 65 64 20 74 6f 20 62 65 20 61 64 6a    need to be adj
6ce0: 75 73 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c  usted accordingl
6cf0: 79 20 74 6f 20 61 63 74 75 61 6c 6c 79 20 72 75  y to actually ru
6d00: 6e 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65  n the test suite
6d10: 2e 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  ...        #    
6d20: 20 20 20 52 65 66 65 72 20 74 6f 20 74 68 65 20     Refer to the 
6d30: 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 5b 67 65 74  comments in [get
6d40: 42 75 69 6c 64 59 65 61 72 5d 20 66 6f 72 20 6d  BuildYear] for m
6d50: 6f 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ore information 
6d60: 6f 6e 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  on..        #   
6d70: 20 20 20 20 68 6f 77 20 74 6f 20 73 65 74 20 74      how to set t
6d80: 68 69 73 20 76 61 72 69 61 62 6c 65 2e 0d 0a 20  his variable... 
6d90: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
6da0: 20 20 73 65 74 20 6e 61 74 69 76 65 20 5b 68 61    set native [ha
6db0: 73 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 6e  sRuntimeOption n
6dc0: 61 74 69 76 65 5d 0d 0a 0d 0a 20 20 20 20 20 20  ative]....      
6dd0: 20 20 72 65 74 75 72 6e 20 5b 6a 6f 69 6e 42 75    return [joinBu
6de0: 69 6c 64 44 69 72 65 63 74 6f 72 79 20 24 6e 61  ildDirectory $na
6df0: 74 69 76 65 20 5b 67 65 74 42 75 69 6c 64 42 61  tive [getBuildBa
6e00: 73 65 44 69 72 65 63 74 6f 72 79 5d 20 5c 0d 0a  seDirectory] \..
6e10: 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74              [get
6e20: 42 75 69 6c 64 59 65 61 72 5d 20 5b 67 65 74 42  BuildYear] [getB
6e30: 75 69 6c 64 50 6c 61 74 66 6f 72 6d 20 24 6e 61  uildPlatform $na
6e40: 74 69 76 65 5d 20 5b 67 65 74 42 75 69 6c 64 43  tive] [getBuildC
6e50: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 5d 5d 0d 0a  onfiguration]]..
6e60: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
6e70: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 52  ...    proc getR
6e80: 65 6c 65 61 73 65 56 65 72 73 69 6f 6e 20 7b 7d  eleaseVersion {}
6e90: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
6ea0: 20 20 20 23 20 4e 4f 54 45 3a 20 46 69 67 75 72     # NOTE: Figur
6eb0: 65 20 6f 75 74 20 74 68 65 20 72 65 6c 65 61 73  e out the releas
6ec0: 65 20 76 65 72 73 69 6f 6e 20 66 6f 72 20 75 73  e version for us
6ed0: 65 20 77 69 74 68 20 74 68 65 20 62 75 69 6c 64  e with the build
6ee0: 20 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20   directory..    
6ef0: 20 20 23 20 20 20 20 20 20 20 77 68 65 6e 20 63    #       when c
6f00: 68 65 63 6b 69 6e 67 20 66 6f 72 20 61 76 61 69  hecking for avai
6f10: 6c 61 62 6c 65 20 72 65 6c 65 61 73 65 73 2e 0d  lable releases..
6f20: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
6f30: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
6f40: 20 3a 3a 72 65 6c 65 61 73 65 5f 76 65 72 73 69   ::release_versi
6f50: 6f 6e 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  on] && \..      
6f60: 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67      [string leng
6f70: 74 68 20 24 3a 3a 72 65 6c 65 61 73 65 5f 76 65  th $::release_ve
6f80: 72 73 69 6f 6e 5d 20 3e 20 30 7d 20 74 68 65 6e  rsion] > 0} then
6f90: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
6fa0: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54         # NOTE: T
6fb0: 68 65 20 72 65 6c 65 61 73 65 20 76 65 72 73 69  he release versi
6fc0: 6f 6e 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72  on has been over
6fd0: 72 69 64 64 65 6e 3b 20 74 68 65 72 65 66 6f 72  ridden; therefor
6fe0: 65 2c 20 75 73 65 20 69 74 0d 0a 20 20 20 20 20  e, use it..     
6ff0: 20 20 20 23 20 20 20 20 20 20 20 76 65 72 62 61     #       verba
7000: 74 69 6d 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  tim...        #.
7010: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
7020: 24 3a 3a 72 65 6c 65 61 73 65 5f 76 65 72 73 69  $::release_versi
7030: 6f 6e 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  on..      } else
7040: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
7050: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e         # NOTE: N
7060: 6f 20 72 65 6c 65 61 73 65 20 76 65 72 73 69 6f  o release versio
7070: 6e 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20  n is available, 
7080: 72 65 74 75 72 6e 20 61 6e 20 65 6d 70 74 79 20  return an empty 
7090: 73 74 72 69 6e 67 2e 0d 0a 20 20 20 20 20 20 20  string...       
70a0: 20 23 20 20 20 20 20 20 20 49 74 20 69 73 20 69   #       It is i
70b0: 6d 70 6f 72 74 61 6e 74 20 74 6f 20 72 65 74 75  mportant to retu
70c0: 72 6e 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69  rn an empty stri
70d0: 6e 67 20 68 65 72 65 20 62 65 63 61 75 73 65 20  ng here because 
70e0: 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  the..        #  
70f0: 20 20 20 20 20 72 65 73 75 6c 74 20 6f 66 20 74       result of t
7100: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 6d 61  his procedure ma
7110: 79 20 62 65 20 75 73 65 64 20 77 69 74 68 20 5b  y be used with [
7120: 66 69 6c 65 20 6a 6f 69 6e 5d 2e 0d 0a 20 20 20  file join]...   
7130: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
7140: 72 65 74 75 72 6e 20 22 22 0d 0a 20 20 20 20 20  return ""..     
7150: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
7160: 20 20 70 72 6f 63 20 67 65 74 42 75 69 6c 64 46    proc getBuildF
7170: 69 6c 65 4e 61 6d 65 20 7b 20 66 69 6c 65 4e 61  ileName { fileNa
7180: 6d 65 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d  me {platform ""}
7190: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20   } {..      #.. 
71a0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 74       # NOTE: Ret
71b0: 75 72 6e 73 20 74 68 65 20 73 70 65 63 69 66 69  urns the specifi
71c0: 65 64 20 66 69 6c 65 20 6e 61 6d 65 20 61 73 20  ed file name as 
71d0: 69 66 20 69 74 20 77 65 72 65 20 6c 6f 63 61 74  if it were locat
71e0: 65 64 20 69 6e 20 74 68 65 0d 0a 20 20 20 20 20  ed in the..     
71f0: 20 23 20 20 20 20 20 20 20 62 75 69 6c 64 20 64   #       build d
7200: 69 72 65 63 74 6f 72 79 2c 20 64 69 73 63 61 72  irectory, discar
7210: 64 69 6e 67 20 61 6e 79 20 64 69 72 65 63 74 6f  ding any directo
7220: 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 70  ry information p
7230: 72 65 73 65 6e 74 0d 0a 20 20 20 20 20 20 23 20  resent..      # 
7240: 20 20 20 20 20 20 69 6e 20 74 68 65 20 66 69 6c        in the fil
7250: 65 20 6e 61 6d 65 20 61 73 20 70 72 6f 76 69 64  e name as provid
7260: 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72  ed by our caller
7270: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
7280: 20 20 73 65 74 20 72 65 73 75 6c 74 20 5b 66 69    set result [fi
7290: 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5c 0d  le nativename \.
72a0: 0a 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65  .          [file
72b0: 20 6a 6f 69 6e 20 5b 67 65 74 42 75 69 6c 64 44   join [getBuildD
72c0: 69 72 65 63 74 6f 72 79 5d 20 24 70 6c 61 74 66  irectory] $platf
72d0: 6f 72 6d 20 5b 66 69 6c 65 20 74 61 69 6c 20 24  orm [file tail $
72e0: 66 69 6c 65 4e 61 6d 65 5d 5d 5d 0d 0a 0d 0a 20  fileName]]].... 
72f0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
7300: 48 41 43 4b 3a 20 57 68 65 6e 20 72 75 6e 6e 69  HACK: When runni
7310: 6e 67 20 6f 6e 20 57 6f 57 36 34 2c 20 61 73 73  ng on WoW64, ass
7320: 75 6d 65 20 74 68 65 20 74 65 73 74 20 65 78 65  ume the test exe
7330: 63 75 74 61 62 6c 65 73 20 61 72 65 20 70 72 65  cutables are pre
7340: 73 65 6e 74 0d 0a 20 20 20 20 20 20 23 20 20 20  sent..      #   
7350: 20 20 20 20 77 69 74 68 20 74 68 65 20 22 33 32      with the "32
7360: 22 20 73 75 66 66 69 78 20 6f 6e 20 74 68 65 6d  " suffix on them
7370: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
7380: 20 20 69 66 20 7b 5b 69 73 52 75 6e 6e 69 6e 67    if {[isRunning
7390: 57 6f 57 36 34 5d 20 26 26 20 5b 66 69 6c 65 20  WoW64] && [file 
73a0: 65 78 74 65 6e 73 69 6f 6e 20 24 72 65 73 75 6c  extension $resul
73b0: 74 5d 20 65 71 20 22 2e 65 78 65 22 7d 20 74 68  t] eq ".exe"} th
73c0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65  en {..        se
73d0: 74 20 72 65 73 75 6c 74 20 5b 61 70 70 65 6e 64  t result [append
73e0: 41 72 67 73 20 5b 66 69 6c 65 20 72 6f 6f 74 6e  Args [file rootn
73f0: 61 6d 65 20 24 72 65 73 75 6c 74 5d 20 33 32 2e  ame $result] 32.
7400: 65 78 65 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  exe]..      }...
7410: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 72  .      return $r
7420: 65 73 75 6c 74 0d 0a 20 20 20 20 7d 0d 0a 0c 0d  esult..    }....
7430: 0a 20 20 20 20 70 72 6f 63 20 67 65 74 45 78 74  .    proc getExt
7440: 65 72 6e 61 6c 44 69 72 65 63 74 6f 72 79 20 7b  ernalDirectory {
7450: 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
7460: 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73      # NOTE: This
7470: 20 70 72 6f 63 65 64 75 72 65 20 72 65 74 75 72   procedure retur
7480: 6e 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  ns the directory
7490: 20 77 68 65 72 65 20 74 68 65 20 65 78 74 65 72   where the exter
74a0: 6e 61 6c 20 62 69 6e 61 72 79 0d 0a 20 20 20 20  nal binary..    
74b0: 20 20 23 20 20 20 20 20 20 20 66 69 6c 65 73 20    #       files 
74c0: 61 72 65 20 6c 6f 63 61 74 65 64 2e 0d 0a 20 20  are located...  
74d0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74      #..      ret
74e0: 75 72 6e 20 5b 66 69 6c 65 20 6e 61 74 69 76 65  urn [file native
74f0: 6e 61 6d 65 20 5b 66 69 6c 65 20 64 69 72 6e 61  name [file dirna
7500: 6d 65 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65  me [file dirname
7510: 20 5b 69 6e 66 6f 20 62 69 6e 61 72 79 5d 5d 5d   [info binary]]]
7520: 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  ]..    }.....   
7530: 20 70 72 6f 63 20 67 65 74 42 69 6e 61 72 79 44   proc getBinaryD
7540: 69 72 65 63 74 6f 72 79 20 7b 7d 20 7b 0d 0a 20  irectory {} {.. 
7550: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
7560: 4e 4f 54 45 3a 20 54 68 69 73 20 70 72 6f 63 65  NOTE: This proce
7570: 64 75 72 65 20 72 65 74 75 72 6e 73 20 74 68 65  dure returns the
7580: 20 64 69 72 65 63 74 6f 72 79 20 77 68 65 72 65   directory where
7590: 20 74 68 65 20 74 65 73 74 20 61 70 70 6c 69 63   the test applic
75a0: 61 74 69 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20  ation..      #  
75b0: 20 20 20 20 20 69 74 73 65 6c 66 20 28 69 2e 65       itself (i.e
75c0: 2e 20 74 68 65 20 45 61 67 6c 65 20 73 68 65 6c  . the Eagle shel
75d0: 6c 29 20 69 73 20 6c 6f 63 61 74 65 64 2e 20 20  l) is located.  
75e0: 54 68 69 73 20 77 69 6c 6c 20 62 65 20 75 73 65  This will be use
75f0: 64 20 61 73 0d 0a 20 20 20 20 20 20 23 20 20 20  d as..      #   
7600: 20 20 20 20 74 68 65 20 64 65 73 74 69 6e 61 74      the destinat
7610: 69 6f 6e 20 66 6f 72 20 74 68 65 20 63 6f 70 69  ion for the copi
7620: 65 64 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  ed System.Data.S
7630: 51 4c 69 74 65 20 6e 61 74 69 76 65 20 61 6e 64  QLite native and
7640: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
7650: 6d 61 6e 61 67 65 64 20 61 73 73 65 6d 62 6c 69  managed assembli
7660: 65 73 20 28 69 2e 65 2e 20 62 65 63 61 75 73 65  es (i.e. because
7670: 20 74 68 69 73 20 69 73 20 6f 6e 65 20 6f 66 20   this is one of 
7680: 74 68 65 20 66 65 77 20 70 6c 61 63 65 73 0d 0a  the few places..
7690: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 77 68        #       wh
76a0: 65 72 65 20 74 68 65 20 43 4c 52 20 77 69 6c 6c  ere the CLR will
76b0: 20 61 63 74 75 61 6c 6c 79 20 66 69 6e 64 20 61   actually find a
76c0: 6e 64 20 6c 6f 61 64 20 74 68 65 6d 20 70 72 6f  nd load them pro
76d0: 70 65 72 6c 79 29 2e 0d 0a 20 20 20 20 20 20 23  perly)...      #
76e0: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66  ..      if {[inf
76f0: 6f 20 65 78 69 73 74 73 20 3a 3a 62 69 6e 61 72  o exists ::binar
7700: 79 5f 64 69 72 65 63 74 6f 72 79 5d 20 26 26 20  y_directory] && 
7710: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74  \..          [st
7720: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 62  ring length $::b
7730: 69 6e 61 72 79 5f 64 69 72 65 63 74 6f 72 79 5d  inary_directory]
7740: 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
7750: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
7760: 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c 6f 63   # NOTE: The loc
7770: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 62 69 6e  ation of the bin
7780: 61 72 79 20 64 69 72 65 63 74 6f 72 79 20 68 61  ary directory ha
7790: 73 20 62 65 65 6e 20 6f 76 65 72 72 69 64 64 65  s been overridde
77a0: 6e 3b 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  n;..        #   
77b0: 20 20 20 20 74 68 65 72 65 66 6f 72 65 2c 20 75      therefore, u
77c0: 73 65 20 69 74 20 76 65 72 62 61 74 69 6d 2e 0d  se it verbatim..
77d0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
77e0: 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 62 69      return $::bi
77f0: 6e 61 72 79 5f 64 69 72 65 63 74 6f 72 79 0d 0a  nary_directory..
7800: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
7810: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b          return [
7820: 69 6e 66 6f 20 62 69 6e 61 72 79 5d 0d 0a 20 20  info binary]..  
7830: 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
7840: 0a 20 20 20 20 70 72 6f 63 20 67 65 74 45 78 74  .    proc getExt
7850: 65 72 6e 61 6c 46 69 6c 65 4e 61 6d 65 20 7b 20  ernalFileName { 
7860: 66 69 6c 65 4e 61 6d 65 20 7d 20 7b 0d 0a 20 20  fileName } {..  
7870: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
7880: 4f 54 45 3a 20 52 65 74 75 72 6e 73 20 74 68 65  OTE: Returns the
7890: 20 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 20   specified file 
78a0: 6e 61 6d 65 20 61 73 20 69 66 20 69 74 20 77 65  name as if it we
78b0: 72 65 20 6c 6f 63 61 74 65 64 20 69 6e 20 74 68  re located in th
78c0: 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
78d0: 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 74 61   directory conta
78e0: 69 6e 69 6e 67 20 74 68 65 20 65 78 74 65 72 6e  ining the extern
78f0: 61 6c 20 62 69 6e 61 72 69 65 73 2e 0d 0a 20 20  al binaries...  
7900: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74      #..      ret
7910: 75 72 6e 20 5b 66 69 6c 65 20 6e 61 74 69 76 65  urn [file native
7920: 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20  name [file join 
7930: 5b 67 65 74 45 78 74 65 72 6e 61 6c 44 69 72 65  [getExternalDire
7940: 63 74 6f 72 79 5d 20 24 66 69 6c 65 4e 61 6d 65  ctory] $fileName
7950: 5d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  ]]..    }.....  
7960: 20 20 70 72 6f 63 20 67 65 74 42 69 6e 61 72 79    proc getBinary
7970: 46 69 6c 65 4e 61 6d 65 20 7b 20 66 69 6c 65 4e  FileName { fileN
7980: 61 6d 65 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22  ame {platform ""
7990: 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a  } } {..      #..
79a0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65        # NOTE: Re
79b0: 74 75 72 6e 73 20 74 68 65 20 73 70 65 63 69 66  turns the specif
79c0: 69 65 64 20 66 69 6c 65 20 6e 61 6d 65 20 61 73  ied file name as
79d0: 20 69 66 20 69 74 20 77 65 72 65 20 6c 6f 63 61   if it were loca
79e0: 74 65 64 20 69 6e 20 74 68 65 0d 0a 20 20 20 20  ted in the..    
79f0: 20 20 23 20 20 20 20 20 20 20 62 69 6e 61 72 79    #       binary
7a00: 20 64 69 72 65 63 74 6f 72 79 2c 20 64 69 73 63   directory, disc
7a10: 61 72 64 69 6e 67 20 61 6e 79 20 64 69 72 65 63  arding any direc
7a20: 74 6f 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  tory information
7a30: 20 70 72 65 73 65 6e 74 0d 0a 20 20 20 20 20 20   present..      
7a40: 23 20 20 20 20 20 20 20 69 6e 20 74 68 65 20 66  #       in the f
7a50: 69 6c 65 20 6e 61 6d 65 20 61 73 20 70 72 6f 76  ile name as prov
7a60: 69 64 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c  ided by our call
7a70: 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  er...      #..  
7a80: 20 20 20 20 72 65 74 75 72 6e 20 5b 66 69 6c 65      return [file
7a90: 20 6e 61 74 69 76 65 6e 61 6d 65 20 5c 0d 0a 20   nativename \.. 
7aa0: 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 6a           [file j
7ab0: 6f 69 6e 20 5b 67 65 74 42 69 6e 61 72 79 44 69  oin [getBinaryDi
7ac0: 72 65 63 74 6f 72 79 5d 20 24 70 6c 61 74 66 6f  rectory] $platfo
7ad0: 72 6d 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66  rm [file tail $f
7ae0: 69 6c 65 4e 61 6d 65 5d 5d 5d 0d 0a 20 20 20 20  ileName]]]..    
7af0: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67  }.....    proc g
7b00: 65 74 43 6f 72 65 42 69 6e 61 72 79 46 69 6c 65  etCoreBinaryFile
7b10: 4e 61 6d 65 20 7b 20 7b 70 6c 61 74 66 6f 72 6d  Name { {platform
7b20: 20 22 22 7d 20 7b 73 74 61 6e 64 61 72 64 20 22   ""} {standard "
7b30: 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  "} } {..      #.
7b40: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52  .      # NOTE: R
7b50: 65 74 75 72 6e 73 20 74 68 65 20 66 75 6c 6c 20  eturns the full 
7b60: 70 61 74 68 20 66 6f 72 20 74 68 65 20 66 69 6c  path for the fil
7b70: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
7b80: 20 53 51 4c 69 74 65 20 63 6f 72 65 0d 0a 20 20   SQLite core..  
7b90: 20 20 20 20 23 20 20 20 20 20 20 20 6e 61 74 69      #       nati
7ba0: 76 65 20 6c 69 62 72 61 72 79 20 63 6f 64 65 20  ve library code 
7bb0: 66 6f 72 20 74 68 69 73 20 70 6c 61 74 66 6f 72  for this platfor
7bc0: 6d 2e 20 20 46 69 72 73 74 2c 20 63 68 65 63 6b  m.  First, check
7bd0: 20 61 6e 64 20 73 65 65 20 69 66 0d 0a 20 20 20   and see if..   
7be0: 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20 53     #       the S
7bf0: 51 4c 69 74 65 20 63 6f 72 65 20 6e 61 74 69 76  QLite core nativ
7c00: 65 20 6c 69 62 72 61 72 79 20 68 61 73 20 61 6c  e library has al
7c10: 72 65 61 64 79 20 62 65 65 6e 20 6c 6f 61 64 65  ready been loade
7c20: 64 2e 20 20 4e 65 78 74 2c 0d 0a 20 20 20 20 20  d.  Next,..     
7c30: 20 23 20 20 20 20 20 20 20 66 61 6c 6c 62 61 63   #       fallbac
7c40: 6b 20 74 6f 20 77 68 61 74 20 74 68 65 20 66 75  k to what the fu
7c50: 6c 6c 20 70 61 74 68 20 73 68 6f 75 6c 64 20 62  ll path should b
7c60: 65 2c 20 62 61 73 65 64 20 6f 6e 20 77 68 65 74  e, based on whet
7c70: 68 65 72 20 74 68 65 0d 0a 20 20 20 20 20 20 23  her the..      #
7c80: 20 20 20 20 20 20 20 6d 69 78 65 64 2d 6d 6f 64         mixed-mod
7c90: 65 20 61 73 73 65 6d 62 6c 79 20 69 73 20 62 65  e assembly is be
7ca0: 69 6e 67 20 75 73 65 64 20 61 6e 64 20 74 68 65  ing used and the
7cb0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 63 75 72   name of the cur
7cc0: 72 65 6e 74 0d 0a 20 20 20 20 20 20 23 20 20 20  rent..      #   
7cd0: 20 20 20 20 70 6c 61 74 66 6f 72 6d 2e 0d 0a 20      platform... 
7ce0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
7cf0: 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
7d00: 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b      object invok
7d10: 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62  e -flags +NonPub
7d20: 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  lic \..         
7d30: 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53     System.Data.S
7d40: 51 4c 69 74 65 2e 55 6e 73 61 66 65 4e 61 74 69  QLite.UnsafeNati
7d50: 76 65 4d 65 74 68 6f 64 73 20 5f 53 51 4c 69 74  veMethods _SQLit
7d60: 65 4e 61 74 69 76 65 4d 6f 64 75 6c 65 46 69 6c  eNativeModuleFil
7d70: 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 7d 20 66  eName..      } f
7d80: 69 6c 65 4e 61 6d 65 5d 20 3d 3d 20 30 20 26 26  ileName] == 0 &&
7d90: 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20   [string length 
7da0: 24 66 69 6c 65 4e 61 6d 65 5d 20 3e 20 30 7d 20  $fileName] > 0} 
7db0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
7dc0: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
7dd0: 45 3a 20 54 68 65 20 53 51 4c 69 74 65 20 63 6f  E: The SQLite co
7de0: 72 65 20 6e 61 74 69 76 65 20 6c 69 62 72 61 72  re native librar
7df0: 79 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  y has already be
7e00: 65 6e 20 6c 6f 61 64 65 64 20 76 69 61 0d 0a 20  en loaded via.. 
7e10: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74         #       t
7e20: 68 65 20 6e 61 74 69 76 65 20 6c 69 62 72 61 72  he native librar
7e30: 79 20 70 72 65 2d 6c 6f 61 64 65 72 2e 20 20 52  y pre-loader.  R
7e40: 65 74 75 72 6e 20 74 68 61 74 20 66 69 6c 65 20  eturn that file 
7e50: 6e 61 6d 65 20 6e 6f 77 2e 0d 0a 20 20 20 20 20  name now...     
7e60: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65     #..        re
7e70: 74 75 72 6e 20 24 66 69 6c 65 4e 61 6d 65 0d 0a  turn $fileName..
7e80: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
7e90: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
7ea0: 3a 20 49 66 20 74 68 65 20 22 6e 61 74 69 76 65  : If the "native
7eb0: 22 20 72 75 6e 74 69 6d 65 20 6f 70 74 69 6f 6e  " runtime option
7ec0: 20 68 61 73 20 62 65 65 6e 20 73 65 74 2c 20 61   has been set, a
7ed0: 6c 77 61 79 73 20 72 65 74 75 72 6e 20 74 68 65  lways return the
7ee0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
7ef0: 66 69 6c 65 20 6e 61 6d 65 20 66 6f 72 20 74 68  file name for th
7f00: 65 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73  e mixed-mode ass
7f10: 65 6d 62 6c 79 2e 0d 0a 20 20 20 20 20 20 23 0d  embly...      #.
7f20: 0a 20 20 20 20 20 20 69 66 20 7b 5b 68 61 73 52  .      if {[hasR
7f30: 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 6e 61 74  untimeOption nat
7f40: 69 76 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ive]} then {..  
7f50: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
7f60: 20 23 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e 20   # NOTE: Return 
7f70: 74 68 65 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61  the mixed-mode a
7f80: 73 73 65 6d 62 6c 79 20 66 69 6c 65 20 6e 61 6d  ssembly file nam
7f90: 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  e...        #.. 
7fa0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 66         return [f
7fb0: 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5c  ile nativename \
7fc0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 66  ..            [f
7fd0: 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 42 69 6e  ile join [getBin
7fe0: 61 72 79 44 69 72 65 63 74 6f 72 79 5d 20 24 70  aryDirectory] $p
7ff0: 6c 61 74 66 6f 72 6d 20 53 79 73 74 65 6d 2e 44  latform System.D
8000: 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 5d 5d  ata.SQLite.dll]]
8010: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
8020: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
8030: 54 45 3a 20 41 72 65 20 77 65 20 61 74 74 65 6d  TE: Are we attem
8040: 70 74 69 6e 67 20 74 6f 20 61 75 74 6f 6d 61 74  pting to automat
8050: 69 63 61 6c 6c 79 20 64 65 74 65 63 74 20 77 68  ically detect wh
8060: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
8070: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
8080: 69 6e 74 65 72 6f 70 20 61 73 73 65 6d 62 6c 79  interop assembly
8090: 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 3f   should be used?
80a0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
80b0: 20 73 65 74 20 61 75 74 6f 6d 61 74 69 63 20 5b   set automatic [
80c0: 65 78 70 72 20 7b 5b 73 74 72 69 6e 67 20 6c 65  expr {[string le
80d0: 6e 67 74 68 20 24 73 74 61 6e 64 61 72 64 5d 20  ngth $standard] 
80e0: 3d 3d 20 30 7d 5d 0d 0a 0d 0a 20 20 20 20 20 20  == 0}]....      
80f0: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
8100: 20 46 69 72 73 74 2c 20 69 6e 20 65 69 74 68 65   First, in eithe
8110: 72 20 22 61 75 74 6f 6d 61 74 69 63 22 20 6f 72  r "automatic" or
8120: 20 22 6e 6f 6e 2d 73 74 61 6e 64 61 72 64 22 20   "non-standard" 
8130: 6d 6f 64 65 73 2c 20 61 74 74 65 6d 70 74 0d 0a  modes, attempt..
8140: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 6f        #       to
8150: 20 66 69 6e 64 20 74 68 65 20 6e 61 74 69 76 65   find the native
8160: 2d 6f 6e 6c 79 20 69 6e 74 65 72 6f 70 20 61 73  -only interop as
8170: 73 65 6d 62 6c 79 2e 0d 0a 20 20 20 20 20 20 23  sembly...      #
8180: 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 61 75 74  ..      if {$aut
8190: 6f 6d 61 74 69 63 20 7c 7c 20 21 24 73 74 61 6e  omatic || !$stan
81a0: 64 61 72 64 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  dard} then {..  
81b0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
81c0: 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74   # NOTE: Attempt
81d0: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
81e0: 65 20 6e 61 74 69 76 65 2d 6f 6e 6c 79 20 69 6e  e native-only in
81f0: 74 65 72 6f 70 20 61 73 73 65 6d 62 6c 79 20 66  terop assembly f
8200: 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ile..        #  
8210: 20 20 20 20 20 6e 61 6d 65 20 66 6f 72 20 74 68       name for th
8220: 69 73 20 70 6c 61 74 66 6f 72 6d 20 61 6e 64 20  is platform and 
8230: 74 68 65 6e 20 72 65 74 75 72 6e 20 69 74 2e 0d  then return it..
8240: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
8250: 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65      foreach file
8260: 4e 61 6d 65 4f 6e 6c 79 20 5b 67 65 74 49 6e 74  NameOnly [getInt
8270: 65 72 6f 70 41 73 73 65 6d 62 6c 79 46 69 6c 65  eropAssemblyFile
8280: 4e 61 6d 65 73 4f 6e 6c 79 5d 20 7b 0d 0a 20 20  NamesOnly] {..  
8290: 20 20 20 20 20 20 20 20 73 65 74 20 66 69 6c 65          set file
82a0: 4e 61 6d 65 20 5b 66 69 6c 65 20 6e 61 74 69 76  Name [file nativ
82b0: 65 6e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20  ename \..       
82c0: 20 20 20 20 20 20 20 5b 66 69 6c 65 20 6a 6f 69         [file joi
82d0: 6e 20 5b 67 65 74 42 69 6e 61 72 79 44 69 72 65  n [getBinaryDire
82e0: 63 74 6f 72 79 5d 20 24 70 6c 61 74 66 6f 72 6d  ctory] $platform
82f0: 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 5d 5d   $fileNameOnly]]
8300: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66  ....          if
8310: 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24   {[file exists $
8320: 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20  fileName]} then 
8330: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  {..            r
8340: 65 74 75 72 6e 20 24 66 69 6c 65 4e 61 6d 65 0d  eturn $fileName.
8350: 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
8360: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
8370: 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
8380: 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 6e 2c     # NOTE: Then,
8390: 20 69 6e 20 65 69 74 68 65 72 20 22 61 75 74 6f   in either "auto
83a0: 6d 61 74 69 63 22 20 6f 72 20 22 73 74 61 6e 64  matic" or "stand
83b0: 61 72 64 22 20 6d 6f 64 65 73 2c 20 61 74 74 65  ard" modes, atte
83c0: 6d 70 74 20 74 6f 0d 0a 20 20 20 20 20 20 23 20  mpt to..      # 
83d0: 20 20 20 20 20 20 66 69 6e 64 20 74 68 65 20 73        find the s
83e0: 74 61 6e 64 61 72 64 20 53 51 4c 69 74 65 20 6c  tandard SQLite l
83f0: 69 62 72 61 72 79 2e 0d 0a 20 20 20 20 20 20 23  ibrary...      #
8400: 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 61 75 74  ..      if {$aut
8410: 6f 6d 61 74 69 63 20 7c 7c 20 24 73 74 61 6e 64  omatic || $stand
8420: 61 72 64 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ard} then {..   
8430: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
8440: 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20  # NOTE: Attempt 
8450: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
8460: 20 6e 61 74 69 76 65 2d 6f 6e 6c 79 20 73 74 61   native-only sta
8470: 6e 64 61 72 64 20 53 51 4c 69 74 65 20 6c 69 62  ndard SQLite lib
8480: 72 61 72 79 0d 0a 20 20 20 20 20 20 20 20 23 20  rary..        # 
8490: 20 20 20 20 20 20 66 69 6c 65 20 6e 61 6d 65 20        file name 
84a0: 66 6f 72 20 74 68 69 73 20 70 6c 61 74 66 6f 72  for this platfor
84b0: 6d 20 61 6e 64 20 74 68 65 6e 20 72 65 74 75 72  m and then retur
84c0: 6e 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23  n it...        #
84d0: 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63  ..        foreac
84e0: 68 20 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 5b  h fileNameOnly [
84f0: 67 65 74 4e 61 74 69 76 65 4c 69 62 72 61 72 79  getNativeLibrary
8500: 46 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79 5d 20 7b  FileNamesOnly] {
8510: 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
8520: 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6e  fileName [file n
8530: 61 74 69 76 65 6e 61 6d 65 20 5c 0d 0a 20 20 20  ativename \..   
8540: 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65             [file
8550: 20 6a 6f 69 6e 20 5b 67 65 74 42 69 6e 61 72 79   join [getBinary
8560: 44 69 72 65 63 74 6f 72 79 5d 20 24 70 6c 61 74  Directory] $plat
8570: 66 6f 72 6d 20 24 66 69 6c 65 4e 61 6d 65 4f 6e  form $fileNameOn
8580: 6c 79 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ly]]....        
8590: 20 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73    if {[file exis
85a0: 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74  ts $fileName]} t
85b0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
85c0: 20 20 20 72 65 74 75 72 6e 20 24 66 69 6c 65 4e     return $fileN
85d0: 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  ame..          }
85e0: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
85f0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
8600: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57  .      # NOTE: W
8610: 61 73 20 74 68 65 20 6d 61 6e 61 67 65 64 20 61  as the managed a
8620: 73 73 65 6d 62 6c 79 20 63 6f 6d 70 69 6c 65 64  ssembly compiled
8630: 20 65 78 70 65 63 74 69 6e 67 20 74 6f 20 64 65   expecting to de
8640: 61 6c 20 77 69 74 68 20 74 68 65 0d 0a 20 20 20  al with the..   
8650: 20 20 20 23 20 20 20 20 20 20 20 73 74 61 6e 64     #       stand
8660: 61 72 64 20 63 6f 72 65 20 6c 69 62 72 61 72 79  ard core library
8670: 3f 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ?..      #..    
8680: 20 20 69 66 20 7b 5b 68 61 76 65 53 51 4c 69 74    if {[haveSQLit
8690: 65 44 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 20  eDefineConstant 
86a0: 53 51 4c 49 54 45 5f 53 54 41 4e 44 41 52 44 5d  SQLITE_STANDARD]
86b0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
86c0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
86d0: 4f 54 45 3a 20 46 61 6c 6c 62 61 63 6b 20 74 6f  OTE: Fallback to
86e0: 20 72 65 74 75 72 6e 69 6e 67 20 74 68 65 20 6e   returning the n
86f0: 61 74 69 76 65 2d 6f 6e 6c 79 20 73 74 61 6e 64  ative-only stand
8700: 61 72 64 20 53 51 4c 69 74 65 20 6c 69 62 72 61  ard SQLite libra
8710: 72 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ry..        #   
8720: 20 20 20 20 66 69 6c 65 20 6e 61 6d 65 20 66 6f      file name fo
8730: 72 20 74 68 65 20 70 6c 61 74 66 6f 72 6d 2e 0d  r the platform..
8740: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
8750: 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65      set fileName
8760: 73 4f 6e 6c 79 20 5b 67 65 74 4e 61 74 69 76 65  sOnly [getNative
8770: 4c 69 62 72 61 72 79 46 69 6c 65 4e 61 6d 65 73  LibraryFileNames
8780: 4f 6e 6c 79 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  Only]....       
8790: 20 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 66   if {[llength $f
87a0: 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79 5d 20 3d 3d  ileNamesOnly] ==
87b0: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
87c0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 22 22 0d        return "".
87d0: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
87e0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 66 69        return [fi
87f0: 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66  le nativename [f
8800: 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20  ile join \..    
8810: 20 20 20 20 20 20 20 20 5b 67 65 74 42 69 6e 61          [getBina
8820: 72 79 44 69 72 65 63 74 6f 72 79 5d 20 24 70 6c  ryDirectory] $pl
8830: 61 74 66 6f 72 6d 20 5b 6c 69 6e 64 65 78 20 24  atform [lindex $
8840: 66 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79 20 30 5d  fileNamesOnly 0]
8850: 5d 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  ]]..      } else
8860: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
8870: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46         # NOTE: F
8880: 61 6c 6c 62 61 63 6b 20 74 6f 20 72 65 74 75 72  allback to retur
8890: 6e 69 6e 67 20 74 68 65 20 6e 61 74 69 76 65 2d  ning the native-
88a0: 6f 6e 6c 79 20 69 6e 74 65 72 6f 70 20 61 73 73  only interop ass
88b0: 65 6d 62 6c 79 20 66 69 6c 65 0d 0a 20 20 20 20  embly file..    
88c0: 20 20 20 20 23 20 20 20 20 20 20 20 6e 61 6d 65      #       name
88d0: 20 66 6f 72 20 74 68 65 20 70 6c 61 74 66 6f 72   for the platfor
88e0: 6d 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  m...        #.. 
88f0: 20 20 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e         set fileN
8900: 61 6d 65 73 4f 6e 6c 79 20 5b 67 65 74 49 6e 74  amesOnly [getInt
8910: 65 72 6f 70 41 73 73 65 6d 62 6c 79 46 69 6c 65  eropAssemblyFile
8920: 4e 61 6d 65 73 4f 6e 6c 79 5d 0d 0a 0d 0a 20 20  NamesOnly]....  
8930: 20 20 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67        if {[lleng
8940: 74 68 20 24 66 69 6c 65 4e 61 6d 65 73 4f 6e 6c  th $fileNamesOnl
8950: 79 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  y] == 0} then {.
8960: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
8970: 6e 20 22 22 0d 0a 20 20 20 20 20 20 20 20 7d 0d  n ""..        }.
8980: 0a 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ...        retur
8990: 6e 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61  n [file nativena
89a0: 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d  me [file join \.
89b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65  .            [ge
89c0: 74 42 69 6e 61 72 79 44 69 72 65 63 74 6f 72 79  tBinaryDirectory
89d0: 5d 20 24 70 6c 61 74 66 6f 72 6d 20 5b 6c 69 6e  ] $platform [lin
89e0: 64 65 78 20 24 66 69 6c 65 4e 61 6d 65 73 4f 6e  dex $fileNamesOn
89f0: 6c 79 20 30 5d 5d 5d 0d 0a 20 20 20 20 20 20 7d  ly 0]]]..      }
8a00: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
8a10: 70 72 6f 63 20 67 65 74 43 6f 6d 6d 6f 6e 44 69  proc getCommonDi
8a20: 72 65 63 74 6f 72 79 20 7b 7d 20 7b 0d 0a 20 20  rectory {} {..  
8a30: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
8a40: 4f 54 45 3a 20 54 68 69 73 20 70 72 6f 63 65 64  OTE: This proced
8a50: 75 72 65 20 72 65 74 75 72 6e 73 20 74 68 65 20  ure returns the 
8a60: 64 69 72 65 63 74 6f 72 79 20 77 68 65 72 65 20  directory where 
8a70: 74 68 65 20 74 65 73 74 20 73 63 72 69 70 74 73  the test scripts
8a80: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
8a90: 73 68 6f 75 6c 64 20 62 65 20 6c 6f 63 61 74 65  should be locate
8aa0: 64 2e 20 20 42 79 20 64 65 66 61 75 6c 74 2c 20  d.  By default, 
8ab0: 74 68 69 73 20 6a 75 73 74 20 72 65 74 75 72 6e  this just return
8ac0: 73 20 74 68 65 20 45 61 67 6c 65 0d 0a 20 20 20  s the Eagle..   
8ad0: 20 20 20 23 20 20 20 20 20 20 20 62 69 6e 61 72     #       binar
8ae0: 79 20 64 69 72 65 63 74 6f 72 79 2e 0d 0a 20 20  y directory...  
8af0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
8b00: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
8b10: 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79  common_directory
8b20: 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
8b30: 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
8b40: 20 24 3a 3a 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63   $::common_direc
8b50: 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20  tory] > 0} then 
8b60: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
8b70: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68        # NOTE: Th
8b80: 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68  e location of th
8b90: 65 20 63 6f 6d 6d 6f 6e 20 64 69 72 65 63 74 6f  e common directo
8ba0: 72 79 20 68 61 73 20 62 65 65 6e 20 73 65 74 3b  ry has been set;
8bb0: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
8bc0: 20 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65    therefore, use
8bd0: 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d   it...        #.
8be0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
8bf0: 24 3a 3a 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74  $::common_direct
8c00: 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  ory..      } els
8c10: 65 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74  eif {[info exist
8c20: 73 20 3a 3a 76 65 6e 64 6f 72 5f 64 69 72 65 63  s ::vendor_direc
8c30: 74 6f 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20  tory] && \..    
8c40: 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65        [string le
8c50: 6e 67 74 68 20 24 3a 3a 76 65 6e 64 6f 72 5f 64  ngth $::vendor_d
8c60: 69 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74  irectory] > 0} t
8c70: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
8c80: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
8c90: 3a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f  : The location o
8ca0: 66 20 74 68 65 20 76 65 6e 64 6f 72 20 64 69 72  f the vendor dir
8cb0: 65 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20  ectory has been 
8cc0: 73 65 74 3b 0d 0a 20 20 20 20 20 20 20 20 23 20  set;..        # 
8cd0: 20 20 20 20 20 20 74 68 65 72 65 66 6f 72 65 2c        therefore,
8ce0: 20 75 73 65 20 69 74 2e 0d 0a 20 20 20 20 20 20   use it...      
8cf0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
8d00: 75 72 6e 20 24 3a 3a 76 65 6e 64 6f 72 5f 64 69  urn $::vendor_di
8d10: 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d  rectory..      }
8d20: 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20 65   elseif {[info e
8d30: 78 69 73 74 73 20 3a 3a 74 63 6c 5f 6c 69 62 72  xists ::tcl_libr
8d40: 61 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  ary] && \..     
8d50: 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
8d60: 67 74 68 20 24 3a 3a 74 63 6c 5f 6c 69 62 72 61  gth $::tcl_libra
8d70: 72 79 5d 20 3e 20 30 20 26 26 20 5c 0d 0a 20 20  ry] > 0 && \..  
8d80: 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 69 73          [file is
8d90: 64 69 72 65 63 74 6f 72 79 20 24 3a 3a 74 63 6c  directory $::tcl
8da0: 5f 6c 69 62 72 61 72 79 5d 7d 20 74 68 65 6e 20  _library]} then 
8db0: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
8dc0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68        # NOTE: Th
8dd0: 65 20 76 61 72 69 61 62 6c 65 20 77 69 74 68 20  e variable with 
8de0: 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20  the location of 
8df0: 74 68 65 20 73 63 72 69 70 74 20 6c 69 62 72 61  the script libra
8e00: 72 79 20 69 73 0d 0a 20 20 20 20 20 20 20 20 23  ry is..        #
8e10: 20 20 20 20 20 20 20 73 65 74 20 61 6e 64 20 61         set and a
8e20: 70 70 65 61 72 73 20 74 6f 20 62 65 20 61 20 72  ppears to be a r
8e30: 65 61 6c 20 64 69 72 65 63 74 6f 72 79 20 28 69  eal directory (i
8e40: 2e 65 2e 20 6e 6f 74 20 65 6d 62 65 64 64 65 64  .e. not embedded
8e50: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
8e60: 20 20 77 69 74 68 69 6e 20 61 20 66 69 6c 65 29    within a file)
8e70: 3b 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65  ; therefore, use
8e80: 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d   it...        #.
8e90: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
8ea0: 24 3a 3a 74 63 6c 5f 6c 69 62 72 61 72 79 0d 0a  $::tcl_library..
8eb0: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
8ec0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
8ed0: 20 20 20 23 20 4e 4f 54 45 3a 20 46 61 6c 6c 62     # NOTE: Fallb
8ee0: 61 63 6b 20 74 6f 20 74 68 65 20 64 69 72 65 63  ack to the direc
8ef0: 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20  tory containing 
8f00: 74 68 65 20 65 78 65 63 75 74 61 62 6c 65 2e 0d  the executable..
8f10: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
8f20: 20 20 20 20 72 65 74 75 72 6e 20 5b 69 6e 66 6f      return [info
8f30: 20 62 69 6e 61 72 79 5d 0d 0a 20 20 20 20 20 20   binary]..      
8f40: 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
8f50: 20 70 72 6f 63 20 67 65 74 44 61 74 61 62 61 73   proc getDatabas
8f60: 65 44 69 72 65 63 74 6f 72 79 20 7b 7d 20 7b 0d  eDirectory {} {.
8f70: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
8f80: 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 70 72 6f  # NOTE: This pro
8f90: 63 65 64 75 72 65 20 72 65 74 75 72 6e 73 20 74  cedure returns t
8fa0: 68 65 20 64 69 72 65 63 74 6f 72 79 20 77 68 65  he directory whe
8fb0: 72 65 20 74 68 65 20 74 65 73 74 20 64 61 74 61  re the test data
8fc0: 62 61 73 65 73 0d 0a 20 20 20 20 20 20 23 20 20  bases..      #  
8fd0: 20 20 20 20 20 73 68 6f 75 6c 64 20 62 65 20 6c       should be l
8fe0: 6f 63 61 74 65 64 2e 20 20 42 79 20 64 65 66 61  ocated.  By defa
8ff0: 75 6c 74 2c 20 74 68 69 73 20 6a 75 73 74 20 75  ult, this just u
9000: 73 65 73 20 74 68 65 20 74 65 6d 70 6f 72 61 72  ses the temporar
9010: 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  y..      #      
9020: 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 66 69   directory confi
9030: 67 75 72 65 64 20 66 6f 72 20 74 68 69 73 20 73  gured for this s
9040: 79 73 74 65 6d 2e 0d 0a 20 20 20 20 20 20 23 0d  ystem...      #.
9050: 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f  .      if {[info
9060: 20 65 78 69 73 74 73 20 3a 3a 64 61 74 61 62 61   exists ::databa
9070: 73 65 5f 64 69 72 65 63 74 6f 72 79 5d 20 26 26  se_directory] &&
9080: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73   \..          [s
9090: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a  tring length $::
90a0: 64 61 74 61 62 61 73 65 5f 64 69 72 65 63 74 6f  database_directo
90b0: 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  ry] > 0} then {.
90c0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
90d0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20      # NOTE: The 
90e0: 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  location of the 
90f0: 64 61 74 61 62 61 73 65 20 64 69 72 65 63 74 6f  database directo
9100: 72 79 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72  ry has been over
9110: 72 69 64 64 65 6e 3b 0d 0a 20 20 20 20 20 20 20  ridden;..       
9120: 20 23 20 20 20 20 20 20 20 74 68 65 72 65 66 6f   #       therefo
9130: 72 65 2c 20 75 73 65 20 69 74 2e 0d 0a 20 20 20  re, use it...   
9140: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
9150: 72 65 74 75 72 6e 20 24 3a 3a 64 61 74 61 62 61  return $::databa
9160: 73 65 5f 64 69 72 65 63 74 6f 72 79 0d 0a 20 20  se_directory..  
9170: 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69      } elseif {[i
9180: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 73 63 72  nfo exists ::scr
9190: 61 74 63 68 5f 64 69 72 65 63 74 6f 72 79 5d 20  atch_directory] 
91a0: 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
91b0: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
91c0: 3a 3a 73 63 72 61 74 63 68 5f 64 69 72 65 63 74  ::scratch_direct
91d0: 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ory] > 0} then {
91e0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
91f0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65       # NOTE: The
9200: 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65   location of the
9210: 20 73 63 72 61 74 63 68 20 64 69 72 65 63 74 6f   scratch directo
9220: 72 79 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72  ry has been over
9230: 72 69 64 64 65 6e 3b 0d 0a 20 20 20 20 20 20 20  ridden;..       
9240: 20 23 20 20 20 20 20 20 20 74 68 65 72 65 66 6f   #       therefo
9250: 72 65 2c 20 75 73 65 20 69 74 2e 0d 0a 20 20 20  re, use it...   
9260: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
9270: 72 65 74 75 72 6e 20 24 3a 3a 73 63 72 61 74 63  return $::scratc
9280: 68 5f 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20  h_directory..   
9290: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
92a0: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 67 65 74       return [get
92b0: 54 65 6d 70 6f 72 61 72 79 50 61 74 68 5d 0d 0a  TemporaryPath]..
92c0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
92d0: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 54  ...    proc getT
92e0: 65 6d 70 6f 72 61 72 79 44 69 72 65 63 74 6f 72  emporaryDirector
92f0: 79 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  y {} {..      #.
9300: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54  .      # NOTE: T
9310: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 72 65  his procedure re
9320: 74 75 72 6e 73 20 74 68 65 20 64 69 72 65 63 74  turns the direct
9330: 6f 72 79 20 77 68 65 72 65 20 74 68 65 20 74 65  ory where the te
9340: 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 0d 0a 20  mporary files.. 
9350: 20 20 20 20 20 23 20 20 20 20 20 20 20 73 68 6f       #       sho
9360: 75 6c 64 20 62 65 20 6c 6f 63 61 74 65 64 2e 20  uld be located. 
9370: 20 42 79 20 64 65 66 61 75 6c 74 2c 20 74 68 69   By default, thi
9380: 73 20 6a 75 73 74 20 75 73 65 73 20 74 68 65 20  s just uses the 
9390: 74 65 6d 70 6f 72 61 72 79 0d 0a 20 20 20 20 20  temporary..     
93a0: 20 23 20 20 20 20 20 20 20 64 69 72 65 63 74 6f   #       directo
93b0: 72 79 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f  ry configured fo
93c0: 72 20 74 68 69 73 20 73 79 73 74 65 6d 2e 0d 0a  r this system...
93d0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
93e0: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
93f0: 3a 3a 74 65 6d 70 6f 72 61 72 79 5f 64 69 72 65  ::temporary_dire
9400: 63 74 6f 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20  ctory] && \..   
9410: 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c         [string l
9420: 65 6e 67 74 68 20 24 3a 3a 74 65 6d 70 6f 72 61  ength $::tempora
9430: 72 79 5f 64 69 72 65 63 74 6f 72 79 5d 20 3e 20  ry_directory] > 
9440: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
9450: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
9460: 4e 4f 54 45 3a 20 54 68 65 20 6c 6f 63 61 74 69  NOTE: The locati
9470: 6f 6e 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72  on of the tempor
9480: 61 72 79 20 64 69 72 65 63 74 6f 72 79 20 68 61  ary directory ha
9490: 73 20 62 65 65 6e 20 6f 76 65 72 72 69 64 64 65  s been overridde
94a0: 6e 3b 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  n;..        #   
94b0: 20 20 20 20 74 68 65 72 65 66 6f 72 65 2c 20 75      therefore, u
94c0: 73 65 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20  se it...        
94d0: 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  #..        retur
94e0: 6e 20 24 3a 3a 74 65 6d 70 6f 72 61 72 79 5f 64  n $::temporary_d
94f0: 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20  irectory..      
9500: 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20  } elseif {[info 
9510: 65 78 69 73 74 73 20 3a 3a 73 63 72 61 74 63 68  exists ::scratch
9520: 5f 64 69 72 65 63 74 6f 72 79 5d 20 26 26 20 5c  _directory] && \
9530: 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72  ..          [str
9540: 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 73 63  ing length $::sc
9550: 72 61 74 63 68 5f 64 69 72 65 63 74 6f 72 79 5d  ratch_directory]
9560: 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
9570: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
9580: 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c 6f 63   # NOTE: The loc
9590: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 63 72  ation of the scr
95a0: 61 74 63 68 20 64 69 72 65 63 74 6f 72 79 20 68  atch directory h
95b0: 61 73 20 62 65 65 6e 20 6f 76 65 72 72 69 64 64  as been overridd
95c0: 65 6e 3b 0d 0a 20 20 20 20 20 20 20 20 23 20 20  en;..        #  
95d0: 20 20 20 20 20 74 68 65 72 65 66 6f 72 65 2c 20       therefore, 
95e0: 75 73 65 20 69 74 2e 0d 0a 20 20 20 20 20 20 20  use it...       
95f0: 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   #..        retu
9600: 72 6e 20 24 3a 3a 73 63 72 61 74 63 68 5f 64 69  rn $::scratch_di
9610: 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d  rectory..      }
9620: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
9630: 20 72 65 74 75 72 6e 20 5b 67 65 74 54 65 6d 70   return [getTemp
9640: 6f 72 61 72 79 50 61 74 68 5d 0d 0a 20 20 20 20  oraryPath]..    
9650: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
9660: 20 20 20 70 72 6f 63 20 67 65 74 45 78 65 63 75     proc getExecu
9670: 74 65 4f 6e 53 65 74 75 70 20 7b 7d 20 7b 0d 0a  teOnSetup {} {..
9680: 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20        if {[info 
9690: 65 78 69 73 74 73 20 3a 3a 65 78 65 63 75 74 65  exists ::execute
96a0: 5f 6f 6e 5f 73 65 74 75 70 5d 20 26 26 20 5c 0d  _on_setup] && \.
96b0: 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69  .          [stri
96c0: 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 65 78 65  ng length $::exe
96d0: 63 75 74 65 5f 6f 6e 5f 73 65 74 75 70 5d 20 3e  cute_on_setup] >
96e0: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
96f0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
9700: 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e 20 74 68   NOTE: Return th
9710: 65 20 63 6f 6e 66 69 67 75 72 65 64 20 53 51 4c  e configured SQL
9720: 20 74 6f 20 65 78 65 63 75 74 65 20 64 75 72 69   to execute duri
9730: 6e 67 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  ng the connectio
9740: 6e 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  n..        #    
9750: 20 20 20 73 65 74 75 70 20 70 72 6f 63 65 64 75     setup procedu
9760: 72 65 20 28 69 2e 65 2e 20 66 6f 72 20 65 76 65  re (i.e. for eve
9770: 72 79 20 74 65 73 74 20 64 61 74 61 62 61 73 65  ry test database
9780: 20 63 6f 6e 6e 65 63 74 69 6f 6e 29 2e 0d 0a 20   connection)... 
9790: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
97a0: 20 20 72 65 74 75 72 6e 20 24 3a 3a 65 78 65 63    return $::exec
97b0: 75 74 65 5f 6f 6e 5f 73 65 74 75 70 0d 0a 20 20  ute_on_setup..  
97c0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
97d0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
97e0: 20 23 20 4e 4f 54 45 3a 20 42 79 20 64 65 66 61   # NOTE: By defa
97f0: 75 6c 74 2c 20 74 68 65 72 65 20 69 73 20 6e 6f  ult, there is no
9800: 20 53 51 4c 20 74 6f 20 65 78 65 63 75 74 65 20   SQL to execute 
9810: 64 75 72 69 6e 67 20 74 68 65 20 63 6f 6e 6e 65  during the conne
9820: 63 74 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20 23  ction..        #
9830: 20 20 20 20 20 20 20 73 65 74 75 70 20 70 72 6f         setup pro
9840: 63 65 64 75 72 65 20 28 69 2e 65 2e 20 66 6f 72  cedure (i.e. for
9850: 20 65 76 65 72 79 20 74 65 73 74 20 64 61 74 61   every test data
9860: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 29  base connection)
9870: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
9880: 20 20 20 20 20 20 72 65 74 75 72 6e 20 22 22 0d        return "".
9890: 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
98a0: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74  ....    proc get
98b0: 54 65 73 74 4f 76 65 72 72 69 64 65 73 50 72 65  TestOverridesPre
98c0: 61 6d 62 6c 65 20 7b 20 7b 65 78 74 72 61 56 61  amble { {extraVa
98d0: 72 4e 61 6d 65 73 20 22 22 7d 20 7d 20 7b 0d 0a  rNames ""} } {..
98e0: 20 20 20 20 20 20 73 65 74 20 76 61 72 4e 61 6d        set varNam
98f0: 65 73 20 5b 6c 69 73 74 5d 0d 0a 0d 0a 20 20 20  es [list]....   
9900: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
9910: 54 45 3a 20 49 66 20 61 76 61 69 6c 61 62 6c 65  TE: If available
9920: 2c 20 73 74 61 72 74 20 77 69 74 68 20 74 68 65  , start with the
9930: 20 6d 61 73 74 65 72 20 6c 69 73 74 20 6f 66 20   master list of 
9940: 74 65 73 74 20 6f 76 65 72 72 69 64 65 0d 0a 20  test override.. 
9950: 20 20 20 20 20 23 20 20 20 20 20 20 20 76 61 72       #       var
9960: 69 61 62 6c 65 73 2e 0d 0a 20 20 20 20 20 20 23  iables...      #
9970: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66  ..      if {[inf
9980: 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 73 74 5f  o exists ::test_
9990: 6f 76 65 72 72 69 64 65 73 5d 20 26 26 20 5c 0d  overrides] && \.
99a0: 0a 20 20 20 20 20 20 20 20 20 20 5b 6c 6c 65 6e  .          [llen
99b0: 67 74 68 20 24 3a 3a 74 65 73 74 5f 6f 76 65 72  gth $::test_over
99c0: 72 69 64 65 73 5d 20 3e 20 30 7d 20 74 68 65 6e  rides] > 0} then
99d0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 65 76 61 6c   {..        eval
99e0: 20 6c 61 70 70 65 6e 64 20 76 61 72 4e 61 6d 65   lappend varName
99f0: 73 20 24 3a 3a 74 65 73 74 5f 6f 76 65 72 72 69  s $::test_overri
9a00: 64 65 73 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  des..      }....
9a10: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
9a20: 20 4e 4f 54 45 3a 20 49 66 20 72 65 71 75 65 73   NOTE: If reques
9a30: 74 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65  ted by our calle
9a40: 72 2c 20 61 64 64 20 61 6e 79 20 61 64 64 69 74  r, add any addit
9a50: 69 6f 6e 61 6c 20 76 61 72 69 61 62 6c 65 0d 0a  ional variable..
9a60: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6e 61        #       na
9a70: 6d 65 73 20 74 6f 20 63 6f 70 79 20 6e 6f 77 2e  mes to copy now.
9a80: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
9a90: 20 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 65   if {[llength $e
9aa0: 78 74 72 61 56 61 72 4e 61 6d 65 73 5d 20 3e 20  xtraVarNames] > 
9ab0: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
9ac0: 20 20 20 65 76 61 6c 20 6c 61 70 70 65 6e 64 20     eval lappend 
9ad0: 76 61 72 4e 61 6d 65 73 20 24 65 78 74 72 61 56  varNames $extraV
9ae0: 61 72 4e 61 6d 65 73 0d 0a 20 20 20 20 20 20 7d  arNames..      }
9af0: 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
9b00: 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64     # NOTE: Build
9b10: 20 74 68 65 20 73 63 72 69 70 74 20 66 72 61 67   the script frag
9b20: 6d 65 6e 74 20 74 6f 20 62 65 20 72 65 74 75 72  ment to be retur
9b30: 6e 65 64 20 62 79 20 70 72 6f 63 65 73 73 69 6e  ned by processin
9b40: 67 20 65 61 63 68 0d 0a 20 20 20 20 20 20 23 20  g each..      # 
9b50: 20 20 20 20 20 20 76 61 72 69 61 62 6c 65 20 6e        variable n
9b60: 61 6d 65 20 61 6e 64 20 61 64 64 69 6e 67 20 74  ame and adding t
9b70: 68 65 20 6e 65 63 65 63 65 73 73 61 72 79 20 73  he nececessary s
9b80: 63 72 69 70 74 20 66 72 61 67 6d 65 6e 74 73 20  cript fragments 
9b90: 66 6f 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20  for..      #    
9ba0: 20 20 20 65 61 63 68 20 6f 6e 65 2e 0d 0a 20 20     each one...  
9bb0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74      #..      set
9bc0: 20 72 65 73 75 6c 74 20 22 22 0d 0a 0d 0a 20 20   result ""....  
9bd0: 20 20 20 20 66 6f 72 65 61 63 68 20 76 61 72 4e      foreach varN
9be0: 61 6d 65 20 24 76 61 72 4e 61 6d 65 73 20 7b 0d  ame $varNames {.
9bf0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
9c00: 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c      # NOTE: Buil
9c10: 64 20 74 68 65 20 71 75 61 6c 69 66 69 65 64 20  d the qualified 
9c20: 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20  global variable 
9c30: 6e 61 6d 65 2e 0d 0a 20 20 20 20 20 20 20 20 23  name...        #
9c40: 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 66 75  ..        set fu
9c50: 6c 6c 56 61 72 4e 61 6d 65 20 5b 61 70 70 65 6e  llVarName [appen
9c60: 64 41 72 67 73 20 3a 3a 20 24 76 61 72 4e 61 6d  dArgs :: $varNam
9c70: 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d  e]....        #.
9c80: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
9c90: 20 44 6f 65 73 20 74 68 65 20 76 61 72 69 61 62   Does the variab
9ca0: 6c 65 20 65 78 69 73 74 20 69 6e 20 74 68 69 73  le exist in this
9cb0: 20 69 6e 74 65 72 70 72 65 74 65 72 20 63 6f 6e   interpreter con
9cc0: 74 65 78 74 3f 0d 0a 20 20 20 20 20 20 20 20 23  text?..        #
9cd0: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69  ..        if {[i
9ce0: 6e 66 6f 20 65 78 69 73 74 73 20 24 66 75 6c 6c  nfo exists $full
9cf0: 56 61 72 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b  VarName]} then {
9d00: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
9d10: 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
9d20: 20 41 70 70 65 6e 64 20 61 20 73 63 72 69 70 74   Append a script
9d30: 20 66 72 61 67 6d 65 6e 74 20 74 6f 20 74 68 65   fragment to the
9d40: 20 72 65 73 75 6c 74 20 74 68 61 74 20 77 69 6c   result that wil
9d50: 6c 20 63 6f 72 72 65 63 74 6c 79 0d 0a 20 20 20  l correctly..   
9d60: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63         #       c
9d70: 6f 70 79 20 61 6e 79 20 63 6f 6e 74 61 69 6e 65  opy any containe
9d80: 64 20 76 61 6c 75 65 20 74 6f 20 61 6e 6f 74 68  d value to anoth
9d90: 65 72 20 69 6e 74 65 72 70 72 65 74 65 72 20 63  er interpreter c
9da0: 6f 6e 74 65 78 74 2e 0d 0a 20 20 20 20 20 20 20  ontext...       
9db0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
9dc0: 61 70 70 65 6e 64 20 72 65 73 75 6c 74 20 5c 6e  append result \n
9dd0: 20 22 73 65 74 20 22 20 24 66 75 6c 6c 56 61 72   "set " $fullVar
9de0: 4e 61 6d 65 20 22 20 5c 7b 22 20 5b 73 65 74 20  Name " \{" [set 
9df0: 24 66 75 6c 6c 56 61 72 4e 61 6d 65 5d 20 5c 7d  $fullVarName] \}
9e00: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
9e10: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
9e20: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49  .      # NOTE: I
9e30: 66 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 6e  f the result con
9e40: 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72  tains one or mor
9e50: 65 20 73 63 72 69 70 74 20 66 72 61 67 6d 65 6e  e script fragmen
9e60: 74 73 2c 20 61 70 70 65 6e 64 20 61 0d 0a 20 20  ts, append a..  
9e70: 20 20 20 20 23 20 20 20 20 20 20 20 6e 65 77 6c      #       newl
9e80: 69 6e 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ine...      #.. 
9e90: 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
9ea0: 20 6c 65 6e 67 74 68 20 24 72 65 73 75 6c 74 5d   length $result]
9eb0: 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
9ec0: 20 20 20 20 20 20 61 70 70 65 6e 64 20 72 65 73        append res
9ed0: 75 6c 74 20 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d  ult \n..      }.
9ee0: 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ...      return 
9ef0: 24 72 65 73 75 6c 74 0d 0a 20 20 20 20 7d 0d 0a  $result..    }..
9f00: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 6d 6f 76 65  ...    proc move
9f10: 53 79 73 74 65 6d 44 61 74 61 53 51 4c 69 74 65  SystemDataSQLite
9f20: 44 6c 6c 43 6f 6e 66 69 67 20 7b 20 7b 72 65 73  DllConfig { {res
9f30: 74 6f 72 65 20 66 61 6c 73 65 7d 20 7b 76 65 72  tore false} {ver
9f40: 62 6f 73 65 20 66 61 6c 73 65 7d 20 7d 20 7b 0d  bose false} } {.
9f50: 0a 20 20 20 20 20 20 73 65 74 20 64 69 72 65 63  .      set direc
9f60: 74 6f 72 79 20 5b 6f 62 6a 65 63 74 20 69 6e 76  tory [object inv
9f70: 6f 6b 65 20 41 70 70 44 6f 6d 61 69 6e 20 43 75  oke AppDomain Cu
9f80: 72 72 65 6e 74 44 6f 6d 61 69 6e 2e 42 61 73 65  rrentDomain.Base
9f90: 44 69 72 65 63 74 6f 72 79 5d 0d 0a 0d 0a 20 20  Directory]....  
9fa0: 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
9fb0: 6c 65 6e 67 74 68 20 24 64 69 72 65 63 74 6f 72  length $director
9fc0: 79 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  y] == 0} then {.
9fd0: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 24 76 65  .        if {$ve
9fe0: 72 62 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20  rbose} then {.. 
9ff0: 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
a000: 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
a010: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
a020: 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
a030: 2d 20 73 6b 69 70 70 65 64 20 6d 6f 76 69 6e 67  - skipped moving
a040: 20 5c 22 53 79 73 74 65 6d 2e 44 61 74 61 2e 53   \"System.Data.S
a050: 51 4c 69 74 65 2e 64 6c 6c 2e 63 6f 6e 66 69 67  QLite.dll.config
a060: 5c 22 2c 20 22 20 5c 0d 0a 20 20 20 20 20 20 20  \", " \..       
a070: 20 20 20 20 20 20 20 22 6e 6f 20 62 61 73 65 20         "no base 
a080: 64 69 72 65 63 74 6f 72 79 5c 6e 22 5d 0d 0a 20  directory\n"].. 
a090: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
a0a0: 20 20 72 65 74 75 72 6e 0d 0a 20 20 20 20 20 20    return..      
a0b0: 7d 0d 0a 0d 0a 20 20 20 20 20 20 73 65 74 20 66  }....      set f
a0c0: 69 6c 65 4e 61 6d 65 28 31 29 20 5b 66 69 6c 65  ileName(1) [file
a0d0: 20 6e 6f 72 6d 61 6c 69 7a 65 20 5c 0d 0a 20 20   normalize \..  
a0e0: 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 6a 6f          [file jo
a0f0: 69 6e 20 24 64 69 72 65 63 74 6f 72 79 20 53 79  in $directory Sy
a100: 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
a110: 2e 64 6c 6c 2e 63 6f 6e 66 69 67 5d 5d 0d 0a 0d  .dll.config]]...
a120: 0a 20 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e  .      set fileN
a130: 61 6d 65 28 32 29 20 5b 61 70 70 65 6e 64 41 72  ame(2) [appendAr
a140: 67 73 20 24 66 69 6c 65 4e 61 6d 65 28 31 29 20  gs $fileName(1) 
a150: 2e 6d 6f 76 65 64 5d 0d 0a 0d 0a 20 20 20 20 20  .moved]....     
a160: 20 69 66 20 7b 24 72 65 73 74 6f 72 65 7d 20 74   if {$restore} t
a170: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69  hen {..        i
a180: 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20  f {[file exists 
a190: 24 66 69 6c 65 4e 61 6d 65 28 32 29 5d 7d 20 74  $fileName(2)]} t
a1a0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
a1b0: 20 66 69 6c 65 20 72 65 6e 61 6d 65 20 24 66 69   file rename $fi
a1c0: 6c 65 4e 61 6d 65 28 32 29 20 24 66 69 6c 65 4e  leName(2) $fileN
a1d0: 61 6d 65 28 31 29 0d 0a 0d 0a 20 20 20 20 20 20  ame(1)....      
a1e0: 20 20 20 20 69 66 20 7b 24 76 65 72 62 6f 73 65      if {$verbose
a1f0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
a200: 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
a210: 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
a220: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
a230: 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
a240: 20 6d 6f 76 65 64 20 5c 22 22 20 24 66 69 6c 65   moved \"" $file
a250: 4e 61 6d 65 28 32 29 20 22 5c 22 20 74 6f 20 5c  Name(2) "\" to \
a260: 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  "" \..          
a270: 20 20 20 20 20 20 24 66 69 6c 65 4e 61 6d 65 28        $fileName(
a280: 31 29 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20  1) \"\n]..      
a290: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
a2a0: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
a2b0: 20 20 20 69 66 20 7b 24 76 65 72 62 6f 73 65 7d     if {$verbose}
a2c0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
a2d0: 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
a2e0: 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
a2f0: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
a300: 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
a310: 73 6b 69 70 70 65 64 20 6d 6f 76 69 6e 67 20 5c  skipped moving \
a320: 22 22 20 24 66 69 6c 65 4e 61 6d 65 28 32 29 20  "" $fileName(2) 
a330: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
a340: 20 20 20 22 5c 22 2c 20 69 74 20 64 6f 65 73 20     "\", it does 
a350: 6e 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a 20  not exist\n"].. 
a360: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
a370: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65      }..      } e
a380: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 69  lse {..        i
a390: 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20  f {[file exists 
a3a0: 24 66 69 6c 65 4e 61 6d 65 28 31 29 5d 7d 20 74  $fileName(1)]} t
a3b0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
a3c0: 20 66 69 6c 65 20 72 65 6e 61 6d 65 20 24 66 69   file rename $fi
a3d0: 6c 65 4e 61 6d 65 28 31 29 20 24 66 69 6c 65 4e  leName(1) $fileN
a3e0: 61 6d 65 28 32 29 0d 0a 0d 0a 20 20 20 20 20 20  ame(2)....      
a3f0: 20 20 20 20 69 66 20 7b 24 76 65 72 62 6f 73 65      if {$verbose
a400: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
a410: 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
a420: 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
a430: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
a440: 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
a450: 20 6d 6f 76 65 64 20 5c 22 22 20 24 66 69 6c 65   moved \"" $file
a460: 4e 61 6d 65 28 31 29 20 22 5c 22 20 74 6f 20 5c  Name(1) "\" to \
a470: 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  "" \..          
a480: 20 20 20 20 20 20 24 66 69 6c 65 4e 61 6d 65 28        $fileName(
a490: 32 29 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20  2) \"\n]..      
a4a0: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
a4b0: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
a4c0: 20 20 20 69 66 20 7b 24 76 65 72 62 6f 73 65 7d     if {$verbose}
a4d0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
a4e0: 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
a4f0: 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
a500: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
a510: 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
a520: 73 6b 69 70 70 65 64 20 6d 6f 76 69 6e 67 20 5c  skipped moving \
a530: 22 22 20 24 66 69 6c 65 4e 61 6d 65 28 31 29 20  "" $fileName(1) 
a540: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
a550: 20 20 20 22 5c 22 2c 20 69 74 20 64 6f 65 73 20     "\", it does 
a560: 6e 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a 20  not exist\n"].. 
a570: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
a580: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
a590: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
a5a0: 6f 63 20 67 65 74 41 70 70 44 6f 6d 61 69 6e 50  oc getAppDomainP
a5b0: 72 65 61 6d 62 6c 65 20 7b 20 7b 70 72 65 66 69  reamble { {prefi
a5c0: 78 20 22 22 7d 20 7b 73 75 66 66 69 78 20 22 22  x ""} {suffix ""
a5d0: 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a  } } {..      #..
a5e0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68        # NOTE: Th
a5f0: 69 73 20 70 72 6f 63 65 64 75 72 65 20 72 65 74  is procedure ret
a600: 75 72 6e 73 20 61 20 74 65 73 74 20 73 65 74 75  urns a test setu
a610: 70 20 73 63 72 69 70 74 20 66 72 61 67 6d 65 6e  p script fragmen
a620: 74 20 73 75 69 74 61 62 6c 65 20 66 6f 72 0d 0a  t suitable for..
a630: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 65 76        #       ev
a640: 61 6c 75 61 74 69 6f 6e 20 62 79 20 61 6e 20 69  aluation by an i
a650: 6e 74 65 72 70 72 65 74 65 72 20 63 72 65 61 74  nterpreter creat
a660: 65 64 20 69 6e 20 61 6e 20 69 73 6f 6c 61 74 65  ed in an isolate
a670: 64 20 61 70 70 6c 69 63 61 74 69 6f 6e 0d 0a 20  d application.. 
a680: 20 20 20 20 20 23 20 20 20 20 20 20 20 64 6f 6d       #       dom
a690: 61 69 6e 2e 20 20 54 68 65 20 73 63 72 69 70 74  ain.  The script
a6a0: 20 66 72 61 67 6d 65 6e 74 20 62 65 69 6e 67 20   fragment being 
a6b0: 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 62 65  returned will be
a6c0: 20 73 75 72 72 6f 75 6e 64 65 64 20 62 79 0d 0a   surrounded by..
a6d0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68        #       th
a6e0: 65 20 70 72 65 66 69 78 20 61 6e 64 20 73 75 66  e prefix and suf
a6f0: 66 69 78 20 22 73 63 72 69 70 74 20 66 72 61 67  fix "script frag
a700: 6d 65 6e 74 73 22 20 73 70 65 63 69 66 69 65 64  ments" specified
a710: 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 2c 0d   by our caller,.
a720: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69  .      #       i
a730: 66 20 61 6e 79 2e 20 20 54 68 65 20 65 6e 74 69  f any.  The enti
a740: 72 65 20 73 63 72 69 70 74 20 62 65 69 6e 67 20  re script being 
a750: 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 62 65  returned will be
a760: 20 73 75 62 73 74 69 74 75 74 65 64 20 76 69 61   substituted via
a770: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
a780: 5b 73 75 62 73 74 5d 2c 20 69 6e 20 74 68 65 20  [subst], in the 
a790: 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72 20 63  context of our c
a7a0: 61 6c 6c 65 72 2c 20 62 65 66 6f 72 65 20 62 65  aller, before be
a7b0: 69 6e 67 20 72 65 74 75 72 6e 65 64 2e 0d 0a 20  ing returned... 
a7c0: 20 20 20 20 20 23 20 20 20 20 20 20 20 54 68 69       #       Thi
a7d0: 73 20 73 74 65 70 20 69 73 20 6e 65 63 65 73 73  s step is necess
a7e0: 61 72 79 20 73 6f 20 74 68 61 74 20 73 6f 6d 65  ary so that some
a7f0: 20 6c 69 6d 69 74 65 64 20 63 6f 6e 74 65 78 74   limited context
a800: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2c 0d 0a 20   information,.. 
a810: 20 20 20 20 20 23 20 20 20 20 20 20 20 70 72 69       #       pri
a820: 6d 61 72 69 6c 79 20 72 65 6c 61 74 65 64 20 74  marily related t
a830: 6f 20 74 68 65 20 74 65 73 74 69 6e 67 20 64 69  o the testing di
a840: 72 65 63 74 6f 72 69 65 73 2c 20 63 61 6e 20 62  rectories, can b
a850: 65 20 74 72 61 6e 73 66 65 72 72 65 64 0d 0a 20  e transferred.. 
a860: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 6f 20       #       to 
a870: 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 20  the interpreter 
a880: 69 6e 20 74 68 65 20 69 73 6f 6c 61 74 65 64 20  in the isolated 
a890: 61 70 70 6c 69 63 61 74 69 6f 6e 20 64 6f 6d 61  application doma
a8a0: 69 6e 2c 20 6d 61 6b 69 6e 67 20 69 74 0d 0a 20  in, making it.. 
a8b0: 20 20 20 20 20 23 20 20 20 20 20 20 20 61 62 6c       #       abl
a8c0: 65 20 74 6f 20 73 75 63 63 65 73 73 66 75 6c 6c  e to successfull
a8d0: 79 20 72 75 6e 20 74 65 73 74 73 20 74 68 61 74  y run tests that
a8e0: 20 72 65 71 75 69 72 65 20 6f 6e 65 20 6f 72 20   require one or 
a8f0: 6d 6f 72 65 20 6f 66 20 74 68 65 0d 0a 20 20 20  more of the..   
a900: 20 20 20 23 20 20 20 20 20 20 20 66 69 6c 65 73     #       files
a910: 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 74   in one of the t
a920: 65 73 74 69 6e 67 20 64 69 72 65 63 74 6f 72 69  esting directori
a930: 65 73 2e 20 20 43 61 6c 6c 65 72 73 20 73 68 6f  es.  Callers sho
a940: 75 6c 64 20 6b 65 65 70 20 69 6e 0d 0a 20 20 20  uld keep in..   
a950: 20 20 20 23 20 20 20 20 20 20 20 6d 69 6e 64 20     #       mind 
a960: 74 68 61 74 20 74 68 65 20 74 65 73 74 20 73 63  that the test sc
a970: 72 69 70 74 20 66 72 61 67 6d 65 6e 74 20 62 65  ript fragment be
a980: 69 6e 67 20 72 65 74 75 72 6e 65 64 20 63 61 6e  ing returned can
a990: 6e 6f 74 20 72 65 6c 79 20 6f 6e 0d 0a 20 20 20  not rely on..   
a9a0: 20 20 20 23 20 20 20 20 20 20 20 61 6e 79 20 73     #       any s
a9b0: 63 72 69 70 74 20 6c 69 62 72 61 72 79 20 70 72  cript library pr
a9c0: 6f 63 65 64 75 72 65 73 20 74 68 61 74 20 61 72  ocedures that ar
a9d0: 65 20 6e 6f 74 20 70 72 6f 76 69 64 65 64 20 62  e not provided b
a9e0: 79 20 74 68 65 20 45 61 67 6c 65 0d 0a 20 20 20  y the Eagle..   
a9f0: 20 20 20 23 20 20 20 20 20 20 20 6c 69 62 72 61     #       libra
aa00: 72 79 20 70 61 63 6b 61 67 65 20 28 69 2e 65 2e  ry package (i.e.
aa10: 20 22 69 6e 69 74 2e 65 61 67 6c 65 22 29 2c 20   "init.eagle"), 
aa20: 69 6e 63 6c 75 64 69 6e 67 20 74 68 6f 73 65 20  including those 
aa30: 70 72 6f 76 69 64 65 64 20 62 79 0d 0a 20 20 20  provided by..   
aa40: 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20 45     #       the E
aa50: 61 67 6c 65 20 74 65 73 74 20 70 61 63 6b 61 67  agle test packag
aa60: 65 2c 20 75 6e 6c 65 73 73 20 74 68 65 20 66 69  e, unless the fi
aa70: 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  le containing th
aa80: 65 6d 20 69 73 20 6c 6f 61 64 65 64 0d 0a 20 20  em is loaded..  
aa90: 20 20 20 20 23 20 20 20 20 20 20 20 6d 61 6e 75      #       manu
aaa0: 61 6c 6c 79 20 76 69 61 20 73 6f 6d 65 20 6f 74  ally via some ot
aab0: 68 65 72 20 6d 65 63 68 61 6e 69 73 6d 20 28 65  her mechanism (e
aac0: 2e 67 2e 20 62 79 20 69 6e 63 6c 75 64 69 6e 67  .g. by including
aad0: 20 61 70 70 72 6f 70 72 69 61 74 65 0d 0a 20 20   appropriate..  
aae0: 20 20 20 20 23 20 20 20 20 20 20 20 5b 70 61 63      #       [pac
aaf0: 6b 61 67 65 20 72 65 71 75 69 72 65 5d 20 6f 72  kage require] or
ab00: 20 5b 73 6f 75 72 63 65 5d 20 63 6f 6d 6d 61 6e   [source] comman
ab10: 64 73 20 69 6e 20 74 68 65 20 70 72 65 66 69 78  ds in the prefix
ab20: 20 6f 72 20 73 75 66 66 69 78 0d 0a 20 20 20 20   or suffix..    
ab30: 20 20 23 20 20 20 20 20 20 20 73 63 72 69 70 74    #       script
ab40: 20 66 72 61 67 6d 65 6e 74 73 29 2e 20 20 41 6c   fragments).  Al
ab50: 73 6f 2c 20 61 6c 6c 20 76 61 72 69 61 62 6c 65  so, all variable
ab60: 20 72 65 66 65 72 65 6e 63 65 73 20 61 6e 64 20   references and 
ab70: 61 6c 6c 20 6e 65 73 74 65 64 0d 0a 20 20 20 20  all nested..    
ab80: 20 20 23 20 20 20 20 20 20 20 63 6f 6d 6d 61 6e    #       comman
ab90: 64 73 20 28 69 2e 65 2e 20 74 68 6f 73 65 20 69  ds (i.e. those i
aba0: 6e 20 73 71 75 61 72 65 20 62 72 61 63 6b 65 74  n square bracket
abb0: 73 29 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  s) contained in 
abc0: 74 68 65 20 66 69 6e 61 6c 0d 0a 20 20 20 20 20  the final..     
abd0: 20 23 20 20 20 20 20 20 20 73 63 72 69 70 74 20   #       script 
abe0: 66 72 61 67 6d 65 6e 74 20 77 69 6c 6c 20 65 6e  fragment will en
abf0: 64 20 75 70 20 62 65 69 6e 67 20 65 76 61 6c 75  d up being evalu
ac00: 61 74 65 64 20 69 6e 20 74 68 65 20 63 6f 6e 74  ated in the cont
ac10: 65 78 74 20 6f 66 20 74 68 65 0d 0a 20 20 20 20  ext of the..    
ac20: 20 20 23 20 20 20 20 20 20 20 63 61 6c 6c 69 6e    #       callin
ac30: 67 20 69 6e 74 65 72 70 72 65 74 65 72 20 61 6e  g interpreter an
ac40: 64 20 6e 6f 74 20 74 68 65 20 74 61 72 67 65 74  d not the target
ac50: 20 69 6e 74 65 72 70 72 65 74 65 72 20 63 72 65   interpreter cre
ac60: 61 74 65 64 20 69 6e 20 74 68 65 0d 0a 20 20 20  ated in the..   
ac70: 20 20 20 23 20 20 20 20 20 20 20 69 73 6f 6c 61     #       isola
ac80: 74 65 64 20 61 70 70 6c 69 63 61 74 69 6f 6e 20  ted application 
ac90: 64 6f 6d 61 69 6e 20 75 6e 6c 65 73 73 20 74 68  domain unless th
aca0: 65 20 64 6f 6c 6c 61 72 20 73 69 67 6e 73 20 61  e dollar signs a
acb0: 6e 64 2f 6f 72 20 73 71 75 61 72 65 0d 0a 20 20  nd/or square..  
acc0: 20 20 20 20 23 20 20 20 20 20 20 20 62 72 61 63      #       brac
acd0: 6b 65 74 73 20 61 72 65 20 73 70 65 63 69 61 6c  kets are special
ace0: 6c 79 20 71 75 6f 74 65 64 20 77 69 74 68 20 62  ly quoted with b
acf0: 61 63 6b 73 6c 61 73 68 65 73 2e 0d 0a 20 20 20  ackslashes...   
ad00: 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75     #..      retu
ad10: 72 6e 20 5b 75 70 6c 65 76 65 6c 20 31 20 5b 6c  rn [uplevel 1 [l
ad20: 69 73 74 20 73 75 62 73 74 20 5b 61 70 70 65 6e  ist subst [appen
ad30: 64 41 72 67 73 20 24 70 72 65 66 69 78 20 7b 0d  dArgs $prefix {.
ad40: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
ad50: 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20      # NOTE: The 
ad60: 5c 5b 6f 62 6a 65 63 74 5c 5d 20 63 6f 6d 6d 61  \[object\] comma
ad70: 6e 64 20 6d 61 79 20 62 65 20 6d 69 73 73 69 6e  nd may be missin
ad80: 67 20 69 6e 20 73 6f 6d 65 20 45 61 67 6c 65 20  g in some Eagle 
ad90: 63 6f 72 65 0d 0a 20 20 20 20 20 20 20 20 23 20  core..        # 
ada0: 20 20 20 20 20 20 6c 69 62 72 61 72 79 20 63 6f        library co
adb0: 6e 66 69 67 75 72 61 74 69 6f 6e 73 2e 20 20 43  nfigurations.  C
adc0: 6c 6f 6e 69 6e 67 20 61 6e 64 20 75 73 69 6e 67  loning and using
add0: 20 74 68 65 20 70 72 6f 63 65 64 75 72 65 0d 0a   the procedure..
ade0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
adf0: 5c 5b 63 68 61 6e 67 65 4e 61 74 69 76 65 52 75  \[changeNativeRu
ae00: 6e 74 69 6d 65 4f 70 74 69 6f 6e 5c 5d 20 6d 61  ntimeOption\] ma
ae10: 79 20 68 65 6c 70 20 74 6f 20 6d 69 74 69 67 61  y help to mitiga
ae20: 74 65 20 74 68 69 73 2e 0d 0a 20 20 20 20 20 20  te this...      
ae30: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 70 72 6f    #..        pro
ae40: 63 20 63 68 61 6e 67 65 4e 61 74 69 76 65 52 75  c changeNativeRu
ae50: 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 5c 0d 0a 20  ntimeOption \.. 
ae60: 20 20 20 20 20 20 20 20 20 20 20 7b 5b 69 6e 66             {[inf
ae70: 6f 20 61 72 67 73 20 63 68 61 6e 67 65 4e 61 74  o args changeNat
ae80: 69 76 65 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e  iveRuntimeOption
ae90: 5d 7d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ]} \..          
aea0: 20 20 7b 5b 69 6e 66 6f 20 62 6f 64 79 20 63 68    {[info body ch
aeb0: 61 6e 67 65 4e 61 74 69 76 65 52 75 6e 74 69 6d  angeNativeRuntim
aec0: 65 4f 70 74 69 6f 6e 5d 7d 0d 0a 0d 0a 20 20 20  eOption]}....   
aed0: 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20       catch {..  
aee0: 20 20 20 20 20 20 20 20 63 68 61 6e 67 65 4e 61          changeNa
aef0: 74 69 76 65 52 75 6e 74 69 6d 65 4f 70 74 69 6f  tiveRuntimeOptio
af00: 6e 20 5b 68 61 73 52 75 6e 74 69 6d 65 4f 70 74  n [hasRuntimeOpt
af10: 69 6f 6e 20 6e 61 74 69 76 65 5d 0d 0a 20 20 20  ion native]..   
af20: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20       }..      } 
af30: 5b 67 65 74 54 65 73 74 4f 76 65 72 72 69 64 65  [getTestOverride
af40: 73 50 72 65 61 6d 62 6c 65 20 5b 6c 69 73 74 20  sPreamble [list 
af50: 70 61 74 68 20 74 65 73 74 5f 63 68 61 6e 6e 65  path test_channe
af60: 6c 5d 5d 20 24 73 75 66 66 69 78 5d 5d 5d 0d 0a  l]] $suffix]]]..
af70: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
af80: 6f 63 20 74 72 79 43 6f 70 79 45 78 74 65 72 6e  oc tryCopyExtern
af90: 61 6c 46 69 6c 65 20 7b 0d 0a 20 20 20 20 20 20  alFile {..      
afa0: 20 20 20 20 20 20 66 69 6c 65 4e 61 6d 65 20 7b        fileName {
afb0: 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20 7b 6e 65  platform ""} {ne
afc0: 77 46 69 6c 65 4e 61 6d 65 20 22 22 7d 20 7b 76  wFileName ""} {v
afd0: 65 72 62 6f 73 65 20 66 61 6c 73 65 7d 20 7d 20  erbose false} } 
afe0: 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 73 6f 75  {..      set sou
aff0: 72 63 65 46 69 6c 65 4e 61 6d 65 20 5b 67 65 74  rceFileName [get
b000: 45 78 74 65 72 6e 61 6c 46 69 6c 65 4e 61 6d 65  ExternalFileName
b010: 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20   $fileName].... 
b020: 20 20 20 20 20 69 66 20 7b 21 5b 66 69 6c 65 20       if {![file 
b030: 65 78 69 73 74 73 20 24 73 6f 75 72 63 65 46 69  exists $sourceFi
b040: 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d  leName]} then {.
b050: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 24 76 65  .        if {$ve
b060: 72 62 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20  rbose} then {.. 
b070: 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
b080: 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
b090: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
b0a0: 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
b0b0: 2d 20 73 6b 69 70 70 65 64 20 63 6f 70 79 69 6e  - skipped copyin
b0c0: 67 20 65 78 74 65 72 6e 61 6c 20 66 69 6c 65 20  g external file 
b0d0: 5c 22 22 20 24 73 6f 75 72 63 65 46 69 6c 65 4e  \"" $sourceFileN
b0e0: 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ame \..         
b0f0: 20 20 20 20 20 22 5c 22 2c 20 69 74 20 64 6f 65       "\", it doe
b100: 73 20 6e 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d  s not exist\n"].
b110: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
b120: 20 20 20 20 72 65 74 75 72 6e 0d 0a 20 20 20 20      return..    
b130: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20    }....      if 
b140: 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
b150: 24 6e 65 77 46 69 6c 65 4e 61 6d 65 5d 20 3e 20  $newFileName] > 
b160: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
b170: 20 20 20 73 65 74 20 74 61 72 67 65 74 46 69 6c     set targetFil
b180: 65 4e 61 6d 65 20 5b 67 65 74 42 69 6e 61 72 79  eName [getBinary
b190: 46 69 6c 65 4e 61 6d 65 20 24 6e 65 77 46 69 6c  FileName $newFil
b1a0: 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 5d  eName $platform]
b1b0: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
b1c0: 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 74 61  ..        set ta
b1d0: 72 67 65 74 46 69 6c 65 4e 61 6d 65 20 5b 67 65  rgetFileName [ge
b1e0: 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20  tBinaryFileName 
b1f0: 24 66 69 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66  $fileName $platf
b200: 6f 72 6d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  orm]..      }...
b210: 0a 20 20 20 20 20 20 73 65 74 20 74 61 72 67 65  .      set targe
b220: 74 44 69 72 65 63 74 6f 72 79 20 5b 66 69 6c 65  tDirectory [file
b230: 20 64 69 72 6e 61 6d 65 20 24 74 61 72 67 65 74   dirname $target
b240: 46 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20  FileName]....   
b250: 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d     if {[catch {.
b260: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 66  .        if {![f
b270: 69 6c 65 20 65 78 69 73 74 73 20 24 74 61 72 67  ile exists $targ
b280: 65 74 44 69 72 65 63 74 6f 72 79 5d 7d 20 74 68  etDirectory]} th
b290: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
b2a0: 66 69 6c 65 20 6d 6b 64 69 72 20 24 74 61 72 67  file mkdir $targ
b2b0: 65 74 44 69 72 65 63 74 6f 72 79 0d 0a 20 20 20  etDirectory..   
b2c0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
b2d0: 66 69 6c 65 20 63 6f 70 79 20 2d 66 6f 72 63 65  file copy -force
b2e0: 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65   $sourceFileName
b2f0: 20 24 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65   $targetFileName
b300: 0d 0a 20 20 20 20 20 20 7d 5d 20 3d 3d 20 30 7d  ..      }] == 0}
b310: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
b320: 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
b330: 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
b340: 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
b350: 20 20 22 2d 2d 2d 2d 20 63 6f 70 69 65 64 20 65    "---- copied e
b360: 78 74 65 72 6e 61 6c 20 66 69 6c 65 20 66 72 6f  xternal file fro
b370: 6d 20 5c 22 22 20 24 73 6f 75 72 63 65 46 69 6c  m \"" $sourceFil
b380: 65 4e 61 6d 65 20 22 5c 22 20 74 6f 20 5c 22 22  eName "\" to \""
b390: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
b3a0: 24 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 20  $targetFileName 
b3b0: 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 20 65  \"\n]..      } e
b3c0: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74  lse {..        t
b3d0: 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
b3e0: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
b3f0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
b400: 22 2d 2d 2d 2d 20 66 61 69 6c 65 64 20 74 6f 20  "---- failed to 
b410: 63 6f 70 79 20 65 78 74 65 72 6e 61 6c 20 66 69  copy external fi
b420: 6c 65 20 66 72 6f 6d 20 5c 22 22 20 24 73 6f 75  le from \"" $sou
b430: 72 63 65 46 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20  rceFileName \.. 
b440: 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 20 74             "\" t
b450: 6f 20 5c 22 22 20 24 74 61 72 67 65 74 46 69 6c  o \"" $targetFil
b460: 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20  eName \"\n]..   
b470: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
b480: 20 20 20 20 70 72 6f 63 20 74 72 79 43 6f 70 79      proc tryCopy
b490: 42 69 6e 61 72 79 46 69 6c 65 20 7b 0d 0a 20 20  BinaryFile {..  
b4a0: 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 4e 61            fileNa
b4b0: 6d 65 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d  me {platform ""}
b4c0: 20 7b 6e 65 77 46 69 6c 65 4e 61 6d 65 20 22 22   {newFileName ""
b4d0: 7d 20 7b 76 65 72 62 6f 73 65 20 66 61 6c 73 65  } {verbose false
b4e0: 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74  } } {..      set
b4f0: 20 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20   sourceFileName 
b500: 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61  [getBinaryFileNa
b510: 6d 65 20 24 66 69 6c 65 4e 61 6d 65 20 24 70 6c  me $fileName $pl
b520: 61 74 66 6f 72 6d 5d 0d 0a 0d 0a 20 20 20 20 20  atform]....     
b530: 20 69 66 20 7b 21 5b 66 69 6c 65 20 65 78 69 73   if {![file exis
b540: 74 73 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61  ts $sourceFileNa
b550: 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  me]} then {..   
b560: 20 20 20 20 20 69 66 20 7b 24 76 65 72 62 6f 73       if {$verbos
b570: 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  e} then {..     
b580: 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
b590: 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
b5a0: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
b5b0: 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6b          "---- sk
b5c0: 69 70 70 65 64 20 63 6f 70 79 69 6e 67 20 62 69  ipped copying bi
b5d0: 6e 61 72 79 20 66 69 6c 65 20 5c 22 22 20 24 73  nary file \"" $s
b5e0: 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 5c 0d  ourceFileName \.
b5f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
b600: 5c 22 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20  \", it does not 
b610: 65 78 69 73 74 5c 6e 22 5d 0d 0a 20 20 20 20 20  exist\n"]..     
b620: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 72 65     }..        re
b630: 74 75 72 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  turn..      }...
b640: 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69  .      if {[stri
b650: 6e 67 20 6c 65 6e 67 74 68 20 24 6e 65 77 46 69  ng length $newFi
b660: 6c 65 4e 61 6d 65 5d 20 3e 20 30 7d 20 74 68 65  leName] > 0} the
b670: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74  n {..        set
b680: 20 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 20   targetFileName 
b690: 5b 67 65 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d  [getBuildFileNam
b6a0: 65 20 24 6e 65 77 46 69 6c 65 4e 61 6d 65 20 24  e $newFileName $
b6b0: 70 6c 61 74 66 6f 72 6d 5d 0d 0a 20 20 20 20 20  platform]..     
b6c0: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
b6d0: 20 20 20 73 65 74 20 74 61 72 67 65 74 46 69 6c     set targetFil
b6e0: 65 4e 61 6d 65 20 5b 67 65 74 42 75 69 6c 64 46  eName [getBuildF
b6f0: 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d  ileName $fileNam
b700: 65 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a 20 20  e $platform]..  
b710: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 73      }....      s
b720: 65 74 20 74 61 72 67 65 74 44 69 72 65 63 74 6f  et targetDirecto
b730: 72 79 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65  ry [file dirname
b740: 20 24 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65   $targetFileName
b750: 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  ]....      if {[
b760: 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
b770: 20 69 66 20 7b 21 5b 66 69 6c 65 20 65 78 69 73   if {![file exis
b780: 74 73 20 24 74 61 72 67 65 74 44 69 72 65 63 74  ts $targetDirect
b790: 6f 72 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ory]} then {..  
b7a0: 20 20 20 20 20 20 20 20 66 69 6c 65 20 6d 6b 64          file mkd
b7b0: 69 72 20 24 74 61 72 67 65 74 44 69 72 65 63 74  ir $targetDirect
b7c0: 6f 72 79 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  ory..        }..
b7d0: 20 20 20 20 20 20 20 20 66 69 6c 65 20 63 6f 70          file cop
b7e0: 79 20 2d 66 6f 72 63 65 20 24 73 6f 75 72 63 65  y -force $source
b7f0: 46 69 6c 65 4e 61 6d 65 20 24 74 61 72 67 65 74  FileName $target
b800: 46 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20  FileName..      
b810: 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  }] == 0} then {.
b820: 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
b830: 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
b840: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
b850: 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
b860: 63 6f 70 69 65 64 20 62 69 6e 61 72 79 20 66 69  copied binary fi
b870: 6c 65 20 66 72 6f 6d 20 5c 22 22 20 24 73 6f 75  le from \"" $sou
b880: 72 63 65 46 69 6c 65 4e 61 6d 65 20 22 5c 22 20  rceFileName "\" 
b890: 74 6f 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20  to \"" \..      
b8a0: 20 20 20 20 20 20 24 74 61 72 67 65 74 46 69 6c        $targetFil
b8b0: 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20  eName \"\n]..   
b8c0: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
b8d0: 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
b8e0: 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
b8f0: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
b900: 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 61 69 6c        "---- fail
b910: 65 64 20 74 6f 20 63 6f 70 79 20 62 69 6e 61 72  ed to copy binar
b920: 79 20 66 69 6c 65 20 66 72 6f 6d 20 5c 22 22 20  y file from \"" 
b930: 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20  $sourceFileName 
b940: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  \..            "
b950: 5c 22 20 74 6f 20 5c 22 22 20 24 74 61 72 67 65  \" to \"" $targe
b960: 74 46 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d  tFileName \"\n].
b970: 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
b980: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 74 72 79  ....    proc try
b990: 43 6f 70 79 42 75 69 6c 64 46 69 6c 65 20 7b 0d  CopyBuildFile {.
b9a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c  .            fil
b9b0: 65 4e 61 6d 65 20 7b 70 6c 61 74 66 6f 72 6d 20  eName {platform 
b9c0: 22 22 7d 20 7b 6e 65 77 46 69 6c 65 4e 61 6d 65  ""} {newFileName
b9d0: 20 22 22 7d 20 7b 76 65 72 62 6f 73 65 20 66 61   ""} {verbose fa
b9e0: 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20  lse} } {..      
b9f0: 73 65 74 20 73 6f 75 72 63 65 46 69 6c 65 4e 61  set sourceFileNa
ba00: 6d 65 20 5b 67 65 74 42 75 69 6c 64 46 69 6c 65  me [getBuildFile
ba10: 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 20 24  Name $fileName $
ba20: 70 6c 61 74 66 6f 72 6d 5d 0d 0a 0d 0a 20 20 20  platform]....   
ba30: 20 20 20 69 66 20 7b 21 5b 66 69 6c 65 20 65 78     if {![file ex
ba40: 69 73 74 73 20 24 73 6f 75 72 63 65 46 69 6c 65  ists $sourceFile
ba50: 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  Name]} then {.. 
ba60: 20 20 20 20 20 20 20 69 66 20 7b 24 76 65 72 62         if {$verb
ba70: 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ose} then {..   
ba80: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
ba90: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
baa0: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
bab0: 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
bac0: 73 6b 69 70 70 65 64 20 63 6f 70 79 69 6e 67 20  skipped copying 
bad0: 62 75 69 6c 64 20 66 69 6c 65 20 5c 22 22 20 24  build file \"" $
bae0: 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 5c  sourceFileName \
baf0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
bb00: 22 5c 22 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74  "\", it does not
bb10: 20 65 78 69 73 74 5c 6e 22 5d 0d 0a 20 20 20 20   exist\n"]..    
bb20: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 72      }..        r
bb30: 65 74 75 72 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a  eturn..      }..
bb40: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72  ..      if {[str
bb50: 69 6e 67 20 6c 65 6e 67 74 68 20 24 6e 65 77 46  ing length $newF
bb60: 69 6c 65 4e 61 6d 65 5d 20 3e 20 30 7d 20 74 68  ileName] > 0} th
bb70: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65  en {..        se
bb80: 74 20 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65  t targetFileName
bb90: 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e   [getBinaryFileN
bba0: 61 6d 65 20 24 6e 65 77 46 69 6c 65 4e 61 6d 65  ame $newFileName
bbb0: 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a 20 20 20   $platform]..   
bbc0: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
bbd0: 20 20 20 20 20 73 65 74 20 74 61 72 67 65 74 46       set targetF
bbe0: 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42 69 6e 61  ileName [getBina
bbf0: 72 79 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65  ryFileName $file
bc00: 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 5d 0d  Name $platform].
bc10: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
bc20: 20 20 73 65 74 20 74 61 72 67 65 74 44 69 72 65    set targetDire
bc30: 63 74 6f 72 79 20 5b 66 69 6c 65 20 64 69 72 6e  ctory [file dirn
bc40: 61 6d 65 20 24 74 61 72 67 65 74 46 69 6c 65 4e  ame $targetFileN
bc50: 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66  ame]....      if
bc60: 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
bc70: 20 20 20 20 69 66 20 7b 21 5b 66 69 6c 65 20 65      if {![file e
bc80: 78 69 73 74 73 20 24 74 61 72 67 65 74 44 69 72  xists $targetDir
bc90: 65 63 74 6f 72 79 5d 7d 20 74 68 65 6e 20 7b 0d  ectory]} then {.
bca0: 0a 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20  .          file 
bcb0: 6d 6b 64 69 72 20 24 74 61 72 67 65 74 44 69 72  mkdir $targetDir
bcc0: 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 20 20  ectory..        
bcd0: 7d 0d 0a 20 20 20 20 20 20 20 20 66 69 6c 65 20  }..        file 
bce0: 63 6f 70 79 20 2d 66 6f 72 63 65 20 24 73 6f 75  copy -force $sou
bcf0: 72 63 65 46 69 6c 65 4e 61 6d 65 20 24 74 61 72  rceFileName $tar
bd00: 67 65 74 46 69 6c 65 4e 61 6d 65 0d 0a 20 20 20  getFileName..   
bd10: 20 20 20 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e     }] == 0} then
bd20: 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   {..        tput
bd30: 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
bd40: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
bd50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d  .            "--
bd60: 2d 2d 20 63 6f 70 69 65 64 20 62 75 69 6c 64 20  -- copied build 
bd70: 66 69 6c 65 20 66 72 6f 6d 20 5c 22 22 20 24 73  file from \"" $s
bd80: 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 22 5c  ourceFileName "\
bd90: 22 20 74 6f 20 5c 22 22 20 5c 0d 0a 20 20 20 20  " to \"" \..    
bda0: 20 20 20 20 20 20 20 20 24 74 61 72 67 65 74 46          $targetF
bdb0: 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20  ileName \"\n].. 
bdc0: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
bdd0: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
bde0: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
bdf0: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
be00: 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 61          "---- fa
be10: 69 6c 65 64 20 74 6f 20 63 6f 70 79 20 62 75 69  iled to copy bui
be20: 6c 64 20 66 69 6c 65 20 66 72 6f 6d 20 5c 22 22  ld file from \""
be30: 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65   $sourceFileName
be40: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
be50: 22 5c 22 20 74 6f 20 5c 22 22 20 24 74 61 72 67  "\" to \"" $targ
be60: 65 74 46 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d  etFileName \"\n]
be70: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
be80: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 74 72  .....    proc tr
be90: 79 44 65 6c 65 74 65 42 69 6e 61 72 79 46 69 6c  yDeleteBinaryFil
bea0: 65 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7b 70 6c  e { fileName {pl
beb0: 61 74 66 6f 72 6d 20 22 22 7d 20 7b 76 65 72 62  atform ""} {verb
bec0: 6f 73 65 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a  ose false} } {..
bed0: 20 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61        set fileNa
bee0: 6d 65 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c  me [getBinaryFil
bef0: 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 20  eName $fileName 
bf00: 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a 0d 0a 20 20  $platform]....  
bf10: 20 20 20 20 69 66 20 7b 21 5b 66 69 6c 65 20 65      if {![file e
bf20: 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d  xists $fileName]
bf30: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
bf40: 20 20 69 66 20 7b 24 76 65 72 62 6f 73 65 7d 20    if {$verbose} 
bf50: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
bf60: 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
bf70: 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
bf80: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
bf90: 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6b 69 70 70       "---- skipp
bfa0: 65 64 20 64 65 6c 65 74 69 6e 67 20 62 69 6e 61  ed deleting bina
bfb0: 72 79 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c  ry file \"" $fil
bfc0: 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20  eName \..       
bfd0: 20 20 20 20 20 20 20 22 5c 22 2c 20 69 74 20 64         "\", it d
bfe0: 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 5c 6e 22  oes not exist\n"
bff0: 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  ]..        }..  
c000: 20 20 20 20 20 20 72 65 74 75 72 6e 0d 0a 20 20        return..  
c010: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69      }....      i
c020: 66 20 7b 5b 63 61 74 63 68 20 7b 66 69 6c 65 20  f {[catch {file 
c030: 64 65 6c 65 74 65 20 24 66 69 6c 65 4e 61 6d 65  delete $fileName
c040: 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  }] == 0} then {.
c050: 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
c060: 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
c070: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
c080: 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
c090: 64 65 6c 65 74 65 64 20 62 69 6e 61 72 79 20 66  deleted binary f
c0a0: 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d  ile \"" $fileNam
c0b0: 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d  e \"\n]..      }
c0c0: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
c0d0: 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
c0e0: 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
c0f0: 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
c100: 20 20 22 2d 2d 2d 2d 20 66 61 69 6c 65 64 20 74    "---- failed t
c110: 6f 20 64 65 6c 65 74 65 20 62 69 6e 61 72 79 20  o delete binary 
c120: 66 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e 61  file \"" $fileNa
c130: 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20  me \"\n]..      
c140: 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
c150: 20 70 72 6f 63 20 74 72 79 44 65 6c 65 74 65 42   proc tryDeleteB
c160: 75 69 6c 64 46 69 6c 65 20 7b 20 66 69 6c 65 4e  uildFile { fileN
c170: 61 6d 65 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22  ame {platform ""
c180: 7d 20 7b 76 65 72 62 6f 73 65 20 66 61 6c 73 65  } {verbose false
c190: 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74  } } {..      set
c1a0: 20 66 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42 75   fileName [getBu
c1b0: 69 6c 64 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c  ildFileName $fil
c1c0: 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 5d  eName $platform]
c1d0: 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b  ....      if {![
c1e0: 66 69 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c  file exists $fil
c1f0: 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a  eName]} then {..
c200: 20 20 20 20 20 20 20 20 69 66 20 7b 24 76 65 72          if {$ver
c210: 62 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  bose} then {..  
c220: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
c230: 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
c240: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
c250: 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
c260: 20 73 6b 69 70 70 65 64 20 64 65 6c 65 74 69 6e   skipped deletin
c270: 67 20 62 75 69 6c 64 20 66 69 6c 65 20 5c 22 22  g build file \""
c280: 20 24 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20   $fileName \..  
c290: 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c              "\",
c2a0: 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69   it does not exi
c2b0: 73 74 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20  st\n"]..        
c2c0: 7d 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  }..        retur
c2d0: 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  n..      }....  
c2e0: 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
c2f0: 66 69 6c 65 20 64 65 6c 65 74 65 20 24 66 69 6c  file delete $fil
c300: 65 4e 61 6d 65 7d 5d 20 3d 3d 20 30 7d 20 74 68  eName}] == 0} th
c310: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70  en {..        tp
c320: 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
c330: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
c340: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  \..            "
c350: 2d 2d 2d 2d 20 64 65 6c 65 74 65 64 20 62 75 69  ---- deleted bui
c360: 6c 64 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c  ld file \"" $fil
c370: 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20  eName \"\n]..   
c380: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
c390: 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
c3a0: 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
c3b0: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
c3c0: 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 61 69 6c        "---- fail
c3d0: 65 64 20 74 6f 20 64 65 6c 65 74 65 20 62 75 69  ed to delete bui
c3e0: 6c 64 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c  ld file \"" $fil
c3f0: 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20  eName \"\n]..   
c400: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
c410: 20 20 20 20 70 72 6f 63 20 74 72 79 43 6f 70 79      proc tryCopy
c420: 41 73 73 65 6d 62 6c 79 20 7b 0d 0a 20 20 20 20  Assembly {..    
c430: 20 20 20 20 20 20 20 20 66 69 6c 65 4e 61 6d 65          fileName
c440: 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20 7b   {platform ""} {
c450: 70 64 62 20 74 72 75 65 7d 20 7b 76 65 72 62 6f  pdb true} {verbo
c460: 73 65 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20  se false} } {.. 
c470: 20 20 20 20 20 74 72 79 43 6f 70 79 42 75 69 6c       tryCopyBuil
c480: 64 46 69 6c 65 20 24 66 69 6c 65 4e 61 6d 65 20  dFile $fileName 
c490: 24 70 6c 61 74 66 6f 72 6d 20 22 22 20 24 76 65  $platform "" $ve
c4a0: 72 62 6f 73 65 0d 0a 0d 0a 20 20 20 20 20 20 69  rbose....      i
c4b0: 66 20 7b 24 70 64 62 7d 20 74 68 65 6e 20 7b 0d  f {$pdb} then {.
c4c0: 0a 20 20 20 20 20 20 20 20 74 72 79 43 6f 70 79  .        tryCopy
c4d0: 42 75 69 6c 64 46 69 6c 65 20 5b 61 70 70 65 6e  BuildFile [appen
c4e0: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
c4f0: 20 20 20 20 20 5b 66 69 6c 65 20 72 6f 6f 74 6e       [file rootn
c500: 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 5d 20 2e  ame $fileName] .
c510: 70 64 62 5d 20 24 70 6c 61 74 66 6f 72 6d 20 22  pdb] $platform "
c520: 22 20 24 76 65 72 62 6f 73 65 0d 0a 20 20 20 20  " $verbose..    
c530: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
c540: 20 20 20 70 72 6f 63 20 74 72 79 44 65 6c 65 74     proc tryDelet
c550: 65 41 73 73 65 6d 62 6c 79 20 7b 0d 0a 20 20 20  eAssembly {..   
c560: 20 20 20 20 20 20 20 20 20 66 69 6c 65 4e 61 6d           fileNam
c570: 65 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20  e {platform ""} 
c580: 7b 70 64 62 20 74 72 75 65 7d 20 7b 76 65 72 62  {pdb true} {verb
c590: 6f 73 65 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a  ose false} } {..
c5a0: 20 20 20 20 20 20 74 72 79 44 65 6c 65 74 65 42        tryDeleteB
c5b0: 69 6e 61 72 79 46 69 6c 65 20 24 66 69 6c 65 4e  inaryFile $fileN
c5c0: 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 20 24 76  ame $platform $v
c5d0: 65 72 62 6f 73 65 0d 0a 0d 0a 20 20 20 20 20 20  erbose....      
c5e0: 69 66 20 7b 24 70 64 62 7d 20 74 68 65 6e 20 7b  if {$pdb} then {
c5f0: 0d 0a 20 20 20 20 20 20 20 20 74 72 79 44 65 6c  ..        tryDel
c600: 65 74 65 42 69 6e 61 72 79 46 69 6c 65 20 5b 61  eteBinaryFile [a
c610: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
c620: 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 72           [file r
c630: 6f 6f 74 6e 61 6d 65 20 24 66 69 6c 65 4e 61 6d  ootname $fileNam
c640: 65 5d 20 2e 70 64 62 5d 20 24 70 6c 61 74 66 6f  e] .pdb] $platfo
c650: 72 6d 20 24 76 65 72 62 6f 73 65 0d 0a 20 20 20  rm $verbose..   
c660: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
c670: 20 20 20 20 70 72 6f 63 20 74 72 79 4c 6f 61 64      proc tryLoad
c680: 41 73 73 65 6d 62 6c 79 20 7b 20 66 69 6c 65 4e  Assembly { fileN
c690: 61 6d 65 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22  ame {platform ""
c6a0: 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74  } } {..      set
c6b0: 20 66 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42 69   fileName [getBi
c6c0: 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 24 66 69  naryFileName $fi
c6d0: 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d  leName $platform
c6e0: 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  ]....      if {[
c6f0: 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
c700: 20 73 65 74 20 61 73 73 65 6d 62 6c 79 20 5b 6f   set assembly [o
c710: 62 6a 65 63 74 20 6c 6f 61 64 20 2d 6c 6f 61 64  bject load -load
c720: 74 79 70 65 20 46 69 6c 65 20 2d 61 6c 69 61 73  type File -alias
c730: 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20   $fileName]..   
c740: 20 20 20 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e     }] == 0} then
c750: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
c760: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e         # NOTE: N
c770: 6f 77 2c 20 61 64 64 20 74 68 65 20 6e 65 63 65  ow, add the nece
c780: 73 73 61 72 79 20 74 65 73 74 20 63 6f 6e 73 74  ssary test const
c790: 72 61 69 6e 74 2e 0d 0a 20 20 20 20 20 20 20 20  raint...        
c7a0: 23 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f  #..        addCo
c7b0: 6e 73 74 72 61 69 6e 74 20 5b 66 69 6c 65 20 72  nstraint [file r
c7c0: 6f 6f 74 6e 61 6d 65 20 5b 66 69 6c 65 20 74 61  ootname [file ta
c7d0: 69 6c 20 24 66 69 6c 65 4e 61 6d 65 5d 5d 0d 0a  il $fileName]]..
c7e0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
c7f0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 47 72 61       # NOTE: Gra
c800: 62 20 74 68 65 20 69 6d 61 67 65 20 72 75 6e 74  b the image runt
c810: 69 6d 65 20 76 65 72 73 69 6f 6e 20 66 72 6f 6d  ime version from
c820: 20 74 68 65 20 61 73 73 65 6d 62 6c 79 20 62 65   the assembly be
c830: 63 61 75 73 65 0d 0a 20 20 20 20 20 20 20 20 23  cause..        #
c840: 20 20 20 20 20 20 20 73 65 76 65 72 61 6c 20 74         several t
c850: 65 73 74 73 20 72 65 6c 79 20 6f 6e 20 69 74 20  ests rely on it 
c860: 68 61 76 69 6e 67 20 61 20 63 65 72 74 61 69 6e  having a certain
c870: 20 76 61 6c 75 65 2e 0d 0a 20 20 20 20 20 20 20   value...       
c880: 20 23 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43   #..        addC
c890: 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e  onstraint [appen
c8a0: 64 41 72 67 73 20 5b 66 69 6c 65 20 74 61 69 6c  dArgs [file tail
c8b0: 20 24 66 69 6c 65 4e 61 6d 65 5d 20 5f 20 5c 0d   $fileName] _ \.
c8c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 24 61  .            [$a
c8d0: 73 73 65 6d 62 6c 79 20 49 6d 61 67 65 52 75 6e  ssembly ImageRun
c8e0: 74 69 6d 65 56 65 72 73 69 6f 6e 5d 5d 0d 0a 0d  timeVersion]]...
c8f0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
c900: 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 74 75      # NOTE: Retu
c910: 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68  rn the full path
c920: 20 6f 66 20 74 68 65 20 6c 6f 61 64 65 64 20 66   of the loaded f
c930: 69 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ile...        #.
c940: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
c950: 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20  $fileName..     
c960: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75   }....      retu
c970: 72 6e 20 22 22 0d 0a 20 20 20 20 7d 0d 0a 0c 0d  rn ""..    }....
c980: 0a 20 20 20 20 70 72 6f 63 20 69 73 53 51 4c 69  .    proc isSQLi
c990: 74 65 52 65 61 64 79 20 7b 7d 20 7b 0d 0a 20 20  teReady {} {..  
c9a0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
c9b0: 4f 54 45 3a 20 54 68 69 73 20 70 72 6f 63 65 64  OTE: This proced
c9c0: 75 72 65 20 6d 75 73 74 20 72 65 74 75 72 6e 20  ure must return 
c9d0: 6e 6f 6e 2d 7a 65 72 6f 20 6f 6e 6c 79 20 69 66  non-zero only if
c9e0: 20 74 68 65 20 53 51 4c 69 74 65 20 6e 61 74 69   the SQLite nati
c9f0: 76 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ve..      #     
ca00: 20 20 6c 69 62 72 61 72 79 20 61 6e 64 20 74 68    library and th
ca10: 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  e System.Data.SQ
ca20: 4c 69 74 65 20 6d 61 6e 61 67 65 64 20 61 73 73  Lite managed ass
ca30: 65 6d 62 6c 79 20 61 72 65 20 6c 6f 61 64 65 64  embly are loaded
ca40: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
ca50: 61 6e 64 20 72 65 61 64 79 20 66 6f 72 20 75 73  and ready for us
ca60: 65 20 62 79 20 74 68 65 20 74 65 73 74 20 73 75  e by the test su
ca70: 69 74 65 2e 20 20 43 75 72 72 65 6e 74 6c 79 2c  ite.  Currently,
ca80: 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 0d   this procedure.
ca90: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73  .      #       s
caa0: 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20  hould be called 
cab0: 6f 6e 6c 79 20 61 66 74 65 72 20 74 68 65 20 5b  only after the [
cac0: 74 72 79 4c 6f 61 64 41 73 73 65 6d 62 6c 79 5d  tryLoadAssembly]
cad0: 20 70 72 6f 63 65 64 75 72 65 20 68 61 73 0d 0a   procedure has..
cae0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62 65        #       be
caf0: 65 6e 20 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f  en called to pro
cb00: 62 65 20 66 6f 72 20 74 68 65 20 53 79 73 74 65  be for the Syste
cb10: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 6d 61  m.Data.SQLite ma
cb20: 6e 61 67 65 64 20 61 73 73 65 6d 62 6c 79 0d 0a  naged assembly..
cb30: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61 6e        #       an
cb40: 64 20 74 68 65 20 5b 63 68 65 63 6b 46 6f 72 53  d the [checkForS
cb50: 51 4c 69 74 65 5d 20 70 72 6f 63 65 64 75 72 65  QLite] procedure
cb60: 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64   has been called
cb70: 20 74 6f 20 70 72 6f 62 65 20 66 6f 72 0d 0a 20   to probe for.. 
cb80: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
cb90: 20 53 51 4c 69 74 65 20 6e 61 74 69 76 65 20 6c   SQLite native l
cba0: 69 62 72 61 72 79 3b 20 6f 74 68 65 72 77 69 73  ibrary; otherwis
cbb0: 65 2c 20 74 68 69 73 20 70 72 6f 63 65 64 75 72  e, this procedur
cbc0: 65 20 77 69 6c 6c 20 73 69 6d 70 6c 79 0d 0a 20  e will simply.. 
cbd0: 20 20 20 20 20 23 20 20 20 20 20 20 20 61 6c 77       #       alw
cbe0: 61 79 73 20 72 65 74 75 72 6e 20 7a 65 72 6f 2e  ays return zero.
cbf0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
cc00: 20 72 65 74 75 72 6e 20 5b 65 78 70 72 20 7b 0d   return [expr {.
cc10: 0a 20 20 20 20 20 20 20 20 5b 68 61 76 65 43 6f  .        [haveCo
cc20: 6e 73 74 72 61 69 6e 74 20 53 79 73 74 65 6d 2e  nstraint System.
cc30: 44 61 74 61 2e 53 51 4c 69 74 65 5d 20 26 26 20  Data.SQLite] && 
cc40: 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20  [haveConstraint 
cc50: 53 51 4c 69 74 65 5d 0d 0a 20 20 20 20 20 20 7d  SQLite]..      }
cc60: 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  ]..    }.....   
cc70: 20 70 72 6f 63 20 6d 61 74 63 68 50 6c 61 74 66   proc matchPlatf
cc80: 6f 72 6d 20 7b 20 70 6c 61 74 66 6f 72 6d 20 7d  orm { platform }
cc90: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
cca0: 20 20 20 23 20 4e 4f 54 45 3a 20 41 6e 20 65 6d     # NOTE: An em
ccb0: 70 74 79 20 73 74 72 69 6e 67 20 66 6f 72 20 74  pty string for t
ccc0: 68 65 20 70 6c 61 74 66 6f 72 6d 20 6d 65 61 6e  he platform mean
ccd0: 73 20 74 68 61 74 20 74 68 65 20 62 75 69 6c 64  s that the build
cce0: 20 69 73 20 6e 6f 74 0d 0a 20 20 20 20 20 20 23   is not..      #
ccf0: 20 20 20 20 20 20 20 5b 70 72 69 6d 61 72 69 6c         [primaril
cd00: 79 5d 20 61 20 6e 61 74 69 76 65 20 62 75 69 6c  y] a native buil
cd10: 64 3b 20 74 68 65 72 65 66 6f 72 65 2c 20 69 74  d; therefore, it
cd20: 20 61 6c 77 61 79 73 20 6d 61 74 63 68 65 73 2e   always matches.
cd30: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
cd40: 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
cd50: 67 74 68 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3d  gth $platform] =
cd60: 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
cd70: 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65       return true
cd80: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
cd90: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
cda0: 54 45 3a 20 44 6f 65 73 20 74 68 65 20 73 70 65  TE: Does the spe
cdb0: 63 69 66 69 65 64 20 70 6c 61 74 66 6f 72 6d 20  cified platform 
cdc0: 6d 61 74 63 68 20 75 70 20 74 6f 20 74 68 65 20  match up to the 
cdd0: 63 75 72 72 65 6e 74 20 70 72 6f 63 65 73 73 3f  current process?
cde0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
cdf0: 20 69 66 20 7b 24 70 6c 61 74 66 6f 72 6d 20 65   if {$platform e
ce00: 71 20 5b 6d 61 63 68 69 6e 65 54 6f 50 6c 61 74  q [machineToPlat
ce10: 66 6f 72 6d 20 24 3a 3a 74 63 6c 5f 70 6c 61 74  form $::tcl_plat
ce20: 66 6f 72 6d 28 6d 61 63 68 69 6e 65 29 5d 7d 20  form(machine)]} 
ce30: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
ce40: 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20  return true..   
ce50: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
ce60: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54  .      # NOTE: T
ce70: 68 65 20 73 70 65 63 69 66 69 65 64 20 70 6c 61  he specified pla
ce80: 74 66 6f 72 6d 20 64 6f 65 73 20 6e 6f 74 20 6d  tform does not m
ce90: 61 74 63 68 20 75 70 20 77 69 74 68 20 74 68 65  atch up with the
cea0: 20 70 6c 61 74 66 6f 72 6d 0d 0a 20 20 20 20 20   platform..     
ceb0: 20 23 20 20 20 20 20 20 20 66 6f 72 20 74 68 65   #       for the
cec0: 20 63 75 72 72 65 6e 74 20 70 72 6f 63 65 73 73   current process
ced0: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
cee0: 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a    return false..
cef0: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
cf00: 6f 63 20 68 61 76 65 53 51 4c 69 74 65 4f 62 6a  oc haveSQLiteObj
cf10: 65 63 74 43 6f 6d 6d 61 6e 64 20 7b 7d 20 7b 0d  ectCommand {} {.
cf20: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
cf30: 23 20 4e 4f 54 45 3a 20 49 73 20 74 68 65 20 5b  # NOTE: Is the [
cf40: 6f 62 6a 65 63 74 5d 20 63 6f 6d 6d 61 6e 64 20  object] command 
cf50: 63 75 72 72 65 6e 74 6c 79 20 61 76 61 69 6c 61  currently availa
cf60: 62 6c 65 3f 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ble?..      #.. 
cf70: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 65 78 70       return [exp
cf80: 72 20 7b 5b 6c 6c 65 6e 67 74 68 20 5b 69 6e 66  r {[llength [inf
cf90: 6f 20 63 6f 6d 6d 61 6e 64 73 20 6f 62 6a 65 63  o commands objec
cfa0: 74 5d 5d 20 3e 20 30 7d 5d 0d 0a 20 20 20 20 7d  t]] > 0}]..    }
cfb0: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 68  .....    proc ch
cfc0: 65 63 6b 46 6f 72 53 51 4c 69 74 65 4f 62 6a 65  eckForSQLiteObje
cfd0: 63 74 43 6f 6d 6d 61 6e 64 20 7b 20 63 68 61 6e  ctCommand { chan
cfe0: 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74  nel } {..      t
cff0: 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d  puts $channel "-
d000: 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72  --- checking for
d010: 20 5c 22 6f 62 6a 65 63 74 5c 22 20 63 6f 6d 6d   \"object\" comm
d020: 61 6e 64 20 75 73 61 67 65 2e 2e 2e 20 22 0d 0a  and usage... "..
d030: 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e  ..      if {![in
d040: 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 73  fo exists ::no(s
d050: 71 6c 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61  qliteObjectComma
d060: 6e 64 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  nd)] && \..     
d070: 20 20 20 20 20 5b 68 61 76 65 53 51 4c 69 74 65       [haveSQLite
d080: 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20  ObjectCommand]} 
d090: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
d0a0: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 79  tputs $channel y
d0b0: 65 73 5c 6e 0d 0a 20 20 20 20 20 20 7d 20 65 6c  es\n..      } el
d0c0: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  se {..        #.
d0d0: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
d0e0: 20 55 6e 6c 65 73 73 20 77 65 20 61 72 65 20 66   Unless we are f
d0f0: 6f 72 62 69 64 64 65 6e 20 66 72 6f 6d 20 64 6f  orbidden from do
d100: 69 6e 67 20 73 6f 2c 20 61 64 64 20 73 6f 6d 65  ing so, add some
d110: 20 63 6f 6e 73 74 72 61 69 6e 74 73 0d 0a 20 20   constraints..  
d120: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68        #       th
d130: 61 74 20 77 69 6c 6c 20 61 6c 6c 6f 77 20 6d 6f  at will allow mo
d140: 73 74 20 6f 66 20 74 68 65 20 74 65 73 74 20 73  st of the test s
d150: 75 69 74 65 20 74 6f 20 72 75 6e 20 28 69 2e 65  uite to run (i.e
d160: 2e 20 74 68 6f 73 65 0d 0a 20 20 20 20 20 20 20  . those..       
d170: 20 23 20 20 20 20 20 20 20 74 65 73 74 73 20 74   #       tests t
d180: 68 61 74 20 64 6f 20 6e 6f 74 20 64 69 72 65 63  hat do not direc
d190: 74 6c 79 20 72 65 6c 79 20 75 70 6f 6e 20 74 68  tly rely upon th
d1a0: 65 20 5b 6f 62 6a 65 63 74 5d 20 63 6f 6d 6d 61  e [object] comma
d1b0: 6e 64 29 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  nd)...        #.
d1c0: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69  .        if {![i
d1d0: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
d1e0: 73 68 69 6d 53 51 4c 69 74 65 41 73 73 65 6d 62  shimSQLiteAssemb
d1f0: 6c 79 43 6f 6e 73 74 72 61 69 6e 74 73 29 5d 7d  lyConstraints)]}
d200: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
d210: 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74     addConstraint
d220: 20 53 51 4c 69 74 65 0d 0a 20 20 20 20 20 20 20   SQLite..       
d230: 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74     addConstraint
d240: 20 53 51 4c 69 74 65 49 6e 74 65 72 6f 70 0d 0a   SQLiteInterop..
d250: 20 20 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e            addCon
d260: 73 74 72 61 69 6e 74 20 53 79 73 74 65 6d 2e 44  straint System.D
d270: 61 74 61 2e 53 51 4c 69 74 65 0d 0a 20 20 20 20  ata.SQLite..    
d280: 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61        addConstra
d290: 69 6e 74 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  int System.Data.
d2a0: 53 51 4c 69 74 65 2e 45 6e 63 72 79 70 74 69 6f  SQLite.Encryptio
d2b0: 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 61 64 64  n..          add
d2c0: 43 6f 6e 73 74 72 61 69 6e 74 20 53 79 73 74 65  Constraint Syste
d2d0: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 4c 69  m.Data.SQLite.Li
d2e0: 6e 71 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  nq....          
d2f0: 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61  addConstraint [a
d300: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
d310: 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65             Syste
d320: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c  m.Data.SQLite.dl
d330: 6c 5f 76 20 5b 67 65 74 42 75 69 6c 64 43 6c 72  l_v [getBuildClr
d340: 56 65 72 73 69 6f 6e 5d 5d 0d 0a 20 20 20 20 20  Version]]..     
d350: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
d360: 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
d370: 73 20 3a 3a 6e 6f 28 73 68 69 6d 53 51 4c 69 74  s ::no(shimSQLit
d380: 65 44 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 43  eDefineConstantC
d390: 6f 6e 73 74 72 61 69 6e 74 73 29 5d 7d 20 74 68  onstraints)]} th
d3a0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
d3b0: 66 6f 72 65 61 63 68 20 64 65 66 69 6e 65 43 6f  foreach defineCo
d3c0: 6e 73 74 61 6e 74 20 5b 6c 69 73 74 20 5c 0d 0a  nstant [list \..
d3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 49 4e                IN
d3e0: 54 45 52 4f 50 5f 45 58 54 45 4e 53 49 4f 4e 5f  TEROP_EXTENSION_
d3f0: 46 55 4e 43 54 49 4f 4e 53 20 49 4e 54 45 52 4f  FUNCTIONS INTERO
d400: 50 5f 46 54 53 35 5f 45 58 54 45 4e 53 49 4f 4e  P_FTS5_EXTENSION
d410: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
d420: 20 20 49 4e 54 45 52 4f 50 5f 4a 53 4f 4e 31 5f    INTEROP_JSON1_
d430: 45 58 54 45 4e 53 49 4f 4e 20 49 4e 54 45 52 4f  EXTENSION INTERO
d440: 50 5f 50 45 52 43 45 4e 54 49 4c 45 5f 45 58 54  P_PERCENTILE_EXT
d450: 45 4e 53 49 4f 4e 20 5c 0d 0a 20 20 20 20 20 20  ENSION \..      
d460: 20 20 20 20 20 20 20 20 49 4e 54 45 52 4f 50 5f          INTEROP_
d470: 52 45 47 45 58 50 5f 45 58 54 45 4e 53 49 4f 4e  REGEXP_EXTENSION
d480: 20 49 4e 54 45 52 4f 50 5f 54 45 53 54 5f 45 58   INTEROP_TEST_EX
d490: 54 45 4e 53 49 4f 4e 20 5c 0d 0a 20 20 20 20 20  TENSION \..     
d4a0: 20 20 20 20 20 20 20 20 20 49 4e 54 45 52 4f 50           INTEROP
d4b0: 5f 54 4f 54 59 50 45 5f 45 58 54 45 4e 53 49 4f  _TOTYPE_EXTENSIO
d4c0: 4e 20 49 4e 54 45 52 4f 50 5f 56 49 52 54 55 41  N INTEROP_VIRTUA
d4d0: 4c 5f 54 41 42 4c 45 20 5c 0d 0a 20 20 20 20 20  L_TABLE \..     
d4e0: 20 20 20 20 20 20 20 20 20 55 53 45 5f 49 4e 54           USE_INT
d4f0: 45 52 4f 50 5f 44 4c 4c 5d 20 7b 0d 0a 20 20 20  EROP_DLL] {..   
d500: 20 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73           addCons
d510: 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
d520: 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
d530: 20 20 20 20 20 20 5b 67 65 74 53 51 4c 69 74 65        [getSQLite
d540: 44 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 50 72  DefineConstantPr
d550: 65 66 69 78 5d 20 24 64 65 66 69 6e 65 43 6f 6e  efix] $defineCon
d560: 73 74 61 6e 74 5d 0d 0a 20 20 20 20 20 20 20 20  stant]..        
d570: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
d580: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b  ..        if {![
d590: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
d5a0: 28 73 68 69 6d 53 51 4c 69 74 65 56 69 73 75 61  (shimSQLiteVisua
d5b0: 6c 53 74 75 64 69 6f 43 6f 6e 73 74 72 61 69 6e  lStudioConstrain
d5c0: 74 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ts)]} then {..  
d5d0: 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74          addConst
d5e0: 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67  raint [appendArg
d5f0: 73 20 76 69 73 75 61 6c 53 74 75 64 69 6f 20 5b  s visualStudio [
d600: 67 65 74 42 75 69 6c 64 59 65 61 72 5d 5d 0d 0a  getBuildYear]]..
d610: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
d620: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
d630: 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20  nel no\n..      
d640: 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
d650: 20 70 72 6f 63 20 63 68 61 6e 67 65 4e 61 74 69   proc changeNati
d660: 76 65 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20  veRuntimeOption 
d670: 7b 20 6e 61 74 69 76 65 20 7d 20 7b 0d 0a 20 20  { native } {..  
d680: 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67 74 68      if {[llength
d690: 20 5b 69 6e 66 6f 20 63 6f 6d 6d 61 6e 64 73 20   [info commands 
d6a0: 64 65 62 75 67 5d 5d 20 3e 20 30 20 26 26 20 5c  debug]] > 0 && \
d6b0: 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 6c 6c 65  ..          [lle
d6c0: 6e 67 74 68 20 5b 69 6e 66 6f 20 73 75 62 63 6f  ngth [info subco
d6d0: 6d 6d 61 6e 64 73 20 64 65 62 75 67 20 72 75 6e  mmands debug run
d6e0: 74 69 6d 65 6f 70 74 69 6f 6e 5d 5d 20 3e 20 30  timeoption]] > 0
d6f0: 20 26 26 20 5b 63 61 74 63 68 20 7b 0d 0a 20 20   && [catch {..  
d700: 20 20 20 20 20 20 64 65 62 75 67 20 72 75 6e 74        debug runt
d710: 69 6d 65 6f 70 74 69 6f 6e 20 5b 65 78 70 72 20  imeoption [expr 
d720: 7b 24 6e 61 74 69 76 65 20 3f 20 22 61 64 64 22  {$native ? "add"
d730: 20 3a 20 22 72 65 6d 6f 76 65 22 7d 5d 20 6e 61   : "remove"}] na
d740: 74 69 76 65 0d 0a 20 20 20 20 20 20 7d 5d 20 3d  tive..      }] =
d750: 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
d760: 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65       return true
d770: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
d780: 20 20 20 69 66 20 7b 5b 68 61 76 65 53 51 4c 69     if {[haveSQLi
d790: 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d  teObjectCommand]
d7a0: 20 26 26 20 5b 63 61 74 63 68 20 7b 0d 0a 20 20   && [catch {..  
d7b0: 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76        object inv
d7c0: 6f 6b 65 20 49 6e 74 65 72 70 72 65 74 65 72 2e  oke Interpreter.
d7d0: 47 65 74 41 63 74 69 76 65 20 5b 65 78 70 72 20  GetActive [expr 
d7e0: 7b 24 6e 61 74 69 76 65 20 3f 20 5c 0d 0a 20 20  {$native ? \..  
d7f0: 20 20 20 20 20 20 20 20 20 20 22 41 64 64 52 75            "AddRu
d800: 6e 74 69 6d 65 4f 70 74 69 6f 6e 22 20 3a 20 22  ntimeOption" : "
d810: 52 65 6d 6f 76 65 52 75 6e 74 69 6d 65 4f 70 74  RemoveRuntimeOpt
d820: 69 6f 6e 22 7d 5d 20 6e 61 74 69 76 65 0d 0a 20  ion"}] native.. 
d830: 20 20 20 20 20 7d 5d 20 3d 3d 20 30 7d 20 74 68       }] == 0} th
d840: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65  en {..        re
d850: 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20  turn true..     
d860: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75   }....      retu
d870: 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20 7d 0d  rn false..    }.
d880: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 68 65  ....    proc che
d890: 63 6b 46 6f 72 53 51 4c 69 74 65 42 75 69 6c 64  ckForSQLiteBuild
d8a0: 73 20 7b 20 63 68 61 6e 6e 65 6c 20 7b 73 65 6c  s { channel {sel
d8b0: 65 63 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a  ect false} } {..
d8c0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
d8d0: 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 66 6f 72   NOTE: Check for
d8e0: 20 65 76 65 72 79 20 70 6f 73 73 69 62 6c 65 20   every possible 
d8f0: 76 61 6c 69 64 20 63 6f 6d 62 69 6e 61 74 69 6f  valid combinatio
d900: 6e 20 6f 66 20 76 61 6c 75 65 73 20 75 73 65 64  n of values used
d910: 20 77 68 65 6e 0d 0a 20 20 20 20 20 20 23 20 20   when..      #  
d920: 20 20 20 20 20 6c 6f 63 61 74 69 6e 67 20 6f 75       locating ou
d930: 74 20 74 68 65 20 62 75 69 6c 64 20 6f 75 74 70  t the build outp
d940: 75 74 20 64 69 72 65 63 74 6f 72 79 2c 20 73 68  ut directory, sh
d950: 6f 77 69 6e 67 20 65 61 63 68 20 61 76 61 69 6c  owing each avail
d960: 61 62 6c 65 0d 0a 20 20 20 20 20 20 23 20 20 20  able..      #   
d970: 20 20 20 20 62 75 69 6c 64 20 76 61 72 69 61 74      build variat
d980: 69 6f 6e 20 61 6c 6f 6e 67 20 74 68 65 20 77 61  ion along the wa
d990: 79 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  y...      #..   
d9a0: 20 20 20 66 6f 72 65 61 63 68 20 6e 61 74 69 76     foreach nativ
d9b0: 65 20 5b 6c 69 73 74 20 66 61 6c 73 65 20 74 72  e [list false tr
d9c0: 75 65 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 66  ue] {..        f
d9d0: 6f 72 65 61 63 68 20 79 65 61 72 20 5b 67 65 74  oreach year [get
d9e0: 42 75 69 6c 64 59 65 61 72 73 5d 20 7b 0d 0a 20  BuildYears] {.. 
d9f0: 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
da00: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 5b   configuration [
da10: 67 65 74 42 75 69 6c 64 43 6f 6e 66 69 67 75 72  getBuildConfigur
da20: 61 74 69 6f 6e 73 5d 20 7b 0d 0a 20 20 20 20 20  ations] {..     
da30: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
da40: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69        # NOTE: Fi
da50: 67 75 72 65 20 6f 75 74 20 74 68 65 20 65 66 66  gure out the eff
da60: 65 63 74 69 76 65 20 62 75 69 6c 64 20 70 6c 61  ective build pla
da70: 74 66 6f 72 6d 2e 20 20 54 68 69 73 20 69 73 0d  tform.  This is.
da80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20  .            #  
da90: 20 20 20 20 20 62 61 73 65 64 20 6f 6e 20 77 68       based on wh
daa0: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 5b  ether or not a [
dab0: 70 72 69 6d 61 72 69 6c 79 5d 20 6e 61 74 69 76  primarily] nativ
dac0: 65 20 62 75 69 6c 64 0d 0a 20 20 20 20 20 20 20  e build..       
dad0: 20 20 20 20 20 23 20 20 20 20 20 20 20 69 73 20       #       is 
dae0: 62 65 69 6e 67 20 75 73 65 64 2e 20 20 46 6f 72  being used.  For
daf0: 20 5b 70 72 69 6d 61 72 69 6c 79 5d 20 6e 6f 6e   [primarily] non
db00: 2d 6e 61 74 69 76 65 20 62 75 69 6c 64 73 2c 0d  -native builds,.
db10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20  .            #  
db20: 20 20 20 20 20 74 68 69 73 20 77 69 6c 6c 20 62       this will b
db30: 65 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e  e an empty strin
db40: 67 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  g...            
db50: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  #..            s
db60: 65 74 20 70 6c 61 74 66 6f 72 6d 20 5b 67 65 74  et platform [get
db70: 42 75 69 6c 64 50 6c 61 74 66 6f 72 6d 20 24 6e  BuildPlatform $n
db80: 61 74 69 76 65 5d 0d 0a 0d 0a 20 20 20 20 20 20  ative]....      
db90: 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
dba0: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
dbb0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
dbc0: 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69      "---- checki
dbd0: 6e 67 20 66 6f 72 20 53 79 73 74 65 6d 2e 44 61  ng for System.Da
dbe0: 74 61 2e 53 51 4c 69 74 65 20 62 75 69 6c 64 20  ta.SQLite build 
dbf0: 5c 22 22 20 5b 65 78 70 72 20 5c 0d 0a 20 20 20  \"" [expr \..   
dc00: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 24 6e               {$n
dc10: 61 74 69 76 65 20 3f 20 22 6e 61 74 69 76 65 2f  ative ? "native/
dc20: 22 20 3a 20 22 22 7d 5d 20 5b 65 78 70 72 20 7b  " : ""}] [expr {
dc30: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 5c  [string length \
dc40: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
dc50: 20 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3e 20 30    $platform] > 0
dc60: 20 3f 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24   ? [appendArgs $
dc70: 70 6c 61 74 66 6f 72 6d 20 2f 5d 20 3a 20 22 22  platform /] : ""
dc80: 7d 5d 20 24 79 65 61 72 20 5c 0d 0a 20 20 20 20  }] $year \..    
dc90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 20 24 63              / $c
dca0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 22 5c 22  onfiguration "\"
dcb0: 2e 2e 2e 20 22 5d 0d 0a 0d 0a 20 20 20 20 20 20  ... "]....      
dcc0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
dcd0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69       # NOTE: Bui
dce0: 6c 64 20 74 68 65 20 66 75 6c 6c 79 20 71 75 61  ld the fully qua
dcf0: 6c 69 66 69 65 64 20 64 69 72 65 63 74 6f 72 79  lified directory
dd00: 20 77 68 65 72 65 20 74 68 65 20 6e 65 63 65 73   where the neces
dd10: 73 61 72 79 0d 0a 20 20 20 20 20 20 20 20 20 20  sary..          
dd20: 20 20 23 20 20 20 20 20 20 20 63 6f 6d 70 6f 6e    #       compon
dd30: 65 6e 74 73 20 66 6f 72 20 53 79 73 74 65 6d 2e  ents for System.
dd40: 44 61 74 61 2e 53 51 4c 69 74 65 20 73 68 6f 75  Data.SQLite shou
dd50: 6c 64 20 62 65 20 66 6f 75 6e 64 2e 0d 0a 20 20  ld be found...  
dd60: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
dd70: 20 20 20 20 20 20 20 20 20 73 65 74 20 64 69 72           set dir
dd80: 65 63 74 6f 72 79 20 5b 6a 6f 69 6e 42 75 69 6c  ectory [joinBuil
dd90: 64 44 69 72 65 63 74 6f 72 79 20 24 6e 61 74 69  dDirectory $nati
dda0: 76 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ve \..          
ddb0: 20 20 20 20 20 20 5b 67 65 74 42 75 69 6c 64 42        [getBuildB
ddc0: 61 73 65 44 69 72 65 63 74 6f 72 79 5d 20 24 79  aseDirectory] $y
ddd0: 65 61 72 20 24 70 6c 61 74 66 6f 72 6d 20 24 63  ear $platform $c
dde0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 5d 0d 0a 0d  onfiguration]...
ddf0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a  .            #..
de00: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f              # NO
de10: 54 45 3a 20 44 6f 20 74 68 65 20 6e 65 63 65 73  TE: Do the neces
de20: 73 61 72 79 20 66 69 6c 65 73 20 65 78 69 73 74  sary files exist
de30: 3f 20 20 43 75 72 72 65 6e 74 6c 79 2c 20 6e 6f  ?  Currently, no
de40: 20 6f 74 68 65 72 20 73 74 65 70 73 0d 0a 20 20   other steps..  
de50: 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
de60: 20 20 61 72 65 20 74 61 6b 65 6e 20 74 6f 20 76    are taken to v
de70: 65 72 69 66 79 20 74 68 69 73 20 62 75 69 6c 64  erify this build
de80: 20 69 73 20 61 63 74 75 61 6c 6c 79 20 76 69 61   is actually via
de90: 62 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ble...          
dea0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
deb0: 20 69 66 20 7b 5b 69 73 42 75 69 6c 64 41 76 61   if {[isBuildAva
dec0: 69 6c 61 62 6c 65 20 24 6e 61 74 69 76 65 20 24  ilable $native $
ded0: 64 69 72 65 63 74 6f 72 79 5d 7d 20 74 68 65 6e  directory]} then
dee0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
def0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
df00: 20 20 20 23 20 4e 4f 54 45 3a 20 57 68 65 6e 20     # NOTE: When 
df10: 69 6e 20 22 73 65 6c 65 63 74 22 20 6d 6f 64 65  in "select" mode
df20: 2c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  , automatically 
df30: 73 65 6c 65 63 74 20 74 68 65 20 66 69 72 73 74  select the first
df40: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
df50: 23 20 20 20 20 20 20 20 61 76 61 69 6c 61 62 6c  #       availabl
df60: 65 20 62 75 69 6c 64 20 6f 66 20 53 79 73 74 65  e build of Syste
df70: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 61 6e  m.Data.SQLite an
df80: 64 20 74 68 65 6e 20 72 65 74 75 72 6e 0d 0a 20  d then return.. 
df90: 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20               #  
dfa0: 20 20 20 20 20 69 6d 6d 65 64 69 61 74 65 6c 79       immediately
dfb0: 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
dfc0: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
dfd0: 20 20 69 66 20 7b 24 73 65 6c 65 63 74 20 26 26    if {$select &&
dfe0: 20 5b 6d 61 74 63 68 50 6c 61 74 66 6f 72 6d 20   [matchPlatform 
dff0: 24 70 6c 61 74 66 6f 72 6d 5d 7d 20 74 68 65 6e  $platform]} then
e000: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
e010: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
e020: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4d         # NOTE: M
e030: 61 6e 75 61 6c 6c 79 20 6f 76 65 72 72 69 64 65  anually override
e040: 20 61 6c 6c 20 74 68 65 20 62 75 69 6c 64 20 64   all the build d
e050: 69 72 65 63 74 6f 72 79 20 73 65 6c 65 63 74 69  irectory selecti
e060: 6f 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  on..            
e070: 20 20 20 20 23 20 20 20 20 20 20 20 72 65 6c 61      #       rela
e080: 74 65 64 20 74 65 73 74 20 73 65 74 74 69 6e 67  ted test setting
e090: 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 6f  s in order to fo
e0a0: 72 63 65 20 74 68 69 73 20 62 75 69 6c 64 0d 0a  rce this build..
e0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e0c0: 23 20 20 20 20 20 20 20 6f 66 20 53 79 73 74 65  #       of Syste
e0d0: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 74 6f  m.Data.SQLite to
e0e0: 20 62 65 20 75 73 65 64 2e 0d 0a 20 20 20 20 20   be used...     
e0f0: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
e100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
e110: 20 7b 21 5b 63 68 61 6e 67 65 4e 61 74 69 76 65   {![changeNative
e120: 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 24 6e  RuntimeOption $n
e130: 61 74 69 76 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a  ative]} then {..
e140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e150: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
e160: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
e170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e180: 20 20 20 20 20 20 22 6e 6f 2c 20 66 61 69 6c 65        "no, faile
e190: 64 20 74 6f 20 22 20 5b 65 78 70 72 20 7b 24 6e  d to " [expr {$n
e1a0: 61 74 69 76 65 20 3f 20 22 61 64 64 22 20 3a 20  ative ? "add" : 
e1b0: 22 72 65 6d 6f 76 65 22 7d 5d 20 5c 0d 0a 20 20  "remove"}] \..  
e1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1d0: 20 20 20 20 22 20 74 68 65 20 5c 22 6e 61 74 69      " the \"nati
e1e0: 76 65 5c 22 20 72 75 6e 74 69 6d 65 20 6f 70 74  ve\" runtime opt
e1f0: 69 6f 6e 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20  ion\n"]....     
e200: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
e210: 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20 20  urn false..     
e220: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
e230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e240: 73 65 74 20 3a 3a 74 65 73 74 5f 79 65 61 72 20  set ::test_year 
e250: 24 79 65 61 72 0d 0a 20 20 20 20 20 20 20 20 20  $year..         
e260: 20 20 20 20 20 20 20 73 65 74 20 3a 3a 74 65 73         set ::tes
e270: 74 5f 70 6c 61 74 66 6f 72 6d 20 24 70 6c 61 74  t_platform $plat
e280: 66 6f 72 6d 0d 0a 20 20 20 20 20 20 20 20 20 20  form..          
e290: 20 20 20 20 20 20 73 65 74 20 3a 3a 74 65 73 74        set ::test
e2a0: 5f 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 24  _configuration $
e2b0: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 0d 0a 0d  configuration...
e2c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e2d0: 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
e2e0: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
e2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e300: 20 20 20 22 79 65 73 2c 20 73 65 6c 65 63 74 65     "yes, selecte
e310: 64 20 28 22 20 5b 65 78 70 72 20 7b 24 6e 61 74  d (" [expr {$nat
e320: 69 76 65 20 3f 20 22 6e 61 74 69 76 65 2f 22 20  ive ? "native/" 
e330: 3a 20 22 22 7d 5d 20 5c 0d 0a 20 20 20 20 20 20  : ""}] \..      
e340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 65                [e
e350: 78 70 72 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e  xpr {[string len
e360: 67 74 68 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3e  gth $platform] >
e370: 20 30 20 3f 20 5b 61 70 70 65 6e 64 41 72 67 73   0 ? [appendArgs
e380: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
e390: 20 20 20 20 20 20 20 20 24 70 6c 61 74 66 6f 72          $platfor
e3a0: 6d 20 2f 5d 20 3a 20 22 22 7d 5d 20 24 79 65 61  m /] : ""}] $yea
e3b0: 72 20 2f 20 24 63 6f 6e 66 69 67 75 72 61 74 69  r / $configurati
e3c0: 6f 6e 20 22 29 5c 6e 22 5d 0d 0a 0d 0a 20 20 20  on ")\n"]....   
e3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
e3e0: 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20  urn true..      
e3f0: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
e400: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
e410: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
e420: 20 79 65 73 5c 6e 0d 0a 20 20 20 20 20 20 20 20   yes\n..        
e430: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
e440: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
e450: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
e460: 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e  ts $channel no\n
e470: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
e480: 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
e490: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
e4a0: 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ....      return
e4b0: 20 66 61 6c 73 65 0d 0a 20 20 20 20 7d 0d 0a 0c   false..    }...
e4c0: 0d 0a 20 20 20 20 70 72 6f 63 20 63 68 65 63 6b  ..    proc check
e4d0: 46 6f 72 53 51 4c 69 74 65 52 65 6c 65 61 73 65  ForSQLiteRelease
e4e0: 73 20 7b 20 63 68 61 6e 6e 65 6c 20 7b 73 65 6c  s { channel {sel
e4f0: 65 63 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a  ect false} } {..
e500: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
e510: 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 66 6f 72   NOTE: Check for
e520: 20 70 61 73 74 20 72 65 6c 65 61 73 65 73 20 6f   past releases o
e530: 66 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  f System.Data.SQ
e540: 4c 69 74 65 20 69 6e 20 74 68 65 20 64 69 72 65  Lite in the dire
e550: 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 23 20 20  ctory..      #  
e560: 20 20 20 20 20 63 6f 6e 74 61 69 6e 65 64 20 69       contained i
e570: 6e 20 74 68 65 20 22 53 79 73 74 65 6d 2e 44 61  n the "System.Da
e580: 74 61 2e 53 51 4c 69 74 65 22 20 65 6e 76 69 72  ta.SQLite" envir
e590: 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 2c  onment variable,
e5a0: 20 69 66 0d 0a 20 20 20 20 20 20 23 20 20 20 20   if..      #    
e5b0: 20 20 20 70 72 65 73 65 6e 74 2e 0d 0a 20 20 20     present...   
e5c0: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
e5d0: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 65  [info exists ::e
e5e0: 6e 76 28 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  nv(System.Data.S
e5f0: 51 4c 69 74 65 29 5d 20 26 26 20 5c 0d 0a 20 20  QLite)] && \..  
e600: 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20          [string 
e610: 6c 65 6e 67 74 68 20 24 3a 3a 65 6e 76 28 53 79  length $::env(Sy
e620: 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
e630: 29 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  )] > 0} then {..
e640: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
e650: 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64     # NOTE: Build
e660: 20 74 68 65 20 66 75 6c 6c 79 20 71 75 61 6c 69   the fully quali
e670: 66 69 65 64 20 64 69 72 65 63 74 6f 72 79 20 77  fied directory w
e680: 68 65 72 65 20 74 68 65 20 6e 65 63 65 73 73 61  here the necessa
e690: 72 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ry..        #   
e6a0: 20 20 20 20 63 6f 6d 70 6f 6e 65 6e 74 73 20 66      components f
e6b0: 6f 72 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  or System.Data.S
e6c0: 51 4c 69 74 65 20 73 68 6f 75 6c 64 20 62 65 20  QLite should be 
e6d0: 66 6f 75 6e 64 2e 0d 0a 20 20 20 20 20 20 20 20  found...        
e6e0: 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 64  #..        set d
e6f0: 69 72 65 63 74 6f 72 79 20 5b 66 69 6c 65 20 6e  irectory [file n
e700: 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20  ativename [file 
e710: 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20  join \..        
e720: 20 20 20 20 24 3a 3a 65 6e 76 28 53 79 73 74 65      $::env(Syste
e730: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 29 20 5b  m.Data.SQLite) [
e740: 67 65 74 52 65 6c 65 61 73 65 56 65 72 73 69 6f  getReleaseVersio
e750: 6e 5d 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  n]]]....        
e760: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
e770: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
e780: 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
e790: 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 53 79 73  checking for Sys
e7a0: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20  tem.Data.SQLite 
e7b0: 72 65 6c 65 61 73 65 20 5c 22 22 20 5c 0d 0a 20  release \"" \.. 
e7c0: 20 20 20 20 20 20 20 20 20 20 20 24 64 69 72 65             $dire
e7d0: 63 74 6f 72 79 20 22 5c 22 2e 2e 2e 20 22 5d 0d  ctory "\"... "].
e7e0: 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  ...        if {[
e7f0: 69 73 52 65 6c 65 61 73 65 41 76 61 69 6c 61 62  isReleaseAvailab
e800: 6c 65 20 24 64 69 72 65 63 74 6f 72 79 20 70 6c  le $directory pl
e810: 61 74 66 6f 72 6d 5d 7d 20 74 68 65 6e 20 7b 0d  atform]} then {.
e820: 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b  .          if {[
e830: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 70  string length $p
e840: 6c 61 74 66 6f 72 6d 5d 20 3d 3d 20 30 7d 20 74  latform] == 0} t
e850: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
e860: 20 20 20 73 65 74 20 70 6c 61 74 66 6f 72 6d 20     set platform 
e870: 75 6e 6b 6e 6f 77 6e 0d 0a 20 20 20 20 20 20 20  unknown..       
e880: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
e890: 20 20 69 66 20 7b 24 73 65 6c 65 63 74 20 26 26    if {$select &&
e8a0: 20 5b 6d 61 74 63 68 50 6c 61 74 66 6f 72 6d 20   [matchPlatform 
e8b0: 24 70 6c 61 74 66 6f 72 6d 5d 7d 20 74 68 65 6e  $platform]} then
e8c0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
e8d0: 73 65 74 20 3a 3a 62 75 69 6c 64 5f 64 69 72 65  set ::build_dire
e8e0: 63 74 6f 72 79 20 24 64 69 72 65 63 74 6f 72 79  ctory $directory
e8f0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
e900: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
e910: 61 70 70 65 6e 64 41 72 67 73 20 22 79 65 73 2c  appendArgs "yes,
e920: 20 73 65 6c 65 63 74 65 64 20 28 22 20 24 70 6c   selected (" $pl
e930: 61 74 66 6f 72 6d 20 22 29 5c 6e 22 5d 0d 0a 0d  atform ")\n"]...
e940: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
e950: 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20  urn true..      
e960: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
e970: 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
e980: 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
e990: 41 72 67 73 20 22 79 65 73 20 28 22 20 24 70 6c  Args "yes (" $pl
e9a0: 61 74 66 6f 72 6d 20 22 29 5c 6e 22 5d 0d 0a 20  atform ")\n"].. 
e9b0: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
e9c0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
e9d0: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
e9e0: 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 0d 0a 20  hannel no\n.... 
e9f0: 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
ea00: 20 70 61 74 68 20 5b 6c 73 6f 72 74 20 2d 64 65   path [lsort -de
ea10: 63 72 65 61 73 69 6e 67 20 5b 66 69 6c 65 20 6c  creasing [file l
ea20: 69 73 74 20 24 64 69 72 65 63 74 6f 72 79 20 2a  ist $directory *
ea30: 5d 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ]] {..          
ea40: 20 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73    if {[file exis
ea50: 74 73 20 24 70 61 74 68 5d 20 26 26 20 5b 66 69  ts $path] && [fi
ea60: 6c 65 20 69 73 64 69 72 65 63 74 6f 72 79 20 24  le isdirectory $
ea70: 70 61 74 68 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  path]} then {.. 
ea80: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
ea90: 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
eaa0: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
eab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
eac0: 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20  -- checking for 
ead0: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
eae0: 74 65 20 72 65 6c 65 61 73 65 20 5c 22 22 20 5c  te release \"" \
eaf0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
eb00: 20 20 20 20 24 70 61 74 68 20 22 5c 22 2e 2e 2e      $path "\"...
eb10: 20 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20   "]....         
eb20: 20 20 20 20 20 69 66 20 7b 5b 69 73 52 65 6c 65       if {[isRele
eb30: 61 73 65 41 76 61 69 6c 61 62 6c 65 20 24 70 61  aseAvailable $pa
eb40: 74 68 20 70 6c 61 74 66 6f 72 6d 5d 7d 20 74 68  th platform]} th
eb50: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
eb60: 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
eb70: 67 20 6c 65 6e 67 74 68 20 24 70 6c 61 74 66 6f  g length $platfo
eb80: 72 6d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  rm] == 0} then {
eb90: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
eba0: 20 20 20 20 73 65 74 20 70 6c 61 74 66 6f 72 6d      set platform
ebb0: 20 75 6e 6b 6e 6f 77 6e 0d 0a 20 20 20 20 20 20   unknown..      
ebc0: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
ebd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
ebe0: 66 20 7b 24 73 65 6c 65 63 74 20 26 26 20 5b 6d  f {$select && [m
ebf0: 61 74 63 68 50 6c 61 74 66 6f 72 6d 20 24 70 6c  atchPlatform $pl
ec00: 61 74 66 6f 72 6d 5d 7d 20 74 68 65 6e 20 7b 0d  atform]} then {.
ec10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ec20: 20 20 20 73 65 74 20 3a 3a 62 75 69 6c 64 5f 64     set ::build_d
ec30: 69 72 65 63 74 6f 72 79 20 24 70 61 74 68 0d 0a  irectory $path..
ec40: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
ec50: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
ec60: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22  el [appendArgs "
ec70: 79 65 73 2c 20 73 65 6c 65 63 74 65 64 20 28 22  yes, selected ("
ec80: 20 24 70 6c 61 74 66 6f 72 6d 20 22 29 5c 6e 22   $platform ")\n"
ec90: 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ]....           
eca0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72         return tr
ecb0: 75 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue..            
ecc0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
ecd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ece0: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
ecf0: 61 70 70 65 6e 64 41 72 67 73 20 22 79 65 73 20  appendArgs "yes 
ed00: 28 22 20 24 70 6c 61 74 66 6f 72 6d 20 22 29 5c  (" $platform ")\
ed10: 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n"]..           
ed20: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
ed30: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
ed40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed50: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e  tputs $channel n
ed60: 6f 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  o\n..           
ed70: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
ed80: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d    }..          }
ed90: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
eda0: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
edb0: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
edc0: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
edd0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  \..            "
ede0: 2d 2d 2d 2d 20 65 6e 76 69 72 6f 6e 6d 65 6e 74  ---- environment
edf0: 20 76 61 72 69 61 62 6c 65 20 5c 22 53 79 73 74   variable \"Syst
ee00: 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 5c 22  em.Data.SQLite\"
ee10: 20 69 73 20 6e 6f 74 20 22 20 5c 0d 0a 20 20 20   is not " \..   
ee20: 20 20 20 20 20 20 20 20 20 22 73 65 74 2c 20 73           "set, s
ee30: 6b 69 70 70 69 6e 67 20 63 68 65 63 6b 20 66 6f  kipping check fo
ee40: 72 20 72 65 6c 65 61 73 65 73 2e 2e 2e 5c 6e 22  r releases...\n"
ee50: 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  ]..      }....  
ee60: 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65      return false
ee70: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
ee80: 70 72 6f 63 20 63 68 65 63 6b 46 6f 72 53 51 4c  proc checkForSQL
ee90: 69 74 65 4c 69 62 72 61 72 79 20 7b 20 63 68 61  iteLibrary { cha
eea0: 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20 20 20 20  nnel } {..      
eeb0: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22  tputs $channel "
eec0: 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f  ---- checking fo
eed0: 72 20 53 51 4c 69 74 65 20 63 6f 72 65 20 6c 69  r SQLite core li
eee0: 62 72 61 72 79 2e 2e 2e 20 22 0d 0a 0d 0a 20 20  brary... "....  
eef0: 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
ef00: 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74  ..        object
ef10: 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b   invoke -flags +
ef20: 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20  NonPublic \..   
ef30: 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e           System.
ef40: 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69  Data.SQLite.SQLi
ef50: 74 65 33 20 53 51 4c 69 74 65 56 65 72 73 69 6f  te3 SQLiteVersio
ef60: 6e 0d 0a 20 20 20 20 20 20 7d 20 76 65 72 73 69  n..      } versi
ef70: 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  on] == 0} then {
ef80: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
ef90: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65       # NOTE: Che
efa0: 63 6b 20 69 66 20 74 68 65 20 72 65 74 75 72 6e  ck if the return
efb0: 65 64 20 76 65 72 73 69 6f 6e 20 77 61 73 20 6e  ed version was n
efc0: 75 6c 6c 2e 20 20 49 66 20 73 6f 2c 20 6d 61 6b  ull.  If so, mak
efd0: 65 20 69 74 20 65 61 73 79 0d 0a 20 20 20 20 20  e it easy..     
efe0: 20 20 20 23 20 20 20 20 20 20 20 74 6f 20 73 70     #       to sp
eff0: 6f 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ot...        #..
f000: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72          if {[str
f010: 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 65 72 73  ing length $vers
f020: 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ion] == 0} then 
f030: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  {..          set
f040: 20 76 65 72 73 69 6f 6e 20 6e 75 6c 6c 0d 0a 20   version null.. 
f050: 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
f060: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
f070: 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74   NOTE: Attempt t
f080: 6f 20 71 75 65 72 79 20 74 68 65 20 46 6f 73 73  o query the Foss
f090: 69 6c 20 73 6f 75 72 63 65 20 69 64 65 6e 74 69  il source identi
f0a0: 66 69 65 72 20 66 6f 72 20 74 68 65 20 53 51 4c  fier for the SQL
f0b0: 69 74 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ite..        #  
f0c0: 20 20 20 20 20 63 6f 72 65 20 6c 69 62 72 61 72       core librar
f0d0: 79 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  y...        #.. 
f0e0: 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
f0f0: 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6f  h {..          o
f100: 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c  bject invoke -fl
f110: 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c  ags +NonPublic \
f120: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
f130: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
f140: 74 65 2e 53 51 4c 69 74 65 33 20 53 51 4c 69 74  te.SQLite3 SQLit
f150: 65 53 6f 75 72 63 65 49 64 0d 0a 20 20 20 20 20  eSourceId..     
f160: 20 20 20 7d 20 73 6f 75 72 63 65 49 64 5d 7d 20     } sourceId]} 
f170: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
f180: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23    #..          #
f190: 20 4e 4f 54 45 3a 20 57 65 20 66 61 69 6c 65 64   NOTE: We failed
f1a0: 20 74 6f 20 71 75 65 72 79 20 74 68 65 20 46 6f   to query the Fo
f1b0: 73 73 69 6c 20 73 6f 75 72 63 65 20 69 64 65 6e  ssil source iden
f1c0: 74 69 66 69 65 72 2e 0d 0a 20 20 20 20 20 20 20  tifier...       
f1d0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
f1e0: 73 65 74 20 73 6f 75 72 63 65 49 64 20 75 6e 6b  set sourceId unk
f1f0: 6e 6f 77 6e 0d 0a 20 20 20 20 20 20 20 20 7d 0d  nown..        }.
f200: 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
f210: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68        # NOTE: Ch
f220: 65 63 6b 20 69 66 20 74 68 65 20 72 65 74 75 72  eck if the retur
f230: 6e 65 64 20 46 6f 73 73 69 6c 20 73 6f 75 72 63  ned Fossil sourc
f240: 65 20 69 64 65 6e 74 69 66 69 65 72 20 77 61 73  e identifier was
f250: 20 6e 75 6c 6c 2e 20 20 49 66 0d 0a 20 20 20 20   null.  If..    
f260: 20 20 20 20 23 20 20 20 20 20 20 20 73 6f 2c 20      #       so, 
f270: 6d 61 6b 65 20 69 74 20 65 61 73 79 20 74 6f 20  make it easy to 
f280: 73 70 6f 74 2e 0d 0a 20 20 20 20 20 20 20 20 23  spot...        #
f290: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73  ..        if {[s
f2a0: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 73 6f  tring length $so
f2b0: 75 72 63 65 49 64 5d 20 3d 3d 20 30 7d 20 74 68  urceId] == 0} th
f2c0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
f2d0: 73 65 74 20 73 6f 75 72 63 65 49 64 20 6e 75 6c  set sourceId nul
f2e0: 6c 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  l..        }....
f2f0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
f300: 20 20 20 23 20 4e 4f 54 45 3a 20 59 65 73 2c 20     # NOTE: Yes, 
f310: 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20  the SQLite core 
f320: 6c 69 62 72 61 72 79 20 61 70 70 65 61 72 73 20  library appears 
f330: 74 6f 20 62 65 20 61 76 61 69 6c 61 62 6c 65 2e  to be available.
f340: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
f350: 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
f360: 6e 74 20 53 51 4c 69 74 65 0d 0a 0d 0a 20 20 20  nt SQLite....   
f370: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
f380: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
f390: 22 79 65 73 20 28 22 20 24 76 65 72 73 69 6f 6e  "yes (" $version
f3a0: 20 22 20 22 20 24 73 6f 75 72 63 65 49 64 20 22   " " $sourceId "
f3b0: 29 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 7d 20 65  )\n"]..      } e
f3c0: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74  lse {..        t
f3d0: 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f  puts $channel no
f3e0: 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  \n..      }..   
f3f0: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
f400: 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 49 6e  checkForSQLiteIn
f410: 74 65 72 6f 70 20 7b 20 63 68 61 6e 6e 65 6c 20  terop { channel 
f420: 7d 20 7b 0d 0a 20 20 20 20 20 20 74 70 75 74 73  } {..      tputs
f430: 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20   $channel "---- 
f440: 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 53 51 4c  checking for SQL
f450: 69 74 65 20 69 6e 74 65 72 6f 70 20 61 73 73 65  ite interop asse
f460: 6d 62 6c 79 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20  mbly... "....   
f470: 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d     if {[catch {.
f480: 0a 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20  .        object 
f490: 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e  invoke -flags +N
f4a0: 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20  onPublic \..    
f4b0: 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44          System.D
f4c0: 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74  ata.SQLite.SQLit
f4d0: 65 33 20 49 6e 74 65 72 6f 70 56 65 72 73 69 6f  e3 InteropVersio
f4e0: 6e 0d 0a 20 20 20 20 20 20 7d 20 76 65 72 73 69  n..      } versi
f4f0: 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  on] == 0} then {
f500: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
f510: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65       # NOTE: Che
f520: 63 6b 20 69 66 20 74 68 65 20 72 65 74 75 72 6e  ck if the return
f530: 65 64 20 76 65 72 73 69 6f 6e 20 77 61 73 20 6e  ed version was n
f540: 75 6c 6c 2e 20 20 49 66 20 73 6f 2c 20 6d 61 6b  ull.  If so, mak
f550: 65 20 69 74 20 65 61 73 79 0d 0a 20 20 20 20 20  e it easy..     
f560: 20 20 20 23 20 20 20 20 20 20 20 74 6f 20 73 70     #       to sp
f570: 6f 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ot...        #..
f580: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72          if {[str
f590: 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 65 72 73  ing length $vers
f5a0: 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ion] == 0} then 
f5b0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  {..          set
f5c0: 20 76 65 72 73 69 6f 6e 20 6e 75 6c 6c 0d 0a 20   version null.. 
f5d0: 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
f5e0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
f5f0: 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74   NOTE: Attempt t
f600: 6f 20 71 75 65 72 79 20 74 68 65 20 46 6f 73 73  o query the Foss
f610: 69 6c 20 73 6f 75 72 63 65 20 69 64 65 6e 74 69  il source identi
f620: 66 69 65 72 20 66 6f 72 20 74 68 65 20 53 51 4c  fier for the SQL
f630: 69 74 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ite..        #  
f640: 20 20 20 20 20 63 6f 72 65 20 6c 69 62 72 61 72       core librar
f650: 79 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  y...        #.. 
f660: 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
f670: 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6f  h {..          o
f680: 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c  bject invoke -fl
f690: 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c  ags +NonPublic \
f6a0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
f6b0: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
f6c0: 74 65 2e 53 51 4c 69 74 65 33 20 49 6e 74 65 72  te.SQLite3 Inter
f6d0: 6f 70 53 6f 75 72 63 65 49 64 0d 0a 20 20 20 20  opSourceId..    
f6e0: 20 20 20 20 7d 20 73 6f 75 72 63 65 49 64 5d 7d      } sourceId]}
f6f0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
f700: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
f710: 23 20 4e 4f 54 45 3a 20 57 65 20 66 61 69 6c 65  # NOTE: We faile
f720: 64 20 74 6f 20 71 75 65 72 79 20 74 68 65 20 46  d to query the F
f730: 6f 73 73 69 6c 20 73 6f 75 72 63 65 20 69 64 65  ossil source ide
f740: 6e 74 69 66 69 65 72 2e 0d 0a 20 20 20 20 20 20  ntifier...      
f750: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
f760: 20 73 65 74 20 73 6f 75 72 63 65 49 64 20 75 6e   set sourceId un
f770: 6b 6e 6f 77 6e 0d 0a 20 20 20 20 20 20 20 20 7d  known..        }
f780: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
f790: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43         # NOTE: C
f7a0: 68 65 63 6b 20 69 66 20 74 68 65 20 72 65 74 75  heck if the retu
f7b0: 72 6e 65 64 20 46 6f 73 73 69 6c 20 73 6f 75 72  rned Fossil sour
f7c0: 63 65 20 69 64 65 6e 74 69 66 69 65 72 20 77 61  ce identifier wa
f7d0: 73 20 6e 75 6c 6c 2e 20 20 49 66 0d 0a 20 20 20  s null.  If..   
f7e0: 20 20 20 20 20 23 20 20 20 20 20 20 20 73 6f 2c       #       so,
f7f0: 20 6d 61 6b 65 20 69 74 20 65 61 73 79 20 74 6f   make it easy to
f800: 20 73 70 6f 74 2e 0d 0a 20 20 20 20 20 20 20 20   spot...        
f810: 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  #..        if {[
f820: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 73  string length $s
f830: 6f 75 72 63 65 49 64 5d 20 3d 3d 20 30 7d 20 74  ourceId] == 0} t
f840: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
f850: 20 73 65 74 20 73 6f 75 72 63 65 49 64 20 6e 75   set sourceId nu
f860: 6c 6c 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  ll..        }...
f870: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
f880: 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 65 66 6f      # NOTE: Befo
f890: 72 65 20 61 63 74 75 61 6c 6c 79 20 61 64 64 69  re actually addi
f8a0: 6e 67 20 74 68 65 20 74 65 73 74 20 63 6f 6e 73  ng the test cons
f8b0: 74 72 61 69 6e 74 2c 20 6d 61 6b 65 20 73 75 72  traint, make sur
f8c0: 65 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23  e the..        #
f8d0: 20 20 20 20 20 20 20 76 65 72 73 69 6f 6e 20 69         version i
f8e0: 73 20 76 61 6c 69 64 20 28 69 2e 65 2e 20 6e 6f  s valid (i.e. no
f8f0: 74 20 6a 75 73 74 20 74 68 61 74 20 77 65 20 63  t just that we c
f900: 6f 75 6c 64 20 71 75 65 72 79 20 69 74 29 2e 0d  ould query it)..
f910: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
f920: 20 20 20 20 69 66 20 7b 24 76 65 72 73 69 6f 6e      if {$version
f930: 20 6e 65 20 22 6e 75 6c 6c 22 7d 20 74 68 65 6e   ne "null"} then
f940: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d   {..          #.
f950: 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
f960: 45 3a 20 59 65 73 2c 20 74 68 65 20 53 51 4c 69  E: Yes, the SQLi
f970: 74 65 20 69 6e 74 65 72 6f 70 20 61 73 73 65 6d  te interop assem
f980: 62 6c 79 20 61 70 70 65 61 72 73 20 74 6f 20 62  bly appears to b
f990: 65 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0a 20 20  e available...  
f9a0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
f9b0: 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
f9c0: 6e 74 20 53 51 4c 69 74 65 49 6e 74 65 72 6f 70  nt SQLiteInterop
f9d0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65  ....          se
f9e0: 74 20 61 6e 73 77 65 72 20 79 65 73 0d 0a 20 20  t answer yes..  
f9f0: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
fa00: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 61 6e            set an
fa10: 73 77 65 72 20 6e 6f 0d 0a 20 20 20 20 20 20 20  swer no..       
fa20: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 70   }....        tp
fa30: 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
fa40: 70 65 6e 64 41 72 67 73 20 24 61 6e 73 77 65 72  pendArgs $answer
fa50: 20 22 20 28 22 20 24 76 65 72 73 69 6f 6e 20 22   " (" $version "
fa60: 20 22 20 24 73 6f 75 72 63 65 49 64 20 22 29 5c   " $sourceId ")\
fa70: 6e 22 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  n"]..      } els
fa80: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75  e {..        tpu
fa90: 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e  ts $channel no\n
faa0: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
fab0: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 68  .....    proc ch
fac0: 65 63 6b 46 6f 72 53 51 4c 69 74 65 44 65 66 69  eckForSQLiteDefi
fad0: 6e 65 43 6f 6e 73 74 61 6e 74 20 7b 20 63 68 61  neConstant { cha
fae0: 6e 6e 65 6c 20 6e 61 6d 65 20 7d 20 7b 0d 0a 20  nnel name } {.. 
faf0: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
fb00: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
fb10: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 22 2d 2d  \..          "--
fb20: 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20  -- checking for 
fb30: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
fb40: 74 65 20 64 65 66 69 6e 65 20 63 6f 6e 73 74 61  te define consta
fb50: 6e 74 20 5c 22 22 20 24 6e 61 6d 65 20 5c 0d 0a  nt \"" $name \..
fb60: 20 20 20 20 20 20 20 20 20 20 22 5c 22 2e 2e 2e            "\"...
fb70: 20 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20   "]....      if 
fb80: 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
fb90: 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65     object invoke
fba0: 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c   -flags +NonPubl
fbb0: 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ic \..          
fbc0: 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51    System.Data.SQ
fbd0: 4c 69 74 65 2e 53 51 4c 69 74 65 33 20 44 65 66  Lite.SQLite3 Def
fbe0: 69 6e 65 43 6f 6e 73 74 61 6e 74 73 0d 0a 20 20  ineConstants..  
fbf0: 20 20 20 20 7d 20 64 65 66 69 6e 65 43 6f 6e 73      } defineCons
fc00: 74 61 6e 74 73 5d 20 3d 3d 20 30 7d 20 74 68 65  tants] == 0} the
fc10: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20  n {..        if 
fc20: 7b 5b 6c 73 65 61 72 63 68 20 2d 65 78 61 63 74  {[lsearch -exact
fc30: 20 2d 6e 6f 63 61 73 65 20 24 64 65 66 69 6e 65   -nocase $define
fc40: 43 6f 6e 73 74 61 6e 74 73 20 24 6e 61 6d 65 5d  Constants $name]
fc50: 20 21 3d 20 2d 31 7d 20 74 68 65 6e 20 7b 0d 0a   != -1} then {..
fc60: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
fc70: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 59         # NOTE: Y
fc80: 65 73 2c 20 74 68 69 73 20 64 65 66 69 6e 65 20  es, this define 
fc90: 63 6f 6e 73 74 61 6e 74 20 77 61 73 20 65 6e 61  constant was ena
fca0: 62 6c 65 64 20 77 68 65 6e 20 74 68 65 20 6d 61  bled when the ma
fcb0: 6e 61 67 65 64 0d 0a 20 20 20 20 20 20 20 20 20  naged..         
fcc0: 20 23 20 20 20 20 20 20 20 61 73 73 65 6d 62 6c   #       assembl
fcd0: 79 20 77 61 73 20 63 6f 6d 70 69 6c 65 64 2e 0d  y was compiled..
fce0: 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
fcf0: 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74          addConst
fd00: 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67  raint [appendArg
fd10: 73 20 5b 67 65 74 53 51 4c 69 74 65 44 65 66 69  s [getSQLiteDefi
fd20: 6e 65 43 6f 6e 73 74 61 6e 74 50 72 65 66 69 78  neConstantPrefix
fd30: 5d 20 24 6e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20  ] $name]....    
fd40: 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
fd50: 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20 20 20 20  nnel yes\n..    
fd60: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
fd70: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
fd80: 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20  hannel no\n..   
fd90: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20       }..      } 
fda0: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
fdb0: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 65  tputs $channel e
fdc0: 72 72 6f 72 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d  rror\n..      }.
fdd0: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
fde0: 72 6f 63 20 67 65 74 44 61 74 65 54 69 6d 65 46  roc getDateTimeF
fdf0: 6f 72 6d 61 74 20 7b 7d 20 7b 0d 0a 20 20 20 20  ormat {} {..    
fe00: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
fe10: 45 3a 20 54 68 69 73 20 70 72 6f 63 65 64 75 72  E: This procedur
fe20: 65 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e 73  e simply returns
fe30: 20 74 68 65 20 22 64 65 66 61 75 6c 74 22 20 44   the "default" D
fe40: 61 74 65 54 69 6d 65 20 66 6f 72 6d 61 74 20 75  ateTime format u
fe50: 73 65 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20  sed..      #    
fe60: 20 20 20 62 79 20 74 68 65 20 74 65 73 74 20 73     by the test s
fe70: 75 69 74 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  uite...      #..
fe80: 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20        if {[info 
fe90: 65 78 69 73 74 73 20 3a 3a 64 61 74 65 74 69 6d  exists ::datetim
fea0: 65 5f 66 6f 72 6d 61 74 5d 20 26 26 20 5c 0d 0a  e_format] && \..
feb0: 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e            [strin
fec0: 67 20 6c 65 6e 67 74 68 20 24 3a 3a 64 61 74 65  g length $::date
fed0: 74 69 6d 65 5f 66 6f 72 6d 61 74 5d 20 3e 20 30  time_format] > 0
fee0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
fef0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
ff00: 4f 54 45 3a 20 52 65 74 75 72 6e 20 74 68 65 20  OTE: Return the 
ff10: 6d 61 6e 75 61 6c 6c 79 20 6f 76 65 72 72 69 64  manually overrid
ff20: 64 65 6e 20 76 61 6c 75 65 20 66 6f 72 20 74 68  den value for th
ff30: 65 20 44 61 74 65 54 69 6d 65 20 66 6f 72 6d 61  e DateTime forma
ff40: 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  t...        #.. 
ff50: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a         return $:
ff60: 3a 64 61 74 65 74 69 6d 65 5f 66 6f 72 6d 61 74  :datetime_format
ff70: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
ff80: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
ff90: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 74       # NOTE: Ret
ffa0: 75 72 6e 20 61 6e 20 49 53 4f 38 36 30 31 20 44  urn an ISO8601 D
ffb0: 61 74 65 54 69 6d 65 20 66 6f 72 6d 61 74 20 63  ateTime format c
ffc0: 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 53  ompatible with S
ffd0: 51 4c 69 74 65 2c 0d 0a 20 20 20 20 20 20 20 20  QLite,..        
ffe0: 23 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44  #       System.D
fff0: 61 74 61 2e 53 51 4c 69 74 65 2c 20 61 6e 64 20  ata.SQLite, and 
10000 73 75 69 74 61 62 6c 65 20 66 6f 72 20 72 6f 75  suitable for rou
10010 6e 64 2d 74 72 69 70 70 69 6e 67 20 77 69 74 68  nd-tripping with
10020 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20   the..        # 
10030 20 20 20 20 20 20 44 61 74 65 54 69 6d 65 20 63        DateTime c
10040 6c 61 73 73 20 6f 66 20 74 68 65 20 66 72 61 6d  lass of the fram
10050 65 77 6f 72 6b 2e 20 20 49 66 20 74 68 69 73 20  ework.  If this 
10060 76 61 6c 75 65 20 69 73 20 63 68 61 6e 67 65 64  value is changed
10070 2c 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  ,..        #    
10080 20 20 20 76 61 72 69 6f 75 73 20 74 65 73 74 73     various tests
10090 20 6d 61 79 20 66 61 69 6c 2e 0d 0a 20 20 20 20   may fail...    
100a0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
100b0 65 74 75 72 6e 20 22 79 79 79 79 2d 4d 4d 2d 64  eturn "yyyy-MM-d
100c0 64 20 48 48 3a 6d 6d 3a 73 73 2e 46 46 46 46 46  d HH:mm:ss.FFFFF
100d0 46 46 4b 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  FFK"..      }.. 
100e0 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
100f0 63 20 67 65 74 50 72 6f 70 65 72 74 69 65 73 20  c getProperties 
10100 7b 20 6f 62 6a 65 63 74 20 76 61 72 4e 61 6d 65  { object varName
10110 20 7d 20 7b 0d 0a 20 20 20 20 20 20 75 70 76 61   } {..      upva
10120 72 20 31 20 24 76 61 72 4e 61 6d 65 20 70 72 6f  r 1 $varName pro
10130 70 65 72 74 69 65 73 0d 0a 0d 0a 20 20 20 20 20  perties....     
10140 20 73 65 74 20 63 6f 75 6e 74 20 30 0d 0a 20 20   set count 0..  
10150 20 20 20 20 73 65 74 20 6e 61 6d 65 73 20 5b 6c      set names [l
10160 69 73 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66  ist]....      if
10170 20 7b 5b 69 73 4f 62 6a 65 63 74 48 61 6e 64 6c   {[isObjectHandl
10180 65 20 24 6f 62 6a 65 63 74 5d 20 26 26 20 24 6f  e $object] && $o
10190 62 6a 65 63 74 20 6e 65 20 22 6e 75 6c 6c 22 7d  bject ne "null"}
101a0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
101b0 20 65 76 61 6c 20 6c 61 70 70 65 6e 64 20 6e 61   eval lappend na
101c0 6d 65 73 20 5b 6f 62 6a 65 63 74 20 6d 65 6d 62  mes [object memb
101d0 65 72 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ers \..         
101e0 20 20 20 2d 6d 65 6d 62 65 72 74 79 70 65 73 20     -membertypes 
101f0 50 72 6f 70 65 72 74 79 20 2d 6e 61 6d 65 6f 6e  Property -nameon
10200 6c 79 20 24 6f 62 6a 65 63 74 5d 0d 0a 0d 0a 20  ly $object].... 
10210 20 20 20 20 20 20 20 65 76 61 6c 20 6c 61 70 70         eval lapp
10220 65 6e 64 20 6e 61 6d 65 73 20 5b 6f 62 6a 65 63  end names [objec
10230 74 20 6d 65 6d 62 65 72 73 20 5c 0d 0a 20 20 20  t members \..   
10240 20 20 20 20 20 20 20 20 20 2d 6d 65 6d 62 65 72           -member
10250 74 79 70 65 73 20 46 69 65 6c 64 20 2d 6e 61 6d  types Field -nam
10260 65 6f 6e 6c 79 20 24 6f 62 6a 65 63 74 5d 0d 0a  eonly $object]..
10270 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
10280 20 66 6f 72 65 61 63 68 20 6e 61 6d 65 20 24 6e   foreach name $n
10290 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20  ames {..        
102a0 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20  if {[catch {..  
102b0 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69          object i
102c0 6e 76 6f 6b 65 20 2d 6f 62 6a 65 63 74 66 6c 61  nvoke -objectfla
102d0 67 73 20 2b 4e 6f 44 69 73 70 6f 73 65 20 24 6f  gs +NoDispose $o
102e0 62 6a 65 63 74 20 24 6e 61 6d 65 0d 0a 20 20 20  bject $name..   
102f0 20 20 20 20 20 7d 20 76 61 6c 75 65 5d 20 3d 3d       } value] ==
10300 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
10310 20 20 20 20 20 20 69 66 20 7b 5b 69 73 4f 62 6a        if {[isObj
10320 65 63 74 48 61 6e 64 6c 65 20 24 76 61 6c 75 65  ectHandle $value
10330 5d 20 26 26 20 24 76 61 6c 75 65 20 6e 65 20 22  ] && $value ne "
10340 6e 75 6c 6c 22 7d 20 74 68 65 6e 20 7b 0d 0a 20  null"} then {.. 
10350 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 65             set e
10360 72 72 6f 72 20 6e 75 6c 6c 3b 20 6f 62 6a 65 63  rror null; objec
10370 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20  t invoke -flags 
10380 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20  +NonPublic \..  
10390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 6d                -m
103a0 61 72 73 68 61 6c 66 6c 61 67 73 20 2b 4e 6f 48  arshalflags +NoH
103b0 61 6e 64 6c 65 20 49 6e 74 65 72 70 72 65 74 65  andle Interprete
103c0 72 2e 47 65 74 41 63 74 69 76 65 20 5c 0d 0a 20  r.GetActive \.. 
103d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 41                 A
103e0 64 64 4f 62 6a 65 63 74 52 65 66 65 72 65 6e 63  ddObjectReferenc
103f0 65 20 4f 6b 20 24 76 61 6c 75 65 20 65 72 72 6f  e Ok $value erro
10400 72 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  r....           
10410 20 6c 61 70 70 65 6e 64 20 70 72 6f 70 65 72 74   lappend propert
10420 69 65 73 28 6f 62 6a 65 63 74 73 29 20 5b 6c 69  ies(objects) [li
10430 73 74 20 24 6e 61 6d 65 20 24 76 61 6c 75 65 5d  st $name $value]
10440 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c  ..          } el
10450 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
10460 20 20 6c 61 70 70 65 6e 64 20 70 72 6f 70 65 72    lappend proper
10470 74 69 65 73 28 76 61 6c 75 65 73 29 20 5b 6c 69  ties(values) [li
10480 73 74 20 24 6e 61 6d 65 20 24 76 61 6c 75 65 5d  st $name $value]
10490 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d  ..          }...
104a0 0a 20 20 20 20 20 20 20 20 20 20 69 6e 63 72 20  .          incr 
104b0 63 6f 75 6e 74 0d 0a 20 20 20 20 20 20 20 20 7d  count..        }
104c0 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
104d0 20 20 20 6c 61 70 70 65 6e 64 20 70 72 6f 70 65     lappend prope
104e0 72 74 69 65 73 28 65 72 72 6f 72 73 29 20 5b 6c  rties(errors) [l
104f0 69 73 74 20 24 6e 61 6d 65 20 24 3a 3a 65 72 72  ist $name $::err
10500 6f 72 43 6f 64 65 5d 0d 0a 20 20 20 20 20 20 20  orCode]..       
10510 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20   }..      }.... 
10520 20 20 20 20 20 72 65 74 75 72 6e 20 24 63 6f 75       return $cou
10530 6e 74 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  nt..    }.....  
10540 20 20 70 72 6f 63 20 67 65 74 41 6c 6c 50 72 6f    proc getAllPro
10550 70 65 72 74 69 65 73 20 7b 20 6f 62 6a 65 63 74  perties { object
10560 20 76 61 72 4e 61 6d 65 20 7d 20 7b 0d 0a 20 20   varName } {..  
10570 20 20 20 20 75 70 76 61 72 20 31 20 24 76 61 72      upvar 1 $var
10580 4e 61 6d 65 20 70 72 6f 70 65 72 74 69 65 73 0d  Name properties.
10590 0a 20 20 20 20 20 20 73 65 74 20 76 61 6c 75 65  .      set value
105a0 20 24 6f 62 6a 65 63 74 0d 0a 0d 0a 20 20 20 20   $object....    
105b0 20 20 77 68 69 6c 65 20 7b 74 72 75 65 7d 20 7b    while {true} {
105c0 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b  ..        if {![
105d0 69 6e 66 6f 20 65 78 69 73 74 73 20 70 72 6f 70  info exists prop
105e0 65 72 74 69 65 73 28 73 65 65 6e 4f 62 6a 65 63  erties(seenObjec
105f0 74 73 29 5d 20 7c 7c 20 5c 0d 0a 20 20 20 20 20  ts)] || \..     
10600 20 20 20 20 20 20 20 24 76 61 6c 75 65 20 6e 69         $value ni
10610 20 24 70 72 6f 70 65 72 74 69 65 73 28 73 65 65   $properties(see
10620 6e 4f 62 6a 65 63 74 73 29 7d 20 74 68 65 6e 20  nObjects)} then 
10630 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 67 65 74  {..          get
10640 50 72 6f 70 65 72 74 69 65 73 20 24 76 61 6c 75  Properties $valu
10650 65 20 70 72 6f 70 65 72 74 69 65 73 0d 0a 20 20  e properties..  
10660 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20          lappend 
10670 70 72 6f 70 65 72 74 69 65 73 28 73 65 65 6e 4f  properties(seenO
10680 62 6a 65 63 74 73 29 20 24 76 61 6c 75 65 0d 0a  bjects) $value..
10690 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
106a0 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
106b0 65 78 69 73 74 73 20 70 72 6f 70 65 72 74 69 65  exists propertie
106c0 73 28 6f 62 6a 65 63 74 73 29 5d 7d 20 74 68 65  s(objects)]} the
106d0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 62  n {..          b
106e0 72 65 61 6b 0d 0a 20 20 20 20 20 20 20 20 7d 0d  reak..        }.
106f0 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  ...        if {[
10700 6c 6c 65 6e 67 74 68 20 24 70 72 6f 70 65 72 74  llength $propert
10710 69 65 73 28 6f 62 6a 65 63 74 73 29 5d 20 3d 3d  ies(objects)] ==
10720 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
10730 20 20 20 20 20 20 75 6e 73 65 74 20 70 72 6f 70        unset prop
10740 65 72 74 69 65 73 28 6f 62 6a 65 63 74 73 29 3b  erties(objects);
10750 20 62 72 65 61 6b 0d 0a 20 20 20 20 20 20 20 20   break..        
10760 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74  }....        set
10770 20 76 61 6c 75 65 20 5b 6c 69 6e 64 65 78 20 5b   value [lindex [
10780 6c 69 6e 64 65 78 20 24 70 72 6f 70 65 72 74 69  lindex $properti
10790 65 73 28 6f 62 6a 65 63 74 73 29 20 30 5d 20 65  es(objects) 0] e
107a0 6e 64 5d 0d 0a 20 20 20 20 20 20 20 20 73 65 74  nd]..        set
107b0 20 70 72 6f 70 65 72 74 69 65 73 28 6f 62 6a 65   properties(obje
107c0 63 74 73 29 20 5b 6c 72 61 6e 67 65 20 24 70 72  cts) [lrange $pr
107d0 6f 70 65 72 74 69 65 73 28 6f 62 6a 65 63 74 73  operties(objects
107e0 29 20 31 20 65 6e 64 5d 0d 0a 20 20 20 20 20 20  ) 1 end]..      
107f0 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  }....      if {[
10800 69 6e 66 6f 20 65 78 69 73 74 73 20 70 72 6f 70  info exists prop
10810 65 72 74 69 65 73 28 73 65 65 6e 4f 62 6a 65 63  erties(seenObjec
10820 74 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ts)]} then {..  
10830 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 76 61        foreach va
10840 6c 75 65 20 24 70 72 6f 70 65 72 74 69 65 73 28  lue $properties(
10850 73 65 65 6e 4f 62 6a 65 63 74 73 29 20 7b 0d 0a  seenObjects) {..
10860 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 24 76            if {$v
10870 61 6c 75 65 20 65 71 20 24 6f 62 6a 65 63 74 7d  alue eq $object}
10880 20 63 6f 6e 74 69 6e 75 65 0d 0a 20 20 20 20 20   continue..     
10890 20 20 20 20 20 63 61 74 63 68 20 7b 6f 62 6a 65       catch {obje
108a0 63 74 20 64 69 73 70 6f 73 65 20 24 76 61 6c 75  ct dispose $valu
108b0 65 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  e}..        }...
108c0 0a 20 20 20 20 20 20 20 20 75 6e 73 65 74 20 70  .        unset p
108d0 72 6f 70 65 72 74 69 65 73 28 73 65 65 6e 4f 62  roperties(seenOb
108e0 6a 65 63 74 73 29 0d 0a 20 20 20 20 20 20 7d 0d  jects)..      }.
108f0 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
10900 72 6f 63 20 67 65 74 56 61 72 69 61 62 6c 65 73  roc getVariables
10910 20 7b 20 76 61 72 4e 61 6d 65 73 20 7b 6f 62 6a   { varNames {obj
10920 65 63 74 73 20 66 61 6c 73 65 7d 20 7d 20 7b 0d  ects false} } {.
10930 0a 20 20 20 20 20 20 73 65 74 20 72 65 73 75 6c  .      set resul
10940 74 20 5b 6c 69 73 74 5d 0d 0a 0d 0a 20 20 20 20  t [list]....    
10950 20 20 66 6f 72 65 61 63 68 20 76 61 72 4e 61 6d    foreach varNam
10960 65 20 24 76 61 72 4e 61 6d 65 73 20 7b 0d 0a 20  e $varNames {.. 
10970 20 20 20 20 20 20 20 69 66 20 7b 5b 75 70 6c 65         if {[uple
10980 76 65 6c 20 31 20 5b 6c 69 73 74 20 61 72 72 61  vel 1 [list arra
10990 79 20 65 78 69 73 74 73 20 24 76 61 72 4e 61 6d  y exists $varNam
109a0 65 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  e]]} then {..   
109b0 20 20 20 20 20 20 20 73 65 74 20 61 72 72 61 79         set array
109c0 4e 61 6d 65 20 24 76 61 72 4e 61 6d 65 0d 0a 0d  Name $varName...
109d0 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61  .          forea
109e0 63 68 20 65 6c 65 6d 65 6e 74 4e 61 6d 65 20 5b  ch elementName [
109f0 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74 20  uplevel 1 [list 
10a00 61 72 72 61 79 20 6e 61 6d 65 73 20 24 61 72 72  array names $arr
10a10 61 79 4e 61 6d 65 5d 5d 20 7b 0d 0a 20 20 20 20  ayName]] {..    
10a20 20 20 20 20 20 20 20 20 73 65 74 20 6e 61 6d 65          set name
10a30 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 61 72   [appendArgs $ar
10a40 72 61 79 4e 61 6d 65 20 28 20 24 65 6c 65 6d 65  rayName ( $eleme
10a50 6e 74 4e 61 6d 65 20 29 5d 0d 0a 20 20 20 20 20  ntName )]..     
10a60 20 20 20 20 20 20 20 73 65 74 20 76 61 72 56 61         set varVa
10a70 6c 75 65 20 5b 75 70 6c 65 76 65 6c 20 31 20 5b  lue [uplevel 1 [
10a80 6c 69 73 74 20 73 65 74 20 24 6e 61 6d 65 5d 5d  list set $name]]
10a90 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
10aa0 69 66 20 7b 24 6f 62 6a 65 63 74 73 20 26 26 20  if {$objects && 
10ab0 5b 69 73 4f 62 6a 65 63 74 48 61 6e 64 6c 65 20  [isObjectHandle 
10ac0 24 76 61 72 56 61 6c 75 65 5d 7d 20 74 68 65 6e  $varValue]} then
10ad0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
10ae0 20 20 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c    unset -nocompl
10af0 61 69 6e 20 70 72 6f 70 65 72 74 69 65 73 0d 0a  ain properties..
10b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67 65                ge
10b10 74 41 6c 6c 50 72 6f 70 65 72 74 69 65 73 20 24  tAllProperties $
10b20 76 61 72 56 61 6c 75 65 20 70 72 6f 70 65 72 74  varValue propert
10b30 69 65 73 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ies....         
10b40 20 20 20 20 20 6c 61 70 70 65 6e 64 20 72 65 73       lappend res
10b50 75 6c 74 20 5b 6c 69 73 74 20 24 6e 61 6d 65 20  ult [list $name 
10b60 5b 61 72 72 61 79 20 67 65 74 20 70 72 6f 70 65  [array get prope
10b70 72 74 69 65 73 5d 5d 0d 0a 20 20 20 20 20 20 20  rties]]..       
10b80 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
10b90 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 61 70               lap
10ba0 70 65 6e 64 20 72 65 73 75 6c 74 20 5b 6c 69 73  pend result [lis
10bb0 74 20 24 6e 61 6d 65 20 24 76 61 72 56 61 6c 75  t $name $varValu
10bc0 65 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e]..            
10bd0 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  }..          }..
10be0 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
10bf0 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
10c00 76 61 72 56 61 6c 75 65 20 5b 75 70 6c 65 76 65  varValue [upleve
10c10 6c 20 31 20 5b 6c 69 73 74 20 73 65 74 20 24 76  l 1 [list set $v
10c20 61 72 4e 61 6d 65 5d 5d 0d 0a 0d 0a 20 20 20 20  arName]]....    
10c30 20 20 20 20 20 20 69 66 20 7b 24 6f 62 6a 65 63        if {$objec
10c40 74 73 20 26 26 20 5b 69 73 4f 62 6a 65 63 74 48  ts && [isObjectH
10c50 61 6e 64 6c 65 20 24 76 61 72 56 61 6c 75 65 5d  andle $varValue]
10c60 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
10c70 20 20 20 20 20 20 75 6e 73 65 74 20 2d 6e 6f 63        unset -noc
10c80 6f 6d 70 6c 61 69 6e 20 70 72 6f 70 65 72 74 69  omplain properti
10c90 65 73 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  es..            
10ca0 67 65 74 41 6c 6c 50 72 6f 70 65 72 74 69 65 73  getAllProperties
10cb0 20 24 76 61 72 56 61 6c 75 65 20 70 72 6f 70 65   $varValue prope
10cc0 72 74 69 65 73 0d 0a 0d 0a 20 20 20 20 20 20 20  rties....       
10cd0 20 20 20 20 20 6c 61 70 70 65 6e 64 20 72 65 73       lappend res
10ce0 75 6c 74 20 5b 6c 69 73 74 20 24 76 61 72 4e 61  ult [list $varNa
10cf0 6d 65 20 5b 61 72 72 61 79 20 67 65 74 20 70 72  me [array get pr
10d00 6f 70 65 72 74 69 65 73 5d 5d 0d 0a 20 20 20 20  operties]]..    
10d10 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
10d20 20 20 20 20 20 20 20 20 20 20 20 20 6c 61 70 70              lapp
10d30 65 6e 64 20 72 65 73 75 6c 74 20 5b 6c 69 73 74  end result [list
10d40 20 24 76 61 72 4e 61 6d 65 20 24 76 61 72 56 61   $varName $varVa
10d50 6c 75 65 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  lue]..          
10d60 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  }..        }..  
10d70 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72      }....      r
10d80 65 74 75 72 6e 20 24 72 65 73 75 6c 74 0d 0a 20  eturn $result.. 
10d90 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
10da0 63 20 65 6e 75 6d 65 72 61 62 6c 65 54 6f 4c 69  c enumerableToLi
10db0 73 74 20 7b 20 65 6e 75 6d 65 72 61 62 6c 65 20  st { enumerable 
10dc0 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 72  } {..      set r
10dd0 65 73 75 6c 74 20 5b 6c 69 73 74 5d 0d 0a 0d 0a  esult [list]....
10de0 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
10df0 67 20 6c 65 6e 67 74 68 20 24 65 6e 75 6d 65 72  g length $enumer
10e00 61 62 6c 65 5d 20 3d 3d 20 30 20 7c 7c 20 24 65  able] == 0 || $e
10e10 6e 75 6d 65 72 61 62 6c 65 20 65 71 20 22 6e 75  numerable eq "nu
10e20 6c 6c 22 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ll"} then {..   
10e30 20 20 20 20 20 72 65 74 75 72 6e 20 24 72 65 73       return $res
10e40 75 6c 74 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  ult..      }....
10e50 20 20 20 20 20 20 6f 62 6a 65 63 74 20 66 6f 72        object for
10e60 65 61 63 68 20 2d 61 6c 69 61 73 20 69 74 65 6d  each -alias item
10e70 20 24 65 6e 75 6d 65 72 61 62 6c 65 20 7b 0d 0a   $enumerable {..
10e80 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72          if {[str
10e90 69 6e 67 20 6c 65 6e 67 74 68 20 24 69 74 65 6d  ing length $item
10ea0 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
10eb0 20 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64           lappend
10ec0 20 72 65 73 75 6c 74 20 5b 24 69 74 65 6d 20 54   result [$item T
10ed0 6f 53 74 72 69 6e 67 5d 0d 0a 20 20 20 20 20 20  oString]..      
10ee0 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a    }..      }....
10ef0 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 72 65        return $re
10f00 73 75 6c 74 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  sult..    }.....
10f10 20 20 20 20 70 72 6f 63 20 63 61 74 63 68 41 6e      proc catchAn
10f20 64 52 65 74 75 72 6e 20 7b 20 73 63 72 69 70 74  dReturn { script
10f30 20 7b 73 74 61 63 6b 54 72 61 63 65 20 66 61 6c   {stackTrace fal
10f40 73 65 7d 20 7b 73 74 72 69 63 74 20 74 72 75 65  se} {strict true
10f50 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a  } } {..      #..
10f60 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 45 76        # NOTE: Ev
10f70 61 6c 75 61 74 65 20 74 68 65 20 73 63 72 69 70  aluate the scrip
10f80 74 20 70 72 6f 76 69 64 65 64 20 62 79 20 6f 75  t provided by ou
10f90 72 20 63 61 6c 6c 65 72 20 69 6e 20 74 68 65 69  r caller in thei
10fa0 72 20 63 6f 6e 74 65 78 74 2c 0d 0a 20 20 20 20  r context,..    
10fb0 20 20 23 20 20 20 20 20 20 20 63 61 70 74 75 72    #       captur
10fc0 69 6e 67 20 62 6f 74 68 20 74 68 65 20 72 65 73  ing both the res
10fd0 75 6c 74 20 61 6e 64 20 74 68 65 20 72 65 74 75  ult and the retu
10fe0 72 6e 20 63 6f 64 65 2e 0d 0a 20 20 20 20 20 20  rn code...      
10ff0 23 0d 0a 20 20 20 20 20 20 73 65 74 20 63 6f 64  #..      set cod
11000 65 20 5b 63 61 74 63 68 20 7b 75 70 6c 65 76 65  e [catch {upleve
11010 6c 20 31 20 24 73 63 72 69 70 74 7d 20 72 65 73  l 1 $script} res
11020 75 6c 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d  ult]....      #.
11030 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 44  .      # NOTE: D
11040 69 64 20 74 68 65 20 73 63 72 69 70 74 20 70 72  id the script pr
11050 6f 76 69 64 65 64 20 62 79 20 6f 75 72 20 63 61  ovided by our ca
11060 6c 6c 65 72 20 4e 4f 54 20 72 61 69 73 65 20 61  ller NOT raise a
11070 6e 20 65 72 72 6f 72 3f 0d 0a 20 20 20 20 20 20  n error?..      
11080 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 73 74  #..      if {$st
11090 72 69 63 74 20 26 26 20 24 63 6f 64 65 20 3d 3d  rict && $code ==
110a0 20 30 20 7c 7c 20 21 24 73 74 72 69 63 74 20 26   0 || !$strict &
110b0 26 20 24 63 6f 64 65 20 21 3d 20 31 7d 20 74 68  & $code != 1} th
110c0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
110d0 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
110e0 20 53 75 63 63 65 73 73 2e 20 20 52 65 74 75 72   Success.  Retur
110f0 6e 20 61 20 6c 69 73 74 20 77 69 74 68 20 74 68  n a list with th
11100 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 61 6e  e return code an
11110 64 20 74 68 65 20 72 65 73 75 6c 74 2e 0d 0a 20  d the result... 
11120 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
11130 20 20 72 65 74 75 72 6e 20 5b 6c 69 73 74 20 24    return [list $
11140 63 6f 64 65 20 24 72 65 73 75 6c 74 5d 0d 0a 20  code $result].. 
11150 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 24       } elseif {$
11160 73 74 61 63 6b 54 72 61 63 65 7d 20 74 68 65 6e  stackTrace} then
11170 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
11180 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46         # NOTE: F
11190 61 69 6c 75 72 65 2e 20 20 4f 75 72 20 63 61 6c  ailure.  Our cal
111a0 6c 65 72 20 77 61 6e 74 73 20 61 20 66 75 6c 6c  ler wants a full
111b0 20 73 74 61 63 6b 20 74 72 61 63 65 20 28 69 66   stack trace (if
111c0 20 61 70 70 6c 69 63 61 62 6c 65 29 2c 0d 0a 20   applicable),.. 
111d0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 72         #       r
111e0 65 74 75 72 6e 20 61 20 6c 69 73 74 20 77 69 74  eturn a list wit
111f0 68 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64  h the return cod
11200 65 20 61 6e 64 20 74 68 65 20 72 65 73 75 6c 74  e and the result
11210 20 76 65 72 62 61 74 69 6d 2e 0d 0a 20 20 20 20   verbatim...    
11220 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
11230 65 74 75 72 6e 20 5b 6c 69 73 74 20 24 63 6f 64  eturn [list $cod
11240 65 20 24 72 65 73 75 6c 74 5d 0d 0a 20 20 20 20  e $result]..    
11250 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
11260 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
11270 20 4e 4f 54 45 3a 20 46 61 69 6c 75 72 65 2e 20   NOTE: Failure. 
11280 20 4f 75 72 20 63 61 6c 6c 65 72 20 64 6f 65 73   Our caller does
11290 20 6e 6f 74 20 77 61 6e 74 20 61 20 66 75 6c 6c   not want a full
112a0 20 73 74 61 63 6b 20 74 72 61 63 65 20 28 69 66   stack trace (if
112b0 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
112c0 20 20 61 70 70 6c 69 63 61 62 6c 65 29 2c 20 72    applicable), r
112d0 65 74 75 72 6e 20 61 20 6c 69 73 74 20 77 69 74  eturn a list wit
112e0 68 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64  h the return cod
112f0 65 2c 20 74 68 65 20 65 72 72 6f 72 0d 0a 20 20  e, the error..  
11300 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f        #       co
11310 64 65 20 66 6f 72 20 74 68 65 20 69 6e 74 65 72  de for the inter
11320 70 72 65 74 65 72 2c 20 61 6e 64 20 74 68 65 20  preter, and the 
11330 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 75 70  error message up
11340 20 74 6f 20 74 68 65 0d 0a 20 20 20 20 20 20 20   to the..       
11350 20 23 20 20 20 20 20 20 20 70 6f 69 6e 74 20 77   #       point w
11360 68 65 72 65 20 74 68 65 20 73 74 61 63 6b 20 74  here the stack t
11370 72 61 63 65 20 73 68 6f 75 6c 64 20 73 74 61 72  race should star
11380 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  t...        #.. 
11390 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6c         return [l
113a0 69 73 74 20 24 63 6f 64 65 20 24 3a 3a 65 72 72  ist $code $::err
113b0 6f 72 43 6f 64 65 20 5c 0d 0a 20 20 20 20 20 20  orCode \..      
113c0 20 20 20 20 20 20 5b 65 78 74 72 61 63 74 53 79        [extractSy
113d0 73 74 65 6d 44 61 74 61 53 51 4c 69 74 65 45 78  stemDataSQLiteEx
113e0 63 65 70 74 69 6f 6e 4d 65 73 73 61 67 65 20 24  ceptionMessage $
113f0 72 65 73 75 6c 74 5d 5d 0d 0a 20 20 20 20 20 20  result]]..      
11400 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
11410 20 70 72 6f 63 20 63 6f 6d 70 69 6c 65 43 53 68   proc compileCSh
11420 61 72 70 57 69 74 68 20 7b 0d 0a 20 20 20 20 20  arpWith {..     
11430 20 20 20 20 20 20 20 74 65 78 74 20 6d 65 6d 6f         text memo
11440 72 79 20 73 79 6d 62 6f 6c 73 20 73 74 72 69 63  ry symbols stric
11450 74 20 72 65 73 75 6c 74 73 56 61 72 4e 61 6d 65  t resultsVarName
11460 20 65 72 72 6f 72 73 56 61 72 4e 61 6d 65 20 66   errorsVarName f
11470 69 6c 65 4e 61 6d 65 73 0d 0a 20 20 20 20 20 20  ileNames..      
11480 20 20 20 20 20 20 61 72 67 73 20 7d 20 7b 0d 0a        args } {..
11490 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
114a0 20 4e 4f 54 45 3a 20 53 69 6e 63 65 20 77 65 20   NOTE: Since we 
114b0 61 72 65 20 67 6f 69 6e 67 20 74 6f 20 75 73 65  are going to use
114c0 20 74 68 69 73 20 6d 65 74 68 6f 64 20 6e 61 6d   this method nam
114d0 65 20 61 20 6c 6f 74 2c 20 61 73 73 69 67 6e 20  e a lot, assign 
114e0 69 74 20 74 6f 20 61 0d 0a 20 20 20 20 20 20 23  it to a..      #
114f0 20 20 20 20 20 20 20 76 61 72 69 61 62 6c 65 20         variable 
11500 66 69 72 73 74 2e 0d 0a 20 20 20 20 20 20 23 0d  first...      #.
11510 0a 20 20 20 20 20 20 73 65 74 20 61 64 64 20 52  .      set add R
11520 65 66 65 72 65 6e 63 65 64 41 73 73 65 6d 62 6c  eferencedAssembl
11530 69 65 73 2e 41 64 64 0d 0a 0d 0a 20 20 20 20 20  ies.Add....     
11540 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
11550 3a 20 43 72 65 61 74 65 20 74 68 65 20 62 61 73  : Create the bas
11560 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61  e command to eva
11570 6c 75 61 74 65 20 61 6e 64 20 61 64 64 20 74 68  luate and add th
11580 65 20 70 72 6f 70 65 72 74 79 20 73 65 74 74 69  e property setti
11590 6e 67 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ngs..      #    
115a0 20 20 20 74 68 61 74 20 61 72 65 20 61 6c 6d 6f     that are almo
115b0 73 74 20 61 6c 77 61 79 73 20 6e 65 65 64 65 64  st always needed
115c0 20 62 79 20 6f 75 72 20 75 6e 69 74 20 74 65 73   by our unit tes
115d0 74 73 20 28 69 2e 65 2e 20 74 68 65 20 53 79 73  ts (i.e. the Sys
115e0 74 65 6d 0d 0a 20 20 20 20 20 20 23 20 20 20 20  tem..      #    
115f0 20 20 20 61 6e 64 20 53 79 73 74 65 6d 2e 44 61     and System.Da
11600 74 61 20 61 73 73 65 6d 62 6c 79 20 72 65 66 65  ta assembly refe
11610 72 65 6e 63 65 73 29 2e 0d 0a 20 20 20 20 20 20  rences)...      
11620 23 0d 0a 20 20 20 20 20 20 73 65 74 20 63 6f 6d  #..      set com
11630 6d 61 6e 64 20 5b 6c 69 73 74 20 5c 0d 0a 20 20  mand [list \..  
11640 20 20 20 20 20 20 20 20 63 6f 6d 70 69 6c 65 43          compileC
11650 53 68 61 72 70 20 24 74 65 78 74 20 24 6d 65 6d  Sharp $text $mem
11660 6f 72 79 20 24 73 79 6d 62 6f 6c 73 20 24 73 74  ory $symbols $st
11670 72 69 63 74 20 72 65 73 75 6c 74 73 20 65 72 72  rict results err
11680 6f 72 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ors \..         
11690 20 24 61 64 64 20 53 79 73 74 65 6d 2e 64 6c 6c   $add System.dll
116a0 20 24 61 64 64 20 53 79 73 74 65 6d 2e 44 61 74   $add System.Dat
116b0 61 2e 64 6c 6c 20 24 61 64 64 20 53 79 73 74 65  a.dll $add Syste
116c0 6d 2e 54 72 61 6e 73 61 63 74 69 6f 6e 73 2e 64  m.Transactions.d
116d0 6c 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ll \..          
116e0 24 61 64 64 20 53 79 73 74 65 6d 2e 58 6d 6c 2e  $add System.Xml.
116f0 64 6c 6c 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d  dll]....      #.
11700 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41  .      # NOTE: A
11710 64 64 20 61 6c 6c 20 74 68 65 20 70 72 6f 76 69  dd all the provi
11720 64 65 64 20 66 69 6c 65 20 6e 61 6d 65 73 20 61  ded file names a
11730 73 20 61 73 73 65 6d 62 6c 79 20 72 65 66 65 72  s assembly refer
11740 65 6e 63 65 73 2e 0d 0a 20 20 20 20 20 20 23 0d  ences...      #.
11750 0a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66  .      foreach f
11760 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d  ileName $fileNam
11770 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 6c 61  es {..        la
11780 70 70 65 6e 64 20 63 6f 6d 6d 61 6e 64 20 24 61  ppend command $a
11790 64 64 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c  dd [getBinaryFil
117a0 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 5d  eName $fileName]
117b0 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
117c0 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
117d0 54 45 3a 20 41 64 64 20 74 68 65 20 65 78 74 72  TE: Add the extr
117e0 61 20 61 72 67 75 6d 65 6e 74 73 2c 20 69 66 20  a arguments, if 
117f0 61 6e 79 2c 20 74 6f 20 74 68 65 20 63 6f 6d 6d  any, to the comm
11800 61 6e 64 20 74 6f 20 65 76 61 6c 75 61 74 65 2e  and to evaluate.
11810 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
11820 20 65 76 61 6c 20 6c 61 70 70 65 6e 64 20 63 6f   eval lappend co
11830 6d 6d 61 6e 64 20 24 61 72 67 73 0d 0a 0d 0a 20  mmand $args.... 
11840 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
11850 4e 4f 54 45 3a 20 41 6c 69 61 73 20 74 68 65 20  NOTE: Alias the 
11860 63 6f 6d 70 69 6c 65 72 20 6c 6f 63 61 6c 20 72  compiler local r
11870 65 73 75 6c 74 73 20 61 6e 64 20 65 72 72 6f 72  esults and error
11880 73 20 76 61 72 69 61 62 6c 65 73 20 74 6f 20 74  s variables to t
11890 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  he..      #     
118a0 20 20 76 61 72 69 61 62 6c 65 20 6e 61 6d 65 73    variable names
118b0 20 70 72 6f 76 69 64 65 64 20 62 79 20 6f 75 72   provided by our
118c0 20 63 61 6c 6c 65 72 2e 0d 0a 20 20 20 20 20 20   caller...      
118d0 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74  #..      if {[st
118e0 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 72 65 73  ring length $res
118f0 75 6c 74 73 56 61 72 4e 61 6d 65 5d 20 3e 20 30  ultsVarName] > 0
11900 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
11910 20 20 75 70 76 61 72 20 31 20 24 72 65 73 75 6c    upvar 1 $resul
11920 74 73 56 61 72 4e 61 6d 65 20 72 65 73 75 6c 74  tsVarName result
11930 73 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  s..      }....  
11940 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
11950 6c 65 6e 67 74 68 20 24 65 72 72 6f 72 73 56 61  length $errorsVa
11960 72 4e 61 6d 65 5d 20 3e 20 30 7d 20 74 68 65 6e  rName] > 0} then
11970 20 7b 0d 0a 20 20 20 20 20 20 20 20 75 70 76 61   {..        upva
11980 72 20 31 20 24 65 72 72 6f 72 73 56 61 72 4e 61  r 1 $errorsVarNa
11990 6d 65 20 65 72 72 6f 72 73 0d 0a 20 20 20 20 20  me errors..     
119a0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   }....      #.. 
119b0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 45 76 61       # NOTE: Eva
119c0 6c 75 61 74 65 20 74 68 65 20 63 6f 6e 73 74 72  luate the constr
119d0 75 63 74 65 64 20 5b 63 6f 6d 70 69 6c 65 43 53  ucted [compileCS
119e0 68 61 72 70 5d 20 63 6f 6d 6d 61 6e 64 20 61 6e  harp] command an
119f0 64 20 72 65 74 75 72 6e 20 74 68 65 0d 0a 20 20  d return the..  
11a00 20 20 20 20 23 20 20 20 20 20 20 20 72 65 73 75      #       resu
11a10 6c 74 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  lt...      #..  
11a20 20 20 20 20 65 76 61 6c 20 24 63 6f 6d 6d 61 6e      eval $comman
11a30 64 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  d..    }.....   
11a40 20 70 72 6f 63 20 69 73 4d 65 6d 6f 72 79 44 62   proc isMemoryDb
11a50 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7d 20 7b 0d   { fileName } {.
11a60 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
11a70 23 20 4e 4f 54 45 3a 20 49 73 20 74 68 65 20 73  # NOTE: Is the s
11a80 70 65 63 69 66 69 65 64 20 64 61 74 61 62 61 73  pecified databas
11a90 65 20 66 69 6c 65 20 6e 61 6d 65 20 72 65 61 6c  e file name real
11aa0 6c 79 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  ly an in-memory 
11ab0 64 61 74 61 62 61 73 65 3f 0d 0a 20 20 20 20 20  database?..     
11ac0 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e   #..      return
11ad0 20 5b 65 78 70 72 20 7b 24 66 69 6c 65 4e 61 6d   [expr {$fileNam
11ae0 65 20 65 71 20 22 3a 6d 65 6d 6f 72 79 3a 22 20  e eq ":memory:" 
11af0 7c 7c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  || \..          
11b00 5b 73 74 72 69 6e 67 20 72 61 6e 67 65 20 24 66  [string range $f
11b10 69 6c 65 4e 61 6d 65 20 30 20 31 32 5d 20 65 71  ileName 0 12] eq
11b20 20 22 66 69 6c 65 3a 3a 6d 65 6d 6f 72 79 3a 22   "file::memory:"
11b30 7d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  }]..    }.....  
11b40 20 20 70 72 6f 63 20 69 73 54 61 62 6c 65 49 6e    proc isTableIn
11b50 44 62 20 7b 20 6e 61 6d 65 20 7b 76 61 72 4e 61  Db { name {varNa
11b60 6d 65 20 64 62 7d 20 7d 20 7b 0d 0a 20 20 20 20  me db} } {..    
11b70 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
11b80 45 3a 20 52 65 66 65 72 20 74 6f 20 74 68 65 20  E: Refer to the 
11b90 73 70 65 63 69 66 69 65 64 20 76 61 72 69 61 62  specified variab
11ba0 6c 65 20 28 65 2e 67 2e 20 22 64 62 22 29 20 69  le (e.g. "db") i
11bb0 6e 20 74 68 65 20 63 6f 6e 74 65 78 74 20 6f 66  n the context of
11bc0 20 6f 75 72 0d 0a 20 20 20 20 20 20 23 20 20 20   our..      #   
11bd0 20 20 20 20 63 61 6c 6c 65 72 2e 20 20 49 74 20      caller.  It 
11be0 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74  contains the dat
11bf0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
11c00 20 68 61 6e 64 6c 65 20 74 68 61 74 20 77 69 6c   handle that wil
11c10 6c 20 62 65 0d 0a 20 20 20 20 20 20 23 20 20 20  l be..      #   
11c20 20 20 20 20 75 73 65 64 20 74 6f 20 65 78 65 63      used to exec
11c30 75 74 65 20 74 68 65 20 71 75 65 72 79 20 75 73  ute the query us
11c40 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ed to determine 
11c50 69 66 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62  if the named tab
11c60 6c 65 20 69 73 0d 0a 20 20 20 20 20 20 23 20 20  le is..      #  
11c70 20 20 20 20 20 70 72 65 73 65 6e 74 20 69 6e 20       present in 
11c80 74 68 61 74 20 64 61 74 61 62 61 73 65 2e 0d 0a  that database...
11c90 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 75        #..      u
11ca0 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65 20  pvar 1 $varName 
11cb0 64 62 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20  db....      #.. 
11cc0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65       # NOTE: Use
11cd0 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
11ce0 65 72 20 74 61 62 6c 65 20 74 6f 20 64 65 74 65  er table to dete
11cf0 72 6d 69 6e 65 20 69 66 20 74 68 65 20 6e 61 6d  rmine if the nam
11d00 65 64 20 74 61 62 6c 65 20 69 73 0d 0a 20 20 20  ed table is..   
11d10 20 20 20 23 20 20 20 20 20 20 20 70 72 65 73 65     #       prese
11d20 6e 74 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  nt in the databa
11d30 73 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  se...      #..  
11d40 20 20 20 20 73 65 74 20 73 71 6c 20 7b 0d 0a 20      set sql {.. 
11d50 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 43 4f         SELECT CO
11d60 55 4e 54 28 2a 29 20 46 52 4f 4d 20 73 71 6c 69  UNT(*) FROM sqli
11d70 74 65 5f 6d 61 73 74 65 72 20 57 48 45 52 45 20  te_master WHERE 
11d80 74 79 70 65 20 3d 20 27 74 61 62 6c 65 27 20 41  type = 'table' A
11d90 4e 44 20 6e 61 6d 65 20 3d 20 3f 3b 0d 0a 20 20  ND name = ?;..  
11da0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
11db0 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
11dc0 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20  Return non-zero 
11dd0 69 66 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62  if the named tab
11de0 6c 65 20 69 73 20 70 72 65 73 65 6e 74 2e 0d 0a  le is present...
11df0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72        #..      r
11e00 65 74 75 72 6e 20 5b 65 78 70 72 20 7b 0d 0a 20  eturn [expr {.. 
11e10 20 20 20 20 20 20 20 5b 73 71 6c 20 65 78 65 63         [sql exec
11e20 75 74 65 20 2d 65 78 65 63 75 74 65 20 73 63 61  ute -execute sca
11e30 6c 61 72 20 24 64 62 20 24 73 71 6c 20 5b 6c 69  lar $db $sql [li
11e40 73 74 20 70 61 72 61 6d 31 20 53 74 72 69 6e 67  st param1 String
11e50 20 24 6e 61 6d 65 5d 5d 20 3e 20 30 0d 0a 20 20   $name]] > 0..  
11e60 20 20 20 20 7d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c      }]..    }...
11e70 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 44 62  ..    proc getDb
11e80 44 65 66 61 75 6c 74 50 61 67 65 53 69 7a 65 20  DefaultPageSize 
11e90 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 74 72 79 20  {} {..      try 
11ea0 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 64  {..        set d
11eb0 62 20 5b 73 71 6c 20 6f 70 65 6e 20 2d 74 79 70  b [sql open -typ
11ec0 65 20 53 51 4c 69 74 65 20 7b 44 61 74 61 20 53  e SQLite {Data S
11ed0 6f 75 72 63 65 3d 3a 6d 65 6d 6f 72 79 3a 3b 7d  ource=:memory:;}
11ee0 5d 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ]..        retur
11ef0 6e 20 5b 73 71 6c 20 65 78 65 63 75 74 65 20 2d  n [sql execute -
11f00 65 78 65 63 75 74 65 20 73 63 61 6c 61 72 20 24  execute scalar $
11f10 64 62 20 22 50 52 41 47 4d 41 20 70 61 67 65 5f  db "PRAGMA page_
11f20 73 69 7a 65 3b 22 5d 0d 0a 20 20 20 20 20 20 7d  size;"]..      }
11f30 20 66 69 6e 61 6c 6c 79 20 7b 0d 0a 20 20 20 20   finally {..    
11f40 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
11f50 69 73 74 73 20 64 62 5d 7d 20 74 68 65 6e 20 7b  ists db]} then {
11f60 0d 0a 20 20 20 20 20 20 20 20 20 20 63 61 74 63  ..          catc
11f70 68 20 7b 73 71 6c 20 63 6c 6f 73 65 20 24 64 62  h {sql close $db
11f80 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 75 6e 73  }..          uns
11f90 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 64  et -nocomplain d
11fa0 62 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  b..        }..  
11fb0 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
11fc0 0a 20 20 20 20 70 72 6f 63 20 67 65 74 44 62 44  .    proc getDbD
11fd0 65 66 61 75 6c 74 43 61 63 68 65 53 69 7a 65 20  efaultCacheSize 
11fe0 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 74 72 79 20  {} {..      try 
11ff0 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 64  {..        set d
12000 62 20 5b 73 71 6c 20 6f 70 65 6e 20 2d 74 79 70  b [sql open -typ
12010 65 20 53 51 4c 69 74 65 20 7b 44 61 74 61 20 53  e SQLite {Data S
12020 6f 75 72 63 65 3d 3a 6d 65 6d 6f 72 79 3a 3b 7d  ource=:memory:;}
12030 5d 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ]..        retur
12040 6e 20 5b 73 71 6c 20 65 78 65 63 75 74 65 20 2d  n [sql execute -
12050 65 78 65 63 75 74 65 20 73 63 61 6c 61 72 20 24  execute scalar $
12060 64 62 20 22 50 52 41 47 4d 41 20 63 61 63 68 65  db "PRAGMA cache
12070 5f 73 69 7a 65 3b 22 5d 0d 0a 20 20 20 20 20 20  _size;"]..      
12080 7d 20 66 69 6e 61 6c 6c 79 20 7b 0d 0a 20 20 20  } finally {..   
12090 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65       if {[info e
120a0 78 69 73 74 73 20 64 62 5d 7d 20 74 68 65 6e 20  xists db]} then 
120b0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 61 74  {..          cat
120c0 63 68 20 7b 73 71 6c 20 63 6c 6f 73 65 20 24 64  ch {sql close $d
120d0 62 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 75 6e  b}..          un
120e0 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20  set -nocomplain 
120f0 64 62 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  db..        }.. 
12100 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
12110 0d 0a 20 20 20 20 70 72 6f 63 20 75 73 65 4c 65  ..    proc useLe
12120 67 61 63 79 44 62 50 61 67 65 41 6e 64 43 61 63  gacyDbPageAndCac
12130 68 65 53 69 7a 65 73 20 7b 20 76 61 72 4e 61 6d  heSizes { varNam
12140 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a  e } {..      #..
12150 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65        # NOTE: Re
12160 66 65 72 20 74 6f 20 74 68 65 20 73 70 65 63 69  fer to the speci
12170 66 69 65 64 20 76 61 72 69 61 62 6c 65 20 28 65  fied variable (e
12180 2e 67 2e 20 22 64 62 22 29 20 69 6e 20 74 68 65  .g. "db") in the
12190 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72 0d   context of our.
121a0 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63  .      #       c
121b0 61 6c 6c 65 72 2e 20 20 49 74 20 63 6f 6e 74 61  aller.  It conta
121c0 69 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ins the database
121d0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64   connection hand
121e0 6c 65 20 74 68 61 74 20 77 69 6c 6c 20 62 65 0d  le that will be.
121f0 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 75  .      #       u
12200 73 65 64 20 74 6f 20 65 78 65 63 75 74 65 20 71  sed to execute q
12210 75 65 72 69 65 73 20 75 73 65 64 20 74 6f 20 73  ueries used to s
12220 65 74 20 74 68 65 20 70 61 67 65 20 61 6e 64 20  et the page and 
12230 63 61 63 68 65 20 73 69 7a 65 73 2e 0d 0a 20 20  cache sizes...  
12240 20 20 20 20 23 0d 0a 20 20 20 20 20 20 75 70 76      #..      upv
12250 61 72 20 31 20 24 76 61 72 4e 61 6d 65 20 64 62  ar 1 $varName db
12260 0d 0a 0d 0a 20 20 20 20 20 20 73 71 6c 20 65 78  ....      sql ex
12270 65 63 75 74 65 20 24 64 62 20 7b 0d 0a 20 20 20  ecute $db {..   
12280 20 20 20 20 20 50 52 41 47 4d 41 20 70 61 67 65       PRAGMA page
12290 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b 0d 0a 20  _size = 1024;.. 
122a0 20 20 20 20 20 20 20 50 52 41 47 4d 41 20 63 61         PRAGMA ca
122b0 63 68 65 5f 73 69 7a 65 20 3d 20 32 30 30 30 3b  che_size = 2000;
122c0 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
122d0 20 20 20 72 65 74 75 72 6e 20 5b 6c 69 73 74 20     return [list 
122e0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 71  \..          [sq
122f0 6c 20 65 78 65 63 75 74 65 20 2d 65 78 65 63 75  l execute -execu
12300 74 65 20 73 63 61 6c 61 72 20 24 64 62 20 22 50  te scalar $db "P
12310 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 3b  RAGMA page_size;
12320 22 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  "] \..          
12330 5b 73 71 6c 20 65 78 65 63 75 74 65 20 2d 65 78  [sql execute -ex
12340 65 63 75 74 65 20 73 63 61 6c 61 72 20 24 64 62  ecute scalar $db
12350 20 22 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73   "PRAGMA cache_s
12360 69 7a 65 3b 22 5d 5d 0d 0a 20 20 20 20 7d 0d 0a  ize;"]]..    }..
12370 0c 0d 0a 20 20 20 20 70 72 6f 63 20 65 78 74 72  ...    proc extr
12380 61 63 74 53 79 73 74 65 6d 44 61 74 61 53 51 4c  actSystemDataSQL
12390 69 74 65 45 78 63 65 70 74 69 6f 6e 4d 65 73 73  iteExceptionMess
123a0 61 67 65 20 7b 20 76 61 6c 75 65 20 7d 20 7b 0d  age { value } {.
123b0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
123c0 23 20 4e 4f 54 45 3a 20 49 66 20 74 68 65 20 73  # NOTE: If the s
123d0 74 72 69 6e 67 20 63 6f 6e 66 6f 72 6d 73 20 74  tring conforms t
123e0 6f 20 66 6f 72 6d 61 74 20 6f 66 20 74 68 65 20  o format of the 
123f0 6e 6f 72 6d 61 6c 20 65 78 63 65 70 74 69 6f 6e  normal exception
12400 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
12410 65 72 72 6f 72 20 73 74 72 69 6e 67 73 2c 20 65  error strings, e
12420 78 74 72 61 63 74 20 61 6e 64 20 72 65 74 75 72  xtract and retur
12430 6e 20 6f 6e 6c 79 20 74 68 65 20 65 72 72 6f 72  n only the error
12440 20 6d 65 73 73 61 67 65 0d 0a 20 20 20 20 20 20   message..      
12450 23 20 20 20 20 20 20 20 70 6f 72 74 69 6f 6e 20  #       portion 
12460 69 74 73 65 6c 66 2e 0d 0a 20 20 20 20 20 20 23  itself...      #
12470 0d 0a 20 20 20 20 20 20 73 65 74 20 70 61 74 74  ..      set patt
12480 65 72 6e 73 20 5b 6c 69 73 74 20 5c 0d 0a 20 20  erns [list \..  
12490 20 20 20 20 7b 53 79 73 74 65 6d 5c 2e 44 61 74      {System\.Dat
124a0 61 5c 2e 53 51 4c 69 74 65 5c 2e 53 51 4c 69 74  a\.SQLite\.SQLit
124b0 65 45 78 63 65 70 74 69 6f 6e 20 5c 28 30 78 38  eException \(0x8
124c0 30 30 30 34 30 30 35 5c 29 3a 20 28 2e 2b 3f 29  0004005\): (.+?)
124d0 20 20 28 3f 3a 20 29 3f 61 74 7d 20 5c 0d 0a 20    (?: )?at} \.. 
124e0 20 20 20 20 20 7b 53 79 73 74 65 6d 5c 2e 44 61       {System\.Da
124f0 74 61 5c 2e 53 51 4c 69 74 65 5c 2e 53 51 4c 69  ta\.SQLite\.SQLi
12500 74 65 45 78 63 65 70 74 69 6f 6e 3a 20 28 2e 2b  teException: (.+
12510 3f 29 20 20 28 3f 3a 20 29 3f 61 74 7d 20 5c 0d  ?)  (?: )?at} \.
12520 0a 20 20 20 20 20 20 7b 45 61 67 6c 65 5c 2e 5f  .      {Eagle\._
12530 43 6f 6d 70 6f 6e 65 6e 74 73 5c 2e 50 75 62 6c  Components\.Publ
12540 69 63 5c 2e 53 63 72 69 70 74 45 78 63 65 70 74  ic\.ScriptExcept
12550 69 6f 6e 3a 20 28 2e 2b 3f 29 20 20 28 3f 3a 20  ion: (.+?)  (?: 
12560 29 3f 61 74 7d 5d 0d 0a 0d 0a 20 20 20 20 20 20  )?at}]....      
12570 66 6f 72 65 61 63 68 20 70 61 74 74 65 72 6e 20  foreach pattern 
12580 24 70 61 74 74 65 72 6e 73 20 7b 0d 0a 20 20 20  $patterns {..   
12590 20 20 20 20 20 69 66 20 7b 5b 72 65 67 65 78 70       if {[regexp
125a0 20 2d 2d 20 24 70 61 74 74 65 72 6e 20 24 76 61   -- $pattern $va
125b0 6c 75 65 20 64 75 6d 6d 79 20 6d 65 73 73 61 67  lue dummy messag
125c0 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  e]} then {..    
125d0 20 20 20 20 20 20 73 65 74 20 6d 65 73 73 61 67        set messag
125e0 65 20 5b 73 74 72 69 6e 67 20 6d 61 70 20 5b 6c  e [string map [l
125f0 69 73 74 20 5c 72 5c 6e 20 5c 6e 5d 20 5b 73 74  ist \r\n \n] [st
12600 72 69 6e 67 20 74 72 69 6d 20 24 6d 65 73 73 61  ring trim $messa
12610 67 65 5d 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  ge]]..          
12620 73 65 74 20 6c 69 6e 65 73 20 5b 73 70 6c 69 74  set lines [split
12630 20 24 6d 65 73 73 61 67 65 20 5c 6e 5d 0d 0a 0d   $message \n]...
12640 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b  .          if {[
12650 6c 6c 65 6e 67 74 68 20 24 6c 69 6e 65 73 5d 20  llength $lines] 
12660 3d 3d 20 32 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 2} then {..  
12670 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 6c            if {[l
12680 69 6e 64 65 78 20 24 6c 69 6e 65 73 20 30 5d 20  index $lines 0] 
12690 65 71 20 5b 6c 69 6e 64 65 78 20 24 6c 69 6e 65  eq [lindex $line
126a0 73 20 31 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  s 1]} then {..  
126b0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
126c0 72 6e 20 5b 6c 69 6e 64 65 78 20 24 6c 69 6e 65  rn [lindex $line
126d0 73 20 30 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  s 0]..          
126e0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
126f0 20 20 20 72 65 74 75 72 6e 20 5b 61 70 70 65 6e     return [appen
12700 64 41 72 67 73 20 5b 6c 69 6e 64 65 78 20 24 6c  dArgs [lindex $l
12710 69 6e 65 73 20 30 5d 20 22 20 2d 2d 20 22 20 5b  ines 0] " -- " [
12720 6c 69 6e 64 65 78 20 24 6c 69 6e 65 73 20 31 5d  lindex $lines 1]
12730 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ]..          }..
12740 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ..          retu
12750 72 6e 20 24 6d 65 73 73 61 67 65 0d 0a 20 20 20  rn $message..   
12760 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
12770 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ...      return 
12780 24 76 61 6c 75 65 0d 0a 20 20 20 20 7d 0d 0a 0c  $value..    }...
12790 0d 0a 20 20 20 20 70 72 6f 63 20 74 72 69 6d 53  ..    proc trimS
127a0 71 6c 20 7b 20 73 71 6c 20 7d 20 7b 0d 0a 20 20  ql { sql } {..  
127b0 20 20 20 20 72 65 74 75 72 6e 20 5b 72 65 67 73      return [regs
127c0 75 62 20 2d 61 6c 6c 20 2d 2d 20 7b 5c 73 2b 7d  ub -all -- {\s+}
127d0 20 5b 73 74 72 69 6e 67 20 74 72 69 6d 20 24 73   [string trim $s
127e0 71 6c 5d 20 22 20 22 5d 0d 0a 20 20 20 20 7d 0d  ql] " "]..    }.
127f0 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 65 78 65  ....    proc exe
12800 63 75 74 65 53 71 6c 20 7b 20 73 71 6c 20 7b 65  cuteSql { sql {e
12810 78 65 63 75 74 65 20 6e 6f 6e 65 7d 20 7b 66 6f  xecute none} {fo
12820 72 6d 61 74 20 6e 6f 6e 65 7d 20 7b 66 69 6c 65  rmat none} {file
12830 4e 61 6d 65 20 22 22 7d 20 7d 20 7b 0d 0a 20 20  Name ""} } {..  
12840 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
12850 6c 65 6e 67 74 68 20 24 66 69 6c 65 4e 61 6d 65  length $fileName
12860 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 73 65  ] == 0} then {se
12870 74 20 66 69 6c 65 4e 61 6d 65 20 3a 6d 65 6d 6f  t fileName :memo
12880 72 79 3a 7d 0d 0a 20 20 20 20 20 20 73 65 74 75  ry:}..      setu
12890 70 44 62 20 24 66 69 6c 65 4e 61 6d 65 20 22 22  pDb $fileName ""
128a0 20 22 22 20 22 22 20 22 22 20 22 22 20 66 61 6c   "" "" "" "" fal
128b0 73 65 20 66 61 6c 73 65 20 66 61 6c 73 65 20 66  se false false f
128c0 61 6c 73 65 20 64 62 20 74 72 75 65 0d 0a 0d 0a  alse db true....
128d0 20 20 20 20 20 20 74 72 79 20 7b 0d 0a 20 20 20        try {..   
128e0 20 20 20 20 20 72 65 74 75 72 6e 20 5b 75 70 6c       return [upl
128f0 65 76 65 6c 20 31 20 5b 6c 69 73 74 20 5c 0d 0a  evel 1 [list \..
12900 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 20              sql 
12910 65 78 65 63 75 74 65 20 2d 65 78 65 63 75 74 65  execute -execute
12920 20 24 65 78 65 63 75 74 65 20 2d 66 6f 72 6d 61   $execute -forma
12930 74 20 24 66 6f 72 6d 61 74 20 24 64 62 20 24 73  t $format $db $s
12940 71 6c 5d 5d 0d 0a 20 20 20 20 20 20 7d 20 66 69  ql]]..      } fi
12950 6e 61 6c 6c 79 20 7b 0d 0a 20 20 20 20 20 20 20  nally {..       
12960 20 63 6c 65 61 6e 75 70 44 62 20 24 66 69 6c 65   cleanupDb $file
12970 4e 61 6d 65 20 64 62 20 66 61 6c 73 65 20 66 61  Name db false fa
12980 6c 73 65 20 66 61 6c 73 65 0d 0a 20 20 20 20 20  lse false..     
12990 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
129a0 20 20 70 72 6f 63 20 68 61 73 4e 6f 46 6c 61 67    proc hasNoFlag
129b0 73 20 7b 20 76 61 72 4e 61 6d 65 20 6e 6f 6e 65  s { varName none
129c0 20 7d 20 7b 0d 0a 20 20 20 20 20 20 75 70 76 61   } {..      upva
129d0 72 20 31 20 24 76 61 72 4e 61 6d 65 20 66 6c 61  r 1 $varName fla
129e0 67 73 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b  gs....      if {
129f0 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 66 6c  ![info exists fl
12a00 61 67 73 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ags]} then {..  
12a10 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75        return tru
12a20 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  e..      }....  
12a30 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
12a40 6c 65 6e 67 74 68 20 24 66 6c 61 67 73 5d 20 3d  length $flags] =
12a50 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
12a60 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65       return true
12a70 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
12a80 20 20 20 69 66 20 7b 24 6e 6f 6e 65 20 26 26 20     if {$none && 
12a90 24 66 6c 61 67 73 20 65 71 20 22 4e 6f 6e 65 22  $flags eq "None"
12aa0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
12ab0 20 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20    return true.. 
12ac0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
12ad0 72 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20  return false..  
12ae0 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
12af0 20 67 65 74 43 6f 6e 6e 65 63 74 69 6f 6e 46 6c   getConnectionFl
12b00 61 67 73 20 7b 20 66 69 6c 65 4e 61 6d 65 20 66  ags { fileName f
12b10 6c 61 67 73 20 7b 71 75 69 65 74 20 66 61 6c 73  lags {quiet fals
12b20 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  e} } {..      #.
12b30 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46  .      # NOTE: F
12b40 69 67 75 72 65 20 6f 75 74 20 77 68 69 63 68 20  igure out which 
12b50 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61  database file na
12b60 6d 65 20 6f 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  me or connection
12b70 20 73 74 72 69 6e 67 20 74 68 65 73 65 0d 0a 20   string these.. 
12b80 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e       #       con
12b90 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 77 69  nection flags wi
12ba0 6c 6c 20 61 63 74 75 61 6c 6c 79 20 61 70 70 6c  ll actually appl
12bb0 79 20 74 6f 2e 20 20 54 68 69 73 20 69 73 20 6e  y to.  This is n
12bc0 6f 74 20 6e 65 63 65 73 73 61 72 79 0d 0a 20 20  ot necessary..  
12bd0 20 20 20 20 23 20 20 20 20 20 20 20 69 6e 20 71      #       in q
12be0 75 69 65 74 20 6d 6f 64 65 20 62 65 63 61 75 73  uiet mode becaus
12bf0 65 20 74 68 69 73 20 69 6e 66 6f 72 6d 61 74 69  e this informati
12c00 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  on is only used 
12c10 66 6f 72 20 6c 6f 67 67 69 6e 67 0d 0a 20 20 20  for logging..   
12c20 20 20 20 23 20 20 20 20 20 20 20 61 6e 64 20 72     #       and r
12c30 65 70 6f 72 74 69 6e 67 20 70 75 72 70 6f 73 65  eporting purpose
12c40 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  s...      #..   
12c50 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
12c60 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
12c70 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
12c80 74 68 20 24 66 69 6c 65 4e 61 6d 65 5d 20 3e 20  th $fileName] > 
12c90 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
12ca0 20 20 20 20 20 73 65 74 20 64 61 74 61 62 61 73       set databas
12cb0 65 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 66  e [appendArgs "f
12cc0 69 6c 65 20 6e 61 6d 65 20 5c 22 22 20 24 66 69  ile name \"" $fi
12cd0 6c 65 4e 61 6d 65 20 5c 22 5d 0d 0a 20 20 20 20  leName \"]..    
12ce0 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69      } elseif {[i
12cf0 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 64 61 74  nfo exists ::dat
12d00 61 53 6f 75 72 63 65 5d 20 26 26 20 5c 0d 0a 20  aSource] && \.. 
12d10 20 20 20 20 20 20 20 20 20 20 20 21 5b 61 72 72             ![arr
12d20 61 79 20 65 78 69 73 74 73 20 3a 3a 64 61 74 61  ay exists ::data
12d30 53 6f 75 72 63 65 5d 7d 20 74 68 65 6e 20 7b 0d  Source]} then {.
12d40 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20 64  .          set d
12d50 61 74 61 62 61 73 65 20 5b 61 70 70 65 6e 64 41  atabase [appendA
12d60 72 67 73 20 22 64 61 74 61 20 73 6f 75 72 63 65  rgs "data source
12d70 20 5c 22 22 20 24 3a 3a 64 61 74 61 53 6f 75 72   \"" $::dataSour
12d80 63 65 20 5c 22 5d 0d 0a 20 20 20 20 20 20 20 20  ce \"]..        
12d90 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
12da0 20 20 20 20 73 65 74 20 64 61 74 61 62 61 73 65      set database
12db0 20 3c 75 6e 6b 6e 6f 77 6e 3e 0d 0a 20 20 20 20   <unknown>..    
12dc0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
12dd0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
12de0 20 23 20 4e 4f 54 45 3a 20 45 76 65 6e 20 74 68   # NOTE: Even th
12df0 6f 75 67 68 20 74 68 65 72 65 20 69 73 20 6f 6e  ough there is on
12e00 6c 79 20 6f 6e 65 20 73 6f 75 72 63 65 20 6f 66  ly one source of
12e10 20 66 6c 61 67 73 20 73 6f 20 66 61 72 2c 20 74   flags so far, t
12e20 68 65 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20  hey..      #    
12e30 20 20 20 6d 75 73 74 20 62 65 20 63 6f 6d 62 69     must be combi
12e40 6e 65 64 20 75 73 69 6e 67 20 74 68 65 20 63 6f  ned using the co
12e50 72 72 65 63 74 20 73 79 6e 74 61 78 20 66 6f 72  rrect syntax for
12e60 20 65 6e 75 6d 65 72 61 74 65 64 0d 0a 20 20 20   enumerated..   
12e70 20 20 20 23 20 20 20 20 20 20 20 66 6c 61 67 20     #       flag 
12e80 76 61 6c 75 65 73 20 66 6f 72 20 74 68 65 20 2e  values for the .
12e90 4e 45 54 20 46 72 61 6d 65 77 6f 72 6b 2e 0d 0a  NET Framework...
12ea0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73        #..      s
12eb0 65 74 20 66 6c 61 67 73 20 5b 63 6f 6d 62 69 6e  et flags [combin
12ec0 65 46 6c 61 67 73 20 24 66 6c 61 67 73 20 22 22  eFlags $flags ""
12ed0 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ]....      #..  
12ee0 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77      # NOTE: Show
12ef0 20 28 61 6e 64 20 6c 6f 67 29 20 74 68 65 20 6c   (and log) the l
12f00 6f 63 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ocal connection 
12f10 66 6c 61 67 73 20 61 6e 64 20 74 68 65 20 61 73  flags and the as
12f20 73 6f 63 69 61 74 65 64 0d 0a 20 20 20 20 20 20  sociated..      
12f30 23 20 20 20 20 20 20 20 64 61 74 61 20 73 6f 75  #       data sou
12f40 72 63 65 20 6f 72 20 66 69 6c 65 20 6e 61 6d 65  rce or file name
12f50 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
12f60 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
12f70 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69  hen {..        i
12f80 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
12f90 20 3a 3a 6e 6f 28 65 6d 69 74 4c 6f 63 61 6c 46   ::no(emitLocalF
12fa0 6c 61 67 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20  lags)] && \..   
12fb0 20 20 20 20 20 20 20 20 20 28 21 5b 69 6e 66 6f           (![info
12fc0 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 65 6d 69   exists ::no(emi
12fd0 74 4c 6f 63 61 6c 46 6c 61 67 73 49 66 4e 6f 6e  tLocalFlagsIfNon
12fe0 65 29 5d 20 7c 7c 20 5c 0d 0a 20 20 20 20 20 20  e)] || \..      
12ff0 20 20 20 20 20 20 20 21 5b 68 61 73 4e 6f 46 6c         ![hasNoFl
13000 61 67 73 20 66 6c 61 67 73 20 66 61 6c 73 65 5d  ags flags false]
13010 29 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  )} then {..     
13020 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
13030 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
13040 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
13050 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6c 6f          "---- lo
13060 63 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66  cal connection f
13070 6c 61 67 73 20 66 6f 72 20 22 20 24 64 61 74 61  lags for " $data
13080 62 61 73 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  base \..        
13090 20 20 20 20 20 20 22 20 61 72 65 3a 20 22 20 5b        " are: " [
130a0 65 78 70 72 20 7b 21 5b 68 61 73 4e 6f 46 6c 61  expr {![hasNoFla
130b0 67 73 20 66 6c 61 67 73 20 66 61 6c 73 65 5d 20  gs flags false] 
130c0 3f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ? \..           
130d0 20 20 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c     [appendArgs \
130e0 22 20 24 66 6c 61 67 73 20 5c 22 5d 20 3a 20 22  " $flags \"] : "
130f0 3c 6e 6f 6e 65 3e 22 7d 5d 20 5c 6e 5d 0d 0a 20  <none>"}] \n].. 
13100 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
13110 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
13120 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77      # NOTE: Show
13130 20 28 61 6e 64 20 6c 6f 67 29 20 74 68 65 20 73   (and log) the s
13140 68 61 72 65 64 20 63 6f 6e 6e 65 63 74 69 6f 6e  hared connection
13150 20 66 6c 61 67 73 2e 0d 0a 20 20 20 20 20 20 23   flags...      #
13160 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 24 71 75  ..      if {!$qu
13170 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
13180 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
13190 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a  {..          obj
131a0 65 63 74 20 69 6e 76 6f 6b 65 20 53 79 73 74 65  ect invoke Syste
131b0 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51  m.Data.SQLite.SQ
131c0 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 53  LiteConnection S
131d0 68 61 72 65 64 46 6c 61 67 73 0d 0a 20 20 20 20  haredFlags..    
131e0 20 20 20 20 7d 20 73 68 61 72 65 64 46 6c 61 67      } sharedFlag
131f0 73 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  s] == 0} then {.
13200 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21  .          if {!
13210 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
13220 6f 28 65 6d 69 74 53 68 61 72 65 64 46 6c 61 67  o(emitSharedFlag
13230 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  s)] && \..      
13240 20 20 20 20 20 20 20 20 28 21 5b 69 6e 66 6f 20          (![info 
13250 65 78 69 73 74 73 20 3a 3a 6e 6f 28 65 6d 69 74  exists ::no(emit
13260 53 68 61 72 65 64 46 6c 61 67 73 49 66 4e 6f 6e  SharedFlagsIfNon
13270 65 29 5d 20 7c 7c 20 5c 0d 0a 20 20 20 20 20 20  e)] || \..      
13280 20 20 20 20 20 20 20 20 20 21 5b 68 61 73 4e 6f           ![hasNo
13290 46 6c 61 67 73 20 73 68 61 72 65 64 46 6c 61 67  Flags sharedFlag
132a0 73 20 74 72 75 65 5d 29 7d 20 74 68 65 6e 20 7b  s true])} then {
132b0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
132c0 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
132d0 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
132e0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
132f0 20 20 20 22 2d 2d 2d 2d 20 73 68 61 72 65 64 20     "---- shared 
13300 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73  connection flags
13310 20 66 6f 72 20 22 20 24 64 61 74 61 62 61 73 65   for " $database
13320 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
13330 20 20 20 20 22 20 61 72 65 3a 20 22 20 5b 65 78      " are: " [ex
13340 70 72 20 7b 21 5b 68 61 73 4e 6f 46 6c 61 67 73  pr {![hasNoFlags
13350 20 73 68 61 72 65 64 46 6c 61 67 73 20 74 72 75   sharedFlags tru
13360 65 5d 20 3f 20 5c 0d 0a 20 20 20 20 20 20 20 20  e] ? \..        
13370 20 20 20 20 20 20 20 20 5b 61 70 70 65 6e 64 41          [appendA
13380 72 67 73 20 5c 22 20 24 73 68 61 72 65 64 46 6c  rgs \" $sharedFl
13390 61 67 73 20 5c 22 5d 20 3a 20 22 3c 6e 6f 6e 65  ags \"] : "<none
133a0 3e 22 7d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  >"}] \n]..      
133b0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
133c0 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
133d0 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
133e0 69 73 74 73 20 3a 3a 6e 6f 28 65 6d 69 74 53 68  ists ::no(emitSh
133f0 61 72 65 64 46 6c 61 67 73 29 5d 20 26 26 20 5c  aredFlags)] && \
13400 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
13410 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
13420 6e 6f 28 65 6d 69 74 53 68 61 72 65 64 46 6c 61  no(emitSharedFla
13430 67 73 49 66 55 6e 61 76 61 69 6c 61 62 6c 65 29  gsIfUnavailable)
13440 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
13450 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
13460 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
13470 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
13480 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
13490 2d 20 73 68 61 72 65 64 20 63 6f 6e 6e 65 63 74  - shared connect
134a0 69 6f 6e 20 66 6c 61 67 73 20 66 6f 72 20 22 20  ion flags for " 
134b0 24 64 61 74 61 62 61 73 65 20 5c 0d 0a 20 20 20  $database \..   
134c0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 61               " a
134d0 72 65 3a 20 3c 75 6e 61 76 61 69 6c 61 62 6c 65  re: <unavailable
134e0 3e 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20  >\n"]..         
134f0 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20   }..        }.. 
13500 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
13510 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
13520 20 53 68 6f 77 20 28 61 6e 64 20 6c 6f 67 29 20   Show (and log) 
13530 74 68 65 20 64 65 74 65 63 74 65 64 20 67 6c 6f  the detected glo
13540 62 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66  bal connection f
13550 6c 61 67 73 2c 20 69 66 20 61 6e 79 2e 0d 0a 20  lags, if any... 
13560 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
13570 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
13580 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21  {..        if {!
13590 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
135a0 6f 28 65 6d 69 74 47 6c 6f 62 61 6c 46 6c 61 67  o(emitGlobalFlag
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 47 6c  ists ::no(emitGl
135e0 6f 62 61 6c 46 6c 61 67 73 49 66 4e 6f 6e 65 29  obalFlagsIfNone)
135f0 5d 20 7c 7c 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] || \..        
13600 20 20 20 20 20 21 5b 68 61 73 4e 6f 46 6c 61 67       ![hasNoFlag
13610 73 20 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e 5f 66  s ::connection_f
13620 6c 61 67 73 20 66 61 6c 73 65 5d 29 7d 20 74 68  lags false])} th
13630 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
13640 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
13650 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
13660 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
13670 20 20 20 22 2d 2d 2d 2d 20 67 6c 6f 62 61 6c 20     "---- global 
13680 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73  connection flags
13690 20 61 72 65 3a 20 22 20 5c 0d 0a 20 20 20 20 20   are: " \..     
136a0 20 20 20 20 20 20 20 20 20 5b 65 78 70 72 20 7b           [expr {
136b0 21 5b 68 61 73 4e 6f 46 6c 61 67 73 20 3a 3a 63  ![hasNoFlags ::c
136c0 6f 6e 6e 65 63 74 69 6f 6e 5f 66 6c 61 67 73 20  onnection_flags 
136d0 66 61 6c 73 65 5d 20 3f 20 5c 0d 0a 20 20 20 20  false] ? \..    
136e0 20 20 20 20 20 20 20 20 20 20 5b 61 70 70 65 6e            [appen
136f0 64 41 72 67 73 20 5c 22 20 24 3a 3a 63 6f 6e 6e  dArgs \" $::conn
13700 65 63 74 69 6f 6e 5f 66 6c 61 67 73 20 5c 22 5d  ection_flags \"]
13710 20 3a 20 22 3c 6e 6f 6e 65 3e 22 7d 5d 20 5c 6e   : "<none>"}] \n
13720 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  ]..        }..  
13730 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
13740 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
13750 49 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79  If there are any
13760 20 67 6c 6f 62 61 6c 20 28 70 65 72 20 74 65 73   global (per tes
13770 74 20 72 75 6e 29 20 63 6f 6e 6e 65 63 74 69 6f  t run) connectio
13780 6e 20 66 6c 61 67 73 20 63 75 72 72 65 6e 74 6c  n flags currentl
13790 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  y..      #      
137a0 20 73 65 74 2c 20 75 73 65 20 74 68 65 6d 20 6e   set, use them n
137b0 6f 77 20 28 69 2e 65 2e 20 62 79 20 63 6f 6d 62  ow (i.e. by comb
137c0 69 6e 69 6e 67 20 74 68 65 6d 20 77 69 74 68 20  ining them with 
137d0 74 68 65 20 6f 6e 65 73 20 66 6f 72 20 74 68 69  the ones for thi
137e0 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  s..      #      
137f0 20 63 6f 6e 6e 65 63 74 69 6f 6e 29 2e 0d 0a 20   connection)... 
13800 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
13810 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
13820 3a 63 6f 6e 6e 65 63 74 69 6f 6e 5f 66 6c 61 67  :connection_flag
13830 73 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  s]} then {..    
13840 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
13850 20 4e 4f 54 45 3a 20 43 6f 6d 62 69 6e 65 20 61   NOTE: Combine a
13860 6e 64 2f 6f 72 20 72 65 70 6c 61 63 65 20 74 68  nd/or replace th
13870 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61  e connection fla
13880 67 73 20 61 6e 64 20 74 68 65 6e 20 73 68 6f 77  gs and then show
13890 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20   the..        # 
138a0 20 20 20 20 20 20 6e 65 77 20 76 61 6c 75 65 2e        new value.
138b0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
138c0 20 20 20 20 20 73 65 74 20 66 6c 61 67 73 20 5b       set flags [
138d0 63 6f 6d 62 69 6e 65 46 6c 61 67 73 20 24 66 6c  combineFlags $fl
138e0 61 67 73 20 24 3a 3a 63 6f 6e 6e 65 63 74 69 6f  ags $::connectio
138f0 6e 5f 66 6c 61 67 73 5d 0d 0a 0d 0a 20 20 20 20  n_flags]....    
13900 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
13910 20 4e 4f 54 45 3a 20 53 68 6f 77 20 28 61 6e 64   NOTE: Show (and
13920 20 6c 6f 67 29 20 74 68 65 20 6e 65 77 20 65 66   log) the new ef
13930 66 65 63 74 69 76 65 20 63 6f 6e 6e 65 63 74 69  fective connecti
13940 6f 6e 20 66 6c 61 67 73 2e 0d 0a 20 20 20 20 20  on flags...     
13950 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66     #..        if
13960 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
13970 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  {..          if 
13980 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
13990 3a 6e 6f 28 65 6d 69 74 43 6f 6d 62 69 6e 65 64  :no(emitCombined
139a0 46 6c 61 67 73 29 5d 20 26 26 20 5c 0d 0a 20 20  Flags)] && \..  
139b0 20 20 20 20 20 20 20 20 20 20 20 20 28 21 5b 69              (![i
139c0 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
139d0 65 6d 69 74 43 6f 6d 62 69 6e 65 64 46 6c 61 67  emitCombinedFlag
139e0 73 49 66 4e 6f 6e 65 29 5d 20 7c 7c 20 5c 0d 0a  sIfNone)] || \..
139f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 21                 !
13a00 5b 68 61 73 4e 6f 46 6c 61 67 73 20 66 6c 61 67  [hasNoFlags flag
13a10 73 20 66 61 6c 73 65 5d 29 7d 20 74 68 65 6e 20  s false])} then 
13a20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
13a30 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
13a40 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
13a50 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
13a60 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 6d 62 69 6e      "---- combin
13a70 65 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c  ed connection fl
13a80 61 67 73 20 66 6f 72 20 22 20 24 64 61 74 61 62  ags for " $datab
13a90 61 73 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ase \..         
13aa0 20 20 20 20 20 20 20 22 20 61 72 65 3a 20 22 20         " are: " 
13ab0 5b 65 78 70 72 20 7b 21 5b 68 61 73 4e 6f 46 6c  [expr {![hasNoFl
13ac0 61 67 73 20 66 6c 61 67 73 20 66 61 6c 73 65 5d  ags flags false]
13ad0 20 3f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   ? \..          
13ae0 20 20 20 20 20 20 5b 61 70 70 65 6e 64 41 72 67        [appendArg
13af0 73 20 5c 22 20 24 66 6c 61 67 73 20 5c 22 5d 20  s \" $flags \"] 
13b00 3a 20 22 3c 6e 6f 6e 65 3e 22 7d 5d 20 5c 6e 5d  : "<none>"}] \n]
13b10 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
13b20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
13b30 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72  }....      retur
13b40 6e 20 24 66 6c 61 67 73 0d 0a 20 20 20 20 7d 0d  n $flags..    }.
13b50 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74  ....    proc get
13b60 46 6c 61 67 73 50 72 6f 70 65 72 74 79 20 7b 20  FlagsProperty { 
13b70 7b 66 6c 61 67 73 20 22 22 7d 20 7b 71 75 69 65  {flags ""} {quie
13b80 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20  t false} } {..  
13b90 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
13ba0 4f 54 45 3a 20 44 65 74 65 72 6d 69 6e 65 20 77  OTE: Determine w
13bb0 68 61 74 20 74 68 65 20 63 6f 6d 62 69 6e 65 64  hat the combined
13bc0 20 28 67 6c 6f 62 61 6c 20 61 6e 64 20 6c 6f 63   (global and loc
13bd0 61 6c 29 20 63 6f 6e 6e 65 63 74 69 6f 6e 0d 0a  al) connection..
13be0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 66 6c        #       fl
13bf0 61 67 73 20 73 68 6f 75 6c 64 20 62 65 2c 20 70  ags should be, p
13c00 6f 73 73 69 62 6c 79 20 71 75 69 65 74 6c 79 2e  ossibly quietly.
13c10 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
13c20 20 73 65 74 20 66 6c 61 67 73 20 5b 67 65 74 43   set flags [getC
13c30 6f 6e 6e 65 63 74 69 6f 6e 46 6c 61 67 73 20 22  onnectionFlags "
13c40 22 20 24 66 6c 61 67 73 20 24 71 75 69 65 74 5d  " $flags $quiet]
13c50 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
13c60 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 6e 6f     # NOTE: If no
13c70 20 67 6c 6f 62 61 6c 20 6f 72 20 6c 6f 63 61 6c   global or local
13c80 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67   connection flag
13c90 73 20 77 65 72 65 20 73 70 65 63 69 66 69 65 64  s were specified
13ca0 2c 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20  , the..      #  
13cb0 20 20 20 20 20 64 65 66 61 75 6c 74 20 63 6f 6e       default con
13cc0 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 73 68  nection flags sh
13cd0 6f 75 6c 64 20 62 65 20 75 73 65 64 3b 20 74 68  ould be used; th
13ce0 65 72 65 66 6f 72 65 2c 20 72 65 74 75 72 6e 0d  erefore, return.
13cf0 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61  .      #       a
13d00 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 20 69  n empty string i
13d10 6e 20 74 68 61 74 20 63 61 73 65 2e 0d 0a 20 20  n that case...  
13d20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
13d30 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
13d40 24 66 6c 61 67 73 5d 20 3d 3d 20 30 7d 20 74 68  $flags] == 0} th
13d50 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65  en {..        re
13d60 74 75 72 6e 20 22 22 0d 0a 20 20 20 20 20 20 7d  turn ""..      }
13d70 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
13d80 20 20 20 23 20 4e 4f 54 45 3a 20 49 6e 20 6f 72     # NOTE: In or
13d90 64 65 72 20 74 6f 20 63 68 65 63 6b 20 69 66 20  der to check if 
13da0 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6e 6e  the default conn
13db0 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 61 72 65  ection flags are
13dc0 20 62 65 69 6e 67 20 75 73 65 64 0d 0a 20 20 20   being used..   
13dd0 20 20 20 23 20 20 20 20 20 20 20 69 74 20 69 73     #       it is
13de0 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 61 74   necessary to at
13df0 74 65 6d 70 74 20 61 20 63 6f 6e 76 65 72 73 69  tempt a conversi
13e00 6f 6e 20 74 6f 20 74 68 65 20 61 63 74 75 61 6c  on to the actual
13e10 20 65 6e 75 6d 65 72 61 74 65 64 0d 0a 20 20 20   enumerated..   
13e20 20 20 20 23 20 20 20 20 20 20 20 74 79 70 65 2e     #       type.
13e30 20 20 46 61 69 6c 69 6e 67 20 74 68 61 74 2c 20    Failing that, 
13e40 74 68 65 20 63 68 65 63 6b 20 61 67 61 69 6e 73  the check agains
13e50 74 20 74 68 65 20 64 65 66 61 75 6c 74 20 76 61  t the default va
13e60 6c 75 65 20 77 69 6c 6c 20 62 65 0d 0a 20 20 20  lue will be..   
13e70 20 20 20 23 20 20 20 20 20 20 20 73 6b 69 70 70     #       skipp
13e80 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ed...      #..  
13e90 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
13ea0 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 65 72  ..        set er
13eb0 72 6f 72 20 6e 75 6c 6c 3b 20 23 20 49 47 4e 4f  ror null; # IGNO
13ec0 52 45 44 0d 0a 0d 0a 20 20 20 20 20 20 20 20 6f  RED....        o
13ed0 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 55 74 69  bject invoke Uti
13ee0 6c 69 74 79 20 54 72 79 50 61 72 73 65 46 6c 61  lity TryParseFla
13ef0 67 73 45 6e 75 6d 20 22 22 20 5c 0d 0a 20 20 20  gsEnum "" \..   
13f00 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e           System.
13f10 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69  Data.SQLite.SQLi
13f20 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 46 6c 61 67  teConnectionFlag
13f30 73 20 22 22 20 24 66 6c 61 67 73 20 6e 75 6c 6c  s "" $flags null
13f40 20 74 72 75 65 20 5c 0d 0a 20 20 20 20 20 20 20   true \..       
13f50 20 20 20 20 20 74 72 75 65 20 65 72 72 6f 72 0d       true error.
13f60 0a 20 20 20 20 20 20 7d 20 76 61 6c 75 65 5d 7d  .      } value]}
13f70 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
13f80 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
13f90 54 45 3a 20 41 74 74 65 6d 70 74 69 6e 67 20 74  TE: Attempting t
13fa0 6f 20 70 61 72 73 65 20 74 68 65 20 63 6f 6e 6e  o parse the conn
13fb0 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 63 61 75  ection flags cau
13fc0 73 65 64 20 61 20 73 63 72 69 70 74 0d 0a 20 20  sed a script..  
13fd0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 65 72        #       er
13fe0 72 6f 72 2e 20 20 45 6d 69 74 20 61 20 77 61 72  ror.  Emit a war
13ff0 6e 69 6e 67 20 74 6f 20 74 68 65 20 74 65 73 74  ning to the test
14000 20 6c 6f 67 20 66 69 6c 65 20 61 6e 64 20 63 6f   log file and co
14010 6e 74 69 6e 75 65 0d 0a 20 20 20 20 20 20 20 20  ntinue..        
14020 23 20 20 20 20 20 20 20 75 73 69 6e 67 20 61 6e  #       using an
14030 20 65 6d 74 70 79 20 73 74 72 69 6e 67 20 69 6e   emtpy string in
14040 73 74 65 61 64 2e 0d 0a 20 20 20 20 20 20 20 20  stead...        
14050 23 0d 0a 20 20 20 20 20 20 20 20 74 6c 6f 67 20  #..        tlog 
14060 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
14070 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d             "====
14080 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64   WARNING: failed
14090 20 74 6f 20 70 61 72 73 65 20 63 6f 6e 6e 65 63   to parse connec
140a0 74 69 6f 6e 20 66 6c 61 67 73 2c 20 65 72 72 6f  tion flags, erro
140b0 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20  r: " \..        
140c0 20 20 20 20 5c 6e 5c 74 20 24 76 61 6c 75 65 20      \n\t $value 
140d0 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73  \n]....        s
140e0 65 74 20 76 61 6c 75 65 20 22 22 0d 0a 20 20 20  et value ""..   
140f0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
14100 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49  .      # NOTE: I
14110 66 20 74 68 65 20 63 6f 6d 62 69 6e 65 64 20 66  f the combined f
14120 6c 61 67 73 20 73 74 72 69 6e 67 20 63 6f 75 6c  lags string coul
14130 64 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 62  d not actually b
14140 65 20 63 6f 6e 76 65 72 74 65 64 0d 0a 20 20 20  e converted..   
14150 20 20 20 23 20 20 20 20 20 20 20 74 6f 20 74 68     #       to th
14160 65 20 65 6e 75 6d 65 72 61 74 65 64 20 74 79 70  e enumerated typ
14170 65 20 69 74 20 69 73 20 74 68 65 20 64 65 66 61  e it is the defa
14180 75 6c 74 20 76 61 6c 75 65 2c 20 74 68 65 6e 20  ult value, then 
14190 6a 75 73 74 20 75 73 65 0d 0a 20 20 20 20 20 20  just use..      
141a0 23 20 20 20 20 20 20 20 69 74 20 76 65 72 62 61  #       it verba
141b0 74 69 6d 3b 20 6f 74 68 65 72 77 69 73 65 2c 20  tim; otherwise, 
141c0 6a 75 73 74 20 72 65 74 75 72 6e 20 61 6e 20 65  just return an e
141d0 6d 70 74 79 20 73 74 72 69 6e 67 2e 20 20 49 6e  mpty string.  In
141e0 20 74 68 61 74 0d 0a 20 20 20 20 20 20 23 20 20   that..      #  
141f0 20 20 20 20 20 63 61 73 65 2c 20 74 68 65 20 64       case, the d
14200 65 66 61 75 6c 74 20 63 6f 6e 6e 65 63 74 69 6f  efault connectio
14210 6e 20 66 6c 61 67 73 20 77 69 6c 6c 20 62 65 20  n flags will be 
14220 75 73 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  used...      #..
14230 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
14240 67 20 6c 65 6e 67 74 68 20 24 76 61 6c 75 65 5d  g length $value]
14250 20 3d 3d 20 30 20 7c 7c 20 24 76 61 6c 75 65 20   == 0 || $value 
14260 6e 65 20 22 44 65 66 61 75 6c 74 22 7d 20 74 68  ne "Default"} th
14270 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
14280 0a 20 20 20 20 20 20 20 20 23 20 57 41 52 4e 49  .        # WARNI
14290 4e 47 3a 20 54 68 69 73 20 72 65 74 75 72 6e 73  NG: This returns
142a0 20 74 68 65 20 73 74 72 69 6e 67 20 76 61 6c 75   the string valu
142b0 65 20 6f 66 20 74 68 65 20 63 6f 6d 62 69 6e 65  e of the combine
142c0 64 20 66 6c 61 67 73 2c 20 6e 6f 74 0d 0a 20 20  d flags, not..  
142d0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20        #         
142e0 20 74 68 65 20 65 6e 75 6d 65 72 61 74 65 64 20   the enumerated 
142f0 76 61 6c 75 65 2e 20 20 54 68 69 73 20 69 73 20  value.  This is 
14300 62 79 20 64 65 73 69 67 6e 20 61 6e 64 20 73 68  by design and sh
14310 6f 75 6c 64 20 6e 6f 74 0d 0a 20 20 20 20 20 20  ould not..      
14320 20 20 23 20 20 20 20 20 20 20 20 20 20 62 65 20    #          be 
14330 63 68 61 6e 67 65 64 20 77 69 74 68 6f 75 74 20  changed without 
14340 63 61 72 65 66 75 6c 20 63 6f 6e 73 69 64 65 72  careful consider
14350 61 74 69 6f 6e 20 28 65 2e 67 2e 20 69 74 20 77  ation (e.g. it w
14360 6f 75 6c 64 0d 0a 20 20 20 20 20 20 20 20 23 20  ould..        # 
14370 20 20 20 20 20 20 20 20 20 70 72 65 76 65 6e 74           prevent
14380 20 74 68 65 20 53 51 4c 69 74 65 43 6f 6e 6e 65   the SQLiteConne
14390 63 74 69 6f 6e 20 63 6c 61 73 73 20 66 72 6f 6d  ction class from
143a0 20 61 6c 6c 6f 77 69 6e 67 20 69 6e 76 61 6c 69   allowing invali
143b0 64 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  d..        #    
143c0 20 20 20 20 20 20 5b 22 6d 61 67 69 63 61 6c 22        ["magical"
143d0 5d 20 6d 65 74 61 2d 66 6c 61 67 73 29 2e 0d 0a  ] meta-flags)...
143e0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
143f0 20 20 20 72 65 74 75 72 6e 20 5b 61 70 70 65 6e     return [appen
14400 64 41 72 67 73 20 22 46 6c 61 67 73 3d 22 20 24  dArgs "Flags=" $
14410 66 6c 61 67 73 20 5c 3b 5d 0d 0a 20 20 20 20 20  flags \;]..     
14420 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75   }....      retu
14430 72 6e 20 22 22 0d 0a 20 20 20 20 7d 0d 0a 0c 0d  rn ""..    }....
14440 0a 20 20 20 20 70 72 6f 63 20 65 6e 61 62 6c 65  .    proc enable
14450 53 68 61 72 65 64 43 61 63 68 65 20 7b 20 63 68  SharedCache { ch
14460 61 6e 6e 65 6c 20 65 6e 61 62 6c 65 20 7b 71 75  annel enable {qu
14470 69 65 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a  iet false} } {..
14480 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
14490 20 7b 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a 65   {..        obje
144a0 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73  ct invoke -flags
144b0 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20   +NonPublic \.. 
144c0 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65             Syste
144d0 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 55 6e  m.Data.SQLite.Un
144e0 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64  safeNativeMethod
144f0 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
14500 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
14510 73 68 61 72 65 64 5f 63 61 63 68 65 20 5b 65 78  shared_cache [ex
14520 70 72 20 69 6e 74 28 24 65 6e 61 62 6c 65 29 5d  pr int($enable)]
14530 0d 0a 20 20 20 20 20 20 7d 20 72 65 73 75 6c 74  ..      } result
14540 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
14550 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
14560 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
14570 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
14580 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
14590 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
145a0 20 20 20 22 2d 2d 2d 2d 20 63 61 6c 6c 20 73 71     "---- call sq
145b0 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 73 68 61  lite3_enable_sha
145c0 72 65 64 5f 63 61 63 68 65 28 22 20 24 65 6e 61  red_cache(" $ena
145d0 62 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ble \..         
145e0 20 20 20 20 20 22 29 2e 2e 2e 20 6f 6b 3a 20 22       ")... ok: "
145f0 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20   $result \n]..  
14600 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
14610 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
14620 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
14630 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
14640 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
14650 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
14660 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
14670 2d 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f 65  - call sqlite3_e
14680 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f 63 61 63  nable_shared_cac
14690 68 65 28 22 20 24 65 6e 61 62 6c 65 20 5c 0d 0a  he(" $enable \..
146a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 29                ")
146b0 2e 2e 2e 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c  ... error: " \n\
146c0 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20  t $result \n].. 
146d0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
146e0 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
146f0 20 70 72 6f 63 20 73 65 74 75 70 44 62 20 7b 0d   proc setupDb {.
14700 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c  .            fil
14710 65 4e 61 6d 65 20 7b 6d 6f 64 65 20 22 22 7d 20  eName {mode ""} 
14720 7b 64 61 74 65 54 69 6d 65 46 6f 72 6d 61 74 20  {dateTimeFormat 
14730 22 22 7d 20 7b 64 61 74 65 54 69 6d 65 4b 69 6e  ""} {dateTimeKin
14740 64 20 22 22 7d 20 7b 66 6c 61 67 73 20 22 22 7d  d ""} {flags ""}
14750 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 65  ..            {e
14760 78 74 72 61 20 22 22 7d 20 7b 71 75 61 6c 69 66  xtra ""} {qualif
14770 79 20 74 72 75 65 7d 20 7b 64 65 6c 65 74 65 20  y true} {delete 
14780 74 72 75 65 7d 20 7b 75 72 69 20 66 61 6c 73 65  true} {uri false
14790 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b  }..            {
147a0 74 65 6d 70 6f 72 61 72 79 20 74 72 75 65 7d 20  temporary true} 
147b0 7b 76 61 72 4e 61 6d 65 20 64 62 7d 20 7b 71 75  {varName db} {qu
147c0 69 65 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a  iet false} } {..
147d0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
147e0 20 4e 4f 54 45 3a 20 46 69 72 73 74 2c 20 73 65   NOTE: First, se
147f0 65 20 69 66 20 6f 75 72 20 63 61 6c 6c 65 72 20  e if our caller 
14800 68 61 73 20 72 65 71 75 65 73 74 65 64 20 61 6e  has requested an
14810 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
14820 61 73 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ase...      #.. 
14830 20 20 20 20 20 73 65 74 20 69 73 4d 65 6d 6f 72       set isMemor
14840 79 20 5b 69 73 4d 65 6d 6f 72 79 44 62 20 24 66  y [isMemoryDb $f
14850 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20  ileName]....    
14860 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
14870 45 3a 20 46 6f 72 20 6e 6f 77 2c 20 61 6c 6c 20  E: For now, all 
14880 74 65 73 74 20 64 61 74 61 62 61 73 65 73 20 75  test databases u
14890 73 65 64 20 62 79 20 74 68 65 20 74 65 73 74 20  sed by the test 
148a0 73 75 69 74 65 20 61 72 65 20 70 6c 61 63 65 64  suite are placed
148b0 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
148c0 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
148d0 65 20 64 69 72 65 63 74 6f 72 79 2e 20 20 45 61  e directory.  Ea
148e0 63 68 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  ch database and 
148f0 72 65 6c 61 74 65 64 20 66 69 6c 65 73 0d 0a 20  related files.. 
14900 20 20 20 20 20 23 20 20 20 20 20 20 20 75 73 65       #       use
14910 64 20 62 79 20 61 20 74 65 73 74 20 73 68 6f 75  d by a test shou
14920 6c 64 20 62 65 20 63 6c 65 61 6e 65 64 20 75 70  ld be cleaned up
14930 20 62 79 20 74 68 61 74 20 74 65 73 74 20 75 73   by that test us
14940 69 6e 67 20 74 68 65 0d 0a 20 20 20 20 20 20 23  ing the..      #
14950 20 20 20 20 20 20 20 22 63 6c 65 61 6e 75 70 44         "cleanupD
14960 62 22 20 70 72 6f 63 65 64 75 72 65 2c 20 62 65  b" procedure, be
14970 6c 6f 77 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  low...      #.. 
14980 20 20 20 20 20 69 66 20 7b 21 24 69 73 4d 65 6d       if {!$isMem
14990 6f 72 79 20 26 26 20 24 71 75 61 6c 69 66 79 7d  ory && $qualify}
149a0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
149b0 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66   set fileName [f
149c0 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 44 61 74  ile join [getDat
149d0 61 62 61 73 65 44 69 72 65 63 74 6f 72 79 5d 20  abaseDirectory] 
149e0 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69 6c 65  [file tail $file
149f0 4e 61 6d 65 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d  Name]]..      }.
14a00 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
14a10 20 20 23 20 4e 4f 54 45 3a 20 42 79 20 64 65 66    # NOTE: By def
14a20 61 75 6c 74 2c 20 64 65 6c 65 74 65 20 61 6e 79  ault, delete any
14a30 20 70 72 65 2d 65 78 69 73 74 69 6e 67 20 64 61   pre-existing da
14a40 74 61 62 61 73 65 20 77 69 74 68 20 74 68 65 20  tabase with the 
14a50 73 61 6d 65 20 66 69 6c 65 0d 0a 20 20 20 20 20  same file..     
14a60 20 23 20 20 20 20 20 20 20 6e 61 6d 65 20 69 66   #       name if
14a70 20 69 74 20 63 75 72 72 65 6e 74 6c 79 20 65 78   it currently ex
14a80 69 73 74 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  ists...      #..
14a90 20 20 20 20 20 20 69 66 20 7b 21 24 69 73 4d 65        if {!$isMe
14aa0 6d 6f 72 79 20 26 26 20 24 64 65 6c 65 74 65 20  mory && $delete 
14ab0 26 26 20 5b 66 69 6c 65 20 65 78 69 73 74 73 20  && [file exists 
14ac0 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e  $fileName]} then
14ad0 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
14ae0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41         # NOTE: A
14af0 74 74 65 6d 70 74 20 74 6f 20 64 65 6c 65 74 65  ttempt to delete
14b00 20 61 6e 79 20 70 72 65 2d 65 78 69 73 74 69 6e   any pre-existin
14b10 67 20 64 61 74 61 62 61 73 65 20 77 69 74 68 20  g database with 
14b20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 0d 0a 20  the same file.. 
14b30 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6e         #       n
14b40 61 6d 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ame...        #.
14b50 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61  .        if {[ca
14b60 74 63 68 20 7b 66 69 6c 65 20 64 65 6c 65 74 65  tch {file delete
14b70 20 24 66 69 6c 65 4e 61 6d 65 7d 20 65 72 72 6f   $fileName} erro
14b80 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  r]} then {..    
14b90 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
14ba0 20 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 73 6f     # NOTE: We so
14bb0 6d 65 68 6f 77 20 66 61 69 6c 65 64 20 74 6f 20  mehow failed to 
14bc0 64 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65 2c  delete the file,
14bd0 20 72 65 70 6f 72 74 20 77 68 79 2e 0d 0a 20 20   report why...  
14be0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
14bf0 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
14c00 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
14c10 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
14c20 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
14c30 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
14c40 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d             "====
14c50 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64   WARNING: failed
14c60 20 74 6f 20 64 65 6c 65 74 65 20 64 61 74 61 62   to delete datab
14c70 61 73 65 20 66 69 6c 65 20 5c 22 22 20 24 66 69  ase file \"" $fi
14c80 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20  leName \..      
14c90 20 20 20 20 20 20 20 20 20 20 22 5c 22 20 64 75            "\" du
14ca0 72 69 6e 67 20 73 65 74 75 70 2c 20 65 72 72 6f  ring setup, erro
14cb0 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72  r: " \n\t $error
14cc0 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \n]..          
14cd0 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  }..        }..  
14ce0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
14cf0 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
14d00 52 65 66 65 72 20 74 6f 20 74 68 65 20 73 70 65  Refer to the spe
14d10 63 69 66 69 65 64 20 76 61 72 69 61 62 6c 65 20  cified variable 
14d20 28 65 2e 67 2e 20 22 64 62 22 29 20 69 6e 20 74  (e.g. "db") in t
14d30 68 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75  he context of ou
14d40 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  r..      #      
14d50 20 63 61 6c 6c 65 72 2e 20 20 54 68 65 20 68 61   caller.  The ha
14d60 6e 64 6c 65 20 74 6f 20 74 68 65 20 6f 70 65 6e  ndle to the open
14d70 65 64 20 64 61 74 61 62 61 73 65 20 77 69 6c 6c  ed database will
14d80 20 62 65 20 73 74 6f 72 65 64 20 74 68 65 72 65   be stored there
14d90 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
14da0 20 20 75 70 76 61 72 20 31 20 24 76 61 72 4e 61    upvar 1 $varNa
14db0 6d 65 20 64 62 0d 0a 0d 0a 20 20 20 20 20 20 23  me db....      #
14dc0 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
14dd0 53 74 61 72 74 20 62 75 69 6c 64 69 6e 67 20 74  Start building t
14de0 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74  he connection st
14df0 72 69 6e 67 2e 20 20 54 68 65 20 6f 6e 6c 79 20  ring.  The only 
14e00 72 65 71 75 69 72 65 64 20 70 6f 72 74 69 6f 6e  required portion
14e10 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
14e20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  of the connectio
14e30 6e 20 73 74 72 69 6e 67 20 69 73 20 74 68 65 20  n string is the 
14e40 64 61 74 61 20 73 6f 75 72 63 65 2c 20 77 68 69  data source, whi
14e50 63 68 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 0d  ch contains the.
14e60 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64  .      #       d
14e70 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d  atabase file nam
14e80 65 20 69 74 73 65 6c 66 2e 20 20 49 66 20 6f 75  e itself.  If ou
14e90 72 20 63 61 6c 6c 65 72 20 77 61 6e 74 73 20 74  r caller wants t
14ea0 6f 20 75 73 65 20 61 20 55 52 49 20 61 73 0d 0a  o use a URI as..
14eb0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68        #       th
14ec0 65 20 64 61 74 61 20 73 6f 75 72 63 65 2c 20 75  e data source, u
14ed0 73 65 20 74 68 65 20 46 75 6c 6c 55 72 69 20 63  se the FullUri c
14ee0 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e 67  onnection string
14ef0 20 70 72 6f 70 65 72 74 79 20 74 6f 0d 0a 20 20   property to..  
14f00 20 20 20 20 23 20 20 20 20 20 20 20 70 72 65 76      #       prev
14f10 65 6e 74 20 74 68 65 20 64 61 74 61 20 73 6f 75  ent the data sou
14f20 72 63 65 20 73 74 72 69 6e 67 20 66 72 6f 6d 20  rce string from 
14f30 62 65 69 6e 67 20 6d 61 6e 67 6c 65 64 2e 0d 0a  being mangled...
14f40 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
14f50 66 20 7b 24 75 72 69 7d 20 74 68 65 6e 20 7b 0d  f {$uri} then {.
14f60 0a 20 20 20 20 20 20 20 20 73 65 74 20 63 6f 6e  .        set con
14f70 6e 65 63 74 69 6f 6e 20 7b 46 75 6c 6c 55 72 69  nection {FullUri
14f80 3d 24 7b 66 69 6c 65 4e 61 6d 65 7d 7d 0d 0a 20  =${fileName}}.. 
14f90 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
14fa0 20 20 20 20 20 20 20 73 65 74 20 63 6f 6e 6e 65         set conne
14fb0 63 74 69 6f 6e 20 7b 44 61 74 61 20 53 6f 75 72  ction {Data Sour
14fc0 63 65 3d 24 7b 66 69 6c 65 4e 61 6d 65 7d 7d 0d  ce=${fileName}}.
14fd0 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
14fe0 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
14ff0 45 3a 20 53 69 6e 63 65 20 74 68 69 73 20 70 72  E: Since this pr
15000 6f 63 65 64 75 72 65 20 68 61 73 20 6e 6f 20 73  ocedure has no s
15010 70 65 63 69 61 6c 20 6b 6e 6f 77 6c 65 64 67 65  pecial knowledge
15020 20 6f 66 20 77 68 61 74 20 74 68 65 20 64 65 66   of what the def
15030 61 75 6c 74 0d 0a 20 20 20 20 20 20 23 20 20 20  ault..      #   
15040 20 20 20 20 73 65 74 74 69 6e 67 20 69 73 20 66      setting is f
15050 6f 72 20 74 68 65 20 54 6f 46 75 6c 6c 50 61 74  or the ToFullPat
15060 68 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72  h connection str
15070 69 6e 67 20 70 72 6f 70 65 72 79 2c 20 61 6c 77  ing propery, alw
15080 61 79 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ays..      #    
15090 20 20 20 61 64 64 20 74 68 65 20 76 61 6c 75 65     add the value
150a0 20 77 65 20 6b 6e 6f 77 20 61 62 6f 75 74 20 74   we know about t
150b0 6f 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  o the connection
150c0 20 73 74 72 69 6e 67 2e 0d 0a 20 20 20 20 20 20   string...      
150d0 23 0d 0a 20 20 20 20 20 20 61 70 70 65 6e 64 20  #..      append 
150e0 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 3b 54 6f 46  connection {;ToF
150f0 75 6c 6c 50 61 74 68 3d 24 7b 71 75 61 6c 69 66  ullPath=${qualif
15100 79 7d 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a  y}}....      #..
15110 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66        # NOTE: If
15120 20 6f 75 72 20 63 61 6c 6c 65 72 20 73 70 65 63   our caller spec
15130 69 66 69 65 64 20 61 20 6a 6f 75 72 6e 61 6c 20  ified a journal 
15140 6d 6f 64 65 2c 20 61 64 64 20 74 68 65 20 6e 65  mode, add the ne
15150 63 65 73 73 61 72 79 20 70 6f 72 74 69 6f 6e 0d  cessary portion.
15160 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6f  .      #       o
15170 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  f the connection
15180 20 73 74 72 69 6e 67 20 6e 6f 77 2e 0d 0a 20 20   string now...  
15190 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
151a0 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
151b0 24 6d 6f 64 65 5d 20 3e 20 30 7d 20 74 68 65 6e  $mode] > 0} then
151c0 20 7b 0d 0a 20 20 20 20 20 20 20 20 61 70 70 65   {..        appe
151d0 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 3b  nd connection {;
151e0 4a 6f 75 72 6e 61 6c 20 4d 6f 64 65 3d 24 7b 6d  Journal Mode=${m
151f0 6f 64 65 7d 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a  ode}}..      }..
15200 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
15210 20 23 20 4e 4f 54 45 3a 20 49 66 20 6f 75 72 20   # NOTE: If our 
15220 63 61 6c 6c 65 72 20 73 70 65 63 69 66 69 65 64  caller specified
15230 20 61 20 44 61 74 65 54 69 6d 65 20 66 6f 72 6d   a DateTime form
15240 61 74 2c 20 61 64 64 20 74 68 65 20 6e 65 63 65  at, add the nece
15250 73 73 61 72 79 0d 0a 20 20 20 20 20 20 23 20 20  ssary..      #  
15260 20 20 20 20 20 70 6f 72 74 69 6f 6e 20 6f 66 20       portion of 
15270 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73  the connection s
15280 74 72 69 6e 67 20 6e 6f 77 2e 0d 0a 20 20 20 20  tring now...    
15290 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
152a0 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 64  string length $d
152b0 61 74 65 54 69 6d 65 46 6f 72 6d 61 74 5d 20 3e  ateTimeFormat] >
152c0 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
152d0 20 20 20 20 61 70 70 65 6e 64 20 63 6f 6e 6e 65      append conne
152e0 63 74 69 6f 6e 20 7b 3b 44 61 74 65 54 69 6d 65  ction {;DateTime
152f0 46 6f 72 6d 61 74 3d 24 7b 64 61 74 65 54 69 6d  Format=${dateTim
15300 65 46 6f 72 6d 61 74 7d 7d 0d 0a 20 20 20 20 20  eFormat}}..     
15310 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   }....      #.. 
15320 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20       # NOTE: If 
15330 6f 75 72 20 63 61 6c 6c 65 72 20 73 70 65 63 69  our caller speci
15340 66 69 65 64 20 61 20 44 61 74 65 54 69 6d 65 4b  fied a DateTimeK
15350 69 6e 64 2c 20 61 64 64 20 74 68 65 20 6e 65 63  ind, add the nec
15360 65 73 73 61 72 79 20 70 6f 72 74 69 6f 6e 0d 0a  essary portion..
15370 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6f 66        #       of
15380 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
15390 73 74 72 69 6e 67 20 6e 6f 77 2e 0d 0a 20 20 20  string now...   
153a0 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
153b0 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
153c0 64 61 74 65 54 69 6d 65 4b 69 6e 64 5d 20 3e 20  dateTimeKind] > 
153d0 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
153e0 20 20 20 61 70 70 65 6e 64 20 63 6f 6e 6e 65 63     append connec
153f0 74 69 6f 6e 20 7b 3b 44 61 74 65 54 69 6d 65 4b  tion {;DateTimeK
15400 69 6e 64 3d 24 7b 64 61 74 65 54 69 6d 65 4b 69  ind=${dateTimeKi
15410 6e 64 7d 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  nd}}..      }...
15420 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
15430 23 20 4e 4f 54 45 3a 20 46 69 67 75 72 65 20 6f  # NOTE: Figure o
15440 75 74 20 77 68 61 74 20 74 68 65 20 66 69 6e 61  ut what the fina
15450 6c 20 66 6c 61 67 73 20 66 6f 72 20 74 68 69 73  l flags for this
15460 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6e 65 65 64   connection need
15470 20 74 6f 20 62 65 2e 0d 0a 20 20 20 20 20 20 23   to be...      #
15480 0d 0a 20 20 20 20 20 20 73 65 74 20 66 6c 61 67  ..      set flag
15490 73 20 5b 67 65 74 43 6f 6e 6e 65 63 74 69 6f 6e  s [getConnection
154a0 46 6c 61 67 73 20 24 66 69 6c 65 4e 61 6d 65 20  Flags $fileName 
154b0 24 66 6c 61 67 73 20 24 71 75 69 65 74 5d 0d 0a  $flags $quiet]..
154c0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
154d0 20 23 20 4e 4f 54 45 3a 20 49 66 20 6f 75 72 20   # NOTE: If our 
154e0 63 61 6c 6c 65 72 20 73 70 65 63 69 66 69 65 64  caller specified
154f0 20 73 6f 6d 65 20 53 51 4c 69 74 65 43 6f 6e 6e   some SQLiteConn
15500 65 63 74 69 6f 6e 46 6c 61 67 73 2c 20 61 64 64  ectionFlags, add
15510 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20   the..      #   
15520 20 20 20 20 6e 65 63 65 73 73 61 72 79 20 70 6f      necessary po
15530 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6e  rtion of the con
15540 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e 67 20 6e  nection string n
15550 6f 77 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ow...      #..  
15560 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
15570 6c 65 6e 67 74 68 20 24 66 6c 61 67 73 5d 20 3e  length $flags] >
15580 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
15590 20 20 20 20 61 70 70 65 6e 64 20 63 6f 6e 6e 65      append conne
155a0 63 74 69 6f 6e 20 7b 3b 46 6c 61 67 73 3d 24 7b  ction {;Flags=${
155b0 66 6c 61 67 73 7d 7d 0d 0a 20 20 20 20 20 20 7d  flags}}..      }
155c0 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
155d0 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 6f 75     # NOTE: If ou
155e0 72 20 63 61 6c 6c 65 72 20 73 70 65 63 69 66 69  r caller specifi
155f0 65 64 20 61 6e 20 65 78 74 72 61 20 70 61 79 6c  ed an extra payl
15600 6f 61 64 20 74 6f 20 74 68 65 20 63 6f 6e 6e 65  oad to the conne
15610 63 74 69 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20  ction..      #  
15620 20 20 20 20 20 73 74 72 69 6e 67 2c 20 61 70 70       string, app
15630 65 6e 64 20 69 74 20 6e 6f 77 2e 0d 0a 20 20 20  end it now...   
15640 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
15650 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
15660 65 78 74 72 61 5d 20 3e 20 30 7d 20 74 68 65 6e  extra] > 0} then
15670 20 7b 0d 0a 20 20 20 20 20 20 20 20 61 70 70 65   {..        appe
15680 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 5c 3b  nd connection \;
15690 20 24 65 78 74 72 61 0d 0a 20 20 20 20 20 20 7d   $extra..      }
156a0 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
156b0 20 20 20 23 20 4e 4f 54 45 3a 20 4f 70 65 6e 20     # NOTE: Open 
156c0 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  the database con
156d0 6e 65 63 74 69 6f 6e 20 6e 6f 77 2c 20 70 6c 61  nection now, pla
156e0 63 69 6e 67 20 74 68 65 20 6f 70 61 71 75 65 20  cing the opaque 
156f0 68 61 6e 64 6c 65 20 76 61 6c 75 65 0d 0a 20 20  handle value..  
15700 20 20 20 20 23 20 20 20 20 20 20 20 69 6e 74 6f      #       into
15710 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 73 70   the variable sp
15720 65 63 69 66 69 65 64 20 62 79 20 6f 75 72 20 63  ecified by our c
15730 61 6c 6c 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d  aller...      #.
15740 0a 20 20 20 20 20 20 73 65 74 20 64 62 20 5b 73  .      set db [s
15750 71 6c 20 6f 70 65 6e 20 2d 74 79 70 65 20 53 51  ql open -type SQ
15760 4c 69 74 65 20 5b 73 75 62 73 74 20 24 63 6f 6e  Lite [subst $con
15770 6e 65 63 74 69 6f 6e 5d 5d 0d 0a 0d 0a 20 20 20  nection]]....   
15780 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
15790 54 45 3a 20 43 6f 6e 66 69 67 75 72 65 20 74 68  TE: Configure th
157a0 65 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65  e temporary dire
157b0 63 74 6f 72 79 20 66 6f 72 20 74 68 65 20 6e 65  ctory for the ne
157c0 77 6c 79 20 6f 70 65 6e 65 64 20 64 61 74 61 62  wly opened datab
157d0 61 73 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ase..      #    
157e0 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6e 6f     connection no
157f0 77 20 75 6e 6c 65 73 73 20 6f 75 72 20 63 61 6c  w unless our cal
15800 6c 65 72 20 66 6f 72 62 69 64 73 20 69 74 2e 0d  ler forbids it..
15810 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
15820 69 66 20 7b 24 74 65 6d 70 6f 72 61 72 79 20 26  if {$temporary &
15830 26 20 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  & ![info exists 
15840 3a 3a 6e 6f 28 73 65 74 54 65 6d 70 6f 72 61 72  ::no(setTemporar
15850 79 44 69 72 65 63 74 6f 72 79 29 5d 7d 20 74 68  yDirectory)]} th
15860 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 71  en {..        sq
15870 6c 20 65 78 65 63 75 74 65 20 24 64 62 20 5b 61  l execute $db [a
15880 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
15890 20 20 20 20 20 20 20 20 20 22 50 52 41 47 4d 41           "PRAGMA
158a0 20 74 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65   temp_store_dire
158b0 63 74 6f 72 79 20 3d 20 5c 22 22 20 5b 67 65 74  ctory = \"" [get
158c0 54 65 6d 70 6f 72 61 72 79 44 69 72 65 63 74 6f  TemporaryDirecto
158d0 72 79 5d 20 5c 22 5c 3b 5d 0d 0a 20 20 20 20 20  ry] \"\;]..     
158e0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   }....      #.. 
158f0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 50 65 72       # NOTE: Per
15900 66 6f 72 6d 20 61 6e 79 20 65 78 74 72 61 20 70  form any extra p
15910 65 72 2d 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 65  er-connection se
15920 74 75 70 20 66 6f 72 20 74 68 65 20 6e 65 77 6c  tup for the newl
15930 79 20 6f 70 65 6e 65 64 0d 0a 20 20 20 20 20 20  y opened..      
15940 23 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65  #       database
15950 20 6e 6f 77 20 75 6e 6c 65 73 73 20 6f 75 72 20   now unless our 
15960 63 61 6c 6c 65 72 20 66 6f 72 62 69 64 73 20 69  caller forbids i
15970 74 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  t...      #..   
15980 20 20 20 73 65 74 20 65 78 65 63 75 74 65 4f 6e     set executeOn
15990 53 65 74 75 70 20 5b 67 65 74 45 78 65 63 75 74  Setup [getExecut
159a0 65 4f 6e 53 65 74 75 70 5d 0d 0a 0d 0a 20 20 20  eOnSetup]....   
159b0 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
159c0 65 6e 67 74 68 20 24 65 78 65 63 75 74 65 4f 6e  ength $executeOn
159d0 53 65 74 75 70 5d 20 3e 20 30 20 26 26 20 5c 0d  Setup] > 0 && \.
159e0 0a 20 20 20 20 20 20 20 20 20 20 21 5b 69 6e 66  .          ![inf
159f0 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 65 78  o exists ::no(ex
15a00 65 63 75 74 65 4f 6e 53 65 74 75 70 29 5d 7d 20  ecuteOnSetup)]} 
15a10 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
15a20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
15a30 45 3a 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20  E: This command 
15a40 6d 61 79 20 72 61 69 73 65 20 61 6e 20 65 72 72  may raise an err
15a50 6f 72 3b 20 69 66 20 73 6f 2c 20 74 68 61 74 20  or; if so, that 
15a60 69 73 20 66 69 6e 65 2c 20 61 73 0d 0a 20 20 20  is fine, as..   
15a70 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
15a80 20 65 6e 63 6c 6f 73 69 6e 67 20 74 65 73 74 20   enclosing test 
15a90 77 69 6c 6c 20 74 68 65 6e 20 66 61 69 6c 2e 20  will then fail. 
15aa0 20 54 68 65 20 5b 73 75 62 73 74 5d 20 63 6f 6d   The [subst] com
15ab0 6d 61 6e 64 20 69 73 0d 0a 20 20 20 20 20 20 20  mand is..       
15ac0 20 23 20 20 20 20 20 20 20 75 73 65 64 20 6f 6e   #       used on
15ad0 20 74 68 65 20 53 51 4c 20 69 6e 20 63 61 73 65   the SQL in case
15ae0 20 69 74 20 6e 65 65 64 73 20 74 6f 20 72 65 66   it needs to ref
15af0 65 72 20 74 6f 20 73 74 61 74 65 20 69 6e 20 6f  er to state in o
15b00 75 72 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ur..        #   
15b10 20 20 20 20 63 6f 6e 74 65 78 74 2e 0d 0a 20 20      context...  
15b20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
15b30 20 73 71 6c 20 65 78 65 63 75 74 65 20 24 64 62   sql execute $db
15b40 20 5b 73 75 62 73 74 20 24 65 78 65 63 75 74 65   [subst $execute
15b50 4f 6e 53 65 74 75 70 5d 0d 0a 20 20 20 20 20 20  OnSetup]..      
15b60 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
15b70 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 6c 77 61      # NOTE: Alwa
15b80 79 73 20 72 65 74 75 72 6e 20 74 68 65 20 63 6f  ys return the co
15b90 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20  nnection handle 
15ba0 75 70 6f 6e 20 73 75 63 63 65 73 73 2e 0d 0a 20  upon success... 
15bb0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65       #..      re
15bc0 74 75 72 6e 20 24 64 62 0d 0a 20 20 20 20 7d 0d  turn $db..    }.
15bd0 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74  ....    proc get
15be0 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 20 7b 20 7b  DbConnection { {
15bf0 76 61 72 4e 61 6d 65 20 64 62 7d 20 7d 20 7b 0d  varName db} } {.
15c00 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
15c10 23 20 4e 4f 54 45 3a 20 52 65 66 65 72 20 74 6f  # NOTE: Refer to
15c20 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 76   the specified v
15c30 61 72 69 61 62 6c 65 20 28 65 2e 67 2e 20 22 64  ariable (e.g. "d
15c40 62 22 29 20 69 6e 20 74 68 65 20 63 6f 6e 74 65  b") in the conte
15c50 78 74 20 6f 66 20 6f 75 72 0d 0a 20 20 20 20 20  xt of our..     
15c60 20 23 20 20 20 20 20 20 20 63 61 6c 6c 65 72 2e   #       caller.
15c70 20 20 54 68 65 20 68 61 6e 64 6c 65 20 74 6f 20    The handle to 
15c80 74 68 65 20 64 61 74 61 62 61 73 65 20 70 72 65  the database pre
15c90 76 69 6f 75 73 6c 79 20 6f 70 65 6e 65 64 20 76  viously opened v
15ca0 69 61 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20  ia the..      # 
15cb0 20 20 20 20 20 20 5b 73 65 74 75 70 44 62 5d 20        [setupDb] 
15cc0 70 72 6f 63 65 64 75 72 65 20 73 68 6f 75 6c 64  procedure should
15cd0 20 62 65 20 73 74 6f 72 65 64 20 74 68 65 72 65   be stored there
15ce0 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
15cf0 20 20 75 70 76 61 72 20 31 20 24 76 61 72 4e 61    upvar 1 $varNa
15d00 6d 65 20 64 62 0d 0a 0d 0a 20 20 20 20 20 20 23  me db....      #
15d10 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
15d20 54 68 69 73 20 72 65 74 75 72 6e 73 20 74 68 65  This returns the
15d30 20 41 44 4f 2e 4e 45 54 20 49 44 62 43 6f 6e 6e   ADO.NET IDbConn
15d40 65 63 74 69 6f 6e 20 6f 62 6a 65 63 74 20 69 6e  ection object in
15d50 73 74 61 6e 63 65 20 66 6f 72 20 74 68 65 0d 0a  stance for the..
15d60 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73 70        #       sp
15d70 65 63 69 66 69 65 64 20 64 61 74 61 62 73 65 20  ecified databse 
15d80 68 61 6e 64 6c 65 2e 20 20 53 69 6e 63 65 20 67  handle.  Since g
15d90 65 74 74 69 6e 67 20 74 68 69 73 20 6f 62 6a 65  etting this obje
15da0 63 74 20 72 65 6c 69 65 73 20 75 70 6f 6e 0d 0a  ct relies upon..
15db0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 45 61        #       Ea
15dc0 67 6c 65 20 69 6e 74 65 72 6e 61 6c 73 2c 20 67  gle internals, g
15dd0 72 65 61 74 20 63 61 72 65 20 73 68 6f 75 6c 64  reat care should
15de0 20 62 65 20 74 61 6b 65 6e 20 74 6f 20 61 76 6f   be taken to avo
15df0 69 64 20 64 69 73 70 6f 73 69 6e 67 20 6f 66 0d  id disposing of.
15e00 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74  .      #       t
15e10 68 69 73 20 6f 62 6a 65 63 74 20 6f 72 20 6f 74  his object or ot
15e20 68 65 72 77 69 73 65 20 70 75 74 74 69 6e 67 20  herwise putting 
15e30 69 74 20 69 6e 74 6f 20 61 6e 20 69 6e 76 61 6c  it into an inval
15e40 69 64 20 73 74 61 74 65 2e 0d 0a 20 20 20 20 20  id state...     
15e50 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69   #..      if {[i
15e60 6e 66 6f 20 65 78 69 73 74 73 20 64 62 5d 7d 20  nfo exists db]} 
15e70 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
15e80 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20  if {[catch {..  
15e90 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69          object i
15ea0 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f  nvoke -flags +No
15eb0 6e 50 75 62 6c 69 63 20 2d 6f 62 6a 65 63 74 66  nPublic -objectf
15ec0 6c 61 67 73 20 2b 4e 6f 44 69 73 70 6f 73 65 20  lags +NoDispose 
15ed0 2d 61 6c 69 61 73 20 5c 0d 0a 20 20 20 20 20 20  -alias \..      
15ee0 20 20 20 20 20 20 20 20 49 6e 74 65 72 70 72 65          Interpre
15ef0 74 65 72 2e 47 65 74 41 63 74 69 76 65 2e 63 6f  ter.GetActive.co
15f00 6e 6e 65 63 74 69 6f 6e 73 20 49 74 65 6d 20 24  nnections Item $
15f10 64 62 0d 0a 20 20 20 20 20 20 20 20 7d 20 72 65  db..        } re
15f20 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  sult] == 0} then
15f30 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d   {..          #.
15f40 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
15f50 45 3a 20 53 75 63 63 65 73 73 2c 20 72 65 74 75  E: Success, retu
15f60 72 6e 20 74 68 65 20 6f 70 61 71 75 65 20 6f 62  rn the opaque ob
15f70 6a 65 63 74 20 68 61 6e 64 6c 65 2e 0d 0a 20 20  ject handle...  
15f80 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
15f90 20 20 20 20 20 72 65 74 75 72 6e 20 24 72 65 73       return $res
15fa0 75 6c 74 0d 0a 20 20 20 20 20 20 20 20 7d 20 65  ult..        } e
15fb0 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
15fc0 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
15fd0 4e 4f 54 45 3a 20 46 61 69 6c 75 72 65 2c 20 72  NOTE: Failure, r
15fe0 65 70 6f 72 74 20 77 68 79 2e 0d 0a 20 20 20 20  eport why...    
15ff0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
16000 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
16010 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
16020 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
16030 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e        "==== WARN
16040 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 67  ING: failed to g
16050 65 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61  et connection ha
16060 6e 64 6c 65 20 66 6f 72 20 64 61 74 61 62 61 73  ndle for databas
16070 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20  e \"" \..       
16080 20 20 20 20 20 20 20 24 64 62 20 22 5c 22 2c 20         $db "\", 
16090 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 72  error: " \n\t $r
160a0 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20  esult \n]..     
160b0 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d     }..      }...
160c0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
160d0 23 20 4e 4f 54 45 3a 20 46 61 69 6c 75 72 65 2c  # NOTE: Failure,
160e0 20 72 65 74 75 72 6e 20 61 6e 20 6f 62 76 69 6f   return an obvio
160f0 75 73 6c 79 20 69 6e 76 61 6c 69 64 20 6f 70 61  usly invalid opa
16100 71 75 65 20 6f 62 6a 65 63 74 20 68 61 6e 64 6c  que object handl
16110 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  e...      #..   
16120 20 20 20 72 65 74 75 72 6e 20 22 22 0d 0a 20 20     return ""..  
16130 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
16140 20 66 72 65 65 44 62 43 6f 6e 6e 65 63 74 69 6f   freeDbConnectio
16150 6e 20 7b 20 7b 76 61 72 4e 61 6d 65 20 63 6f 6e  n { {varName con
16160 6e 65 63 74 69 6f 6e 7d 20 7d 20 7b 0d 0a 20 20  nection} } {..  
16170 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
16180 4f 54 45 3a 20 52 65 66 65 72 20 74 6f 20 74 68  OTE: Refer to th
16190 65 20 73 70 65 63 69 66 69 65 64 20 76 61 72 69  e specified vari
161a0 61 62 6c 65 20 28 65 2e 67 2e 20 22 63 6f 6e 6e  able (e.g. "conn
161b0 65 63 74 69 6f 6e 22 29 20 69 6e 20 74 68 65 0d  ection") in the.
161c0 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63  .      #       c
161d0 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72 20 63 61  ontext of our ca
161e0 6c 6c 65 72 2e 20 20 54 68 65 20 6f 70 61 71 75  ller.  The opaqu
161f0 65 20 6f 62 6a 65 63 74 20 68 61 6e 64 6c 65 20  e object handle 
16200 66 6f 72 20 61 6e 20 41 44 4f 2e 4e 45 54 0d 0a  for an ADO.NET..
16210 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f        #       co
16220 6e 6e 65 63 74 69 6f 6e 20 70 72 65 76 69 6f 75  nnection previou
16230 73 6c 79 20 72 65 74 75 72 6e 65 64 20 62 79 20  sly returned by 
16240 5b 67 65 74 44 62 43 6f 6e 6e 65 63 74 69 6f 6e  [getDbConnection
16250 5d 20 73 68 6f 75 6c 64 20 62 65 0d 0a 20 20 20  ] should be..   
16260 20 20 20 23 20 20 20 20 20 20 20 73 74 6f 72 65     #       store
16270 64 20 74 68 65 72 65 2e 0d 0a 20 20 20 20 20 20  d there...      
16280 23 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20 31  #..      upvar 1
16290 20 24 76 61 72 4e 61 6d 65 20 63 6f 6e 6e 65 63   $varName connec
162a0 74 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20 23 0d  tion....      #.
162b0 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41  .      # NOTE: A
162c0 74 74 65 6d 70 74 20 74 6f 20 72 65 6d 6f 76 65  ttempt to remove
162d0 20 74 68 65 20 6f 70 61 71 75 65 20 6f 62 6a 65   the opaque obje
162e0 63 74 20 68 61 6e 64 6c 65 20 66 72 6f 6d 20 74  ct handle from t
162f0 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 0d 0a  he interpreter..
16300 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6e 6f        #       no
16310 77 2e 20 20 54 68 69 73 20 5b 6f 62 6a 65 63 74  w.  This [object
16320 20 64 69 73 70 6f 73 65 5d 20 63 61 6c 6c 20 77   dispose] call w
16330 69 6c 6c 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79  ill not actually
16340 20 64 69 73 70 6f 73 65 20 6f 66 20 74 68 65 0d   dispose of the.
16350 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 75  .      #       u
16360 6e 64 65 72 6c 79 69 6e 67 20 6f 62 6a 65 63 74  nderlying object
16370 20 62 65 63 61 75 73 65 20 74 68 65 20 2b 4e 6f   because the +No
16380 44 69 73 70 6f 73 65 20 66 6c 61 67 20 77 61 73  Dispose flag was
16390 20 73 65 74 20 6f 6e 20 69 74 0d 0a 20 20 20 20   set on it..    
163a0 20 20 23 20 20 20 20 20 20 20 64 75 72 69 6e 67    #       during
163b0 20 63 72 65 61 74 69 6f 6e 20 6f 66 20 74 68 65   creation of the
163c0 20 6f 70 61 71 75 65 20 6f 62 6a 65 63 74 20 68   opaque object h
163d0 61 6e 64 6c 65 2e 0d 0a 20 20 20 20 20 20 23 0d  andle...      #.
163e0 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f  .      if {[info
163f0 20 65 78 69 73 74 73 20 63 6f 6e 6e 65 63 74 69   exists connecti
16400 6f 6e 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  on] && \..      
16410 20 20 20 20 5b 63 61 74 63 68 20 7b 6f 62 6a 65      [catch {obje
16420 63 74 20 64 69 73 70 6f 73 65 20 24 63 6f 6e 6e  ct dispose $conn
16430 65 63 74 69 6f 6e 7d 20 65 72 72 6f 72 5d 7d 20  ection} error]} 
16440 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
16450 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
16460 45 3a 20 57 65 20 73 6f 6d 65 68 6f 77 20 66 61  E: We somehow fa
16470 69 6c 65 64 20 74 6f 20 72 65 6d 6f 76 65 20 74  iled to remove t
16480 68 65 20 68 61 6e 64 6c 65 2c 20 72 65 70 6f 72  he handle, repor
16490 74 20 77 68 79 2e 0d 0a 20 20 20 20 20 20 20 20  t why...        
164a0 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  #..        tputs
164b0 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
164c0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
164d0 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d              "===
164e0 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65  = WARNING: faile
164f0 64 20 74 6f 20 72 65 6d 6f 76 65 20 63 6f 6e 6e  d to remove conn
16500 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20 5c 22  ection handle \"
16510 22 20 24 63 6f 6e 6e 65 63 74 69 6f 6e 20 5c 0d  " $connection \.
16520 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22  .            "\"
16530 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20  , error: " \n\t 
16540 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20  $error \n]..    
16550 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
16560 20 20 20 70 72 6f 63 20 61 64 64 44 62 43 6f 6e     proc addDbCon
16570 6e 65 63 74 69 6f 6e 20 7b 20 63 6f 6e 6e 65 63  nection { connec
16580 74 69 6f 6e 20 7b 76 61 72 4e 61 6d 65 20 64 62  tion {varName db
16590 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a  } } {..      #..
165a0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65        # NOTE: Re
165b0 66 65 72 20 74 6f 20 74 68 65 20 73 70 65 63 69  fer to the speci
165c0 66 69 65 64 20 76 61 72 69 61 62 6c 65 20 28 65  fied variable (e
165d0 2e 67 2e 20 22 64 62 22 29 20 69 6e 20 74 68 65  .g. "db") in the
165e0 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72 0d   context of our.
165f0 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63  .      #       c
16600 61 6c 6c 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d  aller...      #.
16610 0a 20 20 20 20 20 20 75 70 76 61 72 20 31 20 24  .      upvar 1 $
16620 76 61 72 4e 61 6d 65 20 64 62 0d 0a 0d 0a 20 20  varName db....  
16630 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
16640 4f 54 45 3a 20 43 72 65 61 74 65 20 61 20 63 6f  OTE: Create a co
16650 72 72 65 63 74 6c 79 20 66 6f 72 6d 61 74 74 65  rrectly formatte
16660 64 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 64  d name for the d
16670 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
16680 6f 6e 20 74 6f 0d 0a 20 20 20 20 20 20 23 20 20  on to..      #  
16690 20 20 20 20 20 62 65 20 61 64 64 65 64 20 74 6f       be added to
166a0 20 74 68 65 20 6c 69 73 74 20 6d 61 6e 61 67 65   the list manage
166b0 64 20 62 79 20 74 68 65 20 45 61 67 6c 65 20 69  d by the Eagle i
166c0 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a 20 20 20  nterpreter...   
166d0 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20     #..      set 
166e0 64 62 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b  db [object invok
166f0 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62  e -flags +NonPub
16700 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  lic \..         
16710 20 45 61 67 6c 65 2e 5f 43 6f 6d 70 6f 6e 65 6e   Eagle._Componen
16720 74 73 2e 50 72 69 76 61 74 65 2e 46 6f 72 6d 61  ts.Private.Forma
16730 74 4f 70 73 20 44 61 74 61 62 61 73 65 4f 62 6a  tOps DatabaseObj
16740 65 63 74 4e 61 6d 65 20 24 63 6f 6e 6e 65 63 74  ectName $connect
16750 69 6f 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ion \..         
16760 20 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f   SQLiteConnectio
16770 6e 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65  n [object invoke
16780 20 49 6e 74 65 72 70 72 65 74 65 72 2e 47 65 74   Interpreter.Get
16790 41 63 74 69 76 65 20 4e 65 78 74 49 64 5d 5d 0d  Active NextId]].
167a0 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
167b0 20 20 23 20 4e 4f 54 45 3a 20 41 64 64 20 74 68    # NOTE: Add th
167c0 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
167d0 63 74 69 6f 6e 20 70 72 6f 76 69 64 65 64 20 62  ction provided b
167e0 79 20 6f 75 72 20 63 61 6c 6c 65 72 20 74 6f 20  y our caller to 
167f0 74 68 65 20 6c 69 73 74 0d 0a 20 20 20 20 20 20  the list..      
16800 23 20 20 20 20 20 20 20 6f 66 20 74 68 6f 73 65  #       of those
16810 20 6b 6e 6f 77 6e 20 74 6f 20 74 68 65 20 45 61   known to the Ea
16820 67 6c 65 20 69 6e 74 65 72 70 72 65 74 65 72 2e  gle interpreter.
16830 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
16840 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d   object invoke -
16850 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63  flags +NonPublic
16860 20 49 6e 74 65 72 70 72 65 74 65 72 2e 47 65 74   Interpreter.Get
16870 41 63 74 69 76 65 2e 63 6f 6e 6e 65 63 74 69 6f  Active.connectio
16880 6e 73 20 41 64 64 20 5c 0d 0a 20 20 20 20 20 20  ns Add \..      
16890 20 20 20 20 24 64 62 20 24 63 6f 6e 6e 65 63 74      $db $connect
168a0 69 6f 6e 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20  ion..    }..... 
168b0 20 20 20 70 72 6f 63 20 67 65 74 52 6f 77 73 46     proc getRowsF
168c0 72 6f 6d 44 61 74 61 54 61 62 6c 65 20 7b 20 64  romDataTable { d
168d0 61 74 61 54 61 62 6c 65 20 7d 20 7b 0d 0a 20 20  ataTable } {..  
168e0 20 20 20 20 73 65 74 20 72 6f 77 73 20 5b 6c 69      set rows [li
168f0 73 74 5d 0d 0a 20 20 20 20 20 20 73 65 74 20 63  st]..      set c
16900 6f 75 6e 74 20 5b 24 64 61 74 61 54 61 62 6c 65  ount [$dataTable
16910 20 43 6f 6c 75 6d 6e 73 2e 43 6f 75 6e 74 5d 0d   Columns.Count].
16920 0a 0d 0a 20 20 20 20 20 20 66 6f 72 20 7b 73 65  ...      for {se
16930 74 20 69 6e 64 65 78 20 30 7d 20 7b 24 69 6e 64  t index 0} {$ind
16940 65 78 20 3c 20 24 63 6f 75 6e 74 7d 20 7b 69 6e  ex < $count} {in
16950 63 72 20 69 6e 64 65 78 7d 20 7b 0d 0a 20 20 20  cr index} {..   
16960 20 20 20 20 20 73 65 74 20 64 61 74 61 43 6f 6c       set dataCol
16970 75 6d 6e 20 5b 24 64 61 74 61 54 61 62 6c 65 20  umn [$dataTable 
16980 2d 61 6c 69 61 73 20 43 6f 6c 75 6d 6e 73 2e 67  -alias Columns.g
16990 65 74 5f 49 74 65 6d 20 24 69 6e 64 65 78 5d 0d  et_Item $index].
169a0 0a 20 20 20 20 20 20 20 20 73 65 74 20 6e 61 6d  .        set nam
169b0 65 73 28 24 69 6e 64 65 78 29 20 5b 24 64 61 74  es($index) [$dat
169c0 61 43 6f 6c 75 6d 6e 20 43 6f 6c 75 6d 6e 4e 61  aColumn ColumnNa
169d0 6d 65 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  me]..      }....
169e0 20 20 20 20 20 20 6f 62 6a 65 63 74 20 66 6f 72        object for
169f0 65 61 63 68 20 2d 61 6c 69 61 73 20 64 61 74 61  each -alias data
16a00 52 6f 77 20 5b 73 65 74 20 64 61 74 61 52 6f 77  Row [set dataRow
16a10 73 20 5b 24 64 61 74 61 54 61 62 6c 65 20 52 6f  s [$dataTable Ro
16a20 77 73 5d 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20  ws]] {..        
16a30 73 65 74 20 72 6f 77 20 5b 6c 69 73 74 5d 0d 0a  set row [list]..
16a40 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 20 7b 73  ..        for {s
16a50 65 74 20 69 6e 64 65 78 20 30 7d 20 7b 24 69 6e  et index 0} {$in
16a60 64 65 78 20 3c 20 24 63 6f 75 6e 74 7d 20 7b 69  dex < $count} {i
16a70 6e 63 72 20 69 6e 64 65 78 7d 20 7b 0d 0a 20 20  ncr index} {..  
16a80 20 20 20 20 20 20 20 20 73 65 74 20 76 61 6c 75          set valu
16a90 65 20 5b 24 64 61 74 61 52 6f 77 20 2d 63 72 65  e [$dataRow -cre
16aa0 61 74 65 20 2d 61 6c 69 61 73 20 67 65 74 5f 49  ate -alias get_I
16ab0 74 65 6d 20 24 69 6e 64 65 78 5d 0d 0a 0d 0a 20  tem $index].... 
16ac0 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74           if {[st
16ad0 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 61 6c  ring length $val
16ae0 75 65 5d 20 3e 20 30 20 26 26 20 5c 0d 0a 20 20  ue] > 0 && \..  
16af0 20 20 20 20 20 20 20 20 20 20 20 20 21 5b 6f 62              ![ob
16b00 6a 65 63 74 20 69 6e 76 6f 6b 65 20 43 6f 6e 76  ject invoke Conv
16b10 65 72 74 20 49 73 44 42 4e 75 6c 6c 20 24 76 61  ert IsDBNull $va
16b20 6c 75 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  lue]} then {..  
16b30 20 20 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e            lappen
16b40 64 20 72 6f 77 20 5b 6c 69 73 74 20 24 6e 61 6d  d row [list $nam
16b50 65 73 28 24 69 6e 64 65 78 29 20 5b 24 76 61 6c  es($index) [$val
16b60 75 65 20 54 6f 53 74 72 69 6e 67 5d 5d 0d 0a 20  ue ToString]].. 
16b70 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20           } else 
16b80 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c  {..            l
16b90 61 70 70 65 6e 64 20 72 6f 77 20 5b 6c 69 73 74  append row [list
16ba0 20 24 6e 61 6d 65 73 28 24 69 6e 64 65 78 29 5d   $names($index)]
16bb0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
16bc0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
16bd0 20 20 20 20 6c 61 70 70 65 6e 64 20 72 6f 77 73      lappend rows
16be0 20 24 72 6f 77 0d 0a 20 20 20 20 20 20 7d 0d 0a   $row..      }..
16bf0 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 24  ..      return $
16c00 72 6f 77 73 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  rows..    }.....
16c10 20 20 20 20 70 72 6f 63 20 64 75 6d 70 52 6f 77      proc dumpRow
16c20 73 46 72 6f 6d 44 61 74 61 54 61 62 6c 65 20 7b  sFromDataTable {
16c30 20 63 68 61 6e 6e 65 6c 20 72 6f 77 73 20 7d 20   channel rows } 
16c40 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 73 65 71  {..      set seq
16c50 75 65 6e 63 65 20 31 0d 0a 0d 0a 20 20 20 20 20  uence 1....     
16c60 20 66 6f 72 65 61 63 68 20 72 6f 77 20 24 72 6f   foreach row $ro
16c70 77 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70  ws {..        tp
16c80 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
16c90 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
16ca0 20 20 20 20 20 20 20 20 5b 65 78 70 72 20 7b 24          [expr {$
16cb0 73 65 71 75 65 6e 63 65 20 3e 20 31 20 3f 20 22  sequence > 1 ? "
16cc0 5c 6e 22 20 3a 20 22 22 7d 5d 20 22 2d 2d 2d 2d  \n" : ""}] "----
16cd0 20 52 4f 57 20 23 22 20 24 73 65 71 75 65 6e 63   ROW #" $sequenc
16ce0 65 20 3a 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20  e :\n]....      
16cf0 20 20 66 6f 72 65 61 63 68 20 70 61 69 72 20 24    foreach pair $
16d00 72 6f 77 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  row {..         
16d10 20 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 70   if {[llength $p
16d20 61 69 72 5d 20 3e 3d 20 32 7d 20 74 68 65 6e 20  air] >= 2} then 
16d30 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
16d40 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
16d50 70 70 65 6e 64 41 72 67 73 20 5c 74 20 5c 0d 0a  ppendArgs \t \..
16d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d70 5b 6c 69 73 74 20 5b 6c 69 6e 64 65 78 20 24 70  [list [lindex $p
16d80 61 69 72 20 30 5d 5d 20 22 3a 20 22 20 5b 6c 69  air 0]] ": " [li
16d90 73 74 20 5b 6c 69 6e 64 65 78 20 24 70 61 69 72  st [lindex $pair
16da0 20 31 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20   1]] \n]..      
16db0 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 6c      } elseif {[l
16dc0 6c 65 6e 67 74 68 20 24 70 61 69 72 5d 20 3d 3d  length $pair] ==
16dd0 20 31 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   1} then {..    
16de0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
16df0 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
16e00 67 73 20 5c 74 20 5c 0d 0a 20 20 20 20 20 20 20  gs \t \..       
16e10 20 20 20 20 20 20 20 20 20 5b 6c 69 73 74 20 5b           [list [
16e20 6c 69 6e 64 65 78 20 24 70 61 69 72 20 30 5d 5d  lindex $pair 0]]
16e30 20 22 3a 20 3c 6e 75 6c 6c 3e 5c 6e 22 5d 0d 0a   ": <null>\n"]..
16e40 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
16e50 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
16e60 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5c  tputs $channel \
16e70 74 3c 65 6d 70 74 79 3e 5c 6e 3b 20 23 20 4e 4f  t<empty>\n; # NO
16e80 54 45 3a 20 4e 6f 20 64 61 74 61 3f 0d 0a 20 20  TE: No data?..  
16e90 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
16ea0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
16eb0 69 6e 63 72 20 73 65 71 75 65 6e 63 65 0d 0a 20  incr sequence.. 
16ec0 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
16ed0 0d 0a 20 20 20 20 70 72 6f 63 20 63 6c 65 61 6e  ..    proc clean
16ee0 75 70 44 62 20 7b 20 66 69 6c 65 4e 61 6d 65 20  upDb { fileName 
16ef0 7b 76 61 72 4e 61 6d 65 20 64 62 7d 20 7b 63 6f  {varName db} {co
16f00 6c 6c 65 63 74 20 74 72 75 65 7d 20 7b 71 75 61  llect true} {qua
16f10 6c 69 66 79 20 74 72 75 65 7d 0d 0a 20 20 20 20  lify true}..    
16f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f30 20 7b 64 65 6c 65 74 65 20 74 72 75 65 7d 20 7d   {delete true} }
16f40 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
16f50 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d     # NOTE: Attem
16f60 70 74 20 74 6f 20 66 6f 72 63 65 20 61 6c 6c 20  pt to force all 
16f70 70 65 6e 64 69 6e 67 20 22 67 61 72 62 61 67 65  pending "garbage
16f80 22 20 6f 62 6a 65 63 74 73 20 74 6f 20 62 65 20  " objects to be 
16f90 63 6f 6c 6c 65 63 74 65 64 2c 0d 0a 20 20 20 20  collected,..    
16fa0 20 20 23 20 20 20 20 20 20 20 69 6e 63 6c 75 64    #       includ
16fb0 69 6e 67 20 53 51 4c 69 74 65 20 73 74 61 74 65  ing SQLite state
16fc0 6d 65 6e 74 73 20 61 6e 64 20 62 61 63 6b 75 70  ments and backup
16fd0 20 6f 62 6a 65 63 74 73 3b 20 74 68 69 73 20 73   objects; this s
16fe0 68 6f 75 6c 64 20 61 6c 6c 6f 77 0d 0a 20 20 20  hould allow..   
16ff0 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20 75     #       the u
17000 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61  nderlying databa
17010 73 65 20 66 69 6c 65 20 74 6f 20 62 65 20 64 65  se file to be de
17020 6c 65 74 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d  leted...      #.
17030 0a 20 20 20 20 20 20 69 66 20 7b 24 63 6f 6c 6c  .      if {$coll
17040 65 63 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ect} then {..   
17050 20 20 20 20 20 63 6f 6c 6c 65 63 74 47 61 72 62       collectGarb
17060 61 67 65 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  age $::test_chan
17070 6e 65 6c 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  nel..      }....
17080 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
17090 20 4e 4f 54 45 3a 20 52 65 66 65 72 20 74 6f 20   NOTE: Refer to 
170a0 74 68 65 20 73 70 65 63 69 66 69 65 64 20 76 61  the specified va
170b0 72 69 61 62 6c 65 20 28 65 2e 67 2e 20 22 64 62  riable (e.g. "db
170c0 22 29 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 78  ") in the contex
170d0 74 20 6f 66 20 6f 75 72 0d 0a 20 20 20 20 20 20  t of our..      
170e0 23 20 20 20 20 20 20 20 63 61 6c 6c 65 72 2e 20  #       caller. 
170f0 20 54 68 65 20 68 61 6e 64 6c 65 20 74 6f 20 74   The handle to t
17100 68 65 20 64 61 74 61 62 61 73 65 20 70 72 65 76  he database prev
17110 69 6f 75 73 6c 79 20 6f 70 65 6e 65 64 20 76 69  iously opened vi
17120 61 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20  a the..      #  
17130 20 20 20 20 20 5b 73 65 74 75 70 44 62 5d 20 70       [setupDb] p
17140 72 6f 63 65 64 75 72 65 20 73 68 6f 75 6c 64 20  rocedure should 
17150 62 65 20 73 74 6f 72 65 64 20 74 68 65 72 65 2e  be stored there.
17160 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
17170 20 75 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d   upvar 1 $varNam
17180 65 20 64 62 0d 0a 0d 0a 20 20 20 20 20 20 23 0d  e db....      #.
17190 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43  .      # NOTE: C
171a0 6c 6f 73 65 20 74 68 65 20 63 6f 6e 6e 65 63 74  lose the connect
171b0 69 6f 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62  ion to the datab
171c0 61 73 65 20 6e 6f 77 2e 20 20 54 68 69 73 20 73  ase now.  This s
171d0 68 6f 75 6c 64 20 61 6c 6c 6f 77 20 75 73 0d 0a  hould allow us..
171e0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 6f        #       to
171f0 20 64 65 6c 65 74 65 20 74 68 65 20 75 6e 64 65   delete the unde
17200 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65 20  rlying database 
17210 66 69 6c 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  file...      #..
17220 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20        if {[info 
17230 65 78 69 73 74 73 20 64 62 5d 20 26 26 20 5b 63  exists db] && [c
17240 61 74 63 68 20 7b 73 71 6c 20 63 6c 6f 73 65 20  atch {sql close 
17250 24 64 62 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65  $db} error]} the
17260 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
17270 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
17280 57 65 20 73 6f 6d 65 68 6f 77 20 66 61 69 6c 65  We somehow faile
17290 64 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 20 64  d to close the d
172a0 61 74 61 62 61 73 65 2c 20 72 65 70 6f 72 74 20  atabase, report 
172b0 77 68 79 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  why...        #.
172c0 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
172d0 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
172e0 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
172f0 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20            "==== 
17300 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20  WARNING: failed 
17310 74 6f 20 63 6c 6f 73 65 20 64 61 74 61 62 61 73  to close databas
17320 65 20 5c 22 22 20 24 64 62 20 22 5c 22 2c 20 65  e \"" $db "\", e
17330 72 72 6f 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20  rror: " \..     
17340 20 20 20 20 20 20 20 5c 6e 5c 74 20 24 65 72 72         \n\t $err
17350 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d  or \n]..      }.
17360 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
17370 20 20 23 20 4e 4f 54 45 3a 20 46 69 72 73 74 2c    # NOTE: First,
17380 20 73 65 65 20 69 66 20 6f 75 72 20 63 61 6c 6c   see if our call
17390 65 72 20 68 61 73 20 72 65 71 75 65 73 74 65 64  er has requested
173a0 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
173b0 74 61 62 61 73 65 2e 0d 0a 20 20 20 20 20 20 23  tabase...      #
173c0 0d 0a 20 20 20 20 20 20 73 65 74 20 69 73 4d 65  ..      set isMe
173d0 6d 6f 72 79 20 5b 69 73 4d 65 6d 6f 72 79 44 62  mory [isMemoryDb
173e0 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20   $fileName].... 
173f0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
17400 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74 68 65 20  NOTE: Build the 
17410 66 75 6c 6c 20 70 61 74 68 20 74 6f 20 74 68 65  full path to the
17420 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e   database file n
17430 61 6d 65 2e 20 20 46 6f 72 20 6e 6f 77 2c 20 61  ame.  For now, a
17440 6c 6c 20 74 65 73 74 0d 0a 20 20 20 20 20 20 23  ll test..      #
17450 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20         database 
17460 66 69 6c 65 73 20 61 72 65 20 73 74 6f 72 65 64  files are stored
17470 20 69 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72   in the temporar
17480 79 20 64 69 72 65 63 74 6f 72 79 2e 0d 0a 20 20  y directory...  
17490 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
174a0 7b 21 24 69 73 4d 65 6d 6f 72 79 20 26 26 20 24  {!$isMemory && $
174b0 71 75 61 6c 69 66 79 7d 20 74 68 65 6e 20 7b 0d  qualify} then {.
174c0 0a 20 20 20 20 20 20 20 20 73 65 74 20 66 69 6c  .        set fil
174d0 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e  eName [file join
174e0 20 5b 67 65 74 44 61 74 61 62 61 73 65 44 69 72   [getDatabaseDir
174f0 65 63 74 6f 72 79 5d 20 5b 66 69 6c 65 20 74 61  ectory] [file ta
17500 69 6c 20 24 66 69 6c 65 4e 61 6d 65 5d 5d 0d 0a  il $fileName]]..
17510 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
17520 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
17530 3a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 66  : Check if the f
17540 69 6c 65 20 73 74 69 6c 6c 20 65 78 69 73 74 73  ile still exists
17550 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
17560 20 20 69 66 20 7b 21 24 69 73 4d 65 6d 6f 72 79    if {!$isMemory
17570 20 26 26 20 24 64 65 6c 65 74 65 20 26 26 20 5b   && $delete && [
17580 66 69 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c  file exists $fil
17590 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a  eName]} then {..
175a0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
175b0 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20     # NOTE: Skip 
175c0 64 65 6c 65 74 69 6e 67 20 64 61 74 61 62 61 73  deleting databas
175d0 65 20 66 69 6c 65 73 20 69 66 20 73 6f 6d 65 62  e files if someb
175e0 6f 64 79 20 73 65 74 73 20 74 68 65 20 67 6c 6f  ody sets the glo
175f0 62 61 6c 0d 0a 20 20 20 20 20 20 20 20 23 20 20  bal..        #  
17600 20 20 20 20 20 76 61 72 69 61 62 6c 65 20 74 6f       variable to
17610 20 70 72 65 76 65 6e 74 20 69 74 2e 0d 0a 20 20   prevent it...  
17620 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
17630 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
17640 74 73 20 3a 3a 6e 6f 28 63 6c 65 61 6e 75 70 44  ts ::no(cleanupD
17650 62 46 69 6c 65 29 5d 7d 20 74 68 65 6e 20 7b 0d  bFile)]} then {.
17660 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
17670 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
17680 41 74 74 65 6d 70 74 20 74 6f 20 64 65 6c 65 74  Attempt to delet
17690 65 20 74 68 65 20 74 65 73 74 20 64 61 74 61 62  e the test datab
176a0 61 73 65 20 66 69 6c 65 20 6e 6f 77 2e 0d 0a 20  ase file now... 
176b0 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
176c0 20 20 20 20 20 20 69 66 20 7b 5b 73 65 74 20 63        if {[set c
176d0 6f 64 65 20 5b 63 61 74 63 68 20 7b 66 69 6c 65  ode [catch {file
176e0 20 64 65 6c 65 74 65 20 24 66 69 6c 65 4e 61 6d   delete $fileNam
176f0 65 7d 20 65 72 72 6f 72 5d 5d 7d 20 74 68 65 6e  e} error]]} then
17700 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
17710 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  #..            #
17720 20 4e 4f 54 45 3a 20 57 65 20 73 6f 6d 65 68 6f   NOTE: We someho
17730 77 20 66 61 69 6c 65 64 20 74 6f 20 64 65 6c 65  w failed to dele
17740 74 65 20 74 68 65 20 66 69 6c 65 2c 20 72 65 70  te the file, rep
17750 6f 72 74 20 77 68 79 2e 0d 0a 20 20 20 20 20 20  ort why...      
17760 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
17770 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
17780 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
17790 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
177a0 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20            "==== 
177b0 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20  WARNING: failed 
177c0 74 6f 20 64 65 6c 65 74 65 20 64 61 74 61 62 61  to delete databa
177d0 73 65 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c  se file \"" $fil
177e0 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20  eName \..       
177f0 20 20 20 20 20 20 20 20 20 22 5c 22 20 64 75 72           "\" dur
17800 69 6e 67 20 63 6c 65 61 6e 75 70 2c 20 65 72 72  ing cleanup, err
17810 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f  or: " \n\t $erro
17820 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  r \n]..         
17830 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c   }..        } el
17840 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
17850 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e  #..          # N
17860 4f 54 45 3a 20 53 68 6f 77 20 74 68 61 74 20 77  OTE: Show that w
17870 65 20 73 6b 69 70 70 65 64 20 64 65 6c 65 74 69  e skipped deleti
17880 6e 67 20 74 68 65 20 66 69 6c 65 2e 0d 0a 20 20  ng the file...  
17890 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
178a0 20 20 20 20 20 73 65 74 20 63 6f 64 65 20 30 0d       set code 0.
178b0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75  ...          tpu
178c0 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
178d0 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
178e0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
178f0 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 73  "==== WARNING: s
17900 6b 69 70 70 65 64 20 64 65 6c 65 74 69 6e 67 20  kipped deleting 
17910 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 5c 22  database file \"
17920 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20  " $fileName \.. 
17930 20 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22               "\"
17940 20 64 75 72 69 6e 67 20 63 6c 65 61 6e 75 70 5c   during cleanup\
17950 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  n"]..        }..
17960 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
17970 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
17980 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 66     # NOTE: The f
17990 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  ile does not exi
179a0 73 74 2c 20 73 75 63 63 65 73 73 21 0d 0a 20 20  st, success!..  
179b0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
179c0 20 73 65 74 20 63 6f 64 65 20 30 0d 0a 20 20 20   set code 0..   
179d0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65     }....      re
179e0 74 75 72 6e 20 24 63 6f 64 65 0d 0a 20 20 20 20  turn $code..    
179f0 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 73  }.....    proc s
17a00 61 76 65 45 6e 76 69 72 6f 6e 6d 65 6e 74 56 61  aveEnvironmentVa
17a10 72 69 61 62 6c 65 73 20 7b 20 6e 61 6d 65 73 20  riables { names 
17a20 7b 76 61 72 4e 61 6d 65 20 22 22 7d 20 7d 20 7b  {varName ""} } {
17a30 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
17a40 20 23 20 4e 4f 54 45 3a 20 46 6f 72 20 65 61 63   # NOTE: For eac
17a50 68 20 6e 61 6d 65 2c 20 64 6f 65 73 20 74 68 65  h name, does the
17a60 20 6c 69 76 65 20 65 6e 76 69 72 6f 6e 6d 65 6e   live environmen
17a70 74 20 76 61 72 69 61 62 6c 65 20 65 78 69 73 74  t variable exist
17a80 3f 20 20 49 66 0d 0a 20 20 20 20 20 20 23 20 20  ?  If..      #  
17a90 20 20 20 20 20 73 6f 2c 20 73 61 76 65 20 74 68       so, save th
17aa0 65 20 76 61 6c 75 65 20 66 6f 72 20 6c 61 74 65  e value for late
17ab0 72 3b 20 6f 74 68 65 72 77 69 73 65 2c 20 6d 61  r; otherwise, ma
17ac0 6b 65 20 73 75 72 65 20 74 68 65 20 73 61 76 65  ke sure the save
17ad0 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  d..      #      
17ae0 20 76 61 6c 75 65 20 64 6f 65 73 20 6e 6f 74 20   value does not 
17af0 65 78 69 73 74 20 65 69 74 68 65 72 2e 20 20 54  exist either.  T
17b00 68 65 20 6c 69 76 65 20 65 6e 76 69 72 6f 6e 6d  he live environm
17b10 65 6e 74 20 76 61 72 69 61 62 6c 65 73 0d 0a 20  ent variables.. 
17b20 20 20 20 20 20 23 20 20 20 20 20 20 20 41 52 45       #       ARE
17b30 20 4e 4f 54 20 63 68 61 6e 67 65 64 20 62 79 20   NOT changed by 
17b40 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 2e 0d  this procedure..
17b50 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
17b60 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
17b70 74 68 20 24 76 61 72 4e 61 6d 65 5d 20 3d 3d 20  th $varName] == 
17b80 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
17b90 20 20 20 73 65 74 20 76 61 72 4e 61 6d 65 20 73     set varName s
17ba0 61 76 65 64 45 6e 76 0d 0a 20 20 20 20 20 20 7d  avedEnv..      }
17bb0 0d 0a 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20  ....      upvar 
17bc0 31 20 24 76 61 72 4e 61 6d 65 20 73 61 76 65 64  1 $varName saved
17bd0 45 6e 76 0d 0a 0d 0a 20 20 20 20 20 20 66 6f 72  Env....      for
17be0 65 61 63 68 20 6e 61 6d 65 20 24 6e 61 6d 65 73  each name $names
17bf0 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   {..        if {
17c00 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 65  [info exists ::e
17c10 6e 76 28 24 6e 61 6d 65 29 5d 7d 20 74 68 65 6e  nv($name)]} then
17c20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   {..          se
17c30 74 20 73 61 76 65 64 45 6e 76 28 24 6e 61 6d 65  t savedEnv($name
17c40 29 20 24 3a 3a 65 6e 76 28 24 6e 61 6d 65 29 0d  ) $::env($name).
17c50 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20  .        } else 
17c60 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 75 6e 73  {..          uns
17c70 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 73  et -nocomplain s
17c80 61 76 65 64 45 6e 76 28 24 6e 61 6d 65 29 0d 0a  avedEnv($name)..
17c90 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
17ca0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   }....      #.. 
17cb0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69       # NOTE: Thi
17cc0 73 20 69 73 20 73 65 6c 66 2d 63 6c 65 61 6e 69  s is self-cleani
17cd0 6e 67 2e 20 20 49 66 20 6e 6f 20 73 61 76 65 64  ng.  If no saved
17ce0 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72   environment var
17cf0 69 61 62 6c 65 73 20 6e 6f 77 0d 0a 20 20 20 20  iables now..    
17d00 20 20 23 20 20 20 20 20 20 20 65 78 69 73 74 2c    #       exist,
17d10 20 72 65 6d 6f 76 65 20 74 68 65 20 61 72 72 61   remove the arra
17d20 79 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  y...      #..   
17d30 20 20 20 69 66 20 7b 5b 61 72 72 61 79 20 73 69     if {[array si
17d40 7a 65 20 73 61 76 65 64 45 6e 76 5d 20 3d 3d 20  ze savedEnv] == 
17d50 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
17d60 20 20 20 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70     unset -nocomp
17d70 6c 61 69 6e 20 73 61 76 65 64 45 6e 76 0d 0a 20  lain savedEnv.. 
17d80 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
17d90 0d 0a 20 20 20 20 70 72 6f 63 20 72 65 73 74 6f  ..    proc resto
17da0 72 65 45 6e 76 69 72 6f 6e 6d 65 6e 74 56 61 72  reEnvironmentVar
17db0 69 61 62 6c 65 73 20 7b 20 6e 61 6d 65 73 20 7b  iables { names {
17dc0 76 61 72 4e 61 6d 65 20 22 22 7d 20 7d 20 7b 0d  varName ""} } {.
17dd0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
17de0 23 20 4e 4f 54 45 3a 20 46 6f 72 20 65 61 63 68  # NOTE: For each
17df0 20 6e 61 6d 65 2c 20 64 6f 65 73 20 74 68 65 20   name, does the 
17e00 73 61 76 65 64 20 65 6e 76 69 72 6f 6e 6d 65 6e  saved environmen
17e10 74 20 76 61 72 69 61 62 6c 65 20 65 78 69 73 74  t variable exist
17e20 3f 20 20 49 66 0d 0a 20 20 20 20 20 20 23 20 20  ?  If..      #  
17e30 20 20 20 20 20 73 6f 2c 20 72 65 73 74 6f 72 65       so, restore
17e40 20 74 68 65 20 73 61 76 65 64 20 76 61 6c 75 65   the saved value
17e50 20 61 6e 64 20 75 6e 73 65 74 20 69 74 3b 20 6f   and unset it; o
17e60 74 68 65 72 77 69 73 65 2c 20 6d 61 6b 65 20 73  therwise, make s
17e70 75 72 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ure..      #    
17e80 20 20 20 74 68 65 20 6c 69 76 65 20 65 6e 76 69     the live envi
17e90 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65  ronment variable
17ea0 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 20   does not exist 
17eb0 65 69 74 68 65 72 20 28 69 2e 65 2e 20 69 74 0d  either (i.e. it.
17ec0 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 77  .      #       w
17ed0 61 73 20 6e 6f 74 20 73 65 74 20 74 6f 20 62 65  as not set to be
17ee0 67 69 6e 20 77 69 74 68 29 2e 20 20 42 6f 74 68  gin with).  Both
17ef0 20 73 61 76 65 64 20 61 6e 64 20 6c 69 76 65 20   saved and live 
17f00 65 6e 76 69 72 6f 6e 6d 65 6e 74 0d 0a 20 20 20  environment..   
17f10 20 20 20 23 20 20 20 20 20 20 20 76 61 72 69 61     #       varia
17f20 62 6c 65 73 20 41 52 45 20 63 68 61 6e 67 65 64  bles ARE changed
17f30 20 62 79 20 74 68 69 73 20 70 72 6f 63 65 64 75   by this procedu
17f40 72 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  re...      #..  
17f50 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
17f60 6c 65 6e 67 74 68 20 24 76 61 72 4e 61 6d 65 5d  length $varName]
17f70 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
17f80 20 20 20 20 20 20 20 73 65 74 20 76 61 72 4e 61         set varNa
17f90 6d 65 20 73 61 76 65 64 45 6e 76 0d 0a 20 20 20  me savedEnv..   
17fa0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 75 70     }....      up
17fb0 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65 20 73  var 1 $varName s
17fc0 61 76 65 64 45 6e 76 0d 0a 0d 0a 20 20 20 20 20  avedEnv....     
17fd0 20 66 6f 72 65 61 63 68 20 6e 61 6d 65 20 24 6e   foreach name $n
17fe0 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20  ames {..        
17ff0 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
18000 20 73 61 76 65 64 45 6e 76 28 24 6e 61 6d 65 29   savedEnv($name)
18010 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
18020 20 20 20 20 20 73 65 74 20 3a 3a 65 6e 76 28 24       set ::env($
18030 6e 61 6d 65 29 20 24 73 61 76 65 64 45 6e 76 28  name) $savedEnv(
18040 24 6e 61 6d 65 29 0d 0a 20 20 20 20 20 20 20 20  $name)..        
18050 20 20 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c    unset -nocompl
18060 61 69 6e 20 73 61 76 65 64 45 6e 76 28 24 6e 61  ain savedEnv($na
18070 6d 65 29 0d 0a 20 20 20 20 20 20 20 20 7d 20 65  me)..        } e
18080 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
18090 20 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61   unset -nocompla
180a0 69 6e 20 3a 3a 65 6e 76 28 24 6e 61 6d 65 29 0d  in ::env($name).
180b0 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
180c0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
180d0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68        # NOTE: Th
180e0 69 73 20 69 73 20 73 65 6c 66 2d 63 6c 65 61 6e  is is self-clean
180f0 69 6e 67 2e 20 20 49 66 20 6e 6f 20 73 61 76 65  ing.  If no save
18100 64 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61  d environment va
18110 72 69 61 62 6c 65 73 20 6e 6f 77 0d 0a 20 20 20  riables now..   
18120 20 20 20 23 20 20 20 20 20 20 20 65 78 69 73 74     #       exist
18130 2c 20 72 65 6d 6f 76 65 20 74 68 65 20 61 72 72  , remove the arr
18140 61 79 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ay...      #..  
18150 20 20 20 20 69 66 20 7b 5b 61 72 72 61 79 20 73      if {[array s
18160 69 7a 65 20 73 61 76 65 64 45 6e 76 5d 20 3d 3d  ize savedEnv] ==
18170 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
18180 20 20 20 20 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d      unset -nocom
18190 70 6c 61 69 6e 20 73 61 76 65 64 45 6e 76 0d 0a  plain savedEnv..
181a0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
181b0 0c 0d 0a 20 20 20 20 70 72 6f 63 20 73 61 76 65  ...    proc save
181c0 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e  SQLiteConnection
181d0 45 6e 76 69 72 6f 6e 6d 65 6e 74 20 7b 7d 20 7b  Environment {} {
181e0 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20 31 20  ..      upvar 1 
181f0 73 61 76 65 64 45 6e 76 20 73 61 76 65 64 45 6e  savedEnv savedEn
18200 76 0d 0a 0d 0a 20 20 20 20 20 20 73 61 76 65 45  v....      saveE
18210 6e 76 69 72 6f 6e 6d 65 6e 74 56 61 72 69 61 62  nvironmentVariab
18220 6c 65 73 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20  les [list \..   
18230 20 20 20 20 20 20 20 44 65 66 61 75 6c 74 46 6c         DefaultFl
18240 61 67 73 5f 53 51 4c 69 74 65 43 6f 6e 6e 65 63  ags_SQLiteConnec
18250 74 69 6f 6e 20 4e 6f 5f 53 51 4c 69 74 65 43 6f  tion No_SQLiteCo
18260 6e 6e 65 63 74 69 6f 6e 4e 65 77 50 61 72 73 65  nnectionNewParse
18270 72 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  r] \..          
18280 73 61 76 65 64 45 6e 76 0d 0a 20 20 20 20 7d 0d  savedEnv..    }.
18290 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 72 65 73  ....    proc res
182a0 74 6f 72 65 53 51 4c 69 74 65 43 6f 6e 6e 65 63  toreSQLiteConnec
182b0 74 69 6f 6e 45 6e 76 69 72 6f 6e 6d 65 6e 74 20  tionEnvironment 
182c0 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 75 70 76 61  {} {..      upva
182d0 72 20 31 20 73 61 76 65 64 45 6e 76 20 73 61 76  r 1 savedEnv sav
182e0 65 64 45 6e 76 0d 0a 0d 0a 20 20 20 20 20 20 72  edEnv....      r
182f0 65 73 74 6f 72 65 45 6e 76 69 72 6f 6e 6d 65 6e  estoreEnvironmen
18300 74 56 61 72 69 61 62 6c 65 73 20 5b 6c 69 73 74  tVariables [list
18310 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 44 65   \..          De
18320 66 61 75 6c 74 46 6c 61 67 73 5f 53 51 4c 69 74  faultFlags_SQLit
18330 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 4e 6f 5f 53  eConnection No_S
18340 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 4e  QLiteConnectionN
18350 65 77 50 61 72 73 65 72 5d 20 5c 0d 0a 20 20 20  ewParser] \..   
18360 20 20 20 20 20 20 20 73 61 76 65 64 45 6e 76 0d         savedEnv.
18370 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
18380 72 6f 63 20 73 61 76 65 53 51 4c 69 74 65 43 6f  roc saveSQLiteCo
18390 6e 76 65 72 74 45 6e 76 69 72 6f 6e 6d 65 6e 74  nvertEnvironment
183a0 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 75 70 76   {} {..      upv
183b0 61 72 20 31 20 73 61 76 65 64 45 6e 76 20 73 61  ar 1 savedEnv sa
183c0 76 65 64 45 6e 76 0d 0a 0d 0a 20 20 20 20 20 20  vedEnv....      
183d0 73 61 76 65 45 6e 76 69 72 6f 6e 6d 65 6e 74 56  saveEnvironmentV
183e0 61 72 69 61 62 6c 65 73 20 5b 6c 69 73 74 20 5c  ariables [list \
183f0 0d 0a 20 20 20 20 20 20 20 20 20 20 55 73 65 5f  ..          Use_
18400 53 51 4c 69 74 65 43 6f 6e 76 65 72 74 5f 44 65  SQLiteConvert_De
18410 66 61 75 6c 74 44 62 54 79 70 65 20 55 73 65 5f  faultDbType Use_
18420 53 51 4c 69 74 65 43 6f 6e 76 65 72 74 5f 44 65  SQLiteConvert_De
18430 66 61 75 6c 74 54 79 70 65 4e 61 6d 65 5d 20 5c  faultTypeName] \
18440 0d 0a 20 20 20 20 20 20 20 20 20 20 73 61 76 65  ..          save
18450 64 45 6e 76 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  dEnv..    }.....
18460 20 20 20 20 70 72 6f 63 20 72 65 73 74 6f 72 65      proc restore
18470 53 51 4c 69 74 65 43 6f 6e 76 65 72 74 45 6e 76  SQLiteConvertEnv
18480 69 72 6f 6e 6d 65 6e 74 20 7b 7d 20 7b 0d 0a 20  ironment {} {.. 
18490 20 20 20 20 20 75 70 76 61 72 20 31 20 73 61 76       upvar 1 sav
184a0 65 64 45 6e 76 20 73 61 76 65 64 45 6e 76 0d 0a  edEnv savedEnv..
184b0 0d 0a 20 20 20 20 20 20 72 65 73 74 6f 72 65 45  ..      restoreE
184c0 6e 76 69 72 6f 6e 6d 65 6e 74 56 61 72 69 61 62  nvironmentVariab
184d0 6c 65 73 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20  les [list \..   
184e0 20 20 20 20 20 20 20 55 73 65 5f 53 51 4c 69 74         Use_SQLit
184f0 65 43 6f 6e 76 65 72 74 5f 44 65 66 61 75 6c 74  eConvert_Default
18500 44 62 54 79 70 65 20 55 73 65 5f 53 51 4c 69 74  DbType Use_SQLit
18510 65 43 6f 6e 76 65 72 74 5f 44 65 66 61 75 6c 74  eConvert_Default
18520 54 79 70 65 4e 61 6d 65 5d 20 5c 0d 0a 20 20 20  TypeName] \..   
18530 20 20 20 20 20 20 20 73 61 76 65 64 45 6e 76 0d         savedEnv.
18540 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
18550 72 6f 63 20 73 65 74 75 70 44 62 49 6e 74 65 72  roc setupDbInter
18560 72 75 70 74 43 61 6c 6c 62 61 63 6b 20 7b 20 63  ruptCallback { c
18570 68 61 6e 6e 65 6c 20 6c 6f 67 20 7d 20 7b 0d 0a  hannel log } {..
18580 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
18590 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 73 65 74 74 69  nnel "---- setti
185a0 6e 67 20 75 70 20 64 65 62 75 67 67 65 72 20 69  ng up debugger i
185b0 6e 74 65 72 72 75 70 74 20 63 61 6c 6c 62 61 63  nterrupt callbac
185c0 6b 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20  k... "....      
185d0 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20  if {[catch {..  
185e0 20 20 20 20 20 20 73 61 76 65 45 6e 76 69 72 6f        saveEnviro
185f0 6e 6d 65 6e 74 56 61 72 69 61 62 6c 65 73 20 5b  nmentVariables [
18600 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20  list \..        
18610 20 20 20 20 71 75 69 65 74 46 69 6e 64 49 6e 74      quietFindInt
18620 65 72 70 72 65 74 65 72 54 65 73 74 50 61 74 68  erpreterTestPath
18630 20 71 75 69 65 74 53 65 74 75 70 49 6e 74 65 72   quietSetupInter
18640 70 72 65 74 65 72 54 65 73 74 50 61 74 68 5d 0d  preterTestPath].
18650 0a 0d 0a 20 20 20 20 20 20 20 20 74 72 79 20 7b  ...        try {
18660 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
18670 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
18680 20 50 72 65 76 65 6e 74 20 74 68 65 20 76 65 6e   Prevent the ven
18690 64 6f 72 20 73 63 72 69 70 74 20 66 72 6f 6d 20  dor script from 
186a0 62 65 69 6e 67 20 6e 6f 69 73 79 20 77 68 65 6e  being noisy when
186b0 20 63 72 65 61 74 69 6e 67 0d 0a 20 20 20 20 20   creating..     
186c0 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
186d0 20 69 73 6f 6c 61 74 65 64 20 69 6e 74 65 72 70   isolated interp
186e0 72 65 74 65 72 2e 0d 0a 20 20 20 20 20 20 20 20  reter...        
186f0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73    #..          s
18700 65 74 20 3a 3a 65 6e 76 28 71 75 69 65 74 46 69  et ::env(quietFi
18710 6e 64 49 6e 74 65 72 70 72 65 74 65 72 54 65 73  ndInterpreterTes
18720 74 50 61 74 68 29 20 31 0d 0a 20 20 20 20 20 20  tPath) 1..      
18730 20 20 20 20 73 65 74 20 3a 3a 65 6e 76 28 71 75      set ::env(qu
18740 69 65 74 53 65 74 75 70 49 6e 74 65 72 70 72 65  ietSetupInterpre
18750 74 65 72 54 65 73 74 50 61 74 68 29 20 31 0d 0a  terTestPath) 1..
18760 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
18770 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
18780 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73   Make sure the s
18790 63 72 69 70 74 20 64 65 62 75 67 67 65 72 20 61  cript debugger a
187a0 6e 64 20 74 68 65 20 69 73 6f 6c 61 74 65 64 20  nd the isolated 
187b0 69 6e 74 65 72 70 72 65 74 65 72 0d 0a 20 20 20  interpreter..   
187c0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61         #       a
187d0 72 65 20 73 65 74 75 70 20 61 6e 64 20 72 65 61  re setup and rea
187e0 64 79 20 66 6f 72 20 75 73 65 2e 0d 0a 20 20 20  dy for use...   
187f0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
18800 20 20 20 20 64 65 62 75 67 20 73 65 74 75 70 20      debug setup 
18810 74 72 75 65 20 74 72 75 65 0d 0a 0d 0a 20 20 20  true true....   
18820 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
18830 20 20 20 20 23 20 4e 4f 54 45 3a 20 4c 6f 61 64      # NOTE: Load
18840 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 70   the necessary p
18850 61 63 6b 61 67 65 73 20 69 6e 74 6f 20 74 68 65  ackages into the
18860 20 69 73 6f 6c 61 74 65 64 20 69 6e 74 65 72 70   isolated interp
18870 72 65 74 65 72 2e 0d 0a 20 20 20 20 20 20 20 20  reter...        
18880 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 64    #..          d
18890 65 62 75 67 20 65 76 61 6c 20 7b 0d 0a 20 20 20  ebug eval {..   
188a0 20 20 20 20 20 20 20 20 20 70 61 63 6b 61 67 65           package
188b0 20 72 65 71 75 69 72 65 20 45 61 67 6c 65 0d 0a   require Eagle..
188c0 20 20 20 20 20 20 20 20 20 20 20 20 70 61 63 6b              pack
188d0 61 67 65 20 72 65 71 75 69 72 65 20 45 61 67 6c  age require Eagl
188e0 65 2e 4c 69 62 72 61 72 79 0d 0a 20 20 20 20 20  e.Library..     
188f0 20 20 20 20 20 20 20 70 61 63 6b 61 67 65 20 72         package r
18900 65 71 75 69 72 65 20 45 61 67 6c 65 2e 54 65 73  equire Eagle.Tes
18910 74 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  t..          }..
18920 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
18930 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
18940 20 43 6f 70 79 20 74 68 65 20 6e 65 63 65 73 73   Copy the necess
18950 61 72 79 20 76 61 72 69 61 62 6c 65 73 20 69 6e  ary variables in
18960 74 6f 20 74 68 65 20 69 73 6f 6c 61 74 65 64 20  to the isolated 
18970 69 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a 20 20  interpreter...  
18980 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
18990 20 20 20 20 20 64 65 62 75 67 20 69 6e 76 6f 6b       debug invok
189a0 65 20 30 20 73 65 74 20 3a 3a 74 65 73 74 5f 63  e 0 set ::test_c
189b0 68 61 6e 6e 65 6c 20 24 63 68 61 6e 6e 65 6c 3b  hannel $channel;
189c0 20 23 20 4e 4f 54 45 3a 20 46 6f 72 20 5b 74 70   # NOTE: For [tp
189d0 75 74 73 5d 2e 0d 0a 20 20 20 20 20 20 20 20 20  uts]...         
189e0 20 64 65 62 75 67 20 69 6e 76 6f 6b 65 20 30 20   debug invoke 0 
189f0 73 65 74 20 3a 3a 74 65 73 74 5f 6c 6f 67 20 24  set ::test_log $
18a00 6c 6f 67 3b 20 23 20 4e 4f 54 45 3a 20 46 6f 72  log; # NOTE: For
18a10 20 5b 74 6c 6f 67 5d 2e 0d 0a 0d 0a 20 20 20 20   [tlog].....    
18a20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
18a30 20 20 20 23 20 4e 4f 54 45 3a 20 49 6e 73 74 61     # NOTE: Insta
18a40 6c 6c 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20  ll the callback 
18a50 73 63 72 69 70 74 20 74 6f 20 62 65 20 65 76 61  script to be eva
18a60 6c 75 61 74 65 64 20 69 6e 20 74 68 65 20 69 73  luated in the is
18a70 6f 6c 61 74 65 64 0d 0a 20 20 20 20 20 20 20 20  olated..        
18a80 20 20 23 20 20 20 20 20 20 20 69 6e 74 65 72 70    #       interp
18a90 72 65 74 65 72 20 77 68 65 6e 20 74 68 69 73 20  reter when this 
18aa0 69 6e 74 65 72 70 72 65 74 65 72 20 69 73 20 69  interpreter is i
18ab0 6e 74 65 72 72 75 70 74 65 64 20 62 79 20 73 63  nterrupted by sc
18ac0 72 69 70 74 0d 0a 20 20 20 20 20 20 20 20 20 20  ript..          
18ad0 23 20 20 20 20 20 20 20 63 61 6e 63 65 6c 6c 61  #       cancella
18ae0 74 69 6f 6e 2c 20 65 74 63 2e 0d 0a 20 20 20 20  tion, etc...    
18af0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
18b00 20 20 20 64 65 62 75 67 20 63 61 6c 6c 62 61 63     debug callbac
18b10 6b 20 61 70 70 6c 79 20 7b 7b 73 65 6e 64 65 72  k apply {{sender
18b20 20 65 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20   e} {..         
18b30 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
18b40 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20    # NOTE: Check 
18b50 69 66 20 74 68 69 73 20 64 65 62 75 67 67 65 72  if this debugger
18b60 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 6f 6e 65   callback is one
18b70 20 74 68 61 74 20 77 65 20 63 61 72 65 20 61 62   that we care ab
18b80 6f 75 74 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  out...          
18b90 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
18ba0 20 73 65 74 20 69 6e 74 65 72 72 75 70 74 54 79   set interruptTy
18bb0 70 65 73 20 5b 73 70 6c 69 74 20 5b 24 65 20 49  pes [split [$e I
18bc0 6e 74 65 72 72 75 70 74 54 79 70 65 5d 20 22 2c  nterruptType] ",
18bd0 20 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20   "]....         
18be0 20 20 20 69 66 20 7b 22 43 61 6e 63 65 6c 65 64     if {"Canceled
18bf0 22 20 69 6e 20 24 69 6e 74 65 72 72 75 70 74 54  " in $interruptT
18c00 79 70 65 73 20 7c 7c 20 5c 0d 0a 20 20 20 20 20  ypes || \..     
18c10 20 20 20 20 20 20 20 20 20 20 20 22 55 6e 77 6f             "Unwo
18c20 75 6e 64 22 20 69 6e 20 24 69 6e 74 65 72 72 75  und" in $interru
18c30 70 74 54 79 70 65 73 7d 20 74 68 65 6e 20 7b 0d  ptTypes} then {.
18c40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
18c50 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
18c60 23 20 4e 4f 54 45 3a 20 4d 61 6b 65 20 73 75 72  # NOTE: Make sur
18c70 65 20 74 68 65 20 5b 6f 62 6a 65 63 74 5d 20 63  e the [object] c
18c80 6f 6d 6d 61 6e 64 20 69 73 20 61 76 61 69 6c 61  ommand is availa
18c90 62 6c 65 2e 20 20 53 69 6e 63 65 0d 0a 20 20 20  ble.  Since..   
18ca0 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20             #    
18cb0 20 20 20 74 68 69 73 20 69 73 20 61 6e 20 69 73     this is an is
18cc0 6f 6c 61 74 65 64 20 69 6e 74 65 72 70 72 65 74  olated interpret
18cd0 65 72 2c 20 63 68 65 63 6b 20 66 6f 72 20 69 74  er, check for it
18ce0 20 74 68 65 20 68 61 72 64 0d 0a 20 20 20 20 20   the hard..     
18cf0 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
18d00 20 77 61 79 2e 0d 0a 20 20 20 20 20 20 20 20 20   way...         
18d10 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
18d20 20 20 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67        if {[lleng
18d30 74 68 20 5b 69 6e 66 6f 20 63 6f 6d 6d 61 6e 64  th [info command
18d40 73 20 6f 62 6a 65 63 74 5d 5d 20 3e 20 30 7d 20  s object]] > 0} 
18d50 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
18d60 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
18d70 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
18d80 45 3a 20 49 74 65 72 61 74 65 20 74 68 72 6f 75  E: Iterate throu
18d90 67 68 20 61 6c 6c 20 64 61 74 61 62 61 73 65 20  gh all database 
18da0 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6b 6e 6f 77  connections know
18db0 6e 20 74 6f 20 74 68 65 0d 0a 20 20 20 20 20 20  n to the..      
18dc0 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
18dd0 20 20 70 61 72 65 6e 74 20 69 6e 74 65 72 70 72    parent interpr
18de0 65 74 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 20  eter...         
18df0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
18e00 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74            object
18e10 20 66 6f 72 65 61 63 68 20 2d 61 6c 69 61 73 20   foreach -alias 
18e20 70 61 69 72 20 5b 6f 62 6a 65 63 74 20 69 6e 76  pair [object inv
18e30 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50  oke -flags +NonP
18e40 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20  ublic \..       
18e50 20 20 20 20 20 20 20 20 20 20 20 20 20 24 65 20               $e 
18e60 49 6e 74 65 72 70 72 65 74 65 72 2e 63 6f 6e 6e  Interpreter.conn
18e70 65 63 74 69 6f 6e 73 5d 20 7b 0d 0a 20 20 20 20  ections] {..    
18e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
18e90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18ea0 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d     # NOTE: Attem
18eb0 70 74 20 74 6f 20 63 61 6e 63 65 6c 20 61 6e 79  pt to cancel any
18ec0 20 53 51 4c 20 71 75 65 72 69 65 73 20 69 6e 20   SQL queries in 
18ed0 70 72 6f 67 72 65 73 73 20 6f 6e 0d 0a 20 20 20  progress on..   
18ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
18ef0 20 20 20 20 20 20 20 74 68 69 73 20 64 61 74 61         this data
18f00 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
18f10 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
18f20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
18f30 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61           if {[ca
18f40 74 63 68 20 7b 24 70 61 69 72 20 56 61 6c 75 65  tch {$pair Value
18f50 2e 43 61 6e 63 65 6c 7d 20 65 72 72 6f 72 5d 7d  .Cancel} error]}
18f60 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
18f70 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
18f80 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
18f90 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
18fa0 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n \..           
18fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d               "==
18fc0 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c  == WARNING: fail
18fd0 65 64 20 74 6f 20 63 61 6e 63 65 6c 20 71 75 65  ed to cancel que
18fe0 72 79 20 66 6f 72 20 22 20 5c 0d 0a 20 20 20 20  ry for " \..    
18ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19000 20 20 20 20 22 63 6f 6e 6e 65 63 74 69 6f 6e 20      "connection 
19010 5c 22 22 20 5b 24 70 61 69 72 20 4b 65 79 5d 20  \"" [$pair Key] 
19020 22 5c 22 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e  "\", error: " \n
19030 5c 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  \t \..          
19040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24 65                $e
19050 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  rror \n]..      
19060 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
19070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
19080 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
19090 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
190a0 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
190b0 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
190c0 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 6e 20 5c  [appendArgs \n \
190d0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
190e0 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e        "==== WARN
190f0 49 4e 47 3a 20 63 61 6e 6e 6f 74 20 63 61 6e 63  ING: cannot canc
19100 65 6c 20 61 6e 79 20 71 75 65 72 69 65 73 3a 20  el any queries: 
19110 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
19120 20 20 20 20 20 20 20 20 20 22 74 68 65 20 5c 22           "the \"
19130 6f 62 6a 65 63 74 5c 22 20 63 6f 6d 6d 61 6e 64  object\" command
19140 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c   is not availabl
19150 65 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20  e\n"]..         
19160 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
19170 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
19180 20 7d 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 66   }}..        } f
19190 69 6e 61 6c 6c 79 20 7b 0d 0a 20 20 20 20 20 20  inally {..      
191a0 20 20 20 20 72 65 73 74 6f 72 65 45 6e 76 69 72      restoreEnvir
191b0 6f 6e 6d 65 6e 74 56 61 72 69 61 62 6c 65 73 20  onmentVariables 
191c0 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 20  [list \..       
191d0 20 20 20 20 20 20 20 71 75 69 65 74 46 69 6e 64         quietFind
191e0 49 6e 74 65 72 70 72 65 74 65 72 54 65 73 74 50  InterpreterTestP
191f0 61 74 68 20 71 75 69 65 74 53 65 74 75 70 49 6e  ath quietSetupIn
19200 74 65 72 70 72 65 74 65 72 54 65 73 74 50 61 74  terpreterTestPat
19210 68 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  h]..        }.. 
19220 20 20 20 20 20 7d 20 65 72 72 6f 72 5d 20 3d 3d       } error] ==
19230 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
19240 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e      addConstrain
19250 74 20 69 6e 74 65 72 72 75 70 74 43 61 6c 6c 62  t interruptCallb
19260 61 63 6b 2e 73 71 6c 69 74 65 33 0d 0a 0d 0a 20  ack.sqlite3.... 
19270 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
19280 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20 20 20  annel yes\n..   
19290 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
192a0 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
192b0 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
192c0 22 6e 6f 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e  "no, error: " \n
192d0 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20  \t $error \n].. 
192e0 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
192f0 0d 0a 20 20 20 20 70 72 6f 63 20 63 6c 65 61 6e  ..    proc clean
19300 75 70 46 69 6c 65 20 7b 20 66 69 6c 65 4e 61 6d  upFile { fileNam
19310 65 20 7b 63 6f 6c 6c 65 63 74 20 74 72 75 65 7d  e {collect true}
19320 20 7b 66 6f 72 63 65 20 66 61 6c 73 65 7d 20 7d   {force false} }
19330 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
19340 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d     # NOTE: Attem
19350 70 74 20 74 6f 20 66 6f 72 63 65 20 61 6c 6c 20  pt to force all 
19360 70 65 6e 64 69 6e 67 20 22 67 61 72 62 61 67 65  pending "garbage
19370 22 20 6f 62 6a 65 63 74 73 20 74 6f 20 62 65 20  " objects to be 
19380 63 6f 6c 6c 65 63 74 65 64 2c 0d 0a 20 20 20 20  collected,..    
19390 20 20 23 20 20 20 20 20 20 20 69 6e 63 6c 75 64    #       includ
193a0 69 6e 67 20 53 51 4c 69 74 65 20 73 74 61 74 65  ing SQLite state
193b0 6d 65 6e 74 73 20 61 6e 64 20 62 61 63 6b 75 70  ments and backup
193c0 20 6f 62 6a 65 63 74 73 3b 20 74 68 69 73 20 73   objects; this s
193d0 68 6f 75 6c 64 20 61 6c 6c 6f 77 0d 0a 20 20 20  hould allow..   
193e0 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20 75     #       the u
193f0 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61  nderlying databa
19400 73 65 20 66 69 6c 65 20 74 6f 20 62 65 20 64 65  se file to be de
19410 6c 65 74 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d  leted...      #.
19420 0a 20 20 20 20 20 20 69 66 20 7b 24 63 6f 6c 6c  .      if {$coll
19430 65 63 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ect} then {..   
19440 20 20 20 20 20 63 6f 6c 6c 65 63 74 47 61 72 62       collectGarb
19450 61 67 65 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  age $::test_chan
19460 6e 65 6c 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  nel..      }....
19470 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
19480 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20   NOTE: Check if 
19490 74 68 65 20 66 69 6c 65 20 73 74 69 6c 6c 20 65  the file still e
194a0 78 69 73 74 73 2e 0d 0a 20 20 20 20 20 20 23 0d  xists...      #.
194b0 0a 20 20 20 20 20 20 69 66 20 7b 5b 66 69 6c 65  .      if {[file
194c0 20 65 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d   exists $fileNam
194d0 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  e]} then {..    
194e0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
194f0 20 4e 4f 54 45 3a 20 53 6b 69 70 20 64 65 6c 65   NOTE: Skip dele
19500 74 69 6e 67 20 74 65 73 74 20 66 69 6c 65 73 20  ting test files 
19510 69 66 20 73 6f 6d 65 62 6f 64 79 20 73 65 74 73  if somebody sets
19520 20 74 68 65 20 67 6c 6f 62 61 6c 20 76 61 72 69   the global vari
19530 61 62 6c 65 0d 0a 20 20 20 20 20 20 20 20 23 20  able..        # 
19540 20 20 20 20 20 20 74 6f 20 70 72 65 76 65 6e 74        to prevent
19550 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d   it...        #.
19560 0a 20 20 20 20 20 20 20 20 69 66 20 7b 24 66 6f  .        if {$fo
19570 72 63 65 20 7c 7c 20 21 5b 69 6e 66 6f 20 65 78  rce || ![info ex
19580 69 73 74 73 20 3a 3a 6e 6f 28 63 6c 65 61 6e 75  ists ::no(cleanu
19590 70 46 69 6c 65 29 5d 7d 20 74 68 65 6e 20 7b 0d  pFile)]} then {.
195a0 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
195b0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
195c0 41 74 74 65 6d 70 74 20 74 6f 20 64 65 6c 65 74  Attempt to delet
195d0 65 20 74 68 65 20 74 65 73 74 20 66 69 6c 65 20  e the test file 
195e0 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  now...          
195f0 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  #..          if 
19600 7b 5b 73 65 74 20 63 6f 64 65 20 5b 63 61 74 63  {[set code [catc
19610 68 20 7b 66 69 6c 65 20 64 65 6c 65 74 65 20 24  h {file delete $
19620 66 69 6c 65 4e 61 6d 65 7d 20 65 72 72 6f 72 5d  fileName} error]
19630 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
19640 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
19650 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 65        # NOTE: We
19660 20 73 6f 6d 65 68 6f 77 20 66 61 69 6c 65 64 20   somehow failed 
19670 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 66 69  to delete the fi
19680 6c 65 2c 20 72 65 70 6f 72 74 20 77 68 79 2e 0d  le, report why..
19690 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a  .            #..
196a0 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
196b0 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
196c0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
196d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
196e0 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20   "==== WARNING: 
196f0 66 61 69 6c 65 64 20 74 6f 20 64 65 6c 65 74 65  failed to delete
19700 20 74 65 73 74 20 66 69 6c 65 20 5c 22 22 20 24   test file \"" $
19710 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20  fileName \..    
19720 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 20              "\" 
19730 64 75 72 69 6e 67 20 63 6c 65 61 6e 75 70 2c 20  during cleanup, 
19740 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65  error: " \n\t $e
19750 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  rror \n]..      
19760 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
19770 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
19780 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
19790 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20 74 68 61  # NOTE: Show tha
197a0 74 20 77 65 20 73 6b 69 70 70 65 64 20 64 65 6c  t we skipped del
197b0 65 74 69 6e 67 20 74 68 65 20 66 69 6c 65 2e 0d  eting the file..
197c0 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
197d0 20 20 20 20 20 20 20 20 73 65 74 20 63 6f 64 65          set code
197e0 20 30 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   0....          
197f0 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
19800 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
19810 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
19820 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47     "==== WARNING
19830 3a 20 73 6b 69 70 70 65 64 20 64 65 6c 65 74 69  : skipped deleti
19840 6e 67 20 74 65 73 74 20 66 69 6c 65 20 5c 22 22  ng test file \""
19850 20 24 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20   $fileName \..  
19860 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 20              "\" 
19870 64 75 72 69 6e 67 20 63 6c 65 61 6e 75 70 5c 6e  during cleanup\n
19880 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  "]..        }.. 
19890 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
198a0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
198b0 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 66 69    # NOTE: The fi
198c0 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  le does not exis
198d0 74 2c 20 73 75 63 63 65 73 73 21 0d 0a 20 20 20  t, success!..   
198e0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
198f0 73 65 74 20 63 6f 64 65 20 30 0d 0a 20 20 20 20  set code 0..    
19900 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74    }....      ret
19910 75 72 6e 20 24 63 6f 64 65 0d 0a 20 20 20 20 7d  urn $code..    }
19920 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 6c  .....    proc cl
19930 65 61 6e 75 70 4d 65 6d 6f 72 79 20 7b 20 76 61  eanupMemory { va
19940 72 4e 61 6d 65 20 7b 71 75 69 65 74 20 66 61 6c  rName {quiet fal
19950 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 69  se} } {..      i
19960 66 20 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f 62  f {[haveSQLiteOb
19970 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d 20 26 26 20  jectCommand] && 
19980 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74  \..          [st
19990 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 61 72  ring length $var
199a0 4e 61 6d 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20  Name] > 0} then 
199b0 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
199c0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65        # NOTE: Re
199d0 66 65 72 20 74 6f 20 74 68 65 20 73 70 65 63 69  fer to the speci
199e0 66 69 65 64 20 76 61 72 69 61 62 6c 65 20 28 65  fied variable (e
199f0 2e 67 2e 20 22 63 6f 6e 6e 65 63 74 69 6f 6e 22  .g. "connection"
19a00 29 20 69 6e 20 74 68 65 0d 0a 20 20 20 20 20 20  ) in the..      
19a10 20 20 23 20 20 20 20 20 20 20 63 6f 6e 74 65 78    #       contex
19a20 74 20 6f 66 20 6f 75 72 20 63 61 6c 6c 65 72 2e  t of our caller.
19a30 20 20 54 68 65 20 6f 70 61 71 75 65 20 6f 62 6a    The opaque obj
19a40 65 63 74 20 68 61 6e 64 6c 65 20 66 6f 72 20 61  ect handle for a
19a50 6e 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  n..        #    
19a60 20 20 20 41 44 4f 2e 4e 45 54 20 63 6f 6e 6e 65     ADO.NET conne
19a70 63 74 69 6f 6e 20 70 72 65 76 69 6f 75 73 6c 79  ction previously
19a80 20 72 65 74 75 72 6e 65 64 20 62 79 20 5b 67 65   returned by [ge
19a90 74 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 5d 0d 0a  tDbConnection]..
19aa0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
19ab0 73 68 6f 75 6c 64 20 62 65 20 73 74 6f 72 65 64  should be stored
19ac0 20 74 68 65 72 65 2e 0d 0a 20 20 20 20 20 20 20   there...       
19ad0 20 23 0d 0a 20 20 20 20 20 20 20 20 75 70 76 61   #..        upva
19ae0 72 20 31 20 24 76 61 72 4e 61 6d 65 20 63 6f 6e  r 1 $varName con
19af0 6e 65 63 74 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20  nection....     
19b00 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d     if {[catch {.
19b10 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63  .          objec
19b20 74 20 69 6e 76 6f 6b 65 20 24 63 6f 6e 6e 65 63  t invoke $connec
19b30 74 69 6f 6e 20 52 65 6c 65 61 73 65 4d 65 6d 6f  tion ReleaseMemo
19b40 72 79 0d 0a 20 20 20 20 20 20 20 20 7d 20 72 65  ry..        } re
19b50 73 75 6c 74 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  sult]} then {.. 
19b60 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71           if {!$q
19b70 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
19b80 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
19b90 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
19ba0 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
19bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
19bc0 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61  ==== WARNING: fa
19bd0 69 6c 65 64 20 74 6f 20 72 65 6c 65 61 73 65 20  iled to release 
19be0 64 61 74 61 62 61 73 65 20 6d 65 6d 6f 72 79 2c  database memory,
19bf0 20 65 72 72 6f 72 3a 20 22 20 5c 0d 0a 20 20 20   error: " \..   
19c00 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 6e 5c               \n\
19c10 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20  t $result \n].. 
19c20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
19c30 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
19c40 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 6c 6c 65  ..      if {[lle
19c50 6e 67 74 68 20 5b 69 6e 66 6f 20 63 6f 6d 6d 61  ngth [info comma
19c60 6e 64 73 20 64 65 62 75 67 5d 5d 20 3e 20 30 7d  nds debug]] > 0}
19c70 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
19c80 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
19c90 20 20 20 20 20 20 20 20 20 75 70 6c 65 76 65 6c           uplevel
19ca0 20 31 20 5b 6c 69 73 74 20 64 65 62 75 67 20 70   1 [list debug p
19cb0 75 72 67 65 5d 0d 0a 20 20 20 20 20 20 20 20 7d  urge]..        }
19cc0 20 72 65 73 75 6c 74 5d 7d 20 74 68 65 6e 20 7b   result]} then {
19cd0 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
19ce0 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
19cf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
19d00 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
19d10 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
19d20 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
19d30 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a    "==== WARNING:
19d40 20 66 61 69 6c 65 64 20 74 6f 20 70 75 72 67 65   failed to purge
19d50 20 63 61 6c 6c 20 66 72 61 6d 65 2c 20 65 72 72   call frame, err
19d60 6f 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20  or: " \..       
19d70 20 20 20 20 20 20 20 20 20 5c 6e 5c 74 20 24 72           \n\t $r
19d80 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20  esult \n]..     
19d90 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
19da0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20  }....        if 
19db0 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
19dc0 20 20 20 20 20 75 70 6c 65 76 65 6c 20 31 20 5b       uplevel 1 [
19dd0 6c 69 73 74 20 64 65 62 75 67 20 63 6c 65 61 6e  list debug clean
19de0 75 70 5d 0d 0a 20 20 20 20 20 20 20 20 7d 20 72  up]..        } r
19df0 65 73 75 6c 74 5d 7d 20 74 68 65 6e 20 7b 0d 0a  esult]} then {..
19e00 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24            if {!$
19e10 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
19e20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
19e30 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
19e40 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
19e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e60 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66  "==== WARNING: f
19e70 61 69 6c 65 64 20 74 6f 20 63 6c 65 61 6e 75 70  ailed to cleanup
19e80 20 69 6e 74 65 72 70 72 65 74 65 72 2c 20 65 72   interpreter, er
19e90 72 6f 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20  ror: " \..      
19ea0 20 20 20 20 20 20 20 20 20 20 5c 6e 5c 74 20 24            \n\t $
19eb0 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20  result \n]..    
19ec0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
19ed0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66   }....        if
19ee0 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
19ef0 20 20 20 20 20 20 75 70 6c 65 76 65 6c 20 31 20        uplevel 1 
19f00 5b 6c 69 73 74 20 64 65 62 75 67 20 63 6f 6c 6c  [list debug coll
19f10 65 63 74 5d 0d 0a 20 20 20 20 20 20 20 20 7d 20  ect]..        } 
19f20 72 65 73 75 6c 74 5d 7d 20 74 68 65 6e 20 7b 0d  result]} then {.
19f30 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21  .          if {!
19f40 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
19f50 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
19f60 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
19f70 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
19f80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19f90 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20   "==== WARNING: 
19fa0 66 61 69 6c 65 64 20 74 6f 20 63 6f 6c 6c 65 63  failed to collec
19fb0 74 20 67 61 72 62 61 67 65 2c 20 65 72 72 6f 72  t garbage, error
19fc0 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  : " \..         
19fd0 20 20 20 20 20 20 20 5c 6e 5c 74 20 24 72 65 73         \n\t $res
19fe0 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ult \n]..       
19ff0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
1a000 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
1a010 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 73 65 74  ....    proc set
1a020 75 70 4d 65 6d 6f 72 79 43 6f 75 6e 74 65 72 73  upMemoryCounters
1a030 20 7b 20 76 61 72 4e 61 6d 65 20 7d 20 7b 0d 0a   { varName } {..
1a040 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65 53        if {[haveS
1a050 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61  QLiteObjectComma
1a060 6e 64 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  nd]} then {..   
1a070 20 20 20 20 20 75 70 76 61 72 20 31 20 24 76 61       upvar 1 $va
1a080 72 4e 61 6d 65 20 63 6f 75 6e 74 65 72 0d 0a 0d  rName counter...
1a090 0a 20 20 20 20 20 20 20 20 73 65 74 20 63 6f 75  .        set cou
1a0a0 6e 74 65 72 28 31 29 20 5b 6f 62 6a 65 63 74 20  nter(1) [object 
1a0b0 63 72 65 61 74 65 20 2d 61 6c 69 61 73 20 5c 0d  create -alias \.
1a0c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73  .            Sys
1a0d0 74 65 6d 2e 44 69 61 67 6e 6f 73 74 69 63 73 2e  tem.Diagnostics.
1a0e0 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74  PerformanceCount
1a0f0 65 72 20 50 72 6f 63 65 73 73 20 5c 0d 0a 20 20  er Process \..  
1a100 20 20 20 20 20 20 20 20 20 20 22 57 6f 72 6b 69            "Worki
1a110 6e 67 20 53 65 74 22 20 5b 66 69 6c 65 20 72 6f  ng Set" [file ro
1a120 6f 74 6e 61 6d 65 20 5b 66 69 6c 65 20 74 61 69  otname [file tai
1a130 6c 20 24 3a 3a 62 69 6e 5f 66 69 6c 65 5d 5d 5d  l $::bin_file]]]
1a140 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20  ....        set 
1a150 63 6f 75 6e 74 65 72 28 32 29 20 5b 6f 62 6a 65  counter(2) [obje
1a160 63 74 20 63 72 65 61 74 65 20 2d 61 6c 69 61 73  ct create -alias
1a170 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1a180 53 79 73 74 65 6d 2e 44 69 61 67 6e 6f 73 74 69  System.Diagnosti
1a190 63 73 2e 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f  cs.PerformanceCo
1a1a0 75 6e 74 65 72 20 50 72 6f 63 65 73 73 20 5c 0d  unter Process \.
1a1b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 57 6f  .            "Wo
1a1c0 72 6b 69 6e 67 20 53 65 74 20 50 65 61 6b 22 20  rking Set Peak" 
1a1d0 5b 66 69 6c 65 20 72 6f 6f 74 6e 61 6d 65 20 5b  [file rootname [
1a1e0 66 69 6c 65 20 74 61 69 6c 20 24 3a 3a 62 69 6e  file tail $::bin
1a1f0 5f 66 69 6c 65 5d 5d 5d 0d 0a 0d 0a 20 20 20 20  _file]]]....    
1a200 20 20 20 20 73 65 74 20 63 6f 75 6e 74 65 72 28      set counter(
1a210 33 29 20 5b 6f 62 6a 65 63 74 20 63 72 65 61 74  3) [object creat
1a220 65 20 2d 61 6c 69 61 73 20 5c 0d 0a 20 20 20 20  e -alias \..    
1a230 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44          System.D
1a240 69 61 67 6e 6f 73 74 69 63 73 2e 50 65 72 66 6f  iagnostics.Perfo
1a250 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72 20 50 72  rmanceCounter Pr
1a260 6f 63 65 73 73 20 5c 0d 0a 20 20 20 20 20 20 20  ocess \..       
1a270 20 20 20 20 20 22 50 72 69 76 61 74 65 20 42 79       "Private By
1a280 74 65 73 22 20 5b 66 69 6c 65 20 72 6f 6f 74 6e  tes" [file rootn
1a290 61 6d 65 20 5b 66 69 6c 65 20 74 61 69 6c 20 24  ame [file tail $
1a2a0 3a 3a 62 69 6e 5f 66 69 6c 65 5d 5d 5d 0d 0a 20  ::bin_file]]].. 
1a2b0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
1a2c0 72 65 74 75 72 6e 20 22 22 0d 0a 20 20 20 20 7d  return ""..    }
1a2d0 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 72 65  .....    proc re
1a2e0 70 6f 72 74 4d 65 6d 6f 72 79 43 6f 75 6e 74 65  portMemoryCounte
1a2f0 72 73 20 7b 20 63 68 61 6e 6e 65 6c 20 76 61 72  rs { channel var
1a300 4e 61 6d 65 20 70 72 65 66 69 78 20 7d 20 7b 0d  Name prefix } {.
1a310 0a 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65  .      if {[have
1a320 53 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d  SQLiteObjectComm
1a330 61 6e 64 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  and]} then {..  
1a340 20 20 20 20 20 20 75 70 76 61 72 20 31 20 24 76        upvar 1 $v
1a350 61 72 4e 61 6d 65 20 63 6f 75 6e 74 65 72 0d 0a  arName counter..
1a360 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
1a370 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
1a380 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
1a390 20 20 20 20 22 2d 2d 2d 2d 20 22 20 24 70 72 65      "---- " $pre
1a3a0 66 69 78 20 22 20 63 6f 75 6e 74 65 72 20 5c 22  fix " counter \"
1a3b0 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
1a3c0 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20   [object invoke 
1a3d0 24 63 6f 75 6e 74 65 72 28 31 29 20 43 6f 75 6e  $counter(1) Coun
1a3e0 74 65 72 4e 61 6d 65 5d 20 22 5c 22 20 76 61 6c  terName] "\" val
1a3f0 75 65 20 69 73 20 22 20 5c 0d 0a 20 20 20 20 20  ue is " \..     
1a400 20 20 20 20 20 20 20 5b 6f 62 6a 65 63 74 20 69         [object i
1a410 6e 76 6f 6b 65 20 24 63 6f 75 6e 74 65 72 28 31  nvoke $counter(1
1a420 29 20 52 61 77 56 61 6c 75 65 5d 20 5c 6e 5d 0d  ) RawValue] \n].
1a430 0a 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  ...        tputs
1a440 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
1a450 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
1a460 20 20 20 20 20 22 2d 2d 2d 2d 20 22 20 24 70 72       "---- " $pr
1a470 65 66 69 78 20 22 20 63 6f 75 6e 74 65 72 20 5c  efix " counter \
1a480 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  "" \..          
1a490 20 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65    [object invoke
1a4a0 20 24 63 6f 75 6e 74 65 72 28 32 29 20 43 6f 75   $counter(2) Cou
1a4b0 6e 74 65 72 4e 61 6d 65 5d 20 22 5c 22 20 76 61  nterName] "\" va
1a4c0 6c 75 65 20 69 73 20 22 20 5c 0d 0a 20 20 20 20  lue is " \..    
1a4d0 20 20 20 20 20 20 20 20 5b 6f 62 6a 65 63 74 20          [object 
1a4e0 69 6e 76 6f 6b 65 20 24 63 6f 75 6e 74 65 72 28  invoke $counter(
1a4f0 32 29 20 52 61 77 56 61 6c 75 65 5d 20 5c 6e 5d  2) RawValue] \n]
1a500 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74  ....        tput
1a510 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
1a520 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
1a530 20 20 20 20 20 20 22 2d 2d 2d 2d 20 22 20 24 70        "---- " $p
1a540 72 65 66 69 78 20 22 20 63 6f 75 6e 74 65 72 20  refix " counter 
1a550 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  \"" \..         
1a560 20 20 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b     [object invok
1a570 65 20 24 63 6f 75 6e 74 65 72 28 33 29 20 43 6f  e $counter(3) Co
1a580 75 6e 74 65 72 4e 61 6d 65 5d 20 22 5c 22 20 76  unterName] "\" v
1a590 61 6c 75 65 20 69 73 20 22 20 5c 0d 0a 20 20 20  alue is " \..   
1a5a0 20 20 20 20 20 20 20 20 20 5b 6f 62 6a 65 63 74           [object
1a5b0 20 69 6e 76 6f 6b 65 20 24 63 6f 75 6e 74 65 72   invoke $counter
1a5c0 28 33 29 20 52 61 77 56 61 6c 75 65 5d 20 5c 6e  (3) RawValue] \n
1a5d0 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  ]..      }..    
1a5e0 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63  }.....    proc c
1a5f0 6f 6c 6c 65 63 74 47 61 72 62 61 67 65 20 7b 20  ollectGarbage { 
1a600 63 68 61 6e 6e 65 6c 20 7b 6d 69 6c 6c 69 73 65  channel {millise
1a610 63 6f 6e 64 73 20 31 30 30 30 7d 20 7b 71 75 69  conds 1000} {qui
1a620 65 74 20 74 72 75 65 7d 20 7d 20 7b 0d 0a 20 20  et true} } {..  
1a630 20 20 20 20 69 66 20 7b 5b 68 61 76 65 53 51 4c      if {[haveSQL
1a640 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64  iteObjectCommand
1a650 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
1a660 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d     if {[catch {.
1a670 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63  .          objec
1a680 74 20 69 6e 76 6f 6b 65 20 47 43 20 47 65 74 54  t invoke GC GetT
1a690 6f 74 61 6c 4d 65 6d 6f 72 79 20 66 61 6c 73 65  otalMemory false
1a6a0 0d 0a 20 20 20 20 20 20 20 20 7d 20 72 65 73 75  ..        } resu
1a6b0 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  lt] == 0} then {
1a6c0 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
1a6d0 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
1a6e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
1a6f0 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
1a700 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
1a710 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
1a720 20 6d 65 6d 6f 72 79 20 69 6e 20 75 73 65 20 62   memory in use b
1a730 79 20 74 68 65 20 43 4c 52 20 62 65 66 6f 72 65  y the CLR before
1a740 20 63 6f 6c 6c 65 63 74 69 6f 6e 2e 2e 2e 20 22   collection... "
1a750 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1a760 20 20 20 20 24 72 65 73 75 6c 74 20 22 20 62 79      $result " by
1a770 74 65 73 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20  tes\n"]..       
1a780 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20     }..        } 
1a790 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
1a7a0 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
1a7b0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
1a7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d                "=
1a7d0 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69  === WARNING: fai
1a7e0 6c 65 64 20 74 6f 20 67 65 74 20 43 4c 52 20 6d  led to get CLR m
1a7f0 65 6d 6f 72 79 20 75 73 61 67 65 2c 20 65 72 72  emory usage, err
1a800 6f 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20  or: " \..       
1a810 20 20 20 20 20 20 20 5c 6e 5c 74 20 24 72 65 73         \n\t $res
1a820 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ult \n]..       
1a830 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20   }..      }.... 
1a840 20 20 20 20 20 23 23 23 23 23 23 23 23 23 23 23       ###########
1a850 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1a860 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1a870 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1a880 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a  ##############..
1a890 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
1a8a0 20 23 20 4e 4f 54 45 3a 20 52 65 70 65 61 74 65   # NOTE: Repeate
1a8b0 64 6c 79 20 61 74 74 65 6d 70 74 20 74 6f 20 63  dly attempt to c
1a8c0 6f 6c 6c 65 63 74 20 67 61 72 62 61 67 65 20 75  ollect garbage u
1a8d0 6e 74 69 6c 20 74 68 65 20 61 6c 6c 6f 74 74 65  ntil the allotte
1a8e0 64 20 6e 75 6d 62 65 72 0d 0a 20 20 20 20 20 20  d number..      
1a8f0 23 20 20 20 20 20 20 20 6f 66 20 6d 69 6c 6c 69  #       of milli
1a900 73 65 63 6f 6e 64 73 20 68 61 73 20 65 6c 61 70  seconds has elap
1a910 73 65 64 2e 20 20 41 6c 77 61 79 73 20 61 74 74  sed.  Always att
1a920 65 6d 70 74 20 74 6f 20 63 6f 6c 6c 65 63 74 20  empt to collect 
1a930 67 61 72 62 61 67 65 0d 0a 20 20 20 20 20 20 23  garbage..      #
1a940 20 20 20 20 20 20 20 61 74 20 6c 65 61 73 74 20         at least 
1a950 6f 6e 63 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  once...      #..
1a960 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65 53        if {[haveS
1a970 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61  QLiteObjectComma
1a980 6e 64 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  nd]} then {..   
1a990 20 20 20 20 20 73 65 74 20 73 74 61 72 74 20 5b       set start [
1a9a0 63 6c 6f 63 6b 20 73 65 63 6f 6e 64 73 5d 0d 0a  clock seconds]..
1a9b0 20 20 20 20 20 20 20 20 73 65 74 20 73 74 6f 70          set stop
1a9c0 20 5b 65 78 70 72 20 7b 24 73 74 61 72 74 20 2b   [expr {$start +
1a9d0 20 28 24 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20   ($milliseconds 
1a9e0 2f 20 31 30 30 30 29 7d 5d 0d 0a 0d 0a 20 20 20  / 1000)}]....   
1a9f0 20 20 20 20 20 64 6f 20 7b 0d 0a 20 20 20 20 20       do {..     
1aa00 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1aa10 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70    # NOTE: Attemp
1aa20 74 20 74 6f 20 66 6f 72 63 65 20 61 20 66 75 6c  t to force a ful
1aa30 6c 20 67 61 72 62 61 67 65 20 63 6f 6c 6c 65 63  l garbage collec
1aa40 74 69 6f 6e 20 6e 6f 77 2e 20 20 52 65 70 6f 72  tion now.  Repor
1aa50 74 20 61 6e 79 0d 0a 20 20 20 20 20 20 20 20 20  t any..         
1aa60 20 23 20 20 20 20 20 20 20 65 72 72 6f 72 20 74   #       error t
1aa70 68 61 74 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  hat is encounter
1aa80 65 64 20 69 66 20 77 65 20 66 61 69 6c 2e 0d 0a  ed if we fail...
1aa90 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
1aaa0 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
1aab0 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  h {..           
1aac0 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 47   object invoke G
1aad0 43 20 47 65 74 54 6f 74 61 6c 4d 65 6d 6f 72 79  C GetTotalMemory
1aae0 20 74 72 75 65 0d 0a 20 20 20 20 20 20 20 20 20   true..         
1aaf0 20 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20   } error]} then 
1ab00 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
1ab10 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
1ab20 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
1ab30 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d               "==
1ab40 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c  == WARNING: fail
1ab50 65 64 20 66 75 6c 6c 20 67 61 72 62 61 67 65 20  ed full garbage 
1ab60 63 6f 6c 6c 65 63 74 69 6f 6e 2c 20 65 72 72 6f  collection, erro
1ab70 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20  r: " \..        
1ab80 20 20 20 20 20 20 20 20 5c 6e 5c 74 20 24 65 72          \n\t $er
1ab90 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ror \n]..       
1aba0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
1abb0 20 20 73 65 74 20 6e 6f 77 20 5b 63 6c 6f 63 6b    set now [clock
1abc0 20 73 65 63 6f 6e 64 73 5d 0d 0a 20 20 20 20 20   seconds]..     
1abd0 20 20 20 7d 20 77 68 69 6c 65 20 7b 24 73 74 61     } while {$sta
1abe0 72 74 20 3c 3d 20 24 6e 6f 77 20 26 26 20 24 6e  rt <= $now && $n
1abf0 6f 77 20 3c 20 24 73 74 6f 70 7d 0d 0a 20 20 20  ow < $stop}..   
1ac00 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 23     }....      ##
1ac10 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1ac20 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1ac30 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1ac40 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1ac50 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20 20 20 20  #######....     
1ac60 20 69 66 20 7b 5b 68 61 76 65 53 51 4c 69 74 65   if {[haveSQLite
1ac70 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20  ObjectCommand]} 
1ac80 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1ac90 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20  if {[catch {..  
1aca0 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69          object i
1acb0 6e 76 6f 6b 65 20 47 43 20 47 65 74 54 6f 74 61  nvoke GC GetTota
1acc0 6c 4d 65 6d 6f 72 79 20 66 61 6c 73 65 0d 0a 20  lMemory false.. 
1acd0 20 20 20 20 20 20 20 7d 20 72 65 73 75 6c 74 5d         } result]
1ace0 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
1acf0 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71           if {!$q
1ad00 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
1ad10 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
1ad20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
1ad30 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
1ad40 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6d 65          "---- me
1ad50 6d 6f 72 79 20 69 6e 20 75 73 65 20 62 79 20 74  mory in use by t
1ad60 68 65 20 43 4c 52 20 61 66 74 65 72 20 63 6f 6c  he CLR after col
1ad70 6c 65 63 74 69 6f 6e 2e 2e 2e 20 22 20 5c 0d 0a  lection... " \..
1ad80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad90 24 72 65 73 75 6c 74 20 22 20 62 79 74 65 73 5c  $result " bytes\
1ada0 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  n"]..          }
1adb0 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65  ..        } else
1adc0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70   {..          tp
1add0 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
1ade0 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
1adf0 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20            "==== 
1ae00 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20  WARNING: failed 
1ae10 74 6f 20 67 65 74 20 43 4c 52 20 6d 65 6d 6f 72  to get CLR memor
1ae20 79 20 75 73 61 67 65 2c 20 65 72 72 6f 72 3a 20  y usage, error: 
1ae30 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
1ae40 20 20 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20     \n\t $result 
1ae50 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  \n]..        }..
1ae60 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
1ae70 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 53  ...    proc getS
1ae80 51 4c 69 74 65 48 61 6e 64 6c 65 43 6f 75 6e 74  QLiteHandleCount
1ae90 73 20 7b 20 63 68 61 6e 6e 65 6c 20 7b 71 75 69  s { channel {qui
1aea0 65 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20  et false} } {.. 
1aeb0 20 20 20 20 20 73 65 74 20 72 65 73 75 6c 74 20       set result 
1aec0 5b 6c 69 73 74 5d 0d 0a 0d 0a 20 20 20 20 20 20  [list]....      
1aed0 69 66 20 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f  if {[haveSQLiteO
1aee0 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d 20 26 26  bjectCommand] &&
1aef0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 68   \..          [h
1af00 61 76 65 53 51 4c 69 74 65 44 65 66 69 6e 65 43  aveSQLiteDefineC
1af10 6f 6e 73 74 61 6e 74 20 43 4f 55 4e 54 5f 48 41  onstant COUNT_HA
1af20 4e 44 4c 45 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  NDLE]} then {.. 
1af30 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1af40 20 20 23 20 4e 4f 54 45 3a 20 41 64 64 20 65 61    # NOTE: Add ea
1af50 63 68 20 63 72 69 74 69 63 61 6c 20 68 61 6e 64  ch critical hand
1af60 6c 65 20 63 6f 75 6e 74 20 74 6f 20 74 68 65 20  le count to the 
1af70 72 65 73 75 6c 74 69 6e 67 20 6c 69 73 74 2e 0d  resulting list..
1af80 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
1af90 20 20 20 20 66 6f 72 65 61 63 68 20 6e 61 6d 65      foreach name
1afa0 20 5b 6c 69 73 74 20 63 6f 6e 6e 65 63 74 69 6f   [list connectio
1afb0 6e 43 6f 75 6e 74 20 73 74 61 74 65 6d 65 6e 74  nCount statement
1afc0 43 6f 75 6e 74 20 62 61 63 6b 75 70 43 6f 75 6e  Count backupCoun
1afd0 74 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  t] {..          
1afe0 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20  if {[catch {..  
1aff0 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74            object
1b000 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b   invoke -flags +
1b010 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20  NonPublic \..   
1b020 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73               Sys
1b030 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
1b040 44 65 62 75 67 44 61 74 61 20 24 6e 61 6d 65 0d  DebugData $name.
1b050 0a 20 20 20 20 20 20 20 20 20 20 7d 20 76 61 6c  .          } val
1b060 75 65 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  ue] == 0} then {
1b070 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
1b080 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
1b090 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
1b0a0 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
1b0b0 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
1b0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b0d0 20 22 2d 2d 2d 2d 20 63 72 69 74 69 63 61 6c 20   "---- critical 
1b0e0 68 61 6e 64 6c 65 20 63 6f 75 6e 74 20 5c 22 22  handle count \""
1b0f0 20 24 6e 61 6d 65 20 22 5c 22 20 69 73 20 22 20   $name "\" is " 
1b100 24 76 61 6c 75 65 20 5c 6e 5d 0d 0a 20 20 20 20  $value \n]..    
1b110 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
1b120 20 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64           lappend
1b130 20 72 65 73 75 6c 74 20 24 76 61 6c 75 65 0d 0a   result $value..
1b140 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
1b150 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1b160 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
1b170 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
1b180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d                "=
1b190 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69  === WARNING: fai
1b1a0 6c 65 64 20 74 6f 20 67 65 74 20 63 72 69 74 69  led to get criti
1b1b0 63 61 6c 20 68 61 6e 64 6c 65 20 63 6f 75 6e 74  cal handle count
1b1c0 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20   \"" \..        
1b1d0 20 20 20 20 20 20 20 20 24 6e 61 6d 65 20 22 5c          $name "\
1b1e0 22 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74  ", error: " \n\t
1b1f0 20 24 76 61 6c 75 65 20 5c 6e 5d 0d 0a 20 20 20   $value \n]..   
1b200 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1b210 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73    }..      } els
1b220 65 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68  eif {!$quiet} th
1b230 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
1b240 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
1b250 20 54 68 65 20 61 63 74 75 61 6c 20 68 61 6e 64   The actual hand
1b260 6c 65 20 63 6f 75 6e 74 73 20 61 72 65 20 6e 6f  le counts are no
1b270 74 20 61 76 61 69 6c 61 62 6c 65 3b 20 74 68 65  t available; the
1b280 72 65 66 6f 72 65 2c 20 6a 75 73 74 0d 0a 20 20  refore, just..  
1b290 20 20 20 20 20 20 23 20 20 20 20 20 20 20 72 65        #       re
1b2a0 74 75 72 6e 20 61 6e 20 65 6d 70 74 79 20 6c 69  turn an empty li
1b2b0 73 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  st...        #..
1b2c0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
1b2d0 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 72 69  hannel "---- cri
1b2e0 74 69 63 61 6c 20 68 61 6e 64 6c 65 20 63 6f 75  tical handle cou
1b2f0 6e 74 73 20 75 6e 61 76 61 69 6c 61 62 6c 65 5c  nts unavailable\
1b300 6e 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  n"..      }.... 
1b310 20 20 20 20 20 72 65 74 75 72 6e 20 24 72 65 73       return $res
1b320 75 6c 74 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20  ult..    }..... 
1b330 20 20 20 70 72 6f 63 20 73 68 75 74 64 6f 77 6e     proc shutdown
1b340 53 51 4c 69 74 65 20 7b 20 63 68 61 6e 6e 65 6c  SQLite { channel
1b350 20 7b 66 6f 72 63 65 20 66 61 6c 73 65 7d 20 7b   {force false} {
1b360 71 75 69 65 74 20 66 61 6c 73 65 7d 20 7d 20 7b  quiet false} } {
1b370 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
1b380 20 23 20 4e 4f 54 45 3a 20 4d 61 6b 65 20 73 75   # NOTE: Make su
1b390 72 65 20 74 68 61 74 20 53 51 4c 69 74 65 20 63  re that SQLite c
1b3a0 6f 72 65 20 6c 69 62 72 61 72 79 20 69 73 20 63  ore library is c
1b3b0 6f 6d 70 6c 65 74 65 6c 79 20 73 68 75 74 64 6f  ompletely shutdo
1b3c0 77 6e 2e 20 20 54 68 69 73 0d 0a 20 20 20 20 20  wn.  This..     
1b3d0 20 23 20 20 20 20 20 20 20 69 73 20 75 73 65 64   #       is used
1b3e0 20 62 79 20 74 65 73 74 73 20 74 68 61 74 20 63   by tests that c
1b3f0 68 61 6e 67 65 20 63 6f 6e 66 69 67 75 72 61 74  hange configurat
1b400 69 6f 6e 20 6f 70 74 69 6f 6e 73 20 61 6e 64 2f  ion options and/
1b410 6f 72 20 74 68 6f 73 65 0d 0a 20 20 20 20 20 20  or those..      
1b420 23 20 20 20 20 20 20 20 74 68 61 74 20 6e 65 65  #       that nee
1b430 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 6c  d to make sure l
1b440 6f 67 67 69 6e 67 20 69 73 20 69 6e 69 74 69 61  ogging is initia
1b450 6c 69 7a 65 64 20 28 69 2e 65 2e 20 6a 75 73 74  lized (i.e. just
1b460 20 69 6e 20 63 61 73 65 0d 0a 20 20 20 20 20 20   in case..      
1b470 23 20 20 20 20 20 20 20 74 68 65 20 53 51 4c 69  #       the SQLi
1b480 74 65 20 63 6f 72 65 20 6c 69 62 72 61 72 79 20  te core library 
1b490 77 61 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  was initialized 
1b4a0 69 6e 20 74 68 65 20 70 72 6f 63 65 73 73 20 70  in the process p
1b4b0 72 69 6f 72 20 74 6f 0d 0a 20 20 20 20 20 20 23  rior to..      #
1b4c0 20 20 20 20 20 20 20 74 68 65 20 53 51 4c 69 74         the SQLit
1b4d0 65 4c 6f 67 20 63 6c 61 73 73 20 62 65 69 6e 67  eLog class being
1b4e0 20 61 62 6c 65 20 74 6f 20 73 65 74 75 70 20 69   able to setup i
1b4f0 74 73 20 6c 6f 67 67 69 6e 67 20 63 61 6c 6c 62  ts logging callb
1b500 61 63 6b 29 2e 0d 0a 20 20 20 20 20 20 23 20 20  ack)...      #  
1b510 20 20 20 20 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74       Normally, t
1b520 68 69 73 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20  his should only 
1b530 62 65 20 70 65 72 66 6f 72 6d 65 64 20 69 66 20  be performed if 
1b540 53 51 4c 69 74 65 20 69 73 20 6c 6f 61 64 65 64  SQLite is loaded
1b550 20 61 6e 64 0d 0a 20 20 20 20 20 20 23 20 20 20   and..      #   
1b560 20 20 20 20 72 65 61 64 79 20 66 6f 72 20 75 73      ready for us
1b570 65 20 62 79 20 74 68 65 20 74 65 73 74 20 73 75  e by the test su
1b580 69 74 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ite...      #.. 
1b590 20 20 20 20 20 69 66 20 7b 24 66 6f 72 63 65 20       if {$force 
1b5a0 7c 7c 20 5b 69 73 53 51 4c 69 74 65 52 65 61 64  || [isSQLiteRead
1b5b0 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  y]} then {..    
1b5c0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
1b5d0 20 42 55 47 46 49 58 3a 20 4d 61 6b 65 20 73 75   BUGFIX: Make su
1b5e0 72 65 20 74 68 61 74 20 61 6e 79 20 22 6c 65 61  re that any "lea
1b5f0 6b 65 64 22 20 74 72 61 6e 73 61 63 74 69 6f 6e  ked" transaction
1b600 73 20 61 6e 64 2f 6f 72 20 63 6f 6e 6e 65 63 74  s and/or connect
1b610 69 6f 6e 73 0d 0a 20 20 20 20 20 20 20 20 23 20  ions..        # 
1b620 20 20 20 20 20 20 20 20 61 72 65 20 63 6c 65 61          are clea
1b630 6e 65 64 20 75 70 20 62 65 66 6f 72 65 20 63 61  ned up before ca
1b640 6c 6c 69 6e 67 20 74 68 65 20 6e 61 74 69 76 65  lling the native
1b650 20 73 68 75 74 64 6f 77 6e 20 66 75 6e 63 74 69   shutdown functi
1b660 6f 6e 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  on...        #..
1b670 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
1b680 74 72 61 6e 73 61 63 74 69 6f 6e 20 5b 69 6e 66  transaction [inf
1b690 6f 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 5d 20  o transactions] 
1b6a0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  {..          if 
1b6b0 7b 5b 73 74 72 69 6e 67 20 6d 61 74 63 68 20 5c  {[string match \
1b6c0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1b6d0 53 79 73 74 65 6d 23 44 61 74 61 23 53 51 4c 69  System#Data#SQLi
1b6e0 74 65 23 53 51 4c 69 74 65 54 72 61 6e 73 61 63  te#SQLiteTransac
1b6f0 74 69 6f 6e 23 2a 20 24 74 72 61 6e 73 61 63 74  tion#* $transact
1b700 69 6f 6e 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ion]} then {..  
1b710 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63            if {[c
1b720 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
1b730 20 20 20 20 20 20 73 71 6c 20 74 72 61 6e 73 61        sql transa
1b740 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 20 24  ction rollback $
1b750 74 72 61 6e 73 61 63 74 69 6f 6e 0d 0a 20 20 20  transaction..   
1b760 20 20 20 20 20 20 20 20 20 7d 20 65 72 72 6f 72           } error
1b770 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
1b780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
1b790 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
1b7a0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
1b7b0 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
1b7c0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
1b7d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b7e0 20 20 20 20 20 22 2d 2d 2d 2d 20 72 6f 6c 6c 65       "---- rolle
1b7f0 64 20 62 61 63 6b 20 6c 65 61 6b 65 64 20 74 72  d back leaked tr
1b800 61 6e 73 61 63 74 69 6f 6e 20 5c 22 22 20 5c 0d  ansaction \"" \.
1b810 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b820 20 20 20 20 20 24 74 72 61 6e 73 61 63 74 69 6f       $transactio
1b830 6e 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  n \"\n]..       
1b840 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1b850 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
1b860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
1b870 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
1b880 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
1b890 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
1b8a0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
1b8b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b8c0 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49       "==== WARNI
1b8d0 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 72 6f  NG: failed to ro
1b8e0 6c 6c 62 61 63 6b 20 6c 65 61 6b 65 64 20 74 72  llback leaked tr
1b8f0 61 6e 73 61 63 74 69 6f 6e 20 5c 22 22 20 5c 0d  ansaction \"" \.
1b900 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b910 20 20 20 20 20 24 74 72 61 6e 73 61 63 74 69 6f       $transactio
1b920 6e 20 22 5c 22 2c 20 65 72 72 6f 72 3a 20 22 20  n "\", error: " 
1b930 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d  \n\t $error \n].
1b940 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
1b950 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
1b960 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
1b970 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
1b980 20 20 20 66 6f 72 65 61 63 68 20 64 62 20 5b 69     foreach db [i
1b990 6e 66 6f 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 5d  nfo connections]
1b9a0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   {..          if
1b9b0 20 7b 5b 73 74 72 69 6e 67 20 6d 61 74 63 68 20   {[string match 
1b9c0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1b9d0 20 53 79 73 74 65 6d 23 44 61 74 61 23 53 51 4c   System#Data#SQL
1b9e0 69 74 65 23 53 51 4c 69 74 65 43 6f 6e 6e 65 63  ite#SQLiteConnec
1b9f0 74 69 6f 6e 23 2a 20 24 64 62 5d 7d 20 74 68 65  tion#* $db]} the
1ba00 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
1ba10 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 73 71 6c   if {[catch {sql
1ba20 20 63 6c 6f 73 65 20 24 64 62 7d 20 65 72 72 6f   close $db} erro
1ba30 72 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  r] == 0} then {.
1ba40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
1ba50 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
1ba60 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1ba70 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
1ba80 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
1ba90 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1baa0 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6c 6f 73        "---- clos
1bab0 65 64 20 6c 65 61 6b 65 64 20 64 61 74 61 62 61  ed leaked databa
1bac0 73 65 20 5c 22 22 20 24 64 62 20 5c 22 5c 6e 5d  se \"" $db \"\n]
1bad0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1bae0 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  }..            }
1baf0 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
1bb00 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
1bb10 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
1bb20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
1bb30 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
1bb40 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
1bb50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d                "=
1bb60 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69  === WARNING: fai
1bb70 6c 65 64 20 74 6f 20 63 6c 6f 73 65 20 6c 65 61  led to close lea
1bb80 6b 65 64 20 64 61 74 61 62 61 73 65 20 5c 22 22  ked database \""
1bb90 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1bba0 20 20 20 20 20 20 20 20 24 64 62 20 22 5c 22 2c          $db "\",
1bbb0 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24   error: " \n\t $
1bbc0 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20  error \n]..     
1bbd0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
1bbe0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
1bbf0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
1bc00 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  }....        #..
1bc10 20 20 20 20 20 20 20 20 23 20 42 55 47 46 49 58          # BUGFIX
1bc20 3a 20 42 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67  : Before calling
1bc30 20 74 68 65 20 6e 61 74 69 76 65 20 73 68 75 74   the native shut
1bc40 64 6f 77 6e 20 66 75 6e 63 74 69 6f 6e 2c 20 6d  down function, m
1bc50 61 6b 65 20 73 75 72 65 20 62 6f 74 68 0d 0a 20  ake sure both.. 
1bc60 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20         #        
1bc70 20 6f 66 20 74 68 65 20 50 52 41 47 4d 41 20 72   of the PRAGMA r
1bc80 65 6c 61 74 65 64 20 64 69 72 65 63 74 6f 72 79  elated directory
1bc90 20 6e 61 6d 65 73 20 61 72 65 20 66 72 65 65 64   names are freed
1bca0 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
1bcb0 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51        checkForSQ
1bcc0 4c 69 74 65 44 69 72 65 63 74 6f 72 69 65 73 20  LiteDirectories 
1bcd0 24 63 68 61 6e 6e 65 6c 20 74 72 75 65 0d 0a 0d  $channel true...
1bce0 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61  .        if {[ca
1bcf0 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
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 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51    System.Data.SQ
1bd40 4c 69 74 65 2e 55 6e 73 61 66 65 4e 61 74 69 76  Lite.UnsafeNativ
1bd50 65 4d 65 74 68 6f 64 73 20 73 71 6c 69 74 65 33  eMethods sqlite3
1bd60 5f 73 68 75 74 64 6f 77 6e 0d 0a 20 20 20 20 20  _shutdown..     
1bd70 20 20 20 7d 20 72 65 73 75 6c 74 5d 20 3d 3d 20     } result] == 
1bd80 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
1bd90 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
1bda0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1bdb0 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
1bdc0 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
1bdd0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1bde0 20 20 20 20 22 2d 2d 2d 2d 20 63 61 6c 6c 20 73      "---- call s
1bdf0 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 28  qlite3_shutdown(
1be00 29 2e 2e 2e 20 6f 6b 3a 20 22 20 24 72 65 73 75  )... ok: " $resu
1be10 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  lt \n]..        
1be20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65    }..        } e
1be30 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
1be40 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
1be50 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
1be60 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
1be70 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
1be80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be90 22 2d 2d 2d 2d 20 63 61 6c 6c 20 73 71 6c 69 74  "---- call sqlit
1bea0 65 33 5f 73 68 75 74 64 6f 77 6e 28 29 2e 2e 2e  e3_shutdown()...
1beb0 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24   error: " \n\t $
1bec0 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20  result \n]..    
1bed0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
1bee0 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20   }..      }..   
1bef0 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
1bf00 72 65 70 6f 72 74 53 51 4c 69 74 65 52 65 73 6f  reportSQLiteReso
1bf10 75 72 63 65 73 20 7b 0d 0a 20 20 20 20 20 20 20  urces {..       
1bf20 20 20 20 20 20 63 68 61 6e 6e 65 6c 20 7b 71 75       channel {qu
1bf30 69 65 74 20 66 61 6c 73 65 7d 20 7b 72 65 73 65  iet false} {rese
1bf40 74 20 74 72 75 65 7d 20 7b 63 6f 6c 6c 65 63 74  t true} {collect
1bf50 20 74 72 75 65 7d 20 7d 20 7b 0d 0a 20 20 20 20   true} } {..    
1bf60 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
1bf70 45 3a 20 49 66 20 61 76 61 69 6c 61 62 6c 65 2c  E: If available,
1bf80 20 72 65 70 6f 72 74 20 6f 6e 20 28 61 6e 64 20   report on (and 
1bf90 70 6f 73 73 69 62 6c 79 20 72 65 73 65 74 29 20  possibly reset) 
1bfa0 74 68 65 20 72 75 6e 74 69 6d 65 0d 0a 20 20 20  the runtime..   
1bfb0 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e 66 69     #       confi
1bfc0 67 75 72 61 74 69 6f 6e 20 73 74 61 74 69 73 74  guration statist
1bfd0 69 63 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ics...      #.. 
1bfe0 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65 53 51       if {[haveSQ
1bff0 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e  LiteObjectComman
1c000 64 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  d] && \..       
1c010 20 20 20 5b 68 61 76 65 43 6f 6e 73 74 72 61 69     [haveConstrai
1c020 6e 74 20 62 75 69 6c 64 43 6f 6e 66 69 67 75 72  nt buildConfigur
1c030 61 74 69 6f 6e 2e 44 65 62 75 67 5d 20 26 26 20  ation.Debug] && 
1c040 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
1c050 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20    object invoke 
1c060 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69  -flags +NonPubli
1c070 63 20 2d 61 6c 69 61 73 20 5c 0d 0a 20 20 20 20  c -alias \..    
1c080 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44          System.D
1c090 61 74 61 2e 53 51 4c 69 74 65 2e 44 65 62 75 67  ata.SQLite.Debug
1c0a0 44 61 74 61 20 73 65 74 74 69 6e 67 52 65 61 64  Data settingRead
1c0b0 43 6f 75 6e 74 73 0d 0a 20 20 20 20 20 20 7d 20  Counts..      } 
1c0c0 73 65 74 74 69 6e 67 52 65 61 64 43 6f 75 6e 74  settingReadCount
1c0d0 73 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  s] == 0} then {.
1c0e0 0a 20 20 20 20 20 20 20 20 73 65 74 20 6e 61 6d  .        set nam
1c0f0 65 43 6f 75 6e 74 20 5b 24 73 65 74 74 69 6e 67  eCount [$setting
1c100 52 65 61 64 43 6f 75 6e 74 73 20 43 6f 75 6e 74  ReadCounts Count
1c110 5d 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 76  ]..        set v
1c120 61 6c 75 65 43 6f 75 6e 74 20 30 0d 0a 0d 0a 20  alueCount 0.... 
1c130 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 66 6f         object fo
1c140 72 65 61 63 68 20 2d 61 6c 69 61 73 20 70 61 69  reach -alias pai
1c150 72 20 24 73 65 74 74 69 6e 67 52 65 61 64 43 6f  r $settingReadCo
1c160 75 6e 74 73 20 7b 0d 0a 20 20 20 20 20 20 20 20  unts {..        
1c170 20 20 69 6e 63 72 20 76 61 6c 75 65 43 6f 75 6e    incr valueCoun
1c180 74 20 5b 24 70 61 69 72 20 56 61 6c 75 65 5d 0d  t [$pair Value].
1c190 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  ...          if 
1c1a0 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
1c1b0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
1c1c0 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
1c1d0 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
1c1e0 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
1c1f0 2d 20 73 65 74 74 69 6e 67 20 5c 22 22 20 5b 24  - setting \"" [$
1c200 70 61 69 72 20 4b 65 79 5d 20 22 5c 22 20 77 61  pair Key] "\" wa
1c210 73 20 72 65 61 64 20 22 20 5c 0d 0a 20 20 20 20  s read " \..    
1c220 20 20 20 20 20 20 20 20 20 20 20 20 5b 24 70 61              [$pa
1c230 69 72 20 56 61 6c 75 65 5d 20 22 20 74 69 6d 65  ir Value] " time
1c240 73 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20  s\n"]..         
1c250 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d   }..        }...
1c260 0a 20 20 20 20 20 20 20 20 69 66 20 7b 24 72 65  .        if {$re
1c270 73 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  set} then {..   
1c280 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
1c290 68 20 7b 24 73 65 74 74 69 6e 67 52 65 61 64 43  h {$settingReadC
1c2a0 6f 75 6e 74 73 20 43 6c 65 61 72 7d 20 65 72 72  ounts Clear} err
1c2b0 6f 72 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  or] == 0} then {
1c2c0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
1c2d0 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
1c2e0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
1c2f0 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
1c300 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
1c310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c320 20 22 2d 2d 2d 2d 20 72 65 73 65 74 20 73 65 74   "---- reset set
1c330 74 69 6e 67 20 73 74 61 74 69 73 74 69 63 73 20  ting statistics 
1c340 66 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75 73  for the previous
1c350 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   " \..          
1c360 20 20 20 20 20 20 20 20 24 6e 61 6d 65 43 6f 75          $nameCou
1c370 6e 74 20 22 20 6e 61 6d 65 73 20 61 6e 64 20 22  nt " names and "
1c380 20 24 76 61 6c 75 65 43 6f 75 6e 74 20 22 20 76   $valueCount " v
1c390 61 6c 75 65 73 20 72 65 61 64 5c 6e 22 5d 0d 0a  alues read\n"]..
1c3a0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
1c3b0 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20           } else 
1c3c0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
1c3d0 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
1c3e0 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
1c3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d               "==
1c400 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c  == WARNING: fail
1c410 65 64 20 74 6f 20 72 65 73 65 74 20 73 65 74 74  ed to reset sett
1c420 69 6e 67 20 73 74 61 74 69 73 74 69 63 73 20 66  ing statistics f
1c430 6f 72 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20  or " \..        
1c440 20 20 20 20 20 20 20 20 22 74 68 65 20 70 72 65          "the pre
1c450 76 69 6f 75 73 20 22 20 24 6e 61 6d 65 43 6f 75  vious " $nameCou
1c460 6e 74 20 22 20 6e 61 6d 65 73 20 61 6e 64 20 22  nt " names and "
1c470 20 24 76 61 6c 75 65 43 6f 75 6e 74 20 5c 0d 0a   $valueCount \..
1c480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c490 22 20 76 61 6c 75 65 73 20 72 65 61 64 2c 20 65  " values read, e
1c4a0 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72  rror: " \n\t $er
1c4b0 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ror \n]..       
1c4c0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
1c4d0 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
1c4e0 20 20 69 66 20 7b 5b 68 61 76 65 53 51 4c 69 74    if {[haveSQLit
1c4f0 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d 20  eObjectCommand] 
1c500 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
1c510 5b 68 61 76 65 53 51 4c 69 74 65 44 65 66 69 6e  [haveSQLiteDefin
1c520 65 43 6f 6e 73 74 61 6e 74 20 49 4e 54 45 52 4f  eConstant INTERO
1c530 50 5f 56 49 52 54 55 41 4c 5f 54 41 42 4c 45 5d  P_VIRTUAL_TABLE]
1c540 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
1c550 20 5b 68 61 76 65 53 51 4c 69 74 65 44 65 66 69   [haveSQLiteDefi
1c560 6e 65 43 6f 6e 73 74 61 6e 74 20 54 52 41 43 4b  neConstant TRACK
1c570 5f 4d 45 4d 4f 52 59 5f 42 59 54 45 53 5d 7d 20  _MEMORY_BYTES]} 
1c580 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1c590 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
1c5a0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74  n {..          t
1c5b0 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d  puts $channel "-
1c5c0 2d 2d 2d 20 63 75 72 72 65 6e 74 20 6d 65 6d 6f  --- current memo
1c5d0 72 79 20 69 6e 20 75 73 65 20 62 79 20 53 51 4c  ry in use by SQL
1c5e0 69 74 65 4d 65 6d 6f 72 79 2e 2e 2e 20 22 0d 0a  iteMemory... "..
1c5f0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
1c600 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
1c610 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a  {..          obj
1c620 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67  ect invoke -flag
1c630 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a  s +NonPublic \..
1c640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79                Sy
1c650 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
1c660 2e 53 51 4c 69 74 65 4d 65 6d 6f 72 79 20 62 79  .SQLiteMemory by
1c670 74 65 73 41 6c 6c 6f 63 61 74 65 64 0d 0a 20 20  tesAllocated..  
1c680 20 20 20 20 20 20 7d 20 6d 65 6d 6f 72 79 5d 20        } memory] 
1c690 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
1c6a0 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
1c6b0 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
1c6c0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
1c6d0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
1c6e0 72 67 73 20 24 6d 65 6d 6f 72 79 20 22 20 62 79  rgs $memory " by
1c6f0 74 65 73 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20  tes\n"]..       
1c700 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20     }..        } 
1c710 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
1c720 20 20 73 65 74 20 6d 65 6d 6f 72 79 20 75 6e 6b    set memory unk
1c730 6e 6f 77 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20  nown....        
1c740 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
1c750 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1c760 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
1c770 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d  l [appendArgs $m
1c780 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20 20 20  emory \n]..     
1c790 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
1c7a0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20  }....        if 
1c7b0 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
1c7c0 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74  ..          tput
1c7d0 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d  s $channel "----
1c7e0 20 6d 61 78 69 6d 75 6d 20 6d 65 6d 6f 72 79 20   maximum memory 
1c7f0 69 6e 20 75 73 65 20 62 79 20 53 51 4c 69 74 65  in use by SQLite
1c800 4d 65 6d 6f 72 79 2e 2e 2e 20 22 0d 0a 20 20 20  Memory... "..   
1c810 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
1c820 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
1c830 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74            object
1c840 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b   invoke -flags +
1c850 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20  NonPublic \..   
1c860 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65             Syste
1c870 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51  m.Data.SQLite.SQ
1c880 4c 69 74 65 4d 65 6d 6f 72 79 20 6d 61 78 69 6d  LiteMemory maxim
1c890 75 6d 42 79 74 65 73 41 6c 6c 6f 63 61 74 65 64  umBytesAllocated
1c8a0 0d 0a 20 20 20 20 20 20 20 20 7d 20 6d 65 6d 6f  ..        } memo
1c8b0 72 79 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  ry] == 0} then {
1c8c0 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
1c8d0 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
1c8e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
1c8f0 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
1c900 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20  endArgs $memory 
1c910 22 20 62 79 74 65 73 5c 6e 22 5d 0d 0a 20 20 20  " bytes\n"]..   
1c920 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1c930 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
1c940 20 20 20 20 20 20 73 65 74 20 6d 65 6d 6f 72 79        set memory
1c950 20 75 6e 6b 6e 6f 77 6e 0d 0a 0d 0a 20 20 20 20   unknown....    
1c960 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
1c970 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
1c980 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
1c990 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
1c9a0 73 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20  s $memory \n].. 
1c9b0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
1c9c0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
1c9d0 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 24 71 75  ..      if {!$qu
1c9e0 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
1c9f0 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
1ca00 6e 65 6c 20 22 2d 2d 2d 2d 20 63 75 72 72 65 6e  nel "---- curren
1ca10 74 20 6d 65 6d 6f 72 79 20 69 6e 20 75 73 65 20  t memory in use 
1ca20 62 79 20 53 51 4c 69 74 65 2e 2e 2e 20 22 0d 0a  by SQLite... "..
1ca30 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
1ca40 20 69 66 20 7b 5b 68 61 76 65 53 51 4c 69 74 65   if {[haveSQLite
1ca50 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20  ObjectCommand]} 
1ca60 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1ca70 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20  if {[catch {..  
1ca80 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69          object i
1ca90 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f  nvoke -flags +No
1caa0 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20  nPublic \..     
1cab0 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e           System.
1cac0 44 61 74 61 2e 53 51 4c 69 74 65 2e 55 6e 73 61  Data.SQLite.Unsa
1cad0 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 20  feNativeMethods 
1cae0 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 75  sqlite3_memory_u
1caf0 73 65 64 0d 0a 20 20 20 20 20 20 20 20 7d 20 6d  sed..        } m
1cb00 65 6d 6f 72 79 5d 20 3d 3d 20 30 7d 20 74 68 65  emory] == 0} the
1cb10 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69  n {..          i
1cb20 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
1cb30 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1cb40 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
1cb50 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f  appendArgs $memo
1cb60 72 79 20 22 20 62 79 74 65 73 5c 6e 22 5d 0d 0a  ry " bytes\n"]..
1cb70 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
1cb80 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
1cb90 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
1cba0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4d 61        # NOTE: Ma
1cbb0 79 62 65 20 74 68 65 20 53 51 4c 69 74 65 20 63  ybe the SQLite c
1cbc0 6f 72 65 20 6c 69 62 72 61 72 79 20 69 73 20 75  ore library is u
1cbd0 6e 61 76 61 69 6c 61 62 6c 65 3f 0d 0a 20 20 20  navailable?..   
1cbe0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1cbf0 20 20 20 20 73 65 74 20 6d 65 6d 6f 72 79 20 75      set memory u
1cc00 6e 6b 6e 6f 77 6e 0d 0a 0d 0a 20 20 20 20 20 20  nknown....      
1cc10 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
1cc20 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1cc30 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
1cc40 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
1cc50 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20  $memory \n]..   
1cc60 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1cc70 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73    }..      } els
1cc80 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74  e {..        set
1cc90 20 6d 65 6d 6f 72 79 20 75 6e 61 76 61 69 6c 61   memory unavaila
1cca0 62 6c 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69  ble....        i
1ccb0 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
1ccc0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70   {..          tp
1ccd0 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
1cce0 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79  pendArgs $memory
1ccf0 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d   \n]..        }.
1cd00 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
1cd10 20 20 73 65 74 20 72 65 73 75 6c 74 20 24 6d 65    set result $me
1cd20 6d 6f 72 79 3b 20 23 20 4e 4f 54 45 3a 20 52 65  mory; # NOTE: Re
1cd30 74 75 72 6e 20 6d 65 6d 6f 72 79 20 69 6e 2d 75  turn memory in-u
1cd40 73 65 20 74 6f 20 6f 75 72 20 63 61 6c 6c 65 72  se to our caller
1cd50 2e 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 21  .....      if {!
1cd60 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
1cd70 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
1cd80 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 6d 61 78  hannel "---- max
1cd90 69 6d 75 6d 20 6d 65 6d 6f 72 79 20 69 6e 20 75  imum memory in u
1cda0 73 65 20 62 79 20 53 51 4c 69 74 65 2e 2e 2e 20  se by SQLite... 
1cdb0 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  "..      }....  
1cdc0 20 20 20 20 69 66 20 7b 5b 68 61 76 65 53 51 4c      if {[haveSQL
1cdd0 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64  iteObjectCommand
1cde0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
1cdf0 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d     if {[catch {.
1ce00 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63  .          objec
1ce10 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20  t invoke -flags 
1ce20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20  +NonPublic \..  
1ce30 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74              Syst
1ce40 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 55  em.Data.SQLite.U
1ce50 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f  nsafeNativeMetho
1ce60 64 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ds \..          
1ce70 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f      sqlite3_memo
1ce80 72 79 5f 68 69 67 68 77 61 74 65 72 20 30 0d 0a  ry_highwater 0..
1ce90 20 20 20 20 20 20 20 20 7d 20 6d 65 6d 6f 72 79          } memory
1cea0 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
1ceb0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24            if {!$
1cec0 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
1ced0 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
1cee0 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
1cef0 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 22 20  dArgs $memory " 
1cf00 62 79 74 65 73 5c 6e 22 5d 0d 0a 20 20 20 20 20  bytes\n"]..     
1cf10 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
1cf20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
1cf30 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
1cf40 20 23 20 4e 4f 54 45 3a 20 4d 61 79 62 65 20 74   # NOTE: Maybe t
1cf50 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20 6c  he SQLite core l
1cf60 69 62 72 61 72 79 20 69 73 20 75 6e 61 76 61 69  ibrary is unavai
1cf70 6c 61 62 6c 65 3f 0d 0a 20 20 20 20 20 20 20 20  lable?..        
1cf80 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73    #..          s
1cf90 65 74 20 6d 65 6d 6f 72 79 20 75 6e 6b 6e 6f 77  et memory unknow
1cfa0 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69  n....          i
1cfb0 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
1cfc0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1cfd0 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
1cfe0 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f  appendArgs $memo
1cff0 72 79 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  ry \n]..        
1d000 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
1d010 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
1d020 20 20 20 20 20 20 20 20 73 65 74 20 6d 65 6d 6f          set memo
1d030 72 79 20 75 6e 61 76 61 69 6c 61 62 6c 65 0d 0a  ry unavailable..
1d040 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 24  ..        if {!$
1d050 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
1d060 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
1d070 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
1d080 72 67 73 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d  rgs $memory \n].
1d090 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
1d0a0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20    }....      if 
1d0b0 7b 24 63 6f 6c 6c 65 63 74 7d 20 74 68 65 6e 20  {$collect} then 
1d0c0 7b 0d 0a 20 20 20 20 20 20 20 20 63 6f 6c 6c 65  {..        colle
1d0d0 63 74 47 61 72 62 61 67 65 20 24 63 68 61 6e 6e  ctGarbage $chann
1d0e0 65 6c 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  el..      }.... 
1d0f0 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
1d100 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1d110 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
1d120 20 22 2d 2d 2d 2d 20 63 75 72 72 65 6e 74 20 6d   "---- current m
1d130 65 6d 6f 72 79 20 69 6e 20 75 73 65 20 62 79 20  emory in use by 
1d140 74 68 65 20 43 4c 52 2e 2e 2e 20 22 0d 0a 20 20  the CLR... "..  
1d150 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69      }....      i
1d160 66 20 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f 62  f {[haveSQLiteOb
1d170 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68  jectCommand]} th
1d180 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66  en {..        if
1d190 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
1d1a0 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76        object inv
1d1b0 6f 6b 65 20 47 43 20 47 65 74 54 6f 74 61 6c 4d  oke GC GetTotalM
1d1c0 65 6d 6f 72 79 20 66 61 6c 73 65 0d 0a 20 20 20  emory false..   
1d1d0 20 20 20 20 20 7d 20 6d 65 6d 6f 72 79 5d 20 3d       } memory] =
1d1e0 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
1d1f0 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69         if {[stri
1d200 6e 67 20 69 73 20 69 6e 74 65 67 65 72 20 2d 73  ng is integer -s
1d210 74 72 69 63 74 20 24 6d 65 6d 6f 72 79 5d 7d 20  trict $memory]} 
1d220 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1d230 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
1d240 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1d250 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
1d260 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
1d270 73 20 24 6d 65 6d 6f 72 79 20 22 20 62 79 74 65  s $memory " byte
1d280 73 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20  s\n"]..         
1d290 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
1d2a0 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
1d2b0 20 20 20 20 20 20 73 65 74 20 6d 65 6d 6f 72 79        set memory
1d2c0 20 69 6e 76 61 6c 69 64 0d 0a 0d 0a 20 20 20 20   invalid....    
1d2d0 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
1d2e0 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
1d2f0 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
1d300 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
1d310 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 5c 6e  dArgs $memory \n
1d320 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ]..            }
1d330 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
1d340 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
1d350 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20 6d  .          set m
1d360 65 6d 6f 72 79 20 75 6e 6b 6e 6f 77 6e 0d 0a 0d  emory unknown...
1d370 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21  .          if {!
1d380 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
1d390 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
1d3a0 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
1d3b0 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 5c  ndArgs $memory \
1d3c0 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  n]..          }.
1d3d0 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
1d3e0 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
1d3f0 20 20 20 20 73 65 74 20 6d 65 6d 6f 72 79 20 75      set memory u
1d400 6e 61 76 61 69 6c 61 62 6c 65 0d 0a 0d 0a 20 20  navailable....  
1d410 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
1d420 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
1d430 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
1d440 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
1d450 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20  $memory \n]..   
1d460 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
1d470 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ...      return 
1d480 24 72 65 73 75 6c 74 0d 0a 20 20 20 20 7d 0d 0a  $result..    }..
1d490 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 68 65 63  ...    proc chec
1d4a0 6b 46 6f 72 53 51 4c 69 74 65 44 69 72 65 63 74  kForSQLiteDirect
1d4b0 6f 72 69 65 73 20 7b 20 63 68 61 6e 6e 65 6c 20  ories { channel 
1d4c0 7b 72 65 73 65 74 20 66 61 6c 73 65 7d 20 7d 20  {reset false} } 
1d4d0 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
1d4e0 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20    # NOTE: Check 
1d4f0 69 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f 77  if the sqlite3_w
1d500 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f  in32_set_directo
1d510 72 79 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  ry function is a
1d520 76 61 69 6c 61 62 6c 65 2e 0d 0a 20 20 20 20 20  vailable...     
1d530 20 23 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20   #..      tputs 
1d540 24 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20  $channel \..    
1d550 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65 63        "---- chec
1d560 6b 69 6e 67 20 66 6f 72 20 66 75 6e 63 74 69 6f  king for functio
1d570 6e 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  n sqlite3_win32_
1d580 73 65 74 5f 64 69 72 65 63 74 6f 72 79 2e 2e 2e  set_directory...
1d590 20 22 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   "....      #.. 
1d5a0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69       # NOTE: Thi
1d5b0 73 20 63 61 6c 6c 20 74 6f 20 74 68 65 20 73 71  s call to the sq
1d5c0 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f  lite3_win32_set_
1d5d0 64 69 72 65 63 74 6f 72 79 20 66 75 6e 63 74 69  directory functi
1d5e0 6f 6e 20 75 73 65 73 20 74 68 65 0d 0a 20 20 20  on uses the..   
1d5f0 20 20 20 23 20 20 20 20 20 20 20 69 6e 76 61 6c     #       inval
1d600 69 64 20 76 61 6c 75 65 20 30 20 66 6f 72 20 74  id value 0 for t
1d610 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
1d620 74 2e 20 20 54 68 69 73 20 63 6f 64 65 20 69 73  t.  This code is
1d630 20 64 65 73 69 67 6e 65 64 0d 0a 20 20 20 20 20   designed..     
1d640 20 23 20 20 20 20 20 20 20 74 6f 20 63 68 65 63   #       to chec
1d650 6b 20 69 66 20 63 61 6c 6c 69 6e 67 20 74 68 65  k if calling the
1d660 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 72   function will r
1d670 61 69 73 65 20 61 6e 20 65 78 63 65 70 74 69 6f  aise an exceptio
1d680 6e 20 28 69 2e 65 2e 0d 0a 20 20 20 20 20 20 23  n (i.e...      #
1d690 20 20 20 20 20 20 20 74 68 65 20 61 63 74 75 61         the actua
1d6a0 6c 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  l result of the 
1d6b0 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  function does no
1d6c0 74 20 6d 61 74 74 65 72 20 61 73 20 6c 6f 6e 67  t matter as long
1d6d0 20 61 73 20 6e 6f 0d 0a 20 20 20 20 20 20 23 20   as no..      # 
1d6e0 20 20 20 20 20 20 64 69 72 65 63 74 6f 72 79 20        directory 
1d6f0 69 73 20 63 68 61 6e 67 65 64 29 2e 0d 0a 20 20  is changed)...  
1d700 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
1d710 7b 5b 69 73 57 69 6e 64 6f 77 73 5d 20 26 26 20  {[isWindows] && 
1d720 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
1d730 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20    object invoke 
1d740 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69  -flags +NonPubli
1d750 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  c \..           
1d760 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
1d770 69 74 65 2e 55 6e 73 61 66 65 4e 61 74 69 76 65  ite.UnsafeNative
1d780 4d 65 74 68 6f 64 73 20 5c 0d 0a 20 20 20 20 20  Methods \..     
1d790 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 77         sqlite3_w
1d7a0 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f  in32_set_directo
1d7b0 72 79 20 30 20 6e 75 6c 6c 0d 0a 20 20 20 20 20  ry 0 null..     
1d7c0 20 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b   }] == 0} then {
1d7d0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1d7e0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 61 6c       # NOTE: Cal
1d7f0 6c 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33  ling the sqlite3
1d800 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63  _win32_set_direc
1d810 74 6f 72 79 20 66 75 6e 63 74 69 6f 6e 20 64 6f  tory function do
1d820 65 73 20 6e 6f 74 0d 0a 20 20 20 20 20 20 20 20  es not..        
1d830 23 20 20 20 20 20 20 20 63 61 75 73 65 20 61 6e  #       cause an
1d840 20 65 78 63 65 70 74 69 6f 6e 3b 20 74 68 65 72   exception; ther
1d850 65 66 6f 72 65 2c 20 69 74 20 6d 75 73 74 20 62  efore, it must b
1d860 65 20 61 76 61 69 6c 61 62 6c 65 20 28 69 2e 65  e available (i.e
1d870 2e 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  ...        #    
1d880 20 20 20 65 76 65 6e 20 74 68 6f 75 67 68 20 69     even though i
1d890 74 20 73 68 6f 75 6c 64 20 72 65 74 75 72 6e 20  t should return 
1d8a0 61 20 66 61 69 6c 75 72 65 20 72 65 74 75 72 6e  a failure return
1d8b0 20 63 6f 64 65 20 69 6e 20 74 68 69 73 0d 0a 20   code in this.. 
1d8c0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63         #       c
1d8d0 61 73 65 29 2e 0d 0a 20 20 20 20 20 20 20 20 23  ase)...        #
1d8e0 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e  ..        addCon
1d8f0 73 74 72 61 69 6e 74 20 73 71 6c 69 74 65 33 5f  straint sqlite3_
1d900 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74  win32_set_direct
1d910 6f 72 79 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74  ory....        t
1d920 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 79 65  puts $channel ye
1d930 73 5c 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23  s\n....        #
1d940 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
1d950 3a 20 44 6f 65 73 20 6f 75 72 20 63 61 6c 6c 65  : Does our calle
1d960 72 20 77 61 6e 74 20 74 6f 20 72 65 73 65 74 20  r want to reset 
1d970 74 68 65 20 64 69 72 65 63 74 6f 72 69 65 73 3f  the directories?
1d980 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1d990 20 20 20 20 20 69 66 20 7b 24 72 65 73 65 74 7d       if {$reset}
1d9a0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1d9b0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
1d9c0 23 20 4e 4f 54 45 3a 20 4e 6f 77 20 6d 61 6b 65  # NOTE: Now make
1d9d0 20 73 75 72 65 20 74 68 65 20 64 61 74 61 62 61   sure the databa
1d9e0 73 65 20 61 6e 64 20 74 65 6d 70 6f 72 61 72 79  se and temporary
1d9f0 20 64 69 72 65 63 74 6f 72 69 65 73 20 61 72 65   directories are
1da00 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20  ..          #   
1da10 20 20 20 20 72 65 73 65 74 20 74 68 65 69 72 20      reset their 
1da20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 73 2c 20  default values, 
1da30 77 68 69 63 68 20 73 68 6f 75 6c 64 20 62 65 20  which should be 
1da40 6e 75 6c 6c 20 66 6f 72 20 62 6f 74 68 2e 0d 0a  null for both...
1da50 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
1da60 20 20 53 69 6e 63 65 20 74 68 65 20 73 71 6c 69    Since the sqli
1da70 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69  te3_win32_set_di
1da80 72 65 63 74 6f 72 79 20 66 75 6e 63 74 69 6f 6e  rectory function
1da90 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 0d 0a   is available,..
1daa0 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
1dab0 20 20 75 73 65 20 69 74 2e 0d 0a 20 20 20 20 20    use it...     
1dac0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1dad0 20 20 66 6f 72 20 7b 73 65 74 20 69 6e 64 65 78    for {set index
1dae0 20 31 7d 20 7b 24 69 6e 64 65 78 20 3c 20 33 7d   1} {$index < 3}
1daf0 20 7b 69 6e 63 72 20 69 6e 64 65 78 7d 20 7b 0d   {incr index} {.
1db00 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
1db10 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
1db20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20           object 
1db30 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e  invoke -flags +N
1db40 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20  onPublic \..    
1db50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79                Sy
1db60 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
1db70 2e 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74  .UnsafeNativeMet
1db80 68 6f 64 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  hods \..        
1db90 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1dba0 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65  3_win32_set_dire
1dbb0 63 74 6f 72 79 20 24 69 6e 64 65 78 20 6e 75 6c  ctory $index nul
1dbc0 6c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  l..            }
1dbd0 20 72 65 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74   result] == 0} t
1dbe0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1dbf0 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
1dc00 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
1dc10 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1dc20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 61 6c 6c 20       "---- call 
1dc30 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65  sqlite3_win32_se
1dc40 74 5f 64 69 72 65 63 74 6f 72 79 28 22 20 24 69  t_directory(" $i
1dc50 6e 64 65 78 20 5c 0d 0a 20 20 20 20 20 20 20 20  ndex \..        
1dc60 20 20 20 20 20 20 20 20 20 20 22 2c 20 6e 75 6c            ", nul
1dc70 6c 29 2e 2e 2e 20 6f 6b 3a 20 22 20 24 72 65 73  l)... ok: " $res
1dc80 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ult \n]..       
1dc90 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
1dca0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
1dcb0 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
1dcc0 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
1dcd0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
1dce0 2d 2d 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f  -- call sqlite3_
1dcf0 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74  win32_set_direct
1dd00 6f 72 79 28 22 20 24 69 6e 64 65 78 20 5c 0d 0a  ory(" $index \..
1dd10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd20 20 20 22 2c 20 6e 75 6c 6c 29 2e 2e 2e 20 65 72    ", null)... er
1dd30 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 72 65 73  ror: " \n\t $res
1dd40 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ult \n]..       
1dd50 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
1dd60 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
1dd70 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
1dd80 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
1dd90 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 0d 0a 20  hannel no\n.... 
1dda0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1ddb0 20 20 23 20 4e 4f 54 45 3a 20 44 6f 65 73 20 6f    # NOTE: Does o
1ddc0 75 72 20 63 61 6c 6c 65 72 20 77 61 6e 74 20 74  ur caller want t
1ddd0 6f 20 72 65 73 65 74 20 74 68 65 20 64 69 72 65  o reset the dire
1dde0 63 74 6f 72 69 65 73 3f 20 20 54 68 69 73 20 63  ctories?  This c
1ddf0 61 6e 20 6f 6e 6c 79 0d 0a 20 20 20 20 20 20 20  an only..       
1de00 20 23 20 20 20 20 20 20 20 62 65 20 70 65 72 66   #       be perf
1de10 6f 72 6d 65 64 20 69 66 20 53 51 4c 69 74 65 20  ormed if SQLite 
1de20 69 73 20 6c 6f 61 64 65 64 20 61 6e 64 20 72 65  is loaded and re
1de30 61 64 79 20 66 6f 72 20 75 73 65 20 62 79 20 74  ady for use by t
1de40 68 65 20 74 65 73 74 0d 0a 20 20 20 20 20 20 20  he test..       
1de50 20 23 20 20 20 20 20 20 20 73 75 69 74 65 2e 0d   #       suite..
1de60 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
1de70 20 20 20 20 69 66 20 7b 24 72 65 73 65 74 20 26      if {$reset &
1de80 26 20 5b 69 73 53 51 4c 69 74 65 52 65 61 64 79  & [isSQLiteReady
1de90 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
1dea0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1deb0 20 20 23 20 4e 4f 54 45 3a 20 4e 6f 77 20 6d 61    # NOTE: Now ma
1dec0 6b 65 20 73 75 72 65 20 74 68 65 20 64 61 74 61  ke sure the data
1ded0 62 61 73 65 20 61 6e 64 20 74 65 6d 70 6f 72 61  base and tempora
1dee0 72 79 20 64 69 72 65 63 74 6f 72 69 65 73 20 61  ry directories a
1def0 72 65 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20  re..          # 
1df00 20 20 20 20 20 20 72 65 73 65 74 20 74 68 65 69        reset thei
1df10 72 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 73  r default values
1df20 2c 20 77 68 69 63 68 20 73 68 6f 75 6c 64 20 62  , which should b
1df30 65 20 6e 75 6c 6c 20 66 6f 72 20 62 6f 74 68 2e  e null for both.
1df40 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20  ..          #   
1df50 20 20 20 20 53 69 6e 63 65 20 74 68 65 20 73 71      Since the sq
1df60 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f  lite3_win32_set_
1df70 64 69 72 65 63 74 6f 72 79 20 66 75 6e 63 74 69  directory functi
1df80 6f 6e 20 64 6f 65 73 20 6e 6f 74 0d 0a 20 20 20  on does not..   
1df90 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61         #       a
1dfa0 70 70 65 61 72 20 74 6f 20 62 65 20 61 76 61 69  ppear to be avai
1dfb0 6c 61 62 6c 65 2c 20 75 73 65 20 74 68 65 20 61  lable, use the a
1dfc0 73 73 6f 63 69 61 74 65 64 20 50 52 41 47 4d 41  ssociated PRAGMA
1dfd0 20 63 6f 6d 6d 61 6e 64 73 0d 0a 20 20 20 20 20   commands..     
1dfe0 20 20 20 20 20 23 20 20 20 20 20 20 20 69 6e 73       #       ins
1dff0 74 65 61 64 2e 0d 0a 20 20 20 20 20 20 20 20 20  tead...         
1e000 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 66 6f   #..          fo
1e010 72 65 61 63 68 20 64 69 72 65 63 74 6f 72 79 20  reach directory 
1e020 5b 6c 69 73 74 20 64 61 74 61 5f 73 74 6f 72 65  [list data_store
1e030 5f 64 69 72 65 63 74 6f 72 79 20 74 65 6d 70 5f  _directory temp_
1e040 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 5d  store_directory]
1e050 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1e060 73 65 74 20 73 71 6c 20 5b 61 70 70 65 6e 64 41  set sql [appendA
1e070 72 67 73 20 22 50 52 41 47 4d 41 20 22 20 24 64  rgs "PRAGMA " $d
1e080 69 72 65 63 74 6f 72 79 20 22 20 3d 20 5c 22 5c  irectory " = \"\
1e090 22 3b 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ";"]....        
1e0a0 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
1e0b0 65 78 65 63 75 74 65 53 71 6c 20 24 73 71 6c 7d  executeSql $sql}
1e0c0 20 72 65 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74   result] == 0} t
1e0d0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1e0e0 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
1e0f0 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
1e100 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1e110 20 20 20 20 20 22 2d 2d 2d 2d 20 65 78 65 63 75       "---- execu
1e120 74 65 20 50 52 41 47 4d 41 20 22 20 24 64 69 72  te PRAGMA " $dir
1e130 65 63 74 6f 72 79 20 22 2e 2e 2e 20 6f 6b 3a 20  ectory "... ok: 
1e140 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  \"" \..         
1e150 20 20 20 20 20 20 20 20 20 24 72 65 73 75 6c 74           $result
1e160 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20   \"\n]..        
1e170 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
1e180 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
1e190 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
1e1a0 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
1e1b0 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
1e1c0 2d 20 65 78 65 63 75 74 65 20 50 52 41 47 4d 41  - execute PRAGMA
1e1d0 20 22 20 24 64 69 72 65 63 74 6f 72 79 20 22 2e   " $directory ".
1e1e0 2e 2e 20 65 72 72 6f 72 3a 20 22 20 5c 0d 0a 20  .. error: " \.. 
1e1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e200 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e   \n\t $result \n
1e210 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ]..            }
1e220 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
1e230 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1e240 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
1e250 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69 6e 61      # NOTE: Fina
1e260 6c 6c 79 2c 20 73 68 6f 77 20 74 68 65 20 63 75  lly, show the cu
1e270 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 74  rrent value of t
1e280 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  he database and 
1e290 74 65 6d 70 6f 72 61 72 79 0d 0a 20 20 20 20 20  temporary..     
1e2a0 20 23 20 20 20 20 20 20 20 64 69 72 65 63 74 6f   #       directo
1e2b0 72 69 65 73 2e 20 20 54 68 69 73 20 63 61 6e 20  ries.  This can 
1e2c0 6f 6e 6c 79 20 62 65 20 70 65 72 66 6f 72 6d 65  only be performe
1e2d0 64 20 69 66 20 53 51 4c 69 74 65 20 69 73 20 6c  d if SQLite is l
1e2e0 6f 61 64 65 64 0d 0a 20 20 20 20 20 20 23 20 20  oaded..      #  
1e2f0 20 20 20 20 20 61 6e 64 20 72 65 61 64 79 20 66       and ready f
1e300 6f 72 20 75 73 65 20 62 79 20 74 68 65 20 74 65  or use by the te
1e310 73 74 20 73 75 69 74 65 2e 0d 0a 20 20 20 20 20  st suite...     
1e320 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69   #..      if {[i
1e330 73 53 51 4c 69 74 65 52 65 61 64 79 5d 7d 20 74  sSQLiteReady]} t
1e340 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 66  hen {..        f
1e350 6f 72 65 61 63 68 20 64 69 72 65 63 74 6f 72 79  oreach directory
1e360 20 5b 6c 69 73 74 20 64 61 74 61 5f 73 74 6f 72   [list data_stor
1e370 65 5f 64 69 72 65 63 74 6f 72 79 20 74 65 6d 70  e_directory temp
1e380 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79  _store_directory
1e390 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74  ] {..          t
1e3a0 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
1e3b0 70 70 65 6e 64 41 72 67 73 20 22 2d 2d 2d 2d 20  ppendArgs "---- 
1e3c0 63 68 65 63 6b 69 6e 67 20 22 20 24 64 69 72 65  checking " $dire
1e3d0 63 74 6f 72 79 20 22 2e 2e 2e 20 22 5d 0d 0a 0d  ctory "... "]...
1e3e0 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20 73  .          set s
1e3f0 71 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22  ql [appendArgs "
1e400 50 52 41 47 4d 41 20 22 20 24 64 69 72 65 63 74  PRAGMA " $direct
1e410 6f 72 79 20 5c 3b 5d 0d 0a 0d 0a 20 20 20 20 20  ory \;]....     
1e420 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
1e430 7b 65 78 65 63 75 74 65 53 71 6c 20 24 73 71 6c  {executeSql $sql
1e440 20 73 63 61 6c 61 72 7d 20 72 65 73 75 6c 74 5d   scalar} result]
1e450 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
1e460 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
1e470 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
1e480 64 41 72 67 73 20 22 6f 6b 3a 20 5c 22 22 20 24  dArgs "ok: \"" $
1e490 72 65 73 75 6c 74 20 5c 22 5c 6e 5d 0d 0a 20 20  result \"\n]..  
1e4a0 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
1e4b0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
1e4c0 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
1e4d0 70 65 6e 64 41 72 67 73 20 22 65 72 72 6f 72 3a  pendArgs "error:
1e4e0 20 22 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20   " \n\t $result 
1e4f0 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  \n]..          }
1e500 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
1e510 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
1e520 20 20 20 20 70 72 6f 63 20 6c 6f 61 64 53 51 4c      proc loadSQL
1e530 69 74 65 54 65 73 74 53 65 74 74 69 6e 67 73 20  iteTestSettings 
1e540 7b 20 63 68 61 6e 6e 65 6c 20 7b 73 75 66 66 69  { channel {suffi
1e550 78 20 22 22 7d 20 7b 71 75 69 65 74 20 66 61 6c  x ""} {quiet fal
1e560 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23  se} } {..      #
1e570 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
1e580 53 6b 69 70 20 6c 6f 61 64 69 6e 67 20 74 68 65  Skip loading the
1e590 20 73 65 74 74 69 6e 67 73 20 69 66 20 74 68 65   settings if the
1e5a0 69 72 20 75 73 61 67 65 20 68 61 73 20 62 65 65  ir usage has bee
1e5b0 6e 20 64 69 73 61 62 6c 65 64 2e 0d 0a 20 20 20  n disabled...   
1e5c0 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
1e5d0 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
1e5e0 6e 6f 28 73 71 6c 69 74 65 54 65 73 74 53 65 74  no(sqliteTestSet
1e5f0 74 69 6e 67 73 29 5d 7d 20 74 68 65 6e 20 7b 0d  tings)]} then {.
1e600 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
1e610 20 20 20 20 23 20 4e 4f 54 45 3a 20 4c 6f 61 64      # NOTE: Load
1e620 20 63 75 73 74 6f 6d 20 70 65 72 2d 75 73 65 72   custom per-user
1e630 20 61 6e 64 2f 6f 72 20 70 65 72 2d 68 6f 73 74   and/or per-host
1e640 20 74 65 73 74 20 73 65 74 74 69 6e 67 73 20 6e   test settings n
1e650 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ow...        #..
1e660 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66          if {[inf
1e670 6f 20 65 78 69 73 74 73 20 3a 3a 74 63 6c 5f 70  o exists ::tcl_p
1e680 6c 61 74 66 6f 72 6d 28 75 73 65 72 29 5d 7d 20  latform(user)]} 
1e690 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1e6a0 20 20 73 65 74 20 75 73 65 72 53 65 74 74 69 6e    set userSettin
1e6b0 67 73 46 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65  gsFileName [file
1e6c0 20 6a 6f 69 6e 20 5b 67 65 74 43 6f 6d 6d 6f 6e   join [getCommon
1e6d0 44 69 72 65 63 74 6f 72 79 5d 20 5c 0d 0a 20 20  Directory] \..  
1e6e0 20 20 20 20 20 20 20 20 20 20 20 20 5b 61 70 70              [app
1e6f0 65 6e 64 41 72 67 73 20 73 65 74 74 69 6e 67 73  endArgs settings
1e700 20 24 73 75 66 66 69 78 20 2e 20 24 3a 3a 74 63   $suffix . $::tc
1e710 6c 5f 70 6c 61 74 66 6f 72 6d 28 75 73 65 72 29  l_platform(user)
1e720 20 2e 65 61 67 6c 65 5d 5d 0d 0a 0d 0a 20 20 20   .eagle]]....   
1e730 20 20 20 20 20 20 20 69 66 20 7b 5b 66 69 6c 65         if {[file
1e740 20 65 78 69 73 74 73 20 24 75 73 65 72 53 65 74   exists $userSet
1e750 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 5d 7d 20  tingsFileName]} 
1e760 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1e770 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
1e780 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1e790 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
1e7a0 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
1e7b0 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
1e7c0 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6c 6f 61         "---- loa
1e7d0 64 69 6e 67 20 70 65 72 2d 75 73 65 72 20 74 65  ding per-user te
1e7e0 73 74 20 73 65 74 74 69 6e 67 73 20 66 69 6c 65  st settings file
1e7f0 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20   \"" \..        
1e800 20 20 20 20 20 20 20 20 20 20 24 75 73 65 72 53            $userS
1e810 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 20  ettingsFileName 
1e820 5c 22 2e 2e 2e 5c 6e 5d 0d 0a 20 20 20 20 20 20  \"...\n]..      
1e830 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
1e840 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
1e850 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  h {..           
1e860 20 20 20 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69     uplevel 1 [li
1e870 73 74 20 73 6f 75 72 63 65 20 24 75 73 65 72 53  st source $userS
1e880 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 5d  ettingsFileName]
1e890 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20  ..            } 
1e8a0 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a  error]} then {..
1e8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
1e8c0 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
1e8d0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
1e8e0 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
1e8f0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
1e900 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1e910 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49       "==== WARNI
1e920 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 6c 6f  NG: failed to lo
1e930 61 64 20 70 65 72 2d 75 73 65 72 20 73 65 74 74  ad per-user sett
1e940 69 6e 67 73 20 66 69 6c 65 20 5c 22 22 20 5c 0d  ings file \"" \.
1e950 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1e960 20 20 20 20 20 24 75 73 65 72 53 65 74 74 69 6e       $userSettin
1e970 67 73 46 69 6c 65 4e 61 6d 65 20 22 5c 22 2c 20  gsFileName "\", 
1e980 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65  error: " \n\t $e
1e990 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  rror \n]..      
1e9a0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
1e9b0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1e9c0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
1e9d0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24            if {!$
1e9e0 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
1e9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
1ea00 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
1ea10 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
1ea20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
1ea30 2d 2d 20 73 6b 69 70 70 65 64 20 6c 6f 61 64 69  -- skipped loadi
1ea40 6e 67 20 70 65 72 2d 75 73 65 72 20 74 65 73 74  ng per-user test
1ea50 20 73 65 74 74 69 6e 67 73 20 66 69 6c 65 20 5c   settings file \
1ea60 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  "" \..          
1ea70 20 20 20 20 20 20 20 20 24 75 73 65 72 53 65 74          $userSet
1ea80 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 20 22 5c  tingsFileName "\
1ea90 22 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65  ", it does not e
1eaa0 78 69 73 74 5c 6e 22 5d 0d 0a 20 20 20 20 20 20  xist\n"]..      
1eab0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
1eac0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
1ead0 0a 0d 0a 20 20 20 20 20 20 20 20 23 23 23 23 23  ...        #####
1eae0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1eaf0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1eb00 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1eb10 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1eb20 23 23 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66  ##....        if
1eb30 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
1eb40 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 68 6f  :tcl_platform(ho
1eb50 73 74 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  st)]} then {..  
1eb60 20 20 20 20 20 20 20 20 73 65 74 20 68 6f 73 74          set host
1eb70 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65  SettingsFileName
1eb80 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74   [file join [get
1eb90 43 6f 6d 6d 6f 6e 44 69 72 65 63 74 6f 72 79 5d  CommonDirectory]
1eba0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1ebb0 20 20 5b 61 70 70 65 6e 64 41 72 67 73 20 73 65    [appendArgs se
1ebc0 74 74 69 6e 67 73 20 24 73 75 66 66 69 78 20 2e  ttings $suffix .
1ebd0 20 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d   $::tcl_platform
1ebe0 28 68 6f 73 74 29 20 2e 65 61 67 6c 65 5d 5d 0d  (host) .eagle]].
1ebf0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  ...          if 
1ec00 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 68  {[file exists $h
1ec10 6f 73 74 53 65 74 74 69 6e 67 73 46 69 6c 65 4e  ostSettingsFileN
1ec20 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ame]} then {..  
1ec30 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24            if {!$
1ec40 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
1ec50 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
1ec60 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
1ec70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
1ec80 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
1ec90 2d 2d 20 6c 6f 61 64 69 6e 67 20 70 65 72 2d 68  -- loading per-h
1eca0 6f 73 74 20 74 65 73 74 20 73 65 74 74 69 6e 67  ost test setting
1ecb0 73 20 66 69 6c 65 20 5c 22 22 20 5c 0d 0a 20 20  s file \"" \..  
1ecc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ecd0 24 68 6f 73 74 53 65 74 74 69 6e 67 73 46 69 6c  $hostSettingsFil
1ece0 65 4e 61 6d 65 20 5c 22 2e 2e 2e 5c 6e 5d 0d 0a  eName \"...\n]..
1ecf0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
1ed00 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
1ed10 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
1ed20 20 20 20 20 20 20 20 20 20 75 70 6c 65 76 65 6c           uplevel
1ed30 20 31 20 5b 6c 69 73 74 20 73 6f 75 72 63 65 20   1 [list source 
1ed40 24 68 6f 73 74 53 65 74 74 69 6e 67 73 46 69 6c  $hostSettingsFil
1ed50 65 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20 20 20  eName]..        
1ed60 20 20 20 20 7d 20 65 72 72 6f 72 5d 7d 20 74 68      } error]} th
1ed70 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
1ed80 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
1ed90 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1eda0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
1edb0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
1edc0 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
1edd0 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d             "====
1ede0 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64   WARNING: failed
1edf0 20 74 6f 20 6c 6f 61 64 20 70 65 72 2d 68 6f 73   to load per-hos
1ee00 74 20 73 65 74 74 69 6e 67 73 20 66 69 6c 65 20  t settings file 
1ee10 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  \"" \..         
1ee20 20 20 20 20 20 20 20 20 20 20 20 24 68 6f 73 74             $host
1ee30 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65  SettingsFileName
1ee40 20 22 5c 22 2c 20 65 72 72 6f 72 3a 20 22 20 5c   "\", error: " \
1ee50 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a  n\t $error \n]..
1ee60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
1ee70 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
1ee80 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
1ee90 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1eea0 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
1eeb0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
1eec0 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
1eed0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
1eee0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1eef0 20 20 20 22 2d 2d 2d 2d 20 73 6b 69 70 70 65 64     "---- skipped
1ef00 20 6c 6f 61 64 69 6e 67 20 70 65 72 2d 68 6f 73   loading per-hos
1ef10 74 20 74 65 73 74 20 73 65 74 74 69 6e 67 73 20  t test settings 
1ef20 66 69 6c 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20  file \"" \..    
1ef30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24 68                $h
1ef40 6f 73 74 53 65 74 74 69 6e 67 73 46 69 6c 65 4e  ostSettingsFileN
1ef50 61 6d 65 20 22 5c 22 2c 20 69 74 20 64 6f 65 73  ame "\", it does
1ef60 20 6e 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a   not exist\n"]..
1ef70 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
1ef80 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
1ef90 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
1efa0 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
1efb0 6f 63 20 72 75 6e 53 51 4c 69 74 65 54 65 73 74  oc runSQLiteTest
1efc0 50 72 6f 6c 6f 67 75 65 20 7b 7d 20 7b 0d 0a 20  Prologue {} {.. 
1efd0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
1efe0 4e 4f 54 45 3a 20 53 6b 69 70 20 72 75 6e 6e 69  NOTE: Skip runni
1eff0 6e 67 20 6f 75 72 20 63 75 73 74 6f 6d 20 70 72  ng our custom pr
1f000 6f 6c 6f 67 75 65 20 69 66 20 74 68 65 20 6d 61  ologue if the ma
1f010 69 6e 20 6f 6e 65 20 68 61 73 20 62 65 65 6e 0d  in one has been.
1f020 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73  .      #       s
1f030 6b 69 70 70 65 64 2e 0d 0a 20 20 20 20 20 20 23  kipped...      #
1f040 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e  ..      if {![in
1f050 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 70  fo exists ::no(p
1f060 72 6f 6c 6f 67 75 65 2e 65 61 67 6c 65 29 5d 7d  rologue.eagle)]}
1f070 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1f080 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
1f090 54 45 3a 20 4c 6f 61 64 20 74 68 65 20 22 62 65  TE: Load the "be
1f0a0 66 6f 72 65 2d 63 6f 6e 73 74 72 61 69 6e 74 73  fore-constraints
1f0b0 22 20 63 75 73 74 6f 6d 20 70 65 72 2d 75 73 65  " custom per-use
1f0c0 72 20 61 6e 64 2f 6f 72 20 70 65 72 2d 68 6f 73  r and/or per-hos
1f0d0 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  t..        #    
1f0e0 20 20 20 74 65 73 74 20 73 65 74 74 69 6e 67 73     test settings
1f0f0 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 23   now...        #
1f100 0d 0a 20 20 20 20 20 20 20 20 75 70 6c 65 76 65  ..        upleve
1f110 6c 20 31 20 5b 6c 69 73 74 20 6c 6f 61 64 53 51  l 1 [list loadSQ
1f120 4c 69 74 65 54 65 73 74 53 65 74 74 69 6e 67 73  LiteTestSettings
1f130 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
1f140 20 2e 62 65 66 6f 72 65 5d 0d 0a 0d 0a 20 20 20   .before]....   
1f150 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1f160 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66  # NOTE: Check if
1f170 20 74 68 65 20 5b 6f 62 6a 65 63 74 5d 20 63 6f   the [object] co
1f180 6d 6d 61 6e 64 20 69 73 20 61 76 61 69 6c 61 62  mmand is availab
1f190 6c 65 3b 20 69 66 20 6e 6f 74 2c 20 61 64 64 20  le; if not, add 
1f1a0 73 6f 6d 65 0d 0a 20 20 20 20 20 20 20 20 23 20  some..        # 
1f1b0 20 20 20 20 20 20 73 68 69 6d 73 20 74 6f 20 6d        shims to m
1f1c0 61 6b 65 20 74 68 65 20 74 65 73 74 20 73 75 69  ake the test sui
1f1d0 74 65 20 72 75 6e 20 73 6d 6f 6f 74 68 65 72 2e  te run smoother.
1f1e0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1f1f0 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51 4c       checkForSQL
1f200 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64  iteObjectCommand
1f210 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
1f220 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
1f230 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 44         # NOTE: D
1f240 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6e 61 6d  etermine the nam
1f250 65 73 20 6f 66 20 74 68 65 20 6e 61 74 69 76 65  es of the native
1f260 20 70 6c 61 74 66 6f 72 6d 20 61 6e 64 20 61 72   platform and ar
1f270 63 68 69 74 65 63 74 75 72 65 2e 0d 0a 20 20 20  chitecture...   
1f280 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1f290 73 65 74 20 70 6c 61 74 66 6f 72 6d 20 5b 67 65  set platform [ge
1f2a0 74 42 75 69 6c 64 50 6c 61 74 66 6f 72 6d 20 74  tBuildPlatform t
1f2b0 72 75 65 5d 0d 0a 20 20 20 20 20 20 20 20 73 65  rue]..        se
1f2c0 74 20 61 72 63 68 69 74 65 63 74 75 72 65 20 5b  t architecture [
1f2d0 61 72 63 68 69 74 65 63 74 75 72 65 46 6f 72 50  architectureForP
1f2e0 6c 61 74 66 6f 72 6d 20 24 70 6c 61 74 66 6f 72  latform $platfor
1f2f0 6d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d  m]....        #.
1f300 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
1f310 20 53 68 6f 77 20 74 68 65 20 70 6c 61 74 66 6f   Show the platfo
1f320 72 6d 20 61 6e 64 20 61 72 63 68 69 74 65 63 74  rm and architect
1f330 75 72 65 20 75 73 65 64 20 74 6f 20 68 65 6c 70  ure used to help
1f340 20 6c 6f 63 61 74 65 20 74 68 65 0d 0a 20 20 20   locate the..   
1f350 20 20 20 20 20 23 20 20 20 20 20 20 20 6e 61 74       #       nat
1f360 69 76 65 20 62 75 69 6c 64 20 66 69 6c 65 73 2e  ive build files.
1f370 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1f380 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
1f390 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
1f3a0 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
1f3b0 20 20 20 20 20 20 22 2d 2d 2d 2d 20 70 6c 61 74        "---- plat
1f3c0 66 6f 72 6d 20 66 6f 72 20 6c 6f 63 61 74 69 6e  form for locatin
1f3d0 67 20 6e 61 74 69 76 65 20 62 75 69 6c 64 20 66  g native build f
1f3e0 69 6c 65 73 20 69 73 20 5c 22 22 20 5c 0d 0a 20  iles is \"" \.. 
1f3f0 20 20 20 20 20 20 20 20 20 20 20 24 70 6c 61 74             $plat
1f400 66 6f 72 6d 20 5c 22 5c 6e 5d 0d 0a 0d 0a 20 20  form \"\n]....  
1f410 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
1f420 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
1f430 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
1f440 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 61 72 63         "---- arc
1f450 68 69 74 65 63 74 75 72 65 20 66 6f 72 20 6c 6f  hitecture for lo
1f460 63 61 74 69 6e 67 20 6e 61 74 69 76 65 20 62 75  cating native bu
1f470 69 6c 64 20 66 69 6c 65 73 20 69 73 20 5c 22 22  ild files is \""
1f480 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1f490 24 61 72 63 68 69 74 65 63 74 75 72 65 20 5c 22  $architecture \"
1f4a0 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23  \n]....        #
1f4b0 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
1f4c0 3a 20 42 75 69 6c 64 20 61 20 6c 69 73 74 20 6f  : Build a list o
1f4d0 66 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  f configuration 
1f4e0 66 69 6c 65 73 20 74 68 61 74 20 77 65 20 68 61  files that we ha
1f4f0 6e 64 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 23  ndle...        #
1f500 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 63 6f  ..        set co
1f510 6e 66 69 67 46 69 6c 65 4e 61 6d 65 73 20 5b 6c  nfigFileNames [l
1f520 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ist \..         
1f530 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53     System.Data.S
1f540 51 4c 69 74 65 2e 64 6c 6c 2e 63 6f 6e 66 69 67  QLite.dll.config
1f550 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ]....        #..
1f560 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
1f570 42 75 69 6c 64 20 61 20 6c 69 73 74 20 6f 66 20  Build a list of 
1f580 61 75 78 69 6c 69 61 72 79 20 4d 61 6e 61 67 65  auxiliary Manage
1f590 64 20 44 65 62 75 67 67 69 6e 67 20 41 73 73 69  d Debugging Assi
1f5a0 73 74 61 6e 74 73 20 28 4d 44 41 29 0d 0a 20 20  stants (MDA)..  
1f5b0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f        #       co
1f5c0 6e 66 69 67 75 72 61 74 69 6f 6e 20 66 69 6c 65  nfiguration file
1f5d0 73 20 74 68 61 74 20 77 65 20 68 61 6e 64 6c 65  s that we handle
1f5e0 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
1f5f0 20 20 20 20 20 20 73 65 74 20 6d 64 61 43 6f 6e        set mdaCon
1f600 66 69 67 46 69 6c 65 4e 61 6d 65 73 20 5b 6c 69  figFileNames [li
1f610 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  st \..          
1f620 20 20 45 61 67 6c 65 53 68 65 6c 6c 33 32 2e 65    EagleShell32.e
1f630 78 65 2e 6d 64 61 2e 63 6f 6e 66 69 67 20 49 6e  xe.mda.config In
1f640 73 74 61 6c 6c 65 72 2e 65 78 65 2e 6d 64 61 2e  staller.exe.mda.
1f650 63 6f 6e 66 69 67 20 5c 0d 0a 20 20 20 20 20 20  config \..      
1f660 20 20 20 20 20 20 74 65 73 74 2e 65 78 65 2e 6d        test.exe.m
1f670 64 61 2e 63 6f 6e 66 69 67 20 74 65 73 74 6c 69  da.config testli
1f680 6e 71 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e 66 69  nq.exe.mda.confi
1f690 67 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  g \..           
1f6a0 20 74 65 73 74 65 66 36 2e 65 78 65 2e 6d 64 61   testef6.exe.mda
1f6b0 2e 63 6f 6e 66 69 67 5d 0d 0a 0d 0a 20 20 20 20  .config]....    
1f6c0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
1f6d0 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74 68 65   NOTE: Build the
1f6e0 20 6c 69 73 74 20 6f 66 20 65 78 74 65 72 6e 61   list of externa
1f6f0 6c 20 66 69 6c 65 73 20 74 68 61 74 20 77 65 20  l files that we 
1f700 68 61 6e 64 6c 65 2e 20 20 53 6f 6d 65 20 6f 66  handle.  Some of
1f710 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
1f720 20 20 74 68 65 73 65 20 66 69 6c 65 73 20 6d 61    these files ma
1f730 79 20 62 65 20 6e 61 74 69 76 65 20 61 6e 64 2f  y be native and/
1f740 6f 72 20 6d 61 6e 61 67 65 64 20 61 73 73 65 6d  or managed assem
1f750 62 6c 69 65 73 20 74 68 61 74 20 61 72 65 0d 0a  blies that are..
1f760 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
1f770 72 65 71 75 69 72 65 64 20 74 6f 20 70 65 72 66  required to perf
1f780 6f 72 6d 20 76 61 72 69 6f 75 73 20 74 65 73 74  orm various test
1f790 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  s...        #.. 
1f7a0 20 20 20 20 20 20 20 73 65 74 20 65 78 74 65 72         set exter
1f7b0 6e 61 6c 46 69 6c 65 4e 61 6d 65 73 20 5b 6c 69  nalFileNames [li
1f7c0 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  st \..          
1f7d0 20 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 45 6e 74    [file join Ent
1f7e0 69 74 79 46 72 61 6d 65 77 6f 72 6b 20 6c 69 62  ityFramework lib
1f7f0 20 5b 73 74 72 69 6e 67 20 6d 61 70 20 5b 6c 69   [string map [li
1f800 73 74 20 46 78 20 22 22 5d 20 5b 73 74 72 69 6e  st Fx ""] [strin
1f810 67 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  g \..           
1f820 20 6d 61 70 20 5b 6c 69 73 74 20 6e 65 74 46 78   map [list netFx
1f830 34 35 31 20 6e 65 74 46 78 34 35 20 6e 65 74 46  451 netFx45 netF
1f840 78 34 35 32 20 6e 65 74 46 78 34 35 20 6e 65 74  x452 netFx45 net
1f850 46 78 34 36 20 6e 65 74 46 78 34 35 20 5c 0d 0a  Fx46 netFx45 \..
1f860 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 74 46              netF
1f870 78 34 36 31 20 6e 65 74 46 78 34 35 5d 20 5b 67  x461 netFx45] [g
1f880 65 74 42 75 69 6c 64 4e 65 74 46 78 5d 5d 5d 20  etBuildNetFx]]] 
1f890 45 6e 74 69 74 79 46 72 61 6d 65 77 6f 72 6b 2e  EntityFramework.
1f8a0 64 6c 6c 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  dll]]....       
1f8b0 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
1f8c0 54 45 3a 20 42 75 69 6c 64 20 74 68 65 20 6c 69  TE: Build the li
1f8d0 73 74 20 6f 66 20 6e 61 74 69 76 65 20 61 73 73  st of native ass
1f8e0 65 6d 62 6c 79 20 66 69 6c 65 73 20 74 68 61 74  embly files that
1f8f0 20 77 65 20 68 61 6e 64 6c 65 2e 20 20 54 68 65   we handle.  The
1f900 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
1f910 20 20 72 65 61 73 6f 6e 20 74 68 65 20 22 53 79    reason the "Sy
1f920 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
1f930 2e 64 6c 6c 22 20 66 69 6c 65 20 69 73 20 69 6e  .dll" file is in
1f940 63 6c 75 64 65 64 20 68 65 72 65 20 69 73 0d 0a  cluded here is..
1f950 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
1f960 62 65 63 61 75 73 65 20 69 74 20 63 6f 75 6c 64  because it could
1f970 20 62 65 20 74 68 65 20 6d 69 78 65 64 2d 6d 6f   be the mixed-mo
1f980 64 65 20 61 73 73 65 6d 62 6c 79 2e 0d 0a 20 20  de assembly...  
1f990 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1f9a0 20 73 65 74 20 6e 61 74 69 76 65 46 69 6c 65 4e   set nativeFileN
1f9b0 61 6d 65 73 20 5b 6c 69 73 74 5d 0d 0a 0d 0a 20  ames [list].... 
1f9c0 20 20 20 20 20 20 20 65 76 61 6c 20 6c 61 70 70         eval lapp
1f9d0 65 6e 64 20 6e 61 74 69 76 65 46 69 6c 65 4e 61  end nativeFileNa
1f9e0 6d 65 73 20 5b 67 65 74 4e 61 74 69 76 65 4c 69  mes [getNativeLi
1f9f0 62 72 61 72 79 46 69 6c 65 4e 61 6d 65 73 4f 6e  braryFileNamesOn
1fa00 6c 79 5d 0d 0a 20 20 20 20 20 20 20 20 65 76 61  ly]..        eva
1fa10 6c 20 6c 61 70 70 65 6e 64 20 6e 61 74 69 76 65  l lappend native
1fa20 46 69 6c 65 4e 61 6d 65 73 20 5b 67 65 74 49 6e  FileNames [getIn
1fa30 74 65 72 6f 70 41 73 73 65 6d 62 6c 79 46 69 6c  teropAssemblyFil
1fa40 65 4e 61 6d 65 73 4f 6e 6c 79 5d 0d 0a 0d 0a 20  eNamesOnly].... 
1fa50 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 6e         lappend n
1fa60 61 74 69 76 65 46 69 6c 65 4e 61 6d 65 73 20 53  ativeFileNames S
1fa70 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
1fa80 65 2e 64 6c 6c 0d 0a 0d 0a 20 20 20 20 20 20 20  e.dll....       
1fa90 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
1faa0 54 45 3a 20 42 75 69 6c 64 20 74 68 65 20 6c 69  TE: Build the li
1fab0 73 74 20 6f 66 20 6d 61 6e 61 67 65 64 20 61 73  st of managed as
1fac0 73 65 6d 62 6c 79 20 66 69 6c 65 73 20 74 68 61  sembly files tha
1fad0 74 20 77 65 20 68 61 6e 64 6c 65 2e 0d 0a 20 20  t we handle...  
1fae0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1faf0 20 73 65 74 20 6d 61 6e 61 67 65 64 46 69 6c 65   set managedFile
1fb00 4e 61 6d 65 73 20 5b 6c 69 73 74 20 5c 0d 0a 20  Names [list \.. 
1fb10 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65             Syste
1fb20 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c  m.Data.SQLite.dl
1fb30 6c 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  l System.Data.SQ
1fb40 4c 69 74 65 2e 4c 69 6e 71 2e 64 6c 6c 20 5c 0d  Lite.Linq.dll \.
1fb50 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73  .            Sys
1fb60 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
1fb70 45 46 36 2e 64 6c 6c 5d 0d 0a 0d 0a 20 20 20 20  EF6.dll]....    
1fb80 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
1fb90 20 4e 4f 54 45 3a 20 52 65 6d 6f 76 65 20 61 6e   NOTE: Remove an
1fba0 79 20 74 65 73 74 20 63 6f 6e 73 74 72 61 69 6e  y test constrain
1fbb0 74 73 20 74 68 61 74 20 72 65 66 65 72 20 74 6f  ts that refer to
1fbc0 20 74 68 65 20 6e 61 74 69 76 65 20 61 6e 64 2f   the native and/
1fbd0 6f 72 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  or..        #   
1fbe0 20 20 20 20 6d 61 6e 61 67 65 64 20 61 73 73 65      managed asse
1fbf0 6d 62 6c 79 20 66 69 6c 65 73 20 74 68 61 74 20  mbly files that 
1fc00 77 65 20 68 61 6e 64 6c 65 20 75 6e 6c 65 73 73  we handle unless
1fc10 20 66 6f 72 62 69 64 64 65 6e 20 66 72 6f 6d 0d   forbidden from.
1fc20 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
1fc30 20 64 6f 69 6e 67 20 73 6f 2e 0d 0a 20 20 20 20   doing so...    
1fc40 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69      #..        i
1fc50 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
1fc60 20 3a 3a 6e 6f 28 73 71 6c 69 74 65 52 65 6d 6f   ::no(sqliteRemo
1fc70 76 65 43 6f 6e 73 74 72 61 69 6e 74 73 29 5d 7d  veConstraints)]}
1fc80 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1fc90 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e     foreach fileN
1fca0 61 6d 65 20 24 63 6f 6e 66 69 67 46 69 6c 65 4e  ame $configFileN
1fcb0 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20  ames {..        
1fcc0 20 20 20 20 72 65 6d 6f 76 65 43 6f 6e 73 74 72      removeConstr
1fcd0 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
1fce0 20 66 69 6c 65 5f 20 24 66 69 6c 65 4e 61 6d 65   file_ $fileName
1fcf0 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ]..          }..
1fd00 0d 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 65  ..          fore
1fd10 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6d 64  ach fileName $md
1fd20 61 43 6f 6e 66 69 67 46 69 6c 65 4e 61 6d 65 73  aConfigFileNames
1fd30 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1fd40 72 65 6d 6f 76 65 43 6f 6e 73 74 72 61 69 6e 74  removeConstraint
1fd50 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c   [appendArgs fil
1fd60 65 5f 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20  e_ $fileName].. 
1fd70 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
1fd80 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
1fd90 66 69 6c 65 4e 61 6d 65 20 24 65 78 74 65 72 6e  fileName $extern
1fda0 61 6c 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20  alFileNames {.. 
1fdb0 20 20 20 20 20 20 20 20 20 20 20 72 65 6d 6f 76             remov
1fdc0 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70  eConstraint [app
1fdd0 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5b 66  endArgs file_ [f
1fde0 69 6c 65 20 74 61 69 6c 20 24 66 69 6c 65 4e 61  ile tail $fileNa
1fdf0 6d 65 5d 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  me]]..          
1fe00 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 66  }....          f
1fe10 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20  oreach fileName 
1fe20 24 6e 61 74 69 76 65 46 69 6c 65 4e 61 6d 65 73  $nativeFileNames
1fe30 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1fe40 72 65 6d 6f 76 65 43 6f 6e 73 74 72 61 69 6e 74  removeConstraint
1fe50 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c   [appendArgs fil
1fe60 65 5f 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20  e_ $fileName].. 
1fe70 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
1fe80 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
1fe90 66 69 6c 65 4e 61 6d 65 20 24 6d 61 6e 61 67 65  fileName $manage
1fea0 64 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20  dFileNames {..  
1feb0 20 20 20 20 20 20 20 20 20 20 72 65 6d 6f 76 65            remove
1fec0 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65  Constraint [appe
1fed0 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 24 66 69  ndArgs file_ $fi
1fee0 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20 20  leName]..       
1fef0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
1ff00 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
1ff10 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b        # NOTE: Sk
1ff20 69 70 20 61 6c 6c 20 53 79 73 74 65 6d 2e 44 61  ip all System.Da
1ff30 74 61 2e 53 51 4c 69 74 65 20 72 65 6c 61 74 65  ta.SQLite relate
1ff40 64 20 66 69 6c 65 20 68 61 6e 64 6c 69 6e 67 20  d file handling 
1ff50 28 64 65 6c 65 74 69 6e 67 2c 0d 0a 20 20 20 20  (deleting,..    
1ff60 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 70 79      #       copy
1ff70 69 6e 67 2c 20 61 6e 64 20 6c 6f 61 64 69 6e 67  ing, and loading
1ff80 29 20 69 66 20 69 6e 73 74 72 75 63 74 65 64 2e  ) if instructed.
1ff90 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1ffa0 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
1ffb0 65 78 69 73 74 73 20 3a 3a 6e 6f 28 73 71 6c 69  exists ::no(sqli
1ffc0 74 65 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20  teFiles)]} then 
1ffd0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  {..          #..
1ffe0 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
1fff0 3a 20 53 6b 69 70 20 74 72 79 69 6e 67 20 74 6f  : Skip trying to
20000 20 64 65 6c 65 74 65 20 61 6e 79 20 66 69 6c 65   delete any file
20010 73 20 69 66 20 69 6e 73 74 72 75 63 74 65 64 2e  s if instructed.
20020 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
20030 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69           if {![i
20040 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
20050 64 65 6c 65 74 65 53 71 6c 69 74 65 46 69 6c 65  deleteSqliteFile
20060 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  s)]} then {..   
20070 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69           if {![i
20080 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
20090 64 65 6c 65 74 65 53 71 6c 69 74 65 43 6f 6e 66  deleteSqliteConf
200a0 69 67 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20  igFiles)]} then 
200b0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
200c0 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d   foreach fileNam
200d0 65 20 24 63 6f 6e 66 69 67 46 69 6c 65 4e 61 6d  e $configFileNam
200e0 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  es {..          
200f0 20 20 20 20 20 20 74 72 79 44 65 6c 65 74 65 42        tryDeleteB
20100 69 6e 61 72 79 46 69 6c 65 20 24 66 69 6c 65 4e  inaryFile $fileN
20110 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ame..           
20120 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
20130 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
20140 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
20150 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74 65  ists ::no(delete
20160 53 71 6c 69 74 65 45 78 74 65 72 6e 61 6c 46 69  SqliteExternalFi
20170 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  les)]} then {.. 
20180 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
20190 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6d  each fileName $m
201a0 64 61 43 6f 6e 66 69 67 46 69 6c 65 4e 61 6d 65  daConfigFileName
201b0 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s {..           
201c0 20 20 20 20 20 74 72 79 44 65 6c 65 74 65 42 75       tryDeleteBu
201d0 69 6c 64 46 69 6c 65 20 24 66 69 6c 65 4e 61 6d  ildFile $fileNam
201e0 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e..             
201f0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
20200 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65      foreach file
20210 4e 61 6d 65 20 24 65 78 74 65 72 6e 61 6c 46 69  Name $externalFi
20220 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20  leNames {..     
20230 20 20 20 20 20 20 20 20 20 20 20 74 72 79 44 65             tryDe
20240 6c 65 74 65 42 69 6e 61 72 79 46 69 6c 65 20 24  leteBinaryFile $
20250 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20  fileName..      
20260 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
20270 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
20280 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
20290 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64  fo exists ::no(d
202a0 65 6c 65 74 65 53 71 6c 69 74 65 4e 61 74 69 76  eleteSqliteNativ
202b0 65 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b  eFiles)]} then {
202c0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
202d0 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
202e0 73 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c  s ::no(deleteSql
202f0 69 74 65 49 6d 70 6c 69 63 69 74 46 69 6c 65 73  iteImplicitFiles
20300 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
20310 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65              fore
20320 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6e 61  ach fileName $na
20330 74 69 76 65 46 69 6c 65 4e 61 6d 65 73 20 7b 0d  tiveFileNames {.
20340 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20350 20 20 20 74 72 79 44 65 6c 65 74 65 41 73 73 65     tryDeleteAsse
20360 6d 62 6c 79 20 24 66 69 6c 65 4e 61 6d 65 0d 0a  mbly $fileName..
20370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20380 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  }..             
20390 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
203a0 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
203b0 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74  xists ::no(delet
203c0 65 53 71 6c 69 74 65 4e 6f 6e 49 6d 70 6c 69 63  eSqliteNonImplic
203d0 69 74 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20  itFiles)]} then 
203e0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
203f0 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
20400 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74 65  ists ::no(delete
20410 53 71 6c 69 74 65 50 6c 61 74 66 6f 72 6d 46 69  SqlitePlatformFi
20420 6c 65 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20  les)] && \..    
20430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20440 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
20450 70 6c 61 74 66 6f 72 6d 5d 20 3e 20 30 7d 20 74  platform] > 0} t
20460 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
20470 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
20480 20 66 69 6c 65 4e 61 6d 65 20 24 6e 61 74 69 76   fileName $nativ
20490 65 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20  eFileNames {..  
204a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
204b0 20 20 74 72 79 44 65 6c 65 74 65 41 73 73 65 6d    tryDeleteAssem
204c0 62 6c 79 20 24 66 69 6c 65 4e 61 6d 65 20 24 70  bly $fileName $p
204d0 6c 61 74 66 6f 72 6d 0d 0a 20 20 20 20 20 20 20  latform..       
204e0 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
204f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
20500 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
20510 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
20520 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74 65  ists ::no(delete
20530 53 71 6c 69 74 65 41 72 63 68 69 74 65 63 74 75  SqliteArchitectu
20540 72 65 46 69 6c 65 73 29 5d 20 26 26 20 5c 0d 0a  reFiles)] && \..
20550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20560 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67      [string leng
20570 74 68 20 24 61 72 63 68 69 74 65 63 74 75 72 65  th $architecture
20580 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
20590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
205a0 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d   foreach fileNam
205b0 65 20 24 6e 61 74 69 76 65 46 69 6c 65 4e 61 6d  e $nativeFileNam
205c0 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  es {..          
205d0 20 20 20 20 20 20 20 20 20 20 74 72 79 44 65 6c            tryDel
205e0 65 74 65 41 73 73 65 6d 62 6c 79 20 24 66 69 6c  eteAssembly $fil
205f0 65 4e 61 6d 65 20 24 61 72 63 68 69 74 65 63 74  eName $architect
20600 75 72 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ure..           
20610 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
20620 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
20630 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
20640 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
20650 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
20660 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
20670 6f 28 64 65 6c 65 74 65 53 71 6c 69 74 65 4d 61  o(deleteSqliteMa
20680 6e 61 67 65 64 46 69 6c 65 73 29 5d 7d 20 74 68  nagedFiles)]} th
20690 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
206a0 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65      foreach file
206b0 4e 61 6d 65 20 24 6d 61 6e 61 67 65 64 46 69 6c  Name $managedFil
206c0 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20  eNames {..      
206d0 20 20 20 20 20 20 20 20 20 20 74 72 79 44 65 6c            tryDel
206e0 65 74 65 41 73 73 65 6d 62 6c 79 20 24 66 69 6c  eteAssembly $fil
206f0 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 20  eName..         
20700 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
20710 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
20720 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
20730 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e  #..          # N
20740 4f 54 45 3a 20 43 68 65 63 6b 20 66 6f 72 20 74  OTE: Check for t
20750 68 65 20 22 61 75 74 6f 53 65 6c 65 63 74 22 20  he "autoSelect" 
20760 72 75 6e 74 69 6d 65 20 6f 70 74 69 6f 6e 2e 20  runtime option. 
20770 20 49 66 20 70 72 65 73 65 6e 74 2c 0d 0a 20 20   If present,..  
20780 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
20790 61 74 74 65 6d 70 74 20 74 6f 20 61 75 74 6f 6d  attempt to autom
207a0 61 74 69 63 61 6c 6c 79 20 73 65 6c 65 63 74 20  atically select 
207b0 74 68 65 20 66 69 72 73 74 20 61 76 61 69 6c 61  the first availa
207c0 62 6c 65 0d 0a 20 20 20 20 20 20 20 20 20 20 23  ble..          #
207d0 20 20 20 20 20 20 20 62 75 69 6c 64 20 28 6f 72         build (or
207e0 20 22 72 65 6c 65 61 73 65 22 29 20 6f 66 20 53   "release") of S
207f0 51 4c 69 74 65 20 61 6e 64 20 53 79 73 74 65 6d  QLite and System
20800 2e 44 61 74 61 2e 53 51 4c 69 74 65 0d 0a 20 20  .Data.SQLite..  
20810 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
20820 66 6f 72 20 75 73 65 20 77 69 74 68 20 74 68 65  for use with the
20830 20 74 65 73 74 20 73 75 69 74 65 2e 0d 0a 20 20   test suite...  
20840 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
20850 20 20 20 20 20 69 66 20 7b 5b 68 61 73 52 75 6e       if {[hasRun
20860 74 69 6d 65 4f 70 74 69 6f 6e 20 61 75 74 6f 53  timeOption autoS
20870 65 6c 65 63 74 5d 7d 20 74 68 65 6e 20 7b 0d 0a  elect]} then {..
20880 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
20890 21 5b 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65  ![checkForSQLite
208a0 42 75 69 6c 64 73 20 24 3a 3a 74 65 73 74 5f 63  Builds $::test_c
208b0 68 61 6e 6e 65 6c 20 74 72 75 65 5d 7d 20 74 68  hannel true]} th
208c0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
208d0 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51 4c 69      checkForSQLi
208e0 74 65 52 65 6c 65 61 73 65 73 20 24 3a 3a 74 65  teReleases $::te
208f0 73 74 5f 63 68 61 6e 6e 65 6c 20 74 72 75 65 0d  st_channel true.
20900 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
20910 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
20920 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
20930 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b        # NOTE: Sk
20940 69 70 20 74 72 79 69 6e 67 20 74 6f 20 76 65 72  ip trying to ver
20950 69 66 79 20 74 68 65 20 62 75 69 6c 64 20 64 69  ify the build di
20960 72 65 63 74 6f 72 79 20 69 66 20 69 6e 73 74 72  rectory if instr
20970 75 63 74 65 64 3b 0d 0a 20 20 20 20 20 20 20 20  ucted;..        
20980 20 20 23 20 20 20 20 20 20 20 6f 74 68 65 72 77    #       otherw
20990 69 73 65 2c 20 6d 61 6b 65 20 73 75 72 65 20 69  ise, make sure i
209a0 74 20 61 63 74 75 61 6c 6c 79 20 65 78 69 73 74  t actually exist
209b0 73 20 6f 72 20 68 61 6c 74 20 74 68 65 20 65 6e  s or halt the en
209c0 74 69 72 65 0d 0a 20 20 20 20 20 20 20 20 20 20  tire..          
209d0 23 20 20 20 20 20 20 20 74 65 73 74 69 6e 67 20  #       testing 
209e0 70 72 6f 63 65 73 73 20 69 66 20 69 74 20 64 6f  process if it do
209f0 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 0d 0a 20  es not exist... 
20a00 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
20a10 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
20a20 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 76 65 72   exists ::no(ver
20a30 69 66 79 42 75 69 6c 64 44 69 72 65 63 74 6f 72  ifyBuildDirector
20a40 79 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  y)]} then {..   
20a50 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
20a60 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
20a70 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74  At this point, t
20a80 68 65 20 62 75 69 6c 64 20 64 69 72 65 63 74 6f  he build directo
20a90 72 79 20 4d 55 53 54 20 65 78 69 73 74 20 61 73  ry MUST exist as
20aa0 20 61 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   a..            
20ab0 23 20 20 20 20 20 20 20 76 61 6c 69 64 20 64 69  #       valid di
20ac0 72 65 63 74 6f 72 79 20 66 6f 72 20 74 68 65 20  rectory for the 
20ad0 74 65 73 74 69 6e 67 20 70 72 6f 63 65 73 73 20  testing process 
20ae0 74 6f 20 63 6f 6e 74 69 6e 75 65 2e 0d 0a 20 20  to continue...  
20af0 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
20b00 20 20 20 20 20 20 20 20 20 73 65 74 20 64 69 72           set dir
20b10 65 63 74 6f 72 79 20 5b 67 65 74 42 75 69 6c 64  ectory [getBuild
20b20 44 69 72 65 63 74 6f 72 79 5d 0d 0a 0d 0a 20 20  Directory]....  
20b30 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
20b40 66 69 6c 65 20 65 78 69 73 74 73 20 24 64 69 72  file exists $dir
20b50 65 63 74 6f 72 79 5d 20 7c 7c 20 5c 0d 0a 20 20  ectory] || \..  
20b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 21 5b                ![
20b70 66 69 6c 65 20 69 73 64 69 72 65 63 74 6f 72 79  file isdirectory
20b80 20 24 64 69 72 65 63 74 6f 72 79 5d 7d 20 74 68   $directory]} th
20b90 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
20ba0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
20bb0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4a 75 73       # NOTE: Jus
20bc0 74 20 70 72 69 6f 72 20 74 6f 20 61 63 74 75 61  t prior to actua
20bd0 6c 6c 79 20 68 61 6c 74 69 6e 67 20 74 68 65 20  lly halting the 
20be0 74 65 73 74 69 6e 67 20 70 72 6f 63 65 73 73 2c  testing process,
20bf0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
20c00 23 20 20 20 20 20 20 20 61 64 64 20 61 6e 20 65  #       add an e
20c10 72 72 6f 72 20 74 6f 20 74 68 65 20 74 65 73 74  rror to the test
20c20 20 6c 6f 67 20 66 69 6c 65 2e 0d 0a 20 20 20 20   log file...    
20c30 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
20c40 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
20c50 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
20c60 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
20c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20c80 20 20 22 2d 2d 2d 2d 20 63 6f 75 6c 64 20 6e 6f    "---- could no
20c90 74 20 76 65 72 69 66 79 20 62 75 69 6c 64 20 64  t verify build d
20ca0 69 72 65 63 74 6f 72 79 20 5c 22 22 20 24 64 69  irectory \"" $di
20cb0 72 65 63 74 6f 72 79 20 5c 0d 0a 20 20 20 20 20  rectory \..     
20cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22               "\"
20cd0 2c 20 61 6c 6c 20 74 65 73 74 69 6e 67 20 68 61  , all testing ha
20ce0 6c 74 65 64 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20  lted\n"]....    
20cf0 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
20d00 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
20d10 45 3a 20 52 61 69 73 69 6e 67 20 61 20 73 63 72  E: Raising a scr
20d20 69 70 74 20 65 72 72 6f 72 20 66 72 6f 6d 20 74  ipt error from t
20d30 68 69 73 20 70 6f 69 6e 74 20 73 68 6f 75 6c 64  his point should
20d40 20 68 61 6c 74 0d 0a 20 20 20 20 20 20 20 20 20   halt..         
20d50 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
20d60 20 74 65 73 74 69 6e 67 20 70 72 6f 63 65 73 73   testing process
20d70 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
20d80 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
20d90 20 20 65 72 72 6f 72 20 5b 61 70 70 65 6e 64 41    error [appendA
20da0 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
20db0 20 20 20 20 20 20 20 20 20 22 63 6f 75 6c 64 20           "could 
20dc0 6e 6f 74 20 76 65 72 69 66 79 20 62 75 69 6c 64  not verify build
20dd0 20 64 69 72 65 63 74 6f 72 79 20 5c 22 22 20 24   directory \"" $
20de0 64 69 72 65 63 74 6f 72 79 20 5c 0d 0a 20 20 20  directory \..   
20df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
20e00 5c 22 2c 20 61 6c 6c 20 74 65 73 74 69 6e 67 20  \", all testing 
20e10 68 61 6c 74 65 64 22 5d 0d 0a 20 20 20 20 20 20  halted"]..      
20e20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
20e30 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
20e40 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23    #..          #
20e50 20 4e 4f 54 45 3a 20 53 6b 69 70 20 74 72 79 69   NOTE: Skip tryi
20e60 6e 67 20 74 6f 20 63 6f 70 79 20 61 6e 79 20 66  ng to copy any f
20e70 69 6c 65 73 20 69 66 20 69 6e 73 74 72 75 63 74  iles if instruct
20e80 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  ed...          #
20e90 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
20ea0 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
20eb0 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65 46 69 6c  no(copySqliteFil
20ec0 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  es)]} then {..  
20ed0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
20ee0 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
20ef0 28 63 6f 70 79 53 71 6c 69 74 65 43 6f 6e 66 69  (copySqliteConfi
20f00 67 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b  gFiles)]} then {
20f10 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
20f20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65  foreach fileName
20f30 20 24 63 6f 6e 66 69 67 46 69 6c 65 4e 61 6d 65   $configFileName
20f40 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s {..           
20f50 20 20 20 20 20 74 72 79 43 6f 70 79 42 75 69 6c       tryCopyBuil
20f60 64 46 69 6c 65 20 24 66 69 6c 65 4e 61 6d 65 0d  dFile $fileName.
20f70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
20f80 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
20f90 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ...            i
20fa0 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
20fb0 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65   ::no(copySqlite
20fc0 45 78 74 65 72 6e 61 6c 46 69 6c 65 73 29 5d 7d  ExternalFiles)]}
20fd0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
20fe0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
20ff0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
21000 43 6f 70 79 20 74 68 65 20 4d 61 6e 61 67 65 64  Copy the Managed
21010 20 44 65 62 75 67 67 69 6e 67 20 41 73 73 69 73   Debugging Assis
21020 74 61 6e 74 73 20 28 4d 44 41 29 20 63 6f 6e 66  tants (MDA) conf
21030 69 67 75 72 61 74 69 6f 6e 0d 0a 20 20 20 20 20  iguration..     
21040 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
21050 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20 45 61   file for the Ea
21060 67 6c 65 20 73 68 65 6c 6c 20 74 6f 20 74 68 65  gle shell to the
21070 20 62 75 69 6c 64 20 6f 75 74 70 75 74 20 64 69   build output di
21080 72 65 63 74 6f 72 79 2c 0d 0a 20 20 20 20 20 20  rectory,..      
21090 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
210a0 77 68 69 6c 65 20 75 73 69 6e 67 20 65 61 63 68  while using each
210b0 20 6f 66 20 74 68 65 20 6e 61 6d 65 73 20 6f 66   of the names of
210c0 20 74 68 65 20 76 61 72 69 6f 75 73 20 6c 65 67   the various leg
210d0 61 63 79 20 74 65 73 74 0d 0a 20 20 20 20 20 20  acy test..      
210e0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
210f0 65 78 65 63 75 74 61 62 6c 65 73 2e 20 20 54 68  executables.  Th
21100 69 73 20 77 69 6c 6c 20 68 65 6c 70 20 74 6f 20  is will help to 
21110 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 61  make sure that a
21120 6c 6c 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20  ll the..        
21130 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6c 65        #       le
21140 67 61 63 79 20 74 65 73 74 73 20 72 75 6e 20 77  gacy tests run w
21150 69 74 68 20 65 78 61 63 74 6c 79 20 74 68 65 20  ith exactly the 
21160 73 61 6d 65 20 73 65 74 20 6f 66 20 4d 61 6e 61  same set of Mana
21170 67 65 64 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ged..           
21180 20 20 20 23 20 20 20 20 20 20 20 44 65 62 75 67     #       Debug
21190 67 69 6e 67 20 41 73 73 69 73 74 61 6e 74 73 20  ging Assistants 
211a0 63 6f 6e 66 69 67 75 72 65 64 2e 0d 0a 20 20 20  configured...   
211b0 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
211c0 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65              fore
211d0 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6d 64  ach fileName $md
211e0 61 43 6f 6e 66 69 67 46 69 6c 65 4e 61 6d 65 73  aConfigFileNames
211f0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
21200 20 20 20 20 74 72 79 43 6f 70 79 42 69 6e 61 72      tryCopyBinar
21210 79 46 69 6c 65 20 45 61 67 6c 65 53 68 65 6c 6c  yFile EagleShell
21220 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e 66 69 67 20  .exe.mda.config 
21230 22 22 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20  "" $fileName..  
21240 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
21250 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
21260 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
21270 23 20 4e 4f 54 45 3a 20 43 6f 70 79 20 74 68 65  # NOTE: Copy the
21280 20 65 78 74 65 72 6e 61 6c 20 62 69 6e 61 72 69   external binari
21290 65 73 2c 20 69 66 20 61 6e 79 2c 20 74 6f 20 74  es, if any, to t
212a0 68 65 20 64 69 72 65 63 74 6f 72 79 20 74 68 61  he directory tha
212b0 74 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t..             
212c0 20 23 20 20 20 20 20 20 20 63 6f 6e 74 61 69 6e   #       contain
212d0 73 20 74 68 65 20 45 61 67 6c 65 20 73 68 65 6c  s the Eagle shel
212e0 6c 2e 20 20 54 68 69 73 20 69 73 20 74 79 70 69  l.  This is typi
212f0 63 61 6c 6c 79 20 75 73 65 64 20 74 6f 20 6d 61  cally used to ma
21300 6b 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ke..            
21310 20 20 23 20 20 20 20 20 20 20 73 75 72 65 20 61    #       sure a
21320 73 73 65 6d 62 6c 69 65 73 20 72 65 66 65 72 65  ssemblies refere
21330 6e 63 65 64 20 62 79 20 74 68 65 20 6f 6e 65 73  nced by the ones
21340 20 62 65 69 6e 67 20 74 65 73 74 65 64 20 61 72   being tested ar
21350 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e..             
21360 20 23 20 20 20 20 20 20 20 61 76 61 69 6c 61 62   #       availab
21370 6c 65 20 64 75 72 69 6e 67 20 74 68 65 20 74 65  le during the te
21380 73 74 69 6e 67 20 70 72 6f 63 65 73 73 2e 0d 0a  sting process...
21390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
213a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66  .              f
213b0 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20  oreach fileName 
213c0 24 65 78 74 65 72 6e 61 6c 46 69 6c 65 4e 61 6d  $externalFileNam
213d0 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  es {..          
213e0 20 20 20 20 20 20 74 72 79 43 6f 70 79 45 78 74        tryCopyExt
213f0 65 72 6e 61 6c 46 69 6c 65 20 24 66 69 6c 65 4e  ernalFile $fileN
21400 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ame..           
21410 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
21420 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
21430 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
21440 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71  ists ::no(copySq
21450 6c 69 74 65 4e 61 74 69 76 65 46 69 6c 65 73 29  liteNativeFiles)
21460 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
21470 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
21480 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
21490 3a 20 49 66 20 74 68 65 20 74 65 73 74 20 70 6c  : If the test pl
214a0 61 74 66 6f 72 6d 20 69 73 20 6c 69 6b 65 6c 79  atform is likely
214b0 20 74 68 65 20 64 65 66 61 75 6c 74 20 66 6f 72   the default for
214c0 20 74 68 69 73 0d 0a 20 20 20 20 20 20 20 20 20   this..         
214d0 20 20 20 20 20 23 20 20 20 20 20 20 20 6d 61 63       #       mac
214e0 68 69 6e 65 2c 20 61 6c 73 6f 20 74 72 79 20 74  hine, also try t
214f0 6f 20 63 6f 70 79 20 74 68 65 20 6e 61 74 69 76  o copy the nativ
21500 65 20 66 69 6c 65 73 20 74 6f 20 74 68 65 0d 0a  e files to the..
21510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
21520 20 20 20 20 20 20 62 69 6e 61 72 79 20 6c 6f 63        binary loc
21530 61 74 69 6f 6e 2e 0d 0a 20 20 20 20 20 20 20 20  ation...        
21540 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
21550 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
21560 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f  o exists ::no(co
21570 70 79 53 71 6c 69 74 65 49 6d 70 6c 69 63 69 74  pySqliteImplicit
21580 46 69 6c 65 73 29 5d 20 26 26 20 5c 0d 0a 20 20  Files)] && \..  
21590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
215a0 5b 69 73 44 65 66 61 75 6c 74 42 75 69 6c 64 50  [isDefaultBuildP
215b0 6c 61 74 66 6f 72 6d 20 74 72 75 65 5d 7d 20 74  latform true]} t
215c0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
215d0 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66         foreach f
215e0 69 6c 65 4e 61 6d 65 20 24 6e 61 74 69 76 65 46  ileName $nativeF
215f0 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20  ileNames {..    
21600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72                tr
21610 79 43 6f 70 79 41 73 73 65 6d 62 6c 79 20 24 66  yCopyAssembly $f
21620 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20  ileName..       
21630 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
21640 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
21650 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
21660 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
21670 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65 4e 6f  :no(copySqliteNo
21680 6e 49 6d 70 6c 69 63 69 74 46 69 6c 65 73 29 5d  nImplicitFiles)]
21690 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
216a0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
216b0 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
216c0 28 63 6f 70 79 53 71 6c 69 74 65 50 6c 61 74 66  (copySqlitePlatf
216d0 6f 72 6d 46 69 6c 65 73 29 5d 20 26 26 20 5c 0d  ormFiles)] && \.
216e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
216f0 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
21700 67 74 68 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3e  gth $platform] >
21710 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
21720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f                fo
21730 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24  reach fileName $
21740 6e 61 74 69 76 65 46 69 6c 65 4e 61 6d 65 73 20  nativeFileNames 
21750 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
21760 20 20 20 20 20 20 20 74 72 79 43 6f 70 79 41 73         tryCopyAs
21770 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61 6d 65  sembly $fileName
21780 20 24 70 6c 61 74 66 6f 72 6d 0d 0a 20 20 20 20   $platform..    
21790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
217a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
217b0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
217c0 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
217d0 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70   exists ::no(cop
217e0 79 53 71 6c 69 74 65 41 72 63 68 69 74 65 63 74  ySqliteArchitect
217f0 75 72 65 46 69 6c 65 73 29 5d 20 26 26 20 5c 0d  ureFiles)] && \.
21800 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21810 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
21820 67 74 68 20 24 61 72 63 68 69 74 65 63 74 75 72  gth $architectur
21830 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  e] > 0} then {..
21840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21850 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61    foreach fileNa
21860 6d 65 20 24 6e 61 74 69 76 65 46 69 6c 65 4e 61  me $nativeFileNa
21870 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  mes {..         
21880 20 20 20 20 20 20 20 20 20 20 20 74 72 79 43 6f             tryCo
21890 70 79 41 73 73 65 6d 62 6c 79 20 24 66 69 6c 65  pyAssembly $file
218a0 4e 61 6d 65 20 24 61 72 63 68 69 74 65 63 74 75  Name $architectu
218b0 72 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  re..            
218c0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
218d0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
218e0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
218f0 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
21900 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
21910 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
21920 28 63 6f 70 79 53 71 6c 69 74 65 4d 61 6e 61 67  (copySqliteManag
21930 65 64 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20  edFiles)]} then 
21940 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
21950 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d   foreach fileNam
21960 65 20 24 6d 61 6e 61 67 65 64 46 69 6c 65 4e 61  e $managedFileNa
21970 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  mes {..         
21980 20 20 20 20 20 20 20 74 72 79 43 6f 70 79 41 73         tryCopyAs
21990 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61 6d 65  sembly $fileName
219a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
219b0 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  }..            }
219c0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d  ..          }...
219d0 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
219e0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
219f0 53 6b 69 70 20 74 72 79 69 6e 67 20 74 6f 20 6c  Skip trying to l
21a00 6f 61 64 20 61 6e 79 20 66 69 6c 65 73 20 69 66  oad any files if
21a10 20 69 6e 73 74 72 75 63 74 65 64 2e 0d 0a 20 20   instructed...  
21a20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
21a30 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
21a40 65 78 69 73 74 73 20 3a 3a 6e 6f 28 6c 6f 61 64  exists ::no(load
21a50 53 71 6c 69 74 65 46 69 6c 65 73 29 5d 7d 20 74  SqliteFiles)]} t
21a60 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
21a70 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
21a80 69 73 74 73 20 3a 3a 6e 6f 28 6c 6f 61 64 53 71  ists ::no(loadSq
21a90 6c 69 74 65 49 6d 70 6c 69 63 69 74 46 69 6c 65  liteImplicitFile
21aa0 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  s)]} then {..   
21ab0 20 20 20 20 20 20 20 20 20 20 20 74 72 79 4c 6f             tryLo
21ac0 61 64 41 73 73 65 6d 62 6c 79 20 53 79 73 74 65  adAssembly Syste
21ad0 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c  m.Data.SQLite.dl
21ae0 6c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  l..            }
21af0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
21b00 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
21b10 73 20 3a 3a 6e 6f 28 6c 6f 61 64 53 71 6c 69 74  s ::no(loadSqlit
21b20 65 4c 69 6e 71 46 69 6c 65 73 29 5d 7d 20 74 68  eLinqFiles)]} th
21b30 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
21b40 20 20 20 20 74 72 79 4c 6f 61 64 41 73 73 65 6d      tryLoadAssem
21b50 62 6c 79 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  bly System.Data.
21b60 53 51 4c 69 74 65 2e 4c 69 6e 71 2e 64 6c 6c 0d  SQLite.Linq.dll.
21b70 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
21b80 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
21b90 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
21ba0 3a 3a 6e 6f 28 6c 6f 61 64 53 71 6c 69 74 65 45  ::no(loadSqliteE
21bb0 66 36 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20  f6Files)]} then 
21bc0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
21bd0 20 74 72 79 4c 6f 61 64 41 73 73 65 6d 62 6c 79   tryLoadAssembly
21be0 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
21bf0 69 74 65 2e 45 46 36 2e 64 6c 6c 0d 0a 20 20 20  ite.EF6.dll..   
21c00 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
21c10 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
21c20 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
21c30 28 6c 6f 61 64 53 71 6c 69 74 65 4e 6f 6e 49 6d  (loadSqliteNonIm
21c40 70 6c 69 63 69 74 46 69 6c 65 73 29 5d 7d 20 74  plicitFiles)]} t
21c50 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
21c60 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
21c70 65 78 69 73 74 73 20 3a 3a 6e 6f 28 6c 6f 61 64  exists ::no(load
21c80 53 71 6c 69 74 65 50 6c 61 74 66 6f 72 6d 46 69  SqlitePlatformFi
21c90 6c 65 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20  les)] && \..    
21ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 73                [s
21cb0 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 70 6c  tring length $pl
21cc0 61 74 66 6f 72 6d 5d 20 3e 20 30 7d 20 74 68 65  atform] > 0} the
21cd0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
21ce0 20 20 20 20 20 74 72 79 4c 6f 61 64 41 73 73 65       tryLoadAsse
21cf0 6d 62 6c 79 20 53 79 73 74 65 6d 2e 44 61 74 61  mbly System.Data
21d00 2e 53 51 4c 69 74 65 2e 64 6c 6c 20 24 70 6c 61  .SQLite.dll $pla
21d10 74 66 6f 72 6d 0d 0a 20 20 20 20 20 20 20 20 20  tform..         
21d20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
21d30 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
21d40 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 6c  fo exists ::no(l
21d50 6f 61 64 53 71 6c 69 74 65 41 72 63 68 69 74 65  oadSqliteArchite
21d60 63 74 75 72 65 46 69 6c 65 73 29 5d 20 26 26 20  ctureFiles)] && 
21d70 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
21d80 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
21d90 67 74 68 20 24 61 72 63 68 69 74 65 63 74 75 72  gth $architectur
21da0 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  e] > 0} then {..
21db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21dc0 74 72 79 4c 6f 61 64 41 73 73 65 6d 62 6c 79 20  tryLoadAssembly 
21dd0 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
21de0 74 65 2e 64 6c 6c 20 24 61 72 63 68 69 74 65 63  te.dll $architec
21df0 74 75 72 65 0d 0a 20 20 20 20 20 20 20 20 20 20  ture..          
21e00 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
21e10 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
21e20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  }..        }....
21e30 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
21e40 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 5b 67 65  fileNameOnly [ge
21e50 74 4e 61 74 69 76 65 4c 69 62 72 61 72 79 46 69  tNativeLibraryFi
21e60 6c 65 4e 61 6d 65 73 4f 6e 6c 79 5d 20 7b 0d 0a  leNamesOnly] {..
21e70 20 20 20 20 20 20 20 20 20 20 63 61 74 63 68 20            catch 
21e80 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
21e90 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
21ea0 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
21eb0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
21ec0 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76      "---- file v
21ed0 65 72 73 69 6f 6e 20 6f 66 20 5c 22 22 20 24 66  ersion of \"" $f
21ee0 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 22 5c 22 2e  ileNameOnly "\".
21ef0 2e 2e 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20  .. \"" \..      
21f00 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20            [file 
21f10 76 65 72 73 69 6f 6e 20 5b 67 65 74 42 69 6e 61  version [getBina
21f20 72 79 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65  ryFileName $file
21f30 4e 61 6d 65 4f 6e 6c 79 5d 5d 20 5c 22 5c 6e 5d  NameOnly]] \"\n]
21f40 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
21f50 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
21f60 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65      foreach file
21f70 4e 61 6d 65 4f 6e 6c 79 20 5b 67 65 74 49 6e 74  NameOnly [getInt
21f80 65 72 6f 70 41 73 73 65 6d 62 6c 79 46 69 6c 65  eropAssemblyFile
21f90 4e 61 6d 65 73 4f 6e 6c 79 5d 20 7b 0d 0a 20 20  NamesOnly] {..  
21fa0 20 20 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d          catch {.
21fb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
21fc0 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
21fd0 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
21fe0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
21ff0 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72    "---- file ver
22000 73 69 6f 6e 20 6f 66 20 5c 22 22 20 24 66 69 6c  sion of \"" $fil
22010 65 4e 61 6d 65 4f 6e 6c 79 20 22 5c 22 2e 2e 2e  eNameOnly "\"...
22020 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20   \"" \..        
22030 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 76 65          [file ve
22040 72 73 69 6f 6e 20 5b 67 65 74 42 69 6e 61 72 79  rsion [getBinary
22050 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61  FileName $fileNa
22060 6d 65 4f 6e 6c 79 5d 5d 20 5c 22 5c 6e 5d 0d 0a  meOnly]] \"\n]..
22070 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
22080 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
22090 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20    catch {..     
220a0 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
220b0 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
220c0 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
220d0 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69          "---- fi
220e0 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22  le version of \"
220f0 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
22100 74 65 2e 64 6c 6c 5c 22 2e 2e 2e 20 5c 22 22 20  te.dll\"... \"" 
22110 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
22120 20 5b 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 5b   [file version [
22130 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d  getBinaryFileNam
22140 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  e System.Data.SQ
22150 4c 69 74 65 2e 64 6c 6c 5d 5d 20 5c 22 5c 6e 5d  Lite.dll]] \"\n]
22160 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
22170 20 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a         catch {..
22180 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
22190 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
221a0 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
221b0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
221c0 2d 2d 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 20  -- file version 
221d0 6f 66 20 5c 22 53 79 73 74 65 6d 2e 44 61 74 61  of \"System.Data
221e0 2e 53 51 4c 69 74 65 2e 4c 69 6e 71 2e 64 6c 6c  .SQLite.Linq.dll
221f0 5c 22 2e 2e 2e 20 5c 22 22 20 5c 0d 0a 20 20 20  \"... \"" \..   
22200 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65             [file
22210 20 76 65 72 73 69 6f 6e 20 5b 67 65 74 42 69 6e   version [getBin
22220 61 72 79 46 69 6c 65 4e 61 6d 65 20 53 79 73 74  aryFileName Syst
22230 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 4c  em.Data.SQLite.L
22240 69 6e 71 2e 64 6c 6c 5d 5d 20 5c 0d 0a 20 20 20  inq.dll]] \..   
22250 20 20 20 20 20 20 20 20 20 20 20 5c 22 5c 6e 5d             \"\n]
22260 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
22270 20 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a         catch {..
22280 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
22290 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
222a0 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
222b0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
222c0 2d 2d 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 20  -- file version 
222d0 6f 66 20 5c 22 53 79 73 74 65 6d 2e 44 61 74 61  of \"System.Data
222e0 2e 53 51 4c 69 74 65 2e 45 46 36 2e 64 6c 6c 5c  .SQLite.EF6.dll\
222f0 22 2e 2e 2e 20 5c 22 22 20 5c 0d 0a 20 20 20 20  "... \"" \..    
22300 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20            [file 
22310 76 65 72 73 69 6f 6e 20 5b 67 65 74 42 69 6e 61  version [getBina
22320 72 79 46 69 6c 65 4e 61 6d 65 20 53 79 73 74 65  ryFileName Syste
22330 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 45 46  m.Data.SQLite.EF
22340 36 2e 64 6c 6c 5d 5d 20 5c 0d 0a 20 20 20 20 20  6.dll]] \..     
22350 20 20 20 20 20 20 20 20 20 5c 22 5c 6e 5d 0d 0a           \"\n]..
22360 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
22370 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
22380 20 6c 65 6e 67 74 68 20 24 70 6c 61 74 66 6f 72   length $platfor
22390 6d 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  m] > 0} then {..
223a0 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63            foreac
223b0 68 20 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 5b  h fileNameOnly [
223c0 67 65 74 4e 61 74 69 76 65 4c 69 62 72 61 72 79  getNativeLibrary
223d0 46 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79 5d 20 7b  FileNamesOnly] {
223e0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 61  ..            ca
223f0 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
22400 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
22410 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
22420 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
22430 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
22440 2d 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f  - file version o
22450 66 20 5c 22 22 20 24 70 6c 61 74 66 6f 72 6d 20  f \"" $platform 
22460 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
22470 20 20 20 20 20 2f 20 24 66 69 6c 65 4e 61 6d 65       / $fileName
22480 4f 6e 6c 79 20 22 5c 22 2e 2e 2e 20 5c 22 22 20  Only "\"... \"" 
22490 5b 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 5c 0d  [file version \.
224a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
224b0 20 20 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c     [getBinaryFil
224c0 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 4f  eName $fileNameO
224d0 6e 6c 79 20 24 70 6c 61 74 66 6f 72 6d 5d 5d 20  nly $platform]] 
224e0 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  \"\n]..         
224f0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
22500 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 66  }....          f
22510 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 4f  oreach fileNameO
22520 6e 6c 79 20 5b 67 65 74 49 6e 74 65 72 6f 70 41  nly [getInteropA
22530 73 73 65 6d 62 6c 79 46 69 6c 65 4e 61 6d 65 73  ssemblyFileNames
22540 4f 6e 6c 79 5d 20 7b 0d 0a 20 20 20 20 20 20 20  Only] {..       
22550 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20       catch {..  
22560 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
22570 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
22580 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
22590 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
225a0 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65     "---- file ve
225b0 72 73 69 6f 6e 20 6f 66 20 5c 22 22 20 24 70 6c  rsion of \"" $pl
225c0 61 74 66 6f 72 6d 20 5c 0d 0a 20 20 20 20 20 20  atform \..      
225d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 20 24 66              / $f
225e0 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 22 5c 22 2e  ileNameOnly "\".
225f0 2e 2e 20 5c 22 22 20 5b 66 69 6c 65 20 76 65 72  .. \"" [file ver
22600 73 69 6f 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20  sion \..        
22610 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 42 69            [getBi
22620 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 24 66 69  naryFileName $fi
22630 6c 65 4e 61 6d 65 4f 6e 6c 79 20 24 70 6c 61 74  leNameOnly $plat
22640 66 6f 72 6d 5d 5d 20 5c 22 5c 6e 5d 0d 0a 20 20  form]] \"\n]..  
22650 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
22660 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
22670 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20        catch {.. 
22680 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
22690 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
226a0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
226b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
226c0 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73 69  "---- file versi
226d0 6f 6e 20 6f 66 20 5c 22 22 20 24 70 6c 61 74 66  on of \"" $platf
226e0 6f 72 6d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  orm \..         
226f0 20 20 20 20 20 20 20 22 2f 53 79 73 74 65 6d 2e         "/System.
22700 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 5c  Data.SQLite.dll\
22710 22 2e 2e 2e 20 5c 22 22 20 5b 66 69 6c 65 20 76  "... \"" [file v
22720 65 72 73 69 6f 6e 20 5c 0d 0a 20 20 20 20 20 20  ersion \..      
22730 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 42 69            [getBi
22740 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 53 79 73  naryFileName Sys
22750 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
22760 64 6c 6c 20 24 70 6c 61 74 66 6f 72 6d 5d 5d 20  dll $platform]] 
22770 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  \"\n]..         
22780 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d   }..        }...
22790 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74  .        if {[st
227a0 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 61 72 63  ring length $arc
227b0 68 69 74 65 63 74 75 72 65 5d 20 3e 20 30 7d 20  hitecture] > 0} 
227c0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
227d0 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61    foreach fileNa
227e0 6d 65 4f 6e 6c 79 20 5b 67 65 74 4e 61 74 69 76  meOnly [getNativ
227f0 65 4c 69 62 72 61 72 79 46 69 6c 65 4e 61 6d 65  eLibraryFileName
22800 73 4f 6e 6c 79 5d 20 7b 0d 0a 20 20 20 20 20 20  sOnly] {..      
22810 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20        catch {.. 
22820 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
22830 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
22840 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
22850 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
22860 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76      "---- file v
22870 65 72 73 69 6f 6e 20 6f 66 20 5c 22 22 20 24 61  ersion of \"" $a
22880 72 63 68 69 74 65 63 74 75 72 65 20 5c 0d 0a 20  rchitecture \.. 
22890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
228a0 20 2f 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79   / $fileNameOnly
228b0 20 22 5c 22 2e 2e 2e 20 5c 22 22 20 5b 66 69 6c   "\"... \"" [fil
228c0 65 20 76 65 72 73 69 6f 6e 20 5c 0d 0a 20 20 20  e version \..   
228d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b                 [
228e0 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d  getBinaryFileNam
228f0 65 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20  e $fileNameOnly 
22900 24 61 72 63 68 69 74 65 63 74 75 72 65 5d 5d 20  $architecture]] 
22910 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  \"\n]..         
22920 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
22930 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 63  }....          c
22940 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
22950 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
22960 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
22970 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
22980 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66           "---- f
22990 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c  ile version of \
229a0 22 22 20 24 61 72 63 68 69 74 65 63 74 75 72 65  "" $architecture
229b0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
229c0 20 20 20 20 2f 20 24 66 69 6c 65 4e 61 6d 65 4f      / $fileNameO
229d0 6e 6c 79 20 22 5c 22 2e 2e 2e 20 5c 22 22 20 5b  nly "\"... \"" [
229e0 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 5c 0d 0a  file version \..
229f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22a00 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61  [getBinaryFileNa
22a10 6d 65 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79  me $fileNameOnly
22a20 20 24 61 72 63 68 69 74 65 63 74 75 72 65 5d 5d   $architecture]]
22a30 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20   \"\n]..        
22a40 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
22a50 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20   catch {..      
22a60 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
22a70 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
22a80 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
22a90 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
22aa0 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66   file version of
22ab0 20 5c 22 22 20 24 61 72 63 68 69 74 65 63 74 75   \"" $architectu
22ac0 72 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  re \..          
22ad0 20 20 20 20 20 20 22 2f 53 79 73 74 65 6d 2e 44        "/System.D
22ae0 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 5c 22  ata.SQLite.dll\"
22af0 2e 2e 2e 20 5c 22 22 20 5b 66 69 6c 65 20 76 65  ... \"" [file ve
22b00 72 73 69 6f 6e 20 5c 0d 0a 20 20 20 20 20 20 20  rsion \..       
22b10 20 20 20 20 20 20 20 20 20 5b 67 65 74 42 69 6e           [getBin
22b20 61 72 79 46 69 6c 65 4e 61 6d 65 20 53 79 73 74  aryFileName Syst
22b30 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64  em.Data.SQLite.d
22b40 6c 6c 20 24 61 72 63 68 69 74 65 63 74 75 72 65  ll $architecture
22b50 5d 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ]] \..          
22b60 20 20 20 20 20 20 5c 22 5c 6e 5d 0d 0a 20 20 20        \"\n]..   
22b70 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
22b80 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23    }....        #
22b90 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
22ba0 3a 20 47 72 61 62 20 74 68 65 20 6c 69 73 74 20  : Grab the list 
22bb0 6f 66 20 6d 61 6e 61 67 65 64 20 61 73 73 65 6d  of managed assem
22bc0 62 6c 69 65 73 20 66 6f 72 20 74 68 65 20 63 75  blies for the cu
22bd0 72 72 65 6e 74 20 70 72 6f 63 65 73 73 0d 0a 20  rrent process.. 
22be0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61         #       a
22bf0 6e 64 20 72 65 70 6f 72 74 20 6f 6e 20 74 68 65  nd report on the
22c00 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
22c10 69 74 65 20 72 65 6c 61 74 65 64 20 6f 6e 65 73  ite related ones
22c20 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
22c30 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65 53        if {[haveS
22c40 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61  QLiteObjectComma
22c50 6e 64 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  nd]} then {..   
22c60 20 20 20 20 20 20 20 73 65 74 20 61 73 73 65 6d         set assem
22c70 62 6c 69 65 73 20 5b 6f 62 6a 65 63 74 20 69 6e  blies [object in
22c80 76 6f 6b 65 20 41 70 70 44 6f 6d 61 69 6e 2e 43  voke AppDomain.C
22c90 75 72 72 65 6e 74 44 6f 6d 61 69 6e 20 47 65 74  urrentDomain Get
22ca0 41 73 73 65 6d 62 6c 69 65 73 5d 0d 0a 0d 0a 20  Assemblies].... 
22cb0 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20           object 
22cc0 66 6f 72 65 61 63 68 20 61 73 73 65 6d 62 6c 79  foreach assembly
22cd0 20 24 61 73 73 65 6d 62 6c 69 65 73 20 7b 0d 0a   $assemblies {..
22ce0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
22cf0 5b 73 74 72 69 6e 67 20 6d 61 74 63 68 20 5c 7b  [string match \{
22d00 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
22d10 74 65 2a 20 24 61 73 73 65 6d 62 6c 79 5d 7d 20  te* $assembly]} 
22d20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
22d30 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
22d40 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
22d50 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
22d60 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
22d70 2d 2d 20 66 6f 75 6e 64 20 6c 6f 61 64 65 64 20  -- found loaded 
22d80 61 73 73 65 6d 62 6c 79 3a 20 22 20 24 61 73 73  assembly: " $ass
22d90 65 6d 62 6c 79 20 5c 6e 5d 0d 0a 20 20 20 20 20  embly \n]..     
22da0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
22db0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
22dc0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63 61 74 63  ....        catc
22dd0 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74  h {..          t
22de0 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
22df0 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20  nnel \..        
22e00 20 20 20 20 20 20 22 2d 2d 2d 2d 20 64 65 66 69        "---- defi
22e10 6e 65 20 63 6f 6e 73 74 61 6e 74 73 20 66 6f 72  ne constants for
22e20 20 5c 22 53 79 73 74 65 6d 2e 44 61 74 61 2e 53   \"System.Data.S
22e30 51 4c 69 74 65 5c 22 2e 2e 2e 20 22 0d 0a 0d 0a  QLite\"... "....
22e40 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63            if {[c
22e50 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
22e60 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b      object invok
22e70 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62  e -flags +NonPub
22e80 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  lic \..         
22e90 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61         System.Da
22ea0 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65  ta.SQLite.SQLite
22eb0 33 20 44 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74  3 DefineConstant
22ec0 73 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 64  s..          } d
22ed0 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 73 5d 20  efineConstants] 
22ee0 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
22ef0 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
22f00 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
22f10 5b 61 70 70 65 6e 64 41 72 67 73 20 5b 66 6f 72  [appendArgs [for
22f20 6d 61 74 4c 69 73 74 20 5b 6c 73 6f 72 74 20 5c  matList [lsort \
22f30 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
22f40 20 20 24 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e    $defineConstan
22f50 74 73 5d 20 3c 6e 6f 6e 65 3e 5d 20 5c 6e 5d 0d  ts] <none>] \n].
22f60 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73  .          } els
22f70 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e {..           
22f80 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
22f90 68 61 6e 6e 65 6c 20 75 6e 6b 6e 6f 77 6e 5c 6e  hannel unknown\n
22fa0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
22fb0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
22fc0 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20      catch {..   
22fd0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
22fe0 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a  test_channel \..
22ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
23000 2d 2d 2d 20 73 6f 75 72 63 65 20 76 65 72 73 69  --- source versi
23010 6f 6e 20 6f 66 20 5c 22 53 79 73 74 65 6d 2e 44  on of \"System.D
23020 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 5c 22  ata.SQLite.dll\"
23030 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 20  ... "....       
23040 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d     if {[catch {.
23050 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a  .            obj
23060 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67  ect invoke -flag
23070 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a  s +NonPublic \..
23080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23090 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
230a0 74 65 2e 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74  te.SQLiteConnect
230b0 69 6f 6e 20 50 72 6f 76 69 64 65 72 56 65 72 73  ion ProviderVers
230c0 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  ion..          }
230d0 20 76 65 72 73 69 6f 6e 5d 20 3d 3d 20 30 7d 20   version] == 0} 
230e0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
230f0 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
23100 6c 65 6e 67 74 68 20 24 76 65 72 73 69 6f 6e 5d  length $version]
23110 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
23120 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74               set
23130 20 76 65 72 73 69 6f 6e 20 6e 75 6c 6c 0d 0a 20   version null.. 
23140 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
23150 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
23160 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
23170 5b 61 70 70 65 6e 64 41 72 67 73 20 24 76 65 72  [appendArgs $ver
23180 73 69 6f 6e 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  sion \n]..      
23190 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
231a0 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
231b0 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
231c0 75 6e 6b 6e 6f 77 6e 5c 6e 0d 0a 20 20 20 20 20  unknown\n..     
231d0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
231e0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63 61 74  }....        cat
231f0 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
23200 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
23210 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20  annel \..       
23220 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6f 75         "---- sou
23230 72 63 65 20 63 68 65 63 6b 6f 75 74 20 6f 66 20  rce checkout of 
23240 5c 22 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  \"System.Data.SQ
23250 4c 69 74 65 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 0d  Lite.dll\"... ".
23260 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  ...          if 
23270 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
23280 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e         object in
23290 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e  voke -flags +Non
232a0 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20  Public \..      
232b0 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d            System
232c0 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c  .Data.SQLite.SQL
232d0 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 50 72  iteConnection Pr
232e0 6f 76 69 64 65 72 53 6f 75 72 63 65 49 64 0d 0a  oviderSourceId..
232f0 20 20 20 20 20 20 20 20 20 20 7d 20 73 6f 75 72            } sour
23300 63 65 49 64 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  ceId] == 0} then
23310 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
23320 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
23330 74 68 20 24 73 6f 75 72 63 65 49 64 5d 20 3d 3d  th $sourceId] ==
23340 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
23350 20 20 20 20 20 20 20 20 20 20 73 65 74 20 73 6f            set so
23360 75 72 63 65 49 64 20 6e 75 6c 6c 0d 0a 20 20 20  urceId null..   
23370 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
23380 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
23390 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
233a0 70 70 65 6e 64 41 72 67 73 20 24 73 6f 75 72 63  ppendArgs $sourc
233b0 65 49 64 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  eId \n]..       
233c0 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
233d0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
233e0 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 75  ::test_channel u
233f0 6e 6b 6e 6f 77 6e 5c 6e 0d 0a 20 20 20 20 20 20  nknown\n..      
23400 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
23410 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
23420 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43         # NOTE: C
23430 68 65 63 6b 20 74 68 65 20 61 76 61 69 6c 61 62  heck the availab
23440 6c 65 20 62 75 69 6c 64 73 20 28 61 6e 64 20 22  le builds (and "
23450 72 65 6c 65 61 73 65 73 22 29 20 6f 66 20 53 51  releases") of SQ
23460 4c 69 74 65 20 61 6e 64 0d 0a 20 20 20 20 20 20  Lite and..      
23470 20 20 23 20 20 20 20 20 20 20 53 79 73 74 65 6d    #       System
23480 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 0d 0a 20  .Data.SQLite... 
23490 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
234a0 20 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65    checkForSQLite
234b0 42 75 69 6c 64 73 20 24 3a 3a 74 65 73 74 5f 63  Builds $::test_c
234c0 68 61 6e 6e 65 6c 0d 0a 20 20 20 20 20 20 20 20  hannel..        
234d0 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 52 65  checkForSQLiteRe
234e0 6c 65 61 73 65 73 20 24 3a 3a 74 65 73 74 5f 63  leases $::test_c
234f0 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20 20  hannel....      
23500 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
23510 4f 54 45 3a 20 4e 6f 77 2c 20 77 65 20 6e 65 65  OTE: Now, we nee
23520 64 20 74 6f 20 6b 6e 6f 77 20 69 66 20 74 68 65  d to know if the
23530 20 53 51 4c 69 74 65 20 63 6f 72 65 20 6c 69 62   SQLite core lib
23540 72 61 72 79 20 69 73 20 61 76 61 69 6c 61 62 6c  rary is availabl
23550 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
23560 20 20 20 28 69 2e 65 2e 20 62 65 63 61 75 73 65     (i.e. because
23570 20 74 68 65 20 6d 61 6e 61 67 65 64 2d 6f 6e 6c   the managed-onl
23580 79 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  y System.Data.SQ
23590 4c 69 74 65 20 61 73 73 65 6d 62 6c 79 20 63 61  Lite assembly ca
235a0 6e 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  n..        #    
235b0 20 20 20 6c 6f 61 64 20 77 69 74 68 6f 75 74 20     load without 
235c0 69 74 3b 20 68 6f 77 65 76 65 72 2c 20 69 74 20  it; however, it 
235d0 63 61 6e 6e 6f 74 20 64 6f 20 61 6e 79 74 68 69  cannot do anythi
235e0 6e 67 20 75 73 65 66 75 6c 20 77 69 74 68 6f 75  ng useful withou
235f0 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  t..        #    
23600 20 20 20 69 74 29 2e 20 20 49 66 20 77 65 20 61     it).  If we a
23610 72 65 20 75 73 69 6e 67 20 74 68 65 20 6d 69 78  re using the mix
23620 65 64 2d 6d 6f 64 65 20 61 73 73 65 6d 62 6c 79  ed-mode assembly
23630 20 61 6e 64 20 77 65 20 61 6c 72 65 61 64 79 0d   and we already.
23640 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
23650 20 66 6f 75 6e 64 20 69 74 20 28 61 62 6f 76 65   found it (above
23660 29 2c 20 74 68 69 73 20 73 68 6f 75 6c 64 20 61  ), this should a
23670 6c 77 61 79 73 20 73 75 63 63 65 65 64 2e 0d 0a  lways succeed...
23680 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
23690 20 20 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74     checkForSQLit
236a0 65 4c 69 62 72 61 72 79 20 24 3a 3a 74 65 73 74  eLibrary $::test
236b0 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20  _channel....    
236c0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
236d0 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20   NOTE: Check if 
236e0 74 68 65 20 53 51 4c 69 74 65 20 69 6e 74 65 72  the SQLite inter
236f0 6f 70 20 61 73 73 65 6d 62 6c 79 20 69 73 20 61  op assembly is a
23700 76 61 69 6c 61 62 6c 65 2e 0d 0a 20 20 20 20 20  vailable...     
23710 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 63 68     #..        ch
23720 65 63 6b 46 6f 72 53 51 4c 69 74 65 49 6e 74 65  eckForSQLiteInte
23730 72 6f 70 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  rop $::test_chan
23740 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23  nel....        #
23750 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
23760 3a 20 43 68 65 63 6b 20 74 68 65 20 53 51 4c 69  : Check the SQLi
23770 74 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  te database and 
23780 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74  temporary direct
23790 6f 72 69 65 73 2e 0d 0a 20 20 20 20 20 20 20 20  ories...        
237a0 23 0d 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b  #..        check
237b0 46 6f 72 53 51 4c 69 74 65 44 69 72 65 63 74 6f  ForSQLiteDirecto
237c0 72 69 65 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  ries $::test_cha
237d0 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20 20 20 20  nnel....        
237e0 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
237f0 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 64 65  E: Attempt to de
23800 74 65 72 6d 69 6e 65 20 69 66 20 76 61 72 69 6f  termine if vario
23810 75 73 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  us compile-time 
23820 6f 70 74 69 6f 6e 73 20 6e 65 65 64 65 64 20 66  options needed f
23830 6f 72 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  or..        #   
23840 20 20 20 20 74 65 73 74 20 63 6f 6e 73 74 72 61      test constra
23850 69 6e 74 73 20 77 65 72 65 20 65 6e 61 62 6c 65  ints were enable
23860 64 20 66 6f 72 20 74 68 65 20 6d 61 6e 61 67 65  d for the manage
23870 64 20 61 73 73 65 6d 62 6c 79 2e 20 20 54 68 65  d assembly.  The
23880 72 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  re..        #   
23890 20 20 20 20 61 72 65 20 73 6f 6d 65 20 63 6f 6d      are some com
238a0 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e  pile-time option
238b0 73 20 74 68 61 74 20 6d 75 73 74 20 61 6c 73 6f  s that must also
238c0 20 68 61 76 65 20 62 65 65 6e 20 65 6e 61 62 6c   have been enabl
238d0 65 64 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ed..        #   
238e0 20 20 20 20 66 6f 72 20 74 68 65 20 69 6e 74 65      for the inte
238f0 72 6f 70 20 61 73 73 65 6d 62 6c 79 20 69 6e 20  rop assembly in 
23900 6f 72 64 65 72 20 74 6f 20 62 65 20 65 66 66 65  order to be effe
23910 63 74 69 76 65 2e 20 20 46 6f 72 20 74 68 6f 73  ctive.  For thos
23920 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
23930 20 20 20 6f 70 74 69 6f 6e 73 2c 20 69 74 20 77     options, it w
23940 69 6c 6c 20 62 65 20 61 73 73 75 6d 65 64 20 74  ill be assumed t
23950 68 61 74 20 69 74 20 77 61 73 20 65 6e 61 62 6c  hat it was enabl
23960 65 64 20 66 6f 72 20 74 68 65 20 69 6e 74 65 72  ed for the inter
23970 6f 70 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  op..        #   
23980 20 20 20 20 61 73 73 65 6d 62 6c 79 20 69 66 20      assembly if 
23990 69 74 20 77 61 73 20 65 6e 61 62 6c 65 64 20 66  it was enabled f
239a0 6f 72 20 74 68 65 20 6d 61 6e 61 67 65 64 20 61  or the managed a
239b0 73 73 65 6d 62 6c 79 2e 0d 0a 20 20 20 20 20 20  ssembly...      
239c0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 66 6f 72    #..        for
239d0 65 61 63 68 20 64 65 66 69 6e 65 43 6f 6e 73 74  each defineConst
239e0 61 6e 74 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20  ant [list \..   
239f0 20 20 20 20 20 20 20 20 20 43 48 45 43 4b 5f 53           CHECK_S
23a00 54 41 54 45 20 43 4f 55 4e 54 5f 48 41 4e 44 4c  TATE COUNT_HANDL
23a10 45 20 44 45 42 55 47 20 49 4e 54 45 52 4f 50 5f  E DEBUG INTEROP_
23a20 43 4f 44 45 43 20 49 4e 54 45 52 4f 50 5f 44 45  CODEC INTEROP_DE
23a30 42 55 47 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  BUG \..         
23a40 20 20 20 49 4e 54 45 52 4f 50 5f 45 58 54 45 4e     INTEROP_EXTEN
23a50 53 49 4f 4e 5f 46 55 4e 43 54 49 4f 4e 53 20 49  SION_FUNCTIONS I
23a60 4e 54 45 52 4f 50 5f 46 54 53 35 5f 45 58 54 45  NTEROP_FTS5_EXTE
23a70 4e 53 49 4f 4e 20 5c 0d 0a 20 20 20 20 20 20 20  NSION \..       
23a80 20 20 20 20 20 49 4e 54 45 52 4f 50 5f 49 4e 43       INTEROP_INC
23a90 4c 55 44 45 5f 43 45 52 4f 44 20 49 4e 54 45 52  LUDE_CEROD INTER
23aa0 4f 50 5f 49 4e 43 4c 55 44 45 5f 45 58 54 52 41  OP_INCLUDE_EXTRA
23ab0 20 49 4e 54 45 52 4f 50 5f 49 4e 43 4c 55 44 45   INTEROP_INCLUDE
23ac0 5f 53 45 45 20 5c 0d 0a 20 20 20 20 20 20 20 20  _SEE \..        
23ad0 20 20 20 20 49 4e 54 45 52 4f 50 5f 49 4e 43 4c      INTEROP_INCL
23ae0 55 44 45 5f 5a 49 50 56 46 53 20 49 4e 54 45 52  UDE_ZIPVFS INTER
23af0 4f 50 5f 4a 53 4f 4e 31 5f 45 58 54 45 4e 53 49  OP_JSON1_EXTENSI
23b00 4f 4e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ON \..          
23b10 20 20 49 4e 54 45 52 4f 50 5f 4c 45 47 41 43 59    INTEROP_LEGACY
23b20 5f 43 4c 4f 53 45 20 49 4e 54 45 52 4f 50 5f 4c  _CLOSE INTEROP_L
23b30 4f 47 20 49 4e 54 45 52 4f 50 5f 50 45 52 43 45  OG INTEROP_PERCE
23b40 4e 54 49 4c 45 5f 45 58 54 45 4e 53 49 4f 4e 20  NTILE_EXTENSION 
23b50 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 49  \..            I
23b60 4e 54 45 52 4f 50 5f 52 45 47 45 58 50 5f 45 58  NTEROP_REGEXP_EX
23b70 54 45 4e 53 49 4f 4e 20 49 4e 54 45 52 4f 50 5f  TENSION INTEROP_
23b80 54 45 53 54 5f 45 58 54 45 4e 53 49 4f 4e 20 5c  TEST_EXTENSION \
23b90 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 49 4e  ..            IN
23ba0 54 45 52 4f 50 5f 54 4f 54 59 50 45 5f 45 58 54  TEROP_TOTYPE_EXT
23bb0 45 4e 53 49 4f 4e 20 49 4e 54 45 52 4f 50 5f 56  ENSION INTEROP_V
23bc0 49 52 54 55 41 4c 5f 54 41 42 4c 45 20 4e 45 54  IRTUAL_TABLE NET
23bd0 5f 32 30 20 4e 45 54 5f 33 35 20 5c 0d 0a 20 20  _20 NET_35 \..  
23be0 20 20 20 20 20 20 20 20 20 20 4e 45 54 5f 34 30            NET_40
23bf0 20 4e 45 54 5f 34 35 20 4e 45 54 5f 34 35 31 20   NET_45 NET_451 
23c00 4e 45 54 5f 34 35 32 20 4e 45 54 5f 34 36 20 4e  NET_452 NET_46 N
23c10 45 54 5f 34 36 31 20 4e 45 54 5f 43 4f 4d 50 41  ET_461 NET_COMPA
23c20 43 54 5f 32 30 20 5c 0d 0a 20 20 20 20 20 20 20  CT_20 \..       
23c30 20 20 20 20 20 50 4c 41 54 46 4f 52 4d 5f 43 4f       PLATFORM_CO
23c40 4d 50 41 43 54 46 52 41 4d 45 57 4f 52 4b 20 50  MPACTFRAMEWORK P
23c50 52 45 4c 4f 41 44 5f 4e 41 54 49 56 45 5f 4c 49  RELOAD_NATIVE_LI
23c60 42 52 41 52 59 20 52 45 54 41 52 47 45 54 41 42  BRARY RETARGETAB
23c70 4c 45 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  LE \..          
23c80 20 20 53 51 4c 49 54 45 5f 53 54 41 4e 44 41 52    SQLITE_STANDAR
23c90 44 20 54 48 52 4f 57 5f 4f 4e 5f 44 49 53 50 4f  D THROW_ON_DISPO
23ca0 53 45 44 20 54 52 41 43 45 20 54 52 41 43 45 5f  SED TRACE TRACE_
23cb0 43 4f 4e 4e 45 43 54 49 4f 4e 20 5c 0d 0a 20 20  CONNECTION \..  
23cc0 20 20 20 20 20 20 20 20 20 20 54 52 41 43 45 5f            TRACE_
23cd0 44 45 54 45 43 54 49 4f 4e 20 54 52 41 43 45 5f  DETECTION TRACE_
23ce0 48 41 4e 44 4c 45 20 54 52 41 43 45 5f 50 52 45  HANDLE TRACE_PRE
23cf0 4c 4f 41 44 20 54 52 41 43 45 5f 53 48 41 52 45  LOAD TRACE_SHARE
23d00 44 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  D \..           
23d10 20 54 52 41 43 45 5f 53 54 41 54 45 4d 45 4e 54   TRACE_STATEMENT
23d20 20 54 52 41 43 45 5f 57 41 52 4e 49 4e 47 20 54   TRACE_WARNING T
23d30 52 41 43 4b 5f 4d 45 4d 4f 52 59 5f 42 59 54 45  RACK_MEMORY_BYTE
23d40 53 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  S \..           
23d50 20 55 53 45 5f 45 4e 54 49 54 59 5f 46 52 41 4d   USE_ENTITY_FRAM
23d60 45 57 4f 52 4b 5f 36 20 55 53 45 5f 49 4e 54 45  EWORK_6 USE_INTE
23d70 52 4f 50 5f 44 4c 4c 20 55 53 45 5f 50 52 45 50  ROP_DLL USE_PREP
23d80 41 52 45 5f 56 32 20 57 49 4e 44 4f 57 53 5d 20  ARE_V2 WINDOWS] 
23d90 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  {..          #..
23da0 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
23db0 3a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 63  : Check if the c
23dc0 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69  ompile-time opti
23dd0 6f 6e 20 69 73 20 6c 69 73 74 65 64 20 69 6e 20  on is listed in 
23de0 74 68 65 20 6c 69 73 74 20 6f 66 0d 0a 20 20 20  the list of..   
23df0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 22         #       "
23e00 64 65 66 69 6e 65 20 63 6f 6e 73 74 61 6e 74 73  define constants
23e10 22 20 6b 65 70 74 20 74 72 61 63 6b 20 6f 66 20  " kept track of 
23e20 62 79 20 74 68 65 20 6d 61 6e 61 67 65 64 20 61  by the managed a
23e30 73 73 65 6d 62 6c 79 2e 0d 0a 20 20 20 20 20 20  ssembly...      
23e40 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
23e50 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 44   checkForSQLiteD
23e60 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 20 24 3a  efineConstant $:
23e70 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 64  :test_channel $d
23e80 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 0d 0a 20  efineConstant.. 
23e90 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
23ea0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
23eb0 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20   NOTE: Check if 
23ec0 74 68 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  the System.Data.
23ed0 53 51 4c 69 74 65 20 70 72 6f 76 69 64 65 72 20  SQLite provider 
23ee0 77 61 73 20 63 6f 6d 70 69 6c 65 64 20 77 69 74  was compiled wit
23ef0 68 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  h..        #    
23f00 20 20 20 73 75 70 70 6f 72 74 20 66 6f 72 20 61     support for a
23f10 6e 79 20 65 6e 63 72 79 70 74 65 64 20 64 61 74  ny encrypted dat
23f20 61 62 61 73 65 73 2e 0d 0a 20 20 20 20 20 20 20  abases...       
23f30 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   #..        if {
23f40 5b 68 61 76 65 53 51 4c 69 74 65 44 65 66 69 6e  [haveSQLiteDefin
23f50 65 43 6f 6e 73 74 61 6e 74 20 49 4e 54 45 52 4f  eConstant INTERO
23f60 50 5f 43 4f 44 45 43 5d 20 7c 7c 20 5c 0d 0a 20  P_CODEC] || \.. 
23f70 20 20 20 20 20 20 20 20 20 20 20 5b 68 61 76 65             [have
23f80 53 51 4c 69 74 65 44 65 66 69 6e 65 43 6f 6e 73  SQLiteDefineCons
23f90 74 61 6e 74 20 49 4e 54 45 52 4f 50 5f 49 4e 43  tant INTEROP_INC
23fa0 4c 55 44 45 5f 53 45 45 5d 7d 20 74 68 65 6e 20  LUDE_SEE]} then 
23fb0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  {..          #..
23fc0 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
23fd0 3a 20 59 65 73 2c 20 61 64 64 20 67 65 6e 65 72  : Yes, add gener
23fe0 69 63 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 6f  ic constraint fo
23ff0 72 20 75 73 65 20 62 79 20 74 68 65 20 74 65 73  r use by the tes
24000 74 20 73 75 69 74 65 2e 0d 0a 20 20 20 20 20 20  t suite...      
24010 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
24020 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 53   addConstraint S
24030 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
24040 65 2e 45 6e 63 72 79 70 74 69 6f 6e 0d 0a 20 20  e.Encryption..  
24050 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
24060 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
24070 4e 4f 54 45 3a 20 43 68 65 63 6b 20 74 68 65 20  NOTE: Check the 
24080 63 75 72 72 65 6e 74 20 62 75 69 6c 64 20 79 65  current build ye
24090 61 72 2e 20 20 42 61 73 69 63 61 6c 6c 79 2c 20  ar.  Basically, 
240a0 74 68 69 73 20 69 6e 64 69 63 61 74 65 73 0d 0a  this indicates..
240b0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
240c0 77 68 69 63 68 20 76 65 72 73 69 6f 6e 20 6f 66  which version of
240d0 20 4d 53 42 75 69 6c 64 20 61 6e 64 2f 6f 72 20   MSBuild and/or 
240e0 56 69 73 75 61 6c 20 53 74 75 64 69 6f 20 77 61  Visual Studio wa
240f0 73 20 75 73 65 64 20 74 6f 0d 0a 20 20 20 20 20  s used to..     
24100 20 20 20 23 20 20 20 20 20 20 20 63 6f 6d 70 69     #       compi
24110 6c 65 20 74 68 65 20 61 73 73 65 6d 62 6c 79 20  le the assembly 
24120 62 69 6e 61 72 69 65 73 20 75 6e 64 65 72 20 74  binaries under t
24130 65 73 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  est...        #.
24140 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
24150 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c  ::test_channel \
24160 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d  ..            "-
24170 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72  --- checking for
24180 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
24190 69 74 65 20 62 75 69 6c 64 20 79 65 61 72 2e 2e  ite build year..
241a0 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73  . "....        s
241b0 65 74 20 79 65 61 72 20 5b 67 65 74 42 75 69 6c  et year [getBuil
241c0 64 59 65 61 72 5d 0d 0a 20 20 20 20 20 20 20 20  dYear]..        
241d0 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61  addConstraint [a
241e0 70 70 65 6e 64 41 72 67 73 20 62 75 69 6c 64 59  ppendArgs buildY
241f0 65 61 72 2e 20 24 79 65 61 72 5d 0d 0a 20 20 20  ear. $year]..   
24200 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
24210 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
24220 6e 64 41 72 67 73 20 5c 22 20 24 79 65 61 72 20  ndArgs \" $year 
24230 5c 22 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  \"\n]....       
24240 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
24250 54 45 3a 20 43 68 65 63 6b 20 74 68 65 20 63 75  TE: Check the cu
24260 72 72 65 6e 74 20 62 75 69 6c 64 20 2e 4e 45 54  rrent build .NET
24270 20 46 72 61 6d 65 77 6f 72 6b 2e 20 20 42 61 73   Framework.  Bas
24280 69 63 61 6c 6c 79 2c 20 74 68 69 73 0d 0a 20 20  ically, this..  
24290 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69 6e        #       in
242a0 64 69 63 61 74 65 73 20 77 68 69 63 68 20 76 65  dicates which ve
242b0 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 2e 4e 45  rsion of the .NE
242c0 54 20 46 72 61 6d 65 77 6f 72 6b 20 69 73 20 62  T Framework is b
242d0 65 69 6e 67 0d 0a 20 20 20 20 20 20 20 20 23 20  eing..        # 
242e0 20 20 20 20 20 20 75 73 65 64 20 62 79 20 74 68        used by th
242f0 65 20 61 73 73 65 6d 62 6c 79 20 62 69 6e 61 72  e assembly binar
24300 69 65 73 20 75 6e 64 65 72 20 74 65 73 74 2e 0d  ies under test..
24310 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
24320 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
24330 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20  t_channel \..   
24340 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63           "---- c
24350 68 65 63 6b 69 6e 67 20 66 6f 72 20 53 79 73 74  hecking for Syst
24360 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 62  em.Data.SQLite b
24370 75 69 6c 64 20 2e 4e 45 54 20 46 72 61 6d 65 77  uild .NET Framew
24380 6f 72 6b 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20  ork... "....    
24390 20 20 20 20 73 65 74 20 6e 65 74 46 78 20 5b 67      set netFx [g
243a0 65 74 42 75 69 6c 64 4e 65 74 46 78 5d 0d 0a 20  etBuildNetFx].. 
243b0 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72         addConstr
243c0 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
243d0 20 62 75 69 6c 64 46 72 61 6d 65 77 6f 72 6b 2e   buildFramework.
243e0 20 24 6e 65 74 46 78 5d 0d 0a 20 20 20 20 20 20   $netFx]..      
243f0 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
24400 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
24410 72 67 73 20 5c 22 20 24 6e 65 74 46 78 20 5c 22  rgs \" $netFx \"
24420 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23  \n]....        #
24430 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
24440 3a 20 43 68 65 63 6b 20 74 68 65 20 63 75 72 72  : Check the curr
24450 65 6e 74 20 62 75 69 6c 64 20 63 6f 6e 66 69 67  ent build config
24460 75 72 61 74 69 6f 6e 2e 20 20 54 68 69 73 20 73  uration.  This s
24470 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79 0d 0a  hould normally..
24480 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
24490 62 65 20 65 69 74 68 65 72 20 22 44 65 62 75 67  be either "Debug
244a0 22 20 6f 72 20 22 52 65 6c 65 61 73 65 22 2e 0d  " or "Release"..
244b0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
244c0 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
244d0 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20  t_channel \..   
244e0 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63           "---- c
244f0 68 65 63 6b 69 6e 67 20 66 6f 72 20 53 79 73 74  hecking for Syst
24500 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 62  em.Data.SQLite b
24510 75 69 6c 64 20 63 6f 6e 66 69 67 75 72 61 74 69  uild configurati
24520 6f 6e 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20  on... "....     
24530 20 20 20 73 65 74 20 63 6f 6e 66 69 67 75 72 61     set configura
24540 74 69 6f 6e 20 5b 67 65 74 42 75 69 6c 64 43 6f  tion [getBuildCo
24550 6e 66 69 67 75 72 61 74 69 6f 6e 5d 0d 0a 20 20  nfiguration]..  
24560 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61        addConstra
24570 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20  int [appendArgs 
24580 62 75 69 6c 64 43 6f 6e 66 69 67 75 72 61 74 69  buildConfigurati
24590 6f 6e 2e 20 24 63 6f 6e 66 69 67 75 72 61 74 69  on. $configurati
245a0 6f 6e 5d 0d 0a 20 20 20 20 20 20 20 20 74 70 75  on]..        tpu
245b0 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
245c0 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
245d0 22 20 24 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  " $configuration
245e0 20 5c 22 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20   \"\n]....      
245f0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
24600 4f 54 45 3a 20 54 72 79 20 74 6f 20 73 65 74 75  OTE: Try to setu
24610 70 20 61 6e 20 69 6e 74 65 72 72 75 70 74 20 63  p an interrupt c
24620 61 6c 6c 62 61 63 6b 20 75 73 69 6e 67 20 74 68  allback using th
24630 65 20 73 63 72 69 70 74 20 64 65 62 75 67 67 65  e script debugge
24640 72 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  r..        #    
24650 20 20 20 74 68 61 74 20 77 69 6c 6c 20 63 61 6e     that will can
24660 63 65 6c 20 61 6c 6c 20 53 51 4c 20 71 75 65 72  cel all SQL quer
24670 69 65 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20  ies in progress 
24680 66 6f 72 20 61 6c 6c 20 64 61 74 61 62 61 73 65  for all database
24690 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
246a0 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6b 6e    connections kn
246b0 6f 77 6e 20 74 6f 20 74 68 69 73 20 69 6e 74 65  own to this inte
246c0 72 70 72 65 74 65 72 2e 0d 0a 20 20 20 20 20 20  rpreter...      
246d0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20    #..        if 
246e0 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
246f0 3a 6e 6f 28 73 71 6c 69 74 65 49 6e 74 65 72 72  :no(sqliteInterr
24700 75 70 74 43 61 6c 6c 62 61 63 6b 29 5d 7d 20 74  uptCallback)]} t
24710 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
24720 20 73 65 74 75 70 44 62 49 6e 74 65 72 72 75 70   setupDbInterrup
24730 74 43 61 6c 6c 62 61 63 6b 20 24 3a 3a 74 65 73  tCallback $::tes
24740 74 5f 63 68 61 6e 6e 65 6c 20 24 3a 3a 74 65 73  t_channel $::tes
24750 74 5f 6c 6f 67 0d 0a 20 20 20 20 20 20 20 20 7d  t_log..        }
24760 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
24770 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43         # NOTE: C
24780 68 65 63 6b 20 66 6f 72 20 74 68 65 20 6e 61 74  heck for the nat
24790 69 76 65 20 72 75 6e 74 69 6d 65 20 6f 70 74 69  ive runtime opti
247a0 6f 6e 2c 20 77 68 69 63 68 20 77 6f 75 6c 64 20  on, which would 
247b0 6d 65 61 6e 20 77 65 20 61 72 65 0d 0a 20 20 20  mean we are..   
247c0 20 20 20 20 20 23 20 20 20 20 20 20 20 75 73 69       #       usi
247d0 6e 67 20 74 68 65 20 6d 69 78 65 64 2d 6d 6f 64  ng the mixed-mod
247e0 65 20 61 73 73 65 6d 62 6c 79 2e 0d 0a 20 20 20  e assembly...   
247f0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
24800 63 68 65 63 6b 46 6f 72 52 75 6e 74 69 6d 65 4f  checkForRuntimeO
24810 70 74 69 6f 6e 20 24 3a 3a 74 65 73 74 5f 63 68  ption $::test_ch
24820 61 6e 6e 65 6c 20 6e 61 74 69 76 65 0d 0a 0d 0a  annel native....
24830 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
24840 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b     # NOTE: Check
24850 20 69 66 20 74 68 65 20 74 65 73 74 20 73 75 69   if the test sui
24860 74 65 20 73 68 6f 75 6c 64 20 63 6f 75 6e 74 20  te should count 
24870 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  the number of co
24880 6e 6e 65 63 74 69 6f 6e 73 0d 0a 20 20 20 20 20  nnections..     
24890 20 20 20 23 20 20 20 20 20 20 20 22 6f 70 65 6e     #       "open
248a0 65 64 22 20 61 6e 64 20 22 63 6c 6f 73 65 64 22  ed" and "closed"
248b0 20 66 72 6f 6d 20 74 68 65 20 70 6f 6f 6c 20 77   from the pool w
248c0 68 65 6e 20 64 65 74 65 72 6d 69 6e 69 6e 67 20  hen determining 
248d0 69 66 20 61 20 74 65 73 74 0d 0a 20 20 20 20 20  if a test..     
248e0 20 20 20 23 20 20 20 20 20 20 20 70 61 73 73 65     #       passe
248f0 64 2e 20 20 44 69 73 61 62 6c 69 6e 67 20 74 68  d.  Disabling th
24900 69 73 20 62 65 68 61 76 69 6f 72 20 69 73 20 73  is behavior is s
24910 6f 6d 65 74 69 6d 65 73 20 6e 65 63 65 73 73 61  ometimes necessa
24920 72 79 20 28 65 2e 67 2e 0d 0a 20 20 20 20 20 20  ry (e.g...      
24930 20 20 23 20 20 20 20 20 20 20 64 75 72 69 6e 67    #       during
24940 20 74 68 65 20 72 65 6c 65 61 73 65 20 74 65 73   the release tes
24950 74 69 6e 67 20 70 72 6f 63 65 73 73 29 20 62 65  ting process) be
24960 63 61 75 73 65 20 74 68 65 72 65 20 61 72 65 20  cause there are 
24970 73 65 76 65 72 61 6c 0d 0a 20 20 20 20 20 20 20  several..       
24980 20 23 20 20 20 20 20 20 20 74 65 73 74 73 20 74   #       tests t
24990 68 61 74 20 72 65 6c 79 20 6f 6e 20 74 68 65 20  hat rely on the 
249a0 22 6f 70 65 6e 65 64 20 66 72 6f 6d 20 70 6f 6f  "opened from poo
249b0 6c 22 20 63 6f 75 6e 74 20 62 65 69 6e 67 20 67  l" count being g
249c0 72 65 61 74 65 72 0d 0a 20 20 20 20 20 20 20 20  reater..        
249d0 23 20 20 20 20 20 20 20 74 68 61 6e 20 7a 65 72  #       than zer
249e0 6f 2e 20 20 54 68 65 73 65 20 74 65 73 74 73 20  o.  These tests 
249f0 6d 61 79 20 66 61 69 6c 20 64 75 65 20 74 6f 20  may fail due to 
24a00 74 68 65 20 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e  the non-determin
24a10 69 73 74 69 63 0d 0a 20 20 20 20 20 20 20 20 23  istic..        #
24a20 20 20 20 20 20 20 20 62 65 68 61 76 69 6f 72 20         behavior 
24a30 6f 66 20 74 68 65 20 43 4c 52 20 47 43 2c 20 65  of the CLR GC, e
24a40 76 65 6e 20 77 68 65 6e 20 74 68 65 72 65 20 69  ven when there i
24a50 73 20 6e 6f 20 62 75 67 20 69 6e 20 74 68 65 20  s no bug in the 
24a60 63 6f 64 65 0d 0a 20 20 20 20 20 20 20 20 23 20  code..        # 
24a70 20 20 20 20 20 20 62 65 69 6e 67 20 74 65 73 74        being test
24a80 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ed...        #..
24a90 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72          checkFor
24aa0 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 24 3a  RuntimeOption $:
24ab0 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 6e 6f  :test_channel no
24ac0 50 6f 6f 6c 43 6f 75 6e 74 73 0d 0a 0d 0a 20 20  PoolCounts....  
24ad0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
24ae0 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69   # NOTE: Check i
24af0 66 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65  f the test suite
24b00 20 73 68 6f 75 6c 64 20 75 73 65 20 73 68 61 72   should use shar
24b10 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 2e 0d 0a  ed-cache mode...
24b20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
24b30 20 20 20 63 68 65 63 6b 46 6f 72 52 75 6e 74 69     checkForRunti
24b40 6d 65 4f 70 74 69 6f 6e 20 24 3a 3a 74 65 73 74  meOption $::test
24b50 5f 63 68 61 6e 6e 65 6c 20 73 68 61 72 65 64 43  _channel sharedC
24b60 61 63 68 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ache....        
24b70 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
24b80 45 3a 20 52 65 70 6f 72 74 20 74 68 65 20 72 65  E: Report the re
24b90 73 6f 75 72 63 65 20 75 73 61 67 65 20 70 72 69  source usage pri
24ba0 6f 72 20 74 6f 20 72 75 6e 6e 69 6e 67 20 61 6e  or to running an
24bb0 79 20 74 65 73 74 73 2e 0d 0a 20 20 20 20 20 20  y tests...      
24bc0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 70    #..        rep
24bd0 6f 72 74 53 51 4c 69 74 65 52 65 73 6f 75 72 63  ortSQLiteResourc
24be0 65 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  es $::test_chann
24bf0 65 6c 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d  el....        #.
24c00 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
24c10 20 47 72 61 62 20 74 68 65 20 6c 69 73 74 20 6f   Grab the list o
24c20 66 20 6e 61 74 69 76 65 20 6d 6f 64 75 6c 65 73  f native modules
24c30 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74   for the current
24c40 20 70 72 6f 63 65 73 73 20 61 6e 64 0d 0a 20 20   process and..  
24c50 20 20 20 20 20 20 23 20 20 20 20 20 20 20 72 65        #       re
24c60 70 6f 72 74 20 6f 6e 20 74 68 65 20 53 79 73 74  port on the Syst
24c70 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 72  em.Data.SQLite r
24c80 65 6c 61 74 65 64 20 6f 6e 65 73 2e 0d 0a 20 20  elated ones...  
24c90 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
24ca0 20 69 66 20 7b 5b 68 61 76 65 53 51 4c 69 74 65   if {[haveSQLite
24cb0 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20  ObjectCommand]} 
24cc0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
24cd0 20 20 73 65 74 20 6d 6f 64 75 6c 65 73 20 5b 6f    set modules [o
24ce0 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 5c 0d 0a  bject invoke \..
24cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79                Sy
24d00 73 74 65 6d 2e 44 69 61 67 6e 6f 73 74 69 63 73  stem.Diagnostics
24d10 2e 50 72 6f 63 65 73 73 2e 47 65 74 43 75 72 72  .Process.GetCurr
24d20 65 6e 74 50 72 6f 63 65 73 73 20 4d 6f 64 75 6c  entProcess Modul
24d30 65 73 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  es]....         
24d40 20 6f 62 6a 65 63 74 20 66 6f 72 65 61 63 68 20   object foreach 
24d50 2d 61 6c 69 61 73 20 6d 6f 64 75 6c 65 20 24 6d  -alias module $m
24d60 6f 64 75 6c 65 73 20 7b 0d 0a 20 20 20 20 20 20  odules {..      
24d70 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
24d80 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65       # NOTE: The
24d90 20 6d 6f 64 75 6c 65 20 66 69 6c 65 20 6e 61 6d   module file nam
24da0 65 20 68 65 72 65 20 6d 75 73 74 20 62 65 20 6e  e here must be n
24db0 6f 72 6d 61 6c 69 7a 65 64 2e 0d 0a 20 20 20 20  ormalized...    
24dc0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
24dd0 20 20 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e         set fileN
24de0 61 6d 65 20 5b 66 69 6c 65 20 6e 6f 72 6d 61 6c  ame [file normal
24df0 69 7a 65 20 5b 24 6d 6f 64 75 6c 65 20 46 69 6c  ize [$module Fil
24e00 65 4e 61 6d 65 5d 5d 0d 0a 20 20 20 20 20 20 20  eName]]..       
24e10 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d       set fileNam
24e20 65 4f 6e 6c 79 20 5b 66 69 6c 65 20 74 61 69 6c  eOnly [file tail
24e30 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20   $fileName].... 
24e40 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b             if {[
24e50 6c 73 65 61 72 63 68 20 2d 65 78 61 63 74 20 2d  lsearch -exact -
24e60 6e 6f 63 61 73 65 20 2d 2d 20 5c 0d 0a 20 20 20  nocase -- \..   
24e70 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65               [ge
24e80 74 4e 61 74 69 76 65 4c 69 62 72 61 72 79 46 69  tNativeLibraryFi
24e90 6c 65 4e 61 6d 65 73 4f 6e 6c 79 5d 20 24 66 69  leNamesOnly] $fi
24ea0 6c 65 4e 61 6d 65 4f 6e 6c 79 5d 20 21 3d 20 2d  leNameOnly] != -
24eb0 31 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  1} then {..     
24ec0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
24ed0 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
24ee0 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
24ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24f00 22 2d 2d 2d 2d 20 66 6f 75 6e 64 20 6c 6f 61 64  "---- found load
24f10 65 64 20 53 51 4c 69 74 65 20 6e 61 74 69 76 65  ed SQLite native
24f20 20 6c 69 62 72 61 72 79 20 6d 6f 64 75 6c 65 3a   library module:
24f30 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   " \..          
24f40 20 20 20 20 20 20 20 20 24 66 69 6c 65 4e 61 6d          $fileNam
24f50 65 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  e \n]..         
24f60 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 6c 73     } elseif {[ls
24f70 65 61 72 63 68 20 2d 65 78 61 63 74 20 2d 6e 6f  earch -exact -no
24f80 63 61 73 65 20 2d 2d 20 5c 0d 0a 20 20 20 20 20  case -- \..     
24f90 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 49             [getI
24fa0 6e 74 65 72 6f 70 41 73 73 65 6d 62 6c 79 46 69  nteropAssemblyFi
24fb0 6c 65 4e 61 6d 65 73 4f 6e 6c 79 5d 20 24 66 69  leNamesOnly] $fi
24fc0 6c 65 4e 61 6d 65 4f 6e 6c 79 5d 20 21 3d 20 2d  leNameOnly] != -
24fd0 31 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  1} then {..     
24fe0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
24ff0 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
25000 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
25010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25020 22 2d 2d 2d 2d 20 66 6f 75 6e 64 20 6c 6f 61 64  "---- found load
25030 65 64 20 53 51 4c 69 74 65 20 69 6e 74 65 72 6f  ed SQLite intero
25040 70 20 61 73 73 65 6d 62 6c 79 20 6d 6f 64 75 6c  p assembly modul
25050 65 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20  e: " \..        
25060 20 20 20 20 20 20 20 20 20 20 24 66 69 6c 65 4e            $fileN
25070 61 6d 65 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ame \n]..       
25080 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
25090 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
250a0 0d 0a 20 20 20 20 20 20 20 20 63 61 74 63 68 20  ..        catch 
250b0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75  {..          tpu
250c0 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
250d0 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  el \..          
250e0 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 6d 70 69 6c      "---- compil
250f0 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 73 20 66  e-time options f
25100 6f 72 20 53 51 4c 69 74 65 20 63 6f 72 65 20 6c  or SQLite core l
25110 69 62 72 61 72 79 2e 2e 2e 20 22 0d 0a 0d 0a 20  ibrary... ".... 
25120 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61           if {[ca
25130 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
25140 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65     object invoke
25150 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c   -flags +NonPubl
25160 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ic \..          
25170 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74        System.Dat
25180 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 33  a.SQLite.SQLite3
25190 20 53 51 4c 69 74 65 43 6f 6d 70 69 6c 65 4f 70   SQLiteCompileOp
251a0 74 69 6f 6e 73 0d 0a 20 20 20 20 20 20 20 20 20  tions..         
251b0 20 7d 20 63 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e   } compileOption
251c0 73 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  s] == 0} then {.
251d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
251e0 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
251f0 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5b  el [appendArgs [
25200 66 6f 72 6d 61 74 4c 69 73 74 20 5b 6c 73 6f 72  formatList [lsor
25210 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  t \..           
25220 20 20 20 20 20 24 63 6f 6d 70 69 6c 65 4f 70 74       $compileOpt
25230 69 6f 6e 73 5d 20 3c 6e 6f 6e 65 3e 5d 20 5c 6e  ions] <none>] \n
25240 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65  ]..          } e
25250 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
25260 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
25270 5f 63 68 61 6e 6e 65 6c 20 75 6e 6b 6e 6f 77 6e  _channel unknown
25280 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  \n..          }.
25290 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
252a0 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20        catch {.. 
252b0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
252c0 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c  ::test_channel \
252d0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
252e0 22 2d 2d 2d 2d 20 63 6f 6d 70 69 6c 65 2d 74 69  "---- compile-ti
252f0 6d 65 20 6f 70 74 69 6f 6e 73 20 66 6f 72 20 53  me options for S
25300 51 4c 69 74 65 20 69 6e 74 65 72 6f 70 20 61 73  QLite interop as
25310 73 65 6d 62 6c 79 2e 2e 2e 20 22 0d 0a 0d 0a 20  sembly... ".... 
25320 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61           if {[ca
25330 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
25340 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65     object invoke
25350 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c   -flags +NonPubl
25360 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ic \..          
25370 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74        System.Dat
25380 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 33  a.SQLite.SQLite3
25390 20 49 6e 74 65 72 6f 70 43 6f 6d 70 69 6c 65 4f   InteropCompileO
253a0 70 74 69 6f 6e 73 0d 0a 20 20 20 20 20 20 20 20  ptions..        
253b0 20 20 7d 20 63 6f 6d 70 69 6c 65 4f 70 74 69 6f    } compileOptio
253c0 6e 73 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  ns] == 0} then {
253d0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
253e0 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
253f0 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
25400 5b 66 6f 72 6d 61 74 4c 69 73 74 20 5b 6c 73 6f  [formatList [lso
25410 72 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  rt \..          
25420 20 20 20 20 20 20 24 63 6f 6d 70 69 6c 65 4f 70        $compileOp
25430 74 69 6f 6e 73 5d 20 3c 6e 6f 6e 65 3e 5d 20 5c  tions] <none>] \
25440 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20  n]..          } 
25450 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
25460 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
25470 74 5f 63 68 61 6e 6e 65 6c 20 75 6e 6b 6e 6f 77  t_channel unknow
25480 6e 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  n\n..          }
25490 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
254a0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
254b0 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20 74    # NOTE: Show t
254c0 68 65 20 61 63 74 69 76 65 20 74 65 73 74 20 63  he active test c
254d0 6f 6e 73 74 72 61 69 6e 74 73 2e 0d 0a 20 20 20  onstraints...   
254e0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
254f0 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
25500 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
25510 73 20 22 2d 2d 2d 2d 20 63 6f 6e 73 74 72 61 69  s "---- constrai
25520 6e 74 73 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20  nts: " \..      
25530 20 20 20 20 20 20 5b 66 6f 72 6d 61 74 4c 69 73        [formatLis
25540 74 20 5b 6c 73 6f 72 74 20 5b 67 65 74 43 6f 6e  t [lsort [getCon
25550 73 74 72 61 69 6e 74 73 5d 5d 20 3c 6e 6f 6e 65  straints]] <none
25560 3e 5d 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20  >] \n]....      
25570 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
25580 4f 54 45 3a 20 53 61 76 65 20 74 68 65 20 74 65  OTE: Save the te
25590 73 74 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 66  st constraints f
255a0 6f 72 20 75 73 65 20 62 79 20 74 68 72 65 61 64  or use by thread
255b0 73 20 63 72 65 61 74 65 64 20 69 6e 20 74 68 69  s created in thi
255c0 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  s..        #    
255d0 20 20 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 64     application d
255e0 6f 6d 61 69 6e 2e 20 20 54 68 69 73 20 69 73 20  omain.  This is 
255f0 6e 65 63 65 73 73 61 72 79 20 62 65 63 61 75 73  necessary becaus
25600 65 20 61 6c 6c 20 74 68 65 20 45 61 67 6c 65 0d  e all the Eagle.
25610 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
25620 20 22 74 65 73 74 20 63 6f 6e 74 65 78 74 22 20   "test context" 
25630 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 70  information is p
25640 65 72 2d 74 68 72 65 61 64 2e 0d 0a 20 20 20 20  er-thread...    
25650 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69      #..        i
25660 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
25670 20 3a 3a 74 65 73 74 5f 63 6f 6e 73 74 72 61 69   ::test_constrai
25680 6e 74 73 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  nts]} then {..  
25690 20 20 20 20 20 20 20 20 73 65 74 20 3a 3a 74 65          set ::te
256a0 73 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 24  st_constraints $
256b0 3a 3a 65 61 67 6c 65 5f 74 65 73 74 73 28 63 6f  ::eagle_tests(co
256c0 6e 73 74 72 61 69 6e 74 73 29 0d 0a 20 20 20 20  nstraints)..    
256d0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
256e0 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
256f0 54 45 3a 20 4c 6f 61 64 20 74 68 65 20 22 61 66  TE: Load the "af
25700 74 65 72 2d 63 6f 6e 73 74 72 61 69 6e 74 73 22  ter-constraints"
25710 20 63 75 73 74 6f 6d 20 70 65 72 2d 75 73 65 72   custom per-user
25720 20 61 6e 64 2f 6f 72 20 70 65 72 2d 68 6f 73 74   and/or per-host
25730 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
25740 20 20 74 65 73 74 20 73 65 74 74 69 6e 67 73 20    test settings 
25750 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  now...        #.
25760 0a 20 20 20 20 20 20 20 20 75 70 6c 65 76 65 6c  .        uplevel
25770 20 31 20 5b 6c 69 73 74 20 6c 6f 61 64 53 51 4c   1 [list loadSQL
25780 69 74 65 54 65 73 74 53 65 74 74 69 6e 67 73 20  iteTestSettings 
25790 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
257a0 2e 61 66 74 65 72 5d 0d 0a 0d 0a 20 20 20 20 20  .after]....     
257b0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
257c0 4e 4f 54 45 3a 20 49 66 20 6e 65 63 65 73 73 61  NOTE: If necessa
257d0 72 79 2c 20 65 6e 61 62 6c 65 20 73 68 61 72 65  ry, enable share
257e0 64 2d 63 61 63 68 65 20 6d 6f 64 65 20 6e 6f 77  d-cache mode now
257f0 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
25800 20 20 20 20 20 20 69 66 20 7b 5b 68 61 73 52 75        if {[hasRu
25810 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 73 68 61 72  ntimeOption shar
25820 65 64 43 61 63 68 65 5d 7d 20 74 68 65 6e 20 7b  edCache]} then {
25830 0d 0a 20 20 20 20 20 20 20 20 20 20 65 6e 61 62  ..          enab
25840 6c 65 53 68 61 72 65 64 43 61 63 68 65 20 24 3a  leSharedCache $:
25850 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 74 72  :test_channel tr
25860 75 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  ue..        }...
25870 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
25880 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77      # NOTE: Show
25890 20 77 68 65 6e 20 6f 75 72 20 74 65 73 74 73 20   when our tests 
258a0 61 63 74 75 61 6c 6c 79 20 62 65 67 61 6e 20 28  actually began (
258b0 6e 6f 77 29 2e 0d 0a 20 20 20 20 20 20 20 20 23  now)...        #
258c0 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
258d0 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
258e0 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
258f0 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
25900 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
25910 69 74 65 20 74 65 73 74 73 20 62 65 67 61 6e 20  ite tests began 
25920 61 74 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20  at " \..        
25930 20 20 20 20 5b 63 6c 6f 63 6b 20 66 6f 72 6d 61      [clock forma
25940 74 20 5b 63 6c 6f 63 6b 20 73 65 63 6f 6e 64 73  t [clock seconds
25950 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d  ]] \n]..      }.
25960 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
25970 72 6f 63 20 72 75 6e 53 51 4c 69 74 65 54 65 73  roc runSQLiteTes
25980 74 46 69 6c 65 73 50 72 6f 6c 6f 67 75 65 20 7b  tFilesPrologue {
25990 7d 20 7b 0d 0a 20 20 20 20 20 20 75 70 6c 65 76  } {..      uplev
259a0 65 6c 20 31 20 7b 0d 0a 20 20 20 20 20 20 20 20  el 1 {..        
259b0 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
259c0 45 3a 20 53 65 74 75 70 20 74 68 65 20 76 61 72  E: Setup the var
259d0 69 61 62 6c 65 73 20 74 68 61 74 20 72 65 66 65  iables that refe
259e0 72 20 74 6f 20 74 68 65 20 76 61 72 69 6f 75 73  r to the various
259f0 20 6e 6f 6e 2d 64 61 74 61 20 66 69 6c 65 73 0d   non-data files.
25a00 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
25a10 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68 65   required by the
25a20 20 74 65 73 74 73 20 69 6e 20 74 68 69 73 20 66   tests in this f
25a30 69 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ile...        #.
25a40 0a 20 20 20 20 20 20 20 20 73 65 74 20 65 6e 74  .        set ent
25a50 69 74 79 46 72 61 6d 65 77 6f 72 6b 44 6c 6c 46  ityFrameworkDllF
25a60 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ile \..         
25a70 20 20 20 5b 67 65 74 42 75 69 6c 64 46 69 6c 65     [getBuildFile
25a80 4e 61 6d 65 20 45 6e 74 69 74 79 46 72 61 6d 65  Name EntityFrame
25a90 77 6f 72 6b 2e 64 6c 6c 5d 0d 0a 0d 0a 20 20 20  work.dll]....   
25aa0 20 20 20 20 20 73 65 74 20 69 6e 73 74 61 6c 6c       set install
25ab0 65 72 45 78 65 46 69 6c 65 20 5b 67 65 74 42 75  erExeFile [getBu
25ac0 69 6c 64 46 69 6c 65 4e 61 6d 65 20 49 6e 73 74  ildFileName Inst
25ad0 61 6c 6c 65 72 2e 65 78 65 5d 0d 0a 20 20 20 20  aller.exe]..    
25ae0 20 20 20 20 73 65 74 20 73 71 6c 69 74 65 44 65      set sqliteDe
25af0 73 69 67 6e 65 72 44 6c 6c 46 69 6c 65 20 5b 67  signerDllFile [g
25b00 65 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20  etBuildFileName 
25b10 53 51 4c 69 74 65 2e 44 65 73 69 67 6e 65 72 2e  SQLite.Designer.
25b20 64 6c 6c 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  dll]....        
25b30 73 65 74 20 73 79 73 74 65 6d 44 61 74 61 53 51  set systemDataSQ
25b40 4c 69 74 65 44 6c 6c 46 69 6c 65 20 5c 0d 0a 20  LiteDllFile \.. 
25b50 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 42             [getB
25b60 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20 53 79 73  uildFileName Sys
25b70 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
25b80 64 6c 6c 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  dll]....        
25b90 73 65 74 20 73 79 73 74 65 6d 44 61 74 61 53 51  set systemDataSQ
25ba0 4c 69 74 65 4c 69 6e 71 44 6c 6c 46 69 6c 65 20  LiteLinqDllFile 
25bb0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
25bc0 67 65 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65  getBuildFileName
25bd0 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
25be0 69 74 65 2e 4c 69 6e 71 2e 64 6c 6c 5d 0d 0a 0d  ite.Linq.dll]...
25bf0 0a 20 20 20 20 20 20 20 20 73 65 74 20 73 79 73  .        set sys
25c00 74 65 6d 44 61 74 61 53 51 4c 69 74 65 45 66 36  temDataSQLiteEf6
25c10 44 6c 6c 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20  DllFile \..     
25c20 20 20 20 20 20 20 20 5b 67 65 74 42 75 69 6c 64         [getBuild
25c30 46 69 6c 65 4e 61 6d 65 20 53 79 73 74 65 6d 2e  FileName System.
25c40 44 61 74 61 2e 53 51 4c 69 74 65 2e 45 46 36 2e  Data.SQLite.EF6.
25c50 64 6c 6c 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  dll]....        
25c60 73 65 74 20 74 65 73 74 45 78 65 46 69 6c 65 20  set testExeFile 
25c70 5b 67 65 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d  [getBuildFileNam
25c80 65 20 74 65 73 74 2e 65 78 65 5d 0d 0a 20 20 20  e test.exe]..   
25c90 20 20 20 20 20 73 65 74 20 74 65 73 74 4c 69 6e       set testLin
25ca0 71 45 78 65 46 69 6c 65 20 5b 67 65 74 42 75 69  qExeFile [getBui
25cb0 6c 64 46 69 6c 65 4e 61 6d 65 20 74 65 73 74 6c  ldFileName testl
25cc0 69 6e 71 2e 65 78 65 5d 0d 0a 20 20 20 20 20 20  inq.exe]..      
25cd0 20 20 73 65 74 20 74 65 73 74 45 66 36 45 78 65    set testEf6Exe
25ce0 46 69 6c 65 20 5b 67 65 74 42 75 69 6c 64 46 69  File [getBuildFi
25cf0 6c 65 4e 61 6d 65 20 74 65 73 74 65 66 36 2e 65  leName testef6.e
25d00 78 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23  xe]....        #
25d10 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
25d20 3a 20 53 65 74 75 70 20 74 68 65 20 76 61 72 69  : Setup the vari
25d30 61 62 6c 65 73 20 74 68 61 74 20 72 65 66 65 72  ables that refer
25d40 20 74 6f 20 74 68 65 20 76 61 72 69 6f 75 73 20   to the various 
25d50 64 61 74 61 20 66 69 6c 65 73 0d 0a 20 20 20 20  data files..    
25d60 20 20 20 20 23 20 20 20 20 20 20 20 72 65 71 75      #       requ
25d70 69 72 65 64 20 62 79 20 74 68 65 20 74 65 73 74  ired by the test
25d80 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 2e 0d  s in this file..
25d90 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
25da0 20 20 20 20 73 65 74 20 74 65 73 74 4c 69 6e 71      set testLinq
25db0 4f 75 74 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61  OutFile [file na
25dc0 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a  tivename [file j
25dd0 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  oin \..         
25de0 20 20 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73     [getSQLiteTes
25df0 74 44 61 74 61 50 61 74 68 5d 20 74 65 73 74 6c  tDataPath] testl
25e00 69 6e 71 2e 6f 75 74 5d 5d 0d 0a 0d 0a 20 20 20  inq.out]]....   
25e10 20 20 20 20 20 73 65 74 20 6e 6f 72 74 68 77 69       set northwi
25e20 6e 64 45 66 44 62 46 69 6c 65 20 5b 66 69 6c 65  ndEfDbFile [file
25e30 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c   nativename [fil
25e40 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20  e join \..      
25e50 20 20 20 20 20 20 5b 66 69 6c 65 20 64 69 72 6e        [file dirn
25e60 61 6d 65 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d  ame [file dirnam
25e70 65 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73 74  e [getSQLiteTest
25e80 44 61 74 61 50 61 74 68 5d 5d 5d 20 5c 0d 0a 20  DataPath]]] \.. 
25e90 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 6c             testl
25ea0 69 6e 71 20 6e 6f 72 74 68 77 69 6e 64 45 46 2e  inq northwindEF.
25eb0 64 62 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  db]]....        
25ec0 73 65 74 20 6e 6f 6e 57 61 6c 44 62 46 69 6c 65  set nonWalDbFile
25ed0 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d   [file nativenam
25ee0 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a  e [file join \..
25ef0 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74              [get
25f00 53 51 4c 69 74 65 54 65 73 74 44 61 74 61 50 61  SQLiteTestDataPa
25f10 74 68 5d 20 6e 6f 6e 57 61 6c 2e 64 62 5d 5d 0d  th] nonWal.db]].
25f20 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 77  ...        set w
25f30 61 6c 44 62 46 69 6c 65 20 5b 66 69 6c 65 20 6e  alDbFile [file n
25f40 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20  ativename [file 
25f50 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20  join \..        
25f60 20 20 20 20 5b 67 65 74 53 51 4c 69 74 65 54 65      [getSQLiteTe
25f70 73 74 44 61 74 61 50 61 74 68 5d 20 77 61 6c 2e  stDataPath] wal.
25f80 64 62 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  db]]....        
25f90 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
25fa0 45 3a 20 54 68 65 20 76 61 72 69 6f 75 73 20 69  E: The various i
25fb0 6e 73 74 61 6c 6c 2f 75 6e 69 6e 73 74 61 6c 6c  nstall/uninstall
25fc0 20 6c 6f 67 20 66 69 6c 65 73 20 75 73 65 64 20   log files used 
25fd0 74 6f 20 74 65 73 74 20 74 68 65 0d 0a 20 20 20  to test the..   
25fe0 20 20 20 20 20 23 20 20 20 20 20 20 20 64 65 73       #       des
25ff0 69 67 6e 2d 74 69 6d 65 20 63 6f 6d 70 6f 6e 65  ign-time compone
26000 6e 74 20 69 6e 73 74 61 6c 6c 65 72 2e 0d 0a 20  nt installer... 
26010 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
26020 20 20 73 65 74 20 74 65 73 74 49 6e 73 74 61 6c    set testInstal
26030 6c 56 73 32 30 30 35 4c 6f 67 46 69 6c 65 20 5b  lVs2005LogFile [
26040 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20  file nativename 
26050 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20  [file join \..  
26060 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 53 51            [getSQ
26070 4c 69 74 65 54 65 73 74 44 61 74 61 50 61 74 68  LiteTestDataPath
26080 5d 20 49 6e 73 74 61 6c 6c 65 72 5f 54 65 73 74  ] Installer_Test
26090 5f 56 73 32 30 30 35 2e 6c 6f 67 5d 5d 0d 0a 0d  _Vs2005.log]]...
260a0 0a 20 20 20 20 20 20 20 20 73 65 74 20 74 65 73  .        set tes
260b0 74 49 6e 73 74 61 6c 6c 56 73 32 30 30 38 4c 6f  tInstallVs2008Lo
260c0 67 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69  gFile [file nati
260d0 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69  vename [file joi
260e0 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n \..           
260f0 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73 74 44   [getSQLiteTestD
26100 61 74 61 50 61 74 68 5d 20 49 6e 73 74 61 6c 6c  ataPath] Install
26110 65 72 5f 54 65 73 74 5f 56 73 32 30 30 38 2e 6c  er_Test_Vs2008.l
26120 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  og]]....        
26130 73 65 74 20 74 65 73 74 49 6e 73 74 61 6c 6c 56  set testInstallV
26140 73 32 30 31 30 4c 6f 67 46 69 6c 65 20 5b 66 69  s2010LogFile [fi
26150 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66  le nativename [f
26160 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20  ile join \..    
26170 20 20 20 20 20 20 20 20 5b 67 65 74 53 51 4c 69          [getSQLi
26180 74 65 54 65 73 74 44 61 74 61 50 61 74 68 5d 20  teTestDataPath] 
26190 49 6e 73 74 61 6c 6c 65 72 5f 54 65 73 74 5f 56  Installer_Test_V
261a0 73 32 30 31 30 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20  s2010.log]].... 
261b0 20 20 20 20 20 20 20 73 65 74 20 74 65 73 74 49         set testI
261c0 6e 73 74 61 6c 6c 56 73 32 30 31 32 4c 6f 67 46  nstallVs2012LogF
261d0 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65  ile [file native
261e0 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20  name [file join 
261f0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
26200 67 65 74 53 51 4c 69 74 65 54 65 73 74 44 61 74  getSQLiteTestDat
26210 61 50 61 74 68 5d 20 49 6e 73 74 61 6c 6c 65 72  aPath] Installer
26220 5f 54 65 73 74 5f 56 73 32 30 31 32 2e 6c 6f 67  _Test_Vs2012.log
26230 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65  ]]....        se
26240 74 20 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32  t testInstallVs2
26250 30 31 33 4c 6f 67 46 69 6c 65 20 5b 66 69 6c 65  013LogFile [file
26260 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c   nativename [fil
26270 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20  e join \..      
26280 20 20 20 20 20 20 5b 67 65 74 53 51 4c 69 74 65        [getSQLite
26290 54 65 73 74 44 61 74 61 50 61 74 68 5d 20 49 6e  TestDataPath] In
262a0 73 74 61 6c 6c 65 72 5f 54 65 73 74 5f 56 73 32  staller_Test_Vs2
262b0 30 31 33 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20  013.log]]....   
262c0 20 20 20 20 20 73 65 74 20 74 65 73 74 49 6e 73       set testIns
262d0 74 61 6c 6c 56 73 32 30 31 35 4c 6f 67 46 69 6c  tallVs2015LogFil
262e0 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61  e [file nativena
262f0 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d  me [file join \.
26300 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65  .            [ge
26310 74 53 51 4c 69 74 65 54 65 73 74 44 61 74 61 50  tSQLiteTestDataP
26320 61 74 68 5d 20 49 6e 73 74 61 6c 6c 65 72 5f 54  ath] Installer_T
26330 65 73 74 5f 56 73 32 30 31 35 2e 6c 6f 67 5d 5d  est_Vs2015.log]]
26340 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20  ....        set 
26350 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32  testUninstallVs2
26360 30 30 35 4c 6f 67 46 69 6c 65 20 5b 66 69 6c 65  005LogFile [file
26370 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c   nativename [fil
26380 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20  e join \..      
26390 20 20 20 20 20 20 5b 67 65 74 53 51 4c 69 74 65        [getSQLite
263a0 54 65 73 74 44 61 74 61 50 61 74 68 5d 20 55 6e  TestDataPath] Un
263b0 69 6e 73 74 61 6c 6c 65 72 5f 54 65 73 74 5f 56  installer_Test_V
263c0 73 32 30 30 35 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20  s2005.log]].... 
263d0 20 20 20 20 20 20 20 73 65 74 20 74 65 73 74 55         set testU
263e0 6e 69 6e 73 74 61 6c 6c 56 73 32 30 30 38 4c 6f  ninstallVs2008Lo
263f0 67 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69  gFile [file nati
26400 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69  vename [file joi
26410 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n \..           
26420 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73 74 44   [getSQLiteTestD
26430 61 74 61 50 61 74 68 5d 20 55 6e 69 6e 73 74 61  ataPath] Uninsta
26440 6c 6c 65 72 5f 54 65 73 74 5f 56 73 32 30 30 38  ller_Test_Vs2008
26450 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20  .log]]....      
26460 20 20 73 65 74 20 74 65 73 74 55 6e 69 6e 73 74    set testUninst
26470 61 6c 6c 56 73 32 30 31 30 4c 6f 67 46 69 6c 65  allVs2010LogFile
26480 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d   [file nativenam
26490 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a  e [file join \..
264a0 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74              [get
264b0 53 51 4c 69 74 65 54 65 73 74 44 61 74 61 50 61  SQLiteTestDataPa
264c0 74 68 5d 20 55 6e 69 6e 73 74 61 6c 6c 65 72 5f  th] Uninstaller_
264d0 54 65 73 74 5f 56 73 32 30 31 30 2e 6c 6f 67 5d  Test_Vs2010.log]
264e0 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74  ]....        set
264f0 20 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73   testUninstallVs
26500 32 30 31 32 4c 6f 67 46 69 6c 65 20 5b 66 69 6c  2012LogFile [fil
26510 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69  e nativename [fi
26520 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20  le join \..     
26530 20 20 20 20 20 20 20 5b 67 65 74 53 51 4c 69 74         [getSQLit
26540 65 54 65 73 74 44 61 74 61 50 61 74 68 5d 20 55  eTestDataPath] U
26550 6e 69 6e 73 74 61 6c 6c 65 72 5f 54 65 73 74 5f  ninstaller_Test_
26560 56 73 32 30 31 32 2e 6c 6f 67 5d 5d 0d 0a 0d 0a  Vs2012.log]]....
26570 20 20 20 20 20 20 20 20 73 65 74 20 74 65 73 74          set test
26580 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31 33 4c  UninstallVs2013L
26590 6f 67 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74  ogFile [file nat
265a0 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f  ivename [file jo
265b0 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  in \..          
265c0 20 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73 74    [getSQLiteTest
265d0 44 61 74 61 50 61 74 68 5d 20 55 6e 69 6e 73 74  DataPath] Uninst
265e0 61 6c 6c 65 72 5f 54 65 73 74 5f 56 73 32 30 31  aller_Test_Vs201
265f0 33 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20  3.log]]....     
26600 20 20 20 73 65 74 20 74 65 73 74 55 6e 69 6e 73     set testUnins
26610 74 61 6c 6c 56 73 32 30 31 35 4c 6f 67 46 69 6c  tallVs2015LogFil
26620 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61  e [file nativena
26630 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d  me [file join \.
26640 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65  .            [ge
26650 74 53 51 4c 69 74 65 54 65 73 74 44 61 74 61 50  tSQLiteTestDataP
26660 61 74 68 5d 20 55 6e 69 6e 73 74 61 6c 6c 65 72  ath] Uninstaller
26670 5f 54 65 73 74 5f 56 73 32 30 31 35 2e 6c 6f 67  _Test_Vs2015.log
26680 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 23  ]]....        ##
26690 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
266a0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
266b0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
266c0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
266d0 23 23 23 23 23 0d 0a 0d 0a 20 20 20 20 20 20 20  #####....       
266e0 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74   if {![haveConst
266f0 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67  raint [appendArg
26700 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20  s file_ \..     
26710 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69         [file tai
26720 6c 20 24 65 6e 74 69 74 79 46 72 61 6d 65 77 6f  l $entityFramewo
26730 72 6b 44 6c 6c 46 69 6c 65 5d 5d 5d 7d 20 74 68  rkDllFile]]]} th
26740 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
26750 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65  checkForFile $te
26760 73 74 5f 63 68 61 6e 6e 65 6c 20 24 65 6e 74 69  st_channel $enti
26770 74 79 46 72 61 6d 65 77 6f 72 6b 44 6c 6c 46 69  tyFrameworkDllFi
26780 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  le..        }...
26790 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68  .        if {![h
267a0 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61  aveConstraint [a
267b0 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20  ppendArgs file_ 
267c0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
267d0 66 69 6c 65 20 74 61 69 6c 20 24 69 6e 73 74 61  file tail $insta
267e0 6c 6c 65 72 45 78 65 46 69 6c 65 5d 5d 5d 7d 20  llerExeFile]]]} 
267f0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
26800 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24    checkForFile $
26810 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 69 6e  test_channel $in
26820 73 74 61 6c 6c 65 72 45 78 65 46 69 6c 65 20 49  stallerExeFile I
26830 6e 73 74 61 6c 6c 65 72 2e 65 78 65 0d 0a 20 20  nstaller.exe..  
26840 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
26850 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e     if {![haveCon
26860 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41  straint [appendA
26870 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20  rgs file_ \..   
26880 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74           [file t
26890 61 69 6c 20 24 73 71 6c 69 74 65 44 65 73 69 67  ail $sqliteDesig
268a0 6e 65 72 44 6c 6c 46 69 6c 65 5d 5d 5d 7d 20 74  nerDllFile]]]} t
268b0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
268c0 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74   checkForFile $t
268d0 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 73 71 6c  est_channel $sql
268e0 69 74 65 44 65 73 69 67 6e 65 72 44 6c 6c 46 69  iteDesignerDllFi
268f0 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  le..        }...
26900 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68  .        if {![h
26910 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61  aveConstraint [a
26920 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20  ppendArgs file_ 
26930 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
26940 66 69 6c 65 20 74 61 69 6c 20 24 73 79 73 74 65  file tail $syste
26950 6d 44 61 74 61 53 51 4c 69 74 65 44 6c 6c 46 69  mDataSQLiteDllFi
26960 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  le]]]} then {.. 
26970 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f           checkFo
26980 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e  rFile $test_chan
26990 6e 65 6c 20 24 73 79 73 74 65 6d 44 61 74 61 53  nel $systemDataS
269a0 51 4c 69 74 65 44 6c 6c 46 69 6c 65 0d 0a 20 20  QLiteDllFile..  
269b0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
269c0 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e     if {![haveCon
269d0 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41  straint [appendA
269e0 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20  rgs file_ \..   
269f0 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74           [file t
26a00 61 69 6c 20 24 73 79 73 74 65 6d 44 61 74 61 53  ail $systemDataS
26a10 51 4c 69 74 65 4c 69 6e 71 44 6c 6c 46 69 6c 65  QLiteLinqDllFile
26a20 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ]]]} then {..   
26a30 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46         checkForF
26a40 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65  ile $test_channe
26a50 6c 20 24 73 79 73 74 65 6d 44 61 74 61 53 51 4c  l $systemDataSQL
26a60 69 74 65 4c 69 6e 71 44 6c 6c 46 69 6c 65 0d 0a  iteLinqDllFile..
26a70 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
26a80 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43       if {![haveC
26a90 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e  onstraint [appen
26aa0 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20  dArgs file_ \.. 
26ab0 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65             [file
26ac0 20 74 61 69 6c 20 24 73 79 73 74 65 6d 44 61 74   tail $systemDat
26ad0 61 53 51 4c 69 74 65 45 66 36 44 6c 6c 46 69 6c  aSQLiteEf6DllFil
26ae0 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  e]]]} then {..  
26af0 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72          checkFor
26b00 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e  File $test_chann
26b10 65 6c 20 24 73 79 73 74 65 6d 44 61 74 61 53 51  el $systemDataSQ
26b20 4c 69 74 65 45 66 36 44 6c 6c 46 69 6c 65 0d 0a  LiteEf6DllFile..
26b30 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
26b40 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43       if {![haveC
26b50 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e  onstraint [appen
26b60 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20  dArgs file_ \.. 
26b70 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65             [file
26b80 20 74 61 69 6c 20 24 74 65 73 74 45 78 65 46 69   tail $testExeFi
26b90 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  le]]]} then {.. 
26ba0 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f           checkFo
26bb0 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e  rFile $test_chan
26bc0 6e 65 6c 20 24 74 65 73 74 45 78 65 46 69 6c 65  nel $testExeFile
26bd0 20 74 65 73 74 2e 65 78 65 0d 0a 20 20 20 20 20   test.exe..     
26be0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
26bf0 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72  if {![haveConstr
26c00 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
26c10 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20   file_ \..      
26c20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c        [file tail
26c30 20 24 74 65 73 74 4c 69 6e 71 45 78 65 46 69 6c   $testLinqExeFil
26c40 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  e]]]} then {..  
26c50 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72          checkFor
26c60 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e  File $test_chann
26c70 65 6c 20 24 74 65 73 74 4c 69 6e 71 45 78 65 46  el $testLinqExeF
26c80 69 6c 65 20 74 65 73 74 6c 69 6e 71 2e 65 78 65  ile testlinq.exe
26c90 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
26ca0 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76         if {![hav
26cb0 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70  eConstraint [app
26cc0 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d  endArgs file_ \.
26cd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69  .            [fi
26ce0 6c 65 20 74 61 69 6c 20 24 74 65 73 74 45 66 36  le tail $testEf6
26cf0 45 78 65 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e  ExeFile]]]} then
26d00 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68   {..          ch
26d10 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74  eckForFile $test
26d20 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73 74 45 66  _channel $testEf
26d30 36 45 78 65 46 69 6c 65 20 74 65 73 74 65 66 36  6ExeFile testef6
26d40 2e 65 78 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d  .exe..        }.
26d50 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21  ...        if {!
26d60 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20  [haveConstraint 
26d70 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65  [appendArgs file
26d80 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  _ \..           
26d90 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 74 65 73   [file tail $tes
26da0 74 4c 69 6e 71 4f 75 74 46 69 6c 65 5d 5d 5d 7d  tLinqOutFile]]]}
26db0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
26dc0 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20     checkForFile 
26dd0 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74  $test_channel $t
26de0 65 73 74 4c 69 6e 71 4f 75 74 46 69 6c 65 0d 0a  estLinqOutFile..
26df0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
26e00 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43       if {![haveC
26e10 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e  onstraint [appen
26e20 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20  dArgs file_ \.. 
26e30 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65             [file
26e40 20 74 61 69 6c 20 24 6e 6f 72 74 68 77 69 6e 64   tail $northwind
26e50 45 66 44 62 46 69 6c 65 5d 5d 5d 7d 20 74 68 65  EfDbFile]]]} the
26e60 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63  n {..          c
26e70 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73  heckForFile $tes
26e80 74 5f 63 68 61 6e 6e 65 6c 20 24 6e 6f 72 74 68  t_channel $north
26e90 77 69 6e 64 45 66 44 62 46 69 6c 65 0d 0a 20 20  windEfDbFile..  
26ea0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
26eb0 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e     if {![haveCon
26ec0 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41  straint [appendA
26ed0 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20  rgs file_ \..   
26ee0 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74           [file t
26ef0 61 69 6c 20 24 6e 6f 6e 57 61 6c 44 62 46 69 6c  ail $nonWalDbFil
26f00 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  e]]]} then {..  
26f10 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72          checkFor
26f20 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e  File $test_chann
26f30 65 6c 20 24 6e 6f 6e 57 61 6c 44 62 46 69 6c 65  el $nonWalDbFile
26f40 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
26f50 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76         if {![hav
26f60 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70  eConstraint [app
26f70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d  endArgs file_ \.
26f80 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69  .            [fi
26f90 6c 65 20 74 61 69 6c 20 24 77 61 6c 44 62 46 69  le tail $walDbFi
26fa0 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  le]]]} then {.. 
26fb0 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f           checkFo
26fc0 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e  rFile $test_chan
26fd0 6e 65 6c 20 24 77 61 6c 44 62 46 69 6c 65 0d 0a  nel $walDbFile..
26fe0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
26ff0 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43       if {![haveC
27000 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e  onstraint [appen
27010 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20  dArgs file_ \.. 
27020 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65             [file
27030 20 74 61 69 6c 20 24 74 65 73 74 49 6e 73 74 61   tail $testInsta
27040 6c 6c 56 73 32 30 30 35 4c 6f 67 46 69 6c 65 5d  llVs2005LogFile]
27050 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  ]]} then {..    
27060 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69        checkForFi
27070 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c  le $test_channel
27080 20 24 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32   $testInstallVs2
27090 30 30 35 4c 6f 67 46 69 6c 65 0d 0a 20 20 20 20  005LogFile..    
270a0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
270b0 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74   if {![haveConst
270c0 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67  raint [appendArg
270d0 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20  s file_ \..     
270e0 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69         [file tai
270f0 6c 20 24 74 65 73 74 49 6e 73 74 61 6c 6c 56 73  l $testInstallVs
27100 32 30 30 38 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20  2008LogFile]]]} 
27110 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
27120 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24    checkForFile $
27130 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65  test_channel $te
27140 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 30 38 4c  stInstallVs2008L
27150 6f 67 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20  ogFile..        
27160 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20  }....        if 
27170 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e  {![haveConstrain
27180 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69  t [appendArgs fi
27190 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  le_ \..         
271a0 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 74     [file tail $t
271b0 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 31 30  estInstallVs2010
271c0 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e  LogFile]]]} then
271d0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68   {..          ch
271e0 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74  eckForFile $test
271f0 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73 74 49 6e  _channel $testIn
27200 73 74 61 6c 6c 56 73 32 30 31 30 4c 6f 67 46 69  stallVs2010LogFi
27210 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  le..        }...
27220 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68  .        if {![h
27230 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61  aveConstraint [a
27240 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20  ppendArgs file_ 
27250 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
27260 66 69 6c 65 20 74 61 69 6c 20 24 74 65 73 74 49  file tail $testI
27270 6e 73 74 61 6c 6c 56 73 32 30 31 32 4c 6f 67 46  nstallVs2012LogF
27280 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a  ile]]]} then {..
27290 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 46            checkF
272a0 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61  orFile $test_cha
272b0 6e 6e 65 6c 20 24 74 65 73 74 49 6e 73 74 61 6c  nnel $testInstal
272c0 6c 56 73 32 30 31 32 4c 6f 67 46 69 6c 65 0d 0a  lVs2012LogFile..
272d0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
272e0 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43       if {![haveC
272f0 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e  onstraint [appen
27300 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20  dArgs file_ \.. 
27310 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65             [file
27320 20 74 61 69 6c 20 24 74 65 73 74 49 6e 73 74 61   tail $testInsta
27330 6c 6c 56 73 32 30 31 33 4c 6f 67 46 69 6c 65 5d  llVs2013LogFile]
27340 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  ]]} then {..    
27350 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69        checkForFi
27360 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c  le $test_channel
27370 20 24 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32   $testInstallVs2
27380 30 31 33 4c 6f 67 46 69 6c 65 0d 0a 20 20 20 20  013LogFile..    
27390 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
273a0 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74   if {![haveConst
273b0 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67  raint [appendArg
273c0 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20  s file_ \..     
273d0 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69         [file tai
273e0 6c 20 24 74 65 73 74 49 6e 73 74 61 6c 6c 56 73  l $testInstallVs
273f0 32 30 31 35 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20  2015LogFile]]]} 
27400 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
27410 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24    checkForFile $
27420 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65  test_channel $te
27430 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 31 35 4c  stInstallVs2015L
27440 6f 67 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20  ogFile..        
27450 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20  }....        if 
27460 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e  {![haveConstrain
27470 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69  t [appendArgs fi
27480 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  le_ \..         
27490 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 74     [file tail $t
274a0 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30  estUninstallVs20
274b0 30 35 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74 68  05LogFile]]]} th
274c0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
274d0 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65  checkForFile $te
274e0 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73 74  st_channel $test
274f0 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 30 35 4c  UninstallVs2005L
27500 6f 67 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20  ogFile..        
27510 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20  }....        if 
27520 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e  {![haveConstrain
27530 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69  t [appendArgs fi
27540 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  le_ \..         
27550 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 74     [file tail $t
27560 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30  estUninstallVs20
27570 30 38 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74 68  08LogFile]]]} th
27580 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
27590 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65  checkForFile $te
275a0 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73 74  st_channel $test
275b0 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 30 38 4c  UninstallVs2008L
275c0 6f 67 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20  ogFile..        
275d0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20  }....        if 
275e0 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e  {![haveConstrain
275f0 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69  t [appendArgs fi
27600 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  le_ \..         
27610 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 74     [file tail $t
27620 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30  estUninstallVs20
27630 31 30 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74 68  10LogFile]]]} th
27640 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
27650 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65  checkForFile $te
27660 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73 74  st_channel $test
27670 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31 30 4c  UninstallVs2010L
27680 6f 67 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20  ogFile..        
27690 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20  }....        if 
276a0 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e  {![haveConstrain
276b0 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69  t [appendArgs fi
276c0 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  le_ \..         
276d0 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 74     [file tail $t
276e0 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30  estUninstallVs20
276f0 31 32 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74 68  12LogFile]]]} th
27700 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
27710 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65  checkForFile $te
27720 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73 74  st_channel $test
27730 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31 32 4c  UninstallVs2012L
27740 6f 67 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20  ogFile..        
27750 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20  }....        if 
27760 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e  {![haveConstrain
27770 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69  t [appendArgs fi
27780 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  le_ \..         
27790 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 74     [file tail $t
277a0 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30  estUninstallVs20
277b0 31 33 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74 68  13LogFile]]]} th
277c0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
277d0 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65  checkForFile $te
277e0 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73 74  st_channel $test
277f0 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31 33 4c  UninstallVs2013L
27800 6f 67 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20  ogFile..        
27810 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20  }....        if 
27820 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e  {![haveConstrain
27830 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69  t [appendArgs fi
27840 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  le_ \..         
27850 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 74     [file tail $t
27860 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30  estUninstallVs20
27870 31 35 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74 68  15LogFile]]]} th
27880 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
27890 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65  checkForFile $te
278a0 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73 74  st_channel $test
278b0 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31 35 4c  UninstallVs2015L
278c0 6f 67 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20  ogFile..        
278d0 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  }..      }..    
278e0 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 72  }.....    proc r
278f0 75 6e 53 51 4c 69 74 65 54 65 73 74 46 69 6c 65  unSQLiteTestFile
27900 73 45 70 69 6c 6f 67 75 65 20 7b 7d 20 7b 0d 0a  sEpilogue {} {..
27910 20 20 20 20 20 20 75 70 6c 65 76 65 6c 20 31 20        uplevel 1 
27920 7b 0d 0a 20 20 20 20 20 20 20 20 75 6e 73 65 74  {..        unset
27930 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 5c 0d 0a   -nocomplain \..
27940 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
27950 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31 35 4c  UninstallVs2015L
27960 6f 67 46 69 6c 65 20 74 65 73 74 55 6e 69 6e 73  ogFile testUnins
27970 74 61 6c 6c 56 73 32 30 31 33 4c 6f 67 46 69 6c  tallVs2013LogFil
27980 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
27990 20 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73   testUninstallVs
279a0 32 30 31 32 4c 6f 67 46 69 6c 65 20 74 65 73 74  2012LogFile test
279b0 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31 30 4c  UninstallVs2010L
279c0 6f 67 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20  ogFile \..      
279d0 20 20 20 20 20 20 74 65 73 74 55 6e 69 6e 73 74        testUninst
279e0 61 6c 6c 56 73 32 30 30 38 4c 6f 67 46 69 6c 65  allVs2008LogFile
279f0 20 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73   testUninstallVs
27a00 32 30 30 35 4c 6f 67 46 69 6c 65 20 5c 0d 0a 20  2005LogFile \.. 
27a10 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 49             testI
27a20 6e 73 74 61 6c 6c 56 73 32 30 31 35 4c 6f 67 46  nstallVs2015LogF
27a30 69 6c 65 20 74 65 73 74 49 6e 73 74 61 6c 6c 56  ile testInstallV
27a40 73 32 30 31 33 4c 6f 67 46 69 6c 65 20 5c 0d 0a  s2013LogFile \..
27a50 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
27a60 49 6e 73 74 61 6c 6c 56 73 32 30 31 32 4c 6f 67  InstallVs2012Log
27a70 46 69 6c 65 20 74 65 73 74 49 6e 73 74 61 6c 6c  File testInstall
27a80 56 73 32 30 31 30 4c 6f 67 46 69 6c 65 20 5c 0d  Vs2010LogFile \.
27a90 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  .            tes
27aa0 74 49 6e 73 74 61 6c 6c 56 73 32 30 30 38 4c 6f  tInstallVs2008Lo
27ab0 67 46 69 6c 65 20 74 65 73 74 49 6e 73 74 61 6c  gFile testInstal
27ac0 6c 56 73 32 30 30 35 4c 6f 67 46 69 6c 65 0d 0a  lVs2005LogFile..
27ad0 0d 0a 20 20 20 20 20 20 20 20 75 6e 73 65 74 20  ..        unset 
27ae0 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 5c 0d 0a 20  -nocomplain \.. 
27af0 20 20 20 20 20 20 20 20 20 20 20 6e 6f 72 74 68             north
27b00 77 69 6e 64 45 66 44 62 46 69 6c 65 20 74 65 73  windEfDbFile tes
27b10 74 4c 69 6e 71 4f 75 74 46 69 6c 65 20 5c 0d 0a  tLinqOutFile \..
27b20 20 20 20 20 20 20 20 20 20 20 20 20 77 61 6c 44              walD
27b30 62 46 69 6c 65 20 6e 6f 6e 57 61 6c 44 62 46 69  bFile nonWalDbFi
27b40 6c 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20 75 6e  le....        un
27b50 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20  set -nocomplain 
27b60 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  \..            t
27b70 65 73 74 45 66 36 45 78 65 46 69 6c 65 20 74 65  estEf6ExeFile te
27b80 73 74 4c 69 6e 71 45 78 65 46 69 6c 65 20 5c 0d  stLinqExeFile \.
27b90 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  .            tes
27ba0 74 45 78 65 46 69 6c 65 20 73 79 73 74 65 6d 44  tExeFile systemD
27bb0 61 74 61 53 51 4c 69 74 65 45 66 36 44 6c 6c 46  ataSQLiteEf6DllF
27bc0 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ile \..         
27bd0 20 20 20 73 79 73 74 65 6d 44 61 74 61 53 51 4c     systemDataSQL
27be0 69 74 65 4c 69 6e 71 44 6c 6c 46 69 6c 65 20 73  iteLinqDllFile s
27bf0 79 73 74 65 6d 44 61 74 61 53 51 4c 69 74 65 44  ystemDataSQLiteD
27c00 6c 6c 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20  llFile \..      
27c10 20 20 20 20 20 20 73 71 6c 69 74 65 44 65 73 69        sqliteDesi
27c20 67 6e 65 72 44 6c 6c 46 69 6c 65 20 69 6e 73 74  gnerDllFile inst
27c30 61 6c 6c 65 72 45 78 65 46 69 6c 65 20 5c 0d 0a  allerExeFile \..
27c40 20 20 20 20 20 20 20 20 20 20 20 20 65 6e 74 69              enti
27c50 74 79 46 72 61 6d 65 77 6f 72 6b 44 6c 6c 46 69  tyFrameworkDllFi
27c60 6c 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  le..      }..   
27c70 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
27c80 72 75 6e 53 51 4c 69 74 65 54 65 73 74 45 70 69  runSQLiteTestEpi
27c90 6c 6f 67 75 65 20 7b 7d 20 7b 0d 0a 20 20 20 20  logue {} {..    
27ca0 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
27cb0 45 3a 20 53 6b 69 70 20 72 75 6e 6e 69 6e 67 20  E: Skip running 
27cc0 6f 75 72 20 63 75 73 74 6f 6d 20 65 70 69 6c 6f  our custom epilo
27cd0 67 75 65 20 69 66 20 74 68 65 20 6d 61 69 6e 20  gue if the main 
27ce0 6f 6e 65 20 68 61 73 20 62 65 65 6e 0d 0a 20 20  one has been..  
27cf0 20 20 20 20 23 20 20 20 20 20 20 20 73 6b 69 70      #       skip
27d00 70 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ped...      #.. 
27d10 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
27d20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 65 70 69 6c  exists ::no(epil
27d30 6f 67 75 65 2e 65 61 67 6c 65 29 5d 7d 20 74 68  ogue.eagle)]} th
27d40 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
27d50 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
27d60 20 53 68 6f 77 20 77 68 65 6e 20 6f 75 72 20 74   Show when our t
27d70 65 73 74 73 20 61 63 74 75 61 6c 6c 79 20 65 6e  ests actually en
27d80 64 65 64 20 28 6e 6f 77 29 2e 0d 0a 20 20 20 20  ded (now)...    
27d90 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 74      #..        t
27da0 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
27db0 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
27dc0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
27dd0 22 2d 2d 2d 2d 20 53 79 73 74 65 6d 2e 44 61 74  "---- System.Dat
27de0 61 2e 53 51 4c 69 74 65 20 74 65 73 74 73 20 65  a.SQLite tests e
27df0 6e 64 65 64 20 61 74 20 22 20 5c 0d 0a 20 20 20  nded at " \..   
27e00 20 20 20 20 20 20 20 20 20 5b 63 6c 6f 63 6b 20           [clock 
27e10 66 6f 72 6d 61 74 20 5b 63 6c 6f 63 6b 20 73 65  format [clock se
27e20 63 6f 6e 64 73 5d 5d 20 5c 6e 5d 0d 0a 0d 0a 20  conds]] \n].... 
27e30 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
27e40 20 20 23 20 4e 4f 54 45 3a 20 4c 6f 61 64 20 74    # NOTE: Load t
27e50 68 65 20 22 65 70 69 6c 6f 67 75 65 22 20 63 75  he "epilogue" cu
27e60 73 74 6f 6d 20 70 65 72 2d 75 73 65 72 20 61 6e  stom per-user an
27e70 64 2f 6f 72 20 70 65 72 2d 68 6f 73 74 20 74 65  d/or per-host te
27e80 73 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  st..        #   
27e90 20 20 20 20 73 65 74 74 69 6e 67 73 20 6e 6f 77      settings now
27ea0 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
27eb0 20 20 20 20 20 20 75 70 6c 65 76 65 6c 20 31 20        uplevel 1 
27ec0 5b 6c 69 73 74 20 6c 6f 61 64 53 51 4c 69 74 65  [list loadSQLite
27ed0 54 65 73 74 53 65 74 74 69 6e 67 73 20 24 3a 3a  TestSettings $::
27ee0 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 2e 65 70  test_channel .ep
27ef0 69 6c 6f 67 75 65 5d 0d 0a 0d 0a 20 20 20 20 20  ilogue]....     
27f00 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
27f10 42 55 47 46 49 58 3a 20 42 65 66 6f 72 65 20 63  BUGFIX: Before c
27f20 68 65 63 6b 69 6e 67 20 74 68 65 20 66 69 6e 61  hecking the fina
27f30 6c 20 72 65 73 6f 75 72 63 65 73 20 69 6e 20 75  l resources in u
27f40 73 65 20 62 79 20 53 51 4c 69 74 65 2c 20 6d 61  se by SQLite, ma
27f50 6b 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ke..        #   
27f60 20 20 20 20 20 20 73 75 72 65 20 62 6f 74 68 20        sure both 
27f70 6f 66 20 74 68 65 20 50 52 41 47 4d 41 20 72 65  of the PRAGMA re
27f80 6c 61 74 65 64 20 64 69 72 65 63 74 6f 72 79 20  lated directory 
27f90 6e 61 6d 65 73 20 61 72 65 20 66 72 65 65 64 2e  names are freed.
27fa0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
27fb0 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51 4c       checkForSQL
27fc0 69 74 65 44 69 72 65 63 74 6f 72 69 65 73 20 24  iteDirectories $
27fd0 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 74  ::test_channel t
27fe0 72 75 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23  rue....        #
27ff0 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
28000 3a 20 41 6c 73 6f 20 72 65 70 6f 72 74 20 74 68  : Also report th
28010 65 20 72 65 73 6f 75 72 63 65 20 75 73 61 67 65  e resource usage
28020 20 61 66 74 65 72 20 72 75 6e 6e 69 6e 67 20 74   after running t
28030 68 65 20 74 65 73 74 73 2e 0d 0a 20 20 20 20 20  he tests...     
28040 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65     #..        re
28050 70 6f 72 74 53 51 4c 69 74 65 52 65 73 6f 75 72  portSQLiteResour
28060 63 65 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  ces $::test_chan
28070 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23  nel....        #
28080 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
28090 3a 20 52 65 70 6f 72 74 20 74 68 65 20 63 72 69  : Report the cri
280a0 74 69 63 61 6c 20 68 61 6e 64 6c 65 20 63 6f 75  tical handle cou
280b0 6e 74 73 20 61 66 74 65 72 20 72 75 6e 6e 69 6e  nts after runnin
280c0 67 20 74 68 65 20 74 65 73 74 73 2e 0d 0a 20 20  g the tests...  
280d0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
280e0 20 67 65 74 53 51 4c 69 74 65 48 61 6e 64 6c 65   getSQLiteHandle
280f0 43 6f 75 6e 74 73 20 24 3a 3a 74 65 73 74 5f 63  Counts $::test_c
28100 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20 20  hannel....      
28110 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
28120 4f 54 45 3a 20 49 66 20 6e 65 63 65 73 73 61 72  OTE: If necessar
28130 79 2c 20 64 69 73 61 62 6c 65 20 73 68 61 72 65  y, disable share
28140 64 2d 63 61 63 68 65 20 6d 6f 64 65 20 6e 6f 77  d-cache mode now
28150 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
28160 20 20 20 20 20 20 69 66 20 7b 5b 68 61 73 52 75        if {[hasRu
28170 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 73 68 61 72  ntimeOption shar
28180 65 64 43 61 63 68 65 5d 7d 20 74 68 65 6e 20 7b  edCache]} then {
28190 0d 0a 20 20 20 20 20 20 20 20 20 20 65 6e 61 62  ..          enab
281a0 6c 65 53 68 61 72 65 64 43 61 63 68 65 20 24 3a  leSharedCache $:
281b0 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 66 61  :test_channel fa
281c0 6c 73 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  lse..        }..
281d0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
281e0 0c 0d 0a 20 20 20 20 23 23 23 23 23 23 23 23 23  ...    #########
281f0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
28200 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
28210 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
28220 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
28230 23 23 0d 0a 20 20 20 20 23 23 23 23 23 23 23 23  ##..    ########
28240 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
28250 23 23 23 23 23 20 45 4e 44 20 45 61 67 6c 65 20  ##### END Eagle 
28260 4f 4e 4c 59 20 23 23 23 23 23 23 23 23 23 23 23  ONLY ###########
28270 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
28280 23 23 23 0d 0a 20 20 20 20 23 23 23 23 23 23 23  ###..    #######
28290 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
282a0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
282b0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
282c0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
282d0 23 23 23 23 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 23  ####..  }....  #
282e0 0d 0a 20 20 23 20 4e 4f 54 45 3a 20 53 61 76 65  ..  # NOTE: Save
282f0 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
28300 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 74 61   directory conta
28310 69 6e 69 6e 67 20 74 68 69 73 20 66 69 6c 65 2e  ining this file.
28320 0d 0a 20 20 23 0d 0a 20 20 69 66 20 7b 21 5b 69  ..  #..  if {![i
28330 6e 66 6f 20 65 78 69 73 74 73 20 63 6f 6d 6d 6f  nfo exists commo
28340 6e 5f 64 69 72 65 63 74 6f 72 79 5d 7d 20 74 68  n_directory]} th
28350 65 6e 20 7b 0d 0a 20 20 20 20 73 65 74 20 63 6f  en {..    set co
28360 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79 20 5b  mmon_directory [
28370 66 69 6c 65 20 64 69 72 6e 61 6d 65 20 5b 69 6e  file dirname [in
28380 66 6f 20 73 63 72 69 70 74 5d 5d 0d 0a 20 20 7d  fo script]]..  }
28390 0d 0a 0d 0a 20 20 23 0d 0a 20 20 23 20 4e 4f 54  ....  #..  # NOT
283a0 45 3a 20 50 72 6f 76 69 64 65 20 74 68 65 20 53  E: Provide the S
283b0 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
283c0 65 20 74 65 73 74 20 70 61 63 6b 61 67 65 20 74  e test package t
283d0 6f 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65  o the interprete
283e0 72 2e 0d 0a 20 20 23 0d 0a 20 20 70 61 63 6b 61  r...  #..  packa
283f0 67 65 20 70 72 6f 76 69 64 65 20 53 79 73 74 65  ge provide Syste
28400 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 54 65  m.Data.SQLite.Te
28410 73 74 20 31 2e 30 0d 0a 7d 0d 0a                 st 1.0..}..